From 5a79410ddd31d89a5582abb1c45acc7efcfce219 Mon Sep 17 00:00:00 2001
From: dwf1m12 <d.w.flynn@soton.ac.uk>
Date: Sun, 12 Feb 2023 22:00:58 +0000
Subject: [PATCH] Initial soclabs nanosoc design for review

---
 .../software/cmsis/CMSIS/Include/core_cm0.h   |  682 ++
 .../cmsis/CMSIS/Include/core_cm0plus.h        |  793 ++
 .../cmsis/CMSIS/Include/core_cmFunc.h         |  636 ++
 .../cmsis/CMSIS/Include/core_cmInstr.h        |  688 ++
 .../Device/ARM/CMSDK_CM0/Include/CMSDK_CM0.h  | 1313 +++
 .../ARM/CMSDK_CM0/Include/CMSDK_driver.h      |  293 +
 .../ARM/CMSDK_CM0/Include/system_CMSDK_CM0.h  |   64 +
 .../CMSDK_CM0/Source/ARM/startup_CMSDK_CM0.s  |  250 +
 .../ARM/CMSDK_CM0/Source/CMSDK_driver.c       |  659 ++
 .../CMSDK_CM0/Source/GCC/startup_CMSDK_CM0.s  |  270 +
 .../ARM/CMSDK_CM0/Source/system_CMSDK_CM0.c   |   68 +
 .../software/common/bootloader/bootloader.c   |  142 +
 .../software/common/debug_tests/debug_tests.c |  508 ++
 .../software/common/debug_tests/debug_tests.h |   83 +
 .../software/common/demos/dualtimer_demo.c    |  877 ++
 .../software/common/demos/interrupt_demo.c    |  494 ++
 .../software/common/demos/self_reset_demo.c   |  234 +
 .../software/common/demos/sleep_demo.c        |  543 ++
 .../software/common/demos/watchdog_demo.c     |  355 +
 Cortex-M0/nanosoc/software/common/dhry/dhry.h |  455 +
 .../nanosoc/software/common/dhry/dhry_1.c     |  465 +
 .../nanosoc/software/common/dhry/dhry_2.c     |  190 +
 .../software/common/retarget/retarget.c       |   86 +
 .../software/common/retarget/uart_stdout.c    |   78 +
 .../software/common/retarget/uart_stdout.h    |   30 +
 .../common/romtable_tests/romtable_tests.c    |  607 ++
 .../common/romtable_tests/romtable_tests.h    |   83 +
 .../common/scripts/cmsdk_bootloader.ld        |   40 +
 .../software/common/scripts/cmsdk_cm0.ld      |   43 +
 .../software/common/scripts/debugtester.ld    |   40 +
 .../software/common/scripts/lib-nosys.ld      |    2 +
 .../software/common/scripts/lib-rdimon.ld     |    2 +
 .../common/scripts/sections-nokeep.ld         |  162 +
 .../software/common/scripts/sections.ld       |  163 +
 .../common/validation/apb_mux_tests.c         |  367 +
 .../common/validation/bitband_tests.c         |  602 ++
 .../common/validation/default_slaves_tests.c  |  240 +
 .../software/common/validation/dma_tests.c    |  543 ++
 .../common/validation/ext_sys_tests.c         |  677 ++
 .../common/validation/gpio_driver_tests.c     |  705 ++
 .../software/common/validation/gpio_tests.c   | 2004 +++++
 .../software/common/validation/memory_tests.c |  645 ++
 .../common/validation/timer_driver_tests.c    |  548 ++
 .../software/common/validation/timer_tests.c  |  824 ++
 .../common/validation/uart_driver_tests.c     |  408 +
 .../software/common/validation/uart_tests.c   | 1241 +++
 .../nanosoc/software/debug_tester/Makefile    |  264 +
 .../software/debug_tester/cmsdk_debugtester.h |  336 +
 .../software/debug_tester/debugtester.c       | 2775 ++++++
 .../software/debug_tester/debugtester.h       |  237 +
 .../software/debug_tester/debugtester_cm0.sct |   38 +
 .../debug_tester/debugtester_cm0_be.uvopt     |  245 +
 .../debug_tester/debugtester_cm0_be.uvproj    |  430 +
 .../debug_tester/debugtester_cm0_le.uvopt     |  245 +
 .../debug_tester/debugtester_cm0_le.uvproj    |  430 +
 .../debug_tester/debugtester_cm0plus.sct      |   38 +
 .../debug_tester/debugtester_cm0plus_be.uvopt |  230 +
 .../debugtester_cm0plus_be.uvproj             |  427 +
 .../debug_tester/debugtester_cm0plus_le.uvopt |  230 +
 .../debugtester_cm0plus_le.uvproj             |  427 +
 .../debug_tester/debugtester_functions.h      |   52 +
 .../debug_tester/retarget_cmsdk_debugtester.c |   97 +
 .../debug_tester/system_cmsdk_debugtester.c   |   61 +
 .../debug_tester/system_cmsdk_debugtester.h   |   41 +
 .../mcu/fpga_imp/build_fpga_pynq_z2.scr       |    1 +
 .../mcu/fpga_imp/build_fpga_pynq_zcu104.scr   |    1 +
 .../systems/mcu/fpga_imp/clean_fpga.scr       |    8 +
 .../ip_repo/axi_stream_io_1.0/bd/bd.tcl       |   86 +
 .../ip_repo/axi_stream_io_1.0/component.xml   | 1456 ++++
 .../axi_stream_io_v1_0/data/axi_stream_io.mdd |   10 +
 .../axi_stream_io_v1_0/data/axi_stream_io.tcl |    5 +
 .../drivers/axi_stream_io_v1_0/src/Makefile   |   26 +
 .../axi_stream_io_v1_0/src/axi_stream_io.c    |    6 +
 .../axi_stream_io_v1_0/src/axi_stream_io.h    |   79 +
 .../src/axi_stream_io_selftest.c              |   60 +
 .../soclabs.org_user_axi_stream_io_1.0.zip    |  Bin 0 -> 15835 bytes
 .../src/axi_stream_io_v1_0_axi_s.v            |  424 +
 .../xgui/axi_stream_io_v1_0.tcl               |   58 +
 .../ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl |   86 +
 .../ft1248x1_to_stream8_1.0/component.xml     |  127 +
 .../ft1248x1_to_stream8_0.xcix                |  Bin 0 -> 253 bytes
 .../hdl/ft1248x1_to_stream8_v1_0.v            |   75 +
 .../hdl/ft1248x1_to_stream8_v1_0_RXD8.v       |  167 +
 .../hdl/ft1248x1_to_stream8_v1_0_TXD8.v       |  228 +
 .../ip_project_archive.zip                    |  Bin 0 -> 19366 bytes
 ...clabs.org_user_ft1248x1_to_stream8_1.0.zip |  Bin 0 -> 22475 bytes
 .../src/ft1248x1_to_stream8.v                 |  187 +
 .../ft1248x1_to_stream8_1.0/src/synclib.v     |  139 +
 .../xgui/ft1248x1_to_stream8_v1_0.tcl         |   10 +
 .../soclabs/driver/uartlite.py                |   88 +
 .../soclabs/soclabs_cm0sdk_mcu.ipynb          |  372 +
 .../soclabs/driver/uartlite.py                |   88 +
 .../soclabs/soclabs_cm0sdk_mcu.ipynb          |  372 +
 .../fpga_imp/scripts/build_mcu_fpga_batch.tcl |  122 +
 .../fpga_imp/scripts/build_mcu_fpga_ip.tcl    |  127 +
 .../scripts/build_mcu_fpga_pynq_z2.tcl        |  118 +
 .../scripts/build_mcu_fpga_pynq_zcu104.tcl    |  115 +
 .../mcu/fpga_imp/scripts/rtl_source_cm0.tcl   |   17 +
 .../mcu/fpga_imp/scripts/rtl_source_cmsdk.tcl |   17 +
 .../fpga_imp/scripts/rtl_source_dma230.tcl    |    8 +
 .../fpga_imp/scripts/rtl_source_fpga_ip.tcl   |    9 +
 .../scripts/rtl_source_soclabs_ip.tcl         |    7 +
 .../target_fpga_ac701/fpga_pinmap.xdc         |  983 +++
 .../fpga_imp/target_fpga_ac701/fpga_synth.tcl |   40 +
 .../target_fpga_ac701/fpga_timing.xdc         |   95 +
 .../target_fpga_arm_mps3/fpga_pinmap.xdc      |  915 ++
 .../target_fpga_arm_mps3/fpga_synth.tcl       |    1 +
 .../target_fpga_arm_mps3/fpga_timing.xdc      |   99 +
 .../fpga_imp/target_fpga_pynq_z2/design_1.tcl |  508 ++
 .../target_fpga_pynq_z2/design_1_wrapper.v    |  107 +
 .../target_fpga_pynq_z2/fpga_pinmap.xdc       |   33 +
 .../target_fpga_pynq_z2/fpga_synth.tcl        |    1 +
 .../target_fpga_pynq_z2/fpga_timing.xdc       |   95 +
 .../fpga_imp/target_fpga_zcu104/design_1.tcl  | 1017 +++
 .../target_fpga_zcu104/design_1_wrapper.v     |  107 +
 .../target_fpga_zcu104/fpga_pinmap.xdc        | 1031 +++
 .../target_fpga_zcu104/fpga_synth.tcl         |    1 +
 .../target_fpga_zcu104/fpga_timing.xdc        |   95 +
 Cortex-M0/nanosoc/systems/mcu/rtl_sim/adp.cmd |   29 +
 .../nanosoc/systems/mcu/rtl_sim/makefile      |  555 ++
 .../apb_mux_tests/apb_mux_tests_cm0.uvopt     |  261 +
 .../apb_mux_tests/apb_mux_tests_cm0.uvproj    |  435 +
 .../apb_mux_tests/apb_mux_tests_cm0p.uvopt    |  244 +
 .../apb_mux_tests/apb_mux_tests_cm0p.uvproj   |  432 +
 .../mcu/testcodes/apb_mux_tests/makefile      |  251 +
 .../testcodes/bootloader/bootloader_cm0.uvopt |  229 +
 .../bootloader/bootloader_cm0.uvproj          |  425 +
 .../bootloader/bootloader_cm0p.uvopt          |  216 +
 .../bootloader/bootloader_cm0p.uvproj         |  422 +
 .../systems/mcu/testcodes/bootloader/makefile |  254 +
 .../debug_tests/debug_tests_cm0.uvopt         |  293 +
 .../debug_tests/debug_tests_cm0.uvproj        |  445 +
 .../debug_tests/debug_tests_cm0p.uvopt        |  272 +
 .../debug_tests/debug_tests_cm0p.uvproj       |  442 +
 .../mcu/testcodes/debug_tests/makefile        |  265 +
 .../default_slaves_tests_cm0.uvopt            |  261 +
 .../default_slaves_tests_cm0.uvproj           |  435 +
 .../default_slaves_tests_cm0p.uvopt           |  244 +
 .../default_slaves_tests_cm0p.uvproj          |  432 +
 .../testcodes/default_slaves_tests/makefile   |  251 +
 .../systems/mcu/testcodes/dhry/dhry_cm0.uvopt |  277 +
 .../mcu/testcodes/dhry/dhry_cm0.uvproj        |  440 +
 .../mcu/testcodes/dhry/dhry_cm0p.uvopt        |  258 +
 .../mcu/testcodes/dhry/dhry_cm0p.uvproj       |  437 +
 .../systems/mcu/testcodes/dhry/makefile       |  260 +
 .../systems/mcu/testcodes/dhry/transcript     |   14 +
 .../testcodes/dma_tests/dma_tests_cm0.uvopt   |  261 +
 .../testcodes/dma_tests/dma_tests_cm0.uvproj  |  435 +
 .../testcodes/dma_tests/dma_tests_cm0p.uvopt  |  244 +
 .../testcodes/dma_tests/dma_tests_cm0p.uvproj |  432 +
 .../systems/mcu/testcodes/dma_tests/makefile  |  253 +
 .../dualtimer_demo/dualtimer_demo_cm0.uvopt   |  261 +
 .../dualtimer_demo/dualtimer_demo_cm0.uvproj  |  435 +
 .../dualtimer_demo/dualtimer_demo_cm0p.uvopt  |  244 +
 .../dualtimer_demo/dualtimer_demo_cm0p.uvproj |  432 +
 .../mcu/testcodes/dualtimer_demo/makefile     |  250 +
 .../systems/mcu/testcodes/generic/config_id.h |  408 +
 .../generic/mcu_debugtester_interface.c       |  131 +
 .../generic/mcu_debugtester_interface.h       |  102 +
 .../gpio_driver_tests_cm0.uvopt               |  277 +
 .../gpio_driver_tests_cm0.uvproj              |  440 +
 .../gpio_driver_tests_cm0p.uvopt              |  258 +
 .../gpio_driver_tests_cm0p.uvproj             |  437 +
 .../mcu/testcodes/gpio_driver_tests/makefile  |  255 +
 .../testcodes/gpio_tests/gpio_tests_cm0.uvopt |  261 +
 .../gpio_tests/gpio_tests_cm0.uvproj          |  435 +
 .../gpio_tests/gpio_tests_cm0p.uvopt          |  244 +
 .../gpio_tests/gpio_tests_cm0p.uvproj         |  432 +
 .../systems/mcu/testcodes/gpio_tests/makefile |  253 +
 .../systems/mcu/testcodes/hello/.project      |   11 +
 .../systems/mcu/testcodes/hello/hello.c       |   52 +
 .../mcu/testcodes/hello/hello_cm0.uvopt       |  261 +
 .../mcu/testcodes/hello/hello_cm0.uvproj      |  435 +
 .../mcu/testcodes/hello/hello_cm0p.uvopt      |  244 +
 .../mcu/testcodes/hello/hello_cm0p.uvproj     |  432 +
 .../systems/mcu/testcodes/hello/makefile      |  255 +
 .../interrupt_demo/interrupt_demo_cm0.uvopt   |  277 +
 .../interrupt_demo/interrupt_demo_cm0.uvproj  |  440 +
 .../interrupt_demo/interrupt_demo_cm0p.uvopt  |  258 +
 .../interrupt_demo/interrupt_demo_cm0p.uvproj |  437 +
 .../mcu/testcodes/interrupt_demo/makefile     |  255 +
 .../mcu/testcodes/memory_tests/makefile       |  251 +
 .../memory_tests/memory_tests_cm0.uvopt       |  261 +
 .../memory_tests/memory_tests_cm0.uvproj      |  435 +
 .../memory_tests/memory_tests_cm0p.uvopt      |  244 +
 .../memory_tests/memory_tests_cm0p.uvproj     |  432 +
 .../mcu/testcodes/romtable_tests/makefile     |  266 +
 .../romtable_tests/romtable_tests_cm0.uvopt   |  293 +
 .../romtable_tests/romtable_tests_cm0.uvproj  |  445 +
 .../romtable_tests/romtable_tests_cm0p.uvopt  |  272 +
 .../romtable_tests/romtable_tests_cm0p.uvproj |  442 +
 .../mcu/testcodes/rtx_demo/RTX_Config.c       |  187 +
 .../systems/mcu/testcodes/rtx_demo/makefile   |  101 +
 .../systems/mcu/testcodes/rtx_demo/rtx_demo.c |   86 +
 .../mcu/testcodes/rtx_demo/rtx_demo_cm0.hex   | 4996 +++++++++++
 .../mcu/testcodes/rtx_demo/rtx_demo_cm0.uvopt |  277 +
 .../testcodes/rtx_demo/rtx_demo_cm0.uvproj    |  440 +
 .../mcu/testcodes/rtx_demo/rtx_demo_cm0p.hex  | 4996 +++++++++++
 .../testcodes/rtx_demo/rtx_demo_cm0p.uvopt    |  258 +
 .../testcodes/rtx_demo/rtx_demo_cm0p.uvproj   |  437 +
 .../mcu/testcodes/self_reset_demo/makefile    |  251 +
 .../self_reset_demo/self_reset_demo_cm0.uvopt |  261 +
 .../self_reset_demo_cm0.uvproj                |  435 +
 .../self_reset_demo_cm0p.uvopt                |  244 +
 .../self_reset_demo_cm0p.uvproj               |  432 +
 .../systems/mcu/testcodes/setup_ds5_tools.scr |    6 +
 .../systems/mcu/testcodes/sleep_demo/makefile |  256 +
 .../testcodes/sleep_demo/sleep_demo_cm0.uvopt |  277 +
 .../sleep_demo/sleep_demo_cm0.uvproj          |  440 +
 .../sleep_demo/sleep_demo_cm0p.uvopt          |  258 +
 .../sleep_demo/sleep_demo_cm0p.uvproj         |  437 +
 .../mcu/testcodes/timer_driver_tests/makefile |  254 +
 .../timer_driver_tests_cm0.uvopt              |  277 +
 .../timer_driver_tests_cm0.uvproj             |  440 +
 .../timer_driver_tests_cm0p.uvopt             |  258 +
 .../timer_driver_tests_cm0p.uvproj            |  437 +
 .../mcu/testcodes/timer_tests/makefile        |  250 +
 .../timer_tests/timer_tests_cm0.uvopt         |  261 +
 .../timer_tests/timer_tests_cm0.uvproj        |  435 +
 .../timer_tests/timer_tests_cm0p.uvopt        |  244 +
 .../timer_tests/timer_tests_cm0p.uvproj       |  432 +
 .../mcu/testcodes/uart_driver_tests/makefile  |  255 +
 .../uart_driver_tests_cm0.uvopt               |  277 +
 .../uart_driver_tests_cm0.uvproj              |  440 +
 .../uart_driver_tests_cm0p.uvopt              |  258 +
 .../uart_driver_tests_cm0p.uvproj             |  437 +
 .../systems/mcu/testcodes/uart_tests/makefile |  251 +
 .../testcodes/uart_tests/uart_tests_cm0.uvopt |  261 +
 .../uart_tests/uart_tests_cm0.uvproj          |  435 +
 .../uart_tests/uart_tests_cm0p.uvopt          |  244 +
 .../uart_tests/uart_tests_cm0p.uvproj         |  432 +
 .../mcu/testcodes/watchdog_demo/makefile      |  250 +
 .../watchdog_demo/watchdog_demo_cm0.uvopt     |  261 +
 .../watchdog_demo/watchdog_demo_cm0.uvproj    |  435 +
 .../watchdog_demo/watchdog_demo_cm0p.uvopt    |  244 +
 .../watchdog_demo/watchdog_demo_cm0p.uvproj   |  432 +
 .../systems/mcu/tools/setup_ds5_tools.scr     |    3 +
 Cortex-M0/nanosoc/systems/mcu/v2html_doc.tgz  |  Bin 0 -> 661430 bytes
 .../nanosoc/systems/mcu/verilog/ahb_bootrom.v |   29 +
 .../nanosoc/systems/mcu/verilog/bootrom.v     |  277 +
 .../mcu/verilog/cmsdk_ahb_cs_rom_table.v      |  272 +
 .../systems/mcu/verilog/cmsdk_apb_usrt.v      | 1159 +++
 .../systems/mcu/verilog/cmsdk_clkreset.v      |   62 +
 .../mcu/verilog/cmsdk_ft1248x1_adpio.v        |  157 +
 .../systems/mcu/verilog/cmsdk_mcu_clkctrl.v   |  191 +
 .../systems/mcu/verilog/cmsdk_mcu_pin_mux.v   |  233 +
 .../systems/mcu/verilog/cmsdk_mcu_stclkctrl.v |   80 +
 .../systems/mcu/verilog/cmsdk_mcu_sysctrl.v   |  351 +
 .../systems/mcu/verilog/cmsdk_uart_capture.v  |  251 +
 .../mcu/verilog/gen_ahb_busmatrix/README.txt  |   66 +
 .../gen_ahb_busmatrix/bin/BuildBusMatrix.pl   | 2975 +++++++
 .../gen_ahb_busmatrix/bin/lib/xmlparser.pm    | 1393 +++
 .../gen_soclabs_4x7_AhbMatrix.scr             |    2 +
 .../soclabs_4x7_AhbMatrix.xml                 | 4257 +++++++++
 .../soclabs_4x7_AhbMatrix_lite.xml            | 3902 +++++++++
 .../ipxact/src/cmsdk_ahb_busmatrix_ipxact.xml | 1050 +++
 .../src/cmsdk_ahb_busmatrix_lite_ipxact.xml   |  921 ++
 .../gen_ahb_busmatrix/soclabs_ahb32_4x7.log   |   74 +
 .../soclabs_4x7_AhbMatrix.v                   | 2151 +++++
 .../soclabs_4x7_AhbMatrix_default_slave.v     |  140 +
 .../soclabs_4x7_AhbMatrix_lite.v              |  985 +++
 .../soclabs_4x7_Arbiter.v                     |  330 +
 .../soclabs_4x7_MasterInput.v                 |  473 +
 .../soclabs_4x7_MatrixDecode_adp.v            |  630 ++
 .../soclabs_4x7_MatrixDecode_cpu.v            |  630 ++
 .../soclabs_4x7_MatrixDecode_dma.v            |  566 ++
 .../soclabs_4x7_MatrixDecode_dma2.v           |  566 ++
 .../soclabs_4x7_SlaveOutput.v                 |  628 ++
 .../verilog/src/cmsdk_ahb_bm_burst_arb.v      |  327 +
 .../verilog/src/cmsdk_ahb_bm_decode.v         |  458 +
 .../verilog/src/cmsdk_ahb_bm_default_slave.v  |  141 +
 .../verilog/src/cmsdk_ahb_bm_fixed_arb.v      |  179 +
 .../verilog/src/cmsdk_ahb_bm_input_stage.v    |  544 ++
 .../verilog/src/cmsdk_ahb_bm_output_stage.v   |  538 ++
 .../verilog/src/cmsdk_ahb_bm_round_arb.v      |  375 +
 .../verilog/src/cmsdk_ahb_bm_single_arb.v     |  160 +
 .../src/cmsdk_ahb_bm_single_output_stage.v    |  416 +
 .../verilog/src/cmsdk_ahb_busmatrix.v         |  526 ++
 .../verilog/src/cmsdk_ahb_busmatrix_lite.v    |  340 +
 .../gen_ahb_busmatrix/xml/example2x3_full.xml |   85 +
 .../xml/example2x3_sparse.xml                 |   81 +
 .../xml/soclabs_ahb32_4x7.xml                 |  156 +
 .../systems/mcu/verilog/nanosoc_chip.v        | 1583 ++++
 .../systems/mcu/verilog/nanosoc_chip_pads.v   |  406 +
 .../nanosoc/systems/mcu/verilog/nanosoc_cpu.v |  250 +
 .../mcu/verilog/nanosoc_sys_ahb_decode.v      |  100 +
 .../systems/mcu/verilog/nanosoc_sysio.v       |  493 ++
 .../nanosoc/systems/mcu/verilog/pl230_defs.v  |  189 +
 .../nanosoc/systems/mcu/verilog/tb_nanosoc.v  |  571 ++
 .../nanosoc/systems/mcu/verilog/tbench_M0.vc  |  145 +
 .../nanosoc/systems/mcu/verilog/v2html_M0.vc  |  120 +
 FPGALIB/pads/verilog/PAD_INOUT8MA_NOE.v       |   37 +
 FPGALIB/pads/verilog/PAD_VDDIO.v              |   29 +
 FPGALIB/pads/verilog/PAD_VDDSOC.v             |   29 +
 FPGALIB/pads/verilog/PAD_VSS.v                |   29 +
 FPGALIB/pads/verilog/PAD_VSSIO.v              |   29 +
 GLIB/mem/verilog/SROM_Ax32.v                  |  127 +
 GLIB/pads/verilog/GLIB_PADLIB.v               |  139 +
 GLIB/pads/verilog/PAD_ANALOG.v                |   18 +
 GLIB/pads/verilog/PAD_INOUT8MA_NOE.v          |   39 +
 GLIB/pads/verilog/PAD_INOUT8MA_OE.v           |   39 +
 GLIB/pads/verilog/PAD_VDDIO.v                 |   18 +
 GLIB/pads/verilog/PAD_VDDSOC.v                |   19 +
 GLIB/pads/verilog/PAD_VSS.v                   |   18 +
 GLIB/pads/verilog/PAD_VSSIO.v                 |   19 +
 .../ADPcontrol_v1_0/ADPcontrol_adv__mangled.v | 7744 +++++++++++++++++
 .../ADPcontrol_v1_0/ADPcontrol_bas__mangled.v | 4923 +++++++++++
 IPLIB/ADPcontrol_v1_0/ADPcontrol_v1_0.v       |  103 +
 IPLIB/ADPcontrol_v1_0/ADPmanager.v            |  786 ++
 .../ft1248_streamio_v1_0.v                    |  305 +
 IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0.v |  114 +
 .../axi_stream_io_v1_0_axi_s.v                |  424 +
 312 files changed, 130539 insertions(+)
 create mode 100644 Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0.h
 create mode 100644 Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0plus.h
 create mode 100644 Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmFunc.h
 create mode 100644 Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmInstr.h
 create mode 100644 Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_CM0.h
 create mode 100644 Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_driver.h
 create mode 100644 Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/system_CMSDK_CM0.h
 create mode 100644 Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/ARM/startup_CMSDK_CM0.s
 create mode 100644 Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/CMSDK_driver.c
 create mode 100644 Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/GCC/startup_CMSDK_CM0.s
 create mode 100644 Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/system_CMSDK_CM0.c
 create mode 100644 Cortex-M0/nanosoc/software/common/bootloader/bootloader.c
 create mode 100644 Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.c
 create mode 100644 Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.h
 create mode 100644 Cortex-M0/nanosoc/software/common/demos/dualtimer_demo.c
 create mode 100644 Cortex-M0/nanosoc/software/common/demos/interrupt_demo.c
 create mode 100644 Cortex-M0/nanosoc/software/common/demos/self_reset_demo.c
 create mode 100644 Cortex-M0/nanosoc/software/common/demos/sleep_demo.c
 create mode 100644 Cortex-M0/nanosoc/software/common/demos/watchdog_demo.c
 create mode 100644 Cortex-M0/nanosoc/software/common/dhry/dhry.h
 create mode 100644 Cortex-M0/nanosoc/software/common/dhry/dhry_1.c
 create mode 100644 Cortex-M0/nanosoc/software/common/dhry/dhry_2.c
 create mode 100644 Cortex-M0/nanosoc/software/common/retarget/retarget.c
 create mode 100644 Cortex-M0/nanosoc/software/common/retarget/uart_stdout.c
 create mode 100644 Cortex-M0/nanosoc/software/common/retarget/uart_stdout.h
 create mode 100644 Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.c
 create mode 100644 Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.h
 create mode 100644 Cortex-M0/nanosoc/software/common/scripts/cmsdk_bootloader.ld
 create mode 100644 Cortex-M0/nanosoc/software/common/scripts/cmsdk_cm0.ld
 create mode 100644 Cortex-M0/nanosoc/software/common/scripts/debugtester.ld
 create mode 100644 Cortex-M0/nanosoc/software/common/scripts/lib-nosys.ld
 create mode 100644 Cortex-M0/nanosoc/software/common/scripts/lib-rdimon.ld
 create mode 100644 Cortex-M0/nanosoc/software/common/scripts/sections-nokeep.ld
 create mode 100644 Cortex-M0/nanosoc/software/common/scripts/sections.ld
 create mode 100644 Cortex-M0/nanosoc/software/common/validation/apb_mux_tests.c
 create mode 100644 Cortex-M0/nanosoc/software/common/validation/bitband_tests.c
 create mode 100644 Cortex-M0/nanosoc/software/common/validation/default_slaves_tests.c
 create mode 100644 Cortex-M0/nanosoc/software/common/validation/dma_tests.c
 create mode 100644 Cortex-M0/nanosoc/software/common/validation/ext_sys_tests.c
 create mode 100644 Cortex-M0/nanosoc/software/common/validation/gpio_driver_tests.c
 create mode 100644 Cortex-M0/nanosoc/software/common/validation/gpio_tests.c
 create mode 100644 Cortex-M0/nanosoc/software/common/validation/memory_tests.c
 create mode 100644 Cortex-M0/nanosoc/software/common/validation/timer_driver_tests.c
 create mode 100644 Cortex-M0/nanosoc/software/common/validation/timer_tests.c
 create mode 100644 Cortex-M0/nanosoc/software/common/validation/uart_driver_tests.c
 create mode 100644 Cortex-M0/nanosoc/software/common/validation/uart_tests.c
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/Makefile
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/cmsdk_debugtester.h
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester.c
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester.h
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0.sct
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvopt
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvproj
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvopt
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvproj
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus.sct
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvopt
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvproj
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvopt
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvproj
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/debugtester_functions.h
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/retarget_cmsdk_debugtester.c
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.c
 create mode 100644 Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.h
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_z2.scr
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_zcu104.scr
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/clean_fpga.scr
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/bd/bd.tcl
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/component.xml
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/Makefile
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.c
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.h
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/soclabs.org_user_axi_stream_io_1.0.zip
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/src/axi_stream_io_v1_0_axi_s.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/xgui/axi_stream_io_v1_0.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/component.xml
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ft1248x1_to_stream8_0.xcix
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_RXD8.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_TXD8.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ip_project_archive.zip
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/soclabs.org_user_ft1248x1_to_stream8_1.0.zip
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/ft1248x1_to_stream8.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/synclib.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/xgui/ft1248x1_to_stream8_v1_0.tcl
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/driver/uartlite.py
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/driver/uartlite.py
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_batch.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_ip.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_z2.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_zcu104.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cm0.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cmsdk.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_dma230.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_fpga_ip.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_soclabs_ip.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_pinmap.xdc
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_synth.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_timing.xdc
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_pinmap.xdc
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_synth.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_timing.xdc
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1_wrapper.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_pinmap.xdc
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_synth.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_timing.xdc
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1_wrapper.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_pinmap.xdc
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_synth.tcl
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_timing.xdc
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/rtl_sim/adp.cmd
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/rtl_sim/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/transcript
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/generic/config_id.h
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.c
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.h
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/hello/.project
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello.c
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/hello/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/RTX_Config.c
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo.c
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.hex
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.hex
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/setup_ds5_tools.scr
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/makefile
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvopt
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvproj
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/tools/setup_ds5_tools.scr
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/v2html_doc.tgz
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/ahb_bootrom.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/bootrom.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ahb_cs_rom_table.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_apb_usrt.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_clkreset.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ft1248x1_adpio.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_clkctrl.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_pin_mux.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_stclkctrl.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_sysctrl.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_uart_capture.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/README.txt
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/BuildBusMatrix.pl
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/lib/xmlparser.pm
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/gen_soclabs_4x7_AhbMatrix.scr
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.xml
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.xml
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_ipxact.xml
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_lite_ipxact.xml
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/soclabs_ahb32_4x7.log
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_burst_arb.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_decode.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_default_slave.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_fixed_arb.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_input_stage.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_output_stage.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_round_arb.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_arb.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_output_stage.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix_lite.v
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_full.xml
 create mode 100755 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_sparse.xml
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/soclabs_ahb32_4x7.xml
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip_pads.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_cpu.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sys_ahb_decode.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sysio.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/pl230_defs.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/tb_nanosoc.v
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/tbench_M0.vc
 create mode 100644 Cortex-M0/nanosoc/systems/mcu/verilog/v2html_M0.vc
 create mode 100644 FPGALIB/pads/verilog/PAD_INOUT8MA_NOE.v
 create mode 100644 FPGALIB/pads/verilog/PAD_VDDIO.v
 create mode 100644 FPGALIB/pads/verilog/PAD_VDDSOC.v
 create mode 100644 FPGALIB/pads/verilog/PAD_VSS.v
 create mode 100644 FPGALIB/pads/verilog/PAD_VSSIO.v
 create mode 100644 GLIB/mem/verilog/SROM_Ax32.v
 create mode 100755 GLIB/pads/verilog/GLIB_PADLIB.v
 create mode 100644 GLIB/pads/verilog/PAD_ANALOG.v
 create mode 100644 GLIB/pads/verilog/PAD_INOUT8MA_NOE.v
 create mode 100644 GLIB/pads/verilog/PAD_INOUT8MA_OE.v
 create mode 100644 GLIB/pads/verilog/PAD_VDDIO.v
 create mode 100644 GLIB/pads/verilog/PAD_VDDSOC.v
 create mode 100644 GLIB/pads/verilog/PAD_VSS.v
 create mode 100644 GLIB/pads/verilog/PAD_VSSIO.v
 create mode 100755 IPLIB/ADPcontrol_v1_0/ADPcontrol_adv__mangled.v
 create mode 100755 IPLIB/ADPcontrol_v1_0/ADPcontrol_bas__mangled.v
 create mode 100755 IPLIB/ADPcontrol_v1_0/ADPcontrol_v1_0.v
 create mode 100755 IPLIB/ADPcontrol_v1_0/ADPmanager.v
 create mode 100755 IPLIB/FT1248_streamio_v1_0/ft1248_streamio_v1_0.v
 create mode 100755 IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0.v
 create mode 100755 IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0_axi_s.v

diff --git a/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0.h b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0.h
new file mode 100644
index 0000000..ab31de0
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0.h
@@ -0,0 +1,682 @@
+/**************************************************************************//**
+ * @file     core_cm0.h
+ * @brief    CMSIS Cortex-M0 Core Peripheral Access Layer Header File
+ * @version  V3.20
+ * @date     25. February 2013
+ *
+ * @note
+ *
+ ******************************************************************************/
+/* Copyright (c) 2009 - 2013 ARM LIMITED
+
+   All rights reserved.
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+   - Neither the name of ARM nor the names of its contributors may be used
+     to endorse or promote products derived from this software without
+     specific prior written permission.
+   *
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
+   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+   ---------------------------------------------------------------------------*/
+
+
+#if defined ( __ICCARM__ )
+ #pragma system_include  /* treat file as system include file for MISRA check */
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#ifndef __CORE_CM0_H_GENERIC
+#define __CORE_CM0_H_GENERIC
+
+/** \page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions
+  CMSIS violates the following MISRA-C:2004 rules:
+
+   \li Required Rule 8.5, object/function definition in header file.<br>
+     Function definitions in header files are used to allow 'inlining'.
+
+   \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>
+     Unions are used for effective representation of core registers.
+
+   \li Advisory Rule 19.7, Function-like macro defined.<br>
+     Function-like macros are used to allow more efficient code.
+ */
+
+
+/*******************************************************************************
+ *                 CMSIS definitions
+ ******************************************************************************/
+/** \ingroup Cortex_M0
+  @{
+ */
+
+/*  CMSIS CM0 definitions */
+#define __CM0_CMSIS_VERSION_MAIN  (0x03)                                   /*!< [31:16] CMSIS HAL main version   */
+#define __CM0_CMSIS_VERSION_SUB   (0x20)                                   /*!< [15:0]  CMSIS HAL sub version    */
+#define __CM0_CMSIS_VERSION       ((__CM0_CMSIS_VERSION_MAIN << 16) | \
+                                    __CM0_CMSIS_VERSION_SUB          )     /*!< CMSIS HAL version number         */
+
+#define __CORTEX_M                (0x00)                                   /*!< Cortex-M Core                    */
+
+
+#if   defined ( __CC_ARM )
+  #define __ASM            __asm                                      /*!< asm keyword for ARM Compiler          */
+  #define __INLINE         __inline                                   /*!< inline keyword for ARM Compiler       */
+  #define __STATIC_INLINE  static __inline
+
+#elif defined ( __ICCARM__ )
+  #define __ASM            __asm                                      /*!< asm keyword for IAR Compiler          */
+  #define __INLINE         inline                                     /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */
+  #define __STATIC_INLINE  static inline
+
+#elif defined ( __GNUC__ )
+  #define __ASM            __asm                                      /*!< asm keyword for GNU Compiler          */
+  #define __INLINE         inline                                     /*!< inline keyword for GNU Compiler       */
+  #define __STATIC_INLINE  static inline
+
+#elif defined ( __TASKING__ )
+  #define __ASM            __asm                                      /*!< asm keyword for TASKING Compiler      */
+  #define __INLINE         inline                                     /*!< inline keyword for TASKING Compiler   */
+  #define __STATIC_INLINE  static inline
+
+#endif
+
+/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all
+*/
+#define __FPU_USED       0
+
+#if defined ( __CC_ARM )
+  #if defined __TARGET_FPU_VFP
+    #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+  #endif
+
+#elif defined ( __ICCARM__ )
+  #if defined __ARMVFP__
+    #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+  #endif
+
+#elif defined ( __GNUC__ )
+  #if defined (__VFP_FP__) && !defined(__SOFTFP__)
+    #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+  #endif
+
+#elif defined ( __TASKING__ )
+  #if defined __FPU_VFP__
+    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+  #endif
+#endif
+
+#include <stdint.h>                      /* standard types definitions                      */
+#include <core_cmInstr.h>                /* Core Instruction Access                         */
+#include <core_cmFunc.h>                 /* Core Function Access                            */
+
+#endif /* __CORE_CM0_H_GENERIC */
+
+#ifndef __CMSIS_GENERIC
+
+#ifndef __CORE_CM0_H_DEPENDANT
+#define __CORE_CM0_H_DEPENDANT
+
+/* check device defines and use defaults */
+#if defined __CHECK_DEVICE_DEFINES
+  #ifndef __CM0_REV
+    #define __CM0_REV               0x0000
+    #warning "__CM0_REV not defined in device header file; using default!"
+  #endif
+
+  #ifndef __NVIC_PRIO_BITS
+    #define __NVIC_PRIO_BITS          2
+    #warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
+  #endif
+
+  #ifndef __Vendor_SysTickConfig
+    #define __Vendor_SysTickConfig    0
+    #warning "__Vendor_SysTickConfig not defined in device header file; using default!"
+  #endif
+#endif
+
+/* IO definitions (access restrictions to peripheral registers) */
+/**
+    \defgroup CMSIS_glob_defs CMSIS Global Defines
+
+    <strong>IO Type Qualifiers</strong> are used
+    \li to specify the access to peripheral variables.
+    \li for automatic generation of peripheral register debug information.
+*/
+#ifdef __cplusplus
+  #define   __I     volatile             /*!< Defines 'read only' permissions                 */
+#else
+  #define   __I     volatile const       /*!< Defines 'read only' permissions                 */
+#endif
+#define     __O     volatile             /*!< Defines 'write only' permissions                */
+#define     __IO    volatile             /*!< Defines 'read / write' permissions              */
+
+/*@} end of group Cortex_M0 */
+
+
+
+/*******************************************************************************
+ *                 Register Abstraction
+  Core Register contain:
+  - Core Register
+  - Core NVIC Register
+  - Core SCB Register
+  - Core SysTick Register
+ ******************************************************************************/
+/** \defgroup CMSIS_core_register Defines and Type Definitions
+    \brief Type definitions and defines for Cortex-M processor based devices.
+*/
+
+/** \ingroup    CMSIS_core_register
+    \defgroup   CMSIS_CORE  Status and Control Registers
+    \brief  Core Register type definitions.
+  @{
+ */
+
+/** \brief  Union type to access the Application Program Status Register (APSR).
+ */
+typedef union
+{
+  struct
+  {
+#if (__CORTEX_M != 0x04)
+    uint32_t _reserved0:27;              /*!< bit:  0..26  Reserved                           */
+#else
+    uint32_t _reserved0:16;              /*!< bit:  0..15  Reserved                           */
+    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags        */
+    uint32_t _reserved1:7;               /*!< bit: 20..26  Reserved                           */
+#endif
+    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag          */
+    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag       */
+    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag          */
+    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag           */
+    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag       */
+  } b;                                   /*!< Structure used for bit  access                  */
+  uint32_t w;                            /*!< Type      used for word access                  */
+} APSR_Type;
+
+
+/** \brief  Union type to access the Interrupt Program Status Register (IPSR).
+ */
+typedef union
+{
+  struct
+  {
+    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number                   */
+    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved                           */
+  } b;                                   /*!< Structure used for bit  access                  */
+  uint32_t w;                            /*!< Type      used for word access                  */
+} IPSR_Type;
+
+
+/** \brief  Union type to access the Special-Purpose Program Status Registers (xPSR).
+ */
+typedef union
+{
+  struct
+  {
+    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number                   */
+#if (__CORTEX_M != 0x04)
+    uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved                           */
+#else
+    uint32_t _reserved0:7;               /*!< bit:  9..15  Reserved                           */
+    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags        */
+    uint32_t _reserved1:4;               /*!< bit: 20..23  Reserved                           */
+#endif
+    uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0)          */
+    uint32_t IT:2;                       /*!< bit: 25..26  saved IT state   (read 0)          */
+    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag          */
+    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag       */
+    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag          */
+    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag           */
+    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag       */
+  } b;                                   /*!< Structure used for bit  access                  */
+  uint32_t w;                            /*!< Type      used for word access                  */
+} xPSR_Type;
+
+
+/** \brief  Union type to access the Control Registers (CONTROL).
+ */
+typedef union
+{
+  struct
+  {
+    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */
+    uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used                   */
+    uint32_t FPCA:1;                     /*!< bit:      2  FP extension active flag           */
+    uint32_t _reserved0:29;              /*!< bit:  3..31  Reserved                           */
+  } b;                                   /*!< Structure used for bit  access                  */
+  uint32_t w;                            /*!< Type      used for word access                  */
+} CONTROL_Type;
+
+/*@} end of group CMSIS_CORE */
+
+
+/** \ingroup    CMSIS_core_register
+    \defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)
+    \brief      Type definitions for the NVIC Registers
+  @{
+ */
+
+/** \brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).
+ */
+typedef struct
+{
+  __IO uint32_t ISER[1];                 /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register           */
+       uint32_t RESERVED0[31];
+  __IO uint32_t ICER[1];                 /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register          */
+       uint32_t RSERVED1[31];
+  __IO uint32_t ISPR[1];                 /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register           */
+       uint32_t RESERVED2[31];
+  __IO uint32_t ICPR[1];                 /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register         */
+       uint32_t RESERVED3[31];
+       uint32_t RESERVED4[64];
+  __IO uint32_t IP[8];                   /*!< Offset: 0x300 (R/W)  Interrupt Priority Register              */
+}  NVIC_Type;
+
+/*@} end of group CMSIS_NVIC */
+
+
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_SCB     System Control Block (SCB)
+    \brief      Type definitions for the System Control Block Registers
+  @{
+ */
+
+/** \brief  Structure type to access the System Control Block (SCB).
+ */
+typedef struct
+{
+  __I  uint32_t CPUID;                   /*!< Offset: 0x000 (R/ )  CPUID Base Register                                   */
+  __IO uint32_t ICSR;                    /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register                  */
+       uint32_t RESERVED0;
+  __IO uint32_t AIRCR;                   /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register      */
+  __IO uint32_t SCR;                     /*!< Offset: 0x010 (R/W)  System Control Register                               */
+  __IO uint32_t CCR;                     /*!< Offset: 0x014 (R/W)  Configuration Control Register                        */
+       uint32_t RESERVED1;
+  __IO uint32_t SHP[2];                  /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED   */
+  __IO uint32_t SHCSR;                   /*!< Offset: 0x024 (R/W)  System Handler Control and State Register             */
+} SCB_Type;
+
+/* SCB CPUID Register Definitions */
+#define SCB_CPUID_IMPLEMENTER_Pos          24                                             /*!< SCB CPUID: IMPLEMENTER Position */
+#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */
+
+#define SCB_CPUID_VARIANT_Pos              20                                             /*!< SCB CPUID: VARIANT Position */
+#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */
+
+#define SCB_CPUID_ARCHITECTURE_Pos         16                                             /*!< SCB CPUID: ARCHITECTURE Position */
+#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */
+
+#define SCB_CPUID_PARTNO_Pos                4                                             /*!< SCB CPUID: PARTNO Position */
+#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */
+
+#define SCB_CPUID_REVISION_Pos              0                                             /*!< SCB CPUID: REVISION Position */
+#define SCB_CPUID_REVISION_Msk             (0xFUL << SCB_CPUID_REVISION_Pos)              /*!< SCB CPUID: REVISION Mask */
+
+/* SCB Interrupt Control State Register Definitions */
+#define SCB_ICSR_NMIPENDSET_Pos            31                                             /*!< SCB ICSR: NMIPENDSET Position */
+#define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */
+
+#define SCB_ICSR_PENDSVSET_Pos             28                                             /*!< SCB ICSR: PENDSVSET Position */
+#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */
+
+#define SCB_ICSR_PENDSVCLR_Pos             27                                             /*!< SCB ICSR: PENDSVCLR Position */
+#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */
+
+#define SCB_ICSR_PENDSTSET_Pos             26                                             /*!< SCB ICSR: PENDSTSET Position */
+#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */
+
+#define SCB_ICSR_PENDSTCLR_Pos             25                                             /*!< SCB ICSR: PENDSTCLR Position */
+#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */
+
+#define SCB_ICSR_ISRPREEMPT_Pos            23                                             /*!< SCB ICSR: ISRPREEMPT Position */
+#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */
+
+#define SCB_ICSR_ISRPENDING_Pos            22                                             /*!< SCB ICSR: ISRPENDING Position */
+#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */
+
+#define SCB_ICSR_VECTPENDING_Pos           12                                             /*!< SCB ICSR: VECTPENDING Position */
+#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */
+
+#define SCB_ICSR_VECTACTIVE_Pos             0                                             /*!< SCB ICSR: VECTACTIVE Position */
+#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos)           /*!< SCB ICSR: VECTACTIVE Mask */
+
+/* SCB Application Interrupt and Reset Control Register Definitions */
+#define SCB_AIRCR_VECTKEY_Pos              16                                             /*!< SCB AIRCR: VECTKEY Position */
+#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */
+
+#define SCB_AIRCR_VECTKEYSTAT_Pos          16                                             /*!< SCB AIRCR: VECTKEYSTAT Position */
+#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */
+
+#define SCB_AIRCR_ENDIANESS_Pos            15                                             /*!< SCB AIRCR: ENDIANESS Position */
+#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */
+
+#define SCB_AIRCR_SYSRESETREQ_Pos           2                                             /*!< SCB AIRCR: SYSRESETREQ Position */
+#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */
+
+#define SCB_AIRCR_VECTCLRACTIVE_Pos         1                                             /*!< SCB AIRCR: VECTCLRACTIVE Position */
+#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */
+
+/* SCB System Control Register Definitions */
+#define SCB_SCR_SEVONPEND_Pos               4                                             /*!< SCB SCR: SEVONPEND Position */
+#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */
+
+#define SCB_SCR_SLEEPDEEP_Pos               2                                             /*!< SCB SCR: SLEEPDEEP Position */
+#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */
+
+#define SCB_SCR_SLEEPONEXIT_Pos             1                                             /*!< SCB SCR: SLEEPONEXIT Position */
+#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */
+
+/* SCB Configuration Control Register Definitions */
+#define SCB_CCR_STKALIGN_Pos                9                                             /*!< SCB CCR: STKALIGN Position */
+#define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */
+
+#define SCB_CCR_UNALIGN_TRP_Pos             3                                             /*!< SCB CCR: UNALIGN_TRP Position */
+#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */
+
+/* SCB System Handler Control and State Register Definitions */
+#define SCB_SHCSR_SVCALLPENDED_Pos         15                                             /*!< SCB SHCSR: SVCALLPENDED Position */
+#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */
+
+/*@} end of group CMSIS_SCB */
+
+
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_SysTick     System Tick Timer (SysTick)
+    \brief      Type definitions for the System Timer Registers.
+  @{
+ */
+
+/** \brief  Structure type to access the System Timer (SysTick).
+ */
+typedef struct
+{
+  __IO uint32_t CTRL;                    /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */
+  __IO uint32_t LOAD;                    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */
+  __IO uint32_t VAL;                     /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */
+  __I  uint32_t CALIB;                   /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */
+} SysTick_Type;
+
+/* SysTick Control / Status Register Definitions */
+#define SysTick_CTRL_COUNTFLAG_Pos         16                                             /*!< SysTick CTRL: COUNTFLAG Position */
+#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */
+
+#define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< SysTick CTRL: CLKSOURCE Position */
+#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */
+
+#define SysTick_CTRL_TICKINT_Pos            1                                             /*!< SysTick CTRL: TICKINT Position */
+#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */
+
+#define SysTick_CTRL_ENABLE_Pos             0                                             /*!< SysTick CTRL: ENABLE Position */
+#define SysTick_CTRL_ENABLE_Msk            (1UL << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */
+
+/* SysTick Reload Register Definitions */
+#define SysTick_LOAD_RELOAD_Pos             0                                             /*!< SysTick LOAD: RELOAD Position */
+#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos)        /*!< SysTick LOAD: RELOAD Mask */
+
+/* SysTick Current Register Definitions */
+#define SysTick_VAL_CURRENT_Pos             0                                             /*!< SysTick VAL: CURRENT Position */
+#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos)        /*!< SysTick VAL: CURRENT Mask */
+
+/* SysTick Calibration Register Definitions */
+#define SysTick_CALIB_NOREF_Pos            31                                             /*!< SysTick CALIB: NOREF Position */
+#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */
+
+#define SysTick_CALIB_SKEW_Pos             30                                             /*!< SysTick CALIB: SKEW Position */
+#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */
+
+#define SysTick_CALIB_TENMS_Pos             0                                             /*!< SysTick CALIB: TENMS Position */
+#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos)        /*!< SysTick CALIB: TENMS Mask */
+
+/*@} end of group CMSIS_SysTick */
+
+
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)
+    \brief      Cortex-M0 Core Debug Registers (DCB registers, SHCSR, and DFSR)
+                are only accessible over DAP and not via processor. Therefore
+                they are not covered by the Cortex-M0 header file.
+  @{
+ */
+/*@} end of group CMSIS_CoreDebug */
+
+
+/** \ingroup    CMSIS_core_register
+    \defgroup   CMSIS_core_base     Core Definitions
+    \brief      Definitions for base addresses, unions, and structures.
+  @{
+ */
+
+/* Memory mapping of Cortex-M0 Hardware */
+#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */
+#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address              */
+#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address                 */
+#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */
+
+#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct           */
+#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct       */
+#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct          */
+
+
+/*@} */
+
+
+
+/*******************************************************************************
+ *                Hardware Abstraction Layer
+  Core Function Interface contains:
+  - Core NVIC Functions
+  - Core SysTick Functions
+  - Core Register Access Functions
+ ******************************************************************************/
+/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
+*/
+
+
+
+/* ##########################   NVIC functions  #################################### */
+/** \ingroup  CMSIS_Core_FunctionInterface
+    \defgroup CMSIS_Core_NVICFunctions NVIC Functions
+    \brief      Functions that manage interrupts and exceptions via the NVIC.
+    @{
+ */
+
+/* Interrupt Priorities are WORD accessible only under ARMv6M                   */
+/* The following MACROS handle generation of the register offset and byte masks */
+#define _BIT_SHIFT(IRQn)         (  (((uint32_t)(IRQn)       )    &  0x03) * 8 )
+#define _SHP_IDX(IRQn)           ( ((((uint32_t)(IRQn) & 0x0F)-8) >>    2)     )
+#define _IP_IDX(IRQn)            (   ((uint32_t)(IRQn)            >>    2)     )
+
+
+/** \brief  Enable External Interrupt
+
+    The function enables a device-specific interrupt in the NVIC interrupt controller.
+
+    \param [in]      IRQn  External interrupt number. Value cannot be negative.
+ */
+__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
+{
+  NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F));
+}
+
+
+/** \brief  Disable External Interrupt
+
+    The function disables a device-specific interrupt in the NVIC interrupt controller.
+
+    \param [in]      IRQn  External interrupt number. Value cannot be negative.
+ */
+__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
+{
+  NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F));
+}
+
+
+/** \brief  Get Pending Interrupt
+
+    The function reads the pending register in the NVIC and returns the pending bit
+    for the specified interrupt.
+
+    \param [in]      IRQn  Interrupt number.
+
+    \return             0  Interrupt status is not pending.
+    \return             1  Interrupt status is pending.
+ */
+__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
+{
+  return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0));
+}
+
+
+/** \brief  Set Pending Interrupt
+
+    The function sets the pending bit of an external interrupt.
+
+    \param [in]      IRQn  Interrupt number. Value cannot be negative.
+ */
+__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
+{
+  NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F));
+}
+
+
+/** \brief  Clear Pending Interrupt
+
+    The function clears the pending bit of an external interrupt.
+
+    \param [in]      IRQn  External interrupt number. Value cannot be negative.
+ */
+__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
+{
+  NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */
+}
+
+
+/** \brief  Set Interrupt Priority
+
+    The function sets the priority of an interrupt.
+
+    \note The priority cannot be set for every core interrupt.
+
+    \param [in]      IRQn  Interrupt number.
+    \param [in]  priority  Priority to set.
+ */
+__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
+{
+  if(IRQn < 0) {
+    SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
+        (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
+  else {
+    NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
+        (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
+}
+
+
+/** \brief  Get Interrupt Priority
+
+    The function reads the priority of an interrupt. The interrupt
+    number can be positive to specify an external (device specific)
+    interrupt, or negative to specify an internal (core) interrupt.
+
+
+    \param [in]   IRQn  Interrupt number.
+    \return             Interrupt Priority. Value is aligned automatically to the implemented
+                        priority bits of the microcontroller.
+ */
+__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
+{
+
+  if(IRQn < 0) {
+    return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for Cortex-M0 system interrupts */
+  else {
+    return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for device specific interrupts  */
+}
+
+
+/** \brief  System Reset
+
+    The function initiates a system reset request to reset the MCU.
+ */
+__STATIC_INLINE void NVIC_SystemReset(void)
+{
+  __DSB();                                                     /* Ensure all outstanding memory accesses included
+                                                                  buffered write are completed before reset */
+  SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |
+                 SCB_AIRCR_SYSRESETREQ_Msk);
+  __DSB();                                                     /* Ensure completion of memory access */
+  while(1);                                                    /* wait until reset */
+}
+
+/*@} end of CMSIS_Core_NVICFunctions */
+
+
+
+/* ##################################    SysTick function  ############################################ */
+/** \ingroup  CMSIS_Core_FunctionInterface
+    \defgroup CMSIS_Core_SysTickFunctions SysTick Functions
+    \brief      Functions that configure the System.
+  @{
+ */
+
+#if (__Vendor_SysTickConfig == 0)
+
+/** \brief  System Tick Configuration
+
+    The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
+    Counter is in free running mode to generate periodic interrupts.
+
+    \param [in]  ticks  Number of ticks between two interrupts.
+
+    \return          0  Function succeeded.
+    \return          1  Function failed.
+
+    \note     When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
+    function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
+    must contain a vendor-specific implementation of this function.
+
+ */
+__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
+{
+  if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */
+
+  SysTick->LOAD  = ticks - 1;                                  /* set reload register */
+  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
+  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
+  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
+                   SysTick_CTRL_TICKINT_Msk   |
+                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
+  return (0);                                                  /* Function successful */
+}
+
+#endif
+
+/*@} end of CMSIS_Core_SysTickFunctions */
+
+
+
+
+#endif /* __CORE_CM0_H_DEPENDANT */
+
+#endif /* __CMSIS_GENERIC */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0plus.h b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0plus.h
new file mode 100644
index 0000000..5cea74e
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cm0plus.h
@@ -0,0 +1,793 @@
+/**************************************************************************//**
+ * @file     core_cm0plus.h
+ * @brief    CMSIS Cortex-M0+ Core Peripheral Access Layer Header File
+ * @version  V3.20
+ * @date     25. February 2013
+ *
+ * @note
+ *
+ ******************************************************************************/
+/* Copyright (c) 2009 - 2013 ARM LIMITED
+
+   All rights reserved.
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+   - Neither the name of ARM nor the names of its contributors may be used
+     to endorse or promote products derived from this software without
+     specific prior written permission.
+   *
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
+   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+   ---------------------------------------------------------------------------*/
+
+
+#if defined ( __ICCARM__ )
+ #pragma system_include  /* treat file as system include file for MISRA check */
+#endif
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#ifndef __CORE_CM0PLUS_H_GENERIC
+#define __CORE_CM0PLUS_H_GENERIC
+
+/** \page CMSIS_MISRA_Exceptions  MISRA-C:2004 Compliance Exceptions
+  CMSIS violates the following MISRA-C:2004 rules:
+
+   \li Required Rule 8.5, object/function definition in header file.<br>
+     Function definitions in header files are used to allow 'inlining'.
+
+   \li Required Rule 18.4, declaration of union type or object of union type: '{...}'.<br>
+     Unions are used for effective representation of core registers.
+
+   \li Advisory Rule 19.7, Function-like macro defined.<br>
+     Function-like macros are used to allow more efficient code.
+ */
+
+
+/*******************************************************************************
+ *                 CMSIS definitions
+ ******************************************************************************/
+/** \ingroup Cortex-M0+
+  @{
+ */
+
+/*  CMSIS CM0P definitions */
+#define __CM0PLUS_CMSIS_VERSION_MAIN (0x03)                                /*!< [31:16] CMSIS HAL main version   */
+#define __CM0PLUS_CMSIS_VERSION_SUB  (0x20)                                /*!< [15:0]  CMSIS HAL sub version    */
+#define __CM0PLUS_CMSIS_VERSION      ((__CM0PLUS_CMSIS_VERSION_MAIN << 16) | \
+                                       __CM0PLUS_CMSIS_VERSION_SUB)        /*!< CMSIS HAL version number         */
+
+#define __CORTEX_M                (0x00)                                   /*!< Cortex-M Core                    */
+
+
+#if   defined ( __CC_ARM )
+  #define __ASM            __asm                                      /*!< asm keyword for ARM Compiler          */
+  #define __INLINE         __inline                                   /*!< inline keyword for ARM Compiler       */
+  #define __STATIC_INLINE  static __inline
+
+#elif defined ( __ICCARM__ )
+  #define __ASM            __asm                                      /*!< asm keyword for IAR Compiler          */
+  #define __INLINE         inline                                     /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */
+  #define __STATIC_INLINE  static inline
+
+#elif defined ( __GNUC__ )
+  #define __ASM            __asm                                      /*!< asm keyword for GNU Compiler          */
+  #define __INLINE         inline                                     /*!< inline keyword for GNU Compiler       */
+  #define __STATIC_INLINE  static inline
+
+#elif defined ( __TASKING__ )
+  #define __ASM            __asm                                      /*!< asm keyword for TASKING Compiler      */
+  #define __INLINE         inline                                     /*!< inline keyword for TASKING Compiler   */
+  #define __STATIC_INLINE  static inline
+
+#endif
+
+/** __FPU_USED indicates whether an FPU is used or not. This core does not support an FPU at all
+*/
+#define __FPU_USED       0
+
+#if defined ( __CC_ARM )
+  #if defined __TARGET_FPU_VFP
+    #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+  #endif
+
+#elif defined ( __ICCARM__ )
+  #if defined __ARMVFP__
+    #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+  #endif
+
+#elif defined ( __GNUC__ )
+  #if defined (__VFP_FP__) && !defined(__SOFTFP__)
+    #warning "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+  #endif
+
+#elif defined ( __TASKING__ )
+  #if defined __FPU_VFP__
+    #error "Compiler generates FPU instructions for a device without an FPU (check __FPU_PRESENT)"
+  #endif
+#endif
+
+#include <stdint.h>                      /* standard types definitions                      */
+#include <core_cmInstr.h>                /* Core Instruction Access                         */
+#include <core_cmFunc.h>                 /* Core Function Access                            */
+
+#endif /* __CORE_CM0PLUS_H_GENERIC */
+
+#ifndef __CMSIS_GENERIC
+
+#ifndef __CORE_CM0PLUS_H_DEPENDANT
+#define __CORE_CM0PLUS_H_DEPENDANT
+
+/* check device defines and use defaults */
+#if defined __CHECK_DEVICE_DEFINES
+  #ifndef __CM0PLUS_REV
+    #define __CM0PLUS_REV             0x0000
+    #warning "__CM0PLUS_REV not defined in device header file; using default!"
+  #endif
+
+  #ifndef __MPU_PRESENT
+    #define __MPU_PRESENT             0
+    #warning "__MPU_PRESENT not defined in device header file; using default!"
+  #endif
+
+  #ifndef __VTOR_PRESENT
+    #define __VTOR_PRESENT            0
+    #warning "__VTOR_PRESENT not defined in device header file; using default!"
+  #endif
+
+  #ifndef __NVIC_PRIO_BITS
+    #define __NVIC_PRIO_BITS          2
+    #warning "__NVIC_PRIO_BITS not defined in device header file; using default!"
+  #endif
+
+  #ifndef __Vendor_SysTickConfig
+    #define __Vendor_SysTickConfig    0
+    #warning "__Vendor_SysTickConfig not defined in device header file; using default!"
+  #endif
+#endif
+
+/* IO definitions (access restrictions to peripheral registers) */
+/**
+    \defgroup CMSIS_glob_defs CMSIS Global Defines
+
+    <strong>IO Type Qualifiers</strong> are used
+    \li to specify the access to peripheral variables.
+    \li for automatic generation of peripheral register debug information.
+*/
+#ifdef __cplusplus
+  #define   __I     volatile             /*!< Defines 'read only' permissions                 */
+#else
+  #define   __I     volatile const       /*!< Defines 'read only' permissions                 */
+#endif
+#define     __O     volatile             /*!< Defines 'write only' permissions                */
+#define     __IO    volatile             /*!< Defines 'read / write' permissions              */
+
+/*@} end of group Cortex-M0+ */
+
+
+
+/*******************************************************************************
+ *                 Register Abstraction
+  Core Register contain:
+  - Core Register
+  - Core NVIC Register
+  - Core SCB Register
+  - Core SysTick Register
+  - Core MPU Register
+ ******************************************************************************/
+/** \defgroup CMSIS_core_register Defines and Type Definitions
+    \brief Type definitions and defines for Cortex-M processor based devices.
+*/
+
+/** \ingroup    CMSIS_core_register
+    \defgroup   CMSIS_CORE  Status and Control Registers
+    \brief  Core Register type definitions.
+  @{
+ */
+
+/** \brief  Union type to access the Application Program Status Register (APSR).
+ */
+typedef union
+{
+  struct
+  {
+#if (__CORTEX_M != 0x04)
+    uint32_t _reserved0:27;              /*!< bit:  0..26  Reserved                           */
+#else
+    uint32_t _reserved0:16;              /*!< bit:  0..15  Reserved                           */
+    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags        */
+    uint32_t _reserved1:7;               /*!< bit: 20..26  Reserved                           */
+#endif
+    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag          */
+    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag       */
+    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag          */
+    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag           */
+    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag       */
+  } b;                                   /*!< Structure used for bit  access                  */
+  uint32_t w;                            /*!< Type      used for word access                  */
+} APSR_Type;
+
+
+/** \brief  Union type to access the Interrupt Program Status Register (IPSR).
+ */
+typedef union
+{
+  struct
+  {
+    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number                   */
+    uint32_t _reserved0:23;              /*!< bit:  9..31  Reserved                           */
+  } b;                                   /*!< Structure used for bit  access                  */
+  uint32_t w;                            /*!< Type      used for word access                  */
+} IPSR_Type;
+
+
+/** \brief  Union type to access the Special-Purpose Program Status Registers (xPSR).
+ */
+typedef union
+{
+  struct
+  {
+    uint32_t ISR:9;                      /*!< bit:  0.. 8  Exception number                   */
+#if (__CORTEX_M != 0x04)
+    uint32_t _reserved0:15;              /*!< bit:  9..23  Reserved                           */
+#else
+    uint32_t _reserved0:7;               /*!< bit:  9..15  Reserved                           */
+    uint32_t GE:4;                       /*!< bit: 16..19  Greater than or Equal flags        */
+    uint32_t _reserved1:4;               /*!< bit: 20..23  Reserved                           */
+#endif
+    uint32_t T:1;                        /*!< bit:     24  Thumb bit        (read 0)          */
+    uint32_t IT:2;                       /*!< bit: 25..26  saved IT state   (read 0)          */
+    uint32_t Q:1;                        /*!< bit:     27  Saturation condition flag          */
+    uint32_t V:1;                        /*!< bit:     28  Overflow condition code flag       */
+    uint32_t C:1;                        /*!< bit:     29  Carry condition code flag          */
+    uint32_t Z:1;                        /*!< bit:     30  Zero condition code flag           */
+    uint32_t N:1;                        /*!< bit:     31  Negative condition code flag       */
+  } b;                                   /*!< Structure used for bit  access                  */
+  uint32_t w;                            /*!< Type      used for word access                  */
+} xPSR_Type;
+
+
+/** \brief  Union type to access the Control Registers (CONTROL).
+ */
+typedef union
+{
+  struct
+  {
+    uint32_t nPRIV:1;                    /*!< bit:      0  Execution privilege in Thread mode */
+    uint32_t SPSEL:1;                    /*!< bit:      1  Stack to be used                   */
+    uint32_t FPCA:1;                     /*!< bit:      2  FP extension active flag           */
+    uint32_t _reserved0:29;              /*!< bit:  3..31  Reserved                           */
+  } b;                                   /*!< Structure used for bit  access                  */
+  uint32_t w;                            /*!< Type      used for word access                  */
+} CONTROL_Type;
+
+/*@} end of group CMSIS_CORE */
+
+
+/** \ingroup    CMSIS_core_register
+    \defgroup   CMSIS_NVIC  Nested Vectored Interrupt Controller (NVIC)
+    \brief      Type definitions for the NVIC Registers
+  @{
+ */
+
+/** \brief  Structure type to access the Nested Vectored Interrupt Controller (NVIC).
+ */
+typedef struct
+{
+  __IO uint32_t ISER[1];                 /*!< Offset: 0x000 (R/W)  Interrupt Set Enable Register           */
+       uint32_t RESERVED0[31];
+  __IO uint32_t ICER[1];                 /*!< Offset: 0x080 (R/W)  Interrupt Clear Enable Register          */
+       uint32_t RSERVED1[31];
+  __IO uint32_t ISPR[1];                 /*!< Offset: 0x100 (R/W)  Interrupt Set Pending Register           */
+       uint32_t RESERVED2[31];
+  __IO uint32_t ICPR[1];                 /*!< Offset: 0x180 (R/W)  Interrupt Clear Pending Register         */
+       uint32_t RESERVED3[31];
+       uint32_t RESERVED4[64];
+  __IO uint32_t IP[8];                   /*!< Offset: 0x300 (R/W)  Interrupt Priority Register              */
+}  NVIC_Type;
+
+/*@} end of group CMSIS_NVIC */
+
+
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_SCB     System Control Block (SCB)
+    \brief      Type definitions for the System Control Block Registers
+  @{
+ */
+
+/** \brief  Structure type to access the System Control Block (SCB).
+ */
+typedef struct
+{
+  __I  uint32_t CPUID;                   /*!< Offset: 0x000 (R/ )  CPUID Base Register                                   */
+  __IO uint32_t ICSR;                    /*!< Offset: 0x004 (R/W)  Interrupt Control and State Register                  */
+#if (__VTOR_PRESENT == 1)
+  __IO uint32_t VTOR;                    /*!< Offset: 0x008 (R/W)  Vector Table Offset Register                          */
+#else
+       uint32_t RESERVED0;
+#endif
+  __IO uint32_t AIRCR;                   /*!< Offset: 0x00C (R/W)  Application Interrupt and Reset Control Register      */
+  __IO uint32_t SCR;                     /*!< Offset: 0x010 (R/W)  System Control Register                               */
+  __IO uint32_t CCR;                     /*!< Offset: 0x014 (R/W)  Configuration Control Register                        */
+       uint32_t RESERVED1;
+  __IO uint32_t SHP[2];                  /*!< Offset: 0x01C (R/W)  System Handlers Priority Registers. [0] is RESERVED   */
+  __IO uint32_t SHCSR;                   /*!< Offset: 0x024 (R/W)  System Handler Control and State Register             */
+} SCB_Type;
+
+/* SCB CPUID Register Definitions */
+#define SCB_CPUID_IMPLEMENTER_Pos          24                                             /*!< SCB CPUID: IMPLEMENTER Position */
+#define SCB_CPUID_IMPLEMENTER_Msk          (0xFFUL << SCB_CPUID_IMPLEMENTER_Pos)          /*!< SCB CPUID: IMPLEMENTER Mask */
+
+#define SCB_CPUID_VARIANT_Pos              20                                             /*!< SCB CPUID: VARIANT Position */
+#define SCB_CPUID_VARIANT_Msk              (0xFUL << SCB_CPUID_VARIANT_Pos)               /*!< SCB CPUID: VARIANT Mask */
+
+#define SCB_CPUID_ARCHITECTURE_Pos         16                                             /*!< SCB CPUID: ARCHITECTURE Position */
+#define SCB_CPUID_ARCHITECTURE_Msk         (0xFUL << SCB_CPUID_ARCHITECTURE_Pos)          /*!< SCB CPUID: ARCHITECTURE Mask */
+
+#define SCB_CPUID_PARTNO_Pos                4                                             /*!< SCB CPUID: PARTNO Position */
+#define SCB_CPUID_PARTNO_Msk               (0xFFFUL << SCB_CPUID_PARTNO_Pos)              /*!< SCB CPUID: PARTNO Mask */
+
+#define SCB_CPUID_REVISION_Pos              0                                             /*!< SCB CPUID: REVISION Position */
+#define SCB_CPUID_REVISION_Msk             (0xFUL << SCB_CPUID_REVISION_Pos)              /*!< SCB CPUID: REVISION Mask */
+
+/* SCB Interrupt Control State Register Definitions */
+#define SCB_ICSR_NMIPENDSET_Pos            31                                             /*!< SCB ICSR: NMIPENDSET Position */
+#define SCB_ICSR_NMIPENDSET_Msk            (1UL << SCB_ICSR_NMIPENDSET_Pos)               /*!< SCB ICSR: NMIPENDSET Mask */
+
+#define SCB_ICSR_PENDSVSET_Pos             28                                             /*!< SCB ICSR: PENDSVSET Position */
+#define SCB_ICSR_PENDSVSET_Msk             (1UL << SCB_ICSR_PENDSVSET_Pos)                /*!< SCB ICSR: PENDSVSET Mask */
+
+#define SCB_ICSR_PENDSVCLR_Pos             27                                             /*!< SCB ICSR: PENDSVCLR Position */
+#define SCB_ICSR_PENDSVCLR_Msk             (1UL << SCB_ICSR_PENDSVCLR_Pos)                /*!< SCB ICSR: PENDSVCLR Mask */
+
+#define SCB_ICSR_PENDSTSET_Pos             26                                             /*!< SCB ICSR: PENDSTSET Position */
+#define SCB_ICSR_PENDSTSET_Msk             (1UL << SCB_ICSR_PENDSTSET_Pos)                /*!< SCB ICSR: PENDSTSET Mask */
+
+#define SCB_ICSR_PENDSTCLR_Pos             25                                             /*!< SCB ICSR: PENDSTCLR Position */
+#define SCB_ICSR_PENDSTCLR_Msk             (1UL << SCB_ICSR_PENDSTCLR_Pos)                /*!< SCB ICSR: PENDSTCLR Mask */
+
+#define SCB_ICSR_ISRPREEMPT_Pos            23                                             /*!< SCB ICSR: ISRPREEMPT Position */
+#define SCB_ICSR_ISRPREEMPT_Msk            (1UL << SCB_ICSR_ISRPREEMPT_Pos)               /*!< SCB ICSR: ISRPREEMPT Mask */
+
+#define SCB_ICSR_ISRPENDING_Pos            22                                             /*!< SCB ICSR: ISRPENDING Position */
+#define SCB_ICSR_ISRPENDING_Msk            (1UL << SCB_ICSR_ISRPENDING_Pos)               /*!< SCB ICSR: ISRPENDING Mask */
+
+#define SCB_ICSR_VECTPENDING_Pos           12                                             /*!< SCB ICSR: VECTPENDING Position */
+#define SCB_ICSR_VECTPENDING_Msk           (0x1FFUL << SCB_ICSR_VECTPENDING_Pos)          /*!< SCB ICSR: VECTPENDING Mask */
+
+#define SCB_ICSR_VECTACTIVE_Pos             0                                             /*!< SCB ICSR: VECTACTIVE Position */
+#define SCB_ICSR_VECTACTIVE_Msk            (0x1FFUL << SCB_ICSR_VECTACTIVE_Pos)           /*!< SCB ICSR: VECTACTIVE Mask */
+
+#if (__VTOR_PRESENT == 1)
+/* SCB Interrupt Control State Register Definitions */
+#define SCB_VTOR_TBLOFF_Pos                 8                                             /*!< SCB VTOR: TBLOFF Position */
+#define SCB_VTOR_TBLOFF_Msk                (0xFFFFFFUL << SCB_VTOR_TBLOFF_Pos)            /*!< SCB VTOR: TBLOFF Mask */
+#endif
+
+/* SCB Application Interrupt and Reset Control Register Definitions */
+#define SCB_AIRCR_VECTKEY_Pos              16                                             /*!< SCB AIRCR: VECTKEY Position */
+#define SCB_AIRCR_VECTKEY_Msk              (0xFFFFUL << SCB_AIRCR_VECTKEY_Pos)            /*!< SCB AIRCR: VECTKEY Mask */
+
+#define SCB_AIRCR_VECTKEYSTAT_Pos          16                                             /*!< SCB AIRCR: VECTKEYSTAT Position */
+#define SCB_AIRCR_VECTKEYSTAT_Msk          (0xFFFFUL << SCB_AIRCR_VECTKEYSTAT_Pos)        /*!< SCB AIRCR: VECTKEYSTAT Mask */
+
+#define SCB_AIRCR_ENDIANESS_Pos            15                                             /*!< SCB AIRCR: ENDIANESS Position */
+#define SCB_AIRCR_ENDIANESS_Msk            (1UL << SCB_AIRCR_ENDIANESS_Pos)               /*!< SCB AIRCR: ENDIANESS Mask */
+
+#define SCB_AIRCR_SYSRESETREQ_Pos           2                                             /*!< SCB AIRCR: SYSRESETREQ Position */
+#define SCB_AIRCR_SYSRESETREQ_Msk          (1UL << SCB_AIRCR_SYSRESETREQ_Pos)             /*!< SCB AIRCR: SYSRESETREQ Mask */
+
+#define SCB_AIRCR_VECTCLRACTIVE_Pos         1                                             /*!< SCB AIRCR: VECTCLRACTIVE Position */
+#define SCB_AIRCR_VECTCLRACTIVE_Msk        (1UL << SCB_AIRCR_VECTCLRACTIVE_Pos)           /*!< SCB AIRCR: VECTCLRACTIVE Mask */
+
+/* SCB System Control Register Definitions */
+#define SCB_SCR_SEVONPEND_Pos               4                                             /*!< SCB SCR: SEVONPEND Position */
+#define SCB_SCR_SEVONPEND_Msk              (1UL << SCB_SCR_SEVONPEND_Pos)                 /*!< SCB SCR: SEVONPEND Mask */
+
+#define SCB_SCR_SLEEPDEEP_Pos               2                                             /*!< SCB SCR: SLEEPDEEP Position */
+#define SCB_SCR_SLEEPDEEP_Msk              (1UL << SCB_SCR_SLEEPDEEP_Pos)                 /*!< SCB SCR: SLEEPDEEP Mask */
+
+#define SCB_SCR_SLEEPONEXIT_Pos             1                                             /*!< SCB SCR: SLEEPONEXIT Position */
+#define SCB_SCR_SLEEPONEXIT_Msk            (1UL << SCB_SCR_SLEEPONEXIT_Pos)               /*!< SCB SCR: SLEEPONEXIT Mask */
+
+/* SCB Configuration Control Register Definitions */
+#define SCB_CCR_STKALIGN_Pos                9                                             /*!< SCB CCR: STKALIGN Position */
+#define SCB_CCR_STKALIGN_Msk               (1UL << SCB_CCR_STKALIGN_Pos)                  /*!< SCB CCR: STKALIGN Mask */
+
+#define SCB_CCR_UNALIGN_TRP_Pos             3                                             /*!< SCB CCR: UNALIGN_TRP Position */
+#define SCB_CCR_UNALIGN_TRP_Msk            (1UL << SCB_CCR_UNALIGN_TRP_Pos)               /*!< SCB CCR: UNALIGN_TRP Mask */
+
+/* SCB System Handler Control and State Register Definitions */
+#define SCB_SHCSR_SVCALLPENDED_Pos         15                                             /*!< SCB SHCSR: SVCALLPENDED Position */
+#define SCB_SHCSR_SVCALLPENDED_Msk         (1UL << SCB_SHCSR_SVCALLPENDED_Pos)            /*!< SCB SHCSR: SVCALLPENDED Mask */
+
+/*@} end of group CMSIS_SCB */
+
+
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_SysTick     System Tick Timer (SysTick)
+    \brief      Type definitions for the System Timer Registers.
+  @{
+ */
+
+/** \brief  Structure type to access the System Timer (SysTick).
+ */
+typedef struct
+{
+  __IO uint32_t CTRL;                    /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */
+  __IO uint32_t LOAD;                    /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register       */
+  __IO uint32_t VAL;                     /*!< Offset: 0x008 (R/W)  SysTick Current Value Register      */
+  __I  uint32_t CALIB;                   /*!< Offset: 0x00C (R/ )  SysTick Calibration Register        */
+} SysTick_Type;
+
+/* SysTick Control / Status Register Definitions */
+#define SysTick_CTRL_COUNTFLAG_Pos         16                                             /*!< SysTick CTRL: COUNTFLAG Position */
+#define SysTick_CTRL_COUNTFLAG_Msk         (1UL << SysTick_CTRL_COUNTFLAG_Pos)            /*!< SysTick CTRL: COUNTFLAG Mask */
+
+#define SysTick_CTRL_CLKSOURCE_Pos          2                                             /*!< SysTick CTRL: CLKSOURCE Position */
+#define SysTick_CTRL_CLKSOURCE_Msk         (1UL << SysTick_CTRL_CLKSOURCE_Pos)            /*!< SysTick CTRL: CLKSOURCE Mask */
+
+#define SysTick_CTRL_TICKINT_Pos            1                                             /*!< SysTick CTRL: TICKINT Position */
+#define SysTick_CTRL_TICKINT_Msk           (1UL << SysTick_CTRL_TICKINT_Pos)              /*!< SysTick CTRL: TICKINT Mask */
+
+#define SysTick_CTRL_ENABLE_Pos             0                                             /*!< SysTick CTRL: ENABLE Position */
+#define SysTick_CTRL_ENABLE_Msk            (1UL << SysTick_CTRL_ENABLE_Pos)               /*!< SysTick CTRL: ENABLE Mask */
+
+/* SysTick Reload Register Definitions */
+#define SysTick_LOAD_RELOAD_Pos             0                                             /*!< SysTick LOAD: RELOAD Position */
+#define SysTick_LOAD_RELOAD_Msk            (0xFFFFFFUL << SysTick_LOAD_RELOAD_Pos)        /*!< SysTick LOAD: RELOAD Mask */
+
+/* SysTick Current Register Definitions */
+#define SysTick_VAL_CURRENT_Pos             0                                             /*!< SysTick VAL: CURRENT Position */
+#define SysTick_VAL_CURRENT_Msk            (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos)        /*!< SysTick VAL: CURRENT Mask */
+
+/* SysTick Calibration Register Definitions */
+#define SysTick_CALIB_NOREF_Pos            31                                             /*!< SysTick CALIB: NOREF Position */
+#define SysTick_CALIB_NOREF_Msk            (1UL << SysTick_CALIB_NOREF_Pos)               /*!< SysTick CALIB: NOREF Mask */
+
+#define SysTick_CALIB_SKEW_Pos             30                                             /*!< SysTick CALIB: SKEW Position */
+#define SysTick_CALIB_SKEW_Msk             (1UL << SysTick_CALIB_SKEW_Pos)                /*!< SysTick CALIB: SKEW Mask */
+
+#define SysTick_CALIB_TENMS_Pos             0                                             /*!< SysTick CALIB: TENMS Position */
+#define SysTick_CALIB_TENMS_Msk            (0xFFFFFFUL << SysTick_VAL_CURRENT_Pos)        /*!< SysTick CALIB: TENMS Mask */
+
+/*@} end of group CMSIS_SysTick */
+
+#if (__MPU_PRESENT == 1)
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_MPU     Memory Protection Unit (MPU)
+    \brief      Type definitions for the Memory Protection Unit (MPU)
+  @{
+ */
+
+/** \brief  Structure type to access the Memory Protection Unit (MPU).
+ */
+typedef struct
+{
+  __I  uint32_t TYPE;                    /*!< Offset: 0x000 (R/ )  MPU Type Register                              */
+  __IO uint32_t CTRL;                    /*!< Offset: 0x004 (R/W)  MPU Control Register                           */
+  __IO uint32_t RNR;                     /*!< Offset: 0x008 (R/W)  MPU Region RNRber Register                     */
+  __IO uint32_t RBAR;                    /*!< Offset: 0x00C (R/W)  MPU Region Base Address Register               */
+  __IO uint32_t RASR;                    /*!< Offset: 0x010 (R/W)  MPU Region Attribute and Size Register         */
+} MPU_Type;
+
+/* MPU Type Register */
+#define MPU_TYPE_IREGION_Pos               16                                             /*!< MPU TYPE: IREGION Position */
+#define MPU_TYPE_IREGION_Msk               (0xFFUL << MPU_TYPE_IREGION_Pos)               /*!< MPU TYPE: IREGION Mask */
+
+#define MPU_TYPE_DREGION_Pos                8                                             /*!< MPU TYPE: DREGION Position */
+#define MPU_TYPE_DREGION_Msk               (0xFFUL << MPU_TYPE_DREGION_Pos)               /*!< MPU TYPE: DREGION Mask */
+
+#define MPU_TYPE_SEPARATE_Pos               0                                             /*!< MPU TYPE: SEPARATE Position */
+#define MPU_TYPE_SEPARATE_Msk              (1UL << MPU_TYPE_SEPARATE_Pos)                 /*!< MPU TYPE: SEPARATE Mask */
+
+/* MPU Control Register */
+#define MPU_CTRL_PRIVDEFENA_Pos             2                                             /*!< MPU CTRL: PRIVDEFENA Position */
+#define MPU_CTRL_PRIVDEFENA_Msk            (1UL << MPU_CTRL_PRIVDEFENA_Pos)               /*!< MPU CTRL: PRIVDEFENA Mask */
+
+#define MPU_CTRL_HFNMIENA_Pos               1                                             /*!< MPU CTRL: HFNMIENA Position */
+#define MPU_CTRL_HFNMIENA_Msk              (1UL << MPU_CTRL_HFNMIENA_Pos)                 /*!< MPU CTRL: HFNMIENA Mask */
+
+#define MPU_CTRL_ENABLE_Pos                 0                                             /*!< MPU CTRL: ENABLE Position */
+#define MPU_CTRL_ENABLE_Msk                (1UL << MPU_CTRL_ENABLE_Pos)                   /*!< MPU CTRL: ENABLE Mask */
+
+/* MPU Region Number Register */
+#define MPU_RNR_REGION_Pos                  0                                             /*!< MPU RNR: REGION Position */
+#define MPU_RNR_REGION_Msk                 (0xFFUL << MPU_RNR_REGION_Pos)                 /*!< MPU RNR: REGION Mask */
+
+/* MPU Region Base Address Register */
+#define MPU_RBAR_ADDR_Pos                   8                                             /*!< MPU RBAR: ADDR Position */
+#define MPU_RBAR_ADDR_Msk                  (0xFFFFFFUL << MPU_RBAR_ADDR_Pos)              /*!< MPU RBAR: ADDR Mask */
+
+#define MPU_RBAR_VALID_Pos                  4                                             /*!< MPU RBAR: VALID Position */
+#define MPU_RBAR_VALID_Msk                 (1UL << MPU_RBAR_VALID_Pos)                    /*!< MPU RBAR: VALID Mask */
+
+#define MPU_RBAR_REGION_Pos                 0                                             /*!< MPU RBAR: REGION Position */
+#define MPU_RBAR_REGION_Msk                (0xFUL << MPU_RBAR_REGION_Pos)                 /*!< MPU RBAR: REGION Mask */
+
+/* MPU Region Attribute and Size Register */
+#define MPU_RASR_ATTRS_Pos                 16                                             /*!< MPU RASR: MPU Region Attribute field Position */
+#define MPU_RASR_ATTRS_Msk                 (0xFFFFUL << MPU_RASR_ATTRS_Pos)               /*!< MPU RASR: MPU Region Attribute field Mask */
+
+#define MPU_RASR_XN_Pos                    28                                             /*!< MPU RASR: ATTRS.XN Position */
+#define MPU_RASR_XN_Msk                    (1UL << MPU_RASR_XN_Pos)                       /*!< MPU RASR: ATTRS.XN Mask */
+
+#define MPU_RASR_AP_Pos                    24                                             /*!< MPU RASR: ATTRS.AP Position */
+#define MPU_RASR_AP_Msk                    (0x7UL << MPU_RASR_AP_Pos)                     /*!< MPU RASR: ATTRS.AP Mask */
+
+#define MPU_RASR_TEX_Pos                   19                                             /*!< MPU RASR: ATTRS.TEX Position */
+#define MPU_RASR_TEX_Msk                   (0x7UL << MPU_RASR_TEX_Pos)                    /*!< MPU RASR: ATTRS.TEX Mask */
+
+#define MPU_RASR_S_Pos                     18                                             /*!< MPU RASR: ATTRS.S Position */
+#define MPU_RASR_S_Msk                     (1UL << MPU_RASR_S_Pos)                        /*!< MPU RASR: ATTRS.S Mask */
+
+#define MPU_RASR_C_Pos                     17                                             /*!< MPU RASR: ATTRS.C Position */
+#define MPU_RASR_C_Msk                     (1UL << MPU_RASR_C_Pos)                        /*!< MPU RASR: ATTRS.C Mask */
+
+#define MPU_RASR_B_Pos                     16                                             /*!< MPU RASR: ATTRS.B Position */
+#define MPU_RASR_B_Msk                     (1UL << MPU_RASR_B_Pos)                        /*!< MPU RASR: ATTRS.B Mask */
+
+#define MPU_RASR_SRD_Pos                    8                                             /*!< MPU RASR: Sub-Region Disable Position */
+#define MPU_RASR_SRD_Msk                   (0xFFUL << MPU_RASR_SRD_Pos)                   /*!< MPU RASR: Sub-Region Disable Mask */
+
+#define MPU_RASR_SIZE_Pos                   1                                             /*!< MPU RASR: Region Size Field Position */
+#define MPU_RASR_SIZE_Msk                  (0x1FUL << MPU_RASR_SIZE_Pos)                  /*!< MPU RASR: Region Size Field Mask */
+
+#define MPU_RASR_ENABLE_Pos                 0                                             /*!< MPU RASR: Region enable bit Position */
+#define MPU_RASR_ENABLE_Msk                (1UL << MPU_RASR_ENABLE_Pos)                   /*!< MPU RASR: Region enable bit Disable Mask */
+
+/*@} end of group CMSIS_MPU */
+#endif
+
+
+/** \ingroup  CMSIS_core_register
+    \defgroup CMSIS_CoreDebug       Core Debug Registers (CoreDebug)
+    \brief      Cortex-M0+ Core Debug Registers (DCB registers, SHCSR, and DFSR)
+                are only accessible over DAP and not via processor. Therefore
+                they are not covered by the Cortex-M0 header file.
+  @{
+ */
+/*@} end of group CMSIS_CoreDebug */
+
+
+/** \ingroup    CMSIS_core_register
+    \defgroup   CMSIS_core_base     Core Definitions
+    \brief      Definitions for base addresses, unions, and structures.
+  @{
+ */
+
+/* Memory mapping of Cortex-M0+ Hardware */
+#define SCS_BASE            (0xE000E000UL)                            /*!< System Control Space Base Address */
+#define SysTick_BASE        (SCS_BASE +  0x0010UL)                    /*!< SysTick Base Address              */
+#define NVIC_BASE           (SCS_BASE +  0x0100UL)                    /*!< NVIC Base Address                 */
+#define SCB_BASE            (SCS_BASE +  0x0D00UL)                    /*!< System Control Block Base Address */
+
+#define SCB                 ((SCB_Type       *)     SCB_BASE      )   /*!< SCB configuration struct           */
+#define SysTick             ((SysTick_Type   *)     SysTick_BASE  )   /*!< SysTick configuration struct       */
+#define NVIC                ((NVIC_Type      *)     NVIC_BASE     )   /*!< NVIC configuration struct          */
+
+#if (__MPU_PRESENT == 1)
+  #define MPU_BASE          (SCS_BASE +  0x0D90UL)                    /*!< Memory Protection Unit             */
+  #define MPU               ((MPU_Type       *)     MPU_BASE      )   /*!< Memory Protection Unit             */
+#endif
+
+/*@} */
+
+
+
+/*******************************************************************************
+ *                Hardware Abstraction Layer
+  Core Function Interface contains:
+  - Core NVIC Functions
+  - Core SysTick Functions
+  - Core Register Access Functions
+ ******************************************************************************/
+/** \defgroup CMSIS_Core_FunctionInterface Functions and Instructions Reference
+*/
+
+
+
+/* ##########################   NVIC functions  #################################### */
+/** \ingroup  CMSIS_Core_FunctionInterface
+    \defgroup CMSIS_Core_NVICFunctions NVIC Functions
+    \brief      Functions that manage interrupts and exceptions via the NVIC.
+    @{
+ */
+
+/* Interrupt Priorities are WORD accessible only under ARMv6M                   */
+/* The following MACROS handle generation of the register offset and byte masks */
+#define _BIT_SHIFT(IRQn)         (  (((uint32_t)(IRQn)       )    &  0x03) * 8 )
+#define _SHP_IDX(IRQn)           ( ((((uint32_t)(IRQn) & 0x0F)-8) >>    2)     )
+#define _IP_IDX(IRQn)            (   ((uint32_t)(IRQn)            >>    2)     )
+
+
+/** \brief  Enable External Interrupt
+
+    The function enables a device-specific interrupt in the NVIC interrupt controller.
+
+    \param [in]      IRQn  External interrupt number. Value cannot be negative.
+ */
+__STATIC_INLINE void NVIC_EnableIRQ(IRQn_Type IRQn)
+{
+  NVIC->ISER[0] = (1 << ((uint32_t)(IRQn) & 0x1F));
+}
+
+
+/** \brief  Disable External Interrupt
+
+    The function disables a device-specific interrupt in the NVIC interrupt controller.
+
+    \param [in]      IRQn  External interrupt number. Value cannot be negative.
+ */
+__STATIC_INLINE void NVIC_DisableIRQ(IRQn_Type IRQn)
+{
+  NVIC->ICER[0] = (1 << ((uint32_t)(IRQn) & 0x1F));
+}
+
+
+/** \brief  Get Pending Interrupt
+
+    The function reads the pending register in the NVIC and returns the pending bit
+    for the specified interrupt.
+
+    \param [in]      IRQn  Interrupt number.
+
+    \return             0  Interrupt status is not pending.
+    \return             1  Interrupt status is pending.
+ */
+__STATIC_INLINE uint32_t NVIC_GetPendingIRQ(IRQn_Type IRQn)
+{
+  return((uint32_t) ((NVIC->ISPR[0] & (1 << ((uint32_t)(IRQn) & 0x1F)))?1:0));
+}
+
+
+/** \brief  Set Pending Interrupt
+
+    The function sets the pending bit of an external interrupt.
+
+    \param [in]      IRQn  Interrupt number. Value cannot be negative.
+ */
+__STATIC_INLINE void NVIC_SetPendingIRQ(IRQn_Type IRQn)
+{
+  NVIC->ISPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F));
+}
+
+
+/** \brief  Clear Pending Interrupt
+
+    The function clears the pending bit of an external interrupt.
+
+    \param [in]      IRQn  External interrupt number. Value cannot be negative.
+ */
+__STATIC_INLINE void NVIC_ClearPendingIRQ(IRQn_Type IRQn)
+{
+  NVIC->ICPR[0] = (1 << ((uint32_t)(IRQn) & 0x1F)); /* Clear pending interrupt */
+}
+
+
+/** \brief  Set Interrupt Priority
+
+    The function sets the priority of an interrupt.
+
+    \note The priority cannot be set for every core interrupt.
+
+    \param [in]      IRQn  Interrupt number.
+    \param [in]  priority  Priority to set.
+ */
+__STATIC_INLINE void NVIC_SetPriority(IRQn_Type IRQn, uint32_t priority)
+{
+  if(IRQn < 0) {
+    SCB->SHP[_SHP_IDX(IRQn)] = (SCB->SHP[_SHP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
+        (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
+  else {
+    NVIC->IP[_IP_IDX(IRQn)] = (NVIC->IP[_IP_IDX(IRQn)] & ~(0xFF << _BIT_SHIFT(IRQn))) |
+        (((priority << (8 - __NVIC_PRIO_BITS)) & 0xFF) << _BIT_SHIFT(IRQn)); }
+}
+
+
+/** \brief  Get Interrupt Priority
+
+    The function reads the priority of an interrupt. The interrupt
+    number can be positive to specify an external (device specific)
+    interrupt, or negative to specify an internal (core) interrupt.
+
+
+    \param [in]   IRQn  Interrupt number.
+    \return             Interrupt Priority. Value is aligned automatically to the implemented
+                        priority bits of the microcontroller.
+ */
+__STATIC_INLINE uint32_t NVIC_GetPriority(IRQn_Type IRQn)
+{
+
+  if(IRQn < 0) {
+    return((uint32_t)(((SCB->SHP[_SHP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for Cortex-M0 system interrupts */
+  else {
+    return((uint32_t)(((NVIC->IP[ _IP_IDX(IRQn)] >> _BIT_SHIFT(IRQn) ) & 0xFF) >> (8 - __NVIC_PRIO_BITS)));  } /* get priority for device specific interrupts  */
+}
+
+
+/** \brief  System Reset
+
+    The function initiates a system reset request to reset the MCU.
+ */
+__STATIC_INLINE void NVIC_SystemReset(void)
+{
+  __DSB();                                                     /* Ensure all outstanding memory accesses included
+                                                                  buffered write are completed before reset */
+  SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |
+                 SCB_AIRCR_SYSRESETREQ_Msk);
+  __DSB();                                                     /* Ensure completion of memory access */
+  while(1);                                                    /* wait until reset */
+}
+
+/*@} end of CMSIS_Core_NVICFunctions */
+
+
+
+/* ##################################    SysTick function  ############################################ */
+/** \ingroup  CMSIS_Core_FunctionInterface
+    \defgroup CMSIS_Core_SysTickFunctions SysTick Functions
+    \brief      Functions that configure the System.
+  @{
+ */
+
+#if (__Vendor_SysTickConfig == 0)
+
+/** \brief  System Tick Configuration
+
+    The function initializes the System Timer and its interrupt, and starts the System Tick Timer.
+    Counter is in free running mode to generate periodic interrupts.
+
+    \param [in]  ticks  Number of ticks between two interrupts.
+
+    \return          0  Function succeeded.
+    \return          1  Function failed.
+
+    \note     When the variable <b>__Vendor_SysTickConfig</b> is set to 1, then the
+    function <b>SysTick_Config</b> is not included. In this case, the file <b><i>device</i>.h</b>
+    must contain a vendor-specific implementation of this function.
+
+ */
+__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
+{
+  if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk)  return (1);      /* Reload value impossible */
+
+  SysTick->LOAD  = ticks - 1;                                  /* set reload register */
+  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Systick Interrupt */
+  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
+  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk |
+                   SysTick_CTRL_TICKINT_Msk   |
+                   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
+  return (0);                                                  /* Function successful */
+}
+
+#endif
+
+/*@} end of CMSIS_Core_SysTickFunctions */
+
+
+
+
+#endif /* __CORE_CM0PLUS_H_DEPENDANT */
+
+#endif /* __CMSIS_GENERIC */
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmFunc.h b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmFunc.h
new file mode 100644
index 0000000..0a18faf
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmFunc.h
@@ -0,0 +1,636 @@
+/**************************************************************************//**
+ * @file     core_cmFunc.h
+ * @brief    CMSIS Cortex-M Core Function Access Header File
+ * @version  V3.20
+ * @date     25. February 2013
+ *
+ * @note
+ *
+ ******************************************************************************/
+/* Copyright (c) 2009 - 2013 ARM LIMITED
+
+   All rights reserved.
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+   - Neither the name of ARM nor the names of its contributors may be used
+     to endorse or promote products derived from this software without
+     specific prior written permission.
+   *
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
+   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+   ---------------------------------------------------------------------------*/
+
+
+#ifndef __CORE_CMFUNC_H
+#define __CORE_CMFUNC_H
+
+
+/* ###########################  Core Function Access  ########################### */
+/** \ingroup  CMSIS_Core_FunctionInterface
+    \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions
+  @{
+ */
+
+#if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
+/* ARM armcc specific functions */
+
+#if (__ARMCC_VERSION < 400677)
+  #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
+#endif
+
+/* intrinsic void __enable_irq();     */
+/* intrinsic void __disable_irq();    */
+
+/** \brief  Get Control Register
+
+    This function returns the content of the Control Register.
+
+    \return               Control Register value
+ */
+__STATIC_INLINE uint32_t __get_CONTROL(void)
+{
+  register uint32_t __regControl         __ASM("control");
+  return(__regControl);
+}
+
+
+/** \brief  Set Control Register
+
+    This function writes the given value to the Control Register.
+
+    \param [in]    control  Control Register value to set
+ */
+__STATIC_INLINE void __set_CONTROL(uint32_t control)
+{
+  register uint32_t __regControl         __ASM("control");
+  __regControl = control;
+}
+
+
+/** \brief  Get IPSR Register
+
+    This function returns the content of the IPSR Register.
+
+    \return               IPSR Register value
+ */
+__STATIC_INLINE uint32_t __get_IPSR(void)
+{
+  register uint32_t __regIPSR          __ASM("ipsr");
+  return(__regIPSR);
+}
+
+
+/** \brief  Get APSR Register
+
+    This function returns the content of the APSR Register.
+
+    \return               APSR Register value
+ */
+__STATIC_INLINE uint32_t __get_APSR(void)
+{
+  register uint32_t __regAPSR          __ASM("apsr");
+  return(__regAPSR);
+}
+
+
+/** \brief  Get xPSR Register
+
+    This function returns the content of the xPSR Register.
+
+    \return               xPSR Register value
+ */
+__STATIC_INLINE uint32_t __get_xPSR(void)
+{
+  register uint32_t __regXPSR          __ASM("xpsr");
+  return(__regXPSR);
+}
+
+
+/** \brief  Get Process Stack Pointer
+
+    This function returns the current value of the Process Stack Pointer (PSP).
+
+    \return               PSP Register value
+ */
+__STATIC_INLINE uint32_t __get_PSP(void)
+{
+  register uint32_t __regProcessStackPointer  __ASM("psp");
+  return(__regProcessStackPointer);
+}
+
+
+/** \brief  Set Process Stack Pointer
+
+    This function assigns the given value to the Process Stack Pointer (PSP).
+
+    \param [in]    topOfProcStack  Process Stack Pointer value to set
+ */
+__STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
+{
+  register uint32_t __regProcessStackPointer  __ASM("psp");
+  __regProcessStackPointer = topOfProcStack;
+}
+
+
+/** \brief  Get Main Stack Pointer
+
+    This function returns the current value of the Main Stack Pointer (MSP).
+
+    \return               MSP Register value
+ */
+__STATIC_INLINE uint32_t __get_MSP(void)
+{
+  register uint32_t __regMainStackPointer     __ASM("msp");
+  return(__regMainStackPointer);
+}
+
+
+/** \brief  Set Main Stack Pointer
+
+    This function assigns the given value to the Main Stack Pointer (MSP).
+
+    \param [in]    topOfMainStack  Main Stack Pointer value to set
+ */
+__STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
+{
+  register uint32_t __regMainStackPointer     __ASM("msp");
+  __regMainStackPointer = topOfMainStack;
+}
+
+
+/** \brief  Get Priority Mask
+
+    This function returns the current state of the priority mask bit from the Priority Mask Register.
+
+    \return               Priority Mask value
+ */
+__STATIC_INLINE uint32_t __get_PRIMASK(void)
+{
+  register uint32_t __regPriMask         __ASM("primask");
+  return(__regPriMask);
+}
+
+
+/** \brief  Set Priority Mask
+
+    This function assigns the given value to the Priority Mask Register.
+
+    \param [in]    priMask  Priority Mask
+ */
+__STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
+{
+  register uint32_t __regPriMask         __ASM("primask");
+  __regPriMask = (priMask);
+}
+
+
+#if       (__CORTEX_M >= 0x03)
+
+/** \brief  Enable FIQ
+
+    This function enables FIQ interrupts by clearing the F-bit in the CPSR.
+    Can only be executed in Privileged modes.
+ */
+#define __enable_fault_irq                __enable_fiq
+
+
+/** \brief  Disable FIQ
+
+    This function disables FIQ interrupts by setting the F-bit in the CPSR.
+    Can only be executed in Privileged modes.
+ */
+#define __disable_fault_irq               __disable_fiq
+
+
+/** \brief  Get Base Priority
+
+    This function returns the current value of the Base Priority register.
+
+    \return               Base Priority register value
+ */
+__STATIC_INLINE uint32_t  __get_BASEPRI(void)
+{
+  register uint32_t __regBasePri         __ASM("basepri");
+  return(__regBasePri);
+}
+
+
+/** \brief  Set Base Priority
+
+    This function assigns the given value to the Base Priority register.
+
+    \param [in]    basePri  Base Priority value to set
+ */
+__STATIC_INLINE void __set_BASEPRI(uint32_t basePri)
+{
+  register uint32_t __regBasePri         __ASM("basepri");
+  __regBasePri = (basePri & 0xff);
+}
+
+
+/** \brief  Get Fault Mask
+
+    This function returns the current value of the Fault Mask register.
+
+    \return               Fault Mask register value
+ */
+__STATIC_INLINE uint32_t __get_FAULTMASK(void)
+{
+  register uint32_t __regFaultMask       __ASM("faultmask");
+  return(__regFaultMask);
+}
+
+
+/** \brief  Set Fault Mask
+
+    This function assigns the given value to the Fault Mask register.
+
+    \param [in]    faultMask  Fault Mask value to set
+ */
+__STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
+{
+  register uint32_t __regFaultMask       __ASM("faultmask");
+  __regFaultMask = (faultMask & (uint32_t)1);
+}
+
+#endif /* (__CORTEX_M >= 0x03) */
+
+
+#if       (__CORTEX_M == 0x04)
+
+/** \brief  Get FPSCR
+
+    This function returns the current value of the Floating Point Status/Control register.
+
+    \return               Floating Point Status/Control register value
+ */
+__STATIC_INLINE uint32_t __get_FPSCR(void)
+{
+#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+  register uint32_t __regfpscr         __ASM("fpscr");
+  return(__regfpscr);
+#else
+   return(0);
+#endif
+}
+
+
+/** \brief  Set FPSCR
+
+    This function assigns the given value to the Floating Point Status/Control register.
+
+    \param [in]    fpscr  Floating Point Status/Control value to set
+ */
+__STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
+{
+#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+  register uint32_t __regfpscr         __ASM("fpscr");
+  __regfpscr = (fpscr);
+#endif
+}
+
+#endif /* (__CORTEX_M == 0x04) */
+
+
+#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
+/* IAR iccarm specific functions */
+
+#include <cmsis_iar.h>
+
+
+#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
+/* TI CCS specific functions */
+
+#include <cmsis_ccs.h>
+
+
+#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
+/* GNU gcc specific functions */
+
+/** \brief  Enable IRQ Interrupts
+
+  This function enables IRQ interrupts by clearing the I-bit in the CPSR.
+  Can only be executed in Privileged modes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_irq(void)
+{
+  __ASM volatile ("cpsie i" : : : "memory");
+}
+
+
+/** \brief  Disable IRQ Interrupts
+
+  This function disables IRQ interrupts by setting the I-bit in the CPSR.
+  Can only be executed in Privileged modes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_irq(void)
+{
+  __ASM volatile ("cpsid i" : : : "memory");
+}
+
+
+/** \brief  Get Control Register
+
+    This function returns the content of the Control Register.
+
+    \return               Control Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_CONTROL(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, control" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Control Register
+
+    This function writes the given value to the Control Register.
+
+    \param [in]    control  Control Register value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_CONTROL(uint32_t control)
+{
+  __ASM volatile ("MSR control, %0" : : "r" (control) : "memory");
+}
+
+
+/** \brief  Get IPSR Register
+
+    This function returns the content of the IPSR Register.
+
+    \return               IPSR Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_IPSR(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, ipsr" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Get APSR Register
+
+    This function returns the content of the APSR Register.
+
+    \return               APSR Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_APSR(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, apsr" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Get xPSR Register
+
+    This function returns the content of the xPSR Register.
+
+    \return               xPSR Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_xPSR(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, xpsr" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Get Process Stack Pointer
+
+    This function returns the current value of the Process Stack Pointer (PSP).
+
+    \return               PSP Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PSP(void)
+{
+  register uint32_t result;
+
+  __ASM volatile ("MRS %0, psp\n"  : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Process Stack Pointer
+
+    This function assigns the given value to the Process Stack Pointer (PSP).
+
+    \param [in]    topOfProcStack  Process Stack Pointer value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PSP(uint32_t topOfProcStack)
+{
+  __ASM volatile ("MSR psp, %0\n" : : "r" (topOfProcStack) : "sp");
+}
+
+
+/** \brief  Get Main Stack Pointer
+
+    This function returns the current value of the Main Stack Pointer (MSP).
+
+    \return               MSP Register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_MSP(void)
+{
+  register uint32_t result;
+
+  __ASM volatile ("MRS %0, msp\n" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Main Stack Pointer
+
+    This function assigns the given value to the Main Stack Pointer (MSP).
+
+    \param [in]    topOfMainStack  Main Stack Pointer value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_MSP(uint32_t topOfMainStack)
+{
+  __ASM volatile ("MSR msp, %0\n" : : "r" (topOfMainStack) : "sp");
+}
+
+
+/** \brief  Get Priority Mask
+
+    This function returns the current state of the priority mask bit from the Priority Mask Register.
+
+    \return               Priority Mask value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_PRIMASK(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, primask" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Priority Mask
+
+    This function assigns the given value to the Priority Mask Register.
+
+    \param [in]    priMask  Priority Mask
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_PRIMASK(uint32_t priMask)
+{
+  __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory");
+}
+
+
+#if       (__CORTEX_M >= 0x03)
+
+/** \brief  Enable FIQ
+
+    This function enables FIQ interrupts by clearing the F-bit in the CPSR.
+    Can only be executed in Privileged modes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __enable_fault_irq(void)
+{
+  __ASM volatile ("cpsie f" : : : "memory");
+}
+
+
+/** \brief  Disable FIQ
+
+    This function disables FIQ interrupts by setting the F-bit in the CPSR.
+    Can only be executed in Privileged modes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __disable_fault_irq(void)
+{
+  __ASM volatile ("cpsid f" : : : "memory");
+}
+
+
+/** \brief  Get Base Priority
+
+    This function returns the current value of the Base Priority register.
+
+    \return               Base Priority register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_BASEPRI(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, basepri_max" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Base Priority
+
+    This function assigns the given value to the Base Priority register.
+
+    \param [in]    basePri  Base Priority value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_BASEPRI(uint32_t value)
+{
+  __ASM volatile ("MSR basepri, %0" : : "r" (value) : "memory");
+}
+
+
+/** \brief  Get Fault Mask
+
+    This function returns the current value of the Fault Mask register.
+
+    \return               Fault Mask register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FAULTMASK(void)
+{
+  uint32_t result;
+
+  __ASM volatile ("MRS %0, faultmask" : "=r" (result) );
+  return(result);
+}
+
+
+/** \brief  Set Fault Mask
+
+    This function assigns the given value to the Fault Mask register.
+
+    \param [in]    faultMask  Fault Mask value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FAULTMASK(uint32_t faultMask)
+{
+  __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory");
+}
+
+#endif /* (__CORTEX_M >= 0x03) */
+
+
+#if       (__CORTEX_M == 0x04)
+
+/** \brief  Get FPSCR
+
+    This function returns the current value of the Floating Point Status/Control register.
+
+    \return               Floating Point Status/Control register value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __get_FPSCR(void)
+{
+#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+  uint32_t result;
+
+  /* Empty asm statement works as a scheduling barrier */
+  __ASM volatile ("");
+  __ASM volatile ("VMRS %0, fpscr" : "=r" (result) );
+  __ASM volatile ("");
+  return(result);
+#else
+   return(0);
+#endif
+}
+
+
+/** \brief  Set FPSCR
+
+    This function assigns the given value to the Floating Point Status/Control register.
+
+    \param [in]    fpscr  Floating Point Status/Control value to set
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __set_FPSCR(uint32_t fpscr)
+{
+#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
+  /* Empty asm statement works as a scheduling barrier */
+  __ASM volatile ("");
+  __ASM volatile ("VMSR fpscr, %0" : : "r" (fpscr) : "vfpcc");
+  __ASM volatile ("");
+#endif
+}
+
+#endif /* (__CORTEX_M == 0x04) */
+
+
+#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
+/* TASKING carm specific functions */
+
+/*
+ * The CMSIS functions have been implemented as intrinsics in the compiler.
+ * Please use "carm -?i" to get an up to date list of all instrinsics,
+ * Including the CMSIS ones.
+ */
+
+#endif
+
+/*@} end of CMSIS_Core_RegAccFunctions */
+
+
+#endif /* __CORE_CMFUNC_H */
diff --git a/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmInstr.h b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmInstr.h
new file mode 100644
index 0000000..ab3a010
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/cmsis/CMSIS/Include/core_cmInstr.h
@@ -0,0 +1,688 @@
+/**************************************************************************//**
+ * @file     core_cmInstr.h
+ * @brief    CMSIS Cortex-M Core Instruction Access Header File
+ * @version  V3.20
+ * @date     05. March 2013
+ *
+ * @note
+ *
+ ******************************************************************************/
+/* Copyright (c) 2009 - 2013 ARM LIMITED
+
+   All rights reserved.
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions are met:
+   - Redistributions of source code must retain the above copyright
+     notice, this list of conditions and the following disclaimer.
+   - Redistributions in binary form must reproduce the above copyright
+     notice, this list of conditions and the following disclaimer in the
+     documentation and/or other materials provided with the distribution.
+   - Neither the name of ARM nor the names of its contributors may be used
+     to endorse or promote products derived from this software without
+     specific prior written permission.
+   *
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+   AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+   IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+   ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BE
+   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+   CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+   SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+   INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+   POSSIBILITY OF SUCH DAMAGE.
+   ---------------------------------------------------------------------------*/
+
+
+#ifndef __CORE_CMINSTR_H
+#define __CORE_CMINSTR_H
+
+
+/* ##########################  Core Instruction Access  ######################### */
+/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface
+  Access to dedicated instructions
+  @{
+*/
+
+#if   defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/
+/* ARM armcc specific functions */
+
+#if (__ARMCC_VERSION < 400677)
+  #error "Please use ARM Compiler Toolchain V4.0.677 or later!"
+#endif
+
+
+/** \brief  No Operation
+
+    No Operation does nothing. This instruction can be used for code alignment purposes.
+ */
+#define __NOP                             __nop
+
+
+/** \brief  Wait For Interrupt
+
+    Wait For Interrupt is a hint instruction that suspends execution
+    until one of a number of events occurs.
+ */
+#define __WFI                             __wfi
+
+
+/** \brief  Wait For Event
+
+    Wait For Event is a hint instruction that permits the processor to enter
+    a low-power state until one of a number of events occurs.
+ */
+#define __WFE                             __wfe
+
+
+/** \brief  Send Event
+
+    Send Event is a hint instruction. It causes an event to be signaled to the CPU.
+ */
+#define __SEV                             __sev
+
+
+/** \brief  Instruction Synchronization Barrier
+
+    Instruction Synchronization Barrier flushes the pipeline in the processor,
+    so that all instructions following the ISB are fetched from cache or
+    memory, after the instruction has been completed.
+ */
+#define __ISB()                           __isb(0xF)
+
+
+/** \brief  Data Synchronization Barrier
+
+    This function acts as a special kind of Data Memory Barrier.
+    It completes when all explicit memory accesses before this instruction complete.
+ */
+#define __DSB()                           __dsb(0xF)
+
+
+/** \brief  Data Memory Barrier
+
+    This function ensures the apparent order of the explicit memory operations before
+    and after the instruction, without ensuring their completion.
+ */
+#define __DMB()                           __dmb(0xF)
+
+
+/** \brief  Reverse byte order (32 bit)
+
+    This function reverses the byte order in integer value.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+#define __REV                             __rev
+
+
+/** \brief  Reverse byte order (16 bit)
+
+    This function reverses the byte order in two unsigned short values.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+#ifndef __NO_EMBEDDED_ASM
+__attribute__((section(".rev16_text"))) __STATIC_INLINE __ASM uint32_t __REV16(uint32_t value)
+{
+  rev16 r0, r0
+  bx lr
+}
+#endif
+
+/** \brief  Reverse byte order in signed short value
+
+    This function reverses the byte order in a signed short value with sign extension to integer.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+#ifndef __NO_EMBEDDED_ASM
+__attribute__((section(".revsh_text"))) __STATIC_INLINE __ASM int32_t __REVSH(int32_t value)
+{
+  revsh r0, r0
+  bx lr
+}
+#endif
+
+
+/** \brief  Rotate Right in unsigned value (32 bit)
+
+    This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
+
+    \param [in]    value  Value to rotate
+    \param [in]    value  Number of Bits to rotate
+    \return               Rotated value
+ */
+#define __ROR                             __ror
+
+
+/** \brief  Breakpoint
+
+    This function causes the processor to enter Debug state.
+    Debug tools can use this to investigate system state when the instruction at a particular address is reached.
+
+    \param [in]    value  is ignored by the processor.
+                   If required, a debugger can use it to store additional information about the breakpoint.
+ */
+#define __BKPT(value)                       __breakpoint(value)
+
+
+#if       (__CORTEX_M >= 0x03)
+
+/** \brief  Reverse bit order of value
+
+    This function reverses the bit order of the given value.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+#define __RBIT                            __rbit
+
+
+/** \brief  LDR Exclusive (8 bit)
+
+    This function performs a exclusive LDR command for 8 bit value.
+
+    \param [in]    ptr  Pointer to data
+    \return             value of type uint8_t at (*ptr)
+ */
+#define __LDREXB(ptr)                     ((uint8_t ) __ldrex(ptr))
+
+
+/** \brief  LDR Exclusive (16 bit)
+
+    This function performs a exclusive LDR command for 16 bit values.
+
+    \param [in]    ptr  Pointer to data
+    \return        value of type uint16_t at (*ptr)
+ */
+#define __LDREXH(ptr)                     ((uint16_t) __ldrex(ptr))
+
+
+/** \brief  LDR Exclusive (32 bit)
+
+    This function performs a exclusive LDR command for 32 bit values.
+
+    \param [in]    ptr  Pointer to data
+    \return        value of type uint32_t at (*ptr)
+ */
+#define __LDREXW(ptr)                     ((uint32_t ) __ldrex(ptr))
+
+
+/** \brief  STR Exclusive (8 bit)
+
+    This function performs a exclusive STR command for 8 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+#define __STREXB(value, ptr)              __strex(value, ptr)
+
+
+/** \brief  STR Exclusive (16 bit)
+
+    This function performs a exclusive STR command for 16 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+#define __STREXH(value, ptr)              __strex(value, ptr)
+
+
+/** \brief  STR Exclusive (32 bit)
+
+    This function performs a exclusive STR command for 32 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+#define __STREXW(value, ptr)              __strex(value, ptr)
+
+
+/** \brief  Remove the exclusive lock
+
+    This function removes the exclusive lock which is created by LDREX.
+
+ */
+#define __CLREX                           __clrex
+
+
+/** \brief  Signed Saturate
+
+    This function saturates a signed value.
+
+    \param [in]  value  Value to be saturated
+    \param [in]    sat  Bit position to saturate to (1..32)
+    \return             Saturated value
+ */
+#define __SSAT                            __ssat
+
+
+/** \brief  Unsigned Saturate
+
+    This function saturates an unsigned value.
+
+    \param [in]  value  Value to be saturated
+    \param [in]    sat  Bit position to saturate to (0..31)
+    \return             Saturated value
+ */
+#define __USAT                            __usat
+
+
+/** \brief  Count leading zeros
+
+    This function counts the number of leading zeros of a data value.
+
+    \param [in]  value  Value to count the leading zeros
+    \return             number of leading zeros in value
+ */
+#define __CLZ                             __clz
+
+#endif /* (__CORTEX_M >= 0x03) */
+
+
+
+#elif defined ( __ICCARM__ ) /*------------------ ICC Compiler -------------------*/
+/* IAR iccarm specific functions */
+
+#include <cmsis_iar.h>
+
+
+#elif defined ( __TMS470__ ) /*---------------- TI CCS Compiler ------------------*/
+/* TI CCS specific functions */
+
+#include <cmsis_ccs.h>
+
+
+#elif defined ( __GNUC__ ) /*------------------ GNU Compiler ---------------------*/
+/* GNU gcc specific functions */
+
+/* Define macros for porting to both thumb1 and thumb2.
+ * For thumb1, use low register (r0-r7), specified by constrant "l"
+ * Otherwise, use general registers, specified by constrant "r" */
+#if defined (__thumb__) && !defined (__thumb2__)
+#define __CMSIS_GCC_OUT_REG(r) "=l" (r)
+#define __CMSIS_GCC_USE_REG(r) "l" (r)
+#else
+#define __CMSIS_GCC_OUT_REG(r) "=r" (r)
+#define __CMSIS_GCC_USE_REG(r) "r" (r)
+#endif
+
+/** \brief  No Operation
+
+    No Operation does nothing. This instruction can be used for code alignment purposes.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __NOP(void)
+{
+  __ASM volatile ("nop");
+}
+
+
+/** \brief  Wait For Interrupt
+
+    Wait For Interrupt is a hint instruction that suspends execution
+    until one of a number of events occurs.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFI(void)
+{
+  __ASM volatile ("wfi");
+}
+
+
+/** \brief  Wait For Event
+
+    Wait For Event is a hint instruction that permits the processor to enter
+    a low-power state until one of a number of events occurs.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __WFE(void)
+{
+  __ASM volatile ("wfe");
+}
+
+
+/** \brief  Send Event
+
+    Send Event is a hint instruction. It causes an event to be signaled to the CPU.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __SEV(void)
+{
+  __ASM volatile ("sev");
+}
+
+
+/** \brief  Instruction Synchronization Barrier
+
+    Instruction Synchronization Barrier flushes the pipeline in the processor,
+    so that all instructions following the ISB are fetched from cache or
+    memory, after the instruction has been completed.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __ISB(void)
+{
+  __ASM volatile ("isb");
+}
+
+
+/** \brief  Data Synchronization Barrier
+
+    This function acts as a special kind of Data Memory Barrier.
+    It completes when all explicit memory accesses before this instruction complete.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __DSB(void)
+{
+  __ASM volatile ("dsb");
+}
+
+
+/** \brief  Data Memory Barrier
+
+    This function ensures the apparent order of the explicit memory operations before
+    and after the instruction, without ensuring their completion.
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __DMB(void)
+{
+  __ASM volatile ("dmb");
+}
+
+
+/** \brief  Reverse byte order (32 bit)
+
+    This function reverses the byte order in integer value.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV(uint32_t value)
+{
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
+  return __builtin_bswap32(value);
+#else
+  uint32_t result;
+
+  __ASM volatile ("rev %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
+  return(result);
+#endif
+}
+
+
+/** \brief  Reverse byte order (16 bit)
+
+    This function reverses the byte order in two unsigned short values.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __REV16(uint32_t value)
+{
+  uint32_t result;
+
+  __ASM volatile ("rev16 %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
+  return(result);
+}
+
+
+/** \brief  Reverse byte order in signed short value
+
+    This function reverses the byte order in a signed short value with sign extension to integer.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE int32_t __REVSH(int32_t value)
+{
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+  return (short)__builtin_bswap16(value);
+#else
+  uint32_t result;
+
+  __ASM volatile ("revsh %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) );
+  return(result);
+#endif
+}
+
+
+/** \brief  Rotate Right in unsigned value (32 bit)
+
+    This function Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits.
+
+    \param [in]    value  Value to rotate
+    \param [in]    value  Number of Bits to rotate
+    \return               Rotated value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __ROR(uint32_t op1, uint32_t op2)
+{
+  return (op1 >> op2) | (op1 << (32 - op2));
+}
+
+
+/** \brief  Breakpoint
+
+    This function causes the processor to enter Debug state.
+    Debug tools can use this to investigate system state when the instruction at a particular address is reached.
+
+    \param [in]    value  is ignored by the processor.
+                   If required, a debugger can use it to store additional information about the breakpoint.
+ */
+#define __BKPT(value)                       __ASM volatile ("bkpt "#value)
+
+
+#if       (__CORTEX_M >= 0x03)
+
+/** \brief  Reverse bit order of value
+
+    This function reverses the bit order of the given value.
+
+    \param [in]    value  Value to reverse
+    \return               Reversed value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __RBIT(uint32_t value)
+{
+  uint32_t result;
+
+   __ASM volatile ("rbit %0, %1" : "=r" (result) : "r" (value) );
+   return(result);
+}
+
+
+/** \brief  LDR Exclusive (8 bit)
+
+    This function performs a exclusive LDR command for 8 bit value.
+
+    \param [in]    ptr  Pointer to data
+    \return             value of type uint8_t at (*ptr)
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __LDREXB(volatile uint8_t *addr)
+{
+    uint32_t result;
+
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+   __ASM volatile ("ldrexb %0, %1" : "=r" (result) : "Q" (*addr) );
+#else
+    /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
+       accepted by assembler. So has to use following less efficient pattern.
+    */
+   __ASM volatile ("ldrexb %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
+#endif
+   return(result);
+}
+
+
+/** \brief  LDR Exclusive (16 bit)
+
+    This function performs a exclusive LDR command for 16 bit values.
+
+    \param [in]    ptr  Pointer to data
+    \return        value of type uint16_t at (*ptr)
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint16_t __LDREXH(volatile uint16_t *addr)
+{
+    uint32_t result;
+
+#if (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
+   __ASM volatile ("ldrexh %0, %1" : "=r" (result) : "Q" (*addr) );
+#else
+    /* Prior to GCC 4.8, "Q" will be expanded to [rx, #0] which is not
+       accepted by assembler. So has to use following less efficient pattern.
+    */
+   __ASM volatile ("ldrexh %0, [%1]" : "=r" (result) : "r" (addr) : "memory" );
+#endif
+   return(result);
+}
+
+
+/** \brief  LDR Exclusive (32 bit)
+
+    This function performs a exclusive LDR command for 32 bit values.
+
+    \param [in]    ptr  Pointer to data
+    \return        value of type uint32_t at (*ptr)
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __LDREXW(volatile uint32_t *addr)
+{
+    uint32_t result;
+
+   __ASM volatile ("ldrex %0, %1" : "=r" (result) : "Q" (*addr) );
+   return(result);
+}
+
+
+/** \brief  STR Exclusive (8 bit)
+
+    This function performs a exclusive STR command for 8 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXB(uint8_t value, volatile uint8_t *addr)
+{
+   uint32_t result;
+
+   __ASM volatile ("strexb %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
+   return(result);
+}
+
+
+/** \brief  STR Exclusive (16 bit)
+
+    This function performs a exclusive STR command for 16 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXH(uint16_t value, volatile uint16_t *addr)
+{
+   uint32_t result;
+
+   __ASM volatile ("strexh %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
+   return(result);
+}
+
+
+/** \brief  STR Exclusive (32 bit)
+
+    This function performs a exclusive STR command for 32 bit values.
+
+    \param [in]  value  Value to store
+    \param [in]    ptr  Pointer to location
+    \return          0  Function succeeded
+    \return          1  Function failed
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint32_t __STREXW(uint32_t value, volatile uint32_t *addr)
+{
+   uint32_t result;
+
+   __ASM volatile ("strex %0, %2, %1" : "=&r" (result), "=Q" (*addr) : "r" (value) );
+   return(result);
+}
+
+
+/** \brief  Remove the exclusive lock
+
+    This function removes the exclusive lock which is created by LDREX.
+
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE void __CLREX(void)
+{
+  __ASM volatile ("clrex" ::: "memory");
+}
+
+
+/** \brief  Signed Saturate
+
+    This function saturates a signed value.
+
+    \param [in]  value  Value to be saturated
+    \param [in]    sat  Bit position to saturate to (1..32)
+    \return             Saturated value
+ */
+#define __SSAT(ARG1,ARG2) \
+({                          \
+  uint32_t __RES, __ARG1 = (ARG1); \
+  __ASM ("ssat %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \
+  __RES; \
+ })
+
+
+/** \brief  Unsigned Saturate
+
+    This function saturates an unsigned value.
+
+    \param [in]  value  Value to be saturated
+    \param [in]    sat  Bit position to saturate to (0..31)
+    \return             Saturated value
+ */
+#define __USAT(ARG1,ARG2) \
+({                          \
+  uint32_t __RES, __ARG1 = (ARG1); \
+  __ASM ("usat %0, %1, %2" : "=r" (__RES) :  "I" (ARG2), "r" (__ARG1) ); \
+  __RES; \
+ })
+
+
+/** \brief  Count leading zeros
+
+    This function counts the number of leading zeros of a data value.
+
+    \param [in]  value  Value to count the leading zeros
+    \return             number of leading zeros in value
+ */
+__attribute__( ( always_inline ) ) __STATIC_INLINE uint8_t __CLZ(uint32_t value)
+{
+   uint32_t result;
+
+  __ASM volatile ("clz %0, %1" : "=r" (result) : "r" (value) );
+  return(result);
+}
+
+#endif /* (__CORTEX_M >= 0x03) */
+
+
+
+
+#elif defined ( __TASKING__ ) /*------------------ TASKING Compiler --------------*/
+/* TASKING carm specific functions */
+
+/*
+ * The CMSIS functions have been implemented as intrinsics in the compiler.
+ * Please use "carm -?i" to get an up to date list of all intrinsics,
+ * Including the CMSIS ones.
+ */
+
+#endif
+
+/*@}*/ /* end of group CMSIS_Core_InstructionInterface */
+
+#endif /* __CORE_CMINSTR_H */
diff --git a/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_CM0.h b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_CM0.h
new file mode 100644
index 0000000..ed3df93
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_CM0.h
@@ -0,0 +1,1313 @@
+//-----------------------------------------------------------------------------
+// enhanced top-level example Cortex-M0 controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-2, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+/**************************************************************************//**
+ * @file     CMSDK_CM0.h
+ * @brief    CMSIS Cortex-M0 Core Peripheral Access Layer Header File for
+ *           Device CMSDK
+ * @version  V3.01
+ * @date     06. March 2012
+ *
+ * @note
+ * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ *
+ * @par
+ * ARM Limited (ARM) is supplying this software for use with Cortex-M
+ * processor based microcontrollers.  This file can be freely distributed
+ * within development tools that are supporting such ARM based processors.
+ *
+ * @par
+ * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
+ * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
+ * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
+ * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+ *
+ ******************************************************************************/
+
+
+#ifndef CMSDK_H
+#define CMSDK_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/** @addtogroup CMSDK_Definitions CMSDK Definitions
+  This file defines all structures and symbols for CMSDK:
+    - registers and bitfields
+    - peripheral base address
+    - peripheral ID
+    - Peripheral definitions
+  @{
+*/
+
+
+/******************************************************************************/
+/*                Processor and Core Peripherals                              */
+/******************************************************************************/
+/** @addtogroup CMSDK_CMSIS Device CMSIS Definitions
+  Configuration of the Cortex-M0 Processor and Core Peripherals
+  @{
+*/
+
+/*
+ * ==========================================================================
+ * ---------- Interrupt Number Definition -----------------------------------
+ * ==========================================================================
+ */
+
+typedef enum IRQn
+{
+/******  Cortex-M0 Processor Exceptions Numbers ***************************************************/
+
+/* ToDo: use this Cortex interrupt numbers if your device is a CORTEX-M0 device                   */
+  NonMaskableInt_IRQn           = -14,      /*!<  2 Cortex-M0 Non Maskable Interrupt              */
+  HardFault_IRQn                = -13,      /*!<  3 Cortex-M0 Hard Fault Interrupt                */
+  SVCall_IRQn                   = -5,       /*!< 11 Cortex-M0 SV Call Interrupt                   */
+  PendSV_IRQn                   = -2,       /*!< 14 Cortex-M0 Pend SV Interrupt                   */
+  SysTick_IRQn                  = -1,       /*!< 15 Cortex-M0 System Tick Interrupt               */
+
+/******  CMSDK Specific Interrupt Numbers *********************************************************/
+  UARTRX0_IRQn                  = 0,       /*!< UART 0 RX Interrupt                               */
+  UARTTX0_IRQn                  = 1,       /*!< UART 0 TX Interrupt                               */
+  UARTRX1_IRQn                  = 2,       /*!< UART 1 RX Interrupt                               */
+  UARTTX1_IRQn                  = 3,       /*!< UART 1 TX Interrupt                               */
+  UARTRX2_IRQn                  = 4,       /*!< UART 2 RX Interrupt                               */
+  UARTTX2_IRQn                  = 5,       /*!< UART 2 TX Interrupt                               */
+  PORT0_ALL_IRQn                = 6,       /*!< Port 1 combined Interrupt                         */
+  PORT1_ALL_IRQn                = 7,       /*!< Port 1 combined Interrupt                         */
+  TIMER0_IRQn                   = 8,       /*!< TIMER 0 Interrupt                                 */
+  TIMER1_IRQn                   = 9,       /*!< TIMER 1 Interrupt                                 */
+  DUALTIMER_IRQn                = 10,      /*!< Dual Timer Interrupt                              */
+                                           /*!< IRQ11 - Unused                                    */
+  UARTOVF0_IRQn                 = 12,      /*!< UART 0 Overflow Interrupt                         */
+  UARTOVF1_IRQn                 = 13,      /*!< UART 1 Overflow Interrupt                         */
+  UARTOVF2_IRQn                 = 14,      /*!< UART 2 Overflow Interrupt                         */
+  DMA_IRQn                      = 15,      /*!< PL230 DMA Done + Error Interrupt                  */
+  PORT0_0_IRQn                  = 16,      /*!< All P0 I/O pins can be used as interrupt source.  */
+  PORT0_1_IRQn                  = 17,      /*!< There are 16 pins in total                        */
+  PORT0_2_IRQn                  = 18,
+  PORT0_3_IRQn                  = 19,
+  PORT0_4_IRQn                  = 20,
+  PORT0_5_IRQn                  = 21,
+  PORT0_6_IRQn                  = 22,
+  PORT0_7_IRQn                  = 23,
+  PORT0_8_IRQn                  = 24,
+  PORT0_9_IRQn                  = 25,
+  PORT0_10_IRQn                 = 26,
+  PORT0_11_IRQn                 = 27,
+  PORT0_12_IRQn                 = 28,
+  PORT0_13_IRQn                 = 29,
+  PORT0_14_IRQn                 = 30,
+  PORT0_15_IRQn                 = 31,
+} IRQn_Type;
+
+
+/*
+ * ==========================================================================
+ * ----------- Processor and Core Peripheral Section ------------------------
+ * ==========================================================================
+ */
+
+/* Configuration of the Cortex-M0 Processor and Core Peripherals */
+#define __CM0_REV                 0x0000    /*!< Core Revision r0p0                               */
+#define __NVIC_PRIO_BITS          2         /*!< Number of Bits used for Priority Levels          */
+#define __Vendor_SysTickConfig    0         /*!< Set to 1 if different SysTick Config is used     */
+#define __MPU_PRESENT             0         /*!< MPU present or not                               */
+
+/*@}*/ /* end of group CMSDK_CMSIS */
+
+
+#include "core_cm0.h"                       /* Cortex-M0 processor and core peripherals           */
+#include "system_CMSDK_CM0.h"               /* CMSDK System include file                          */
+
+
+/******************************************************************************/
+/*                Device Specific Peripheral registers structures             */
+/******************************************************************************/
+/** @addtogroup CMSDK_Peripherals CMSDK Peripherals
+  CMSDK Device Specific Peripheral registers structures
+  @{
+*/
+
+#if defined ( __CC_ARM   )
+#pragma anon_unions
+#endif
+
+/*------------- Universal Asynchronous Receiver Transmitter (UART) -----------*/
+/** @addtogroup CMSDK_UART CMSDK Universal Asynchronous Receiver/Transmitter
+  memory mapped structure for CMSDK_UART
+  @{
+*/
+typedef struct
+{
+  __IO   uint32_t  DATA;          /*!< Offset: 0x000 Data Register    (R/W) */
+  __IO   uint32_t  STATE;         /*!< Offset: 0x004 Status Register  (R/W) */
+  __IO   uint32_t  CTRL;          /*!< Offset: 0x008 Control Register (R/W) */
+  union {
+    __I    uint32_t  INTSTATUS;   /*!< Offset: 0x00C Interrupt Status Register (R/ ) */
+    __O    uint32_t  INTCLEAR;    /*!< Offset: 0x00C Interrupt Clear Register ( /W) */
+    };
+  __IO   uint32_t  BAUDDIV;       /*!< Offset: 0x010 Baudrate Divider Register (R/W) */
+
+} CMSDK_UART_TypeDef;
+
+/* CMSDK_UART DATA Register Definitions */
+
+#define CMSDK_UART_DATA_Pos               0                                             /*!< CMSDK_UART_DATA_Pos: DATA Position */
+#define CMSDK_UART_DATA_Msk              (0xFFul << CMSDK_UART_DATA_Pos)                /*!< CMSDK_UART DATA: DATA Mask */
+
+#define CMSDK_UART_STATE_RXOR_Pos         3                                             /*!< CMSDK_UART STATE: RXOR Position */
+#define CMSDK_UART_STATE_RXOR_Msk         (0x1ul << CMSDK_UART_STATE_RXOR_Pos)          /*!< CMSDK_UART STATE: RXOR Mask */
+
+#define CMSDK_UART_STATE_TXOR_Pos         2                                             /*!< CMSDK_UART STATE: TXOR Position */
+#define CMSDK_UART_STATE_TXOR_Msk         (0x1ul << CMSDK_UART_STATE_TXOR_Pos)          /*!< CMSDK_UART STATE: TXOR Mask */
+
+#define CMSDK_UART_STATE_RXBF_Pos         1                                             /*!< CMSDK_UART STATE: RXBF Position */
+#define CMSDK_UART_STATE_RXBF_Msk         (0x1ul << CMSDK_UART_STATE_RXBF_Pos)          /*!< CMSDK_UART STATE: RXBF Mask */
+
+#define CMSDK_UART_STATE_TXBF_Pos         0                                             /*!< CMSDK_UART STATE: TXBF Position */
+#define CMSDK_UART_STATE_TXBF_Msk         (0x1ul << CMSDK_UART_STATE_TXBF_Pos )         /*!< CMSDK_UART STATE: TXBF Mask */
+
+#define CMSDK_UART_CTRL_HSTM_Pos          6                                             /*!< CMSDK_UART CTRL: HSTM Position */
+#define CMSDK_UART_CTRL_HSTM_Msk          (0x01ul << CMSDK_UART_CTRL_HSTM_Pos)          /*!< CMSDK_UART CTRL: HSTM Mask */
+
+#define CMSDK_UART_CTRL_RXORIRQEN_Pos     5                                             /*!< CMSDK_UART CTRL: RXORIRQEN Position */
+#define CMSDK_UART_CTRL_RXORIRQEN_Msk     (0x01ul << CMSDK_UART_CTRL_RXORIRQEN_Pos)     /*!< CMSDK_UART CTRL: RXORIRQEN Mask */
+
+#define CMSDK_UART_CTRL_TXORIRQEN_Pos     4                                             /*!< CMSDK_UART CTRL: TXORIRQEN Position */
+#define CMSDK_UART_CTRL_TXORIRQEN_Msk     (0x01ul << CMSDK_UART_CTRL_TXORIRQEN_Pos)     /*!< CMSDK_UART CTRL: TXORIRQEN Mask */
+
+#define CMSDK_UART_CTRL_RXIRQEN_Pos       3                                             /*!< CMSDK_UART CTRL: RXIRQEN Position */
+#define CMSDK_UART_CTRL_RXIRQEN_Msk       (0x01ul << CMSDK_UART_CTRL_RXIRQEN_Pos)       /*!< CMSDK_UART CTRL: RXIRQEN Mask */
+
+#define CMSDK_UART_CTRL_TXIRQEN_Pos       2                                             /*!< CMSDK_UART CTRL: TXIRQEN Position */
+#define CMSDK_UART_CTRL_TXIRQEN_Msk       (0x01ul << CMSDK_UART_CTRL_TXIRQEN_Pos)       /*!< CMSDK_UART CTRL: TXIRQEN Mask */
+
+#define CMSDK_UART_CTRL_RXEN_Pos          1                                             /*!< CMSDK_UART CTRL: RXEN Position */
+#define CMSDK_UART_CTRL_RXEN_Msk          (0x01ul << CMSDK_UART_CTRL_RXEN_Pos)          /*!< CMSDK_UART CTRL: RXEN Mask */
+
+#define CMSDK_UART_CTRL_TXEN_Pos          0                                             /*!< CMSDK_UART CTRL: TXEN Position */
+#define CMSDK_UART_CTRL_TXEN_Msk          (0x01ul << CMSDK_UART_CTRL_TXEN_Pos)          /*!< CMSDK_UART CTRL: TXEN Mask */
+
+#define CMSDK_UART_INTSTATUS_RXORIRQ_Pos  3                                             /*!< CMSDK_UART CTRL: RXORIRQ Position */
+#define CMSDK_UART_CTRL_RXORIRQ_Msk       (0x01ul << CMSDK_UART_INTSTATUS_RXORIRQ_Pos)  /*!< CMSDK_UART CTRL: RXORIRQ Mask */
+
+#define CMSDK_UART_CTRL_TXORIRQ_Pos       2                                             /*!< CMSDK_UART CTRL: TXORIRQ Position */
+#define CMSDK_UART_CTRL_TXORIRQ_Msk       (0x01ul << CMSDK_UART_CTRL_TXORIRQ_Pos)       /*!< CMSDK_UART CTRL: TXORIRQ Mask */
+
+#define CMSDK_UART_CTRL_RXIRQ_Pos         1                                             /*!< CMSDK_UART CTRL: RXIRQ Position */
+#define CMSDK_UART_CTRL_RXIRQ_Msk         (0x01ul << CMSDK_UART_CTRL_RXIRQ_Pos)         /*!< CMSDK_UART CTRL: RXIRQ Mask */
+
+#define CMSDK_UART_CTRL_TXIRQ_Pos         0                                             /*!< CMSDK_UART CTRL: TXIRQ Position */
+#define CMSDK_UART_CTRL_TXIRQ_Msk         (0x01ul << CMSDK_UART_CTRL_TXIRQ_Pos)         /*!< CMSDK_UART CTRL: TXIRQ Mask */
+
+#define CMSDK_UART_BAUDDIV_Pos            0                                             /*!< CMSDK_UART BAUDDIV: BAUDDIV Position */
+#define CMSDK_UART_BAUDDIV_Msk           (0xFFFFFul << CMSDK_UART_BAUDDIV_Pos)          /*!< CMSDK_UART BAUDDIV: BAUDDIV Mask */
+
+/*@}*/ /* end of group CMSDK_UART */
+
+
+/*----------------------------- Timer (TIMER) -------------------------------*/
+/** @addtogroup CMSDK_TIMER CMSDK Timer
+  @{
+*/
+typedef struct
+{
+  __IO   uint32_t  CTRL;          /*!< Offset: 0x000 Control Register (R/W) */
+  __IO   uint32_t  VALUE;         /*!< Offset: 0x004 Current Value Register (R/W) */
+  __IO   uint32_t  RELOAD;        /*!< Offset: 0x008 Reload Value Register  (R/W) */
+  union {
+    __I    uint32_t  INTSTATUS;   /*!< Offset: 0x00C Interrupt Status Register (R/ ) */
+    __O    uint32_t  INTCLEAR;    /*!< Offset: 0x00C Interrupt Clear Register ( /W) */
+    };
+
+} CMSDK_TIMER_TypeDef;
+
+/* CMSDK_TIMER CTRL Register Definitions */
+
+#define CMSDK_TIMER_CTRL_IRQEN_Pos          3                                              /*!< CMSDK_TIMER CTRL: IRQEN Position */
+#define CMSDK_TIMER_CTRL_IRQEN_Msk          (0x01ul << CMSDK_TIMER_CTRL_IRQEN_Pos)         /*!< CMSDK_TIMER CTRL: IRQEN Mask */
+
+#define CMSDK_TIMER_CTRL_SELEXTCLK_Pos      2                                              /*!< CMSDK_TIMER CTRL: SELEXTCLK Position */
+#define CMSDK_TIMER_CTRL_SELEXTCLK_Msk      (0x01ul << CMSDK_TIMER_CTRL_SELEXTCLK_Pos)     /*!< CMSDK_TIMER CTRL: SELEXTCLK Mask */
+
+#define CMSDK_TIMER_CTRL_SELEXTEN_Pos       1                                              /*!< CMSDK_TIMER CTRL: SELEXTEN Position */
+#define CMSDK_TIMER_CTRL_SELEXTEN_Msk       (0x01ul << CMSDK_TIMER_CTRL_SELEXTEN_Pos)      /*!< CMSDK_TIMER CTRL: SELEXTEN Mask */
+
+#define CMSDK_TIMER_CTRL_EN_Pos             0                                              /*!< CMSDK_TIMER CTRL: EN Position */
+#define CMSDK_TIMER_CTRL_EN_Msk             (0x01ul << CMSDK_TIMER_CTRL_EN_Pos)            /*!< CMSDK_TIMER CTRL: EN Mask */
+
+#define CMSDK_TIMER_VAL_CURRENT_Pos         0                                              /*!< CMSDK_TIMER VALUE: CURRENT Position */
+#define CMSDK_TIMER_VAL_CURRENT_Msk         (0xFFFFFFFFul << CMSDK_TIMER_VAL_CURRENT_Pos)  /*!< CMSDK_TIMER VALUE: CURRENT Mask */
+
+#define CMSDK_TIMER_RELOAD_VAL_Pos          0                                              /*!< CMSDK_TIMER RELOAD: RELOAD Position */
+#define CMSDK_TIMER_RELOAD_VAL_Msk          (0xFFFFFFFFul << CMSDK_TIMER_RELOAD_VAL_Pos)   /*!< CMSDK_TIMER RELOAD: RELOAD Mask */
+
+#define CMSDK_TIMER_INTSTATUS_Pos           0                                              /*!< CMSDK_TIMER INTSTATUS: INTSTATUSPosition */
+#define CMSDK_TIMER_INTSTATUS_Msk           (0x01ul << CMSDK_TIMER_INTSTATUS_Pos)          /*!< CMSDK_TIMER INTSTATUS: INTSTATUSMask */
+
+#define CMSDK_TIMER_INTCLEAR_Pos            0                                              /*!< CMSDK_TIMER INTCLEAR: INTCLEAR Position */
+#define CMSDK_TIMER_INTCLEAR_Msk            (0x01ul << CMSDK_TIMER_INTCLEAR_Pos)           /*!< CMSDK_TIMER INTCLEAR: INTCLEAR Mask */
+
+/*@}*/ /* end of group CMSDK_TIMER */
+
+
+/*------------- Timer (TIM) --------------------------------------------------*/
+// <g> Timer (TIM)
+
+/** @addtogroup CMSDK_DualTIMER CMSDK Dual Timer
+  @{
+*/
+
+typedef struct
+{
+  __IO uint32_t Timer1Load;   // <h> Timer 1 Load </h>
+  __I  uint32_t Timer1Value;  // <h> Timer 1 Counter Current Value <r></h>
+  __IO uint32_t Timer1Control;// <h> Timer 1 Control
+                              //   <o.7> TimerEn: Timer Enable
+                              //   <o.6> TimerMode: Timer Mode
+                              //     <0=> Freerunning-mode
+                              //     <1=> Periodic mode
+                              //   <o.5> IntEnable: Interrupt Enable
+                              //   <o.2..3> TimerPre: Timer Prescale
+                              //     <0=> / 1
+                              //     <1=> / 16
+                              //     <2=> / 256
+                              //     <3=> Undefined!
+                              //   <o.1> TimerSize: Timer Size
+                              //     <0=> 16-bit counter
+                              //     <1=> 32-bit counter
+                              //   <o.0> OneShot: One-shoot mode
+                              //     <0=> Wrapping mode
+                              //     <1=> One-shot mode
+                              // </h>
+  __O  uint32_t Timer1IntClr; // <h> Timer 1 Interrupt Clear <w></h>
+  __I  uint32_t Timer1RIS;    // <h> Timer 1 Raw Interrupt Status <r></h>
+  __I  uint32_t Timer1MIS;    // <h> Timer 1 Masked Interrupt Status <r></h>
+  __IO uint32_t Timer1BGLoad; // <h> Background Load Register </h>
+       uint32_t RESERVED0;
+  __IO uint32_t Timer2Load;   // <h> Timer 2 Load </h>
+  __I  uint32_t Timer2Value;  // <h> Timer 2 Counter Current Value <r></h>
+  __IO uint32_t Timer2Control;// <h> Timer 2 Control
+                              //   <o.7> TimerEn: Timer Enable
+                              //   <o.6> TimerMode: Timer Mode
+                              //     <0=> Freerunning-mode
+                              //     <1=> Periodic mode
+                              //   <o.5> IntEnable: Interrupt Enable
+                              //   <o.2..3> TimerPre: Timer Prescale
+                              //     <0=> / 1
+                              //     <1=> / 16
+                              //     <2=> / 256
+                              //     <3=> Undefined!
+                              //   <o.1> TimerSize: Timer Size
+                              //     <0=> 16-bit counter
+                              //     <1=> 32-bit counter
+                              //   <o.0> OneShot: One-shoot mode
+                              //     <0=> Wrapping mode
+                              //     <1=> One-shot mode
+                              // </h>
+  __O  uint32_t Timer2IntClr; // <h> Timer 2 Interrupt Clear <w></h>
+  __I  uint32_t Timer2RIS;    // <h> Timer 2 Raw Interrupt Status <r></h>
+  __I  uint32_t Timer2MIS;    // <h> Timer 2 Masked Interrupt Status <r></h>
+  __IO uint32_t Timer2BGLoad; // <h> Background Load Register </h>
+       uint32_t RESERVED1[945];
+  __IO uint32_t ITCR;         // <h> Integration Test Control Register </h>
+  __O  uint32_t ITOP;         // <h> Integration Test Output Set Register </h>
+} CMSDK_DUALTIMER_BOTH_TypeDef;
+
+#define CMSDK_DUALTIMER1_LOAD_Pos            0                                                /*!< CMSDK_DUALTIMER1 LOAD: LOAD Position */
+#define CMSDK_DUALTIMER1_LOAD_Msk            (0xFFFFFFFFul << CMSDK_DUALTIMER1_LOAD_Pos)      /*!< CMSDK_DUALTIMER1 LOAD: LOAD Mask */
+
+#define CMSDK_DUALTIMER1_VALUE_Pos           0                                                /*!< CMSDK_DUALTIMER1 VALUE: VALUE Position */
+#define CMSDK_DUALTIMER1_VALUE_Msk           (0xFFFFFFFFul << CMSDK_DUALTIMER1_VALUE_Pos)     /*!< CMSDK_DUALTIMER1 VALUE: VALUE Mask */
+
+#define CMSDK_DUALTIMER1_CTRL_EN_Pos         7                                                /*!< CMSDK_DUALTIMER1 CTRL_EN: CTRL Enable Position */
+#define CMSDK_DUALTIMER1_CTRL_EN_Msk         (0x1ul << CMSDK_DUALTIMER1_CTRL_EN_Pos)          /*!< CMSDK_DUALTIMER1 CTRL_EN: CTRL Enable Mask */
+
+#define CMSDK_DUALTIMER1_CTRL_MODE_Pos       6                                                /*!< CMSDK_DUALTIMER1 CTRL_MODE: CTRL MODE Position */
+#define CMSDK_DUALTIMER1_CTRL_MODE_Msk       (0x1ul << CMSDK_DUALTIMER1_CTRL_MODE_Pos)        /*!< CMSDK_DUALTIMER1 CTRL_MODE: CTRL MODE Mask */
+
+#define CMSDK_DUALTIMER1_CTRL_INTEN_Pos      5                                                /*!< CMSDK_DUALTIMER1 CTRL_INTEN: CTRL Int Enable Position */
+#define CMSDK_DUALTIMER1_CTRL_INTEN_Msk      (0x1ul << CMSDK_DUALTIMER1_CTRL_INTEN_Pos)       /*!< CMSDK_DUALTIMER1 CTRL_INTEN: CTRL Int Enable Mask */
+
+#define CMSDK_DUALTIMER1_CTRL_PRESCALE_Pos   2                                                /*!< CMSDK_DUALTIMER1 CTRL_PRESCALE: CTRL PRESCALE Position */
+#define CMSDK_DUALTIMER1_CTRL_PRESCALE_Msk   (0x3ul << CMSDK_DUALTIMER1_CTRL_PRESCALE_Pos)    /*!< CMSDK_DUALTIMER1 CTRL_PRESCALE: CTRL PRESCALE Mask */
+
+#define CMSDK_DUALTIMER1_CTRL_SIZE_Pos       1                                                /*!< CMSDK_DUALTIMER1 CTRL_SIZE: CTRL SIZE Position */
+#define CMSDK_DUALTIMER1_CTRL_SIZE_Msk       (0x1ul << CMSDK_DUALTIMER1_CTRL_SIZE_Pos)        /*!< CMSDK_DUALTIMER1 CTRL_SIZE: CTRL SIZE Mask */
+
+#define CMSDK_DUALTIMER1_CTRL_ONESHOOT_Pos   0                                                /*!< CMSDK_DUALTIMER1 CTRL_ONESHOOT: CTRL ONESHOOT Position */
+#define CMSDK_DUALTIMER1_CTRL_ONESHOOT_Msk   (0x1ul << CMSDK_DUALTIMER1_CTRL_ONESHOOT_Pos)    /*!< CMSDK_DUALTIMER1 CTRL_ONESHOOT: CTRL ONESHOOT Mask */
+
+#define CMSDK_DUALTIMER1_INTCLR_Pos          0                                                /*!< CMSDK_DUALTIMER1 INTCLR: INT Clear Position */
+#define CMSDK_DUALTIMER1_INTCLR_Msk          (0x1ul << CMSDK_DUALTIMER1_INTCLR_Pos)           /*!< CMSDK_DUALTIMER1 INTCLR: INT Clear  Mask */
+
+#define CMSDK_DUALTIMER1_RAWINTSTAT_Pos      0                                                /*!< CMSDK_DUALTIMER1 RAWINTSTAT: Raw Int Status Position */
+#define CMSDK_DUALTIMER1_RAWINTSTAT_Msk      (0x1ul << CMSDK_DUALTIMER1_RAWINTSTAT_Pos)       /*!< CMSDK_DUALTIMER1 RAWINTSTAT: Raw Int Status Mask */
+
+#define CMSDK_DUALTIMER1_MASKINTSTAT_Pos     0                                                /*!< CMSDK_DUALTIMER1 MASKINTSTAT: Mask Int Status Position */
+#define CMSDK_DUALTIMER1_MASKINTSTAT_Msk     (0x1ul << CMSDK_DUALTIMER1_MASKINTSTAT_Pos)      /*!< CMSDK_DUALTIMER1 MASKINTSTAT: Mask Int Status Mask */
+
+#define CMSDK_DUALTIMER1_BGLOAD_Pos          0                                                /*!< CMSDK_DUALTIMER1 BGLOAD: Background Load Position */
+#define CMSDK_DUALTIMER1_BGLOAD_Msk          (0xFFFFFFFFul << CMSDK_DUALTIMER1_BGLOAD_Pos)    /*!< CMSDK_DUALTIMER1 BGLOAD: Background Load Mask */
+
+#define CMSDK_DUALTIMER2_LOAD_Pos            0                                                /*!< CMSDK_DUALTIMER2 LOAD: LOAD Position */
+#define CMSDK_DUALTIMER2_LOAD_Msk            (0xFFFFFFFFul << CMSDK_DUALTIMER2_LOAD_Pos)      /*!< CMSDK_DUALTIMER2 LOAD: LOAD Mask */
+
+#define CMSDK_DUALTIMER2_VALUE_Pos           0                                                /*!< CMSDK_DUALTIMER2 VALUE: VALUE Position */
+#define CMSDK_DUALTIMER2_VALUE_Msk           (0xFFFFFFFFul << CMSDK_DUALTIMER2_VALUE_Pos)     /*!< CMSDK_DUALTIMER2 VALUE: VALUE Mask */
+
+#define CMSDK_DUALTIMER2_CTRL_EN_Pos         7                                                /*!< CMSDK_DUALTIMER2 CTRL_EN: CTRL Enable Position */
+#define CMSDK_DUALTIMER2_CTRL_EN_Msk         (0x1ul << CMSDK_DUALTIMER2_CTRL_EN_Pos)          /*!< CMSDK_DUALTIMER2 CTRL_EN: CTRL Enable Mask */
+
+#define CMSDK_DUALTIMER2_CTRL_MODE_Pos       6                                                /*!< CMSDK_DUALTIMER2 CTRL_MODE: CTRL MODE Position */
+#define CMSDK_DUALTIMER2_CTRL_MODE_Msk       (0x1ul << CMSDK_DUALTIMER2_CTRL_MODE_Pos)        /*!< CMSDK_DUALTIMER2 CTRL_MODE: CTRL MODE Mask */
+
+#define CMSDK_DUALTIMER2_CTRL_INTEN_Pos      5                                                /*!< CMSDK_DUALTIMER2 CTRL_INTEN: CTRL Int Enable Position */
+#define CMSDK_DUALTIMER2_CTRL_INTEN_Msk      (0x1ul << CMSDK_DUALTIMER2_CTRL_INTEN_Pos)       /*!< CMSDK_DUALTIMER2 CTRL_INTEN: CTRL Int Enable Mask */
+
+#define CMSDK_DUALTIMER2_CTRL_PRESCALE_Pos   2                                                /*!< CMSDK_DUALTIMER2 CTRL_PRESCALE: CTRL PRESCALE Position */
+#define CMSDK_DUALTIMER2_CTRL_PRESCALE_Msk   (0x3ul << CMSDK_DUALTIMER2_CTRL_PRESCALE_Pos)    /*!< CMSDK_DUALTIMER2 CTRL_PRESCALE: CTRL PRESCALE Mask */
+
+#define CMSDK_DUALTIMER2_CTRL_SIZE_Pos       1                                                /*!< CMSDK_DUALTIMER2 CTRL_SIZE: CTRL SIZE Position */
+#define CMSDK_DUALTIMER2_CTRL_SIZE_Msk       (0x1ul << CMSDK_DUALTIMER2_CTRL_SIZE_Pos)        /*!< CMSDK_DUALTIMER2 CTRL_SIZE: CTRL SIZE Mask */
+
+#define CMSDK_DUALTIMER2_CTRL_ONESHOOT_Pos   0                                                /*!< CMSDK_DUALTIMER2 CTRL_ONESHOOT: CTRL ONESHOOT Position */
+#define CMSDK_DUALTIMER2_CTRL_ONESHOOT_Msk   (0x1ul << CMSDK_DUALTIMER2_CTRL_ONESHOOT_Pos)    /*!< CMSDK_DUALTIMER2 CTRL_ONESHOOT: CTRL ONESHOOT Mask */
+
+#define CMSDK_DUALTIMER2_INTCLR_Pos          0                                                /*!< CMSDK_DUALTIMER2 INTCLR: INT Clear Position */
+#define CMSDK_DUALTIMER2_INTCLR_Msk          (0x1ul << CMSDK_DUALTIMER2_INTCLR_Pos)           /*!< CMSDK_DUALTIMER2 INTCLR: INT Clear  Mask */
+
+#define CMSDK_DUALTIMER2_RAWINTSTAT_Pos      0                                                /*!< CMSDK_DUALTIMER2 RAWINTSTAT: Raw Int Status Position */
+#define CMSDK_DUALTIMER2_RAWINTSTAT_Msk      (0x1ul << CMSDK_DUALTIMER2_RAWINTSTAT_Pos)       /*!< CMSDK_DUALTIMER2 RAWINTSTAT: Raw Int Status Mask */
+
+#define CMSDK_DUALTIMER2_MASKINTSTAT_Pos     0                                                /*!< CMSDK_DUALTIMER2 MASKINTSTAT: Mask Int Status Position */
+#define CMSDK_DUALTIMER2_MASKINTSTAT_Msk     (0x1ul << CMSDK_DUALTIMER2_MASKINTSTAT_Pos)      /*!< CMSDK_DUALTIMER2 MASKINTSTAT: Mask Int Status Mask */
+
+#define CMSDK_DUALTIMER2_BGLOAD_Pos          0                                                /*!< CMSDK_DUALTIMER2 BGLOAD: Background Load Position */
+#define CMSDK_DUALTIMER2_BGLOAD_Msk          (0xFFFFFFFFul << CMSDK_DUALTIMER2_BGLOAD_Pos)    /*!< CMSDK_DUALTIMER2 BGLOAD: Background Load Mask */
+
+
+typedef struct
+{
+  __IO uint32_t TimerLoad;    // <h> Timer Load </h>
+  __I  uint32_t TimerValue;   // <h> Timer Counter Current Value <r></h>
+  __IO uint32_t TimerControl; // <h> Timer Control
+                              //   <o.7> TimerEn: Timer Enable
+                              //   <o.6> TimerMode: Timer Mode
+                              //     <0=> Freerunning-mode
+                              //     <1=> Periodic mode
+                              //   <o.5> IntEnable: Interrupt Enable
+                              //   <o.2..3> TimerPre: Timer Prescale
+                              //     <0=> / 1
+                              //     <1=> / 16
+                              //     <2=> / 256
+                              //     <3=> Undefined!
+                              //   <o.1> TimerSize: Timer Size
+                              //     <0=> 16-bit counter
+                              //     <1=> 32-bit counter
+                              //   <o.0> OneShot: One-shoot mode
+                              //     <0=> Wrapping mode
+                              //     <1=> One-shot mode
+                              // </h>
+  __O  uint32_t TimerIntClr;  // <h> Timer Interrupt Clear <w></h>
+  __I  uint32_t TimerRIS;     // <h> Timer Raw Interrupt Status <r></h>
+  __I  uint32_t TimerMIS;     // <h> Timer Masked Interrupt Status <r></h>
+  __IO uint32_t TimerBGLoad;  // <h> Background Load Register </h>
+} CMSDK_DUALTIMER_SINGLE_TypeDef;
+
+#define CMSDK_DUALTIMER_LOAD_Pos             0                                               /*!< CMSDK_DUALTIMER LOAD: LOAD Position */
+#define CMSDK_DUALTIMER_LOAD_Msk             (0xFFFFFFFFul << CMSDK_DUALTIMER_LOAD_Pos)      /*!< CMSDK_DUALTIMER LOAD: LOAD Mask */
+
+#define CMSDK_DUALTIMER_VALUE_Pos            0                                               /*!< CMSDK_DUALTIMER VALUE: VALUE Position */
+#define CMSDK_DUALTIMER_VALUE_Msk            (0xFFFFFFFFul << CMSDK_DUALTIMER_VALUE_Pos)     /*!< CMSDK_DUALTIMER VALUE: VALUE Mask */
+
+#define CMSDK_DUALTIMER_CTRL_EN_Pos          7                                               /*!< CMSDK_DUALTIMER CTRL_EN: CTRL Enable Position */
+#define CMSDK_DUALTIMER_CTRL_EN_Msk          (0x1ul << CMSDK_DUALTIMER_CTRL_EN_Pos)          /*!< CMSDK_DUALTIMER CTRL_EN: CTRL Enable Mask */
+
+#define CMSDK_DUALTIMER_CTRL_MODE_Pos        6                                               /*!< CMSDK_DUALTIMER CTRL_MODE: CTRL MODE Position */
+#define CMSDK_DUALTIMER_CTRL_MODE_Msk        (0x1ul << CMSDK_DUALTIMER_CTRL_MODE_Pos)        /*!< CMSDK_DUALTIMER CTRL_MODE: CTRL MODE Mask */
+
+#define CMSDK_DUALTIMER_CTRL_INTEN_Pos       5                                               /*!< CMSDK_DUALTIMER CTRL_INTEN: CTRL Int Enable Position */
+#define CMSDK_DUALTIMER_CTRL_INTEN_Msk       (0x1ul << CMSDK_DUALTIMER_CTRL_INTEN_Pos)       /*!< CMSDK_DUALTIMER CTRL_INTEN: CTRL Int Enable Mask */
+
+#define CMSDK_DUALTIMER_CTRL_PRESCALE_Pos    2                                               /*!< CMSDK_DUALTIMER CTRL_PRESCALE: CTRL PRESCALE Position */
+#define CMSDK_DUALTIMER_CTRL_PRESCALE_Msk    (0x3ul << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos)    /*!< CMSDK_DUALTIMER CTRL_PRESCALE: CTRL PRESCALE Mask */
+
+#define CMSDK_DUALTIMER_CTRL_SIZE_Pos        1                                               /*!< CMSDK_DUALTIMER CTRL_SIZE: CTRL SIZE Position */
+#define CMSDK_DUALTIMER_CTRL_SIZE_Msk        (0x1ul << CMSDK_DUALTIMER_CTRL_SIZE_Pos)        /*!< CMSDK_DUALTIMER CTRL_SIZE: CTRL SIZE Mask */
+
+#define CMSDK_DUALTIMER_CTRL_ONESHOOT_Pos    0                                               /*!< CMSDK_DUALTIMER CTRL_ONESHOOT: CTRL ONESHOOT Position */
+#define CMSDK_DUALTIMER_CTRL_ONESHOOT_Msk    (0x1ul << CMSDK_DUALTIMER_CTRL_ONESHOOT_Pos)    /*!< CMSDK_DUALTIMER CTRL_ONESHOOT: CTRL ONESHOOT Mask */
+
+#define CMSDK_DUALTIMER_INTCLR_Pos           0                                               /*!< CMSDK_DUALTIMER INTCLR: INT Clear Position */
+#define CMSDK_DUALTIMER_INTCLR_Msk           (0x1ul << CMSDK_DUALTIMER_INTCLR_Pos)           /*!< CMSDK_DUALTIMER INTCLR: INT Clear  Mask */
+
+#define CMSDK_DUALTIMER_RAWINTSTAT_Pos       0                                               /*!< CMSDK_DUALTIMER RAWINTSTAT: Raw Int Status Position */
+#define CMSDK_DUALTIMER_RAWINTSTAT_Msk       (0x1ul << CMSDK_DUALTIMER_RAWINTSTAT_Pos)       /*!< CMSDK_DUALTIMER RAWINTSTAT: Raw Int Status Mask */
+
+#define CMSDK_DUALTIMER_MASKINTSTAT_Pos      0                                               /*!< CMSDK_DUALTIMER MASKINTSTAT: Mask Int Status Position */
+#define CMSDK_DUALTIMER_MASKINTSTAT_Msk      (0x1ul << CMSDK_DUALTIMER_MASKINTSTAT_Pos)      /*!< CMSDK_DUALTIMER MASKINTSTAT: Mask Int Status Mask */
+
+#define CMSDK_DUALTIMER_BGLOAD_Pos           0                                               /*!< CMSDK_DUALTIMER BGLOAD: Background Load Position */
+#define CMSDK_DUALTIMER_BGLOAD_Msk           (0xFFFFFFFFul << CMSDK_DUALTIMER_BGLOAD_Pos)    /*!< CMSDK_DUALTIMER BGLOAD: Background Load Mask */
+
+/*@}*/ /* end of group CMSDK_DualTIMER */
+
+
+/*-------------------- General Purpose Input Output (GPIO) -------------------*/
+
+/** @addtogroup CMSDK_GPIO CMSDK GPIO
+  @{
+*/
+typedef struct
+{
+  __IO   uint32_t  DATA;             /*!< Offset: 0x000 DATA Register (R/W) */
+  __IO   uint32_t  DATAOUT;          /*!< Offset: 0x004 Data Output Latch Register (R/W) */
+         uint32_t  RESERVED0[2];
+  __IO   uint32_t  OUTENABLESET;     /*!< Offset: 0x010 Output Enable Set Register  (R/W) */
+  __IO   uint32_t  OUTENABLECLR;     /*!< Offset: 0x014 Output Enable Clear Register  (R/W) */
+  __IO   uint32_t  ALTFUNCSET;       /*!< Offset: 0x018 Alternate Function Set Register  (R/W) */
+  __IO   uint32_t  ALTFUNCCLR;       /*!< Offset: 0x01C Alternate Function Clear Register  (R/W) */
+  __IO   uint32_t  INTENSET;         /*!< Offset: 0x020 Interrupt Enable Set Register  (R/W) */
+  __IO   uint32_t  INTENCLR;         /*!< Offset: 0x024 Interrupt Enable Clear Register  (R/W) */
+  __IO   uint32_t  INTTYPESET;       /*!< Offset: 0x028 Interrupt Type Set Register  (R/W) */
+  __IO   uint32_t  INTTYPECLR;       /*!< Offset: 0x02C Interrupt Type Clear Register  (R/W) */
+  __IO   uint32_t  INTPOLSET;        /*!< Offset: 0x030 Interrupt Polarity Set Register  (R/W) */
+  __IO   uint32_t  INTPOLCLR;        /*!< Offset: 0x034 Interrupt Polarity Clear Register  (R/W) */
+  union {
+    __I    uint32_t  INTSTATUS;      /*!< Offset: 0x038 Interrupt Status Register (R/ ) */
+    __O    uint32_t  INTCLEAR;       /*!< Offset: 0x038 Interrupt Clear Register ( /W) */
+    };
+         uint32_t RESERVED1[241];
+  __IO   uint32_t LB_MASKED[256];    /*!< Offset: 0x400 - 0x7FC Lower byte Masked Access Register (R/W) */
+  __IO   uint32_t UB_MASKED[256];    /*!< Offset: 0x800 - 0xBFC Upper byte Masked Access Register (R/W) */
+} CMSDK_GPIO_TypeDef;
+
+#define CMSDK_GPIO_DATA_Pos            0                                          /*!< CMSDK_GPIO DATA: DATA Position */
+#define CMSDK_GPIO_DATA_Msk            (0xFFFFul << CMSDK_GPIO_DATA_Pos)          /*!< CMSDK_GPIO DATA: DATA Mask */
+
+#define CMSDK_GPIO_DATAOUT_Pos         0                                          /*!< CMSDK_GPIO DATAOUT: DATAOUT Position */
+#define CMSDK_GPIO_DATAOUT_Msk         (0xFFFFul << CMSDK_GPIO_DATAOUT_Pos)       /*!< CMSDK_GPIO DATAOUT: DATAOUT Mask */
+
+#define CMSDK_GPIO_OUTENSET_Pos        0                                          /*!< CMSDK_GPIO OUTEN: OUTEN Position */
+#define CMSDK_GPIO_OUTENSET_Msk        (0xFFFFul << CMSDK_GPIO_OUTEN_Pos)         /*!< CMSDK_GPIO OUTEN: OUTEN Mask */
+
+#define CMSDK_GPIO_OUTENCLR_Pos        0                                          /*!< CMSDK_GPIO OUTEN: OUTEN Position */
+#define CMSDK_GPIO_OUTENCLR_Msk        (0xFFFFul << CMSDK_GPIO_OUTEN_Pos)         /*!< CMSDK_GPIO OUTEN: OUTEN Mask */
+
+#define CMSDK_GPIO_ALTFUNCSET_Pos      0                                          /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Position */
+#define CMSDK_GPIO_ALTFUNCSET_Msk      (0xFFFFul << CMSDK_GPIO_ALTFUNC_Pos)       /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Mask */
+
+#define CMSDK_GPIO_ALTFUNCCLR_Pos      0                                          /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Position */
+#define CMSDK_GPIO_ALTFUNCCLR_Msk      (0xFFFFul << CMSDK_GPIO_ALTFUNC_Pos)       /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Mask */
+
+#define CMSDK_GPIO_INTENSET_Pos        0                                          /*!< CMSDK_GPIO INTEN: INTEN Position */
+#define CMSDK_GPIO_INTENSET_Msk        (0xFFFFul << CMSDK_GPIO_INTEN_Pos)         /*!< CMSDK_GPIO INTEN: INTEN Mask */
+
+#define CMSDK_GPIO_INTENCLR_Pos        0                                          /*!< CMSDK_GPIO INTEN: INTEN Position */
+#define CMSDK_GPIO_INTENCLR_Msk        (0xFFFFul << CMSDK_GPIO_INTEN_Pos)         /*!< CMSDK_GPIO INTEN: INTEN Mask */
+
+#define CMSDK_GPIO_INTTYPESET_Pos      0                                          /*!< CMSDK_GPIO INTTYPE: INTTYPE Position */
+#define CMSDK_GPIO_INTTYPESET_Msk      (0xFFFFul << CMSDK_GPIO_INTTYPE_Pos)       /*!< CMSDK_GPIO INTTYPE: INTTYPE Mask */
+
+#define CMSDK_GPIO_INTTYPECLR_Pos      0                                          /*!< CMSDK_GPIO INTTYPE: INTTYPE Position */
+#define CMSDK_GPIO_INTTYPECLR_Msk      (0xFFFFul << CMSDK_GPIO_INTTYPE_Pos)       /*!< CMSDK_GPIO INTTYPE: INTTYPE Mask */
+
+#define CMSDK_GPIO_INTPOLSET_Pos       0                                          /*!< CMSDK_GPIO INTPOL: INTPOL Position */
+#define CMSDK_GPIO_INTPOLSET_Msk       (0xFFFFul << CMSDK_GPIO_INTPOL_Pos)        /*!< CMSDK_GPIO INTPOL: INTPOL Mask */
+
+#define CMSDK_GPIO_INTPOLCLR_Pos       0                                          /*!< CMSDK_GPIO INTPOL: INTPOL Position */
+#define CMSDK_GPIO_INTPOLCLR_Msk       (0xFFFFul << CMSDK_GPIO_INTPOL_Pos)        /*!< CMSDK_GPIO INTPOL: INTPOL Mask */
+
+#define CMSDK_GPIO_INTSTATUS_Pos       0                                          /*!< CMSDK_GPIO INTSTATUS: INTSTATUS Position */
+#define CMSDK_GPIO_INTSTATUS_Msk       (0xFFul << CMSDK_GPIO_INTSTATUS_Pos)       /*!< CMSDK_GPIO INTSTATUS: INTSTATUS Mask */
+
+#define CMSDK_GPIO_INTCLEAR_Pos        0                                          /*!< CMSDK_GPIO INTCLEAR: INTCLEAR Position */
+#define CMSDK_GPIO_INTCLEAR_Msk        (0xFFul << CMSDK_GPIO_INTCLEAR_Pos)        /*!< CMSDK_GPIO INTCLEAR: INTCLEAR Mask */
+
+#define CMSDK_GPIO_MASKLOWBYTE_Pos     0                                          /*!< CMSDK_GPIO MASKLOWBYTE: MASKLOWBYTE Position */
+#define CMSDK_GPIO_MASKLOWBYTE_Msk     (0x00FFul << CMSDK_GPIO_MASKLOWBYTE_Pos)   /*!< CMSDK_GPIO MASKLOWBYTE: MASKLOWBYTE Mask */
+
+#define CMSDK_GPIO_MASKHIGHBYTE_Pos    0                                          /*!< CMSDK_GPIO MASKHIGHBYTE: MASKHIGHBYTE Position */
+#define CMSDK_GPIO_MASKHIGHBYTE_Msk    (0xFF00ul << CMSDK_GPIO_MASKHIGHBYTE_Pos)  /*!< CMSDK_GPIO MASKHIGHBYTE: MASKHIGHBYTE Mask */
+
+/*@}*/ /* end of group CMSDK_GPIO */
+
+
+/*------------- System Control (SYSCON) --------------------------------------*/
+/** @addtogroup CMSDK_SYSCON CMSDK System Control
+  @{
+*/
+typedef struct
+{
+  __IO   uint32_t  REMAP;          /*!< Offset: 0x000 Remap Control Register (R/W) */
+  __IO   uint32_t  PMUCTRL;        /*!< Offset: 0x004 PMU Control Register (R/W) */
+  __IO   uint32_t  RESETOP;        /*!< Offset: 0x008 Reset Option Register  (R/W) */
+  __IO   uint32_t  EMICTRL;        /*!< Offset: 0x00C EMI Control Register  (R/W) */
+  __IO   uint32_t  RSTINFO;        /*!< Offset: 0x010 Reset Information Register (R/W) */
+} CMSDK_SYSCON_TypeDef;
+
+#define CMSDK_SYSCON_REMAP_Pos                 0
+#define CMSDK_SYSCON_REMAP_Msk                 (0x01ul << CMSDK_SYSCON_REMAP_Pos)               /*!< CMSDK_SYSCON MEME_CTRL: REMAP Mask */
+
+#define CMSDK_SYSCON_PMUCTRL_EN_Pos            0
+#define CMSDK_SYSCON_PMUCTRL_EN_Msk            (0x01ul << CMSDK_SYSCON_PMUCTRL_EN_Pos)          /*!< CMSDK_SYSCON PMUCTRL: PMUCTRL ENABLE Mask */
+
+#define CMSDK_SYSCON_LOCKUPRST_RESETOP_Pos     0
+#define CMSDK_SYSCON_LOCKUPRST_RESETOP_Msk     (0x01ul << CMSDK_SYSCON_LOCKUPRST_RESETOP_Pos)   /*!< CMSDK_SYSCON SYS_CTRL: LOCKUP RESET ENABLE Mask */
+
+#define CMSDK_SYSCON_EMICTRL_SIZE_Pos          24
+#define CMSDK_SYSCON_EMICTRL_SIZE_Msk          (0x00001ul << CMSDK_SYSCON_EMICTRL_SIZE_Pos)     /*!< CMSDK_SYSCON EMICTRL: SIZE Mask */
+
+#define CMSDK_SYSCON_EMICTRL_TACYC_Pos         16
+#define CMSDK_SYSCON_EMICTRL_TACYC_Msk         (0x00007ul << CMSDK_SYSCON_EMICTRL_TACYC_Pos)    /*!< CMSDK_SYSCON EMICTRL: TURNAROUNDCYCLE Mask */
+
+#define CMSDK_SYSCON_EMICTRL_WCYC_Pos          8
+#define CMSDK_SYSCON_EMICTRL_WCYC_Msk          (0x00003ul << CMSDK_SYSCON_EMICTRL_WCYC_Pos)     /*!< CMSDK_SYSCON EMICTRL: WRITECYCLE Mask */
+
+#define CMSDK_SYSCON_EMICTRL_RCYC_Pos          0
+#define CMSDK_SYSCON_EMICTRL_RCYC_Msk          (0x00007ul << CMSDK_SYSCON_EMICTRL_RCYC_Pos)     /*!< CMSDK_SYSCON EMICTRL: READCYCLE Mask */
+
+#define CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Pos   0
+#define CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Msk   (0x00001ul << CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Pos) /*!< CMSDK_SYSCON RSTINFO: SYSRESETREQ Mask */
+
+#define CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Pos  1
+#define CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Msk  (0x00001ul << CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Pos) /*!< CMSDK_SYSCON RSTINFO: WDOGRESETREQ Mask */
+
+#define CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Pos   2
+#define CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Msk   (0x00001ul << CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Pos) /*!< CMSDK_SYSCON RSTINFO: LOCKUPRESET Mask */
+
+/*@}*/ /* end of group CMSDK_SYSCON */
+
+/*------------- PL230 uDMA (PL230) --------------------------------------*/
+/** @addtogroup CMSDK_PL230 CMSDK uDMA controller
+  @{
+*/
+typedef struct
+{
+  __I    uint32_t  DMA_STATUS;           /*!< Offset: 0x000 DMA status Register (R/W) */
+  __O    uint32_t  DMA_CFG;              /*!< Offset: 0x004 DMA configuration Register ( /W) */
+  __IO   uint32_t  CTRL_BASE_PTR;        /*!< Offset: 0x008 Channel Control Data Base Pointer Register  (R/W) */
+  __I    uint32_t  ALT_CTRL_BASE_PTR;    /*!< Offset: 0x00C Channel Alternate Control Data Base Pointer Register  (R/ ) */
+  __I    uint32_t  DMA_WAITONREQ_STATUS; /*!< Offset: 0x010 Channel Wait On Request Status Register  (R/ ) */
+  __O    uint32_t  CHNL_SW_REQUEST;      /*!< Offset: 0x014 Channel Software Request Register  ( /W) */
+  __IO   uint32_t  CHNL_USEBURST_SET;    /*!< Offset: 0x018 Channel UseBurst Set Register  (R/W) */
+  __O    uint32_t  CHNL_USEBURST_CLR;    /*!< Offset: 0x01C Channel UseBurst Clear Register  ( /W) */
+  __IO   uint32_t  CHNL_REQ_MASK_SET;    /*!< Offset: 0x020 Channel Request Mask Set Register  (R/W) */
+  __O    uint32_t  CHNL_REQ_MASK_CLR;    /*!< Offset: 0x024 Channel Request Mask Clear Register  ( /W) */
+  __IO   uint32_t  CHNL_ENABLE_SET;      /*!< Offset: 0x028 Channel Enable Set Register  (R/W) */
+  __O    uint32_t  CHNL_ENABLE_CLR;      /*!< Offset: 0x02C Channel Enable Clear Register  ( /W) */
+  __IO   uint32_t  CHNL_PRI_ALT_SET;     /*!< Offset: 0x030 Channel Primary-Alterante Set Register  (R/W) */
+  __O    uint32_t  CHNL_PRI_ALT_CLR;     /*!< Offset: 0x034 Channel Primary-Alterante Clear Register  ( /W) */
+  __IO   uint32_t  CHNL_PRIORITY_SET;    /*!< Offset: 0x038 Channel Priority Set Register  (R/W) */
+  __O    uint32_t  CHNL_PRIORITY_CLR;    /*!< Offset: 0x03C Channel Priority Clear Register  ( /W) */
+         uint32_t  RESERVED0[3];
+  __IO   uint32_t  ERR_CLR;              /*!< Offset: 0x04C Bus Error Clear Register  (R/W) */
+
+} CMSDK_PL230_TypeDef;
+
+#define PL230_DMA_CHNL_BITS 0
+
+#define CMSDK_PL230_DMA_STATUS_MSTREN_Pos          0                                                          /*!< CMSDK_PL230 DMA STATUS: MSTREN Position */
+#define CMSDK_PL230_DMA_STATUS_MSTREN_Msk          (0x00000001ul << CMSDK_PL230_DMA_STATUS_MSTREN_Pos)        /*!< CMSDK_PL230 DMA STATUS: MSTREN Mask */
+
+#define CMSDK_PL230_DMA_STATUS_STATE_Pos           0                                                          /*!< CMSDK_PL230 DMA STATUS: STATE Position */
+#define CMSDK_PL230_DMA_STATUS_STATE_Msk           (0x0000000Ful << CMSDK_PL230_DMA_STATUS_STATE_Pos)         /*!< CMSDK_PL230 DMA STATUS: STATE Mask */
+
+#define CMSDK_PL230_DMA_STATUS_CHNLS_MINUS1_Pos    0                                                          /*!< CMSDK_PL230 DMA STATUS: CHNLS_MINUS1 Position */
+#define CMSDK_PL230_DMA_STATUS_CHNLS_MINUS1_Msk    (0x0000001Ful << CMSDK_PL230_DMA_STATUS_CHNLS_MINUS1_Pos)  /*!< CMSDK_PL230 DMA STATUS: CHNLS_MINUS1 Mask */
+
+#define CMSDK_PL230_DMA_STATUS_TEST_STATUS_Pos     0                                                          /*!< CMSDK_PL230 DMA STATUS: TEST_STATUS Position */
+#define CMSDK_PL230_DMA_STATUS_TEST_STATUS_Msk     (0x00000001ul << CMSDK_PL230_DMA_STATUS_TEST_STATUS_Pos)   /*!< CMSDK_PL230 DMA STATUS: TEST_STATUS Mask */
+
+#define CMSDK_PL230_DMA_CFG_MSTREN_Pos             0                                                          /*!< CMSDK_PL230 DMA CFG: MSTREN Position */
+#define CMSDK_PL230_DMA_CFG_MSTREN_Msk             (0x00000001ul << CMSDK_PL230_DMA_CFG_MSTREN_Pos)           /*!< CMSDK_PL230 DMA CFG: MSTREN Mask */
+
+#define CMSDK_PL230_DMA_CFG_CPCCACHE_Pos           2                                                          /*!< CMSDK_PL230 DMA CFG: CPCCACHE Position */
+#define CMSDK_PL230_DMA_CFG_CPCCACHE_Msk           (0x00000001ul << CMSDK_PL230_DMA_CFG_CPCCACHE_Pos)         /*!< CMSDK_PL230 DMA CFG: CPCCACHE Mask */
+
+#define CMSDK_PL230_DMA_CFG_CPCBUF_Pos             1                                                          /*!< CMSDK_PL230 DMA CFG: CPCBUF Position */
+#define CMSDK_PL230_DMA_CFG_CPCBUF_Msk             (0x00000001ul << CMSDK_PL230_DMA_CFG_CPCBUF_Pos)           /*!< CMSDK_PL230 DMA CFG: CPCBUF Mask */
+
+#define CMSDK_PL230_DMA_CFG_CPCPRIV_Pos            0                                                          /*!< CMSDK_PL230 DMA CFG: CPCPRIV Position */
+#define CMSDK_PL230_DMA_CFG_CPCPRIV_Msk            (0x00000001ul << CMSDK_PL230_DMA_CFG_CPCPRIV_Pos)          /*!< CMSDK_PL230 DMA CFG: CPCPRIV Mask */
+
+#define CMSDK_PL230_CTRL_BASE_PTR_Pos              PL230_DMA_CHNL_BITS + 5                                    /*!< CMSDK_PL230 STATUS: BASE_PTR Position */
+#define CMSDK_PL230_CTRL_BASE_PTR_Msk              (0x0FFFFFFFul << CMSDK_PL230_CTRL_BASE_PTR_Pos)            /*!< CMSDK_PL230 STATUS: BASE_PTR Mask */
+
+#define CMSDK_PL230_ALT_CTRL_BASE_PTR_Pos          0                                                          /*!< CMSDK_PL230 STATUS: MSTREN Position */
+#define CMSDK_PL230_ALT_CTRL_BASE_PTR_Msk          (0xFFFFFFFFul << CMSDK_PL230_ALT_CTRL_BASE_PTR_Pos)        /*!< CMSDK_PL230 STATUS: MSTREN Mask */
+
+#define CMSDK_PL230_DMA_WAITONREQ_STATUS_Pos       0                                                          /*!< CMSDK_PL230 DMA_WAITONREQ_STATUS: DMA_WAITONREQ_STATUS Position */
+#define CMSDK_PL230_DMA_WAITONREQ_STATUS_Msk       (0xFFFFFFFFul << CMSDK_PL230_DMA_WAITONREQ_STATUS_Pos)     /*!< CMSDK_PL230 DMA_WAITONREQ_STATUS: DMA_WAITONREQ_STATUS Mask */
+
+#define CMSDK_PL230_CHNL_SW_REQUEST_Pos            0                                                          /*!< CMSDK_PL230 CHNL_SW_REQUEST: CHNL_SW_REQUEST Position */
+#define CMSDK_PL230_CHNL_SW_REQUEST_Msk            (0xFFFFFFFFul << CMSDK_PL230_CHNL_SW_REQUEST_Pos)          /*!< CMSDK_PL230 CHNL_SW_REQUEST: CHNL_SW_REQUEST Mask */
+
+#define CMSDK_PL230_CHNL_USEBURST_SET_Pos          0                                                          /*!< CMSDK_PL230 CHNL_USEBURST: SET Position */
+#define CMSDK_PL230_CHNL_USEBURST_SET_Msk          (0xFFFFFFFFul << CMSDK_PL230_CHNL_USEBURST_SET_Pos)        /*!< CMSDK_PL230 CHNL_USEBURST: SET Mask */
+
+#define CMSDK_PL230_CHNL_USEBURST_CLR_Pos          0                                                          /*!< CMSDK_PL230 CHNL_USEBURST: CLR Position */
+#define CMSDK_PL230_CHNL_USEBURST_CLR_Msk          (0xFFFFFFFFul << CMSDK_PL230_CHNL_USEBURST_CLR_Pos)        /*!< CMSDK_PL230 CHNL_USEBURST: CLR Mask */
+
+#define CMSDK_PL230_CHNL_REQ_MASK_SET_Pos          0                                                          /*!< CMSDK_PL230 CHNL_REQ_MASK: SET Position */
+#define CMSDK_PL230_CHNL_REQ_MASK_SET_Msk          (0xFFFFFFFFul << CMSDK_PL230_CHNL_REQ_MASK_SET_Pos)        /*!< CMSDK_PL230 CHNL_REQ_MASK: SET Mask */
+
+#define CMSDK_PL230_CHNL_REQ_MASK_CLR_Pos          0                                                          /*!< CMSDK_PL230 CHNL_REQ_MASK: CLR Position */
+#define CMSDK_PL230_CHNL_REQ_MASK_CLR_Msk          (0xFFFFFFFFul << CMSDK_PL230_CHNL_REQ_MASK_CLR_Pos)        /*!< CMSDK_PL230 CHNL_REQ_MASK: CLR Mask */
+
+#define CMSDK_PL230_CHNL_ENABLE_SET_Pos            0                                                          /*!< CMSDK_PL230 CHNL_ENABLE: SET Position */
+#define CMSDK_PL230_CHNL_ENABLE_SET_Msk            (0xFFFFFFFFul << CMSDK_PL230_CHNL_ENABLE_SET_Pos)          /*!< CMSDK_PL230 CHNL_ENABLE: SET Mask */
+
+#define CMSDK_PL230_CHNL_ENABLE_CLR_Pos            0                                                          /*!< CMSDK_PL230 CHNL_ENABLE: CLR Position */
+#define CMSDK_PL230_CHNL_ENABLE_CLR_Msk            (0xFFFFFFFFul << CMSDK_PL230_CHNL_ENABLE_CLR_Pos)          /*!< CMSDK_PL230 CHNL_ENABLE: CLR Mask */
+
+#define CMSDK_PL230_CHNL_PRI_ALT_SET_Pos           0                                                          /*!< CMSDK_PL230 CHNL_PRI_ALT: SET Position */
+#define CMSDK_PL230_CHNL_PRI_ALT_SET_Msk           (0xFFFFFFFFul << CMSDK_PL230_CHNL_PRI_ALT_SET_Pos)         /*!< CMSDK_PL230 CHNL_PRI_ALT: SET Mask */
+
+#define CMSDK_PL230_CHNL_PRI_ALT_CLR_Pos           0                                                          /*!< CMSDK_PL230 CHNL_PRI_ALT: CLR Position */
+#define CMSDK_PL230_CHNL_PRI_ALT_CLR_Msk           (0xFFFFFFFFul << CMSDK_PL230_CHNL_PRI_ALT_CLR_Pos)         /*!< CMSDK_PL230 CHNL_PRI_ALT: CLR Mask */
+
+#define CMSDK_PL230_CHNL_PRIORITY_SET_Pos          0                                                          /*!< CMSDK_PL230 CHNL_PRIORITY: SET Position */
+#define CMSDK_PL230_CHNL_PRIORITY_SET_Msk          (0xFFFFFFFFul << CMSDK_PL230_CHNL_PRIORITY_SET_Pos)        /*!< CMSDK_PL230 CHNL_PRIORITY: SET Mask */
+
+#define CMSDK_PL230_CHNL_PRIORITY_CLR_Pos          0                                                          /*!< CMSDK_PL230 CHNL_PRIORITY: CLR Position */
+#define CMSDK_PL230_CHNL_PRIORITY_CLR_Msk          (0xFFFFFFFFul << CMSDK_PL230_CHNL_PRIORITY_CLR_Pos)        /*!< CMSDK_PL230 CHNL_PRIORITY: CLR Mask */
+
+#define CMSDK_PL230_ERR_CLR_Pos                    0                                                          /*!< CMSDK_PL230 ERR: CLR Position */
+#define CMSDK_PL230_ERR_CLR_Msk                    (0x00000001ul << CMSDK_PL230_ERR_CLR_Pos)                  /*!< CMSDK_PL230 ERR: CLR Mask */
+
+
+/*@}*/ /* end of group CMSDK_PL230 */
+
+
+/*------------- PrimeCell UART (PL110) --------------------------------------*/
+/** @addtogroup CMSDK_PL110 CMSDK PrimeCell UART
+  @{
+*/
+
+typedef struct
+{
+  __IO uint32_t UARTDR;       // <h> Data
+                              //   <o.11>   OE: Overrun error <r>
+                              //   <o.10>   BE: Break error <r>
+                              //   <o.9>    PE: Parity error <r>
+                              //   <o.8>    FE: Framing error <r>
+                              //   <o.0..7> DATA: Received or Transmitting data (0..255)
+                              // </h>
+  union {
+  __I  uint32_t UARTRSR;      // <h> Receive Status <r>
+                              //   <o.3>    OE: Overrun error <r>
+                              //   <o.2>    BE: Break error <r>
+                              //   <o.1>    PE: Parity error <r>
+                              //   <o.0>    FE: Framing error <r>
+                              // </h>
+  __O  uint32_t UARTECR;      // <h> Error Clear <w>
+                              //   <o.3>    OE: Overrun error <w>
+                              //   <o.2>    BE: Break error <w>
+                              //   <o.1>    PE: Parity error <w>
+                              //   <o.0>    FE: Framing error <w>
+                              // </h>
+  };
+       uint32_t RESERVED0[4];
+  __IO uint32_t UARTFR;       // <h> Flags <r>
+                              //   <o.8>    RI: Ring indicator <r>
+                              //   <o.7>    TXFE: Transmit FIFO empty <r>
+                              //   <o.6>    RXFF: Receive FIFO full <r>
+                              //   <o.5>    TXFF: Transmit FIFO full <r>
+                              //   <o.4>    RXFE: Receive FIFO empty <r>
+                              //   <o.3>    BUSY: UART busy <r>
+                              //   <o.2>    DCD: Data carrier detect <r>
+                              //   <o.1>    DSR: Data set ready <r>
+                              //   <o.0>    CTS: Clear to send <r>
+                              // </h>
+       uint32_t RESERVED1;
+  __IO uint32_t UARTILPR;     // <h> IrDA Low-power Counter
+                              //   <o.0..7> ILPDVSR: 8-bit low-power divisor value (0..255)
+                              // </h>
+  __IO uint32_t UARTIBRD;     // <h> Integer Baud Rate
+                              //   <o.0..15> BAUD DIVINT: Integer baud rate divisor (0..65535)
+                              // </h>
+  __IO uint32_t UARTFBRD;     // <h> Fractional Baud Rate
+                              //   <o.0..5> BAUD DIVFRAC: Fractional baud rate divisor (0..63)
+                              // </h>
+  __IO uint32_t UARTLCR_H;    // <h> Line Control
+                              //   <o.8>    SPS: Stick parity select
+                              //   <o.5..6> WLEN: Word length
+                              //     <0=> 5 bits
+                              //     <1=> 6 bits
+                              //     <2=> 7 bits
+                              //     <3=> 8 bits
+                              //   <o.4>    FEN: Enable FIFOs
+                              //   <o.3>    STP2: Two stop bits select
+                              //   <o.2>    EPS: Even parity select
+                              //   <o.1>    PEN: Parity enable
+                              //   <o.0>    BRK: Send break
+                              // </h>
+  __IO uint32_t UARTCR;       // <h> Control
+                              //   <o.15>   CTSEn: CTS hardware flow control enable
+                              //   <o.14>   RTSEn: RTS hardware flow control enable
+                              //   <o.13>   Out2: Complement of Out2 modem status output
+                              //   <o.12>   Out1: Complement of Out1 modem status output
+                              //   <o.11>   RTS: Request to send
+                              //   <o.10>   DTR: Data transmit ready
+                              //   <o.9>    RXE: Receive enable
+                              //   <o.8>    TXE: Transmit enable
+                              //   <o.7>    LBE: Loop-back enable
+                              //   <o.2>    SIRLP: IrDA SIR low power mode
+                              //   <o.1>    SIREN: SIR enable
+                              //   <o.0>    UARTEN: UART enable
+                              // </h>
+  __IO uint32_t UARTIFLS;     // <h> Interrupt FIFO Level Select
+                              //   <o.3..5> RXIFLSEL: Receive interrupt FIFO level select
+                              //     <0=> >= 1/8 full
+                              //     <1=> >= 1/4 full
+                              //     <2=> >= 1/2 full
+                              //     <3=> >= 3/4 full
+                              //     <4=> >= 7/8 full
+                              //     <5=> reserved
+                              //     <6=> reserved
+                              //     <7=> reserved
+                              //   <o.0..2> TXIFLSEL: Transmit interrupt FIFO level select
+                              //     <0=> <= 1/8 full
+                              //     <1=> <= 1/4 full
+                              //     <2=> <= 1/2 full
+                              //     <3=> <= 3/4 full
+                              //     <4=> <= 7/8 full
+                              //     <5=> reserved
+                              //     <6=> reserved
+                              //     <7=> reserved
+                              // </h>
+  __IO uint32_t UARTIMSC;     // <h> Interrupt Mask Set / Clear
+                              //   <o.10>   OEIM: Overrun error interrupt mask
+                              //   <o.9>    BEIM: Break error interrupt mask
+                              //   <o.8>    PEIM: Parity error interrupt mask
+                              //   <o.7>    FEIM: Framing error interrupt mask
+                              //   <o.6>    RTIM: Receive interrupt mask
+                              //   <o.5>    TXIM: Transmit interrupt mask
+                              //   <o.4>    RXIM: Receive interrupt mask
+                              //   <o.3>    DSRMIM: nUARTDSR modem interrupt mask
+                              //   <o.2>    DCDMIM: nUARTDCD modem interrupt mask
+                              //   <o.1>    CTSMIM: nUARTCTS modem interrupt mask
+                              //   <o.0>    RIMIM: nUARTRI modem interrupt mask
+                              // </h>
+  __IO uint32_t UARTRIS;      // <h> Raw Interrupt Status <r>
+                              //   <o.10>   OERIS: Overrun error interrupt status <r>
+                              //   <o.9>    BERIS: Break error interrupt status <r>
+                              //   <o.8>    PERIS: Parity error interrupt status <r>
+                              //   <o.7>    FERIS: Framing error interrupt status <r>
+                              //   <o.6>    RTRIS: Receive timeout interrupt status <r>
+                              //   <o.5>    TXRIS: Transmit interrupt status <r>
+                              //   <o.4>    RXRIS: Receive interrupt status <r>
+                              //   <o.3>    DSRRMIS: nUARTDSR modem interrupt status <r>
+                              //   <o.2>    DCDRMIS: nUARTDCD modem interrupt status <r>
+                              //   <o.1>    CTSRMIS: nUARTCTS modem interrupt status <r>
+                              //   <o.0>    RIRMIS: nUARTRI modem interrupt status <r>
+                              // </h>
+  __IO uint32_t UARTMIS;      // <h> Masked Interrupt Status <r>
+                              //   <o.10>   OEMIS: Overrun error masked interrupt status <r>
+                              //   <o.9>    BEMIS: Break error masked interrupt status <r>
+                              //   <o.8>    PEMIS: Parity error masked interrupt status <r>
+                              //   <o.7>    FEMIS: Framing error masked interrupt status <r>
+                              //   <o.6>    RTMIS: Receive timeout masked interrupt status <r>
+                              //   <o.5>    TXMIS: Transmit masked interrupt status <r>
+                              //   <o.4>    RXMIS: Receive masked interrupt status <r>
+                              //   <o.3>    DSRMMIS: nUARTDSR modem masked interrupt status <r>
+                              //   <o.2>    DCDMMIS: nUARTDCD modem masked interrupt status <r>
+                              //   <o.1>    CTSMMIS: nUARTCTS modem masked interrupt status <r>
+                              //   <o.0>    RIMMIS: nUARTRI modem masked interrupt status <r>
+                              // </h>
+  __O  uint32_t UARTICR;      // <h> Interrupt Clear <w>
+                              //   <o.10>   OEIC: Overrun error interrupt clear <w>
+                              //   <o.9>    BEIC: Break error interrupt clear <w>
+                              //   <o.8>    PEIC: Parity error interrupt clear <w>
+                              //   <o.7>    FEIC: Framing error interrupt clear <w>
+                              //   <o.6>    RTIC: Receive timeout interrupt clear <w>
+                              //   <o.5>    TXIC: Transmit interrupt clear <w>
+                              //   <o.4>    RXIC: Receive interrupt clear <w>
+                              //   <o.3>    DSRMIC: nUARTDSR modem interrupt clear <w>
+                              //   <o.2>    DCDMIC: nUARTDCD modem interrupt clear <w>
+                              //   <o.1>    CTSMIC: nUARTCTS modem interrupt clear <w>
+                              //   <o.0>    RIMIC: nUARTRI modem interrupt clear <w>
+                              // </h>
+  __IO uint32_t UARTDMACR;    // <h> DMA Control
+                              //   <o.2>    DMAONERR: DMA on error
+                              //   <o.1>    TXDMAE: Transmit DMA enable
+                              //   <o.0>    RXDMAE: Receive DMA enable
+                              // </h>
+} PL110_UART_TypeDef;
+
+#define CMSDK_PL110_DATAOVRRUN_Pos            11                                             /*!< CMSDK_PL110 DATAOVRRUN: Data Overrun Position */
+#define CMSDK_PL110_DATAOVRRUN_Msk           (0x1ul << CMSDK_PL110_DATAOVRRUN_Pos)           /*!< CMSDK_PL110 DATAOVRRUN: Data Overrun Mask */
+
+#define CMSDK_PL110_DATABREAKERR_Pos          10                                             /*!< CMSDK_PL110 DATABREAKERR: Data Break Error Position */
+#define CMSDK_PL110_DATABREAKERR_Msk         (0x1ul << CMSDK_PL110_DATABREAKERR_Pos)         /*!< CMSDK_PL110 DATABREAKERR: Data Break Error Mask */
+
+#define CMSDK_PL110_DATAPARITYERR_Pos         9                                              /*!< CMSDK_PL110 DATAPARITYERR: Data Parity Error Position */
+#define CMSDK_PL110_DATAPARITYERR_Msk        (0x1ul << CMSDK_PL110_DATAPARITYERR_Pos)        /*!< CMSDK_PL110 DATAPARITYERR: Data Parity Error Mask */
+
+#define CMSDK_PL110_DATAFRAMEERR_Pos          8                                              /*!< CMSDK_PL110 DATAFRAMEERR: Data Frame Error Position */
+#define CMSDK_PL110_DATAFRAMEERR_Msk         (0x1ul << CMSDK_PL110_DATAFRAMEERR_Pos)         /*!< CMSDK_PL110 DATAFRAMEERR: Data Frame Error Mask */
+
+#define CMSDK_PL110_RECOVRRUN_Pos             3                                              /*!< CMSDK_PL110 RECOVRRUN: Receive Overrun Position */
+#define CMSDK_PL110_RECOVRRUN_Msk            (0x1ul << CMSDK_PL110_RECOVRRUN_Pos)            /*!< CMSDK_PL110 RECOVRRUN: Receive Overrun Mask */
+
+#define CMSDK_PL110_RECBREAKERR_Pos           2                                              /*!< CMSDK_PL110 RECBREAKERR: Receive Break Error Position */
+#define CMSDK_PL110_RECBREAKERR_Msk          (0x1ul << CMSDK_PL110_RECBREAKERR_Pos)          /*!< CMSDK_PL110 RECBREAKERR: Receive Break Error Mask */
+
+#define CMSDK_PL110_RECPARITYERR_Pos          1                                              /*!< CMSDK_PL110 RECPARITYERR: Receive Parity Error Position */
+#define CMSDK_PL110_RECPARITYERR_Msk         (0x1ul << CMSDK_PL110_RECPARITYERR_Pos)         /*!< CMSDK_PL110 RECPARITYERR: Receive Parity Error Mask */
+
+#define CMSDK_PL110_RECFRAMEERR_Pos           0                                              /*!< CMSDK_PL110 RECFRAMEERR: Receive Frame Error Position */
+#define CMSDK_PL110_RECFRAMEERR_Msk          (0x1ul << CMSDK_PL110_RECFRAMEERR_Pos)          /*!< CMSDK_PL110 RECFRAMEERR: Receive Frame Error Mask */
+
+#define CMSDK_PL110_ERRCLROVRRUN_Pos          3                                              /*!< CMSDK_PL110 ERRCLROVRRUN: Clear Overrun Position */
+#define CMSDK_PL110_ERRCLROVRRUN_Msk         (0x1ul << CMSDK_PL110_ERRCLROVRRUN_Pos)         /*!< CMSDK_PL110 ERRCLROVRRUN: Clear Overrun Mask */
+
+#define CMSDK_PL110_ERRCLRBREAKERR_Pos        2                                              /*!< CMSDK_PL110 ERRCLRBREAKERR: Clear Break Error Position */
+#define CMSDK_PL110_ERRCLRBREAKERR_Msk       (0x1ul << CMSDK_PL110_ERRCLRBREAKERR_Pos)       /*!< CMSDK_PL110 ERRCLRBREAKERR: Clear Break Error Mask */
+
+#define CMSDK_PL110_ERRCLRPARITYERR_Pos       1                                              /*!< CMSDK_PL110 ERRCLRPARITYERR: Clear Parity Error Position */
+#define CMSDK_PL110_ERRCLRPARITYERR_Msk      (0x1ul << CMSDK_PL110_ERRCLRPARITYERR_Pos)      /*!< CMSDK_PL110 ERRCLRPARITYERR: Clear Parity Error Mask */
+
+#define CMSDK_PL110_ERRCLRFRAMEERR_Pos        0                                              /*!< CMSDK_PL110 ERRCLRFRAMEERR: Clear Frame Error Position */
+#define CMSDK_PL110_ERRCLRFRAMEERR_Msk       (0x1ul << CMSDK_PL110_ERRCLRFRAMEERR_Pos)       /*!< CMSDK_PL110 ERRCLRFRAMEERR: Clear Frame Error Mask */
+
+#define CMSDK_PL110_FLAG_RINGIND_Pos          8                                              /*!< CMSDK_PL110 FLAG_RINGIND: Ring Indicator Position */
+#define CMSDK_PL110_FLAG_RINGIND_Msk         (0x1ul << CMSDK_PL110_FLAG_RINGIND_Pos)         /*!< CMSDK_PL110 FLAG_RINGIND: Ring Indicator Mask */
+
+#define CMSDK_PL110_FLAG_TXFEMPTY_Pos         7                                              /*!< CMSDK_PL110 FLAG_TXFEMPTY: Transmit FIFO Empty Position */
+#define CMSDK_PL110_FLAG_TXFEMPTY_Msk        (0x1ul << CMSDK_PL110_FLAG_TXFEMPTY_Pos)        /*!< CMSDK_PL110 FLAG_TXFEMPTY: Transmit FIFO Empty Mask */
+
+#define CMSDK_PL110_FLAG_RXFFULL_Pos          6                                              /*!< CMSDK_PL110 FLAG_RXFFULL: Receive FIFO Full Position */
+#define CMSDK_PL110_FLAG_RXFFULL_Msk         (0x1ul << CMSDK_PL110_FLAG_RXFFULL_Pos)         /*!< CMSDK_PL110 FLAG_RXFFULL: Receive FIFO Full Mask */
+
+#define CMSDK_PL110_FLAG_TXFFULL_Pos          5                                              /*!< CMSDK_PL110 FLAG_TXFFULL: Transmit FIFO Full Position */
+#define CMSDK_PL110_FLAG_TXFFULL_Msk         (0x1ul << CMSDK_PL110_FLAG_TXFFULL_Pos)         /*!< CMSDK_PL110 FLAG_TXFFULL: Transmit FIFO Full Mask */
+
+#define CMSDK_PL110_FLAG_RXFEMPTY_Pos         4                                              /*!< CMSDK_PL110 FLAG_RXFEMPTY: Receive FIFO Empty Position */
+#define CMSDK_PL110_FLAG_RXFEMPTY_Msk        (0x1ul << CMSDK_PL110_FLAG_RXFEMPTY_Pos)        /*!< CMSDK_PL110 FLAG_RXFEMPTY: Receive FIFO Empty Mask */
+
+#define CMSDK_PL110_FLAG_UARTBUSY_Pos         3                                              /*!< CMSDK_PL110 FLAG_UARTBUSY: UART Busy Position */
+#define CMSDK_PL110_FLAG_UARTBUSY_Msk        (0x1ul << CMSDK_PL110_FLAG_UARTBUSY_Pos)        /*!< CMSDK_PL110 FLAG_UARTBUSY: UART Busy Mask */
+
+#define CMSDK_PL110_FLAG_CARRIERDETECT_Pos    2                                              /*!< CMSDK_PL110 FLAG_CARRIERDETECT: Carrier Detect Position */
+#define CMSDK_PL110_FLAG_CARRIERDETECT_Msk   (0x1ul << CMSDK_PL110_FLAG_CARRIERDETECT_Pos)   /*!< CMSDK_PL110 FLAG_CARRIERDETECT: Carrier Detect Mask */
+
+#define CMSDK_PL110_FLAG_DATASETREADY_Pos     1                                              /*!< CMSDK_PL110 FLAG_DATASETREADY: Data Set Ready Position */
+#define CMSDK_PL110_FLAG_DATASETREADY_Msk    (0x1ul << CMSDK_PL110_FLAG_DATASETREADY_Pos)    /*!< CMSDK_PL110 FLAG_DATASETREADY: Data Set Ready Mask */
+
+#define CMSDK_PL110_FLAG_CLR2SEND_Pos         0                                              /*!< CMSDK_PL110 FLAG_CLR2SEND: Clear To Send Position */
+#define CMSDK_PL110_FLAG_CLR2SEND_Msk        (0x1ul << CMSDK_PL110_FLAG_CLR2SEND_Pos)        /*!< CMSDK_PL110 FLAG_CLR2SEND: Clear To Send Mask */
+
+#define CMSDK_PL110_IRDALOWPOWERCOUNT_Pos    0                                               /*!< CMSDK_PL110 IRDALOWPOWERCOUNT: IrDA 8-bit low-power divisor value Position */
+#define CMSDK_PL110_IRDALOWPOWERCOUNT_Msk    (0xFFul << CMSDK_PL110_IRDALOWPOWERCOUNT_Pos)   /*!< CMSDK_PL110 IRDALOWPOWERCOUNT: IrDA 8-bit low-power divisor value Mask */
+
+#define CMSDK_PL110_INTDIVIDER_Pos           0                                               /*!< CMSDK_PL110 INTDIVIDER: Integer Divider Position */
+#define CMSDK_PL110_INTDIVIDER_Msk           (0xFFFFul << CMSDK_PL110_INTDIVIDER_Pos)        /*!< CMSDK_PL110 INTDIVIDER: Integer Divider Mask */
+
+#define CMSDK_PL110_FRACTDIVIDER_Pos         0                                               /*!< CMSDK_PL110 FRACTDIVIDER: Fractional Divider Position */
+#define CMSDK_PL110_FRACTDIVIDER_Msk         (0x3Ful << CMSDK_PL110_FRACTDIVIDER_Pos)        /*!< CMSDK_PL110 FRACTDIVIDER: Fractional Divider Mask */
+
+#define CMSDK_PL110_STICKPARITYSEL_Pos       8                                               /*!< CMSDK_PL110 STICKPARITYSEL: Stick parity select Position */
+#define CMSDK_PL110_STICKPARITYSEL_Msk       (0x1ul << CMSDK_PL110_STICKPARITYSEL_Pos)       /*!< CMSDK_PL110 STICKPARITYSEL: Stick parity select Mask */
+
+#define CMSDK_PL110_WORDLEN_Pos              5                                               /*!< CMSDK_PL110 WORDLEN: Word Length Select Position */
+#define CMSDK_PL110_WORDLEN_Msk              (0x3ul << CMSDK_PL110_WORDLEN_Pos)              /*!< CMSDK_PL110 WORDLEN: Word Length Select Mask */
+
+#define CMSDK_PL110_ENFIFOS_Pos              4                                               /*!< CMSDK_PL110 ENFIFOS: Enable FIFOs Position */
+#define CMSDK_PL110_ENFIFOS_Msk              (0x1ul << CMSDK_PL110_ENFIFOS_Pos)              /*!< CMSDK_PL110 ENFIFOS: Enable FIFOs Mask */
+
+#define CMSDK_PL110_2STOPBITS_Pos            3                                               /*!< CMSDK_PL110 2STOPBITS: Two Stop Bits Select Position */
+#define CMSDK_PL110_2STOPBITS_Msk            (0x1ul << CMSDK_PL110_2STOPBITS_Pos)            /*!< CMSDK_PL110 2STOPBITS: Two Stop Bits Select Mask */
+
+#define CMSDK_PL110_EVENPARITY_Pos           2                                               /*!< CMSDK_PL110 EVENPARITY: Even Parity Select Position */
+#define CMSDK_PL110_EVENPARITY_Msk           (0x1ul << CMSDK_PL110_EVENPARITY_Pos)           /*!< CMSDK_PL110 EVENPARITY: Even Parity Select Mask */
+
+#define CMSDK_PL110_PARITYEN_Pos             1                                               /*!< CMSDK_PL110 PARITYEN: Parity Enable Position */
+#define CMSDK_PL110_PARITYEN_Msk             (0x1ul << CMSDK_PL110_PARITYEN_Pos)             /*!< CMSDK_PL110 PARITYEN: Parity Enable Mask */
+
+#define CMSDK_PL110_SENDBREAK_Pos            0                                               /*!< CMSDK_PL110 SENDBREAK: Send Break Position */
+#define CMSDK_PL110_SENDBREAK_Msk            (0x1ul << CMSDK_PL110_SENDBREAK_Pos)            /*!< CMSDK_PL110 SENDBREAK: Send Break Mask */
+
+#define CMSDK_PL110_CTS_FLOWCTRL_Pos         15                                              /*!< CMSDK_PL110 CTS_FLOWCTRL: Enable CTS Flow Control Position */
+#define CMSDK_PL110_CTS_FLOWCTRL_Msk         (0x1ul << CMSDK_PL110_CTS_FLOWCTRL_Pos)         /*!< CMSDK_PL110 CTS_FLOWCTRL: Enable CTS Flow Control Mask */
+
+#define CMSDK_PL110_RTS_FLOWCTRL_Pos         14                                              /*!< CMSDK_PL110 RTS_FLOWCTRL: Enable RTS Flow Control Position */
+#define CMSDK_PL110_RTS_FLOWCTRL_Msk         (0x1ul << CMSDK_PL110_RTS_FLOWCTRL_Pos)         /*!< CMSDK_PL110 RTS_FLOWCTRL: Enable RTS Flow Control Mask */
+
+#define CMSDK_PL110_OUT2_Pos                 13                                              /*!< CMSDK_PL110 OUT2: Complement of Out2 modem status output Position */
+#define CMSDK_PL110_OUT2_Msk                 (0x1ul << CMSDK_PL110_OUT2_Pos)                 /*!< CMSDK_PL110 OUT2: Complement of Out2 modem status output Mask */
+
+#define CMSDK_PL110_OUT1_Pos                 12                                              /*!< CMSDK_PL110 OUT1: Complement of Out1 modem status output Position */
+#define CMSDK_PL110_OUT1_Msk                 (0x1ul << CMSDK_PL110_OUT1_Pos)                 /*!< CMSDK_PL110 OUT1: Complement of Out1 modem status output Mask */
+
+#define CMSDK_PL110_REQ2SEND_Pos             11                                              /*!< CMSDK_PL110 REQ2SEND: Request To Send Position */
+#define CMSDK_PL110_REQ2SEND_Msk             (0x1ul << CMSDK_PL110_REQ2SEND_Pos)             /*!< CMSDK_PL110 REQ2SEND: Request To Send Mask */
+
+#define CMSDK_PL110_DATATRANSREADY_Pos       10                                              /*!< CMSDK_PL110 DATATRANSREADY: Transmit Ready Position */
+#define CMSDK_PL110_DATATRANSREADY_Msk       (0x1ul << CMSDK_PL110_DATATRANSREADY_Pos)       /*!< CMSDK_PL110 DATATRANSREADY: Transmit Ready Mask */
+
+#define CMSDK_PL110_RXEN_Pos                 9                                               /*!< CMSDK_PL110 RXEN: Receive Enable Position */
+#define CMSDK_PL110_RXEN_Msk                 (0x1ul << CMSDK_PL110_RXEN_Pos)                 /*!< CMSDK_PL110 RXEN: Receive Enable Mask */
+
+#define CMSDK_PL110_TXEN_Pos                 8                                               /*!< CMSDK_PL110 TXEN: Transmit Enable Position */
+#define CMSDK_PL110_TXEN_Msk                 (0x1ul << CMSDK_PL110_TXEN_Pos)                 /*!< CMSDK_PL110 TXEN: Transmit Enable Mask */
+
+#define CMSDK_PL110_LOOPBACKEN_Pos           7                                               /*!< CMSDK_PL110 LOOPBACKEN: Loopback Enable Position */
+#define CMSDK_PL110_LOOPBACKEN_Msk           (0x1ul << CMSDK_PL110_LOOPBACKEN_Pos)           /*!< CMSDK_PL110 LOOPBACKEN: Loopback Enable Mask */
+
+#define CMSDK_PL110_IRDASIRLPM_Pos           2                                               /*!< CMSDK_PL110 IRDASIRLPM: IRDA SIR Low Power Position */
+#define CMSDK_PL110_IRDASIRLPM_Msk           (0x1ul << CMSDK_PL110_IRDASIRLPM_Pos)           /*!< CMSDK_PL110 IRDASIRLPM: IRDA SIR Low Power Mask */
+
+#define CMSDK_PL110_SIREN_Pos                1                                               /*!< CMSDK_PL110 SIREN: SIR Enable Position */
+#define CMSDK_PL110_SIREN_Msk                (0x1ul << CMSDK_PL110_SIREN_Pos)                /*!< CMSDK_PL110 SIREN: SIR Enable Mask */
+
+#define CMSDK_PL110_UARTEN_Pos               0                                               /*!< CMSDK_PL110 UARTEN: UART Enable Position */
+#define CMSDK_PL110_UARTEN_Msk               (0x1ul << CMSDK_PL110_UARTEN_Pos)               /*!< CMSDK_PL110 UARTEN: UART Enable Mask */
+
+#define CMSDK_PL110_RECINTFIFOLEVEL_Pos           3                                                         /*!< CMSDK_PL110 RECINTFIFOLEVEL: Set Receive Int FIFO Level Position */
+#define CMSDK_PL110_RECINTFIFOLEVEL_Msk           (0x7ul << CMSDK_PL110_RECINTFIFOLEVEL_Pos)                /*!< CMSDK_PL110 RECINTFIFOLEVEL: Set Receive Int FIFO Level Mask */
+
+#define CMSDK_PL110_TRANSINTFIFOLEVEL_Pos         0                                                         /*!< CMSDK_PL110 TRANSINTFIFOLEVEL: Set Transmit Int FIFO Level Position */
+#define CMSDK_PL110_TRANSINTFIFOLEVEL_Msk         (0x7ul << CMSDK_PL110_TRANSINTFIFOLEVEL_Pos)              /*!< CMSDK_PL110 TRANSINTFIFOLEVEL: Set Transmit Int FIFO Level Mask */
+
+#define CMSDK_PL110_SETMASK_OVRRUNERRINT_Pos      10                                                        /*!< CMSDK_PL110 SETMASK_OVRRUNERRINT: Set Overrun Error Int Mask Position */
+#define CMSDK_PL110_SETMASK_OVRRUNERRINT_Msk      (0x1ul << CMSDK_PL110_SETMASK_OVRRUNERRINT_Pos)           /*!< CMSDK_PL110 SETMASK_OVRRUNERRINT: Set Overrun Error Int Mask Mask */
+
+#define CMSDK_PL110_SETMASK_BREAKERRINT_Pos       9                                                         /*!< CMSDK_PL110 SETMASK_BREAKERRINT: Set Break Error Int Mask Position */
+#define CMSDK_PL110_SETMASK_BREAKERRINT_Msk       (0x1ul << CMSDK_PL110_SETMASK_BREAKERRINT_Pos)            /*!< CMSDK_PL110 SETMASK_BREAKERRINT: Set Break Error Int Mask Mask */
+
+#define CMSDK_PL110_SETMASK_PARITYERRINT_Pos      8                                                         /*!< CMSDK_PL110 SETMASK_PARITYERRINT: Set Parity Error Int Mask Position */
+#define CMSDK_PL110_SETMASK_PARITYERRINT_Msk      (0x1ul << CMSDK_PL110_SETMASK_PARITYERRINT_Pos)           /*!< CMSDK_PL110 SETMASK_PARITYERRINT: Set Parity Error Int Mask Mask */
+
+#define CMSDK_PL110_SETMASK_FRAMEERRINT_Pos       7                                                         /*!< CMSDK_PL110 SETMASK_FRAMEERRINT: Set Frame Error Int Mask Position */
+#define CMSDK_PL110_SETMASK_FRAMEERRINT_Msk       (0x1ul << CMSDK_PL110_SETMASK_FRAMEERRINT_Pos)            /*!< CMSDK_PL110 SETMASK_FRAMEERRINT: Set Frame Error Int Mask Mask */
+
+#define CMSDK_PL110_SETMASK_RECTRANSINT_Pos       6                                                         /*!< CMSDK_PL110 SETMASK_RECTRANSINT: Set Transmit Receive Comb Int Mask Position */
+#define CMSDK_PL110_SETMASK_RECTRANSINT_Msk       (0x1ul << CMSDK_PL110_SETMASK_RECTRANSINT_Pos)            /*!< CMSDK_PL110 SETMASK_RECTRANSINT: Set Transmit Receive Comb Int Mask Mask */
+
+#define CMSDK_PL110_SETMASK_TRANSINT_Pos          5                                                         /*!< CMSDK_PL110 SETMASK_TRANSINT: Set Transmit Int Mask Position */
+#define CMSDK_PL110_SETMASK_TRANSINT_Msk         (0x1ul << CMSDK_PL110_SETMASK_TRANSINT_Pos)                /*!< CMSDK_PL110 SETMASK_TRANSINT: Set Transmit Int Mask Mask */
+
+#define CMSDK_PL110_SETMASK_RECINT_Pos            4                                                         /*!< CMSDK_PL110 SETMASK_RECINT: Set Receive Int Mask Position */
+#define CMSDK_PL110_SETMASK_RECINT_Msk            (0x1ul << CMSDK_PL110_SETMASK_RECINT_Pos)                 /*!< CMSDK_PL110 SETMASK_RECINT: Set Receive Int Mask Mask */
+
+#define CMSDK_PL110_SETMASK_UART_DSRMODINT_Pos    3                                                         /*!< CMSDK_PL110 SETMASK_UART_DSRMODINT: Set Data Set Ready Modem Int Mask Position */
+#define CMSDK_PL110_SETMASK_UART_DSRMODINT_Msk    (0x1ul << CMSDK_PL110_SETMASK_UARTD_SRMODINT_Pos)         /*!< CMSDK_PL110 SETMASK_UART_DSRMODINT: Set Data Set Ready Modem Int Mask Mask */
+
+#define CMSDK_PL110_SETMASK_UART_DCDMODINT_Pos    2                                                         /*!< CMSDK_PL110 SETMASK_UART_DCDMODINT: Set Data Carrier Detect Modem Int Mask Position */
+#define CMSDK_PL110_SETMASK_UART_DCDMODINT_Msk    (0x1ul << CMSDK_PL110_SETMASK_UART_DCDMODINT_Pos)         /*!< CMSDK_PL110 SETMASK_UART_DCDMODINT: Set Data Carrier Detect Modem Int Mask Mask */
+
+#define CMSDK_PL110_SETMASK_UART_CTSMODINT_Pos    1                                                         /*!< CMSDK_PL110 SETMASK_UART_CTSMODINT: Set Clear To Send Modem Int Mask Position */
+#define CMSDK_PL110_SETMASK_UART_CTSMODINT_Msk    (0x1ul << CMSDK_PL110_SETMASK_UART_CTSMODINT_Pos)         /*!< CMSDK_PL110 SETMASK_UART_CTSMODINT: Set Clear To Send Modem Int Mask Mask */
+
+#define CMSDK_PL110_SETMASK_UART_RIMODINT_Pos     0                                                         /*!< CMSDK_PL110 SETMASK_UART_RIMODINT: Set nUARTRI Modem Int Mask Position */
+#define CMSDK_PL110_SETMASK_UART_RIMODINT_Msk     (0x1ul << CMSDK_PL110_SETMASK_UART_RIMODINT_Pos)          /*!< CMSDK_PL110 SETMASK_UART_RIMODINT: Set nUARTRI Modem Int Mask Mask */
+
+#define CMSDK_PL110_RAWINTSTAT_OVRRUNERRINT_Pos      10                                                     /*!< CMSDK_PL110 RAWINTSTAT_OVRRUNERRINT: Raw Overrun Error Int Status Mask Position */
+#define CMSDK_PL110_RAWINTSTAT_OVRRUNERRINT_Msk      (0x1ul << CMSDK_PL110_RAWINTSTAT_OVRRUNERRINT_Pos)     /*!< CMSDK_PL110 RAWINTSTAT_OVRRUNERRINT: Raw Overrun Error Int Status  Mask */
+
+#define CMSDK_PL110_RAWINTSTAT_BREAKERRINT_Pos       9                                                      /*!< CMSDK_PL110 RAWINTSTAT_BREAKERRINT: Raw Break Error Int Status Mask Position */
+#define CMSDK_PL110_RAWINTSTAT_BREAKERRINT_Msk       (0x1ul << CMSDK_PL110_RAWINTSTAT_BREAKERRINT_Pos)      /*!< CMSDK_PL110 RAWINTSTAT_BREAKERRINT: Raw Break Error Int Status  Mask */
+
+#define CMSDK_PL110_RAWINTSTAT_PARITYERRINT_Pos      8                                                      /*!< CMSDK_PL110 RAWINTSTAT_PARITYERRINT: Raw Parity Error Int Status Mask Position */
+#define CMSDK_PL110_RAWINTSTAT_PARITYERRINT_Msk      (0x1ul << CMSDK_PL110_RAWINTSTAT_PARITYERRINT_Pos)     /*!< CMSDK_PL110 RAWINTSTAT_PARITYERRINT: Raw Parity Error Int Status  Mask */
+
+#define CMSDK_PL110_RAWINTSTAT_FRAMEERRINT_Pos       7                                                      /*!< CMSDK_PL110 RAWINTSTAT_FRAMEERRINT: Raw Frame Error Int Status Mask Position */
+#define CMSDK_PL110_RAWINTSTAT_FRAMEERRINT_Msk       (0x1ul << CMSDK_PL110_RAWINTSTAT_FRAMEERRINT_Pos)      /*!< CMSDK_PL110 RAWINTSTAT_FRAMEERRINT: Raw Frame Error Int Status Mask */
+
+#define CMSDK_PL110_RAWINTSTAT_RECTRANSINT_Pos       6                                                      /*!< CMSDK_PL110 RAWINTSTAT_RECTRANSINT: Raw Transmit Receive Comb Int Status Position */
+#define CMSDK_PL110_RAWINTSTAT_RECTRANSINT_Msk       (0x1ul << CMSDK_PL110_RAWINTSTAT_RECTRANSINT_Pos)      /*!< CMSDK_PL110 RAWINTSTAT_RECTRANSINT: Raw Transmit Receive Comb Int Status Mask */
+
+#define CMSDK_PL110_RAWINTSTAT_TRANSINT_Pos          5                                                      /*!< CMSDK_PL110 RAWINTSTAT_TRANSINT: Raw Transmit Int Status Position */
+#define CMSDK_PL110_RAWINTSTAT_TRANSINT_Msk         (0x1ul << CMSDK_PL110_RAWINTSTAT_TRANSINT_Pos)          /*!< CMSDK_PL110 RAWINTSTAT_TRANSINT: Raw Transmit Int Status Mask */
+
+#define CMSDK_PL110_RAWINTSTAT_RECINT_Pos            4                                                      /*!< CMSDK_PL110 RAWINTSTAT_RECINT: Raw Receive Int Status Position */
+#define CMSDK_PL110_RAWINTSTAT_RECINT_Msk            (0x1ul << CMSDK_PL110_RAWINTSTAT_RECINT_Pos)           /*!< CMSDK_PL110 RAWINTSTAT_RECINT: Raw Receive Int Status Mask */
+
+#define CMSDK_PL110_RAWINTSTAT_UART_DSRMODINT_Pos    3                                                      /*!< CMSDK_PL110 RAWINTSTAT_UART_DSRMODINT: Raw Data Set Ready Int Status Position */
+#define CMSDK_PL110_RAWINTSTAT_UART_DSRMODINT_Msk    (0x1ul << CMSDK_PL110_RAWINTSTAT_UARTD_SRMODINT_Pos)   /*!< CMSDK_PL110 RAWINTSTAT_UARTD_SRMODINT: Raw Data Set Ready Int Status Mask */
+
+#define CMSDK_PL110_RAWINTSTAT_UART_DCDMODINT_Pos    2                                                      /*!< CMSDK_PL110 RAWINTSTAT_UART_DCDMODINT: Raw Data Carrier Detect Int Status Position */
+#define CMSDK_PL110_RAWINTSTAT_UART_DCDMODINT_Msk    (0x1ul << CMSDK_PL110_RAWINTSTAT_UART_DCDMODINT_Pos)   /*!< CMSDK_PL110 RAWINTSTAT_UART_DCDMODINT: Raw Data Carrier Detect Int Status Mask */
+
+#define CMSDK_PL110_RAWINTSTAT_UART_CTSMODINT_Pos    1                                                      /*!< CMSDK_PL110 RAWINTSTAT_UART_CTSMODINT: Raw Clear To Send Int Status Position */
+#define CMSDK_PL110_RAWINTSTAT_UART_CTSMODINT_Msk    (0x1ul << CMSDK_PL110_RAWINTSTAT_UART_CTSMODINT_Pos)   /*!< CMSDK_PL110 RAWINTSTAT_UART_CTSMODINT: Raw Clear To Send Int Status Mask */
+
+#define CMSDK_PL110_RAWINTSTAT_UART_RIMODINT_Pos     0                                                      /*!< CMSDK_PL110 RAWINTSTAT_UART_RIMODINT: Raw nUARTRI Modem Int Status Position */
+#define CMSDK_PL110_RAWINTSTAT_UART_RIMODINT_Msk     (0x1ul << CMSDK_PL110_RAWINTSTAT_UART_RIMODINT_Pos)    /*!< CMSDK_PL110 RAWINTSTAT_UART_RIMODINT: Raw nUARTRI Modem Int Status Mask */
+
+#define CMSDK_PL110_MSKINTSTAT_OVRRUNERRINT_Pos      10                                                     /*!< CMSDK_PL110 MSKINTSTAT_OVRRUNERRINT: Masked Overrun Error Int Status Position */
+#define CMSDK_PL110_MSKINTSTAT_OVRRUNERRINT_Msk      (0x1ul << CMSDK_PL110_MSKINTSTAT_OVRRUNERRINT_Pos)     /*!< CMSDK_PL110 MSKINTSTAT_OVRRUNERRINT: Masked Overrun Error Int Status Mask */
+
+#define CMSDK_PL110_MSKINTSTAT_BREAKERRINT_Pos       9                                                      /*!< CMSDK_PL110 MSKINTSTAT_BREAKERRINT: Masked Break Error Int Status Position */
+#define CMSDK_PL110_MSKINTSTAT_BREAKERRINT_Msk       (0x1ul << CMSDK_PL110_MSKINTSTAT_BREAKERRINT_Pos)      /*!< CMSDK_PL110 MSKINTSTAT_BREAKERRINT: Masked Break Error Int Status Mask */
+
+#define CMSDK_PL110_MSKINTSTAT_PARITYERRINT_Pos      8                                                      /*!< CMSDK_PL110 MSKINTSTAT_PARITYERRINT: Masked Parity Error Int Status Position */
+#define CMSDK_PL110_MSKINTSTAT_PARITYERRINT_Msk      (0x1ul << CMSDK_PL110_MSKINTSTAT_PARITYERRINT_Pos)     /*!< CMSDK_PL110 MSKINTSTAT_PARITYERRINT: Masked Parity Error Int Status Mask */
+
+#define CMSDK_PL110_MSKINTSTAT_FRAMEERRINT_Pos       7                                                      /*!< CMSDK_PL110 MSKINTSTAT_FRAMEERRINT: Masked Frame Error Int Status Position */
+#define CMSDK_PL110_MSKINTSTAT_FRAMEERRINT_Msk       (0x1ul << CMSDK_PL110_MSKINTSTAT_FRAMEERRINT_Pos)      /*!< CMSDK_PL110 MSKINTSTAT_FRAMEERRINT: Masked Frame Error Int Status Mask */
+
+#define CMSDK_PL110_MSKINTSTAT_RECTRANSINT_Pos       6                                                      /*!< CMSDK_PL110 MSKINTSTAT_RECTRANSINT: Masked Transmit Receive Comb Int Status Position */
+#define CMSDK_PL110_MSKINTSTAT_RECTRANSINT_Msk       (0x1ul << CMSDK_PL110_MSKINTSTAT_RECTRANSINT_Pos)      /*!< CMSDK_PL110 MSKINTSTAT_RECTRANSINT: Masked Transmit Receive Comb Int Status Mask */
+
+#define CMSDK_PL110_MSKINTSTAT_TRANSINT_Pos          5                                                      /*!< CMSDK_PL110 MSKINTSTAT_TRANSINT: Masked Transmit Int Status Position */
+#define CMSDK_PL110_MSKINTSTAT_TRANSINT_Msk         (0x1ul << CMSDK_PL110_MSKINTSTAT_TRANSINT_Pos)          /*!< CMSDK_PL110 MSKINTSTAT_TRANSINT: Masked Transmit Int Status Mask */
+
+#define CMSDK_PL110_MSKINTSTAT_RECINT_Pos            4                                                      /*!< CMSDK_PL110 MSKINTSTAT_RECINT: Masked Receive Int Status Position */
+#define CMSDK_PL110_MSKINTSTAT_RECINT_Msk            (0x1ul << CMSDK_PL110_MSKINTSTAT_RECINT_Pos)           /*!< CMSDK_PL110 MSKINTSTAT_RECINT: Masked Receive Int Status Mask */
+
+#define CMSDK_PL110_MSKINTSTAT_UART_DSRMODINT_Pos    3                                                      /*!< CMSDK_PL110 MSKINTSTAT_UART_DSRMODINT: Masked Data Set Ready Int Status Position */
+#define CMSDK_PL110_MSKINTSTAT_UART_DSRMODINT_Msk    (0x1ul << CMSDK_PL110_MSKINTSTAT_UARTD_SRMODINT_Pos)   /*!< CMSDK_PL110 MSKINTSTAT_UART_DSRMODINT: Masked Data Set Ready Int Status Mask */
+
+#define CMSDK_PL110_MSKINTSTAT_UART_DCDMODINT_Pos    2                                                      /*!< CMSDK_PL110 MSKINTSTAT_UART_DCDMODINT: Masked Data Carrier Detect Int Status Position */
+#define CMSDK_PL110_MSKINTSTAT_UART_DCDMODINT_Msk    (0x1ul << CMSDK_PL110_MSKINTSTAT_UART_DCDMODINT_Pos)   /*!< CMSDK_PL110 MSKINTSTAT_UART_DCDMODINT: Masked Data Carrier Detect Int Status Mask */
+
+#define CMSDK_PL110_MSKINTSTAT_UART_CTSMODINT_Pos    1                                                      /*!< CMSDK_PL110 MSKINTSTAT_UART_CTSMODINT: Masked Clear To Send Int Status Position */
+#define CMSDK_PL110_MSKINTSTAT_UART_CTSMODINT_Msk    (0x1ul << CMSDK_PL110_MSKINTSTAT_UART_CTSMODINT_Pos)   /*!< CMSDK_PL110 MSKINTSTAT_UART_CTSMODINT: Masked Clear To Send Int Status Mask */
+
+#define CMSDK_PL110_MSKINTSTAT_UART_RIMODINT_Pos     0                                                      /*!< CMSDK_PL110 MSKINTSTAT_UART_RIMODINT: Masked nUARTRI Modem Int Status Position */
+#define CMSDK_PL110_MSKINTSTAT_UART_RIMODINT_Msk     (0x1ul << CMSDK_PL110_MSKINTSTAT_UART_RIMODINT_Pos)    /*!< CMSDK_PL110 MSKINTSTAT_UART_RIMODINT: Masked nUARTRI Modem Int Status Mask */
+
+#define CMSDK_PL110_INTCLR_OVRRUNERRINT_Pos      10                                                  /*!< CMSDK_PL110 INTCLR_OVRRUNERRINT: Clear Overrun Error Int Position */
+#define CMSDK_PL110_INTCLR_OVRRUNERRINT_Msk      (0x1ul << CMSDK_PL110_INTCLR_OVRRUNERRINT_Pos)      /*!< CMSDK_PL110 INTCLR_OVRRUNERRINT: Clear Overrun Error Int Mask */
+
+#define CMSDK_PL110_INTCLR_BREAKERRINT_Pos       9                                                   /*!< CMSDK_PL110 INTCLR_BREAKERRINT: Clear Break Error Int Position */
+#define CMSDK_PL110_INTCLR_BREAKERRINT_Msk       (0x1ul << CMSDK_PL110_INTCLR_BREAKERRINT_Pos)       /*!< CMSDK_PL110 INTCLR_BREAKERRINT: Clear Break Error Int Mask */
+
+#define CMSDK_PL110_INTCLR_PARITYERRINT_Pos      8                                                   /*!< CMSDK_PL110 INTCLR_PARITYERRINT: Clear Parity Error Int Position */
+#define CMSDK_PL110_INTCLR_PARITYERRINT_Msk      (0x1ul << CMSDK_PL110_INTCLR_PARITYERRINT_Pos)      /*!< CMSDK_PL110 INTCLR_PARITYERRINT: Clear Parity Error Int Mask */
+
+#define CMSDK_PL110_INTCLR_FRAMEERRINT_Pos       7                                                   /*!< CMSDK_PL110 INTCLR_FRAMEERRINT: Clear Frame Error Int Position */
+#define CMSDK_PL110_INTCLR_FRAMEERRINT_Msk       (0x1ul << CMSDK_PL110_INTCLR_FRAMEERRINT_Pos)       /*!< CMSDK_PL110 INTCLR_FRAMEERRINT: Clear Frame Error Int Mask */
+
+#define CMSDK_PL110_INTCLR_RECTRANSINT_Pos       6                                                   /*!< CMSDK_PL110 INTCLR_RECTRANSINT: Clear Receive Transmit Comb Int Position */
+#define CMSDK_PL110_INTCLR_RECTRANSINT_Msk       (0x1ul << CMSDK_PL110_INTCLR_RECTRANSINT_Pos)       /*!< CMSDK_PL110 INTCLR_RECTRANSINT: Clear Receive Transmit Comb Int Mask */
+
+#define CMSDK_PL110_INTCLR_TRANSINT_Pos          5                                                   /*!< CMSDK_PL110 INTCLR_TRANSINT: Clear Transmit Int Position */
+#define CMSDK_PL110_INTCLR_TRANSINT_Msk          (0x1ul << CMSDK_PL110_INTCLR_TRANSINT_Pos)          /*!< CMSDK_PL110 INTCLR_TRANSINT: Clear Transmit Int Mask */
+
+#define CMSDK_PL110_INTCLR_RECINT_Pos            4                                                   /*!< CMSDK_PL110 INTCLR_RECINT: Clear Receive Int Position */
+#define CMSDK_PL110_INTCLR_RECINT_Msk            (0x1ul << CMSDK_PL110_INTCLR_RECINT_Pos)            /*!< CMSDK_PL110 INTCLR_RECINT: Clear Receive Int Mask */
+
+#define CMSDK_PL110_INTCLR_UART_DSRMODINT_Pos    3                                                   /*!< CMSDK_PL110 INTCLR_UART_DSRMODINT: Clear Data Carrier Detect Int Position */
+#define CMSDK_PL110_INTCLR_UART_DSRMODINT_Msk    (0x1ul << CMSDK_PL110_INTCLR_UARTD_SRMODINT_Pos)    /*!< CMSDK_PL110 INTCLR_UARTD_SRMODINT: Clear Data Carrier Detect Int Mask */
+
+#define CMSDK_PL110_INTCLR_UART_DCDMODINT_Pos    2                                                   /*!< CMSDK_PL110 INTCLR_UART_DCDMODINT: Clear Data Set Ready Int Position */
+#define CMSDK_PL110_INTCLR_UART_DCDMODINT_Msk    (0x1ul << CMSDK_PL110_INTCLR_UART_DCDMODINT_Pos)    /*!< CMSDK_PL110 INTCLR_UART_DCDMODINT: Clear Data Set Ready Int Mask */
+
+#define CMSDK_PL110_INTCLR_UART_CTSMODINT_Pos    1                                                   /*!< CMSDK_PL110 INTCLR_UART_CTSMODINT: Clear Clear To Sent Int Position */
+#define CMSDK_PL110_INTCLR_UART_CTSMODINT_Msk    (0x1ul << CMSDK_PL110_INTCLR_UART_CTSMODINT_Pos)    /*!< CMSDK_PL110 INTCLR_UART_CTSMODINT: Clear Clear To Sent Int Mask */
+
+#define CMSDK_PL110_INTCLR_UART_RIMODINT_Pos     0                                                   /*!< CMSDK_PL110 INTCLR_UART_RIMODINT: Clear nUARTRI Modem Int Position */
+#define CMSDK_PL110_INTCLR_UART_RIMODINT_Msk     (0x1ul << CMSDK_PL110_INTCLR_UART_RIMODINT_Pos)     /*!< CMSDK_PL110 INTCLR_UART_RIMODINT: Clear nUARTRI Modem Int Mask */
+
+#define CMSDK_PL110_DMA_ERR_Pos                  2                                                   /*!< CMSDK_PL110 DMA_ERR: DMA Error Position */
+#define CMSDK_PL110_DMA_ERR_Msk                  (0x1ul << CMSDK_PL110_DMA_ERR_Pos)                  /*!< CMSDK_PL110 DMA_ERR: DMA Error Mask */
+
+#define CMSDK_PL110_DMA_TRANS_EN_Pos             1                                                   /*!< CMSDK_PL110 DMA_TRANS_EN: DMA Transmit Error Position */
+#define CMSDK_PL110_DMA_TRANS_EN_Msk             (0x1ul << CMSDK_PL110_DMA_TRANS_EN_Pos)             /*!< CMSDK_PL110 DMA_TRANS_EN: DMA Transmit Error Mask */
+
+#define CMSDK_PL110_DMA_REC_EN_Pos               0                                                   /*!< CMSDK_PL110 DMA_REC_EN: DMA Receive Error Position */
+#define CMSDK_PL110_DMA_REC_EN_Msk               (0x1ul << CMSDK_PL110_DMA_REC_EN_Pos)               /*!< CMSDK_PL110 DMA_REC_EN: DMA Receive Error Mask */
+
+
+/*@}*/ /* end of group  CMSDK_PL110 */
+
+/*------------------- Watchdog ----------------------------------------------*/
+/** @addtogroup CMSDK_Watchdog CMSDK Watchdog
+  @{
+*/
+typedef struct
+{
+
+  __IO    uint32_t  LOAD;          // <h> Watchdog Load Register </h>
+  __I     uint32_t  VALUE;         // <h> Watchdog Value Register </h>
+  __IO    uint32_t  CTRL;          // <h> Watchdog Control Register
+                                   //   <o.1>    RESEN: Reset enable
+                                   //   <o.0>    INTEN: Interrupt enable
+                                   // </h>
+  __O     uint32_t  INTCLR;        // <h> Watchdog Clear Interrupt Register </h>
+  __I     uint32_t  RAWINTSTAT;    // <h> Watchdog Raw Interrupt Status Register </h>
+  __I     uint32_t  MASKINTSTAT;   // <h> Watchdog Interrupt Status Register </h>
+        uint32_t  RESERVED0[762];
+  __IO    uint32_t  LOCK;          // <h> Watchdog Lock Register </h>
+        uint32_t  RESERVED1[191];
+  __IO    uint32_t  ITCR;          // <h> Watchdog Integration Test Control Register </h>
+  __O     uint32_t  ITOP;          // <h> Watchdog Integration Test Output Set Register </h>
+
+}CMSDK_WATCHDOG_TypeDef;
+
+#define CMSDK_Watchdog_LOAD_Pos               0                                              /*!< CMSDK_Watchdog LOAD: LOAD Position */
+#define CMSDK_Watchdog_LOAD_Msk              (0xFFFFFFFFul << CMSDK_Watchdog_LOAD_Pos)       /*!< CMSDK_Watchdog LOAD: LOAD Mask */
+
+#define CMSDK_Watchdog_VALUE_Pos              0                                              /*!< CMSDK_Watchdog VALUE: VALUE Position */
+#define CMSDK_Watchdog_VALUE_Msk             (0xFFFFFFFFul << CMSDK_Watchdog_VALUE_Pos)      /*!< CMSDK_Watchdog VALUE: VALUE Mask */
+
+#define CMSDK_Watchdog_CTRL_RESEN_Pos         1                                              /*!< CMSDK_Watchdog CTRL_RESEN: Enable Reset Output Position */
+#define CMSDK_Watchdog_CTRL_RESEN_Msk        (0x1ul << CMSDK_Watchdog_CTRL_RESEN_Pos)        /*!< CMSDK_Watchdog CTRL_RESEN: Enable Reset Output Mask */
+
+#define CMSDK_Watchdog_CTRL_INTEN_Pos         0                                              /*!< CMSDK_Watchdog CTRL_INTEN: Int Enable Position */
+#define CMSDK_Watchdog_CTRL_INTEN_Msk        (0x1ul << CMSDK_Watchdog_CTRL_INTEN_Pos)        /*!< CMSDK_Watchdog CTRL_INTEN: Int Enable Mask */
+
+#define CMSDK_Watchdog_INTCLR_Pos             0                                              /*!< CMSDK_Watchdog INTCLR: Int Clear Position */
+#define CMSDK_Watchdog_INTCLR_Msk            (0x1ul << CMSDK_Watchdog_INTCLR_Pos)            /*!< CMSDK_Watchdog INTCLR: Int Clear Mask */
+
+#define CMSDK_Watchdog_RAWINTSTAT_Pos         0                                              /*!< CMSDK_Watchdog RAWINTSTAT: Raw Int Status Position */
+#define CMSDK_Watchdog_RAWINTSTAT_Msk        (0x1ul << CMSDK_Watchdog_RAWINTSTAT_Pos)        /*!< CMSDK_Watchdog RAWINTSTAT: Raw Int Status Mask */
+
+#define CMSDK_Watchdog_MASKINTSTAT_Pos        0                                              /*!< CMSDK_Watchdog MASKINTSTAT: Mask Int Status Position */
+#define CMSDK_Watchdog_MASKINTSTAT_Msk       (0x1ul << CMSDK_Watchdog_MASKINTSTAT_Pos)       /*!< CMSDK_Watchdog MASKINTSTAT: Mask Int Status Mask */
+
+#define CMSDK_Watchdog_LOCK_Pos               0                                              /*!< CMSDK_Watchdog LOCK: LOCK Position */
+#define CMSDK_Watchdog_LOCK_Msk              (0x1ul << CMSDK_Watchdog_LOCK_Pos)              /*!< CMSDK_Watchdog LOCK: LOCK Mask */
+
+#define CMSDK_Watchdog_INTEGTESTEN_Pos        0                                              /*!< CMSDK_Watchdog INTEGTESTEN: Integration Test Enable Position */
+#define CMSDK_Watchdog_INTEGTESTEN_Msk       (0x1ul << CMSDK_Watchdog_INTEGTESTEN_Pos)       /*!< CMSDK_Watchdog INTEGTESTEN: Integration Test Enable Mask */
+
+#define CMSDK_Watchdog_INTEGTESTOUTSET_Pos    1                                              /*!< CMSDK_Watchdog INTEGTESTOUTSET: Integration Test Output Set Position */
+#define CMSDK_Watchdog_INTEGTESTOUTSET_Msk   (0x1ul << CMSDK_Watchdog_INTEGTESTOUTSET_Pos)   /*!< CMSDK_Watchdog INTEGTESTOUTSET: Integration Test Output Set Mask */
+
+/*@}*/ /* end of group  CMSDK_Watchdog */
+
+/*------------------- PrimeCell APB GPIO --------------------------------------*/
+/** @addtogroup CMSDK_PL061 CMSDK APB GPIO
+  @{
+*/
+typedef struct
+{
+
+__IO    uint32_t  DATA[256];
+__IO    uint32_t  DIR;
+__IO    uint32_t  INTSENSE;
+__IO    uint32_t  INTBOTHEDGE;
+__IO    uint32_t  INTEVENT;
+__IO    uint32_t  INTMASK;
+__O     uint32_t  RAWINTSTAT;
+__O     uint32_t  MASKINTSTAT;
+__I     uint32_t  INTCLR;
+__IO    uint32_t  MODECTRL;
+
+}APBGPIO_TypeDef;
+
+#define CMSDK_PL061_DATA_Pos               0                                              /*!< CMSDK_PL061 DATA: DATA Position */
+#define CMSDK_PL061_DATA_Msk              (0xFFFFFFFFul << CMSDK_PL061_LOAD_Pos)          /*!< CMSDK_PL061 DATA: DATA Mask */
+
+#define CMSDK_PL061_DIR_Pos                0                                              /*!< CMSDK_PL061 DIR: Data Direction Position */
+#define CMSDK_PL061_DIR_Msk               (0x1ul << CMSDK_PL061_DIR_Pos)                  /*!< CMSDK_PL061 DIR: Data Direction  Mask */
+
+#define CMSDK_PL061_INTSENSE_Pos           0                                              /*!< CMSDK_PL061 INTSENSE: INT SENSE Position */
+#define CMSDK_PL061_INTSENSE_Msk          (0x1ul << CMSDK_PL061_INTSENSE_Pos)             /*!< CMSDK_PL061 INTSENSE: INT SENSE Mask */
+
+#define CMSDK_PL061_INTBOTHEDGE_Pos        0                                              /*!< CMSDK_PL061 INTBOTHEDGE: INT BOTH EDGE Position */
+#define CMSDK_PL061_INTBOTHEDGE_Msk       (0x1ul << CMSDK_PL061_INTBOTHEDGE_Pos)          /*!< CMSDK_PL061 INTBOTHEDGE: INT BOTH EDGE Mask */
+
+#define CMSDK_PL061_INTEVENT_Pos           0                                              /*!< CMSDK_PL061 INTEVENT: INT EVENT Position */
+#define CMSDK_PL061_INTEVENT_Msk          (0x1ul << CMSDK_PL061_INTEVENT_Pos)             /*!< CMSDK_PL061 INTEVENT: INT EVENT Mask */
+
+#define CMSDK_PL061_INTMASK_Pos            0                                              /*!< CMSDK_PL061 INTMASK: INT MASK Position */
+#define CMSDK_PL061_INTMASK_Msk           (0x1ul << CMSDK_PL061_INTMASK_Pos)              /*!< CMSDK_PL061 INTMASK: INT MASK Mask */
+
+#define CMSDK_PL061_RAWINTSTAT_Pos         0                                              /*!< CMSDK_PL061 RAWINTSTAT: Raw Int Status Position */
+#define CMSDK_PL061_RAWINTSTAT_Msk        (0x1ul << CMSDK_PL061_RAWINTSTAT_Pos)           /*!< CMSDK_PL061 RAWINTSTAT: Raw Int Status Mask */
+
+#define CMSDK_PL061_MASKINTSTAT_Pos        0                                              /*!< CMSDK_PL061 MASKINTSTAT: Mask Int Status Position */
+#define CMSDK_PL061_MASKINTSTAT_Msk       (0x1ul << CMSDK_PL061_MASKINTSTAT_Pos)          /*!< CMSDK_PL061 MASKINTSTAT: Mask Int Status Mask */
+
+#define CMSDK_PL061_INTCLR_Pos             0                                              /*!< CMSDK_PL061 INTCLR: Int Clear Position */
+#define CMSDK_PL061_INTCLR_Msk            (0x1ul << CMSDK_PL061_INTCLR_Pos)               /*!< CMSDK_PL061 INTCLR: Int Clear Mask */
+
+#define CMSDK_PL061_MODECTRL_HWEN_Pos      0                                              /*!< CMSDK_PL061 MODECTRL_HWEN: Mode Control Hardware Enable Position */
+#define CMSDK_PL061_MODECTRL_HWEN_Msk     (0x1ul << CMSDK_PL061_MODECTRL_HWEN_Pos)        /*!< CMSDK_PL061 MODECTRL_HWEN: Mode Control Hardware Enable Mask */
+
+
+/*@}*/ /* end of group  CMSDK_PL061 */
+
+
+#if defined ( __CC_ARM   )
+#pragma no_anon_unions
+#endif
+
+/*@}*/ /* end of group CMSDK_Peripherals */
+
+
+/******************************************************************************/
+/*                         Peripheral memory map                              */
+/******************************************************************************/
+/** @addtogroup CMSDK_MemoryMap CMSDK Memory Mapping
+  @{
+*/
+
+/* Peripheral and SRAM base address */
+#define CMSDK_FLASH_BASE        (0x00000000UL)  /*!< (FLASH     ) Base Address */
+#define CMSDK_SRAM_BASE         (0x20000000UL)  /*!< (SRAM      ) Base Address */
+#define CMSDK_PERIPH_BASE       (0x40000000UL)  /*!< (Peripheral) Base Address */
+
+#define CMSDK_RAM_BASE          (0x20000000UL)
+#define CMSDK_APB_BASE          (0x40000000UL)
+#define CMSDK_AHB_BASE          (0x40010000UL)
+
+/* APB peripherals                                                           */
+#define CMSDK_TIMER0_BASE       (CMSDK_APB_BASE + 0x0000UL)
+#define CMSDK_TIMER1_BASE       (CMSDK_APB_BASE + 0x1000UL)
+#define CMSDK_DUALTIMER_BASE    (CMSDK_APB_BASE + 0x2000UL)
+#define CMSDK_DUALTIMER_1_BASE  (CMSDK_DUALTIMER_BASE)
+#define CMSDK_DUALTIMER_2_BASE  (CMSDK_DUALTIMER_BASE + 0x20UL)
+#define CMSDK_UART0_BASE        (CMSDK_APB_BASE + 0x4000UL)
+#define CMSDK_UART1_BASE        (CMSDK_APB_BASE + 0x5000UL)
+#define CMSDK_UART2_BASE        (CMSDK_APB_BASE + 0x6000UL)
+#define CMSDK_USRT2_BASE        (CMSDK_APB_BASE + 0xE000UL) //0x6000UL)
+#define CMSDK_WATCHDOG_BASE     (CMSDK_APB_BASE + 0x8000UL)
+#define CMSDK_PL230_BASE        (CMSDK_APB_BASE + 0xF000UL)
+
+/* AHB peripherals                                                           */
+#define CMSDK_GPIO0_BASE        (CMSDK_AHB_BASE + 0x0000UL)
+#define CMSDK_GPIO1_BASE        (CMSDK_AHB_BASE + 0x1000UL)
+#define CMSDK_SYSCTRL_BASE      (CMSDK_AHB_BASE + 0xF000UL)
+/*@}*/ /* end of group CMSDK_MemoryMap */
+
+
+/******************************************************************************/
+/*                         Peripheral declaration                             */
+/******************************************************************************/
+
+/** @addtogroup CMSDK_PeripheralDecl CMSDK Peripheral Declaration
+  @{
+*/
+
+#define CMSDK_UART0             ((CMSDK_UART_TypeDef   *) CMSDK_UART0_BASE   )
+#define CMSDK_UART1             ((CMSDK_UART_TypeDef   *) CMSDK_UART1_BASE   )
+#define CMSDK_UART2             ((CMSDK_UART_TypeDef   *) CMSDK_UART2_BASE   )
+#define CMSDK_USRT2             ((CMSDK_UART_TypeDef   *) CMSDK_USRT2_BASE   )
+#define CMSDK_TIMER0            ((CMSDK_TIMER_TypeDef  *) CMSDK_TIMER0_BASE  )
+#define CMSDK_TIMER1            ((CMSDK_TIMER_TypeDef  *) CMSDK_TIMER1_BASE  )
+#define CMSDK_DUALTIMER         ((CMSDK_DUALTIMER_BOTH_TypeDef  *) CMSDK_DUALTIMER_BASE )
+#define CMSDK_DUALTIMER1        ((CMSDK_DUALTIMER_SINGLE_TypeDef  *) CMSDK_DUALTIMER_1_BASE )
+#define CMSDK_DUALTIMER2        ((CMSDK_DUALTIMER_SINGLE_TypeDef  *) CMSDK_DUALTIMER_2_BASE )
+#define CMSDK_WATCHDOG          ((CMSDK_WATCHDOG_TypeDef  *) CMSDK_WATCHDOG_BASE   )
+#define CMSDK_DMA               ((CMSDK_PL230_TypeDef  *) CMSDK_PL230_BASE   )
+#define CMSDK_GPIO0             ((CMSDK_GPIO_TypeDef   *) CMSDK_GPIO0_BASE   )
+#define CMSDK_GPIO1             ((CMSDK_GPIO_TypeDef   *) CMSDK_GPIO1_BASE   )
+#define CMSDK_SYSCON            ((CMSDK_SYSCON_TypeDef *) CMSDK_SYSCTRL_BASE )
+/*@}*/ /* end of group CMSDK_PeripheralDecl */
+
+/*@}*/ /* end of group CMSDK_Definitions */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif  /* CMSDK_H */
diff --git a/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_driver.h b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_driver.h
new file mode 100644
index 0000000..6b7b49a
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_driver.h
@@ -0,0 +1,293 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2011 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+/*************************************************************************//**
+ * @file     CMSDK_driver.h
+ * @brief    CMSDK Example Device Driver Header File
+ * @version  $State:$
+ * @date     $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ ******************************************************************************/
+
+
+/** @addtogroup CMSIS_CM0_CMSDK_Driver_definitions CMSDK Driver definitions
+  This file defines all CMSDK Driver functions for CMSIS core for the following modules:
+    - Timer
+    - UART
+    - GPIO
+  @{
+ */
+
+ #include "CMSDK_CM0.h"
+
+
+ /*UART Driver Declarations*/
+
+  /**
+   * @brief Initializes UART module.
+   */
+
+ extern uint32_t CMSDK_uart_init(CMSDK_UART_TypeDef *CMSDK_UART, uint32_t divider, uint32_t tx_en,
+                           uint32_t rx_en, uint32_t tx_irq_en, uint32_t rx_irq_en, uint32_t tx_ovrirq_en, uint32_t rx_ovrirq_en);
+
+  /**
+   * @brief Returns whether the UART RX Buffer is Full.
+   */
+
+ extern uint32_t CMSDK_uart_GetRxBufferFull(CMSDK_UART_TypeDef *CMSDK_UART);
+
+  /**
+   * @brief Returns whether the UART TX Buffer is Full.
+   */
+
+ extern uint32_t CMSDK_uart_GetTxBufferFull(CMSDK_UART_TypeDef *CMSDK_UART);
+
+  /**
+   * @brief Sends a character to the UART TX Buffer.
+   */
+
+
+ extern void CMSDK_uart_SendChar(CMSDK_UART_TypeDef *CMSDK_UART, char txchar);
+
+  /**
+   * @brief Receives a character from the UART RX Buffer.
+   */
+
+ extern char CMSDK_uart_ReceiveChar(CMSDK_UART_TypeDef *CMSDK_UART);
+
+  /**
+   * @brief Returns UART Overrun status.
+   */
+
+ extern uint32_t CMSDK_uart_GetOverrunStatus(CMSDK_UART_TypeDef *CMSDK_UART);
+
+  /**
+   * @brief Clears UART Overrun status Returns new UART Overrun status.
+   */
+
+ extern uint32_t CMSDK_uart_ClearOverrunStatus(CMSDK_UART_TypeDef *CMSDK_UART);
+
+  /**
+   * @brief Returns UART Baud rate Divider value.
+   */
+
+ extern uint32_t CMSDK_uart_GetBaudDivider(CMSDK_UART_TypeDef *CMSDK_UART);
+
+  /**
+   * @brief Return UART TX Interrupt Status.
+   */
+
+ extern uint32_t CMSDK_uart_GetTxIRQStatus(CMSDK_UART_TypeDef *CMSDK_UART);
+
+  /**
+   * @brief Return UART RX Interrupt Status.
+   */
+
+ extern uint32_t CMSDK_uart_GetRxIRQStatus(CMSDK_UART_TypeDef *CMSDK_UART);
+
+  /**
+   * @brief Clear UART TX Interrupt request.
+   */
+
+ extern void CMSDK_uart_ClearTxIRQ(CMSDK_UART_TypeDef *CMSDK_UART);
+
+  /**
+   * @brief Clear UART RX Interrupt request.
+   */
+
+ extern void CMSDK_uart_ClearRxIRQ(CMSDK_UART_TypeDef *CMSDK_UART);
+
+  /**
+   * @brief Set CMSDK Timer for multi-shoot mode with internal clock
+   */
+
+ /*Timer Driver Declarations*/
+
+ extern void CMSDK_timer_Init_IntClock(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reload,
+ uint32_t irq_en);
+
+  /**
+   * @brief Set CMSDK Timer for multi-shoot mode with external enable
+   */
+
+ extern void CMSDK_timer_Init_ExtClock(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reload,
+ uint32_t irq_en);
+
+
+  /**
+   * @brief Set CMSDK Timer for multi-shoot mode with external clock
+   */
+
+ extern void CMSDK_timer_Init_ExtEnable(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reload,
+ uint32_t irq_en);
+
+  /**
+   * @brief CMSDK Timer interrupt clear
+   */
+
+
+ extern void CMSDK_timer_ClearIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER);
+
+  /**
+   * @brief Returns timer IRQ status
+   */
+
+ uint32_t  CMSDK_timer_StatusIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER);
+
+  /**
+   * @brief Returns Timer Reload value.
+   */
+
+ extern uint32_t CMSDK_timer_GetReload(CMSDK_TIMER_TypeDef *CMSDK_TIMER);
+
+  /**
+   * @brief Sets Timer Reload value.
+   */
+
+ extern void CMSDK_timer_SetReload(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t value);
+
+  /**
+   * @brief Returns Timer current value.
+   */
+
+ uint32_t CMSDK_timer_GetValue(CMSDK_TIMER_TypeDef *CMSDK_TIMER);
+
+  /**
+   * @brief Sets Timer current value.
+   */
+
+ extern void CMSDK_timer_SetValue(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t value);
+
+  /**
+   * @brief Stops CMSDK Timer.
+   */
+
+ extern void CMSDK_timer_StopTimer(CMSDK_TIMER_TypeDef *CMSDK_TIMER);
+
+  /**
+   * @brief Starts CMSDK Timer.
+   */
+
+ extern void CMSDK_timer_StartTimer(CMSDK_TIMER_TypeDef *CMSDK_TIMER);
+
+  /**
+   * @brief Enables CMSDK Timer Interrupt requests.
+   */
+
+ extern void CMSDK_timer_EnableIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER);
+
+  /**
+   * @brief Disables CMSDK Timer Interrupt requests.
+   */
+
+ extern void CMSDK_timer_DisableIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER);
+
+  /**
+   * @brief Set CMSDK GPIO Output Enable.
+   */
+
+ /*GPIO Driver Declarations*/
+
+ extern void CMSDK_gpio_SetOutEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t outenableset);
+
+  /**
+   * @brief Clear CMSDK GPIO Output Enable.
+   */
+
+ extern void CMSDK_gpio_ClrOutEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t outenableclr);
+
+  /**
+   * @brief Returns CMSDK GPIO Output Enable.
+   */
+
+ extern uint32_t CMSDK_gpio_GetOutEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO);
+
+  /**
+   * @brief Set CMSDK GPIO Alternate function Enable.
+   */
+
+ extern void CMSDK_gpio_SetAltFunc(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t AltFuncset);
+
+  /**
+   * @brief Clear CMSDK GPIO Alternate function Enable.
+   */
+
+ extern void CMSDK_gpio_ClrAltFunc(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t AltFuncclr);
+
+  /**
+   * @brief Returns CMSDK GPIO Alternate function Enable.
+   */
+
+ extern uint32_t CMSDK_gpio_GetAltFunc(CMSDK_GPIO_TypeDef *CMSDK_GPIO);
+
+  /**
+   * @brief Clear CMSDK GPIO Interrupt request.
+   */
+
+ extern uint32_t CMSDK_gpio_IntClear(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num);
+
+  /**
+   * @brief Enable CMSDK GPIO Interrupt request.
+   */
+
+ extern uint32_t CMSDK_gpio_SetIntEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num);
+
+  /**
+   * @brief Disable CMSDK GPIO Interrupt request.
+   */
+
+ extern uint32_t CMSDK_gpio_ClrIntEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num);
+
+  /**
+   * @brief Setup CMSDK GPIO Interrupt as high level.
+   */
+
+ extern void CMSDK_gpio_SetIntHighLevel(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num);
+
+   /**
+   * @brief Setup CMSDK GPIO Interrupt as rising edge.
+   */
+
+ extern void CMSDK_gpio_SetIntRisingEdge(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num);
+
+     /**
+   * @brief Setup CMSDK GPIO Interrupt as low level.
+   */
+
+ extern void CMSDK_gpio_SetIntLowLevel(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num);
+
+    /**
+   * @brief Setup CMSDK GPIO Interrupt as falling edge.
+   */
+
+ extern void CMSDK_gpio_SetIntFallingEdge(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num);
+
+    /**
+   * @brief Setup CMSDK GPIO output value using Masked access.
+   */
+
+ extern void CMSDK_gpio_MaskedWrite(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t value, uint32_t mask);
+
+  /*@}*/ /* end of group CMSIS_CM0_CMSDK_Driver_definitions CMSDK Driver definitions */
+
+
diff --git a/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/system_CMSDK_CM0.h b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/system_CMSDK_CM0.h
new file mode 100644
index 0000000..9e74cf3
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Include/system_CMSDK_CM0.h
@@ -0,0 +1,64 @@
+/**************************************************************************//**
+ * @file     system_CMSDK_CM0.h
+ * @brief    CMSIS Cortex-M0 Device Peripheral Access Layer Header File for
+ *           Device <Device>
+ * @version  V3.01
+ * @date     06. March 2012
+ *
+ * @note
+ * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ *
+ * @par
+ * ARM Limited (ARM) is supplying this software for use with Cortex-M
+ * processor based microcontrollers.  This file can be freely distributed
+ * within development tools that are supporting such ARM based processors.
+ *
+ * @par
+ * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
+ * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
+ * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
+ * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+ *
+ ******************************************************************************/
+
+
+#ifndef SYSTEM_CMSDK_CM0_H
+#define SYSTEM_CMSDK_CM0_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+extern uint32_t SystemCoreClock;     /*!< System Clock Frequency (Core Clock)  */
+
+
+/**
+ * Initialize the system
+ *
+ * @param  none
+ * @return none
+ *
+ * @brief  Setup the microcontroller system.
+ *         Initialize the System and update the SystemCoreClock variable.
+ */
+extern void SystemInit (void);
+
+/**
+ * Update SystemCoreClock variable
+ *
+ * @param  none
+ * @return none
+ *
+ * @brief  Updates the SystemCoreClock with current core Clock
+ *         retrieved from cpu registers.
+ */
+extern void SystemCoreClockUpdate (void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SYSTEM_CMSDK_CM0_H */
diff --git a/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/ARM/startup_CMSDK_CM0.s b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/ARM/startup_CMSDK_CM0.s
new file mode 100644
index 0000000..29bc88a
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/ARM/startup_CMSDK_CM0.s
@@ -0,0 +1,250 @@
+;/**************************************************************************//**
+; * @file     startup_CMSDK_CM0.s
+; * @brief    CMSIS Cortex-M0 Core Device Startup File for
+; *           Device CMSDK_CM0
+; * @version  V3.01
+; * @date     06. March 2012
+; *
+; * @note
+; * Copyright (C) 2012 ARM Limited. All rights reserved.
+; *
+; * @par
+; * ARM Limited (ARM) is supplying this software for use with Cortex-M
+; * processor based microcontrollers.  This file can be freely distributed
+; * within development tools that are supporting such ARM based processors.
+; *
+; * @par
+; * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
+; * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+; * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
+; * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
+; * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+; *
+; ******************************************************************************/
+;/*
+;//-------- <<< Use Configuration Wizard in Context Menu >>> ------------------
+;*/
+
+
+; <h> Stack Configuration
+;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Stack_Size      EQU     0x00000200
+
+                AREA    STACK, NOINIT, READWRITE, ALIGN=3
+Stack_Mem       SPACE   Stack_Size
+__initial_sp
+
+
+; <h> Heap Configuration
+;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+; </h>
+
+Heap_Size       EQU     0x00000100
+
+                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
+__heap_base
+Heap_Mem        SPACE   Heap_Size
+__heap_limit
+
+
+                PRESERVE8
+                THUMB
+
+
+; Vector Table Mapped to Address 0 at Reset
+
+                AREA    RESET, DATA, READONLY
+                EXPORT  __Vectors
+                EXPORT  __Vectors_End
+                EXPORT  __Vectors_Size
+
+__Vectors       DCD     __initial_sp              ; Top of Stack
+                DCD     Reset_Handler             ; Reset Handler
+                DCD     NMI_Handler               ; NMI Handler
+                DCD     HardFault_Handler         ; Hard Fault Handler
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     SVC_Handler               ; SVCall Handler
+                DCD     0                         ; Reserved
+                DCD     0                         ; Reserved
+                DCD     PendSV_Handler            ; PendSV Handler
+                DCD     SysTick_Handler           ; SysTick Handler
+                DCD     UARTRX0_Handler           ; UART 0 RX Handler
+                DCD     UARTTX0_Handler           ; UART 0 TX Handler
+                DCD     UARTRX1_Handler           ; UART 1 RX Handler
+                DCD     UARTTX1_Handler           ; UART 1 TX Handler
+                DCD     UARTRX2_Handler           ; UART 2 RX Handler
+                DCD     UARTTX2_Handler           ; UART 2 TX Handler
+                DCD     PORT0_COMB_Handler        ; GPIO Port 0 Combined Handler
+                DCD     PORT1_COMB_Handler        ; GPIO Port 1 Combined Handler
+                DCD     TIMER0_Handler            ; TIMER 0 handler
+                DCD     TIMER1_Handler            ; TIMER 1 handler
+                DCD     DUALTIMER_HANDLER         ; Dual timer handler
+                DCD     0                         ; Reserved
+                DCD     UARTOVF0_Handler          ; UART 0 Overflow Handler
+                DCD     UARTOVF1_Handler          ; UART 1 Overflow Handler
+                DCD     UARTOVF2_Handler          ; UART 2 Overflow Handler
+                DCD     DMA_Handler               ; DMA handler
+                DCD     PORT0_0_Handler           ; GPIO Port 0 pin 0 Handler
+                DCD     PORT0_1_Handler           ; GPIO Port 0 pin 1 Handler
+                DCD     PORT0_2_Handler           ; GPIO Port 0 pin 2 Handler
+                DCD     PORT0_3_Handler           ; GPIO Port 0 pin 3 Handler
+                DCD     PORT0_4_Handler           ; GPIO Port 0 pin 4 Handler
+                DCD     PORT0_5_Handler           ; GPIO Port 0 pin 5 Handler
+                DCD     PORT0_6_Handler           ; GPIO Port 0 pin 6 Handler
+                DCD     PORT0_7_Handler           ; GPIO Port 0 pin 7 Handler
+                DCD     PORT0_8_Handler           ; GPIO Port 0 pin 8 Handler
+                DCD     PORT0_9_Handler           ; GPIO Port 0 pin 9 Handler
+                DCD     PORT0_10_Handler          ; GPIO Port 0 pin 10 Handler
+                DCD     PORT0_11_Handler          ; GPIO Port 0 pin 11 Handler
+                DCD     PORT0_12_Handler          ; GPIO Port 0 pin 12 Handler
+                DCD     PORT0_13_Handler          ; GPIO Port 0 pin 13 Handler
+                DCD     PORT0_14_Handler          ; GPIO Port 0 pin 14 Handler
+                DCD     PORT0_15_Handler          ; GPIO Port 0 pin 15 Handler
+__Vectors_End
+
+__Vectors_Size  EQU     __Vectors_End - __Vectors
+
+                AREA    |.text|, CODE, READONLY
+
+
+; Reset Handler
+
+Reset_Handler   PROC
+                EXPORT  Reset_Handler             [WEAK]
+                IMPORT  SystemInit
+                IMPORT  __main
+                LDR     R0, =SystemInit
+                BLX     R0
+                LDR     R0, =__main
+                BX      R0
+                ENDP
+
+
+; Dummy Exception Handlers (infinite loops which can be modified)
+
+NMI_Handler     PROC
+                EXPORT  NMI_Handler               [WEAK]
+                B       .
+                ENDP
+HardFault_Handler\
+                PROC
+                EXPORT  HardFault_Handler         [WEAK]
+                B       .
+                ENDP
+SVC_Handler     PROC
+                EXPORT  SVC_Handler               [WEAK]
+                B       .
+                ENDP
+PendSV_Handler  PROC
+                EXPORT  PendSV_Handler            [WEAK]
+                B       .
+                ENDP
+SysTick_Handler PROC
+               EXPORT  SysTick_Handler            [WEAK]
+               B       .
+               ENDP
+Default_Handler PROC
+                EXPORT UARTRX0_Handler            [WEAK]
+                EXPORT UARTTX0_Handler            [WEAK]
+                EXPORT UARTRX1_Handler            [WEAK]
+                EXPORT UARTTX1_Handler            [WEAK]
+                EXPORT UARTRX2_Handler            [WEAK]
+                EXPORT UARTTX2_Handler            [WEAK]
+                EXPORT PORT0_COMB_Handler         [WEAK]
+                EXPORT PORT1_COMB_Handler         [WEAK]
+                EXPORT TIMER0_Handler             [WEAK]
+                EXPORT TIMER1_Handler             [WEAK]
+                EXPORT DUALTIMER_HANDLER          [WEAK]
+                EXPORT UARTOVF0_Handler           [WEAK]
+                EXPORT UARTOVF1_Handler           [WEAK]
+                EXPORT UARTOVF2_Handler           [WEAK]
+                EXPORT DMA_Handler                [WEAK]
+                EXPORT PORT0_0_Handler            [WEAK]
+                EXPORT PORT0_1_Handler            [WEAK]
+                EXPORT PORT0_2_Handler            [WEAK]
+                EXPORT PORT0_3_Handler            [WEAK]
+                EXPORT PORT0_4_Handler            [WEAK]
+                EXPORT PORT0_5_Handler            [WEAK]
+                EXPORT PORT0_6_Handler            [WEAK]
+                EXPORT PORT0_7_Handler            [WEAK]
+                EXPORT PORT0_8_Handler            [WEAK]
+                EXPORT PORT0_9_Handler            [WEAK]
+                EXPORT PORT0_10_Handler           [WEAK]
+                EXPORT PORT0_11_Handler           [WEAK]
+                EXPORT PORT0_12_Handler           [WEAK]
+                EXPORT PORT0_13_Handler           [WEAK]
+                EXPORT PORT0_14_Handler           [WEAK]
+                EXPORT PORT0_15_Handler           [WEAK]
+UARTRX0_Handler
+UARTTX0_Handler
+UARTRX1_Handler
+UARTTX1_Handler
+UARTRX2_Handler
+UARTTX2_Handler
+PORT0_COMB_Handler
+PORT1_COMB_Handler
+TIMER0_Handler
+TIMER1_Handler
+DUALTIMER_HANDLER
+UARTOVF0_Handler
+UARTOVF1_Handler
+UARTOVF2_Handler
+DMA_Handler
+PORT0_0_Handler
+PORT0_1_Handler
+PORT0_2_Handler
+PORT0_3_Handler
+PORT0_4_Handler
+PORT0_5_Handler
+PORT0_6_Handler
+PORT0_7_Handler
+PORT0_8_Handler
+PORT0_9_Handler
+PORT0_10_Handler
+PORT0_11_Handler
+PORT0_12_Handler
+PORT0_13_Handler
+PORT0_14_Handler
+PORT0_15_Handler
+                B       .
+                ENDP
+
+
+                ALIGN
+
+
+; User Initial Stack & Heap
+
+                IF      :DEF:__MICROLIB
+
+                EXPORT  __initial_sp
+                EXPORT  __heap_base
+                EXPORT  __heap_limit
+
+                ELSE
+
+                IMPORT  __use_two_region_memory
+                EXPORT  __user_initial_stackheap
+
+__user_initial_stackheap PROC
+                LDR     R0, =  Heap_Mem
+                LDR     R1, =(Stack_Mem + Stack_Size)
+                LDR     R2, = (Heap_Mem +  Heap_Size)
+                LDR     R3, = Stack_Mem
+                BX      LR
+                ENDP
+
+                ALIGN
+
+                ENDIF
+
+
+                END
diff --git a/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/CMSDK_driver.c b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/CMSDK_driver.c
new file mode 100644
index 0000000..27b0f44
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/CMSDK_driver.c
@@ -0,0 +1,659 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2011 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+/*********************************************************************//******
+ * @file     CMSDK_driver.c
+ * @brief    CMSDK Example Device Driver C File
+ * @version  $State:$
+ * @date     $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ ******************************************************************************/
+
+#include "CMSDK_CM0.h"
+
+
+
+/** \mainpage ARM CMSDK LIBRARY
+ *
+ *
+ * This user manual describes the ARM Corex M Series CMSDK Library which utilises the
+ * Cortex Microcontroller Software Interface Standard (CMSIS). it also includes drivers
+ * for the following modules:
+ *
+ *    - UART
+ *    - Timer
+ *    - GPIO
+ *
+ * The library contains C and assembly functions that have been ported and tested on the MDK
+ * toolchain.
+ */
+
+
+/**
+ *
+ * @param *CMSDK_TIMER Timer Pointer
+ * @return none
+ *
+ * @brief  Enable the microcontroller timer interrupts.
+ */
+
+ void CMSDK_timer_EnableIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
+ {
+       CMSDK_TIMER->CTRL |= CMSDK_TIMER_CTRL_IRQEN_Msk;
+ }
+
+/**
+ *
+ * @param *CMSDK_TIMER Timer Pointer
+ * @return none
+ *
+ * @brief  Disable the microcontroller timer interrutps.
+ */
+
+ void CMSDK_timer_DisableIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
+ {
+       CMSDK_TIMER->CTRL &= ~CMSDK_TIMER_CTRL_IRQEN_Msk;
+ }
+
+/**
+ *
+ * @param *CMSDK_TIMER Timer Pointer
+ * @return none
+ *
+ * @brief  Start the Timer.
+ */
+
+ void CMSDK_timer_StartTimer(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
+ {
+       CMSDK_TIMER->CTRL |= CMSDK_TIMER_CTRL_EN_Msk;
+ }
+
+/**
+ *
+ * @param *CMSDK_TIMER Timer Pointer
+ * @return none
+ *
+ * @brief  Stop the Timer.
+ */
+
+ void CMSDK_timer_StopTimer(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
+ {
+       CMSDK_TIMER->CTRL &= ~CMSDK_TIMER_CTRL_EN_Msk;
+ }
+
+/**
+ *
+ * @param *CMSDK_TIMER Timer Pointer
+ * @return TimerValue
+ *
+ * @brief  Returns the current value of the timer.
+ */
+
+ uint32_t CMSDK_timer_GetValue(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
+ {
+       return CMSDK_TIMER->VALUE;
+ }
+
+/**
+ *
+ * @param *CMSDK_TIMER Timer Pointer
+ * @param value the value to which the timer is to be set
+ * @return TimerValue
+ *
+ * @brief  Sets the timer to the specified value.
+ */
+
+ void CMSDK_timer_SetValue(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t value)
+ {
+       CMSDK_TIMER->VALUE = value;
+ }
+
+/**
+ *
+ * @param *CMSDK_TIMER Timer Pointer
+ * @return TimerReload
+ *
+ * @brief  Returns the reload value of the timer. The reload value is the value which the timer is set to after an underflow occurs.
+ */
+
+ uint32_t CMSDK_timer_GetReload(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
+ {
+       return CMSDK_TIMER->RELOAD;
+ }
+
+/**
+ *
+ * @param *CMSDK_TIMER Timer Pointer
+ * @param value Value to be loaded
+ * @return none
+ *
+ * @brief  Sets the reload value of the timer to the specified value. The reload value is the value which the timer is set to after an underflow occurs.
+ */
+
+ void CMSDK_timer_SetReload(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t value)
+ {
+       CMSDK_TIMER->RELOAD = value;
+ }
+
+/**
+ *
+ * @param *CMSDK_TIMER Timer Pointer
+ * @return none
+ *
+ * @brief  Clears the timer IRQ if set.
+ */
+
+ void CMSDK_timer_ClearIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
+ {
+       CMSDK_TIMER->INTCLEAR = CMSDK_TIMER_INTCLEAR_Msk;
+ }
+
+/**
+ *
+ * @param *CMSDK_TIMER Timer Pointer
+ * @return none
+ *
+ * @brief  Returns the IRQ status of the timer in question.
+ */
+
+ uint32_t  CMSDK_timer_StatusIRQ(CMSDK_TIMER_TypeDef *CMSDK_TIMER)
+ {
+       return CMSDK_TIMER->INTSTATUS;
+ }
+
+/**
+ *
+ * @param *CMSDK_TIMER Timer Pointer
+ * @param reload The value to which the timer is to be set after an underflow has occurred
+ * @param irq_en Defines whether the timer IRQ is to be enabled
+ * @return none
+ *
+ * @brief  Initialises the timer to use the internal clock and specifies the timer reload value and whether IRQ is enabled or not.
+ */
+
+  void CMSDK_timer_Init_IntClock(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reload,
+ uint32_t irq_en)
+ {
+       CMSDK_TIMER->CTRL = 0;
+       CMSDK_TIMER->VALUE = reload;
+       CMSDK_TIMER->RELOAD = reload;
+       if (irq_en!=0)                                                                          /* non zero - enable IRQ */
+         CMSDK_TIMER->CTRL = (CMSDK_TIMER_CTRL_IRQEN_Msk | CMSDK_TIMER_CTRL_EN_Msk);
+       else{                                                                                   /* zero - do not enable IRQ */
+         CMSDK_TIMER->CTRL = ( CMSDK_TIMER_CTRL_EN_Msk);                                       /* enable timer */
+        }
+ }
+
+/**
+ *
+ * @param *CMSDK_TIMER Timer Pointer
+ * @param reload The value to which the timer is to be set after an underflow has occurred
+ * @param irq_en Defines whether the timer IRQ is to be enabled
+ * @return none
+ *
+ * @brief  Initialises the timer to use the external clock and specifies the timer reload value and whether IRQ is enabled or not.
+ */
+
+ void CMSDK_timer_Init_ExtClock(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reload,
+ uint32_t irq_en)
+ {
+       CMSDK_TIMER->CTRL = 0;
+       CMSDK_TIMER->VALUE = reload;
+       CMSDK_TIMER->RELOAD = reload;
+       if (irq_en!=0)                                                                                  /* non zero - enable IRQ */
+            CMSDK_TIMER->CTRL = (CMSDK_TIMER_CTRL_IRQEN_Msk |
+                                   CMSDK_TIMER_CTRL_SELEXTCLK_Msk |CMSDK_TIMER_CTRL_EN_Msk);
+       else  {                                                                                         /* zero - do not enable IRQ */
+            CMSDK_TIMER->CTRL = ( CMSDK_TIMER_CTRL_EN_Msk |
+                                    CMSDK_TIMER_CTRL_SELEXTCLK_Msk);                                   /* enable timer */
+         }
+ }
+
+/**
+ *
+ * @brief  Initialises the timer to use the internal clock but with an external enable. It also specifies the timer reload value and whether IRQ is enabled or not.
+ *
+ * @param *CMSDK_TIMER Timer Pointer
+ * @param reload The value to which the timer is to be set after an underflow has occurred
+ * @param irq_en Defines whether the timer IRQ is to be enabled
+ * @return none
+ *
+ *
+ */
+
+ void CMSDK_timer_Init_ExtEnable(CMSDK_TIMER_TypeDef *CMSDK_TIMER, uint32_t reload,
+ uint32_t irq_en)
+ {
+       CMSDK_TIMER->CTRL = 0;
+       CMSDK_TIMER->VALUE = reload;
+       CMSDK_TIMER->RELOAD = reload;
+       if (irq_en!=0)                                                                                  /* non zero - enable IRQ */
+            CMSDK_TIMER->CTRL = (CMSDK_TIMER_CTRL_IRQEN_Msk |
+                                   CMSDK_TIMER_CTRL_SELEXTEN_Msk | CMSDK_TIMER_CTRL_EN_Msk);
+       else  {                                                                                         /* zero - do not enable IRQ */
+            CMSDK_TIMER->CTRL = ( CMSDK_TIMER_CTRL_EN_Msk |
+                                    CMSDK_TIMER_CTRL_SELEXTEN_Msk);                                    /* enable timer */
+         }
+ }
+
+
+  /*UART driver functions*/
+
+/**
+ *
+ * @brief  Initialises the UART specifying the UART Baud rate divider value and whether the send and recieve functionality is enabled. It also specifies which of the various interrupts are enabled.
+ *
+ * @param *CMSDK_UART UART Pointer
+ * @param divider The value to which the UART baud rate divider is to be set
+ * @param tx_en Defines whether the UART transmit is to be enabled
+ * @param rx_en Defines whether the UART receive is to be enabled
+ * @param tx_irq_en Defines whether the UART transmit buffer full interrupt is to be enabled
+ * @param rx_irq_en Defines whether the UART receive buffer full interrupt is to be enabled
+ * @param tx_ovrirq_en Defines whether the UART transmit buffer overrun interrupt is to be enabled
+ * @param rx_ovrirq_en Defines whether the UART receive buffer overrun interrupt is to be enabled
+ * @return 1 if initialisation failed, 0 if successful.
+ */
+
+ uint32_t CMSDK_uart_init(CMSDK_UART_TypeDef *CMSDK_UART, uint32_t divider, uint32_t tx_en,
+                           uint32_t rx_en, uint32_t tx_irq_en, uint32_t rx_irq_en, uint32_t tx_ovrirq_en, uint32_t rx_ovrirq_en)
+ {
+       uint32_t new_ctrl=0;
+
+       if (tx_en!=0)        new_ctrl |= CMSDK_UART_CTRL_TXEN_Msk;
+       if (rx_en!=0)        new_ctrl |= CMSDK_UART_CTRL_RXEN_Msk;
+       if (tx_irq_en!=0)    new_ctrl |= CMSDK_UART_CTRL_TXIRQEN_Msk;
+       if (rx_irq_en!=0)    new_ctrl |= CMSDK_UART_CTRL_RXIRQEN_Msk;
+       if (tx_ovrirq_en!=0) new_ctrl |= CMSDK_UART_CTRL_TXORIRQEN_Msk;
+       if (rx_ovrirq_en!=0) new_ctrl |= CMSDK_UART_CTRL_RXORIRQEN_Msk;
+
+       CMSDK_UART->CTRL = 0;         /* Disable UART when changing configuration */
+       CMSDK_UART->BAUDDIV = divider;
+       CMSDK_UART->CTRL = new_ctrl;  /* Update CTRL register to new value */
+
+       if((CMSDK_UART->STATE & (CMSDK_UART_STATE_RXOR_Msk | CMSDK_UART_STATE_TXOR_Msk))) return 1;
+       else return 0;
+ }
+
+/**
+ *
+ * @param *CMSDK_UART UART Pointer
+ * @return RxBufferFull
+ *
+ * @brief  Returns whether the RX buffer is full.
+ */
+
+ uint32_t CMSDK_uart_GetRxBufferFull(CMSDK_UART_TypeDef *CMSDK_UART)
+ {
+        return ((CMSDK_UART->STATE & CMSDK_UART_STATE_RXBF_Msk)>> CMSDK_UART_STATE_RXBF_Pos);
+ }
+
+/**
+ *
+ * @param *CMSDK_UART UART Pointer
+ * @return TxBufferFull
+ *
+ * @brief  Returns whether the TX buffer is full.
+ */
+
+ uint32_t CMSDK_uart_GetTxBufferFull(CMSDK_UART_TypeDef *CMSDK_UART)
+ {
+        return ((CMSDK_UART->STATE & CMSDK_UART_STATE_TXBF_Msk)>> CMSDK_UART_STATE_TXBF_Pos);
+ }
+
+/**
+ *
+ * @param *CMSDK_UART UART Pointer
+ * @param txchar Character to be sent
+ * @return none
+ *
+ * @brief  Sends a character to the TX buffer for transmission.
+ */
+
+ void CMSDK_uart_SendChar(CMSDK_UART_TypeDef *CMSDK_UART, char txchar)
+ {
+       while(CMSDK_UART->STATE & CMSDK_UART_STATE_TXBF_Msk);
+       CMSDK_UART->DATA = (uint32_t)txchar;
+ }
+
+/**
+ *
+ * @param *CMSDK_UART UART Pointer
+ * @return rxchar
+ *
+ * @brief  returns the character from the RX buffer which has been received.
+ */
+
+ char CMSDK_uart_ReceiveChar(CMSDK_UART_TypeDef *CMSDK_UART)
+ {
+       while(!(CMSDK_UART->STATE & CMSDK_UART_STATE_RXBF_Msk));
+       return (char)(CMSDK_UART->DATA);
+ }
+
+/**
+ *
+ * @param *CMSDK_UART UART Pointer
+ * @return 0 - No overrun
+ * @return 1 - TX overrun
+ * @return 2 - RX overrun
+ * @return 3 - TX & RX overrun
+ *
+ * @brief  returns the current overrun status of both the RX & TX buffers.
+ */
+
+
+ uint32_t CMSDK_uart_GetOverrunStatus(CMSDK_UART_TypeDef *CMSDK_UART)
+ {
+        return ((CMSDK_UART->STATE & (CMSDK_UART_STATE_RXOR_Msk | CMSDK_UART_STATE_TXOR_Msk))>>CMSDK_UART_STATE_TXOR_Pos);
+ }
+
+/**
+ *
+ * @param *CMSDK_UART UART Pointer
+ * @return 0 - No overrun
+ * @return 1 - TX overrun
+ * @return 2 - RX overrun
+ * @return 3 - TX & RX overrun
+ *
+ * @brief  Clears the overrun status of both the RX & TX buffers and then returns the current overrun status.
+ */
+
+ uint32_t CMSDK_uart_ClearOverrunStatus(CMSDK_UART_TypeDef *CMSDK_UART)
+ {
+       CMSDK_UART->STATE = (CMSDK_UART_STATE_RXOR_Msk | CMSDK_UART_STATE_TXOR_Msk);
+        return ((CMSDK_UART->STATE & (CMSDK_UART_STATE_RXOR_Msk | CMSDK_UART_STATE_TXOR_Msk))>>CMSDK_UART_STATE_TXOR_Pos);
+ }
+
+/**
+ *
+ * @param *CMSDK_UART UART Pointer
+ * @return BaudDiv
+ *
+ * @brief  Returns the current UART Baud rate divider. Note that the Baud rate divider is the difference between the clock frequency and the Baud frequency.
+ */
+
+ uint32_t CMSDK_uart_GetBaudDivider(CMSDK_UART_TypeDef *CMSDK_UART)
+ {
+       return CMSDK_UART->BAUDDIV;
+ }
+
+ /**
+ *
+ * @param *CMSDK_UART UART Pointer
+ * @return TXStatus
+ *
+ * @brief  Returns the TX interrupt status.
+ */
+
+ uint32_t CMSDK_uart_GetTxIRQStatus(CMSDK_UART_TypeDef *CMSDK_UART)
+ {
+       return ((CMSDK_UART->INTSTATUS & CMSDK_UART_CTRL_TXIRQ_Msk)>>CMSDK_UART_CTRL_TXIRQ_Pos);
+ }
+
+/**
+ *
+ * @param *CMSDK_UART UART Pointer
+ * @return RXStatus
+ *
+ * @brief  Returns the RX interrupt status.
+ */
+
+ uint32_t CMSDK_uart_GetRxIRQStatus(CMSDK_UART_TypeDef *CMSDK_UART)
+ {
+       return ((CMSDK_UART->INTSTATUS & CMSDK_UART_CTRL_RXIRQ_Msk)>>CMSDK_UART_CTRL_RXIRQ_Pos);
+ }
+
+ /**
+ *
+ * @param *CMSDK_UART UART Pointer
+ * @return none
+ *
+ * @brief  Clears the TX buffer full interrupt status.
+ */
+
+ void CMSDK_uart_ClearTxIRQ(CMSDK_UART_TypeDef *CMSDK_UART)
+ {
+       CMSDK_UART->INTCLEAR = CMSDK_UART_CTRL_TXIRQ_Msk;
+ }
+
+/**
+ *
+ * @param *CMSDK_UART UART Pointer
+ * @return none
+ *
+ * @brief  Clears the RX interrupt status.
+ */
+
+ void CMSDK_uart_ClearRxIRQ(CMSDK_UART_TypeDef *CMSDK_UART)
+ {
+       CMSDK_UART->INTCLEAR = CMSDK_UART_CTRL_RXIRQ_Msk;
+ }
+
+
+ /*GPIO driver functions*/
+
+/**
+ *
+ * @param *CMSDK_GPIO GPIO Pointer
+ * @param outenable Bit pattern to be used to set output enable register
+ * @return none
+ *
+ * @brief  Sets pins on a port as an output. Set the bit corresponding to the pin number to 1 for output i.e. Set bit 1 of outenable to 1 to set pin 1 as an output. This function is thread safe.
+ */
+
+ void CMSDK_gpio_SetOutEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t outenableset)
+ {
+       CMSDK_GPIO->OUTENABLESET = outenableset;
+ }
+
+/**
+ *
+ * @param *CMSDK_GPIO GPIO Pointer
+ * @param outenable Bit pattern to be used to set output enable register
+ * @return none
+ *
+ * @brief  Sets pins on a port as an input. Set the bit corresponding to the pin number to 1 for input i.e. Set bit 1 of outenable to 1 to set pin 1 as an input. This function is thread safe.
+ */
+
+ void CMSDK_gpio_ClrOutEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t outenableclr)
+ {
+       CMSDK_GPIO->OUTENABLECLR = outenableclr;
+ }
+
+/**
+ *
+ * @param *CMSDK_GPIO GPIO Pointer
+ * @return outputstatus
+ *
+ * @brief  returns a uint32_t which defines the whether pins on a port are set as inputs or outputs i.e. if bit 1 of the returned uint32_t is set to 1 then this means that pin 1 is an output.
+ */
+
+ uint32_t CMSDK_gpio_GetOutEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO)
+ {
+       return CMSDK_GPIO->OUTENABLESET;
+ }
+
+/**
+ *
+ * @param *CMSDK_GPIO GPIO Pointer
+ * @param AltFunc uint32_t to specify whether the alternate function for the pins on the port is enabled
+ * @return none
+ *
+ * @brief  enables the alternative function for pins. Set the bit corresponding to the pin number to 1 for alternate function i.e. Set bit 1 of ALtFunc to 1 to set pin 1 to its alternative function. This function is thread safe.
+ */
+
+ void CMSDK_gpio_SetAltFunc(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t AltFuncset)
+ {
+       CMSDK_GPIO->ALTFUNCSET = AltFuncset;
+ }
+
+/**
+ *
+ * @param *CMSDK_GPIO GPIO Pointer
+ * @param AltFunc uint32_t to specify whether the alternate function for the pins on the port is enabled
+ * @return none
+ *
+ * @brief  disables the alternative function for pins. Set the bit corresponding to the pin number to 1 to disable alternate function i.e. Set bit 1 of ALtFunc to 1 to set pin 1 to the orignal output function. This function is thread safe.
+ */
+
+ void CMSDK_gpio_ClrAltFunc(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t AltFuncclr)
+ {
+       CMSDK_GPIO->ALTFUNCCLR = AltFuncclr;
+ }
+
+/**
+ *
+ * @param *CMSDK_GPIO GPIO Pointer
+ * @return AltFuncStatus
+ *
+ * @brief  returns a uint32_t which defines the whether pins on a port are set to their alternative or their original output functionality i.e. if bit 1 of the returned uint32_t is set to 1 then this means that pin 1 is set to its alternative function.
+ */
+
+ uint32_t CMSDK_gpio_GetAltFunc(CMSDK_GPIO_TypeDef *CMSDK_GPIO)
+ {
+       return CMSDK_GPIO->ALTFUNCSET;
+ }
+
+/**
+ *
+ * @param *CMSDK_GPIO GPIO Pointer
+ * @param Num The pin number for which to clear the Interrupt
+ * @return NewIntStatus
+ *
+ * @brief  Clears the interrupt flag for the specified pin and then returns the new interrupt status of the pin. This function is thread safe.
+ */
+
+ uint32_t CMSDK_gpio_IntClear(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num)
+ {
+       CMSDK_GPIO->INTCLEAR = (1 << Num);
+
+       return CMSDK_GPIO->INTSTATUS;
+ }
+
+/**
+ *
+ * @param *CMSDK_GPIO GPIO Pointer
+ * @param Num The pin number for which to enable the Interrupt
+ * @return NewIntEnStatus
+ *
+ * @brief  Enables interrupts for the specified pin and then returns the new interrupt enable status of the pin. This function is thread safe.
+ */
+
+ uint32_t CMSDK_gpio_SetIntEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num)
+ {
+       CMSDK_GPIO->INTENSET = (1 << Num);
+
+       return CMSDK_GPIO->INTENSET;
+ }
+
+/**
+ *
+ * @param *CMSDK_GPIO GPIO Pointer
+ * @param Num The pin number for which to disable the Interrupt
+ * @return NewIntEnStatus
+ *
+ * @brief  Disables interrupts for the specified pin and then returns the new interrupt enable status of the pin. This function is thread safe.
+ */
+
+  uint32_t CMSDK_gpio_ClrIntEnable(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num)
+ {
+       CMSDK_GPIO->INTENCLR = (1 << Num);
+
+       return CMSDK_GPIO->INTENCLR;
+ }
+
+/**
+ *
+ * @param *CMSDK_GPIO GPIO Pointer
+ * @param Num The pin number for which to set the Interrupt type
+ * @return none
+ *
+ * @brief  Changes the interrupt type for the specified pin to a high level interrupt. This function is thread safe.
+ */
+
+ void CMSDK_gpio_SetIntHighLevel(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num)
+ {
+       CMSDK_GPIO->INTTYPECLR = (1 << Num); /* Clear INT TYPE bit */
+       CMSDK_GPIO->INTPOLSET = (1 << Num);  /* Set INT POLarity bit */
+ }
+
+/**
+ *
+ * @param *CMSDK_GPIO GPIO Pointer
+ * @param Num The pin number for which to set the Interrupt type
+ * @return none
+ *
+ * @brief  Changes the interrupt type for the specified pin to a rising edge interrupt. This function is thread safe.
+ */
+
+ void CMSDK_gpio_SetIntRisingEdge(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num)
+ {
+       CMSDK_GPIO->INTTYPESET = (1 << Num); /* Set INT TYPE bit */
+       CMSDK_GPIO->INTPOLSET = (1 << Num);  /* Set INT POLarity bit */
+ }
+
+/**
+ *
+ * @param *CMSDK_GPIO GPIO Pointer
+ * @param Num The pin number for which to set the Interrupt type
+ * @return none
+ *
+ * @brief  Changes the interrupt type for the specified pin to a low level interrupt. This function is thread safe.
+ */
+
+ void CMSDK_gpio_SetIntLowLevel(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num)
+ {
+       CMSDK_GPIO->INTTYPECLR = (1 << Num);  /* Clear INT TYPE bit */
+       CMSDK_GPIO->INTPOLCLR = (1 << Num);   /* Clear INT POLarity bit */
+ }
+
+/**
+ *
+ * @param *CMSDK_GPIO GPIO Pointer
+ * @param Num The pin number for which to set the Interrupt type
+ * @return none
+ *
+ * @brief  Changes the interrupt type for the specified pin to a falling edge interrupt. This function is thread safe.
+ */
+
+ void CMSDK_gpio_SetIntFallingEdge(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t Num)
+ {
+       CMSDK_GPIO->INTTYPESET = (1 << Num);  /* Set INT TYPE bit */
+       CMSDK_GPIO->INTPOLCLR = (1 << Num);   /* Clear INT POLarity bit */
+ }
+
+/**
+ *
+ * @param *CMSDK_GPIO GPIO Pointer
+ * @param mask The output port mask
+ * @param value The value to output to the specified port
+ * @return none
+ *
+ * @brief Outputs the specified value on the desired port using the user defined mask to perform Masked access.
+ */
+
+ void CMSDK_gpio_MaskedWrite(CMSDK_GPIO_TypeDef *CMSDK_GPIO, uint32_t value, uint32_t mask)
+ {
+       CMSDK_GPIO->LB_MASKED[0x00FF & mask] = value;
+       CMSDK_GPIO->UB_MASKED[((0xFF00 & mask) >> 8)] = value;
+ }
+
diff --git a/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/GCC/startup_CMSDK_CM0.s b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/GCC/startup_CMSDK_CM0.s
new file mode 100644
index 0000000..b67683a
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/GCC/startup_CMSDK_CM0.s
@@ -0,0 +1,270 @@
+/**************************************************************************//**
+ * @file     startup_CMSDK_CM0.s
+ * @brief    CMSIS Cortex-M0 Core Device Startup File for
+ *           Device CMSDK_CM0
+ * @version  V3.01
+ * @date     06. March 2012
+ *
+ * @note      Should use with GCC for ARM Embedded Processors
+ * Copyright (C) 2012 ARM Limited. All rights reserved.
+ *
+ * @par
+ * ARM Limited (ARM) is supplying this software for use with Cortex-M
+ * processor based microcontrollers.  This file can be freely distributed
+ * within development tools that are supporting such ARM based processors.
+ *
+ * @par
+ * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
+ * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
+ * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
+ * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+ *
+ ******************************************************************************/
+/*****************************************************************************/
+/* startup_CMSDK_CM3.s: Startup file for CMSDK device series               */
+/*****************************************************************************/
+/* Version: GNU Tools for ARM Embedded Processors                          */
+/*****************************************************************************/
+
+
+    .syntax unified
+    .arch armv6-m
+
+    .section .stack
+    .align 3
+
+/*
+// <h> Stack Configuration
+//   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+// </h>
+*/
+
+    .section .stack
+    .align 3
+#ifdef __STACK_SIZE
+    .equ    Stack_Size, __STACK_SIZE
+#else
+    .equ    Stack_Size, 0x200
+#endif
+    .globl    __StackTop
+    .globl    __StackLimit
+__StackLimit:
+    .space    Stack_Size
+    .size __StackLimit, . - __StackLimit
+__StackTop:
+    .size __StackTop, . - __StackTop
+
+
+/*
+// <h> Heap Configuration
+//   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+// </h>
+*/
+
+    .section .heap
+    .align 3
+#ifdef __HEAP_SIZE
+    .equ    Heap_Size, __HEAP_SIZE
+#else
+    .equ    Heap_Size, 0
+#endif
+    .globl    __HeapBase
+    .globl    __HeapLimit
+__HeapBase:
+    .if    Heap_Size
+    .space    Heap_Size
+    .endif
+    .size __HeapBase, . - __HeapBase
+__HeapLimit:
+    .size __HeapLimit, . - __HeapLimit
+
+
+/* Vector Table */
+
+    .section .isr_vector
+    .align 2
+    .globl __isr_vector
+__isr_vector:
+    .long   __StackTop                  /* Top of Stack                  */
+    .long   Reset_Handler               /* Reset Handler                 */
+    .long   NMI_Handler                 /* NMI Handler                   */
+    .long   HardFault_Handler           /* Hard Fault Handler            */
+    .long   0                           /* Reserved                      */
+    .long   0                           /* Reserved                      */
+    .long   0                           /* Reserved                      */
+    .long   0                           /* Reserved                      */
+    .long   0                           /* Reserved                      */
+    .long   0                           /* Reserved                      */
+    .long   0                           /* Reserved                      */
+    .long   SVC_Handler                 /* SVCall Handler                */
+    .long   0                           /* Debug Monitor Handler         */
+    .long   0                           /* Reserved                      */
+    .long   PendSV_Handler              /* PendSV Handler                */
+    .long   SysTick_Handler             /* SysTick Handler               */
+
+    /* External Interrupts */
+    .long   UARTRX0_Handler             /* 16+ 0: UART 0 RX Handler          */
+    .long   UARTTX0_Handler             /* 16+ 1: UART 0 TX Handler          */
+    .long   UARTRX1_Handler             /* 16+ 2: UART 1 RX Handler          */
+    .long   UARTTX1_Handler             /* 16+ 3: UART 1 TX Handler          */
+    .long   UARTRX2_Handler             /* 16+ 4: UART 2 RX Handler          */
+    .long   UARTTX2_Handler             /* 16+ 5: UART 2 TX Handler          */
+    .long   PORT0_COMB_Handler          /* 16+ 6: GPIO Port 0 Combined Handler */
+    .long   PORT1_COMB_Handler          /* 16+ 7: GPIO Port 1 Combined Handler */
+    .long   TIMER0_Handler              /* 16+ 8: TIMER 0 handler            */
+    .long   TIMER1_Handler              /* 16+ 9: TIMER 1 handler            */
+    .long   DUALTIMER_HANDLER           /* 16+10: Dual timer 2 handler       */
+    .long   0                           /* 16+11: Reserved                   */
+    .long   UARTOVF0_Handler            /* 16+12: UART 0 Overflow Handler    */
+    .long   UARTOVF1_Handler            /* 16+13: UART 1 Overflow Handler    */
+    .long   UARTOVF2_Handler            /* 16+14: UART 2 Overflow Handler    */
+    .long   DMA_Handler                 /* 16+15: DMA done + error Handler   */
+    .long   PORT0_0_Handler             /* 16+16: GPIO Port 0 pin 0 Handler  */
+    .long   PORT0_1_Handler             /* 16+17: GPIO Port 0 pin 1 Handler  */
+    .long   PORT0_2_Handler             /* 16+18: GPIO Port 0 pin 2 Handler  */
+    .long   PORT0_3_Handler             /* 16+19: GPIO Port 0 pin 3 Handler  */
+    .long   PORT0_4_Handler             /* 16+20: GPIO Port 0 pin 4 Handler  */
+    .long   PORT0_5_Handler             /* 16+21: GPIO Port 0 pin 5 Handler  */
+    .long   PORT0_6_Handler             /* 16+22: GPIO Port 0 pin 6 Handler  */
+    .long   PORT0_7_Handler             /* 16+23: GPIO Port 0 pin 7 Handler  */
+    .long   PORT0_8_Handler             /* 16+24: GPIO Port 0 pin 8 Handler  */
+    .long   PORT0_9_Handler             /* 16+25: GPIO Port 0 pin 9 Handler  */
+    .long   PORT0_10_Handler            /* 16+26: GPIO Port 0 pin 10 Handler */
+    .long   PORT0_11_Handler            /* 16+27: GPIO Port 0 pin 11 Handler */
+    .long   PORT0_12_Handler            /* 16+28: GPIO Port 0 pin 12 Handler */
+    .long   PORT0_13_Handler            /* 16+29: GPIO Port 0 pin 13 Handler */
+    .long   PORT0_14_Handler            /* 16+30: GPIO Port 0 pin 14 Handler */
+    .long   PORT0_15_Handler            /* 16+31: GPIO Port 0 pin 15 Handler */
+
+    .size    __isr_vector, . - __isr_vector
+
+/* Reset Handler */
+    .text
+    .thumb
+    .thumb_func
+    .align 2
+    .globl    Reset_Handler
+    .type    Reset_Handler, %function
+Reset_Handler:
+/*     Loop to copy data from read only memory to RAM. The ranges
+ *      of copy from/to are specified by following symbols evaluated in
+ *      linker script.
+ *      __etext: End of code section, i.e., begin of data sections to copy from.
+ *      __data_start__/__data_end__: RAM address range that data should be
+ *      copied to. Both must be aligned to 4 bytes boundary.  */
+
+    ldr    r1, =__etext
+    ldr    r2, =__data_start__
+    ldr    r3, =__data_end__
+
+    subs    r3, r2
+    ble    .LC1
+.LC0:
+    subs    r3, #4
+    ldr    r0, [r1, r3]
+    str    r0, [r2, r3]
+    bgt    .LC0
+.LC1:
+
+#ifdef __STARTUP_CLEAR_BSS
+/*     This part of work usually is done in C library startup code. Otherwise,
+ *     define this macro to enable it in this startup.
+ *
+ *     Loop to zero out BSS section, which uses following symbols
+ *     in linker script:
+ *      __bss_start__: start of BSS section. Must align to 4
+ *      __bss_end__: end of BSS section. Must align to 4
+ */
+    ldr r1, =__bss_start__
+    ldr r2, =__bss_end__
+
+    subs    r2, r1
+    ble .LC3
+
+    movs    r0, 0
+.LC2:
+    str r0, [r1, r2]
+    subs    r2, 4
+    bge .LC2
+.LC3:
+#endif /* __STARTUP_CLEAR_BSS */
+
+#ifndef __NO_SYSTEM_INIT
+    /* bl    SystemInit */
+    ldr     r0,=SystemInit
+    blx     r0
+#endif
+
+    bl    _start
+
+    .pool
+    .size Reset_Handler, . - Reset_Handler
+
+/*    Macro to define default handlers. Default handler
+ *    will be weak symbol and just dead loops. They can be
+ *    overwritten by other handlers */
+    .macro    def_default_handler    handler_name
+    .align 1
+    .thumb_func
+    .weak    \handler_name
+    .type    \handler_name, %function
+\handler_name :
+    b    .
+    .size    \handler_name, . - \handler_name
+    .endm
+
+/* System Exception Handlers */
+
+    def_default_handler    NMI_Handler
+    def_default_handler    HardFault_Handler
+    def_default_handler    MemManage_Handler
+    def_default_handler    BusFault_Handler
+    def_default_handler    UsageFault_Handler
+    def_default_handler    SVC_Handler
+    def_default_handler    DebugMon_Handler
+    def_default_handler    PendSV_Handler
+    def_default_handler    SysTick_Handler
+
+/* IRQ Handlers */
+
+    def_default_handler    UARTRX0_Handler
+    def_default_handler    UARTTX0_Handler
+    def_default_handler    UARTRX1_Handler
+    def_default_handler    UARTTX1_Handler
+    def_default_handler    UARTRX2_Handler
+    def_default_handler    UARTTX2_Handler
+    def_default_handler    PORT0_COMB_Handler
+    def_default_handler    PORT1_COMB_Handler
+    def_default_handler    TIMER0_Handler
+    def_default_handler    TIMER1_Handler
+    def_default_handler    DUALTIMER_HANDLER
+    def_default_handler    UARTOVF0_Handler
+    def_default_handler    UARTOVF1_Handler
+    def_default_handler    UARTOVF2_Handler
+    def_default_handler    DMA_Handler
+    def_default_handler    PORT0_0_Handler
+    def_default_handler    PORT0_1_Handler
+    def_default_handler    PORT0_2_Handler
+    def_default_handler    PORT0_3_Handler
+    def_default_handler    PORT0_4_Handler
+    def_default_handler    PORT0_5_Handler
+    def_default_handler    PORT0_6_Handler
+    def_default_handler    PORT0_7_Handler
+    def_default_handler    PORT0_8_Handler
+    def_default_handler    PORT0_9_Handler
+    def_default_handler    PORT0_10_Handler
+    def_default_handler    PORT0_11_Handler
+    def_default_handler    PORT0_12_Handler
+    def_default_handler    PORT0_13_Handler
+    def_default_handler    PORT0_14_Handler
+    def_default_handler    PORT0_15_Handler
+
+
+    /*
+    def_default_handler    Default_Handler
+    .weak    DEF_IRQHandler
+    .set    DEF_IRQHandler, Default_Handler
+    */
+    .end
+
diff --git a/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/system_CMSDK_CM0.c b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/system_CMSDK_CM0.c
new file mode 100644
index 0000000..9056bf4
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/cmsis/Device/ARM/CMSDK_CM0/Source/system_CMSDK_CM0.c
@@ -0,0 +1,68 @@
+/**************************************************************************//**
+ * @file     system_CMSDK_CM0.c
+ * @brief    CMSIS Cortex-M0 Device Peripheral Access Layer Source File for
+ *           Device CMSDK
+ * @version  V3.01
+ * @date     06. March 2012
+ *
+ * @note
+ * Copyright (C) 2010-2012 ARM Limited. All rights reserved.
+ *
+ * @par
+ * ARM Limited (ARM) is supplying this software for use with Cortex-M
+ * processor based microcontrollers.  This file can be freely distributed
+ * within development tools that are supporting such ARM based processors.
+ *
+ * @par
+ * THIS SOFTWARE IS PROVIDED "AS IS".  NO WARRANTIES, WHETHER EXPRESS, IMPLIED
+ * OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
+ * ARM SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
+ * CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+ *
+ ******************************************************************************/
+
+
+#include <stdint.h>
+#include "CMSDK_CM0.h"
+
+
+/*----------------------------------------------------------------------------
+  DEFINES
+ *----------------------------------------------------------------------------*/
+
+/*----------------------------------------------------------------------------
+  Define clocks
+ *----------------------------------------------------------------------------*/
+
+#define XTAL    (100000000UL)            /* Oscillator frequency               */
+
+
+/*----------------------------------------------------------------------------
+  Clock Variable definitions
+ *----------------------------------------------------------------------------*/
+uint32_t SystemFrequency = XTAL;    /*!< System Clock Frequency (Core Clock)  */
+uint32_t SystemCoreClock = XTAL;    /*!< Processor Clock Frequency            */
+
+
+/*----------------------------------------------------------------------------
+  Clock functions
+ *----------------------------------------------------------------------------*/
+void SystemCoreClockUpdate (void)            /* Get Core Clock Frequency      */
+{
+  SystemCoreClock = XTAL;
+}
+
+/**
+ * Initialize the system
+ *
+ * @param  none
+ * @return none
+ *
+ * @brief  Setup the microcontroller system.
+ *         Initialize the System.
+ */
+void SystemInit (void)
+{
+  SystemCoreClock = XTAL;
+}
diff --git a/Cortex-M0/nanosoc/software/common/bootloader/bootloader.c b/Cortex-M0/nanosoc/software/common/bootloader/bootloader.c
new file mode 100644
index 0000000..fcebe2c
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/bootloader/bootloader.c
@@ -0,0 +1,142 @@
+//-----------------------------------------------------------------------------
+// customised Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//-----------------------------------------------------------------------------
+//
+
+//
+//  Simple boot loader
+//  - display a message that the boot loader is running
+//  - clear remap control (user flash accessible from address 0x0)
+//  - execute program from user flash
+//
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+void UartStdOutInit(void)
+{
+//  CMSDK_UART2->BAUDDIV = 16;
+//  CMSDK_UART2->CTRL    = 0x41; // High speed test mode, TX only
+  CMSDK_UART2->BAUDDIV = 2080; //(20MHz/9600)
+  CMSDK_UART2->CTRL    = 0x01; //TX only, standard UART
+  CMSDK_USRT2->CTRL    = 0x01; //TX only, FT1248 USRT
+  CMSDK_GPIO1->ALTFUNCSET = (1<<5);
+  return;
+}
+// Output a character
+unsigned char UartPutc(unsigned char my_ch)
+{
+///  while ((CMSDK_UART2->STATE & 1)); // Wait if Transmit Holding register is full
+///  CMSDK_UART2->DATA = my_ch; // write to transmit holding register
+///  if ((CMSDK_USRT2->STATE & 1) == 0)
+  while ((CMSDK_USRT2->STATE & 1)); // Wait if Transmit Holding register is full
+  if ((CMSDK_USRT2->STATE & 1) == 0)
+    CMSDK_USRT2->DATA = my_ch; // write to transmit holding register
+  return (my_ch);
+}
+// Uart string output
+void UartPuts(unsigned char * mytext)
+{
+  unsigned char CurrChar;
+  do {
+    CurrChar = *mytext;
+    if (CurrChar != (char) 0x0) {
+      UartPutc(CurrChar);  // Normal data
+      }
+    *mytext++;
+  } while (CurrChar != 0);
+  return;
+}
+#if defined ( __CC_ARM   )
+/* ARM RVDS or Keil MDK */
+__asm void FlashLoader_ASM(void)
+{
+   MOVS  R0,#0
+   LDR   R1,[R0]     ; Get initial MSP value
+   MOV   SP, R1
+   LDR   R1,[R0, #4] ; Get initial PC value
+   BX    R1
+}
+
+#else
+/* ARM GCC */
+void FlashLoader_ASM(void) __attribute__((naked));
+void FlashLoader_ASM(void)
+{
+   __asm("    movs  r0,#0\n"
+         "    ldr   r1,[r0]\n"     /* Get initial MSP value */
+         "    mov   sp, r1\n"
+         "    ldr   r1,[r0, #4]\n" /* Get initial PC value */
+         "    bx    r1\n");
+}
+
+#endif
+
+void FlashLoader(void)
+{
+  if (CMSDK_SYSCON->REMAP==0) {
+    /* Remap is already cleared. Something has gone wrong.
+    Likely that the user is trying to run bootloader as a test,
+     which is not what this program is for.
+    */
+    UartPuts("@Error: REMAP cleared\n");
+    UartPutc(0x4); // Terminate simulation
+    while (1);
+    }
+  UartPuts("** Remap->RAM2\n"); // CMSDK boot loader\n");
+  CMSDK_SYSCON->REMAP = 0;  // Clear remap
+  __DSB();
+  __ISB();
+
+  FlashLoader_ASM();
+};
+
+int main (void)
+{
+  // UART init
+  UartStdOutInit();
+
+  UartPuts("\n\n\nSOCLABS: ARM Cortex-M0 nanosoc\n");
+  FlashLoader();
+  return 0;
+}
+
diff --git a/Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.c b/Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.c
new file mode 100644
index 0000000..88fc02e
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.c
@@ -0,0 +1,508 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+//==============================================================================
+//
+// CORTEX-M System Design Kit Debug Test
+//
+//==============================================================================
+
+
+// If DBG is present, this test checks:
+//
+// ID value check
+//
+//   -  Check some ID registers like CPUID, BASEADDRESS,
+//
+// WFI SLEEPDEEP, Debugger Wakeup
+//
+//   - Check when processor in deep sleep mode, the debugger can wakeup
+//     the processor
+//
+// DAP Access
+//
+//   - The test uses the debug tester to read and write to memory using
+//     Word, Halfword and Byte accesses.
+//
+//
+// LOCKUP
+//
+//   - The test enters the architected lock-up state by accessing faulting
+//     memory from within the HardFault handler. The debug tester checks
+//     that lockup has been entered and checks that the LOCKUP pin has been
+//     driven by reading the example MCU internal debug register.
+//
+//
+
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#include "core_cm0.h"
+
+#else
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#include "core_cm0plus.h"
+
+#else
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#include "core_cm3.h"
+
+#else
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#include "core_cm4.h"
+
+#endif
+#endif
+#endif
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"
+#include "mcu_debugtester_interface.h" // For definition of interface to the debug tester
+#include "CMSDK_driver.h"
+
+
+#include "config_id.h"
+#include "debug_tests.h"
+#include "debugtester_functions.h"
+
+
+///////////////////////////////////////////////////////////////////////
+// Global Variables to track test progress
+///////////////////////////////////////////////////////////////////////
+
+uint32_t Errors = 0;
+volatile uint32_t ExpectHardFault = 0;
+uint32_t HardFaultTaken = 0;
+
+typedef void (* FuncPtr)(void);
+
+
+///////////////////////////////////////////////////////////////////////
+//Function prototype
+///////////////////////////////////////////////////////////////////////
+void HardFault_Handler(void);
+
+
+///////////////////////////////////////////////////////////////////////
+//Main code
+///////////////////////////////////////////////////////////////////////
+
+int main (void)
+{
+
+  // UART init
+  UartStdOutInit();
+
+  // This test requires DBG to be present.
+  // If EXPECTED_DBG indicates that DBG is not present, this test will
+  // PASS to allow a clean test run.
+
+  printf("%s - Debug Test\n", MCU_CPU_NAME);
+
+  if(EXPECTED_DBG != 1)
+    {
+      puts("EXPECTED_DBG parameter set to 0\n** TEST SKIPPED **\n");
+      UartEndSimulation();   // stop simulation
+      return 1;
+    }
+  else
+    {
+
+      EnableDebugTester();
+
+      puts("Debug Test is now enabled\n");
+
+      /////////////////////////////////////////////////////////////////////////////
+      // Initialise debug tester to correct protocol
+      /////////////////////////////////////////////////////////////////////////////
+      //DAP must be power down when setting the interface mode
+
+      puts("Setting debug interface mode\n");
+      if(EXPECTED_JTAGnSW)
+        {
+          CallDebugTester(FnSetInterfaceJTAG);
+        }
+      else
+        {
+          CallDebugTester(FnSetInterfaceSW);
+        }
+
+      puts("Debug Test interface set successfully\n");
+
+
+      /////////////////////////////////////////////////////////////////////////////
+      // Check DAP powerup
+      /////////////////////////////////////////////////////////////////////////////
+      puts("Checking DAP powerup:\n");
+      if (CallDebugTester (FnDAPPowerUp) == TEST_PASS )
+        {
+	  puts("\tPASS\n");
+        }
+      else
+        {
+	  Errors++;
+	  puts("\tFAIL\n");
+        }
+
+
+      /////////////////////////////////////////////////////////////////////////////
+      // Check CPU ID
+      /////////////////////////////////////////////////////////////////////////////
+      puts("Checking CPU ID:\n");
+
+      // Write CPUID address to stacktop
+      DEBUGTESTERDATA[0] = 0xE000ED00;
+
+      // Call GetAPMem()
+      if( CallDebugTester(FnGetAPMem) == TEST_PASS )
+	{
+	  // Check returned value matches expected CPU ID
+
+	  if(DEBUGTESTERDATA[0] == MCU_CPU_ID_VALUE)
+	    {
+	      puts("\tPASS\n");
+	    }
+	  else
+	    {
+	      Errors++;
+	      printf("\tFAIL - Expected %x, got %x\n", MCU_CPU_ID_VALUE, DEBUGTESTERDATA[0]);
+	    }
+	}
+      else
+	{
+	  Errors++;
+	  puts("\tFAIL\n");
+	}
+
+
+      if (EXPECTED_SIMPLE_CHECK)
+	{
+	  //Above check is enough
+	}
+      else
+	{
+	  //Complex check start here
+
+	  /////////////////////////////////////////////////////////////////////////////
+	  // Check DP ID
+	  /////////////////////////////////////////////////////////////////////////////
+	  puts("Checking DP ID:\n");
+
+	  DEBUGTESTERDATA[0] = 0x0; //DPIDR
+
+	  if (CallDebugTester (FnGetDPReg) == TEST_PASS )
+	    {
+	      if(DEBUGTESTERDATA[0] == MCU_DP_IDR_VALUE)
+		{
+		  puts("\tPASS\n");
+		}
+	      else
+		{
+		  Errors++;
+		  printf("\tFAIL - Expected %x, got %x\n", MCU_DP_IDR_VALUE, DEBUGTESTERDATA[0]);
+		}
+	    }
+	  else
+	    {
+	      Errors++;
+	      puts("\tFAIL\n");
+	    }
+
+	  /////////////////////////////////////////////////////////////////////////////
+	  // Check AP ID
+	  /////////////////////////////////////////////////////////////////////////////
+
+	  puts("Checking AP ID:\n");
+
+	  DEBUGTESTERDATA[0] = 0xFC; //APIDR
+
+	  if (CallDebugTester (FnGetAPReg) == TEST_PASS )
+	    {
+	      if(DEBUGTESTERDATA[0] == MCU_AP_IDR_VALUE)
+		{
+		  puts("\tPASS\n");
+		}
+	      else
+		{
+		  Errors++;
+		  printf("\tFAIL - Expected %x, got %x\n", MCU_AP_IDR_VALUE, DEBUGTESTERDATA[0]);
+		}
+	    }
+	  else
+	    {
+	      Errors++;
+	      puts("\tFAIL\n");
+	    }
+
+
+	  /////////////////////////////////////////////////////////////////////////////
+	  // Check BASE
+	  /////////////////////////////////////////////////////////////////////////////
+	  puts("Checking BASE:\n");
+
+	  DEBUGTESTERDATA[0] = 0xF8; //APBASE
+
+	  if (CallDebugTester (FnGetAPReg) == TEST_PASS )
+	    {
+	      if(DEBUGTESTERDATA[0] == MCU_AP_BASE_VALUE)
+		{
+		  puts("\tPASS\n");
+		}
+	      else
+		{
+		  Errors++;
+		  printf("\tFAIL - Expected %x, got %x\n", MCU_AP_BASE_VALUE, DEBUGTESTERDATA[0]);
+		}
+	    }
+	  else
+	    {
+	      Errors++;
+	      puts("\tFAIL\n");
+	    }
+
+
+	  /////////////////////////////////////////////////////////////////////////////
+	  // WFI SLEEPDEEP, Debugger Wakeup
+	  /////////////////////////////////////////////////////////////////////////////
+	  puts("WFI SLEEPDEEP, Debugger Wakeup:\n");
+	  // Clear data value
+	  DEBUGTESTERDATA[0] = 0;
+	  // Ensure we SLEEPDEEP - SLEEPDEEP should be set
+	  SET_SLEEP_DEEP();
+
+	  // Wakeup will be due to the debugger
+	  StartDebugTester(FnConnectWakeUnhalt);
+
+	  // Wait For Interrupt loop
+	  while(DEBUGTESTERDATA[0] == 0)
+	    {
+	      __WFI();
+	      __ISB();
+	    }
+
+	  if(CheckDebugTester() == TEST_PASS)
+	    {
+	      puts("\tPASS\n");
+	    }
+	  else
+	    {
+	      Errors++;
+	      puts("\tFAIL\n");
+	    }
+
+
+	  /////////////////////////////////////////////////////////////////////////////
+	  // DAP Access
+	  //
+	  // Check Word, Halfword and Byte accesses to memory
+	  // via the DAP, using the debug tester.
+	  /////////////////////////////////////////////////////////////////////////////
+
+	  puts("DAP Access:\n");
+
+	  DEBUGTESTERDATA[0] = 0;
+
+	  if( CallDebugTester(FnDAPAccess) == TEST_PASS )
+	    {
+	      // Check returned value from debug tester
+	      puts("DAP Access: Test pass, checking returned values ....\n");
+	      printf("After testing: DEBUGTESTERDATA[0] == %x :\n",DEBUGTESTERDATA[0] );
+	      puts("\tWORD: ");
+
+	      if( (DEBUGTESTERDATA[0]) & 0x1 )
+		{
+		  puts("\tPASS\n");
+		}
+	      else
+		{
+		  Errors++;
+		  puts("\tFAIL\n");
+		}
+
+	      puts("\tHALFWORD: ");
+
+	      if( (DEBUGTESTERDATA[0]) & 0x2 )
+		{
+		  puts("\tPASS\n");
+		}
+	      else
+		{
+		  Errors++;
+		  puts("\tFAIL\n");
+		}
+
+	      puts("\tBYTE: ");
+
+	      if( (DEBUGTESTERDATA[0]) & 0x4 )
+		{
+		  puts("\tPASS\n");
+		}
+	      else
+		{
+		  Errors++;
+		  puts("\tFAIL\n");
+		}
+
+	    }
+	  else
+	    {
+	      Errors++;
+	      puts("\tFAIL\n");
+	    }
+
+	  // Clear data value
+	  DEBUGTESTERDATA[0] = 0;
+
+
+	  /////////////////////////////////////////////////////////////////////////////
+	  // LOCKUP
+	  //
+	  // Create LOCKUP scenario by accessing faulting instruction within the HardFault Handler
+	  // We enter the HardFault Handler by accessing faulting instruction
+	  // The debugger will check for lockup before allowing execution to resume.
+	  /////////////////////////////////////////////////////////////////////////////
+
+	  // Set up memory locations pointed to by FaultFunction
+	  // to contain instruction code that will cause a hardware fault
+	  //
+
+	  // HardwareFault is generated by accessing the undefined instruction
+	  // so we can generate a fault like this:
+	  // xxxxx (0xf123) // non-exist instruction like 0xf123
+	  // BX LR (0x4770) //
+
+	  //
+	  // Set up a faulting version and a non faulting version.
+	  // The debugger will copy the non-faulting version over the
+	  // faulting version to enable the MCU to return to the function
+	  // without incurring further faults.
+	  //
+
+	  // Little Endian Encodings:
+	  // FAULTLOAD 0xf123     //Non-exist instruction 0xf123
+	  // NONFAULT  0x0000     //NOP
+	  // RETURN    0x4770     //BX LR
+
+	  if(EXPECTED_BE)
+	    {
+	      // Non Faulting
+	      DEBUGTESTERDATA[2] = 0x00007047;
+	      // Faulting
+	      DEBUGTESTERDATA[3] = 0x23f17047;
+	    }
+	  else
+	    {
+	      // Non Faulting
+	      DEBUGTESTERDATA[2] = 0x47700000;
+	      // Faulting
+	      DEBUGTESTERDATA[3] = 0x4770f123;
+	    }
+
+
+	  puts("LOCKUP:\n");
+
+	  ExpectHardFault = 1;
+
+
+	  // Start Debug Tester function that will get us out of Lockup
+	  StartDebugTester(FnConnectCheckUnlockup);
+
+          while(HardFaultTaken == 0)
+	    {
+	      ((FuncPtr) ( 1+(uint32_t)(&(DEBUGTESTERDATA[3]))) ) ();
+	    }
+
+	  printf("HardFaultTaken = %x\n", HardFaultTaken);
+
+	  // Get here if we took HardFault -> LOCKUP -> Debugger returned us
+
+	  if( (CheckDebugTester() == TEST_PASS) && HardFaultTaken)
+	    {
+	      puts("\tPASS\n");
+	    }
+	  else
+	    {
+	      Errors++;
+	      puts("\tFAIL\n");
+	    }
+
+	  //Complex check end here
+	}
+
+      /////////////////////////////////////////////////////////////////////////////
+      // Check DAP powerdown
+      /////////////////////////////////////////////////////////////////////////////
+      puts("Checking DAP power down:\n");
+      if (CallDebugTester (FnDAPPowerDown) == TEST_PASS )
+	{
+	  puts("\tPASS\n");
+	}
+      else
+	{
+	  Errors++;
+	  puts("\tFAIL\n");
+	}
+
+
+      //Print final test result
+      if (Errors == 0) {
+	puts("** TEST PASSED **\n");
+      } else {
+	printf("** TEST FAILED ** with Error code:%d\n", Errors);
+      }
+
+      DisableDebugTester();
+
+      return Errors;
+    }
+}
+
+
+
+/////////////////////////////////////////////////////////////////////////////
+// Hardware Fault Handlers
+/////////////////////////////////////////////////////////////////////////////
+void HardFault_Handler(void)
+{
+  // The HardFault Handler is used for testing LOCKUP in this test
+
+  if(ExpectHardFault == 1)
+    {
+      // Tell main() that we took the HardFault
+      HardFaultTaken = 1;
+
+      // Access the undefined instruction to take core into LOCKUP
+      ((FuncPtr) (1+(uint32_t)(&(DEBUGTESTERDATA[3])))) (); //Branch to the undefined instruction address
+                                                            //with the LSB of the instruction to be 1
+    }
+  else
+    {
+      // Not expecting a fault
+      puts("Unexpected HardFault - FAIL\n");
+    }
+}
diff --git a/Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.h b/Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.h
new file mode 100644
index 0000000..3c4602e
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/debug_tests/debug_tests.h
@@ -0,0 +1,83 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//-----------------------------------------------------------------------------
+//
+
+//==============================================================================
+// Cortex-M0/M0+ Debug test header File
+//==============================================================================
+
+#define TEST_PASS 0
+#define TEST_FAIL 1
+
+//Test command sequence definition
+#define  DBG_ESCAPE          0x1B
+#define  DBG_CONNECT_ENABLE  0x11
+#define  DBG_CONNECT_DISABLE 0x12
+#define  DBG_SIM_STOP        0x4
+
+
+// GPIO0 bit allocation
+//
+// CM0_MCU GPIO0 --------------------------------------  Debug Tester
+//
+// GPIO[15] 7 <----------------------------------------< Running
+// GPIO[14] 6 <----------------------------------------< Error
+// GPIO[13] 5 >----------------------------------------> Function Strobe
+// GPIO[12] 4 >----------------------------------------> Function Select bit 4
+// GPIO[11] 3 >----------------------------------------> Function Select bit 3
+// GPIO[10] 2 >----------------------------------------> Function Select bit 2
+// GPIO[9]  1 >----------------------------------------> Function Select bit 1
+// GPIO[8]  0 >----------------------------------------> Function Select bit 0
+//
+#define   DEBUG_BIT_LOC            8  //GPIO[8] is the least bit of Function Select
+#define   DEBUG_CMD                0x3f<<8            //GPIO [13:8]
+#define   DEBUG_STROBE             0x00002000         //GPIO [13]
+#define   DEBUG_ERROR              0x00004000         //GPIO [14]
+#define   DEBUG_RUNNING            0x00008000         //GPIO [15]
+
+// GPIO1[7] 7
+// GPIO1[6] 6
+// GPIO1[5] 5
+// GPIO1[4] 4
+// GPIO1[3] 3
+// GPIO1[2] 2
+// GPIO1[1] 1
+// GPIO1[0] 0
+
+
+// CM0 MCU's view of the memory shared with the debugtester
+// (4 words above stack top)
+// This macro uses the SP value from the vector table as stacktop
+// The stacktop can not be set to the top of the memory.
+#define DEBUGTESTERDATA ((volatile uint32_t *) *((uint32_t *) 0x0))
+
+
+// A convenient way to access the AHB Default Slave
+// (1st word above top of RAM)
+#define AHBDEFAULTSLAVE ((volatile uint32_t *) ((uint32_t) 0x20010000))
+
+
+//Function definition
+// Ensure we SLEEPDEEP - SLEEPDEEP should be set
+// SCR[2] = SLEEPDEEP
+#define  SET_SLEEP_DEEP()  SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk
+
diff --git a/Cortex-M0/nanosoc/software/common/demos/dualtimer_demo.c b/Cortex-M0/nanosoc/software/common/demos/dualtimer_demo.c
new file mode 100644
index 0000000..2a69f5a
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/demos/dualtimer_demo.c
@@ -0,0 +1,877 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+/*
+  Dual timer demonstration
+
+  This test demonstrate setting the dual timer in different modes/
+  Since the execution speed of the program can be affected by memory speed
+  and hence result can change, the only checks in this program is the
+  occurrence of interrupts.
+*/
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"
+
+#define PRESCALE_1_1   0
+#define PRESCALE_1_16  1
+#define PRESCALE_1_256 2
+#define NO_IRQ         0
+#define USE_IRQ        1
+
+/* Software variables for interrupt detection */
+volatile int dtimer_irq_expected;
+volatile int dtimer1_irq_occurred;
+volatile int dtimer2_irq_occurred;
+volatile int dtimer_integration_test=0;
+
+/* Demonstration functions */
+void dualtimer_16_free_running_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx);
+void dualtimer_32_free_running_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx);
+void dualtimer_16_periodic_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx);
+void dualtimer_32_periodic_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx);
+void dualtimer_16_one_shot_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx);
+void dualtimer_32_one_shot_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx);
+int  dualtimer_integration_test(void);
+int  dualtimer_id_check(void);
+
+/* Functions for setting up the dual timer */
+  /* 16-bit free running mode */
+void dualtimer_setup_freerunning16(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx,
+ unsigned int cycle, unsigned int prescale, unsigned int interrupt);
+  /* 16-bit periodic mode */
+void dualtimer_setup_periodic16(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx,
+ unsigned int cycle, unsigned int prescale, unsigned int interrupt);
+  /* 16-bit free one shot mode */
+void dualtimer_setup_oneshot16(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx,
+ unsigned int cycle, unsigned int prescale, unsigned int interrupt);
+  /* 32-bit free running mode */
+void dualtimer_setup_freerunning32(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx,
+ unsigned int cycle, unsigned int prescale, unsigned int interrupt);
+  /* 32-bit periodic mode */
+void dualtimer_setup_periodic32(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx,
+ unsigned int cycle, unsigned int prescale, unsigned int interrupt);
+  /* 32-bit free one shot mode */
+void dualtimer_setup_oneshot32(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx,
+ unsigned int cycle, unsigned int prescale, unsigned int interrupt);
+
+  /* Start a timer */
+void dualtimer_start(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx);
+  /* Stop a timer */
+void dualtimer_stop(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx);
+  /* Clear a timer interrupt request */
+void dualtimer_irq_clear(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx);
+
+  /* Text buffer for displaying value */
+char text_buf[20];
+void int_to_hex(unsigned int value, char text[]);
+
+/* ----------------------------------------------------------------- */
+int main(void)
+{
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - Dual Timer Demo - revision $Revision: 371321 $\n");
+
+  if (dualtimer_id_check()!=0) {
+    puts ("** TEST SKIPPED ** Dual timer not present.\n");
+    UartEndSimulation();
+    return 0;}
+
+  puts ("\n--------------------------------");
+  puts ("Timer 1");
+  puts ("--------------------------------\n");
+
+  dualtimer_16_free_running_demo(CMSDK_DUALTIMER1);
+  dualtimer_16_periodic_demo(CMSDK_DUALTIMER1);
+  dualtimer_16_one_shot_demo(CMSDK_DUALTIMER1);
+  dualtimer_32_free_running_demo(CMSDK_DUALTIMER1);
+  dualtimer_32_periodic_demo(CMSDK_DUALTIMER1);
+  dualtimer_32_one_shot_demo(CMSDK_DUALTIMER1);
+
+  puts ("\n--------------------------------");
+  puts ("Timer 2");
+  puts ("--------------------------------\n");
+
+  dualtimer_16_free_running_demo(CMSDK_DUALTIMER2);
+  dualtimer_16_periodic_demo(CMSDK_DUALTIMER2);
+  dualtimer_16_one_shot_demo(CMSDK_DUALTIMER2);
+  dualtimer_32_free_running_demo(CMSDK_DUALTIMER2);
+  dualtimer_32_periodic_demo(CMSDK_DUALTIMER2);
+  dualtimer_32_one_shot_demo(CMSDK_DUALTIMER2);
+
+  puts ("\n--------------------------------");
+  puts ("Integration test");
+  puts ("--------------------------------\n");
+  dualtimer_integration_test();
+
+  puts ("** TEST PASSED ** \n");
+  UartEndSimulation();
+  /* Simulation stops in UartEndSimulation */
+
+}
+/* ----------------------------------------------------------------- */
+/* Detect the ARM ID and part number to see if device is present     */
+int dualtimer_id_check(void)
+{
+unsigned char dualtimer_id;
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+#define HW8_REG(ADDRESS)   (*((volatile unsigned char  *)(ADDRESS)))
+
+ dualtimer_id = HW8_REG(CMSDK_DUALTIMER_BASE  + 0xFE8) & 0x07;
+
+ if ((HW32_REG(CMSDK_DUALTIMER_BASE + 0xFE0) != 0x23) ||
+     (HW32_REG(CMSDK_DUALTIMER_BASE + 0xFE4) != 0xB8) ||
+     (dualtimer_id != 0x03))
+   return 1; /* part ID & ARM ID does not match dual timer */
+ else
+   return 0;
+}
+/* ----------------------------------------------------------------- */
+void dualtimer_16_free_running_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx)
+{
+  unsigned int read_value;
+  unsigned int i;
+
+  /* Clear software variables for interrupt tests */
+  dtimer_irq_expected = 0;
+  dtimer1_irq_occurred = 0;
+  dtimer2_irq_occurred = 0;
+
+  /* ------------------------------------------------------------- */
+  puts ("16-bit free running mode, prescale = 1:1, no interrupt");
+  /* 16-bit Free running timer, 5000 cycles, prescale = 1:1, no interrupt */
+  dualtimer_setup_freerunning16(CMSDK_DUALTIMERx, 5000, PRESCALE_1_1, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("16-bit free running mode, prescale = 1:16, no interrupt");
+  /* 16-bit Free running timer, 200 cycles, prescale = 1:16, no interrupt */
+  dualtimer_setup_freerunning16(CMSDK_DUALTIMERx, 200, PRESCALE_1_16, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("16-bit free running mode, prescale = 1:256, no interrupt");
+  /* 16-bit Free running timer, 20 cycles, prescale = 1:256, no interrupt */
+  dualtimer_setup_freerunning16(CMSDK_DUALTIMERx, 20, PRESCALE_1_256, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("16-bit free running mode, prescale = 1:1, with interrupt");
+  /* 16-bit Free running timer, 5000 cycles, prescale = 1:1, with interrupt */
+  dtimer_irq_expected = 1;
+  NVIC_EnableIRQ(DUALTIMER_IRQn);
+  dualtimer_setup_freerunning16(CMSDK_DUALTIMERx, 5000, PRESCALE_1_1, USE_IRQ);
+  i=0;
+  while (i<1){
+    /* Wait until timer interrupt take place */
+    while ((dtimer1_irq_occurred + dtimer2_irq_occurred)==0);
+    dtimer1_irq_occurred = 0;
+    dtimer2_irq_occurred = 0;
+    puts ("  IRQ");
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  NVIC_DisableIRQ(DUALTIMER_IRQn);
+  /* Clear software variables for interrupt tests */
+  dtimer_irq_expected = 0;
+  dtimer1_irq_occurred = 0;
+  dtimer2_irq_occurred = 0;
+
+}
+/* ----------------------------------------------------------------- */
+void dualtimer_32_free_running_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx)
+{
+  unsigned int read_value;
+  unsigned int i;
+
+  /* Clear software variables for interrupt tests */
+  dtimer_irq_expected = 0;
+  dtimer1_irq_occurred = 0;
+  dtimer2_irq_occurred = 0;
+
+  /* ------------------------------------------------------------- */
+  puts ("32-bit free running mode, prescale = 1:1, no interrupt");
+  /* 32-bit Free running timer, 5000 cycles, prescale = 1:1, no interrupt */
+  dualtimer_setup_freerunning32(CMSDK_DUALTIMERx, 5000, PRESCALE_1_1, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("32-bit free running mode, prescale = 1:16, no interrupt");
+  /* 32-bit Free running timer, 200 cycles, prescale = 1:16, no interrupt */
+  dualtimer_setup_freerunning32(CMSDK_DUALTIMERx, 200, PRESCALE_1_16, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("32-bit free running mode, prescale = 1:256, no interrupt");
+  /* 32-bit Free running timer, 20 cycles, prescale = 1:256, no interrupt */
+  dualtimer_setup_freerunning32(CMSDK_DUALTIMERx, 20, PRESCALE_1_256, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("32-bit free running mode, prescale = 1:1, with interrupt");
+  /* 32-bit Free running timer, 5000 cycles, prescale = 1:1, with interrupt */
+  dtimer_irq_expected = 1;
+  NVIC_EnableIRQ(DUALTIMER_IRQn);
+  dualtimer_setup_freerunning32(CMSDK_DUALTIMERx, 5000, PRESCALE_1_1, USE_IRQ);
+  i=0;
+  while (i<1){
+    /* Wait until timer interrupt take place */
+    while ((dtimer1_irq_occurred + dtimer2_irq_occurred)==0);
+    dtimer1_irq_occurred = 0;
+    dtimer2_irq_occurred = 0;
+    puts ("  IRQ");
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  NVIC_DisableIRQ(DUALTIMER_IRQn);
+  /* Clear software variables for interrupt tests */
+  dtimer_irq_expected = 0;
+  dtimer1_irq_occurred = 0;
+  dtimer2_irq_occurred = 0;
+
+}
+/* ----------------------------------------------------------------- */
+void dualtimer_16_periodic_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx)
+{
+  unsigned int read_value;
+  unsigned int i;
+
+  /* Clear software variables for interrupt tests */
+  dtimer_irq_expected = 0;
+  dtimer1_irq_occurred = 0;
+  dtimer2_irq_occurred = 0;
+
+  /* ------------------------------------------------------------- */
+  puts ("16-bit periodic mode, prescale = 1:1, no interrupt");
+  /* 16-bit periodic timer, 1000 cycles, prescale = 1:1, no interrupt */
+  dualtimer_setup_periodic16(CMSDK_DUALTIMERx, 1000, PRESCALE_1_1, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("16-bit periodic mode, prescale = 1:16, no interrupt");
+  /* 16-bit periodic timer, 200 cycles, prescale = 1:16, no interrupt */
+  dualtimer_setup_periodic16(CMSDK_DUALTIMERx, 200, PRESCALE_1_16, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("16-bit periodic mode, prescale = 1:256, no interrupt");
+  /* 16-bit periodic timer, 20 cycles, prescale = 1:256, no interrupt */
+  dualtimer_setup_periodic16(CMSDK_DUALTIMERx, 20, PRESCALE_1_256, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("16-bit periodic mode, prescale = 1:1, with interrupt x4");
+  /* 16-bit periodic timer, 3000 cycles, prescale = 1:1, with interrupt */
+  dtimer_irq_expected = 1;
+  NVIC_EnableIRQ(DUALTIMER_IRQn);
+  dualtimer_setup_periodic16(CMSDK_DUALTIMERx, 3000, PRESCALE_1_1, USE_IRQ);
+  i=0;
+  while (i<4){
+    /* Wait until timer interrupt take place */
+    while ((dtimer1_irq_occurred + dtimer2_irq_occurred)==0);
+    dtimer1_irq_occurred = 0;
+    dtimer2_irq_occurred = 0;
+    puts ("  IRQ");
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  NVIC_DisableIRQ(DUALTIMER_IRQn);
+  /* Clear software variables for interrupt tests */
+  dtimer_irq_expected = 0;
+  dtimer1_irq_occurred = 0;
+  dtimer2_irq_occurred = 0;
+
+}
+/* ----------------------------------------------------------------- */
+void dualtimer_32_periodic_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx)
+{
+  unsigned int read_value;
+  unsigned int i;
+
+  /* Clear software variables for interrupt tests */
+  dtimer_irq_expected = 0;
+  dtimer1_irq_occurred = 0;
+  dtimer2_irq_occurred = 0;
+
+  /* ------------------------------------------------------------- */
+  puts ("32-bit periodic mode, prescale = 1:1, no interrupt");
+  /* 32-bit periodic timer, 1000 cycles, prescale = 1:1, no interrupt */
+  dualtimer_setup_periodic32(CMSDK_DUALTIMERx, 1000, PRESCALE_1_1, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("32-bit periodic mode, prescale = 1:16, no interrupt");
+  /* 32-bit periodic timer, 200 cycles, prescale = 1:16, no interrupt */
+  dualtimer_setup_periodic32(CMSDK_DUALTIMERx, 200, PRESCALE_1_16, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("32-bit periodic mode, prescale = 1:256, no interrupt");
+  /* 32-bit periodic timer, 20 cycles, prescale = 1:256, no interrupt */
+  dualtimer_setup_periodic32(CMSDK_DUALTIMERx, 20, PRESCALE_1_256, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("32-bit periodic mode, prescale = 1:1, with interrupt x4");
+  /* 16-bit periodic timer, 3000 cycles, prescale = 1:1, with interrupt */
+  dtimer_irq_expected = 1;
+  NVIC_EnableIRQ(DUALTIMER_IRQn);
+  dualtimer_setup_periodic32(CMSDK_DUALTIMERx, 3000, PRESCALE_1_1, USE_IRQ);
+  i=0;
+  while (i<4){
+    /* Wait until timer interrupt take place */
+    while ((dtimer1_irq_occurred + dtimer2_irq_occurred)==0);
+    dtimer1_irq_occurred = 0;
+    dtimer2_irq_occurred = 0;
+    puts ("  IRQ");
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  NVIC_DisableIRQ(DUALTIMER_IRQn);
+  /* Clear software variables for interrupt tests */
+  dtimer_irq_expected = 0;
+  dtimer1_irq_occurred = 0;
+  dtimer2_irq_occurred = 0;
+
+}
+/* ----------------------------------------------------------------- */
+void dualtimer_16_one_shot_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx)
+{
+  unsigned int read_value;
+  unsigned int i;
+
+  /* Clear software variables for interrupt tests */
+  dtimer_irq_expected = 0;
+  dtimer1_irq_occurred = 0;
+  dtimer2_irq_occurred = 0;
+
+  /* ------------------------------------------------------------- */
+  puts ("16-bit one shot mode, prescale = 1:1, no interrupt");
+  /* 16-bit one shot timer, 2000 cycles, prescale = 1:1, no interrupt */
+  dualtimer_setup_oneshot16(CMSDK_DUALTIMERx, 2000, PRESCALE_1_1, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("16-bit one shot mode, prescale = 1:16, no interrupt");
+  /* 16-bit one shot timer, 100 cycles, prescale = 1:16, no interrupt */
+  dualtimer_setup_oneshot16(CMSDK_DUALTIMERx, 100, PRESCALE_1_16, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("16-bit one shot mode, prescale = 1:1, with interrupt");
+  /* 16-bit one shot timer, 3000 cycles, prescale = 1:1, with interrupt */
+  dtimer_irq_expected = 1;
+  NVIC_EnableIRQ(DUALTIMER_IRQn);
+  dualtimer_setup_oneshot16(CMSDK_DUALTIMERx, 3000, PRESCALE_1_1, USE_IRQ);
+  i=0;
+  while (i<1){
+    /* Wait until timer interrupt take place */
+    while ((dtimer1_irq_occurred + dtimer2_irq_occurred)==0);
+    dtimer1_irq_occurred = 0;
+    dtimer2_irq_occurred = 0;
+    puts ("  IRQ");
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  NVIC_DisableIRQ(DUALTIMER_IRQn);
+  /* Clear software variables for interrupt tests */
+  dtimer_irq_expected = 0;
+  dtimer1_irq_occurred = 0;
+  dtimer2_irq_occurred = 0;
+
+}
+/* ----------------------------------------------------------------- */
+void dualtimer_32_one_shot_demo(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx)
+{
+  unsigned int read_value;
+  unsigned int i;
+
+  /* Clear software variables for interrupt tests */
+  dtimer_irq_expected = 0;
+  dtimer1_irq_occurred = 0;
+  dtimer2_irq_occurred = 0;
+
+  /* ------------------------------------------------------------- */
+  puts ("32-bit one shot mode, prescale = 1:1, no interrupt");
+  /* 32-bit one shot timer, 2000 cycles, prescale = 1:1, no interrupt */
+  dualtimer_setup_oneshot32(CMSDK_DUALTIMERx, 2000, PRESCALE_1_1, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("32-bit one shot mode, prescale = 1:16, no interrupt");
+  /* 32-bit one shot timer, 100 cycles, prescale = 1:16, no interrupt */
+  dualtimer_setup_oneshot32(CMSDK_DUALTIMERx, 100, PRESCALE_1_16, NO_IRQ);
+  i=0;
+  while (i<10){
+    read_value = CMSDK_DUALTIMERx->TimerValue;
+    /* Display value of timer */
+     /* timing of printf can be very different between different toolchain.
+        Use puts instead */
+    int_to_hex(read_value, &text_buf[0]);
+    puts(text_buf);
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  /* ------------------------------------------------------------- */
+  puts ("32-bit one shot mode, prescale = 1:1, with interrupt");
+  /* 32-bit one shot timer, 3000 cycles, prescale = 1:1, with interrupt */
+  dtimer_irq_expected = 1;
+  NVIC_EnableIRQ(DUALTIMER_IRQn);
+  dualtimer_setup_oneshot32(CMSDK_DUALTIMERx, 3000, PRESCALE_1_1, USE_IRQ);
+  i=0;
+  while (i<1){
+    /* Wait until timer interrupt take place */
+    while ((dtimer1_irq_occurred + dtimer2_irq_occurred)==0);
+    dtimer1_irq_occurred = 0;
+    dtimer2_irq_occurred = 0;
+    puts ("  IRQ");
+    i++;
+    }
+  dualtimer_stop(CMSDK_DUALTIMERx);
+  NVIC_DisableIRQ(DUALTIMER_IRQn);
+  /* Clear software variables for interrupt tests */
+  dtimer_irq_expected = 0;
+  dtimer1_irq_occurred = 0;
+  dtimer2_irq_occurred = 0;
+
+}
+
+
+/* ----------------------------------------------------------------- */
+/* Interrupt handler for dual timer */
+void DUALTIMER_HANDLER(void)
+{
+if (dtimer_integration_test==0) { /* Normal operation mode */
+  /* The Dual Timer interrupt handler are shared by the two timers */
+  if (CMSDK_DUALTIMER1->TimerMIS != 0){
+    dualtimer_irq_clear(CMSDK_DUALTIMER1);
+    dtimer1_irq_occurred++;
+    if (dtimer_irq_expected==0) {
+      puts("ERROR: Unexpected dual timer 1 IRQ");
+      UartEndSimulation(); /* Simulation stops in UartEndSimulation */
+      }  /* end if (dtimer1_irq_expected==0) */
+    } /* end if (CMSDK_DUALTIMER1->TimerMIS != 0) */
+  if (CMSDK_DUALTIMER2->TimerMIS != 0){
+    dualtimer_irq_clear(CMSDK_DUALTIMER2);
+    dtimer2_irq_occurred++;
+    if (dtimer_irq_expected==0) {
+      puts("ERROR: Unexpected dual timer 2 IRQ");
+      UartEndSimulation(); /* Simulation stops in UartEndSimulation */
+      }  /* end if (dtimer2_irq_expected==0) */
+    } /* end if (CMSDK_DUALTIMER2->TimerMIS != 0) */
+  }
+else { /* Integration test mode */
+  /* Cannot tell which timer interrupt is asserted because
+  ITOP is write only and both timer shared the same interrupt.
+  So increment both variables. */
+  CMSDK_DUALTIMER->ITOP=0;
+  dtimer1_irq_occurred++;
+  dtimer2_irq_occurred++;
+  puts ("  [Dualtimer interrupt triggered]");
+  }
+}
+
+/* ----------------------------------------------------------------- */
+/* Functions for setting up the dual timer */
+
+
+/* 16-bit Free running timer mode */
+void dualtimer_setup_freerunning16(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx,
+ unsigned int cycle, unsigned int prescale, unsigned int interrupt)
+{
+  int ctrl_val;
+  CMSDK_DUALTIMERx->TimerControl = 0; /* Disable during programming */
+   /* Previous timer activities might have trigger interrupt flag,
+   so need to clear it */
+  dualtimer_irq_clear(CMSDK_DUALTIMERx);
+  CMSDK_DUALTIMERx->TimerLoad    = cycle;
+
+  ctrl_val = (prescale  & 0x3) << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos |
+             (interrupt & 0x1) << CMSDK_DUALTIMER_CTRL_INTEN_Pos |
+            CMSDK_DUALTIMER_CTRL_EN_Msk;
+
+  CMSDK_DUALTIMERx->TimerControl = ctrl_val;
+}
+
+/* 32-bit Free running timer mode */
+void dualtimer_setup_freerunning32(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx,
+ unsigned int cycle, unsigned int prescale, unsigned int interrupt)
+{
+  int ctrl_val;
+  CMSDK_DUALTIMERx->TimerControl = 0; /* Disable during programming */
+   /* Previous timer activities might have trigger interrupt flag,
+   so need to clear it */
+  dualtimer_irq_clear(CMSDK_DUALTIMERx);
+  CMSDK_DUALTIMERx->TimerLoad    = cycle;
+
+  ctrl_val = (prescale  & 0x3) << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos |
+             (interrupt & 0x1) << CMSDK_DUALTIMER_CTRL_INTEN_Pos |
+            CMSDK_DUALTIMER_CTRL_EN_Msk |
+            CMSDK_DUALTIMER_CTRL_SIZE_Msk;
+
+  CMSDK_DUALTIMERx->TimerControl = ctrl_val;
+}
+
+/* 16-bit Periodic timer mode */
+void dualtimer_setup_periodic16(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx,
+ unsigned int cycle, unsigned int prescale, unsigned int interrupt)
+{
+  int ctrl_val;
+  CMSDK_DUALTIMERx->TimerControl = 0; /* Disable during programming */
+   /* Previous timer activities might have trigger interrupt flag,
+   so need to clear it */
+  dualtimer_irq_clear(CMSDK_DUALTIMERx);
+  CMSDK_DUALTIMERx->TimerLoad    = cycle;
+
+  ctrl_val = (prescale  & 0x3) << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos |
+             (interrupt & 0x1) << CMSDK_DUALTIMER_CTRL_INTEN_Pos |
+            CMSDK_DUALTIMER_CTRL_EN_Msk |
+            CMSDK_DUALTIMER_CTRL_MODE_Msk;
+
+  CMSDK_DUALTIMERx->TimerControl = ctrl_val;
+}
+
+/* 32-bit Periodic timer mode */
+void dualtimer_setup_periodic32(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx,
+ unsigned int cycle, unsigned int prescale, unsigned int interrupt)
+{
+  int ctrl_val;
+  CMSDK_DUALTIMERx->TimerControl = 0; /* Disable during programming */
+   /* Previous timer activities might have trigger interrupt flag,
+   so need to clear it */
+  dualtimer_irq_clear(CMSDK_DUALTIMERx);
+  CMSDK_DUALTIMERx->TimerLoad    = cycle;
+
+  ctrl_val = (prescale  & 0x3) << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos |
+             (interrupt & 0x1) << CMSDK_DUALTIMER_CTRL_INTEN_Pos |
+            CMSDK_DUALTIMER_CTRL_EN_Msk |
+            CMSDK_DUALTIMER_CTRL_MODE_Msk|
+            CMSDK_DUALTIMER_CTRL_SIZE_Msk;
+
+  CMSDK_DUALTIMERx->TimerControl = ctrl_val;
+}
+
+/* 16-bit One shot timer mode */
+void dualtimer_setup_oneshot16(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx,
+ unsigned int cycle, unsigned int prescale, unsigned int interrupt)
+{
+  int ctrl_val;
+  CMSDK_DUALTIMERx->TimerControl = 0; /* Disable during programming */
+   /* Previous timer activities might have trigger interrupt flag,
+   so need to clear it */
+  dualtimer_irq_clear(CMSDK_DUALTIMERx);
+  CMSDK_DUALTIMERx->TimerLoad    = cycle;
+
+  ctrl_val = (prescale  & 0x3) << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos |
+             (interrupt & 0x1) << CMSDK_DUALTIMER_CTRL_INTEN_Pos |
+            CMSDK_DUALTIMER_CTRL_EN_Msk |
+            CMSDK_DUALTIMER_CTRL_MODE_Msk |
+            CMSDK_DUALTIMER_CTRL_ONESHOOT_Msk;
+
+  CMSDK_DUALTIMERx->TimerControl = ctrl_val;
+}
+
+/* 32-bit One shot timer mode */
+void dualtimer_setup_oneshot32(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx,
+ unsigned int cycle, unsigned int prescale, unsigned int interrupt)
+{
+  int ctrl_val;
+  CMSDK_DUALTIMERx->TimerControl = 0; /* Disable during programming */
+   /* Previous timer activities might have trigger interrupt flag,
+   so need to clear it */
+  dualtimer_irq_clear(CMSDK_DUALTIMERx);
+  CMSDK_DUALTIMERx->TimerLoad    = cycle;
+
+  ctrl_val = (prescale  & 0x3) << CMSDK_DUALTIMER_CTRL_PRESCALE_Pos |
+             (interrupt & 0x1) << CMSDK_DUALTIMER_CTRL_INTEN_Pos |
+            CMSDK_DUALTIMER_CTRL_EN_Msk |
+            CMSDK_DUALTIMER_CTRL_MODE_Msk |
+            CMSDK_DUALTIMER_CTRL_ONESHOOT_Msk|
+            CMSDK_DUALTIMER_CTRL_SIZE_Msk;
+
+  CMSDK_DUALTIMERx->TimerControl = ctrl_val;
+}
+
+/* Demonstrate integration test feature in the dual timer */
+int dualtimer_integration_test(void)
+{
+  int result = 0;
+   /* Instead of triggering timer interrupt using normal timer operation, you can also
+      test the watchdog connection using integration test register.
+      ITCR - bit 0 enable integration test mode
+      ITOP - bit 0 enable timer 1 irq when integration test mode is enabled
+             bit 1 enable timer 2 irq when integration test mode is enabled
+   */
+
+  puts ("Integration test demo");
+  dtimer_integration_test = 1;
+
+  dtimer_irq_expected = 0;
+  dtimer1_irq_occurred = 0;
+  dtimer2_irq_occurred = 0;
+  CMSDK_DUALTIMER->ITOP=0; // Ensure interrupts are not asserted before start
+  CMSDK_DUALTIMER->ITCR=1; // Enable integration test mode
+  if (CMSDK_DUALTIMER->ITCR == 0) {
+     puts ("  - Integration Test Control Register read error");
+     result++;
+     }
+  else {
+     dtimer_integration_test = 1;
+     dtimer_irq_expected = 1;
+     NVIC_EnableIRQ(DUALTIMER_IRQn);
+     CMSDK_DUALTIMER->ITOP=1; // Set timer 1 interrupt
+     CMSDK_DUALTIMER->ITOP=0; // Deassert timer 1 interrupt
+
+     if (dtimer1_irq_occurred == 0) {
+       puts ("  - Integration Test operation 1 failed");
+       result++;
+       }
+     dtimer1_irq_occurred = 0; /* clear variables */
+     dtimer2_irq_occurred = 0;
+
+     CMSDK_DUALTIMER->ITOP=2; // Set timer 2 interrupt
+     CMSDK_DUALTIMER->ITOP=0; // Deassert timer 2 interrupt
+
+     if (dtimer2_irq_occurred == 0) {
+       puts ("  - Integration Test operation 2 failed");
+       result++;
+       }
+     CMSDK_DUALTIMER->ITCR = 0;  // Disable integration test mode
+     if (CMSDK_DUALTIMER->ITCR != 0) {
+      puts ("  - Integration Control clear error");
+      result++;
+      }
+    }
+  dtimer_integration_test = 0;
+  NVIC_DisableIRQ(DUALTIMER_IRQn);
+
+  if (result != 0) {
+    puts ("ERROR: Integration test failed\n");
+    return (1);
+    } else {
+    puts ("Integration test completed successfully\n");
+    return (0);
+    }
+
+}
+
+
+
+/* Start the timer */
+void dualtimer_start(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx)
+{
+  CMSDK_DUALTIMERx->TimerControl |= CMSDK_DUALTIMER_CTRL_EN_Msk;
+}
+/* Stop the timer */
+void dualtimer_stop(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx)
+{
+  CMSDK_DUALTIMERx->TimerControl &= ~CMSDK_DUALTIMER_CTRL_EN_Msk;
+}
+/* Clear the interrupt request */
+void dualtimer_irq_clear(CMSDK_DUALTIMER_SINGLE_TypeDef *CMSDK_DUALTIMERx)
+{
+  CMSDK_DUALTIMERx->TimerIntClr = 0;
+}
+/* Convert hex value into text in text buffer */
+void int_to_hex(unsigned int value, char text[])
+{
+  int          i=0;
+  int          length=0;
+  unsigned int mask = 0xF0000000UL;
+  int          nibble;
+
+  /* extra space in front for indent */
+  for (length=0;length<2; length++){
+    text[length]  =' ';     /* space */
+    }
+    length = 2;
+  /* Remove leading zero */
+  while (((mask & value)==0) & (i!=7)) {
+    i ++;
+    mask = mask >> 4;
+    }
+  while (i!=8) {
+    nibble  = (mask & value) >> ((7-i)*4); /* shift to LSB */
+    if (nibble>9) text[length] = (char) (nibble+87); // Convert to ASCII a to f
+    else          text[length] = (char) (nibble+48); // Convert to ASCII 0 to 9
+    i++;
+    length++;
+    mask = mask>> 4;
+    }
+  text[length]=(char) 0; /* null termination */
+  return;
+}
+
diff --git a/Cortex-M0/nanosoc/software/common/demos/interrupt_demo.c b/Cortex-M0/nanosoc/software/common/demos/interrupt_demo.c
new file mode 100644
index 0000000..d0598c0
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/demos/interrupt_demo.c
@@ -0,0 +1,494 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+/*
+  Interrupt demonstration
+
+  This test demonstrate interrupt generation using various peripherals.
+  - using simple timer
+  - using gpio with various configurations
+  - using uart
+
+*/
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#include "uart_stdout.h"
+#include "CMSDK_driver.h"
+#include <stdio.h>
+
+//
+// Global Variables to track test progress
+//
+
+volatile uint32_t tx_count = 0;                 /*transmit counter */
+volatile uint32_t rx_count = 0;                 /*receive counter */
+const     char str_tx[12] = "hello world";      /*transmission string*/
+const int uart_str_length = 11;
+volatile char str_rx[12] ;             /*string that is received*/
+
+volatile int irq_triggered;          /* Detected interrupt operation from GPIO IRQ handler */
+volatile uint32_t timer_stopped = 0; /* timer irq executed and stopped */
+
+//
+// Demonstrations
+//
+
+int  TimerExample(void);    // Timer interrupt
+int  GPIOIntExample(void);  // GPIO interrupt
+void UartExample(void);     // UART interrupt
+int  gpio0_id_check(void);  // Detect GPIO 0 present
+int  timer0_id_check(void); // Detect Timer 0 present
+int  uart0_id_check(void);  // Detect UART 0 present
+int  uart1_id_check(void);  // Detect UART 1 present
+
+// ----------------------------------------------------------
+// Main program
+// ----------------------------------------------------------
+
+int main (void)
+{
+  // UART init
+  UartStdOutInit();  // Initialize UART2 for printf (retargeting)
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - Interrupt Demo - revision $Revision: 371321 $\n");
+
+  if (timer0_id_check()!=0)  puts ("Timer 0 not present. TimerExample skipped.");
+  else                       TimerExample();    // Timer 0 interrupt example
+
+  if (gpio0_id_check()!=0)   puts ("GPIO 0 not present. GPIOIntExample skipped.");
+  else                       GPIOIntExample();  // GPIO PORT0 interrupt example
+
+  if ((uart0_id_check()!=0)||(uart1_id_check()!=0))
+     puts ("UART 0 or UART 1 not present. UartExample skipped.");
+  else                       UartExample();     // Uart interrupt example
+
+  puts ("** TEST PASSED ** \n");
+  UartEndSimulation();    // send test end character to finish test
+  /* Simulation stops in UartEndSimulation */
+
+  return 0;
+}
+
+// ----------------------------------------------------------
+// Timer demo
+// ----------------------------------------------------------
+int TimerExample(void)
+{
+  puts("\n\n\n");
+  puts("+*************************+");
+  puts("*                         *");
+  puts("*  Timer0 Interrupt demo  *");
+  puts("*                         *");
+  puts("+*************************+\n\n");
+
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);
+  NVIC_EnableIRQ(TIMER0_IRQn);
+
+  // initialise Timer0 with internal clock, with interrupt generation
+  CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0x100, 1);
+
+  while (timer_stopped==0) {
+    __WFE(); // enter sleep
+    }
+  puts("   Timer test done");  // Banner
+
+  return 0;
+}
+// ----------------------------------------------------------
+// UART demo
+// ----------------------------------------------------------
+
+/* Timer IRQ Driven UART Transmission of "hello world"
+
+    - Program UART 0 to operate as transmit only, with transmit IRQ enabled
+    - Program UART 1 to operate as receive only, with receive IRQ enabled
+    - The first character of the "hello world" message is transmit
+    - The rest of the message transmission is handled by UART transmit IRQ, until
+      all characters are transmitted.
+    - The receive process is also handled by UART receive IRQ.
+    - A while loop is used to wait until both transmit and receive has completed the test
+    - When finished then print string received
+   */
+
+
+// ----------------------------------------------------------
+// UART interrupt test
+// ----------------------------------------------------------
+
+void UartExample(void)
+{
+  uint32_t transmission_complete = 0;    /*transmission complete bool*/
+
+  puts("+*************************+");
+  puts("*                         *");
+  puts("*   UART Interrupt demo   *");
+  puts("*                         *");
+  puts("+*************************+\n\n");
+
+  CMSDK_gpio_SetAltFunc(CMSDK_GPIO1, 0x000F);  //enable alt functions for UART transmission
+
+  // Ensure Interrupt is not pending
+
+  NVIC_ClearPendingIRQ(UARTTX0_IRQn);
+  NVIC_ClearPendingIRQ(UARTRX1_IRQn);
+
+  // Enable Interrupts
+
+  NVIC_EnableIRQ(UARTTX0_IRQn);
+  NVIC_EnableIRQ(UARTRX1_IRQn);
+
+  /* Initialize UART in cross over configuration
+   uint32_t CMSDK_uart_init(CMSDK_UART_TypeDef *CMSDK_UART,
+                             uint32_t            divider,
+                             uint32_t            tx_en,
+                             uint32_t            rx_en,
+                             uint32_t            tx_irq_en,
+                             uint32_t            rx_irq_en,
+                             uint32_t            tx_ovrirq_en,
+                             uint32_t            rx_ovrirq_en)
+   */
+  /* enable UARTs with selected baud rate
+       UART #0 - transmit
+       UART #1 - receive
+  */
+  CMSDK_uart_init(CMSDK_UART0, 0x200, 1, 0, 1, 0, 0, 0);
+  CMSDK_uart_init(CMSDK_UART1, 0x200, 0, 1, 0, 1, 0, 0);
+
+  rx_count = 0;
+  tx_count = 0;
+
+  printf ("Transmit message : %s\n", str_tx);
+
+  /* Start first character transfer */
+  tx_count++;
+  CMSDK_uart_SendChar(CMSDK_UART0, str_tx[0]); // send the character
+  /* The rest of the transfers are handled by interrupts */
+
+  while(transmission_complete==0)    // loop until transmission completed
+  {
+
+    if ((tx_count==uart_str_length) && (rx_count==uart_str_length)) transmission_complete = 1;
+  }
+
+  printf ("Received message : %s\n", str_rx);
+
+
+  NVIC_DisableIRQ(UARTTX0_IRQn);   //disable both UART0 TX and UART1 RX IRQs
+  NVIC_DisableIRQ(UARTRX1_IRQn);
+
+  return;
+}
+
+// ----------------------------------------------------------
+// GPIO interrupt test
+// ----------------------------------------------------------
+/*
+      GPIO interrupt example
+
+    - Enable all pins as output
+    - Set DataOut to 0xA ready for a test of all IRQs
+    - Set pin0 as a High Level, pin1 as a Low Level, pin2 as a Rising Edge and pin3 as a Falling Edge,
+      then clear all pending IRQs
+    - enable the CMSDK GPIO interrupt for pins 0, 1, 2, 3.
+    - set Dataout to 0xB to test the high level interrupt on pin 0
+    - if irq_triggered != 0 (set in ISR) then print message saying IRQ occurred and set irq_triggered = 0
+    - else amend err_code
+    - set Dataout to 0x9 to test the low level interrupt on pin 1
+    - if irq_triggered != 0 (set in ISR) then print message saying IRQ occurred and set irq_triggered = 0
+    - else amend err_code
+    - set Dataout to 0xD to test the rising edge interrupt on pin 2
+    - if irq_triggered != 0 (set in ISR) then print message saying IRQ occurred and set irq_triggered = 0
+    - else amend err_code
+    - set Dataout to 0x5 to test the falling edge interrupt on pin 3
+    - if irq_triggered != 0 (set in ISR) then print message saying IRQ occurred and set irq_triggered = 0
+    - else amend err_code
+    - if test on all pins pass the test as a whole passes and return 0 to main
+    - else return an error and print error message
+*/
+int GPIOIntExample(void)
+{
+
+  int i = 0;
+  int irq_counter = 0;
+  int err_code = 0;
+
+  puts("\n\n\n");
+  puts("+*************************+");
+  puts("*                         *");
+  puts("*  GPIO PORT0: Interrupt  *");
+  puts("*         Example         *");
+  puts("*                         *");
+  puts("+*************************+\n\n");
+
+  CMSDK_gpio_SetOutEnable(CMSDK_GPIO0, 0xFFFF); //set output enable to output on all ports of GPIO 0
+  // By setting the port to output the pins are controllable by software
+
+  CMSDK_GPIO0->DATAOUT = 0xA;   // set current I/O port value
+
+  CMSDK_gpio_SetIntHighLevel(CMSDK_GPIO0, 0);   //set pin 0 to high level interrupts
+  CMSDK_gpio_SetIntLowLevel(CMSDK_GPIO0, 1);    //set pin 1 to low level interrupts
+  CMSDK_gpio_SetIntRisingEdge(CMSDK_GPIO0, 2);  //set pin 2 to rising edge interrupts
+  CMSDK_gpio_SetIntFallingEdge(CMSDK_GPIO0, 3); //set pin 3 to falling edge interrupts
+
+  NVIC_ClearPendingIRQ(PORT0_0_IRQn);                   //clear all global NVIC PORT0 pending interrupts
+  NVIC_ClearPendingIRQ(PORT0_1_IRQn);
+  NVIC_ClearPendingIRQ(PORT0_2_IRQn);
+  NVIC_ClearPendingIRQ(PORT0_3_IRQn);
+
+  NVIC_EnableIRQ(PORT0_0_IRQn);                         //enable NVIC interrupts on PORT0
+  NVIC_EnableIRQ(PORT0_1_IRQn);
+  NVIC_EnableIRQ(PORT0_2_IRQn);
+  NVIC_EnableIRQ(PORT0_3_IRQn);
+
+  if ((NVIC->ISER[0]>>PORT0_0_IRQn)!=0x0F) {            // Cortex-M0 DesignStart only has 16 IRQ
+    printf("Not all of IRQ[%d to %d] are available.\nUse combined GPIO interrupt for test\n\n",
+           PORT0_0_IRQn,PORT0_3_IRQn);
+    NVIC_EnableIRQ(PORT0_ALL_IRQn);                     //enable combined NVIC interrupts on PORT0
+    }
+
+
+  for(i = 0; i < 4; i++) CMSDK_gpio_SetIntEnable(CMSDK_GPIO0, i);    //enable interrupts on pins 0 -3
+
+  CMSDK_GPIO0->DATAOUT = 0xB; // emulating high level input on pin 0.
+
+  puts("    ...Test GPIO0[0]...\n");
+
+  if(irq_triggered){   //if irq flag set then print message else amend error code
+    puts("      High Level IRQ:\n     Detected On Pin 0\n\n");
+    irq_triggered = 0;
+    irq_counter++;
+  }
+  else err_code |= (1 << irq_counter);
+
+  CMSDK_GPIO0->DATAOUT = 0x9; // emulating low level input on pin 1.
+
+  puts("    ...Test GPIO0[1]...\n");
+
+  if(irq_triggered){  //if irq flag set then print message else amend error code
+    puts("       Low Level IRQ\n     Detected On Pin 0\n\n");
+    irq_triggered = 0;
+    irq_counter++;
+  }
+  else err_code |= (1 << 1);
+
+  CMSDK_GPIO0->DATAOUT = 0xD; // emulating rising edge input on pin 2.
+
+  puts("    ...Test GPIO0[2]...\n");
+
+  if(irq_triggered){  //if irq flag set then print message else amend error code
+    puts("      Rising Edge IRQ\n     Detected On Pin 0\n\n");
+    irq_triggered = 0;
+    irq_counter++;
+  }
+  else err_code |= (1 << 2);
+
+  CMSDK_GPIO0->DATAOUT = 0x5; // emulating falling edge input on pin 3.
+
+  puts("    ...Test GPIO0[3]...\n");
+
+  if(irq_triggered){  //if irq flag set then print message else amend error code
+    puts("     Falling Edge IRQ:\n     Detected On Pin 0\n\n");
+    irq_triggered = 0;
+    irq_counter++;
+  }
+   else err_code |= (1 << 3);
+
+  /* check to see whether intstatus, for the specified pin, is 1, which corresponds to a rising edge interrupt */
+
+  if(irq_counter == 4){
+    printf("    All %d IRQs Detected\n\n", i);
+  }
+
+
+  // print pass or fail message depending on the status of the test
+
+  if(err_code == 0){
+    puts("\n");
+    puts(" +***********************+");
+    puts(" *                       *");
+    puts(" *   GPIO 0 IRQ Tests    *");
+    puts(" *  Passed Successfully  *");
+    puts(" *                       *");
+    puts(" +***********************+\n");
+  }
+  else{
+
+    /*if the port did not have 1 of each IRQs as expected then display error*/
+
+    printf("\n** TEST FAILED ** IRQ Tests Error Code: (0x%x\n", err_code);
+  }
+
+  NVIC_DisableIRQ(PORT0_0_IRQn);    //disable GPIO0 IRQ
+  NVIC_DisableIRQ(PORT0_1_IRQn);
+  NVIC_DisableIRQ(PORT0_2_IRQn);
+  NVIC_DisableIRQ(PORT0_3_IRQn);
+  NVIC_DisableIRQ(PORT0_ALL_IRQn);
+  return err_code;
+}
+
+// ----------------------------------------------------------
+// Peripheral detection
+// ----------------------------------------------------------
+/* Detect the part number to see if device is present                */
+
+int gpio0_id_check(void)
+{
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+if ((HW32_REG(CMSDK_GPIO0_BASE + 0xFE0) != 0x20) ||
+    (HW32_REG(CMSDK_GPIO0_BASE + 0xFE4) != 0xB8))
+  return 1; /* part ID does not match */
+else
+  return 0;
+}
+
+int timer0_id_check(void)
+{
+if ((HW32_REG(CMSDK_TIMER0_BASE + 0xFE0) != 0x22) ||
+    (HW32_REG(CMSDK_TIMER0_BASE + 0xFE4) != 0xB8))
+  return 1; /* part ID does not match */
+else
+  return 0;
+}
+
+int uart0_id_check(void)
+{
+if ((HW32_REG(CMSDK_UART0_BASE + 0xFE0) != 0x21) ||
+    (HW32_REG(CMSDK_UART0_BASE + 0xFE4) != 0xB8))
+  return 1; /* part ID does not match */
+else
+  return 0;
+}
+int uart1_id_check(void)
+{
+if ((HW32_REG(CMSDK_UART1_BASE + 0xFE0) != 0x21) ||
+    (HW32_REG(CMSDK_UART1_BASE + 0xFE4) != 0xB8))
+  return 1; /* part ID does not match */
+else
+  return 0;
+}
+// ----------------------------------------------------------
+// Handlers
+// ----------------------------------------------------------
+// ---------------------------------
+// UART 0 Interrupt service routines
+// ---------------------------------
+//
+
+void UARTTX0_Handler(void)
+{
+  CMSDK_uart_ClearTxIRQ(CMSDK_UART0); // clear TX IRQ
+  // If the message output is not finished, output next character
+  if (tx_count < uart_str_length) {
+    CMSDK_uart_SendChar(CMSDK_UART0,str_tx[tx_count]);
+    tx_count++;
+    }
+
+}
+
+// ---------------------------------
+// UART 1 Interrupt service routines
+// ---------------------------------
+
+void UARTRX1_Handler(void)
+{
+  CMSDK_uart_ClearRxIRQ(CMSDK_UART1); //clear RX IRQ
+  str_rx[rx_count]=CMSDK_uart_ReceiveChar(CMSDK_UART1); // Read data
+  rx_count++;
+}
+
+// ---------------------------------
+// Timer 0 Interrupt service routines
+// ---------------------------------
+
+void TIMER0_Handler(void)
+{
+  timer_stopped = 1;                      // set timer stopped bool, so that
+                                          // system does not wait for another interrupt
+  CMSDK_timer_StopTimer(CMSDK_TIMER0);    // stop timer
+  CMSDK_timer_ClearIRQ(CMSDK_TIMER0);     // clear timer 0 IRQ
+  puts("   [Timer 0 IRQ]");
+}
+
+// ---------------------------------
+// GPIO Port 0 Interrupt service routines
+// ---------------------------------
+//
+void PORT0_0_Handler(void)
+{
+  irq_triggered = 1;                            /* high level */
+  CMSDK_GPIO0->DATAOUT = 0xA;                  /* Deassert Port 0 pin 0 to 0 */
+  CMSDK_gpio_IntClear(CMSDK_GPIO0, 0);        //clear GPIO interrupt on pin N
+}
+
+void PORT0_1_Handler(void)
+{
+  irq_triggered = 1;                            /*low level*/
+  CMSDK_GPIO0->DATAOUT = 0xB;                  /* Deassert Port 0 pin 1 to 1 */
+  CMSDK_gpio_IntClear(CMSDK_GPIO0, 1);        //clear GPIO interrupt on pin N
+}
+
+void PORT0_2_Handler(void)
+{
+  irq_triggered = 1;                            /*rising edge*/
+  CMSDK_gpio_IntClear(CMSDK_GPIO0, 2);        //clear GPIO interrupt on pin N
+}
+
+void PORT0_3_Handler(void)
+{
+  irq_triggered = 1;                            /*falling edge*/
+  CMSDK_gpio_IntClear(CMSDK_GPIO0, 3);        //clear GPIO interrupt on pin N
+}
+
+void PORT0_COMB_Handler(void)   /* Combined handler */
+{
+  irq_triggered = 1;
+  if (CMSDK_GPIO0->INTSTATUS & 0x01){ /* high level */
+    CMSDK_GPIO0->DATAOUT = 0xA;                  /* Deassert Port 0 pin 0 to 0 */
+    CMSDK_gpio_IntClear(CMSDK_GPIO0, 0);        //clear GPIO interrupt on pin N
+    }
+  if (CMSDK_GPIO0->INTSTATUS & 0x02){ /* low level*/
+    CMSDK_GPIO0->DATAOUT = 0xB;                  /* Deassert Port 0 pin 1 to 1 */
+    CMSDK_gpio_IntClear(CMSDK_GPIO0, 1);        //clear GPIO interrupt on pin N
+    }
+  if (CMSDK_GPIO0->INTSTATUS & 0x04){ /* rising edge*/
+    CMSDK_gpio_IntClear(CMSDK_GPIO0, 2);         //clear GPIO interrupt on pin N
+    }
+  if (CMSDK_GPIO0->INTSTATUS & 0x08){ /* falling edge*/
+    CMSDK_gpio_IntClear(CMSDK_GPIO0, 3);         //clear GPIO interrupt on pin N
+    }
+  return;
+}
+
diff --git a/Cortex-M0/nanosoc/software/common/demos/self_reset_demo.c b/Cortex-M0/nanosoc/software/common/demos/self_reset_demo.c
new file mode 100644
index 0000000..697b3ec
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/demos/self_reset_demo.c
@@ -0,0 +1,234 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+ /* Check self reset using SYSRESETREQ and LOCKUP reset */
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"
+
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+#define BAD_ADDRESS        0xC0000001
+
+void main_prog_part_1(void); /* Carry out SYSRESETREQ */
+void main_prog_part_2(void); /* Check reset info, carry out lockup reset */
+void main_prog_part_3(void); /* Check reset info */
+int  sysctrl_id_check(void);
+
+/*
+  Test process:
+  - if system controller is not available, skip test
+  - check reset status, which should be 0 in the beginning of test, goto execute part 1
+  - part 1 : Use System Reset Request function from CMSIS
+  - <system reset>
+  - Restarted, if system controller is not available, skip test
+  - check reset status, which should be 1 (SYSRESETREQ), goto execute part 2
+  - clear reset status, and check reset status is cleared.
+  - enable automatic reset for lockup
+  - check the reset option register read back value is correct
+  - trigger hardfault by reading BAD_ADDRESS
+  - enter hardfault handler, and then trigger lock up by reading BAD_ADDRESS again
+  - <lockup -> system reset>
+  - Restarted, if system controller is not available, skip test
+  - check reset status, which should be 4 (Lockup reset), goto execute part 3
+  - clear reset status, and check reset status is cleared.
+  - test completed , end test
+
+*/
+
+/* ----------------------------------------------------------------- */
+/* Start of main code */
+int main (void)
+{
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - Self Reset Demo - revision $Revision: 371321 $\n");
+
+  if (sysctrl_id_check()!=0) {
+    puts ("** TEST SKIPPED ** SysCtrl not present.");
+    UartEndSimulation();
+    return 0;}
+
+  puts("[System started]\n");
+  /* Check CMSDK_SYSCON->RSTINFO Reset Information register */
+  /*  0 = cold reset */
+  /*  1 (bit 0) = reset from SYSRESETREQ */
+  /*  2 (bit 1) = reset from Watchdog */
+  /*  4 (bit 2) = reset from Lockup auto reset */
+  if ((CMSDK_SYSCON->RSTINFO & CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Msk) !=0) {
+    puts ("Restarted by SYSRESETREQ reset");
+    main_prog_part_2();  /* Check result from part 1 and trigger reset using lockup reset */
+    UartEndSimulation(); /* Should not get here. */
+    }
+  else if ((CMSDK_SYSCON->RSTINFO & CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Msk) !=0) {
+    puts ("Restarted by Lockup reset");
+    main_prog_part_3(); /* Check result */
+    UartEndSimulation(); /* Should not get here. Simulation stops in UartEndSimulation */
+    while(1);
+    }
+  else if ((CMSDK_SYSCON->RSTINFO & CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Msk) !=0) {
+    puts ("Restarted by Watchdog reset");
+    puts ("ERROR: Watchdog was not used in this test. Reset info register value incorrect.\n");
+    UartEndSimulation(); /* Should not get here. Simulation stops in UartEndSimulation */
+    }
+  else {
+    puts("Self Reset demo test\n");
+    main_prog_part_1(); /* Trigger self reset */
+    }
+  UartEndSimulation(); /* Should not get here. */
+  /* Simulation stops in UartEndSimulation */
+}
+
+/* ----------------------------------------------------------------- */
+/* Use ID value to detect if the system controller is present */
+int sysctrl_id_check(void)
+{ /* CMSDK SysCtrl part ID range from 826 to 829 */
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+if ((HW32_REG(CMSDK_SYSCTRL_BASE + 0xFE0) < 0x26) ||
+    (HW32_REG(CMSDK_SYSCTRL_BASE + 0xFE0) > 0x29) ||
+    (HW32_REG(CMSDK_SYSCTRL_BASE + 0xFE4) != 0xB8))
+  return 1; /* part ID does not match */
+else
+  return 0;
+}
+
+/* ----------------------------------------------------------------- */
+/* First part of the test program */
+void main_prog_part_1(void)
+{
+  puts("Using CMSIS function to generate self reset...\n");
+
+  NVIC_SystemReset();
+  while(1);
+
+}
+
+/* ----------------------------------------------------------------- */
+/* Second part of the main test program - execute after SYSRESETREQ reset */
+void main_prog_part_2(void)
+{
+  int result=0;
+  unsigned int read_data;
+
+  puts("- Self reset completed");
+  read_data = CMSDK_SYSCON->RSTINFO;
+  printf ("  SYSCON->RSTINFO = %x\n", read_data);
+  if (read_data != CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Msk) result++;
+  puts("- Clear reset info");
+  CMSDK_SYSCON->RSTINFO = CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Msk;
+  read_data = CMSDK_SYSCON->RSTINFO;
+  printf ("  SYSCON->RSTINFO = %x\n", read_data);
+  if (read_data != 0) result++;
+  if (result != 0) {
+    puts ("ERROR: reset info register value incorrect.\n");
+  } else {
+    puts ("SYSRESETREQ test done\nNow test reset caused by lockup\n");
+  }
+
+  /* Test Lockup reset */
+  CMSDK_SYSCON->RESETOP = CMSDK_SYSCON_LOCKUPRST_RESETOP_Msk;
+  read_data = CMSDK_SYSCON->RESETOP;
+  if (read_data != CMSDK_SYSCON_LOCKUPRST_RESETOP_Msk) {
+    puts ("ERROR: reset option register value incorrect.\n");
+    UartEndSimulation();
+    }
+  read_data = CMSDK_SYSCON->RSTINFO;
+  if (read_data != 0) {
+    puts ("ERROR: reset info register value incorrect.\n");
+    UartEndSimulation();
+    }
+
+  /* Trigger hard fault */
+  read_data=HW32_REG(BAD_ADDRESS);
+
+  puts ("ERROR: Hard fault not triggered");
+
+  UartEndSimulation();
+    /* Simulation stops in UartEndSimulation */
+
+  return;
+}
+
+/* ----------------------------------------------------------------- */
+/* Get to here after lockup auto-reset */
+void main_prog_part_3(void)
+{
+  int result=0;
+  unsigned int read_data;
+
+  puts("- Self reset completed");
+  /* Check reset info register value */
+  read_data = CMSDK_SYSCON->RSTINFO;
+  printf ("  SYSCON->RSTINFO = %x\n", read_data);
+  if (read_data != CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Msk) result++;
+  puts("- Clear reset info");
+  CMSDK_SYSCON->RSTINFO = CMSDK_SYSCON_RSTINFO_LOCKUPRESET_Msk;
+  read_data = CMSDK_SYSCON->RSTINFO;
+  printf ("  SYSCON->RSTINFO = %x\n", read_data);
+  if (read_data != 0) result++;
+  if (result != 0) {
+    puts ("ERROR: reset info register value incorrect.\n");
+  } else {
+    puts ("Lockup reset test completed successfully\n");
+    puts ("** TEST PASSED ** \n");
+  }
+  UartEndSimulation();
+    /* Simulation stops in UartEndSimulation */
+
+  return;
+}
+
+/* ----------------------------------------------------------------- */
+void HardFault_Handler(void)
+{
+  unsigned int dummy; /* dummy variable for read that trigger hardfault */
+
+  puts("[Hard fault handler]");
+  puts("- trigger fault again to enter lockup");
+
+  /* Trigger lockup */
+  dummy=HW32_REG(BAD_ADDRESS);
+  puts ("ERROR: Lockup not triggered");
+
+  UartEndSimulation();
+    /* Simulation stops in UartEndSimulation */
+}
+
diff --git a/Cortex-M0/nanosoc/software/common/demos/sleep_demo.c b/Cortex-M0/nanosoc/software/common/demos/sleep_demo.c
new file mode 100644
index 0000000..9e99d3d
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/demos/sleep_demo.c
@@ -0,0 +1,543 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+//==============================================================================
+//
+// Sleep Demonstration
+//
+//==============================================================================
+//
+// This test demonstrates various sleep modes and different ways to enter sleeps.
+// A timer is programmed before entering sleep and interrupt is generated to
+// wake up the processor.
+//
+// SLEEPING
+//
+//   - The test enters normal sleep mode using WFI and WFE.
+//
+//
+// SLEEPDEEP
+//
+//   - The test checks that the SLEEPDEEP output is asserted when the core enters
+//     sleep mode, by using the CM0IKMCU internal GPIO to cause a wake-up interrupt
+//     when the SLEEPDEEP signal is asserted.
+//
+//
+// WIC mode SLEEPDEEP
+//
+//
+//
+//
+
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#include "uart_stdout.h"
+#include "CMSDK_driver.h"
+#include <stdio.h>
+
+//
+// Global Variables to track test progress
+//
+
+volatile uint32_t IntTaken = 0;
+volatile uint32_t SleepOnExitTest = 0;
+
+int  timer0_id_check(void); // Detect Timer 0 present
+
+
+int main (void)
+{
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - Sleep Demo - revision $Revision: 371321 $\n");
+
+  if (timer0_id_check()!=0)  {
+    puts ("** TEST SKIPPED ** Timer 0 not present.");
+    UartEndSimulation();
+    return 0;}
+
+
+  // --------------------------------------------
+  // WFI Normal SLEEP
+  // --------------------------------------------
+  puts("\n- WFI SLEEP:");
+
+  // Ensure we use normal SLEEP - SLEEPDEEP should be clear
+  // SCR[2] = SLEEPDEEP
+  SCB->SCR &= ~(1UL << 2);
+
+  // Ensure timer interrupt is not pending before the test
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);
+
+  // Set timer 0 to decrement from 0xF0 with internal clock,
+  // interrupt enabled
+  CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF0, 1);
+
+  // Enable Interrupts
+  NVIC_EnableIRQ(TIMER0_IRQn);
+
+            // Wait For Interrupt
+  __WFI();  // Enter sleep mode
+            // Wakeup when timer interrupt is triggered
+
+  // Stop the timer and disable interrupt generation
+  CMSDK_timer_StopTimer(CMSDK_TIMER0);
+  CMSDK_timer_DisableIRQ(CMSDK_TIMER0);
+
+  // Check result
+  if (IntTaken) puts("  TIMER IRQ.\n");
+
+  // Disable Interrupt and Interrupt Source
+  NVIC_DisableIRQ(TIMER0_IRQn);
+  IntTaken = 0; // Reset software variable
+
+
+  // --------------------------------------------
+  // WFE Normal SLEEP
+  // --------------------------------------------
+  puts("\n- WFE SLEEP:");
+
+  // Ensure we use normal SLEEP - SLEEPDEEP should be clear
+  // SCR[2] = SLEEPDEEP
+  SCB->SCR &= ~(1UL << 2);
+
+  // Ensure timer interrupt is not pending before the test
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);
+
+  IntTaken = 0; // Reset software variable
+
+  // Set timer 0 to decrement from 0xF0 with internal clock,
+  // interrupt enabled
+  CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF0, 1);
+
+  // Enable Interrupts
+  NVIC_EnableIRQ(TIMER0_IRQn);
+
+  while  (IntTaken==0) { /* Loop for sleep :
+     (first WFE could be woken up immediately due to event from the past)
+     */
+            // Wait For Event
+    __WFE();// Enter sleep mode
+            // Wakeup when timer interrupt is triggered
+  }
+
+  // Stop the timer and disable interrupt generation
+  CMSDK_timer_StopTimer(CMSDK_TIMER0);
+  CMSDK_timer_DisableIRQ(CMSDK_TIMER0);
+
+  // Show message (no need to test variable because of the loop)
+  puts("  TIMER IRQ.\n");
+  IntTaken = 0; // Reset software variable
+
+  // --------------------------------------------
+  // SLEEP-ON-EXIT
+  // --------------------------------------------
+  puts("\n- SLEEP-ON-EXIT:");
+
+  // Ensure we use normal SLEEP - SLEEPDEEP should be clear
+  // SCR[2] = SLEEPDEEP
+  SCB->SCR &= ~(1UL << 2);
+
+  // Enable sleep on exit feature
+  SCB->SCR |= (1UL << 1);
+
+  // Ensure timer interrupt is not pending before the test
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);
+
+  IntTaken = 0; // Reset software variable
+  SleepOnExitTest = 1;
+
+  // Set timer 0 to decrement from 0x2000 with internal clock,
+  // interrupt enabled
+  // Duration is longer than other test due to message display
+  // inside interrupt handler
+  CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0x2000, 1);
+
+  // Enable Interrupts
+  NVIC_EnableIRQ(TIMER0_IRQn);
+
+  while  (IntTaken==0) {
+    /* Wait for first interrupt */
+    /* Then the processor will enter sleep after Timer IRQ handler */
+    /* Sleep on exit is disabled by timer IRQ handler in second occurrence */
+    }
+
+  // Stop the timer and disable interrupt generation
+  CMSDK_timer_StopTimer(CMSDK_TIMER0);
+  CMSDK_timer_DisableIRQ(CMSDK_TIMER0);
+
+  // Show message (no need to test variable because of the loop)
+  IntTaken = 0; // Reset software variable
+  SleepOnExitTest = 0;
+  // Disable sleep on exit feature
+  SCB->SCR &= ~(1UL << 1);
+
+
+
+  // --------------------------------------------
+  // WFI Deep SLEEP
+  // --------------------------------------------
+  puts("\n- WFI DEEP SLEEP:");
+
+  // Ensure we use deep SLEEP - SLEEPDEEP should be set
+  // SCR[2] = SLEEPDEEP
+  SCB->SCR |= (1UL << 2);
+
+  // Ensure timer interrupt is not pending before the test
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);
+
+  // Set timer 0 to decrement from 0xF0 with internal clock,
+  // interrupt enabled
+  CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF0, 1);
+
+  // Enable Interrupts
+  NVIC_EnableIRQ(TIMER0_IRQn);
+
+            // Wait For Interrupt
+  __WFI();  // Enter sleep mode
+            // Wakeup when timer interrupt is triggered
+
+  // Stop the timer and disable interrupt generation
+  CMSDK_timer_StopTimer(CMSDK_TIMER0);
+  CMSDK_timer_DisableIRQ(CMSDK_TIMER0);
+
+  // Check result
+  if (IntTaken) puts("  TIMER IRQ.\n");
+
+  // Disable Interrupt and Interrupt Source
+  NVIC_DisableIRQ(TIMER0_IRQn);
+  IntTaken = 0; // Reset software variable
+
+
+  // --------------------------------------------
+  // WFE Deep SLEEP
+  // --------------------------------------------
+  puts("\n- WFE DEEP SLEEP:");
+
+  // Ensure we use deep SLEEP - SLEEPDEEP should be set
+  // SCR[2] = SLEEPDEEP
+  SCB->SCR |= (1UL << 2);
+
+  // Ensure timer interrupt is not pending before the test
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);
+
+  IntTaken = 0; // Reset software variable
+
+  // Set timer 0 to decrement from 0xF0 with internal clock,
+  // interrupt enabled
+  CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF0, 1);
+
+  // Enable Interrupts
+  NVIC_EnableIRQ(TIMER0_IRQn);
+
+  while  (IntTaken==0) { /* Loop for sleep :
+     (first WFE could be woken up immediately due to event from the past)
+     */
+            // Wait For Event
+    __WFE();// Enter sleep mode
+            // Wakeup when timer interrupt is triggered
+  }
+
+  // Stop the timer and disable interrupt generation
+  CMSDK_timer_StopTimer(CMSDK_TIMER0);
+  CMSDK_timer_DisableIRQ(CMSDK_TIMER0);
+
+  // Show message (no need to test variable because of the loop)
+  puts("  TIMER IRQ.\n");
+  IntTaken = 0; // Reset software variable
+
+  // --------------------------------------------
+  // SLEEP-ON-EXIT
+  // --------------------------------------------
+  puts("\n- SLEEP-ON-EXIT deep sleep:");
+
+  // Ensure we use deep SLEEP - SLEEPDEEP should be set
+  // SCR[2] = SLEEPDEEP
+  SCB->SCR |= (1UL << 2);
+
+  // Enable sleep on exit feature
+  SCB->SCR |= (1UL << 1);
+
+  // Ensure timer interrupt is not pending before the test
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);
+
+  IntTaken = 0; // Reset software variable
+  SleepOnExitTest = 1;
+
+  // Set timer 0 to decrement from 0x2000 with internal clock,
+  // interrupt enabled
+  // Duration is longer than other test due to message display
+  // inside interrupt handler
+  CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0x2000, 1);
+
+  // Enable Interrupts
+  NVIC_EnableIRQ(TIMER0_IRQn);
+
+  while  (IntTaken==0) {
+    /* Wait for first interrupt */
+    /* Then the processor will enter sleep after Timer IRQ handler */
+    /* Sleep on exit is disabled by timer IRQ handler in second occurrence */
+    }
+
+  // Stop the timer and disable interrupt generation
+  CMSDK_timer_StopTimer(CMSDK_TIMER0);
+  CMSDK_timer_DisableIRQ(CMSDK_TIMER0);
+
+  // Show message (no need to test variable because of the loop)
+  IntTaken = 0; // Reset software variable
+  SleepOnExitTest = 0;
+  // Disable sleep on exit feature
+  SCB->SCR &= ~(1UL << 1);
+
+  // --------------------------------------------
+  // WFI Deep SLEEP with PMU enabled
+  // --------------------------------------------
+
+  puts("\n- Detecting PMU control");
+  CMSDK_SYSCON->PMUCTRL = CMSDK_SYSCON_PMUCTRL_EN_Msk; // set bit
+  if ((CMSDK_SYSCON->PMUCTRL & CMSDK_SYSCON_PMUCTRL_EN_Msk)==0) {
+    puts ("PMU not available\n");
+    }
+  else {
+
+    puts("\n- WFI DEEP SLEEP with WIC");
+
+    // Ensure we use deep SLEEP - SLEEPDEEP should be set
+    // SCR[2] = SLEEPDEEP
+    SCB->SCR |= (1UL << 2);
+
+    // Ensure timer interrupt is not pending before the test
+    NVIC_ClearPendingIRQ(TIMER0_IRQn);
+
+    // Set timer 0 to decrement from 0xF0 with internal clock,
+    // interrupt enabled
+    CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF0, 1);
+
+    // Enable Interrupts
+    NVIC_EnableIRQ(TIMER0_IRQn);
+
+              // Wait For Interrupt
+    __WFI();  // Enter sleep mode
+              // Wakeup when timer interrupt is triggered
+
+    // Stop the timer and disable interrupt generation
+    CMSDK_timer_StopTimer(CMSDK_TIMER0);
+    CMSDK_timer_DisableIRQ(CMSDK_TIMER0);
+
+    // Check result
+    if (IntTaken) puts("  TIMER IRQ.\n");
+
+    // Disable Interrupt and Interrupt Source
+    NVIC_DisableIRQ(TIMER0_IRQn);
+    IntTaken = 0; // Reset software variable
+
+
+  // --------------------------------------------
+  // WFE Deep SLEEP with PMU enabled
+  // --------------------------------------------
+    puts("\n- WFE DEEP SLEEP with WIC");
+
+    // Ensure we use deep SLEEP - SLEEPDEEP should be set
+    // SCR[2] = SLEEPDEEP
+    SCB->SCR |= (1UL << 2);
+
+    // Ensure timer interrupt is not pending before the test
+    NVIC_ClearPendingIRQ(TIMER0_IRQn);
+
+    IntTaken = 0; // Reset software variable
+
+    // Set timer 0 to decrement from 0xF0 with internal clock,
+    // interrupt enabled
+    CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF0, 1);
+
+    // Enable Interrupts
+    NVIC_EnableIRQ(TIMER0_IRQn);
+
+    while  (IntTaken==0) { /* Loop for sleep :
+       (first WFE could be woken up immediately due to event from the past)
+       */
+              // Wait For Event
+      __WFE();// Enter sleep mode
+              // Wakeup when timer interrupt is triggered
+    }
+
+    // Stop the timer and disable interrupt generation
+    CMSDK_timer_StopTimer(CMSDK_TIMER0);
+    CMSDK_timer_DisableIRQ(CMSDK_TIMER0);
+
+    // Check result
+    // Show message (no need to test variable because of the loop)
+    puts("  TIMER IRQ.\n");
+    IntTaken = 0; // Reset software variable
+
+    // --------------------------------------------
+    // SLEEP-ON-EXIT
+    // --------------------------------------------
+    puts("\n- SLEEP-ON-EXIT with WIC:");
+
+    // Enable sleep on exit feature
+    SCB->SCR |= (1UL << 1);
+
+    // Ensure timer interrupt is not pending before the test
+    NVIC_ClearPendingIRQ(TIMER0_IRQn);
+
+    IntTaken = 0; // Reset software variable
+    SleepOnExitTest = 1;
+
+    // Set timer 0 to decrement from 0x2000 with internal clock,
+    // interrupt enabled
+    // Duration is longer than other test due to message display
+    // inside interrupt handler
+    CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0x2000, 1);
+
+    // Enable Interrupts
+    NVIC_EnableIRQ(TIMER0_IRQn);
+
+    while  (IntTaken==0) {
+      /* Wait for first interrupt */
+      /* Then the processor will enter sleep after Timer IRQ handler */
+      /* Sleep on exit is disabled by timer IRQ handler in second occurrence */
+      }
+
+    // Stop the timer and disable interrupt generation
+    CMSDK_timer_StopTimer(CMSDK_TIMER0);
+    CMSDK_timer_DisableIRQ(CMSDK_TIMER0);
+
+    // Show message (no need to test variable because of the loop)
+    IntTaken = 0; // Reset software variable
+    SleepOnExitTest = 0;
+    // Disable sleep on exit feature
+    SCB->SCR &= ~(1UL << 1);
+
+    }
+
+    // --------------------------------------------
+    // Disable PMU
+    // --------------------------------------------
+    CMSDK_SYSCON->PMUCTRL = 0; // Clear bit
+    if ((CMSDK_SYSCON->PMUCTRL & CMSDK_SYSCON_PMUCTRL_EN_Msk)!=0) {
+      puts ("ERROR:PMU control cannot be cleared\n");
+    }
+
+    puts("\n- WFI DEEP SLEEP with WIC switched off");
+
+    // Ensure we use deep SLEEP - SLEEPDEEP should be set
+    // SCR[2] = SLEEPDEEP
+    SCB->SCR |= (1UL << 2);
+
+    // Ensure timer interrupt is not pending before the test
+    NVIC_ClearPendingIRQ(TIMER0_IRQn);
+
+    // Set timer 0 to decrement from 0xF0 with internal clock,
+    // interrupt enabled
+    CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF0, 1);
+
+    // Enable Interrupts
+    NVIC_EnableIRQ(TIMER0_IRQn);
+
+              // Wait For Interrupt
+    __WFI();  // Enter sleep mode
+              // Wakeup when timer interrupt is triggered
+
+    // Stop the timer and disable interrupt generation
+    CMSDK_timer_StopTimer(CMSDK_TIMER0);
+    CMSDK_timer_DisableIRQ(CMSDK_TIMER0);
+
+    // Check result
+    if (IntTaken) puts("  TIMER IRQ.\n");
+
+  // Disable Interrupt and Interrupt Source
+  NVIC_DisableIRQ(TIMER0_IRQn);
+  IntTaken = 0;
+
+  printf("** TEST PASSED ** \n");
+
+  UartEndSimulation();
+  /* Simulation stops in UartEndSimulation */
+
+  return 0;
+}
+
+//
+// Timer 0 detection
+//
+/* Macros for word access to address */
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+
+int timer0_id_check(void)
+{
+if ((HW32_REG(CMSDK_TIMER0_BASE + 0xFE0) != 0x22) ||
+    (HW32_REG(CMSDK_TIMER0_BASE + 0xFE4) != 0xB8))
+  return 1; /* part ID does not match */
+else
+  return 0;
+}
+
+
+//
+// Timer interrupt handler
+//
+
+void TIMER0_Handler(void)
+{
+  CMSDK_timer_ClearIRQ(CMSDK_TIMER0);
+  // Signal to main code that the INT was taken
+  IntTaken++;
+  if (SleepOnExitTest==1){
+    puts("  TIMER IRQ.");
+    if (IntTaken==1){
+      puts("  Enter sleep...");
+      }
+
+    if (IntTaken==2){
+      // Disable sleep on exit feature
+      SCB->SCR &= ~(1UL << 1);
+      // Stop the timer and disable interrupt generation
+      CMSDK_timer_StopTimer(CMSDK_TIMER0);
+      CMSDK_timer_DisableIRQ(CMSDK_TIMER0);
+      }
+   } else {
+    // Stop the timer and disable interrupt generation
+    CMSDK_timer_StopTimer(CMSDK_TIMER0);
+    CMSDK_timer_DisableIRQ(CMSDK_TIMER0);
+  }
+
+}
+
diff --git a/Cortex-M0/nanosoc/software/common/demos/watchdog_demo.c b/Cortex-M0/nanosoc/software/common/demos/watchdog_demo.c
new file mode 100644
index 0000000..9c574f5
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/demos/watchdog_demo.c
@@ -0,0 +1,355 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+ /* Check demonstrate watchdog functionality */
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"
+
+/* Macros for word access to address */
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+
+void main_prog_part_1(void);
+void main_prog_part_2(void);
+int  watchdog_id_check(void);
+int  sysctrl_id_check(void);
+void watchdog_init(unsigned int cycle, int type);
+                                       /* Program watchdog: */
+                                       /* type = 0 : No action */
+                                       /* type = 1 : Interrupt */
+                                       /* type = 2 : Reset */
+void watchdog_set(unsigned int cycle); /* update watchdog counter */
+void watchdog_unlock(void);            /* unlock watchdog */
+void watchdog_lock(void);              /* lock watchdog */
+void watchdog_irq_clear(void);         /* clear watchdog interrupt */
+
+/* Software variables for testing */
+volatile int nmi_occurred;
+volatile int nmi_expected;
+volatile int reset_test;  /* set to 1 during watchdog reset test so that NMI
+                             handler will not clear the watchdog */
+volatile int integration_test=0;  /* set to 1 during watchdog integration test so that NMI
+                             handler will clear integration test output */
+
+/* Start of main code */
+int main (void)
+{
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - Watchdog Demo - revision $Revision: 371321 $\n");
+
+  if (sysctrl_id_check()!=0) {
+    puts ("** TEST SKIPPED ** SysCtrl not present.");
+    UartEndSimulation();
+    return 0;}
+
+  /* Check CMSDK_SYSCON->RSTINFO Reset Information register */
+  /*  0 = cold reset */
+  /*  1 = reset from SYSRESETREQ */
+  /*  2 = reset from Watchdog */
+  if ((CMSDK_SYSCON->RSTINFO & CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Msk) !=0) {
+    puts ("Restarted by Watchdog reset");
+    main_prog_part_2();
+    UartEndSimulation(); /* Simulation stop */
+  }
+  else if ((CMSDK_SYSCON->RSTINFO & CMSDK_SYSCON_RSTINFO_SYSRESETREQ_Msk) !=0) {
+    puts ("Restarted by SYSRESETREQ reset");
+    puts ("ERROR: reset info register value incorrect.\n");
+    UartEndSimulation(); /* Simulation stop */
+  }
+  else {
+    puts("Watchdog demo test\n");
+
+    if (watchdog_id_check()!=0) {
+      puts ("** TEST SKIPPED ** Watchdog not present.");
+      UartEndSimulation();
+      return 0;}
+
+    main_prog_part_1();
+  }
+  puts ("** TEST PASSED ** \n");
+  UartEndSimulation(); /* Simulation stop */
+}
+/* ----------------------------------------------------------------- */
+/* Detect the ARM ID and part number to see if device is present     */
+int watchdog_id_check(void)
+{
+unsigned char wdog_id;
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+#define HW8_REG(ADDRESS)   (*((volatile unsigned char  *)(ADDRESS)))
+
+wdog_id = HW8_REG(CMSDK_WATCHDOG_BASE + 0xFE8) & 0x07;
+
+if ((HW32_REG(CMSDK_WATCHDOG_BASE + 0xFE0) != 0x24) ||
+    (HW32_REG(CMSDK_WATCHDOG_BASE + 0xFE4) != 0xB8) ||
+    (wdog_id != 0x03))
+  return 1; /* part ID & ARM ID does not match */
+else
+  return 0;
+}
+int sysctrl_id_check(void)
+{ /* CMSDK SysCtrl part ID range from 826 to 829 */
+if ((HW32_REG(CMSDK_SYSCTRL_BASE + 0xFE0) < 0x26) ||
+    (HW32_REG(CMSDK_SYSCTRL_BASE + 0xFE0) > 0x29) ||
+    (HW32_REG(CMSDK_SYSCTRL_BASE + 0xFE4) != 0xB8))
+  return 1; /* part ID does not match */
+else
+  return 0;
+}
+
+/* ----------------------------------------------------------------- */
+/* First part of the test program                                    */
+void main_prog_part_1(void)
+{
+  int i;
+  const char expected_id[8]={0x24, 0xB8, 0x1B, 0x00, 0x0D, 0xF0, 0x05, 0xB1};
+  unsigned int read_data;
+  reset_test = 0;
+
+  puts("Main program part 1\n");
+  puts("- Detect ID registers\n");
+  // Check the IDs and not revision number
+  for (i=0; i<8; i++){
+    read_data = HW32_REG(CMSDK_WATCHDOG_BASE + 0xFE0 + i*4);
+    if (read_data==expected_id[i]){
+      printf ("Values[%x]=0x%x\n", i, read_data);
+    } else {
+      printf ("ERROR : Values[%x]=0x%x, expected 0x%x\n", i, read_data,expected_id[i]);
+      UartEndSimulation();
+    }
+  }
+  puts("\n- Program watchdog for 10000 cycles");
+  watchdog_init(10000, 1); /* Generate NMI */
+  nmi_occurred = 0;
+  nmi_expected = 0;
+  puts("- Run loop with watchdog set regularly 10 times\n");
+  i = 0;
+  while (i<10) {
+    read_data = CMSDK_WATCHDOG->VALUE;
+    if (read_data < 8000) //the threshold must be large enough so that the NMI interrupt
+                          //won't be triggered before the watchdog value is set again
+    {
+      watchdog_set(10000);
+      i++;
+      puts ("  Watchdog value set again");
+    }
+  }
+
+  watchdog_init(5000, 0); /* Set watchdog to no action */
+  if (nmi_occurred!=0) {
+    puts ("ERROR : NMI occurred unexpectedly\n");
+    UartEndSimulation();  /* Simulation stop */
+  }
+
+  puts("\n- Test NMI generation");
+  nmi_occurred = 0;
+  nmi_expected = 1;
+  watchdog_init(5000, 1); /* Generate NMI */
+
+  while (nmi_occurred==0) {
+    //Wait for the watchdog interrupt
+  }
+
+  watchdog_init(5000, 0); /* Set watchdog to no action */
+  puts("\n- Test reset generation");
+  nmi_occurred = 0;
+  nmi_expected = 1; /* NMI will be triggered first */
+  reset_test   = 1; /* put NMI handler to reset test operation */
+  watchdog_init(5000, 2); /* Generate Reset */
+  while (1) {
+    // wait for NMI...
+  }
+}
+
+
+/* ----------------------------------------------------------------- */
+/* Second part of the main test program - execute after watchdog reset */
+void main_prog_part_2(void)
+{
+  int result=0;
+  unsigned int read_data;
+  puts("Main program part 2");
+  puts("- Watchdog reset completed");
+  read_data = CMSDK_SYSCON->RSTINFO;
+  printf ("  SYSCON->RSTINFO = %x\n", read_data);
+
+  if (read_data != CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Msk) {
+     result++;
+  }
+  puts("- Clear reset info");
+  CMSDK_SYSCON->RSTINFO = CMSDK_SYSCON_RSTINFO_WDOGRESETREQ_Msk;
+  read_data = CMSDK_SYSCON->RSTINFO;
+  printf ("  SYSCON->RSTINFO = %x\n", read_data);
+
+  if (read_data != 0)/* RSTINFO should be cleared */
+  {
+     result++;
+  }
+
+  if (result != 0) {
+    puts ("ERROR: reset info register value incorrect.\n");
+  } else {
+    puts ("Watchdog reset performed successfully\n");
+  }
+
+  /*                                                  */
+  /* A simple integration test for Watchdog using NMI */
+  /*                                                  */
+
+   /* Instead of trigger NMI using normal watchdog operation, you can also
+      test the watchdog connection using integration test register.
+      ITCR - bit 0 enable integration test mode
+      ITOP - bit 0 enable watchdog reset when integration test mode is enabled
+             bit 1 enable watchdog interrupt when integration test mode is enabled
+
+      Here we demonstrate the generation of interrupt (NMI) using integration test
+      registers. You can also use integration test register to generate reset
+      but this will cause this part of the test running again and again, so we
+      will not demonstrate it here.
+   */
+
+  puts("Testing generation of NMI using integration test register");
+  reset_test = 0;
+  integration_test = 1;
+  nmi_expected = 0;
+  nmi_occurred = 0;
+  watchdog_unlock();
+  CMSDK_WATCHDOG->ITOP = 0;  // Ensure NMI and reset in integration test mode are 0
+  CMSDK_WATCHDOG->ITCR = 1;  // Enable integration test mode
+  if (CMSDK_WATCHDOG->ITCR == 0) {
+     puts ("  - Integration Control read error");
+     result++;
+  }
+  else {
+    nmi_expected = 1;
+    CMSDK_WATCHDOG->ITOP = 2;  // Set NMI output to 1
+    CMSDK_WATCHDOG->ITOP = 0;  // Set NMI output to 0
+    if (nmi_occurred==0) {
+       puts ("  - Integration Test operation failed");
+       result++;
+    }
+    CMSDK_WATCHDOG->ITCR = 0;  // Disable integration test mode
+    if (CMSDK_WATCHDOG->ITCR != 0) {
+      puts ("  - Integration Control clear error");
+      result++;
+    }
+  }
+  if (result != 0) {
+    puts ("** TEST FAILED ** Errors in Watchdog test\n");
+  } else {
+    puts ("Watchdog demo completed successfully\n** TEST PASSED ** \n");
+  }
+
+  UartEndSimulation(); /* Simulation stops in UartEndSimulation */
+}
+
+/* ----------------------------------------------------------------- */
+void NMI_Handler(void)
+{
+
+  puts ("NMI Handler Entered! \n");
+  if (reset_test==1){  /* When testing watchdog reset, need to stay
+    in NMI handler until the watchdog overflows again */
+    while (1) {
+     // wait for reset...
+    }
+  }
+  watchdog_irq_clear(); /* Deassert Watchdog interrupt */
+  nmi_occurred++; /* Update software flag */
+  if (nmi_expected==0) { /* error check */
+    puts ("ERROR : NMI occurred unexpectedly\n");
+    UartEndSimulation(); /* Simulation stop */
+  }
+  if (integration_test!=0) {
+    watchdog_unlock();
+    CMSDK_WATCHDOG->ITOP = 0;  // Set NMI output to 0
+  }
+}
+/* ----------------------------------------------------------------- */
+/* Watchdog initialization */
+void watchdog_init(unsigned int cycle, int type)
+{
+  puts   ("  Unlocking watchdog...");
+  watchdog_unlock();
+  CMSDK_WATCHDOG->LOAD = cycle;
+  if (type==0) {
+    puts   ("  Set to no action");
+    CMSDK_WATCHDOG->CTRL = 0;
+  } else if (type==1) {
+    puts   ("  Set to NMI generation");
+    CMSDK_WATCHDOG->CTRL = CMSDK_Watchdog_CTRL_INTEN_Msk;
+  } else {
+    puts   ("  Set to reset generation");
+    CMSDK_WATCHDOG->CTRL = CMSDK_Watchdog_CTRL_RESEN_Msk|CMSDK_Watchdog_CTRL_INTEN_Msk;
+  }
+  puts   ("  Locking watchdog...");
+  watchdog_lock();
+}
+/* ----------------------------------------------------------------- */
+/* Update watchdog counter */
+void watchdog_set(unsigned int cycle)
+{
+  watchdog_unlock();
+  CMSDK_WATCHDOG->CTRL = cycle;
+  watchdog_lock();
+}
+/* ----------------------------------------------------------------- */
+/* Unlock watchdog access */
+void watchdog_unlock(void)
+{
+  CMSDK_WATCHDOG->LOCK = 0x1ACCE551;
+}
+/* ----------------------------------------------------------------- */
+/* Lock watchdog access */
+void watchdog_lock(void)
+{
+  CMSDK_WATCHDOG->LOCK = 0;
+}
+/* ----------------------------------------------------------------- */
+/* Clear watchdog interrupt request */
+void watchdog_irq_clear(void)
+{
+  watchdog_unlock();
+  CMSDK_WATCHDOG->INTCLR = CMSDK_Watchdog_INTCLR_Msk;
+  watchdog_lock();
+}
+
diff --git a/Cortex-M0/nanosoc/software/common/dhry/dhry.h b/Cortex-M0/nanosoc/software/common/dhry/dhry.h
new file mode 100644
index 0000000..5845c12
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/dhry/dhry.h
@@ -0,0 +1,455 @@
+/*
+This is a MODIFIED version of the Dhrystone 2.1 Benchmark program.
+
+The only changes which have been made are:
+1) the 'old-style' K&R function declarations have been replaced with
+'ANSI-C-style' function declarations (in dhry_1.c and dhry_2,c), and
+2) function prototypes have been added (in dhry.h)
+3) dhry.h uses CLOCKS_PER_SEC instead of CLK_TCK (to build with -strict)
+
+These changes allow an ANSI-C compiler to produce more efficient code, with
+no warnings.
+*/
+
+/*
+ ****************************************************************************
+ *
+ *                   "DHRYSTONE" Benchmark Program
+ *                   -----------------------------
+ *
+ *  Version:    C, Version 2.1
+ *
+ *  File:       dhry.h (part 1 of 3)
+ *
+ *  Date:       May 25, 1988
+ *
+ *  Author:     Reinhold P. Weicker
+ *                      Siemens AG, E STE 35
+ *                      Postfach 3240
+ *                      8520 Erlangen
+ *                      Germany (West)
+ *                              Phone:  [xxx-49]-9131-7-20330
+ *                                      (8-17 Central European Time)
+ *                              Usenet: ..!mcvax!unido!estevax!weicker
+ *
+ *              Original Version (in Ada) published in
+ *              "Communications of the ACM" vol. 27., no. 10 (Oct. 1984),
+ *              pp. 1013 - 1030, together with the statistics
+ *              on which the distribution of statements etc. is based.
+ *
+ *              In this C version, the following C library functions are used:
+ *              - strcpy, strcmp (inside the measurement loop)
+ *              - printf, scanf (outside the measurement loop)
+ *              In addition, Berkeley UNIX system calls "times ()" or "time ()"
+ *              are used for execution time measurement. For measurements
+ *              on other systems, these calls have to be changed.
+ *
+ *  Collection of Results:
+ *              Reinhold Weicker (address see above) and
+ *
+ *              Rick Richardson
+ *              PC Research. Inc.
+ *              94 Apple Orchard Drive
+ *              Tinton Falls, NJ 07724
+ *                      Phone:  (201) 389-8963 (9-17 EST)
+ *                      Usenet: ...!uunet!pcrat!rick
+ *
+ *      Please send results to Rick Richardson and/or Reinhold Weicker.
+ *      Complete information should be given on hardware and software used.
+ *      Hardware information includes: Machine type, CPU, type and size
+ *      of caches; for microprocessors: clock frequency, memory speed
+ *      (number of wait states).
+ *      Software information includes: Compiler (and runtime library)
+ *      manufacturer and version, compilation switches, OS version.
+ *      The Operating System version may give an indication about the
+ *      compiler; Dhrystone itself performs no OS calls in the measurement loop.
+ *
+ *      The complete output generated by the program should be mailed
+ *      such that at least some checks for correctness can be made.
+ *
+ ***************************************************************************
+ *
+ *  History:    This version C/2.1 has been made for two reasons:
+ *
+ *              1) There is an obvious need for a common C version of
+ *              Dhrystone, since C is at present the most popular system
+ *              programming language for the class of processors
+ *              (microcomputers, minicomputers) where Dhrystone is used most.
+ *              There should be, as far as possible, only one C version of
+ *              Dhrystone such that results can be compared without
+ *              restrictions. In the past, the C versions distributed
+ *              by Rick Richardson (Version 1.1) and by Reinhold Weicker
+ *              had small (though not significant) differences.
+ *
+ *              2) As far as it is possible without changes to the Dhrystone
+ *              statistics, optimizing compilers should be prevented from
+ *              removing significant statements.
+ *
+ *              This C version has been developed in cooperation with
+ *              Rick Richardson (Tinton Falls, NJ), it incorporates many
+ *              ideas from the "Version 1.1" distributed previously by
+ *              him over the UNIX network Usenet.
+ *              I also thank Chaim Benedelac (National Semiconductor),
+ *              David Ditzel (SUN), Earl Killian and John Mashey (MIPS),
+ *              Alan Smith and Rafael Saavedra-Barrera (UC at Berkeley)
+ *              for their help with comments on earlier versions of the
+ *              benchmark.
+ *
+ *  Changes:    In the initialization part, this version follows mostly
+ *              Rick Richardson's version distributed via Usenet, not the
+ *              version distributed earlier via floppy disk by Reinhold Weicker.
+ *              As a concession to older compilers, names have been made
+ *              unique within the first 8 characters.
+ *              Inside the measurement loop, this version follows the
+ *              version previously distributed by Reinhold Weicker.
+ *
+ *              At several places in the benchmark, code has been added,
+ *              but within the measurement loop only in branches that
+ *              are not executed. The intention is that optimizing compilers
+ *              should be prevented from moving code out of the measurement
+ *              loop, or from removing code altogether. Since the statements
+ *              that are executed within the measurement loop have NOT been
+ *              changed, the numbers defining the "Dhrystone distribution"
+ *              (distribution of statements, operand types and locality)
+ *              still hold. Except for sophisticated optimizing compilers,
+ *              execution times for this version should be the same as
+ *              for previous versions.
+ *
+ *              Since it has proven difficult to subtract the time for the
+ *              measurement loop overhead in a correct way, the loop check
+ *              has been made a part of the benchmark. This does have
+ *              an impact - though a very minor one - on the distribution
+ *              statistics which have been updated for this version.
+ *
+ *              All changes within the measurement loop are described
+ *              and discussed in the companion paper "Rationale for
+ *              Dhrystone version 2".
+ *
+ *              Because of the self-imposed limitation that the order and
+ *              distribution of the executed statements should not be
+ *              changed, there are still cases where optimizing compilers
+ *              may not generate code for some statements. To a certain
+ *              degree, this is unavoidable for small synthetic benchmarks.
+ *              Users of the benchmark are advised to check code listings
+ *              whether code is generated for all statements of Dhrystone.
+ *
+ *              Version 2.1 is identical to version 2.0 distributed via
+ *              the UNIX network Usenet in March 1988 except that it corrects
+ *              some minor deficiencies that were found by users of version 2.0.
+ *              The only change within the measurement loop is that a
+ *              non-executed "else" part was added to the "if" statement in
+ *              Func_3, and a non-executed "else" part removed from Proc_3.
+ *
+ ***************************************************************************
+ *
+ * Defines:     The following "Defines" are possible:
+ *              -DREG=register          (default: Not defined)
+ *                      As an approximation to what an average C programmer
+ *                      might do, the "register" storage class is applied
+ *                      (if enabled by -DREG=register)
+ *                      - for local variables, if they are used (dynamically)
+ *                        five or more times
+ *                      - for parameters if they are used (dynamically)
+ *                        six or more times
+ *                      Note that an optimal "register" strategy is
+ *                      compiler-dependent, and that "register" declarations
+ *                      do not necessarily lead to faster execution.
+ *              -DNOSTRUCTASSIGN        (default: Not defined)
+ *                      Define if the C compiler does not support
+ *                      assignment of structures.
+ *              -DNOENUMS               (default: Not defined)
+ *                      Define if the C compiler does not support
+ *                      enumeration types.
+ *              -DTIMES                 (default)
+ *              -DTIME
+ *                      The "times" function of UNIX (returning process times)
+ *                      or the "time" function (returning wallclock time)
+ *                      is used for measurement.
+ *                      For single user machines, "time ()" is adequate. For
+ *                      multi-user machines where you cannot get single-user
+ *                      access, use the "times ()" function. If you have
+ *                      neither, use a stopwatch in the dead of night.
+ *                      "printf"s are provided marking the points "Start Timer"
+ *                      and "Stop Timer". DO NOT use the UNIX "time(1)"
+ *                      command, as this will measure the total time to
+ *                      run this program, which will (erroneously) include
+ *                      the time to allocate storage (malloc) and to perform
+ *                      the initialization.
+ *              -DHZ=nnn
+ *                      In Berkeley UNIX, the function "times" returns process
+ *                      time in 1/HZ seconds, with HZ = 60 for most systems.
+ *                      CHECK YOUR SYSTEM DESCRIPTION BEFORE YOU JUST APPLY
+ *                      A VALUE.
+ *
+ ***************************************************************************
+ *
+ *  Compilation model and measurement (IMPORTANT):
+ *
+ *  This C version of Dhrystone consists of three files:
+ *  - dhry.h (this file, containing global definitions and comments)
+ *  - dhry_1.c (containing the code corresponding to Ada package Pack_1)
+ *  - dhry_2.c (containing the code corresponding to Ada package Pack_2)
+ *
+ *  The following "ground rules" apply for measurements:
+ *  - Separate compilation
+ *  - No procedure merging
+ *  - Otherwise, compiler optimizations are allowed but should be indicated
+ *  - Default results are those without register declarations
+ *  See the companion paper "Rationale for Dhrystone Version 2" for a more
+ *  detailed discussion of these ground rules.
+ *
+ *  For 16-Bit processors (e.g. 80186, 80286), times for all compilation
+ *  models ("small", "medium", "large" etc.) should be given if possible,
+ *  together with a definition of these models for the compiler system used.
+ *
+ **************************************************************************
+ *
+ *  Dhrystone (C version) statistics:
+ *
+ *  [Comment from the first distribution, updated for version 2.
+ *   Note that because of language differences, the numbers are slightly
+ *   different from the Ada version.]
+ *
+ *  The following program contains statements of a high level programming
+ *  language (here: C) in a distribution considered representative:
+ *
+ *    assignments                  52 (51.0 %)
+ *    control statements           33 (32.4 %)
+ *    procedure, function calls    17 (16.7 %)
+ *
+ *  103 statements are dynamically executed. The program is balanced with
+ *  respect to the three aspects:
+ *
+ *    - statement type
+ *    - operand type
+ *    - operand locality
+ *         operand global, local, parameter, or constant.
+ *
+ *  The combination of these three aspects is balanced only approximately.
+ *
+ *  1. Statement Type:
+ *  -----------------             number
+ *
+ *     V1 = V2                     9
+ *       (incl. V1 = F(..)
+ *     V = Constant               12
+ *     Assignment,                 7
+ *       with array element
+ *     Assignment,                 6
+ *       with record component
+ *                                --
+ *                                34       34
+ *
+ *     X = Y +|-|"&&"|"|" Z        5
+ *     X = Y +|-|"==" Constant     6
+ *     X = X +|- 1                 3
+ *     X = Y *|/ Z                 2
+ *     X = Expression,             1
+ *           two operators
+ *     X = Expression,             1
+ *           three operators
+ *                                --
+ *                                18       18
+ *
+ *     if ....                    14
+ *       with "else"      7
+ *       without "else"   7
+ *           executed        3
+ *           not executed    4
+ *     for ...                     7  |  counted every time
+ *     while ...                   4  |  the loop condition
+ *     do ... while                1  |  is evaluated
+ *     switch ...                  1
+ *     break                       1
+ *     declaration with            1
+ *       initialization
+ *                                --
+ *                                34       34
+ *
+ *     P (...)  procedure call    11
+ *       user procedure      10
+ *       library procedure    1
+ *     X = F (...)
+ *             function  call      6
+ *       user function        5
+ *       library function     1
+ *                                --
+ *                                17       17
+ *                                        ---
+ *                                        103
+ *
+ *    The average number of parameters in procedure or function calls
+ *    is 1.82 (not counting the function values aX *
+ *
+ *  2. Operators
+ *  ------------
+ *                          number    approximate
+ *                                    percentage
+ *
+ *    Arithmetic             32          50.8
+ *
+ *       +                     21          33.3
+ *       -                      7          11.1
+ *       *                      3           4.8
+ *       / (int div)            1           1.6
+ *
+ *    Comparison             27           42.8
+ *
+ *       ==                     9           14.3
+ *       /=                     4            6.3
+ *       >                      1            1.6
+ *       <                      3            4.8
+ *       >=                     1            1.6
+ *       <=                     9           14.3
+ *
+ *    Logic                   4            6.3
+ *
+ *       && (AND-THEN)          1            1.6
+ *       |  (OR)                1            1.6
+ *       !  (NOT)               2            3.2
+ *
+ *                           --          -----
+ *                           63          100.1
+ *
+ *
+ *  3. Operand Type (counted once per operand reference):
+ *  ---------------
+ *                          number    approximate
+ *                                    percentage
+ *
+ *     Integer               175        72.3 %
+ *     Character              45        18.6 %
+ *     Pointer                12         5.0 %
+ *     String30                6         2.5 %
+ *     Array                   2         0.8 %
+ *     Record                  2         0.8 %
+ *                           ---       -------
+ *                           242       100.0 %
+ *
+ *  When there is an access path leading to the final operand (e.g. a record
+ *  component), only the final data type on the access path is counted.
+ *
+ *
+ *  4. Operand Locality:
+ *  -------------------
+ *                                number    approximate
+ *                                          percentage
+ *
+ *     local variable              114        47.1 %
+ *     global variable              22         9.1 %
+ *     parameter                    45        18.6 %
+ *        value                        23         9.5 %
+ *        reference                    22         9.1 %
+ *     function result               6         2.5 %
+ *     constant                     55        22.7 %
+ *                                 ---       -------
+ *                                 242       100.0 %
+ *
+ *
+ *  The program does not compute anything meaningful, but it is syntactically
+ *  and semantically correct. All variables have a value assigned to them
+ *  before they are used as a source operand.
+ *
+ *  There has been no explicit effort to account for the effects of a
+ *  cache, or to balance the use of long or short displacements for code or
+ *  data.
+ *
+ ***************************************************************************
+ */
+
+#include <string.h>
+#include <stdlib.h>
+
+/* Compiler and system dependent definitions: */
+
+                /* Use times(2) time function unless    */
+                /* explicitly defined otherwise         */
+
+#ifdef MSC_CLOCK
+#undef HZ
+#undef TIMES
+#include <time.h>
+#define HZ     CLOCKS_PER_SEC
+#endif
+               /* Use Microsoft C hi-res clock */
+
+#ifdef TIMES
+#include <sys/types.h>
+#include <sys/times.h>
+                /* for "times" */
+#endif
+
+#define Mic_secs_Per_Second     1000000.0
+                /* Berkeley UNIX C returns process times in seconds/HZ */
+
+#ifdef  NOSTRUCTASSIGN
+#define structassign(d, s)      memcpy(&(d), &(s), sizeof(d))
+#else
+#define structassign(d, s)      (d = s)
+#endif
+
+#ifdef  NOENUM
+#define Ident_1 0
+#define Ident_2 1
+#define Ident_3 2
+#define Ident_4 3
+#define Ident_5 4
+  typedef int   Enumeration;
+#else
+  typedef       enum    {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5}
+                Enumeration;
+#endif
+        /* for boolean and enumeration types in Ada, Pascal */
+
+/* General definitions: */
+
+#include <stdio.h>
+                /* for strcpy, strcmp */
+
+#define Null 0
+                /* Value of a Null pointer */
+#define true  1
+#define false 0
+
+typedef int     One_Thirty;
+typedef int     One_Fifty;
+typedef char    Capital_Letter;
+typedef int     Boolean;
+typedef char    Str_30 [31];
+typedef int     Arr_1_Dim [50];
+typedef int     Arr_2_Dim [50] [50];
+
+typedef struct record
+    {
+    struct record *Ptr_Comp;
+    Enumeration    Discr;
+    union {
+          struct {
+                  Enumeration Enum_Comp;
+                  int         Int_Comp;
+                  char        Str_Comp [31];
+                  } var_1;
+          struct {
+                  Enumeration E_Comp_2;
+                  char        Str_2_Comp [31];
+                  } var_2;
+          struct {
+                  char        Ch_1_Comp;
+                  char        Ch_2_Comp;
+                  } var_3;
+          } variant;
+      } Rec_Type, *Rec_Pointer;
+
+
+void Proc_1 (Rec_Pointer Ptr_Val_Par);
+void Proc_2 (One_Fifty *Int_Par_Ref);
+void Proc_3 (Rec_Pointer *Ptr_Ref_Par);
+void Proc_4 (void);
+void Proc_5 (void);
+void Proc_6 (Enumeration  Enum_Val_Par, Enumeration *Enum_Ref_Par);
+void Proc_7 (One_Fifty Int_1_Par_Val, One_Fifty Int_2_Par_Val, One_Fifty *Int_Par_Ref);
+void Proc_8 (Arr_1_Dim Arr_1_Par_Ref, Arr_2_Dim Arr_2_Par_Ref, int Int_1_Par_Val, int Int_2_Par_Val);
+Enumeration Func_1 (Capital_Letter Ch_1_Par_Val, Capital_Letter Ch_2_Par_Val);
+Boolean Func_2 (Str_30 Str_1_Par_Ref, Str_30 Str_2_Par_Ref);
+Boolean Func_3 (Enumeration Enum_Par_Val);
+
diff --git a/Cortex-M0/nanosoc/software/common/dhry/dhry_1.c b/Cortex-M0/nanosoc/software/common/dhry/dhry_1.c
new file mode 100644
index 0000000..090af85
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/dhry/dhry_1.c
@@ -0,0 +1,465 @@
+/*
+This is a MODIFIED version of the Dhrystone 2.1 Benchmark program.
+
+The only changes which have been made are:
+1) the 'old-style' K&R function declarations have been replaced with
+'ANSI-C-style' function declarations (in dhry_1.c and dhry_2,c), and
+2) function prototypes have been added (in dhry.h)
+3) dhry.h uses CLOCKS_PER_SEC instead of CLK_TCK (to build with -strict)
+
+These changes allow an ANSI-C compiler to produce more efficient code, with
+no warnings.
+*/
+
+/*
+ ****************************************************************************
+ *
+ *                   "DHRYSTONE" Benchmark Program
+ *                   -----------------------------
+ *
+ *  Version:    C, Version 2.1
+ *
+ *  File:       dhry_1.c (part 2 of 3)
+ *
+ *  Date:       May 25, 1988
+ *
+ *  Author:     Reinhold P. Weicker
+ *
+ ****************************************************************************
+ */
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+#include "uart_stdout.h"
+#define EXPECTED_SYST
+#define MSC_CLOCK
+#include "dhry.h"
+
+/* Global Variables: */
+
+Rec_Pointer     Ptr_Glob,
+                Next_Ptr_Glob;
+int             Int_Glob;
+Boolean         Bool_Glob;
+char            Ch_1_Glob,
+                Ch_2_Glob;
+int             Arr_1_Glob [50];
+int             Arr_2_Glob [50] [50];
+
+#ifndef REG
+        Boolean Reg = false;
+#define REG
+        /* REG becomes defined as empty */
+        /* i.e. no register variables   */
+#else
+        Boolean Reg = true;
+#endif
+
+/* variables for time measurement: */
+
+#ifdef TIMES
+struct tms      time_info;
+extern  int     times (void);
+                /* see library function "times" */
+#define Too_Small_Time (2*HZ)
+                /* Measurements should last at least about 2 seconds */
+#endif
+#ifdef TIME
+extern long     time(long *);
+                /* see library function "time"  */
+#define Too_Small_Time 2
+                /* Measurements should last at least 2 seconds */
+#endif
+#ifdef MSC_CLOCK
+extern clock_t clock(void);
+#define Too_Small_Time (2*HZ)
+#endif
+
+long            Begin_Time,
+                End_Time,
+                User_Time;
+float           Microseconds,
+                Dhrystones_Per_Second;
+
+#ifdef NOMSG
+/*extern void EarlyExit(void);*/
+#endif
+
+/* end of variables for time measurement */
+
+
+int main (void)
+/*****/
+
+  /* main program, corresponds to procedures        */
+  /* Main and Proc_0 in the Ada version             */
+{
+        One_Fifty       Int_1_Loc;
+  REG   One_Fifty       Int_2_Loc;
+        One_Fifty       Int_3_Loc;
+  REG   char            Ch_Index;
+        Enumeration     Enum_Loc;
+        Str_30          Str_1_Loc;
+        Str_30          Str_2_Loc;
+  REG   int             Run_Index;
+  REG   int             Number_Of_Runs;
+
+  // UART init
+  UartStdOutInit();
+
+  /* Initializations */
+
+  Next_Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type));
+  Ptr_Glob = (Rec_Pointer) malloc (sizeof (Rec_Type));
+
+  Ptr_Glob->Ptr_Comp                    = Next_Ptr_Glob;
+  Ptr_Glob->Discr                       = Ident_1;
+  Ptr_Glob->variant.var_1.Enum_Comp     = Ident_3;
+  Ptr_Glob->variant.var_1.Int_Comp      = 40;
+  strcpy (Ptr_Glob->variant.var_1.Str_Comp,
+          "DHRYSTONE PROGRAM, SOME STRING");
+  strcpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING");
+
+  Arr_2_Glob [8][7] = 10;
+        /* Was missing in published program. Without this statement,    */
+        /* Arr_2_Glob [8][7] would have an undefined value.             */
+        /* Warning: With 16-Bit processors and Number_Of_Runs > 32000,  */
+        /* overflow may occur for this array element.                   */
+
+#ifdef NOMSG
+  Number_Of_Runs = ITERATIONS;
+#else
+  printf ("\n");
+  printf ("Dhrystone Benchmark, Version 2.1 (Language: C)\n");
+  printf ("\n");
+  if (Reg)
+  {
+    printf ("Program compiled with 'register' attribute\n");
+    printf ("\n");
+  }
+  else
+  {
+    printf ("Program compiled without 'register' attribute\n");
+    printf ("\n");
+  }
+  printf ("Please give the number of runs through the benchmark: ");
+  {
+    //int n;
+    //    scanf ("%d", &n);
+    Number_Of_Runs = ITERATIONS;
+  }
+  printf ("\n");
+
+  printf ("Execution starts, %d runs through Dhrystone\n", Number_Of_Runs);
+#endif
+
+  /***************/
+  /* Start timer */
+  /***************/
+
+#ifdef TIMES
+  times (&time_info);
+  Begin_Time = (long) time_info.tms_utime;
+#endif
+#ifdef TIME
+  Begin_Time = time ( (long *) 0);
+#endif
+#ifdef MSC_CLOCK
+#ifdef EXPECTED_SYST
+  SysTick->LOAD = 0x00FFFFFF; /* Reload value : lots of time */
+  SysTick->VAL  = 0x0;        /* Current value clear to 0x0  */
+  SysTick->CTRL = 0x5;        /* Enable systick, no interrupt */
+  while (SysTick->VAL == 0); /* wait until current value reloaded */
+  Begin_Time = SysTick->VAL;
+#else
+  Begin_Time = 0;
+#endif
+#endif
+    for (Run_Index = 1; Run_Index <= Number_Of_Runs; ++Run_Index)
+    {
+
+    Proc_5();
+    Proc_4();
+      /* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */
+    Int_1_Loc = 2;
+    Int_2_Loc = 3;
+    strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING");
+    Enum_Loc = Ident_2;
+    Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc);
+      /* Bool_Glob == 1 */
+    while (Int_1_Loc < Int_2_Loc)  /* loop body executed once */
+    {
+      Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc;
+        /* Int_3_Loc == 7 */
+      Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc);
+        /* Int_3_Loc == 7 */
+      Int_1_Loc += 1;
+    } /* while */
+      /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */
+    Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc);
+      /* Int_Glob == 5 */
+    Proc_1 (Ptr_Glob);
+    for (Ch_Index = 'A'; Ch_Index <= Ch_2_Glob; ++Ch_Index)
+                             /* loop body executed twice */
+    {
+      if (Enum_Loc == Func_1 (Ch_Index, 'C'))
+          /* then, not executed */
+        {
+        Proc_6 (Ident_1, &Enum_Loc);
+        strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING");
+        Int_2_Loc = Run_Index;
+        Int_Glob = Run_Index;
+        }
+    }
+      /* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */
+    Int_2_Loc = Int_2_Loc * Int_1_Loc;
+    Int_1_Loc = Int_2_Loc / Int_3_Loc;
+    Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc;
+      /* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */
+    Proc_2 (&Int_1_Loc);
+      /* Int_1_Loc == 5 */
+
+    } /* loop "for Run_Index" */
+
+#ifdef EARLY_EXIT
+  exit(0);
+#endif
+  /**************/
+  /* Stop timer */
+  /**************/
+
+#ifdef TIMES
+  times (&time_info);
+  End_Time = (long) time_info.tms_utime;
+#endif
+#ifdef TIME
+  End_Time = time ( (long *) 0);
+#endif
+#ifdef MSC_CLOCK
+#ifdef EXPECTED_SYST
+  End_Time = SysTick->VAL;  // Get current value;
+#else
+  End_Time = 1;
+#endif
+#endif
+
+#ifdef NOMSG
+
+#ifdef ENABLE_THUMB
+  printf ("\n");
+  printf ("\n");
+  exit(1);
+#else
+  exit(0);
+  /*EarlyExit();*/
+#endif
+
+/*  Uncomment these lines if compiling with tcc (thumb)  */
+#endif
+
+  printf ("Execution ends\n");
+  printf ("\n");
+  printf ("Final values of the variables used in the benchmark:\n");
+  printf ("\n");
+  printf ("Int_Glob:            %d\n", Int_Glob);
+  printf ("        should be:   %d\n", 5);
+  printf ("Bool_Glob:           %d\n", Bool_Glob);
+  printf ("        should be:   %d\n", 1);
+  printf ("Ch_1_Glob:           %c\n", Ch_1_Glob);
+  printf ("        should be:   %c\n", 'A');
+  printf ("Ch_2_Glob:           %c\n", Ch_2_Glob);
+  printf ("        should be:   %c\n", 'B');
+  printf ("Arr_1_Glob[8]:       %d\n", Arr_1_Glob[8]);
+  printf ("        should be:   %d\n", 7);
+  printf ("Arr_2_Glob[8][7]:    %d\n", Arr_2_Glob[8][7]);
+  printf ("        should be:   Number_Of_Runs + 10\n");
+  printf ("Ptr_Glob->\n");
+  printf ("  Ptr_Comp:          %d\n", (int) Ptr_Glob->Ptr_Comp);
+  printf ("        should be:   (implementation-dependent)\n");
+  printf ("  Discr:             %d\n", Ptr_Glob->Discr);
+  printf ("        should be:   %d\n", 0);
+  printf ("  Enum_Comp:         %d\n", Ptr_Glob->variant.var_1.Enum_Comp);
+  printf ("        should be:   %d\n", 2);
+  printf ("  Int_Comp:          %d\n", Ptr_Glob->variant.var_1.Int_Comp);
+  printf ("        should be:   %d\n", 17);
+  printf ("  Str_Comp:          %s\n", Ptr_Glob->variant.var_1.Str_Comp);
+  printf ("        should be:   DHRYSTONE PROGRAM, SOME STRING\n");
+  printf ("Next_Ptr_Glob->\n");
+  printf ("  Ptr_Comp:          %d\n", (int) Next_Ptr_Glob->Ptr_Comp);
+  printf ("        should be:   (implementation-dependent), same as above\n");
+  printf ("  Discr:             %d\n", Next_Ptr_Glob->Discr);
+  printf ("        should be:   %d\n", 0);
+  printf ("  Enum_Comp:         %d\n", Next_Ptr_Glob->variant.var_1.Enum_Comp);
+  printf ("        should be:   %d\n", 1);
+  printf ("  Int_Comp:          %d\n", Next_Ptr_Glob->variant.var_1.Int_Comp);
+  printf ("        should be:   %d\n", 18);
+  printf ("  Str_Comp:          %s\n",
+                                Next_Ptr_Glob->variant.var_1.Str_Comp);
+  printf ("        should be:   DHRYSTONE PROGRAM, SOME STRING\n");
+  printf ("Int_1_Loc:           %d\n", Int_1_Loc);
+  printf ("        should be:   %d\n", 5);
+  printf ("Int_2_Loc:           %d\n", Int_2_Loc);
+  printf ("        should be:   %d\n", 13);
+  printf ("Int_3_Loc:           %d\n", Int_3_Loc);
+  printf ("        should be:   %d\n", 7);
+  printf ("Enum_Loc:            %d\n", Enum_Loc);
+  printf ("        should be:   %d\n", 1);
+  printf ("Str_1_Loc:           %s\n", Str_1_Loc);
+  printf ("        should be:   DHRYSTONE PROGRAM, 1'ST STRING\n");
+  printf ("Str_2_Loc:           %s\n", Str_2_Loc);
+  printf ("        should be:   DHRYSTONE PROGRAM, 2'ND STRING\n");
+  printf ("\n");
+
+#ifdef EXPECTED_SYST
+  User_Time = Begin_Time - End_Time; // SysTick is a decrement counter
+#else
+  User_Time = End_Time - Begin_Time;
+#endif
+
+
+#ifdef EXPECTED_SYST
+  printf ("Number of cycles for %d iteration is %d\n",Number_Of_Runs,User_Time);
+
+#else
+  if (User_Time < Too_Small_Time)
+  {
+    printf ("Measured time too small to obtain meaningful results\n");
+    printf ("Please increase number of runs\n");
+    printf ("\n");
+  }
+  else
+  {
+#ifdef TIME
+    Microseconds = (float) User_Time * Mic_secs_Per_Second
+                        / (float) Number_Of_Runs;
+    Dhrystones_Per_Second = (float) Number_Of_Runs / (float) User_Time;
+#else
+
+    Microseconds = (float) User_Time * Mic_secs_Per_Second
+                        / ((float) HZ * ((float) Number_Of_Runs));
+    Dhrystones_Per_Second = ((float) HZ * (float) Number_Of_Runs)
+                        / (float) User_Time;
+#endif
+    printf ("Microseconds for one run through Dhrystone: ");
+    printf ("%6.1f \n", Microseconds);
+    printf ("Dhrystones per Second:                      ");
+    printf ("%6.1f \n", Dhrystones_Per_Second);
+    printf ("\n");
+  }
+
+#endif
+    printf ("** TEST PASSED ** \n");
+    UartPutc((char) 0x4); /* end simulation */
+    return 0;
+}
+
+
+void Proc_1 (REG Rec_Pointer Ptr_Val_Par)
+/******************/
+    /* executed once */
+{
+  REG Rec_Pointer Next_Record = Ptr_Val_Par->Ptr_Comp;
+                                        /* == Ptr_Glob_Next */
+  /* Local variable, initialized with Ptr_Val_Par->Ptr_Comp,    */
+  /* corresponds to "rename" in Ada, "with" in Pascal           */
+
+  structassign (*Ptr_Val_Par->Ptr_Comp, *Ptr_Glob);
+  Ptr_Val_Par->variant.var_1.Int_Comp = 5;
+  Next_Record->variant.var_1.Int_Comp
+        = Ptr_Val_Par->variant.var_1.Int_Comp;
+  Next_Record->Ptr_Comp = Ptr_Val_Par->Ptr_Comp;
+  Proc_3 (&Next_Record->Ptr_Comp);
+    /* Ptr_Val_Par->Ptr_Comp->Ptr_Comp
+                        == Ptr_Glob->Ptr_Comp */
+  if (Next_Record->Discr == Ident_1)
+    /* then, executed */
+  {
+    Next_Record->variant.var_1.Int_Comp = 6;
+    Proc_6 (Ptr_Val_Par->variant.var_1.Enum_Comp,
+           &Next_Record->variant.var_1.Enum_Comp);
+    Next_Record->Ptr_Comp = Ptr_Glob->Ptr_Comp;
+    Proc_7 (Next_Record->variant.var_1.Int_Comp, 10,
+           &Next_Record->variant.var_1.Int_Comp);
+  }
+  else /* not executed */
+    structassign (*Ptr_Val_Par, *Ptr_Val_Par->Ptr_Comp);
+} /* Proc_1 */
+
+
+void Proc_2 (One_Fifty *Int_Par_Ref)
+/******************/
+    /* executed once */
+    /* *Int_Par_Ref == 1, becomes 4 */
+{
+  One_Fifty  Int_Loc;
+  Enumeration   Enum_Loc;
+
+  Int_Loc = *Int_Par_Ref + 10;
+  do /* executed once */
+    if (Ch_1_Glob == 'A')
+      /* then, executed */
+    {
+      Int_Loc -= 1;
+      *Int_Par_Ref = Int_Loc - Int_Glob;
+      Enum_Loc = Ident_1;
+    } /* if */
+  while (Enum_Loc != Ident_1); /* true */
+} /* Proc_2 */
+
+
+void Proc_3 (Rec_Pointer *Ptr_Ref_Par)
+/******************/
+    /* executed once */
+    /* Ptr_Ref_Par becomes Ptr_Glob */
+{
+  if (Ptr_Glob != Null)
+    /* then, executed */
+    *Ptr_Ref_Par = Ptr_Glob->Ptr_Comp;
+  Proc_7 (10, Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp);
+} /* Proc_3 */
+
+
+void Proc_4 (void) /* without parameters */
+/*******/
+    /* executed once */
+{
+  Boolean Bool_Loc;
+
+  Bool_Loc = Ch_1_Glob == 'A';
+  Bool_Glob = Bool_Loc | Bool_Glob;
+  Ch_2_Glob = 'B';
+} /* Proc_4 */
+
+
+void Proc_5 (void) /* without parameters */
+/*******/
+    /* executed once */
+{
+  Ch_1_Glob = 'A';
+  Bool_Glob = false;
+} /* Proc_5 */
+
+
+        /* Procedure for the assignment of structures,          */
+        /* if the C compiler doesn't support this feature       */
+#ifdef  NOSTRUCTASSIGN
+memcpy (d, s, l)
+register char   *d;
+register char   *s;
+register int    l;
+{
+        while (l--) *d++ = *s++;
+}
+#endif
+
+
diff --git a/Cortex-M0/nanosoc/software/common/dhry/dhry_2.c b/Cortex-M0/nanosoc/software/common/dhry/dhry_2.c
new file mode 100644
index 0000000..b123ae9
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/dhry/dhry_2.c
@@ -0,0 +1,190 @@
+/*
+This is a MODIFIED version of the Dhrystone 2.1 Benchmark program.
+
+The only changes which have been made are:
+1) the 'old-style' K&R function declarations have been replaced with
+'ANSI-C-style' function declarations (in dhry_1.c and dhry_2,c), and
+2) function prototypes have been added (in dhry.h)
+3) dhry.h uses CLOCKS_PER_SEC instead of CLK_TCK (to build with -strict)
+
+These changes allow an ANSI-C compiler to produce more efficient code, with
+no warnings.
+*/
+
+/*
+ ****************************************************************************
+ *
+ *                   "DHRYSTONE" Benchmark Program
+ *                   -----------------------------
+ *
+ *  Version:    C, Version 2.1
+ *
+ *  File:       dhry_2.c (part 3 of 3)
+ *
+ *  Date:       May 25, 1988
+ *
+ *  Author:     Reinhold P. Weicker
+ *
+ ****************************************************************************
+ */
+
+#ifndef COMBINED
+#include "dhry.h"
+#endif
+
+#ifndef REG
+#define REG
+        /* REG becomes defined as empty */
+        /* i.e. no register variables   */
+#endif
+
+extern  int     Int_Glob;
+extern  char    Ch_1_Glob;
+
+
+void Proc_6 (Enumeration Enum_Val_Par, Enumeration *Enum_Ref_Par)
+/*********************************/
+    /* executed once */
+    /* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */
+{
+  *Enum_Ref_Par = Enum_Val_Par;
+  if (! Func_3 (Enum_Val_Par))
+    /* then, not executed */
+    *Enum_Ref_Par = Ident_4;
+  switch (Enum_Val_Par)
+  {
+    case Ident_1:
+      *Enum_Ref_Par = Ident_1;
+      break;
+    case Ident_2:
+      if (Int_Glob > 100)
+        /* then */
+      *Enum_Ref_Par = Ident_1;
+      else *Enum_Ref_Par = Ident_4;
+      break;
+    case Ident_3: /* executed */
+      *Enum_Ref_Par = Ident_2;
+      break;
+    case Ident_4: break;
+    case Ident_5:
+      *Enum_Ref_Par = Ident_3;
+      break;
+  } /* switch */
+} /* Proc_6 */
+
+
+void Proc_7 (One_Fifty Int_1_Par_Val, One_Fifty Int_2_Par_Val, One_Fifty *Int_Par_Ref)
+/**********************************************/
+    /* executed three times                                      */
+    /* first call:      Int_1_Par_Val == 2, Int_2_Par_Val == 3,  */
+    /*                  Int_Par_Ref becomes 7                    */
+    /* second call:     Int_1_Par_Val == 10, Int_2_Par_Val == 5, */
+    /*                  Int_Par_Ref becomes 17                   */
+    /* third call:      Int_1_Par_Val == 6, Int_2_Par_Val == 10, */
+    /*                  Int_Par_Ref becomes 18                   */
+{
+  One_Fifty Int_Loc;
+
+  Int_Loc = Int_1_Par_Val + 2;
+  *Int_Par_Ref = Int_2_Par_Val + Int_Loc;
+} /* Proc_7 */
+
+
+void Proc_8 (Arr_1_Dim Arr_1_Par_Ref, Arr_2_Dim Arr_2_Par_Ref, int Int_1_Par_Val, int Int_2_Par_Val)
+/*********************************************************************/
+    /* executed once      */
+    /* Int_Par_Val_1 == 3 */
+    /* Int_Par_Val_2 == 7 */
+{
+  REG One_Fifty Int_Index;
+  REG One_Fifty Int_Loc;
+
+  Int_Loc = Int_1_Par_Val + 5;
+  Arr_1_Par_Ref [Int_Loc] = Int_2_Par_Val;
+  Arr_1_Par_Ref [Int_Loc+1] = Arr_1_Par_Ref [Int_Loc];
+  Arr_1_Par_Ref [Int_Loc+30] = Int_Loc;
+  for (Int_Index = Int_Loc; Int_Index <= Int_Loc+1; ++Int_Index)
+    Arr_2_Par_Ref [Int_Loc] [Int_Index] = Int_Loc;
+  Arr_2_Par_Ref [Int_Loc] [Int_Loc-1] += 1;
+  Arr_2_Par_Ref [Int_Loc+20] [Int_Loc] = Arr_1_Par_Ref [Int_Loc];
+  Int_Glob = 5;
+} /* Proc_8 */
+
+
+Enumeration Func_1 (Capital_Letter Ch_1_Par_Val, Capital_Letter Ch_2_Par_Val)
+/*************************************************/
+    /* executed three times                                         */
+    /* first call:      Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R'    */
+    /* second call:     Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C'    */
+    /* third call:      Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C'    */
+{
+  Capital_Letter        Ch_1_Loc;
+  Capital_Letter        Ch_2_Loc;
+
+  Ch_1_Loc = Ch_1_Par_Val;
+  Ch_2_Loc = Ch_1_Loc;
+  if (Ch_2_Loc != Ch_2_Par_Val)
+    /* then, executed */
+    return (Ident_1);
+  else  /* not executed */
+  {
+    Ch_1_Glob = Ch_1_Loc;
+    return (Ident_2);
+   }
+} /* Func_1 */
+
+
+Boolean Func_2 (Str_30 Str_1_Par_Ref, Str_30 Str_2_Par_Ref)
+/*************************************************/
+    /* executed once */
+    /* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */
+    /* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */
+{
+  REG One_Thirty        Int_Loc;
+      Capital_Letter    Ch_Loc;
+
+  Int_Loc = 2;
+  while (Int_Loc <= 2) /* loop body executed once */
+    if (Func_1 (Str_1_Par_Ref[Int_Loc],
+                Str_2_Par_Ref[Int_Loc+1]) == Ident_1)
+      /* then, executed */
+    {
+      Ch_Loc = 'A';
+      Int_Loc += 1;
+    } /* if, while */
+  if (Ch_Loc >= 'W' && Ch_Loc < 'Z')
+    /* then, not executed */
+    Int_Loc = 7;
+  if (Ch_Loc == 'R')
+    /* then, not executed */
+    return (true);
+  else /* executed */
+  {
+    if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0)
+      /* then, not executed */
+    {
+      Int_Loc += 7;
+      Int_Glob = Int_Loc;
+      return (true);
+    }
+    else /* executed */
+      return (false);
+  } /* if Ch_Loc */
+} /* Func_2 */
+
+
+Boolean Func_3 (Enumeration Enum_Par_Val)
+/***************************/
+    /* executed once        */
+    /* Enum_Par_Val == Ident_3 */
+{
+  Enumeration Enum_Loc;
+
+  Enum_Loc = Enum_Par_Val;
+  if (Enum_Loc == Ident_3)
+    /* then, executed */
+    return (true);
+  else /* not executed */
+    return (false);
+} /* Func_3 */
+
diff --git a/Cortex-M0/nanosoc/software/common/retarget/retarget.c b/Cortex-M0/nanosoc/software/common/retarget/retarget.c
new file mode 100644
index 0000000..5a9ed20
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/retarget/retarget.c
@@ -0,0 +1,86 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+
+#if defined ( __CC_ARM   )
+/******************************************************************************/
+/* Retarget functions for ARM DS-5 Professional / Keil MDK                                 */
+/******************************************************************************/
+
+#include <stdio.h>
+#include <time.h>
+#include <rt_misc.h>
+#pragma import(__use_no_semihosting_swi)
+
+extern unsigned char UartGetc(void);
+extern unsigned char UartPutc(unsigned char my_ch);
+struct __FILE { int handle; /* Add whatever you need here */ };
+FILE __stdout;
+FILE __stdin;
+
+
+int fputc(int ch, FILE *f) {
+  return (UartPutc(ch));
+}
+
+int fgetc(FILE *f) {
+  return (UartPutc(UartGetc()));
+}
+
+int ferror(FILE *f) {
+  /* Your implementation of ferror */
+  return EOF;
+}
+
+
+void _ttywrch(int ch) {
+  UartPutc (ch);
+}
+
+
+void _sys_exit(int return_code) {
+label:  goto label;  /* endless loop */
+}
+
+#else
+
+/******************************************************************************/
+/* Retarget functions for GNU Tools for ARM Embedded Processors               */
+/******************************************************************************/
+#include <stdio.h>
+#include <sys/stat.h>
+
+extern unsigned char UartPutc(unsigned char my_ch);
+
+__attribute__ ((used))  int _write (int fd, char *ptr, int len)
+{
+  size_t i;
+  for (i=0; i<len;i++) {
+    UartPutc(ptr[i]); // call character output function
+    }
+  return len;
+}
+
+
+#endif
diff --git a/Cortex-M0/nanosoc/software/common/retarget/uart_stdout.c b/Cortex-M0/nanosoc/software/common/retarget/uart_stdout.c
new file mode 100644
index 0000000..a962275
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/retarget/uart_stdout.c
@@ -0,0 +1,78 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+ /*
+
+ UART functions for retargetting
+
+ */
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+void UartStdOutInit(void)
+{
+//  CMSDK_UART2->BAUDDIV = 16;
+//  CMSDK_UART2->CTRL    = 0x41; // High speed test mode, TX only
+  CMSDK_UART2->BAUDDIV = 2080; //(1MHz/9600)
+  CMSDK_UART2->CTRL    = 0x01; //TX only, standard UART
+  CMSDK_USRT2->BAUDDIV = 2080; //(1MHz/9600)
+  CMSDK_USRT2->CTRL    = 0x01; //TX only, standard UART
+  CMSDK_GPIO1->ALTFUNCSET = (1<<5);
+  return;
+}
+// Output a character
+unsigned char UartPutc(unsigned char my_ch)
+{
+  while ((CMSDK_UART2->STATE & 1)); // Wait if Transmit Holding register is full
+  CMSDK_UART2->DATA = my_ch; // write to transmit holding register
+  while ((CMSDK_USRT2->STATE & 1)); // Wait if Transmit Holding register is full
+  CMSDK_USRT2->DATA = my_ch; // write to transmit holding register
+  return (my_ch);
+}
+// Get a character
+unsigned char UartGetc(void)
+{
+  while ((CMSDK_UART2->STATE & 2)==0); // Wait if Receive Holding register is empty
+  return (CMSDK_UART2->DATA);
+}
+
+void UartEndSimulation(void)
+{
+  UartPutc((char) 0x4); // End of simulation
+  while(1);
+}
+
diff --git a/Cortex-M0/nanosoc/software/common/retarget/uart_stdout.h b/Cortex-M0/nanosoc/software/common/retarget/uart_stdout.h
new file mode 100644
index 0000000..ec0f88b
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/retarget/uart_stdout.h
@@ -0,0 +1,30 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+/* Functions for stdout during simulation */
+/* The functions are implemented in shared/software/common/uart_stdout.c */
+
+extern void UartStdOutInit(void);
+extern unsigned char UartPutc(unsigned char my_ch);
+extern unsigned char UartGetc(void);
+extern unsigned char UartEndSimulation(void);
diff --git a/Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.c b/Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.c
new file mode 100644
index 0000000..f2ffb83
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.c
@@ -0,0 +1,607 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2011-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+//==============================================================================
+//
+//  CORTEX-M System Design Kit ROM Table Test
+//
+//==============================================================================
+//
+// This test checks that is it possible to locate the CORTEX-M0+ architected
+// ROM table by following the CoreSight Component pointer from the DAP.
+// The ID values found in any intermediate ROM tables are displayed.
+//
+// The test passes if it finds the CORTEX-M0+ ROM Table (and the CoreSight MTB-M0+
+// ROM Table if MTB is included)
+//
+// If DBG is not included, this test skips.
+//
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#include "core_cm0.h"
+
+#else
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#include "core_cm0plus.h"
+
+#else
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#include "core_cm3.h"
+
+#else
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#include "core_cm4.h"
+
+#endif
+#endif
+#endif
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"   // for stdout
+#include "mcu_debugtester_interface.h" // For definition of interface to the debug tester
+#include "CMSDK_driver.h"  // For GPIO functions in debug tester communication
+
+#include "config_id.h"     // Needed for ID and configuration values
+
+#include "debugtester_functions.h"  // For communication between processor under test and the debug tester
+
+#include "romtable_tests.h" // Defines known CS parts
+
+
+//=====================================================================
+// Global Variables
+//=====================================================================
+
+// Structure to store Component Address, CID, PID, reference count
+typedef struct
+{
+  uint32_t address;  // Component Base Address
+  uint32_t cid;      // CoreSight Component ID CID3:0
+  uint32_t pid1;     // CoreSight Peripheral ID PID3:0
+  uint32_t pid2;     // CoreSight Peripheral ID PID7:4
+  uint8_t  jepid;    // Decoded PID: JEP Identity
+  uint8_t  jepcont;  // Decoded PID: JEP Continuation code count
+  uint16_t partnum;  // Decoded PID: Part Number
+  uint8_t  revision; // Decoded PID: Part Revision
+  uint8_t  revand;   // Decoded PID: Revision ECO
+  uint8_t  custmod;  // Decoded PID: Customer Modification
+  uint8_t  isarm;    // Part has ARM JEPID
+  uint8_t  ciderror; // Error in the CID fields
+  uint8_t  piderror; // Error in the PID fields
+  uint32_t refcount; // Number of times referenced
+  uint32_t romcount; // ROM Table Number
+} CS_Type;
+
+// Maximum number of components
+#define COMPMAX 10
+
+// Array to store all discovered CoreSight components
+CS_Type Components[COMPMAX];
+
+// Number of unique ROM tables found
+uint32_t  NumRomTables = 0;
+
+// error count
+uint32_t Errors = 0;
+
+//=====================================================================
+// Function Prototypes
+//=====================================================================
+// Function to check CID, PID, part number of a component.
+// If it is a ROM table, also scan through ROM table entries
+void      FollowCoreSightPointer (uint32_t cs_pointer);
+
+// Simple compare function and output error message if needed
+uint32_t  CheckVal(char *name, uint32_t actual, uint32_t expected);
+void      CheckHex(char *name, uint32_t actual, uint32_t expected);
+void      CheckPresence(char *name, uint32_t actual, uint32_t expected);
+void      InitComponentsList(void);
+void      ReportResults(void);
+CS_Type * FindComponent(uint32_t base_address);
+
+// Compare the CID and PID based on Part Number
+void      GetCoreSightIDs(CS_Type * comp_ptr);
+void      CheckDisplayCID (CS_Type * comp_ptr);
+void      CheckDisplayPID (CS_Type * comp_ptr);
+void      DisplayDecodedPID (CS_Type * comp_ptr);
+uint32_t  LookupARMCSPart(uint32_t);
+
+//=====================================================================
+// Main code
+//=====================================================================
+
+int main (void)
+{
+  // UART init
+  UartStdOutInit();
+
+  InitComponentsList();
+
+  // Banner
+  printf("%s - ROM Table Test\n\n", MCU_CPU_NAME);
+
+  if(EXPECTED_DBG != 1)
+    {
+      puts("** TEST SKIPPED ** Core does not include DBG, skipping test\n");
+      return 1;
+    }
+  else
+    {
+      EnableDebugTester();
+
+      puts("\tROM Test is now ready\n");
+
+      //
+      // Initialise Debug Driver to correct protocol
+      //
+      if(EXPECTED_JTAGnSW)
+	{
+	  CallDebugTester(FnSetInterfaceJTAG);
+	}
+      else
+	{
+          if(CallDebugTester(FnSetInterfaceSW) != TEST_PASS)
+	    {
+	      puts("FAIL: Serial Wire Mode not set correctly\n");
+	      Errors++;
+	    }
+	}
+
+      // Turn on the DAP
+      if(CallDebugTester(FnDAPPowerUp) != TEST_PASS)
+	{
+	  puts("Failed to power up the DAP\n");
+	  Errors++;
+	}
+      else
+	{
+	  // Find BASE
+	  DEBUGTESTERDATA[0] = 0xf8; // BASE
+
+	  CallDebugTester(FnGetAPReg);
+	  printf("----------\nDAP BASE entry is : 0x%08x", DEBUGTESTERDATA[0]);
+
+#ifdef CORTEX_M3
+	  // Enable Trace to make DWT, ITM and TPIU visible
+	  CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
+#endif
+#ifdef CORTEX_M4
+	  // Enable Trace to make DWT, ITM and TPIU visible
+	  CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
+#endif
+
+	  // Start decoding
+	  FollowCoreSightPointer(DEBUGTESTERDATA[0]);
+
+	  puts("----------\n\n");
+	}
+
+      // Turn off DAP
+      CallDebugTester(FnDAPPowerDown);
+
+      // Report results
+      ReportResults();
+    }
+  DisableDebugTester();
+}
+
+
+void FollowCoreSightPointer (uint32_t cs_pointer)
+{
+  //
+  // Enter with a pointer to a CoreSight component
+  //
+
+  uint32_t base_addr = cs_pointer & 0xFFFFF000;
+  uint32_t entry;
+  uint32_t i;
+  CS_Type * comp_ptr = NULL;
+
+
+  // Check if pointer points to anything
+
+  switch(cs_pointer & 0x3)
+    {
+    case 0x0:
+      puts(" - Non Zero Entry not present, not in 32bit format\n");
+      Errors++;
+      break;
+
+    case 0x1:
+      puts(" - Entry marked as present but not in 32 bit format\n");
+      Errors++;
+      break;
+
+    case 0x2:
+      puts(" - Component not present\n");
+      break;
+
+    case 0x3:
+      //
+      // Component is present
+      //
+      printf(" - Component present at 0x%08x\n\nCoreSight ID of component at 0x%08x :\n\n",base_addr, base_addr);
+
+      // Find or allocate space for this component in the Components array
+      comp_ptr = FindComponent(base_addr);
+
+      // Get CID and PID for the component
+      GetCoreSightIDs(comp_ptr);
+
+      // Detect duplicate entries here
+      if(comp_ptr->refcount > 1)
+	{
+	  puts("** FAIL: This component is referenced more than once **\n");
+	}
+
+      // Check and Display CID
+      CheckDisplayCID(comp_ptr);
+
+      // Check and Display PID
+      CheckDisplayPID(comp_ptr);
+
+      //
+      // If component is a ROM Table, iterate over its entries
+      //
+      if(comp_ptr->romcount)
+	{
+	  entry = 1; // Non zero initialisation value for loop
+	  for(i = 0; entry > 0 ; i++)
+	    {
+	      // Get ROM Table Entry
+	      DEBUGTESTERDATA[0] = base_addr + (i*4);
+	      CallDebugTester(FnGetAPMem);
+	      entry = DEBUGTESTERDATA[0];
+
+	      printf("----------\nROM Table (%d) Entry %d at 0x%08x is : 0x%08x", comp_ptr->romcount, i, (base_addr + (i*4)), entry);
+
+	      if(entry != 0)
+		{
+		  FollowCoreSightPointer(base_addr + entry);
+		}
+	      else
+		{
+		  puts(" - End of Table\n");
+		}
+	    }
+	}
+    }
+}
+
+
+void CheckDisplayCID (CS_Type * comp_ptr)
+{
+  // Display as raw byte values
+
+  printf(" CID0: 0x%02x  CID1: 0x%02x  CID2: 0x%02x  CID3: 0x%02x",
+        ( comp_ptr->cid        & 0xFF),
+        ((comp_ptr->cid >>  8) & 0xFF),
+        ((comp_ptr->cid >> 16) & 0xFF),
+        ((comp_ptr->cid >> 24) & 0xFF));
+
+  comp_ptr->ciderror = 0;
+
+  switch(comp_ptr->cid)
+    {
+    case 0xB105100D:
+      printf(" - ROM Table (%d)\n", comp_ptr->romcount);
+      break;
+
+    case 0xB105900D:
+      puts(" - CoreSight Debug Component\n");
+      break;
+
+    case 0xB105E00D:
+      puts(" - ARM Core Memory Component\n");
+      break;
+
+    case 0xB105F00D:
+      puts(" - ARM Primecell\n");
+      break;
+
+    default:
+      puts(" - Unknown\n** FAIL: Unknown Component ID **\n");
+      comp_ptr->ciderror = 1;
+    }
+}
+
+
+void CheckDisplayPID (CS_Type * comp_ptr)
+{
+  // Display as raw byte values
+
+  printf(" PID0: 0x%02x  PID1: 0x%02x  PID2: 0x%02x  PID3: 0x%02x\n",
+        ( comp_ptr->pid1        & 0xFF),
+        ((comp_ptr->pid1 >>  8) & 0xFF),
+        ((comp_ptr->pid1 >> 16) & 0xFF),
+        ((comp_ptr->pid1 >> 24) & 0xFF));
+
+  printf(" PID4: 0x%02x  PID5: 0x%02x  PID6: 0x%02x  PID7: 0x%02x",
+        ( comp_ptr->pid2        & 0xFF),
+        ((comp_ptr->pid2 >>  8) & 0xFF),
+        ((comp_ptr->pid2 >> 16) & 0xFF),
+        ((comp_ptr->pid2 >> 24) & 0xFF));
+
+  comp_ptr->piderror = 0;
+
+  //
+  // Display description for known components
+  //
+  if(comp_ptr->isarm)
+    {
+      // ARM JEP ID
+      LookupARMCSPart(comp_ptr->partnum);
+    }
+  else if((comp_ptr->jepid   == EXPECTED_CUST_JEP_ID) &&
+	  (comp_ptr->jepcont == EXPECTED_CUST_JEP_CONT))
+    {
+      // Customer JEP ID
+      puts(" - Customer Part\n");
+      DisplayDecodedPID(comp_ptr);
+      if (comp_ptr->jepid == 0)
+	{
+	  puts("** FAIL: Customer JEP ID shouldn't be zeroes or ARM's JEP ID! Please modify **\n");
+	  comp_ptr->piderror = 1;
+	}
+    }
+  else
+    {
+      // Unknown JEP ID
+      puts(" - Unknown JEP ID code\n");
+      DisplayDecodedPID(comp_ptr);
+      puts("** FAIL: Unknown JEP ID code **\n");
+      comp_ptr->piderror = 1;
+    }
+}
+
+
+void DisplayDecodedPID (CS_Type * comp_ptr)
+{
+  printf("\n  JEP106 ID         [6:0] = 0x%02x\n", comp_ptr->jepid);
+  printf(  "  JEP106 continuation     = 0x%x\n",   comp_ptr->jepcont);
+  printf(  "  part number      [11:0] = 0x%03x\n", comp_ptr->partnum);
+  printf(  "  revision          [3:0] = 0x%x\n",   comp_ptr->revision);
+  printf(  "  revand            [3:0] = 0x%x\n",   comp_ptr->revand);
+  printf(  "  customer modified [3:0] = 0x%x\n\n", comp_ptr->custmod);
+}
+
+
+//===========================================================================
+// Generate error message if compare result does not match,
+// also update error counter
+//===========================================================================
+uint32_t CheckVal(char *name, uint32_t actual, uint32_t expected)
+{
+  // Quiet check - Only call CheckHex if there is a mismatch
+  if(actual != expected)
+    {
+      CheckHex(name, actual, expected);
+      return 1; // Error
+    }
+  return 0;
+}
+
+
+void InitComponentsList(void)
+{
+  uint32_t index;
+  for(index=0 ; index < COMPMAX ; index++)
+    {
+      Components[index].address = 0;
+    }
+}
+
+
+void ReportResults(void)
+{
+  // Iterate through the list
+  // Show errors where the same component is referenced by multiple paths
+  // Show error if we don't find the expected components - Core, MTB, CTI
+
+  uint32_t CIDErrors = 0;
+  uint32_t PIDErrors = 0;
+  uint32_t REFErrors = 0;
+
+  uint32_t index;
+
+  for(index=0 ; index < COMPMAX; index++)
+    {
+      if(Components[index].address)
+	{
+	  // Accumulate errors
+	  CIDErrors +=  Components[index].ciderror;
+	  PIDErrors +=  Components[index].piderror;
+	  REFErrors += (Components[index].refcount > 1) ? 1 : 0;
+	}
+    }
+
+
+  if(CIDErrors)
+    {
+      printf("** FAIL: There were %d errors found with Component ID values **\n", CIDErrors);
+    }
+
+  if(PIDErrors)
+    {
+      printf("** FAIL: There were %d errors found with Peripheral ID values **\n", PIDErrors);
+    }
+
+  if(REFErrors)
+    {
+      printf("** FAIL: %d components were referenced more than once **\n", REFErrors);
+    }
+
+
+  // Update global Errors count
+  Errors += CIDErrors + PIDErrors + REFErrors;
+
+  // Print final test result
+  if (Errors == 0) {
+     puts("** TEST PASSED **\n");
+  } else {
+     printf("** TEST FAILED ** with %d errors\n", Errors);
+  }
+}
+
+
+void CheckPresence (char *name, uint32_t expected, uint32_t actual)
+{
+  if(expected && !actual)
+    {
+      printf("** FAIL: Did not find %s **\n", name);
+      Errors++;
+    }
+
+  if(!expected && actual)
+    {
+      printf("** FAIL: Found unexpected %s **\n", name);
+      Errors++;
+    }
+}
+
+
+CS_Type * FindComponent (uint32_t base_address)
+{
+  uint32_t index = 0;
+  CS_Type * comp_ptr = NULL;
+
+  while((index < COMPMAX) && (comp_ptr == NULL))
+    {
+      if(Components[index].address == base_address)
+	{
+	  Components[index].refcount++;
+	  comp_ptr = &Components[index];
+	  index = COMPMAX;
+	}
+      else if(Components[index].address == 0)
+	{
+	  // New component
+	  Components[index].address   = base_address;
+	  Components[index].refcount  = 1;
+	  comp_ptr = &Components[index];
+	  index = COMPMAX;
+	}
+      else
+	{
+	  index++;
+	}
+    }
+
+  if(comp_ptr == NULL)
+    {
+      puts("** ERROR - Found too many components, increase COMPMAX and try again **\n");
+      Errors++;
+    }
+
+  return comp_ptr;
+}
+
+
+void GetCoreSightIDs(CS_Type * comp_ptr)
+{
+  // Only update the IDs if this is a new component
+  if(comp_ptr->refcount == 1)
+    {
+      // Use DebugDriver to get CID and PID
+      DEBUGTESTERDATA[0] = comp_ptr->address;
+      CallDebugTester(FnGetAPMemCSIDs);
+      comp_ptr->cid  = DEBUGTESTERDATA[0];
+      comp_ptr->pid1 = DEBUGTESTERDATA[1];
+      comp_ptr->pid2 = DEBUGTESTERDATA[2];
+
+
+      // Decode PID information
+      comp_ptr->jepid    = (comp_ptr->pid1 >> 12) & 0x7F;
+      comp_ptr->jepcont  =  comp_ptr->pid2 & 0xF;
+      comp_ptr->partnum  =  comp_ptr->pid1 & 0xFFF;
+      comp_ptr->revision = (comp_ptr->pid1 >> 20) & 0xF;
+      comp_ptr->revand   = (comp_ptr->pid1 >> 28) & 0xF;
+      comp_ptr->custmod  = (comp_ptr->pid1 >> 24) & 0xF;
+
+      // Check if the component is an ARM component
+      comp_ptr->isarm = ((comp_ptr->jepid   == ARM_JEP_ID) &&
+			 (comp_ptr->jepcont == ARM_JEP_CONT) ) ? 1 : 0;
+
+      // If this is a ROM Table, update counter
+      if(comp_ptr->cid == 0xB105100D)
+	{
+	  comp_ptr->romcount = ++NumRomTables;
+	}
+      else
+	{
+	  comp_ptr->romcount = 0;
+	}
+    }
+}
+
+void CheckHex(char *name, uint32_t actual, uint32_t expected)
+{
+  if(actual == expected)
+    {
+      printf("%s: 0x%x\t-\tPASS\n",
+             name,
+             actual);
+    }
+  else
+    {
+      printf("%s: Actual 0x%x\t(Expected 0x%x)\t-\tFAIL\n",
+             name,
+             actual,
+             expected);
+      Errors++;
+    }
+}
+
+
+uint32_t LookupARMCSPart(uint32_t partnum)
+{
+
+  // Iterate over known parts, print string if found.
+  // Return error if not found.
+
+  uint32_t error, i;
+
+  error = 1;
+
+  for(i=0; i < NumARMCSParts; i++)
+    {
+      if(ARMCSParts[i].partnumber == partnum)
+	{
+	  error = 0;
+	  printf(" - ARM %s\n", ARMCSParts[i].partname);
+	  break;
+	}
+    }
+
+  if(error)
+    {
+      puts(" - ARM, Unknown Partnumber\n");
+    }
+  return error;
+}
diff --git a/Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.h b/Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.h
new file mode 100644
index 0000000..d45f41b
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/romtable_tests/romtable_tests.h
@@ -0,0 +1,83 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2013  Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2012-05-31 12:12:02 +0100 (Thu, 31 May 2012) $
+ *
+ *      Revision            : $Revision: 210765 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// CMSDK romtable tests header file
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// Partnumber is {PID1[3:0], PID0[7:0]}
+
+
+struct CoreSightPart {
+  uint32_t partnumber;
+  char * partname;
+};
+
+struct CoreSightPart ARMCSParts[] = {
+
+  // v6M Architected Parts
+  {0x008, "v6M System Control Space (SCS)"},
+  {0x00A, "v6M Data Watchpoint and Trace (DWT)"},
+  {0x00B, "v6M Breakpoint Unit (BPU)"},
+
+  // Cortex-M0
+  {0x471, "Cortex-M0 Processor"},
+  {0x4C2, "Cortex-M0 CoreSight Integration Level"},
+
+  // Cortex-M0+
+  {0x4C0, "Cortex-M0+ Processor"},
+  {0x4C1, "Cortex-M0+ CoreSight Integration Level"},
+  {0x9A6, "Cortex-M0+ Cross Trigger Interface (CTI)"},
+  {0x932, "CoreSight MTB-M0+"},
+
+  // Cortex-M1
+  {0x470, "Cortex-M1 Processor"},
+
+  // v7M Architected Parts
+  {0x000, "v7M System Control Space (SCS)"},
+  {0x00C, "v7MF System Control Space (SCS)"},
+  {0x001, "v7M Instrumentation Trace Macrocell (ITM)"},
+  {0x002, "v7M Data Watchpoint and Trace (DWT)"},
+  {0x003, "v7M FlashPatch and Breakpoint (FPB)"},
+
+  // Cortex-M3
+  {0x4C3, "Cortex-M3 Processor"},
+  {0x4C5, "Cortex-M3 CoreSight Integration Level"},
+  {0x923, "Cortex-M3 TPIU"},
+  {0x924, "Cortex-M3 ETM"},
+
+  // Cortex-M4
+  {0x4C4, "Cortex-M4 Processor"},
+  {0x4C6, "Cortex-M4 CoreSight Integration Level"},
+  {0x925, "Cortex-M4 ETM"},
+  {0x9A1, "Cortex-M4 TPIU"},
+
+  // Generic CoreSight Parts
+  {0x906, "CoreSight Cross Trigger Interface (CTI)"},
+
+};
+
+#define NumARMCSParts (sizeof ARMCSParts / sizeof ARMCSParts[0])
diff --git a/Cortex-M0/nanosoc/software/common/scripts/cmsdk_bootloader.ld b/Cortex-M0/nanosoc/software/common/scripts/cmsdk_bootloader.ld
new file mode 100644
index 0000000..bc1fd29
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/scripts/cmsdk_bootloader.ld
@@ -0,0 +1,40 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: $
+ *
+ *      Revision            : $Revision: $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+/* Linker script to configure memory regions.
+ * Need modifying for a specific board.
+ *   FLASH.ORIGIN: starting address of boot loader
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+
+INCLUDE "lib-nosys.ld"
+
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x01000000, LENGTH =  0x1000 /*  4K */
+  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 0x10000 /* 64K */
+}
+
+INCLUDE "sections.ld"
diff --git a/Cortex-M0/nanosoc/software/common/scripts/cmsdk_cm0.ld b/Cortex-M0/nanosoc/software/common/scripts/cmsdk_cm0.ld
new file mode 100644
index 0000000..2ac111b
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/scripts/cmsdk_cm0.ld
@@ -0,0 +1,43 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: $
+ *
+ *      Revision            : $Revision: $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+/* Linker script to configure memory regions.
+ * Need modifying for a specific board.
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+
+INCLUDE "lib-nosys.ld"
+
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x0,        LENGTH = 0x10000 /* 64K */
+  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 0xFC00  /* 63K */
+  /* 64K is available, but reserve some space for    */
+  /*   1) debug tester communication for debug tests */
+  /*   2) DMA data structure for DMA tests           */
+}
+
+INCLUDE "sections.ld"
diff --git a/Cortex-M0/nanosoc/software/common/scripts/debugtester.ld b/Cortex-M0/nanosoc/software/common/scripts/debugtester.ld
new file mode 100644
index 0000000..0c7b958
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/scripts/debugtester.ld
@@ -0,0 +1,40 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: $
+ *
+ *      Revision            : $Revision: $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+/* Linker script to configure memory regions.
+ * Need modifying for a specific board.
+ *   FLASH.ORIGIN: starting address of flash
+ *   FLASH.LENGTH: length of flash
+ *   RAM.ORIGIN: starting address of RAM bank 0
+ *   RAM.LENGTH: length of RAM bank 0
+ */
+
+INCLUDE "lib-nosys.ld"
+
+MEMORY
+{
+  FLASH (rx) : ORIGIN = 0x0,        LENGTH = 0x20000 /* 64K */
+  RAM (rwx)  : ORIGIN = 0x20000000, LENGTH = 0x4000  /* 16K */
+}
+
+INCLUDE "sections.ld"
diff --git a/Cortex-M0/nanosoc/software/common/scripts/lib-nosys.ld b/Cortex-M0/nanosoc/software/common/scripts/lib-nosys.ld
new file mode 100644
index 0000000..64e5874
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/scripts/lib-nosys.ld
@@ -0,0 +1,2 @@
+/* Library configurations */
+GROUP(libgcc.a libc.a libm.a libnosys.a)
diff --git a/Cortex-M0/nanosoc/software/common/scripts/lib-rdimon.ld b/Cortex-M0/nanosoc/software/common/scripts/lib-rdimon.ld
new file mode 100644
index 0000000..93bd10c
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/scripts/lib-rdimon.ld
@@ -0,0 +1,2 @@
+/* Library configurations */
+GROUP(libgcc.a libc.a libm.a librdimon.a)
diff --git a/Cortex-M0/nanosoc/software/common/scripts/sections-nokeep.ld b/Cortex-M0/nanosoc/software/common/scripts/sections-nokeep.ld
new file mode 100644
index 0000000..f21022e
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/scripts/sections-nokeep.ld
@@ -0,0 +1,162 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: $
+ *
+ *      Revision            : $Revision: $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		KEEP(*(.isr_vector))
+		*(.text*)
+
+		*(.init)
+		*(.fini)
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		*(.eh_frame*)
+	} > FLASH
+
+	.ARM.extab :
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	__exidx_start = .;
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+	__exidx_end = .;
+
+	__etext = .;
+
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		*(.preinit_array)
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		*(SORT(.init_array.*))
+		*(.init_array)
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		*(SORT(.fini_array.*))
+		*(.fini_array)
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+
+	.heap (COPY):
+	{
+		__end__ = .;
+		end = __end__;
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/Cortex-M0/nanosoc/software/common/scripts/sections.ld b/Cortex-M0/nanosoc/software/common/scripts/sections.ld
new file mode 100644
index 0000000..e1e7308
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/scripts/sections.ld
@@ -0,0 +1,163 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: $
+ *
+ *      Revision            : $Revision: $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+/* Linker script to place sections and symbol values. Should be used together
+ * with other linker script that defines memory regions FLASH and RAM.
+ * It references following symbols, which must be defined in code:
+ *   Reset_Handler : Entry of reset handler
+ *
+ * It defines following symbols, which code can use without definition:
+ *   __exidx_start
+ *   __exidx_end
+ *   __etext
+ *   __data_start__
+ *   __preinit_array_start
+ *   __preinit_array_end
+ *   __init_array_start
+ *   __init_array_end
+ *   __fini_array_start
+ *   __fini_array_end
+ *   __data_end__
+ *   __bss_start__
+ *   __bss_end__
+ *   __end__
+ *   end
+ *   __HeapLimit
+ *   __StackLimit
+ *   __StackTop
+ *   __stack
+ */
+ENTRY(Reset_Handler)
+
+SECTIONS
+{
+	.text :
+	{
+		KEEP(*(.isr_vector))
+		*(.text*)
+
+		KEEP(*(.init))
+		KEEP(*(.fini))
+
+		/* .ctors */
+		*crtbegin.o(.ctors)
+		*crtbegin?.o(.ctors)
+		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
+		*(SORT(.ctors.*))
+		*(.ctors)
+
+		/* .dtors */
+ 		*crtbegin.o(.dtors)
+ 		*crtbegin?.o(.dtors)
+ 		*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
+ 		*(SORT(.dtors.*))
+ 		*(.dtors)
+
+		*(.rodata*)
+
+		KEEP(*(.eh_frame*))
+	} > FLASH
+
+	.ARM.extab :
+	{
+		*(.ARM.extab* .gnu.linkonce.armextab.*)
+	} > FLASH
+
+	__exidx_start = .;
+	.ARM.exidx :
+	{
+		*(.ARM.exidx* .gnu.linkonce.armexidx.*)
+	} > FLASH
+	__exidx_end = .;
+
+	__etext = .;
+
+	.data : AT (__etext)
+	{
+		__data_start__ = .;
+		*(vtable)
+		*(.data*)
+
+		. = ALIGN(4);
+		/* preinit data */
+		PROVIDE_HIDDEN (__preinit_array_start = .);
+		KEEP(*(.preinit_array))
+		PROVIDE_HIDDEN (__preinit_array_end = .);
+
+		. = ALIGN(4);
+		/* init data */
+		PROVIDE_HIDDEN (__init_array_start = .);
+		KEEP(*(SORT(.init_array.*)))
+		KEEP(*(.init_array))
+		PROVIDE_HIDDEN (__init_array_end = .);
+
+
+		. = ALIGN(4);
+		/* finit data */
+		PROVIDE_HIDDEN (__fini_array_start = .);
+		KEEP(*(SORT(.fini_array.*)))
+		KEEP(*(.fini_array))
+		PROVIDE_HIDDEN (__fini_array_end = .);
+
+		KEEP(*(.jcr*))
+		. = ALIGN(4);
+		/* All data end */
+		__data_end__ = .;
+
+	} > RAM
+
+	.bss :
+	{
+		. = ALIGN(4);
+		__bss_start__ = .;
+		*(.bss*)
+		*(COMMON)
+		. = ALIGN(4);
+		__bss_end__ = .;
+	} > RAM
+
+	.heap (COPY):
+	{
+		__end__ = .;
+		end = __end__;
+		*(.heap*)
+		__HeapLimit = .;
+	} > RAM
+
+	/* .stack_dummy section doesn't contains any symbols. It is only
+	 * used for linker to calculate size of stack sections, and assign
+	 * values to stack symbols later */
+	.stack_dummy (COPY):
+	{
+		*(.stack*)
+	} > RAM
+
+	/* Set stack top to end of RAM, and stack limit move down by
+	 * size of stack_dummy section */
+	__StackTop = ORIGIN(RAM) + LENGTH(RAM);
+	__StackLimit = __StackTop - SIZEOF(.stack_dummy);
+	PROVIDE(__stack = __StackTop);
+
+	/* Check if data + heap + stack exceeds RAM limit */
+	ASSERT(__StackLimit >= __HeapLimit, "region RAM overflowed with stack")
+}
diff --git a/Cortex-M0/nanosoc/software/common/validation/apb_mux_tests.c b/Cortex-M0/nanosoc/software/common/validation/apb_mux_tests.c
new file mode 100644
index 0000000..d8ae41d
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/validation/apb_mux_tests.c
@@ -0,0 +1,367 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+  A simple test to check the operation of APB slave multiplexer
+*/
+
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"
+
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+#define HW16_REG(ADDRESS)  (*((volatile unsigned short *)(ADDRESS)))
+#define HW8_REG(ADDRESS)   (*((volatile unsigned char  *)(ADDRESS)))
+
+
+#if defined ( __CC_ARM   )
+__asm void          address_test_write(unsigned int addr, unsigned int wdata);
+__asm unsigned int  address_test_read(unsigned int addr);
+#else
+      void          address_test_write(unsigned int addr, unsigned int wdata);
+      unsigned int  address_test_read(unsigned int addr);
+#endif
+void                HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value);
+int                 ID_Check(const unsigned char id_array[], unsigned int offset);
+int                 APB_test_slave_Check(unsigned int offset);
+
+/* Global variables */
+volatile int hardfault_occurred;
+volatile int hardfault_expected;
+volatile int temp_data;
+         int hardfault_verbose=0; // 0:Not displaying anything in hardfault handler
+
+/* Predefined ID values for APB peripherals */
+const unsigned char ahb_gpio_id[16]     = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+                                           0x20, 0xB8, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1};
+const unsigned char apb_uart_id[16]     = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+                                           0x21, 0xB8, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1};
+const unsigned char apb_timer_id[16]    = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+                                           0x22, 0xB8, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1};
+const unsigned char apb_dualtimer_id[16]= {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+                                           0x23, 0xB8, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1};
+const unsigned char apb_watchdog_id[16] = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+                                           0x24, 0xB8, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1};
+const unsigned char pl230_udma_id[16]   = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+                                           0x30, 0xB2, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1};
+const unsigned char blank_id[16]        = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+                                           0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+int main (void)
+{
+
+  int err_code = 0;
+
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit");
+  puts(" - APB slave mux test - revision $Revision: 371321 $\n");
+
+  puts(" - Detecting if default peripherals are present ...\n");
+  temp_data=0;
+  hardfault_occurred = 0;
+  hardfault_expected = 0;
+  puts ("0: timer 0");
+    if ( ID_Check(&apb_timer_id[0],     CMSDK_TIMER0_BASE   ) == 1 ) err_code |= 1<<0;
+  puts ("1: timer 1");
+    if ( ID_Check(&apb_timer_id[0],     CMSDK_TIMER1_BASE   ) == 1 ) err_code |= 1<<1;
+  puts ("2: dual timer");
+    if ( ID_Check(&apb_dualtimer_id[0], CMSDK_DUALTIMER_BASE) == 1 ) err_code |= 1<<2;
+  puts ("3: blank");
+    if ( ID_Check(&blank_id[0],         0x40003000          ) == 1 ) err_code |= 1<<3;
+  puts ("4: UART 0");
+    if ( ID_Check(&apb_uart_id[0],      CMSDK_UART0_BASE    ) == 1 ) err_code |= 1<<4;
+  puts ("5: UART 1");
+    if ( ID_Check(&apb_uart_id[0],      CMSDK_UART1_BASE    ) == 1 ) err_code |= 1<<5;
+  puts ("6: UART 2");
+    if ( ID_Check(&apb_uart_id[0],      CMSDK_UART2_BASE    ) == 1 ) err_code |= 1<<6;
+  puts ("7: blank");
+    if ( ID_Check(&blank_id[0],         0x40007000          ) == 1 ) err_code |= 1<<7;
+  puts ("8: Watchdog");
+    if ( ID_Check(&apb_watchdog_id[0],  CMSDK_WATCHDOG_BASE ) == 1 ) err_code |= 1<<8;
+  puts ("9: blank");
+    if ( ID_Check(&blank_id[0],         0x40009000          ) == 1 ) err_code |= 1<<9;
+  puts ("10: blank");
+    if ( ID_Check(&blank_id[0],         0x4000A000          ) == 1 ) err_code |= 1<<10;
+  puts ("11: APB test slave");
+    if ( APB_test_slave_Check(          0x4000B000          ) == 1 ) err_code |= 1<<11;
+  puts ("12: APB expansion port 12");
+    if ( ID_Check(&blank_id[0],         0x4000C000          ) == 1 ) err_code |= 1<<12;
+  puts ("13: APB expansion port 13");
+    if ( ID_Check(&blank_id[0],         0x4000D000          ) == 1 ) err_code |= 1<<13;
+  puts ("14: APB expansion port 14");
+    if ( ID_Check(&blank_id[0],         0x4000E000          ) == 1 ) err_code |= 1<<14;
+  puts ("15: APB expansion port 15 (optional DMA controller)");
+    if ( ID_Check(&pl230_udma_id[0],    CMSDK_PL230_BASE    ) == 1 ) err_code |= 1<<15;
+
+
+  /* Report error code */
+
+  if (err_code==0) {
+    printf ("\n** TEST PASSED **\n");
+  } else {
+    printf ("\n** TEST FAILED **, Error code = (0x%x)\n", err_code);
+  }
+  UartEndSimulation();
+  return 0;
+}
+
+/* Check the ID register value in offset 0xFC0 to 0xFFC (last 16 words, last 12 are IDs) */
+int ID_Check(const unsigned char id_array[], unsigned int offset)
+{
+  int i; /* loop counter */
+  unsigned long expected_val, actual_val;
+  unsigned long compare_mask;
+  int           mismatch = 0;
+  int           id_is_zero = 0;
+  unsigned long test_addr;
+
+  /* Check the peripheral ID and component ID */
+  for (i=0;i<16;i++) {
+    test_addr = offset + 4*i + 0xFC0;
+    expected_val = (int) id_array[i];
+    actual_val   = HW32_REG(test_addr);
+
+    if (actual_val == 0) id_is_zero++; // Check if all ID are zero at the end
+
+    /* create mask to ignore version numbers */
+    if      (i==10) { compare_mask = 0xF0;}  // mask out version field
+    else if (i==11) { compare_mask = 0xFF;}  // mask out ECO field and patch field
+    else            { compare_mask = 0x00;}  // compare whole value
+
+    if ((expected_val & (~compare_mask)) != (actual_val & (~compare_mask))) {
+      printf ("Difference found: %x, expected %x, actual %x\n", test_addr, expected_val, actual_val);
+      mismatch++;
+      }
+    } // end_for
+
+    if (id_is_zero == 16) {
+        puts ("  All ID values are 0   : device not present\n");
+        return 2; }
+    else if (mismatch> 0) {
+        puts ("  ID value mismatch(es) : device unknown\n");
+        return 1; }
+    else {
+        puts ("  All ID values matched : device present\n");
+        return 0;
+         }
+
+}
+
+/* Simple test for APB test slave */
+int APB_test_slave_Check(unsigned int offset)
+{
+  /*
+  The APB test slave has got only one 32-bit register in
+  the first four addresses. For each word, the wait state
+  increase based on PADDR[3:2].
+
+  The test slave is also able to generate error responses
+  at offset 0x0F0 to 0xFC.
+  */
+  int  mismatch = 0;
+  int  fault_err = 0;
+  int  i;
+
+  // Read/Write test to data_register
+  HW32_REG(offset)   = 0xFFFFFFFF;
+  if ((HW32_REG(offset))   !=0xFFFFFFFF) mismatch ++;
+  HW32_REG(offset)   = 0x00000000;
+  if ((HW32_REG(offset))   !=0x00000000) mismatch ++;
+  HW32_REG(offset)   = 0x12345678;
+  if ((HW32_REG(offset))   !=0x12345678) mismatch ++;
+  HW16_REG(offset)   = 0x5678; /* Use consistent access size.
+    This is required to allow the test to run in big endian */
+  if ((HW16_REG(offset))   !=0x5678)     mismatch ++;
+  HW16_REG(offset+2) = 0x1234; /* Use consistent access size.*/
+  if ((HW16_REG(offset+2)) !=0x1234)     mismatch ++;
+  HW8_REG(offset)   = 0x78; /* Use consistent access size between read and write.*/
+  HW8_REG(offset+1) = 0x56;
+  HW8_REG(offset+2) = 0x34;
+  HW8_REG(offset+3) = 0x12;
+  if ((HW8_REG(offset))    !=0x78)       mismatch ++;
+  if ((HW8_REG(offset+1))  !=0x56)       mismatch ++;
+  if ((HW8_REG(offset+2))  !=0x34)       mismatch ++;
+  if ((HW8_REG(offset+3))  !=0x12)       mismatch ++;
+  HW16_REG(offset+4) = 0xFFFF; // Value = 0x1234FFFF
+  if ((HW16_REG(offset+8)) !=0xFFFF)     mismatch ++;
+  HW16_REG(offset+6) = 0x0000; // Value = 0x0000FFFF
+  if ((HW16_REG(offset+4))   !=0xFFFF)   mismatch ++;
+  if ((HW16_REG(offset+6))   !=0x0000)   mismatch ++;
+  HW8_REG(offset+8)   = 0xA5;  // Value = 0x0000FFA5
+  if ((HW8_REG(offset+8))   !=0xA5)      mismatch ++;
+  HW8_REG(offset+0xD) = 0xC3;  // Value = 0x0000C3A5
+  if ((HW8_REG(offset+0xD)) !=0xC3)      mismatch ++;
+  HW16_REG(offset+0xE)= 0xC53A;// Value = 0xC53AC3A5
+  if ((HW16_REG(offset+0xE)) !=0xC53A)   mismatch ++;
+
+  /* Testing of error response from APB test slave */
+  for (i=0; i<4; i++) {
+    temp_data=0;
+    hardfault_expected = 1;
+    hardfault_occurred = 0;
+    address_test_write((offset + 0xF0 + (i<<2)), 0x0);
+    if (hardfault_occurred==0) fault_err++;
+    hardfault_occurred = 0;
+    temp_data=address_test_read(offset + 0xF0 + (i<<2));
+    if (hardfault_occurred==0) fault_err++;
+    }
+
+  hardfault_expected = 0;
+  hardfault_occurred = 0;
+
+  if (mismatch>0) { puts ("  Data mismatch in APB test slave\n");
+                    return 1;}
+  if (fault_err>0){ puts ("  Fault mismatch in APB test slave\n");
+                    return 1;}
+  else            puts ("  APB test slave test passed\n");
+
+  return 0;
+}
+
+#if defined ( __CC_ARM   )
+/* Test function for write - for ARM / Keil */
+__asm void address_test_write(unsigned int addr, unsigned int wdata)
+{
+  STR    R1,[R0]
+  DSB    ; Ensure bus fault occurred before leaving this subroutine
+  BX     LR
+}
+
+#else
+/* Test function for write - for gcc */
+void address_test_write(unsigned int addr, unsigned int wdata) __attribute__((naked));
+void address_test_write(unsigned int addr, unsigned int wdata)
+{
+  __asm("  str   r1,[r0]\n"
+        "  dsb          \n"
+        "  bx    lr     \n"
+  );
+}
+#endif
+
+/* Test function for read */
+#if defined ( __CC_ARM   )
+/* Test function for read - for ARM / Keil */
+__asm unsigned int address_test_read(unsigned int addr)
+{
+  LDR    R1,[R0]
+  DSB    ; Ensure bus fault occurred before leaving this subroutine
+  MOVS   R0, R1
+  BX     LR
+}
+#else
+/* Test function for read - for gcc */
+unsigned int  address_test_read(unsigned int addr) __attribute__((naked));
+unsigned int  address_test_read(unsigned int addr)
+{
+  __asm("  ldr   r1,[r0]\n"
+        "  dsb          \n"
+        "  movs  r0, r1 \n"
+        "  bx    lr     \n"
+  );
+}
+#endif
+
+
+#if defined ( __CC_ARM   )
+/* ARM or Keil toolchain */
+__asm void HardFault_Handler(void)
+{
+  MOVS   r0, #4
+  MOV    r1, LR
+  TST    r0, r1
+  BEQ    stacking_used_MSP
+  MRS    R0, PSP ; // first parameter - stacking was using PSP
+  B      get_LR_and_branch
+stacking_used_MSP
+  MRS    R0, MSP ; // first parameter - stacking was using MSP
+get_LR_and_branch
+  MOV    R1, LR  ; // second parameter is LR current value
+  LDR    R2,=__cpp(HardFault_Handler_c)
+  BX     R2
+  ALIGN
+}
+#else
+/* gcc toolchain */
+void HardFault_Handler(void) __attribute__((naked));
+void HardFault_Handler(void)
+{
+  __asm("  movs   r0,#4\n"
+        "  mov    r1,lr\n"
+        "  tst    r0,r1\n"
+        "  beq    stacking_used_MSP\n"
+        "  mrs    r0,psp\n" /*  first parameter - stacking was using PSP */
+        "  ldr    r1,=HardFault_Handler_c  \n"
+        "  bx     r1\n"
+        "stacking_used_MSP:\n"
+        "  mrs    r0,msp\n" /*  first parameter - stacking was using PSP */
+        "  ldr    r1,=HardFault_Handler_c  \n"
+        "  bx     r1\n"
+        ".pool\n" );
+}
+
+#endif
+/* C part of the fault handler - common between ARM / Keil /gcc */
+void HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value)
+{
+  unsigned int stacked_pc;
+  unsigned int stacked_r0;
+  hardfault_occurred++;
+  if (hardfault_verbose) puts ("[Hard Fault Handler]");
+  if (hardfault_expected==0) {
+    puts ("ERROR : Unexpected HardFault interrupt occurred.\n");
+    UartEndSimulation();
+    while (1);
+    }
+  stacked_r0  = ((unsigned long) hardfault_args[0]);
+  stacked_pc  = ((unsigned long) hardfault_args[6]);
+  if (hardfault_verbose)  printf(" - Stacked R0 : 0x%x\n", stacked_r0);
+  if (hardfault_verbose)  printf(" - Stacked PC : 0x%x\n", stacked_pc);
+  /* Modify R0 to a valid address */
+  hardfault_args[0] = (unsigned long) &temp_data;
+
+  return;
+}
+
+
+
diff --git a/Cortex-M0/nanosoc/software/common/validation/bitband_tests.c b/Cortex-M0/nanosoc/software/common/validation/bitband_tests.c
new file mode 100644
index 0000000..1d10209
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/validation/bitband_tests.c
@@ -0,0 +1,602 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+/* A simple program to test the bitband wrapper for Cortex-M0 and
+  Cortex-M0+ */
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#include <stdio.h>
+
+#include "uart_stdout.h"
+
+/* Macros for word, half word and byte */
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+#define HW16_REG(ADDRESS)  (*((volatile unsigned short *)(ADDRESS)))
+#define HW8_REG(ADDRESS)   (*((volatile unsigned char  *)(ADDRESS)))
+
+#define SRAM_BITBAND_ADDR     0x20000000
+#define SRAM_BITBAND_ALIAS    0x22000000
+#define PERIPH_BITBAND_ADDR   0x40000000
+#define PERIPH_BITBAND_ALIAS  0x42000000
+
+volatile unsigned int  sram_array[20];
+
+/* Tick to make sure variables are placed after test ram area */
+#define probing_state sram_array[16]
+#define hf_expected   sram_array[17]
+#define hf_occurred   sram_array[18]
+
+void ProbeBitBandAddr(void);
+int SRamBitBandTest(void);
+int PeripheralBitBandTest(void);
+int EndianCheck(void);
+int error_test(void);
+
+int main (void)
+{
+  int result=0;
+
+  probing_state = 0;
+  hf_expected   = 0;
+  hf_occurred   = 0;
+
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - Bitband Test - revision $Revision: 371321 $\n");
+
+  /* Probe Bit band alias address to see if bitband has been implemented */
+  ProbeBitBandAddr();
+
+  /* Test bitband access to SRAM */
+  if (SRamBitBandTest()) result |= 1;
+
+  /* Test bitband access to peripheral */
+  if (PeripheralBitBandTest()) result |= 1;
+
+  if (error_test()) result |= 1;
+
+  if (result==0) {
+    printf ("\n** TEST PASSED **\n");
+    } else {
+    printf ("\n** TEST FAILED **, Error code = (0x%x)\n", result);
+    }
+  UartEndSimulation();
+  return 0;
+}
+
+void ProbeBitBandAddr(void)
+{
+  probing_state = 1;
+  /* Access first address in bit-band alias. If bus fault occurred
+  it means bitband feature is not available. */
+  HW32_REG(SRAM_BITBAND_ALIAS) = 0;
+  puts ("- no error in SRAM bitband alias access\n");
+  puts ("  continue test...\n");
+  probing_state = 0;
+  sram_array[0] = 0; /* Dummy access to make sure sram_array won't get optimized away */
+  return;
+}
+
+
+int SRamBitBandTest(void)
+{
+const unsigned int testdata[4] = { 0x55AA33CC, 0xBADF00D, 0xC0FFEE, 0x12345678};
+      unsigned int readdata;    /* read back value - packed */
+      unsigned int i,j;         /* loop counters */
+      unsigned int t1, t2;      /* temp value */
+      unsigned int err_code;    /* error code */
+      unsigned int verbose_level = 0;
+
+  err_code = 0;
+
+  /* Store data in SRAM */
+  HW32_REG(SRAM_BITBAND_ADDR    ) = testdata[0];
+  HW32_REG(SRAM_BITBAND_ADDR+0x4) = testdata[1];
+  HW32_REG(SRAM_BITBAND_ADDR+0x8) = testdata[2];
+  HW32_REG(SRAM_BITBAND_ADDR+0xC) = testdata[3];
+
+  puts ("SRAM bitband");
+  puts (" - Read bitband alias,");
+  for (i=0;i<4;i++) {
+    readdata=0;
+
+    /* Read each bit in the word via bit band alias and reconstruct the 32-bit value */
+    j=32;
+    while(j>0) {
+      j--;
+      readdata = readdata << 1; /* Shift */
+      t1 = HW32_REG(SRAM_BITBAND_ALIAS + 4*j + 0x80*i);
+      /* Check bit band read data should be 0 or 1 */
+      if ((t1|0x1)!=1) {
+        puts("ERROR: bitband read should only return 0 or 1");
+        printf ("Got %x, i=%d, j=%d\n", t1, i, j);
+        err_code |= 1<<1;
+        }
+      /* merge 32-bit word with previous read data */
+      if (t1!=0) readdata += 1; /* Set LSB */
+      }  /* end while */
+
+    if (verbose_level!=0) printf ("  readdata %d = %x\n", i, readdata);
+    if (readdata!=testdata[i]){
+      puts("ERROR: Value mismatch");
+      printf ("Expect %x, actual = %x\n",testdata[i],readdata );
+      err_code |= 1<<2;
+      }
+    }    /* end for */
+
+  puts (" - toggle each bit by write to bit band alias");
+  for (i=0;i<4;i++) {
+    readdata=0;
+
+    /* Toggle each bit in the words via bit band alias and read the 32-bit value afterwards*/
+    j=32;
+    while(j>0) {
+      j--;
+      t1 = HW32_REG(SRAM_BITBAND_ALIAS + 4*j + 0x80*i);
+      /* Toggle bit and check bit band read data should be 0 or 1 */
+      if      (t1==1) HW32_REG(SRAM_BITBAND_ALIAS + 4*j + 0x80*i) = 0;
+      else if (t1==0) HW32_REG(SRAM_BITBAND_ALIAS + 4*j + 0x80*i) = 1;
+      else  {
+        puts("ERROR: bitband read should only return 0 or 1");
+        printf ("Got %x, i=%d, j=%d\n", t1, i, j);
+        err_code |= 1<<3;
+        }
+      }  /* end while */
+    /* read whole word */
+    readdata = HW32_REG(SRAM_BITBAND_ADDR + 4*i);
+    if (verbose_level!=0) printf ("  readdata %d = %x\n", i, readdata);
+    if (readdata!=(~testdata[i])){
+      puts("ERROR: Value mismatch");
+      printf ("Expect %x, actual = %x\n",(~testdata[i]),readdata );
+      err_code |= 1<<4;
+      }
+    }    /* end for */
+
+
+  puts (" - Read bitband alias by halfword size,");
+  for (i=0;i<8;i++) {
+    readdata=0;
+
+    /* Read each bit in the word via bit band alias and reconstruct the 32-bit value */
+    j=16;
+    while(j>0) {
+      j--;
+      readdata = readdata << 1; /* Shift */
+      t1 = HW16_REG(SRAM_BITBAND_ALIAS + 4*j + 0x40*i);
+      /* Check bit band read data should be 0 or 1 */
+      if ((t1|0x1)!=1) {
+        puts("ERROR: bitband read should only return 0 or 1");
+        printf ("Got %x, i=%d, j=%d\n", t1, i, j);
+        err_code |= 1<<5;
+        }
+      /* merge 32-bit word with previous read data */
+      if (t1!=0) readdata += 1; /* Set LSB */
+      }  /* end while */
+
+    if (verbose_level!=0) printf ("  readdata %d = %x\n", i, readdata);
+
+    if (readdata!=(HW16_REG(SRAM_BITBAND_ADDR+2*i))){ /* Note : data has been inverted */
+      puts("ERROR: Value mismatch");
+      printf ("Expect %x, actual = %x\n",(~testdata[i]),readdata );
+      err_code |= 1<<6;
+      }
+    }    /* end for */
+
+
+  puts (" - toggle each bit by write to bit band alias, halfword size");
+  for (i=0;i<8;i++) {
+    readdata=0;
+
+    /* Toggle each bit in the words via bit band alias and read the 32-bit value afterwards*/
+    t2 = HW16_REG(SRAM_BITBAND_ADDR+2*i); /* Current value */
+    j=16;
+    while(j>0) {
+      j--;
+      t1 = HW16_REG(SRAM_BITBAND_ALIAS + 4*j + 0x40*i);
+      /* Toggle bit and check bit band read data should be 0 or 1 */
+      if      (t1==1) HW16_REG(SRAM_BITBAND_ALIAS + 4*j + 0x40*i) = 0;
+      else if (t1==0) HW16_REG(SRAM_BITBAND_ALIAS + 4*j + 0x40*i) = 1;
+      else  {
+        puts("ERROR: bitband read should only return 0 or 1");
+        printf ("Got %x, i=%d, j=%d\n", t1, i, j);
+        err_code |= 1<<7;
+        }
+      }  /* end while */
+
+    /* read halfword */
+    readdata = HW16_REG(SRAM_BITBAND_ADDR + 2*i);
+    if (verbose_level!=0) printf ("  readdata %d = %x\n", i, readdata);
+
+    if (readdata!=((~t2) & 0xFFFF)){ /* Check data has been inverted */
+      puts("ERROR: Value mismatch");
+      printf ("Expect %x, actual = %x\n",((~t2) & 0xFFFF),readdata );
+      err_code |= 1<<8;
+      }
+    }    /* end for */
+
+
+  puts (" - Read bitband alias by byte size,");
+  for (i=0;i<16;i++) {
+    readdata=0;
+
+    /* Read each bit in the word via bit band alias and reconstruct the 32-bit value */
+    j=8;
+    while(j>0) {
+      j--;
+      readdata = readdata << 1; /* Shift */
+      t1 = HW8_REG(SRAM_BITBAND_ALIAS + 4*j + 0x20*i);
+      /* Check bit band read data should be 0 or 1 */
+      if ((t1|0x1)!=1) {
+        puts("ERROR: bitband read should only return 0 or 1");
+        printf ("Got %x, i=%d, j=%d\n", t1, i, j);
+        err_code |= 1<<5;
+        }
+      /* merge 32-bit word with previous read data */
+      if (t1!=0) readdata += 1; /* Set LSB */
+      }  /* end while */
+
+    if (verbose_level!=0) printf ("  readdata %d = %x\n", i, readdata);
+
+    if (readdata!=(HW8_REG(SRAM_BITBAND_ADDR + i))){
+      puts("ERROR: Value mismatch");
+      printf ("Expect %x, actual = %x\n",(HW8_REG(SRAM_BITBAND_ADDR + i)),readdata );
+      err_code |= 1<<6;
+      }
+    }    /* end for */
+
+
+  puts (" - toggle each bit by write to bit band alias, byte size");
+  for (i=0;i<16;i++) {
+    readdata=0;
+
+    /* Toggle each bit in the words via bit band alias and read the 32-bit value afterwards*/
+    t2 = HW8_REG(SRAM_BITBAND_ADDR+i); /* Current value */
+    j=8;
+    while(j>0) {
+      j--;
+      t1 = HW8_REG(SRAM_BITBAND_ALIAS + 4*j + 0x20*i);
+      /* Toggle bit and check bit band read data should be 0 or 1 */
+      if      (t1==1) HW8_REG(SRAM_BITBAND_ALIAS + 4*j + 0x20*i) = 0;
+      else if (t1==0) HW8_REG(SRAM_BITBAND_ALIAS + 4*j + 0x20*i) = 1;
+      else  {
+        puts("ERROR: bitband read should only return 0 or 1");
+        printf ("Got %x, i=%d, j=%d\n", t1, i, j);
+        err_code |= 1<<7;
+        }
+      }  /* end while */
+    /* read whole word */
+    readdata = HW8_REG(SRAM_BITBAND_ADDR + i);
+    if (verbose_level!=0) printf ("  readdata %d = %x\n", i, readdata);
+    if (readdata!=((~t2) & 0xFF)){
+      puts("ERROR: Value mismatch");
+      printf ("Expect %x, actual = %x\n",((~t2) & 0xFF),readdata );
+      err_code |= 1<<8;
+      }
+    }    /* end for */
+
+
+  puts ("  Test done\n");
+  return err_code;
+}
+
+int PeripheralBitBandTest(void)
+{
+
+const unsigned int testdata[2] = { 0x31241456, 0x92745722};
+      unsigned int readdata;    /* read back value - packed */
+      unsigned int i,j;         /* loop counters */
+      unsigned int t1;          /* temp value */
+      unsigned int err_code;    /* error code */
+      unsigned int verbose_level = 0;
+
+  /* Note :
+  Timer 0 is located in 0x40000000, with ctrl, value, reload and ID registers
+  CTRL       : 0x40000000               (not used here)
+  VALUE      : 0x40000004               (use for bit toggle later)
+  RELOAD     : 0x40000008               (use for bit toggle later)
+  ...
+  PID 4 to 7 : 0x40000FE0 to 0x40000FEC (not used here).
+  PID 0 to 3 : 0x40000FE0 to 0x40000FEC (not used here).
+  CID 0 to 3 : 0x40000FF0 to 0x40000FFC (use for read test).
+   */
+  err_code = 0;
+  puts ("Peripheral bitband");
+  puts (" - Read bitband alias, word");
+
+  /* Read timer 0 CID registers with bit band alias */
+  for (i=0;i<4;i++) {
+    readdata=0;
+
+    /* Read each bit in the word via bit band alias and reconstruct the 32-bit value */
+    j=32;
+    while(j>0) {
+      j--;
+      readdata = readdata << 1; /* Shift */
+      t1 = HW32_REG(PERIPH_BITBAND_ALIAS + (0xFF0*0x20) + 4*j + 0x80*i);
+      /* Check bit band read data should be 0 or 1 */
+      if ((t1|0x1)!=1) {
+        puts("ERROR: bitband read should only return 0 or 1");
+        printf ("Got %x, i=%d, j=%d\n", t1, i, j);
+        err_code |= 1<<1;
+        }
+      /* merge 32-bit word with previous read data */
+      if (t1!=0) readdata += 1; /* Set LSB */
+      }  /* end while */
+
+    if (verbose_level!=0) printf ("  readdata %d = %x\n", i, readdata);
+    if (readdata!=(HW32_REG(PERIPH_BITBAND_ADDR +0xFF0 + 4 * i))){
+      puts("ERROR: Value mismatch");
+      printf ("Expect %x, actual = %x\n",(HW32_REG(PERIPH_BITBAND_ADDR + 0xFF0 + 4 * i)),readdata );
+      err_code |= 1<<2;
+      }
+    }    /* end for */
+
+  puts (" - Read bitband alias, half word");
+  /* Read timer 0 CID registers with bit band alias, half word */
+  for (i=0;i<8;i++) {
+    readdata=0;
+
+    /* Read each bit in the halfword via bit band alias and reconstruct the 16-bit value */
+    j=16;
+    while(j>0) {
+      j--;
+      readdata = readdata << 1; /* Shift */
+      t1 = HW16_REG(PERIPH_BITBAND_ALIAS + (0xFF0*0x20) + 4*j + 0x40*i);
+      /* Check bit band read data should be 0 or 1 */
+      if ((t1|0x1)!=1) {
+        puts("ERROR: bitband read should only return 0 or 1");
+        printf ("Got %x, i=%d, j=%d\n", t1, i, j);
+        err_code |= 1<<3;
+        }
+      /* merge 32-bit word with previous read data */
+      if (t1!=0) readdata += 1; /* Set LSB */
+      }  /* end while */
+
+    if (verbose_level!=0) printf ("  readdata %d = %x\n", i, readdata);
+    if (readdata!=(HW16_REG(PERIPH_BITBAND_ADDR + 0xFF0 + 2 * i))){
+      puts("ERROR: Value mismatch");
+      printf ("Expect %x, actual = %x\n",(HW16_REG(PERIPH_BITBAND_ADDR + 0xFF0 + 2 * i)),readdata );
+      err_code |= 1<<4;
+      }
+    }    /* end for */
+
+  puts (" - Read bitband alias, byte");
+  /* Read timer 0 CID registers with bit band alias, half word */
+  for (i=0;i<16;i++) {
+    readdata=0;
+
+    /* Read each bit in the word via bit band alias and reconstruct the 8-bit value */
+    j=8;
+    while(j>0) {
+      j--;
+      readdata = readdata << 1; /* Shift */
+      t1 = HW8_REG(PERIPH_BITBAND_ALIAS + (0xFF0*0x20) + 4*j + 0x20*i);
+      /* Check bit band read data should be 0 or 1 */
+      if ((t1|0x1)!=1) {
+        puts("ERROR: bitband read should only return 0 or 1");
+        printf ("Got %x, i=%d, j=%d\n", t1, i, j);
+        err_code |= 1<<5;
+        }
+      /* merge 32-bit word with previous read data */
+      if (t1!=0) readdata += 1; /* Set LSB */
+      }  /* end while */
+
+    if (verbose_level!=0) printf ("  readdata %d = %x\n", i, readdata);
+    if (readdata!=(HW8_REG(PERIPH_BITBAND_ADDR+0xFF0 + i))){
+      puts("ERROR: Value mismatch");
+      printf ("Expect %x, actual = %x\n",(HW8_REG(PERIPH_BITBAND_ADDR+0xFF0 + i)),readdata );
+      err_code |= 1<<6;
+      }
+    }    /* end for */
+
+  /* CMSDK_TIMER0->VALUE (0x40000004) and CMSDK_TIMER0->RELOAD (0x40000008)
+  registers are 32-bit read/write registers which we can use them
+  for bit-band tests */
+
+  CMSDK_TIMER0->VALUE  = testdata[0];
+  CMSDK_TIMER0->RELOAD = testdata[1];
+
+  puts (" - toggle each bit by write to bit band alias, word size");
+  for (i=0;i<2;i++) {
+    readdata=0;
+
+    /* Toggle each bit in the words via bit band alias and read the 32-bit value afterwards*/
+    j=32;
+    while(j>0) {
+      j--;
+      t1 = HW32_REG(PERIPH_BITBAND_ALIAS + (0x004*0x20)+ 4*j + 0x80*i);
+      /* Toggle bit and check bit band read data should be 0 or 1 */
+      if      (t1==1) HW32_REG(PERIPH_BITBAND_ALIAS + (0x004*0x20) + 4*j + 0x80*i) = 0;
+      else if (t1==0) HW32_REG(PERIPH_BITBAND_ALIAS + (0x004*0x20) + 4*j + 0x80*i) = 1;
+      else  {
+        puts("ERROR: bitband read should only return 0 or 1");
+        printf ("Got %x, i=%d, j=%d\n", t1, i, j);
+        err_code |= 1<<7;
+        }
+      }  /* end while */
+    /* read whole word */
+    readdata = HW32_REG(PERIPH_BITBAND_ADDR + 0x4 + 4*i);
+    if (verbose_level!=0) printf ("  readdata %d = %x\n", i, readdata);
+    if (readdata!=(~testdata[i])){
+      puts("ERROR: Value mismatch");
+      printf ("Expect %x, actual = %x\n",(~testdata[i]),readdata );
+      err_code |= 1<<8;
+      }
+    }    /* end for */
+
+
+  puts ("  Test done\n");
+  return err_code;
+}
+
+int EndianCheck(void)
+{
+      unsigned int err_code = 0;    /* error code */
+      unsigned int t1;              /* temp value */
+const unsigned int testdata[2] = { 0x31241456, 0x92745722};
+               int i;               /* loop counter */
+
+  puts ("Checking endian characteristic");
+  for (i = 0;i<2; i++){
+    HW32_REG(SRAM_BITBAND_ADDR) = testdata[i];
+    t1 = HW16_REG(SRAM_BITBAND_ADDR) | (HW16_REG(SRAM_BITBAND_ADDR + 0x2) << 16);
+    if (t1 != testdata[i]) {
+      err_code = 1;
+      printf ("Write 32-bit word %x, read 2x 16-bit halfword %x.\n",testdata[i], t1 );
+      }
+    }
+  for (i = 0;i<2; i++){
+    HW32_REG(SRAM_BITBAND_ADDR) = testdata[i];
+    t1 = HW8_REG(SRAM_BITBAND_ADDR    )        | (HW8_REG(SRAM_BITBAND_ADDR + 0x1) << 8) |
+        (HW8_REG(SRAM_BITBAND_ADDR+0x2) << 16) | (HW8_REG(SRAM_BITBAND_ADDR + 0x3) << 24);
+    if (t1 != testdata[i]) {
+      err_code = 1;
+      printf ("Write 32-bit word %x, read 4x 8-bit byte %x.\n", testdata[i], t1);
+      }
+    }
+  if (err_code != 0) {
+    puts ("The memory system does not fully compliant to endianess,");
+    puts ("some tests procedures will be skipped.\n");
+    }
+  return err_code;
+}
+
+int error_test(void)
+{
+
+  unsigned int err_code;        /* error code */
+  unsigned int t1;              /* temp value for bus fault test */
+  unsigned int testaddr;        /* temp value */
+
+  err_code = 0;
+  puts ("Bus fault test");
+  puts (" - read error");
+  hf_expected = 1;
+  hf_occurred = 0;
+  testaddr = SRAM_BITBAND_ALIAS + (0x100000 - 1)*32; // Address to be tested
+  printf ("  test address = %x\n", testaddr);
+  t1 = HW32_REG(testaddr);
+
+  /* Bus fault should be triggered */
+  __ISB(); /* delay */
+  __ISB(); /* delay */
+  __ISB(); /* delay */
+
+  if (hf_occurred!=1) {
+    printf ("Expect 1 fault, actual %d\n", hf_occurred);
+    err_code = 1;
+    }
+
+  puts (" - write error");
+  hf_expected = 1;
+  hf_occurred = 0;
+
+  HW32_REG(testaddr)=0;
+
+  /* Bus fault should be triggered */
+  __ISB(); /* delay */
+  __ISB(); /* delay */
+  __ISB(); /* delay */
+
+  if (hf_occurred!=1) {
+    printf ("Expect 1 fault, actual %d\n", hf_occurred);
+    err_code = 1;
+    }
+
+  /* End of test, clear hf_expected */
+  hf_expected = 0;
+
+  puts ("  Test done\n");
+  return err_code;
+
+}
+
+/* Hard fault handler - would be triggered in probing state if
+  bitband feature is not implemented */
+
+void HF_Handler_main(unsigned int * hf_args)
+{
+  if (probing_state==1) {
+    /* Bus fault while probing */
+    puts ("Bus fault while probing bitband alias\n");
+    puts ("** TEST SKIPPED ** Bitband feature not available\n");
+    UartEndSimulation();
+    }
+  if (hf_expected==1) {
+    puts ("Expected Bus fault\n");
+    hf_occurred ++;
+    /* Increment stacked PC */
+    hf_args[6] = hf_args[6] + 2;
+    }
+  else {
+    puts ("Unexpected Bus fault\n");
+    UartEndSimulation();
+    }
+  return;
+}
+
+#if defined ( __CC_ARM   )
+/* ARM or Keil toolchain */
+__asm void HardFault_Handler(void)
+{
+  MOVS   r0, #4
+  MOV    r1, LR
+  TST    r0, r1
+  BEQ    stacking_used_MSP
+  MRS    R0, PSP ; first parameter - stacking was using PSP
+  LDR    R1,=__cpp(HF_Handler_main)
+  BX     R1
+stacking_used_MSP
+  MRS    R0, MSP ; first parameter - stacking was using MSP
+  LDR    R1,=__cpp(HF_Handler_main)
+  BX     R1
+}
+#else
+/* gcc toolchain */
+void HardFault_Handler(void) __attribute__((naked));
+void HardFault_Handler(void)
+{
+  __asm("  movs   r0,#4\n"
+        "  mov    r1,lr\n"
+        "  tst    r0,r1\n"
+        "  beq    stacking_used_MSP\n"
+        "  mrs    r0,psp\n" /*  first parameter - stacking was using PSP */
+        "  ldr    r1,=HF_Handler_main  \n"
+        "  bx     r1\n"
+        "stacking_used_MSP:\n"
+        "  mrs    r0,msp\n" /*  first parameter - stacking was using PSP */
+        "  ldr    r1,=HF_Handler_main  \n"
+        "  bx     r1\n"
+        ".pool\n" );
+}
+#endif
+
diff --git a/Cortex-M0/nanosoc/software/common/validation/default_slaves_tests.c b/Cortex-M0/nanosoc/software/common/validation/default_slaves_tests.c
new file mode 100644
index 0000000..065dab9
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/validation/default_slaves_tests.c
@@ -0,0 +1,240 @@
+/*-----------------------------------------------------------------------------
+// customised Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+*/
+
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+  A simple test to check the operation of default slave and the handling of
+  error response in the AHB interconnection.
+*/
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"
+
+#if defined ( __CC_ARM   )
+__asm void          address_test_write(unsigned int addr, unsigned int wdata);
+__asm unsigned int  address_test_read(unsigned int addr);
+#else
+      void          address_test_write(unsigned int addr, unsigned int wdata);
+      unsigned int  address_test_read(unsigned int addr);
+#endif
+void                HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value);
+
+/* Global variables */
+volatile int hardfault_occurred;
+volatile int hardfault_expected;
+volatile int temp_data;
+
+int main (void)
+{
+  int err_code = 0;
+  int rdata; /* dummy variable for read data in bus fault testing */
+
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - Default Slave Test - revision $Revision: 371321 $\n");
+
+
+  puts("Default slave tests - hard faults expected\n");
+  temp_data=0;
+  hardfault_occurred = 0;
+  hardfault_expected = 1;
+  address_test_write(0x40020000, 0x3456789A);
+  if (hardfault_occurred==0) {err_code |= (1<<0);}
+  hardfault_occurred = 0;
+
+  rdata = address_test_read(0x40020000);
+  if (hardfault_occurred==0) {err_code |= (1<<1);}
+  hardfault_occurred = 0;
+
+  address_test_write(0x50000000, 0x3456789A);
+  if (hardfault_occurred==0) {err_code |= (1<<2);}
+  hardfault_occurred = 0;
+
+  rdata = address_test_read(0x50000000);
+  if (hardfault_occurred==0) {err_code |= (1<<3);}
+  hardfault_occurred = 0;
+
+  puts("\nAPB test slave - hard faults expected\n");
+  rdata = address_test_read(0x40003000);
+  if (hardfault_occurred==0) {err_code |= (1<<4);}
+  hardfault_occurred = 0;
+
+  rdata = address_test_read(0x40007000);
+  if (hardfault_occurred==0) {err_code |= (1<<5);}
+  hardfault_occurred = 0;
+
+  rdata = address_test_read(0x40009000);
+  if (hardfault_occurred==0) {err_code |= (1<<6);}
+  hardfault_occurred = 0;
+
+  rdata = address_test_read(0x4000A000);
+  if (hardfault_occurred==0) {err_code |= (1<<7);}
+  hardfault_occurred = 0;
+
+  /* clean up */
+  hardfault_expected = 0;
+
+  /* Generate test pass/fail and return value */
+  if (err_code==0) {
+    printf ("\n** TEST PASSED **\n");
+  } else {
+    printf ("\n** TEST FAILED **, Error code = (0x%x)\n", err_code);
+  }
+  UartEndSimulation();
+  return 0;
+}
+
+#if defined ( __CC_ARM   )
+/* Test function for write - for ARM / Keil */
+__asm void address_test_write(unsigned int addr, unsigned int wdata)
+{
+  STR    R1,[R0]
+  DSB    ; Ensure bus fault occurred before leaving this subroutine
+  BX     LR
+}
+
+#else
+/* Test function for write - for gcc */
+void address_test_write(unsigned int addr, unsigned int wdata) __attribute__((naked));
+void address_test_write(unsigned int addr, unsigned int wdata)
+{
+  __asm("  str   r1,[r0]\n"
+        "  dsb          \n"
+        "  bx    lr     \n"
+  );
+}
+#endif
+
+/* Test function for read */
+#if defined ( __CC_ARM   )
+/* Test function for read - for ARM / Keil */
+__asm unsigned int address_test_read(unsigned int addr)
+{
+  LDR    R1,[R0]
+  DSB    ; Ensure bus fault occurred before leaving this subroutine
+  MOVS   R0, R1
+  BX     LR
+}
+#else
+/* Test function for read - for gcc */
+unsigned int  address_test_read(unsigned int addr) __attribute__((naked));
+unsigned int  address_test_read(unsigned int addr)
+{
+  __asm("  ldr   r1,[r0]\n"
+        "  dsb          \n"
+        "  movs  r0, r1 \n"
+        "  bx    lr     \n"
+  );
+}
+#endif
+
+
+#if defined ( __CC_ARM   )
+/* ARM or Keil toolchain */
+__asm void HardFault_Handler(void)
+{
+  MOVS   r0, #4
+  MOV    r1, LR
+  TST    r0, r1
+  BEQ    stacking_used_MSP
+  MRS    R0, PSP ; // first parameter - stacking was using PSP
+  B      get_LR_and_branch
+stacking_used_MSP
+  MRS    R0, MSP ; // first parameter - stacking was using MSP
+get_LR_and_branch
+  MOV    R1, LR  ; // second parameter is LR current value
+  LDR    R2,=__cpp(HardFault_Handler_c)
+  BX     R2
+  ALIGN
+}
+#else
+/* gcc toolchain */
+void HardFault_Handler(void) __attribute__((naked));
+void HardFault_Handler(void)
+{
+  __asm("  movs   r0,#4\n"
+        "  mov    r1,lr\n"
+        "  tst    r0,r1\n"
+        "  beq    stacking_used_MSP\n"
+        "  mrs    r0,psp\n" /*  first parameter - stacking was using PSP */
+        "  ldr    r1,=HardFault_Handler_c  \n"
+        "  bx     r1\n"
+        "stacking_used_MSP:\n"
+        "  mrs    r0,msp\n" /*  first parameter - stacking was using PSP */
+        "  ldr    r1,=HardFault_Handler_c  \n"
+        "  bx     r1\n"
+        ".pool\n" );
+}
+
+#endif
+/* C part of the fault handler - common between ARM / Keil /gcc */
+void HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value)
+{
+  unsigned int stacked_pc;
+  unsigned int stacked_r0;
+  hardfault_occurred++;
+  puts ("[Hard Fault Handler]");
+  if (hardfault_expected==0) {
+    puts ("ERROR : Unexpected HardFault interrupt occurred.\n");
+    UartEndSimulation();
+    while (1);
+    }
+  stacked_r0  = ((unsigned long) hardfault_args[0]);
+  stacked_pc  = ((unsigned long) hardfault_args[6]);
+  printf(" - Stacked R0 : 0x%x\n", stacked_r0);
+  printf(" - Stacked PC : 0x%x\n", stacked_pc);
+  /* Modify R0 to a valid address */
+  hardfault_args[0] = (unsigned long) &temp_data;
+
+  return;
+}
+
diff --git a/Cortex-M0/nanosoc/software/common/validation/dma_tests.c b/Cortex-M0/nanosoc/software/common/validation/dma_tests.c
new file mode 100644
index 0000000..5c06eb9
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/validation/dma_tests.c
@@ -0,0 +1,543 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+  A simple test to check the connectivity of the DMA-230 including
+  interrupt and done signals
+*/
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"
+
+#include "config_id.h"
+
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+volatile int dma_done_irq_occurred;
+volatile int dma_done_irq_expected;
+volatile int dma_error_irq_occurred;
+volatile int dma_error_irq_expected;
+
+int  pl230_dma_detect(void);
+int  ID_Check(const unsigned int id_array[], unsigned int offset);
+void dma_memory_copy (unsigned int src, unsigned int dest, unsigned int size, unsigned int num);
+void dma_data_struct_init(void);
+void dma_pl230_init(void);
+int  dma_simple_test(void);
+int  dma_interrupt_test(void);
+int  dma_event_test(void);
+void delay(void);
+
+                              /* Maximum to 32 DMA channel */
+#define MAX_NUM_OF_DMA_CHANNELS   32
+                              /* SRAM in example system is 64K bytes */
+#define RAM_ADDRESS_MAX       0x3000FFFF
+
+typedef struct /* 4 words */
+{
+  volatile unsigned long SrcEndPointer;
+  volatile unsigned long DestEndPointer;
+  volatile unsigned long Control;
+  volatile unsigned long unused;
+} pl230_dma_channel_data;
+
+
+typedef struct /* 8 words per channel */
+{ /* only one channel in the example uDMA setup */
+  volatile pl230_dma_channel_data Primary[MAX_NUM_OF_DMA_CHANNELS];
+  volatile pl230_dma_channel_data Alternate[MAX_NUM_OF_DMA_CHANNELS];
+} pl230_dma_data_structure;
+
+pl230_dma_data_structure *dma_data;
+
+volatile unsigned int source_data_array[4];  /* Data array for memory DMA test */
+volatile unsigned int dest_data_array[4];    /* Data array for memory DMA test */
+
+int main (void)
+{
+  int result=0;
+
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - DMA Test - revision $Revision: 371321 $\n");
+
+
+  if (pl230_dma_detect()!=0) {
+    return 0; /* Quit test if DMA is not present */
+  }
+
+  dma_done_irq_expected = 0;
+  dma_done_irq_occurred = 0;
+  dma_error_irq_expected = 0;
+  dma_error_irq_occurred = 0;
+  dma_data_struct_init();
+  dma_pl230_init();
+
+  result += dma_simple_test();
+  result += dma_interrupt_test();
+  result += dma_event_test();
+  if (result==0) {
+    printf ("\n** TEST PASSED **\n");
+  } else {
+    printf ("\n** TEST FAILED **, Error code = (0x%x)\n", result);
+  }
+  UartEndSimulation();
+  return 0;
+}
+
+/* --------------------------------------------------------------- */
+/*  Detect if DMA controller is present or not                     */
+/* --------------------------------------------------------------- */
+
+int pl230_dma_detect(void)
+{
+  int result;
+
+  unsigned const int pl230_id[12] = {
+                                 0x30, 0xB2, 0x0B, 0x00,
+                                 0x0D, 0xF0, 0x05, 0xB1};
+  puts("Detect if DMA controller is present...");
+  result = ID_Check(&pl230_id[0]   , CMSDK_PL230_BASE);
+  if (result!=0) {
+    puts("** TEST SKIPPED ** DMA controller is not present.\n");
+    UartEndSimulation();
+  }
+  return(result);
+}
+
+int ID_Check(const unsigned int id_array[], unsigned int offset)
+{
+int i;
+unsigned long expected_val, actual_val;
+unsigned long compare_mask;
+int           mismatch = 0;
+unsigned long test_addr;
+
+  /* Check the peripheral ID and component ID */
+  for (i=0;i<8;i++) {
+    test_addr = offset + 4*i + 0xFE0;
+    expected_val = id_array[i];
+    actual_val   = HW32_REG(test_addr);
+
+    /* create mask to ignore version numbers */
+    if (i==2) { compare_mask = 0xF0;}  // mask out version field
+    else      { compare_mask = 0x00;}  // compare whole value
+
+    if ((expected_val & (~compare_mask)) != (actual_val & (~compare_mask))) {
+      printf ("Difference found: %x, expected %x, actual %x\n", test_addr, expected_val, actual_val);
+      mismatch++;
+      }
+
+    } // end_for
+return (mismatch);
+}
+
+/* --------------------------------------------------------------- */
+/*  Initialize DMA data structure                                  */
+/* --------------------------------------------------------------- */
+void dma_data_struct_init(void)
+{
+  int          i;   /* loop counter */
+  unsigned int ptr;
+
+  int          ch_num;         /* number of channels */
+  unsigned int blksize;        /* Size of DMA data structure in bytes */
+  unsigned int blkmask;        /* address mask */
+
+
+  ch_num  = (((CMSDK_DMA->DMA_STATUS) >> 16) & 0x1F)+1;
+  blksize = ch_num * 32;
+  if      (ch_num > 16) blkmask = 0x3FF; /* 17 to 32 */
+  else if (ch_num > 8)  blkmask = 0x1FF; /*  9 to 16 */
+  else if (ch_num > 4)  blkmask = 0x0FF; /*  5 to 8 */
+  else if (ch_num > 2)  blkmask = 0x07F; /*  3 to 4 */
+  else if (ch_num > 1)  blkmask = 0x07F; /*       2 */
+  else                  blkmask = 0x03F; /*       1 */
+
+  /* Create DMA data structure in RAM after stack
+  In the linker script, a 1KB memory stack above stack is reserved
+  so we can use this space for putting the DMA data structure.
+  */
+
+  ptr     = HW32_REG(0);                     /* Read Top of Stack */
+
+  /* the DMA data structure must be aligned to the size of the data structure */
+  if ((ptr & blkmask) != 0x0)
+    ptr     = (ptr + blksize) & ~blkmask;
+
+  if ((ptr + blksize) > (RAM_ADDRESS_MAX + 1)) {
+    puts ("ERROR : Not enough RAM space for DMA data structure.");
+    UartEndSimulation();
+    }
+
+  /* Set pointer to the reserved space */
+  dma_data = (pl230_dma_data_structure *) ptr;
+  ptr = (unsigned int) &dma_data->Primary->SrcEndPointer;
+
+  printf ("dma structure block address = %x\n", ptr);
+
+  for (i=0; i<1; i++) {
+    dma_data->Primary->SrcEndPointer  = 0;
+    dma_data->Primary->DestEndPointer = 0;
+    dma_data->Primary->Control        = 0;
+    dma_data->Alternate->SrcEndPointer  = 0;
+    dma_data->Alternate->DestEndPointer = 0;
+    dma_data->Alternate->Control        = 0;
+    }
+
+  return;
+}
+
+/* --------------------------------------------------------------- */
+/*  Initialize DMA PL230                                           */
+/* --------------------------------------------------------------- */
+void dma_pl230_init(void)
+{
+  unsigned int current_state;
+  puts ("Initialize PL230");
+  current_state = CMSDK_DMA->DMA_STATUS;
+  printf ("- # of channels allowed : %d\n",(((current_state) >> 16) & 0x1F)+1);
+  /* Debugging printfs: */
+  /*printf ("- Current status        : %x\n",(((current_state) >> 4)  & 0xF));*/
+  /*printf ("- Current master enable : %x\n",(((current_state) >> 0)  & 0x1));*/
+
+  /* Wait until current DMA complete */
+  current_state = (CMSDK_DMA->DMA_STATUS >> 4)  & 0xF;
+  if (!((current_state==0) || (current_state==0x8) || (current_state==0x9))) {
+    puts ("- wait for DMA IDLE/STALLED/DONE");
+    current_state = (CMSDK_DMA->DMA_STATUS >> 4)  & 0xF;
+    printf ("- Current status        : %x\n",(((current_state) >> 4)  & 0xF));
+
+    }
+  while (!((current_state==0) || (current_state==0x8) || (current_state==0x9))){
+    /* Wait if not IDLE/STALLED/DONE */
+    current_state = (CMSDK_DMA->DMA_STATUS >> 4)  & 0xF;
+    printf ("- Current status        : %x\n",(((current_state) >> 4)  & 0xF));
+    }
+  CMSDK_DMA->DMA_CFG = 0; /* Disable DMA controller for initialization */
+  CMSDK_DMA->CTRL_BASE_PTR = (unsigned int) &dma_data->Primary->SrcEndPointer;
+                           /* Set DMA data structure address */
+  CMSDK_DMA->CHNL_ENABLE_CLR = 0xFFFFFFFF; /* Disable all channels */
+  CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */
+  CMSDK_DMA->DMA_CFG = 1;              /* Enable DMA controller */
+
+  return;
+}
+
+/* --------------------------------------------------------------- */
+/*  DMA memory copy                                                */
+/* --------------------------------------------------------------- */
+void dma_memory_copy (unsigned int src, unsigned int dest, unsigned int size, unsigned int num)
+{
+  unsigned long src_end_pointer =  src + ((1<<size)*(num-1));
+  unsigned long dst_end_pointer = dest + ((1<<size)*(num-1));
+  unsigned long control         = (size << 30) |  /* dst_inc */
+                                  (size << 28) |  /* dst_size */
+                                  (size << 26) |  /* src_inc */
+                                  (size << 24) |  /* src_size */
+                                  (size << 21) |  /* dst_prot_ctrl - HPROT[3:1] */
+                                  (size << 18) |  /* src_prot_ctrl - HPROT[3:1] */
+                                  (0    << 14) |  /* R_power */
+                                  ((num-1)<< 4) | /* n_minus_1 */
+                                  (0    <<  3) |  /* next_useburst */
+                                  (2    <<  0) ;  /* cycle_ctrl - auto */
+
+  /* By default the PL230 is little-endian; if the processor is configured
+   * big-endian then the configuration data that is written to memory must be
+   * byte-swapped before being written.  This is also true if the processor is
+   * little-endian and the PL230 is big-endian.
+   * Remove the __REV usage if the processor and PL230 are configured with the
+   * same endianness
+   * */
+  dma_data->Primary->SrcEndPointer  = (EXPECTED_BE) ? __REV(src_end_pointer) : (src_end_pointer);
+  dma_data->Primary->DestEndPointer = (EXPECTED_BE) ? __REV(dst_end_pointer) : (dst_end_pointer);
+  dma_data->Primary->Control        = (EXPECTED_BE) ? __REV(control        ) : (control        );
+  /* Debugging printfs: */
+  /*printf ("SrcEndPointer  = %x\n", dma_data->Primary->SrcEndPointer);*/
+  /*printf ("DestEndPointer = %x\n", dma_data->Primary->DestEndPointer);*/
+
+  CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */
+  CMSDK_DMA->CHNL_SW_REQUEST = (1<<0); /* request channel 0 DMA */
+
+  return;
+}
+
+/* --------------------------------------------------------------- */
+/*  Simple software DMA test                                       */
+/* --------------------------------------------------------------- */
+int dma_simple_test(void)
+{
+  int return_val=0;
+  int err_code=0;
+  int i;
+  unsigned int current_state;
+
+
+  puts("uDMA simple test");
+  CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */
+
+  /* setup data for DMA */
+  for (i=0;i<4;i++) {
+    source_data_array[i] = i;
+    dest_data_array[i]   = 0;
+  }
+
+  dma_memory_copy ((unsigned int) &source_data_array[0],(unsigned int) &dest_data_array[0], 2, 4);
+  do { /* Wait until PL230 DMA controller return to idle state */
+    current_state = (CMSDK_DMA->DMA_STATUS >> 4)  & 0xF;
+  } while (current_state!=0);
+
+  for (i=0;i<4;i++) {
+    /* Debugging printf: */
+    /*printf (" - dest[i] = %x\n", dest_data_array[i]);*/
+    if (dest_data_array[i]!= i){
+      printf ("ERROR:dest_data_array[%d], expected %x, actual %x\n", i, i, dest_data_array[i]);
+      err_code |= (1<<i);
+    }
+  }
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : simple DMA failed (0x%x)\n", err_code);
+    return_val=1;
+  } else {
+    puts ("-Passed");
+  }
+
+  return(return_val);
+}
+/* --------------------------------------------------------------- */
+/*  Simple DMA interrupt test                                      */
+/* --------------------------------------------------------------- */
+int dma_interrupt_test(void)
+{
+  int return_val=0;
+  int err_code=0;
+  int i;
+  unsigned int current_state;
+
+
+  puts("DMA interrupt test");
+  puts("- DMA done");
+
+  CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */
+
+  /* setup data for DMA */
+  for (i=0;i<4;i++) {
+    source_data_array[i] = i;
+    dest_data_array[i]   = 0;
+  }
+
+  dma_done_irq_expected = 1;
+  dma_done_irq_occurred = 0;
+  NVIC_ClearPendingIRQ(DMA_IRQn);
+  NVIC_EnableIRQ(DMA_IRQn);
+
+  dma_memory_copy ((unsigned int) &source_data_array[0],(unsigned int) &dest_data_array[0], 2, 4);
+  delay();
+  /* Can't guarantee that there is sleep support, so use a polling loop */
+  do { /* Wait until PL230 DMA controller return to idle state */
+    current_state = (CMSDK_DMA->DMA_STATUS >> 4)  & 0xF;
+  } while (current_state!=0);
+
+  for (i=0;i<4;i++) {
+    /* Debugging printf: */
+    /*printf (" - dest[i] = %x\n", dest_data_array[i]);*/
+    if (dest_data_array[i]!= i){
+      printf ("ERROR:dest_data_array[%d], expected %x, actual %x\n", i, i, dest_data_array[i]);
+      err_code |= (1<<i);
+    }
+  }
+
+  if (dma_done_irq_occurred==0){
+    puts ("ERROR: DMA done IRQ missing");
+    err_code |= (1<<4);
+  }
+
+  puts("- DMA err");
+  CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */
+
+  /* setup data for DMA */
+  for (i=0;i<4;i++) {
+    source_data_array[i] = i;
+    dest_data_array[i]   = 0;
+  }
+
+  dma_error_irq_expected = 1;
+  dma_error_irq_occurred = 0;
+  NVIC_ClearPendingIRQ(DMA_IRQn);
+  NVIC_EnableIRQ(DMA_IRQn);
+
+  /* Generate DMA transfer to invalid memory location */
+  dma_memory_copy ((unsigned int) &source_data_array[0],0x1F000000, 2, 4);
+  delay();
+  /* Can't guarantee that there is sleep support, so use a polling loop */
+  do { /* Wait until PL230 DMA controller return to idle state */
+    current_state = (CMSDK_DMA->DMA_STATUS >> 4)  & 0xF;
+  } while (current_state!=0);
+
+  if (dma_error_irq_occurred==0){
+    puts ("ERROR: DMA err IRQ missing");
+    err_code |= (1<<5);
+  }
+
+
+  /* Clear up */
+  dma_done_irq_expected = 0;
+  dma_done_irq_occurred = 0;
+  dma_error_irq_expected = 0;
+  dma_error_irq_occurred = 0;
+  NVIC_DisableIRQ(DMA_IRQn);
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : DMA done interrupt failed (0x%x)\n", err_code);
+    return_val=1;
+  } else {
+    puts ("-Passed");
+  }
+
+  return(return_val);
+}
+
+/* --------------------------------------------------------------- */
+/*  DMA event test                                                 */
+/* --------------------------------------------------------------- */
+int dma_event_test(void)
+{
+  int return_val=0;
+  int err_code=0;
+  int i;
+  unsigned int current_state;
+
+
+  puts("DMA event test");
+  puts("- DMA done event to RXEV");
+
+  CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */
+
+  /* setup data for DMA */
+  for (i=0;i<4;i++) {
+    source_data_array[i] = i;
+    dest_data_array[i]   = 0;
+  }
+
+  dma_done_irq_expected = 1;
+  dma_done_irq_occurred = 0;
+  NVIC_ClearPendingIRQ(DMA_IRQn);
+  NVIC_DisableIRQ(DMA_IRQn);
+
+  /* Clear event register - by setting event with SEV and then clear it with WFE */
+  __SEV();
+  __WFE(); /* First WFE will not enter sleep because of previous event */
+
+  dma_memory_copy ((unsigned int) &source_data_array[0],(unsigned int) &dest_data_array[0], 2, 4);
+  __WFE(); /* This will cause the processor to enter sleep */
+
+  /* Processor woken up */
+  current_state = (CMSDK_DMA->DMA_STATUS >> 4)  & 0xF;
+  if (current_state!=0) {
+    puts ("ERROR: DMA status should be IDLE after wake up");
+    err_code |= (1<<5);
+  }
+
+  for (i=0;i<4;i++) {
+    /*printf (" - dest[i] = %x\n", dest_data_array[i]);*/
+    if (dest_data_array[i]!= i){
+      printf ("ERROR:dest_data_array[%d], expected %x, actual %x\n", i, i, dest_data_array[i]);
+      err_code |= (1<<i);
+    }
+  }
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : DMA event failed (0x%x)\n", err_code);
+    return_val=1;
+  } else {
+    puts ("-Passed");
+  }
+
+  return(return_val);
+}
+
+/* --------------------------------------------------------------- */
+/*  DMA interrupt handlers                                         */
+/* --------------------------------------------------------------- */
+
+void DMA_Handler(void)
+{
+if ((CMSDK_DMA->ERR_CLR & 1) != 0)  {
+  /* DMA interrupt is caused by DMA error */
+  dma_error_irq_occurred ++;
+  CMSDK_DMA->ERR_CLR = 1; /* Clear dma_err */
+  if (dma_error_irq_expected==0) {
+    puts ("ERROR : Unexpected DMA error interrupt occurred.\n");
+    UartEndSimulation();
+    while (1);
+    }
+  }
+else {
+  // DMA interrupt is caused by DMA done
+  dma_done_irq_occurred ++;
+  if (dma_done_irq_expected==0) {
+    puts ("ERROR : Unexpected DMA done interrupt occurred.\n");
+    UartEndSimulation();
+    while (1);
+    }
+  }
+}
+
+void HardFault_Handler(void)
+{
+  puts ("[Hard fault]\n");
+  UartEndSimulation();
+  while (1);
+}
+
+void delay(void)
+{
+  int i;
+  for (i=0;i<5;i++){
+    __ISB();
+    }
+  return;
+}
+
diff --git a/Cortex-M0/nanosoc/software/common/validation/ext_sys_tests.c b/Cortex-M0/nanosoc/software/common/validation/ext_sys_tests.c
new file mode 100644
index 0000000..f0ffe1f
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/validation/ext_sys_tests.c
@@ -0,0 +1,677 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+  A simple test to check the operation of components instantiated in the
+  extended example subsystem.
+*/
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"
+
+#if defined ( __CC_ARM   )
+__asm void          address_test_write(unsigned int addr, unsigned int wdata);
+__asm unsigned int  address_test_read(unsigned int addr);
+#else
+      void          address_test_write(unsigned int addr, unsigned int wdata);
+      unsigned int  address_test_read(unsigned int addr);
+#endif
+void                HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value);
+
+/* Macros for word, half word and byte */
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+#define HW16_REG(ADDRESS)  (*((volatile unsigned short *)(ADDRESS)))
+#define HW8_REG(ADDRESS)   (*((volatile unsigned char  *)(ADDRESS)))
+
+#define ADDR_BASE_APB4_EG_SLAVE_1 0x50000000
+#define ADDR_BASE_APB4_EG_SLAVE_2 0x52000000
+#define ADDR_BASE_APB3_EG_SLAVE   0x50001000
+#define ADDR_BASE_AHB_EG_SLAVE    0x50020000
+#define ADDR_BASE_AHB_TB_SLAVE_1  0x50002000
+#define ADDR_BASE_AHB_TB_SLAVE_2  0x51010000
+#define ADDR_BASE_AHB_TB_SLAVE_3  0x52002000
+
+/* Function definition */
+int check_apb4_eg_slave(unsigned long base_addr);
+int check_apb3_eg_slave(unsigned long base_addr);
+int check_ahb_eg_slave(unsigned long base_addr);
+int check_ahb_tb_slave(unsigned long base_addr);
+int check_default_slave(unsigned long base_addr);
+
+/* Global variables */
+volatile int hardfault_occurred;
+volatile int hardfault_expected;
+volatile int temp_data;
+volatile int probe_ext_eg_sys=0; /* Set to 1 for memory map probing */
+
+// -----------------------------------------------------------
+// Start of main program
+// -----------------------------------------------------------
+
+int main (void)
+{
+  int result=0;
+  unsigned int dummy; /* dummy variable for memory probing */
+
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - Extended Subsystem Test - revision $Revision: 371321 $\n");
+
+  probe_ext_eg_sys = 1; /* Probe to see if extended subsystem is included */
+  /* If extended subsystem is included, the following read will be carried out,
+  otherwise an error response will be received and enter hard fault */
+  dummy = HW32_REG(ADDR_BASE_APB4_EG_SLAVE_1 + 0xFE0);
+
+  probe_ext_eg_sys = 0; /* Example system exist, continue operation */
+
+  temp_data=0;
+
+  // Test access to APB4 Example Slave
+  result |= check_apb4_eg_slave(ADDR_BASE_APB4_EG_SLAVE_1);
+  result |= check_apb4_eg_slave(ADDR_BASE_APB4_EG_SLAVE_2);
+
+  // Test access to APB3 Example Slave
+  result |= check_apb3_eg_slave(ADDR_BASE_APB3_EG_SLAVE);
+
+  // Test access to AHB Example Slave
+  result |= check_ahb_eg_slave(ADDR_BASE_AHB_EG_SLAVE);
+
+  // Test access to AHB Trickbox Slave
+  result |= check_ahb_tb_slave(ADDR_BASE_AHB_TB_SLAVE_1);
+  result |= check_ahb_tb_slave(ADDR_BASE_AHB_TB_SLAVE_3);
+
+  // Test access to Default slave
+  puts ("Checking AHB Default slave");
+  result |= check_default_slave(0x52020000);
+  result |= check_default_slave(0x68000000);
+
+  /* clean up */
+  hardfault_expected = 0;
+
+  if (result==0) {
+    printf ("\n** TEST PASSED **\n");
+  } else {
+    printf ("\n** TEST FAILED **, Error code = (0x%x)\n", result);
+  }
+  UartEndSimulation();
+  return 0;
+}
+// -----------------------------------------------------------
+// Check the access to APB4 example slave
+// -----------------------------------------------------------
+int check_apb4_eg_slave(unsigned long base_addr)
+{
+  const char apb4_id[12] = {0x04, 0x00, 0x00, 0x00,
+                            0x19, 0xB8, 0x1B, 0x00,
+                            0x0D, 0xF0, 0x05, 0xB1};
+  int return_val=0;
+  int err_code=0;
+  int i;
+
+  puts ("Checking APB4 Example slave");
+  // -------------------------
+  puts ("- check ID values");
+  for (i=0; i<12; i++) {
+    if (HW32_REG(base_addr + 0xFD0 + 4*i) != apb4_id[i]) {
+      printf ("    ID [%d] ERROR : expected %x, actual %x\n", i, apb4_id[i], HW32_REG(base_addr + 0xFD0 + 4*i));
+      err_code = err_code | 0x1;
+      }
+    }
+  // -------------------------
+  puts ("- initial data values");
+  for (i=0; i<4; i++) {
+    printf ("    Data[%d] = %x\n", i, HW32_REG(base_addr + 4*i));
+    }
+
+  puts ("- check R/W in word size");
+
+  HW32_REG(base_addr      ) = 0x12345678;
+  HW32_REG(base_addr +0x04) = 0x55CC33AA;
+  HW32_REG(base_addr +0x08) = 0xFF008765;
+  HW32_REG(base_addr +0x0C) = 0x99AABCDE;
+
+  if (HW32_REG(base_addr      ) != 0x12345678) {err_code |= (1<<2); puts("    ERROR @ Data0");}
+  if (HW32_REG(base_addr +0x04) != 0x55CC33AA) {err_code |= (1<<2); puts("    ERROR @ Data1");}
+  if (HW32_REG(base_addr +0x08) != 0xFF008765) {err_code |= (1<<2); puts("    ERROR @ Data2");}
+  if (HW32_REG(base_addr +0x0C) != 0x99AABCDE) {err_code |= (1<<2); puts("    ERROR @ Data3");}
+
+
+  puts ("- check R/W in halfword size");
+
+  HW16_REG(base_addr      ) = 0xA987;
+  HW16_REG(base_addr +0x02) = 0xEDCB;
+  HW16_REG(base_addr +0x04) = 0xCC55;
+  HW16_REG(base_addr +0x06) = 0xAA33;
+  HW16_REG(base_addr +0x08) = 0x789A;
+  HW16_REG(base_addr +0x0A) = 0x00FF;
+  HW16_REG(base_addr +0x0C) = 0x4321;
+  HW16_REG(base_addr +0x0E) = 0x6655;
+
+  if (HW16_REG(base_addr      ) != 0xA987) {err_code |= (1<<3); puts("    ERROR @ Data0");}
+  if (HW16_REG(base_addr +0x02) != 0xEDCB) {err_code |= (1<<3); puts("    ERROR @ Data1");}
+  if (HW16_REG(base_addr +0x04) != 0xCC55) {err_code |= (1<<3); puts("    ERROR @ Data2");}
+  if (HW16_REG(base_addr +0x06) != 0xAA33) {err_code |= (1<<3); puts("    ERROR @ Data3");}
+  if (HW16_REG(base_addr +0x08) != 0x789A) {err_code |= (1<<3); puts("    ERROR @ Data4");}
+  if (HW16_REG(base_addr +0x0A) != 0x00FF) {err_code |= (1<<3); puts("    ERROR @ Data5");}
+  if (HW16_REG(base_addr +0x0C) != 0x4321) {err_code |= (1<<3); puts("    ERROR @ Data6");}
+  if (HW16_REG(base_addr +0x0E) != 0x6655) {err_code |= (1<<3); puts("    ERROR @ Data7");}
+
+  puts ("- check R/W in byte size");
+
+  HW8_REG(base_addr      ) = 0xA9;  // swap upper and lower byte
+  HW8_REG(base_addr +0x01) = 0x87;
+  HW8_REG(base_addr +0x02) = 0xED;
+  HW8_REG(base_addr +0x03) = 0xCB;
+  HW8_REG(base_addr +0x04) = 0xCC;
+  HW8_REG(base_addr +0x05) = 0x55;
+  HW8_REG(base_addr +0x06) = 0xAA;
+  HW8_REG(base_addr +0x07) = 0x33;
+  HW8_REG(base_addr +0x08) = 0x78;
+  HW8_REG(base_addr +0x09) = 0x9A;
+  HW8_REG(base_addr +0x0A) = 0x00;
+  HW8_REG(base_addr +0x0B) = 0xFF;
+  HW8_REG(base_addr +0x0C) = 0x43;
+  HW8_REG(base_addr +0x0D) = 0x21;
+  HW8_REG(base_addr +0x0E) = 0x66;
+  HW8_REG(base_addr +0x0F) = 0x55;
+
+  if (HW8_REG(base_addr      ) != 0xA9) {err_code |= (1<<4); puts("    ERROR @ Data0");}
+  if (HW8_REG(base_addr +0x01) != 0x87) {err_code |= (1<<4); puts("    ERROR @ Data1");}
+  if (HW8_REG(base_addr +0x02) != 0xED) {err_code |= (1<<4); puts("    ERROR @ Data2");}
+  if (HW8_REG(base_addr +0x03) != 0xCB) {err_code |= (1<<4); puts("    ERROR @ Data3");}
+  if (HW8_REG(base_addr +0x04) != 0xCC) {err_code |= (1<<4); puts("    ERROR @ Data4");}
+  if (HW8_REG(base_addr +0x05) != 0x55) {err_code |= (1<<4); puts("    ERROR @ Data5");}
+  if (HW8_REG(base_addr +0x06) != 0xAA) {err_code |= (1<<4); puts("    ERROR @ Data6");}
+  if (HW8_REG(base_addr +0x07) != 0x33) {err_code |= (1<<4); puts("    ERROR @ Data7");}
+  if (HW8_REG(base_addr +0x08) != 0x78) {err_code |= (1<<4); puts("    ERROR @ Data8");}
+  if (HW8_REG(base_addr +0x09) != 0x9A) {err_code |= (1<<4); puts("    ERROR @ Data9");}
+  if (HW8_REG(base_addr +0x0A) != 0x00) {err_code |= (1<<4); puts("    ERROR @ DataA");}
+  if (HW8_REG(base_addr +0x0B) != 0xFF) {err_code |= (1<<4); puts("    ERROR @ DataB");}
+  if (HW8_REG(base_addr +0x0C) != 0x43) {err_code |= (1<<4); puts("    ERROR @ DataC");}
+  if (HW8_REG(base_addr +0x0D) != 0x21) {err_code |= (1<<4); puts("    ERROR @ DataD");}
+  if (HW8_REG(base_addr +0x0E) != 0x66) {err_code |= (1<<4); puts("    ERROR @ DataE");}
+  if (HW8_REG(base_addr +0x0F) != 0x55) {err_code |= (1<<4); puts("    ERROR @ DataF");}
+
+  if (err_code != 0) {
+    printf ("ERROR : APB4 eg slave access failed (0x%x)\n", err_code);
+    return_val=1;
+
+    err_code = 0;
+    }
+  return(return_val);
+
+}
+// -----------------------------------------------------------
+// Check the access to APB3 example slave
+// -----------------------------------------------------------
+int check_apb3_eg_slave(unsigned long base_addr)
+{
+  const char apb3_id[12] = {0x04, 0x00, 0x00, 0x00,
+                            0x18, 0xB8, 0x1B, 0x00,
+                            0x0D, 0xF0, 0x05, 0xB1};
+  int return_val=0;
+  int err_code=0;
+  int i;
+
+  puts ("Checking APB3 Example slave");
+  // -------------------------
+  puts ("- check ID values");
+  for (i=0; i<12; i++) {
+    if (HW32_REG(base_addr + 0xFD0 + 4*i) != apb3_id[i]) {
+      printf ("    ID [%d] ERROR : expected %x, actual %x\n", i, apb3_id[i], HW32_REG(base_addr + 0xFD0 + 4*i));
+      err_code = err_code | 0x1;
+      }
+    }
+  // -------------------------
+  puts ("- initial data values");
+  for (i=0; i<4; i++) {
+    printf ("    Data[%d] = %x\n", i, HW32_REG(ADDR_BASE_APB3_EG_SLAVE + 4*i));
+    }
+
+  puts ("- check R/W in word size");
+
+  HW32_REG(base_addr      ) = 0x12345678;
+  HW32_REG(base_addr +0x04) = 0x55CC33AA;
+  HW32_REG(base_addr +0x08) = 0xFF008765;
+  HW32_REG(base_addr +0x0C) = 0x99AABCDE;
+
+  if (HW32_REG(base_addr      ) != 0x12345678) {err_code |= (1<<2); puts("    ERROR @ Data0");}
+  if (HW32_REG(base_addr +0x04) != 0x55CC33AA) {err_code |= (1<<2); puts("    ERROR @ Data1");}
+  if (HW32_REG(base_addr +0x08) != 0xFF008765) {err_code |= (1<<2); puts("    ERROR @ Data2");}
+  if (HW32_REG(base_addr +0x0C) != 0x99AABCDE) {err_code |= (1<<2); puts("    ERROR @ Data3");}
+
+
+
+  if (err_code != 0) {
+    printf ("ERROR : APB3 eg slave access failed (0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+  return(return_val);
+
+}
+// -----------------------------------------------------------
+// Check the access to AHB example slave
+// -----------------------------------------------------------
+int check_ahb_eg_slave(unsigned long base_addr)
+{
+  const char ahb_id[12] = {0x04, 0x00, 0x00, 0x00,
+                           0x17, 0xB8, 0x1B, 0x00,
+                           0x0D, 0xF0, 0x05, 0xB1};
+  int return_val=0;
+  int err_code=0;
+  int i;
+
+  puts ("Checking AHB Example slave");
+  // -------------------------
+  puts ("- check ID values");
+  for (i=0; i<12; i++) {
+    if (HW32_REG(base_addr + 0xFD0 + 4*i) != ahb_id[i]) {
+      printf ("    ID [%d] ERROR : expected %x, actual %x\n", i, ahb_id[i], HW32_REG(base_addr + 0xFD0 + 4*i));
+      err_code = err_code | 0x1;
+      }
+    }
+  // -------------------------
+  puts ("- initial data values");
+  for (i=0; i<4; i++) {
+    printf ("    Data[%d] = %x\n", i, HW32_REG(ADDR_BASE_AHB_EG_SLAVE + 4*i));
+    }
+
+  puts ("- check R/W in word size");
+
+  HW32_REG(base_addr      ) = 0x12345678;
+  HW32_REG(base_addr +0x04) = 0x55CC33AA;
+  HW32_REG(base_addr +0x08) = 0xFF008765;
+  HW32_REG(base_addr +0x0C) = 0x99AABCDE;
+
+  if (HW32_REG(base_addr      ) != 0x12345678) {err_code |= (1<<2); puts("    ERROR @ Data0");}
+  if (HW32_REG(base_addr +0x04) != 0x55CC33AA) {err_code |= (1<<2); puts("    ERROR @ Data1");}
+  if (HW32_REG(base_addr +0x08) != 0xFF008765) {err_code |= (1<<2); puts("    ERROR @ Data2");}
+  if (HW32_REG(base_addr +0x0C) != 0x99AABCDE) {err_code |= (1<<2); puts("    ERROR @ Data3");}
+
+
+  puts ("- check R/W in halfword size");
+
+  HW16_REG(base_addr      ) = 0xA987;
+  HW16_REG(base_addr +0x02) = 0xEDCB;
+  HW16_REG(base_addr +0x04) = 0xCC55;
+  HW16_REG(base_addr +0x06) = 0xAA33;
+  HW16_REG(base_addr +0x08) = 0x789A;
+  HW16_REG(base_addr +0x0A) = 0x00FF;
+  HW16_REG(base_addr +0x0C) = 0x4321;
+  HW16_REG(base_addr +0x0E) = 0x6655;
+
+  if (HW16_REG(base_addr      ) != 0xA987) {err_code |= (1<<3); puts("     ERROR @ Data0");}
+  if (HW16_REG(base_addr +0x02) != 0xEDCB) {err_code |= (1<<3); puts("     ERROR @ Data1");}
+  if (HW16_REG(base_addr +0x04) != 0xCC55) {err_code |= (1<<3); puts("     ERROR @ Data2");}
+  if (HW16_REG(base_addr +0x06) != 0xAA33) {err_code |= (1<<3); puts("     ERROR @ Data3");}
+  if (HW16_REG(base_addr +0x08) != 0x789A) {err_code |= (1<<3); puts("     ERROR @ Data4");}
+  if (HW16_REG(base_addr +0x0A) != 0x00FF) {err_code |= (1<<3); puts("     ERROR @ Data5");}
+  if (HW16_REG(base_addr +0x0C) != 0x4321) {err_code |= (1<<3); puts("     ERROR @ Data6");}
+  if (HW16_REG(base_addr +0x0E) != 0x6655) {err_code |= (1<<3); puts("     ERROR @ Data7");}
+
+  puts ("- check R/W in byte size");
+
+  HW8_REG(base_addr     ) = 0xA9;  // swap upper and lower byte
+  HW8_REG(base_addr +0x01) = 0x87;
+  HW8_REG(base_addr +0x02) = 0xED;
+  HW8_REG(base_addr +0x03) = 0xCB;
+  HW8_REG(base_addr +0x04) = 0xCC;
+  HW8_REG(base_addr +0x05) = 0x55;
+  HW8_REG(base_addr +0x06) = 0xAA;
+  HW8_REG(base_addr +0x07) = 0x33;
+  HW8_REG(base_addr +0x08) = 0x78;
+  HW8_REG(base_addr +0x09) = 0x9A;
+  HW8_REG(base_addr +0x0A) = 0x00;
+  HW8_REG(base_addr +0x0B) = 0xFF;
+  HW8_REG(base_addr +0x0C) = 0x43;
+  HW8_REG(base_addr +0x0D) = 0x21;
+  HW8_REG(base_addr +0x0E) = 0x66;
+  HW8_REG(base_addr +0x0F) = 0x55;
+
+  if (HW8_REG(base_addr      ) != 0xA9) {err_code |= (1<<4); puts("    ERROR @ Data0");}
+  if (HW8_REG(base_addr +0x01) != 0x87) {err_code |= (1<<4); puts("    ERROR @ Data1");}
+  if (HW8_REG(base_addr +0x02) != 0xED) {err_code |= (1<<4); puts("    ERROR @ Data2");}
+  if (HW8_REG(base_addr +0x03) != 0xCB) {err_code |= (1<<4); puts("    ERROR @ Data3");}
+  if (HW8_REG(base_addr +0x04) != 0xCC) {err_code |= (1<<4); puts("    ERROR @ Data4");}
+  if (HW8_REG(base_addr +0x05) != 0x55) {err_code |= (1<<4); puts("    ERROR @ Data5");}
+  if (HW8_REG(base_addr +0x06) != 0xAA) {err_code |= (1<<4); puts("    ERROR @ Data6");}
+  if (HW8_REG(base_addr +0x07) != 0x33) {err_code |= (1<<4); puts("    ERROR @ Data7");}
+  if (HW8_REG(base_addr +0x08) != 0x78) {err_code |= (1<<4); puts("    ERROR @ Data8");}
+  if (HW8_REG(base_addr +0x09) != 0x9A) {err_code |= (1<<4); puts("    ERROR @ Data9");}
+  if (HW8_REG(base_addr +0x0A) != 0x00) {err_code |= (1<<4); puts("    ERROR @ DataA");}
+  if (HW8_REG(base_addr +0x0B) != 0xFF) {err_code |= (1<<4); puts("    ERROR @ DataB");}
+  if (HW8_REG(base_addr +0x0C) != 0x43) {err_code |= (1<<4); puts("    ERROR @ DataC");}
+  if (HW8_REG(base_addr +0x0D) != 0x21) {err_code |= (1<<4); puts("    ERROR @ DataD");}
+  if (HW8_REG(base_addr +0x0E) != 0x66) {err_code |= (1<<4); puts("    ERROR @ DataE");}
+  if (HW8_REG(base_addr +0x0F) != 0x55) {err_code |= (1<<4); puts("    ERROR @ DataF");}
+
+  if (err_code != 0) {
+    printf ("ERROR : AHB eg slave access failed (0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+  return(return_val);
+
+}
+
+// -----------------------------------------------------------
+// Check the access to AHB trickbox slave
+// -----------------------------------------------------------
+int check_ahb_tb_slave(unsigned long base_addr)
+{
+  int return_val=0;
+  int err_code=0;
+  int i;
+
+  puts ("Checking AHB Trickbox slave");
+
+  // First four words are the same data registers with different wait states
+  puts ("- check R/W in word size");
+  HW32_REG(base_addr      ) = 0x12345678;
+  if (HW32_REG(base_addr      ) != 0x12345678) {err_code |= (1<<0); puts("    ERROR @ Data0");}
+  HW32_REG(base_addr +0x04) = 0x55CC33AA;
+  if (HW32_REG(base_addr +0x04) != 0x55CC33AA) {err_code |= (1<<0); puts("    ERROR @ Data1");}
+  HW32_REG(base_addr +0x08) = 0xFF008765;
+  if (HW32_REG(base_addr +0x08) != 0xFF008765) {err_code |= (1<<0); puts("    ERROR @ Data2");}
+  HW32_REG(base_addr +0x0C) = 0x99AABCDE;
+  if (HW32_REG(base_addr +0x0C) != 0x99AABCDE) {err_code |= (1<<0); puts("    ERROR @ Data3");}
+
+  puts ("- check R/W in half word size");
+  HW16_REG(base_addr      ) = 0xA987;
+  if (HW16_REG(base_addr      ) != 0xA987) {err_code |= (1<<1); puts("    ERROR @ Data0");}
+  HW16_REG(base_addr +0x02) = 0xEDCB;
+  if (HW16_REG(base_addr +0x02) != 0xEDCB) {err_code |= (1<<1); puts("    ERROR @ Data1");}
+  HW16_REG(base_addr +0x04) = 0xCC55;
+  if (HW16_REG(base_addr +0x04) != 0xCC55) {err_code |= (1<<1); puts("    ERROR @ Data2");}
+  HW16_REG(base_addr +0x06) = 0xAA33;
+  if (HW16_REG(base_addr +0x06) != 0xAA33) {err_code |= (1<<1); puts("    ERROR @ Data3");}
+  HW16_REG(base_addr +0x08) = 0x789A;
+  if (HW16_REG(base_addr +0x08) != 0x789A) {err_code |= (1<<1); puts("    ERROR @ Data4");}
+  HW16_REG(base_addr +0x0A) = 0x00FF;
+  if (HW16_REG(base_addr +0x0A) != 0x00FF) {err_code |= (1<<1); puts("    ERROR @ Data5");}
+  HW16_REG(base_addr +0x0C) = 0x4321;
+  if (HW16_REG(base_addr +0x0C) != 0x4321) {err_code |= (1<<1); puts("    ERROR @ Data6");}
+  HW16_REG(base_addr +0x0E) = 0x6655;
+  if (HW16_REG(base_addr +0x0E) != 0x6655) {err_code |= (1<<1); puts("    ERROR @ Data7");}
+
+  puts ("- check R/W in byte size");
+  HW8_REG(base_addr     ) = 0xA9;  // swap upper and lower byte
+  if (HW8_REG(base_addr      ) != 0xA9) {err_code |= (1<<2); puts("    ERROR @ Data0");}
+  HW8_REG(base_addr +0x01) = 0x87;
+  if (HW8_REG(base_addr +0x01) != 0x87) {err_code |= (1<<2); puts("    ERROR @ Data1");}
+  HW8_REG(base_addr +0x02) = 0xED;
+  if (HW8_REG(base_addr +0x02) != 0xED) {err_code |= (1<<2); puts("    ERROR @ Data2");}
+  HW8_REG(base_addr +0x03) = 0xCB;
+  if (HW8_REG(base_addr +0x03) != 0xCB) {err_code |= (1<<2); puts("    ERROR @ Data3");}
+  HW8_REG(base_addr +0x04) = 0xCC;
+  if (HW8_REG(base_addr +0x04) != 0xCC) {err_code |= (1<<2); puts("    ERROR @ Data4");}
+  HW8_REG(base_addr +0x05) = 0x55;
+  if (HW8_REG(base_addr +0x05) != 0x55) {err_code |= (1<<2); puts("    ERROR @ Data5");}
+  HW8_REG(base_addr +0x06) = 0xAA;
+  if (HW8_REG(base_addr +0x06) != 0xAA) {err_code |= (1<<2); puts("    ERROR @ Data6");}
+  HW8_REG(base_addr +0x07) = 0x33;
+  if (HW8_REG(base_addr +0x07) != 0x33) {err_code |= (1<<2); puts("    ERROR @ Data7");}
+  HW8_REG(base_addr +0x08) = 0x78;
+  if (HW8_REG(base_addr +0x08) != 0x78) {err_code |= (1<<2); puts("    ERROR @ Data8");}
+  HW8_REG(base_addr +0x09) = 0x9A;
+  if (HW8_REG(base_addr +0x09) != 0x9A) {err_code |= (1<<2); puts("    ERROR @ Data9");}
+  HW8_REG(base_addr +0x0A) = 0x00;
+  if (HW8_REG(base_addr +0x0A) != 0x00) {err_code |= (1<<2); puts("    ERROR @ DataA");}
+  HW8_REG(base_addr +0x0B) = 0xFF;
+  if (HW8_REG(base_addr +0x0B) != 0xFF) {err_code |= (1<<2); puts("    ERROR @ DataB");}
+  HW8_REG(base_addr +0x0C) = 0x43;
+  if (HW8_REG(base_addr +0x0C) != 0x43) {err_code |= (1<<2); puts("    ERROR @ DataC");}
+  HW8_REG(base_addr +0x0D) = 0x21;
+  if (HW8_REG(base_addr +0x0D) != 0x21) {err_code |= (1<<2); puts("    ERROR @ DataD");}
+  HW8_REG(base_addr +0x0E) = 0x66;
+  if (HW8_REG(base_addr +0x0E) != 0x66) {err_code |= (1<<2); puts("    ERROR @ DataE");}
+  HW8_REG(base_addr +0x0F) = 0x55;
+  if (HW8_REG(base_addr +0x0F) != 0x55) {err_code |= (1<<2); puts("    ERROR @ DataF");}
+
+
+  puts ("- check read to 0x010 to 0x0FF");
+  // address 0x010 to 0x0FF returns HADDR[7:0]
+  //
+  for (i=0x10;i<0x40;i=i+4){  // Higher address values will result in time out
+    if (HW32_REG(base_addr + i) != i) {
+      err_code |= (1<<3);
+      printf ("  ERROR: %x, return %x\n", i, HW32_REG(base_addr + i));
+      }
+    }
+
+  // address 0x040 and above results in timeout
+  // Note:to reduce simulation time not all addresses are tested
+  puts ("- offset 0x040 and above results in timeout");
+  for (i=0x40;i<0xFF;i=i+28){  // Higher address values will result in time out
+    hardfault_occurred = 0;
+    hardfault_expected = 1;
+    temp_data = address_test_read(base_addr + i);
+
+    if (hardfault_occurred ==0) {
+      err_code |= (1<<4);
+      puts ("ERROR: Expected timeout did not take place");
+      }
+    }
+
+  puts ("- offset 0x100 and above results in error response/timeout");
+
+  // address 0x104 to 0x1FF  results in error response
+  // Note:to reduce simulation time not all addresses are tested
+  for (i=0x104;i<0x180;i=i+20){  // Higher address values will result in time out
+    hardfault_occurred = 0;
+    hardfault_expected = 1;
+    temp_data = address_test_read(base_addr + i);
+
+    if (hardfault_occurred ==0) {
+      err_code |= (1<<5);
+      puts ("ERROR: Expected timeout did not take place");
+      }
+    }
+
+  hardfault_occurred = 0; // reset variables
+  hardfault_expected = 0;
+
+
+  if (err_code != 0) {
+    printf ("ERROR : AHB trickbox slave access failed (0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+  return(return_val);
+
+}
+// -----------------------------------------------------------
+// Check the access to AHB default slave
+// -----------------------------------------------------------
+int check_default_slave(unsigned long base_addr)
+{
+  int return_val=0;
+  int err_code=0;
+
+  temp_data=0;
+  hardfault_occurred = 0;
+  hardfault_expected = 1;
+
+  printf ("- test R/W to %x\n",base_addr);
+  address_test_write(base_addr, 0x3456789A);
+  if (hardfault_occurred==0) {err_code |= (1<<2);}
+  hardfault_occurred = 0;
+
+  temp_data = address_test_read(base_addr);
+  if (hardfault_occurred==0) {err_code |= (1<<3);}
+  hardfault_occurred = 0;
+
+  hardfault_occurred = 0; // reset variables
+  hardfault_expected = 0;
+
+
+  if (err_code != 0) {
+    puts ("ERROR : AHB default slave access failed");
+    return_val=1;
+    err_code = 0;
+    }
+  return(return_val);
+
+}
+
+// -----------------------------------------------------------
+// Functions to handle read/write test with 16-bit memory
+// access instruction for bus fault testing.
+// -----------------------------------------------------------
+
+#if defined ( __CC_ARM   )
+/* Test function for write - for ARM / Keil */
+__asm void address_test_write(unsigned int addr, unsigned int wdata)
+{
+  STR    R1,[R0]
+  DSB    ; Ensure bus fault occurred before leaving this subroutine
+  BX     LR
+}
+
+#else
+/* Test function for write - for gcc */
+void address_test_write(unsigned int addr, unsigned int wdata) __attribute__((naked));
+void address_test_write(unsigned int addr, unsigned int wdata)
+{
+  __asm("  str   r1,[r0]\n"
+        "  dsb          \n"
+        "  bx    lr     \n"
+  );
+}
+#endif
+
+/* Test function for read */
+#if defined ( __CC_ARM   )
+/* Test function for read - for ARM / Keil */
+__asm unsigned int address_test_read(unsigned int addr)
+{
+  LDR    R1,[R0]
+  DSB    ; Ensure bus fault occurred before leaving this subroutine
+  MOVS   R0, R1
+  BX     LR
+}
+#else
+/* Test function for read - for gcc */
+unsigned int  address_test_read(unsigned int addr) __attribute__((naked));
+unsigned int  address_test_read(unsigned int addr)
+{
+  __asm("  ldr   r1,[r0]\n"
+        "  dsb          \n"
+        "  movs  r0, r1 \n"
+        "  bx    lr     \n"
+  );
+}
+#endif
+
+// -----------------------------------------------------------
+// Hard fault handler
+// Divided into two halves:
+//   - assembly part to extract stack frame starting location
+//   - C handler part to carry out processing and checks
+// -----------------------------------------------------------
+
+#if defined ( __CC_ARM   )
+/* ARM or Keil toolchain */
+__asm void HardFault_Handler(void)
+{
+  MOVS   r0, #4
+  MOV    r1, LR
+  TST    r0, r1
+  BEQ    stacking_used_MSP
+  MRS    R0, PSP ; // first parameter - stacking was using PSP
+  B      get_LR_and_branch
+stacking_used_MSP
+  MRS    R0, MSP ; // first parameter - stacking was using MSP
+get_LR_and_branch
+  MOV    R1, LR  ; // second parameter is LR current value
+  LDR    R2,=__cpp(HardFault_Handler_c)
+  BX     R2
+}
+#else
+/* gcc toolchain */
+void HardFault_Handler(void) __attribute__((naked));
+void HardFault_Handler(void)
+{
+  __asm("  movs   r0,#4\n"
+        "  mov    r1,lr\n"
+        "  tst    r0,r1\n"
+        "  beq    stacking_used_MSP\n"
+        "  mrs    r0,psp\n" /*  first parameter - stacking was using PSP */
+        "  ldr    r1,=HardFault_Handler_c  \n"
+        "  bx     r1\n"
+        "stacking_used_MSP:\n"
+        "  mrs    r0,msp\n" /*  first parameter - stacking was using PSP */
+        "  ldr    r1,=HardFault_Handler_c  \n"
+        "  bx     r1\n"
+        ".pool\n" );
+}
+
+#endif
+/* C part of the fault handler - common between ARM / Keil /gcc */
+void HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value)
+{
+  unsigned int stacked_pc;
+  unsigned int stacked_r0;
+  hardfault_occurred++;
+  if (probe_ext_eg_sys==1) {
+    puts (" - Extended Example System not available.\n - INCLUDE_EXT_SUBSYSTEM variable in rtl_sim/makefile is set to 0\nTest skipped.");
+    UartEndSimulation();
+    return;
+    }
+  puts ("[Hard Fault Handler]");
+  if (hardfault_expected==0) {
+    puts ("ERROR : Unexpected HardFault interrupt occurred.\n");
+    UartEndSimulation();
+    return;
+    }
+  stacked_r0  = ((unsigned long) hardfault_args[0]);
+  stacked_pc  = ((unsigned long) hardfault_args[6]);
+  printf(" - Stacked R0 : 0x%x\n", stacked_r0);
+  printf(" - Stacked PC : 0x%x\n", stacked_pc);
+  /* Modify R0 to a valid address */
+  hardfault_args[0] = (unsigned long) &temp_data;
+
+  return;
+}
+
+
diff --git a/Cortex-M0/nanosoc/software/common/validation/gpio_driver_tests.c b/Cortex-M0/nanosoc/software/common/validation/gpio_driver_tests.c
new file mode 100644
index 0000000..6374c0c
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/validation/gpio_driver_tests.c
@@ -0,0 +1,705 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+  A simple test to check the functionalities of gpio functions in the example device driver.
+*/
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#define ALTMASK 0x2A
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#define ALTMASK 0x2A
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#define ALTMASK 0xF82A
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#define ALTMASK 0xF82A
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "uart_stdout.h"
+#include "CMSDK_driver.h"
+
+/* Random seed used by GPIO_Mask_OP function */
+#define RANDOM_NUMBER 47563745
+
+/* Using ISB instruction to create a three cycles delay */
+#define small_delay  __ISB
+
+volatile int intstatus[16] = { 0 }; /* Detected interrupt operation from GPIO IRQ handler */
+volatile int N = 0;         /* Bit number being test - Data shared between GPIO_IRQ and PORT0_COMB_Handler */
+volatile uint32_t data = 0; /* Previous data in GPIO - Data shared between GPIO_IRQ and PORT0_COMB_Handler */
+
+/* Declare test functions */
+int GPIO_OPEN(void);       /*  tests the CMSDK GPIO output enable driver functions */
+int GPIO_AltFuncEN(void);  /*  tests the CMSDK GPIO Alternate Function driver functions */
+int GPIO_IRQ(void);        /*  tests the CMSDK GPIO IRQ driver functions */
+int GPIO_Mask_OP(void);    /*  tests the CMSDK GPIO Masked Accesses driver functions */
+
+int gpio0_id_check(void);
+int gpio1_id_check(void);
+
+int main (void)
+{
+  int result = 0;
+
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("Cortex Microcontroller System Design Kit - GPIO Driver Test - revision $Revision: 371321 $\n");
+
+  if (gpio0_id_check()!=0) {
+    puts ("GPIO 0 not present. Test skipped.");
+    UartEndSimulation();
+    return 0;}
+  if (gpio1_id_check()!=0) {
+    puts ("GPIO 1 not present. Test skipped.");
+    UartEndSimulation();
+    return 0;}
+
+  result |= GPIO_OPEN();
+  result |= GPIO_AltFuncEN();
+  result |= GPIO_IRQ();
+  result |= GPIO_Mask_OP();
+
+  if(result == 0) {
+    puts("** TEST PASSED **\n");
+  } else {
+    printf("** TEST FAILED **, Error code: (0x%x)\n", result);
+  }
+
+  UartEndSimulation();
+  return result;
+}
+
+/* GPIO ID check functions - detect if part number match expected value.
+   If not, the GPIO might not be available and therefore the test should be skipped.
+*/
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+#define HW8_REG(ADDRESS)   (*((volatile unsigned char  *)(ADDRESS)))
+int gpio0_id_check(void)
+{
+unsigned char gpio_id;
+
+  gpio_id = HW8_REG(CMSDK_GPIO0_BASE  + 0xFE8) & 0x07;
+
+  if ((HW32_REG(CMSDK_GPIO0_BASE + 0xFE0) != 0x20) ||
+      (HW32_REG(CMSDK_GPIO0_BASE + 0xFE4) != 0xB8) ||
+      (gpio_id != 0x03))
+    return 1; /* part ID & ARM ID does not match */
+  else
+    return 0;
+}
+int gpio1_id_check(void)
+{
+unsigned char gpio_id;
+
+  gpio_id = HW8_REG(CMSDK_GPIO1_BASE  + 0xFE8) & 0x07;
+
+  if ((HW32_REG(CMSDK_GPIO1_BASE + 0xFE0) != 0x20) ||
+      (HW32_REG(CMSDK_GPIO1_BASE + 0xFE4) != 0xB8) ||
+      (gpio_id != 0x03))
+    return 1; /* part ID & ARM ID does not match */
+  else
+    return 0;
+}
+
+/* GPIO_OPEN - This function tests the CMSDK GPIO output enable driver functions
+  - Set Output enable (OUTENABLESET)
+    - set Dataout to 0x0, due to the simulation pull up resistors,
+      read back value is 0xFFFF when all the Output Enable control bits
+      are not set.
+    - for each pin on the port set the OUTENABLE, each in turn and check the status of the register
+    - if the OUTENABLE for the specified pin is incorrect then change err_code
+    - this will set the value of the specified pin to 0, keep 0 value for subsequent pin tests
+    - if the Data-in for the port is incorrect then change err_code
+    - else test passed for specified pin
+    - if all pins pass, test passes
+
+  - Clear Alternate Function (OUTENABLECLR)
+    - using the current value of the Outen register all Outens will be cleared
+    - for each pin on the port clear the OUTENABLE, each in turn and check the status of the register
+    - if the OUTENABLE for the specified pin is incorrect then change err_code
+    - if the Data-in for the port is incorrect then change err_code i.e != pins enabled and 0xFFFF
+    - else test passed for specified pin
+    - if the OUTENABLE register is cleared then the test is classed as passed
+    */
+
+int GPIO_OPEN(void)       /*output enable function*/
+{
+  int err_code = 0;
+  uint32_t i = 0;
+  uint32_t mask = 0;
+
+  puts("Stage 1 - GPIO Output Enable Test\n");
+
+  puts("- Stage 1a - Set GPIO Output Enable\n");
+
+  /* Test sequence :
+  Data output is set to 0x0000. Since output enable is 0x0000 by default,
+  the actual I/O port status is determined by external pull up so it is
+  0xFFFF at starting.  By enabling output enable bit by bit,
+  the read back value of I/O port data become 0xFFFE, 0xFFFC, 0xFFF8, etc.
+  */
+
+  CMSDK_GPIO0->DATAOUT = 0x0000;     /* set data on all pins to logic 0 for the pull up resistor*/
+
+  for(i = 1; i < 65536; i <<= 1){
+
+    /* enable every pin starting at pin0 to pin15 while keeping the previous ones enabled */
+    /* so that the transition of the output enable register is as follows: 0000 -> 0001 -> 0011 -> 0111 -> 1111 */
+
+    mask |= i; /* mask is the expected value of OUTENABLE */
+    CMSDK_gpio_SetOutEnable(CMSDK_GPIO0, i);    /* set specified bit in out enable register */
+
+    if(CMSDK_gpio_GetOutEnable(CMSDK_GPIO0) != mask) err_code += 1;   /*check if the output enable register is not the*/
+    if(CMSDK_GPIO0->DATA != (0xFFFF & (~mask))) err_code += 1;         /*same as the mask i.e. set up to and including*/
+  }                                                                     /*the bit being set then increment error code */
+
+  /* OUTENABLE should be 0xFFFF */
+  printf("Output Enable Status: 0x%x\n\n", CMSDK_gpio_GetOutEnable(CMSDK_GPIO0));
+  mask = 0;
+
+  if(err_code) printf("Set Enable Test Failed, Error code: (0x%x\n)", err_code);
+  else puts("Set Enable Test Passed\n");
+
+  puts("- Stage 1b - Clear GPIO Output Enable\n");
+
+  for(i = 1; i < 65536; i <<= 1){
+
+    /* disable every pin starting at pin0 to pin15 while keeping the previously disabled ones disabled */
+    /* and previously enabled ones enabled starting at all enabled so that the transition of the output*/
+    /* enable register is as follows: 1111 -> 1110 -> 1100 -> 1000 -> 0000 */
+
+    mask |= i;
+    CMSDK_gpio_ClrOutEnable(CMSDK_GPIO0, i);  /*clear specified bit in out enable register*/
+
+    if(~(CMSDK_gpio_GetOutEnable(CMSDK_GPIO0) | 0xFFFF0000) != mask)  /*check if the output enable register is not the*/
+      err_code += 1;                                                    /*same as the mask i.e. clear up to and including*/
+    if(CMSDK_GPIO0->DATA != (0xFFFF & mask))                           /*the bit being set then increment error code */
+      err_code += 1;
+  }
+
+  printf("Output Enable Status: 0x%x\n\n", CMSDK_gpio_GetOutEnable(CMSDK_GPIO0));
+
+  if(err_code) printf("Clear Output Enable Test Failed, Error code: (0x%x)\n", err_code);
+  else puts("Clear Output Enable Test Passed\n");
+
+  if(!err_code) return 0;
+  else return 1;
+}
+
+/* GPIO_AltFuncEN - This function tests the CMSDK GPIO Alternate Function driver functions
+  GPIO Port 1 is used for this test because GPIO pins in port 0 are not shared (AltFunc not implemented).
+  - Set Alternate Function (AltFunc)
+    - clear the alternate function register for all pins including TX2 (TUBE for puts)
+    - for each pin on the port set the AltFunc, each in turn and check the status of the register
+    - if the AltFunc for the specified pin is incorrect then change err_code
+    - else test passed for specified pin
+    - if the AltFunc register is set to 0x2A (M0) or 0xF82A (M3) then the test is classed as passed
+    - NOTE: it is these exact combinations as only AltFunc outputs can be set in the AltFunc register
+            as inputs have no effect as they are just routed to two places and pins without an AltFunc
+            the value is not affected so is zero constantly
+  - Clear Alternate Function (AltFunc)
+    - using the current vale of the AltFunc register all AltFuncs will be cleared apart for vital ones
+    - for each pin on the port clear the AltFunc, each in turn and check the status of the register
+    - if the AltFunc for the specified pin is incorrect then change err_code unless it is TX2 as this
+      is used for stdout so must remain set
+    - else test passed for specified pin
+    - if the AltFunc register is set to 0x20 (TX2 - pin 5) then the test is classed as passed
+    */
+
+int GPIO_AltFuncEN(void)
+{
+  int err_code = 0;
+  uint32_t i = 0;
+  uint32_t mask = 0;
+
+  puts("Stage 2 - GPIO Alternative Function Enable Test\n");
+
+  puts("- Stage 2a - Set GPIO Alternative Function Enable\n");
+
+  CMSDK_gpio_ClrAltFunc(CMSDK_GPIO1, 0xFFFF);         /* Clear alternate function on all GPIO Port 1 pins to zero */
+
+  for(i = 1; i < 65536; i <<= 1){
+
+  //Set alternate function on all GPIO Port 1 pins which have an alternate function output port
+  //will not affect those with either no alternate function or those which the pin is an input for
+  //the alternate function so when read back the value with all alternate function is 0x2A for M0
+  //and 0xf82A for M3, because the only pins that the alternate function affects is the UART
+  //TX0 (pin 1), TX1 (pin 3), TX2 (pin 5)
+
+    mask |= i;
+    CMSDK_gpio_SetAltFunc(CMSDK_GPIO1, i);                     //set alternate function register for the specified bit
+    if(CMSDK_gpio_GetAltFunc(CMSDK_GPIO1) != (ALTMASK & mask)) /*check if the AltFunc register is not the same as the*/
+      err_code += i;                                             /*AltFunc mask i.e. all pins which have one, up to and including*/
+  }                                                              /*the bit being set then if not increment error code */
+
+  printf("\nAlternate Function Enable Status: 0x%x\n\n", CMSDK_gpio_GetAltFunc(CMSDK_GPIO1));
+
+  if(err_code) printf("Set Enable Test Failed, Error code: (0x%x\n)", err_code);
+  else puts("Set Enable Test Passed\n");    //if the port did not set the AltFunc as expected display error*/
+
+  puts("- Stage 2b - Clear GPIO Alternative Function Enable\n");
+
+  mask = 0;
+
+  for(i = 1; i < 65536; i <<= 1){
+
+    /* Clear AltFunc bit by bit apart from bit 5 for stdout */
+
+    //Clear alternate function on all GPIO Port 1 pins which have an alternate function output port
+    //will not affect those with either no alternate function or those which the pin is an input for
+    //the alternate function so when read back the value with all alternate function is 0x20 for M0
+    //and M3 because must leave the TX2 enabled for the TUBE
+
+    mask |= i;
+
+    /*clear alternate function register for the specified bit except for UART2 TX for tube*/
+
+    CMSDK_gpio_ClrAltFunc(CMSDK_GPIO1, i & (~0x20));
+
+    if(CMSDK_gpio_GetAltFunc(CMSDK_GPIO1) != ((ALTMASK & (~mask )) | 0x20)) /*check if the AltFunc register is not the same as the*/
+      err_code += i;                                                        /*AltFunc mask i.e. all pins which have one, up to and including*/
+                                                                            /*the bit being set then if not increment error code */
+  }
+
+  printf("Alternate Function Enable Status: 0x%x\n\n", CMSDK_gpio_GetAltFunc(CMSDK_GPIO1)); /*display Port's AltFunc Setting*/
+
+  if(err_code) printf("Clear Enable Test Failed, Error code: (0x%x)\n", err_code);
+  else puts("Clear Enable Test Passed\n");  /*if the port did not clear the AltFunc as expected display error*/
+
+  if(!err_code) return 0;
+  else return 2;
+}
+
+/* GPIO_IRQ - This function tests the CMSDK GPIO IRQ driver functions
+
+  - Test High level IRQ
+    - Set DataOut to 0x0000 ready for high level test
+    - Enable all pins as output
+    - Set all pins as a high level interrupt and clear all pending IRQs
+    - Global enable (NVIC) the interrupts on the port
+    - for each pin on the port enable the CMSDK GPIO interrupt for that pin then set the Dataout on the specified pin high
+    - Check the inten register for the specified pin to check that it's set
+    - in ISR, record what type of interrupt it's meant to be according to the intpol and inttype registers
+    - if either the inten, intpol or inttype are incorrect then change err_code
+    - else test passed for specified pin
+    - if test on each pin passes the test as a whole passes and return 0 to main
+    - else return an error
+
+  - Test Rising Edge IRQ
+    - Set DataOut to 0x0000 ready for rising edge test
+    - Set all pins as a Rising Edge interrupt and clear all pending IRQs
+    - for each pin on the port enable the CMSDK GPIO interrupt for that pin
+    - set the Dataout on the specified pin high and keep high for subsequent pin tests (so can move on to falling edge tests)
+    - Check the inten register for the specified pin to check that it's set
+    - in ISR, record what type of interrupt it's meant to be according to the intpol and inttype registers
+    - if either the inten, intpol or inttype are incorrect then change err_code
+    - else test passed for specified pin
+    - if test on each pin passes the test as a whole passes and return 0 to main
+    - else return an error
+
+  - Test Falling Edge IRQ
+    - DataOut is already set to 0xFFFF from rising edge test
+    - Set all pins as a Falling Edge interrupt and clear all pending IRQs
+    - for each pin on the port enable the CMSDK GPIO interrupt for that pin
+    - set the Dataout on the specified pin low and keep low for subsequent pin tests
+    - Check the inten register for the specified pin to check that it's set
+    - in ISR, record what type of interrupt it's meant to be according to the intpol and inttype registers
+    - if either the inten, intpol or inttype are incorrect then change err_code
+    - else test passed for specified pin
+    - if test on each pin passes the test as a whole passes and return 0 to main
+    - else return an error
+
+  - Test Low level IRQ
+    - Set DataOut to 0xFFFF ready for low level test
+    - Enable all pins as output
+    - Set all pins as a low level interrupt and clear all pending IRQs
+    - for each pin, in turn, on the port enable the CMSDK GPIO interrupt for that pin
+    - set the Dataout on the specified pin low whilst the interrupts are enabled then back high before clearing it
+    - Check the inten register for the specified pin to check that it's set
+    - in ISR, record what type of interrupt it's meant to be according to the intpol and inttype registers
+    - if either the inten, intpol or inttype are incorrect then change err_code
+    - else test passed for specified pin
+    - if test on each pin passes the test as a whole passes and return 0 to main
+    - else return an error
+    */
+
+int GPIO_IRQ(void)
+{
+  uint32_t err_code = 0, return_val = 0;
+  int i = 0;
+  int irq_counter = 0;
+
+  puts("Stage 3 - GPIO Pin IRQ Test\n");
+
+  puts("- Stage 3a - GPIO High Level IRQ Test\n");
+
+  CMSDK_GPIO0->DATAOUT = 0x0000;                         //set data out to 0 to test high level IRQ
+  CMSDK_gpio_SetOutEnable(CMSDK_GPIO0, 0xFFFF);         //set output enable to output on all ports of GPIO 0
+
+  for(i = 0; i < 16; i++)
+  {
+    CMSDK_gpio_SetIntHighLevel(CMSDK_GPIO0, i);         //set all pins to high level interrupt and clear any
+    CMSDK_gpio_IntClear(CMSDK_GPIO0, i);                //outstanding set interrupts
+  }
+
+  NVIC_ClearPendingIRQ(PORT0_ALL_IRQn);                   //clear all global NVIC PORT0 pending interrupts
+
+  NVIC_EnableIRQ(PORT0_ALL_IRQn);                         //enable NVIC interrupts on PORT0
+
+  for(i = 0; i < 16; i++){
+
+    CMSDK_gpio_SetIntEnable(CMSDK_GPIO0, i);            //enable interrupt for the pin to be tested
+
+    if(!((CMSDK_GPIO0->INTENSET) & (1 << i))) err_code = (1 << (2*i));//check to see if the interrupt enable register is
+                                                                      //set for the pin which it should have just been
+    N = i;
+
+    CMSDK_GPIO0->DATAOUT = (0x0001 << i);                //set data out on pin0 high to cause a high level interrupt
+                                                          //repeat for all other pins 0001 -> 0010 -> 0100 -> 1000
+    CMSDK_gpio_ClrIntEnable(CMSDK_GPIO0, i );           /*clear interrupt enable*/
+
+    if((CMSDK_GPIO0->INTENSET) & ~(1 << i)) err_code = (1 << (2*i +1));//check to see if the interrupt enable register is
+                                                                        //clear for the pin which it should have just been
+
+    /* check to see whether intstatus, for the specified pin, is 2, which corresponds to a high level interrupt */
+
+    if(intstatus[i] == 2) irq_counter++;
+    else err_code |= (1 << i);
+  }
+
+  if((irq_counter == 16) && (err_code == 0)) puts("High Level IRQ Tests Passed Successfully\n");
+  else{
+    printf("\nHigh Level IRQ Tests Failed, Error Code: (0x%x)\n", err_code);
+    err_code = 0;       /*if the port did not have 1 HL IRQ for each pin as expected then display error*/
+    return_val = 8;
+  }
+
+  puts("- Stage 3b - GPIO Rising Edge IRQ Test\n");
+
+  irq_counter = 0;
+
+  CMSDK_GPIO0->DATAOUT = 0x0000;   //set data out to 0 to test rising edge IRQ
+
+  for(i = 0; i < 16; i++) CMSDK_gpio_SetIntRisingEdge(CMSDK_GPIO0, i); //set all pins to rising edge interrupts
+
+  for(i = 0; i < 16; i++){
+
+    CMSDK_gpio_SetIntEnable(CMSDK_GPIO0, i);    //enable interrupts on specified pin then set data out to 1
+                                                  //for pin 0 then repeat for all subsequent pins whilst still
+
+    if(!((CMSDK_GPIO0->INTENSET) & (1 << i))) err_code = (1 <<(2*i));//check to see if the interrupt enable register is
+                                                                      //set for the pin which it should have just been
+    N = i;
+
+    CMSDK_GPIO0->DATAOUT = (0x0001 << i) | CMSDK_GPIO0->DATA; //keeping all other pins high 0000->0001->0011->0111->1111
+
+    CMSDK_gpio_ClrIntEnable(CMSDK_GPIO0, i);                     //clear interrupt enable for specified pin
+
+    if((CMSDK_GPIO0->INTENSET) & ~(1 << i)) err_code = (1 <<(2*i + 1));//check to see if the interrupt enable register is
+                                                                        //clear for the pin which it should have just been
+
+    /* check to see whether intstatus, for the specified pin, is 1, which corresponds to a rising edge interrupt */
+
+    if(intstatus[i] == 1) irq_counter++;
+    else err_code |= (1 << i);
+  }
+
+  if((irq_counter == 16) && (err_code == 0)) puts("Rising Edge IRQ Tests Passed Successfully\n");
+  else{
+    printf("\nRising Edge IRQ Tests Failed, Error Code: (0x%x\n", err_code);
+    err_code = 0;     /*if the port did not have 1 RE IRQ for each pin as expected then display error*/
+    return_val = 16;
+  }
+
+  puts("- Stage 3c - GPIO Falling Edge IRQ Test\n");
+
+  irq_counter = 0;
+
+  CMSDK_GPIO0->DATAOUT = 0xFFFF;
+
+  for(i = 0; i < 16; i++) CMSDK_gpio_SetIntFallingEdge(CMSDK_GPIO0, i);   //set all pins to falling edge interrupts
+
+  for(i = 0; i  < 16; i++){
+
+    /* Counter change from 0->1->2 ...15 */
+
+    CMSDK_gpio_SetIntEnable(CMSDK_GPIO0, i);    //enable interrupts on specified pin then set data out to
+                                                  //0xFFFF and shiftright to cause a falling edge on
+                                                  //pin 15 and then shift each time to cause a falling
+                                                  // edge on pins 14 -> 0 1111 >> 0111 >> 0011 >> 0001 >> 0000
+
+    if(!((CMSDK_GPIO0->INTENSET) & (1 << i)))    //check to see if the interrupt enable register is
+      err_code = (1 << 2*i);                      //set for the pin which it should have just been
+
+    N = i;
+
+    CMSDK_GPIO0->DATAOUT = (CMSDK_GPIO0->DATA  & ~(1 << i));
+
+    CMSDK_gpio_ClrIntEnable(CMSDK_GPIO0, i);    //disable interrupts on specified pin
+
+    if((CMSDK_GPIO0->INTENSET) & ~(1 << i))      //check to see if the interrupt enable register is
+      err_code = (1 << (2*i + 1));                //clear for the pin which it should have just been
+
+    /* check to see whether intstatus, for the specified pin, is 3, which corresponds to a falling edge interrupt */
+
+    if(intstatus[i] == 3) irq_counter++;
+    else err_code |= (1 << i);
+  }
+
+  if((irq_counter == 16) && (err_code == 0)) puts("Falling Edge IRQ Tests Passed Successfully\n");
+  else{
+    printf("\nFalling Edge IRQ Tests Failed, Error Code: (0x%x)\n", err_code);
+    err_code = 0; /*if the port did not have 1 FE IRQ for each pin as expected then display error*/
+    return_val = 32;
+  }
+
+  puts("- Stage 3d - GPIO Low Level IRQ Test\n");
+
+  irq_counter = 0;
+  data = 0xFFFE;
+
+  CMSDK_GPIO0->DATAOUT = 0xFFFF;           //set dataout to all ones ready to test low level interrupts
+
+  for(i = 0; i < 16; i++) CMSDK_gpio_SetIntLowLevel(CMSDK_GPIO0, i);            //set all pins to low level interrupts
+
+  for(i = 0; i < 16; i++){
+
+    CMSDK_gpio_SetIntEnable(CMSDK_GPIO0, i);                          //enable interrupts on specified pin and set the
+                                                                        //data output to 0xFFFF XOR with 1 shifted to the
+    if(!((CMSDK_GPIO0->INTENSET) & (1 << i))) err_code = (1 << (2*i)); //pins position so that just the desired pin is
+                                                                        //set to 0 1111 -> 1110 -> 1101 -> 1011 -> 1111
+    N = i;
+
+    CMSDK_GPIO0->DATAOUT = (0x0001 << i) ^ 0xFFFF;
+
+    CMSDK_gpio_ClrIntEnable(CMSDK_GPIO0, i);                                    //disable interrupts on specified pin
+
+    if((CMSDK_GPIO0->INTENSET) & ~(1 << i))                      //check to see if the interrupt enable register is
+      err_code = (1 << (2*i + 1));                                //clear for the pin which it should have just been
+
+    /* check to see whether intstatus, for the specified pin, is 4, which corresponds to a low level interrupt */
+
+    if(intstatus[i] == 4) irq_counter++;
+    else err_code |= (1 << i);
+  }
+
+  if((irq_counter == 16) && (err_code == 0)) puts("Low Level IRQ Tests Passed Successfully\n");
+  else{
+    printf("\nLow Level IRQ Tests Failed, Error Code: (0x%x)\n\n", err_code);
+    /*if the port did not have 1 LL IRQ for each pin as expected then display error*/
+    return_val = 64;
+  }
+
+  irq_counter = 0;
+
+  NVIC_DisableIRQ(PORT0_ALL_IRQn);                                       //disable all GPIO interrupts on PORT 0
+
+  NVIC_ClearPendingIRQ(PORT0_ALL_IRQn);                                  //clear any outstanding GPIO interrupts
+
+  for(i = 0; i < 16; i++) CMSDK_gpio_IntClear(CMSDK_GPIO0, i);         //clear any outstanding GPIO interrupts
+
+  return return_val;
+}
+
+/* GPIO_Mask_OP - This function tests the CMSDK GPIO Masked Accesses driver functions
+  - Normal test of all 16 pins
+    - Firstly the data output is set to 0x0000 so as to ensure all comparisons are evaluated correctly
+    - write 0xFFFF using masked access with the mask transitioning through the combinations
+      0001->0010->0100->1000
+    - evaluate whether the data outputted are correct i.e. is same as 0xFFFF and mask
+    - if not amend err_code else test passed
+    - clear the current array element corresponding to the mask else the data on the output port will accumulate
+      i.e. mask of 0x0001 and mask of 0x0002 will give a mask of 0x0003.
+
+  - Test of 16 random combinations
+    - seed the random function with the #define RANDOM_NUMBER
+    - use rand to get a number between 0 and 65535
+    - perform masked access using the value 0xFFFF and the random number as the mask
+    - evaluate whether the data outputted is correct i.e. is same as 0xFFFF and random mask
+    - if not amend err_code else test passed
+    - clear the current array element corresponding to the mask else the data on the output port will accumulate
+      i.e. mask of 0x0001 and mask of 0x0002 will give a mask of 0x0003.
+
+  - Test accumulation of masks
+    - write 0xFFFF using masked access with the mask transitioning through the combinations
+      0001->0010->0100->1000 but do not clear after evaluating so that the masked values accumulate
+    - evaluate whether the data outputted is correct i.e. is same as 0xFFFF and the accumulated mask
+    - if not amend err_code else test passed
+
+  - Test accumulation of random masks and random values
+    - gather both a random value and random mask using the rand function
+    - store the random mask so that it can be cleared later
+    - write value using masked access
+    - amend expected value to be seen when the GPIO is read back condition gained from verilog RTL
+      ((DATA[15:8] & mask[9:2])|(existing_data[15:8] & ~mask[9:2]));
+    - repeat with a second random value and mask after the test has been evaluated
+      clear the output port for the previous masks and reset both the previous masks and the expected value
+    - repeat process again until it has occurred 8 times
+*/
+
+int GPIO_Mask_OP(void)
+{
+  int err_code = 0, err_code_all = 0;
+  uint32_t i = 0, random_mask = 0, exp_value = 0, random_value, prev_masks[2] = { 0 }, mask = 0;
+
+
+  CMSDK_gpio_SetOutEnable(CMSDK_GPIO0, 0xFFFF);
+
+  CMSDK_GPIO0->DATAOUT = 0x0000;
+
+  puts("Stage 4 - GPIO Masked Output Test\n");
+
+  puts("- Stage 4a - GPIO Masked Output - Deterministic Test\n");
+
+  for(i = 0; i < 16; i++){
+
+    CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0xFFFF, (1 << i));   //test each pin on the GPIO to check that masked
+    small_delay();                                             //access works for each pin individually
+    if(CMSDK_GPIO0->DATA != (0xFFFF & (1 << i)))
+      err_code |= (1 << i);
+    CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0x0000, (1 << i));   //clear value back to zero
+    small_delay();
+  }
+
+  CMSDK_GPIO0->DATAOUT = 0;
+
+  for(i = 0; i < 16; i++){
+    CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0xFFFF, (1 << i));   //test each pin on the GPIO to check that masked
+    small_delay();                                             //access works for each pin individually
+    mask |= (1 << i);
+    if(CMSDK_GPIO0->DATA != (0xFFFF & mask))                  //test do not reset to ensure that the masked output
+      err_code |= (1 << (i + 16));                             //goes through the transition 0001->0011->0111->1111
+    small_delay();
+  }
+
+  if(!err_code) puts("Stage 4a Deterministic Masked Output Tests Passed Successfully\n");
+  else {
+    printf("\nStage 4a Deterministic Masked Output Tests Failed, Error Code: (0x%x)\n", err_code);
+    err_code_all |= 1;
+    }
+
+  puts("- Stage 4b - GPIO Masked Output - Random Test\n");
+
+  err_code = 0;
+
+  CMSDK_GPIO0->DATAOUT = 0;
+
+  srand(RANDOM_NUMBER);
+
+  for(i = 0; i < 16; i++){                                         //repeat same process but with 16 random mask
+    random_mask = (rand() % 65536);                                //values, the random function is seeded with a
+    CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0xFFFF, random_mask);    //#define at the top of the program called RANDOM_NUMBER
+    if(CMSDK_GPIO0->DATA != (0xFFFF & random_mask))               //can be easily changed to perform tests on 16
+      err_code |= (1 << i);                                 // more different random numbers
+    CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0x0000, random_mask);
+  }
+
+  CMSDK_GPIO0->DATAOUT = 0;
+
+  mask = 0;
+
+  for(i = 0; i < 16; i++){
+                                                            //repeat same process but with 16 random mask values,
+    random_mask = (rand() % 65536);                         //which are only cleared every other iteration so that
+    random_value = (rand() % 65536);                        //they accumulate, the first value is outputted using
+                                                            //masked access and then not cleared then a second value
+    if(prev_masks[0] == 0) prev_masks[0] = random_mask;     //is outputted using another mask and then the resulting
+    else prev_masks[1] = random_mask;                       //output is then checked against the expected output
+
+    exp_value = ((random_mask & random_value) | (exp_value & ~random_mask));
+
+    CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, random_value, random_mask);
+
+    if(CMSDK_GPIO0->DATA != exp_value)
+      err_code |= (1 << (i + 16));
+
+    /* For every two non-zero mask writes taken place,
+    reset the data using the stored mask value and
+    clear the exp_value back to 0 */
+    if((prev_masks[0] != 0) && (prev_masks[1] != 0)){
+      CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0x0000, prev_masks[0]);
+      CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0x0000, prev_masks[1]);
+      prev_masks[0] = 0;
+      prev_masks[1] = 0;
+      exp_value = 0;
+    }
+  }
+
+  if(!err_code) puts("Stage 4b Random Masked Output Tests Passed Successfully\n");
+  else {
+    printf("\nStage 4b Random Masked Output Tests Failed, Error Code: (0x%x)\n", err_code);
+    err_code_all |= 2;
+    }
+
+
+  if(!err_code_all) puts("\nAll Masked Output Tests Passed Successfully\n");
+
+  if(!err_code_all) return 0;
+  else return 4;
+}
+
+//PORT 0 ISR - sets what type of interrupt it is according to the int polarity and type and
+//if the result when checked is the one expected then function will pass the test or fail it, if it's not
+//0 = undefined, 1 = rising edge, 2 = high level, 3 = falling edge, 4 = low level
+
+void PORT0_COMB_Handler(void)
+{
+
+  if((CMSDK_GPIO0->INTPOLSET)){
+    if((CMSDK_GPIO0->INTTYPESET)){
+      if(CMSDK_GPIO0->DATA == ( data |= (1 << N) ))
+        intstatus[N] = 1;                                                 /*rising edge*/
+    }else{
+      if(CMSDK_GPIO0->DATA == (1 << N)){
+        intstatus[N] = 2;                                                   /*high level*/
+        CMSDK_GPIO0->DATAOUT = 0x0000;
+      }
+    }
+  }else{
+    if((CMSDK_GPIO0->INTTYPESET)){
+      if(CMSDK_GPIO0->DATA == (data &= ~(1 << N))) intstatus[N] = 3;       /*falling edge*/
+    }else{
+      if(CMSDK_GPIO0->DATA == 0xFFFF ^ (1 << N)){
+        intstatus[N] = 4;                                                   /*low level*/
+        CMSDK_GPIO0->DATAOUT = 0xFFFF;
+      }
+    }
+  }
+  CMSDK_gpio_IntClear(CMSDK_GPIO0, N);
+}
+
diff --git a/Cortex-M0/nanosoc/software/common/validation/gpio_tests.c b/Cortex-M0/nanosoc/software/common/validation/gpio_tests.c
new file mode 100644
index 0000000..ef3c48a
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/validation/gpio_tests.c
@@ -0,0 +1,2004 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+  A test to check the functionality of the AHB GPIO.
+*/
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#define GPIO1_ALTERNATE_FUNC_MASK     0x002A    /* Implemented bits */
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#define GPIO1_ALTERNATE_FUNC_MASK     0x002A    /* Implemented bits */
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#define GPIO1_ALTERNATE_FUNC_MASK     0xF82A    /* Implemented bits */
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#define GPIO1_ALTERNATE_FUNC_MASK     0xF82A    /* Implemented bits */
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"
+
+/* Alternate function control register mask */
+  /* Implemented bits */
+#define GPIO0_ALTERNATE_FUNC_MASK     0x0000
+  /* Default value */
+#define GPIO0_ALTERNATE_FUNC_DEFAULT  0x0000
+
+  /* Default value */
+#define GPIO1_ALTERNATE_FUNC_DEFAULT  0x0000
+
+/* Macros for word, half word and byte */
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+#define HW16_REG(ADDRESS)  (*((volatile unsigned short *)(ADDRESS)))
+#define HW8_REG(ADDRESS)   (*((volatile unsigned char  *)(ADDRESS)))
+
+/* A trick to add a small delay in program */
+/* small_delay() is the same as __ISB()    */
+#define small_delay  __ISB
+
+/* peripheral and component ID values */
+#define AHB_GPIO_PID4  0x04
+#define AHB_GPIO_PID5  0x00
+#define AHB_GPIO_PID6  0x00
+#define AHB_GPIO_PID7  0x00
+#define AHB_GPIO_PID0  0x20
+#define AHB_GPIO_PID1  0xB8
+#define AHB_GPIO_PID2  0x1B
+#define AHB_GPIO_PID3  0x00
+#define AHB_GPIO_CID0  0x0D
+#define AHB_GPIO_CID1  0xF0
+#define AHB_GPIO_CID2  0x05
+#define AHB_GPIO_CID3  0xB1
+
+
+/* Declare test functions */
+int  gpio_register_rw_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO);
+int  gpio_interrupt_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO);
+int  gpio_masked_access_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO);
+int  gpio_unused_addresses_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO);
+void medium_delay(void);
+int  gpio0_id_check(void);
+int  gpio1_id_check(void);
+
+/* Global variables */
+volatile int gpio0_irq_occurred;
+volatile int gpio1_irq_occurred;
+volatile int gpio0_irq_expected;
+volatile int gpio1_irq_expected;
+volatile int gpio0_irq_level_irq; // indicate it is a level IRQ test
+                                  // Need to toggle interrupt source
+volatile int gpio1_irq_level_irq; // indicate it is a level IRQ test
+                                  // Need to toggle interrupt source
+volatile int multi_irq_test;      // indicate continuous level trigger IRQ test
+
+volatile int counter;
+volatile char gpio0_irq_flags[16];
+
+int main (void)
+{
+  int result=0;
+
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("Cortex Microcontroller System Design Kit - GPIO Test - revision $Revision: 371321 $\n");
+
+  gpio0_irq_occurred = 0;
+  gpio1_irq_occurred = 0;
+  gpio0_irq_expected = 0;
+  gpio1_irq_expected = 0;
+
+  puts("1) GPIO 0");
+
+  if (gpio0_id_check()==0) {
+    /* GPIO 0 present */
+    result += gpio_register_rw_test(CMSDK_GPIO0);
+    result += gpio_interrupt_test(CMSDK_GPIO0);
+    result += gpio_masked_access_test(CMSDK_GPIO0);
+    result += gpio_unused_addresses_test(CMSDK_GPIO0);
+    } else {
+    puts ("- GPIO #0 not present. Tests skipped.");
+    }
+
+  puts("\n2) GPIO 1");
+
+  if (gpio1_id_check()==0) {
+    /* GPIO 1 present */
+    result += gpio_register_rw_test(CMSDK_GPIO1);
+    result += gpio_interrupt_test(CMSDK_GPIO1);
+    result += gpio_masked_access_test(CMSDK_GPIO1);
+    result += gpio_unused_addresses_test(CMSDK_GPIO1);
+    } else {
+    puts ("- GPIO #1 not present. Tests skipped.");
+    }
+
+  if (result==0) {
+    printf ("\n** TEST PASSED **\n");
+  } else {
+    printf ("\n** TEST FAILED **, Error code = (0x%x)\n", result);
+  }
+  UartEndSimulation();
+  return 0;
+}
+
+int gpio0_id_check(void)
+{
+unsigned char gpio_id;
+
+  gpio_id = HW8_REG(CMSDK_GPIO0_BASE  + 0xFE8) & 0x07;
+
+  if ((HW32_REG(CMSDK_GPIO0_BASE + 0xFE0) != 0x20) ||
+      (HW32_REG(CMSDK_GPIO0_BASE + 0xFE4) != 0xB8) ||
+      (gpio_id != 0x03))
+    return 1; /* part ID & ARM ID does not match */
+  else
+    return 0;
+}
+int gpio1_id_check(void)
+{
+unsigned char gpio_id;
+
+  gpio_id = HW8_REG(CMSDK_GPIO1_BASE  + 0xFE8) & 0x07;
+
+  if ((HW32_REG(CMSDK_GPIO1_BASE + 0xFE0) != 0x20) ||
+      (HW32_REG(CMSDK_GPIO1_BASE + 0xFE4) != 0xB8) ||
+      (gpio_id != 0x03))
+    return 1; /* part ID & ARM ID does not match */
+  else
+    return 0;
+}
+
+void medium_delay(void)
+{
+  int i;
+  for (i=0;i<3;i++){
+    small_delay();
+    }
+  return;
+}
+/* --------------------------------------------------------------- */
+/*  GPIO masked access tests                                       */
+/* --------------------------------------------------------------- */
+int gpio_masked_access_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO){
+  int return_val=0;
+  unsigned int err_code=0;
+  int i;
+
+  unsigned int gpio_datamask;   /* Data compare mask */
+  unsigned int gpio_byte_base;  /* Base address of GPIO masked access*/
+  unsigned int current_value;   /*  */
+  unsigned int read_value;   /*  */
+  unsigned int expected_value;   /*  */
+  unsigned int write_value;
+  int test_counter = 0;
+  int ul_err = 0;
+
+
+  puts("GPIO mask access test");
+  puts("- lower byte");
+
+  if (CMSDK_GPIO==CMSDK_GPIO0) {
+    gpio_datamask        = 0xFFFFFFFF;
+    gpio_byte_base       = CMSDK_GPIO0_BASE + 0x400;
+    }
+  else if (CMSDK_GPIO==CMSDK_GPIO1) {
+    gpio_datamask        = ~((1<<5)|(1<<4)|(1<<2)|(1<<0)); /* Bits that cannot be tested */
+    gpio_byte_base       = CMSDK_GPIO1_BASE + 0x400;
+    }
+  else {
+    puts ("ERROR: Input parameter invalid in function 'gpio_masked_access_test'.");
+    return 1;
+    }
+
+  CMSDK_GPIO->INTENCLR = 0xFFFF;
+  CMSDK_GPIO->OUTENABLESET = gpio_datamask;
+  CMSDK_GPIO->DATAOUT = 0;
+  small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/
+  current_value = CMSDK_GPIO->DATA;
+
+  for (i=0;i<256;i++){
+    /* Use masked access to read current value */
+    read_value       = CMSDK_GPIO->LB_MASKED[i];
+    expected_value   = current_value & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<0);}
+
+    /* Use half word read access to carry out mask access */
+    read_value       = HW16_REG(gpio_byte_base + 4 * i);
+    expected_value   = current_value & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<1);}
+
+    read_value       = HW16_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<2);}
+
+    /* Use byte read access to carry out mask access */
+    read_value       = HW8_REG(gpio_byte_base + 4 * i);
+    expected_value   = current_value & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<3);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 1);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<4);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<5);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 3);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<6);}
+
+    /* Use masked access to toggle current value, check it with word access */
+    write_value               = ~CMSDK_GPIO->LB_MASKED[i];
+    CMSDK_GPIO->LB_MASKED[i] = write_value;
+    current_value             = (current_value & (~i)) | (write_value & i);
+    small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/
+
+    /* Use masked access to read current value */
+    read_value       = CMSDK_GPIO->LB_MASKED[i];
+    expected_value   = current_value & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<7);}
+
+    /* Use normal access to read current value */
+    read_value       = CMSDK_GPIO->DATA;
+    expected_value   = current_value;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<8);}
+
+    /* Use half word read access to carry out mask access */
+    read_value       = HW16_REG(gpio_byte_base + 4 * i);
+    expected_value   = current_value & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<9);}
+
+    read_value       = HW16_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<10);}
+
+    /* Use byte read access to carry out mask access */
+    read_value       = HW8_REG(gpio_byte_base + 4 * i);
+    expected_value   = current_value & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<11);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 1);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<12);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<13);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 3);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<14);}
+
+    /* Use half word masked access to toggle current value, check it with word access */
+    write_value               = ~CMSDK_GPIO->LB_MASKED[i];
+    HW16_REG(gpio_byte_base + 4 * i) = write_value;
+    current_value             = (current_value & (~i)) | (write_value & i);
+    small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/
+
+    /* Use masked access to read current value */
+    read_value       = CMSDK_GPIO->LB_MASKED[i];
+    expected_value   = current_value & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<15);}
+
+    /* Use normal access to read current value */
+    read_value       = CMSDK_GPIO->DATA;
+    expected_value   = current_value;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<16);}
+
+    /* Use half word access to write to upper 16-bit, should have no change in result */
+    write_value               = ~CMSDK_GPIO->LB_MASKED[i];
+    HW16_REG(gpio_byte_base + 4 * i + 2) = write_value;
+    small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/
+    read_value       = CMSDK_GPIO->DATA;
+    expected_value   = current_value;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<17);}
+
+    /* Use half word read access to carry out mask access */
+    read_value       = HW16_REG(gpio_byte_base + 4 * i);
+    expected_value   = current_value & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<18);}
+
+    read_value       = HW16_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<19);}
+
+    /* Use byte read access to carry out mask access */
+    read_value       = HW8_REG(gpio_byte_base + 4 * i);
+    expected_value   = current_value & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<20);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 1);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<21);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<22);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 3);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<23);}
+
+    /* Use byte masked access to toggle current value, check it with word access */
+    write_value               = ~CMSDK_GPIO->LB_MASKED[i];
+    HW8_REG(gpio_byte_base + 4 * i) = write_value;
+    current_value             = (current_value & (~i)) | (write_value & i);
+    small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/
+
+    /* Use normal access to read current value */
+    read_value       = CMSDK_GPIO->DATA;
+    expected_value   = current_value;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<24);}
+
+    /* Write to second byte, should have no effect */
+    write_value               = ~CMSDK_GPIO->LB_MASKED[i];
+    HW8_REG(gpio_byte_base + 4 * i + 1) = write_value;
+    small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/
+
+    /* Use normal access to read current value */
+    read_value       = CMSDK_GPIO->DATA;
+    expected_value   = current_value;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<25);}
+
+    /* Use masked access to read current value */
+    read_value       = CMSDK_GPIO->LB_MASKED[i];
+    expected_value   = current_value & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<26);}
+
+    /* Use half word read access to carry out mask access */
+    read_value       = HW16_REG(gpio_byte_base + 4 * i);
+    expected_value   = current_value & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<27);}
+
+    read_value       = HW16_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<28);}
+
+    /* Use byte read access to carry out mask access */
+    read_value       = HW8_REG(gpio_byte_base + 4 * i);
+    expected_value   = current_value & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<29);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 1);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<30);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= 0x80000000UL;}
+
+    if (err_code != 0) {
+      printf ("ERROR : LB masked access failed (0x%x) at mask = %d\n", err_code, i);
+      return_val =1;
+      err_code = 0;
+      }else test_counter++;
+    }
+
+    if(test_counter == 256){
+      puts("Lower Byte Mask Access Tests Passed\n");
+    }
+    else{
+      puts("Lower Byte Mask Access Tests Failed\n");
+      ul_err = 1;
+    }
+
+  test_counter = 0;
+
+  puts("- upper byte");
+  gpio_byte_base       = gpio_byte_base + 0x400;
+
+  for (i=0;i<256;i++){
+    /* Use masked access to read current value */
+    read_value       = CMSDK_GPIO->UB_MASKED[i];
+    expected_value   = current_value & (i<<8);
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<0);}
+
+    /* Use half word read access to carry out mask access */
+    read_value       = HW16_REG(gpio_byte_base + 4 * i);
+    expected_value   = current_value & (i<<8);
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<1);}
+
+    read_value       = HW16_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<2);}
+
+    /* Use byte read access to carry out mask access */
+    read_value       = HW8_REG(gpio_byte_base + 4 * i);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<4);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 1);
+    expected_value   = (current_value>>8) & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<3);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<5);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 3);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<6);}
+
+    /* Use masked access to toggle current value, check it with word access */
+    write_value               = ~CMSDK_GPIO->UB_MASKED[i];
+    CMSDK_GPIO->UB_MASKED[i] = write_value;
+    current_value             = (current_value & (~(i<<8))) | (write_value & (i<<8));
+    small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/
+
+    /* Use masked access to read current value */
+    read_value       = CMSDK_GPIO->UB_MASKED[i];
+    expected_value   = current_value & (i<<8);
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<7);}
+
+    /* Use normal access to read current value */
+    read_value       = CMSDK_GPIO->DATA;
+    expected_value   = current_value;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<8);}
+
+    /* Use half word read access to carry out mask access */
+    read_value       = HW16_REG(gpio_byte_base + 4 * i);
+    expected_value   = current_value & (i<<8);
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<9);}
+
+    read_value       = HW16_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<10);}
+
+    /* Use byte read access to carry out mask access */
+    read_value       = HW8_REG(gpio_byte_base + 4 * i);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<11);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 1);
+    expected_value   = (current_value>>8) & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<12);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<13);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 3);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<14);}
+
+    /* Use half word masked access to toggle current value, check it with word access */
+    write_value               = ~CMSDK_GPIO->UB_MASKED[i];
+    HW16_REG(gpio_byte_base + 4 * i) = write_value;
+    current_value             = (current_value & (~(i<<8))) | (write_value & (i<<8));
+    small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/
+
+    /* Use masked access to read current value */
+    read_value       = CMSDK_GPIO->UB_MASKED[i];
+    expected_value   = current_value & (i<<8);
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<15);}
+
+    /* Use normal access to read current value */
+    read_value       = CMSDK_GPIO->DATA;
+    expected_value   = current_value;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<16);}
+
+    /* Use half word access to write to upper 16-bit, should have no change in result */
+    write_value               = ~HW16_REG(gpio_byte_base + 4 * i + 2);
+    HW16_REG(gpio_byte_base + 4 * i + 2) = write_value;
+    small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/
+    read_value       = CMSDK_GPIO->DATA;
+    expected_value   = current_value;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<17);}
+
+    /* Use half word read access to carry out mask access */
+    read_value       = HW16_REG(gpio_byte_base + 4 * i);
+    expected_value   = current_value & (i<<8);
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<18);}
+
+    read_value       = HW16_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<19);}
+
+    /* Use byte read access to carry out mask access */
+    read_value       = HW8_REG(gpio_byte_base + 4 * i);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<20);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 1);
+    expected_value   = (current_value>>8) & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<21);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<22);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 3);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<23);}
+
+    /* Use byte masked access to toggle current value, check it with word access */
+    write_value               = ~CMSDK_GPIO->UB_MASKED[i];
+    HW8_REG(gpio_byte_base + 4 * i + 1) = (write_value>>8) & 0xFF;
+    current_value             = (current_value & (~(i<<8))) | (write_value & (i<<8));
+    small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/
+
+    /* Use normal access to read current value */
+    read_value       = CMSDK_GPIO->DATA;
+    expected_value   = current_value;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<24);}
+
+    /* Write to lower byte, should have no effect */
+    write_value               = ~CMSDK_GPIO->UB_MASKED[i];
+    HW8_REG(gpio_byte_base + 4 * i ) = (write_value) & 0xFF;
+    small_delay(); /* DATA read back take time to get updated due to synchronisation registers*/
+
+    /* Use normal access to read current value */
+    read_value       = CMSDK_GPIO->DATA;
+    expected_value   = current_value;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<25);}
+
+    /* Use masked access to read current value */
+    read_value       = CMSDK_GPIO->UB_MASKED[i];
+    expected_value   = current_value & (i<<8);
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<26);}
+
+    /* Use half word read access to carry out mask access */
+    read_value       = HW16_REG(gpio_byte_base + 4 * i);
+    expected_value   = current_value & (i<<8);
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<27);}
+
+    read_value       = HW16_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<28);}
+
+    /* Use byte read access to carry out mask access */
+    read_value       = HW8_REG(gpio_byte_base + 4 * i);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (1<<29);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 1);
+    expected_value   = (current_value>>8) & i;
+    if ((read_value & gpio_datamask) != (expected_value  & gpio_datamask)) { err_code |= (1<<30);}
+
+    read_value       = HW8_REG(gpio_byte_base + 4 * i + 2);
+    expected_value   = 0;
+    if ((read_value                ) != (expected_value                 )) { err_code |= (0x80000000UL);}
+
+
+
+    if (err_code != 0) {
+      printf ("ERROR : UB masked access failed (0x%x) at mask = %d\n", err_code, i);
+      return_val =1;
+      err_code = 0;
+      UartEndSimulation();
+      }
+      else test_counter++;
+    }
+
+    if(test_counter == 256){
+      puts("Upper Byte Mask Access Tests Passed\n");
+    }
+    else{
+      puts("Upper Byte Mask Access Tests Failed\n");
+      ul_err |= 2;
+      }
+
+    if(ul_err) printf("Mask Access Tests Failed, Error Code: (0x%x)\n", ul_err);
+    else puts("Mask Access Tests Passed\n");
+
+  /* Clean up */
+  CMSDK_GPIO->OUTENABLECLR = 0xFFFFFFFF;
+  CMSDK_GPIO->DATAOUT = 0;
+
+  return(return_val);
+}
+
+
+
+/* --------------------------------------------------------------- */
+/*  GPIO register read/write tests                                */
+/* --------------------------------------------------------------- */
+
+int gpio_register_rw_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO){
+  int return_val=0;
+  unsigned int err_code=0;
+  int i;
+  int test_individual_irq = 1;  /* Test individual IRQ in GPIO #0 by default */
+
+  unsigned int gpio_datamask;   /* Data compare mask */
+  unsigned int gpio_outen_mask; /* Output enable mask */
+  unsigned int gpio_altfunc_initval;
+  unsigned int gpio_altfunc_mask;
+  unsigned int gpio_altfunc_usedmask;
+  unsigned int gpio_base;
+  unsigned int saved_altfunc;
+
+
+  if (CMSDK_GPIO==CMSDK_GPIO0) {
+    saved_altfunc = CMSDK_GPIO0->ALTFUNCSET; /* Keep a copy of current ALTFUNC */
+    /* GPIO #0 is not shared in example system */
+    gpio_datamask          = 0xFFFFFFFF;
+    gpio_outen_mask        = 0xFFFFFFFF;
+    gpio_altfunc_mask      = GPIO0_ALTERNATE_FUNC_MASK; /* Mask bits that are not implemented */
+    gpio_altfunc_initval   = GPIO0_ALTERNATE_FUNC_DEFAULT;
+    gpio_altfunc_usedmask  = 0xFFFFFFFF;
+    gpio_base              = CMSDK_GPIO0_BASE;
+    }
+  else if (CMSDK_GPIO==CMSDK_GPIO1) {
+    saved_altfunc = CMSDK_GPIO1->ALTFUNCSET; /* Keep a copy of current ALTFUNC */
+    /* GPIO #1 is shared with peripherals in example system */
+    /* bit 5 is used by stdout                             */
+    gpio_datamask         = ~((1<<5)|(1<<2)|(1<<0)); /* Ignore return values for these bits */
+    gpio_outen_mask       = ~((1<<2)|(1<<0)); /* Do not set output enable for these bits */
+    gpio_altfunc_mask     = GPIO1_ALTERNATE_FUNC_MASK; /* Mask bits that are not implemented */
+    gpio_altfunc_initval  = GPIO1_ALTERNATE_FUNC_DEFAULT;
+    gpio_altfunc_usedmask = ~(1<<5); /* This bit is use by stdout */
+    gpio_base             = CMSDK_GPIO1_BASE;
+    }
+  else {
+    puts ("ERROR: Input parameter invalid in function 'gpio_register_rw_test'.");
+    return 1;
+    }
+
+  puts("GPIO R/W test");
+  puts("- initial values");
+
+  NVIC_DisableIRQ(PORT0_ALL_IRQn);
+  NVIC_DisableIRQ(PORT1_ALL_IRQn);
+  for (i=0;i<16;i++){
+    NVIC_DisableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + i)));
+    }
+
+  /* Test initial values. */
+  /* Current data value could be affected by external signal */
+  if (CMSDK_GPIO==CMSDK_GPIO0) {
+    /* By default GPIO #0 signals are pulled up */
+    if (CMSDK_GPIO->DATA      != 0x0000FFFF) {err_code |= (1<<0); }
+    }
+
+  if (CMSDK_GPIO->DATAOUT   != 0x00000000) {err_code |= (1<<1); }
+  if (CMSDK_GPIO->OUTENABLESET != 0x00000000) {err_code |= (1<<2); }
+
+  /* Alternate function initial value can be affected by
+     1) Verilog parameter
+     2) Retargeting initialization code */
+    /* GPIO #1 is shared with peripherals in example system */
+    /* bit 5 is used by stdout                             */
+  if ((CMSDK_GPIO->ALTFUNCSET & gpio_altfunc_usedmask) != (gpio_altfunc_initval & gpio_altfunc_usedmask))
+    {err_code |= (1<<3); }
+
+  if (CMSDK_GPIO->INTENSET     != 0x00000000) {err_code |= (1<<4); }
+  if (CMSDK_GPIO->INTTYPESET   != 0x00000000) {err_code |= (1<<5); }
+  if (CMSDK_GPIO->INTPOLSET    != 0x00000000) {err_code |= (1<<6); }
+  if (CMSDK_GPIO->INTSTATUS    != 0x00000000) {err_code |= (1<<7); }
+  puts ("- check ID values (WORD accesses)");
+  if (HW32_REG(gpio_base + 0xFD0) != AHB_GPIO_PID4) {err_code |= (1<<8); }
+  if (HW32_REG(gpio_base + 0xFD4) != AHB_GPIO_PID5) {err_code |= (1<<9); }
+  if (HW32_REG(gpio_base + 0xFD8) != AHB_GPIO_PID6) {err_code |= (1<<10); }
+  if (HW32_REG(gpio_base + 0xFDC) != AHB_GPIO_PID7) {err_code |= (1<<11); }
+  if (HW32_REG(gpio_base + 0xFE0) != AHB_GPIO_PID0) {err_code |= (1<<12); }
+  if (HW32_REG(gpio_base + 0xFE4) != AHB_GPIO_PID1) {err_code |= (1<<13); }
+  if (HW32_REG(gpio_base + 0xFE8) != AHB_GPIO_PID2) {err_code |= (1<<14); }
+  if (HW32_REG(gpio_base + 0xFEC) != AHB_GPIO_PID3) {err_code |= (1<<15); }
+  if (HW32_REG(gpio_base + 0xFF0) != AHB_GPIO_CID0) {err_code |= (1<<16); }
+  if (HW32_REG(gpio_base + 0xFF4) != AHB_GPIO_CID1) {err_code |= (1<<17); }
+  if (HW32_REG(gpio_base + 0xFF8) != AHB_GPIO_CID2) {err_code |= (1<<18); }
+  if (HW32_REG(gpio_base + 0xFFC) != AHB_GPIO_CID3) {err_code |= (1<<19); }
+
+  /* test write to PIDs and CIDs - should be ignored */
+  for (i=0; i <12; i++) {
+    HW8_REG(gpio_base + 0xFD0 + (i<<2)) = ~HW32_REG(gpio_base + 0xFD0 + (i<<2));
+    }
+
+  /* Check read back values again, should not be changed */
+  if (HW16_REG(gpio_base + 0xFD0) != AHB_GPIO_PID4) {err_code |= (1<<8); }
+  if (HW16_REG(gpio_base + 0xFD4) != AHB_GPIO_PID5) {err_code |= (1<<9); }
+  if (HW16_REG(gpio_base + 0xFD8) != AHB_GPIO_PID6) {err_code |= (1<<10); }
+  if (HW16_REG(gpio_base + 0xFDC) != AHB_GPIO_PID7) {err_code |= (1<<11); }
+  if (HW16_REG(gpio_base + 0xFE0) != AHB_GPIO_PID0) {err_code |= (1<<12); }
+  if (HW16_REG(gpio_base + 0xFE4) != AHB_GPIO_PID1) {err_code |= (1<<13); }
+  if (HW16_REG(gpio_base + 0xFE8) != AHB_GPIO_PID2) {err_code |= (1<<14); }
+  if (HW16_REG(gpio_base + 0xFEC) != AHB_GPIO_PID3) {err_code |= (1<<15); }
+  if (HW16_REG(gpio_base + 0xFF0) != AHB_GPIO_CID0) {err_code |= (1<<16); }
+  if (HW16_REG(gpio_base + 0xFF4) != AHB_GPIO_CID1) {err_code |= (1<<17); }
+  if (HW16_REG(gpio_base + 0xFF8) != AHB_GPIO_CID2) {err_code |= (1<<18); }
+  if (HW16_REG(gpio_base + 0xFFC) != AHB_GPIO_CID3) {err_code |= (1<<19); }
+
+  if (err_code != 0) {
+    printf ("ERROR : initial value failed (0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+
+
+  puts ("- write ID values (HALF WORD accesses, lower) - should have no effect");
+  HW16_REG(gpio_base + 0xFD0) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFD4) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFD8) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFDC) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFE0) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFE4) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFE8) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFEC) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFF0) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFF4) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFF8) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFFC) = 0xFFFF;
+
+
+  puts ("- check ID values (HALF WORD accesses, lower)");
+  if (HW16_REG(gpio_base + 0xFD0) != AHB_GPIO_PID4) {err_code |= (1<<0); }
+  if (HW16_REG(gpio_base + 0xFD4) != AHB_GPIO_PID5) {err_code |= (1<<1); }
+  if (HW16_REG(gpio_base + 0xFD8) != AHB_GPIO_PID6) {err_code |= (1<<2); }
+  if (HW16_REG(gpio_base + 0xFDC) != AHB_GPIO_PID7) {err_code |= (1<<3); }
+  if (HW16_REG(gpio_base + 0xFE0) != AHB_GPIO_PID0) {err_code |= (1<<4); }
+  if (HW16_REG(gpio_base + 0xFE4) != AHB_GPIO_PID1) {err_code |= (1<<5); }
+  if (HW16_REG(gpio_base + 0xFE8) != AHB_GPIO_PID2) {err_code |= (1<<6); }
+  if (HW16_REG(gpio_base + 0xFEC) != AHB_GPIO_PID3) {err_code |= (1<<7); }
+  if (HW16_REG(gpio_base + 0xFF0) != AHB_GPIO_CID0) {err_code |= (1<<8); }
+  if (HW16_REG(gpio_base + 0xFF4) != AHB_GPIO_CID1) {err_code |= (1<<9); }
+  if (HW16_REG(gpio_base + 0xFF8) != AHB_GPIO_CID2) {err_code |= (1<<10); }
+  if (HW16_REG(gpio_base + 0xFFC) != AHB_GPIO_CID3) {err_code |= (1<<11); }
+
+
+  puts ("- write ID values (HALF WORD accesses, upper) - should have no effect");
+  HW16_REG(gpio_base + 0xFD2) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFD6) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFDA) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFDE) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFE2) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFE6) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFEA) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFEE) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFF2) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFF6) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFFA) = 0xFFFF;
+  HW16_REG(gpio_base + 0xFFE) = 0xFFFF;
+
+  puts ("- check ID values (HALF WORD accesses, upper)");
+  if (HW16_REG(gpio_base + 0xFD2) != 0x00) {err_code |= (1<<12); }
+  if (HW16_REG(gpio_base + 0xFD6) != 0x00) {err_code |= (1<<13); }
+  if (HW16_REG(gpio_base + 0xFDA) != 0x00) {err_code |= (1<<14); }
+  if (HW16_REG(gpio_base + 0xFDE) != 0x00) {err_code |= (1<<15); }
+  if (HW16_REG(gpio_base + 0xFE2) != 0x00) {err_code |= (1<<16); }
+  if (HW16_REG(gpio_base + 0xFE6) != 0x00) {err_code |= (1<<17); }
+  if (HW16_REG(gpio_base + 0xFEA) != 0x00) {err_code |= (1<<18); }
+  if (HW16_REG(gpio_base + 0xFEE) != 0x00) {err_code |= (1<<19); }
+  if (HW16_REG(gpio_base + 0xFF2) != 0x00) {err_code |= (1<<20); }
+  if (HW16_REG(gpio_base + 0xFF6) != 0x00) {err_code |= (1<<21); }
+  if (HW16_REG(gpio_base + 0xFFA) != 0x00) {err_code |= (1<<22); }
+  if (HW16_REG(gpio_base + 0xFFE) != 0x00) {err_code |= (1<<23); }
+
+  if (err_code != 0) {
+    printf ("ERROR : initial value failed (0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+
+  puts ("- write ID values (BYTE accesses, byte 0) - should have no effect");
+  HW8_REG(gpio_base + 0xFD0) = 0xFF;
+  HW8_REG(gpio_base + 0xFD4) = 0xFF;
+  HW8_REG(gpio_base + 0xFD8) = 0xFF;
+  HW8_REG(gpio_base + 0xFDC) = 0xFF;
+  HW8_REG(gpio_base + 0xFE0) = 0xFF;
+  HW8_REG(gpio_base + 0xFE4) = 0xFF;
+  HW8_REG(gpio_base + 0xFE8) = 0xFF;
+  HW8_REG(gpio_base + 0xFEC) = 0xFF;
+  HW8_REG(gpio_base + 0xFF0) = 0xFF;
+  HW8_REG(gpio_base + 0xFF4) = 0xFF;
+  HW8_REG(gpio_base + 0xFF8) = 0xFF;
+  HW8_REG(gpio_base + 0xFFC) = 0xFF;
+
+  puts ("- check ID values (BYTE accesses, byte 0)");
+  if (HW8_REG(gpio_base + 0xFD0) != AHB_GPIO_PID4) {err_code |= (1<<0); }
+  if (HW8_REG(gpio_base + 0xFD4) != AHB_GPIO_PID5) {err_code |= (1<<1); }
+  if (HW8_REG(gpio_base + 0xFD8) != AHB_GPIO_PID6) {err_code |= (1<<2); }
+  if (HW8_REG(gpio_base + 0xFDC) != AHB_GPIO_PID7) {err_code |= (1<<3); }
+  if (HW8_REG(gpio_base + 0xFE0) != AHB_GPIO_PID0) {err_code |= (1<<4); }
+  if (HW8_REG(gpio_base + 0xFE4) != AHB_GPIO_PID1) {err_code |= (1<<5); }
+  if (HW8_REG(gpio_base + 0xFE8) != AHB_GPIO_PID2) {err_code |= (1<<6); }
+  if (HW8_REG(gpio_base + 0xFEC) != AHB_GPIO_PID3) {err_code |= (1<<7); }
+  if (HW8_REG(gpio_base + 0xFF0) != AHB_GPIO_CID0) {err_code |= (1<<8); }
+  if (HW8_REG(gpio_base + 0xFF4) != AHB_GPIO_CID1) {err_code |= (1<<9); }
+  if (HW8_REG(gpio_base + 0xFF8) != AHB_GPIO_CID2) {err_code |= (1<<10); }
+  if (HW8_REG(gpio_base + 0xFFC) != AHB_GPIO_CID3) {err_code |= (1<<11); }
+
+  puts ("- write ID values (BYTE accesses, byte 1) - should have no effect");
+  HW8_REG(gpio_base + 0xFD1) = 0xFF;
+  HW8_REG(gpio_base + 0xFD5) = 0xFF;
+  HW8_REG(gpio_base + 0xFD9) = 0xFF;
+  HW8_REG(gpio_base + 0xFDD) = 0xFF;
+  HW8_REG(gpio_base + 0xFE1) = 0xFF;
+  HW8_REG(gpio_base + 0xFE5) = 0xFF;
+  HW8_REG(gpio_base + 0xFE9) = 0xFF;
+  HW8_REG(gpio_base + 0xFED) = 0xFF;
+  HW8_REG(gpio_base + 0xFF1) = 0xFF;
+  HW8_REG(gpio_base + 0xFF5) = 0xFF;
+  HW8_REG(gpio_base + 0xFF9) = 0xFF;
+  HW8_REG(gpio_base + 0xFFD) = 0xFF;
+
+  puts ("- check ID values (BYTE accesses, byte 1)");
+  if (HW8_REG(gpio_base + 0xFD1) != 0x00) {err_code |= (1<<12); }
+  if (HW8_REG(gpio_base + 0xFD5) != 0x00) {err_code |= (1<<13); }
+  if (HW8_REG(gpio_base + 0xFD9) != 0x00) {err_code |= (1<<14); }
+  if (HW8_REG(gpio_base + 0xFDD) != 0x00) {err_code |= (1<<15); }
+  if (HW8_REG(gpio_base + 0xFE1) != 0x00) {err_code |= (1<<16); }
+  if (HW8_REG(gpio_base + 0xFE5) != 0x00) {err_code |= (1<<17); }
+  if (HW8_REG(gpio_base + 0xFE9) != 0x00) {err_code |= (1<<18); }
+  if (HW8_REG(gpio_base + 0xFED) != 0x00) {err_code |= (1<<19); }
+  if (HW8_REG(gpio_base + 0xFF1) != 0x00) {err_code |= (1<<20); }
+  if (HW8_REG(gpio_base + 0xFF5) != 0x00) {err_code |= (1<<21); }
+  if (HW8_REG(gpio_base + 0xFF9) != 0x00) {err_code |= (1<<22); }
+  if (HW8_REG(gpio_base + 0xFFD) != 0x00) {err_code |= (1<<23); }
+
+  if (err_code != 0) {
+    printf ("ERROR : initial value failed on byte 0 and 1 accesses (0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+
+  puts ("- write ID values (BYTE accesses, byte 2) - should have no effect");
+  HW8_REG(gpio_base + 0xFD2) = 0xFF;
+  HW8_REG(gpio_base + 0xFD6) = 0xFF;
+  HW8_REG(gpio_base + 0xFDA) = 0xFF;
+  HW8_REG(gpio_base + 0xFDE) = 0xFF;
+  HW8_REG(gpio_base + 0xFE2) = 0xFF;
+  HW8_REG(gpio_base + 0xFE6) = 0xFF;
+  HW8_REG(gpio_base + 0xFEA) = 0xFF;
+  HW8_REG(gpio_base + 0xFEE) = 0xFF;
+  HW8_REG(gpio_base + 0xFF2) = 0xFF;
+  HW8_REG(gpio_base + 0xFF6) = 0xFF;
+  HW8_REG(gpio_base + 0xFFA) = 0xFF;
+  HW8_REG(gpio_base + 0xFFE) = 0xFF;
+
+  puts ("- check ID values (BYTE accesses, byte 2)");
+  if (HW8_REG(gpio_base + 0xFD2) != 0x00) {err_code |= (1<<0); }
+  if (HW8_REG(gpio_base + 0xFD6) != 0x00) {err_code |= (1<<1); }
+  if (HW8_REG(gpio_base + 0xFDA) != 0x00) {err_code |= (1<<2); }
+  if (HW8_REG(gpio_base + 0xFDE) != 0x00) {err_code |= (1<<3); }
+  if (HW8_REG(gpio_base + 0xFE2) != 0x00) {err_code |= (1<<4); }
+  if (HW8_REG(gpio_base + 0xFE6) != 0x00) {err_code |= (1<<5); }
+  if (HW8_REG(gpio_base + 0xFEA) != 0x00) {err_code |= (1<<6); }
+  if (HW8_REG(gpio_base + 0xFEE) != 0x00) {err_code |= (1<<7); }
+  if (HW8_REG(gpio_base + 0xFF2) != 0x00) {err_code |= (1<<8); }
+  if (HW8_REG(gpio_base + 0xFF6) != 0x00) {err_code |= (1<<9); }
+  if (HW8_REG(gpio_base + 0xFFA) != 0x00) {err_code |= (1<<10); }
+  if (HW8_REG(gpio_base + 0xFFE) != 0x00) {err_code |= (1<<11); }
+
+  puts ("- write ID values (BYTE accesses, byte 3) - should have no effect");
+  /* test write to PIDs and CIDs - should be ignored */
+  HW8_REG(gpio_base + 0xFD3) = 0xFF;
+  HW8_REG(gpio_base + 0xFD7) = 0xFF;
+  HW8_REG(gpio_base + 0xFDB) = 0xFF;
+  HW8_REG(gpio_base + 0xFDF) = 0xFF;
+  HW8_REG(gpio_base + 0xFE3) = 0xFF;
+  HW8_REG(gpio_base + 0xFE7) = 0xFF;
+  HW8_REG(gpio_base + 0xFEB) = 0xFF;
+  HW8_REG(gpio_base + 0xFEF) = 0xFF;
+  HW8_REG(gpio_base + 0xFF3) = 0xFF;
+  HW8_REG(gpio_base + 0xFF7) = 0xFF;
+  HW8_REG(gpio_base + 0xFFB) = 0xFF;
+  HW8_REG(gpio_base + 0xFFF) = 0xFF;
+
+  puts ("- check ID values (BYTE accesses, byte 3)");
+  if (HW8_REG(gpio_base + 0xFD3) != 0x00) {err_code |= (1<<12); }
+  if (HW8_REG(gpio_base + 0xFD7) != 0x00) {err_code |= (1<<13); }
+  if (HW8_REG(gpio_base + 0xFDB) != 0x00) {err_code |= (1<<14); }
+  if (HW8_REG(gpio_base + 0xFDF) != 0x00) {err_code |= (1<<15); }
+  if (HW8_REG(gpio_base + 0xFE3) != 0x00) {err_code |= (1<<16); }
+  if (HW8_REG(gpio_base + 0xFE7) != 0x00) {err_code |= (1<<17); }
+  if (HW8_REG(gpio_base + 0xFEB) != 0x00) {err_code |= (1<<18); }
+  if (HW8_REG(gpio_base + 0xFEF) != 0x00) {err_code |= (1<<19); }
+  if (HW8_REG(gpio_base + 0xFF3) != 0x00) {err_code |= (1<<20); }
+  if (HW8_REG(gpio_base + 0xFF7) != 0x00) {err_code |= (1<<21); }
+  if (HW8_REG(gpio_base + 0xFFB) != 0x00) {err_code |= (1<<22); }
+  if (HW8_REG(gpio_base + 0xFFF) != 0x00) {err_code |= (1<<23); }
+
+  if (err_code != 0) {
+    printf ("ERROR : initial value failed on byte 2 and 3 accesses (0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+
+  puts("- read/write");
+
+  /* Test output enable read/write */
+  /* word size */
+  CMSDK_GPIO->OUTENABLESET = 0xFFFFFFFF & gpio_outen_mask;
+  if (CMSDK_GPIO->OUTENABLESET     != (0x0000FFFF & gpio_outen_mask)) { err_code |= (1<<0); }
+  CMSDK_GPIO->OUTENABLECLR = 0xCCAA5500 & gpio_outen_mask;
+  if (CMSDK_GPIO->OUTENABLESET     != (0x0000AAFF & gpio_outen_mask)) { err_code |= (1<<1); }
+  CMSDK_GPIO->OUTENABLECLR = 0xFFFFFFFF & gpio_outen_mask;
+  if (CMSDK_GPIO->OUTENABLESET     != (0x00000000 & gpio_outen_mask)) { err_code |= (1<<2); }
+
+  /* half word size and byte size */
+  HW16_REG(gpio_base + 0x14) = 0xFFFF & gpio_outen_mask;
+  HW16_REG(gpio_base + 0x10) = 0x3366 & gpio_outen_mask;
+  if (CMSDK_GPIO->OUTENABLESET     != (0x00003366 & gpio_outen_mask)) { err_code |= (1<<3); }
+
+  HW16_REG(gpio_base + 0x12) = 0x9988 & gpio_outen_mask; /* This transfer is ignored */
+  if (CMSDK_GPIO->OUTENABLESET     != (0x00003366 & gpio_outen_mask)) { err_code |= (1<<4); }
+    HW16_REG(gpio_base + 0x14) = 0xFFFF & gpio_outen_mask;
+  HW8_REG( gpio_base + 0x10) =   0x44 & gpio_outen_mask;
+  HW8_REG( gpio_base + 0x11) =   0x33;
+  if (HW16_REG(gpio_base + 0x10)  != (0x00003344 & gpio_outen_mask)) { err_code |= (1<<5); }
+  HW16_REG(gpio_base + 0x10) = 0x77EE & gpio_outen_mask;
+  if (HW8_REG( gpio_base + 0x10)  != (0x000000EE & gpio_outen_mask)) { err_code |= (1<<6); }
+  if (HW8_REG( gpio_base + 0x11)  != (0x00000077 & (gpio_outen_mask>>8))) { err_code |= (1<<7); }
+
+  CMSDK_GPIO->OUTENABLESET = 0x0000FFFF & gpio_outen_mask; /* Set all output enabled */
+  if (CMSDK_GPIO->OUTENABLESET     != (0x0000FFFF & gpio_outen_mask)) { err_code |= (1<<8); }
+
+  /* Now we can test read back data */
+  small_delay(); /* required because the DATA readback is delay by double-flop-flop synchronisation */
+  if ((CMSDK_GPIO->DATA & gpio_datamask) != (0x0000 & gpio_datamask)) {err_code |= (1<<9); }
+  if ((HW16_REG( gpio_base + 0x0) & gpio_datamask) != (0x0000 & gpio_datamask)) {err_code |= (1<<10); }
+
+  /* Test byte size write to data register, which in effect change dataout register */
+  HW8_REG( gpio_base + 0x0) = 0xFF;
+  if (CMSDK_GPIO->DATAOUT   != 0x00FF)     {err_code |= (1<<11); }
+  small_delay(); /* required because the DATA readback is delay by double-flop-flop synchronisation */
+  if ((CMSDK_GPIO->DATA & gpio_datamask) != (0x00FF & gpio_datamask)) {err_code |= (1<<12); }
+  HW8_REG( gpio_base + 0x1) = 0xFF;
+  if (CMSDK_GPIO->DATAOUT   != 0xFFFF)     {err_code |= (1<<13); }
+  small_delay(); /* required because the DATA readback is delay by double-flop-flop synchronisation */
+  if ((CMSDK_GPIO->DATA & gpio_datamask) != (0xFFFF & gpio_datamask)) {err_code |= (1<<14); }
+  HW8_REG( gpio_base + 0x2) = 0xFF;
+  if (CMSDK_GPIO->DATAOUT   != 0xFFFF)     {err_code |= (1<<13); }
+  small_delay(); /* required because the DATA readback is delay by double-flop-flop synchronisation */
+  if ((CMSDK_GPIO->DATA & gpio_datamask) != (0xFFFF & gpio_datamask)) {err_code |= (1<<15); }
+  HW8_REG( gpio_base + 0x3) = 0xFF;
+  if (CMSDK_GPIO->DATAOUT   != 0xFFFF)     {err_code |= (1<<14); }
+  small_delay(); /* required because the DATA readback is delay by double-flop-flop synchronisation */
+  if ((CMSDK_GPIO->DATA & gpio_datamask) != (0xFFFF & gpio_datamask)) {err_code |= (1<<16); }
+
+  CMSDK_GPIO->DATAOUT = 0x1234;
+  if (CMSDK_GPIO->DATAOUT   != 0x1234)      {err_code |= (1<<17); }
+  if (HW8_REG( gpio_base + 0x4) != 0x34)     {err_code |= (1<<18); }
+  if (HW8_REG( gpio_base + 0x5) != 0x12)     {err_code |= (1<<19); }
+  if (HW16_REG(gpio_base + 0x4) != 0x1234)   {err_code |= (1<<20); }
+  if ((CMSDK_GPIO->DATA & gpio_datamask) != (0x1234 & gpio_datamask)) {err_code |= (1<<21); }
+  if ((HW8_REG( gpio_base + 0x0) & gpio_datamask) != (0x34 & gpio_datamask)) {err_code |= (1<<22); }
+  if ((HW8_REG( gpio_base + 0x1) & (gpio_datamask>>8)) != (0x12 & (gpio_datamask>>8))) {err_code |= (1<<23); }
+  if ( HW8_REG( gpio_base + 0x2) != 0x00)    {err_code |= (1<<24); }
+  if ( HW8_REG( gpio_base + 0x3) != 0x00)    {err_code |= (1<<25); }
+  if (HW16_REG( gpio_base + 0x6) != 0x0000)  {err_code |= (1<<26); }
+
+  HW16_REG( gpio_base + 0x0) = 0xFFFF;
+  if (CMSDK_GPIO->DATAOUT   != 0xFFFF)     {err_code |= (1<<27); }
+  small_delay(); /* required because the DATA readback is delay by double-flop-flop synchronisation */
+  if ((CMSDK_GPIO->DATA & gpio_datamask) != (0xFFFF & gpio_datamask)) {err_code |= (1<<28); }
+
+  HW16_REG( gpio_base + 0x4) = 0x0000;
+  if (CMSDK_GPIO->DATAOUT   != 0x0000)     {err_code |= (1<<29); }
+  small_delay(); /* required because the DATA readback is delay by double-flop-flop synchronisation */
+  if ((CMSDK_GPIO->DATA & gpio_datamask) != (0x0000 & gpio_datamask)) {err_code |= (1<<30); }
+
+  CMSDK_GPIO->OUTENABLECLR = 0xFFFFFFFF; /* Disable output */
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : Read/write #1 failed(0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+
+  small_delay();
+
+  /* Test ALTFUNC register */
+  CMSDK_GPIO->ALTFUNCCLR = 0xFFFF;
+  if ((CMSDK_GPIO->ALTFUNCSET & gpio_altfunc_mask) != (0x0000 & gpio_altfunc_mask)) {err_code |= (1<<0); }
+  if ((HW16_REG(gpio_base + 0x18) & gpio_altfunc_mask) != (0x0000 & gpio_altfunc_mask)) {err_code |= (1<<1); }
+  if ((HW16_REG(gpio_base + 0x1A)                    ) != (0x0000                    )) {err_code |= (1<<2); }
+
+  CMSDK_GPIO->ALTFUNCSET = 0xFFFF;
+  if ((CMSDK_GPIO->ALTFUNCSET & gpio_altfunc_mask) != (0xFFFF & gpio_altfunc_mask)) {err_code |= (1<<3); }
+  if ((HW16_REG(gpio_base + 0x18) & gpio_altfunc_mask) != (0xFFFF & gpio_altfunc_mask)) {err_code |= (1<<4); }
+  if ((HW16_REG(gpio_base + 0x1A)                    ) != (0x0000                    )) {err_code |= (1<<5); }
+  if ((HW8_REG( gpio_base + 0x18) & gpio_altfunc_mask) != (0xFF   & gpio_altfunc_mask)) {err_code |= (1<<6); }
+  if ((HW8_REG( gpio_base + 0x19) & (gpio_altfunc_mask>>8)) != (0xFF & (gpio_altfunc_mask>>8))) {err_code |= (1<<7); }
+
+  HW16_REG(gpio_base + 0x1C) = 0x996E;
+  if ((CMSDK_GPIO->ALTFUNCSET & gpio_altfunc_mask) != (0x6691 & gpio_altfunc_mask)) {err_code |= (1<<8); }
+  HW16_REG(gpio_base + 0x1A) = 0xFFFF; /* ignored */
+  if ((HW16_REG(gpio_base + 0x18) & gpio_altfunc_mask) != (0x6691 & gpio_altfunc_mask)) {err_code |= (1<<9); }
+  if ((HW16_REG(gpio_base + 0x1A)                    ) != (0x0000                    )) {err_code |= (1<<10); }
+  if ((HW8_REG( gpio_base + 0x18) & gpio_altfunc_mask) != (0x91   & gpio_altfunc_mask)) {err_code |= (1<<11); }
+  if ((HW8_REG( gpio_base + 0x19) & (gpio_altfunc_mask>>8)) != (0x66 & (gpio_altfunc_mask>>8))) {err_code |= (1<<12); }
+  HW16_REG(gpio_base + 0x1C) = 0xFFFF;
+  HW8_REG(gpio_base + 0x18) = 0x45;
+  HW8_REG(gpio_base + 0x19) = 0x23;
+  HW8_REG(gpio_base + 0x1A) = 0x77;
+  HW8_REG(gpio_base + 0x1B) = 0x77;
+  if ((CMSDK_GPIO->ALTFUNCSET & gpio_altfunc_mask) != (0x2345 & gpio_altfunc_mask)) {err_code |= (1<<13); }
+  if ((HW8_REG( gpio_base + 0x18) & gpio_altfunc_mask) != (0x45   & gpio_altfunc_mask)) {err_code |= (1<<14); }
+  if ((HW8_REG( gpio_base + 0x19) & (gpio_altfunc_mask>>8)) != (0x23 & (gpio_altfunc_mask>>8))) {err_code |= (1<<15); }
+
+  CMSDK_GPIO->ALTFUNCSET = 0x5488;
+  CMSDK_GPIO->ALTFUNCCLR = 0x2201;
+  if ((CMSDK_GPIO->ALTFUNCSET & gpio_altfunc_mask) != (0x55CC & gpio_altfunc_mask)) {err_code |= (1<<16); }
+  CMSDK_GPIO->ALTFUNCCLR = 0x00CC;
+  CMSDK_GPIO->ALTFUNCSET = 0xAA33;
+  if ((CMSDK_GPIO->ALTFUNCSET & gpio_altfunc_mask) != (0xFF33 & gpio_altfunc_mask)) {err_code |= (1<<17); }
+  CMSDK_GPIO->ALTFUNCCLR = 0xFFFF;
+  CMSDK_GPIO->ALTFUNCSET = saved_altfunc; /* Restore ALTFUNC */
+
+  if (err_code != 0) {
+    printf ("ERROR : Read/write #2 failed(0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+
+  // Write to every location
+
+  /* Test INTEN register read/write - offset 0x20  */
+  CMSDK_GPIO->INTENSET = 0x00FF;
+  if ((CMSDK_GPIO->INTENSET)      != 0x00FF){err_code |= (1<<0); }
+  if ( HW8_REG(gpio_base + 0x20)!= 0xFF  ){err_code |= (1<<1); }
+  if ( HW8_REG(gpio_base + 0x21)!= 0x00  ){err_code |= (1<<2); }
+  if (HW16_REG(gpio_base + 0x22)!= 0x0000){err_code |= (1<<3); }
+  CMSDK_GPIO->INTENSET = 0xFF00;
+  CMSDK_GPIO->INTENCLR = 0x00FF;
+  if ((CMSDK_GPIO->INTENSET)      != 0xFF00){err_code |= (1<<4); }
+  if (HW16_REG(gpio_base + 0x20)!= 0xFF00){err_code |= (1<<5); }
+  if ( HW8_REG(gpio_base + 0x20)!= 0x00  ){err_code |= (1<<6); }
+  if ( HW8_REG(gpio_base + 0x21)!= 0xFF  ){err_code |= (1<<7); }
+
+  CMSDK_GPIO->INTENCLR = 0x5500;
+  CMSDK_GPIO->INTENSET = 0x0055;
+  if ((CMSDK_GPIO->INTENSET) != 0xAA55)     {err_code |= (1<<8); }
+  CMSDK_GPIO->INTENCLR = 0xFFFF;
+  CMSDK_GPIO->INTENSET = 0x33BB;
+  if ((CMSDK_GPIO->INTENSET) != 0x33BB)     {err_code |= (1<<9); }
+  HW8_REG(gpio_base + 0x20) = 0x44;
+  HW8_REG(gpio_base + 0x24) = 0xBA;
+  HW8_REG(gpio_base + 0x25) = 0x10;
+  HW8_REG(gpio_base + 0x26) = 0x99;
+  HW8_REG(gpio_base + 0x27) = 0x99;
+  if ((CMSDK_GPIO->INTENSET) != 0x2345)     {err_code |= (1<<10); }
+  HW16_REG(gpio_base + 0x20) = 0x5892;
+  HW16_REG(gpio_base + 0x22) = 0x1111;
+  HW16_REG(gpio_base + 0x24) = 0x0240;
+  if ((CMSDK_GPIO->INTENSET) != 0x7997)     {err_code |= (1<<11); }
+
+  CMSDK_GPIO->INTENCLR = 0xFFFF;
+  if ((CMSDK_GPIO->INTENSET) != 0x0000) {err_code |= (1<<12); }
+
+  /* Test INTTYPE register read/write  - offset 0x14 */
+  CMSDK_GPIO->INTTYPESET = 0x3A6B;
+  if ((CMSDK_GPIO->INTTYPESET) != 0x3A6B) {err_code |= (1<<19); }
+  if ( HW8_REG(gpio_base + 0x28)!= 0x6B  ){err_code |= (1<<20); }
+  if ( HW8_REG(gpio_base + 0x29)!= 0x3A  ){err_code |= (1<<21); }
+  if ( HW8_REG(gpio_base + 0x2A)!= 0x00  ){err_code |= (1<<22); }
+  if ( HW8_REG(gpio_base + 0x2B)!= 0x00  ){err_code |= (1<<23); }
+
+  HW16_REG(gpio_base + 0x2C) = 0xFFFF;
+  HW8_REG(gpio_base + 0x28) = 0x7C;
+  HW8_REG(gpio_base + 0x29) = 0x4B;
+  if ((CMSDK_GPIO->INTTYPESET) != 0x4B7C)  {err_code |= (1<<24); }
+  if (HW16_REG(gpio_base + 0x28)!= 0x4B7C ){err_code |= (1<<25); }
+
+  HW16_REG(gpio_base + 0x2C) = 0x4964;
+  HW16_REG(gpio_base + 0x28) = 0x8001;
+  HW16_REG(gpio_base + 0x2A) = 0xFFFF;
+  if ((CMSDK_GPIO->INTTYPESET) != 0x8219) {err_code |= (1<<26); }
+  CMSDK_GPIO->INTTYPESET = 0xFFFF;
+  if ((CMSDK_GPIO->INTTYPESET) != 0xFFFF) {err_code |= (1<<27); }
+  CMSDK_GPIO->INTTYPECLR = 0xFFFF;
+  if ((CMSDK_GPIO->INTTYPESET) != 0x0000) {err_code |= (1<<28); }
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : Read/write #3 failed(0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+
+
+  /* Test INTPOL register read/write  - offset 0x18 */
+  CMSDK_GPIO->INTPOLSET = 0x3B6A;
+  if ((CMSDK_GPIO->INTPOLSET) != 0x3B6A) {err_code |= (1<<0); }
+  if ( HW8_REG(gpio_base + 0x30)!= 0x6A  ){err_code |= (1<<1); }
+  if ( HW8_REG(gpio_base + 0x31)!= 0x3B  ){err_code |= (1<<2); }
+  if ( HW8_REG(gpio_base + 0x32)!= 0x00  ){err_code |= (1<<3); }
+  if ( HW8_REG(gpio_base + 0x33)!= 0x00  ){err_code |= (1<<4); }
+  if (HW16_REG(gpio_base + 0x30)!= 0x3B6A){err_code |= (1<<5); }
+  HW16_REG(gpio_base + 0x34) = 0xFFFF;
+  HW16_REG(gpio_base + 0x30) = 0x4B7C;
+  if ((CMSDK_GPIO->INTPOLSET) != 0x4B7C) {err_code |= (1<<6); }
+  HW16_REG(gpio_base + 0x32)= 0x3333;
+  if ((CMSDK_GPIO->INTPOLSET) != 0x4B7C) {err_code |= (1<<7); }
+  HW8_REG( gpio_base + 0x34) = 0xFF;
+  HW8_REG( gpio_base + 0x30) = 0x95;
+  if ((CMSDK_GPIO->INTPOLSET) != 0x4B95) {err_code |= (1<<8); }
+  HW8_REG( gpio_base + 0x35) = 0xFF;
+  HW8_REG( gpio_base + 0x31) = 0x32;
+  if ((CMSDK_GPIO->INTPOLSET) != 0x3295) {err_code |= (1<<9); }
+  HW16_REG(gpio_base + 0x36)= 0xFFFF;
+  HW8_REG( gpio_base + 0x32) = 0x66;
+  HW8_REG( gpio_base + 0x33) = 0x66;
+  if ((CMSDK_GPIO->INTPOLSET) != 0x3295) {err_code |= (1<<10); }
+  HW16_REG(gpio_base + 0x34)= 0xFFFF;
+  CMSDK_GPIO->INTPOLSET = 0x8219;
+  if (HW16_REG(gpio_base + 0x30) != 0x8219) {err_code |= (1<<11); }
+  CMSDK_GPIO->INTPOLSET = 0xFFFF;
+  if ((CMSDK_GPIO->INTPOLSET) != 0xFFFF) {err_code |= (1<<12); }
+  CMSDK_GPIO->INTPOLCLR = 0xFFFF;
+  if ((CMSDK_GPIO->INTPOLSET) != 0x0000) {err_code |= (1<<13); }
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : Read/write #4 failed(0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+  puts("- INTSTATUS/INTCLEAR r/w");
+
+  /* Test INTSTATUS/INTCLEAR register read/write - offset 0x1C */
+  /* It was not set because when INTEN was high, input was high, but INTPOL was low (low level trigger) */
+  if ((CMSDK_GPIO->INTSTATUS) != 0x0000) {err_code |= (1<<0); }
+  if ( HW8_REG(gpio_base + 0x38)!= 0x00  ){err_code |= (1<<1); }
+  if ( HW8_REG(gpio_base + 0x39)!= 0x00  ){err_code |= (1<<2); }
+  if ( HW8_REG(gpio_base + 0x3A)!= 0x00  ){err_code |= (1<<3); }
+  if ( HW8_REG(gpio_base + 0x3B)!= 0x00  ){err_code |= (1<<4); }
+  if (HW16_REG(gpio_base + 0x38)!= 0x0000){err_code |= (1<<5); }
+
+  /* Now we need to force INTSTATUS to 0xFFFF */
+  CMSDK_GPIO->INTENSET = 0xFFFF;
+  CMSDK_GPIO->INTPOLSET= 0xFFFF;
+  /* It set INTSTATUS to 0xFFFF because INTEN was set, DATA input was pulled up and INTPOL was 0xFFFF */
+
+  /* Disable interrupt from generating continuously */
+  CMSDK_GPIO->INTENCLR = 0xFFFF;
+  CMSDK_GPIO->INTPOLCLR= 0xFFFF;
+
+  /* Test clearing of INTSTATUS */
+  if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFFFF & gpio_datamask)) {err_code |= (1<<6); }
+  if (( HW8_REG(gpio_base + 0x38) & gpio_datamask )!= (0xFF & gpio_datamask) ) {err_code |= (1<<7); }
+  if (( HW8_REG(gpio_base + 0x39) & gpio_datamask )!= (0xFF & gpio_datamask) ) {err_code |= (1<<8); }
+  if (( HW8_REG(gpio_base + 0x3A) & gpio_datamask )!= (0x00 & gpio_datamask) ) {err_code |= (1<<9); }
+  if (( HW8_REG(gpio_base + 0x3B) & gpio_datamask )!= (0x00 & gpio_datamask) ) {err_code |= (1<<10); }
+  if ((HW16_REG(gpio_base + 0x38) & gpio_datamask )!= (0xFFFF & gpio_datamask) ) {err_code |= (1<<11); }
+  if ((HW16_REG(gpio_base + 0x3A) & gpio_datamask )!= (0x0000 & gpio_datamask) ) {err_code |= (1<<12); }
+
+  CMSDK_GPIO->INTCLEAR = 0x0000;
+  if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFFFF & gpio_datamask)) {err_code |= (1<<13); }
+
+  CMSDK_GPIO->INTCLEAR = 0x0001;
+  if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFFFE & gpio_datamask)) {err_code |= (1<<14); }
+  if (( HW8_REG(gpio_base + 0x38) & gpio_datamask )!= (0xFE & gpio_datamask) ) {err_code |= (1<<15); }
+  if (( HW8_REG(gpio_base + 0x39) & gpio_datamask )!= (0xFF & gpio_datamask) ) {err_code |= (1<<16); }
+
+  HW16_REG(gpio_base + 0x38) = 0x0002;
+  if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFFFC & gpio_datamask)) {err_code |= (1<<17); }
+  HW16_REG(gpio_base + 0x38) = 0x0004;
+  if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFFF8 & gpio_datamask)) {err_code |= (1<<18); }
+  HW8_REG(gpio_base  + 0x38) = 0x0008;
+  if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFFF0 & gpio_datamask)) {err_code |= (1<<19); }
+  HW8_REG(gpio_base  + 0x39) = 0x0001;
+  if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFEF0 & gpio_datamask)) {err_code |= (1<<20); }
+  if ((HW16_REG(gpio_base + 0x38) & gpio_datamask )!= (0xFEF0 & gpio_datamask) ) {err_code |= (1<<21); }
+  CMSDK_GPIO->INTCLEAR = 0x000E; /* Clear a bit that is already cleared has no effect */
+  if ((HW16_REG(gpio_base + 0x38) & gpio_datamask )!= (0xFEF0 & gpio_datamask) ) {err_code |= (1<<22); }
+  HW8_REG(gpio_base  + 0x3A) = 0x000F; /* ignored */
+  if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFEF0 & gpio_datamask)) {err_code |= (1<<23); }
+  HW16_REG(gpio_base + 0x3A) = 0xFFFF; /* ignored */
+  if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xFEF0 & gpio_datamask)) {err_code |= (1<<24); }
+  CMSDK_GPIO->INTCLEAR = 0x3330;
+  if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0xCCC0 & gpio_datamask)) {err_code |= (1<<25); }
+  CMSDK_GPIO->INTCLEAR = 0xCCC0;
+  if ((CMSDK_GPIO->INTSTATUS & gpio_datamask) != (0x0000 & gpio_datamask)) {err_code |= (1<<26); }
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : INTSTATUS/INTCLEAR r/w failed (0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+
+  /* Clean up */
+  CMSDK_GPIO->OUTENABLECLR = 0xFFFFFFFF;
+  CMSDK_GPIO->INTENCLR     = 0xFFFFFFFF;
+  CMSDK_GPIO->INTPOLCLR    = 0xFFFFFFFF;
+  CMSDK_GPIO->INTCLEAR  = 0x0000FFFF;
+  gpio0_irq_occurred = 0;
+  gpio1_irq_occurred = 0;
+  gpio0_irq_expected = 0;
+  gpio1_irq_expected = 0;
+
+   /* Test whether the PORT0_0_IRQn is available */
+   /* Note : GPIO Interrupt is pended in previous test stage */
+  __disable_irq(); /* Use setting of Interrupt enable to detect if
+    we have 32 interrupts, but we don't want the exact interrupt to
+    take place, so we disable interrupt using PRIMASK during this checking */
+  NVIC_EnableIRQ(PORT0_15_IRQn);
+  if ((NVIC->ISER[0] & 0x80000000U)==0) {
+    /* Number of IRQ less than 32, skip individual IRQ test */
+    puts("Less then 32 IRQ in design\n");
+    test_individual_irq = 0;
+    }
+  NVIC_DisableIRQ(PORT0_15_IRQn);
+  __enable_irq();
+
+
+  /* Check and Clear interrupt pending status in NVIC */
+  if (CMSDK_GPIO==CMSDK_GPIO0) {
+
+      if (test_individual_irq == 1) {
+        for (i=0;i<16;i++){
+          if (NVIC_GetPendingIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + i))) == 0) { /* Should have been set */
+            err_code = err_code | (1<<i);
+          }
+          NVIC_ClearPendingIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + i)));
+        }
+       }
+       if (NVIC_GetPendingIRQ(PORT0_ALL_IRQn) == 0) {/* Should have been set */
+          err_code = err_code | (1<<16);
+       }
+  }
+
+  if (CMSDK_GPIO==CMSDK_GPIO1) {
+    if (NVIC_GetPendingIRQ(PORT1_ALL_IRQn) == 0) {/* Should have been set */
+      err_code = err_code | (1<<17);
+      }
+    }
+
+  NVIC_ClearPendingIRQ(PORT0_ALL_IRQn);
+  NVIC_ClearPendingIRQ(PORT1_ALL_IRQn);
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : IRQ pending failed (0x%x)\n", err_code);
+    return_val =1;
+    err_code = 0;
+  }
+  else puts("Register Read/Write Test Passed");
+
+  return(return_val);
+}
+
+/* --------------------------------------------------------------- */
+/*  GPIO Unused Addresses access tests                             */
+/* --------------------------------------------------------------- */
+/* Test just one address - should read 0, write should be ignored */
+int gpio_unused_addresses_test_single(unsigned int address)
+{
+  if (HW32_REG(address) != 0) return (1);
+  HW32_REG(address) = 0xFFFFFFFF;
+  if (HW32_REG(address) != 0) return (1);
+  else return (0);
+}
+
+/* Test unused address in GPIO */
+int gpio_unused_addresses_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO){
+  int return_val=0;
+  unsigned int err_code=0;
+
+  unsigned int gpio_base;
+
+  puts("GPIO Unused address test");
+
+  if (CMSDK_GPIO==CMSDK_GPIO0) {
+    gpio_base  = CMSDK_GPIO0_BASE;
+    }
+  else if (CMSDK_GPIO==CMSDK_GPIO1) {
+    gpio_base  = CMSDK_GPIO1_BASE;
+    }
+  else {
+    puts ("ERROR: Input parameter invalid in function 'gpio_unused_addresses_test'.");
+    return 1;
+    }
+
+  if (gpio_unused_addresses_test_single(gpio_base + 0x008)) err_code |= 1 << 0;
+  if (gpio_unused_addresses_test_single(gpio_base + 0x00C)) err_code |= 1 << 1;
+  if (gpio_unused_addresses_test_single(gpio_base + 0x03C)) err_code |= 1 << 2;
+  if (gpio_unused_addresses_test_single(gpio_base + 0x040)) err_code |= 1 << 3;
+  if (gpio_unused_addresses_test_single(gpio_base + 0x3FC)) err_code |= 1 << 4;
+  if (gpio_unused_addresses_test_single(gpio_base + 0xC00)) err_code |= 1 << 5;
+  if (gpio_unused_addresses_test_single(gpio_base + 0xD00)) err_code |= 1 << 6;
+  if (gpio_unused_addresses_test_single(gpio_base + 0xE00)) err_code |= 1 << 7;
+  if (gpio_unused_addresses_test_single(gpio_base + 0xF00)) err_code |= 1 << 8;
+  if (gpio_unused_addresses_test_single(gpio_base + 0xFC0)) err_code |= 1 << 9;
+  if (gpio_unused_addresses_test_single(gpio_base + 0xFC4)) err_code |= 1 << 10;
+  if (gpio_unused_addresses_test_single(gpio_base + 0xFC8)) err_code |= 1 << 11;
+  if (gpio_unused_addresses_test_single(gpio_base + 0xFCC)) err_code |= 1 << 12;
+
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : Unused addresses failed (0x%x)\n", err_code);
+    return_val =1;
+    err_code = 0;
+  }
+  else puts("- Unused addresses Test Passed");
+
+  return(return_val);
+}
+
+/* --------------------------------------------------------------- */
+/*  GPIO interrupt tests                                           */
+/* --------------------------------------------------------------- */
+
+int gpio_interrupt_test(CMSDK_GPIO_TypeDef *CMSDK_GPIO){
+  int return_val=0;
+  int err_code=0;
+  int i;        /* loop variable */
+  int irq_num;  /* loop variable */
+  unsigned int irq_mask; /* one hot bit mask for IRQ being tested in the loop */
+
+  unsigned int gpio_datamask;   /* Data bit mask */
+  int test_individual_irq = 1;  /* Test individual IRQ in GPIO #0 by default */
+
+  if (CMSDK_GPIO==CMSDK_GPIO0) {
+    /* GPIO #0 is not shared in example system */
+    gpio_datamask        = 0xFFFFFFFF; /* All bit can be tested */
+    }
+  else if (CMSDK_GPIO==CMSDK_GPIO1) {
+    /* GPIO #1 is shared with peripherals in example system */
+    /* bit 5 is used by stdout                             */
+    gpio_datamask        = ~((1<<5)|(1<<4)|(1<<2)|(1<<0)); /* skip testing for these bits */
+    }
+  else {
+    puts ("ERROR: Input parameter invalid in function 'gpio_interrupt_test'.");
+    return 1;
+    }
+
+  for (i=0;i<16;i++){
+    gpio0_irq_flags[i]=0;
+    }
+  puts("GPIO interrupt test");
+
+  /* Check interrupt configurations */
+  if (CMSDK_GPIO==CMSDK_GPIO0) {
+    NVIC_EnableIRQ(PORT0_ALL_IRQn);
+    if ((NVIC->ISER[0] & (1<<(PORT0_ALL_IRQn)))==0) {
+      puts("Interrupt PORT0_ALL_IRQn not available.");
+      return_val =1;
+      }
+    NVIC_DisableIRQ(PORT0_ALL_IRQn);
+    }
+  if (CMSDK_GPIO==CMSDK_GPIO1) {
+    NVIC_EnableIRQ(PORT1_ALL_IRQn);
+    if ((NVIC->ISER[0] & (1<<(PORT1_ALL_IRQn)))==0) {
+      puts("Interrupt PORT1_ALL_IRQn not available.");
+      return_val =1;
+      }
+    NVIC_DisableIRQ(PORT1_ALL_IRQn);
+    }
+  NVIC_EnableIRQ(PORT0_15_IRQn);
+  if ((NVIC->ISER[0] & 0x80000000U)==0) {
+    /* Number of IRQ less than 32, skip individual IRQ test */
+    puts("Less then 32 IRQ in design\n");
+    test_individual_irq = 0;
+    }
+  NVIC_DisableIRQ(PORT0_15_IRQn);
+
+  /* Start test loop */
+  for (irq_num = 0 ; irq_num <16; irq_num ++) {
+    if (((gpio_datamask>>irq_num) & 0x1)!=0) {
+      /* test required */
+
+      CMSDK_GPIO->INTENCLR     = 0xFFFFFFFF;
+      CMSDK_GPIO->INTPOLCLR    = 0xFFFFFFFF;
+      CMSDK_GPIO->INTTYPECLR   = 0xFFFFFFFF;
+      CMSDK_GPIO->INTCLEAR     = 0x0000FFFF;
+      CMSDK_GPIO->OUTENABLECLR = 0xFFFFFFFF;
+      gpio0_irq_occurred = 0;
+      gpio1_irq_occurred = 0;
+      gpio0_irq_expected = 0;
+      gpio1_irq_expected = 0;
+      gpio0_irq_level_irq = 1;
+      gpio1_irq_level_irq = 1;
+      multi_irq_test = 0;
+      /* ------------------------------ */
+      /*  Active low interrupt          */
+      /* ------------------------------ */
+      CMSDK_GPIO->DATAOUT     = 0xFFFFFFFF; /* Inactive */
+      CMSDK_GPIO->INTTYPECLR  = 0xFFFFFFFF; /* Low level */
+      CMSDK_GPIO->INTPOLCLR   = 0xFFFFFFFF; /* Low level */
+      irq_mask                 = 1<<irq_num;
+      CMSDK_GPIO->OUTENABLESET = irq_mask;
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        gpio0_irq_expected   = irq_mask;
+        NVIC_EnableIRQ(PORT0_ALL_IRQn);
+        }
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        gpio1_irq_expected   = irq_mask;
+        NVIC_EnableIRQ(PORT1_ALL_IRQn);
+        }
+      /* -- interrupt enable  --        */
+      gpio0_irq_level_irq    = 1;
+      CMSDK_GPIO->INTENSET  = irq_mask;
+      //medium_delay();
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        /* Should not trigger IRQ yet because signal is high */
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<0);}
+        /* Trigger combined IRQ now */
+        CMSDK_GPIO->DATAOUT   = ~irq_mask; /* active */
+        medium_delay();
+        if (gpio0_irq_occurred==0) { err_code |= (1<<1);}
+        }
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        /* Should not trigger IRQ yet because signal is high */
+        if (gpio1_irq_occurred!=0) { err_code |= (1<<0);}
+        /* Trigger combined IRQ now */
+        CMSDK_GPIO->DATAOUT   = ~irq_mask; /* active */
+        medium_delay();
+        if (gpio1_irq_occurred==0) { err_code |= (1<<1);}
+        }
+      /* -- interrupt disable --        */
+      CMSDK_GPIO->INTENCLR  = 0xFFFFFFFF;
+      gpio0_irq_expected     = 0;
+      gpio1_irq_expected     = 0;
+      gpio0_irq_occurred     = 0;
+      gpio1_irq_occurred     = 0;
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        CMSDK_GPIO->DATAOUT   = ~irq_mask; /* active */
+        medium_delay();
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<2);}
+        CMSDK_GPIO->DATAOUT   = 0xFFFFFFFF; /* Inactive */
+        medium_delay();
+        if (CMSDK_GPIO->INTSTATUS!=0){ err_code |= (1<<3);}
+        }
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        CMSDK_GPIO->DATAOUT   = ~irq_mask; /* active */
+        medium_delay();
+        if (gpio1_irq_occurred!=0) { err_code |= (1<<2);}
+        CMSDK_GPIO->DATAOUT   = 0xFFFFFFFF; /* Inactive */
+        medium_delay();
+        if (CMSDK_GPIO->INTSTATUS!=0){ err_code |= (1<<3);}
+        }
+
+      /* -- separated irq --            */
+      if ((CMSDK_GPIO==CMSDK_GPIO0) && (test_individual_irq!=0)) {
+        gpio0_irq_flags[irq_num]=0;
+        NVIC_DisableIRQ(PORT0_ALL_IRQn);
+        NVIC_ClearPendingIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num)));
+        NVIC_EnableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num)));
+        gpio0_irq_expected     = irq_mask;
+        gpio0_irq_level_irq    = 1;
+        CMSDK_GPIO->INTENSET  = irq_mask;
+        CMSDK_GPIO->DATAOUT   = ~irq_mask; /* active */
+        medium_delay();
+        if (gpio0_irq_occurred==0) { err_code |= (1<<4);}
+        if (gpio0_irq_flags[irq_num]==0) { err_code |= (1<<5);}
+        CMSDK_GPIO->DATAOUT   = 0xFFFFFFFF; /* Inactive */
+
+        /* Clean up */
+        NVIC_ClearPendingIRQ(PORT0_ALL_IRQn);
+
+        NVIC_DisableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num)));
+        gpio0_irq_flags[irq_num]= 0;
+        gpio0_irq_expected      = 0;
+        gpio0_irq_occurred      = 0;
+        }
+
+      /* -- multiple irq --             */
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        gpio0_irq_expected   = irq_mask;
+        gpio0_irq_occurred   = 0;
+        NVIC_EnableIRQ(PORT0_ALL_IRQn);
+        }
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        gpio1_irq_expected   = irq_mask;
+        gpio1_irq_occurred   = 0;
+        NVIC_EnableIRQ(PORT1_ALL_IRQn);
+        }
+      multi_irq_test = 3; /* IRQ trigger 3 times */
+      CMSDK_GPIO->INTENSET  = irq_mask;
+      CMSDK_GPIO->DATAOUT   = ~irq_mask; /* active */
+      medium_delay();
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        if (gpio0_irq_occurred!=3) { err_code |= (1<<6);}
+        }
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        if (gpio1_irq_occurred!=3) { err_code |= (1<<6);}
+        }
+      CMSDK_GPIO->DATAOUT   = 0xFFFFFFFF; /* Inactive */
+      CMSDK_GPIO->INTENCLR     = 0xFFFFFFFF; /* Disable */
+      multi_irq_test = 0; /* Disable multiple IRQ test */
+      /* ------------------------------ */
+      /*  Active high interrupt         */
+      /* ------------------------------ */
+      CMSDK_GPIO->INTPOLSET = irq_mask; /* High level */
+      CMSDK_GPIO->DATAOUT   = 0x00000000; /* Inactive */
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        gpio0_irq_expected   = irq_mask;
+        gpio0_irq_occurred   = 0;
+        }
+
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        gpio1_irq_expected   = irq_mask;
+        gpio1_irq_occurred   = 0;
+        }
+      /* -- interrupt enable  --        */
+      CMSDK_GPIO->INTENSET     = irq_mask; /* Enable */
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        /* Should not trigger IRQ yet because signal is low */
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<7);}
+        /* Trigger combined IRQ now */
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* active */
+        medium_delay();
+        if (gpio0_irq_occurred==0) { err_code |= (1<<8);}
+        }
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        /* Should not trigger IRQ yet because signal is low */
+        if (gpio1_irq_occurred!=0) { err_code |= (1<<7);}
+        /* Trigger combined IRQ now */
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* active */
+        medium_delay();
+        if (gpio1_irq_occurred==0) { err_code |= (1<<8);}
+        }
+
+      /* -- interrupt disable --        */
+      CMSDK_GPIO->INTENCLR  = 0xFFFFFFFF;
+      gpio0_irq_expected     = 0;
+      gpio1_irq_expected     = 0;
+      gpio0_irq_occurred     = 0;
+      gpio1_irq_occurred     = 0;
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* active */
+        medium_delay();
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<9);}
+        CMSDK_GPIO->DATAOUT   = 0x00000000; /* Inactive */
+        medium_delay();
+        if (CMSDK_GPIO->INTSTATUS!=0){ err_code |= (1<<10);}
+        }
+
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* active */
+        medium_delay();
+        if (gpio1_irq_occurred!=0) { err_code |= (1<<9);}
+        CMSDK_GPIO->DATAOUT   = 0x00000000; /* Inactive */
+        medium_delay();
+        if (CMSDK_GPIO->INTSTATUS!=0){ err_code |= (1<<10);}
+        }
+
+      /* -- separated irq --            */
+      if ((CMSDK_GPIO==CMSDK_GPIO0) && (test_individual_irq!=0)) {
+        gpio0_irq_flags[irq_num]=0;
+        NVIC_DisableIRQ(PORT0_ALL_IRQn);
+        NVIC_ClearPendingIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num)));
+        NVIC_EnableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num)));
+        gpio0_irq_expected     = irq_mask;
+        gpio0_irq_level_irq    = 1;
+        CMSDK_GPIO->INTENSET  = irq_mask;
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* active */
+        medium_delay();
+        if (gpio0_irq_occurred==0) { err_code |= (1<<11);}
+      if (gpio0_irq_flags[irq_num]==0) { err_code |= (1<<12);}
+        CMSDK_GPIO->DATAOUT   = 0x0; /* Inactive */
+        /* Clean up */
+        NVIC_ClearPendingIRQ(PORT0_ALL_IRQn);
+        NVIC_DisableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num)));
+        gpio0_irq_flags[irq_num]= 0;
+        gpio0_irq_expected      = 0;
+        gpio0_irq_occurred      = 0;
+        }
+      /* -- multiple irq --             */
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        gpio0_irq_expected   = irq_mask;
+        gpio0_irq_occurred   = 0;
+        NVIC_EnableIRQ(PORT0_ALL_IRQn);
+        }
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        gpio1_irq_expected   = irq_mask;
+        gpio1_irq_occurred   = 0;
+        NVIC_EnableIRQ(PORT1_ALL_IRQn);
+        }
+      multi_irq_test = 3; /* IRQ trigger 3 times */
+      CMSDK_GPIO->INTENSET  = irq_mask;
+      CMSDK_GPIO->DATAOUT   = irq_mask; /* active */
+      medium_delay();
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        if (gpio0_irq_occurred!=3) { err_code |= (1<<13);}
+        }
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        if (gpio1_irq_occurred!=3) { err_code |= (1<<13);}
+        }
+      CMSDK_GPIO->DATAOUT   = 0x00000000; /* Inactive */
+      CMSDK_GPIO->INTENCLR  = 0xFFFFFFFF; /* Disable */
+      multi_irq_test = 0; /* Disable multiple IRQ test */
+      /* ------------------------------ */
+      /*  Active rising edge interrupt  */
+      /* ------------------------------ */
+
+      CMSDK_GPIO->INTPOLSET    = irq_mask; /* Rising edge */
+      CMSDK_GPIO->INTTYPESET   = irq_mask; /* Rising edge */
+      CMSDK_GPIO->DATAOUT      = 0x00000000; /* Inactive */
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        gpio0_irq_expected   = irq_mask;
+        gpio0_irq_occurred   = 0;
+        gpio0_irq_level_irq  = 0;
+        }
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        gpio1_irq_expected   = irq_mask;
+        gpio1_irq_occurred   = 0;
+        gpio1_irq_level_irq  = 0;
+        }
+      /* -- interrupt enable  --        */
+      CMSDK_GPIO->INTENSET     = irq_mask; /* Enable */
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        /* Should not trigger IRQ yet because signal is low */
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<14);}
+        /* Trigger combined IRQ now */
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* active */
+        medium_delay();
+        if (gpio0_irq_occurred==0) { err_code |= (1<<15);}
+        gpio0_irq_occurred   = 0;
+        CMSDK_GPIO->DATAOUT   = 0x00000000; /* falling edge, should not trigger */
+        medium_delay();
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<16);}
+
+        }
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        /* Should not trigger IRQ yet because signal is low */
+        if (gpio1_irq_occurred!=0) { err_code |= (1<<14);}
+        /* Trigger combined IRQ now */
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* active */
+        medium_delay();
+        if (gpio1_irq_occurred==0) { err_code |= (1<<15);}
+        gpio1_irq_occurred   = 0;
+        CMSDK_GPIO->DATAOUT   = 0x00000000; /* falling edge, should not trigger */
+        medium_delay();
+        if (gpio1_irq_occurred!=0) { err_code |= (1<<16);}
+        }
+      /* -- interrupt disable --        */
+      CMSDK_GPIO->INTENCLR     = 0xFFFFFFFF; /* Disable */
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        gpio0_irq_occurred   = 0;
+        /* Should not trigger IRQ yet because signal is low */
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<17);}
+        /* Rising edge - but IRQ is disabled */
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* active */
+        medium_delay();
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<18);}
+        gpio0_irq_occurred   = 0;
+        CMSDK_GPIO->DATAOUT   = 0x00000000; /* falling edge, should not trigger */
+        medium_delay();
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<19);}
+
+        }
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        gpio1_irq_occurred   = 0;
+        /* Should not trigger IRQ yet because signal is low */
+        if (gpio1_irq_occurred!=0) { err_code |= (1<<17);}
+        /* Rising edge - but IRQ is disabled */
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* active */
+        medium_delay();
+        if (gpio1_irq_occurred!=0) { err_code |= (1<<18);}
+        gpio1_irq_occurred   = 0;
+        CMSDK_GPIO->DATAOUT   = 0x00000000; /* falling edge, should not trigger */
+        medium_delay();
+        if (gpio1_irq_occurred!=0) { err_code |= (1<<19);}
+        }
+      /* -- separated irq --            */
+      if ((CMSDK_GPIO==CMSDK_GPIO0) && (test_individual_irq!=0)) {
+        gpio0_irq_flags[irq_num]=0;
+        NVIC_DisableIRQ(PORT0_ALL_IRQn);
+        NVIC_ClearPendingIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num)));
+        NVIC_EnableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num)));
+        gpio0_irq_expected     = irq_mask;
+        CMSDK_GPIO->INTENSET     = irq_mask;
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* active */
+        medium_delay();
+        if (gpio0_irq_occurred==0) { err_code |= (1<<20);}
+        if (gpio0_irq_flags[irq_num]==0) { err_code |= (1<<21);}
+        gpio0_irq_occurred = 0;
+        CMSDK_GPIO->DATAOUT   = 0x0; /* Inactive */
+        medium_delay();
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<22);}
+
+        /* Clean up */
+        NVIC_ClearPendingIRQ(PORT0_ALL_IRQn);
+        NVIC_DisableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num)));
+        gpio0_irq_flags[irq_num]= 0;
+        gpio0_irq_expected      = 0;
+        gpio0_irq_occurred      = 0;
+        }
+      /* ------------------------------ */
+      /*  Active falling edge interrupt */
+      /* ------------------------------ */
+      CMSDK_GPIO->INTENCLR     = 0xFFFFFFFF;
+      CMSDK_GPIO->INTPOLCLR    = 0xFFFFFFFF;        /* Falling edge */
+      CMSDK_GPIO->INTTYPESET   = irq_mask; /* Falling edge */
+      CMSDK_GPIO->DATAOUT      = irq_mask; /* Inactive */
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        gpio0_irq_expected   = irq_mask;
+        gpio0_irq_occurred   = 0;
+        gpio0_irq_level_irq  = 0;
+        NVIC_EnableIRQ(PORT0_ALL_IRQn);
+        }
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        gpio1_irq_expected   = irq_mask;
+        gpio1_irq_occurred   = 0;
+        gpio1_irq_level_irq  = 0;
+        NVIC_EnableIRQ(PORT1_ALL_IRQn);
+        }
+      /* -- interrupt enable  --        */
+      CMSDK_GPIO->INTENSET     = irq_mask; /* Enable */
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        /* Should not trigger IRQ yet because signal is high */
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<23);}
+        /* Trigger combined IRQ now */
+        CMSDK_GPIO->DATAOUT   = 0x00000000; /* active */
+        medium_delay();
+        if (gpio0_irq_occurred==0) { err_code |= (1<<24);}
+        gpio0_irq_occurred   = 0;
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* rising edge, should not trigger */
+        medium_delay();
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<25);}
+
+        }
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        /* Should not trigger IRQ yet because signal is low */
+        if (gpio1_irq_occurred!=0) { err_code |= (1<<23);}
+        /* Trigger combined IRQ now */
+        CMSDK_GPIO->DATAOUT   = 0x00000000; /* active */
+        medium_delay();
+        if (gpio1_irq_occurred==0) { err_code |= (1<<24);}
+        gpio1_irq_occurred   = 0;
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* rising edge, should not trigger */
+        medium_delay();
+        if (gpio1_irq_occurred!=0) { err_code |= (1<<25);}
+        }
+      /* -- interrupt disable --        */
+      CMSDK_GPIO->INTENCLR     = 0xFFFFFFFF; /* Disable */
+      if (CMSDK_GPIO==CMSDK_GPIO0) {
+        gpio0_irq_occurred   = 0;
+        /* Should not trigger IRQ yet because signal is low */
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<26);}
+        /* falling edge - but IRQ is disabled */
+        CMSDK_GPIO->DATAOUT   = 0x00000000; /* active */
+        medium_delay();
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<27);}
+        gpio0_irq_occurred   = 0;
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* rising edge, should not trigger */
+        medium_delay();
+        if (gpio0_irq_occurred!=0) { err_code |= (1<<28);}
+
+        }
+      if (CMSDK_GPIO==CMSDK_GPIO1) {
+        gpio1_irq_occurred   = 0;
+        /* Should not trigger IRQ yet because signal is low */
+        if (gpio1_irq_occurred!=0) { err_code |= (1<<26);}
+        /* falling edge - but IRQ is disabled */
+        CMSDK_GPIO->DATAOUT   = 0x00000000; /* active */
+        medium_delay();
+        if (gpio1_irq_occurred!=0) { err_code |= (1<<27);}
+        gpio1_irq_occurred   = 0;
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* rising edge, should not trigger */
+        medium_delay();
+        if (gpio1_irq_occurred!=0) { err_code |= (1<<28);}
+        }
+      /* -- separated irq --            */
+      if ((CMSDK_GPIO==CMSDK_GPIO0) && (test_individual_irq!=0)) {
+        gpio0_irq_flags[irq_num]=0;
+        NVIC_DisableIRQ(PORT0_ALL_IRQn);
+        NVIC_ClearPendingIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num)));
+        NVIC_EnableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num)));
+        gpio0_irq_expected     = irq_mask;
+        CMSDK_GPIO->INTENSET  = irq_mask;
+        CMSDK_GPIO->DATAOUT   = 0x00000000; /* active */
+        medium_delay();
+        if (gpio0_irq_occurred==0) { err_code |= (1<<29);}
+      if (gpio0_irq_flags[irq_num]==0) { err_code |= (1<<30);}
+        gpio0_irq_occurred = 0;
+        CMSDK_GPIO->DATAOUT   = irq_mask; /* Inactive */
+        medium_delay();
+        if (gpio0_irq_occurred!=0) { err_code |= 0x80000000UL;}
+        CMSDK_GPIO->INTENCLR      = 0xFFFFFFFF;
+        /* Clean up */
+        NVIC_ClearPendingIRQ(PORT0_ALL_IRQn);
+        NVIC_DisableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + irq_num)));
+        gpio0_irq_flags[irq_num]= 0;
+        gpio0_irq_expected      = 0;
+        gpio0_irq_occurred      = 0;
+        }
+
+        if (err_code != 0) {
+        printf ("ERROR : Interrupt failed (0x%x)\n", err_code);
+        return_val =1;
+        err_code = 0;
+        }
+
+      /* Cleaning up */
+      CMSDK_GPIO->INTENCLR     = 0xFFFFFFFF;
+      CMSDK_GPIO->INTTYPECLR   = 0xFFFFFFFF;
+      CMSDK_GPIO->INTPOLCLR    = 0xFFFFFFFF;
+      CMSDK_GPIO->OUTENABLECLR = 0xFFFFFFFF;
+      CMSDK_GPIO->DATAOUT      = 0x00000000;
+      CMSDK_GPIO->INTCLEAR     = 0x0000FFFF;
+
+      } /* end if test required */
+    }   /* end for irq_num */
+
+
+  /* Clean up */
+  gpio0_irq_occurred = 0;
+  gpio1_irq_occurred = 0;
+  gpio0_irq_expected = 0;
+  gpio1_irq_expected = 0;
+
+  NVIC_DisableIRQ(PORT0_ALL_IRQn);
+  NVIC_DisableIRQ(PORT1_ALL_IRQn);
+  if (CMSDK_GPIO==CMSDK_GPIO0) {
+    NVIC_ClearPendingIRQ(PORT0_ALL_IRQn);
+    for (i=0;i<16;i++){
+      NVIC_DisableIRQ(((IRQn_Type)(((int)PORT0_0_IRQn) + i)));
+      NVIC_ClearPendingIRQ(PORT0_ALL_IRQn);
+      }
+  } else {
+    NVIC_ClearPendingIRQ(PORT1_ALL_IRQn);
+  }
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : Interrupt failed (0x%x)\n", err_code);
+    return_val =1;
+    err_code = 0;
+    }
+    else puts("Interrupt Test Passed");
+
+  return(return_val);
+}
+/* --------------------------------------- */
+/* Combined interrupt handler for GPIO #0  */
+/*                                         */
+void PORT0_COMB_Handler(void)
+{
+  if (gpio0_irq_expected==0) {
+    puts ("ERROR : Unexpected GPIO 0 interrupt occurred.\n");
+    UartEndSimulation();
+    while (1);
+    }
+  else if (gpio0_irq_level_irq!=0) {
+    if (multi_irq_test > 1) {
+      multi_irq_test--; /* twice here : 3->2, 2->1 */
+      } else {          /* once here  */
+      /* Deassert interrupt source */
+      CMSDK_GPIO0->DATAOUT = CMSDK_GPIO0->DATAOUT ^ gpio0_irq_expected;
+      medium_delay();
+      }
+    }
+  CMSDK_GPIO0->INTCLEAR = gpio0_irq_expected;
+  gpio0_irq_occurred++;
+  return;
+}
+
+/* --------------------------------------- */
+/* Combined interrupt handler for GPIO #1  */
+/*                                         */
+void PORT1_COMB_Handler(void)
+{
+  if (gpio1_irq_expected==0) {
+    puts ("ERROR : Unexpected GPIO 1 interrupt occurred.\n");
+    UartEndSimulation();
+    while (1);
+    }
+  else if (gpio1_irq_level_irq!=0) {
+    if (multi_irq_test > 1) {
+      multi_irq_test--; /* twice here : 3->2, 2->1 */
+      } else {          /* once here  */
+      /* Deassert interrupt source */
+      CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT ^ gpio1_irq_expected;
+      medium_delay();
+      }
+    }
+  CMSDK_GPIO1->INTCLEAR = gpio1_irq_expected;
+  gpio1_irq_occurred++;
+  return;
+}
+
+/* ----------------------------------------- */
+/* Individual interrupt handler for GPIO #0  */
+/*                                           */
+void PORT0_0_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[0]++;
+  return;
+}
+void PORT0_1_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[1]++;
+  return;
+}
+void PORT0_2_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[2]++;
+  return;
+}
+void PORT0_3_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[3]++;
+  return;
+}
+void PORT0_4_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[4]++;
+  return;
+}
+void PORT0_5_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[5]++;
+  return;
+}
+void PORT0_6_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[6]++;
+  return;
+}
+void PORT0_7_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[7]++;
+  return;
+}
+void PORT0_8_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[8]++;
+  return;
+}
+void PORT0_9_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[9]++;
+  return;
+}
+void PORT0_10_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[10]++;
+  return;
+}
+void PORT0_11_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[11]++;
+  return;
+}
+void PORT0_12_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[12]++;
+  return;
+}
+void PORT0_13_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[13]++;
+  return;
+}
+void PORT0_14_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[14]++;
+  return;
+}
+void PORT0_15_Handler(void){
+  PORT0_COMB_Handler();
+  gpio0_irq_flags[15]++;
+  return;
+}
+
diff --git a/Cortex-M0/nanosoc/software/common/validation/memory_tests.c b/Cortex-M0/nanosoc/software/common/validation/memory_tests.c
new file mode 100644
index 0000000..392854a
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/validation/memory_tests.c
@@ -0,0 +1,645 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+  A simple test to check accesses to different memory locations
+*/
+
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#define  SRAM_BASE_ADDR  0x20000000
+#define  SRAM_SIZE       0x10000
+
+#define  ROM_BASE_ADDR   0x00000000
+#define  ROM_SIZE        0x10000
+
+#define  BOOT_BASE_ADDR  0x01000000
+#define  BOOT_SIZE       0x4000
+#define  BOOT_ALIAS_SIZE 0x10000
+
+#define  APB_IO_BASE_ADDR   0x40000000
+#define  APB_IO_SIZE        0x10000
+
+#include <stdio.h>
+#include "uart_stdout.h"
+
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+#define HW16_REG(ADDRESS)  (*((volatile unsigned short *)(ADDRESS)))
+#define HW8_REG(ADDRESS)   (*((volatile unsigned char  *)(ADDRESS)))
+
+#if defined ( __CC_ARM   )
+__asm void          address_test_write(unsigned int addr, unsigned int wdata);
+__asm unsigned int  address_test_read(unsigned int addr);
+#else
+      void          address_test_write(unsigned int addr, unsigned int wdata);
+      unsigned int  address_test_read(unsigned int addr);
+#endif
+void                HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value);
+int                 sram_test(void);
+int                 sram_test_word(unsigned int test_addr);
+int                 rom_test(void);
+int                 boot_rom_test(void);
+int                 apb_io_test(void);
+int                 ahb_io_test(void);
+int                 ID_Check(const unsigned char id_array[], unsigned int offset);
+int                 SysCtrl_ID_Check(const unsigned char id_array[], unsigned int offset);
+int                 SysCtrl_unused_addr_test(void);
+
+/* Global variables */
+volatile int hardfault_occurred;
+volatile int hardfault_expected;
+volatile int temp_data;
+         int hardfault_verbose=0; // 0:Not displaying anything in hardfault handler
+
+const unsigned char ahb_gpio_id[16]     = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+                                           0x20, 0xB8, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1};
+const unsigned char sysctrl_id[16]      = {0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
+                                           0x26, 0xB8, 0x0B, 0x00, 0x0D, 0xF0, 0x05, 0xB1};
+
+int main (void)
+{
+  int err_code = 0;
+
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit");
+  puts(" - Simple memory test - revision $Revision: 371321 $\n");
+
+  temp_data=0;
+  hardfault_occurred = 0;
+  hardfault_expected = 0;
+
+  if (sram_test()     !=0) err_code |= 1<< 0;
+  if (rom_test()      !=0) err_code |= 1<< 1;
+  if (boot_rom_test() !=0) err_code |= 1<< 2;
+  if (apb_io_test()   !=0) err_code |= 1<< 3;
+  if (ahb_io_test()   !=0) err_code |= 1<< 4;
+
+
+  /* Generate test pass/fail and return value */
+  if (err_code==0) {
+    printf ("\n** TEST PASSED **\n");
+  } else {
+    printf ("\n** TEST FAILED **, Error code = (0x%x)\n", err_code);
+  }
+  UartEndSimulation();
+  return 0;
+}
+
+/* -------------------------------------------------------------------- */
+/*   ROM test                                                          */
+/* -------------------------------------------------------------------- */
+int rom_test(void)
+{
+  int err_code = 0;
+
+  puts ("Checking ROM");
+
+  /* Test max and min addresses in ROM boundary */
+  hardfault_occurred = 0;
+  hardfault_expected = 0;
+  temp_data = address_test_read(ROM_BASE_ADDR);
+  if (hardfault_occurred!=0) err_code |= 1<<0;
+  address_test_write(ROM_BASE_ADDR+ROM_SIZE-4, 0);
+  temp_data = address_test_read(ROM_BASE_ADDR+ROM_SIZE-4);
+  if (hardfault_occurred!=0) err_code |= 1<<1;
+
+  /* Test addresses beyond ROM boundary */
+  hardfault_occurred = 0;
+  hardfault_expected = 1;
+  temp_data = address_test_read(((unsigned)(ROM_BASE_ADDR-4)));
+  if (hardfault_occurred==0) err_code |= 1<<2;
+  hardfault_occurred = 0;
+  hardfault_expected = 1;
+  temp_data = address_test_read(ROM_BASE_ADDR+ROM_SIZE);
+  if (hardfault_occurred==0) err_code |= 1<<3;
+
+  if (err_code> 0) {
+    puts ("  Failed\n");
+    printf ("Error code : %x\n", err_code);
+    return 1;
+  } else {
+    puts ("  Passed\n");
+    return 0;
+  }
+}
+/* -------------------------------------------------------------------- */
+/*   Boot loader ROM test                                                          */
+/* -------------------------------------------------------------------- */
+int boot_rom_test(void)
+{
+  int err_code = 0;
+
+  puts ("Checking Boot loader ROM");
+
+  /* Detect if boot loader present */
+  hardfault_occurred = 0;
+  hardfault_expected = 1;
+  temp_data = address_test_read(BOOT_BASE_ADDR);
+  if (hardfault_occurred!=0) {
+    puts ("  Boot loader not present");
+    return 0;
+  }
+
+  /* Test max addresses in Boot loader ROM boundary */
+  hardfault_expected = 0;
+  hardfault_occurred = 0;
+  address_test_write(BOOT_BASE_ADDR+BOOT_SIZE-4, 0);
+  temp_data = address_test_read(BOOT_BASE_ADDR+BOOT_SIZE-4);
+  if (hardfault_occurred!=0) err_code |= 1<<0;
+
+  /* Test addresses beyond Boot loader ROM boundary */
+  hardfault_occurred = 0;
+  hardfault_expected = 1;
+  temp_data = address_test_read(BOOT_BASE_ADDR-4);
+  if (hardfault_occurred==0) err_code |= 1<<1;
+
+  hardfault_occurred = 0;
+  hardfault_expected = 0; /* 64KB range is allocated for boot ROM,
+                 but only 4K is used. Access over 4KB range wraps round */
+  temp_data = address_test_read(BOOT_BASE_ADDR+BOOT_SIZE);
+  if (hardfault_occurred!=0) err_code |= 1<<2;
+
+  hardfault_occurred = 0;
+  hardfault_expected = 1; /* Check beyond alias range */
+  temp_data = address_test_read(BOOT_BASE_ADDR+BOOT_ALIAS_SIZE);
+  if (hardfault_occurred==0) err_code |= 1<<3;
+
+  if (err_code> 0) {
+    puts ("  Failed\n");
+    printf ("Error code : %x\n", err_code);
+    return 1;
+  } else {
+    puts ("  Passed\n");
+    return 0;
+  }
+}
+/* -------------------------------------------------------------------- */
+/*   SRAM test                                                          */
+/* -------------------------------------------------------------------- */
+int sram_test(void)
+{
+  int err_code = 0;
+
+  puts ("Checking SRAM");
+
+  /* Test max and min addresses in SRAM boundary */
+
+  // Starting location
+  if (sram_test_word(SRAM_BASE_ADDR            )!=0) err_code |= 1<<0;
+  // Ending location
+  if (sram_test_word(SRAM_BASE_ADDR+SRAM_SIZE-4)!=0) err_code |= 1<<1;
+
+  /* Test addresses beyond SRAM boundary */
+
+  hardfault_occurred = 0;
+  hardfault_expected = 1;
+  temp_data = address_test_read(SRAM_BASE_ADDR-4);
+  if (hardfault_occurred==0) err_code |= 1<<2;
+
+  hardfault_occurred = 0;
+  hardfault_expected = 1;
+  temp_data = address_test_read(SRAM_BASE_ADDR+SRAM_SIZE);
+  if (hardfault_occurred==0) err_code |= 1<<3;
+
+  hardfault_occurred = 0;
+  hardfault_expected = 0;
+
+  if (err_code> 0) {
+    puts ("  Failed\n");
+    printf ("Error code : %x\n", err_code);
+    return 1;
+  } else {
+    puts ("  Passed\n");
+    return 0;
+  }
+}
+
+int sram_test_word(unsigned int test_addr)
+{
+  int result=0; // This will only work if result and temp are not store in address being tested
+  int temp;
+
+  __disable_irq(); // Make sure interrupt will not affect the result of the test
+
+  temp = HW32_REG(test_addr); // save data
+
+  /* Use consistence memory access size in checking so that it work with
+    both little endian and big endian configs */
+  HW32_REG(test_addr)=0x00000000;
+  if (HW32_REG(test_addr)!=0x00000000) result++;
+  HW16_REG(test_addr)=0xFFFF;
+  if (HW16_REG(test_addr)!=0xFFFF) result++;
+  HW8_REG(test_addr+3)=0x12;
+  HW8_REG(test_addr+2)=0xFF;
+  if (HW8_REG(test_addr+3)!=0x12) result++;
+  if (HW8_REG(test_addr+2)!=0xFF) result++;
+  HW8_REG(test_addr  )=0x00;
+  HW8_REG(test_addr+1)=0x00;
+  if (HW8_REG(test_addr  )!=0x00) result++;
+  if (HW8_REG(test_addr+1)!=0x00) result++;
+  HW16_REG(test_addr+2)=0xFE00;
+  if (HW16_REG(test_addr+2)!=0xFE00) result++;
+  HW32_REG(test_addr)=0x00000000;
+  if (HW32_REG(test_addr)!=0x00000000) result++;
+
+  HW32_REG(test_addr) = temp; // restore data
+  __enable_irq(); // re-enable IRQ
+  if (result !=0) printf ("ERROR: Memory location test failed at %x\n", test_addr);
+  return result;
+}
+
+
+/* -------------------------------------------------------------------- */
+/*   APB test                                                          */
+/* -------------------------------------------------------------------- */
+int apb_io_test(void)
+{
+  int err_code = 0;
+
+  puts ("Checking APB space");
+
+  /* Test max and min addresses in IO boundary */
+  hardfault_occurred = 0;
+  hardfault_expected = 0;
+  temp_data = address_test_read(APB_IO_BASE_ADDR);
+  if (hardfault_occurred!=0) err_code |= 1<<0;
+  temp_data = address_test_read(APB_IO_BASE_ADDR+APB_IO_SIZE-4);
+  if (hardfault_occurred!=0) err_code |= 1<<1;
+
+  /* Test addresses beyond IO boundary */
+  hardfault_occurred = 0;
+  hardfault_expected = 1;
+  temp_data = address_test_read(APB_IO_BASE_ADDR-4);
+  if (hardfault_occurred==0) err_code |= 1<<2;
+
+  /* Address above APB IO space is AHB GPIO, not test here */
+
+  if (err_code> 0) {
+    puts ("  Failed\n");
+    printf ("Error code : %x\n", err_code);
+    return 1;
+  } else {
+    puts ("  Passed\n");
+    return 0;
+  }
+}
+/* -------------------------------------------------------------------- */
+/*   AHB test                                                          */
+/* -------------------------------------------------------------------- */
+int ahb_io_test(void)
+{
+  int           err_code = 0;
+  unsigned int  test_addr;
+  int           i; /* loop counter */
+
+  puts ("Checking AHB I/O space");
+
+  /* Check ID for AHB peripheral */
+  puts (" - GPIO #0 ID values");
+  if (ID_Check(&ahb_gpio_id[0], CMSDK_GPIO0_BASE   ) == 1 ) err_code |= 1<<0;
+  puts (" - GPIO #1 ID values");
+  if (ID_Check(&ahb_gpio_id[0], CMSDK_GPIO1_BASE   ) == 1 ) err_code |= 1<<1;
+  puts (" - System Controller ID values");
+  if (SysCtrl_ID_Check(&sysctrl_id[0],  CMSDK_SYSCTRL_BASE ) == 1 ) err_code |= 1<<2;
+  puts (" - System Controller unused addresses");
+  if (SysCtrl_unused_addr_test() == 1) err_code |= 1<<3;
+
+  /* Check limits of memory maps */
+  puts (" - Address range check");
+  hardfault_occurred = 0;
+  hardfault_expected = 0;
+  temp_data = address_test_read(CMSDK_GPIO0_BASE);  /* Should have no hard fault */
+  if (hardfault_occurred!=0) err_code |= 1<<4;
+  hardfault_occurred = 0;
+  hardfault_expected = 0;
+  temp_data = address_test_read(CMSDK_GPIO1_BASE);  /* Should have no hard fault */
+  if (hardfault_occurred!=0) err_code |= 1<<5;
+  hardfault_occurred = 0;
+  hardfault_expected = 0;
+  temp_data = address_test_read(CMSDK_SYSCTRL_BASE);  /* Should have no hard fault */
+  if (hardfault_occurred!=0) err_code |= 1<<6;
+
+  /* Unused AHB I/O space - should have hard fault */
+  for (i=0;i<13;i++) { // From 0x40010000 to 0x4001FFFF are AHB I/O space
+    hardfault_occurred = 0; // 0x40012000 to 0x4001EFFF are unused (13 slots)
+    hardfault_expected = 1;
+    test_addr = CMSDK_AHB_BASE+0x2000UL+(i*0x1000UL);
+    temp_data = address_test_read(test_addr); // Starting address of each slot
+    if (hardfault_occurred==0) {
+      err_code |= 1<<7;
+      printf("ERROR:Expected bus fault at %x did not take place\n", test_addr);
+    }
+    hardfault_occurred = 0;
+    hardfault_expected = 1;
+    test_addr = test_addr + 0xFFC;
+    temp_data = address_test_read(test_addr); // Ending address of each slot
+    if (hardfault_occurred==0) {
+      err_code |= 1<<8;
+      printf("ERROR:Expected bus fault at %x did not take place\n", test_addr);
+    }
+  } // end_for
+
+  /* Test end of AHB I/O address range */
+  hardfault_occurred = 0;
+  hardfault_expected = 1;
+  temp_data = address_test_read(0x40020000); // address beyond AHB I/O space
+  if (hardfault_occurred==0) {
+    err_code |= 1<<9;
+    puts("ERROR:Expected bus fault at 0x40020000 did not take place");
+  }
+
+  if (err_code> 0) {
+    puts ("  Failed\n");
+    printf ("Error code : %x\n", err_code);
+    return 1;
+  } else {
+    puts ("  Passed\n");
+    return 0;
+  }
+}
+
+/* -------------------------------------------------------------------- */
+/*   ID value check                                                     */
+/* -------------------------------------------------------------------- */
+
+/* Check the ID register value in offset 0xFC0 to 0xFFC (last 16 words, last 12 are IDs) */
+int ID_Check(const unsigned char id_array[], unsigned int offset)
+{
+  int i; /* loop counter */
+  unsigned long expected_val, actual_val;
+  unsigned long compare_mask;
+  int           mismatch = 0;
+  int           id_is_zero = 0;
+  unsigned long test_addr;
+
+  /* Check the peripheral ID and component ID */
+  for (i=0;i<16;i++) {
+    test_addr = offset + 4*i + 0xFC0;
+    expected_val = (int) id_array[i];
+    actual_val   = HW32_REG(test_addr);
+
+    if (actual_val == 0) id_is_zero++; // Check if all ID are zero at the end
+
+    /* create mask to ignore version numbers */
+    if      (i==10) { compare_mask = 0xF0;}  // mask out version field
+    else if (i==11) { compare_mask = 0xFF;}  // mask out ECO field and patch field
+    else            { compare_mask = 0x00;}  // compare whole value
+
+    if ((expected_val & (~compare_mask)) != (actual_val & (~compare_mask))) {
+      printf ("Difference found: %x, expected %x, actual %x\n", test_addr, expected_val, actual_val);
+      mismatch++;
+    }
+  } // end_for
+
+  if (id_is_zero == 16) {
+    puts ("  All ID values are 0   : device not present\n");
+    return 2;
+  } else if (mismatch> 0) {
+    puts ("  ID value mismatch(es) : device unknown\n");
+    return 1;
+  } else {
+    puts ("  All ID values matched : device present\n");
+    return 0;
+  }
+}
+/* Check the ID register value in offset 0xFC0 to 0xFFC (last 16 words, last 12 are IDs) */
+int SysCtrl_ID_Check(const unsigned char id_array[], unsigned int offset)
+{
+  int i; /* loop counter */
+  unsigned long expected_val, actual_val;
+  unsigned long compare_mask;
+  int           mismatch = 0;
+  int           id_is_zero = 0;
+  unsigned long test_addr;
+
+  /* Check the peripheral ID and component ID */
+  for (i=0;i<16;i++) {
+    test_addr = offset + 4*i + 0xFC0;
+    expected_val = (int) id_array[i];
+    actual_val   = HW32_REG(test_addr);
+
+    if (actual_val == 0) id_is_zero++; // Check if all ID are zero at the end
+
+    /* create mask to ignore version numbers */
+    if      (i==10) { compare_mask = 0xF0;}  // mask out version field
+    else if (i==11) { compare_mask = 0xFF;}  // mask out ECO field and patch field
+    else            { compare_mask = 0x00;}  // compare whole value
+
+    if (i==8) {
+      /* The part number of the example system controller in CMSDK can be
+      26 to 29 */
+      if ((actual_val<0x26)||(actual_val>0x29)) {
+        printf ("Difference found: %x, expected 0x26 to 0x29, actual %x\n", test_addr, actual_val);
+        mismatch++;
+      }
+    }
+    else {
+      if ((expected_val & (~compare_mask)) != (actual_val & (~compare_mask))) {
+        printf ("Difference found: %x, expected %x, actual %x\n", test_addr, expected_val, actual_val);
+        mismatch++;
+      }
+    } // end_if_i_eq_8
+  } // end_for
+
+  if (id_is_zero == 16) {
+    puts ("  All ID values are 0   : device not present\n");
+    return 2;
+  } else if (mismatch> 0) {
+    puts ("  ID value mismatch(es) : device unknown\n");
+    return 1;
+  } else {
+    puts ("  All ID values matched : device present\n");
+    return 0;
+  }
+}
+/* --------------------------------------------------------------- */
+/*  SysCtrl Unused Addresses access tests                          */
+/* --------------------------------------------------------------- */
+
+int unused_addresses_test_single(unsigned int address)
+{
+  if (HW32_REG(address) != 0) return (1);
+  HW32_REG(address) = 0xFFFFFFFF;
+  if (HW32_REG(address) != 0) return (1);
+  else return (0);
+}
+
+/* Test unused address in SysCtrl */
+int SysCtrl_unused_addr_test(void)
+{
+  int return_val=0;
+  unsigned int err_code=0;
+
+  if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0x00C)) err_code |= 1 << 0;
+  if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0x014)) err_code |= 1 << 1;
+  if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0x018)) err_code |= 1 << 2;
+  if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0x01C)) err_code |= 1 << 3;
+  if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0x020)) err_code |= 1 << 4;
+  if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xC00)) err_code |= 1 << 5;
+  if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xD00)) err_code |= 1 << 6;
+  if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xE00)) err_code |= 1 << 7;
+  if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xF00)) err_code |= 1 << 8;
+  if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xFC0)) err_code |= 1 << 9;
+  if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xFC4)) err_code |= 1 << 10;
+  if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xFC8)) err_code |= 1 << 11;
+  if (unused_addresses_test_single(CMSDK_SYSCTRL_BASE + 0xFCC)) err_code |= 1 << 12;
+
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("Error : Unused addresses failed (0x%x)\n", err_code);
+    return_val =1;
+  }
+  else puts("   Unused addresses Test Passed\n");
+
+  return(return_val);
+}
+/* -------------------------------------------------------------------- */
+/*   Helper functions for testing bus fault                             */
+/* -------------------------------------------------------------------- */
+
+#if defined ( __CC_ARM   )
+/* Test function for write - for ARM / Keil */
+__asm void address_test_write(unsigned int addr, unsigned int wdata)
+{
+  STR    R1,[R0]
+  DSB    ; Ensure bus fault occurred before leaving this subroutine
+  BX     LR
+}
+
+#else
+/* Test function for write - for gcc */
+void address_test_write(unsigned int addr, unsigned int wdata) __attribute__((naked));
+void address_test_write(unsigned int addr, unsigned int wdata)
+{
+  __asm("  str   r1,[r0]\n"
+        "  dsb          \n"
+        "  bx    lr     \n"
+  );
+}
+#endif
+
+/* Test function for read */
+#if defined ( __CC_ARM   )
+/* Test function for read - for ARM / Keil */
+__asm unsigned int address_test_read(unsigned int addr)
+{
+  LDR    R1,[R0]
+  DSB    ; Ensure bus fault occurred before leaving this subroutine
+  MOVS   R0, R1
+  BX     LR
+}
+#else
+/* Test function for read - for gcc */
+unsigned int  address_test_read(unsigned int addr) __attribute__((naked));
+unsigned int  address_test_read(unsigned int addr)
+{
+  __asm("  ldr   r1,[r0]\n"
+        "  dsb          \n"
+        "  movs  r0, r1 \n"
+        "  bx    lr     \n"
+  );
+}
+#endif
+
+
+#if defined ( __CC_ARM   )
+/* ARM or Keil toolchain */
+__asm void HardFault_Handler(void)
+{
+  MOVS   r0, #4
+  MOV    r1, LR
+  TST    r0, r1
+  BEQ    stacking_used_MSP
+  MRS    R0, PSP ; // first parameter - stacking was using PSP
+  B      get_LR_and_branch
+stacking_used_MSP
+  MRS    R0, MSP ; // first parameter - stacking was using MSP
+get_LR_and_branch
+  MOV    R1, LR  ; // second parameter is LR current value
+  LDR    R2,=__cpp(HardFault_Handler_c)
+  BX     R2
+  ALIGN
+}
+#else
+/* gcc toolchain */
+void HardFault_Handler(void) __attribute__((naked));
+void HardFault_Handler(void)
+{
+  __asm("  movs   r0,#4\n"
+        "  mov    r1,lr\n"
+        "  tst    r0,r1\n"
+        "  beq    stacking_used_MSP\n"
+        "  mrs    r0,psp\n" /*  first parameter - stacking was using PSP */
+        "  ldr    r1,=HardFault_Handler_c  \n"
+        "  bx     r1\n"
+        "stacking_used_MSP:\n"
+        "  mrs    r0,msp\n" /*  first parameter - stacking was using PSP */
+        "  ldr    r1,=HardFault_Handler_c  \n"
+        "  bx     r1\n"
+        ".pool\n" );
+}
+
+#endif
+/* C part of the fault handler - common between ARM / Keil /gcc */
+void HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value)
+{
+  unsigned int stacked_pc;
+  unsigned int stacked_r0;
+  hardfault_occurred++;
+  if (hardfault_verbose) puts ("[Hard Fault Handler]");
+  if (hardfault_expected==0) {
+    puts ("ERROR : Unexpected HardFault interrupt occurred.\n");
+    UartEndSimulation();
+    while (1);
+    }
+  stacked_r0  = ((unsigned long) hardfault_args[0]);
+  stacked_pc  = ((unsigned long) hardfault_args[6]);
+  if (hardfault_verbose)  printf(" - Stacked R0 : 0x%x\n", stacked_r0);
+  if (hardfault_verbose)  printf(" - Stacked PC : 0x%x\n", stacked_pc);
+  /* Modify R0 to a valid address */
+  hardfault_args[0] = (unsigned long) &temp_data;
+
+  return;
+}
+
+
diff --git a/Cortex-M0/nanosoc/software/common/validation/timer_driver_tests.c b/Cortex-M0/nanosoc/software/common/validation/timer_driver_tests.c
new file mode 100644
index 0000000..db888a9
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/validation/timer_driver_tests.c
@@ -0,0 +1,548 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+  A simple test to check the functionalities of timer functions in the example device driver.
+*/
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"
+#include "CMSDK_driver.h"
+
+int volatile timer_irq_counter;
+int volatile timer_irq_executed;
+uint32_t temp_test;
+
+/* Declare test functions */
+int Timer_Init(void);
+int Timer_IRQ(void);
+int Timer_Poll(void);
+int Timer_Ext(void);
+
+int  timer0_id_check(void); // Detect Timer 0 present
+int  gpio1_id_check(void);  // Detect GPIO 1 present
+
+int main (void)
+{
+  int result = 0;
+
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - Timer Driver Test - revision $Revision: 371321 $\n");
+
+  if (timer0_id_check()!=0) {
+    puts ("** TEST SKIPPED ** Timer 0 not present.");
+    UartEndSimulation();
+    return 0;}
+
+  /* Run tests */
+  result |= Timer_Init();
+  result |= Timer_IRQ();
+  result |= Timer_Poll();
+
+  if (gpio1_id_check()==0) {
+    /* GPIO #1 is require for creating test input */
+    result |= Timer_Ext(); /* Run external input test */
+    }
+  else {
+    if(result != 0) {
+       printf("** TEST FAILED **, Error code: (0x%x)\n\n", result);
+       }
+    puts ("** TEST SKIPPED ** GPIO 1 not present.");
+    UartEndSimulation();
+    return 0;
+    }
+
+  if(result == 0) {
+    puts("** TEST PASSED **\n");
+  } else {
+    printf("** TEST FAILED **, Error code: (0x%x)\n\n", result);
+  }
+
+  UartEndSimulation();
+
+  return result;
+}
+
+
+
+/* Initialisation test - set timer reload to 0xF00 with interrupt enabled */
+/* The test also check read back values of the control register and reload register */
+int Timer_Init(void)
+{
+  int err_code = 0;
+  uint32_t CTRL = 0;
+
+  puts("\nStage 1 - Timer Initialisation\n");
+
+  /* Stage 1 Test sequence
+  After CMSDK_timer_Init_IntClock is executed,
+  - read back timer #0 control register and save it to a variable
+  - stop timer (to stop interrupt for the moment to improve speed of the checking)
+  - check timer control register is set with correct value
+  - check timer reload register is set with correct value
+  - write back the previous control register value to resume timer operations
+  */
+
+  CMSDK_timer_Init_IntClock(CMSDK_TIMER0, 0xF00, 1);    /*test timer interrupt using internal clock*/
+  CTRL = CMSDK_TIMER0->CTRL;
+  CMSDK_timer_DisableIRQ(CMSDK_TIMER0);
+
+  if((CTRL & CMSDK_TIMER_CTRL_EN_Msk) != 0) {
+    puts("Timer Enabled");
+  }
+  else{
+    err_code |= (1 << 0);
+    printf("** TEST FAILED **, Error code: (0x%x)\n", err_code);
+  }
+  if((CTRL & CMSDK_TIMER_CTRL_SELEXTEN_Msk) == 0){
+    puts("Ext Enable Not Selected");
+  }
+  else{
+    err_code |= (1 << 1);
+    printf("** TEST FAILED **, Error code: (0x%x)\n", err_code);
+  }
+  if((CTRL & CMSDK_TIMER_CTRL_SELEXTCLK_Msk) == 0){
+    puts("Ext Clock Not Selected");
+  }
+  else{
+    err_code |= (1 << 2);
+    printf("** TEST FAILED **, Error code: (0x%x)\n", err_code);
+  }
+  if((CTRL & CMSDK_TIMER_CTRL_IRQEN_Msk) != 0) {
+    puts("Timer IRQ Enabled");
+  }
+  else{
+    err_code |= (1 << 3);
+    printf("** TEST FAILED **, Error code: (0x%x)\n", err_code);
+  }
+  if((CMSDK_TIMER0->RELOAD == 0xF00) != 0){
+    puts("Reload Value of 0xF00");
+  }
+  else{
+    err_code |= (1 << 4);
+    printf("** TEST FAILED **, Error code: (0x%x)\n", err_code);
+  }
+  if((CTRL & 0x9)){
+    CMSDK_TIMER0->CTRL = CTRL;
+    puts("\nTimer Initialisation Successful\n");
+  }
+  else{
+    printf("\n** TEST FAILED ** Timer Initialisation Failed Program Will Now Quit, Error code: (0x%x)\n", err_code);
+    return err_code;
+  }
+
+  if(!err_code) return 0;
+  else return 1;
+}
+/* Interrupt test */
+int Timer_IRQ(void)
+{
+  int counter = 0;               /* Loop counter */
+  int err_code = 0;              /* Variable to record errors */
+  uint32_t CTRL = 0;             /* Variable to hold read back CTRL value */
+  uint32_t RELOAD = 0;           /* Variable to hold updated RELOAD value */
+
+  timer_irq_counter = 0;        /* Set timer interrupt variables to 0 */
+  timer_irq_executed = 0;
+
+  puts("Stage 2 - interrupt\n");
+
+  // For robustness, disable the timer, clear the IRQ in case it's set, then
+  // clear the current value to zero, and then enable again; this should ensure
+  // that operation of this test part starts from a stable point
+  //
+  // Also set the reload value to 0x1f00 to allow the test more time to execute
+  // the test loop, and increment the loop counter sufficiently quickly in
+  // relation to the timer to allow all aspects of this test part to be
+  // executed
+  CMSDK_timer_StopTimer (CMSDK_TIMER0);
+  CMSDK_timer_ClearIRQ  (CMSDK_TIMER0);
+  CMSDK_timer_SetValue  (CMSDK_TIMER0, 0x0);
+  CMSDK_timer_SetReload (CMSDK_TIMER0, 0x1f00);
+  // Now start the timer before the test sequence
+  CMSDK_timer_StartTimer(CMSDK_TIMER0);
+
+  /* Stage 2 Test sequence
+  - timer enabled by CMSDK_timer_Init_IntClock, with interrupt enabled
+  - first interrupt triggered
+  - after first IRQ, timer interrupt is disabled
+  - after loop executed 5 times, reload value is reprogrammed to double the value
+  - after a while, second interrupt taken place
+  - after second IRQ, timer interrupt is disabled
+  - the loop is executed to 10th time (or multiple of 10), timer interrupt is re-enabled
+    (multiple of 10 is used to prevent the test from getting stuck.
+     Due to timing dependency nature of this test, the test sequence could be different
+     from expected when there are wait states in the memory system.)
+  - after a while, third interrupt taken place
+  - the timer is stopped inside the timer interrupt handler
+  - the loop is exited
+  */
+
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);
+  NVIC_EnableIRQ(TIMER0_IRQn);
+  while (timer_irq_counter < 3)       /* Wait until IRQ take place 3 times*/
+  {
+    if (timer_irq_executed!=0)        /* This part is executed each time a timer interrupt is detected */
+    {
+      puts ("Timer IRQ\n");
+      printf("Timer Status: %u\n", timer_irq_executed);
+      CMSDK_timer_DisableIRQ(CMSDK_TIMER0);
+      puts("Timer IRQ Disabled");
+      timer_irq_executed=0;           /* clear variable so that this part is not executed until next timer interrupt */
+    }
+
+    printf("Timer Status: %u\n", CMSDK_timer_StatusIRQ(CMSDK_TIMER0));
+
+    counter++; /* loop counter increment */
+
+    if (counter == 5) /* after loop executed 5 times, reload value is reprogrammed to double the value */
+    {
+      printf("Timer Value: %u\n", CMSDK_timer_GetValue(CMSDK_TIMER0));
+      printf("Timer Reload Value: %u\n",CMSDK_timer_GetReload(CMSDK_TIMER0));
+      CMSDK_timer_SetReload(CMSDK_TIMER0, (RELOAD = 2*CMSDK_timer_GetReload(CMSDK_TIMER0)));
+      /*test other timer functions including set reload and set value*/
+      printf("Timer Reload Value now set to: %u\n",CMSDK_timer_GetReload(CMSDK_TIMER0));
+
+      if(RELOAD  == CMSDK_timer_GetReload(CMSDK_TIMER0)) {
+        puts("Timer Reload Value Is Correct");   /*check for reload value */
+      }
+      else{
+        err_code = (1 << 0);
+        printf("** TEST FAILED **, Error code: (0x%x)\n", err_code);
+        break;
+      }
+
+      CMSDK_timer_StopTimer(CMSDK_TIMER0);
+      CMSDK_timer_SetValue(CMSDK_TIMER0, 0x12C);    /*set to 300 to test instant underflow*/
+
+      if(0x12C  == CMSDK_timer_GetValue(CMSDK_TIMER0)) {
+        puts("Timer Value Set to 300");    /*check for reload value */
+      }
+      else{
+        err_code = (1 << 1);
+        printf("** TEST FAILED **, Error code: (0x%x)\n", err_code);
+        break;
+      }
+      CMSDK_timer_StartTimer(CMSDK_TIMER0);
+      CMSDK_timer_EnableIRQ(CMSDK_TIMER0);
+    }
+    if ((counter % 10) == 0) /* the loop is executed to 10th time (or multiple of 10), timer interrupt is re-enabled */
+    {
+      CMSDK_timer_StopTimer(CMSDK_TIMER0);
+      CMSDK_timer_EnableIRQ(CMSDK_TIMER0);
+      CTRL = CMSDK_TIMER0->CTRL;  /* Check timer interrupt is enabled */
+      if((CTRL & CMSDK_TIMER_CTRL_IRQEN_Msk) != 0) {
+        puts("Timer IRQ enabled");
+      }
+      else{
+        err_code |= (1 << 2);
+        printf("** TEST FAILED **, Error code: (0x%x)\n", err_code);
+        break;
+      }
+      CMSDK_timer_StartTimer(CMSDK_TIMER0);
+    }
+  }
+
+  CMSDK_timer_StopTimer(CMSDK_TIMER0);
+  /*read back of control register to make sure value is expected */
+
+  if((CMSDK_TIMER0->CTRL & CMSDK_TIMER_CTRL_EN_Msk) == 0) {
+    puts("\nTimer Stopped");
+  }
+  else{
+    err_code = (1 << 3);
+    printf("** TEST FAILED **, Error code: (0x%x)\n", err_code);
+  }
+
+  if(!err_code) {
+     puts("** Timer IRQ Test Passed **\n");
+  }
+  else printf("** TEST FAILED **, Error code: (0x%x)\n", err_code);
+
+  if(!err_code) return 0;
+  else return 2;
+}
+/* Timer polling test */
+int Timer_Poll(void)
+{
+  int err_code = 0;           /* Variable to record errors */
+  int Reload = 0;             /* Read back value of reload */
+
+  /* Stage 3 Test sequence
+  - timer interrupt is disabled at NVIC
+  - timer is started
+  - each time the timer interrupt status register is set (timer overflow),
+    the counter variable (timer_irq_counter) increments and the interrupt status is cleared.
+  - the loop is executed three times
+  */
+  printf ("\nStage 3 - Polling\n\n");
+
+  NVIC_DisableIRQ(TIMER0_IRQn);                 /*disable IRQ ready to test polling*/
+  // Also enable the Timer IRQ since the test relies on reading the IRQ status
+  // as non-zero to progress - should be enabled by the previous part, but the
+  // behaviour of that part could be different if there are wait-states in the
+  // memory system, and hence it could leave the Timer IRQ disabled
+  CMSDK_timer_EnableIRQ(CMSDK_TIMER0);
+  CMSDK_timer_SetReload(CMSDK_TIMER0,0xF00);    /*reload timer and start it*/
+
+  Reload = CMSDK_timer_GetReload(CMSDK_TIMER0);
+
+  if(Reload  == 0xF00)  {
+    puts("Timer Reload Initialised as 0xF00");   /*check for reload value */
+  }
+  else{
+    err_code = (1 << 0);
+    printf("** TEST FAILED **, Error code: (0x%x)\n", err_code);
+  }
+
+  CMSDK_timer_StartTimer(CMSDK_TIMER0);
+
+  timer_irq_counter = 0;             /* irq counter is re-used for this test although polling is used */
+
+  do {
+    printf("Timer Status: %u\n", CMSDK_timer_StatusIRQ(CMSDK_TIMER0));
+
+    while (CMSDK_timer_StatusIRQ(CMSDK_TIMER0) == 0);  /*wait until timer underflow*/
+    printf("Timer Status: %u\n", CMSDK_timer_StatusIRQ(CMSDK_TIMER0));
+
+    CMSDK_timer_ClearIRQ(CMSDK_TIMER0);        /*Test Timer status function 3 times by polling for interrupt*/
+    timer_irq_counter ++;                      /*status then clearing the IRQ and repeating until 3
+                                                 interrupt requests have occurred*/
+
+  } while (timer_irq_counter<3);
+
+  CMSDK_timer_StopTimer(CMSDK_TIMER0);         /*read back of control register to make sure value is expected */
+
+  if((CMSDK_TIMER0->CTRL & CMSDK_TIMER_CTRL_EN_Msk) == 0) {
+    puts("\nTimer Stopped");
+  }
+  else{
+    err_code = (1 << 1);
+    printf("** TEST FAILED **, Error code: (0x%x)\n", err_code);
+  }
+
+  if(!err_code) puts("** Timer Polling Test Passed\n");
+  else printf("** TEST FAILED **, Error code: (0x%x)\n", err_code);
+
+  if(!err_code) return 0;
+  else return 4;
+}
+
+int Timer_Ext(void){
+
+  int test_disabled = 0;  /* variable for stage 4b:to count tests carried out when timer is disabled by external input*/
+  int test_enabled = 0;   /* variable for stage 4b:to count tests carried out when timer is enabled by external input*/
+  int test_error   = 0;  /* variable for stage 4b:to check the test error result */
+  int enabled = 0;        /* variable for stage 4b:to handle test_disabled and test_enabled variable */
+  int counter = 0;        /* loop counter */
+
+  puts ("\nStage 4 - Ext Stimuli\n");
+
+  /* Stage 4a Test sequence
+  - timer is configured to running with external clock
+  - timer is started
+  - each time the timer interrupt status register is set (timer overflow),
+    the counter variable (timer_irq_counter) increments and the interrupt status is cleared.
+  - the loop is executed to toggle the external clock input until timer interrupt triggers three times
+  */
+
+  puts ("\n -Stage 4a - Ext Clock\n");
+
+  timer_irq_counter = 0;
+
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);                /*Clear pending IRQs before test started*/
+  NVIC_EnableIRQ(TIMER0_IRQn);                      /*enable IRQs*/
+  CMSDK_GPIO1->DATAOUT     = 0x000;                 /*Set external clock input to 0 at start of test*/
+  CMSDK_gpio_SetOutEnable(CMSDK_GPIO1, 0x100);      /*set pin 8 as output so that it can be used as an external clock*/
+  CMSDK_timer_Init_ExtClock(CMSDK_TIMER0, 0x100, 1);/*setup timer to use external clock*/
+
+
+  while(timer_irq_counter < 3)
+  {
+    CMSDK_GPIO1->DATAOUT = 0x100;    /*creates square wave on pin 8 to be used as the external clock*/
+    __ISB();
+    CMSDK_GPIO1->DATAOUT = 0x000;
+    if (timer_irq_executed != 0)
+    {
+      puts ("Timer IRQ");
+      timer_irq_executed = 0;
+    }
+  }
+
+  puts ("\n -Stage 4b - Ext Enable\n");
+
+  /* Stage 4b Test sequence
+  - Timer is configured to running with external enable
+  - Timer is enabled using ext input
+  - The external enable input is toggled for every iteration of the loop
+    to disable/enable the timer for the next iterations
+  - if the timer is enabled and the value of the timer is not the same as the previous value,
+    enable timer test is classed as passed.
+  - if the timer is disabled and the value of the timer is the same as the previous value
+    then the disable timer test is classed as passed.
+  - this process is repeated within one timer overflow and if neither any of the enable timer or disable timer
+    tests ever fail then the test as a whole (Stage 4b) passes.
+  */
+
+  timer_irq_executed = 0;
+  timer_irq_counter = 0;
+  counter = 0;            /*counter used to count the external enable input toggle times*/
+
+  enabled = 1;            /* used to indicate whether the timer is enabled or disabled (if enabled is even,
+                          timer disabled, if enabled is odd, timer enabled) */
+
+  CMSDK_timer_Init_ExtEnable(CMSDK_TIMER0, 0xF00, 1);    /*setup timer so that it uses an external enable*/
+  CMSDK_GPIO1->DATAOUT = 0x100;                          /*set pin 8 (external enable) high so as to enable the timer*/
+
+  puts ("Timer 0 Enabled\n");
+
+  while(timer_irq_counter < 1) /* this test only execute within one timer overflow so that when timer is enabled
+                               the sampled timer values are always different*/
+  {
+      CMSDK_GPIO1->DATAOUT ^= 0x100;
+      /* XOR output port with 0x100 so as to invert the external enable signal*/
+      enabled++;
+      temp_test = CMSDK_timer_GetValue(CMSDK_TIMER0);
+      /*record the timer value so that it can be tested whether or not the timer has actually been disabled or not*/
+
+      if((enabled % 2) == 0) //if timer is disabled i.e. enabled is even, increment the test_disabled counter
+      {
+        test_disabled = 1;
+      }
+      else //
+      {
+        test_enabled = 1;
+      }
+
+    if((test_disabled == 1) && (test_enabled == 0))
+     /*Disable pass condition - only pass if value doesn't change*/
+    {
+      test_disabled = 0;
+      if(temp_test == CMSDK_timer_GetValue(CMSDK_TIMER0))
+      /*if the value of the sampled value is the same as the current timer value,
+      then it can be inferred that the timer is disabled*/
+      {
+        puts("Disable Test Passed");
+      }
+      else
+      {
+        puts("** TEST FAILED ** Disable Test");
+        test_error++;
+      }
+    }
+   else if((test_enabled ==1) && (test_disabled == 0))
+    /*Enable pass condition - only pass if value is different*/
+    {
+      test_enabled = 0;
+      if (temp_test != CMSDK_timer_GetValue(CMSDK_TIMER0))
+        /*if the value of the sampled value is different from the current then
+	  it can be inferred that the timer is enabled*/
+      {
+        puts("Enable Test Passed");
+      }
+      else
+      {
+        puts("** TEST FAILED ** Enable Test");
+        test_error++;
+      }
+    }
+
+   counter++; //Enable Toggle counter
+
+  }
+
+  printf("\nTimer enable/disable toggled %d times\n", counter);
+  if(test_error == 0)
+  {
+    puts("\nExt Stimuli Tests Completed Successfully\n");
+    return 0;
+  }
+  else
+  {
+    printf("\n** TEST FAILED **, Error code: (0x%x)", test_error);
+    return 8;
+  }
+}
+
+void TIMER0_Handler(void)    /*Timer ISR*/
+{
+  timer_irq_counter++;
+  timer_irq_executed=1;
+  if (timer_irq_counter>=3) {
+    CMSDK_timer_StopTimer(CMSDK_TIMER0);
+  }
+  CMSDK_timer_ClearIRQ(CMSDK_TIMER0);
+  return;
+}
+
+// ----------------------------------------------------------
+// Peripheral detection
+// ----------------------------------------------------------
+/* Detect the ARM ID and the part number to see if device is present */
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+#define HW8_REG(ADDRESS)   (*((volatile unsigned char  *)(ADDRESS)))
+int timer0_id_check(void)
+{
+unsigned char timer_id;
+  timer_id = HW8_REG(CMSDK_TIMER0_BASE + 0xFE8) & 0x07;
+
+  if ((HW32_REG(CMSDK_TIMER0_BASE + 0xFE0) != 0x22) ||
+      (HW32_REG(CMSDK_TIMER0_BASE + 0xFE4) != 0xB8) ||
+      (timer_id != 0x03))
+    return 1; /* part ID & ARM ID does not match */
+  else
+    return 0;
+}
+
+int gpio1_id_check(void)
+{
+unsigned char gpio_id;
+  gpio_id = HW8_REG(CMSDK_GPIO1_BASE + 0xFE8) & 0x07;
+
+  if ((HW32_REG(CMSDK_GPIO1_BASE + 0xFE0) != 0x20) ||
+      (HW32_REG(CMSDK_GPIO1_BASE + 0xFE4) != 0xB8) ||
+      (gpio_id != 0x03))
+    return 1; /* part ID & ARM ID does not match */
+  else
+    return 0;
+}
diff --git a/Cortex-M0/nanosoc/software/common/validation/timer_tests.c b/Cortex-M0/nanosoc/software/common/validation/timer_tests.c
new file mode 100644
index 0000000..d0aa902
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/validation/timer_tests.c
@@ -0,0 +1,824 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+  A simple test to check the functionalities of APB timer
+*/
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"
+
+int timer_register_rw_test(CMSDK_TIMER_TypeDef *CMSDK_TIMER);
+int timer_start_stop_test(CMSDK_TIMER_TypeDef *CMSDK_TIMER);
+int timer_interrupt_test_1(CMSDK_TIMER_TypeDef *CMSDK_TIMER);
+int timer_external_input(CMSDK_TIMER_TypeDef *CMSDK_TIMER);
+int  timer0_id_check(void); // Detect Timer 0 present
+int  timer1_id_check(void); // Detect Timer 1 present
+int  gpio1_id_check(void);  // Detect GPIO 1 present
+
+/* Global variables */
+volatile int timer0_irq_occurred;
+volatile int timer1_irq_occurred;
+volatile int timer0_irq_expected;
+volatile int timer1_irq_expected;
+volatile int counter;
+
+/* peripheral and component ID values */
+#define APB_TIMER_PID4  0x04
+#define APB_TIMER_PID5  0x00
+#define APB_TIMER_PID6  0x00
+#define APB_TIMER_PID7  0x00
+#define APB_TIMER_PID0  0x22
+#define APB_TIMER_PID1  0xB8
+#define APB_TIMER_PID2  0x1B
+#define APB_TIMER_PID3  0x00
+#define APB_TIMER_CID0  0x0D
+#define APB_TIMER_CID1  0xF0
+#define APB_TIMER_CID2  0x05
+#define APB_TIMER_CID3  0xB1
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+#define HW8_REG(ADDRESS)   (*((volatile unsigned char  *)(ADDRESS)))
+
+int main (void)
+{
+  int result=0;
+
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - Timer Test - revision $Revision: 371321 $\n");
+
+  timer0_irq_occurred = 0;
+  timer1_irq_occurred = 0;
+  timer0_irq_expected = 0;
+  timer1_irq_expected = 0;
+
+  puts("1) Timer 0");
+
+  if (timer0_id_check()==0) { /* Detect if timer is available */
+    /* Timer 0 present */
+    result += timer_register_rw_test(CMSDK_TIMER0);
+    result += timer_start_stop_test(CMSDK_TIMER0);
+    result += timer_interrupt_test_1(CMSDK_TIMER0);
+
+    if (gpio1_id_check()==0) {
+      /* External input test need GPIO 1 to generate input */
+      result += timer_external_input(CMSDK_TIMER0);
+      } else {
+      puts ("- GPIO #1 not present. Test skipped.");
+      }
+
+    } else {
+    puts ("- Timer #0 not present. Tests skipped.");
+    }
+
+
+  puts("\n2) Timer 1");
+
+  if (timer1_id_check()==0) { /* Detect if timer is available */
+    /* Timer 1 present */
+    result += timer_register_rw_test(CMSDK_TIMER1);
+    result += timer_start_stop_test(CMSDK_TIMER1);
+    result += timer_interrupt_test_1(CMSDK_TIMER1);
+    if (gpio1_id_check()==0) {
+      /* External input test need GPIO 1 to generate input */
+      result += timer_external_input(CMSDK_TIMER1);
+      } else {
+      puts ("- GPIO #1 not present. Test skipped.");
+      }
+    } else {
+    puts ("- Timer #1 not present. Tests skipped.");
+    }
+
+  if (result==0) {
+    printf ("\n** TEST PASSED **\n");
+  } else {
+    printf ("\n** TEST FAILED **\n, Error code = (0x%x)", result);
+  }
+  UartEndSimulation();
+  return 0;
+}
+/* --------------------------------------------------------------- */
+/*  Timer register read/write tests                                */
+/* --------------------------------------------------------------- */
+
+int timer_register_rw_test(CMSDK_TIMER_TypeDef *CMSDK_TIMER){
+  int return_val=0;
+  int err_code=0;
+  unsigned int timer_base;
+  puts("Timer R/W test");
+  puts("- initial values");
+
+  NVIC_DisableIRQ(TIMER0_IRQn);
+  NVIC_DisableIRQ(TIMER1_IRQn);
+
+  if (CMSDK_TIMER->CTRL      != 0) { err_code += (1<<0); }
+  if (CMSDK_TIMER->VALUE     != 0) { err_code += (1<<1); }
+  if (CMSDK_TIMER->RELOAD    != 0) { err_code += (1<<2); }
+  if (CMSDK_TIMER->INTSTATUS != 0) { err_code += (1<<3); }
+
+  timer_base = CMSDK_TIMER0_BASE;
+  if (CMSDK_TIMER==CMSDK_TIMER1) {timer_base = CMSDK_TIMER1_BASE;}
+
+  // Perform a write access to all PIDs
+  HW32_REG(timer_base + 0xFD0) = 0xFFFFFFFF;
+  HW32_REG(timer_base + 0xFD4) = 0xFFFFFFFF;
+  HW32_REG(timer_base + 0xFD8) = 0xFFFFFFFF;
+  HW32_REG(timer_base + 0xFDC) = 0xFFFFFFFF;
+  HW32_REG(timer_base + 0xFE0) = 0xFFFFFFFF;
+  HW32_REG(timer_base + 0xFE4) = 0xFFFFFFFF;
+  HW32_REG(timer_base + 0xFE8) = 0xFFFFFFFF;
+  HW32_REG(timer_base + 0xFEC) = 0xFFFFFFFF;
+  HW32_REG(timer_base + 0xFF0) = 0xFFFFFFFF;
+  HW32_REG(timer_base + 0xFF4) = 0xFFFFFFFF;
+  HW32_REG(timer_base + 0xFF8) = 0xFFFFFFFF;
+  HW32_REG(timer_base + 0xFFC) = 0xFFFFFFFF;
+
+  if (HW32_REG(timer_base + 0xFD0) != APB_TIMER_PID4) {err_code += (1<<4); }
+  if (HW32_REG(timer_base + 0xFD4) != APB_TIMER_PID5) {err_code += (1<<5); }
+  if (HW32_REG(timer_base + 0xFD8) != APB_TIMER_PID6) {err_code += (1<<6); }
+  if (HW32_REG(timer_base + 0xFDC) != APB_TIMER_PID7) {err_code += (1<<7); }
+  if (HW32_REG(timer_base + 0xFE0) != APB_TIMER_PID0) {err_code += (1<<8); }
+  if (HW32_REG(timer_base + 0xFE4) != APB_TIMER_PID1) {err_code += (1<<9); }
+  if (HW32_REG(timer_base + 0xFE8) != APB_TIMER_PID2) {err_code += (1<<10); }
+  if (HW32_REG(timer_base + 0xFEC) != APB_TIMER_PID3) {err_code += (1<<11); }
+  if (HW32_REG(timer_base + 0xFF0) != APB_TIMER_CID0) {err_code += (1<<12); }
+  if (HW32_REG(timer_base + 0xFF4) != APB_TIMER_CID1) {err_code += (1<<13); }
+  if (HW32_REG(timer_base + 0xFF8) != APB_TIMER_CID2) {err_code += (1<<14); }
+  if (HW32_REG(timer_base + 0xFFC) != APB_TIMER_CID3) {err_code += (1<<15); }
+
+
+  if (err_code != 0) {
+    printf ("ERROR : initial value failed (0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+  puts("- read/write");
+
+  CMSDK_TIMER->VALUE = 0x3355AAFF;
+  if (CMSDK_TIMER->VALUE     != 0x3355AAFF) { err_code += (1<<0); }
+  CMSDK_TIMER->VALUE = 0xCCAA5500;
+  if (CMSDK_TIMER->VALUE     != 0xCCAA5500) { err_code += (1<<1); }
+  CMSDK_TIMER->VALUE = 0x00000000;
+  if (CMSDK_TIMER->VALUE     != 0x00000000) { err_code += (1<<2); }
+
+  CMSDK_TIMER->RELOAD = 0x3355AAFF;
+  if (CMSDK_TIMER->RELOAD    != 0x3355AAFF) { err_code += (1<<3); }
+  CMSDK_TIMER->RELOAD = 0xCCAA5500;
+  if (CMSDK_TIMER->RELOAD    != 0xCCAA5500) { err_code += (1<<4); }
+  CMSDK_TIMER->RELOAD = 0x00000000;
+  if (CMSDK_TIMER->RELOAD    != 0x00000000) { err_code += (1<<5); }
+
+  CMSDK_TIMER->CTRL = 0x01; /* Set enable */
+  if (CMSDK_TIMER->CTRL      != 0x01) { err_code += (1<<6); }
+  CMSDK_TIMER->CTRL = 0x02; /* external select */
+  if (CMSDK_TIMER->CTRL      != 0x02) { err_code += (1<<7); }
+  CMSDK_TIMER->CTRL = 0x04; /* external clock select */
+  if (CMSDK_TIMER->CTRL      != 0x04) { err_code += (1<<8); }
+  CMSDK_TIMER->CTRL = 0x08; /* external clock select */
+  if (CMSDK_TIMER->CTRL      != 0x08) { err_code += (1<<9); }
+  CMSDK_TIMER->CTRL = 0x00; /* all clear */
+  if (CMSDK_TIMER->CTRL      != 0x00) { err_code += (1<<10); }
+
+  /* Trigger timer interrupt status */
+  CMSDK_TIMER->RELOAD = 0x3;
+  CMSDK_TIMER->VALUE  = 0x3;
+  CMSDK_TIMER->CTRL   = 0x9; /* enable with internal clock as source */
+  while ( CMSDK_TIMER->INTSTATUS == 0);
+  CMSDK_TIMER->CTRL   = 0x0; /* disable timer */
+  if (CMSDK_TIMER->INTSTATUS  != 0x01) { err_code += (1<<11); }
+  CMSDK_TIMER->INTCLEAR = 0x1; /* clear timer interrupt */
+  if (CMSDK_TIMER->INTSTATUS  != 0x00) { err_code += (1<<12); }
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : Read/write failed (0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);
+  NVIC_ClearPendingIRQ(TIMER1_IRQn);
+
+  return(return_val);
+}
+
+/* --------------------------------------------------------------- */
+/*  Timer start/stop tests                                         */
+/* --------------------------------------------------------------- */
+/*
+  Timer value set to 0x1000, and enabled.
+  A polling loop is then use to check that timer had decremented to 0x900
+  within a certain period of time. A software variable called counter to
+  used to detect timeout, which make sure that the test report fail
+  if the timer does not decrement.
+
+  The timer is then stopped, and the value is sampled twice and checked
+  that the timer is really stopped.
+
+  The timer value is then set to 0x10, and then enabled, with interrupt feature
+  enabled (Note : NVIC is not enabled for this test so interrupt doesn't get
+  triggered).
+  A polling loop is then use to wait until timer reach zero and reloaded
+  (by checking interrupt status register).  The current value of the timer
+  is then checked to make sure it is in the expected value range.
+
+*/
+int timer_start_stop_test(CMSDK_TIMER_TypeDef *CMSDK_TIMER){
+  int return_val=0;
+  int err_code=0;
+  unsigned long tvalue;
+  puts("Timer start/stop test");
+  puts("- timer enable");
+
+  NVIC_DisableIRQ(TIMER0_IRQn);
+  NVIC_DisableIRQ(TIMER1_IRQn);
+
+  CMSDK_TIMER->RELOAD = 0x1000;
+  CMSDK_TIMER->VALUE  = 0x1000;
+  CMSDK_TIMER->CTRL = 0x01; /* Set enable */
+  counter = 0x100; /* Time out counter */
+  while ((CMSDK_TIMER->VALUE > 0x900) && (counter>= 0)){
+    counter --;
+    }
+  CMSDK_TIMER->CTRL = 0x00; /* stop timer for now */
+  if (CMSDK_TIMER->VALUE > 0x900) {
+     puts("ERROR : Timer not decrementing.");
+     err_code += (1<<0);
+     }
+
+  tvalue = CMSDK_TIMER->VALUE;
+  puts("- timer disable");
+  __NOP();
+  __NOP();
+  if (CMSDK_TIMER->VALUE != tvalue) {
+     puts("ERROR : Timer not stopping.");
+     err_code += (1<<1);
+     }
+
+  /* Check reload operation */
+  puts("- timer reload");
+  CMSDK_TIMER->VALUE  = 0x10;
+  CMSDK_TIMER->CTRL = 0x09; /* Set enable, and interrupt generation */
+  while ( CMSDK_TIMER->INTSTATUS == 0);
+  CMSDK_TIMER->CTRL = 0x00; /* Stop timer */
+  if (CMSDK_TIMER->VALUE > CMSDK_TIMER->RELOAD) {
+     puts("ERROR : Timer reload fail 1.");
+     err_code += (1<<2);
+     }
+  if ( (CMSDK_TIMER->RELOAD - CMSDK_TIMER->VALUE) > 0x100 ) {
+     puts("ERROR : Timer reload fail 2.");
+     err_code += (1<<3);
+     }
+
+  // Need to lower the interrupt in the timer before clearing in the NVIC
+  CMSDK_TIMER->INTCLEAR = 1;
+  // Clear the NVIC interrupts related to both timers to save working out which
+  // timer is currently being tested
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);
+  NVIC_ClearPendingIRQ(TIMER1_IRQn);
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : start/stop failed (0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+
+  return(return_val);
+}
+/* --------------------------------------------------------------- */
+/*  Timer interrupt test 1                                         */
+/* --------------------------------------------------------------- */
+/*
+  Interrupt enable:
+   Timer is enabled, with reload value set to 0x7F (128 cycles),
+   and timer interrupt is enabled.
+   check that timer interrupt has take place as least twice
+   when counter (software variable) is increased from 0 to 0x300.
+   If counter is > 0x300 but less than two timer interrupt is received
+   (timerx_irq_occurred < 2), then flag it as time out error.
+
+  Interrupt disable:
+   Timer is enabled, with reload value set to 0x1F (32 cycles),
+   and timer interrupt is disabled.
+   The counter (software variable) is increased from 0 to 0x100.
+   Check that timer interrupt did not take place.
+   (timer0_irq_occurred and timer1_irq_occurred are 0).
+
+*/
+int timer_interrupt_test_1(CMSDK_TIMER_TypeDef *CMSDK_TIMER){
+  int return_val=0;
+  int err_code=0;
+
+  puts ("Timer interrupt test");
+  puts ("- Test interrupt generation enabled.");
+  CMSDK_TIMER->VALUE = 0; /* Disable timer */
+
+  NVIC_DisableIRQ(TIMER0_IRQn);
+  NVIC_DisableIRQ(TIMER1_IRQn);
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);
+  NVIC_ClearPendingIRQ(TIMER1_IRQn);
+
+  /* Check which timer is being tested and setup software flags */
+  if (CMSDK_TIMER==CMSDK_TIMER0) {
+    timer0_irq_expected = 1;
+    timer1_irq_expected = 0;
+    timer0_irq_occurred = 0;
+    timer1_irq_occurred = 0;
+
+    NVIC_EnableIRQ(TIMER0_IRQn);  /* Enable Timer Interrupt */
+
+    }
+
+  if (CMSDK_TIMER==CMSDK_TIMER1) {
+    timer0_irq_expected = 0;
+    timer1_irq_expected = 1;
+    timer0_irq_occurred = 0;
+    timer1_irq_occurred = 0;
+
+    NVIC_EnableIRQ(TIMER1_IRQn);  /* Enable Timer Interrupt */
+
+    }
+
+
+  CMSDK_TIMER->RELOAD = 0x01FF;
+  CMSDK_TIMER->VALUE  = 0x01FF;
+  CMSDK_TIMER->CTRL   = 0x0009;  /* Timer enabled */
+  counter = 0;
+  if (CMSDK_TIMER==CMSDK_TIMER0) {
+    while (( timer0_irq_occurred < 2) && (counter < 0x300)){
+      counter ++;
+      };
+    CMSDK_TIMER->CTRL   = 0x0000;  /* Stop Timer */
+    }
+
+  if (CMSDK_TIMER==CMSDK_TIMER1) {
+    while (( timer1_irq_occurred < 2) && (counter < 0x300)){
+      counter ++;
+      };
+    CMSDK_TIMER->CTRL   = 0x0000;  /* Stop Timer */
+    }
+  /* Check timeout has not occurred */
+  if (counter >= 0x300) {
+     puts("ERROR : Timer interrupt enable fail.");
+     err_code += (1<<0);
+    }
+  counter = 0;
+
+  puts ("- Test interrupt generation disabled.");
+  timer0_irq_expected = 0;
+  timer1_irq_expected = 0;
+  timer0_irq_occurred = 0;
+  timer1_irq_occurred = 0;
+
+  CMSDK_TIMER->RELOAD = 0x001F;
+  CMSDK_TIMER->VALUE  = 0x001F;
+  CMSDK_TIMER->CTRL   = 0x0001;  /* Timer enabled, with interrupt generation disabled */
+  counter = 0;
+  while ((counter<0x100) && (timer0_irq_occurred==0) && (timer1_irq_occurred==0)) {
+    counter++;
+  }
+  CMSDK_TIMER->CTRL   = 0x0000;  /* Stop Timer */
+  if ((timer0_irq_occurred!=0) || (timer1_irq_occurred!=0)) {
+     puts("ERROR : Timer interrupt disable fail.");
+     err_code += (1<<1);
+    }
+  counter = 0;
+
+  NVIC_DisableIRQ(TIMER0_IRQn);
+  NVIC_DisableIRQ(TIMER1_IRQn);
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : Interrupt test failed (0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+
+  return(return_val);
+}
+
+/* --------------------------------------------------------------- */
+/*  Timer extin test 1                                             */
+/* --------------------------------------------------------------- */
+/* External input :
+   TIMER 0 - GPIO #1 [bit 8]
+   TIMER 1 - GPIO #1 [bit 9]
+
+   Checking of external input as enable:
+   Timer is programmed so that it use external input as enable.
+   The external input is set to 0 (disabled), and the timer value is sample twice
+   to make sure it is not decrementing.
+
+   The program then set the timer current value to 99, and then use the
+   SysTick timer to generate a pulse of 100 cycles on the timer
+   external input.  This is done by
+    - setting up the SysTick to be triggered at every 100 cycles,
+    - the first timer SysTick interrupt is triggered, set ext input to 1
+    - the second timer SysTick interrupt is triggered, set ext input to 0, and disable SysTick
+   After the SysTick exception is entered twice, it then check if the timer has underflowed.
+   (check current value range between 0xFF to 0xA0).
+
+   Since the timer could be running at a divided APB clock speed which is half of the AHB,
+   the value check might fail in such configuration. If the current counter value is between
+   30 and 60, generate another pulse of 100 clocks cycle to the external input and do the
+   check again.
+
+   It then check the timer interrupt status, and the clearing of the interrupt status.
+
+   ------------------------------------
+   Checking of external input as clock:
+   The test then program the timer to use external input as "clock" (rising edge detection).
+   Timer starting value is set to 0xC0.
+   It first keep the external input as 0, and check that the timer current value hasn't been
+   changed.
+
+   It then change the external input to 1, and check if the timer has decrement. (value = 0xBF)
+
+   It then wait for a short period (counter variable decrement from 10 to 0),
+   then check that the timer has not been decremented further.(value = 0xBF)
+
+   It then set external input to 0, again, wait for short period of time,
+   and check that the timer has not been decremented further.(value = 0xBF)
+
+   It then generate 15 pulses on the external input, and check the timer has decrement
+   15 times. (value = 0xB0) It also check that at this stage the timer interrupt status
+   should still be 0.
+
+   It then set the timer value to 2, with interrupt generation enabled, use external input
+   as clock.  The external input is then switched from 0 to 1, (value changed from 2 to 1)
+   and the timer interrupt shouldn't be triggered. (it should only trigger at 1 to 0 value
+   change).
+
+   It then generate another pulse at the external input, and wait for a short period.
+   This time the timer interrupt should be triggered.
+
+   it then clear up the interrupt settings and report test status.
+
+*/
+int timer_external_input(CMSDK_TIMER_TypeDef *CMSDK_TIMER){
+  int return_val=0;
+  int err_code=0;
+  unsigned long tvalue;
+  uint32_t timer_value;
+
+  puts ("Timer external input test");
+  /* Set external inputs low */
+  CMSDK_GPIO1->OUTENABLESET    = (1<<8) | (1<<9);
+  CMSDK_GPIO1->UB_MASKED[3] = 0x0000;
+
+  CMSDK_TIMER->RELOAD = 0x00FF;
+  CMSDK_TIMER->VALUE  = 0x00FF;
+  CMSDK_TIMER->CTRL   = 0x000B;  /* Timer enabled, use external input, interrupt enabled */
+
+  tvalue = CMSDK_TIMER->VALUE;
+  puts("- timer use ext. input");
+  __NOP();  /* Some delay is needed due to double flip-flop synchronization logic */
+  __NOP();
+  if (CMSDK_TIMER->VALUE != tvalue) {
+     puts("ERROR : Timer not stopping when external input is low.");
+     err_code += (1<<0);
+     }
+
+  puts("- use SysTick to generate ext. input pulse");
+  CMSDK_TIMER->VALUE  = 0xFE; /* Use 0xFE so that it count to 0 */
+  counter = 0;
+  NVIC_DisableIRQ(TIMER0_IRQn);
+  NVIC_DisableIRQ(TIMER1_IRQn);
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);
+  NVIC_ClearPendingIRQ(TIMER1_IRQn);
+
+  /* Create a pulse of approximately four times the length of the expected
+   * duration that the system timer will be counting down.
+   * APB is possibly running at half speed, but this should be allowed for by
+   * the fact that the SysTick reload value is set to a larger value than the
+   * system timer start value.  This therefore should allow the system timer to
+   * count round multiple times, and should have the expected outcome
+   * regardless of whether APB is running at full speed or half speed
+   */
+  SysTick->LOAD = (0x100<<2)-1;
+  SysTick->VAL  = 0;
+  SysTick->CTRL = 0x7; /* Enable, use internal clock, interrupt enable */
+
+  while (counter < 2); /* SysTick handler trigger twice */
+
+  /* Timer should be reloaded, expected value between 0xA0 to 0xFF (reload value) */
+  timer_value = CMSDK_TIMER->VALUE;
+  if ((timer_value > 0xFF) || (timer_value < 0xA0)) {
+    printf("ERROR : Timer not running when external input is high (0x%x).\n", timer_value);
+    err_code += (1<<1);
+  }
+
+  /* Timer interrupt should be pending */
+  if (((NVIC_GetPendingIRQ(TIMER0_IRQn)==0)&&(CMSDK_TIMER==CMSDK_TIMER0))||
+      ((NVIC_GetPendingIRQ(TIMER1_IRQn)==0)&&(CMSDK_TIMER==CMSDK_TIMER1)))
+    {
+     puts("ERROR : Timer not trigger #1.");
+     err_code += (1<<2);
+    }
+
+  if (CMSDK_TIMER->INTSTATUS==0) {
+    puts("ERROR : Timer not trigger #2.");
+    err_code += (1<<3);
+    }
+  else {
+    CMSDK_TIMER->INTCLEAR=1; /* Clear interrupt status */
+    if (CMSDK_TIMER->INTSTATUS!=0) {
+      puts("ERROR : Timer not clear.");
+      err_code += (1<<4);
+      }
+    }
+
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);
+  NVIC_ClearPendingIRQ(TIMER1_IRQn);
+
+
+  puts("- use EXTIN as clock");
+  CMSDK_TIMER->VALUE = 0xC0;
+  CMSDK_TIMER->CTRL   = 0x0007;  /* Timer enabled, use external input as clock, interrupt disabled */
+  CMSDK_GPIO1->UB_MASKED[3] = 0x0000;
+  counter = 10;                        /* delay */
+  while (counter > 0) {
+    counter --;
+    }
+  if (CMSDK_TIMER->VALUE != 0xC0) {
+     puts("ERROR : Timer change unexpectedly 1.");
+     err_code += (1<<5);
+    }
+  CMSDK_GPIO1->UB_MASKED[3] = 0x0300; /* Timer should decrement */
+  __ISB();
+  __ISB();
+
+  if (CMSDK_TIMER->VALUE != 0xBF) {
+     puts("ERROR : Timer decrement failed.");
+     err_code += (1<<6);
+    }
+  counter = 10;                        /* delay */
+  while (counter > 0) {
+    counter --;
+    }
+  if (CMSDK_TIMER->VALUE != 0xBF) {
+     puts("ERROR : Timer change unexpectedly 2.");
+     err_code += (1<<7);
+    }
+  CMSDK_GPIO1->UB_MASKED[3] = 0x0000; /* Timer should NOT decrement */
+  counter = 10;                        /* delay */
+  while (counter > 0) {
+    counter --;
+    }
+  if (CMSDK_TIMER->VALUE != 0xBF) {
+     puts("ERROR : Timer change unexpectedly 3.");
+     err_code += (1<<8);
+    }
+  counter = 15;
+  while (counter > 0) {
+    CMSDK_GPIO1->UB_MASKED[3] = 0x0300; /* Timer should decrement */
+    __ISB();
+    CMSDK_GPIO1->UB_MASKED[3] = 0x0000; /* Timer should not decrement */
+    counter --;
+    }
+  if (CMSDK_TIMER->VALUE != 0xB0) {
+     puts("ERROR : Timer counting failed");
+     err_code += (1<<9);
+    }
+
+  /* Check interrupt should not be trigger */
+  if ((NVIC_GetPendingIRQ(TIMER0_IRQn)!=0)||(NVIC_GetPendingIRQ(TIMER1_IRQn)!=0)||
+      (CMSDK_TIMER->INTSTATUS!=0))
+    {
+     puts("ERROR : Timer IRQ set unexpectedly.");
+     err_code += (1<<10);
+    }
+
+  puts("- IRQ at 1->0 transition");
+  CMSDK_TIMER->VALUE  = 0x02;
+  CMSDK_TIMER->CTRL   = 0x000F;  /* Timer enabled, use external input as clock, interrupt enabled */
+  CMSDK_GPIO1->UB_MASKED[3] = 0x0000;
+
+  timer0_irq_expected = 0;
+  timer1_irq_expected = 0;
+  timer0_irq_occurred = 0;
+  timer1_irq_occurred = 0;
+
+  if (CMSDK_TIMER==CMSDK_TIMER0) {
+    NVIC_EnableIRQ(TIMER0_IRQn);
+    }
+
+  if (CMSDK_TIMER==CMSDK_TIMER1) {
+    NVIC_EnableIRQ(TIMER1_IRQn);
+    }
+
+  /* Test no IRQ generation for 2 to 1 transition */
+  CMSDK_GPIO1->UB_MASKED[3] = 0x0300; /* Timer should decrement */
+    __ISB();
+  CMSDK_GPIO1->UB_MASKED[3] = 0x0000; /* Timer should not decrement */
+
+  counter = 10;                        /* delay */
+  while (counter > 0) {
+    counter --;
+    }
+
+  if (CMSDK_TIMER==CMSDK_TIMER0) {
+    timer0_irq_expected=1;
+    }
+
+  if (CMSDK_TIMER==CMSDK_TIMER1) {
+    timer1_irq_expected=1;
+    }
+
+  /* Test IRQ generation for 1 to 0 transition */
+  CMSDK_GPIO1->UB_MASKED[3] = 0x0300; /* Timer should decrement */
+    __ISB();
+  CMSDK_GPIO1->UB_MASKED[3] = 0x0000; /* Timer should not decrement */
+
+  counter = 10;                        /* delay */
+  while (counter > 0) {
+    counter --;
+    }
+  if (((CMSDK_TIMER==CMSDK_TIMER0)&&(timer0_irq_occurred==0))||
+      ((CMSDK_TIMER==CMSDK_TIMER1)&&(timer1_irq_occurred==0))) {
+    puts("ERROR : Timer not trigger.");
+    err_code += (1<<11);
+    }
+
+  timer0_irq_expected = 0;
+  timer1_irq_expected = 0;
+  timer0_irq_occurred = 0;
+  timer1_irq_occurred = 0;
+
+  /* Test IRQ generation for 0 to RELOAD transition */
+  CMSDK_GPIO1->UB_MASKED[3] = 0x0300; /* Timer should decrement */
+    __ISB();
+  CMSDK_GPIO1->UB_MASKED[3] = 0x0000; /* Timer should not decrement */
+
+  counter = 10;                        /* delay */
+  while (counter > 0) {
+    counter --;
+    }
+  if ((timer0_irq_occurred!=0)||(timer1_irq_occurred!=0)) {
+    puts("ERROR : Timer triggered unexpectedly.");
+    err_code += (1<<12);
+    }
+
+  NVIC_DisableIRQ(TIMER0_IRQn);
+  NVIC_DisableIRQ(TIMER1_IRQn);
+  NVIC_ClearPendingIRQ(TIMER0_IRQn);
+  NVIC_ClearPendingIRQ(TIMER1_IRQn);
+
+  /* Clearing up */
+  SysTick->CTRL = 0x0;
+  CMSDK_TIMER->CTRL   = 0x00;/* Disable, use internal clock, interrupt enable */
+  CMSDK_TIMER->RELOAD = 0x0000;
+  CMSDK_TIMER->VALUE  = 0x0000;
+  CMSDK_GPIO1->OUTENABLECLR    = 0xFFFF;
+  CMSDK_GPIO1->UB_MASKED[3] = 0x0000;
+
+  timer0_irq_expected = 0;
+  timer1_irq_expected = 0;
+  timer0_irq_occurred = 0;
+  timer1_irq_occurred = 0;
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : Interrupt test failed (0x%x)\n", err_code);
+    return_val=1;
+    err_code = 0;
+    }
+
+  return(return_val);
+}
+
+/* --------------------------------------------------------------- */
+/* Peripheral detection                                            */
+/* --------------------------------------------------------------- */
+/* Detect the part number to see if device is present              */
+int timer0_id_check(void)
+{
+unsigned char timer_id;
+  timer_id = HW8_REG(CMSDK_TIMER0_BASE + 0xFE8) & 0x07;
+
+  if ((HW32_REG(CMSDK_TIMER0_BASE + 0xFE0) != 0x22) ||
+      (HW32_REG(CMSDK_TIMER0_BASE + 0xFE4) != 0xB8) ||
+      (timer_id != 0x03))
+    return 1; /* part ID & ARM ID does not match */
+  else
+    return 0;
+}
+
+int timer1_id_check(void)
+{
+unsigned char timer_id;
+  timer_id = HW8_REG(CMSDK_TIMER1_BASE + 0xFE8) & 0x07;
+
+  if ((HW32_REG(CMSDK_TIMER1_BASE + 0xFE0) != 0x22) ||
+      (HW32_REG(CMSDK_TIMER1_BASE + 0xFE4) != 0xB8) ||
+      (timer_id != 0x03))
+    return 1; /* part ID & ARM ID does not match */
+  else
+    return 0;
+}
+
+int gpio1_id_check(void)
+{
+unsigned char gpio_id;
+  gpio_id = HW8_REG(CMSDK_GPIO1_BASE + 0xFE8) & 0x07;
+
+  if ((HW32_REG(CMSDK_GPIO1_BASE + 0xFE0) != 0x20) ||
+      (HW32_REG(CMSDK_GPIO1_BASE + 0xFE4) != 0xB8) ||
+      (gpio_id != 0x03))
+    return 1; /* part ID & ARM ID does not match */
+  else
+    return 0;
+}
+
+/* --------------------------------------------------------------- */
+/*  Timer exception handlers                                       */
+/* --------------------------------------------------------------- */
+
+void TIMER0_Handler(void)
+{
+  timer0_irq_occurred ++;
+  CMSDK_TIMER0->INTCLEAR = 1;
+  if (timer0_irq_expected ==0) {
+    puts ("ERROR : Unexpected Timer 0 interrupt occurred.\n");
+    UartEndSimulation();
+    while (1);
+    }
+  return;
+}
+
+void TIMER1_Handler(void)
+{
+  timer1_irq_occurred ++;
+  CMSDK_TIMER1->INTCLEAR = 1;
+  if (timer1_irq_expected ==0) {
+    puts ("ERROR : Unexpected Timer 1 interrupt occurred.\n");
+    UartEndSimulation();
+    while (1);
+    }
+  return;
+}
+/* --------------------------------------------------------------- */
+/*  SysTick exception handlers                                       */
+/* --------------------------------------------------------------- */
+void SysTick_Handler(void)
+{
+  switch (counter) {
+    case 0 :
+      /* Assert the EXTIN to the system timer */
+      CMSDK_GPIO1->UB_MASKED[3] = 0x0300;
+      counter ++;
+      break;
+    case 1 :
+      CMSDK_GPIO1->UB_MASKED[3] = 0x0000;
+      SysTick->CTRL = 0;
+      SCB->ICSR = SCB->ICSR & 0xFDFFFFFF; /* Clear SysTick pending bit */
+      counter ++;
+      break;
+    default:
+      SysTick->CTRL = 0;
+      SCB->ICSR = SCB->ICSR & 0xFDFFFFFF; /* Clear SysTick pending bit */
+      break;
+    }
+  return;
+}
+
diff --git a/Cortex-M0/nanosoc/software/common/validation/uart_driver_tests.c b/Cortex-M0/nanosoc/software/common/validation/uart_driver_tests.c
new file mode 100644
index 0000000..544f45c
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/validation/uart_driver_tests.c
@@ -0,0 +1,408 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+  A simple test to check the functionalities of UART functions in the example device driver.
+*/
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#include <stdio.h>
+#include "string.h"
+#include "uart_stdout.h"
+#include "CMSDK_driver.h"
+
+/* variables shared between interrupt handlers and test program code */
+int volatile uart_txorirq_executed = 0;  /* set to 1 if UARTOVF0_Handler (tx overflow) executed */
+int volatile uart_txorirq_counter = 0;   /* number of time UARTOVF0_Handler executed */
+int volatile uart_data_received = 0;     /* set to 1 if UARTRX1_Handler executed */
+int volatile uart_data_sent = 0;         /* set to 1 if UARTTX0_Handler executed */
+int volatile uart_rxorirq_executed = 0;  /* set to 1 if UARTOVF1_Handler (rx overflow) executed */
+int volatile uart_rxorirq_counter = 0;   /* number of time UARTOVF1_Handler executed */
+
+/* Test Functions declarations */
+int Uart_Init(void);      /* Function to test UART initialization */
+int Uart_Buffull(void);   /* Function to test UART buffer full */
+int Uart_OR(void);        /* Function to test UART overrun */
+int Uart_IRQ(void);       /* Function to test UART interrupt */
+int uart0_id_check(void);  /* Detect UART 0 present */
+int uart1_id_check(void);  /* Detect UART 1 present */
+int gpio1_id_check(void);  /* Detect GPIO 1 present */
+
+int main (void)
+{
+  int result = 0;
+
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - UART Driver Test - revision $Revision: 371321 $\n");
+
+  if ((uart0_id_check()!=0)||(uart1_id_check()!=0)||(gpio1_id_check()!=0)) {
+    puts("** TEST SKIPPED ** UART 0 / UART 1 / GPIO 1 not available");
+    UartEndSimulation();
+    return 0;}
+
+
+  result |= Uart_Init();
+  result |= Uart_Buffull();
+  result |= Uart_OR();
+  result |= Uart_IRQ();
+
+  if (result == 0) {
+    puts("** TEST PASSED **\n");
+  } else {
+    printf("** TEST FAILED **, Error code: (0x%x)\n", result);
+  }
+
+  UartEndSimulation();
+  return 0;
+}
+
+
+void UARTOVF0_Handler(void)                                   /*UART0 Overrun ISR*/
+{
+if(CMSDK_uart_GetOverrunStatus(CMSDK_UART0) == 1){
+    uart_txorirq_executed = 1;                                /*set TX Overrun flag*/
+    uart_txorirq_counter++;                                   /*increment TX Overrun counter*/
+    CMSDK_uart_ClearOverrunStatus(CMSDK_UART0);             /*clear UART0 Overrun IRQ*/
+  }
+}
+
+void UARTOVF1_Handler(void)                                    /*UART1 Overrun ISR*/
+{
+if(CMSDK_uart_GetOverrunStatus(CMSDK_UART1) == 2){
+  uart_rxorirq_executed = 1;                                   /*set RX Overrun flag*/
+  uart_rxorirq_counter++;                                      /*increment RX Overrun counter*/
+  CMSDK_uart_ClearOverrunStatus(CMSDK_UART1);                /*clear UART1 Overrun IRQ*/
+  }
+}
+
+void UARTTX0_Handler(void)                    /*UART0 TX ISR*/
+{
+  uart_data_sent = 1;                         /*set data sent flag*/
+  CMSDK_uart_ClearTxIRQ(CMSDK_UART0);       /*clear UART0 TX IRQ*/
+}
+
+void UARTRX1_Handler(void)                    /*UART1 RX ISR*/
+{
+  uart_data_received = 1;                     /*set data received flag*/
+  CMSDK_uart_ClearRxIRQ(CMSDK_UART1);       /*clear UART1 RX IRQ*/
+}
+
+/* Initialize UART and check return status */
+int Uart_Init(void)
+{
+  int err_code = 0;
+
+  puts("\nStage 1 UART Initialization\n");        //initialise UART0 and UART1 with Baud divider of 32
+                                                  //and all interrupts enabled and also tx and rx enabled
+  CMSDK_gpio_SetAltFunc(CMSDK_GPIO1, 0x000F);
+  if(CMSDK_uart_init(CMSDK_UART0, 0x20, 1, 1, 1, 1, 1, 1) == 0)
+    printf("UART0 Initialised Successfully (Baud Divider of: %d)\n", CMSDK_uart_GetBaudDivider(CMSDK_UART0));
+    /* CMSDK_uart_init() returns 1 if the overflow status is non-zero */
+  else
+  {
+    puts("UART0 Initialization Failed\n");
+    err_code = 1;
+  }
+  if(CMSDK_uart_init(CMSDK_UART1, 0x20, 1, 1, 1, 1, 1, 1) == 0)
+    printf("UART1 Initialised Successfully (Baud Divider of: %d)\n", CMSDK_uart_GetBaudDivider(CMSDK_UART1));
+    /* CMSDK_uart_init() returns 1 if the overflow status is non-zero */
+  else
+  {
+    puts("UART1 Initialization Failed\n");
+    err_code |= 2;
+  }
+
+  if(!err_code) return 0;
+  else return 1;
+  }
+
+
+int Uart_Buffull(void)             //function for testing the Buffer full functions and simple transmission
+{
+  int err_code = 0;
+  int i, k;
+  char received[12] = {0,0,0,0, 0,0,0,0, 0,0,0,0};
+  char transmit[12] = "hello world";
+
+  puts("\nStage 2 Simple Transmission - TX and RX Test\n");
+
+  i = 0; /* transmit character counter */
+  k = 0; /* receive character counter */
+
+  while((CMSDK_uart_GetTxBufferFull(CMSDK_UART0) == 0)){    //while the TX buffer is not full send it data to transmit
+    CMSDK_UART0->DATA = (uint32_t)transmit[i];
+    i++;
+  }
+
+  if(CMSDK_uart_GetTxBufferFull(CMSDK_UART0)) puts("TX Buffer Full ...restarting transmission");
+  else{
+    err_code = (1 << 0);
+    printf("** TEST FAILED **, Error Code: (0x%x)", err_code);
+  }
+
+  /*receive data from transmission and dispose of it*/
+
+  if(CMSDK_uart_GetRxBufferFull(CMSDK_UART1) == 1) CMSDK_uart_ReceiveChar(CMSDK_UART1);
+  else{
+    err_code = (1 << 1);
+    printf("** TEST FAILED **, Error Code: (0x%x)", err_code);
+  }
+
+  i = 0;
+
+  while(k < 12){   //while received string is not the length of the original string
+
+    if(CMSDK_uart_GetRxBufferFull(CMSDK_UART1) == 1){   //receive data from RX buffer when full
+      received[k] = CMSDK_uart_ReceiveChar(CMSDK_UART1);
+      printf("RX Buffer Full ...receiving data... %c\n", received[k]);
+      k++;
+    }
+
+    /*Send data to TX buffer if the TX buffer is not
+    full and the RX buffer of UART1 is also not full.
+    The receive buffer status is checked because the
+    printf statement in the receive polling takes
+    long time so this code cannot handle maximum
+    throughput */
+
+    if((CMSDK_uart_GetTxBufferFull(CMSDK_UART0) == 0) && (CMSDK_uart_GetRxBufferFull(CMSDK_UART1) != 1)){
+      if(i < 12){
+        CMSDK_UART0->DATA = (uint32_t)transmit[i];
+        i++;
+      }
+    }
+  }
+  printf("\nCharacters received: %s\n", received);    //when all characters received print the received string
+
+  if(strcmp(received, transmit)){
+    err_code = 4;
+    puts("** TEST FAILED **, Error : Strings DO Not Match!");
+  }
+
+  if(!err_code) return 0;
+  else return 2;
+}
+
+int Uart_OR(void)              /*function to test driver Overrun functions*/
+{
+  int i = 0, TX = 0, RX = 0, err_code = 0;
+  char transmit[12] = "hello world";
+
+  puts("\nStage 3 Polling");
+
+  puts("\n- Stage 3a Overrun Polling\n");
+
+  while(1)
+  {
+    if(i < 4) CMSDK_UART0->DATA = (uint32_t)'a';                     //if the loop iteration, the value of i, is less
+                                                                      //that 4 then send the TX buffer data to cause a
+    while(i > 10){                                                    //TX overrun if the loop iteration, i, is greater
+      CMSDK_UART0->DATA = (uint32_t)'a';                             //than 10 then send the TX buffer to cause another
+      if(CMSDK_uart_GetOverrunStatus(CMSDK_UART0) == 1) break;      //TX buffer overrun
+    }
+
+  if(CMSDK_uart_GetOverrunStatus(CMSDK_UART0) == 1){
+    puts("TX Buffer Overrun Occurred");
+    CMSDK_uart_ClearOverrunStatus(CMSDK_UART0);
+    TX = 1;
+  }else if(CMSDK_uart_GetOverrunStatus(CMSDK_UART1) == 2){
+    puts("RX Buffer Overrun Occurred");                             //RX buffer overrun will occur as the data
+    CMSDK_uart_ClearOverrunStatus(CMSDK_UART1);                   //is never read from the RX buffer
+    RX = 1;
+  }
+
+  i++;
+  if(RX & TX) break;
+ }
+
+  puts("\n- Stage 3b TX & RX IRQ Polling\n");
+
+  //clear the TX IRQ status and then print the new status
+  CMSDK_uart_ClearTxIRQ(CMSDK_UART0);
+  printf("TX IRQ Status: %d\n", CMSDK_uart_GetTxIRQStatus(CMSDK_UART0));
+
+  if(CMSDK_uart_GetTxIRQStatus(CMSDK_UART0)) err_code = (1 << 0);
+
+  //clear the RX IRQ status and then print the new status
+  CMSDK_uart_ClearRxIRQ(CMSDK_UART1);
+  printf("RX IRQ Status: %d\n", CMSDK_uart_GetRxIRQStatus(CMSDK_UART1));
+
+  if(CMSDK_uart_GetRxIRQStatus(CMSDK_UART1)) err_code = (1 << 1);
+
+  CMSDK_uart_SendChar(CMSDK_UART0, transmit[1]);
+
+  while(!CMSDK_uart_GetTxIRQStatus(CMSDK_UART0));
+  printf("TX IRQ Status: %d\n", CMSDK_uart_GetTxIRQStatus(CMSDK_UART0));     //send data and wait until the TX IRQ status
+  if(!CMSDK_uart_GetTxIRQStatus(CMSDK_UART0)) err_code = (1 << 2);           //is set and then print the new status
+  else CMSDK_uart_ClearTxIRQ(CMSDK_UART0);
+
+
+  while(!CMSDK_uart_GetRxIRQStatus(CMSDK_UART1));
+  printf("RX IRQ Status: %d\n", CMSDK_uart_GetRxIRQStatus(CMSDK_UART1));     //send data and wait until the RX IRQ status
+  if(!CMSDK_uart_GetRxIRQStatus(CMSDK_UART1)) err_code = (1 << 3);           //is set and then print the new status
+  else CMSDK_uart_ClearRxIRQ(CMSDK_UART1);
+
+
+
+  if(err_code){
+    printf("** TEST FAILED **, Polling Test Error Code: (0x%x)", err_code);
+  }
+  else puts("Polling Test Passed");
+
+  if(!err_code) return 0;
+  else return 4;
+}
+
+int Uart_IRQ(void){
+
+/*function to test the TX & RX overrun IRQ functions and the TX and RX IRQ driver
+  functions using a simple interrupt orientated send and receive*/
+
+  int i = 0, j = 0; /* i=transmit character counter, j = receive character counter */
+  int err_code = 0;
+  char received[12] = {0,0,0,0, 0,0,0,0, 0,0,0,0};
+  char transmit[12] = "hello world";
+
+  puts("\nStage 4 IRQ\n");
+  puts("- Stage 4a Overrun IRQ\n");
+
+  NVIC_EnableIRQ(UARTOVF0_IRQn);         //enable both UART0 and UART1 overflow IRQs
+  NVIC_EnableIRQ(UARTOVF1_IRQn);
+
+  while(uart_txorirq_counter <= 3)       //repeat until 3 TX OR IRQs have occurred
+  {
+    if(uart_txorirq_executed){
+      puts("UART TX Overrun IRQ");       //if an TX OR IRQ is performed then this variable is set,
+      uart_txorirq_executed = 0;         //uart_txorirq_executed, and this statement will be printed
+    }
+    CMSDK_UART0->DATA = (uint32_t)'a';  //always send data to the TX buffer to cause TX OR and do not
+    if(uart_rxorirq_executed){           //receive data to cause RX OR
+      puts("UART RX Overrun IRQ");
+      uart_rxorirq_executed = 0;
+    }
+  }
+
+  if(uart_rxorirq_counter < 3){
+    err_code = (1 << 0);
+    printf("** TEST FAILED ** UART RX Overrun Error, Error Code: (0x%x)", err_code);
+  }
+  else puts("UART RX Overrun Passed");
+
+  j = 0;
+  uart_data_received = 1;  //set uart_data_received to one so that the first character is sent
+
+  puts("\n- Stage 4b TX/RX IRQ\n");
+
+  /*- Send a character from the transmit variable
+    - When its received by UART1 transfer it from RX buffer to the received variable
+    - set flag to say it's been received
+    - when received flag has been set send the next character from transmit variable
+    - repeat until all characters have been received*/
+
+  NVIC_EnableIRQ(UARTTX0_IRQn);   //enable both UART0 TX and UART1 RX IRQs
+  NVIC_EnableIRQ(UARTRX1_IRQn);
+
+  while(j < 11)   /*while j, the received character counter, is less than 11, the number of characters to be sent*/
+  { /* uart_data_received and uart_data_sent are updated by TX and RX handlers */
+    if(uart_data_received){
+      puts("UART TX IRQ ....data sent");                    //if the data has been received (which is set in the
+      CMSDK_uart_SendChar(CMSDK_UART0, transmit[i]);      //RX IRQ) then send the character corresponding to
+      i++;                                                  //the character counter, i, increment character counter
+      uart_data_received = 0;
+    }
+    if(uart_data_sent){                                     //if the data has been set (which is set in the
+      printf("UART RX IRQ ....data received.... ");         //TX IRQ) then receive the character corresponding to
+      received[j] = CMSDK_uart_ReceiveChar(CMSDK_UART1);  //the character counter, j, increment character counter
+      printf("%c\n", received[j]);
+      j++;
+      uart_data_sent = 0;
+    }
+  }
+
+  printf("\nString received: %s\n\n", received);
+
+  if(strcmp(received, transmit)){
+    err_code = 1;
+    puts("** TEST FAILED ** Strings Do Not Match!");
+  }
+
+  NVIC_DisableIRQ(UARTOVF0_IRQn);
+  NVIC_DisableIRQ(UARTOVF1_IRQn);       //disable all the enabled IRQs
+  NVIC_DisableIRQ(UARTTX0_IRQn);
+  NVIC_DisableIRQ(UARTRX1_IRQn);
+
+  if(!err_code) return 0;
+  else return 8;
+}
+
+// ----------------------------------------------------------
+// Peripheral detection
+// ----------------------------------------------------------
+/* Detect the part number to see if device is present                */
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+
+int uart0_id_check(void)
+{
+if ((HW32_REG(CMSDK_UART0_BASE + 0xFE0) != 0x21) ||
+    (HW32_REG(CMSDK_UART0_BASE + 0xFE4) != 0xB8))
+  return 1; /* part ID does not match */
+else
+  return 0;
+}
+
+int uart1_id_check(void)
+{
+if ((HW32_REG(CMSDK_UART1_BASE + 0xFE0) != 0x21) ||
+    (HW32_REG(CMSDK_UART1_BASE + 0xFE4) != 0xB8))
+  return 1; /* part ID does not match */
+else
+  return 0;
+}
+
+int gpio1_id_check(void)
+{
+if ((HW32_REG(CMSDK_GPIO1_BASE + 0xFE0) != 0x20) ||
+    (HW32_REG(CMSDK_GPIO1_BASE + 0xFE4) != 0xB8))
+  return 1; /* part ID does not match */
+else
+  return 0;
+}
diff --git a/Cortex-M0/nanosoc/software/common/validation/uart_tests.c b/Cortex-M0/nanosoc/software/common/validation/uart_tests.c
new file mode 100644
index 0000000..cf3b331
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/common/validation/uart_tests.c
@@ -0,0 +1,1241 @@
+//
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//-----------------------------------------------------------------------------
+//
+
+// A simple test to check the functionalities of the APB UART
+
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include "uart_stdout.h"
+
+#define UART_STATE_TXFULL CMSDK_UART_STATE_TXBF_Msk
+#define UART_STATE_RXFULL CMSDK_UART_STATE_RXBF_Msk
+#define UART_STATE_TXOVR  CMSDK_UART_STATE_TXOR_Msk
+#define UART_STATE_RXOVR  CMSDK_UART_STATE_RXOR_Msk
+
+#define UART_CTRL_TXEN         CMSDK_UART_CTRL_TXEN_Msk
+#define UART_CTRL_RXEN         CMSDK_UART_CTRL_RXEN_Msk
+#define UART_CTRL_TXIRQEN      CMSDK_UART_CTRL_TXIRQEN_Msk
+#define UART_CTRL_RXIRQEN      CMSDK_UART_CTRL_RXIRQEN_Msk
+#define UART_CTRL_TXOVRIRQEN   CMSDK_UART_CTRL_TXORIRQEN_Msk
+#define UART_CTRL_RXOVRIRQEN   CMSDK_UART_CTRL_RXORIRQEN_Msk
+#define UART_CTRL_HIGHSPEEDTX  CMSDK_UART_CTRL_HSTM_Msk
+
+#define UART_INTSTATE_TX 1
+#define UART_INTSTATE_RX 2
+#define UART_INTSTATE_TXOVR 4
+#define UART_INTSTATE_RXOVR 8
+
+#define BAUDDIV_MASK 0x000FFFFF
+
+#define DISPLAY 1
+#define NO_DISPLAY 0
+
+/* peripheral and component ID values */
+#define APB_UART_PID4  0x04
+#define APB_UART_PID5  0x00
+#define APB_UART_PID6  0x00
+#define APB_UART_PID7  0x00
+#define APB_UART_PID0  0x21
+#define APB_UART_PID1  0xB8
+#define APB_UART_PID2  0x1B
+#define APB_UART_PID3  0x00
+#define APB_UART_CID0  0x0D
+#define APB_UART_CID1  0xF0
+#define APB_UART_CID2  0x05
+#define APB_UART_CID3  0xB1
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+
+/* Global variables */
+volatile int uart0_irq_occurred;
+volatile int uart1_irq_occurred;
+volatile int uart2_irq_occurred;
+volatile int uart0_irq_expected;
+volatile int uart1_irq_expected;
+volatile int uart2_irq_expected;
+
+/* Function definitions */
+void UartIOConfig(void);
+int  uart_initial_value_check(CMSDK_UART_TypeDef *CMSDK_UART);
+int  simple_uart_test(CMSDK_UART_TypeDef *CMSDK_UART, unsigned int bauddiv, int verbose);
+int  simple_uart_baud_test(void);
+int  simple_uart_baud_test_single(CMSDK_UART_TypeDef *CMSDK_UART,
+                                 unsigned int tx_bauddiv,unsigned int rx_bauddiv,int verbose);
+int  uart_enable_ctrl_test(CMSDK_UART_TypeDef *CMSDK_UART);
+int  uart_tx_rx_irq_test(CMSDK_UART_TypeDef *CMSDK_UART);
+int  uart_tx_rx_overflow_test(CMSDK_UART_TypeDef *CMSDK_UART);
+void delay_for_character(void);
+int  uart2_interrupt_test(void);
+int  uart0_id_check(void);  /* Detect UART 0 present */
+int  uart1_id_check(void);  /* Detect UART 1 present */
+int  gpio1_id_check(void);  /* Detect GPIO 1 present */
+
+int main (void)
+{
+  int result=0;
+
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - UART Test - revision $Revision: 371321 $\n");
+
+  if ((uart0_id_check()!=0)||(uart1_id_check()!=0)||(gpio1_id_check()!=0)) {
+    puts("** TEST SKIPPED ** UART 0 / UART 1 / GPIO 1 not available");
+    UartEndSimulation();
+    return 0;}
+
+  uart0_irq_occurred = 0;
+  uart1_irq_occurred = 0;
+  uart0_irq_expected = 0;
+  uart1_irq_expected = 0;
+
+  uart2_irq_occurred = 0;
+  uart2_irq_expected = 0;
+
+  UartIOConfig();
+
+  result += uart_initial_value_check(CMSDK_UART0);
+  result += uart_initial_value_check(CMSDK_UART1);
+
+  puts("\nUART 0 for transmit, UART 1 for receive\n");
+
+  result += simple_uart_test(CMSDK_UART0, 32, DISPLAY);
+  result += simple_uart_baud_test();
+  result += uart_enable_ctrl_test(CMSDK_UART0);
+  result += uart_tx_rx_irq_test(CMSDK_UART0);
+  result += uart_tx_rx_overflow_test(CMSDK_UART0);
+
+  puts("\nUART 1 for transmit, UART 0 for receive\n");
+
+  result += simple_uart_test(CMSDK_UART1, 16, DISPLAY);
+  result += uart_enable_ctrl_test(CMSDK_UART1);
+  result += uart_tx_rx_irq_test(CMSDK_UART1);
+  result += uart_tx_rx_overflow_test(CMSDK_UART1);
+
+  puts("\nUART 2 interrupt connectivity test\n");
+  result += uart2_interrupt_test();
+
+  if (result==0) {
+    printf ("\n** TEST PASSED **\n");
+  } else {
+    printf ("\n** TEST FAILED ** , Error code = (0x%x)\n", result);
+  }
+  UartEndSimulation();
+  return 0;
+}
+
+void UartIOConfig(void)
+{ /* UART0 and UART1 are arranged in cross over configuration. */
+  /* Enable UART TXD functions for these pins */
+  CMSDK_GPIO1->ALTFUNCSET = (1<<1) | (1<<3);
+  return;
+}
+
+/* --------------------------------------------------------------- */
+/*  UART initial value tests                                       */
+/* --------------------------------------------------------------- */
+int uart_initial_value_check(CMSDK_UART_TypeDef *CMSDK_UART){
+  int return_val=0;
+  int err_code=0;
+  unsigned int uart_base;
+  unsigned int i;
+
+  puts("- check initial values");
+  if (CMSDK_UART->DATA     !=0) {err_code += (1<<0);}
+  if (CMSDK_UART->STATE    !=0) {err_code += (1<<1);}
+  if (CMSDK_UART->CTRL     !=0) {err_code += (1<<2);}
+  if (CMSDK_UART->INTSTATUS!=0) {err_code += (1<<3);}
+  if (CMSDK_UART->BAUDDIV  !=0) {err_code += (1<<4);}
+
+  uart_base = CMSDK_UART0_BASE;
+  if (CMSDK_UART==CMSDK_UART1) {uart_base = CMSDK_UART1_BASE;}
+  if (CMSDK_UART==CMSDK_UART2) {uart_base = CMSDK_UART2_BASE;}
+
+  if (HW32_REG(uart_base + 0xFD0) != APB_UART_PID4) {err_code += (1<<5); }
+  if (HW32_REG(uart_base + 0xFD4) != APB_UART_PID5) {err_code += (1<<6); }
+  if (HW32_REG(uart_base + 0xFD8) != APB_UART_PID6) {err_code += (1<<7); }
+  if (HW32_REG(uart_base + 0xFDC) != APB_UART_PID7) {err_code += (1<<8); }
+  if (HW32_REG(uart_base + 0xFE0) != APB_UART_PID0) {err_code += (1<<9); }
+  if (HW32_REG(uart_base + 0xFE4) != APB_UART_PID1) {err_code += (1<<10); }
+  if (HW32_REG(uart_base + 0xFE8) != APB_UART_PID2) {err_code += (1<<11); }
+  if (HW32_REG(uart_base + 0xFEC) != APB_UART_PID3) {err_code += (1<<12); }
+  if (HW32_REG(uart_base + 0xFF0) != APB_UART_CID0) {err_code += (1<<13); }
+  if (HW32_REG(uart_base + 0xFF4) != APB_UART_CID1) {err_code += (1<<14); }
+  if (HW32_REG(uart_base + 0xFF8) != APB_UART_CID2) {err_code += (1<<15); }
+  if (HW32_REG(uart_base + 0xFFC) != APB_UART_CID3) {err_code += (1<<16); }
+
+  /* test write to PIDs and CIDs - should be ignored */
+  for (i=0; i <12; i++) {
+    HW32_REG(uart_base + 0xFD0 + (i<<2)) = ~HW32_REG(uart_base + 0xFD0 + (i<<2));
+    }
+
+  /* Check read back values again, should not be changed */
+  if (HW32_REG(uart_base + 0xFD0) != APB_UART_PID4) {err_code |= (1<<5); }
+  if (HW32_REG(uart_base + 0xFD4) != APB_UART_PID5) {err_code |= (1<<6); }
+  if (HW32_REG(uart_base + 0xFD8) != APB_UART_PID6) {err_code |= (1<<7); }
+  if (HW32_REG(uart_base + 0xFDC) != APB_UART_PID7) {err_code |= (1<<8); }
+  if (HW32_REG(uart_base + 0xFE0) != APB_UART_PID0) {err_code |= (1<<9); }
+  if (HW32_REG(uart_base + 0xFE4) != APB_UART_PID1) {err_code |= (1<<10); }
+  if (HW32_REG(uart_base + 0xFE8) != APB_UART_PID2) {err_code |= (1<<11); }
+  if (HW32_REG(uart_base + 0xFEC) != APB_UART_PID3) {err_code |= (1<<12); }
+  if (HW32_REG(uart_base + 0xFF0) != APB_UART_CID0) {err_code |= (1<<13); }
+  if (HW32_REG(uart_base + 0xFF4) != APB_UART_CID1) {err_code |= (1<<14); }
+  if (HW32_REG(uart_base + 0xFF8) != APB_UART_CID2) {err_code |= (1<<15); }
+  if (HW32_REG(uart_base + 0xFFC) != APB_UART_CID3) {err_code |= (1<<16); }
+
+  if (err_code != 0) {
+    printf ("ERROR : initial value failed (0x%x)\n", err_code);
+    return_val =1;
+    err_code = 0;
+    }
+
+  return(return_val);
+}
+
+/* --------------------------------------------------------------- */
+/*  UART simple operation test                                     */
+/* --------------------------------------------------------------- */
+int simple_uart_test(CMSDK_UART_TypeDef *CMSDK_UART, unsigned int bauddiv, int verbose)
+{
+  int return_val=0;
+  int err_code=0;
+  CMSDK_UART_TypeDef *TX_UART;
+  CMSDK_UART_TypeDef *RX_UART;
+  char        received_text[20];
+  const char  transmit_text[20] = "Hello world\n";
+  unsigned int tx_count;
+  unsigned int rx_count;
+  unsigned int str_size;
+
+  puts("Simple test");
+  UartPutc('-');
+  UartPutc(' ');
+
+  /* Determine which UART is the sender, and which UART is receiver */
+  if (CMSDK_UART==CMSDK_UART0){
+    TX_UART = CMSDK_UART0;
+    RX_UART = CMSDK_UART1;
+    }
+  else if (CMSDK_UART==CMSDK_UART1){
+    TX_UART = CMSDK_UART1;
+    RX_UART = CMSDK_UART0;
+    }
+  else {
+    puts ("ERROR: Input parameter invalid in function 'simple_uart_test'.");
+    return 1;
+    }
+
+  /* Both UART are programmed with the same baud rate */
+  TX_UART->BAUDDIV = bauddiv;
+  if (TX_UART->BAUDDIV != bauddiv) { err_code += (1<<0);}
+  RX_UART->BAUDDIV = bauddiv;
+  if (RX_UART->BAUDDIV != bauddiv) { err_code += (1<<1);}
+
+  TX_UART->CTRL =   TX_UART->CTRL | UART_CTRL_TXEN; /* Set TX enable */
+  if ((TX_UART->CTRL & UART_CTRL_TXEN)==0) { err_code += (1<<2);}
+  RX_UART->CTRL =   RX_UART->CTRL | UART_CTRL_RXEN; /* Set RX enable */
+  if ((RX_UART->CTRL & UART_CTRL_RXEN)==0) { err_code += (1<<3);}
+
+  tx_count = 0;
+  rx_count = 0;
+  str_size = strlen(transmit_text);
+  do { /* test loop for both tx and rx process */
+    /* tx process */
+    if (((TX_UART->STATE & UART_STATE_TXFULL)==0)&&(tx_count<str_size)) {
+      TX_UART->DATA = transmit_text[tx_count];
+      tx_count++;
+      }
+    /* rx process */
+    if ((RX_UART->STATE & UART_STATE_RXFULL)!=0) {
+      received_text[rx_count] = RX_UART->DATA;
+      if (verbose) UartPutc((char) received_text[rx_count]);
+      rx_count++;
+      }
+  } while ( rx_count <str_size);
+  received_text[rx_count]=0; /* add NULL termination */
+
+  /* Added 3 additional null chars to overcome X-termination in test
+     when reads back X's beyond null char since a load 32-bit word
+     happens rather than a byte access. */
+  received_text[rx_count+1]=0; /* add NULL termination */
+  received_text[rx_count+2]=0; /* add NULL termination */
+  received_text[rx_count+3]=0; /* add NULL termination */
+  if (strcmp(transmit_text, received_text)!=0){ err_code += (1<<4);}
+
+  TX_UART->CTRL =  0; /* Clear TX enable */
+  RX_UART->CTRL =  0; /* Clear RX enable */
+
+  if (err_code != 0) {
+    printf ("ERROR : simple test failed (0x%x)\n", err_code);
+    return_val =1;
+    err_code = 0;
+    }
+
+  return(return_val);
+}
+/* --------------------------------------------------------------- */
+/*  UART baud rate operation test                                  */
+/* --------------------------------------------------------------- */
+int simple_uart_baud_test(void)
+{
+  int return_val=0;
+  int err_code=0;
+  int i;
+  short int tx_bauddiv[10] = {
+  63, 64, 35, 38, 40, 46, 85, 49, 51, 37};
+  short int rx_bauddiv[10] = {
+  63, 64, 35, 38, 40, 46, 85, 49, 51, 37};
+
+  puts("Data transfer test\n");
+
+  for (i=0; i<10; i++) {
+    /* Test TX and RX at same speed */
+    if (simple_uart_baud_test_single(CMSDK_UART0,
+      tx_bauddiv[i],  rx_bauddiv[i]   , NO_DISPLAY)!=0) {err_code |= 0x1;};
+    /* Test RX slower than TX */
+    if (simple_uart_baud_test_single(CMSDK_UART0,
+      tx_bauddiv[i], (rx_bauddiv[i]+1), NO_DISPLAY)!=0) {err_code |= 0x2;};
+    /* Test RX faster than TX */
+    if (simple_uart_baud_test_single(CMSDK_UART0,
+      tx_bauddiv[i], (rx_bauddiv[i]-1), NO_DISPLAY)!=0) {err_code |= 0x4;};
+    if (err_code != 0) {
+      printf ("ERROR : Baud rate test failed (0x%x) at loop %d\n", err_code, i);
+      return_val = 1;
+      err_code   = 0;
+      }
+    else {
+      printf ("- bauddiv = %d done\n", tx_bauddiv[i]);
+      }
+    }
+  CMSDK_UART0->CTRL = 0;
+  CMSDK_UART1->CTRL = 0;
+  CMSDK_UART0->BAUDDIV = 0xFFFFFFFF;
+  if (CMSDK_UART0->BAUDDIV != (0xFFFFFFFF & BAUDDIV_MASK)) {err_code |= (1<<0);};
+  CMSDK_UART0->BAUDDIV = 0xFF55AAC3;
+  if (CMSDK_UART0->BAUDDIV != (0xFF55AAC3 & BAUDDIV_MASK)) {err_code |= (1<<1);};
+  CMSDK_UART0->BAUDDIV = 0x00000000;
+  if (CMSDK_UART0->BAUDDIV != (0x00000000 & BAUDDIV_MASK)) {err_code |= (1<<2);};
+  CMSDK_UART1->BAUDDIV = 0xFFFFFFFF;
+  if (CMSDK_UART1->BAUDDIV != (0xFFFFFFFF & BAUDDIV_MASK)) {err_code |= (1<<3);};
+  CMSDK_UART1->BAUDDIV = 0xAAFF6699;
+  if (CMSDK_UART1->BAUDDIV != (0xAAFF6699 & BAUDDIV_MASK)) {err_code |= (1<<4);};
+  CMSDK_UART1->BAUDDIV = 0x00000000;
+  if (CMSDK_UART1->BAUDDIV != (0x00000000 & BAUDDIV_MASK)) {err_code |= (1<<5);};
+    if (err_code != 0) {
+      printf ("ERROR : Baud rate r/w failed (0x%x)\n", err_code);
+      return_val = 1;
+      err_code   = 0;
+      }
+
+
+  return(return_val);
+
+}
+/* --------------------- */
+int simple_uart_baud_test_single(CMSDK_UART_TypeDef *CMSDK_UART,
+                     unsigned int tx_bauddiv,
+                     unsigned int rx_bauddiv,
+                     int verbose)
+{
+  int return_val=0;
+  int err_code=0;
+  CMSDK_UART_TypeDef *TX_UART;
+  CMSDK_UART_TypeDef *RX_UART;
+  char        received_text[20];
+  const char  transmit_text[20] = "Hello world\n";
+  unsigned int tx_count;
+  unsigned int rx_count;
+  unsigned int str_size;
+
+  /* Determine which UART is the sender, and which UART is receiver */
+  if (CMSDK_UART==CMSDK_UART0){
+    TX_UART = CMSDK_UART0;
+    RX_UART = CMSDK_UART1;
+    }
+  else if (CMSDK_UART==CMSDK_UART1){
+    TX_UART = CMSDK_UART1;
+    RX_UART = CMSDK_UART0;
+    }
+  else {
+    puts ("ERROR: Input parameter invalid in function 'simple_uart_baud_test_single'.");
+    return 1;
+    }
+
+  /* UART can be programmed with different baud rate */
+  TX_UART->BAUDDIV = tx_bauddiv;
+  if (TX_UART->BAUDDIV != tx_bauddiv) { err_code += (1<<0);}
+  RX_UART->BAUDDIV = rx_bauddiv;
+  if (RX_UART->BAUDDIV != rx_bauddiv) { err_code += (1<<1);}
+
+  TX_UART->CTRL =   TX_UART->CTRL | UART_CTRL_TXEN; /* Set TX enable */
+  if ((TX_UART->CTRL & UART_CTRL_TXEN)==0) { err_code += (1<<2);}
+  RX_UART->CTRL =   RX_UART->CTRL | UART_CTRL_RXEN; /* Set RX enable */
+  if ((RX_UART->CTRL & UART_CTRL_RXEN)==0) { err_code += (1<<3);}
+
+  tx_count = 0;
+  rx_count = 0;
+  str_size = strlen(transmit_text);
+  do { /* test loop for both tx and rx process */
+    /* tx process */
+    if (((TX_UART->STATE & UART_STATE_TXFULL)==0)&&(tx_count<str_size)) {
+      TX_UART->DATA = transmit_text[tx_count];
+      tx_count++;
+      }
+    /* rx process */
+    if ((RX_UART->STATE & UART_STATE_RXFULL)!=0) {
+      received_text[rx_count] = RX_UART->DATA;
+      if (verbose) UartPutc((char) received_text[rx_count]);
+      rx_count++;
+      }
+  } while ( rx_count <str_size);
+  received_text[rx_count]=0; /* add NULL termination */
+
+  /* Added 3 additional null chars to overcome X-termination in test
+     when reads back X's beyond null char since a load 32-bit word
+     happens rather than a byte access. */
+  received_text[rx_count+1]=0; /* add NULL termination */
+  received_text[rx_count+2]=0; /* add NULL termination */
+  received_text[rx_count+3]=0; /* add NULL termination */
+  if (strcmp(transmit_text, received_text)!=0){ err_code += (1<<4);}
+
+  TX_UART->CTRL =  0; /* Clear TX enable */
+  RX_UART->CTRL =  0; /* Clear RX enable */
+
+  if (err_code != 0) {
+    printf ("ERROR : baud test failed (0x%x)\n", err_code);
+    return_val =1;
+    err_code = 0;
+    }
+
+  return(return_val);
+}
+/* --------------------------------------------------------------- */
+/*  UART enable control test                                       */
+/* --------------------------------------------------------------- */
+int uart_enable_ctrl_test(CMSDK_UART_TypeDef *CMSDK_UART)
+{
+  int return_val=0;
+  int err_code=0;
+  CMSDK_UART_TypeDef *TX_UART;
+  CMSDK_UART_TypeDef *RX_UART;
+  char ctmp;
+
+  /* Determine which UART is the sender, and which UART is receiver */
+  if (CMSDK_UART==CMSDK_UART0){
+    TX_UART = CMSDK_UART0;
+    RX_UART = CMSDK_UART1;
+    }
+  else if (CMSDK_UART==CMSDK_UART1){
+    TX_UART = CMSDK_UART1;
+    RX_UART = CMSDK_UART0;
+    }
+  else {
+    puts ("ERROR: Input parameter invalid in function 'uart_enable_ctrl_test'.");
+    return 1;
+    }
+
+  puts ("UART enable test");
+  /* UART programmed with same baud rate */
+  TX_UART->BAUDDIV = 32;
+  if (TX_UART->BAUDDIV != 32) { err_code += (1<<0);}
+  RX_UART->BAUDDIV = 32;
+  if (RX_UART->BAUDDIV != 32) { err_code += (1<<1);}
+
+  puts ("- both TX and RX are enabled");
+  TX_UART->CTRL =   TX_UART->CTRL | UART_CTRL_TXEN; /* Set TX enable */
+  if ((TX_UART->CTRL & UART_CTRL_TXEN)==0) { err_code += (1<<2);}
+  RX_UART->CTRL =   RX_UART->CTRL | UART_CTRL_RXEN; /* Set RX enable */
+  if ((RX_UART->CTRL & UART_CTRL_RXEN)==0) { err_code += (1<<3);}
+
+  if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) ||
+      ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) {
+      /* Starting state incorrect */
+      err_code += (1<<4);}
+  TX_UART->DATA = 'A'; /* transmit a character */
+  delay_for_character();
+  if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) ||
+      ((RX_UART->STATE & UART_STATE_RXFULL)==0)) {
+      /* complete state incorrect */
+      err_code += (1<<5);}
+  ctmp = RX_UART->DATA; /* Read received data */
+  if ((RX_UART->STATE & UART_STATE_RXFULL)!=0) {
+      /* receive buffer should be empty now */
+      err_code += (1<<6);}
+  if (  ctmp != 'A') { /* received data incorrect */
+      err_code += (1<<7);}
+
+  puts ("- TX disabled");
+  TX_UART->CTRL =   TX_UART->CTRL & ~UART_CTRL_TXEN; /* Clear TX enable */
+  if ((TX_UART->CTRL & UART_CTRL_TXEN)!=0) { err_code += (1<<8);}
+
+  if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) ||
+      ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) {
+      /* Starting state incorrect */
+      err_code += (1<<9);}
+  TX_UART->DATA = 'B'; /* transmit a character */
+
+  /* When TX enable is low and a data is written to transmit buffer, the
+     data would be lost */
+  delay_for_character();
+  if ((RX_UART->STATE & UART_STATE_RXFULL)!=0)  {
+      /* RX buffer should still be empty*/
+      err_code += (1<<10);}
+  TX_UART->CTRL =   TX_UART->CTRL | UART_CTRL_TXEN; /* Set TX enable */
+  delay_for_character();
+
+  if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) ||
+      ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) {
+      /* complete state incorrect */
+      err_code += (1<<11);}
+
+  puts ("- RX disabled");
+  RX_UART->CTRL =   RX_UART->CTRL & ~UART_CTRL_RXEN; /* Clear RX enable */
+  if ((RX_UART->CTRL & UART_CTRL_RXEN)!=0) { err_code += (1<<12);}
+
+  TX_UART->DATA = 'C'; /* transmit a character */
+  delay_for_character();
+  if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) ||
+      ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) {
+      /* No data should be received. complete state incorrect */
+      err_code += (1<<13);}
+  RX_UART->CTRL =   RX_UART->CTRL | UART_CTRL_RXEN; /* Set RX enable */
+  delay_for_character();
+  if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) ||
+      ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) {
+      /* No data should be received. complete state incorrect */
+      err_code += (1<<14);}
+
+  TX_UART->CTRL = 0;
+  RX_UART->CTRL = 0;
+  while ((RX_UART->STATE & UART_STATE_RXFULL)!=0) {
+    ctmp=RX_UART->DATA;
+    }
+
+  if (err_code != 0) {
+    printf ("ERROR : uart enable failed (0x%x)\n", err_code);
+    return_val =1;
+    err_code = 0;
+    }
+
+  return(return_val);
+}
+/* --------------------------------------------------------------- */
+/*  UART tx & rx interrupt test                                         */
+/* --------------------------------------------------------------- */
+
+int uart_tx_rx_irq_test(CMSDK_UART_TypeDef *CMSDK_UART)
+{
+  int return_val=0;
+  unsigned int err_code=0;
+  CMSDK_UART_TypeDef *TX_UART;
+  CMSDK_UART_TypeDef *RX_UART;
+  char ctmp;
+
+  /* Determine which UART is the sender, and which UART is receiver */
+  if (CMSDK_UART==CMSDK_UART0){
+    TX_UART = CMSDK_UART0;
+    RX_UART = CMSDK_UART1;
+    }
+  else if (CMSDK_UART==CMSDK_UART1){
+    TX_UART = CMSDK_UART1;
+    RX_UART = CMSDK_UART0;
+    }
+  else {
+    puts ("ERROR: Input parameter invalid in function 'uart_tx_rx_irq_test'.");
+    return 1;
+    }
+
+  puts ("UART TX & RX IRQ test");
+  /* UART programmed with same baud rate */
+  TX_UART->BAUDDIV = 33;
+  if (TX_UART->BAUDDIV != 33) { err_code += (1<<0);}
+  RX_UART->BAUDDIV = 33;
+  if (RX_UART->BAUDDIV != 33) { err_code += (1<<1);}
+
+  puts ("- TX irq enable");
+  if (CMSDK_UART==CMSDK_UART0){
+    uart0_irq_expected=1;
+    uart1_irq_expected=0;
+    uart0_irq_occurred=0;
+    uart1_irq_occurred=0;
+    NVIC_EnableIRQ(UARTTX0_IRQn);
+    }
+  if (CMSDK_UART==CMSDK_UART1){
+    uart0_irq_expected=0;
+    uart1_irq_expected=1;
+    uart0_irq_occurred=0;
+    uart1_irq_occurred=0;
+    NVIC_EnableIRQ(UARTTX1_IRQn);
+    }
+
+  TX_UART->CTRL = UART_CTRL_TXEN | UART_CTRL_TXIRQEN;
+  RX_UART->CTRL = UART_CTRL_RXEN;
+
+  if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) |
+      ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) {
+      /* Starting state incorrect */
+      err_code += (1<<2);}
+  TX_UART->DATA = 'A'; /* transmit a character */
+  delay_for_character();
+
+  if (CMSDK_UART==CMSDK_UART0){
+    if (uart0_irq_occurred==0){ err_code += (1<<3);}
+    if (uart1_irq_occurred!=0){ err_code += (1<<4);}
+    }
+  if (CMSDK_UART==CMSDK_UART1){
+    if (uart1_irq_occurred==0){ err_code += (1<<3);}
+    if (uart0_irq_occurred!=0){ err_code += (1<<4);}
+    }
+  /* Interrupt status should have been cleared */
+  if (TX_UART->INTSTATUS != 0) { err_code += (1<<5);}
+  if (RX_UART->INTSTATUS != 0) { err_code += (1<<6);}
+
+  /* Receive buffer should have been full */
+  if ((RX_UART->STATE & UART_STATE_RXFULL) == 0) { err_code += (1<<7);}
+  ctmp = RX_UART->DATA;
+  if (ctmp!='A')                                 { err_code += (1<<8);}
+  if ((RX_UART->STATE & UART_STATE_RXFULL) != 0) { err_code += (1<<9);}
+
+  puts ("- TX irq disable");
+  if (CMSDK_UART==CMSDK_UART0){
+    uart0_irq_expected=0;
+    uart1_irq_expected=0;
+    uart0_irq_occurred=0;
+    uart1_irq_occurred=0;
+    NVIC_EnableIRQ(UARTTX0_IRQn);
+    }
+  if (CMSDK_UART==CMSDK_UART1){
+    uart0_irq_expected=0;
+    uart1_irq_expected=0;
+    uart0_irq_occurred=0;
+    uart1_irq_occurred=0;
+    NVIC_EnableIRQ(UARTTX1_IRQn);
+    }
+
+  TX_UART->CTRL = UART_CTRL_TXEN;  /* No interrupt generation */
+  RX_UART->CTRL = UART_CTRL_RXEN;  /* No interrupt generation */
+
+  if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) ||
+      ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) {
+      /* Starting state incorrect */
+      err_code += (1<<10);}
+  TX_UART->DATA = 'B'; /* transmit a character */
+  delay_for_character();
+
+  if (uart0_irq_occurred!=0){ err_code += (1<<11);}
+  if (uart1_irq_occurred!=0){ err_code += (1<<12);}
+
+  /* Receive buffer should have been full */
+  if ((RX_UART->STATE & UART_STATE_RXFULL) == 0) { err_code += (1<<13);}
+  ctmp = RX_UART->DATA;
+  if (ctmp!='B')                                 { err_code += (1<<14);}
+  if ((RX_UART->STATE & UART_STATE_RXFULL) != 0) { err_code += (1<<15);}
+
+  /* Interrupt status should have been cleared */
+  if (TX_UART->INTSTATUS != 0) { err_code += (1<<16);}
+  if (RX_UART->INTSTATUS != 0) { err_code += (1<<17);}
+
+  puts ("- RX irq enable");
+  if (CMSDK_UART==CMSDK_UART0){
+    uart0_irq_expected=0;
+    uart1_irq_expected=1;
+    uart0_irq_occurred=0;
+    uart1_irq_occurred=0;
+    NVIC_EnableIRQ(UARTRX1_IRQn);
+    }
+  if (CMSDK_UART==CMSDK_UART1){
+    uart0_irq_expected=1;
+    uart1_irq_expected=0;
+    uart0_irq_occurred=0;
+    uart1_irq_occurred=0;
+    NVIC_EnableIRQ(UARTRX0_IRQn);
+    }
+
+  TX_UART->CTRL = UART_CTRL_TXEN ;  /* No interrupt generation */
+  RX_UART->CTRL = UART_CTRL_RXEN | UART_CTRL_RXIRQEN;
+
+  TX_UART->DATA = 'C'; /* transmit a character */
+  delay_for_character();
+
+  if (CMSDK_UART==CMSDK_UART0){
+    if (uart0_irq_occurred!=0){ err_code += (1<<18);}
+    if (uart1_irq_occurred==0){ err_code += (1<<19);}
+    }
+  if (CMSDK_UART==CMSDK_UART1){
+    if (uart1_irq_occurred!=0){ err_code += (1<<18);}
+    if (uart0_irq_occurred==0){ err_code += (1<<19);}
+    }
+  /* Interrupt status should have been cleared */
+  if (TX_UART->INTSTATUS != 0) { err_code += (1<<20);}
+  if (RX_UART->INTSTATUS != 0) { err_code += (1<<21);}
+
+  /* Receive buffer should have been full */
+  if ((RX_UART->STATE & UART_STATE_RXFULL) == 0) { err_code += (1<<22);}
+  ctmp = RX_UART->DATA;
+  if (ctmp!='C')                                 { err_code += (1<<23);}
+  if ((RX_UART->STATE & UART_STATE_RXFULL) != 0) { err_code += (1<<24);}
+
+  puts ("- RX irq disable");
+  uart0_irq_expected=0;
+  uart1_irq_expected=0;
+  uart0_irq_occurred=0;
+  uart1_irq_occurred=0;
+
+  TX_UART->CTRL = UART_CTRL_TXEN;  /* No interrupt generation */
+  RX_UART->CTRL = UART_CTRL_RXEN;  /* No interrupt generation */
+
+  if (((TX_UART->STATE & UART_STATE_TXFULL)!=0) ||
+      ((RX_UART->STATE & UART_STATE_RXFULL)!=0)) {
+      /* Starting state incorrect */
+      err_code += (1<<25);}
+  TX_UART->DATA = 'D'; /* transmit a character */
+  delay_for_character();
+
+  if (uart0_irq_occurred!=0){ err_code += (1<<26);}
+  if (uart1_irq_occurred!=0){ err_code += (1<<27);}
+
+  /* Receive buffer should have been full */
+  if ((RX_UART->STATE & UART_STATE_RXFULL) == 0) { err_code += (1<<28);}
+  ctmp = RX_UART->DATA;
+  if (ctmp!='D')                                 { err_code += (1<<29);}
+  if ((RX_UART->STATE & UART_STATE_RXFULL) != 0) { err_code += (1<<30);}
+
+  /* Interrupt status should have been cleared */
+  if ((TX_UART->INTSTATUS != 0)||(RX_UART->INTSTATUS != 0)) { err_code |= 0x80000000UL;}
+
+  /* clean up */
+
+  TX_UART->CTRL = 0;
+  RX_UART->CTRL = 0;
+  while ((RX_UART->STATE & UART_STATE_RXFULL)!=0) {
+    ctmp=RX_UART->DATA;
+    }
+  NVIC_DisableIRQ(UARTRX0_IRQn);
+  NVIC_DisableIRQ(UARTRX1_IRQn);
+  NVIC_DisableIRQ(UARTTX0_IRQn);
+  NVIC_DisableIRQ(UARTTX1_IRQn);
+
+  if (err_code != 0) {
+    printf ("ERROR : uart interrupt enable failed (0x%x)\n", err_code);
+    return_val =1;
+    err_code = 0;
+    }
+
+  return(return_val);
+}
+
+/* --------------------------------------------------------------- */
+/*  UART tx & rx overflow test                                     */
+/* --------------------------------------------------------------- */
+
+int uart_tx_rx_overflow_test(CMSDK_UART_TypeDef *CMSDK_UART)
+{
+  int return_val=0;
+  int err_code=0;
+  CMSDK_UART_TypeDef *TX_UART;
+  CMSDK_UART_TypeDef *RX_UART;
+  char ctmp;
+  int i;
+
+  /* Determine which UART is the sender, and which UART is receiver */
+  if (CMSDK_UART==CMSDK_UART0){
+    TX_UART = CMSDK_UART0;
+    RX_UART = CMSDK_UART1;
+    }
+  else if (CMSDK_UART==CMSDK_UART1){
+    TX_UART = CMSDK_UART1;
+    RX_UART = CMSDK_UART0;
+    }
+  else {
+    puts ("ERROR: Input parameter invalid in function 'uart_tx_rx_overflow_test'.");
+    return 1;
+    }
+
+  puts ("UART TX & RX overflow test");
+  /* UART programmed with same baud rate */
+  TX_UART->BAUDDIV = 34;
+  if (TX_UART->BAUDDIV != 34) { err_code += (1<<0);}
+  RX_UART->BAUDDIV = 34;
+  if (RX_UART->BAUDDIV != 34) { err_code += (1<<1);}
+
+  puts ("- TX without overflow");
+  uart0_irq_expected=0;
+  uart1_irq_expected=0;
+  uart0_irq_occurred=0;
+  uart1_irq_occurred=0;
+
+  TX_UART->CTRL = UART_CTRL_TXEN ;  /* No interrupt generation */
+  RX_UART->CTRL = UART_CTRL_RXEN ;  /* No interrupt generation */
+
+  TX_UART->DATA = 'A';
+  TX_UART->DATA = 'B';
+  if ((TX_UART->STATE & UART_STATE_TXOVR)!=0)  { err_code += (1<<2);}
+  for (i=0; i<2;i++) {
+    while ((RX_UART->STATE & UART_STATE_RXFULL)==0); /* wait for data */
+    ctmp=  RX_UART->DATA;
+    if (i==0) {
+      if (ctmp!='A') { err_code += (1<<3);}
+      }
+    if (i==1) {
+      if (ctmp!='B') { err_code += (1<<4);}
+      }
+    }
+  if ((RX_UART->STATE != 0)||(TX_UART->STATE != 0))  { err_code += (1<<5);}
+
+  puts ("- TX with overflow");
+  TX_UART->DATA = 'A';
+  TX_UART->DATA = 'B';
+  TX_UART->DATA = 'C';
+  if ((TX_UART->STATE & UART_STATE_TXOVR)==0)  { err_code += (1<<6);}
+  for (i=0; i<2;i++) {
+    while ((RX_UART->STATE & UART_STATE_RXFULL)==0); /* wait for data */
+    ctmp=  RX_UART->DATA;
+    if (i==0) {
+      if (ctmp!='A') { err_code += (1<<7);}
+      }
+      /* if i=1, data unpredictable */
+    }
+  /* Overrun state should stay high */
+  if ((TX_UART->STATE & UART_STATE_TXOVR)==0)  { err_code += (1<<8);}
+  /* Overrun interrupt status should be low because TX overrun interrupt is not set */
+  if ((TX_UART->INTSTATUS & UART_INTSTATE_TXOVR)!=0)  { err_code += (1<<9);}
+
+  TX_UART->CTRL = UART_CTRL_TXEN | UART_CTRL_TXOVRIRQEN;  /* Enable overflow interrupt generation */
+  /* Overrun interrupt status should be high now */
+  if ((TX_UART->INTSTATUS & UART_INTSTATE_TXOVR)==0)  { err_code += (1<<10);}
+
+  /* enable the overflow interrupt in NVIC to trigger the overflow interrupt */
+  if (CMSDK_UART==CMSDK_UART0){
+    uart0_irq_expected=1;
+    uart1_irq_expected=0;
+    uart0_irq_occurred=0;
+    uart1_irq_occurred=0;
+    NVIC_EnableIRQ(UARTOVF0_IRQn);
+    }
+  if (CMSDK_UART==CMSDK_UART1){
+    uart0_irq_expected=0;
+    uart1_irq_expected=1;
+    uart0_irq_occurred=0;
+    uart1_irq_occurred=0;
+    NVIC_EnableIRQ(UARTOVF1_IRQn);
+    }
+
+  __DSB();
+  __ISB();
+  /* The interrupt should be taken */
+
+  /* Overrun state should be cleared by interrupt handler */
+  if ((TX_UART->STATE & UART_STATE_TXOVR)!=0)  { err_code += (1<<11);}
+  /* interrupt handler should be executed once */
+  if ((CMSDK_UART==CMSDK_UART0)&&(uart0_irq_occurred==0)) { err_code += (1<<12);}
+  if ((CMSDK_UART==CMSDK_UART1)&&(uart1_irq_occurred==0)) { err_code += (1<<12);}
+
+  TX_UART->CTRL = UART_CTRL_TXEN ;  /* No interrupt generation */
+  RX_UART->CTRL = UART_CTRL_RXEN ;  /* No interrupt generation */
+
+  NVIC_DisableIRQ(UARTOVF0_IRQn);
+  NVIC_DisableIRQ(UARTOVF1_IRQn);
+  uart0_irq_expected = 0;
+  uart1_irq_expected = 0;
+
+  puts ("- RX overflow");
+  TX_UART->DATA = 'A';
+  TX_UART->DATA = 'B';
+  /* TX overflow should not occur */
+  if ((TX_UART->STATE & UART_STATE_TXOVR)!=0)  { err_code += (1<<13);}
+  /* wait until RX buffer full */
+  while ((RX_UART->STATE & UART_STATE_RXFULL)==0);
+  /* Should not overflow yet */
+  if ((RX_UART->STATE & UART_STATE_RXOVR)!=0)  { err_code += (1<<14);}
+  /* wait until RX overflow */
+  while ((RX_UART->STATE & UART_STATE_RXOVR)==0);
+  /* RX overflow interrupt should be low because RX overflow interrupt enable is not set */
+  if ((RX_UART->INTSTATUS & UART_INTSTATE_RXOVR)!=0)  { err_code += (1<<15);}
+
+  RX_UART->CTRL = UART_CTRL_RXEN | UART_CTRL_RXOVRIRQEN;  /* Enable overflow interrupt generation */
+  /* Overrun interrupt status should be high now */
+  if ((RX_UART->INTSTATUS & UART_INTSTATE_RXOVR)==0)  { err_code += (1<<16);}
+
+  /* enable the overflow interrupt in NVIC to trigger the overflow interrupt */
+  if (CMSDK_UART==CMSDK_UART0){
+    uart0_irq_expected=0;
+    uart1_irq_expected=1;
+    uart0_irq_occurred=0;
+    uart1_irq_occurred=0;
+    NVIC_EnableIRQ(UARTOVF1_IRQn);
+    }
+  if (CMSDK_UART==CMSDK_UART1){
+    uart0_irq_expected=1;
+    uart1_irq_expected=0;
+    uart0_irq_occurred=0;
+    uart1_irq_occurred=0;
+    NVIC_EnableIRQ(UARTOVF0_IRQn);
+    }
+
+  __DSB();
+  __ISB();
+  /* The interrupt should be taken */
+
+  /* Overrun state should be cleared by interrupt handler */
+  if ((RX_UART->STATE & UART_STATE_RXOVR)!=0)  { err_code += (1<<17);}
+  /* interrupt handler should be executed once */
+  if ((CMSDK_UART==CMSDK_UART0)&&(uart1_irq_occurred==0)) { err_code += (1<<18);}
+  if ((CMSDK_UART==CMSDK_UART1)&&(uart0_irq_occurred==0)) { err_code += (1<<18);}
+
+
+  /* clean up */
+  uart0_irq_expected=0;
+  uart1_irq_expected=0;
+  uart0_irq_occurred=0;
+  uart1_irq_occurred=0;
+
+  TX_UART->CTRL = 0;
+  RX_UART->CTRL = 0;
+  while ((RX_UART->STATE & UART_STATE_RXFULL)!=0) {
+    ctmp=RX_UART->DATA;
+    }
+
+  NVIC_DisableIRQ(UARTOVF0_IRQn);
+  NVIC_DisableIRQ(UARTOVF1_IRQn);
+
+  if (err_code != 0) {
+    printf ("ERROR : uart overflow test failed (0x%x)\n", err_code);
+    return_val =1;
+    err_code = 0;
+    }
+
+  return(return_val);
+}
+
+/* --------------------------------------------------------------- */
+/*  UART 2 interrupt connectivity test                             */
+/* --------------------------------------------------------------- */
+int uart2_interrupt_test(void){
+  int return_val=0;
+  int err_code=0;
+  int i;
+  char ctmp; /* dummy variable for overflow test (data can be corrupted so it is not checked) */
+
+
+  puts ("UART 2 interrupt connectivity test");
+
+  puts ("- UART 2 TX IRQ");
+  CMSDK_UART2->CTRL = UART_CTRL_TXEN | UART_CTRL_TXIRQEN | UART_CTRL_HIGHSPEEDTX;
+  NVIC_EnableIRQ(UARTTX2_IRQn);
+  uart2_irq_expected = 1;
+  UartPutc('.');
+  for (i=0; i<3;i++){ __ISB(); } /* small delay */
+  CMSDK_UART2->CTRL = UART_CTRL_TXEN | UART_CTRL_HIGHSPEEDTX;
+  if (uart2_irq_occurred==0)                         { err_code += (1<<0);}
+  uart2_irq_occurred = 0;
+  NVIC_DisableIRQ(UARTTX2_IRQn);
+
+  puts ("\n- UART 2 TX overflow IRQ");
+  NVIC_EnableIRQ(UARTOVF2_IRQn);
+  CMSDK_UART2->CTRL = UART_CTRL_TXEN | UART_CTRL_TXOVRIRQEN | UART_CTRL_HIGHSPEEDTX;
+  CMSDK_UART2->DATA = '.';
+  CMSDK_UART2->DATA = '.';
+  CMSDK_UART2->DATA = '.';
+  for (i=0; i<3;i++){ __ISB(); } /* small delay */
+  if (uart2_irq_occurred==0)                         { err_code += (1<<1);}
+  uart2_irq_occurred = 0;
+  NVIC_DisableIRQ(UARTOVF2_IRQn);
+
+  puts ("\n- UART 2 RX IRQ");
+  /* UART 2 RXD is shared with GPIO1[4] */
+  CMSDK_GPIO1->OUTENABLESET = (1<<4);
+  CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT | (1<<4);
+  NVIC_EnableIRQ(UARTRX2_IRQn);
+  CMSDK_UART2->CTRL = UART_CTRL_TXEN | UART_CTRL_RXEN | UART_CTRL_RXIRQEN | UART_CTRL_HIGHSPEEDTX;
+  CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT & ~(1<<4);
+  for (i=0; i<2;i++){ __ISB(); } /* small delay to create start bit */
+  CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT | (1<<4);
+  delay_for_character();
+  if (uart2_irq_occurred==0)                         { err_code += (1<<2);}
+  if ((CMSDK_UART2->STATE & UART_STATE_RXFULL)==0)  { err_code += (1<<3);}
+  ctmp=CMSDK_UART2->DATA;
+  /*printf ("Receive data = 0x%x\n", ctmp);*/
+  uart2_irq_occurred = 0;
+  NVIC_DisableIRQ(UARTRX2_IRQn);
+
+  puts ("\n- UART 2 RX overflow IRQ");
+  NVIC_EnableIRQ(UARTOVF2_IRQn);
+  CMSDK_UART2->CTRL = UART_CTRL_TXEN | UART_CTRL_RXEN | UART_CTRL_RXOVRIRQEN | UART_CTRL_HIGHSPEEDTX;
+  /* First character */
+  CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT & ~(1<<4);
+  for (i=0; i<2;i++){ __ISB(); } /* small delay to create start bit */
+  CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT | (1<<4);
+  delay_for_character();
+  /* Second character */
+  CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT & ~(1<<4);
+  for (i=0; i<2;i++){ __ISB(); } /* small delay to create start bit */
+  CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT | (1<<4);
+  delay_for_character();
+  if (uart2_irq_occurred==0)                         { err_code += (1<<4);}
+
+  /* Remove receive data in buffer */
+  while ((CMSDK_UART2->STATE & UART_STATE_RXFULL)!=0) {
+    ctmp=CMSDK_UART2->DATA;
+    }
+  /* clear up */
+  uart2_irq_occurred = 0;
+  NVIC_DisableIRQ(UARTOVF2_IRQn);
+  CMSDK_UART2->CTRL = UART_CTRL_TXEN | UART_CTRL_HIGHSPEEDTX;
+
+  CMSDK_GPIO1->OUTENABLECLR = (1<<4);
+  CMSDK_GPIO1->DATAOUT = CMSDK_GPIO1->DATAOUT & ~(1<<4);
+  uart2_irq_expected = 0;
+
+
+
+  if (err_code != 0) {
+    printf ("ERROR : uart overflow test failed (0x%x)\n", err_code);
+    return_val =1;
+    err_code = 0;
+    }
+
+  return(return_val);
+}
+/* --------------------------------------------------------------- */
+/*  delay function to provide delay for one character              */
+/* --------------------------------------------------------------- */
+
+void delay_for_character(void)
+{
+  int i;
+  for (i=0; i<120;i++){
+    __ISB();
+    }
+  return;
+}
+/* --------------------------------------------------------------- */
+/*  Peripheral ID detection to check if device is present          */
+/* --------------------------------------------------------------- */
+int uart0_id_check(void)
+{
+if ((HW32_REG(CMSDK_UART0_BASE + 0xFE0) != 0x21) ||
+    (HW32_REG(CMSDK_UART0_BASE + 0xFE4) != 0xB8))
+  return 1; /* part ID does not match */
+else
+  return 0;
+}
+
+int uart1_id_check(void)
+{
+if ((HW32_REG(CMSDK_UART1_BASE + 0xFE0) != 0x21) ||
+    (HW32_REG(CMSDK_UART1_BASE + 0xFE4) != 0xB8))
+  return 1; /* part ID does not match */
+else
+  return 0;
+}
+
+int gpio1_id_check(void)
+{
+if ((HW32_REG(CMSDK_GPIO1_BASE + 0xFE0) != 0x20) ||
+    (HW32_REG(CMSDK_GPIO1_BASE + 0xFE4) != 0xB8))
+  return 1; /* part ID does not match */
+else
+  return 0;
+}
+/* --------------------------------------------------------------- */
+/*  UART interrupt handlers                                        */
+/* --------------------------------------------------------------- */
+void UARTRX0_Handler(void)
+{
+  int err_code = 0;
+  if (uart0_irq_expected==0)                           {err_code += (1<<0);}
+  if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_RX)==0) {err_code += (1<<1);}
+  CMSDK_UART0->INTCLEAR = UART_INTSTATE_RX; /* Clear interrupt status */
+  if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_RX)!=0) {err_code += (1<<2);}
+  uart0_irq_occurred++;
+  if (err_code != 0) {
+    printf ("ERROR : UART 0 RX handler failed (0x%x)\n", err_code);
+    UartEndSimulation();
+    while(1);
+    }
+  return;
+}
+
+void UARTTX0_Handler(void)
+{
+  int err_code = 0;
+  if (uart0_irq_expected==0)                           {err_code += (1<<0);}
+  if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_TX)==0) {err_code += (1<<1);}
+  CMSDK_UART0->INTCLEAR = UART_INTSTATE_TX; /* Clear interrupt status */
+  if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_TX)!=0) {err_code += (1<<2);}
+  uart0_irq_occurred++;
+  if (err_code != 0) {
+    printf ("ERROR : UART 0 TX handler failed (0x%x)\n", err_code);
+    UartEndSimulation();
+    while(1);
+    }
+  return;
+}
+void UARTRX1_Handler(void)
+{
+  int err_code = 0;
+  if (uart1_irq_expected==0)                           {err_code += (1<<0);}
+  if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_RX)==0) {err_code += (1<<1);}
+  CMSDK_UART1->INTCLEAR = UART_INTSTATE_RX; /* Clear interrupt status */
+  if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_RX)!=0) {err_code += (1<<2);}
+  uart1_irq_occurred++;
+  if (err_code != 0) {
+    printf ("ERROR : UART 1 RX handler failed (0x%x)\n", err_code);
+    UartEndSimulation();
+    while(1);
+    }
+  return;
+}
+
+void UARTTX1_Handler(void)
+{
+  int err_code = 0;
+  if (uart1_irq_expected==0)                           {err_code += (1<<0);}
+  if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_TX)==0) {err_code += (1<<1);}
+  CMSDK_UART1->INTCLEAR = UART_INTSTATE_TX; /* Clear interrupt status */
+  if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_TX)!=0) {err_code += (1<<2);}
+  uart1_irq_occurred++;
+  if (err_code != 0) {
+    printf ("ERROR : UART 1 TX handler failed (0x%x)\n", err_code);
+    UartEndSimulation();
+    while(1);
+    }
+  return;
+}
+void UARTOVF0_Handler(void)
+{
+  int err_code = 0;
+  if (uart0_irq_expected==0)                               {err_code += (1<<0);}
+  if (((CMSDK_UART0->INTSTATUS & UART_INTSTATE_TXOVR)==0) &
+      ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_RXOVR)==0)) {err_code += (1<<1);}
+  if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_TXOVR)!=0){
+    CMSDK_UART0->STATE = UART_STATE_TXOVR; /* Clear TX overrun status */
+    }
+  if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_RXOVR)!=0){
+    CMSDK_UART0->STATE = UART_STATE_RXOVR; /* Clear RX overrun status */
+    }
+  if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_TXOVR)!=0)  {err_code += (1<<2);}
+  if ((CMSDK_UART0->INTSTATUS & UART_INTSTATE_RXOVR)!=0)  {err_code += (1<<3);}
+  uart0_irq_occurred++;
+  if (err_code != 0) {
+    printf ("ERROR : UART 0 overrun handler failed (0x%x)\n", err_code);
+    UartEndSimulation();
+    while(1);
+    }  return;
+}
+
+void UARTOVF1_Handler(void)
+{
+  int err_code = 0;
+  if (uart1_irq_expected==0)                               {err_code += (1<<0);}
+  if (((CMSDK_UART1->INTSTATUS & UART_INTSTATE_TXOVR)==0) &
+      ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_RXOVR)==0)) {err_code += (1<<1);}
+  if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_TXOVR)!=0){
+    CMSDK_UART1->STATE = UART_STATE_TXOVR; /* Clear TX overrun status */
+    }
+  if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_RXOVR)!=0){
+    CMSDK_UART1->STATE = UART_STATE_RXOVR; /* Clear RX overrun status */
+    }
+  if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_TXOVR)!=0)  {err_code += (1<<2);}
+  if ((CMSDK_UART1->INTSTATUS & UART_INTSTATE_RXOVR)!=0)  {err_code += (1<<3);}
+  uart1_irq_occurred++;
+  if (err_code != 0) {
+    printf ("ERROR : UART 1 overrun handler failed (0x%x)\n", err_code);
+    UartEndSimulation();
+    while(1);
+    }
+  return;
+}
+void UARTRX2_Handler(void)
+{
+  int err_code = 0;
+  if (uart2_irq_expected==0)                           {err_code += (1<<0);}
+  if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_RX)==0) {err_code += (1<<1);}
+  CMSDK_UART2->INTCLEAR = UART_INTSTATE_RX; /* Clear interrupt status */
+  if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_RX)!=0) {err_code += (1<<2);}
+  uart2_irq_occurred++;
+  if (err_code != 0) {
+    printf ("ERROR : UART 2 RX handler failed (0x%x)\n", err_code);
+    UartEndSimulation();
+    while(1);
+    }
+  return;
+}
+
+void UARTTX2_Handler(void)
+{
+  int err_code = 0;
+  if (uart2_irq_expected==0)                           {err_code += (1<<0);}
+  if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_TX)==0) {err_code += (1<<1);}
+  CMSDK_UART2->INTCLEAR = UART_INTSTATE_TX; /* Clear interrupt status */
+  if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_TX)!=0) {err_code += (1<<2);}
+  uart2_irq_occurred++;
+  if (err_code != 0) {
+    printf ("ERROR : UART 2 TX handler failed (0x%x)\n", err_code);
+    UartEndSimulation();
+    while(1);
+    }
+  return;
+}
+
+void UARTOVF2_Handler(void)
+{
+  int err_code = 0;
+  if (uart2_irq_expected==0)                               {err_code += (1<<0);}
+  if (((CMSDK_UART2->INTSTATUS & UART_INTSTATE_TXOVR)==0) &
+      ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_RXOVR)==0)) {err_code += (1<<1);}
+  if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_TXOVR)!=0){
+    CMSDK_UART2->STATE = UART_STATE_TXOVR; /* Clear TX overrun status */
+    }
+  if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_RXOVR)!=0){
+    CMSDK_UART2->STATE = UART_STATE_RXOVR; /* Clear RX overrun status */
+    }
+  if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_TXOVR)!=0)  {err_code += (1<<2);}
+  if ((CMSDK_UART2->INTSTATUS & UART_INTSTATE_RXOVR)!=0)  {err_code += (1<<3);}
+  uart2_irq_occurred++;
+  if (err_code != 0) {
+    printf ("ERROR : UART 2 overrun handler failed (0x%x)\n", err_code);
+    UartEndSimulation();
+    while(1);
+    }
+  return;
+}
+
diff --git a/Cortex-M0/nanosoc/software/debug_tester/Makefile b/Cortex-M0/nanosoc/software/debug_tester/Makefile
new file mode 100644
index 0000000..05ce772
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/Makefile
@@ -0,0 +1,264 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# CMSDK Debug Tester Makefile
+#
+#-----------------------------------------------------------------------------
+# Remove any current implicit rules
+.IMPLICIT	=
+
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+#  - CORTEX_M3
+#  - CORTEX_M4
+#  - CORTEX_M4F
+#    Note: if CORTEX_M4F is used, make sure:
+#     1. RTL is configured to enable FPU option (cmsdk_mcu_defs.v) and recompiled
+#     2. __FPU_PRESENT variable in header file (e.g. CMSDK_CM4.h) is set to 1
+CPU_PRODUCT  = CORTEX_M0
+
+# Shared software directory
+SOFTWARE_DIR = ../
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+GCC_LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0_DS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+  STARTUP_FILE = startup_CMSDK_CM0
+  USER_DEFINE  = -DCORTEX_M0
+  ARM_CPU_TYPE = --cpu=Cortex-M0
+  GCC_CPU_TYPE = -mcpu=cortex-m0
+  GCC_LINKER_SCRIPT = $(GCC_LINKER_SCRIPT_PATH)/debugtester.ld
+endif
+ifeq ($(CPU_PRODUCT),CORTEX_M0)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+  STARTUP_FILE = startup_CMSDK_CM0
+  USER_DEFINE  = -DCORTEX_M0
+  ARM_CPU_TYPE = --cpu=Cortex-M0
+  GCC_CPU_TYPE = -mcpu=cortex-m0
+  GCC_LINKER_SCRIPT = $(GCC_LINKER_SCRIPT_PATH)/debugtester.ld
+endif
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  USER_DEFINE  = -DCORTEX_M0PLUS
+  ARM_CPU_TYPE = --cpu=Cortex-M0plus
+  GCC_CPU_TYPE = -mcpu=cortex-m0plus
+  GCC_LINKER_SCRIPT = $(GCC_LINKER_SCRIPT_PATH)/debugtester.ld
+endif
+ifeq ($(CPU_PRODUCT),CORTEX_M3)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM3
+  STARTUP_FILE = startup_CMSDK_CM3
+  USER_DEFINE  = -DCORTEX_M3
+  ARM_CPU_TYPE = --cpu=Cortex-M3
+  GCC_CPU_TYPE = -mcpu=cortex-m3
+  GCC_LINKER_SCRIPT = $(GCC_LINKER_SCRIPT_PATH)/debugtester.ld
+endif
+ifeq ($(CPU_PRODUCT),CORTEX_M4)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM4
+  STARTUP_FILE = startup_CMSDK_CM4
+  USER_DEFINE  = -DCORTEX_M4
+  ARM_CPU_TYPE = --cpu=Cortex-M4
+  GCC_CPU_TYPE = -mcpu=cortex-m4
+  GCC_LINKER_SCRIPT = $(GCC_LINKER_SCRIPT_PATH)/debugtester.ld
+endif
+ifeq ($(CPU_PRODUCT),CORTEX_M4F)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM4
+  STARTUP_FILE = startup_CMSDK_CM4
+  USER_DEFINE  = -DCORTEX_M4
+  # The debug tester processor for M4F as the target is an M4, so the processor
+  # for compiling the debug tester code must be M4
+  ARM_CPU_TYPE = --cpu=Cortex-M4
+  GCC_CPU_TYPE = -mcpu=cortex-m4
+  GCC_LINKER_SCRIPT = $(GCC_LINKER_SCRIPT_PATH)/debugtester.ld
+endif
+
+# Program file
+DEBUGTESTER       = debugtester
+
+# Endian Option
+COMPILE_BIGEND = 0
+
+DEPS_LIST      = Makefile debugtester.h cmsdk_debugtester.h
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN     = ds5
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option (DS-5)
+COMPILE_MICROLIB = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime -I $(CORE_DIR) -I $(DEVICE_DIR)/Include \
+		   -I $(SOFTWARE_DIR)/common/retarget $(USER_DEFINE)
+ARM_ASM_OPTIONS  = -g
+
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x20000000 --ro_base 0x00000000 --map
+
+# Big Endian
+ARM_CC_OPTIONS_BE = $(ARM_CC_OPTIONS) -DDEBUGTESTER_BE
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLib
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+# The optimisation level for the GCC compiler should be fixed at -01 or the results can
+# cause unpredictable results for the debugtester behaviour.
+GNU_CC_FLAGS = -g -O1 -mthumb $(GCC_CPU_TYPE)
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+all_ds5 : $(DEBUGTESTER)_le.hex $(DEBUGTESTER)_be.hex $(DEBUGTESTER)_le.lst $(DEBUGTESTER)_be.lst
+
+debugtester_le.o : debugtester.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(ARM_CPU_TYPE) $< -o  $@
+
+system_cmsdk_debugtester_le.o : 	system_cmsdk_debugtester.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(ARM_CPU_TYPE) $< -o  $@
+
+retarget_cmsdk_debugtester_le.o : 	retarget_cmsdk_debugtester.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(ARM_CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(DEVICE_DIR)/Source/ARM/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(ARM_CPU_TYPE) $< -o  $@
+
+$(DEBUGTESTER)_le.elf : $(DEBUGTESTER)_le.o $(STARTUP_FILE).o system_cmsdk_debugtester_le.o retarget_cmsdk_debugtester_le.o
+	armlink $(ARM_LINK_OPTIONS) $(DEBUGTESTER)_le.o $(STARTUP_FILE).o system_cmsdk_debugtester_le.o retarget_cmsdk_debugtester_le.o -o $@
+
+$(DEBUGTESTER)_le.hex : $(DEBUGTESTER)_le.elf
+	fromelf --vhx --8x1 $< --output $@
+
+$(DEBUGTESTER)_le.lst : $(DEBUGTESTER)_le.elf
+	fromelf -c -d -e -s $< --output $@
+
+debugtester_be.o : debugtester.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS_BE) $(ARM_CPU_TYPE) $< -o  $@
+
+system_cmsdk_debugtester_be.o : 	system_cmsdk_debugtester.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS_BE) $(ARM_CPU_TYPE) $< -o  $@
+
+retarget_cmsdk_debugtester_be.o : 	retarget_cmsdk_debugtester.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS_BE) $(ARM_CPU_TYPE) $< -o  $@
+
+$(DEBUGTESTER)_be.elf : $(DEBUGTESTER)_be.o $(STARTUP_FILE).o system_cmsdk_debugtester_be.o retarget_cmsdk_debugtester_be.o
+	armlink $(ARM_LINK_OPTIONS) $(DEBUGTESTER)_be.o $(STARTUP_FILE).o system_cmsdk_debugtester_be.o retarget_cmsdk_debugtester_be.o -o $@
+
+$(DEBUGTESTER)_be.hex : $(DEBUGTESTER)_be.elf
+	fromelf --vhx --8x1 $< --output $@
+
+$(DEBUGTESTER)_be.lst : $(DEBUGTESTER)_be.elf
+	fromelf -c -d -e -s $< --output $@
+
+# ---------------------------------------------------------------------------------------
+# GCC
+all_gcc : $(DEBUGTESTER)_le $(DEBUGTESTER)_be
+
+$(DEBUGTESTER)_le :
+	$(GNG_CC) $(GNU_CC_FLAGS) $(DEVICE_DIR)/Source/GCC/$(STARTUP_FILE).s \
+		$(DEBUGTESTER).c \
+		system_cmsdk_debugtester.c \
+		retarget_cmsdk_debugtester.c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+		-L $(GCC_LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(GCC_LINKER_SCRIPT) -o $(DEBUGTESTER)_le.o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(DEBUGTESTER)_le.o > $(DEBUGTESTER)_le.lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(DEBUGTESTER)_le.o -O binary $(DEBUGTESTER)_le.bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(DEBUGTESTER)_le.o -O verilog $(DEBUGTESTER)_le.hex
+
+$(DEBUGTESTER)_be :
+	$(GNG_CC) $(GNU_CC_FLAGS) $(DEVICE_DIR)/Source/GCC/$(STARTUP_FILE).s \
+		$(DEBUGTESTER).c \
+		system_cmsdk_debugtester.c \
+		retarget_cmsdk_debugtester.c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+		-L $(GCC_LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -DDEBUGTESTER_BE -T $(GCC_LINKER_SCRIPT) -o $(DEBUGTESTER)_be.o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(DEBUGTESTER)_be.o > $(DEBUGTESTER)_be.lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(DEBUGTESTER)_be.o -O binary $(DEBUGTESTER)_be.bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(DEBUGTESTER)_be.o -O verilog $(DEBUGTESTER)_be.hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(DEBUGTESTER)_le.bin > $(DEBUGTESTER)_le.hex
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(DEBUGTESTER)_le.bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(DEBUGTESTER)_le.bin > $(DEBUGTESTER)_le.hex
+
+
+
+# ---------------------------------------------------------------------------------------
+# Clean
+clean:
+	@rm -f *.hex *.bin *.elf *.o *.lst
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/software/debug_tester/cmsdk_debugtester.h b/Cortex-M0/nanosoc/software/debug_tester/cmsdk_debugtester.h
new file mode 100644
index 0000000..8e3b9eb
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/cmsdk_debugtester.h
@@ -0,0 +1,336 @@
+//
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//-----------------------------------------------------------------------------
+//
+
+#ifndef __CMSDK_DEBUGTESTER_H__
+#define __CMSDK_DEBUGTESTER_H__
+
+//////////////////////////////////////////////////////////////////////////////////
+////
+//// CMSDK Debug Tester CMSIS Configuration File
+////
+//// This file corresponds to the device.h file in the CMSIS standard,
+//// and defines the peripherals for the Debug Tester device:
+////   IRQ number
+////   IO address mapping and data structures
+////   core configuration etc
+////
+//////////////////////////////////////////////////////////////////////////////////
+
+ //============================================================================
+ //---------- Interrupt Number Definition -------------------------------------
+ //============================================================================
+
+typedef enum IRQn
+{
+///////  Cortex-M Processor Exceptions Numbers /////////////////////////////////////////////////////
+  NonMaskableInt_IRQn         = -14,    //!< 2  Non Maskable Interrupt                            //
+  HardFault_IRQn              = -13,    //!< 3  Cortex-M Hard Fault Interrupt                     //
+  SVCall_IRQn                 = -5,     //!< 11 Cortex-M SV Call Interrupt                        //
+  PendSV_IRQn                 = -2,     //!< 14 Cortex-M Pend SV Interrupt                        //
+  SysTick_IRQn                = -1,     //!< 15 Cortex-M System Tick Interrupt                    //
+
+///////  Example MCU Cortex-M specific Interrupt Numbers ///////////////////////////////////////////
+  GPIO_IRQn                   = 0       //!< GPIO Interrupt                                       //
+} IRQn_Type;
+
+
+//
+// ==========================================================================
+// ----------- Processor and Core Peripheral Section ------------------------
+// ==========================================================================
+//
+
+// Include the appropriate CMSIS core header file
+
+#ifdef CORTEX_M0
+#define __CM0_REV                 0x0000    /*!< Core revision r0p0                              */
+#define __MPU_PRESENT             0         /*!< MPU present or not                              */
+#define __NVIC_PRIO_BITS          2         /*!< Number of Bits used for Priority Levels         */
+#define __Vendor_SysTickConfig    0         /*!< Set to 1 if different SysTick Config is used    */
+#include "core_cm0.h"               // Cortex-M0 processor and core peripherals
+
+#else
+
+#ifdef CORTEX_M0PLUS
+#define __CM0_REV                 0x0001    /*!< Core revision r0p1                              */
+#define __MPU_PRESENT             0         /*!< MPU present or not                              */
+#define __NVIC_PRIO_BITS          2         /*!< Number of Bits used for Priority Levels         */
+#define __Vendor_SysTickConfig    0         /*!< Set to 1 if different SysTick Config is used    */
+#include "core_cm0plus.h"           // Cortex-M0+ processor and core peripherals
+
+#else
+
+#ifdef CORTEX_M3
+#define __CM3_REV                 0x0201    /*!< Core revision r2p1                              */
+#define __MPU_PRESENT             1         /*!< MPU present or not                              */
+#define __NVIC_PRIO_BITS          3         /*!< Number of Bits used for Priority Levels         */
+#define __Vendor_SysTickConfig    0         /*!< Set to 1 if different SysTick Config is used    */
+#include "core_cm3.h"               // Cortex-M3 processor and core peripherals
+
+#else
+
+#ifdef CORTEX_M4
+#define __CM4_REV                 0x0001    /*!< Core revision r0p1                              */
+#define __MPU_PRESENT             1         /*!< MPU present or not                              */
+#define __NVIC_PRIO_BITS          3         /*!< Number of Bits used for Priority Levels         */
+#define __Vendor_SysTickConfig    0         /*!< Set to 1 if different SysTick Config is used    */
+#define __FPU_PRESENT             1         /*!< FPU present or not                              */
+#include "core_cm4.h"               // Cortex-M4 processor and core peripherals
+
+#endif
+#endif
+#endif
+#endif
+
+#include "system_cmsdk_debugtester.h"
+
+
+// =============================================================================
+//                Device Specific Peripheral registers structures             //
+// =============================================================================
+
+/* -------------------  Start of section using anonymous unions  ------------------ */
+#if defined(__CC_ARM)
+  #pragma push
+  #pragma anon_unions
+#elif defined(__ICCARM__)
+  #pragma language=extended
+#elif defined(__GNUC__)
+  /* anonymous unions are enabled by default */
+#elif defined(__TMS470__)
+/* anonymous unions are enabled by default */
+#elif defined(__TASKING__)
+  #pragma warning 586
+#else
+  #warning Not supported compiler type
+#endif
+
+
+/*-------------------- General Purpose Input Output (GPIO) -------------------*/
+
+/** @addtogroup CMSDK_GPIO CMSDK GPIO
+  @{
+*/
+typedef struct
+{
+  __IO   uint32_t  DATA;             /*!< Offset: 0x000 DATA Register (R/W) */
+  __IO   uint32_t  DATAOUT;          /*!< Offset: 0x004 Data Output Latch Register (R/W) */
+         uint32_t  RESERVED0[2];
+  __IO   uint32_t  OUTENABLESET;     /*!< Offset: 0x010 Output Enable Set Register  (R/W) */
+  __IO   uint32_t  OUTENABLECLR;     /*!< Offset: 0x014 Output Enable Clear Register  (R/W) */
+  __IO   uint32_t  ALTFUNCSET;       /*!< Offset: 0x018 Alternate Function Set Register  (R/W) */
+  __IO   uint32_t  ALTFUNCCLR;       /*!< Offset: 0x01C Alternate Function Clear Register  (R/W) */
+  __IO   uint32_t  INTENSET;         /*!< Offset: 0x020 Interrupt Enable Set Register  (R/W) */
+  __IO   uint32_t  INTENCLR;         /*!< Offset: 0x024 Interrupt Enable Clear Register  (R/W) */
+  __IO   uint32_t  INTTYPESET;       /*!< Offset: 0x028 Interrupt Type Set Register  (R/W) */
+  __IO   uint32_t  INTTYPECLR;       /*!< Offset: 0x02C Interrupt Type Clear Register  (R/W) */
+  __IO   uint32_t  INTPOLSET;        /*!< Offset: 0x030 Interrupt Polarity Set Register  (R/W) */
+  __IO   uint32_t  INTPOLCLR;        /*!< Offset: 0x034 Interrupt Polarity Clear Register  (R/W) */
+  union {
+    __I    uint32_t  INTSTATUS;      /*!< Offset: 0x038 Interrupt Status Register (R/ ) */
+    __O    uint32_t  INTCLEAR;       /*!< Offset: 0x038 Interrupt Clear Register ( /W) */
+    };
+  uint32_t RESERVED1[241];
+  __IO   uint32_t LB_MASKED[256];    /*!< Offset: 0x400 - 0x7FC Lower byte Masked Access Register (R/W) */
+  __IO   uint32_t UB_MASKED[256];    /*!< Offset: 0x800 - 0xBFC Upper byte Masked Access Register (R/W) */
+} CMSDK_GPIO_TypeDef;
+
+#define CMSDK_GPIO_DATA_Pos            0                                          /*!< CMSDK_GPIO DATA: DATA Position */
+#define CMSDK_GPIO_DATA_Msk            (0xFFFFul << CMSDK_GPIO_DATA_Pos)          /*!< CMSDK_GPIO DATA: DATA Mask */
+
+#define CMSDK_GPIO_DATAOUT_Pos         0                                          /*!< CMSDK_GPIO DATAOUT: DATAOUT Position */
+#define CMSDK_GPIO_DATAOUT_Msk         (0xFFFFul << CMSDK_GPIO_DATAOUT_Pos)       /*!< CMSDK_GPIO DATAOUT: DATAOUT Mask */
+
+#define CMSDK_GPIO_OUTENSET_Pos        0                                          /*!< CMSDK_GPIO OUTEN: OUTEN Position */
+#define CMSDK_GPIO_OUTENSET_Msk        (0xFFFFul << CMSDK_GPIO_OUTEN_Pos)         /*!< CMSDK_GPIO OUTEN: OUTEN Mask */
+
+#define CMSDK_GPIO_OUTENCLR_Pos        0                                          /*!< CMSDK_GPIO OUTEN: OUTEN Position */
+#define CMSDK_GPIO_OUTENCLR_Msk        (0xFFFFul << CMSDK_GPIO_OUTEN_Pos)         /*!< CMSDK_GPIO OUTEN: OUTEN Mask */
+
+#define CMSDK_GPIO_ALTFUNCSET_Pos      0                                          /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Position */
+#define CMSDK_GPIO_ALTFUNCSET_Msk      (0xFFFFul << CMSDK_GPIO_ALTFUNC_Pos)       /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Mask */
+
+#define CMSDK_GPIO_ALTFUNCCLR_Pos      0                                          /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Position */
+#define CMSDK_GPIO_ALTFUNCCLR_Msk      (0xFFFFul << CMSDK_GPIO_ALTFUNC_Pos)       /*!< CMSDK_GPIO ALTFUNC: ALTFUNC Mask */
+
+#define CMSDK_GPIO_INTENSET_Pos        0                                          /*!< CMSDK_GPIO INTEN: INTEN Position */
+#define CMSDK_GPIO_INTENSET_Msk        (0xFFFFul << CMSDK_GPIO_INTEN_Pos)         /*!< CMSDK_GPIO INTEN: INTEN Mask */
+
+#define CMSDK_GPIO_INTENCLR_Pos        0                                          /*!< CMSDK_GPIO INTEN: INTEN Position */
+#define CMSDK_GPIO_INTENCLR_Msk        (0xFFFFul << CMSDK_GPIO_INTEN_Pos)         /*!< CMSDK_GPIO INTEN: INTEN Mask */
+
+#define CMSDK_GPIO_INTTYPESET_Pos      0                                          /*!< CMSDK_GPIO INTTYPE: INTTYPE Position */
+#define CMSDK_GPIO_INTTYPESET_Msk      (0xFFFFul << CMSDK_GPIO_INTTYPE_Pos)       /*!< CMSDK_GPIO INTTYPE: INTTYPE Mask */
+
+#define CMSDK_GPIO_INTTYPECLR_Pos      0                                          /*!< CMSDK_GPIO INTTYPE: INTTYPE Position */
+#define CMSDK_GPIO_INTTYPECLR_Msk      (0xFFFFul << CMSDK_GPIO_INTTYPE_Pos)       /*!< CMSDK_GPIO INTTYPE: INTTYPE Mask */
+
+#define CMSDK_GPIO_INTPOLSET_Pos       0                                          /*!< CMSDK_GPIO INTPOL: INTPOL Position */
+#define CMSDK_GPIO_INTPOLSET_Msk       (0xFFFFul << CMSDK_GPIO_INTPOL_Pos)        /*!< CMSDK_GPIO INTPOL: INTPOL Mask */
+
+#define CMSDK_GPIO_INTPOLCLR_Pos       0                                          /*!< CMSDK_GPIO INTPOL: INTPOL Position */
+#define CMSDK_GPIO_INTPOLCLR_Msk       (0xFFFFul << CMSDK_GPIO_INTPOL_Pos)        /*!< CMSDK_GPIO INTPOL: INTPOL Mask */
+
+#define CMSDK_GPIO_INTSTATUS_Pos       0                                          /*!< CMSDK_GPIO INTSTATUS: INTSTATUS Position */
+#define CMSDK_GPIO_INTSTATUS_Msk       (0xFFul << CMSDK_GPIO_INTSTATUS_Pos)       /*!< CMSDK_GPIO INTSTATUS: INTSTATUS Mask */
+
+#define CMSDK_GPIO_INTCLEAR_Pos        0                                          /*!< CMSDK_GPIO INTCLEAR: INTCLEAR Position */
+#define CMSDK_GPIO_INTCLEAR_Msk        (0xFFul << CMSDK_GPIO_INTCLEAR_Pos)        /*!< CMSDK_GPIO INTCLEAR: INTCLEAR Mask */
+
+#define CMSDK_GPIO_MASKLOWBYTE_Pos     0                                          /*!< CMSDK_GPIO MASKLOWBYTE: MASKLOWBYTE Position */
+#define CMSDK_GPIO_MASKLOWBYTE_Msk     (0x00FFul << CMSDK_GPIO_MASKLOWBYTE_Pos)   /*!< CMSDK_GPIO MASKLOWBYTE: MASKLOWBYTE Mask */
+
+#define CMSDK_GPIO_MASKHIGHBYTE_Pos    0                                          /*!< CMSDK_GPIO MASKHIGHBYTE: MASKHIGHBYTE Position */
+#define CMSDK_GPIO_MASKHIGHBYTE_Msk    (0xFF00ul << CMSDK_GPIO_MASKHIGHBYTE_Pos)  /*!< CMSDK_GPIO MASKHIGHBYTE: MASKHIGHBYTE Mask */
+
+/*@}*/ /* end of group CMSDK_GPIO */
+
+
+/*-------------------- Trace Capture Buffer (TCB) -------------------*/
+
+typedef struct
+{
+  __IO uint32_t CONFIG;
+  __I  uint32_t DATA;
+  __I  uint32_t DEPTH;
+  __I  uint32_t SYNCS;
+  __I  uint32_t HSYNCS;
+  __I  uint32_t STATUS;
+
+} TRACE_TypeDef;
+
+
+/* --------------------  End of section using anonymous unions  ------------------- */
+#if defined(__CC_ARM)
+  #pragma pop
+#elif defined(__ICCARM__)
+  /* leave anonymous unions enabled */
+#elif defined(__GNUC__)
+  /* anonymous unions are enabled by default */
+#elif defined(__TMS470__)
+  /* anonymous unions are enabled by default */
+#elif defined(__TASKING__)
+  #pragma warning restore
+#else
+  #warning Not supported compiler type
+#endif
+
+
+// =============================================================================
+//                         Peripheral memory map                              //
+// =============================================================================
+// Peripheral and SRAM base address //
+#define SRAM_BASE             ((uint32_t)0x20000000)
+
+// Peripheral memory map //
+#define GPIO0_BASE            ((uint32_t)0x40000000)
+#define GPIO1_BASE            ((uint32_t)0x40001000)
+#define TRACE_BASE            ((uint32_t)0x40002000)
+
+// =============================================================================
+//                         Peripheral declaration                             //
+// =============================================================================
+#define GPIO0                    ((CMSDK_GPIO_TypeDef *) GPIO0_BASE)
+#define GPIO1                    ((CMSDK_GPIO_TypeDef *) GPIO1_BASE)
+#define TRACE                    ((TRACE_TypeDef *)      TRACE_BASE)
+
+// =============================================================================
+// GPIO 0 Pin Assignments
+// =============================================================================
+
+//
+// Debug tester Hardware Interface to the MCU
+//
+// Debug tester --------------------------------------- Example MCU
+//
+// GPIO[15] 7 >----------------------------------------> Running
+// GPIO[14] 6 >----------------------------------------> Error
+// GPIO[13] 5 <----------------------------------------< Function Strobe
+// GPIO[12] 4 <----------------------------------------< Function Select bit 4
+// GPIO[11] 3 <----------------------------------------< Function Select bit 3
+// GPIO[10] 2 <----------------------------------------< Function Select bit 2
+// GPIO[ 9] 1 <----------------------------------------< Function Select bit 1
+// GPIO[ 8] 0 <----------------------------------------< Function Select bit 0
+//
+//
+
+#define DD_IO_RUNNING (1 << 7)
+#define DD_IO_ERROR   (1 << 6)
+#define DD_IO_STROBE  (1 << 5)
+#define DD_IO_FUNCSEL  0x1f
+
+
+//
+// JTAG / SerialWire Connectivity
+//
+// Debug tester --------------------------------------- Example MCU
+//
+//
+// GPIO[ 6]  6 >----------------------+
+//                                  |\|
+// GPIO[ 5]  5 >--------------------| >--------+-------<> SWDIOTMS
+//                                  |/         |
+// GPIO[ 4]  4 <-------------------------------+
+// GPIO[ 3]  3 <----------------------------------------< TDO
+// GPIO[ 2]  2 >----------------------------------------> TDI
+// GPIO[ 1]  1 >----------------------------------------> SWCLKTCK
+// GPIO[ 0]  0 >----------------------------------------> nTRST
+//
+//
+
+#define DD_DBG_TMSEN    (1 << 6)
+#define DD_DBG_TMS      (1 << 5)
+#define DD_DBG_TMSIN    (1 << 4)
+#define DD_DBG_TDO      (1 << 3)
+#define DD_DBG_TDI      (1 << 2)
+#define DD_DBG_SWCLKTCK (1 << 1)
+#define DD_DBG_nTRST    (1 << 0)
+
+
+// =============================================================================
+// GPIO 1 Pin Assignments
+// =============================================================================
+
+//
+// Character device for printf and miscellaneous signals
+//
+//
+// GPIO[ 7] 7 >----------------------------------------> Character Strobe
+// GPIO[ 6] 6 >----------------------------------------> \
+// GPIO[ 5] 5 >---------------------------------------->  \
+// GPIO[ 4] 4 >---------------------------------------->   \ Character
+// GPIO[ 3] 3 >---------------------------------------->    >  Value
+// GPIO[ 2] 2 >---------------------------------------->   /
+// GPIO[ 1] 1 >---------------------------------------->  /
+// GPIO[ 0] 0 >----------------------------------------> /
+//
+//
+
+#define DD_PRINT_STROBE (1 << 7)
+#define DD_PRINT_CHAR    0x7F
+
+
+#endif
+
+
diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester.c b/Cortex-M0/nanosoc/software/debug_tester/debugtester.c
new file mode 100644
index 0000000..a778043
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester.c
@@ -0,0 +1,2775 @@
+//
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//-----------------------------------------------------------------------------
+//
+
+//////////////////////////////////////////////////////////////////////////////
+//
+// CMSDK Debug Tester Code
+//
+//////////////////////////////////////////////////////////////////////////////
+
+
+// This code always runs on the Cortex-M processor within the
+// cmsdk_debug_tester.v module in the example testbench.
+//
+// The Debug Tester uses the example components supplied with the CMSDK.
+// You must copy and rename the example components if you wish to
+// modify their behavior, otherwise the Debug Tester may break.
+//
+// This code provides access to various test routines that can use
+// either a SerialWire or JTAG interface to connect to the
+// example MCU.
+//
+// The functions available to the example MCU are enumerated in
+// debugtester_functions.h by the variable "Function". These correspond to
+// actual functions within this file beneath the comment "Functions Available
+// to MCU Core".
+//
+// Communication between the example MCU and the Debug Tester takes place
+// in two ways:
+//
+// [1]
+//
+// Function Calling, Function completion and Error status use a simple
+// handshake using GPIO0. Refer to the main() function in this file,
+// and the functions EnableDebugTester(), DisableDebugTester(),
+// CallDebugtester(), StartDebugtester() and CheckDebugtester() in
+// generic/mcu_debugtester_interface.c for details.
+//
+//
+// [2]
+//
+// Some tests and functions need to pass more complex data between the
+// example MCU and the Debug Tester. For these cases, an area of memory
+// in the example MCU SRAM is predefined as an area for passing values
+// between the Debug Tester and example MCU.
+//
+// The region used is the last 4 words above the stack pointer of the
+// example MCU. The debugtester code reads the example MCU vector table
+// to determine its SP, and therefore the location of these four words.
+//
+// The Debug Tester accesses this region using
+// Cortex_MCU.stacktop and suitable offsets, using the
+// ReadCommRegion() and WriteCommRegion() functions which also handle
+// changing the endianness of the data when required.
+// The example MCU accesses this region using the array
+// DEBUGTESTERDATA, defined in generic/mcu_debugtester_interface.h
+//
+//
+
+#include "cmsdk_debugtester.h"        // CMSIS Support for the debugtester
+#include "system_cmsdk_debugtester.h" // CMSIS Support for the debugtester
+#include "debugtester.h"              // Local header file
+#include <stdio.h>                    // Access to printf
+
+// EXPECTED_BE: Expected Endianness <0=> Little Endian <1=> Big Endian
+#ifdef DEBUGTESTER_BE
+#define EXPECTED_BE 1
+#else
+#define EXPECTED_BE 0
+#endif
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Global Variables
+//////////////////////////////////////////////////////////////////////////////
+
+// Track information about the target
+
+struct {
+  uint32_t stacktop;
+  uint32_t traceconfigured;
+} Cortex_MCU;
+
+
+// Track state of the DAP
+
+struct {
+  uint32_t jtagnsw;
+  uint32_t jtagapndp;
+  uint32_t on;
+  uint32_t banksel;
+  uint32_t csw;
+  uint32_t error;
+  uint8_t  ack;
+  uint8_t  stkerrclr;
+} DAPSTATUS;
+
+// Trace decompression globals
+uint32_t trace_id = 0x71; // Init to reserved
+uint32_t trace_errors = 0;
+uint8_t  etm_packet[6];
+uint32_t etm_bytes=0;
+uint32_t etm_current=0;
+uint32_t itm_current=0;
+uint8_t  itm_header;
+uint32_t itm_payload=0;
+uint32_t itm_ts1=0;
+uint32_t itm_ts2=0;
+uint32_t itm_ts1_last=0;
+uint32_t itm_bytes=0;
+uint32_t itm_size=0;
+uint32_t itm_ts=0;
+uint32_t itm_sync=0;
+uint32_t itm_overflow=0;
+uint32_t itm_sw=0;
+uint32_t itm_event=0;
+uint32_t itm_periodic=0;
+uint32_t itm_exception=0;
+uint32_t itm_comp=0;
+uint32_t itm_glb1=0;
+uint32_t itm_glb2=0;
+
+uint32_t current_address = 0;
+uint32_t etm_ts1 = 0;
+uint32_t etm_ts1_last = 0;
+uint32_t etm_ts2 = 0;
+uint32_t etm_p_headers =0;
+uint32_t etm_i_sync =0;
+uint32_t etm_branches =0;
+uint32_t etm_exceptions =0;
+uint32_t etm_rfe =0;
+uint32_t etm_timestamps =0;
+uint32_t etm_triggers =0;
+uint32_t etm_ignore =0; // Expect 0
+uint32_t fmt_triggers =0;
+uint32_t fmt_frames =0;
+uint32_t fmt_etm =0;
+uint32_t fmt_itm =0;
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Function Prototypes
+//////////////////////////////////////////////////////////////////////////////
+
+// SerialWire
+
+uint32_t SWConnect(void);
+uint32_t SWHeader(uint8_t);
+uint32_t SWDataRead(void);
+void     SWDataWrite(uint32_t);
+void     SerialWireClockOut (uint32_t, uint32_t);
+uint32_t SerialWireClockIn (uint32_t);
+void     SWLineReset(uint8_t);
+void     SWExitDormantState(void);
+
+
+// JTAG
+
+void     JTAGTransition(uint32_t, uint8_t);
+uint64_t JTAGShift(uint64_t, uint8_t);
+uint64_t JTAGScanIDCODE(void);
+void     JTAGScanIR(uint32_t);
+uint64_t JTAGScanDR(uint64_t);
+
+
+// Trace
+
+uint32_t ParseTrace(uint8_t);
+
+
+// Wire Protocol Agnostic functions
+
+void     pulse_clock(uint8_t);
+void     InitDAPSTATUS(void);
+void     InitCommRegion(void);
+uint32_t SwapEndian(uint32_t);
+uint32_t ReadCommRegion(uint32_t);
+void     WriteCommRegion(uint32_t, uint32_t);
+uint32_t ReadMem(uint32_t);
+uint32_t ReadMemH(uint32_t);
+uint32_t ReadMemB(uint32_t);
+void     ReadMemBlock(uint32_t, uint32_t, uint32_t *);
+uint32_t ReadMemSpecial(uint32_t, uint8_t, uint32_t);
+void     WriteMem(uint32_t, uint32_t);
+void     WriteMemBlock(uint32_t, uint32_t, uint32_t *);
+void     WriteMemH(uint32_t, uint32_t);
+void     WriteMemB(uint32_t, uint32_t);
+void     JtagAPnDP(uint32_t);
+void     DPWriteBANKSEL(uint32_t);
+void     DPWriteCTRLSTAT(uint32_t);
+uint32_t DPReadCTRLSTAT(void);
+uint32_t APReadCSW(void);
+void     APWriteCSW(uint32_t);
+void     APWriteTAR(uint32_t);
+uint32_t APReadDRW(void);
+void     APWriteDRW(uint32_t);
+uint32_t DPReadRDBUFF(void);
+uint32_t DPReadIDR(void);
+uint32_t APReadIDR(void);
+uint32_t APReadBASE(void);
+uint32_t DPReadHALTEV(void);
+void     DPClearSTICKYERR(void);
+uint32_t CheckDAPSTATUS(void);
+
+
+// Prototypes for MCU exposed functions
+uint32_t SetInterfaceJTAG(void);
+uint32_t SetInterfaceSW(void);
+uint32_t DAPPowerUp(void);
+uint32_t DAPPowerDown(void);
+uint32_t GetTAPID(void);
+uint32_t GetDPReg(void);
+uint32_t GetAPReg(void);
+uint32_t GetAPMem(void);
+uint32_t SetAPMem(void);
+uint32_t GetAPMemCSIDs(void);
+uint32_t GetAPMemPID(void);
+uint32_t ConnectWakeUnhalt(void);
+uint32_t ConnectCheckUnlockup(void);
+uint32_t EnableHaltingDebug(void);
+uint32_t DAPAccess(void);
+uint32_t ConfigTrace(void);
+uint32_t CheckTrace(void);
+uint32_t EmptyFunction(void);
+
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Func points to the functions that will be used by the MCU
+//////////////////////////////////////////////////////////////////////////////
+
+uint32_t (*Func[]) (void) = { SetInterfaceJTAG,
+			      SetInterfaceSW,
+			      DAPPowerUp,
+                              DAPPowerDown,
+			      GetTAPID,
+			      GetDPReg,
+			      GetAPReg,
+			      GetAPMem,
+			      SetAPMem,
+			      GetAPMemCSIDs,
+			      ConnectWakeUnhalt,
+			      ConnectCheckUnlockup,
+                              EnableHaltingDebug,
+			      DAPAccess,
+			      ConfigTrace,
+                              CheckTrace,
+			      EmptyFunction,
+			      EmptyFunction,
+			      EmptyFunction,
+			      EmptyFunction,
+			      EmptyFunction,
+			      EmptyFunction,
+			      EmptyFunction,
+			      EmptyFunction,
+			      EmptyFunction,
+			      EmptyFunction,
+			      EmptyFunction,
+			      EmptyFunction,
+			      EmptyFunction,
+			      EmptyFunction,
+			      EmptyFunction,
+			      EmptyFunction
+};
+
+
+//////////////////////////////////////////////////////////////////////////////
+// Main code
+//////////////////////////////////////////////////////////////////////////////
+
+int main (void)
+{
+  uint32_t SelectedFunction;
+
+  //
+  // Initialisation
+  //
+  // GPIO0
+  GPIO0->DATAOUT = 0;
+  GPIO0->OUTENABLESET = ( ((DD_IO_RUNNING | DD_IO_ERROR) << 8) |
+		      (DD_DBG_TMSEN | DD_DBG_TMS | DD_DBG_TDI | DD_DBG_SWCLKTCK | DD_DBG_nTRST) );
+  // GPIO1
+  GPIO1->DATAOUT = 0;
+  GPIO1->OUTENABLESET = ( DD_PRINT_STROBE | DD_PRINT_CHAR );
+
+  // Raise nTRST to bring JTAG DAP out of reset
+  GPIO0->DATAOUT = DD_DBG_nTRST;
+
+  // Initialise DAPSTATUS struct
+  InitDAPSTATUS();
+
+  // Initialise example MCU information
+  Cortex_MCU.stacktop = 0;
+  Cortex_MCU.traceconfigured = 0;
+
+  //
+  // Sit in loop waiting to service requests from the MCU cpu core
+  //
+  while(1)
+    {
+      if(GPIO0->UB_MASKED[DD_IO_STROBE])
+        {
+          // Clear any error flag
+	  GPIO0->UB_MASKED[DD_IO_ERROR] = 0;
+
+          // Work out which routine to execute
+	  SelectedFunction = (GPIO0->UB_MASKED[DD_IO_FUNCSEL]) >> 8;
+
+          // Indicate that we are running
+	  GPIO0->UB_MASKED[DD_IO_RUNNING] = DD_IO_RUNNING << 8;
+
+          // Wait for deassertion of strobe
+	  while(GPIO0->UB_MASKED[DD_IO_STROBE]);
+
+          // Run it
+          if( (*Func[SelectedFunction])() != 0 )
+            {
+              // Flag an error
+	      GPIO0->UB_MASKED[DD_IO_ERROR] = DD_IO_ERROR << 8;
+            };
+
+          // Indicate that we are finished
+	  GPIO0->UB_MASKED[DD_IO_RUNNING] = 0;
+          DBG_MSG(("Selected function run finished, wait for new function\n"));
+        }
+    }
+}
+
+
+//============================================================================
+//
+// Functions Available to MCU Core
+//
+//============================================================================
+
+uint32_t SetInterfaceJTAG()
+{
+  // Switch to JTAG mode
+  DBG_MSG(("SetInterfaceJTAG()\n"));
+  if(DAPSTATUS.on)
+    {
+      DBG_MSG(("SetInterfaceJTAG() TEST FAILED: DAP power on\n"));
+      return TEST_FAIL;
+    }
+  else
+    {
+      // Update struct
+      DAPSTATUS.jtagnsw = 1;
+
+      // JTAG - We'll always be driving TMS
+      GPIO0->LB_MASKED[DD_DBG_TMSEN] = DD_DBG_TMSEN;
+
+      // Ensure we are in TLR by clocking in 5 TMS high cycles
+      JTAGTransition(0xff, 5);
+
+      // Get into RTI as our default initial state
+      JTAGTransition(0, 1);
+
+      return TEST_PASS;
+    }
+}
+
+
+uint32_t SetInterfaceSW()
+{
+  // Switch to SerialWire mode
+  DBG_MSG(("SetInterfaceSW()\n"));
+  if(DAPSTATUS.on)
+   {
+     DBG_MSG(("SetInterfaceSW() TEST FAIL: DAP power on\n"));
+     return TEST_FAIL;
+   }
+  else
+    {
+      // Initialise
+      DAPSTATUS.jtagnsw = 0;
+      return SWConnect();
+    }
+}
+
+
+uint32_t DAPPowerUp()
+{
+  DBG_MSG(("DAPPowerUp()\n"));
+  if(DAPSTATUS.on == 0)
+    {
+      DPWriteCTRLSTAT( 0x50000000 );
+
+      // Wait for the effect of write
+      while((DPReadCTRLSTAT() & 0xF0000000UL) != 0xF0000000UL);
+
+      DAPSTATUS.on=1;
+      return CheckDAPSTATUS();
+    }
+  DBG_MSG(("DAPPowerUp() FAIL\n"));
+  return TEST_FAIL;
+}
+
+
+uint32_t DAPPowerDown()
+{
+  uint32_t jtagnsw;
+  uint32_t error;
+
+  DBG_MSG(("DAPPowerDown()\n"));
+  if(DAPSTATUS.on == 1)
+    {
+      DPWriteCTRLSTAT( 0x0 );
+
+      // Wait for the effect of write
+      while((DPReadCTRLSTAT() & 0xF0000000UL) != 0 );
+
+      // Re-Initialise DAPSTATUS, but preserve jtagnsw and error
+      jtagnsw = DAPSTATUS.jtagnsw;
+      error = DAPSTATUS.error;
+      InitDAPSTATUS();
+      DAPSTATUS.jtagnsw = jtagnsw;
+      DAPSTATUS.error = error;
+      return CheckDAPSTATUS();
+    }
+  DBG_MSG(("DAPPowerDown(): FAIL\n"));
+  return TEST_FAIL;
+}
+
+
+// Following functions all use the Comms Region
+
+uint32_t GetTAPID()
+{
+  DBG_MSG(("GetTAPID()\n"));
+  InitCommRegion();
+  if(DAPSTATUS.jtagnsw == 1)
+    {
+      WriteCommRegion(0, (JTAGScanIDCODE() & 0xFFFFFFFFUL) );
+      return CheckDAPSTATUS();
+    }
+  return TEST_FAIL;
+}
+
+
+uint32_t GetDPReg()
+{
+  uint32_t dpreg;
+  uint32_t value;
+
+  DBG_MSG(("GetDPReg()\n"));
+
+  if(DAPSTATUS.on)
+    {
+      InitCommRegion();
+
+      dpreg = ReadCommRegion(0);
+
+      if(DAPSTATUS.jtagnsw)
+	{
+	  JtagAPnDP(DP);
+	  JTAGScanDR(JTAG_SCAN(dpreg,READ));
+	  value = DPReadRDBUFF();
+	}
+      else
+	{
+	  SWHeader(SW_HEADER(DP, READ, dpreg));
+	  value = SWDataRead();
+	}
+
+      WriteCommRegion(0, value);
+      return CheckDAPSTATUS();
+    }
+  return TEST_FAIL;
+}
+
+
+uint32_t GetAPReg()
+{
+  uint32_t apreg;
+  uint32_t value;
+
+  DBG_MSG(("GetAPReg()\n"));
+
+  if(DAPSTATUS.on)
+    {
+      InitCommRegion();
+      apreg = ReadCommRegion(0);
+
+      DPWriteBANKSEL( (apreg >> 4) & 0xF );
+
+      if(DAPSTATUS.jtagnsw)
+	{
+	  JtagAPnDP(AP);
+	  JTAGScanDR(JTAG_SCAN(apreg,READ));
+	  value = DPReadRDBUFF();
+	}
+      else
+	{
+	  SWHeader( SW_HEADER(AP, READ, apreg) );
+	  SWDataRead();
+	  value = DPReadRDBUFF();
+	}
+      WriteCommRegion(0, value);
+      return CheckDAPSTATUS();
+    }
+  return TEST_FAIL;
+}
+
+
+uint32_t GetAPMem()
+{
+  uint32_t addr;
+  uint32_t value;
+
+  DBG_MSG(("GetAPMem()\n"));
+
+  if(DAPSTATUS.on)
+    {
+      InitCommRegion();
+      addr = ReadCommRegion(0);
+      DBG_MSG(("GetAPMem(%x)\n",addr));
+
+      value = ReadMem(addr);
+      DBG_MSG(("GetAPMem(%x) returned %x\n", addr, value));
+
+      WriteCommRegion(0, value);
+      return CheckDAPSTATUS();
+    }
+  return TEST_FAIL;
+}
+
+
+uint32_t SetAPMem()
+{
+  uint32_t addr;
+  uint32_t value;
+
+  DBG_MSG(("SetAPMem()\n"));
+
+  if(DAPSTATUS.on)
+    {
+      InitCommRegion();
+      addr = ReadCommRegion(0);
+      value = ReadCommRegion(1);
+
+      if(addr&0x3 == 0)
+	{
+	  WriteMem(addr, value);
+	  return CheckDAPSTATUS();
+	}
+
+      DBG_MSG(("Only WORD writes are supported\n"));
+    }
+  return TEST_FAIL;
+}
+
+
+uint32_t GetAPMemCSIDs()
+{
+  //
+  // Use the Comm Region to return the CoreSight PID and CID values
+  //
+  // Pack the four byte values CID0-CID3 into one word
+  // Pack the four byte values PID0-PID3 into one word
+  // Pack the four byte values PID4-PID7 into one word
+  //
+
+  uint32_t component_base;
+
+  uint32_t csids[12];
+
+  uint32_t cid;
+  uint32_t pid_lo;
+  uint32_t pid_hi;
+
+  DBG_MSG(("GetAPMemCSIDs()\n"));
+
+  if(DAPSTATUS.on)
+    {
+      InitCommRegion();
+      component_base = ReadCommRegion(0);
+
+      // Read all 12 ID locations in one operation
+      ReadMemBlock((component_base + PID4_OFFSET), 12, csids);
+
+      // Pack CID and PID information into 3 words
+
+      // PID4 (0xFD0)
+      pid_hi  =  (csids[0] & 0xFF);
+
+      // PID5 (0xFD4)
+      pid_hi |= ((csids[1] & 0xFF) << 8);
+
+      // PID6 (0xFD8)
+      pid_hi |= ((csids[2] & 0xFF) << 16);
+
+      // PID7 (0xFDC)
+      pid_hi |= ((csids[3] & 0xFF) << 24);
+
+      // PID0 (0xFE0)
+      pid_lo =   (csids[4] & 0xFF);
+
+      // PID1 (0xFE4)
+      pid_lo |= ((csids[5] & 0xFF) << 8);
+
+      // PID2 (0xFE8)
+      pid_lo |= ((csids[6] & 0xFF) << 16);
+
+      // PID3 (0xFEC)
+      pid_lo |= ((csids[7] & 0xFF) << 24);
+
+      // CID0 (0xFF0)
+      cid =   (csids[8] & 0xFF);
+
+      // CID1 (0xFF4)
+      cid |= ((csids[9] & 0xFF) << 8);
+
+      // CID2 (0xFF8)
+      cid |= ((csids[10] & 0xFF) << 16);
+
+      // CID3 (0xFFC)
+      cid |= ((csids[11] & 0xFF) << 24);
+
+      WriteCommRegion(0, cid);
+      WriteCommRegion(1, pid_lo);
+      WriteCommRegion(2, pid_hi);
+
+      return CheckDAPSTATUS();
+    }
+
+  return TEST_FAIL;
+}
+
+
+uint32_t ConnectWakeUnhalt()
+{
+  //
+  // Used to wake core up when sleeping
+  //
+
+  uint32_t data;
+
+  // Connect - Done by SetMode*
+  DBG_MSG(("ConnectWakeUnhalt()\n"));
+
+  if(DAPSTATUS.on)
+    {
+      InitCommRegion();
+
+      // Check S_SLEEP
+      data=ReadMem(DHCSR_ADDR);
+
+	if(data & S_SLEEP)
+	  {
+	    DBG_MSG(("Seen S_SLEEP\n"));
+
+	    // Core is sleeping, so set halting debug enable
+	    WriteMem(DHCSR_ADDR, (DBGKEY | C_HALT | C_DEBUGEN) );
+	    DBG_MSG(("Written C_HALT\n"));
+
+	    // Wait for core to be halted
+	    while((ReadMem(DHCSR_ADDR) & S_HALT) == 0);
+	    DBG_MSG(("Seen S_HALT\n"));
+
+	    // Write flag into DATA[0] to allow example MCU code to escape its loop
+	    WriteCommRegion(0, 1);
+	    DBG_MSG(("Written flag\n"));
+
+	    // Clear Halt and debug enables
+	    WriteMem(DHCSR_ADDR, DBGKEY);
+	    DBG_MSG(("Cleared halt\n"));
+
+	    return CheckDAPSTATUS();
+	  }
+
+	DBG_MSG(("Core not sleeping\n"));
+	return TEST_FAIL;
+    }
+  return TEST_FAIL;
+}
+
+
+uint32_t EnableHaltingDebug()
+{
+  DBG_MSG(("EnableHaltingDebug()\n"));
+
+  if(DAPSTATUS.on)
+    {
+      // Set C_DEBUGEN bit
+      DBG_MSG(("EnableHaltingDebug()\n"));
+
+      // Set Debug enable
+      WriteMem(DHCSR_ADDR, (DBGKEY | C_DEBUGEN) );
+      DBG_MSG(("Written C_DEBUGEN\n"));
+
+      return CheckDAPSTATUS();
+    }
+  return TEST_FAIL;
+}
+
+
+uint32_t ConnectCheckUnlockup()
+{
+  uint32_t value;
+
+  DBG_MSG(("ConnectCheckUnlockup()\n"));
+
+  if(DAPSTATUS.on)
+    {
+      InitCommRegion();
+
+      // Check for S_LOCKUP
+      if(ReadMem(DHCSR_ADDR) & S_LOCKUP)
+	{
+	  DBG_MSG(("Seen S_LOCKUP\n"));
+
+	  // Halt the core
+	  WriteMem(DHCSR_ADDR, (DBGKEY | C_HALT | C_DEBUGEN) );
+	  DBG_MSG(("Written C_HALT\n"));
+
+	  // Wait for core to be halted
+	  while((ReadMem(DHCSR_ADDR) & S_HALT) == 0);
+	  DBG_MSG(("Seen S_HALT\n"));
+
+
+	  // Replace faulting code sequence with a non-faulting
+	  // sequence at the same address, to allow the core to
+	  // exit HardFault and continue the main() code.
+
+	  // Get non-faulting value
+	  value = ReadCommRegion(2); // Reads from (Cortex_MCU.stacktop + 0x8)
+
+	  // Write to execution location
+	  WriteCommRegion(3, value); // Writes to (Cortex_MCU.stacktop + 0xC)
+
+	  //Get the RETURN register value
+	  WriteMem(DCRSR_ADDR, (DebugReturnAddress));
+	  while( (ReadMem(DHCSR_ADDR) & S_REGRDY) == 0 );
+	  value = ReadMem(DCRDR_ADDR);
+	  DBG_MSG(("Current DebugReturnAddress= %x\n", value));
+
+
+	  // Write address of the (now non-faulting) function
+	  // as the DebugReturnAddress
+	  value = (Cortex_MCU.stacktop + 0xC);
+	  WriteMem(DCRDR_ADDR, value);
+	  WriteMem(DCRSR_ADDR, (REGWnR | DebugReturnAddress));
+	  while( (ReadMem(DHCSR_ADDR) & S_REGRDY) == 0 );
+	  DBG_MSG(("Wrote return address= %x\n", value));
+
+	  // Unhalt
+	  WriteMem(DHCSR_ADDR, DBGKEY);
+	  DBG_MSG(("Cleared C_HALT\n"));
+
+	  return CheckDAPSTATUS();
+	}
+      DBG_MSG(("Core not in lockup\n"));
+      return TEST_FAIL;
+    }
+  return TEST_FAIL;
+}
+
+
+uint32_t DAPAccess()
+{
+  //
+  // Perform WORD, HALFWORD, and BYTE accesses
+  //
+
+  uint32_t retval = 0;
+
+  DBG_MSG(("DAPAccess()\n"));
+
+  if(DAPSTATUS.on)
+    {
+      InitCommRegion();
+
+      // Zero a WORD
+      WriteMem(Cortex_MCU.stacktop, 0);
+
+      // Check WORD reads as zero
+      if(ReadMem(Cortex_MCU.stacktop) == 0)
+	{
+	  retval |= 0x1;
+	  DBG_MSG(("Word was clear\n"));
+	}
+
+      // Write a HALFWORD
+      WriteMemH((Cortex_MCU.stacktop + 2), 0x3456);
+
+      // Read a WORD, check for expected value
+      if(ReadMem(Cortex_MCU.stacktop) == 0x34560000)
+	{
+	  retval |= 0x2;
+	  DBG_MSG(("Read back correct value\n"));
+	}
+      else
+	{
+	  DBG_MSG(("Incorrect value - FAIL\n"));
+	}
+
+      // Write a BYTE
+      WriteMemB((Cortex_MCU.stacktop + 1), 0x12);
+
+      // Read a WORD, check for expected value
+      if(ReadMem(Cortex_MCU.stacktop) == 0x34561200)
+	{
+	  retval |= 0x4;
+	  DBG_MSG(("Read back correct value\n"));
+	}
+      else
+	{
+	  DBG_MSG(("Incorrect value - FAIL\n"));
+	}
+
+      WriteCommRegion(0, retval);
+      DBG_MSG(("Written retval: %x\n", retval));
+
+      return CheckDAPSTATUS();
+    }
+  return TEST_FAIL;
+}
+
+
+uint32_t ConfigTrace(void)
+{
+  //
+  // Function to provide support for trace testing.
+  // Initialise the trace capture, and should be after
+  // trace port has been set-up.
+  //
+
+  DBG_MSG(("ConfigTrace()\n"));
+
+  if(DAPSTATUS.on)
+    {
+      InitCommRegion();
+      // Get config to use from test core.
+      TRACE->CONFIG = ReadCommRegion(0); // Reads from (Cortex_MCU.stacktop);
+      DBG_MSG(("TRACE->CONFIG= %x\n",TRACE->CONFIG));
+      Cortex_MCU.traceconfigured = 1;
+      return CheckDAPSTATUS();
+    }
+  return TEST_FAIL;
+}
+
+
+uint32_t CheckTrace(void)
+{
+  //
+  // Function to provide support for trace testing.
+  // Read formatted data from buffer and
+  // decompress individual streams
+  //
+  // Trace is printed, and also counted to allow tests to check
+  // the relevant packets were generated
+  //
+
+  uint32_t i = 7;
+  uint32_t frame_buffer[4];
+  uint32_t lsb_bits;
+
+  DBG_MSG(("CheckTrace()\n"));
+
+  if(DAPSTATUS.on)
+    {
+      if(Cortex_MCU.traceconfigured == 0)
+	{
+	  DBG_MSG(("ERROR : ConfigTrace has not been ran before CheckTrace, or CheckTrace executed again without rerunning ConfigTrace\n"));
+	  return TEST_FAIL;
+	}
+      else
+	{
+	  InitCommRegion();
+
+	  // Set Cortex_MCU.traceconfigured = 0 again to reconfigure trace next time when
+	  // it is called. This make it possible for testing ITM/ITMSW/DTM/DTMSW
+	  // in one main file.
+	  Cortex_MCU.traceconfigured = 0;
+
+	  DBG_MSG(("Trace Decompress\n"));
+	  DBG_MSG(("initial i= %x, trace_errors=%x\n", i, trace_errors));
+	  DBG_MSG(("initial TRACE->DEPTH = %x\n", TRACE->DEPTH));
+	  DBG_MSG(("initial TRACE->STATUS = %x\n", TRACE->STATUS));
+	  if ((TRACE->DEPTH ==0) &((TRACE->STATUS & 0x8)==0)) { //Trace depth is zero and no overflow
+	    DBG_MSG(("No trace captured\n"));
+
+	    return TEST_FAIL;
+	  }
+
+	  if ((TRACE->STATUS & 0x8)==0x8) { //Trace capture buffer overflow
+	    DBG_MSG(("Trace capture buffer overflow\n"));
+	    return TEST_FAIL;
+	  }
+	  DBG_MSG(("initial i= %x, trace_errors=%x\n", i, trace_errors));
+	  // Grab frame of data
+	  while((i==7) && (trace_errors == 0))
+	    {
+	      DBG_MSG(("."));
+	      for(i=0;i<4;i++)
+		{
+		  frame_buffer[i] = TRACE->DATA;
+		  if (frame_buffer[i] == 0x7FFFFFFFUL)
+		    {
+		      if (i==0)
+			{
+			  DBG_MSG(("No more Frames\n"));
+			  i=5;
+			}
+		      else
+			{
+			  DBG_MSG(("Incomplete Frame. At %d, %08x:%08x:%08x:%08x:\n",i,
+				   frame_buffer[0],frame_buffer[1],frame_buffer[2],frame_buffer[3]));
+			  i=5;
+			  trace_errors++;
+			}
+		    }
+		}
+	      // Decompress frame
+	      if(i==4)
+		{
+		  fmt_frames++;;
+		  lsb_bits = frame_buffer[3] >> 24;
+		  for(i=0;i<7;i++)
+		    {
+		      if((frame_buffer[i/2] & 0x1) == 0x1)
+			{
+			  if ((lsb_bits & 1) == 1)
+			    {
+			      ParseTrace(((frame_buffer[i/2]) >> 8) & 0xFF);
+			      trace_id = (((frame_buffer[i/2]) >> 1) & 0x7F);
+			    }
+			  else
+			    {
+			      trace_id = (((frame_buffer[i/2]) >> 1) & 0x7F);
+			      ParseTrace(((frame_buffer[i/2]) >> 8) & 0xFF);
+			    }
+			}
+		      else
+			{
+			  ParseTrace((frame_buffer[i/2] & 0xFE) |
+				     (lsb_bits & 1));
+			  ParseTrace(((frame_buffer[i/2]) >> 8) & 0xFF);
+			}
+		      frame_buffer[i/2] = ((frame_buffer[i/2]) >> 16);
+		      lsb_bits = lsb_bits >> 1;
+		    }
+		  // Byte 14 handled outside of loop Should not be early ID
+		  if((frame_buffer[3] & 0x1) == 1)
+		    {
+		      if(lsb_bits != 0 )
+			{
+			  trace_errors ++;
+			  DBG_MSG(("\nByte 14 is ID with LSB set, should be data\n"));
+			}
+		      else
+			{
+			  trace_id = ((frame_buffer[3] >> 1) & 0x7F);
+			}
+		    }
+		  else
+		    {
+		      ParseTrace((frame_buffer[3] & 0xFE) | lsb_bits);
+		    }
+		}
+	    }
+	  DBG_MSG(("\nTrace extraction done, %d\n",trace_errors));
+	  // Write trace statistics into MCU memmory. May be some corruption if counts are too large
+	  // Maximum of 256 frames, 3840 ETM bytes
+	  // [0] fmt_trig[2], fmt_itm[10], fmt_etm[12], fmt_frames[8]
+	  // [1] exceptions[4], branches[8], Isync[6], p_headers [14]
+	  // [2] itm_sync[2] itm_overflow[2], itm_glb2[4], itm_glb1[8], triggers[2], ignore [2], timestamps[8], rfe[4]
+	  // [3] itm_ts[5], itm_sw[5], itm_event[6], itm_periodic[5], itm_exception[5], itm_comp[6]
+	  WriteCommRegion(0, ((fmt_triggers << 30) | (fmt_itm << 20) | (fmt_etm <<8) | fmt_frames) );
+	  WriteCommRegion(1, (etm_p_headers | etm_i_sync <<14 | etm_branches<<20| etm_exceptions<<28));
+	  WriteCommRegion(2, (etm_rfe | etm_timestamps<<4 | etm_ignore<<12 | etm_triggers <<14 |
+			      itm_glb1 << 16 | itm_glb2 << 24 | itm_overflow <<28 | itm_sync << 2));
+	  WriteCommRegion(3, (itm_ts<<27 | itm_sw<<22 | itm_event <<16 | itm_periodic <<11 | itm_exception <<6 | itm_comp));
+
+	  return trace_errors;
+	}
+    }
+  return TEST_FAIL;
+}
+
+
+uint32_t ParseTrace(uint8_t new_byte)
+{
+  // ID 0 is null, used for padding. Although not architected, expect to only see data=0
+  //
+  switch (trace_id)
+  {
+    case 0:
+      if(new_byte != 0)
+      {
+        DBG_MSG(("NULL ID (0) with non-zero data byte:%02x\n",new_byte));
+        trace_errors++;
+      }
+      break;
+
+  case MCU_ETM_ID:
+
+      fmt_etm++;
+      TRC_MSG(("%02x ",new_byte));
+      switch (etm_current)
+      {
+        case 00:
+          if(new_byte==0) // Sync Packet
+          {
+            etm_current = 1;
+            etm_bytes++;
+          }
+          else if((new_byte & 1) ==1) // Branch Packet
+          {
+            current_address = (current_address & 0xFFFFFF80UL) |
+              (new_byte & 0x7E);
+            if((new_byte & 0x80)==0x80)
+            {
+              etm_current = 2;
+              etm_packet[0] = new_byte;
+              etm_bytes++;
+            }
+            else
+            {
+              TRC_MSG(("Branch to %08x\n",current_address));
+              etm_branches++;
+            }
+          }
+          else if(new_byte  ==0x08) // I-Sync packet
+          {
+            etm_current = 4;
+          }
+          else if(new_byte  ==0x0C) // Trigger, single byte
+          {
+            TRC_MSG(("ETM Trigger\n"));
+            etm_triggers++;
+          }
+          else if(new_byte  ==0x66) // Ignore, single byte
+          {
+            TRC_MSG(("ETM Ignore byte\n"));
+            etm_ignore++;
+          }
+          else if(new_byte  ==0x76) // RFE, single byte
+          {
+            TRC_MSG(("ETM Exception Return\n"));
+            etm_rfe++;
+          }
+          else if((new_byte & 0x80 )== 0x80) // P-header, single byte
+          {
+            etm_p_headers++;
+            TRC_MSG(("P-header, "));
+            if((new_byte & 0x3) == 0) {
+              if((new_byte & 0x3C) !=0) {
+                TRC_MSG(("%d CC pass ",(new_byte & 0x3C)>>2));
+              }
+              if((new_byte & 0x40) !=0) {
+                TRC_MSG(("1 CC Fail "));
+              }
+              TRC_MSG(("\n"));
+            }
+            else
+            {
+              if((new_byte & 0xF0) != 0x80)
+              {
+                DBG_MSG(("Bad P-Header\n"));
+                trace_errors++;
+              }
+              etm_p_headers++;
+              if((new_byte & 0x8) == 0x0)
+              {
+                TRC_MSG(("CC-Pass,"));
+              }
+              else
+              {
+                TRC_MSG(("CC-Fail,"));
+              }
+              if((new_byte & 0x4) == 0x0)
+              {
+                TRC_MSG(("CC-Pass\n"));
+              }
+              else
+              {
+                TRC_MSG(("CC-Fail\n"));
+              }
+            }
+          }
+          else if((new_byte | 0x04 )== 0x46) // Timestamp
+          {
+            etm_current = 8;
+            etm_bytes=0;
+            TRC_MSG(("ETM Timestamp, R-bit%d\n",(new_byte>>2) & 1));
+            etm_timestamps++;
+          }
+          else
+          {
+            trace_errors++;
+            DBG_MSG(("Bad ETM Byte\n"));
+            TRC_MSG(("Header %02x Unknown\n",new_byte));
+          }
+          break;
+        case 0x01: // Sync packet. 0x00 or 0x80
+          if(new_byte==0)
+          {
+            etm_bytes++;
+          }
+          else if(new_byte==0x80)
+          {
+            etm_bytes=0;
+            etm_current = 0;
+            TRC_MSG(("Sync Packet\n"));
+          }
+          break;
+        case 0x02: // Branch Packet. Uses continuation bits
+          etm_packet[etm_bytes] = new_byte;
+          etm_bytes++;
+          if((new_byte >>7) == 0)
+          {
+            switch (etm_bytes)
+            {
+              case 2: // bits[12:7]
+                current_address = (current_address & 0xFFFFD07F) | ((new_byte & 0x3E) << 6);
+                break;
+              case 3: // bits[19:14]
+                current_address = (current_address & 0xFFF03FFF) | ((new_byte & 0x3E) << 13);
+                break;
+              case 4: // bits[26:21]
+                current_address = (current_address & 0xF81FFFFF) | ((new_byte & 0x3E) << 20);
+                break;
+              case 5: // bits[31:28]
+                trace_errors++;
+                DBG_MSG(("Branch Packet Too long\n"));
+                break;
+            }
+            TRC_MSG(("Branch Packet - Address %08x\n",current_address));
+            etm_branches++;
+            etm_bytes = 0;
+            // Check for exception bytes
+            if((new_byte >>6) == 0)
+            {
+              etm_current = 0;
+            }
+            else
+            {
+              etm_current = 0x10;
+            }
+          }
+          else
+          {
+            if(etm_bytes > 6) {
+              DBG_MSG(("Branch Packet too long\n"));
+              trace_errors++;
+              switch (etm_bytes)
+              {
+                case 2: // bits[13:7]
+                  current_address = (current_address & 0xFFFFC07F) | ((new_byte & 0x7E) << 6);
+                  break;
+                case 3: // bits[20:14]
+                  current_address = (current_address & 0xFFE03FFF) | ((new_byte & 0x7E) << 13);
+                  break;
+                case 4: // bits[27:21]
+                  current_address = (current_address & 0xF01FFFFF) | ((new_byte & 0x7E) << 20);
+                  break;
+                case 5: // bits[31:28]
+                  current_address = (current_address & 0x0FFFFFFF) | ((new_byte & 0x7E) << 27);
+                  break;
+              }
+            }
+          }
+          break;
+        case 0x04: // I-sync packet. Fixed length for CM3-ETM / CM4-ETM
+          etm_packet[etm_bytes] = new_byte;
+          etm_bytes++;
+          if(etm_bytes == 5)
+          {
+            current_address = (etm_packet[1] & 0xFE) |
+              (etm_packet[2] << 8) | (etm_packet[3] << 16) | (etm_packet[4] << 24) ;
+            if((etm_packet[0] & 0x9F) != 0x01)
+            {
+              trace_errors++;
+              DBG_MSG(("Bad Isync information byte %02x\n",etm_packet[0]));
+            }
+            TRC_MSG(("I-Sync Packet "));
+            switch(etm_packet[0]>>5 & 3)
+            {
+              case 0: TRC_MSG(("Periodic"));
+                break;
+              case 1: TRC_MSG(("Trc On"));
+                break;
+              case 2: TRC_MSG(("Overflow"));
+                break;
+              case 3: TRC_MSG(("Debug"));
+            }
+            TRC_MSG((", Address %08x\n",current_address));
+            etm_i_sync++;
+            etm_bytes = 0;
+            etm_current = 0;
+          }
+          break;
+        case 0x08: // Timestamp Packet
+          etm_bytes++;
+          switch (etm_bytes)
+          {
+            case 1:
+              etm_ts1 = (etm_ts1 & 0xFFFFFF80UL) | (new_byte & 0x7F);
+              break;
+            case 2:
+              etm_ts1 = (etm_ts1 & 0xFFFFC07FUL) | (new_byte & 0x7F)<<7;
+              break;
+            case 3:
+              etm_ts1 = (etm_ts1 & 0xFFE03FFFUL) | (new_byte & 0x7F)<<14;
+              break;
+            case 4:
+              etm_ts1 = (etm_ts1 & 0xF01FFFFFUL) | (new_byte & 0x7F)<<21;
+              break;
+            case 5:
+              etm_ts1 = (etm_ts1 & 0x0FFFFFFFUL) | (new_byte & 0x0F)<<28;
+              etm_ts2 = (etm_ts2 & 0xFFFFFFF8UL) | (new_byte & 0x70)>>4;
+              break;
+            case 6:
+              etm_ts2 = (etm_ts2 & 0xFFFFFC07UL) | (new_byte & 0x7F)<<3;
+              break;
+            case 7:
+              etm_ts2 = (etm_ts2 & 0xFFFF03FFUL) | (new_byte & 0x3F)<<10;
+              if(new_byte & 0xC0 !=0)
+              {
+                DBG_MSG(("Last timestamp byte should have [7:6]=00\n"));
+                trace_errors++;
+                etm_current = 0;
+              }
+              break;
+          }
+          if((new_byte >> 7) ==0)
+          {
+            if ((etm_ts1 < etm_ts1_last) & etm_bytes <5)
+            {
+              DBG_MSG(("Timestamp must increase\n"));
+              trace_errors++;
+            }
+            TRC_MSG(("ETM Timestamp %04x%08x\n",etm_ts2,etm_ts1));
+            etm_current = 0;
+            etm_bytes=0;
+          }
+          break;
+        case 0x10: // Exception packet
+          etm_bytes++;
+          if((new_byte>>7) == 0)
+          {
+            etm_bytes=0;
+            etm_current = 0;
+            TRC_MSG(("Exception Taken\n"));
+            etm_exceptions++;
+          }
+          else
+          {
+            if(etm_bytes > 2)
+            {
+              trace_errors++;
+              DBG_MSG(("Exception packet too long\n"));
+            }
+          }
+          break;
+        default:
+          DBG_MSG(("Trace parser crashed\n"));
+          trace_errors++;
+          break;
+      }
+      break;
+
+  case MCU_ITM_ID:
+
+      DBG_MSG(("ITM:%02x\n",new_byte));
+      fmt_itm++;
+      switch (itm_current)
+      {
+        case 0x00:
+          if(new_byte == 00)
+          {
+            itm_current = 1;        // Sync
+            itm_bytes=1;
+          }
+          else if(new_byte == 0x70) // Overflow
+          {
+            itm_overflow++;
+            TRC_MSG(("ITM Overflow\n"));
+          }
+          else if((new_byte & 0x0F) == 0) // local timestamp
+          {
+            if ((new_byte & 0x80) == 0) // single byte TS
+            {
+              TRC_MSG(("ITM TS :%d\n",(new_byte & 0x70) >> 4));
+              itm_ts++;
+            }
+            else
+            {
+              itm_current = 2;
+              itm_header = new_byte;
+              itm_payload = 0;
+              itm_bytes=1;
+            }
+          }
+          else if(new_byte == 0x94) // ts1
+          {
+            itm_current = 4;
+            itm_header = new_byte;
+            itm_payload = 0;
+            itm_bytes=1;
+          }
+          else if(new_byte == 0xB4) // ts2
+          {
+            itm_current = 8;
+            itm_header = new_byte;
+            itm_payload = 0;
+            itm_bytes=1;
+          }
+          else if((new_byte & 0x3) != 0)   // Stimulus packet
+          {
+            itm_current = 16;
+            itm_header = new_byte;
+            itm_payload = 0;
+            itm_bytes=0;
+            switch (new_byte & 0x3)
+              {
+              case 1: itm_size = 1;
+                break;
+              case 2: itm_size = 2;
+                break;
+              case 3: itm_size = 4;
+                break;
+              }
+          }
+          else
+          {
+            trace_errors++;
+            DBG_MSG(("Un-recognised ITM\n"));
+            TRC_MSG((" BAD Header %02x\n",new_byte));
+          }
+          break;
+        case 0x01:
+          itm_bytes ++;
+          if(new_byte == 0x80)
+          {
+            TRC_MSG(("ITM Sync\n"));
+            itm_sync++;
+            itm_current = 0;
+            itm_bytes = 0;
+          }
+          if((new_byte & 0x7F) != 0)
+          {
+            trace_errors++;
+            itm_current = 0;
+            itm_bytes = 0;
+            DBG_MSG(("ITM Bad sync byte %02x\n",new_byte));
+          }
+          break;
+        case 0x02:
+          itm_payload = (itm_payload <<7) | (new_byte & 0x7F);
+          if ((new_byte & 0x80) == 0)
+          {
+            switch (itm_header>>4 & 3)
+            {
+              case 0: TRC_MSG(("ITM TS delta:%d\n",itm_payload));
+                break;
+              case 1: TRC_MSG(("ITM Late TS :%d\n",itm_payload));
+                break;
+              case 2: TRC_MSG(("ITM TS for delayed packet :%d\n",itm_payload));
+                break;
+              case 3: TRC_MSG(("ITM late TS for delayed packet:%d\n",itm_payload));
+                break;
+            }
+            itm_ts++;
+            itm_current = 0;
+            itm_bytes =0;
+          }
+          else
+          {
+            itm_bytes++;
+            if (itm_bytes > 5)
+            {
+              trace_errors++;
+              DBG_MSG(("ITM timestamp packet too long\n"));
+              itm_current = 0;
+              itm_bytes =0;
+            }
+          }
+          break;
+        case 0x04:
+          switch (itm_bytes)
+            {
+            case 1:
+              itm_ts1 = (itm_ts1 & 0xFFFFFF10) | (new_byte & 0x7f);
+              break;
+            case 2:
+              itm_ts1 = (itm_ts1 & 0xFFFFC07F) | ((new_byte & 0x7f) <<7);
+              break;
+            case 3:
+              itm_ts1 = (itm_ts1 & 0xFFF03FFF) | ((new_byte & 0x7f) <<14);
+              break;
+            case 4:
+              itm_ts1 = (itm_ts1 & 0xFF10FFFF) | ((new_byte & 0x7f) <<21);
+              break;
+            }
+          itm_bytes++;
+          if((new_byte & 0x80) == 0x00)
+          {
+            TRC_MSG(("ITM Global TS1 :%d\n",itm_ts1 & 0x03FFFFFFUL));
+            itm_glb1 ++;
+            if(itm_ts1 > 0)
+            {
+              if((itm_ts1 < itm_ts1_last) & (new_byte & 0x40 == 0x00))
+              {
+                DBG_MSG(("Timestamp should increase"));
+                trace_errors++;
+              }
+              itm_ts1_last = itm_ts1;
+            }
+            if (itm_bytes == 5)
+            {
+              if((new_byte & 0x20) == 0x20)
+              {
+                TRC_MSG(("ITM Global Clock Change\n"));
+              }
+              if((new_byte & 0x40) == 0x40)
+              {
+                TRC_MSG(("ITM Global low count bits wrapped\n"));
+              }
+            }
+            itm_current = 0;
+          }
+          else
+          {
+            if (itm_bytes == 5)
+            {
+              DBG_MSG(("ITM TS1 too long\n"));
+              trace_errors++;
+              itm_current = 0;
+              itm_bytes =0;
+            }
+          }
+          break;
+        case 0x08:
+          switch (itm_bytes)
+            {
+            case 1:
+              itm_ts2 = (itm_ts2 & 0xFFFFFF10) | (new_byte & 0x7f);
+              break;
+            case 2:
+              itm_ts2 = (itm_ts2 & 0xFFFFC07F) | ((new_byte & 0x7f) <<7);
+              break;
+            case 3:
+              itm_ts2 = (itm_ts2 & 0xFFF03FFF) | ((new_byte & 0x7f) <<14);
+              break;
+            case 4:
+              itm_ts2 = (itm_ts2 & 0xFF10FFFF) | ((new_byte & 0x7f) <<21);
+              break;
+            }
+          itm_bytes++;
+          if((new_byte & 0x80) == 0x00)
+          {
+            TRC_MSG(("ITM Global TS2 :%d\n",itm_ts2 & 0x007FFFFFUL));
+            itm_glb2 ++;
+            if (itm_bytes == 5)
+            {
+              if(new_byte & 0xFE != 0x00)
+              {
+                DBG_MSG(("ITM TS2 byte 5 can only have bit[0] set\n"));
+                trace_errors++;
+              }
+            }
+            itm_current = 0;
+          }
+          else
+          {
+            if (itm_bytes == 5)
+            {
+              DBG_MSG(("ITM TS2 too long\n"));
+              trace_errors++;
+              itm_current = 0;
+              itm_bytes =0;
+            }
+          }
+          break;
+        case 0x10:
+          itm_payload = itm_payload | (new_byte << (itm_bytes * 8));
+          itm_bytes ++;
+          if(itm_bytes == itm_size)
+          {
+            if ((itm_header & 4) == 0)
+            {
+              TRC_MSG(("ITM s/w channel %d, %08x\n",itm_header>>3,itm_payload));
+              itm_sw++;
+            }
+            else
+            {
+              switch(itm_header>>3)
+                {
+                case 0://Event packet
+                  TRC_MSG(("ITM #"));
+                  if((itm_payload & 1) == 1) {
+                    TRC_MSG((" CPI"));
+                    itm_event++;
+                  }
+                  if((itm_payload & 2) == 2) {
+                    TRC_MSG((" Exc"));
+                    itm_event++;
+                  }
+                  if((itm_payload & 4) == 4) {
+                    TRC_MSG((" Sleep"));
+                    itm_event++;
+                  }
+                  if((itm_payload & 8) == 8) {
+                    TRC_MSG((" LSU"));
+                    itm_event++;
+                  }
+                  if((itm_payload & 16) == 16) {
+                    TRC_MSG((" FOLD"));
+                    itm_event++;
+                  }
+                  if((itm_payload & 32) == 32) {
+                    TRC_MSG((" Cyc"));
+                    itm_event++;
+                  }
+                  TRC_MSG((" Event\n"));
+                  break;
+                case 1://Exception Packet
+                  switch (itm_payload >> 12)
+                    {
+                    case 1:
+                      TRC_MSG(("ITM Exception Entry %d\n",itm_payload & 0x1ff));
+                      break;
+                    case 2:
+                      TRC_MSG(("ITM Exception Exit %d\n",itm_payload & 0x1ff));
+                      break;
+                    case 3:
+                      TRC_MSG(("ITM Exception Return %d\n",itm_payload & 0x1ff));
+                      break;
+                    }
+                  itm_exception++;
+                  break;
+                case 2:
+                  if(itm_size == 4) {
+                    TRC_MSG(("ITM PC periodic %08x\n",itm_payload));
+                  } else {
+                    TRC_MSG(("ITM PC periodic, sleeping\n"));
+                  }
+                  itm_periodic++;
+                  break;
+                default: // Other sources
+                  if((itm_header & 0xC4) == 0x84){
+                    TRC_MSG(("ITM Data Value %d:",(itm_header>> 4) & 3));
+                    if ((itm_header & 8) == 0){
+                      TRC_MSG(("Read "));
+                    } else {
+                      TRC_MSG(("Write "));
+                    }
+                    TRC_MSG((" %08x\n",itm_payload));
+                  }
+                  if((itm_header & 0xCF) == 0x47) {
+                    TRC_MSG(("ITM Data PC %d:%08x\n",(itm_header>> 4) & 3,itm_payload));
+                  }
+                  if((itm_header & 0xCF) == 0x4E) {
+                    TRC_MSG(("ITM Data Address offset %d:%08x\n",(itm_header>> 4) & 3,itm_payload));
+                  }
+                  if((itm_header >> 5) == 3) {
+                    TRC_MSG(("ITM Unspecified HW source %d:%08x\n",(itm_header>> 3),itm_payload));
+                    trace_errors++;
+                  }
+                  itm_comp++;
+                }
+            }
+            itm_current = 0;
+            itm_bytes =0;
+          }
+          break;
+      }
+      break;
+    case 0x7D:
+      if(new_byte != 0)
+      {
+        DBG_MSG(("Trigger with non-zero data byte:%02x\n",new_byte));
+      }
+      TRC_MSG(("Formatter Trigger\n"));
+      fmt_triggers++;
+      break;
+    default:
+      trace_errors ++;
+      DBG_MSG(("Unexpected ID:%02x\n",trace_id));
+      break;
+  }
+  return 0;
+}
+
+
+uint32_t EmptyFunction()
+{
+  DBG_MSG(("EmptyFunction()\n"));
+
+  return TEST_FAIL;
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Internal Functions - Wire Protocol agnostic
+//
+////////////////////////////////////////////////////////////////////////////////
+
+void InitDAPSTATUS()
+{
+  //
+  // Initialise DAPSTATUS struct - use from reset, or if DAP powered down
+  //
+  DAPSTATUS.jtagnsw = 0;     // Serial Wire
+  DAPSTATUS.jtagapndp = 2;   // Invalid value
+  DAPSTATUS.on = 0;          // DAP powered off
+  DAPSTATUS.banksel = 0xff;  // Invalid banksel value
+  DAPSTATUS.csw = 0xffffffff;// Invalid CSW value - we haven't set up CSW
+  DAPSTATUS.error = 0;       // No errors
+  DAPSTATUS.ack = 0;         // Invalid value for ack
+  DAPSTATUS.stkerrclr = 0;   // Not cleared
+}
+
+
+void InitCommRegion()
+{
+  //
+  // Get value for Cortex_MCU.stacktop by reading example MCU vector table
+  //
+  if(Cortex_MCU.stacktop == 0)
+    {
+      DBG_MSG(("InitCommRegion()\n"));
+      Cortex_MCU.stacktop = ReadMem(0);
+      Cortex_MCU.stacktop = SwapEndian(Cortex_MCU.stacktop);
+      DBG_MSG(("InitCommRegion() StackPointer = %x\n",Cortex_MCU.stacktop ));
+    }
+}
+
+
+uint32_t SwapEndian(uint32_t data)
+{
+  //
+  // Swap endianness of data values if CPUs are BigEndian, since
+  // the DAP routines are inherently LE
+  //
+
+  if(EXPECTED_BE)
+    {
+      // CPU under test is in BigEndian, so swap data endianness
+      return __REV(data);
+    }
+  else
+    {
+      return data;
+    }
+}
+
+
+uint32_t ReadCommRegion(uint32_t index)
+{
+  return SwapEndian( ReadMem( Cortex_MCU.stacktop + (4 * index)));
+}
+
+
+void WriteCommRegion(uint32_t index, uint32_t data)
+{
+  WriteMem( (Cortex_MCU.stacktop + (4 * index)), SwapEndian(data) );
+}
+
+
+uint32_t ReadMem(uint32_t address)
+{
+  //
+  // return the WORD value found at address
+  //
+
+  uint32_t value;
+
+  // Ensure CSW is set up
+  APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_OFF | CSW_SIZE_WORD);
+
+  // Write TAR
+  APWriteTAR(address);
+
+  // Read DRW
+  APReadDRW();
+
+  // Read RdBuff
+  value = DPReadRDBUFF();
+
+  DBG_MSG(("ReadMem(%x), returned: %x\n", address,value));
+
+  return value;
+}
+
+
+uint32_t ReadMemH(uint32_t address)
+{
+  //
+  // return the HALFWORD value found at address
+  //
+
+  uint32_t value;
+
+  // Ensure CSW is set up
+  APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_OFF | CSW_SIZE_HALFWORD);
+
+  // Write TAR
+  APWriteTAR(address);
+
+  // Read DRW
+  APReadDRW();
+
+  // Read RdBuff
+  value = DPReadRDBUFF();
+
+  DBG_MSG(("ReadMemH(%x), returned: %x\n", address,value));
+
+  return value;
+}
+
+
+uint32_t ReadMemB(uint32_t address)
+{
+  //
+  // return the BYTE value found at address
+  //
+
+  uint32_t value;
+
+  // Ensure CSW is set up
+  APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_OFF | CSW_SIZE_BYTE);
+
+  // Write TAR
+  APWriteTAR(address);
+
+  // Read DRW
+  APReadDRW();
+
+  // Read RdBuff
+  value = DPReadRDBUFF();
+
+  DBG_MSG(("ReadMemB(%x), returned: %x\n", address,value));
+
+  return value;
+}
+
+
+void ReadMemBlock(uint32_t address, uint32_t numwords, uint32_t * data)
+{
+  //
+  // Return numword WORDS from address into the data array
+  //
+
+  uint32_t tar;
+  uint32_t wordsread;
+
+  DBG_MSG(("ReadMemBlock(%x, %x)\n",address, numwords));
+
+  // Ensure CSW is set up
+  APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_SINGLE | CSW_SIZE_WORD);
+
+  // Keep local copy of TAR
+  tar = address;
+
+  // Write TAR
+  APWriteTAR(tar);
+
+  for(wordsread = 0; wordsread < numwords; wordsread++)
+    {
+      // If the local copy of the TAR value increments beyond the bottom 10 bits,
+      // reload the DAP TAR. (ADIv5 Arch states that autoincrement beyond the
+      // bottom 10 bits is implementation defined.)
+      if(!(tar & 0x3FF))
+        {
+          APWriteTAR(tar);
+        }
+
+      if(wordsread)
+	{
+	  data[wordsread-1] = APReadDRW();
+	}
+      else
+	{
+	  // Discard data from initial Read
+	  APReadDRW();
+	}
+      tar += 4;
+    }
+
+  // Read final word from the Read Buffer
+  data[wordsread-1] = DPReadRDBUFF();
+}
+
+
+uint32_t ReadMemSpecial(uint32_t address, uint8_t size, uint32_t user)
+{
+  //
+  // return the value found at address. if the DAPSTATUS error
+  // is set as a result of this read (assuming no prior errors),
+  // the CTRL/STAT register is read to check sticky ERR bit and
+  // then ABORT register written to clear the sticky ERR bit
+  //
+  uint32_t value;
+  uint32_t ctrlstat;
+
+  // Ensure CSW is set up
+  APWriteCSW(CSW_PROT_MASTER_DBG | CSW_INCR_OFF | size | user);
+
+  // Write TAR
+  APWriteTAR(address);
+
+  // Read DRW
+  APReadDRW();
+
+  // Read RdBuff
+  value = DPReadRDBUFF();
+
+  // For JTAG, CTRLSTAT needs to be read
+  // for faults. Ack doesn't indicate fault
+  if(DAPSTATUS.jtagnsw)
+    {
+      ctrlstat = DPReadCTRLSTAT();
+      if((ctrlstat >> 5) & 1UL)
+        DAPSTATUS.error++;
+    }
+
+  // Read CTRLSTAT to check STICKYERR
+  // if STICKYERR is set, clear it
+  if(DAPSTATUS.error == 1)
+    {
+      if(DAPSTATUS.jtagnsw)
+        {
+          // Already read earlier
+          DBG_MSG(("DAP access faulted, clearing sticky error bit\n"));
+          DPClearSTICKYERR();
+          DAPSTATUS.stkerrclr = 1;
+        }
+      else
+        {
+          ctrlstat = DPReadCTRLSTAT();
+
+          if((ctrlstat >> 5) & 1UL)
+            {
+            DBG_MSG(("DAP access faulted, clearing sticky error bit\n"));
+            DPClearSTICKYERR();
+            DAPSTATUS.stkerrclr = 1;
+            }
+        }
+
+     DAPSTATUS.error = 0;
+    }
+  else if(DAPSTATUS.error > 1)
+         DBG_MSG(("More than one DAP error seen! Unexpected so not clearing sticky error bit\n"));
+
+  DBG_MSG(("ReadMemSpecial(%x), returned: %x\n", address,value));
+
+  return value;
+}
+
+void WriteMem(uint32_t address, uint32_t data)
+{
+  //
+  // Write WORD value back to target memory
+  //
+
+  DBG_MSG(("WriteMem(%x, %x)\n",address, data));
+
+  // Ensure CSW is set up
+  APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_OFF | CSW_SIZE_WORD);
+
+  // Write TAR
+  APWriteTAR(address);
+
+  // Write DRW
+  APWriteDRW(data);
+
+  // Read RdBuff to flush the write
+  DPReadRDBUFF();
+}
+
+
+void WriteMemBlock(uint32_t address, uint32_t numwords, uint32_t * data)
+{
+  //
+  // Write numwords WORD values to target memory
+  //
+
+  uint32_t tar;
+  uint32_t wordswritten;
+
+  DBG_MSG(("WriteMemBlock(%x, %x, %x)\n",address, numwords, data));
+
+  // Write CSW : Word, incrementing address
+  APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_SINGLE | CSW_SIZE_WORD);
+
+  // Keep local copy of TAR
+  tar = address;
+
+  // Write TAR
+  APWriteTAR(tar);
+  DBG_MSG(("Written 0x%x to TAR\n",tar));
+
+  for(wordswritten = 0; wordswritten < numwords; wordswritten++)
+    {
+      // If the local copy of the TAR value increments beyond the bottom 10 bits,
+      // reload the DAP TAR. (ADIv5 Arch states that autoincrement beyond the
+      // bottom 10 bits is implementation defined.)
+      if(!(tar & 0x3FF))
+        {
+          APWriteTAR(tar);
+          DBG_MSG(("Written 0x%x to TAR\n",tar));
+        }
+
+      // Write DRW
+      APWriteDRW(data[wordswritten]);
+      tar += 4;
+    }
+
+  // Read RdBuff to flush the last write
+  DPReadRDBUFF();
+}
+
+
+void WriteMemH(uint32_t address, uint32_t data)
+{
+  //
+  // Write HALFWORD value back to target memory
+  //
+
+  uint32_t ldata;
+
+  ldata = data | (data << 16);
+
+  DBG_MSG(("WriteMemH(%x, %x)\n",address, ldata));
+
+  // Ensure CSW is set up
+  APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_OFF | CSW_SIZE_HALFWORD);
+
+  // Write TAR
+  APWriteTAR(address);
+
+  // Write DRW
+  APWriteDRW(ldata);
+
+  // Read RdBuff to flush the write
+  DPReadRDBUFF();
+}
+
+
+void WriteMemB(uint32_t address, uint32_t data)
+{
+  //
+  // Write BYTE value back to target memory
+  //
+
+  uint32_t ldata;
+
+  ldata = data | (data << 8);
+  ldata = ldata | (ldata << 16);
+
+  DBG_MSG(("WriteMemB(%x, %x)\n",address, ldata));
+
+  // Ensure CSW is set up
+  APWriteCSW(CSW_PROT_MASTER_DBG | CSW_PROT_PRIV | CSW_INCR_OFF | CSW_SIZE_BYTE);
+
+  // Write TAR
+  APWriteTAR(address);
+
+  // Write DRW
+  APWriteDRW(ldata);
+
+  // Read RdBuff to flush the write
+  DPReadRDBUFF();
+}
+
+
+void JtagAPnDP(uint32_t apndp)
+{
+  //
+  // JTAG switch scanchains
+  //
+  if(DAPSTATUS.jtagapndp != apndp)
+    {
+      if(apndp)
+      {
+          // AP
+          JTAGScanIR(JTAG_APACC);
+      }
+      else
+      {
+          // DP
+          JTAGScanIR(JTAG_DPACC);
+      }
+      DAPSTATUS.jtagapndp = apndp;
+    }
+}
+
+
+void DPWriteBANKSEL(uint32_t banksel)
+{
+  //
+  // Set DP register BANKSEL
+  //
+
+  if(DAPSTATUS.banksel != banksel)
+    {
+      if(DAPSTATUS.jtagnsw)
+      {
+            JtagAPnDP(0);
+            JTAGScanDR( (banksel << 7) | JTAG_SCAN(SELECT,WRITE) );
+      }
+      else
+      {
+            SWHeader( SW_HEADER(DP, WRITE, SELECT) );
+            SWDataWrite( banksel << 4 );
+      }
+      DAPSTATUS.banksel = banksel;
+    }
+}
+
+
+void DPWriteCTRLSTAT(uint32_t ctrlstat)
+{
+  if(DAPSTATUS.jtagnsw)
+    {
+      JtagAPnDP(0);
+      JTAGScanDR( (((uint64_t) ctrlstat) << 3) |  JTAG_SCAN(CTRLSTAT,WRITE)  );
+    }
+  else
+    {
+      SWHeader( SW_HEADER(DP, WRITE, CTRLSTAT) );
+      SWDataWrite( ctrlstat );
+    }
+}
+
+
+uint32_t DPReadCTRLSTAT()
+{
+  uint32_t data;
+
+  if(DAPSTATUS.jtagnsw)
+    {
+      JtagAPnDP(0);
+      JTAGScanDR( JTAG_SCAN(CTRLSTAT,READ) );
+      data = DPReadRDBUFF();
+    }
+  else
+    {
+      SWHeader( SW_HEADER(DP, READ, CTRLSTAT) );
+      data = SWDataRead();
+    }
+  return data;
+}
+
+uint32_t APReadCSW()
+{
+   uint32_t data;
+
+  // CSW is in bank 0 (APBANKSEL=0)
+  DPWriteBANKSEL(0UL << 4);
+
+  if(DAPSTATUS.jtagnsw)
+    {
+      JtagAPnDP(1);
+      JTAGScanDR( JTAG_SCAN(CSW, READ) );
+      data = DPReadRDBUFF();
+    }
+  else
+    {
+      SWHeader( SW_HEADER(AP, READ, CSW) );
+      SWDataRead();
+      data =DPReadRDBUFF();
+    }
+  return data;
+}
+
+void APWriteCSW(uint32_t csw)
+{
+  // Set up CSW
+  if(DAPSTATUS.csw != csw)
+    {
+      // CSW is in bank 0
+      DPWriteBANKSEL(0UL << 4);
+
+      if(DAPSTATUS.jtagnsw)
+        {
+          JtagAPnDP(1);
+          JTAGScanDR( (((uint64_t) csw) << 3) |  JTAG_SCAN(CSW,WRITE) );
+        }
+      else
+        {
+          SWHeader( SW_HEADER(AP, WRITE, CSW) );
+          SWDataWrite( csw );
+        }
+      DAPSTATUS.csw = csw;
+    }
+}
+
+
+void APWriteTAR(uint32_t address)
+{
+  // TAR is in bank 0
+  DPWriteBANKSEL(0UL << 4);
+
+  if(DAPSTATUS.jtagnsw)
+    {
+      JtagAPnDP(1);
+      JTAGScanDR( (((uint64_t) address) << 3) |  JTAG_SCAN(TAR,WRITE) );
+    }
+  else
+    {
+      SWHeader( SW_HEADER(AP, WRITE, TAR) );
+      SWDataWrite( address );
+    }
+}
+
+
+uint32_t APReadDRW()
+{
+  uint32_t data;
+  // DRW is in bank 0
+  DPWriteBANKSEL(0UL << 4);
+
+  if(DAPSTATUS.jtagnsw)
+    {
+      JtagAPnDP(1);
+      data = (JTAGScanDR(JTAG_SCAN(DRW,READ)) >> 3);
+    }
+  else
+    {
+      SWHeader( SW_HEADER(AP, READ, DRW) );
+      data =  SWDataRead();
+    }
+  return data;
+}
+
+
+void APWriteDRW(uint32_t data)
+{
+  // DRW is in bank 0
+  DPWriteBANKSEL(0UL << 4);
+
+  if(DAPSTATUS.jtagnsw)
+    {
+      JtagAPnDP(1);
+      JTAGScanDR( (((uint64_t) data) << 3) | JTAG_SCAN(DRW,WRITE) );
+    }
+  else
+    {
+      SWHeader( SW_HEADER(AP, WRITE, DRW) );
+      SWDataWrite(data);
+    }
+}
+
+
+uint32_t DPReadRDBUFF()
+{
+  uint32_t data;
+
+  if(DAPSTATUS.jtagnsw)
+    {
+      JtagAPnDP(0);
+      data = ( JTAGScanDR(JTAG_SCAN(RDBUFF,READ)) >> 3);
+    }
+  else
+    {
+      SWHeader( SW_HEADER(DP, READ, RDBUFF) );
+      data = SWDataRead();
+    }
+  return data;
+}
+
+
+uint32_t DPReadIDR()
+{
+  uint32_t data;
+
+  if(DAPSTATUS.jtagnsw)
+    {
+      JtagAPnDP(0);
+
+      JTAGScanDR(JTAG_SCAN(DPIDR,READ));
+      data = DPReadRDBUFF();
+    }
+  else
+    {
+      SWHeader( SW_HEADER(DP, READ, DPIDR) );
+      data = SWDataRead();
+    }
+  return data;
+}
+
+
+uint32_t APReadIDR()
+{
+  uint32_t data;
+
+  // IDR is in bank F
+  DPWriteBANKSEL(0xF);
+
+  if(DAPSTATUS.jtagnsw)
+    {
+      JtagAPnDP(1);
+      JTAGScanDR(JTAG_SCAN(IDR,READ));
+      data = DPReadRDBUFF();
+    }
+  else
+    {
+      SWHeader( SW_HEADER(AP, READ, IDR) );
+      SWDataRead();
+      data = DPReadRDBUFF();
+    }
+  return data;
+}
+
+
+uint32_t APReadBASE()
+{
+  uint32_t data;
+
+  // BASE is in bank F
+  DPWriteBANKSEL(0xF);
+
+  if(DAPSTATUS.jtagnsw)
+    {
+      JtagAPnDP(1);
+      JTAGScanDR(JTAG_SCAN(BASE,READ));
+      data = DPReadRDBUFF();
+    }
+  else
+    {
+      SWHeader( SW_HEADER(AP, READ, BASE) );
+      SWDataRead();
+      data =DPReadRDBUFF();
+    }
+  return data;
+}
+
+
+uint32_t DPReadHALTEV()
+{
+  uint32_t data;
+
+  // HALTEV is in bank 4 (DPBANKSEL=4)
+  DPWriteBANKSEL(0x4UL);
+
+  if(DAPSTATUS.jtagnsw)
+    {
+      JtagAPnDP(0);
+      JTAGScanDR(JTAG_SCAN(HALTEV,READ));
+      data = DPReadRDBUFF();
+    }
+  else
+    {
+      SWHeader( SW_HEADER(DP, READ, HALTEV));
+      data = SWDataRead();
+    }
+
+  // Switch DPBANKSEL back to 0
+  DPWriteBANKSEL(0x0UL);
+
+  return data;
+}
+
+
+void DPClearSTICKYERR()
+{
+  //
+  // Clear STICKYERR bit
+  //
+  uint32_t ctrlstat;
+
+  if(DAPSTATUS.jtagnsw)
+    {
+      // write 1 to STICKYERR to clear it, also keep power-up requests high
+#ifdef CORTEX_M0PLUS
+      ctrlstat = (1UL << 5) | (5UL << 28);
+#else
+      ctrlstat = (1UL << 5);
+#endif
+      JtagAPnDP(0);
+      JTAGScanDR( (((uint64_t) ctrlstat) << 3) |  JTAG_SCAN(CTRLSTAT,WRITE)  );
+    }
+  else
+    {
+      SWHeader( SW_HEADER(DP, WRITE, ABORT) );
+#ifdef CORTEX_M0PLUS
+      SWDataWrite( 1UL << 2 );
+#else
+      SWDataWrite( 1UL << 5 );
+#endif
+    }
+}
+
+
+uint32_t CheckDAPSTATUS()
+{
+  //
+  // Check for any debugger errors and return FAIL if any
+  //
+
+  // For JTAG, check CTRLSTAT for faults
+  if(DAPSTATUS.jtagnsw)
+    {
+      if((DPReadCTRLSTAT() >> 5) & 1UL)
+        DAPSTATUS.error++;
+    }
+
+  if(DAPSTATUS.error != 0)
+    {
+      DBG_MSG(("Errors found in Debugger accesses -\tFAIL\n"));
+      return TEST_FAIL;
+    }
+
+  return TEST_PASS;
+}
+
+
+void pulse_clock(uint8_t number_of_clock_ticks)
+{
+  uint8_t count;
+
+  for(count = number_of_clock_ticks; count > 0; count--)
+    {
+      // Pulse clock pin
+      GPIO0->LB_MASKED[DD_DBG_SWCLKTCK] = DD_DBG_SWCLKTCK;
+      GPIO0->LB_MASKED[DD_DBG_SWCLKTCK] = 0;
+    }
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// JTAG Routines
+//
+////////////////////////////////////////////////////////////////////////////////
+
+uint64_t JTAGScanIDCODE()
+{
+  // Read the TAP ID code
+
+  uint64_t tmp;
+
+  JTAGScanIR(JTAG_IDCODE);
+
+  // RTI->SDR
+  // 001
+  JTAGTransition(0x1, 3);
+
+  // Shift
+  tmp = JTAGShift(0, 32);
+
+  // E1DR->RTI
+  // 01
+  JTAGTransition(0x1, 2);
+
+  return tmp;
+}
+
+
+void JTAGScanIR(uint32_t instruction)
+{
+  //
+  // Scan in the passed Instruction
+  //
+
+  // RTI->SIR
+  // 0011
+  JTAGTransition(0x3, 4);
+
+  // Shift Instruction
+  JTAGShift(instruction, 4);
+
+  // E1IR->RTI
+  // 01
+  JTAGTransition(0x1, 2);
+}
+
+
+uint64_t JTAGScanDR(uint64_t data)
+{
+  //
+  // Scan in/out values for the APACC/DPACC/ABORT Scan Chains
+  //
+  // Repeat scan chain for ack=WAIT
+  uint64_t tmp;
+  uint8_t ack;
+
+  do
+  {
+    // RTI->SDR
+    // 001
+    JTAGTransition(0x1, 3);
+
+    // Shift
+    tmp = JTAGShift(data, 35);
+
+    // E1DR->RTI
+    // 01
+    JTAGTransition(0x1, 2);
+
+    ack = (uint8_t)tmp & 7UL;
+
+    DAPSTATUS.ack = ack;
+
+  } while (ack == JTAG_DP_ACK_WAIT);
+
+  return tmp;
+}
+
+
+void JTAGTransition(uint32_t tms, uint8_t numbits)
+{
+  //
+  // JTAGTransition causes us to ENTER a new TAP state
+  //
+
+  uint8_t i;
+
+  for(i = numbits; i > 0; i--)
+    {
+      // Drive TMS
+      if(tms & 0x1)
+        {
+	  GPIO0->LB_MASKED[DD_DBG_TMS] = DD_DBG_TMS;
+        }
+      else
+        {
+	  GPIO0->LB_MASKED[DD_DBG_TMS] = 0;
+        }
+      tms = (tms >> 1);
+
+      pulse_clock(1);
+    }
+}
+
+
+uint64_t JTAGShift(uint64_t data, uint8_t numbits)
+{
+  //
+  // JTAGShift handles shifts into and out of the the SR
+  //
+
+  // Most of the shift state has TMS Low, however the final cycle
+  // which exits from the Shift to Exit1 also clocks out the final bit
+
+  // When we enter this function, JTAGTransition has already created the negedge,
+  // so here we want to drive the output and sample the input.
+
+  // On the final cycle, we'll drive TMS high to escape the SHIFT state
+
+
+  uint8_t i;
+  uint64_t captured_data = 0;
+
+  // Shifts require TMS == 0
+  GPIO0->LB_MASKED[DD_DBG_TMS] = 0;
+
+  for(i = numbits; i > 0; i--)
+    {
+      // Posedge of clock enters the state
+      //    GPIO0->DATA[DD_SWCLKTCK].BYTE[DD_DBG_BYTE] = DD_SWCLKTCK;
+
+      // Drive signals to the DAP on negedge of clock
+      // Also sample signals from the DAP after negedge of clock
+
+      // Drive output
+      if(data & 0x1)
+        {
+          // Set
+	  GPIO0->LB_MASKED[DD_DBG_TDI] = DD_DBG_TDI;
+        }
+      else
+        {
+          // Clear
+	  GPIO0->LB_MASKED[DD_DBG_TDI] = 0;
+        }
+      data = (data >> 1);
+
+
+      // Capture Input
+      captured_data = captured_data >> 1;
+
+      if(GPIO0->LB_MASKED[DD_DBG_TDO])
+        {
+          // Set
+           captured_data |= (0x1ull << 63);
+        }
+
+
+      // Final cycle - drive TMS high to escape to Exit1
+      if(i == 1)
+        {
+	  GPIO0->LB_MASKED[DD_DBG_TMS] = DD_DBG_TMS;
+        }
+
+      pulse_clock(1);
+
+    }
+
+  // fix up alignment of captured data before returning it
+  captured_data = captured_data >> (64-numbits);
+
+  return captured_data;
+
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// SerialWire routines
+//
+////////////////////////////////////////////////////////////////////////////////
+
+uint32_t SWConnect()
+{
+  uint32_t tmp;
+
+#ifdef SWJ_DEPRECATED_SWITCHING_SEQUENCE
+
+  // Note: This sequence is deprecated if dormant mode is supported.
+  // Switch from Jtag to SW (no effect if just SW present)
+
+  SWLineReset(0);
+
+  // : start
+  // Switching sequence (lsb first) = 0xE79E;
+  SerialWireClockOut(0xE79E,16);
+  // Should now be waiting in sw state
+
+#endif
+
+#ifdef SWMD_TARGET_SELECTION
+  // SWMD starts in dormant state so first exit dormant state
+  SWExitDormantState();
+
+  SWHeader( SW_HEADER(DP, WRITE, TARGETSEL));
+
+  // Ack for TARGETSEL access is not driven, so set it explicitly
+  DAPSTATUS.ack = SW_DP_ACK_OK;
+
+  SWDataWrite( MCU_TARGETSEL_VALUE );
+
+#endif
+
+  // Attempt a SerialWire connection sequence
+  SWLineReset(8);
+
+  // Attempt an ID code read
+  SWHeader( SW_HEADER(DP,READ,DPIDR) );
+  tmp = SWDataRead();
+
+  DBG_MSG(("SWConnect returned DPIDR: %x\n", tmp));
+
+  return CheckDAPSTATUS();
+}
+
+
+void SWDataWrite(uint32_t data)
+{
+  //
+  // Enter from SW header+Ack, we are not currently driving the line
+  //
+
+  uint32_t mask;
+  uint32_t parity;
+
+  // Send one turnaround cycle
+  pulse_clock(1);
+
+  // Only clock out bits if ACK was OK
+  if(DAPSTATUS.ack == SW_DP_ACK_OK)
+    {
+      // Clock data out
+      SerialWireClockOut(data,32);
+
+      // Calculate data parity
+      for(parity=0, mask=0x1; mask != 0; mask = mask << 1)
+        {
+          parity += (data & mask) ? 1 : 0;
+        }
+
+      // Clock parity out
+      SerialWireClockOut(parity,1);
+    }
+}
+
+
+uint32_t SWDataRead(void)
+{
+   uint32_t rdata;
+
+  // Only clock in bits if ACK was OK
+  if(DAPSTATUS.ack == SW_DP_ACK_OK)
+    {
+      // Reads do not need to flip the line at all.
+      // Clock out 32 data bits, + parity, + turnaround
+
+      // Clock in 32 bits of read data
+      rdata = SerialWireClockIn(32);
+
+      // Clock in (and ignore!) parity bit and turnround bit
+      SerialWireClockIn(2);
+    }
+  else
+    {
+      // Clock in 1 cycle to put SW state in correct state
+      pulse_clock(1);
+
+      // return bogus value
+      rdata = 0xDEADBEEFUL;
+    }
+
+  DBG_MSG(("SWDataRead() returned %x\n", rdata));
+
+  return rdata;
+}
+
+
+uint32_t SWHeader(uint8_t header)
+{
+  // Clock out the (precalculated) SW header
+  //
+  // Always clock out 8 bits.
+  // Drive ALL bits, including park (DE 618567)
+  //
+
+  uint32_t ack;
+
+  do {
+  // Clock out the header
+  SerialWireClockOut(header, 8);
+
+  // Clock in the first turnround bit and 3 ack bits
+  ack = SerialWireClockIn(4);
+
+  // LSB adjust Ack value and lose turnround bit
+  ack = (ack >> (32 - 3)) & 0x7;
+
+  if (ack == SW_DP_ACK_FAULT)
+    DAPSTATUS.error++;
+
+  // Insert turnaround bit if for WAITed ACK
+  if (ack == SW_DP_ACK_WAIT)
+      SerialWireClockOut(0UL,1);
+
+    DAPSTATUS.ack = ack;
+
+  } while (ack == SW_DP_ACK_WAIT);
+
+
+  if (ack != SW_DP_ACK_OK)
+    {
+      DBG_MSG(("ERROR - Maybe unhandled SW-DP response "));
+      switch(ack)
+	{
+	case SW_DP_ACK_WAIT:
+	  DBG_MSG(("WAIT\n"));
+	  break;
+	case SW_DP_ACK_FAULT:
+	  DBG_MSG(("ERROR\n"));
+	  break;
+	default:
+	  DBG_MSG(("Unknown, %x\n",ack));
+	  break;
+	}
+    }
+
+  return ack;
+}
+
+
+void SerialWireClockOut (uint32_t data, uint32_t numbits)
+{
+  // Ensure we are going to drive the line
+  GPIO0->LB_MASKED[DD_DBG_TMSEN] = DD_DBG_TMSEN;
+
+  for(; numbits > 0; numbits--)
+    {
+      if(data & 0x1)
+        {
+          // Bit set
+	  GPIO0->LB_MASKED[DD_DBG_TMS] = DD_DBG_TMS;
+        }
+      else
+        {
+          // Bit clear
+	  GPIO0->LB_MASKED[DD_DBG_TMS] = 0;
+        }
+
+      pulse_clock(1);
+
+      data = (data >> 1);
+    }
+}
+
+
+uint32_t SerialWireClockIn (uint32_t numbits)
+{
+  uint32_t data = 0;
+
+  // Don't drive the line while clocking data in
+  GPIO0->LB_MASKED[DD_DBG_TMSEN] = 0;
+
+  for(; numbits > 0; numbits--)
+    {
+      data = (data >> 1);
+
+      if(GPIO0->LB_MASKED[DD_DBG_TMSIN])
+        {
+          data |= (0x1UL << 31);
+        }
+
+      pulse_clock(1);
+    }
+
+  return data;
+}
+
+
+void SWLineReset(uint8_t num_of_idle_cycles)
+{
+  // Ensure Clock is low
+  GPIO0->LB_MASKED[DD_DBG_SWCLKTCK] = 0;
+
+  // Set SWDO and SWDOEN
+  GPIO0->LB_MASKED[(DD_DBG_TMS | DD_DBG_TMSEN)] = (DD_DBG_TMS | DD_DBG_TMSEN);
+
+  pulse_clock(50);
+
+  // Insert requested idle cycles
+  GPIO0->LB_MASKED[DD_DBG_TMS] = 0;
+
+  pulse_clock(num_of_idle_cycles);
+}
+
+
+void SWExitDormantState(void)
+{
+  // Leave Dormant state
+  DBG_MSG(("Leaving Dormant State\n"));
+
+  // 1. At least 8 SWCLKTCK cycles with SWDIOTMS high
+  SerialWireClockOut(0xFFUL,8);
+
+  // 2. 128-bit Selection Alert
+  SerialWireClockOut(DS_to_SWD_0,32);
+  SerialWireClockOut(DS_to_SWD_1,32);
+  SerialWireClockOut(DS_to_SWD_2,32);
+  SerialWireClockOut(DS_to_SWD_3,32);
+
+  // 3. 4 SWCLKTCK cycles with SWDIOTMS low
+  SerialWireClockOut(0UL,4);
+
+  // 4. Activation Sequence
+  SerialWireClockOut(SW_ACTV_CODE,8);
+
+  // 5. Line Reset
+  SWLineReset(2);
+}
+
diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester.h b/Cortex-M0/nanosoc/software/debug_tester/debugtester.h
new file mode 100644
index 0000000..fcaacd0
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester.h
@@ -0,0 +1,237 @@
+//
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//-----------------------------------------------------------------------------
+//
+
+//============================================================================
+// Debug tester header file, contain debug related definition
+//============================================================================
+
+//============================================================================
+// Define pass/fail value
+//============================================================================
+#define TEST_PASS 0
+#define TEST_FAIL 1
+
+// Define whether the DebugTester code should display messages
+// using the character output device in the debugtester.
+//#define DEBUGTESTER_PRINTF
+//#define DEBUGTRACE_PRINTF
+
+
+//============================================================================
+// Print macro to allow conditional printing of messages
+//
+// Invoke like printf, but use double braces: DBG_MSG(("format %x", var));
+//============================================================================
+
+#ifdef DEBUGTESTER_PRINTF
+#define DBG_MSG(arg) { printf arg ; }
+#else
+#define DBG_MSG(arg) { (void) 0; }
+#endif
+
+#ifdef DEBUGTRACE_PRINTF
+#define TRC_MSG(arg) { printf arg ; }
+#else
+#define TRC_MSG(arg) { (void) 0; }
+#endif
+
+//============================================================================
+// SW responses
+//============================================================================
+#define SW_DP_ACK_OK     1
+#define SW_DP_ACK_WAIT   2
+#define SW_DP_ACK_FAULT  4
+
+// SW to Dormant state sequence
+#define SWD_to_DS       0xE3BCUL
+
+// Dormant state to SW sequence
+#define DS_to_SWD_0     0x6209F392UL
+#define DS_to_SWD_1     0x86852D95UL
+#define DS_to_SWD_2     0xE3DDAFE9UL
+#define DS_to_SWD_3     0x19BC0EA2UL
+
+#define SW_ACTV_CODE    0x1AUL
+
+//============================================================================
+// JTAG Definitions
+//============================================================================
+#define JTAG_ABORT  0x8
+#define JTAG_DPACC  0xa
+#define JTAG_APACC  0xb
+#define JTAG_IDCODE 0xe
+#define JTAG_BYPASS 0xf
+
+#define JTAG_SCAN(Address,RnW) (((Address & 0xC) >> 1) | RnW)
+
+#define JTAG_DP_ACK_OKFAULT 2
+#define JTAG_DP_ACK_WAIT    1
+
+
+//============================================================================
+// Macro definitions to generate SerialWire packet headers at compilation time
+//============================================================================
+
+// Header Bits
+
+#define AP 1
+#define DP 0
+
+#define READ  1
+#define WRITE 0
+
+// DP Register Addresses
+
+#define DPIDR     0x0
+#define ABORT     0x0
+#define CTRLSTAT  0x4
+#define DLCR      0x4
+#define TARGETID  0x4
+#define HALTEV    0x4
+#define RESEND    0x8
+#define SELECT    0x8
+#define RDBUFF    0xc
+#define TARGETSEL 0xc
+
+// DP control and state register bit definition
+
+#define CTRL_CSYSPWRUPACK  (1UL << 31)  //System power up ack, RO
+#define CTRL_CSYSPWRUPREQ  (1UL << 30)  //System power up req, RW
+#define CTRL_CDBGPWRUPACK  (1UL << 29)  //Debug power up ack, RO
+#define CTRL_CDBGPWRUPREQ  (1UL << 28)  //Debug power up req, RW
+#define CTRL_CDBGRSTACK    (1UL << 27)  //Debug reset ack, RO
+#define CTRL_CDBGRSTREQ    (1UL << 26)  //Debug reset req, RW
+
+// AP Register Addresses
+
+#define CSW  0x00
+#define TAR  0x04
+#define DRW  0x0c
+#define BD0  0x10
+#define BD1  0x14
+#define BD2  0x18
+#define BD3  0x1c
+#define CFG  0xf4
+#define BASE 0xf8
+#define IDR  0xfc
+
+// CSW Register Fields
+#define CSW_PROT_USER     (0UL << 25)
+#define CSW_PROT_PRIV     (1UL << 25)
+#define CSW_PROT_BUFF     (1UL << 26)
+#define CSW_PROT_CACH     (1UL << 27)
+#define CSW_PROT_MASTER_CORE (0UL << 29)
+#define CSW_PROT_MASTER_DBG  (1UL << 29)
+
+#define CSW_INCR_OFF      (0UL << 4)
+#define CSW_INCR_SINGLE   (1UL << 4)
+
+#define CSW_SIZE_BYTE     0
+#define CSW_SIZE_HALFWORD 1
+#define CSW_SIZE_WORD     2
+
+// Serial Wire Header Macros
+
+#define SW_HEADER_PARITY(APnDP,RnW,Address) ( (APnDP & 0x1) ^ (RnW & 0x1) ^ ((Address & 0x4) >> 2) ^ ((Address & 0x8) >> 3) )
+
+// Start, APnDP, RnW, A[3:2], Parity, Stop, Park
+#define SW_HEADER(APnDP,RnW,Address) (1 | ((APnDP & 0x1) << 1) | ((RnW & 0x1) << 2) | ((Address & 0xC) << 1) | SW_HEADER_PARITY(APnDP,RnW,Address) << 5 | 0 << 6 | 1 << 7)
+
+
+//============================================================================
+// CoreSight ID Register Offset values
+//============================================================================
+
+// CID OFFSET define
+#define CID0_OFFSET   0xFF0
+#define CID1_OFFSET   0xFF4
+#define CID2_OFFSET   0xFF8
+#define CID3_OFFSET   0xFFC
+
+
+// PID OFFSET define
+#define PID0_OFFSET   0xFE0
+#define PID1_OFFSET   0xFE4
+#define PID2_OFFSET   0xFE8
+#define PID3_OFFSET   0xFEC
+#define PID4_OFFSET   0xFD0
+#define PID5_OFFSET   0xFD4
+#define PID6_OFFSET   0xFD8
+#define PID7_OFFSET   0xFDC
+
+
+//============================================================================
+// ARMv6M and ARMv7M Architectural Debug Register Definitions
+//============================================================================
+
+// DHCSR
+#define DHCSR_ADDR 0xE000EDF0
+
+#define DBGKEY 0xA05F0000
+#define S_LOCKUP   (1UL << 19)
+#define S_SLEEP    (1UL << 18)
+#define S_HALT     (1UL << 17)
+#define S_REGRDY   (1UL << 16)
+#define C_MASKINTS (1UL << 3)
+#define C_STEP     (1UL << 2)
+#define C_HALT     (1UL << 1)
+#define C_DEBUGEN  (1UL << 0)
+
+
+// DCRSR
+#define DCRSR_ADDR 0xE000EDF4
+
+#define REGWnR (1UL << 16)
+#define R0  0x00
+#define R1  0x01
+#define R2  0x02
+#define R3  0x03
+#define R4  0x04
+#define R5  0x05
+#define R6  0x06
+#define R7  0x07
+#define R8  0x08
+#define R9  0x09
+#define R10 0x0A
+#define R11 0x0B
+#define R12 0x0C
+#define SP  0x0D
+#define LR  0x0E
+#define DebugReturnAddress 0x0F
+#define xPSR 0x10
+#define MSP  0x11
+#define PSP  0x12
+#define CONTROL 0x14
+
+
+// DCRDR
+#define DCRDR_ADDR 0xE000EDF8
+
+
+//============================================================================
+// Trace related defines
+//============================================================================
+
+#define MCU_ETM_ID 0x23 // CM_MCU_ETM_ID in trace_tests.h
+#define MCU_ITM_ID 0x59 // CM_MCU_ITM_ID in trace_tests.h
diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0.sct b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0.sct
new file mode 100644
index 0000000..948eaf9
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0.sct
@@ -0,0 +1,38 @@
+;-----------------------------------------------------------------------------
+; The confidential and proprietary information contained in this file may
+; only be used by a person authorised under and to the extent permitted
+; by a subsisting licensing agreement from Arm Limited or its affiliates.
+;
+;            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+;                ALL RIGHTS RESERVED
+;
+; This entire notice must be reproduced on all copies of this file
+; and copies of this file may only be made by a person if such person is
+; permitted to do so under the terms of a subsisting license agreement
+; from Arm Limited or its affiliates.
+;
+;      SVN Information
+;
+;      Checked In          : $Date: 2011-02-22 16:53:27 +0000 (Tue, 22 Feb 2011) $
+;
+;      Revision            : $Revision: 162307 $
+;
+;      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+;
+;-----------------------------------------------------------------------------
+
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_ROM1 0x00000000 0x00020000  {    ; load region size_region
+  ER_ROM1 0x00000000 0x00020000  {  ; load address = execution address
+   startup_CMSDK_CM0.o (RESET, +FIRST)
+   *(InRoot$$Sections)
+   .ANY (+RO)
+  }
+  RW_RAM1 0x20000000 0x00004000  {  ; RW data
+   .ANY (+RW +ZI)
+  }
+}
+
diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvopt b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvopt
new file mode 100644
index 0000000..647d030
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvopt
@@ -0,0 +1,245 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>1</TopLine>
+      <CurrentLine>1</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>1</TopLine>
+      <CurrentLine>1</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\debugtester.c</PathWithFileName>
+      <FilenameWithoutPath>cmsdk_debugtester.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\system_cmsdk_debugtester.c</PathWithFileName>
+      <FilenameWithoutPath>system_cmsdk_debugtester.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\retarget_cmsdk_debugtester.c</PathWithFileName>
+      <FilenameWithoutPath>retarget_cmsdk_debugtester.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvproj b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvproj
new file mode 100644
index 0000000..b20c84b
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_be.uvproj
@@ -0,0 +1,430 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>debugtester_be</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output debugtester_be.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x4000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0 DEBUGTESTER_BE</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\cmsis\CMSIS\Include; ..\cmsis\Device\ARM\CMSDK_CM0\Include</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>0</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile>debugtester_cm0.sct</ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>cmsdk_debugtester.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\debugtester.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_cmsdk_debugtester.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\system_cmsdk_debugtester.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget_cmsdk_debugtester.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\retarget_cmsdk_debugtester.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvopt b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvopt
new file mode 100644
index 0000000..647d030
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvopt
@@ -0,0 +1,245 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>1</TopLine>
+      <CurrentLine>1</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>1</TopLine>
+      <CurrentLine>1</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\debugtester.c</PathWithFileName>
+      <FilenameWithoutPath>cmsdk_debugtester.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\system_cmsdk_debugtester.c</PathWithFileName>
+      <FilenameWithoutPath>system_cmsdk_debugtester.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\retarget_cmsdk_debugtester.c</PathWithFileName>
+      <FilenameWithoutPath>retarget_cmsdk_debugtester.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvproj b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvproj
new file mode 100644
index 0000000..7973ddc
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0_le.uvproj
@@ -0,0 +1,430 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>debugtester_le</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output debugtester_le.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x4000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\cmsis\CMSIS\Include; ..\cmsis\Device\ARM\CMSDK_CM0\Include</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>0</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile>debugtester_cm0.sct</ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>cmsdk_debugtester.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\debugtester.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_cmsdk_debugtester.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\system_cmsdk_debugtester.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget_cmsdk_debugtester.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\retarget_cmsdk_debugtester.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus.sct b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus.sct
new file mode 100644
index 0000000..8068dfb
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus.sct
@@ -0,0 +1,38 @@
+;-----------------------------------------------------------------------------
+; The confidential and proprietary information contained in this file may
+; only be used by a person authorised under and to the extent permitted
+; by a subsisting licensing agreement from Arm Limited or its affiliates.
+;
+;            (C) COPYRIGHT 2013 Arm Limited or its affiliates.
+;                ALL RIGHTS RESERVED
+;
+; This entire notice must be reproduced on all copies of this file
+; and copies of this file may only be made by a person if such person is
+; permitted to do so under the terms of a subsisting license agreement
+; from Arm Limited or its affiliates.
+;
+;      SVN Information
+;
+;      Checked In          : $Date: 2011-02-22 16:53:27 +0000 (Tue, 22 Feb 2011) $
+;
+;      Revision            : $Revision: 162307 $
+;
+;      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+;
+;-----------------------------------------------------------------------------
+
+; *************************************************************
+; *** Scatter-Loading Description File generated by uVision ***
+; *************************************************************
+
+LR_ROM1 0x00000000 0x00020000  {    ; load region size_region
+  ER_ROM1 0x00000000 0x00020000  {  ; load address = execution address
+   startup_CMSDK_CM0PLUS.o (RESET, +FIRST)
+   *(InRoot$$Sections)
+   .ANY (+RO)
+  }
+  RW_RAM1 0x20000000 0x00004000  {  ; RW data
+   .ANY (+RW +ZI)
+  }
+}
+
diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvopt b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvopt
new file mode 100644
index 0000000..253e152
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvopt
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\cmsis\Device\ARM\CMSDK_CM0PLUS\Source\ARM\startup_CMSDK_CM0PLUS.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0PLUS.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>0</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>1</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>24</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>24</TopLine>
+      <CurrentLine>25</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\debugtester.c</PathWithFileName>
+      <FilenameWithoutPath>debugtester.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\system_cmsdk_debugtester.c</PathWithFileName>
+      <FilenameWithoutPath>system_cmsdk_debugtester.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\retarget_cmsdk_debugtester.c</PathWithFileName>
+      <FilenameWithoutPath>retarget_cmsdk_debugtester.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvproj b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvproj
new file mode 100644
index 0000000..7d4eeb1
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_be.uvproj
@@ -0,0 +1,427 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>debugtester_be</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output debugtester_be.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x4000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS DEBUGTESTER_BE</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\cmsis\CMSIS\Include; ..\cmsis\Device\ARM\CMSDK_CM0\Include</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>0</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile>debugtester_cm0plus.sct</ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0PLUS.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\cmsis\Device\ARM\CMSDK_CM0PLUS\Source\ARM\startup_CMSDK_CM0PLUS.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>debugtester.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\debugtester.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_cmsdk_debugtester.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\system_cmsdk_debugtester.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget_cmsdk_debugtester.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\retarget_cmsdk_debugtester.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvopt b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvopt
new file mode 100644
index 0000000..253e152
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvopt
@@ -0,0 +1,230 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\cmsis\Device\ARM\CMSDK_CM0PLUS\Source\ARM\startup_CMSDK_CM0PLUS.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0PLUS.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>0</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>1</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>24</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>24</TopLine>
+      <CurrentLine>25</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\debugtester.c</PathWithFileName>
+      <FilenameWithoutPath>debugtester.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\system_cmsdk_debugtester.c</PathWithFileName>
+      <FilenameWithoutPath>system_cmsdk_debugtester.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\retarget_cmsdk_debugtester.c</PathWithFileName>
+      <FilenameWithoutPath>retarget_cmsdk_debugtester.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvproj b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvproj
new file mode 100644
index 0000000..0fe273b
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_cm0plus_le.uvproj
@@ -0,0 +1,427 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>debugtester_le</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output debugtester_le.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x4000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\cmsis\CMSIS\Include; ..\cmsis\Device\ARM\CMSDK_CM0\Include</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>0</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile>debugtester_cm0plus.sct</ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0PLUS.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\cmsis\Device\ARM\CMSDK_CM0PLUS\Source\ARM\startup_CMSDK_CM0PLUS.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>debugtester.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\debugtester.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_cmsdk_debugtester.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\system_cmsdk_debugtester.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget_cmsdk_debugtester.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\retarget_cmsdk_debugtester.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/software/debug_tester/debugtester_functions.h b/Cortex-M0/nanosoc/software/debug_tester/debugtester_functions.h
new file mode 100644
index 0000000..3aa1dfd
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/debugtester_functions.h
@@ -0,0 +1,52 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013  Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2012-05-31 12:12:02 +0100 (Thu, 31 May 2012) $
+ *
+ *      Revision            : $Revision: 210765 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// CMSDK Debug Tester Functions header file
+//
+////////////////////////////////////////////////////////////////////////////////
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Function enumeration to allow access to debug tester functions
+//
+
+enum Function { FnSetInterfaceJTAG,
+		FnSetInterfaceSW,
+		FnDAPPowerUp,
+		FnDAPPowerDown,
+		FnGetTAPID,
+		FnGetDPReg,
+		FnGetAPReg,
+		FnGetAPMem,
+		FnSetAPMem,
+		FnGetAPMemCSIDs,
+		FnConnectWakeUnhalt,
+		FnConnectCheckUnlockup,
+		FnEnableHaltingDebug,
+		FnDAPAccess,
+		FnConfigTrace,
+		FnCheckTrace
+};
diff --git a/Cortex-M0/nanosoc/software/debug_tester/retarget_cmsdk_debugtester.c b/Cortex-M0/nanosoc/software/debug_tester/retarget_cmsdk_debugtester.c
new file mode 100644
index 0000000..b2d677d
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/retarget_cmsdk_debugtester.c
@@ -0,0 +1,97 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+//
+// printf retargetting functions for Debug Tester
+//
+
+#include "cmsdk_debugtester.h"
+
+// Routine to write a char - specific to Cortex-M Core debug tester
+void debugtester_char_write(int ch)
+{
+       GPIO1->LB_MASKED[DD_PRINT_CHAR] = ch; // Write whole char to 2nd byte
+       GPIO1->LB_MASKED[DD_PRINT_STROBE] = DD_PRINT_STROBE; // Write strobe
+       GPIO1->LB_MASKED[DD_PRINT_STROBE] = 0; // Clear Strobe
+}
+
+
+#if defined ( __CC_ARM   )
+/******************************************************************************/
+/* Retarget functions for ARM DS-5 Professional / Keil MDK                    */
+/******************************************************************************/
+
+#include <stdio.h>
+#include <time.h>
+#include <rt_misc.h>
+#pragma import(__use_no_semihosting_swi)
+
+struct __FILE { int handle; /* Add whatever you need here */ };
+FILE __stdout;
+FILE __stdin;
+
+
+int fputc(int ch, FILE *f) {
+  debugtester_char_write(ch);
+  return 0;
+}
+
+int fgetc(FILE *f) {
+  return 0;
+}
+
+int ferror(FILE *f) {
+  /* Your implementation of ferror */
+  return EOF;
+}
+
+
+void _ttywrch(int ch) {
+  debugtester_char_write(ch);
+}
+
+
+void _sys_exit(int return_code) {
+label:  goto label;  /* endless loop */
+}
+
+#else
+
+/******************************************************************************/
+/* Retarget functions for GNU Tools for ARM Embedded Processors               */
+/******************************************************************************/
+#include <stdio.h>
+#include <sys/stat.h>
+
+__attribute__ ((used))  int _write (int fd, char *ptr, int len)
+{
+  size_t i;
+  for (i=0; i<len;i++) {
+    debugtester_char_write(ptr[i]); // call character output function
+  }
+  return len;
+}
+
+
+#endif
diff --git a/Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.c b/Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.c
new file mode 100644
index 0000000..5a33bfa
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.c
@@ -0,0 +1,61 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2012 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+ //Correspond to the system_device.c file in the CMSIS standard
+ //provide a minimum requirement for the SystemInit function
+
+
+#include <stdint.h>
+#include "system_cmsdk_debugtester.h"
+
+/*----------------------------------------------------------------------------
+  Define SYSCLK
+ *----------------------------------------------------------------------------*/
+#define __HSI (5000000UL)
+
+/*----------------------------------------------------------------------------
+  Clock Definitions
+ *----------------------------------------------------------------------------*/
+uint32_t SystemFrequency  = 50000000UL;   /*!< System Clock Frequency (Core Clock) */
+
+
+/**
+ * Initialize the system
+ *
+ * @param  none
+ * @return none
+ *
+ * @brief  Setup the microcontroller system
+ *
+ */
+void SystemInit (void)
+{
+  //
+  // SystemInit
+  //
+
+  // Empty function for example MCU, since there are no PLLs etc.
+
+}
+
diff --git a/Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.h b/Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.h
new file mode 100644
index 0000000..ce0beb1
--- /dev/null
+++ b/Cortex-M0/nanosoc/software/debug_tester/system_cmsdk_debugtester.h
@@ -0,0 +1,41 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+#ifndef __SYSTEM_CMSDK_DEBUGTESTER_H
+#define __SYSTEM_CMSDK_DEBUGTESTER_H
+
+extern uint32_t SystemFrequency;                   /*!< System Clock Frequency (Core Clock) */
+
+
+/**
+ * Initialize the system
+ *
+ * @param  none
+ * @return none
+ *
+ * @brief  Setup the microcontroller system
+ *         Initialise GPIO directions and values
+ */
+extern                   void SystemInit     (void);
+#endif
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_z2.scr b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_z2.scr
new file mode 100755
index 0000000..781e2c3
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_z2.scr
@@ -0,0 +1 @@
+vivado -mode tcl -source scripts/build_mcu_fpga_pynq_z2.tcl
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_zcu104.scr b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_zcu104.scr
new file mode 100755
index 0000000..8d883a1
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/build_fpga_pynq_zcu104.scr
@@ -0,0 +1 @@
+vivado -mode batch -source scripts/build_mcu_fpga_pynq_zcu104.tcl
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/clean_fpga.scr b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/clean_fpga.scr
new file mode 100755
index 0000000..cf4b0fa
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/clean_fpga.scr
@@ -0,0 +1,8 @@
+rm -f  ./pynq_export/pz2/pynq/overlays/soclabs/*
+rm -f  ./pynq_export/pz104/pynq/overlays/soclabs/*
+rm -Rf ./project_pynq_z2
+rm -Rf ./project_pynq_zcu104
+rm -Rf ./vivado*
+rm -Rf ./.gen
+rm -Rf ./.srcs
+rm -Rf ./.Xil
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/bd/bd.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/bd/bd.tcl
new file mode 100755
index 0000000..690e4e1
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/bd/bd.tcl
@@ -0,0 +1,86 @@
+
+proc init { cellpath otherInfo } {                                                                   
+                                                                                                             
+	set cell_handle [get_bd_cells $cellpath]                                                                 
+	set all_busif [get_bd_intf_pins $cellpath/*]		                                                     
+	set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH]
+	set full_sbusif_list [list  ]
+			                                                                                                 
+	foreach busif $all_busif {                                                                               
+		if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } {                            
+			set busif_param_list [list]                                                                      
+			set busif_name [get_property NAME $busif]					                                     
+			if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } {					         
+			    continue                                                                                     
+			}                                                                                                
+			foreach tparam $axi_standard_param_list {                                                        
+				lappend busif_param_list "C_${busif_name}_${tparam}"                                       
+			}                                                                                                
+			bd::mark_propagate_only $cell_handle $busif_param_list			                                 
+		}		                                                                                             
+	}                                                                                                        
+}
+
+
+proc pre_propagate {cellpath otherInfo } {                                                           
+                                                                                                             
+	set cell_handle [get_bd_cells $cellpath]                                                                 
+	set all_busif [get_bd_intf_pins $cellpath/*]		                                                     
+	set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH]
+	                                                                                                         
+	foreach busif $all_busif {	                                                                             
+		if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } {                  
+			continue                                                                                         
+		}                                                                                                    
+		if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } {                           
+			continue                                                                                         
+		}			                                                                                         
+		                                                                                                     
+		set busif_name [get_property NAME $busif]			                                                 
+		foreach tparam $axi_standard_param_list {		                                                     
+			set busif_param_name "C_${busif_name}_${tparam}"			                                     
+			                                                                                                 
+			set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif]                                  
+			set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle]                           
+			                                                                                                 
+			if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } {                          
+				if { $val_on_cell != "" } {                                                                  
+					set_property CONFIG.${tparam} $val_on_cell $busif                                        
+				}                                                                                            
+			}			                                                                                     
+		}		                                                                                             
+	}                                                                                                        
+}
+
+
+proc propagate {cellpath otherInfo } {                                                               
+                                                                                                             
+	set cell_handle [get_bd_cells $cellpath]                                                                 
+	set all_busif [get_bd_intf_pins $cellpath/*]		                                                     
+	set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH]
+	                                                                                                         
+	foreach busif $all_busif {                                                                               
+		if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } {                  
+			continue                                                                                         
+		}                                                                                                    
+		if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } {                            
+			continue                                                                                         
+		}			                                                                                         
+	                                                                                                         
+		set busif_name [get_property NAME $busif]		                                                     
+		foreach tparam $axi_standard_param_list {			                                                 
+			set busif_param_name "C_${busif_name}_${tparam}"			                                     
+                                                                                                             
+			set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif]                                  
+			set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle]                           
+			                                                                                                 
+			if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } {                          
+				#override property of bd_interface_net to bd_cell -- only for slaves.  May check for supported values..
+				if { $val_on_cell_intf_pin != "" } {                                                         
+					set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle               
+				}                                                                                            
+			}                                                                                                
+		}		                                                                                             
+	}                                                                                                        
+}
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/component.xml b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/component.xml
new file mode 100755
index 0000000..afd116f
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/component.xml
@@ -0,0 +1,1456 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<spirit:component xmlns:xilinx="http://www.xilinx.com" xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <spirit:vendor>soclabs.org</spirit:vendor>
+  <spirit:library>user</spirit:library>
+  <spirit:name>axi_stream_io</spirit:name>
+  <spirit:version>1.0</spirit:version>
+  <spirit:busInterfaces>
+    <spirit:busInterface>
+      <spirit:name>S_AXI</spirit:name>
+      <spirit:busType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="aximm" spirit:version="1.0"/>
+      <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="aximm_rtl" spirit:version="1.0"/>
+      <spirit:slave>
+        <spirit:memoryMapRef spirit:memoryMapRef="S_AXI"/>
+      </spirit:slave>
+      <spirit:portMaps>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>BVALID</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_BVALID</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>RREADY</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_RREADY</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>BREADY</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_BREADY</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>AWVALID</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_AWVALID</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>AWREADY</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_AWREADY</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>AWPROT</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_AWPROT</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>WDATA</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_WDATA</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>RRESP</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_RRESP</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>ARPROT</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_ARPROT</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>RVALID</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_RVALID</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>ARADDR</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_ARADDR</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>AWADDR</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_AWADDR</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>ARREADY</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_ARREADY</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>WVALID</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_WVALID</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>WREADY</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_WREADY</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>ARVALID</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_ARVALID</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>WSTRB</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_WSTRB</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>BRESP</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_BRESP</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>RDATA</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_RDATA</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+      </spirit:portMaps>
+      <spirit:parameters>
+        <spirit:parameter>
+          <spirit:name>WIZ_DATA_WIDTH</spirit:name>
+          <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.S_AXI.WIZ_DATA_WIDTH" spirit:choiceRef="choice_list_6fc15197">32</spirit:value>
+        </spirit:parameter>
+        <spirit:parameter>
+          <spirit:name>WIZ_NUM_REG</spirit:name>
+          <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.S_AXI.WIZ_NUM_REG" spirit:minimum="4" spirit:maximum="512" spirit:rangeType="long">4</spirit:value>
+        </spirit:parameter>
+        <spirit:parameter>
+          <spirit:name>SUPPORTS_NARROW_BURST</spirit:name>
+          <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.S_AXI.SUPPORTS_NARROW_BURST" spirit:choiceRef="choice_pairs_ce1226b1">0</spirit:value>
+        </spirit:parameter>
+      </spirit:parameters>
+    </spirit:busInterface>
+    <spirit:busInterface>
+      <spirit:name>rx</spirit:name>
+      <spirit:busType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis" spirit:version="1.0"/>
+      <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis_rtl" spirit:version="1.0"/>
+      <spirit:slave/>
+      <spirit:portMaps>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>TDATA</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>rx_tdata</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>TVALID</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>rx_tvalid</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>TREADY</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>rx_tready</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+      </spirit:portMaps>
+      <spirit:parameters>
+        <spirit:parameter>
+          <spirit:name>WIZ_DATA_WIDTH</spirit:name>
+          <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.RX.WIZ_DATA_WIDTH" spirit:choiceRef="choice_list_6fc15197">32</spirit:value>
+        </spirit:parameter>
+      </spirit:parameters>
+    </spirit:busInterface>
+    <spirit:busInterface>
+      <spirit:name>tx</spirit:name>
+      <spirit:busType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis" spirit:version="1.0"/>
+      <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="interface" spirit:name="axis_rtl" spirit:version="1.0"/>
+      <spirit:master/>
+      <spirit:portMaps>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>TVALID</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>tx_tvalid</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>TDATA</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>tx_tdata</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>TREADY</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>tx_tready</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+      </spirit:portMaps>
+      <spirit:parameters>
+        <spirit:parameter>
+          <spirit:name>WIZ_DATA_WIDTH</spirit:name>
+          <spirit:value spirit:format="long" spirit:id="BUSIFPARAM_VALUE.TX.WIZ_DATA_WIDTH" spirit:choiceRef="choice_list_6fc15197">32</spirit:value>
+        </spirit:parameter>
+      </spirit:parameters>
+    </spirit:busInterface>
+    <spirit:busInterface>
+      <spirit:name>interrupt</spirit:name>
+      <spirit:busType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="interrupt" spirit:version="1.0"/>
+      <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="interrupt_rtl" spirit:version="1.0"/>
+      <spirit:master/>
+      <spirit:portMaps>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>INTERRUPT</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>interrupt</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+      </spirit:portMaps>
+      <spirit:parameters>
+        <spirit:parameter>
+          <spirit:name>SENSITIVITY</spirit:name>
+          <spirit:value spirit:id="BUSIFPARAM_VALUE.INTERRUPT.SENSITIVITY" spirit:choiceRef="choice_list_99a1d2b9">LEVEL_HIGH</spirit:value>
+        </spirit:parameter>
+      </spirit:parameters>
+    </spirit:busInterface>
+    <spirit:busInterface>
+      <spirit:name>S_AXI_ACLK</spirit:name>
+      <spirit:busType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="clock" spirit:version="1.0"/>
+      <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="clock_rtl" spirit:version="1.0"/>
+      <spirit:slave/>
+      <spirit:portMaps>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>CLK</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_ACLK</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+      </spirit:portMaps>
+      <spirit:parameters>
+        <spirit:parameter>
+          <spirit:name>ASSOCIATED_RESET</spirit:name>
+          <spirit:value spirit:id="BUSIFPARAM_VALUE.S_AXI_ACLK.ASSOCIATED_RESET">S_AXI_ARESETN</spirit:value>
+        </spirit:parameter>
+        <spirit:parameter>
+          <spirit:name>ASSOCIATED_BUSIF</spirit:name>
+          <spirit:value spirit:id="BUSIFPARAM_VALUE.S_AXI_ACLK.ASSOCIATED_BUSIF">rx:tx:S_AXI</spirit:value>
+        </spirit:parameter>
+      </spirit:parameters>
+    </spirit:busInterface>
+    <spirit:busInterface>
+      <spirit:name>S_AXI_ARESETN</spirit:name>
+      <spirit:busType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="reset" spirit:version="1.0"/>
+      <spirit:abstractionType spirit:vendor="xilinx.com" spirit:library="signal" spirit:name="reset_rtl" spirit:version="1.0"/>
+      <spirit:slave/>
+      <spirit:portMaps>
+        <spirit:portMap>
+          <spirit:logicalPort>
+            <spirit:name>RST</spirit:name>
+          </spirit:logicalPort>
+          <spirit:physicalPort>
+            <spirit:name>S_AXI_ARESETN</spirit:name>
+          </spirit:physicalPort>
+        </spirit:portMap>
+      </spirit:portMaps>
+      <spirit:parameters>
+        <spirit:parameter>
+          <spirit:name>POLARITY</spirit:name>
+          <spirit:value spirit:id="BUSIFPARAM_VALUE.S_AXI_ARESETN.POLARITY" spirit:choiceRef="choice_list_9d8b0d81">ACTIVE_LOW</spirit:value>
+        </spirit:parameter>
+      </spirit:parameters>
+    </spirit:busInterface>
+  </spirit:busInterfaces>
+  <spirit:memoryMaps>
+    <spirit:memoryMap>
+      <spirit:name>S_AXI</spirit:name>
+      <spirit:addressBlock>
+        <spirit:name>Reg</spirit:name>
+        <spirit:baseAddress spirit:format="long">0</spirit:baseAddress>
+        <spirit:range spirit:format="long">4096</spirit:range>
+        <spirit:width spirit:format="long">0</spirit:width>
+        <spirit:register>
+          <spirit:name>RX_FIFO</spirit:name>
+          <spirit:displayName>RX FIFO</spirit:displayName>
+          <spirit:description>Data RX FIFO</spirit:description>
+          <spirit:addressOffset>0x00</spirit:addressOffset>
+          <spirit:size spirit:format="long">1</spirit:size>
+        </spirit:register>
+        <spirit:register>
+          <spirit:name>TX_FIFO</spirit:name>
+          <spirit:displayName>TX_FIFO</spirit:displayName>
+          <spirit:description>Data TX FIFO</spirit:description>
+          <spirit:addressOffset>0x04</spirit:addressOffset>
+          <spirit:size spirit:format="long">1</spirit:size>
+        </spirit:register>
+        <spirit:register>
+          <spirit:name>STAT_REG</spirit:name>
+          <spirit:displayName>STAT_REG</spirit:displayName>
+          <spirit:description>Status register</spirit:description>
+          <spirit:addressOffset>0x08</spirit:addressOffset>
+          <spirit:size spirit:format="long">1</spirit:size>
+        </spirit:register>
+        <spirit:register>
+          <spirit:name>CTRL_REG</spirit:name>
+          <spirit:displayName>CTRL_REG</spirit:displayName>
+          <spirit:description>Control register</spirit:description>
+          <spirit:addressOffset>0x0c</spirit:addressOffset>
+          <spirit:size spirit:format="long">1</spirit:size>
+        </spirit:register>
+      </spirit:addressBlock>
+    </spirit:memoryMap>
+  </spirit:memoryMaps>
+  <spirit:model>
+    <spirit:views>
+      <spirit:view>
+        <spirit:name>xilinx_verilogsynthesis</spirit:name>
+        <spirit:displayName>Verilog Synthesis</spirit:displayName>
+        <spirit:envIdentifier>verilogSource:vivado.xilinx.com:synthesis</spirit:envIdentifier>
+        <spirit:language>verilog</spirit:language>
+        <spirit:modelName>iostream_v1_0_axi</spirit:modelName>
+        <spirit:fileSetRef>
+          <spirit:localName>xilinx_verilogsynthesis_view_fileset</spirit:localName>
+        </spirit:fileSetRef>
+        <spirit:parameters>
+          <spirit:parameter>
+            <spirit:name>viewChecksum</spirit:name>
+            <spirit:value>fc7589fa</spirit:value>
+          </spirit:parameter>
+        </spirit:parameters>
+      </spirit:view>
+      <spirit:view>
+        <spirit:name>xilinx_verilogbehavioralsimulation</spirit:name>
+        <spirit:displayName>Verilog Simulation</spirit:displayName>
+        <spirit:envIdentifier>verilogSource:vivado.xilinx.com:simulation</spirit:envIdentifier>
+        <spirit:language>verilog</spirit:language>
+        <spirit:modelName>iostream_v1_0_axi</spirit:modelName>
+        <spirit:fileSetRef>
+          <spirit:localName>xilinx_verilogbehavioralsimulation_view_fileset</spirit:localName>
+        </spirit:fileSetRef>
+        <spirit:parameters>
+          <spirit:parameter>
+            <spirit:name>viewChecksum</spirit:name>
+            <spirit:value>fc7589fa</spirit:value>
+          </spirit:parameter>
+        </spirit:parameters>
+      </spirit:view>
+      <spirit:view>
+        <spirit:name>xilinx_softwaredriver</spirit:name>
+        <spirit:displayName>Software Driver</spirit:displayName>
+        <spirit:envIdentifier>:vivado.xilinx.com:sw.driver</spirit:envIdentifier>
+        <spirit:fileSetRef>
+          <spirit:localName>xilinx_softwaredriver_view_fileset</spirit:localName>
+        </spirit:fileSetRef>
+        <spirit:parameters>
+          <spirit:parameter>
+            <spirit:name>viewChecksum</spirit:name>
+            <spirit:value>ec44730d</spirit:value>
+          </spirit:parameter>
+        </spirit:parameters>
+      </spirit:view>
+      <spirit:view>
+        <spirit:name>xilinx_xpgui</spirit:name>
+        <spirit:displayName>UI Layout</spirit:displayName>
+        <spirit:envIdentifier>:vivado.xilinx.com:xgui.ui</spirit:envIdentifier>
+        <spirit:fileSetRef>
+          <spirit:localName>xilinx_xpgui_view_fileset</spirit:localName>
+        </spirit:fileSetRef>
+        <spirit:parameters>
+          <spirit:parameter>
+            <spirit:name>viewChecksum</spirit:name>
+            <spirit:value>1b3a39eb</spirit:value>
+          </spirit:parameter>
+        </spirit:parameters>
+      </spirit:view>
+      <spirit:view>
+        <spirit:name>bd_tcl</spirit:name>
+        <spirit:displayName>Block Diagram</spirit:displayName>
+        <spirit:envIdentifier>:vivado.xilinx.com:block.diagram</spirit:envIdentifier>
+        <spirit:fileSetRef>
+          <spirit:localName>bd_tcl_view_fileset</spirit:localName>
+        </spirit:fileSetRef>
+        <spirit:parameters>
+          <spirit:parameter>
+            <spirit:name>viewChecksum</spirit:name>
+            <spirit:value>16328387</spirit:value>
+          </spirit:parameter>
+        </spirit:parameters>
+      </spirit:view>
+    </spirit:views>
+    <spirit:ports>
+      <spirit:port>
+        <spirit:name>interrupt</spirit:name>
+        <spirit:wire>
+          <spirit:direction>out</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>tx_tvalid</spirit:name>
+        <spirit:wire>
+          <spirit:direction>out</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>tx_tdata</spirit:name>
+        <spirit:wire>
+          <spirit:direction>out</spirit:direction>
+          <spirit:vector>
+            <spirit:left spirit:format="long">7</spirit:left>
+            <spirit:right spirit:format="long">0</spirit:right>
+          </spirit:vector>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>tx_tready</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>rx_tready</spirit:name>
+        <spirit:wire>
+          <spirit:direction>out</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>rx_tdata</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:vector>
+            <spirit:left spirit:format="long">7</spirit:left>
+            <spirit:right spirit:format="long">0</spirit:right>
+          </spirit:vector>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>rx_tvalid</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_ACLK</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_ARESETN</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_AWADDR</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:vector>
+            <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="(spirit:decode(id(&apos;MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH&apos;)) - 1)">3</spirit:left>
+            <spirit:right spirit:format="long">0</spirit:right>
+          </spirit:vector>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_AWPROT</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:vector>
+            <spirit:left spirit:format="long">2</spirit:left>
+            <spirit:right spirit:format="long">0</spirit:right>
+          </spirit:vector>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_AWVALID</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_AWREADY</spirit:name>
+        <spirit:wire>
+          <spirit:direction>out</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_WDATA</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:vector>
+            <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="(spirit:decode(id(&apos;MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH&apos;)) - 1)">31</spirit:left>
+            <spirit:right spirit:format="long">0</spirit:right>
+          </spirit:vector>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_WSTRB</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:vector>
+            <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="((spirit:decode(id(&apos;MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH&apos;)) / 8) - 1)">3</spirit:left>
+            <spirit:right spirit:format="long">0</spirit:right>
+          </spirit:vector>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_WVALID</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_WREADY</spirit:name>
+        <spirit:wire>
+          <spirit:direction>out</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_BRESP</spirit:name>
+        <spirit:wire>
+          <spirit:direction>out</spirit:direction>
+          <spirit:vector>
+            <spirit:left spirit:format="long">1</spirit:left>
+            <spirit:right spirit:format="long">0</spirit:right>
+          </spirit:vector>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_BVALID</spirit:name>
+        <spirit:wire>
+          <spirit:direction>out</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_BREADY</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_ARADDR</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:vector>
+            <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="(spirit:decode(id(&apos;MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH&apos;)) - 1)">3</spirit:left>
+            <spirit:right spirit:format="long">0</spirit:right>
+          </spirit:vector>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_ARPROT</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:vector>
+            <spirit:left spirit:format="long">2</spirit:left>
+            <spirit:right spirit:format="long">0</spirit:right>
+          </spirit:vector>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_ARVALID</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_ARREADY</spirit:name>
+        <spirit:wire>
+          <spirit:direction>out</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_RDATA</spirit:name>
+        <spirit:wire>
+          <spirit:direction>out</spirit:direction>
+          <spirit:vector>
+            <spirit:left spirit:format="long" spirit:resolve="dependent" spirit:dependency="(spirit:decode(id(&apos;MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH&apos;)) - 1)">31</spirit:left>
+            <spirit:right spirit:format="long">0</spirit:right>
+          </spirit:vector>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_RRESP</spirit:name>
+        <spirit:wire>
+          <spirit:direction>out</spirit:direction>
+          <spirit:vector>
+            <spirit:left spirit:format="long">1</spirit:left>
+            <spirit:right spirit:format="long">0</spirit:right>
+          </spirit:vector>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_RVALID</spirit:name>
+        <spirit:wire>
+          <spirit:direction>out</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+      <spirit:port>
+        <spirit:name>S_AXI_RREADY</spirit:name>
+        <spirit:wire>
+          <spirit:direction>in</spirit:direction>
+          <spirit:wireTypeDefs>
+            <spirit:wireTypeDef>
+              <spirit:typeName>wire</spirit:typeName>
+              <spirit:viewNameRef>xilinx_verilogsynthesis</spirit:viewNameRef>
+              <spirit:viewNameRef>xilinx_verilogbehavioralsimulation</spirit:viewNameRef>
+            </spirit:wireTypeDef>
+          </spirit:wireTypeDefs>
+        </spirit:wire>
+      </spirit:port>
+    </spirit:ports>
+    <spirit:modelParameters>
+      <spirit:modelParameter xsi:type="spirit:nameValueTypeType" spirit:dataType="integer">
+        <spirit:name>C_S_AXI_DATA_WIDTH</spirit:name>
+        <spirit:displayName>C S Axi Data Width</spirit:displayName>
+        <spirit:value spirit:format="long" spirit:resolve="generated" spirit:id="MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH">32</spirit:value>
+      </spirit:modelParameter>
+      <spirit:modelParameter spirit:dataType="integer">
+        <spirit:name>C_S_AXI_ADDR_WIDTH</spirit:name>
+        <spirit:displayName>C S Axi Addr Width</spirit:displayName>
+        <spirit:value spirit:format="long" spirit:resolve="generated" spirit:id="MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH">4</spirit:value>
+      </spirit:modelParameter>
+    </spirit:modelParameters>
+  </spirit:model>
+  <spirit:choices>
+    <spirit:choice>
+      <spirit:name>choice_list_6fc15197</spirit:name>
+      <spirit:enumeration>32</spirit:enumeration>
+    </spirit:choice>
+    <spirit:choice>
+      <spirit:name>choice_list_99a1d2b9</spirit:name>
+      <spirit:enumeration>LEVEL_HIGH</spirit:enumeration>
+      <spirit:enumeration>LEVEL_LOW</spirit:enumeration>
+      <spirit:enumeration>EDGE_RISING</spirit:enumeration>
+      <spirit:enumeration>EDGE_FALLING</spirit:enumeration>
+    </spirit:choice>
+    <spirit:choice>
+      <spirit:name>choice_list_9d8b0d81</spirit:name>
+      <spirit:enumeration>ACTIVE_HIGH</spirit:enumeration>
+      <spirit:enumeration>ACTIVE_LOW</spirit:enumeration>
+    </spirit:choice>
+    <spirit:choice>
+      <spirit:name>choice_pairs_ce1226b1</spirit:name>
+      <spirit:enumeration spirit:text="true">1</spirit:enumeration>
+      <spirit:enumeration spirit:text="false">0</spirit:enumeration>
+    </spirit:choice>
+  </spirit:choices>
+  <spirit:fileSets>
+    <spirit:fileSet>
+      <spirit:name>xilinx_verilogsynthesis_view_fileset</spirit:name>
+      <spirit:file>
+        <spirit:name>src/axi_stream_io_v1_0_axi_s.v</spirit:name>
+        <spirit:fileType>verilogSource</spirit:fileType>
+        <spirit:userFileType>CHECKSUM_fc7589fa</spirit:userFileType>
+      </spirit:file>
+    </spirit:fileSet>
+    <spirit:fileSet>
+      <spirit:name>xilinx_verilogbehavioralsimulation_view_fileset</spirit:name>
+      <spirit:file>
+        <spirit:name>src/axi_stream_io_v1_0_axi_s.v</spirit:name>
+        <spirit:fileType>verilogSource</spirit:fileType>
+      </spirit:file>
+    </spirit:fileSet>
+    <spirit:fileSet>
+      <spirit:name>xilinx_softwaredriver_view_fileset</spirit:name>
+      <spirit:file>
+        <spirit:name>drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd</spirit:name>
+        <spirit:userFileType>mdd</spirit:userFileType>
+        <spirit:userFileType>driver_mdd</spirit:userFileType>
+      </spirit:file>
+      <spirit:file>
+        <spirit:name>drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl</spirit:name>
+        <spirit:fileType>tclSource</spirit:fileType>
+        <spirit:userFileType>driver_tcl</spirit:userFileType>
+      </spirit:file>
+      <spirit:file>
+        <spirit:name>drivers/axi_stream_io_v1_0/src/Makefile</spirit:name>
+        <spirit:userFileType>driver_src</spirit:userFileType>
+      </spirit:file>
+      <spirit:file>
+        <spirit:name>drivers/axi_stream_io_v1_0/src/axi_stream_io.h</spirit:name>
+        <spirit:fileType>cSource</spirit:fileType>
+        <spirit:userFileType>driver_src</spirit:userFileType>
+        <spirit:isIncludeFile>true</spirit:isIncludeFile>
+      </spirit:file>
+      <spirit:file>
+        <spirit:name>drivers/axi_stream_io_v1_0/src/axi_stream_io.c</spirit:name>
+        <spirit:fileType>cSource</spirit:fileType>
+        <spirit:userFileType>driver_src</spirit:userFileType>
+        <spirit:isIncludeFile>true</spirit:isIncludeFile>
+      </spirit:file>
+      <spirit:file>
+        <spirit:name>drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c</spirit:name>
+        <spirit:fileType>cSource</spirit:fileType>
+        <spirit:userFileType>driver_src</spirit:userFileType>
+        <spirit:isIncludeFile>true</spirit:isIncludeFile>
+      </spirit:file>
+    </spirit:fileSet>
+    <spirit:fileSet>
+      <spirit:name>xilinx_xpgui_view_fileset</spirit:name>
+      <spirit:file>
+        <spirit:name>xgui/axi_stream_io_v1_0.tcl</spirit:name>
+        <spirit:fileType>tclSource</spirit:fileType>
+        <spirit:userFileType>CHECKSUM_1b3a39eb</spirit:userFileType>
+        <spirit:userFileType>XGUI_VERSION_2</spirit:userFileType>
+      </spirit:file>
+    </spirit:fileSet>
+    <spirit:fileSet>
+      <spirit:name>bd_tcl_view_fileset</spirit:name>
+      <spirit:file>
+        <spirit:name>bd/bd.tcl</spirit:name>
+        <spirit:fileType>tclSource</spirit:fileType>
+      </spirit:file>
+    </spirit:fileSet>
+  </spirit:fileSets>
+  <spirit:description>AXI mapped TX and RX byte stream interface</spirit:description>
+  <spirit:parameters>
+    <spirit:parameter>
+      <spirit:name>C_axi_s_BASEADDR</spirit:name>
+      <spirit:displayName>C axi s BASEADDR</spirit:displayName>
+      <spirit:value spirit:format="bitString" spirit:resolve="user" spirit:id="PARAM_VALUE.C_axi_s_BASEADDR" spirit:order="5" spirit:bitStringLength="32">0xFFFFFFFF</spirit:value>
+      <spirit:vendorExtensions>
+        <xilinx:parameterInfo>
+          <xilinx:enablement>
+            <xilinx:isEnabled xilinx:id="PARAM_ENABLEMENT.C_axi_s_BASEADDR">false</xilinx:isEnabled>
+          </xilinx:enablement>
+        </xilinx:parameterInfo>
+      </spirit:vendorExtensions>
+    </spirit:parameter>
+    <spirit:parameter>
+      <spirit:name>C_axi_s_HIGHADDR</spirit:name>
+      <spirit:displayName>C axi s HIGHADDR</spirit:displayName>
+      <spirit:value spirit:format="bitString" spirit:resolve="user" spirit:id="PARAM_VALUE.C_axi_s_HIGHADDR" spirit:order="6" spirit:bitStringLength="32">0x00000000</spirit:value>
+      <spirit:vendorExtensions>
+        <xilinx:parameterInfo>
+          <xilinx:enablement>
+            <xilinx:isEnabled xilinx:id="PARAM_ENABLEMENT.C_axi_s_HIGHADDR">false</xilinx:isEnabled>
+          </xilinx:enablement>
+        </xilinx:parameterInfo>
+      </spirit:vendorExtensions>
+    </spirit:parameter>
+    <spirit:parameter>
+      <spirit:name>Component_Name</spirit:name>
+      <spirit:value spirit:resolve="user" spirit:id="PARAM_VALUE.Component_Name" spirit:order="1">axi_stream_io_v1_0</spirit:value>
+    </spirit:parameter>
+    <spirit:parameter>
+      <spirit:name>C_S_AXI_DATA_WIDTH</spirit:name>
+      <spirit:displayName>C S Axi Data Width</spirit:displayName>
+      <spirit:value spirit:format="long" spirit:resolve="user" spirit:id="PARAM_VALUE.C_S_AXI_DATA_WIDTH">32</spirit:value>
+    </spirit:parameter>
+    <spirit:parameter>
+      <spirit:name>C_S_AXI_ADDR_WIDTH</spirit:name>
+      <spirit:displayName>C S Axi Addr Width</spirit:displayName>
+      <spirit:value spirit:format="long" spirit:resolve="user" spirit:id="PARAM_VALUE.C_S_AXI_ADDR_WIDTH">4</spirit:value>
+    </spirit:parameter>
+  </spirit:parameters>
+  <spirit:vendorExtensions>
+    <xilinx:coreExtensions>
+      <xilinx:supportedFamilies>
+        <xilinx:family xilinx:lifeCycle="Pre-Production">zynquplus</xilinx:family>
+        <xilinx:family xilinx:lifeCycle="Pre-Production">zynq</xilinx:family>
+        <xilinx:family xilinx:lifeCycle="Pre-Production">artix7</xilinx:family>
+        <xilinx:family xilinx:lifeCycle="Pre-Production">artix7l</xilinx:family>
+        <xilinx:family xilinx:lifeCycle="Pre-Production">kintex7</xilinx:family>
+        <xilinx:family xilinx:lifeCycle="Pre-Production">kintex7l</xilinx:family>
+        <xilinx:family xilinx:lifeCycle="Pre-Production">kintexu</xilinx:family>
+        <xilinx:family xilinx:lifeCycle="Pre-Production">kintexuplus</xilinx:family>
+        <xilinx:family xilinx:lifeCycle="Pre-Production">spartan7</xilinx:family>
+        <xilinx:family xilinx:lifeCycle="Pre-Production">virtexuplus</xilinx:family>
+        <xilinx:family xilinx:lifeCycle="Pre-Production">virtexuplusHBM</xilinx:family>
+        <xilinx:family xilinx:lifeCycle="Pre-Production">aartix7</xilinx:family>
+        <xilinx:family xilinx:lifeCycle="Pre-Production">aspartan7</xilinx:family>
+        <xilinx:family xilinx:lifeCycle="Pre-Production">azynq</xilinx:family>
+      </xilinx:supportedFamilies>
+      <xilinx:taxonomies>
+        <xilinx:taxonomy>AXI_Peripheral</xilinx:taxonomy>
+      </xilinx:taxonomies>
+      <xilinx:displayName>axi_stream_io_v1.0</xilinx:displayName>
+      <xilinx:vendorDisplayName>SoC Labs</xilinx:vendorDisplayName>
+      <xilinx:vendorURL>http://www.soclabs.org</xilinx:vendorURL>
+      <xilinx:coreRevision>16</xilinx:coreRevision>
+      <xilinx:upgrades>
+        <xilinx:canUpgradeFrom>xilinx.com:user:axi_stream_io:1.0</xilinx:canUpgradeFrom>
+      </xilinx:upgrades>
+      <xilinx:coreCreationDateTime>2021-12-12T20:49:24Z</xilinx:coreCreationDateTime>
+      <xilinx:tags>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@16fed581_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2ec9608d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@793f5b3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7322b269_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6e248e43_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@b4e9ef3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@426bcb85_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2e53d487_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@61dade0b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4eafa00f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@53e3a875_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@162982df_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@75f72ee4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@18aeac53_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@606d36b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@38c0eb40_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@57696f2a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@510901ec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@60d2f4d6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3a2da1b3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@cd54b6e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@693cb83d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@ef28d1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5a59314d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@29767284_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@29f27e63_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@13dc2895_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5e36f1df_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@709fc708_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@8bba7d9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@21d8e4a5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@37415f14_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@66dc3d40_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4fba07d0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@eb3af51_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4c66ef79_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@45185362_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@53225cb8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1cf08902_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4b15fae5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@17a6be36_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3301516d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3be10ef6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6a177ab9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@20e4e579_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@f741122_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@df275a0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4ac8a5fd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5ae71cdc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2c59353f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2325ca04_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@498ea243_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4b8c707a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@52cdfb1d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2a0d6185_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4bac3167_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@19a83bf5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@562798bd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@123cc7f3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7062c158_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@778708cf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3a452e27_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@ece9f0f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4b895821_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3dc1927b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3e4d1f1c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@22bc955c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4c436144_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@23f15bc2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2414d94e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@63ae6b17_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1f88dbb1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7517e1ec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@668022b8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3177ce96_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@71f152fd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@30ad2c46_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5aae29a7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@292165c8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@334d7f4a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3479b8c2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@13d09377_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@315680f2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5ba41a48_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@d66c81a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2a99c6a5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4530b54d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@699d5142_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@17559350_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@18f15cc5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@482d154b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@9b0867a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2835d2db_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3070b16_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7616d28e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6f3420ae_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@59ca939e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3c36ad44_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1e50ae02_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@22ebfa5c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@465f09ec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1bdbdf15_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@9060620_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@65357e50_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4e4f99_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7b82dd23_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7a9b0492_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4851d668_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6ee66680_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@18058a64_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@cfe93ee_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@53c2b650_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@11a6efc0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@18afa642_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@12652ecf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@e72e52b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2861fd1c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@24001396_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4454325e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3d14ded5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6a45a760_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@75c51952_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1d040cfa_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@c27bbbf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7158e610_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@499392b5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@e8df7e6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@11aa003e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4273f844_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5fadd8f7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6c93a7db_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@27ee561_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4a52c607_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@11760a9c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4115d1f1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7d41ca58_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4899dc31_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@13b9216c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2e05852a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@384bceec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4ed8c48f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@200621c6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6ac073d7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@18632943_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1c0d8bb2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@50809788_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7fdbc98a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3142de19_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2b3fb5f1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4faf4338_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@eb7476f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1d508d99_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@53d85a46_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@30a744ac_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@238f4e8e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2081d690_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7eee799d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2c95d02_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4e1ddea2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@21e860f8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3660b171_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3ef639f7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@16ba015e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3642a664_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@159c8828_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@14e878fa_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7f0733b2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@10cb371d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3553a1c7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3fc60b7d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@551cc009_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@752a2e44_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@63f8237c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3ca7d308_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@556a2759_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5f380808_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@651a74cf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1ecd1477_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@9b65a49_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@35b2d11e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3536a2cc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1cd68297_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1692283f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@ecc2ee6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@747cc728_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3ec1998a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6fb41197_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2c33db6f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@42060eaa_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@62342897_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@36eef4b6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@19ecf3b7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5d580cef_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4f729cff_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@23321c1e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@539a0d0d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@9a208b1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@38bee981_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@13576b9a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6455b470_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@23aa217a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@25e0ca99_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5787a96e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@43773246_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4d61f0c5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@123ec803_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@441ed6b1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@40743552_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@575fe9d1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@760563e4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@d20fcca_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4486a217_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@61023d9d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7ba954b1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@35c3b2bc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@42fe08ca_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2c2cdfab_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@14ff32f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7ec2d566_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1f0c382e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@10ce9ce2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1d3487ea_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@69af9ff5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@a3f99a9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5d79a274_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2940bbec_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3c331f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@346dc4a8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6ee2a2b9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@76248ced_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5a67ad90_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3f211e20_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@31809d90_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@585e4f98_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@42ec0b0a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@85dcc7d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@782407fa_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4693fec4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@206ba19e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@65d9e06_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4115aaf6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7a3e8df0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5a0dab9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@16462cdd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@25040671_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3cc02f38_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6b7d8e4b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1450c3b3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@112dcc8a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@570107d2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2a4c82ba_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@59d6fbcc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1b1ef5d9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7bd35be_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4a26fb6f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7742ea34_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@100b085b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@66ebb4d6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@78ccb7c6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@59569c0f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@16028751_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4b46cdee_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3638e993_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5fc9a2e7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7cd279dc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2476846e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@789eb25_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7ebb6bc1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5b807ab4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@58bb111d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4dd4eede_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2030ea86_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@262d6dbc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@9879ce_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@544f9318_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@783ccf68_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@74b5dbd6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7b1a5399_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4e59d89b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1ebfb7d3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@28806a0b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4f1fac1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@193f5497_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@98f5ccf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5ea19ca3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5c57bfe8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@474ef512_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1c3d233f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@561f98f3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4156e62d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7fcfc34d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4275157_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2004e159_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@f268144_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@c10c0e6_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7557e11f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@b8141f0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@63cfb8ab_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3d394ce0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@50390780_ARCHIVE_LOCATION">C:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3dbeacb1_ARCHIVE_LOCATION">C:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4f3f661b_ARCHIVE_LOCATION">C:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@716ccc45_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3278c6a2_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@398d4fdc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@384c540d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@145b9325_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5e420b14_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@720a061a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7019edbc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@32cec7a3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5b9ea533_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4ba41145_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7a1c3bc8_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3f98c05d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@85ece3f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@64329cf3_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6098b91e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@658c8c87_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5e029802_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@46a555e4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@66159ec1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@78addf86_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3d48e636_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@45209cb7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3841593c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7fecffde_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@33c9e638_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@538ac29d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6c1cb496_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6e783269_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@703c8061_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1a7552e4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@71a8b655_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@393dae6f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@26792732_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@56b72513_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@50b98a45_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@75004655_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@27616936_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3a54ec8f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@23e0933_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@21d6563f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7e96eb79_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@fbb747e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5a959611_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3d67b840_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1ececc3c_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2c3729d0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@753686b7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4bc158bd_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7553bd98_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@686c9917_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@15e3e3fc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@17c20476_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2890ad0d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2502d801_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@615193fc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@10d0b0e1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@1c009a65_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@77fd9a52_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@423f07dc_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@589a99d0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@b813605_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@a38b321_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@355431d9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@d146dd7_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@3bf71b0b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@27b3813d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5ef70193_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@24d7fb4d_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@11d6e696_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@43384aaf_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5dcbf251_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@33084c7e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@4c5a8f4b_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@38125fe9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@14f39b23_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@71113478_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@36296867_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@511868d0_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6f3ba609_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@78a4bc24_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@32825895_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6ea7679a_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@600011e1_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@766beed_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@5f381aa9_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@300820b4_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7058d4f_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@6ec12ea5_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@2b23043_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@51253581_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.dd@7aa26a8e_ARCHIVE_LOCATION">c:/Users/dflynn/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@b23f618_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@77b30d22_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@4cde9694_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@120ff5dc_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@24113226_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@44aea720_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@2ee819b6_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@4818d5b2_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@38e9bfee_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@1c951027_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@348407d1_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@111f073e_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@16159ba0_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@21bb058_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@28bf5ef8_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@a1c64f7_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@74feff94_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@4f3615f1_ARCHIVE_LOCATION">/home/dwf1m12/soclabs/fpga/vivado/pynq/ip_repo/axi_stream_io_1.0</xilinx:tag>
+      </xilinx:tags>
+    </xilinx:coreExtensions>
+    <xilinx:packagingInfo>
+      <xilinx:xilinxVersion>2021.1</xilinx:xilinxVersion>
+      <xilinx:checksum xilinx:scope="busInterfaces" xilinx:value="5562313f"/>
+      <xilinx:checksum xilinx:scope="memoryMaps" xilinx:value="d6592117"/>
+      <xilinx:checksum xilinx:scope="fileGroups" xilinx:value="323cdeea"/>
+      <xilinx:checksum xilinx:scope="ports" xilinx:value="7c2aad6e"/>
+      <xilinx:checksum xilinx:scope="hdlParameters" xilinx:value="cd9ec9b5"/>
+      <xilinx:checksum xilinx:scope="parameters" xilinx:value="6cced3b9"/>
+    </xilinx:packagingInfo>
+  </spirit:vendorExtensions>
+</spirit:component>
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd
new file mode 100755
index 0000000..d7af75e
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.mdd
@@ -0,0 +1,10 @@
+
+
+OPTION psf_version = 2.1;
+
+BEGIN DRIVER axi_stream_io
+	OPTION supported_peripherals = (axi_stream_io);
+	OPTION copyfiles = all;
+	OPTION VERSION = 1.0;
+	OPTION NAME = axi_stream_io;
+END DRIVER
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl
new file mode 100755
index 0000000..c3a9cd0
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/data/axi_stream_io.tcl
@@ -0,0 +1,5 @@
+
+
+proc generate {drv_handle} {
+	xdefine_include_file $drv_handle "xparameters.h" "axi_stream_io" "NUM_INSTANCES" "DEVICE_ID"  "C_axi_s_BASEADDR" "C_axi_s_HIGHADDR"
+}
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/Makefile b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/Makefile
new file mode 100755
index 0000000..21453f4
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/Makefile
@@ -0,0 +1,26 @@
+COMPILER=
+ARCHIVER=
+CP=cp
+COMPILER_FLAGS=
+EXTRA_COMPILER_FLAGS=
+LIB=libxil.a
+
+RELEASEDIR=../../../lib
+INCLUDEDIR=../../../include
+INCLUDES=-I./. -I${INCLUDEDIR}
+
+INCLUDEFILES=*.h
+LIBSOURCES=*.c
+OUTS = *.o
+
+libs:
+	echo "Compiling axi_stream_io..."
+	$(COMPILER) $(COMPILER_FLAGS) $(EXTRA_COMPILER_FLAGS) $(INCLUDES) $(LIBSOURCES)
+	$(ARCHIVER) -r ${RELEASEDIR}/${LIB} ${OUTS}
+	make clean
+
+include:
+	${CP} $(INCLUDEFILES) $(INCLUDEDIR)
+
+clean:
+	rm -rf ${OUTS}
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.c b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.c
new file mode 100755
index 0000000..c552cbf
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.c
@@ -0,0 +1,6 @@
+
+
+/***************************** Include Files *******************************/
+#include "axi_stream_io.h"
+
+/************************** Function Definitions ***************************/
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.h b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.h
new file mode 100755
index 0000000..294e851
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io.h
@@ -0,0 +1,79 @@
+
+#ifndef AXI_STREAM_IO_H
+#define AXI_STREAM_IO_H
+
+
+/****************** Include Files ********************/
+#include "xil_types.h"
+#include "xstatus.h"
+
+#define AXI_STREAM_IO_axi_s_SLV_REG0_OFFSET 0
+#define AXI_STREAM_IO_axi_s_SLV_REG1_OFFSET 4
+#define AXI_STREAM_IO_axi_s_SLV_REG2_OFFSET 8
+#define AXI_STREAM_IO_axi_s_SLV_REG3_OFFSET 12
+
+
+/**************************** Type Definitions *****************************/
+/**
+ *
+ * Write a value to a AXI_STREAM_IO register. A 32 bit write is performed.
+ * If the component is implemented in a smaller width, only the least
+ * significant data is written.
+ *
+ * @param   BaseAddress is the base address of the AXI_STREAM_IOdevice.
+ * @param   RegOffset is the register offset from the base to write to.
+ * @param   Data is the data written to the register.
+ *
+ * @return  None.
+ *
+ * @note
+ * C-style signature:
+ * 	void AXI_STREAM_IO_mWriteReg(u32 BaseAddress, unsigned RegOffset, u32 Data)
+ *
+ */
+#define AXI_STREAM_IO_mWriteReg(BaseAddress, RegOffset, Data) \
+  	Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data))
+
+/**
+ *
+ * Read a value from a AXI_STREAM_IO register. A 32 bit read is performed.
+ * If the component is implemented in a smaller width, only the least
+ * significant data is read from the register. The most significant data
+ * will be read as 0.
+ *
+ * @param   BaseAddress is the base address of the AXI_STREAM_IO device.
+ * @param   RegOffset is the register offset from the base to write to.
+ *
+ * @return  Data is the data from the register.
+ *
+ * @note
+ * C-style signature:
+ * 	u32 AXI_STREAM_IO_mReadReg(u32 BaseAddress, unsigned RegOffset)
+ *
+ */
+#define AXI_STREAM_IO_mReadReg(BaseAddress, RegOffset) \
+    Xil_In32((BaseAddress) + (RegOffset))
+
+/************************** Function Prototypes ****************************/
+/**
+ *
+ * Run a self-test on the driver/device. Note this may be a destructive test if
+ * resets of the device are performed.
+ *
+ * If the hardware system is not built correctly, this function may never
+ * return to the caller.
+ *
+ * @param   baseaddr_p is the base address of the AXI_STREAM_IO instance to be worked on.
+ *
+ * @return
+ *
+ *    - XST_SUCCESS   if all self-test code passed
+ *    - XST_FAILURE   if any self-test code failed
+ *
+ * @note    Caching must be turned off for this function to work.
+ * @note    Self test may fail if data memory and device are not on the same bus.
+ *
+ */
+XStatus AXI_STREAM_IO_Reg_SelfTest(void * baseaddr_p);
+
+#endif // AXI_STREAM_IO_H
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c
new file mode 100755
index 0000000..26bea4d
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/drivers/axi_stream_io_v1_0/src/axi_stream_io_selftest.c
@@ -0,0 +1,60 @@
+
+/***************************** Include Files *******************************/
+#include "axi_stream_io.h"
+#include "xparameters.h"
+#include "stdio.h"
+#include "xil_io.h"
+
+/************************** Constant Definitions ***************************/
+#define READ_WRITE_MUL_FACTOR 0x10
+
+/************************** Function Definitions ***************************/
+/**
+ *
+ * Run a self-test on the driver/device. Note this may be a destructive test if
+ * resets of the device are performed.
+ *
+ * If the hardware system is not built correctly, this function may never
+ * return to the caller.
+ *
+ * @param   baseaddr_p is the base address of the AXI_STREAM_IOinstance to be worked on.
+ *
+ * @return
+ *
+ *    - XST_SUCCESS   if all self-test code passed
+ *    - XST_FAILURE   if any self-test code failed
+ *
+ * @note    Caching must be turned off for this function to work.
+ * @note    Self test may fail if data memory and device are not on the same bus.
+ *
+ */
+XStatus AXI_STREAM_IO_Reg_SelfTest(void * baseaddr_p)
+{
+	u32 baseaddr;
+	int write_loop_index;
+	int read_loop_index;
+	int Index;
+
+	baseaddr = (u32) baseaddr_p;
+
+	xil_printf("******************************\n\r");
+	xil_printf("* User Peripheral Self Test\n\r");
+	xil_printf("******************************\n\n\r");
+
+	/*
+	 * Write to user logic slave module register(s) and read back
+	 */
+	xil_printf("User logic slave module test...\n\r");
+
+	for (write_loop_index = 0 ; write_loop_index < 4; write_loop_index++)
+	  AXI_STREAM_IO_mWriteReg (baseaddr, write_loop_index*4, (write_loop_index+1)*READ_WRITE_MUL_FACTOR);
+	for (read_loop_index = 0 ; read_loop_index < 4; read_loop_index++)
+	  if ( AXI_STREAM_IO_mReadReg (baseaddr, read_loop_index*4) != (read_loop_index+1)*READ_WRITE_MUL_FACTOR){
+	    xil_printf ("Error reading register value at address %x\n", (int)baseaddr + read_loop_index*4);
+	    return XST_FAILURE;
+	  }
+
+	xil_printf("   - slave register write/read passed\n\n\r");
+
+	return XST_SUCCESS;
+}
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/soclabs.org_user_axi_stream_io_1.0.zip b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/soclabs.org_user_axi_stream_io_1.0.zip
new file mode 100644
index 0000000000000000000000000000000000000000..2a22446f1995db34a975c88b9976e397a70995e4
GIT binary patch
literal 15835
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
HS%G)}IfW><

literal 0
HcmV?d00001

diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/src/axi_stream_io_v1_0_axi_s.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/src/axi_stream_io_v1_0_axi_s.v
new file mode 100755
index 0000000..c6560f7
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/src/axi_stream_io_v1_0_axi_s.v
@@ -0,0 +1,424 @@
+
+`timescale 1 ns / 1 ps
+
+	module iostream_v1_0_axi #
+	(
+		// Users to add parameters here
+
+		// User parameters ends
+		// Do not modify the parameters beyond this line
+
+		// Width of S_AXI data bus
+		parameter integer C_S_AXI_DATA_WIDTH	= 32,
+		// Width of S_AXI address bus
+		parameter integer C_S_AXI_ADDR_WIDTH	= 4
+	)
+	(
+		// Users to add ports here
+		output wire interrupt,
+		
+		// Ports of Axi Master Bus Interface tx
+//		input wire  tx_aclk,
+//		input wire  tx_aresetn,
+		output wire  tx_tvalid,
+		output wire [7 : 0] tx_tdata,
+//		output wire [0 : 0] tx_tstrb,
+//		output wire  tx_tlast,
+		input wire  tx_tready,
+
+		// Ports of Axi Slave Bus Interface rx
+//		input wire  rx_aclk,
+//		input wire  rx_aresetn,
+		output wire  rx_tready,
+		input wire [7 : 0] rx_tdata,
+//		input wire [0 : 0] rx_tstrb,
+//		input wire  rx_tlast,
+		input wire  rx_tvalid,
+
+		// User ports ends
+		// Do not modify the ports beyond this line
+
+		// Global Clock Signal
+		input wire  S_AXI_ACLK,
+		// Global Reset Signal. This Signal is Active LOW
+		input wire  S_AXI_ARESETN,
+		// Write address (issued by master, acceped by Slave)
+		input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_AWADDR,
+		// Write channel Protection type. This signal indicates the
+    		// privilege and security level of the transaction, and whether
+    		// the transaction is a data access or an instruction access.
+		input wire [2 : 0] S_AXI_AWPROT,
+		// Write address valid. This signal indicates that the master signaling
+    		// valid write address and control information.
+		input wire  S_AXI_AWVALID,
+		// Write address ready. This signal indicates that the slave is ready
+    		// to accept an address and associated control signals.
+		output wire  S_AXI_AWREADY,
+		// Write data (issued by master, acceped by Slave) 
+		input wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_WDATA,
+		// Write strobes. This signal indicates which byte lanes hold
+    		// valid data. There is one write strobe bit for each eight
+    		// bits of the write data bus.    
+		input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB,
+		// Write valid. This signal indicates that valid write
+    		// data and strobes are available.
+		input wire  S_AXI_WVALID,
+		// Write ready. This signal indicates that the slave
+    		// can accept the write data.
+		output wire  S_AXI_WREADY,
+		// Write response. This signal indicates the status
+    		// of the write transaction.
+		output wire [1 : 0] S_AXI_BRESP,
+		// Write response valid. This signal indicates that the channel
+    		// is signaling a valid write response.
+		output wire  S_AXI_BVALID,
+		// Response ready. This signal indicates that the master
+    		// can accept a write response.
+		input wire  S_AXI_BREADY,
+		// Read address (issued by master, acceped by Slave)
+		input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_ARADDR,
+		// Protection type. This signal indicates the privilege
+    		// and security level of the transaction, and whether the
+    		// transaction is a data access or an instruction access.
+		input wire [2 : 0] S_AXI_ARPROT,
+		// Read address valid. This signal indicates that the channel
+    		// is signaling valid read address and control information.
+		input wire  S_AXI_ARVALID,
+		// Read address ready. This signal indicates that the slave is
+    		// ready to accept an address and associated control signals.
+		output wire  S_AXI_ARREADY,
+		// Read data (issued by slave)
+		output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA,
+		// Read response. This signal indicates the status of the
+    		// read transfer.
+		output wire [1 : 0] S_AXI_RRESP,
+		// Read valid. This signal indicates that the channel is
+    		// signaling the required read data.
+		output wire  S_AXI_RVALID,
+		// Read ready. This signal indicates that the master can
+    		// accept the read data and response information.
+		input wire  S_AXI_RREADY
+	);
+
+	// AXI4LITE signals
+	reg [C_S_AXI_ADDR_WIDTH-1 : 0] 	axi_awaddr;
+	reg  	axi_awready;
+	reg  	axi_wready;
+	reg [1 : 0] 	axi_bresp;
+	reg  	axi_bvalid;
+	reg [C_S_AXI_ADDR_WIDTH-1 : 0] 	axi_araddr;
+	reg  	axi_arready;
+	reg [C_S_AXI_DATA_WIDTH-1 : 0] 	axi_rdata;
+	reg [1 : 0] 	axi_rresp;
+	reg  	axi_rvalid;
+
+	// Example-specific design signals
+	// local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH
+	// ADDR_LSB is used for addressing 32/64 bit registers/memories
+	// ADDR_LSB = 2 for 32 bits (n downto 2)
+	// ADDR_LSB = 3 for 64 bits (n downto 3)
+	localparam integer ADDR_LSB = (C_S_AXI_DATA_WIDTH/32) + 1;
+	localparam integer OPT_MEM_ADDR_BITS = 1;
+
+	//----------------------------------------------
+	//-- Signals for user logic register space example
+	//------------------------------------------------
+	//-- Number of Slave Registers 4
+	reg [8:0]	tx_reg; // TX data
+	reg [8:0]	rx_reg; // RX data
+	reg [7:0]	ctrl_reg; // ctrl
+	wire	 slv_reg_rden;
+	wire	 slv_reg_wren;
+	reg [7:0]	 reg_data_out;
+	integer	 byte_index;
+	reg	 aw_en;
+	
+	wire	tx_req = tx_reg[8];  // request to transmit
+	wire	tx_ack = tx_tready;    // acknowledge when stream ready
+
+	wire	rx_req = rx_tvalid;    // request to receive
+	wire	rx_ack = !rx_reg[8];
+    wire    rx_val = rx_reg[8];
+    
+	//assign	rx_reg[7:0] <= rx_tdata;
+
+	// I/O Connections assignments
+
+    assign interrupt = ctrl_reg[4] & (!tx_req | rx_req);
+	
+    // TX stream interface
+	assign	tx_tdata = tx_reg[7:0];
+	assign  tx_tvalid = tx_req;
+
+	// RX stream interface
+	assign  rx_tready = rx_ack;
+    
+	//AXI Slave
+	assign S_AXI_AWREADY	= axi_awready;
+	assign S_AXI_WREADY	= axi_wready;
+	assign S_AXI_BRESP	= axi_bresp;
+	assign S_AXI_BVALID	= axi_bvalid;
+	assign S_AXI_ARREADY	= axi_arready;
+	assign S_AXI_RDATA	= axi_rdata;
+	assign S_AXI_RRESP	= axi_rresp;
+	assign S_AXI_RVALID	= axi_rvalid;
+	// Implement axi_awready generation
+	// axi_awready is asserted for one S_AXI_ACLK clock cycle when both
+	// S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is
+	// de-asserted when reset is low.
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+	    begin
+	      axi_awready <= 1'b0;
+	      aw_en <= 1'b1;
+	    end 
+	  else
+	    begin    
+	      if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en)
+	        begin
+	          // slave is ready to accept write address when 
+	          // there is a valid write address and write data
+	          // on the write address and data bus. This design 
+	          // expects no outstanding transactions. 
+	          axi_awready <= 1'b1;
+	          aw_en <= 1'b0;
+	        end
+	        else if (S_AXI_BREADY && axi_bvalid)
+	            begin
+	              aw_en <= 1'b1;
+	              axi_awready <= 1'b0;
+	            end
+	      else           
+	        begin
+	          axi_awready <= 1'b0;
+	        end
+	    end 
+	end       
+
+	// Implement axi_awaddr latching
+	// This process is used to latch the address when both 
+	// S_AXI_AWVALID and S_AXI_WVALID are valid. 
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+	    begin
+	      axi_awaddr <= 0;
+	    end 
+	  else
+	    begin    
+	      if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en)
+	        begin
+	          // Write Address latching 
+	          axi_awaddr <= S_AXI_AWADDR;
+	        end
+	    end 
+	end       
+
+	// Implement axi_wready generation
+	// axi_wready is asserted for one S_AXI_ACLK clock cycle when both
+	// S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is 
+	// de-asserted when reset is low. 
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+	    begin
+	      axi_wready <= 1'b0;
+	    end 
+	  else
+	    begin    
+	      if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID && aw_en )
+	        begin
+	          // slave is ready to accept write data when 
+	          // there is a valid write address and write data
+	          // on the write address and data bus. This design 
+	          // expects no outstanding transactions. 
+	          axi_wready <= 1'b1;
+	        end
+	      else
+	        begin
+	          axi_wready <= 1'b0;
+	        end
+	    end 
+	end       
+
+	// Implement memory mapped register select and write logic generation
+	// The write data is accepted and written to memory mapped registers when
+	// axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to
+	// select byte enables of slave registers while writing.
+	// These registers are cleared when reset (active low) is applied.
+	// Slave register write enable is asserted when valid address and data are available
+	// and the slave is ready to accept the write address and write data.
+	assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID;
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+		rx_reg <= 0;
+      else if ((ctrl_reg[1] == 1'b1))
+        rx_reg <= 0;
+	  else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h0))
+		rx_reg[8:0] <= {1'b1, S_AXI_WDATA[7:0]};
+	  else if (slv_reg_rden && (axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h0))
+		rx_reg[8] <= 1'b0;
+      else if (rx_req & rx_ack) // check precedence (rx_req)
+		rx_reg[8:0] <= {1'b1, rx_tdata[7:0]};
+	end    
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+		tx_reg <= 0;
+      else if ((ctrl_reg[0] == 1'b1))
+        tx_reg <= 0;
+	  else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h1))
+		tx_reg[8:0] <= {1'b1, S_AXI_WDATA[7:0]};
+      else if (tx_req & tx_ack)
+		tx_reg[8] <= 1'b0;
+	end    
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+		ctrl_reg <= 8'b00000100;
+	  else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h3))
+		ctrl_reg[7:0] <= S_AXI_WDATA[7:0];
+	end    
+
+	// Implement write response logic generation
+	// The write response and response valid signals are asserted by the slave 
+	// when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted.  
+	// This marks the acceptance of address and indicates the status of 
+	// write transaction.
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+	    begin
+	      axi_bvalid  <= 0;
+	      axi_bresp   <= 2'b0;
+	    end 
+	  else
+	    begin    
+	      if (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready && S_AXI_WVALID)
+	        begin
+	          // indicates a valid write response is available
+	          axi_bvalid <= 1'b1;
+	          axi_bresp  <= 2'b0; // 'OKAY' response 
+	        end                   // work error responses in future
+	      else
+	        begin
+	          if (S_AXI_BREADY && axi_bvalid) 
+	            //check if bready is asserted while bvalid is high) 
+	            //(there is a possibility that bready is always asserted high)   
+	            begin
+	              axi_bvalid <= 1'b0; 
+	            end  
+	        end
+	    end
+	end   
+
+	// Implement axi_arready generation
+	// axi_arready is asserted for one S_AXI_ACLK clock cycle when
+	// S_AXI_ARVALID is asserted. axi_awready is 
+	// de-asserted when reset (active low) is asserted. 
+	// The read address is also latched when S_AXI_ARVALID is 
+	// asserted. axi_araddr is reset to zero on reset assertion.
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+	    begin
+	      axi_arready <= 1'b0;
+	      axi_araddr  <= 32'b0;
+	    end 
+	  else
+	    begin    
+	      if (~axi_arready && S_AXI_ARVALID)
+	        begin
+	          // indicates that the slave has acceped the valid read address
+	          axi_arready <= 1'b1;
+	          // Read address latching
+	          axi_araddr  <= S_AXI_ARADDR;
+	        end
+	      else
+	        begin
+	          axi_arready <= 1'b0;
+	        end
+	    end 
+	end       
+
+	// Implement axi_arvalid generation
+	// axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both 
+	// S_AXI_ARVALID and axi_arready are asserted. The slave registers 
+	// data are available on the axi_rdata bus at this instance. The 
+	// assertion of axi_rvalid marks the validity of read data on the 
+	// bus and axi_rresp indicates the status of read transaction.axi_rvalid 
+	// is deasserted on reset (active low). axi_rresp and axi_rdata are 
+	// cleared to zero on reset (active low).  
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+	    begin
+	      axi_rvalid <= 0;
+	      axi_rresp  <= 0;
+	    end
+	  else
+	    begin    
+	      if (axi_arready && S_AXI_ARVALID && ~axi_rvalid)
+	        begin
+	          // Valid read data is available at the read data bus
+	          axi_rvalid <= 1'b1;
+	          axi_rresp  <= 2'b0; // 'OKAY' response
+	        end   
+	      else if (axi_rvalid && S_AXI_RREADY)
+	        begin
+	          // Read data is accepted by the master
+	          axi_rvalid <= 1'b0;
+	        end                
+	    end
+	end    
+
+	// Implement memory mapped register select and read logic generation
+	// Slave register read enable is asserted when valid address is available
+	// and the slave is ready to accept the read address.
+	assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;
+	always @(*)
+	begin
+	      // Address decoding for reading registers
+	      case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
+	        2'h0   : reg_data_out <= rx_reg[7:0];
+	        2'h1   : reg_data_out <= tx_reg[7:0];
+	        2'h2   : reg_data_out <= {3'b000, ctrl_reg[4], tx_req, !tx_req, rx_val, rx_val};
+	        2'h3   : reg_data_out <= ctrl_reg;
+	        default : reg_data_out <= 0;
+	      endcase
+	end
+
+	// Output register or memory read data
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+	    begin
+	      axi_rdata  <= 0;
+	    end 
+	  else
+	    begin    
+	      // When there is a valid read address (S_AXI_ARVALID) with 
+	      // acceptance of read address by the slave (axi_arready), 
+	      // output the read dada 
+	      if (slv_reg_rden)
+	        begin
+	          axi_rdata <= {24'h000000, reg_data_out};     // register read data
+	        end   
+	    end
+	end    
+
+	// Add user logic here
+
+	// User logic ends
+
+	endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/xgui/axi_stream_io_v1_0.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/xgui/axi_stream_io_v1_0.tcl
new file mode 100755
index 0000000..fcf8a06
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/axi_stream_io_1.0/xgui/axi_stream_io_v1_0.tcl
@@ -0,0 +1,58 @@
+# Definitional proc to organize widgets for parameters.
+proc init_gui { IPINST } {
+  ipgui::add_param $IPINST -name "Component_Name"
+  #Adding Page
+  set Page_0 [ipgui::add_page $IPINST -name "Page 0"]
+  ipgui::add_param $IPINST -name "C_axi_s_BASEADDR" -parent ${Page_0}
+  ipgui::add_param $IPINST -name "C_axi_s_HIGHADDR" -parent ${Page_0}
+
+
+}
+
+proc update_PARAM_VALUE.C_S_AXI_ADDR_WIDTH { PARAM_VALUE.C_S_AXI_ADDR_WIDTH } {
+	# Procedure called to update C_S_AXI_ADDR_WIDTH when any of the dependent parameters in the arguments change
+}
+
+proc validate_PARAM_VALUE.C_S_AXI_ADDR_WIDTH { PARAM_VALUE.C_S_AXI_ADDR_WIDTH } {
+	# Procedure called to validate C_S_AXI_ADDR_WIDTH
+	return true
+}
+
+proc update_PARAM_VALUE.C_S_AXI_DATA_WIDTH { PARAM_VALUE.C_S_AXI_DATA_WIDTH } {
+	# Procedure called to update C_S_AXI_DATA_WIDTH when any of the dependent parameters in the arguments change
+}
+
+proc validate_PARAM_VALUE.C_S_AXI_DATA_WIDTH { PARAM_VALUE.C_S_AXI_DATA_WIDTH } {
+	# Procedure called to validate C_S_AXI_DATA_WIDTH
+	return true
+}
+
+proc update_PARAM_VALUE.C_axi_s_BASEADDR { PARAM_VALUE.C_axi_s_BASEADDR } {
+	# Procedure called to update C_axi_s_BASEADDR when any of the dependent parameters in the arguments change
+}
+
+proc validate_PARAM_VALUE.C_axi_s_BASEADDR { PARAM_VALUE.C_axi_s_BASEADDR } {
+	# Procedure called to validate C_axi_s_BASEADDR
+	return true
+}
+
+proc update_PARAM_VALUE.C_axi_s_HIGHADDR { PARAM_VALUE.C_axi_s_HIGHADDR } {
+	# Procedure called to update C_axi_s_HIGHADDR when any of the dependent parameters in the arguments change
+}
+
+proc validate_PARAM_VALUE.C_axi_s_HIGHADDR { PARAM_VALUE.C_axi_s_HIGHADDR } {
+	# Procedure called to validate C_axi_s_HIGHADDR
+	return true
+}
+
+
+proc update_MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH { MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH PARAM_VALUE.C_S_AXI_DATA_WIDTH } {
+	# Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value
+	set_property value [get_property value ${PARAM_VALUE.C_S_AXI_DATA_WIDTH}] ${MODELPARAM_VALUE.C_S_AXI_DATA_WIDTH}
+}
+
+proc update_MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH { MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH PARAM_VALUE.C_S_AXI_ADDR_WIDTH } {
+	# Procedure called to set VHDL generic/Verilog parameter value(s) based on TCL parameter value
+	set_property value [get_property value ${PARAM_VALUE.C_S_AXI_ADDR_WIDTH}] ${MODELPARAM_VALUE.C_S_AXI_ADDR_WIDTH}
+}
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl
new file mode 100644
index 0000000..4804aeb
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/bd/bd.tcl
@@ -0,0 +1,86 @@
+
+proc init { cellpath otherInfo } {                                                                   
+                                                                                                             
+	set cell_handle [get_bd_cells $cellpath]                                                                 
+	set all_busif [get_bd_intf_pins $cellpath/*]		                                                     
+	set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH]
+	set full_sbusif_list [list  ]
+			                                                                                                 
+	foreach busif $all_busif {                                                                               
+		if { [string equal -nocase [get_property MODE $busif] "slave"] == 1 } {                            
+			set busif_param_list [list]                                                                      
+			set busif_name [get_property NAME $busif]					                                     
+			if { [lsearch -exact -nocase $full_sbusif_list $busif_name ] == -1 } {					         
+			    continue                                                                                     
+			}                                                                                                
+			foreach tparam $axi_standard_param_list {                                                        
+				lappend busif_param_list "C_${busif_name}_${tparam}"                                       
+			}                                                                                                
+			bd::mark_propagate_only $cell_handle $busif_param_list			                                 
+		}		                                                                                             
+	}                                                                                                        
+}
+
+
+proc pre_propagate {cellpath otherInfo } {                                                           
+                                                                                                             
+	set cell_handle [get_bd_cells $cellpath]                                                                 
+	set all_busif [get_bd_intf_pins $cellpath/*]		                                                     
+	set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH]
+	                                                                                                         
+	foreach busif $all_busif {	                                                                             
+		if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } {                  
+			continue                                                                                         
+		}                                                                                                    
+		if { [string equal -nocase [get_property MODE $busif] "master"] != 1 } {                           
+			continue                                                                                         
+		}			                                                                                         
+		                                                                                                     
+		set busif_name [get_property NAME $busif]			                                                 
+		foreach tparam $axi_standard_param_list {		                                                     
+			set busif_param_name "C_${busif_name}_${tparam}"			                                     
+			                                                                                                 
+			set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif]                                  
+			set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle]                           
+			                                                                                                 
+			if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } {                          
+				if { $val_on_cell != "" } {                                                                  
+					set_property CONFIG.${tparam} $val_on_cell $busif                                        
+				}                                                                                            
+			}			                                                                                     
+		}		                                                                                             
+	}                                                                                                        
+}
+
+
+proc propagate {cellpath otherInfo } {                                                               
+                                                                                                             
+	set cell_handle [get_bd_cells $cellpath]                                                                 
+	set all_busif [get_bd_intf_pins $cellpath/*]		                                                     
+	set axi_standard_param_list [list ID_WIDTH AWUSER_WIDTH ARUSER_WIDTH WUSER_WIDTH RUSER_WIDTH BUSER_WIDTH]
+	                                                                                                         
+	foreach busif $all_busif {                                                                               
+		if { [string equal -nocase [get_property CONFIG.PROTOCOL $busif] "AXI4"] != 1 } {                  
+			continue                                                                                         
+		}                                                                                                    
+		if { [string equal -nocase [get_property MODE $busif] "slave"] != 1 } {                            
+			continue                                                                                         
+		}			                                                                                         
+	                                                                                                         
+		set busif_name [get_property NAME $busif]		                                                     
+		foreach tparam $axi_standard_param_list {			                                                 
+			set busif_param_name "C_${busif_name}_${tparam}"			                                     
+                                                                                                             
+			set val_on_cell_intf_pin [get_property CONFIG.${tparam} $busif]                                  
+			set val_on_cell [get_property CONFIG.${busif_param_name} $cell_handle]                           
+			                                                                                                 
+			if { [string equal -nocase $val_on_cell_intf_pin $val_on_cell] != 1 } {                          
+				#override property of bd_interface_net to bd_cell -- only for slaves.  May check for supported values..
+				if { $val_on_cell_intf_pin != "" } {                                                         
+					set_property CONFIG.${busif_param_name} $val_on_cell_intf_pin $cell_handle               
+				}                                                                                            
+			}                                                                                                
+		}		                                                                                             
+	}                                                                                                        
+}
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/component.xml b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/component.xml
new file mode 100644
index 0000000..c9d8d6e
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/component.xml
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<spirit:component xmlns:xilinx="http://www.xilinx.com" xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <spirit:vendor>soclabs.org</spirit:vendor>
+  <spirit:library>ip</spirit:library>
+  <spirit:name>ft1248x1_to_stream8_1.0</spirit:name>
+  <spirit:version>1.0</spirit:version>
+  <spirit:model>
+    <spirit:views>
+      <spirit:view>
+        <spirit:name>xilinx_anylanguagesynthesis</spirit:name>
+        <spirit:displayName>Synthesis</spirit:displayName>
+        <spirit:envIdentifier>:vivado.xilinx.com:synthesis</spirit:envIdentifier>
+        <spirit:language>Verilog</spirit:language>
+        <spirit:fileSetRef>
+          <spirit:localName>xilinx_anylanguagesynthesis_view_fileset</spirit:localName>
+        </spirit:fileSetRef>
+        <spirit:parameters>
+          <spirit:parameter>
+            <spirit:name>viewChecksum</spirit:name>
+            <spirit:value>5c0c346d</spirit:value>
+          </spirit:parameter>
+        </spirit:parameters>
+      </spirit:view>
+      <spirit:view>
+        <spirit:name>xilinx_anylanguagebehavioralsimulation</spirit:name>
+        <spirit:displayName>Simulation</spirit:displayName>
+        <spirit:envIdentifier>:vivado.xilinx.com:simulation</spirit:envIdentifier>
+        <spirit:language>Verilog</spirit:language>
+        <spirit:fileSetRef>
+          <spirit:localName>xilinx_anylanguagebehavioralsimulation_view_fileset</spirit:localName>
+        </spirit:fileSetRef>
+        <spirit:parameters>
+          <spirit:parameter>
+            <spirit:name>viewChecksum</spirit:name>
+            <spirit:value>5c0c346d</spirit:value>
+          </spirit:parameter>
+        </spirit:parameters>
+      </spirit:view>
+    </spirit:views>
+  </spirit:model>
+  <spirit:fileSets>
+    <spirit:fileSet>
+      <spirit:name>xilinx_anylanguagesynthesis_view_fileset</spirit:name>
+      <spirit:file>
+        <spirit:name>src/synclib.v</spirit:name>
+        <spirit:fileType>verilogSource</spirit:fileType>
+        <spirit:logicalName>ft1248x1_to_stream8_1.0</spirit:logicalName>
+      </spirit:file>
+      <spirit:file>
+        <spirit:name>src/ft1248x1_to_stream8.v</spirit:name>
+        <spirit:fileType>verilogSource</spirit:fileType>
+        <spirit:userFileType>CHECKSUM_06e9a745</spirit:userFileType>
+        <spirit:logicalName>ft1248x1_to_stream8_1.0</spirit:logicalName>
+      </spirit:file>
+    </spirit:fileSet>
+    <spirit:fileSet>
+      <spirit:name>xilinx_anylanguagebehavioralsimulation_view_fileset</spirit:name>
+      <spirit:file>
+        <spirit:name>src/synclib.v</spirit:name>
+        <spirit:fileType>verilogSource</spirit:fileType>
+        <spirit:logicalName>ft1248x1_to_stream8_1.0</spirit:logicalName>
+      </spirit:file>
+      <spirit:file>
+        <spirit:name>src/ft1248x1_to_stream8.v</spirit:name>
+        <spirit:fileType>verilogSource</spirit:fileType>
+        <spirit:logicalName>ft1248x1_to_stream8_1.0</spirit:logicalName>
+      </spirit:file>
+    </spirit:fileSet>
+  </spirit:fileSets>
+  <spirit:description>ft1248x1_to_stream8_1.0:1.0</spirit:description>
+  <spirit:parameters>
+    <spirit:parameter>
+      <spirit:name>Component_Name</spirit:name>
+      <spirit:value spirit:resolve="user" spirit:id="PARAM_VALUE.Component_Name" spirit:order="1">ft1248x1_to_stream8_1_0_v1_0</spirit:value>
+    </spirit:parameter>
+  </spirit:parameters>
+  <spirit:vendorExtensions>
+    <xilinx:coreExtensions>
+      <xilinx:taxonomies>
+        <xilinx:taxonomy>/AXI_Infrastructure</xilinx:taxonomy>
+        <xilinx:taxonomy>/Debug_&amp;_Verification/Debug</xilinx:taxonomy>
+        <xilinx:taxonomy>/Embedded_Processing/Debug_&amp;_Verification/Debug</xilinx:taxonomy>
+      </xilinx:taxonomies>
+      <xilinx:displayName>ft1248x1_to_stream8_1.0_v1_0</xilinx:displayName>
+      <xilinx:hideInCatalogGUI>true</xilinx:hideInCatalogGUI>
+      <xilinx:definitionSource>package_project</xilinx:definitionSource>
+      <xilinx:vendorDisplayName>soclabs.org</xilinx:vendorDisplayName>
+      <xilinx:vendorURL>http://soclabs.org</xilinx:vendorURL>
+      <xilinx:coreRevision>1</xilinx:coreRevision>
+      <xilinx:upgrades>
+        <xilinx:canUpgradeFrom>xilinx.com:ip:ft1248x1_to_stream8_1.0:1.0</xilinx:canUpgradeFrom>
+      </xilinx:upgrades>
+      <xilinx:coreCreationDateTime>2022-08-18T13:41:50Z</xilinx:coreCreationDateTime>
+      <xilinx:tags>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@554a8be0_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@2c2e0f51_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@4bf8650c_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@50a2d20f_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@679c5188_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@61453e2b_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@20d8eb40_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@9d02819_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@1f726801_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@7d50b16d_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@558791b8_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@dade147_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@50c7becf_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@134862eb_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@4c308b0f_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@174caa76_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@33e02927_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@1bc1eca_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@247a24c1_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@7f189307_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@4fc3a402_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@62f43e05_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@7f223669_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+        <xilinx:tag xilinx:name="ui.data.coregen.df@77281e8f_ARCHIVE_LOCATION">/home/dwf1m12/soclabs_git/soclabs-cortexm0-mcu/Cortex-M0/soclabs_demo/systems/cortex_m0_mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0</xilinx:tag>
+      </xilinx:tags>
+    </xilinx:coreExtensions>
+    <xilinx:packagingInfo>
+      <xilinx:xilinxVersion>2021.1</xilinx:xilinxVersion>
+      <xilinx:checksum xilinx:scope="fileGroups" xilinx:value="8af10ea9"/>
+      <xilinx:checksum xilinx:scope="parameters" xilinx:value="f93808b1"/>
+    </xilinx:packagingInfo>
+  </spirit:vendorExtensions>
+</spirit:component>
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ft1248x1_to_stream8_0.xcix b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ft1248x1_to_stream8_0.xcix
new file mode 100644
index 0000000000000000000000000000000000000000..1b2410ad1ecde98574e898028f41ad55c1c8f3b1
GIT binary patch
literal 253
zcmWIWW@gc4U}NB5XqqS(`mg`;-f9L0hK&pi3~US{49UrQ6}dT#3<3=3VDrZHC(Z_H
zc<XANJ9B<>sL>VUfFO^v-sk*Jp7Guu%EeoFd27I??T<GVp40a#J$GK)^UN7<-JlP?
zXHMyJHD@wqeLQ={S#ZPSpa6!~g{RMWZuQnSG%?z^!k|b0WWT<irkC%TtsUkUj%%$7
zpExITG5;psHIumywcXA+&dLzr&B!FeEP}()5Qj1{Ffc4>1hFAr2=HcQ1MwIc7#U0$
K7#KE#I1B(r*H8NZ

literal 0
HcmV?d00001

diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0.v
new file mode 100644
index 0000000..822ab4c
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0.v
@@ -0,0 +1,75 @@
+
+`timescale 1 ns / 1 ps
+
+	module ft1248x1_to_stream8_v1_0 #
+	(
+		// Users to add parameters here
+
+		// User parameters ends
+		// Do not modify the parameters beyond this line
+
+
+		// Parameters of Axi Slave Bus Interface RXD8
+		parameter integer C_RXD8_TDATA_WIDTH	= 32,
+
+		// Parameters of Axi Master Bus Interface TXD8
+		parameter integer C_TXD8_TDATA_WIDTH	= 32,
+		parameter integer C_TXD8_START_COUNT	= 32
+	)
+	(
+		// Users to add ports here
+
+		// User ports ends
+		// Do not modify the ports beyond this line
+
+
+		// Ports of Axi Slave Bus Interface RXD8
+		input wire  rxd8_aclk,
+		input wire  rxd8_aresetn,
+		output wire  rxd8_tready,
+		input wire [C_RXD8_TDATA_WIDTH-1 : 0] rxd8_tdata,
+		input wire [(C_RXD8_TDATA_WIDTH/8)-1 : 0] rxd8_tstrb,
+		input wire  rxd8_tlast,
+		input wire  rxd8_tvalid,
+
+		// Ports of Axi Master Bus Interface TXD8
+		input wire  txd8_aclk,
+		input wire  txd8_aresetn,
+		output wire  txd8_tvalid,
+		output wire [C_TXD8_TDATA_WIDTH-1 : 0] txd8_tdata,
+		output wire [(C_TXD8_TDATA_WIDTH/8)-1 : 0] txd8_tstrb,
+		output wire  txd8_tlast,
+		input wire  txd8_tready
+	);
+// Instantiation of Axi Bus Interface RXD8
+	ft1248x1_to_stream8_v1_0_RXD8 # ( 
+		.C_S_AXIS_TDATA_WIDTH(C_RXD8_TDATA_WIDTH)
+	) ft1248x1_to_stream8_v1_0_RXD8_inst (
+		.S_AXIS_ACLK(rxd8_aclk),
+		.S_AXIS_ARESETN(rxd8_aresetn),
+		.S_AXIS_TREADY(rxd8_tready),
+		.S_AXIS_TDATA(rxd8_tdata),
+		.S_AXIS_TSTRB(rxd8_tstrb),
+		.S_AXIS_TLAST(rxd8_tlast),
+		.S_AXIS_TVALID(rxd8_tvalid)
+	);
+
+// Instantiation of Axi Bus Interface TXD8
+	ft1248x1_to_stream8_v1_0_TXD8 # ( 
+		.C_M_AXIS_TDATA_WIDTH(C_TXD8_TDATA_WIDTH),
+		.C_M_START_COUNT(C_TXD8_START_COUNT)
+	) ft1248x1_to_stream8_v1_0_TXD8_inst (
+		.M_AXIS_ACLK(txd8_aclk),
+		.M_AXIS_ARESETN(txd8_aresetn),
+		.M_AXIS_TVALID(txd8_tvalid),
+		.M_AXIS_TDATA(txd8_tdata),
+		.M_AXIS_TSTRB(txd8_tstrb),
+		.M_AXIS_TLAST(txd8_tlast),
+		.M_AXIS_TREADY(txd8_tready)
+	);
+
+	// Add user logic here
+
+	// User logic ends
+
+	endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_RXD8.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_RXD8.v
new file mode 100644
index 0000000..9b39ac6
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_RXD8.v
@@ -0,0 +1,167 @@
+
+`timescale 1 ns / 1 ps
+
+	module ft1248x1_to_stream8_v1_0_RXD8 #
+	(
+		// Users to add parameters here
+
+		// User parameters ends
+		// Do not modify the parameters beyond this line
+
+		// AXI4Stream sink: Data Width
+		parameter integer C_S_AXIS_TDATA_WIDTH	= 32
+	)
+	(
+		// Users to add ports here
+
+		// User ports ends
+		// Do not modify the ports beyond this line
+
+		// AXI4Stream sink: Clock
+		input wire  S_AXIS_ACLK,
+		// AXI4Stream sink: Reset
+		input wire  S_AXIS_ARESETN,
+		// Ready to accept data in
+		output wire  S_AXIS_TREADY,
+		// Data in
+		input wire [C_S_AXIS_TDATA_WIDTH-1 : 0] S_AXIS_TDATA,
+		// Byte qualifier
+		input wire [(C_S_AXIS_TDATA_WIDTH/8)-1 : 0] S_AXIS_TSTRB,
+		// Indicates boundary of last packet
+		input wire  S_AXIS_TLAST,
+		// Data is in valid
+		input wire  S_AXIS_TVALID
+	);
+	// function called clogb2 that returns an integer which has the 
+	// value of the ceiling of the log base 2.
+	function integer clogb2 (input integer bit_depth);
+	  begin
+	    for(clogb2=0; bit_depth>0; clogb2=clogb2+1)
+	      bit_depth = bit_depth >> 1;
+	  end
+	endfunction
+
+	// Total number of input data.
+	localparam NUMBER_OF_INPUT_WORDS  = 8;
+	// bit_num gives the minimum number of bits needed to address 'NUMBER_OF_INPUT_WORDS' size of FIFO.
+	localparam bit_num  = clogb2(NUMBER_OF_INPUT_WORDS-1);
+	// Define the states of state machine
+	// The control state machine oversees the writing of input streaming data to the FIFO,
+	// and outputs the streaming data from the FIFO
+	parameter [1:0] IDLE = 1'b0,        // This is the initial/idle state 
+
+	                WRITE_FIFO  = 1'b1; // In this state FIFO is written with the
+	                                    // input stream data S_AXIS_TDATA 
+	wire  	axis_tready;
+	// State variable
+	reg mst_exec_state;  
+	// FIFO implementation signals
+	genvar byte_index;     
+	// FIFO write enable
+	wire fifo_wren;
+	// FIFO full flag
+	reg fifo_full_flag;
+	// FIFO write pointer
+	reg [bit_num-1:0] write_pointer;
+	// sink has accepted all the streaming data and stored in FIFO
+	  reg writes_done;
+	// I/O Connections assignments
+
+	assign S_AXIS_TREADY	= axis_tready;
+	// Control state machine implementation
+	always @(posedge S_AXIS_ACLK) 
+	begin  
+	  if (!S_AXIS_ARESETN) 
+	  // Synchronous reset (active low)
+	    begin
+	      mst_exec_state <= IDLE;
+	    end  
+	  else
+	    case (mst_exec_state)
+	      IDLE: 
+	        // The sink starts accepting tdata when 
+	        // there tvalid is asserted to mark the
+	        // presence of valid streaming data 
+	          if (S_AXIS_TVALID)
+	            begin
+	              mst_exec_state <= WRITE_FIFO;
+	            end
+	          else
+	            begin
+	              mst_exec_state <= IDLE;
+	            end
+	      WRITE_FIFO: 
+	        // When the sink has accepted all the streaming input data,
+	        // the interface swiches functionality to a streaming master
+	        if (writes_done)
+	          begin
+	            mst_exec_state <= IDLE;
+	          end
+	        else
+	          begin
+	            // The sink accepts and stores tdata 
+	            // into FIFO
+	            mst_exec_state <= WRITE_FIFO;
+	          end
+
+	    endcase
+	end
+	// AXI Streaming Sink 
+	// 
+	// The example design sink is always ready to accept the S_AXIS_TDATA  until
+	// the FIFO is not filled with NUMBER_OF_INPUT_WORDS number of input words.
+	assign axis_tready = ((mst_exec_state == WRITE_FIFO) && (write_pointer <= NUMBER_OF_INPUT_WORDS-1));
+
+	always@(posedge S_AXIS_ACLK)
+	begin
+	  if(!S_AXIS_ARESETN)
+	    begin
+	      write_pointer <= 0;
+	      writes_done <= 1'b0;
+	    end  
+	  else
+	    if (write_pointer <= NUMBER_OF_INPUT_WORDS-1)
+	      begin
+	        if (fifo_wren)
+	          begin
+	            // write pointer is incremented after every write to the FIFO
+	            // when FIFO write signal is enabled.
+	            write_pointer <= write_pointer + 1;
+	            writes_done <= 1'b0;
+	          end
+	          if ((write_pointer == NUMBER_OF_INPUT_WORDS-1)|| S_AXIS_TLAST)
+	            begin
+	              // reads_done is asserted when NUMBER_OF_INPUT_WORDS numbers of streaming data 
+	              // has been written to the FIFO which is also marked by S_AXIS_TLAST(kept for optional usage).
+	              writes_done <= 1'b1;
+	            end
+	      end  
+	end
+
+	// FIFO write enable generation
+	assign fifo_wren = S_AXIS_TVALID && axis_tready;
+
+	// FIFO Implementation
+	generate 
+	  for(byte_index=0; byte_index<= (C_S_AXIS_TDATA_WIDTH/8-1); byte_index=byte_index+1)
+	  begin:FIFO_GEN
+
+	    reg  [(C_S_AXIS_TDATA_WIDTH/4)-1:0] stream_data_fifo [0 : NUMBER_OF_INPUT_WORDS-1];
+
+	    // Streaming input data is stored in FIFO
+
+	    always @( posedge S_AXIS_ACLK )
+	    begin
+	      if (fifo_wren)// && S_AXIS_TSTRB[byte_index])
+	        begin
+	          stream_data_fifo[write_pointer] <= S_AXIS_TDATA[(byte_index*8+7) -: 8];
+	        end  
+	    end  
+	  end		
+	endgenerate
+
+	// Add user logic here
+
+	// User logic ends
+
+	endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_TXD8.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_TXD8.v
new file mode 100644
index 0000000..3abf9f8
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/hdl/ft1248x1_to_stream8_v1_0_TXD8.v
@@ -0,0 +1,228 @@
+
+`timescale 1 ns / 1 ps
+
+	module ft1248x1_to_stream8_v1_0_TXD8 #
+	(
+		// Users to add parameters here
+
+		// User parameters ends
+		// Do not modify the parameters beyond this line
+
+		// Width of S_AXIS address bus. The slave accepts the read and write addresses of width C_M_AXIS_TDATA_WIDTH.
+		parameter integer C_M_AXIS_TDATA_WIDTH	= 32,
+		// Start count is the number of clock cycles the master will wait before initiating/issuing any transaction.
+		parameter integer C_M_START_COUNT	= 32
+	)
+	(
+		// Users to add ports here
+
+		// User ports ends
+		// Do not modify the ports beyond this line
+
+		// Global ports
+		input wire  M_AXIS_ACLK,
+		// 
+		input wire  M_AXIS_ARESETN,
+		// Master Stream Ports. TVALID indicates that the master is driving a valid transfer, A transfer takes place when both TVALID and TREADY are asserted. 
+		output wire  M_AXIS_TVALID,
+		// TDATA is the primary payload that is used to provide the data that is passing across the interface from the master.
+		output wire [C_M_AXIS_TDATA_WIDTH-1 : 0] M_AXIS_TDATA,
+		// TSTRB is the byte qualifier that indicates whether the content of the associated byte of TDATA is processed as a data byte or a position byte.
+		output wire [(C_M_AXIS_TDATA_WIDTH/8)-1 : 0] M_AXIS_TSTRB,
+		// TLAST indicates the boundary of a packet.
+		output wire  M_AXIS_TLAST,
+		// TREADY indicates that the slave can accept a transfer in the current cycle.
+		input wire  M_AXIS_TREADY
+	);
+	// Total number of output data                                                 
+	localparam NUMBER_OF_OUTPUT_WORDS = 8;                                               
+	                                                                                     
+	// function called clogb2 that returns an integer which has the                      
+	// value of the ceiling of the log base 2.                                           
+	function integer clogb2 (input integer bit_depth);                                   
+	  begin                                                                              
+	    for(clogb2=0; bit_depth>0; clogb2=clogb2+1)                                      
+	      bit_depth = bit_depth >> 1;                                                    
+	  end                                                                                
+	endfunction                                                                          
+	                                                                                     
+	// WAIT_COUNT_BITS is the width of the wait counter.                                 
+	localparam integer WAIT_COUNT_BITS = clogb2(C_M_START_COUNT-1);                      
+	                                                                                     
+	// bit_num gives the minimum number of bits needed to address 'depth' size of FIFO.  
+	localparam bit_num  = clogb2(NUMBER_OF_OUTPUT_WORDS);                                
+	                                                                                     
+	// Define the states of state machine                                                
+	// The control state machine oversees the writing of input streaming data to the FIFO,
+	// and outputs the streaming data from the FIFO                                      
+	parameter [1:0] IDLE = 2'b00,        // This is the initial/idle state               
+	                                                                                     
+	                INIT_COUNTER  = 2'b01, // This state initializes the counter, once   
+	                                // the counter reaches C_M_START_COUNT count,        
+	                                // the state machine changes state to SEND_STREAM     
+	                SEND_STREAM   = 2'b10; // In this state the                          
+	                                     // stream data is output through M_AXIS_TDATA   
+	// State variable                                                                    
+	reg [1:0] mst_exec_state;                                                            
+	// Example design FIFO read pointer                                                  
+	reg [bit_num-1:0] read_pointer;                                                      
+
+	// AXI Stream internal signals
+	//wait counter. The master waits for the user defined number of clock cycles before initiating a transfer.
+	reg [WAIT_COUNT_BITS-1 : 0] 	count;
+	//streaming data valid
+	wire  	axis_tvalid;
+	//streaming data valid delayed by one clock cycle
+	reg  	axis_tvalid_delay;
+	//Last of the streaming data 
+	wire  	axis_tlast;
+	//Last of the streaming data delayed by one clock cycle
+	reg  	axis_tlast_delay;
+	//FIFO implementation signals
+	reg [C_M_AXIS_TDATA_WIDTH-1 : 0] 	stream_data_out;
+	wire  	tx_en;
+	//The master has issued all the streaming data stored in FIFO
+	reg  	tx_done;
+
+
+	// I/O Connections assignments
+
+	assign M_AXIS_TVALID	= axis_tvalid_delay;
+	assign M_AXIS_TDATA	= stream_data_out;
+	assign M_AXIS_TLAST	= axis_tlast_delay;
+	assign M_AXIS_TSTRB	= {(C_M_AXIS_TDATA_WIDTH/8){1'b1}};
+
+
+	// Control state machine implementation                             
+	always @(posedge M_AXIS_ACLK)                                             
+	begin                                                                     
+	  if (!M_AXIS_ARESETN)                                                    
+	  // Synchronous reset (active low)                                       
+	    begin                                                                 
+	      mst_exec_state <= IDLE;                                             
+	      count    <= 0;                                                      
+	    end                                                                   
+	  else                                                                    
+	    case (mst_exec_state)                                                 
+	      IDLE:                                                               
+	        // The slave starts accepting tdata when                          
+	        // there tvalid is asserted to mark the                           
+	        // presence of valid streaming data                               
+	        //if ( count == 0 )                                                 
+	        //  begin                                                           
+	            mst_exec_state  <= INIT_COUNTER;                              
+	        //  end                                                             
+	        //else                                                              
+	        //  begin                                                           
+	        //    mst_exec_state  <= IDLE;                                      
+	        //  end                                                             
+	                                                                          
+	      INIT_COUNTER:                                                       
+	        // The slave starts accepting tdata when                          
+	        // there tvalid is asserted to mark the                           
+	        // presence of valid streaming data                               
+	        if ( count == C_M_START_COUNT - 1 )                               
+	          begin                                                           
+	            mst_exec_state  <= SEND_STREAM;                               
+	          end                                                             
+	        else                                                              
+	          begin                                                           
+	            count <= count + 1;                                           
+	            mst_exec_state  <= INIT_COUNTER;                              
+	          end                                                             
+	                                                                          
+	      SEND_STREAM:                                                        
+	        // The example design streaming master functionality starts       
+	        // when the master drives output tdata from the FIFO and the slave
+	        // has finished storing the S_AXIS_TDATA                          
+	        if (tx_done)                                                      
+	          begin                                                           
+	            mst_exec_state <= IDLE;                                       
+	          end                                                             
+	        else                                                              
+	          begin                                                           
+	            mst_exec_state <= SEND_STREAM;                                
+	          end                                                             
+	    endcase                                                               
+	end                                                                       
+
+
+	//tvalid generation
+	//axis_tvalid is asserted when the control state machine's state is SEND_STREAM and
+	//number of output streaming data is less than the NUMBER_OF_OUTPUT_WORDS.
+	assign axis_tvalid = ((mst_exec_state == SEND_STREAM) && (read_pointer < NUMBER_OF_OUTPUT_WORDS));
+	                                                                                               
+	// AXI tlast generation                                                                        
+	// axis_tlast is asserted number of output streaming data is NUMBER_OF_OUTPUT_WORDS-1          
+	// (0 to NUMBER_OF_OUTPUT_WORDS-1)                                                             
+	assign axis_tlast = (read_pointer == NUMBER_OF_OUTPUT_WORDS-1);                                
+	                                                                                               
+	                                                                                               
+	// Delay the axis_tvalid and axis_tlast signal by one clock cycle                              
+	// to match the latency of M_AXIS_TDATA                                                        
+	always @(posedge M_AXIS_ACLK)                                                                  
+	begin                                                                                          
+	  if (!M_AXIS_ARESETN)                                                                         
+	    begin                                                                                      
+	      axis_tvalid_delay <= 1'b0;                                                               
+	      axis_tlast_delay <= 1'b0;                                                                
+	    end                                                                                        
+	  else                                                                                         
+	    begin                                                                                      
+	      axis_tvalid_delay <= axis_tvalid;                                                        
+	      axis_tlast_delay <= axis_tlast;                                                          
+	    end                                                                                        
+	end                                                                                            
+
+
+	//read_pointer pointer
+
+	always@(posedge M_AXIS_ACLK)                                               
+	begin                                                                            
+	  if(!M_AXIS_ARESETN)                                                            
+	    begin                                                                        
+	      read_pointer <= 0;                                                         
+	      tx_done <= 1'b0;                                                           
+	    end                                                                          
+	  else                                                                           
+	    if (read_pointer <= NUMBER_OF_OUTPUT_WORDS-1)                                
+	      begin                                                                      
+	        if (tx_en)                                                               
+	          // read pointer is incremented after every read from the FIFO          
+	          // when FIFO read signal is enabled.                                   
+	          begin                                                                  
+	            read_pointer <= read_pointer + 1;                                    
+	            tx_done <= 1'b0;                                                     
+	          end                                                                    
+	      end                                                                        
+	    else if (read_pointer == NUMBER_OF_OUTPUT_WORDS)                             
+	      begin                                                                      
+	        // tx_done is asserted when NUMBER_OF_OUTPUT_WORDS numbers of streaming data
+	        // has been out.                                                         
+	        tx_done <= 1'b1;                                                         
+	      end                                                                        
+	end                                                                              
+
+
+	//FIFO read enable generation 
+
+	assign tx_en = M_AXIS_TREADY && axis_tvalid;   
+	                                                     
+	    // Streaming output data is read from FIFO       
+	    always @( posedge M_AXIS_ACLK )                  
+	    begin                                            
+	      if(!M_AXIS_ARESETN)                            
+	        begin                                        
+	          stream_data_out <= 1;                      
+	        end                                          
+	      else if (tx_en)// && M_AXIS_TSTRB[byte_index]  
+	        begin                                        
+	          stream_data_out <= read_pointer + 32'b1;   
+	        end                                          
+	    end                                              
+
+	// Add user logic here
+
+	// User logic ends
+
+	endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ip_project_archive.zip b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/ip_project_archive.zip
new file mode 100755
index 0000000000000000000000000000000000000000..e67e74bbc9ca5ffffb895c6ce630825d07197fa2
GIT binary patch
literal 19366
zcmWIWW@Zs#U|`^2I9bgUdWhj^{}KiU1{p>M21^D8hLYTZ_|%lllK6t6{H)aE5`A<5
zy^L~9v7CaUrTu%k4jD+eez!ZCuEr`nTWP6Ry?|rE<V8of<~s2%=~OYivVHm@4|enO
zH5PYfi#h8bEKY6>lU$_Yav*f|%z)T7z30q+0TbC@@+4bGo|RkM{3<tpq0qiGsTvWt
zDFHK%XW!x2-VmSgXXT%x+c#bRzFhF`S;o66hH~NuLOm9?smg?UC#b7VS)8!&$u#Nn
zk~71aLay~*j=FWSnq_amtrQKH)ixE32(O>2W(qA3Kb&C8#lUdUkbyy!D6dx(6upg#
zF23a<R(F2=1*6ItE2UIej%`0QQ>j6A+nX7V79VX^rmSq7cQrRkm+9x%>ZrTBlpG(Y
z7;O!mU34n!b<Ohgf9K>${Mq(3Cbik4h57%orK{&oYpSs>*sy<Brmb$??dfap-`gws
zXZ78%G?jv+*;?~0zHa@*nXjWBV0PCpJiPSj^Us^VaWC7iv9$i}wub%R;*TYWv{*NV
zXRmq@KK*&_w$-0{V&CM~hc4T<R?GQ%=(8S$pl2FRDa|sW1{KB(FaNvj{9?Ygd)lXl
zzYTY`{Q5i1X!DC-%a*QX=FdDged)WGvASG2*Q+|uh%S41Ki678BzLdh?aj%#Q*5@#
zTS=~L-s8|+Cg>Wsq%i98>lr;W0<QOLSiVwW^D*D+`*vLTeRp-4i`m?`_1CYbJvpy<
z@l1N~;<yYY_F&^DMXPU5*m7@g;FN<Bx@&JN{T}w_c6MryW8?PCKQABuSaR=@P*>ms
z{f}B|Vyvz=xz^aWy>a}RQTbw-X=&6c_0z0pr+Zxg{mb?LqU-j~8I@1Jto!Bt_sy%M
zo5j<9S*Ay{p4V|=ZC?A=bf3fQZ$&#dHVRiP?S19A_yG6D?m5+en2fl8+`gG%@ymem
z;=zcM)oDuN`%iqRFx#O1<HQ7e7QUilkH^<$9p`wMFS%_0ag9aS0;km%8gaH=?kt=l
z?KY8Tb-MIU3%hmi!!CGk_+w(FclX$|NqK$d5)&UUQ*QEWdU|15Mf0`3>M1Ly2436L
zs?izS&6e`2`F2dXebth}r3@3@o(3xLYF0-}O{)%(3i>w3q^J71^Rv0i2dr<`t^MkK
zAy_7W$?Nxm7ORuIs!O)0d##u}C(vo$3;v7d^B14t-t+eKK`lO(40qef&C_HmxD3h{
z+zV&Cw)4$N#?y8wC$zU-&dg{FEqHg#QaaFT)xD|A(`-*Jl(o#bI<+d?wyh=L#`hOH
ztGG5iy1eg}HDk=DSD6>?tY3aIy6pANDjlh!ly{dem+9>OVv=)pIs1k8%-t487wSlM
zg}$h~9{)Dt{hZkL51Web&RAQcFL1~~lb?fYbEB24L!#H|Z_NkIBTHtxnH$#WmnjNq
z99%Z9#%lIrg9PWD3+k+ApN&)wzj}$E&zGs?{;`z*?meGx8O222Qk!{oYr*sXr8)Ks
zFDLsPo-xgA-|P*HvJ%ISxCKtmT)uf?>iUa3g8c3}TrBexPFwPRY)!aj(CJ_E`lxF`
zS>u1ZtsD9;75*u!$oF~Ws4UR9$TG_A_75`!)shk!yScUp8{dezZODk3@h|b_j5GPm
zzY8l{?|b9S%cU-P+r#I258Hhg&O}@3bzgsf{9KrL{Fs5~$~QBPY+f<%$LFTG&Ob7B
z^xJr6{;HfP=9|f&KjqSsU=h#Db(@}Mx@t~dc0R2zlg0RPiu9qGkxdq+i%lA42hNf?
zqv6Y)Hf5P;+LUGI&uDb+aGuaVVZ{Wghg}hTyZFPHHqNj&Jz~B2&z+(VVFBwdZkt)q
zX#3^K<1PL_c-w8=tW=KN>Ma!6b?u#8wWQno66r~rHya|%v?k5}{(JAUhux)9wlE0Z
zs#&0YX|Im7-)>Q>S6-KA`gOd{lvm^5^UX#<Utu@9wus-M$c=erXK(N=UOs^>`NPY=
zM-#Ihxf`4^_wzShscN+{zwj-ujctvJ^Y#8u)rPja#b3WX*&FPq`t9WG8Hd&!h^lM}
z-{<(?$@(*j`kl7Vt_K~f33*rb#&m^#+<Q~keX{o_C@I}g?`b{eBvBZ@eSdSC?KF)G
zyH?(_-F@ek8t<77r|+Nid}H5c2yWb(@%*;I$`!M7oDY`0(r>Qe6l<R%w9xd7^${iO
z#A`A0wC<V+KKOCvU>djZ65n(#&(8igr!N`%ZvOo5YNY%*!N|2Y*d4>mmSsvDQY+zI
zrz7!O!ItB_693ONubp&GH!9h^3S(ein^m{(lkD8M&+qCr7_#pDwU>w!=Xs-N@WC;t
z^!3hC#sw1F_k8e4KY#e*B8Q;#C+}ap*p$+%mQ$4X|Iw$fX-_6aABj7BU}D{?1h<XP
z9nY*TnJs%|$`|IgLw--^O)X(ITgdtGS@-WrF{-az1(-75EIVSl&60!dnNR;2X7%=F
zm$Ie3lkJPOovcOrA9;49u-g@Am>d_3U-7<&_0_I(GxqCQ>AvsL%#Xaz@#~Q0pGupm
zx$^>x94C~$(CO#rVU!72u2vtqK56Ms`D^cwx7{;X=2({;H0N~IiO#3)nL8zvXLPWx
z3F((M2%hid#Ph`ImJ++nB$<gUiwq>*C#Ow2{&rh~@+I!3%d;G0+m3wstJl)Fc|z?;
z*8rch)1Mr5+`;%e^4$!Fjh^dRxnwMEl}svUpLs?}#G0|fX~E$qH<#R$y<*38Xl234
z(7nBux~xfEcbyj5Z#@3%#(9m`i|lJ7<^RuFox>#4d5ZZ~Du3W76(cK!lgWjSZ>H4z
zn)PvQ+CtxgO-f4y?u(qL5K&omW%--Wd$QK>Z{fMC5LhN3d%ik;mB<GD>mSb^`MdQ^
z*qj(iE9ukQCw`tKdvojdH)X;1j|nd6H~OeJ$*D<sO8&|}JZtJE-nZCmKK*XYg~KV1
zI@ev_Wlu>pf4AxP!IPr94|)k6bncqPG+)@n_x<bCa<MOOZ~pnXVp6O7yu{Bp*4vi8
z{`=($ugIw@f{QES((^Lk-%9Y-Z4KXisdG*(--Qo*d0e;rX9=2N!`1b4<*dH{T{|wf
zojRt)?IQLtd7pKZ@^AaZhS~?)w%p+``*9|3uB0cE{O!bVZFe6wy(#nIXo!BpZJqaq
z;q3(fIp(@vNegDXEjBHi%M*SxIOJTu^ycsTqM4Nwrc8U76X&yb9&5AX&9k?%!k=%+
z`zSL}pl(AA`>|}nb7$T5mNx5~vb;HbHAvi8gNys(0~Oib5jTTBZW8_WkbU9IEA6U*
z7F*XiG*!+r@AvQSw45h#d3XP-8l&nt`e)itK05sP$H#vk-}O&Bq<=srZ6j0neco$D
zi*(`@?rBdv&o}kxf%kFFj)z%3RzAJmY#VClG$pBCRMUF}>*Y(HVRyR^=6C&WVYs55
zvNcERz=Hzm-S4V>Dh-yG{EzA4_+E3INAvbRO<%2$vpbt=0~XHGa&1zu`D4ekPa#Qe
zX_2n9>@p6e4XI9QCyVxW_X$l@SSIwl$VjvA<ngv=-cm{H*Xe()%h51mzx%U1Y}OP0
zd%ctS{~UQ;e>{$ZaZUjLmN#b;a$H}Fe@pogJ#m-8`z2?smBpA#3OzNH?TpRmmh7FO
zR6cF9(BX<yT~}di{oW53v^tH`zrEe0_2SsP`KLo49!)dR-<q4`r<}?u$e?<$r0~dj
zAw#d%AN~JK@6Zl&=g?q$R5B$g#PIRQ*jZCQ2*k4cF+9Gl7rtymMa0TIU#3*l+b`{U
zG<TiM`7b_epKNqf{L5a|*<G?rOQbqywvYI~n8iNN*{j?+RNraDFBE;9{v$i6wCE~V
zcl+1hcISkW5BNXYezKmMx0@;K>gxL+UM|kkQQQ2fZ|d1^(gzsxy6w{@JKwoc@I$xk
z{i&OKC#clB$9%k|llZmv>7}WA&Sgg~JU`8?=HKb~H&_2PZgZd9z<sA;`KkG?(pBHn
z7Idx;-&_4T9?||3t7Zya;9-zr%D}*2#lXN|MpXMVIWajSRlmGMAKEzAD=$da_SV%p
zcjo+NqbEk*hTg`;hQ_A8#>Qse#^$EprtF{2^q!gQd&bw-SI2k3r!cpel|M7XVi;f!
zVPF6?gc*>40|^dE&d)8#%t?(e&dklpOw!NIPf5)w&dk-vZMq%#rWcl`7MCRAG25Da
zvolkR@fd7RzQGmAsX3XY_(FsNSC=Kz$kj!eWtpi(_`=$e{2)n8F3BuQ%}B|?6XFI$
z8J}4YUs{}66rYxvgA{*|ZtX<d)tfC?85kxAGcf32GcB<wIU}<y71qs-FD}i^O)RR^
zE2$_s8}6Hb+d^RP>u`a+7MfYw@4f|yoMgHc;TdDGO;P*y-N^?$O3pY5@lN`5{NJy+
zimEq*-l)7ayYV6Ev|9STJ(b4Jd+Yyeov!rfTbF6@^HqG?5pKQww)$TwW#!ecS?ebs
znD5tg!LsUI%c+Wk;W|-XALkym3UZwmxbyAHUc0Twmnq+${WIaD^n?#-7TUR!3Y^x}
z{@C&H<N^M@4^PNXc=#hr=uXwc0wcA1@{_H9m$T+QXqEf(pf%&$Z1dF@_&DYmS?j-V
zIw0SEm6KT^#z5(2kcaOMCC>PdEvhZgqbBV12;TVYC-Y2a9v4T3m?y8iuglE2>0Wfn
zUiGfj5jmF@LA?VRl@k~^GhzjK?Sz+U`ilw{f0hsr+7$CxPKB#(@vJo~l~kKOFF$wx
zVkr~f_m1t~fv^8J#d{Q(&$BJcwtW77N?-6glPXq)KZ@#`PKdf_ovb?exb>#uOs$}`
zCuVuF`5eidxS-xCLHza&ccbY_#=E^6d~5bA?wj@h<`cagU*dam&INzwHfj*aXyQ{;
zJbw49kC2zs3DFf#kKVINZJ9g&^X(5Zyln@2&ipZu>03YF^+KfK$>5Ixg*>k&ZwNk-
z+pe=R?ttZ5$GTU{4~v~X=ic5K==k8ipVNPL%V{}$iq8yLZcNk>{^jsTc3xuah9%8m
zzMgLkCx%4jE;ib!|1f0kqoo@%X3a|HPUZAEvgpCjV9g&}jvp%Ey89^0LN1AM-;AD9
zt5unLO5&c~uK33_v2X80>sc}XXMEV#?exr~G>|d(Rln!^(rJ&cD9Yxh-F-gIc$wtp
z-2Y84awIplyk7Ouy4ma2hvmBkB#S41-828I{VuN~ntQ`9GGD*?J+Eie?UeMpI(m1!
zKVR5uyL!9Y1oiOTscAEd-rm!&?k@OT^V323!rIf*1-F%!ulp@;UwiM1vaZrn)x|fT
zuefhrJSRWSpiS$q(=yG)U4lBteqIxh>(1fi^i&A_E_CebI)mKUq}?W3YuQ;^cBTa7
zd+)UP%98W->%5uf$2{B)&T3e7$mFt&-@1%b2bXuOJjpsYTaEL^*^A9?uAyON-+C`3
z1uo%?yrBB#XjtQoRgO)@OHRC=#adJHJZZ1P#>mSZoOZ<v%dch17%%-%dx~MlfrAQ{
zLMt1zLpSiJWZrBJ3w7S&vu5YE$1Lo<N6HxG%9g#C+`w_vp<8BwV?$TEYgWR+hSFtI
zXL3*O<xN?%y-_!C>g*L~d|7rDF5{59&U*85QL@Lan>WPX-YYUNHsIy&-_LAmK6&#^
zxmWW#6z8nYT_+y+zx=rj%gjg9Ww#w>-qgEtC(og|^`UplPm3*{@Fe2X@38K`3rUaC
zl2<l_ecZy*bzr{S>fDgtr#*aUrYp!ye7I3@x3tl5b)F`v?m4ClZA~k0@90}2rB_wE
zJ^$5Q)>Ax&VVze^wmsNb)9Cc4VG^UIu*Uu=$3?o9uH{<Z^O(6qMniFCK!ola1=H#?
zQ`1_W@XM$jUAL@X;Q5x$*9*DUvN_b1dc630aqi(O%azoB>&#*LJncvEn!W$i9?k6b
zwl+Uo8W3^y=+Zr>{;k<^E_sE5?!-lDTfPSSF8nN(Hhpypk6J@*M%U`?%r6hr=d;TB
z@t#OsS3O&&wMR_q-rh3Fx_94hg(YWSeY8ezQka4Ny`<>HNy|6PyS>lmYeUS_Ytb><
z*`+2omf6(x?q&Y}SLpWJBR1h($A!Ni$#$@gXTQE!#qPgZfl0eq4ELjn+gr{0uB}R}
z)r}W-)31rmXqX-87<X`I_`U}3xo#7T%8!Pd2-;ShEZoC&Va2ZUxCzHk-L(Js|6%L&
zjq*pj)#ubBjjp|_VhWx4bMHw>CI$vJ9tMUuY$Y(pz+!Pxa<P7KerZv1YH_@wer9e#
zeo;xWep-p4k%>ixVSGt`d~r!pYGSTMyrG_fesNK<esN`9a!zKFUfJ6zj`_0<M2??-
z7`!LeY=Y6HOVOKG^<K(Z8?rR$l6SQuOWX?a4a&E9o^E=-Ip5M+fU9w$hjtL(R;8mq
z-hZ$7_Wr*FPXdd*<U*mKW8n`rTc|k+xEV6IB{r^)+rqM~#Zvlk^LBw+kBkNxH=DMJ
z?^z{;<9%yHn3NtVi)KhSH~u;}Bk<%&rHMV=H7~FIc4hh@m#e{Qydk)H<#O{TPq*Cj
z+b2&AWm#`Nr)9m+zlP#x7JnBp8C*8m%KBOPYl5-ds|oAhTk<HUISMJBnZNw;?wgOl
z{7W@rzWhRPm){j%!M+LnoldLHz7Se`ef`P0EkTF!@?)QC1nk;kc|&-%Ph#g9uc!pK
z^HNf5#{=wtt(y?n@%->!R`=Y%nTxL6=Gb9)-6ugHDNNjePvr1hr@)S_Yp3a)y`S%W
zidAvpQA4lw&H3R4|56Lhas=kq3TAGYo2atEHnr?iz1rG2=C>CXOV2aP^Vod5QQP4D
zjfjG|>aC~u-VU57`Nr+VyC>g{r_@!wc<t1;E%J<^eEzIghmLaYT%i;9raLxj&9_IV
zT2rlGnO%A8q5Z6o^~5xb%|Y+ee}rhA)iM&ja@%OCQ|Yo#id#eZwj9s-_r%U-)jx(8
zj%Sapm9t+~E7j7xws6it|6}K4qr#rQd$f4P%KLZg1J)}BB}nfVw|*sRbo+nbivQ-{
zWWTRWi*3B0x!e5V-KDmwr{3Saz4n;pnH@V8S-pA`pu6Qi6Ra)D!2n8>uFGGtwX-uY
zWQj8{WYH>7Vo9)iWm_X221%O>{FAjmx@@lJ+m(uT?JQhpmrQXuyoFPCj{Fv$#}nU|
zL_Do2@;5q``PrfN^t*K><-3@Lf>xvp>11x*ee3VH%cuP3ud{u!{PP!0nLYh&($NBI
zeW%2Fw}>W~=3L|`^XI$nwrxTZTf4i;ZtnVwsnHRy9x)}^&elwxaxRt0s=aegmk#UP
zLmuxB>L(@r+HgWR@<5(p^W6xQqGd^cguIg#f;XP&jd9<)q|*QSwt&g4S6e>@uRprf
z>w!Y_Q_GUcU!PWa#n&6$dQ}s9<aKv<+}6r{T33EvIb?4j!_)rv6!Qzc>8DE<KjvY7
zy~|>`?puvJuP;{?w2D0M+}PTon`3^7d5+xNW!WD?&N3P+c844h+EujeM9WkS+ZwYP
z=FUAwKK$cPe|x56(+QO&)AsD@Iu_Q?tDLf$`NGk9t@-*o2ZBU}0&-;1#gnhLe`;=*
ze*5>+XWph`PjU}l{2|Nrs#W!*mw@B)<GUug9NgZn+@}8O3h!LwrGoR5k6zNLFtM^>
za+$SJL~p&7+J~2Go`!7Lf4^vP+@<aMwJ#?7Gig7u$+uwEUnt%2^?|6%eIL7oP0V|(
zcZmOuDegPx8dSx(QtywWM}5NM*BU0w8ERX0H8To$GVR<Ju}R5!LQ0Zr>+3~rq5Z5o
z4=AS`iulphHPhj{Xs3n9KKn}EQw@TfE89%%C%))fv)9M!?UtlZuX}!_oYZ#Fy*Xbz
zORY<k>*bF{dpA#TyJd4j=G_z57fFpPyi3CMt9R@@Y_$K?A*n|T?rO90&HV8A(1FBI
z?TQYw6>ma~woO+GKKZp~US3ihTe@G{tNha^P4+x>-7<9zhj#hbCqH(nyRLmPYw9K8
zX@&C)3}zRu?q76b;ypgWkWQa7$NkhLdNvA#)ZLro?K<saifQ-Kox&Lly>!jZ(qFG#
zeE;6ty_R-W<v)J^`&jY+tN(B1h@SOfl{RHz6SU>lMrY~>b;+#O6Facr`f<x=-FpAd
zE1&x!(Yf$7!@<di)?^&py}F`rS;_SM=eABfx${Wk;|Y7Fo&Nl6*7qIPD_ti3T5`SO
zK>Np8Gxa{)^4(g~K5hSl*grvD&w0;Ar^G!Fl~SJEGb8#Q*B;-ZpHF95x7xH{?#(@-
zBHK7c@T9|*myz8wx^{6XbE_J$FZZ%LUR0KJCiva!?H^>EyXJTFb1Cf<v7FWw-TRek
zHvbak>46I_1hnpqDRbE-qRnhyQY+F~#}NC$@yi^in1w+v?AEov`<Ezuf4>U9(yuoL
z%TJu~nD#w#5p&Y5q~&kFon5<@k<Zh4+1EMKKHS>YwOeoB{#m<jEa?`|mYa~YOZSI0
z+sV5Up$aF{f}M+}`nc$COKj3f5kIkn^_X$vy3?0lem2gMNH~yryZZMp$=-QW7c2J8
zo4&ZiP5;!z2DjNZUFn_+W<T3rG0$3j%b`X0O_xQ4KRGk4I7hcjs`!n+NzR$v4|9q)
z&8a?DEZw_P+~)Zm{pV(u3L9rc@A_i4)8vCei~e~o(E~ran%?=S&RIRr`QI{kqj@ts
z1g<r7UccXez=Ti9byvHub?K>HdEb7tH2nN`#L{>^my6e~6UpVK+Ph!f6+SzKo#nu^
z)oS4Z<*c8de`h<x>HnaRbLZvs^ty<Je9Lcev0e2E&GKYso!Niq+c*91U%#-jZJU2>
z@9E<Y^bUR9$ZdRh_7U^*P24=wKk^+pT6OjJky(cwpX%}|NlmF{)9w9cpRL2bWTHXP
z)_F$a!dXiU7r&eF<Jdu!6r*EqT|fC&i-^mXuj02j8L^PJMX|1~)8=Jp->;0RHD1$s
z{=B{Pv{`6bR`Z_KZZnq7J-0RNEAy&FvP;v-TQ((mot2m~ul%xofSAuEb1^~91x|+>
z5*|-l5pkhVUAu=P-E@UcR;tg&;`vSmTC)=5wj8YSR=ks$zgd83i_OZL()l(=Sc85{
z$k=^-@w*G{-QJ5*d%G4?mH(*Z@hJH=@#kEoj`u|pd+qPtujLMIX_(o?9l4+F<zJsG
zkE;E0K5z8a>rq#~&uP$N5&h%B8DA~#XIW|oQy0EC+4xu6Y^qC4xJL8)X3O<@2An@0
zeR%aR=7IdJvz50O?YXI){xfc-_S68EeXAee_i@lH+2xwRH@m=3!_L4&t~E{~NF>ze
z#f5V}pN2eBcocE&<wv1es=XOAf9?K1>C<%m)vsq=o|}2l@bUDij~xR=W{6$h<n>XR
zXTif2=bzmc&{%C!vpHcVTVHsqj9sLY;3~b45_c8ZaF3#iMslirHoFe-XShUiu9w*Q
z)Tr9PN0h&DWzb1=!>>E06fNMoAIzgQW#VSbMz1M1KIUC-Ty()iXPc1pz6U#2X}|V;
zESJ0Q_Syr_R{Rm$vamaNu4=>FO{Ww>zr>Yw9Oh=eE%eGDY9DLB_Y<7+7nZQIY`XLC
z^CWY}8_Sm48*1EM7|*%x`-{H6*=6blLc2Gcwe!7`_vE>HSNW{p=k$)>Vwd(`z9%ht
zK=o<VX}`>uTmNPq`4?*Y=s-^Wxi4o6er$TZ>|3jV<%`{gM-69)#-CtsXLnCEce)@j
z^I^zmRoDH86F&rHMe#iQd%!U3?(vv>O%A_QrWK3g4nCexynSza=>C%CxsNCR^}m&v
z`M*l5w}tWkK2`6MyqW6n#Lu1Ek7y2Tu4W2NYqLq4$H~CJ5KE&rDrkf(KQA?}M6V(@
z=WR@6@gpm-y7%!DKUFi#KD$Kfok2@Uu=&d+4Jq%=bbH@0%6Qb8EzR`zwR@b3{-lGR
zcV=!m?eBT+)5|%F{oS`I|9&mcetE|Y=i{#1Oht~kdGBbLmX&=Xiof;v)3Zx;{uuuH
zboH(hdu8~l+`L@wsC%qsoA0b<Hkwc>!6kkEcAV*KeSQ7jfGY>4Ii-mFTGrz<F)MoA
z+lq{Ivz+w1e_p>UTbQ?ib5?iz&6;gFUA8-`HMd4FH<c6way?rrYmp>u_-&udwAYN@
zt%qKmKFZoz!>@a`%x&FTsf4G$^5SP_h90`%pv`V^{NlM*K2zmGEpu6YEH2pwzB<7k
z_%Y|`R~ZhUnZH=rR%$dk^%u+)KHR>k<!09Nb2|K1RsjoNYyVgkFq!jsquv)CwI-fp
zpLVp0ul&>QRP^kUB|oe9THS<zo&8oKO$%4(xGqX7^NA@r&$y~x_mp&W;hu=Ps+#Kz
z)h9f*&!{U;kiI%&ai=I}*^TTaOph6(Rj$sgoS{GMjwc6?=JFo_CLL!lK7HBkUzy-7
zQnMpsuAim$a@R!{8QJ?=cAn6dzxeSI7gNoS{j!f;|GodSLHVbgg!L)$CA_Wmc6w>%
z{EvVB@T-)%Z|5id`DN0sKNl4`rU<?|=B72rxmKfPzZP4OZR&!PtEZ`TAIh+aJU4II
zskeXkKf3y&|CqL)nPQl8m{#Bh@2ww{!g|y5Vo${#T$Q-`JZpHsO>GN_-^S}7oP0YU
z<jm8t2P;3zO4OZtY8|KZPJQ#oqN=qlr}gdsc+}NNKCUv~w83fHPSLpe`95kLtNx@g
z?KSwscWY|#g}C{=t2H;?uITLWdS%wZGb8fLgN8dzum8&aeRk!=`WF^z1%`ae=kzq(
z4k!Eg%|CJG$fv43GR4o840N}@e2^J#!&~7H_U3c)C&$gP&%&>;=&!i>^(RB|g?m9F
zdvqp#+u3b2zi+*NjP>89MGvf{->z5yQu?`T($wiUu1}h~?Ok>ui+r8x*M+%fJ8wt5
zOwrw}CV%T%)1sE#x5461oo`14Oxdt@>b=*SKNaWpuI8BIabnq8M`fo@mui;y8LzA2
zPx$#x2)hw2k|4{Qu(mvb_wM4SxeL1Q%=y!~yY0?e#y<O+r%fL{vn0ba-lj`!v00*A
zW7~cBHuG6O8?`-2$sW56I#hmK6fO~1=H$b@C?Tfl5$ngfRWahxh749l516WoSA6DZ
z&rfxHQL*Sqm%VWpf6My}p%AroI?F4XgZhf|?pxeiVsx0ze$Gj@Rp;NGJ2Ug&690<z
zmqMenc3(cdx7E|-d}rg;qhFRbaQ@rZd0Bf0V|9x4fr5!UjT`n~e)i<}QuEhe{OUG0
zOjWX2f6w%~<*rRT>TawnuiS0Xf3bgacXYv)@{cZi`Y*8C)F=xclr;OC_Kjt8(;KaW
z^0f*F8}G>1Nd04Qzq`OTWLw|g_!Y-WZT%NoKUsC*fVSMN-J8DE3MZR2Y3j}PoN1%&
zsAlkjKOsD}mStv;QqfZ{h7VtLiqF2}zUjrP`EuSOsq;I_WsiJgwS1YPw6pE$!M&e2
zRKF)HJ*oKN@vrx*>6KvPBU?SBkEqFovETWS`*KIftjABMpT7QkPvUpaZ&v1+|J6M1
zU8|Ox8}&q_X}Q0hn8zwfG1Zj;J#y=^uYOta(($jd=0f&+YH#lR{`}~VNBqAlEGvZ^
zbHs0!a<7zh`m3DTrdTSxQWMNlvd`|iBBJ<jqDg|&KhC+2uB`YjF81kr`mvLjr<+<<
zTn-oc^j+P(@v+KL&7gc;nG;<FPrg{Li9ayWHmo(@c7ql3D>+NAMYsDn_bg1faV<*X
ztLBdU!{5s;R84*?xBshvM4|RMwquI9zS(+K{oC#+efEyDTk9_`rS12+sys#UzrKj4
zPha!5%Ky(UEZ{3^`#!}+ZSFgkB%Ar1(Rm6t8@*C98;u=~Mn>)U`RwYn?1{(wW-a@<
zRA;{Oa(@xA=N=dRj^#CPTz7B&=D6jW5u#!0KfbJcChh-OJ!9W;|E1IRZ}{YOdg}>g
z_p_J&1c@#6@DlkE%xU}D>k`lX`#o%)+%GvMnmpitU+b@TxI=tPnOaE`)5Pme`_J#I
zU2f<3xAOWE>7_mDSC4#5cS$r<3M>&*om{PQ_L$I;W1k+Jkqn7*teJgej+$<)dv21;
zRfpBb=5bGI`>1JjtKD5v{M)&}$D+<xdlvtH_m}tLxp#8!p8u;ZG2eV!v(#_qgb$NX
ztUuFPT=c2=)9jl0e*a=@?rE--lWC}1UTt(-W<t5Brs|?2RnoUBVwbDQSzl6DxVQUL
zwRyUq%-0%K<3GwP_ZVqa2WFbuTz$Y)ysFdpewgR3mYKox_hdb5`1AE`;W8WF=iN8|
z^1E7f2E3{fu`>91O4Bi#OZ=dD-6CCa-Q`lApUbBxXnVh1Csh*4p4)uavfo}rA#=`w
z6Z2N4Jh{1wb*KM{?Ily>fB5IccGMPJnH+P<`oh*;TN$o8&ll45|GZzU{C+<8#g#K<
zCNFqc11;v~JgU*0y3{CX>B>`W`X+w-a$EkC3wq`rT3WyK7T=jyNo#lC{w3ZTu$xhB
z+63<XOFG|W_laMOXS?+9$qK0*I{bZW-!`qTPyF&Z<L}<vQvW7Cof3U!K{4~Bhc*Qp
zbZ<Xt6MEUV_?hy&NjI5Ymv+4=(2+XmCAae2e5JlZG4@v{oa#gmm6_dQ`YQSU?8lq$
zZ4UDUSoB`+oVX}oBar1<6Zc1p{j#q2^So+XI}J}&{Pvl7*p|y~l1kw3DKj1$9sK%f
z^DZ{I7$uo0S0*hvJ+0>Eq-jady`*BcKK;Msf&_mXQ}(+j>p409F72MKn)Ty+mz3QT
zsVH9G|L)thPiaTK(s=yyNp(fNfuw$6zqs4k-rPgWzAfrrrZMr5M)s45_w_^PPiNm;
znz?HCGnF5YKdp21HO;v7W6_DP3tpNzM<316+_!OGEHmrO+iH17`R?4h!)x?IBy`T{
z+d@~i+*@`3Ww@Dr;N@Gk7Z|7dZqW7C_RZU_H9LXdAvXW}(^qO5>#Jg8V?xajZo3m|
zy<rz;*WRfbC#y<#XY6lYzW%OUh}pq1_bXOGrRAJ~G9|Y!d9BH5vR!$Zaj)a{O`K)b
zf9-O<-=6BbLHVWb&efSyeK)K>Shrn0ykdGotnaI@t8TmgzU${5_44Xo={Mc0L-%k0
zHFuUzklVZv!HM%DzXghFy8j4ajeI?G>1`36pf>w?hw=-5o|iw;<`H=LRL^p$y|R8@
zZ&!U2yKeP0SD{g(nY}cElWpy`b*nqy*UokOEZ<&N{O0bo##i3CJNI9DdMMyveZgi8
z2jOU~eZ_ixPV<%17XJG2ZueDb2PW6mC$8An)tt1cTcY(#^z+5(|KX#Tm{X#fL=6;W
z7Nn%6AtvM?(@^C)4rP1T85rtK85pFo8B>;7mY9;Smz7_7HR^8hEenDA=j$){#J`i{
znXx4E(RP!UXO~RBR}ysV_lp#hLt+b#ZHw_-RxtP9`|Xo*lAC2c3@)7BVtnIX|NOG8
zyDxd^&w2j8G;V=^jvG^7TJygHZ+E?zzBxGk$d&aUo*th6qV&`uhPga`@pI?QSCU)&
z(8M+Wvc%5XCvg?(>2d!>tIBO%W=Tin-P4ae_iMTOtf%G&b-KHM)xKx>w^wI#O@NEW
zk>eggnvxfUpDs-Fx|nL^n9*=2`2Ckd(lHso7%%J>zr*fTQv7yd`1(83o4G40r*b(a
zw=$`%Sid8pVukrr!MCjUkL5k#tD5v%QPR^UQS1NPA2AwM{lEO4EZ?jB`N5vo;!7BN
zEBy7AESmTxGD_y_Ml~_5Ba>XC4EvRY*fmlNzg{?VLn!Y4Cr+u&6XaOj&aZmgR>QRF
z{-=;5DmHt5>D#>B6EQcz|Ho?&Tj38Xsj~AfNT@f}Gp4^Q<#?RpWY9h7Uc}Dk%b$NT
zX!k7@n&M)*e%EK0h@8a?OT5fFFMglTF;8S4%f^)r3<vY_MZV~G{FwXyMPHNrTocZY
zMK_)YGEHVF77S>Vu}xG7T_JFRGsB~ikL|R3yvi?|g<kd>B6<sbrn;2Z$IegwzVF%T
zDS?f@BhEH|ewzL{bw#Dgy@bHD*i*p_eI_-tCQe{|ns3K@*k^Y2ea0VEw^Tw_uy%R6
zOq{_UTEZ!D!)vv2_}3>=pZCt4FMROw65)yL$<teo3SHj0NbLz%*k7qszM|=TR>%L!
zF>F${IsRs!^Wy_tIj-9-ZCaZeJw3M|`tx?Z+Yh#F`WcrJUA<lJ_KhRAcI*7!xMAaG
zPKo#16@q8^Oq!{<N$`$fiBqyx$)7`~C+JkHveKDZ9q06i-Dsify%Lt^T+Xg{ve{BO
z#Y`Tan0fHWP6tWv>D`<~PG&+bIssaxO@S%rlI3&*-YeT24m#LbF`-T5=}At@39lWj
z%vP>Yvso+c<>xT}?1kexY}&7m@I1(nY+fE(y_4zu+i&5A>=KL^wI5aeta$e5-!!jl
zGhS~Ae91jcWAC}h#re@QzjCbWDOeTq=xfn&DgCX>1H?sy^b52O{nc6}9hp6gC*S3$
z(UcALsvldN=5jjC5nz0!;C({u%7zM_so7J!WWR;<aEip4q;Hrtr~KfoxR2MAi`5L*
z>@fM9*A={B?p4301*>jPJ005+euss}OCbJy*%~p<qni!p<=Waz=3hPS;s+VKYn;M&
zHqB-Z+mPiOonRxi?^I0uu9pWCyk5TkZP`@2=wg~>oeWoyVY%<x4v(g`@_fDZ|Lvyy
z>++oR(#dFkOKWnMsN=-brVC_No!PkV@J;h~QHN`H?b*B2PN1Q;?ew(izHOT$u0MPu
zUB33=I{o(P?3eam%)42(=wu$-E2~+xhtHi=YiykPH7j%`^ZA^d(qD?-<u6=)`#$!^
z{>itNok}Y!+kN70e(L29QJeqBY2B9lC>mvu!>-ZAkz;%$a6(Ado1#N95=W|fLqD%M
zqIBbp>dLAmm$q@Q=~$ZkId1nW`IFU8bN{}pTpxO4YufFA^k~)%7xN-lFFl#(zhd*+
zN9#=Qv`vj&&0r?wcjI2v<cIS%Y|0k>K5go?7dd+`<pu1T|7o9N=56KNbwYJNF1&dX
zQ=Z*d$Ks*m^Ld}(>AUTT-}`r)%irUPZb_c;`ErZqSNRmFw`!NWOl<uRZ`-ZosJza4
zMQZUDW9?Z-r}ymL-8M^Z;>@z8Q|G+Pn{>h0c;8&Lz{SsU=B?E>e;*yPPxF{}XR2h&
z?~n*DEo<#HM>ak?(sXWy<v+PMYBxXp`oMI|aQ>1r-!4T@*x7DizNu%adQ+of+4LJh
zk5=qpPj#2EP|VW0Sm$5!`SFw}*=IHu)_Lz$yMJW+@kuk?zt?bKLuuOn^Zb>KhuTv&
z?UN43E`FYUN@3pIohQ1F8|S7ad;AEVwtGPt&)ZuoYxXsmTJ34$W8U>{zfNXiNv2GZ
zP=s6UwS&pIh1;1u9mU#N-FNKy@K1hweb?U=`pxa94u90sF>%iNJ;~{%in({Sa<wjl
z<*wI^7rSLH|I8>TeHw86ik>~w9ElV1D^9JC4Dqk?etzPq598Lx8@0c^pUm6ITvAl@
zG5P7LLun6>``EYs|MX*(^NQRM?nQ?7S0|e%*Oh<$`0d%(vdFcn%dhWYw>O`2F*^L(
zrj(UUY(AM&a%OVPF`3CBbRaBfiHPM==I5(8YPt5LXyt9Oz1nvEb9M2ZRZmTqr0rlo
zxFa#|Ti2C4bKM_at9)|9(?<Gin|7SL_lwsNS#ewE-O0}1J%ii&K8xq1rju^V{{Gx=
zeB4$=cV5Y<^7w=ZnHdV+2cnoKEx7YO>s9Arruim4SyC-Wo!>2bcV^j<$9Md1nPuC&
zX9~WWzAG<Xl)KlH!|(Ln8SA^(UgZ*g;k9AkmOqkbHcoPxA9Q&^K!S7C8mVoG8TPCl
z&&5{0s?vzJpVG8>S4GW}MIqbdPpQ6|x&7Mo8;`8Qr`C(!e-)GQPP<lrzE4PBxz^h6
z@@Ls+XzyL_&bIC9PdSaa{3&5Ac9&Ft$L-??vRtzMPD#bPj5l$=E&s0a4Z9e-)opdg
ziyZIOIZolX_f@mZt=oD}WwoKVnAcUG?#(PbTAz2Up3J~$`|YsFiAhDl(rY7MXO*vM
zE85C<*<;78)2kFCr*6G>W@VyPM1R`rn21waPu0#zC9dq<{ME;DWoky@vOnyIQ6<op
zilwb<ycY;DFl_I{U+L%Mr@yt$Exv7b>Hb%3gUkG0^DTo^zOH+|&bV*xmVKwY&zIfW
z{kp<Jgwu1y&oUJa?~_mV-)B-#4Pw!aT%>F5yKHW!1H<p8yGP$K-T1TM&Hv>enSV_^
zqpR*v>}*^T>b|~8Hr3}v|A(iq%)eMEu4}&Kw*0<aNx*}}uOplO&HLeTeS)3L)@tRo
z{rBd_Dw|2Q&52*r{$-2bY~D&~K|>e!S!P*>>+k-Vpq=F^!YVBC*h1~X{YA<pa}!D?
z`3M?KxF=cKrks4@m-L1IN?bWFI?tVVTXFyT?qdQ{{*yHh*}3v{Zt!i+uyk4*`QYKS
zV)Ki(cQcMQzKwc(V~)_Qzp)#eJ07(z*PJ(Zi{DTFr+c@(dX=D`arE?zB>lY3ean{5
zTvO~4Ypf>6EK@P>sr3m}JGq6H&s9zKb1%zqiut3Gv4th#D(^CeU+*1-eop)S<-vcB
zNyqqSGkt5Y@15b<Wa;an%&{@QE${=o&a=gn3^<oh^W3w+bm6Xxk~%z-+0uNJb1EmP
zl?uA`YTy1;`^Z0#r-#imBy{V?X+KovC9)rtmY04mf3Hqv;r;XaXSU}Ruv;ybczcd_
z*OAE_$BnNEho~J&6c84OR+3%#-SjP+%c&v;C!xnH4AMGh1@RT$y0kU3)%*W`U7=Yy
zA;D7*7~HC=W>q%joE@;npeOpjlESO*X)i7bxh;Mgai!_yQseFHhad7<vF>9L@ilZU
zX%qbRT!pKq|8>rT$RqCio+g@XS4!%Q?NM_)VtuPooXzgF+3|hMy=!K7tut8KQ@O_b
z9rGf_EF->^jwY-*pNd%AS{?esKlUr9v~&KF-t6{a{=&uo-EV9?B%yI$YO7+<#p(&t
z3V*KtzHXp$<eF~HyYE{XZ(YA-kalWA+qA}8nb{wt!$cMrZ0qUdef8b^iu5b1*T-)+
z#?1PVcKCwTEWH3}YlS(6Gk?A4F5&H0ep;Avd~HaB?_SfgC??Mz)!)QR-_+#BB%My|
zHYj8MEw;49U~}`oUyoM&>|FV=^YF{a(=s0qs{J(c^9&K$^5D^Wr|A>LEjqg$m#Qrm
zS+kGLTH@uZHW8JdNm=|XE{7&=RX8Ag!Km0t?cj+A#p2S5w^koXi+-$9cvp4Bx~B)~
zGJKU!JJ+A}_{(|3@WZ}d)!P>qYO!8V<>LG2-P-hh>$+8q-J606e6O0Utm9|fJ1=Da
zSHJxeTQ(ToNb%-*W7>Rzarat-u;U5L;YUnm-Xy(X4`F$1pY+8#!sA=>kCLQcGmgFZ
z6rau<ynkZNOhK8MvpmJmCH$RPzcVdaLVs>*-HR%_Q%BwYW#;WXa<YE&#@EX(e3{L*
z;Ji;(hw?5FH}fb9*EdcPHHNd-SWhiax46$CpCHBRdE>*H=yTHrrW`)P-L*4%v(%|s
zPhVYSYGG+*o_xn7p;|!rnvr>GG55J^cIL;UH|+nm)AC-@y9a^K#Qv<S%{wQ2@co}V
z-&gidP?xCK>}-B&*U@Wp%7xmNe2f+e=(+GhRm%0tqYeHXe@wo5UOy=89xTjc;!@F7
zD`Uvbbw4IsQsv9cpVL%gdfXPK-j532(-k^JgJT6};ETm>x+|6Yr-<w=;c({B)RS}<
zdy{1o5U^q^$Daeyi>|5v;Fa5}bZ1)0d-KvI2b2!IQM*4YZqA3A>P7!w>!-iJaJ;3B
z)3sc1p~!EaFLLHn>J>Z}%n=ni>OKG5wbe%TFP{j!zpa?|Y{zQ(XR#~~Z6r2VriI1N
zU)Z<q#Vkg#ujz?3k!F38p4-~3v^R6QJ-M@7;t>~@uF|9l@9ui!?uj(GeQ0f_!lRz)
z2Ul7br!{8I^|`j%e)nwCpnVL+amAa?|8OtK?Jl|9t;%N>IrUav-@f=YCw6XD;!*MI
z@ZX`ar`Av<FJj?M*&El7<*QGZKWG0Z=8J;W;ke&vTP0@&S+aS~i!_vCKOp=;=?=?c
ziz8+;1>UT9Ar+!j$}F=?y8KA#MTtd9Ji-FA4TV$eJ0DutEZ$r)FHP^j{~YyQ*BH~4
z775H;RTcc`)t9Yt|JiC2eoN1d6zQET(J0-$xHC2RicRfze$jvVMLxO{j<Fu7t^WCJ
z{xkjmi6_4<Teq}+7Eh|s@|GtXSSLwrDmNBrvP|2>x3@vz5W~hVEUGak2j*+dU<f^T
zGjBb+;gf8K$)$H)E^`+2%(!mGd|f*7-zE=%3j)mtI2z_;w}c(Ye0{f$^W4*`TYo+L
zboT1(*UviYneR36v){jX^mw`Y^yk<Ar<Kf|6F2|=uVXdeKbkZ63vLcw@zPz#C4bX<
zo`e4%+t)5p*w7rtGcS08f&Qg=i5nQsD6C8CX??D7x=HF6!;Zp4-JQ`@o&RS~==d0P
zAVHHcF>WDa2~)TaV~bJY?v4ZP%=w?6w^&3($Voh(Xz}bq>b%U*B9~;zo}eO^^*((i
zw_h#TA6&HLx|zyJ!CH$e)svPq1nik}YvFxM$%Gn(vgAs+W7GC5w@%`Fr*S!ETHb9B
zGYb_y#Ug{JpJx}#eyK87SbESX!(yAVP?2-wt9WyRhu>$ja-~mcTO5{_R;d#p@9>PZ
zVbUzmCw6)YlBruAA0^w$ti5_@OQQCirk#xUPsH5p_+em>det^<j+W`H^VPSL#m>&I
z5-F{IFrn$L4eJz(wKcMD4lF;QyW#1l$?IqBnP_s#&$gc_`%0^?nD0IZhpOO9i#1z%
ze+bLW+^}`yl;CY!p9cSqTz%q$`<189+1NYdnHEhboFwbt?0D&S7hg5|@1|M)%knk(
zb&hKmIjHpT&)AV+l)%udGdnVFvYvC!x!C%B#*-`EHtewDu~nV1VT$66j>A0%+1Bw~
z;<J$B-QOg$X8Oy{i6?TG#<OMkXtb-j)zoTD3EOmfbMidVMXyhrtEd03)B3?WEoI)-
zti&+Ok5l6h3Y-e)HI6y`!p7`g(6PT&pWgj>(<yM{)Q&F=OS=l0t{YkP_imq3n67?Z
z-Jhji`~D^7ty=pELr&kYF}o#sds9K7@C>H?CtVI~sl24t>&VZf{qdt!ZE`@D^X7{3
z7C)J?&1rkt*D+sucJk`g<Ci~Aer=xq?6rUR^ZeO|5{2}_g$>U8NuRRTwD-1c={tVc
zQ?hF7+Aqp)mh^Yr=jwXNDzKzF?98=a5;H`;ec5`z#!%>~?OeS}y0WY`i|fvxi_=fi
zj=gpD+%@iha@Mo$J?!tCyVkXBN^bPGuTg?GPHq2E<Scq$Zo~TPUE8M=M%$bO3GVQ?
zleRMH4ztb4sE_vw)1Mn;-?>@N6t&%Yqws}YnrrW==6v5)HPQISR^2bQ9UU<>rh2b!
z>U&@8nW8gg<@-79r}C6H8FyQJ<a<0}#-#f*A06hKug&!9ChwX*kFF^{zIyq&%ku(`
zNjCD~i{`|i3R*kO`q8gw|3&L%noCO8)-!)(S2*l9{n$}sCx;a$&oRyYIx){qcDDNj
z#*9Vbf7X5Y`qH{Y$X9sUihqG+2CBU^5*w-($w}r1?+!RNZ@YZ^-kUoghVgx_^FN(f
zC=&Icpes)-D(_}>k@UT);v17US~H%>En{c?vyG=J(x$I+&zC(LG%JL1LL09aADS;J
z)qYYyKHIqQ;IpJz0)_FL+AQT0v!4|g&Yk7PB2jpu=P7I5sogv`FBmM@*8QvNp5&Lj
zBX_$^8y9~u<60aVbDHDeo&@!+xu%s`tT&xjO3hyAnr>Ki=X><c+IY>LQ{{E>7vFEI
z5IcP#t?#4nH!aqx8)92;GzXr%Wpk1FXw^(*Q`g^$VJ8DMdy;2auiU1+pueGQQ^%$Q
znf{I9ze`fidn~gLD!aP7FEYGs?#T__`sz>29S`{Z^*JQ9!n;Pi#hE8Yw{@lYfsY;G
z(_Q*L$oza{zw4S|u7CI3+lTtazq0JiTPG5`{86dsGr!YUHs_r=uYYgu{%MI9W<Bm`
za9u0d-7dN4Z$e1$uYX^JCup&TUeErxCn@x9z!dxYZ^G^d$Vjx^dcR4#Gdf>mTea*<
z-lK8p6?2~7yc$)1UV741-RI9gsQeD#`c~2Ad+1_%0IzXjX3EUOoJWDtxyr1$Ti$(s
zQ}yte-bTaosu~(s&K{5vUUl6-@S$*N=7rUXMtxH^o_7)W+@x$_6f*bh6V|@eIy2YD
z4?g^qn7Qcbhn*IA2NidmoDue#Ym2;H;G0N6)>$=a3`cW*F8iAz#`gL3FXgcF>~`y=
zUd>y_=lWpIYr7hyY{xU19z|OPew?rMXyH9!c5uT?CBy5YD@3Kf&)mj!*mg&l>D4%^
z{TmtPe>anB?c7mUw0hg|n4SeJNA9VLJkK~Y>)XRR)hg@E%w5mdHggDZnCs8g|Gkqx
zZTHnr6(6=Ff4}x+L%QEad#M$&GmNiqI^UARdQ9*_#^n>Tr8_=}-zuBE<%rj9=K6-6
zylO7f5>H)7dfdGtwP?fo&Dnp2o-NI@IuNz~5Tl$#mA~w_BL9+Ghx@W#tXcSk>3g;F
zN^Tp8Z|&CM2A$Va<u3hs5pjjbk!$yYR)v7@AF697sdy~X(BpHGSnykS*`@&QBgwHT
zO7o{OdkU-%+g~#A-euk^dHnnHt{C35`)L?lyZhL#PbMy@2Q=Qt^=|I?`%gvkNNlAZ
zZ|nENdx{ojwFI7>8=4Y7d7sxUM_28v^&GlW_&g^U-B6suDG{lDcZv$j?e_^Ti&>Og
zpF5=nZzwN&?YKH?0>9}0zeko=IWKr^e)j4MJI=mnmpxl=oxIxm+{>j<|LVI9?Wa=@
zw*Gr9o;qn_Y3j@%&HIzmFR^XP-4?&|tdw)9MMCnnr!%Xfsx@w>{C?Y~x3r3%?|PP;
zoa?46lbrKMDyBJpZNDpBvh_>uwmh9*ACi0WJ_=RNh~g4Hp~W1oImM^Q%gJ(uvj*=q
zU!^Izx#{QM-&n4)az(DD@JDqU!<F&!a?6TKBj3fIV?W^H9kS$A%>zcQOK*8op2~i`
zS8&1l+)szd9jd<8Zu5`ZYilgl%e*ylmhCxSK8^do{uB$Rx_Qkid;0d=@5U`z^7?;g
zgw6J1?~HKx^Y!S)$83j|DC8X2!l13{G?T@E<IyArraqM}`R~h)FrQqdH@T$Val;&2
z`(LutA76>Qb9MXO^#aL(O%bOweYY*>eA>j3>NNH40m1AYNsQesPmkK(YBqbbZ+?wI
zuEev=iSbXCwMVNQ%bgHEWm=<;{@c{4Hg2M~>+kaDcCTEL>E4<XcE#dn*iD5eYU?h<
zt+X%uf3!64LDu~4*N1AEk6V0xy=43K_wD<huWq^P;H`gd`Imdu<#wxIhVC)mzfN2&
zb+gE=#_L~#Q^FrOTrk+pm90@Fz2ns6_h-76g*E+jd^%4yZQuGemak{r<hSOSe&$+J
zO_PnG^VU=I%&$)4`r~`I$n}r5wwKJ=t!2CKieA6Wy5~;I{p2;yg4TXLq0_{i&+qTm
zIB~k_sjj(tmbLcp^5EcW|DUI4ExEmN%RJ@hFXFb!oK~s5{{QW-_zRcJCYRjyt+*ns
zYUj`)JpEXV_v}4vt9I(G`qr@ULE;WkWz!oTmn^LB76#0zkh^WSqxh(qNSLIb1n<wh
zlouN=h&xEIa9J`d%RJoLy7I<p9@&U$E=AWP|MqUURPn99(C~4X>5kJ5-He(N?0YBa
zx%(Dv$`&}dZ~2lLlFW9KKe%g(?v*Z)U0`{ze9qn3-VfP=FW7(iy!`Y2HK(TTI<hbI
zzfAOJpA_YFN8Hx@Dd`mt`Kj4$WF&HFWyr1tXZI^ah)nw^)L+#V_ob`*rqvq1yH}1K
zTN0{i6I=ErDMVDU)`M&P-Kl9itM|rj|L|*-M0Dz(`nVr*C$;P!ChJG8sP8eIAb0(s
z)R$BJZu457YRKIRlQHx>e_^HgtUa$+T^61{Ghgv-q{7C7@tqCtAMf1L<6Ib7`J(#W
zJX?p;R+na{C%o9#==^cg{W60j>mO~F68!}Ny2jf}@ANS^PPoSTeq*@BZaJHrJ3*)W
za*I5-Jes<%deyyU{al+RXHLAoga5>an^D}mE$W2#`)<|_a}Im)$a~+G(1msp3(GEF
zKXmtQ&XzS^@q!ySy|^RqXguR!tzn5^nO)aCjiSJWl{dP#O<Be~>9lDb*ONQJJx{&&
zrDZLgm%32nMexUo2UWIyn5eut+^{!SL}pIXgej#9_pI@*d>dIg@zmDmXKod~-CpPv
zbv#8{y|41m*F76<8nkTsCFPp-X<2o%PDG!m*CfdaP8ExoydOPCpT-c+o{`gjO6zRH
z_Odqhut!1LE-wFHaix{j%Ft=K<0C7Z2}%7oEI(iWxBZUbij&SaZ+^dfXI0nnlL|uB
zOaB&ofBukDocQ7I%r(b7n_jZ@JXu~)qf#(4sk~DsPxSI>In9GM@>BQmxUW=MK66!g
zLf?V@ABOHXz4CZ`Gt1d3HEga58QtxkQF%J`bWnK)%awK0T-&~WzjAl6=E?cyrRw`@
z!<}O;y!>eHvvkJ-Ynd0;Z?w(}++X!5@T&B)G+zzR^JgFFZ|X}Gf229N>gEM2ZHu=D
zI*LSPPA>2{@$<_0LzA8;ovisfJLq`K-`Um9SNF7Eo5puzo%em)E$`)SmGiI7<9}Np
z;LXS+!i@X05C#SY21W)3h9!+47W#^QeRKg_XNMqL1KN;?eliEhaELX(u}z|3SW{6@
zglr_X&6WrwtGS6e^#t42ON1SmlZK#ulps487z7yJI<oK(ZwF}281`M2u(-gq4YaQk
zVOtXUw!wE<;<gL4V-aE3KJx8??7GBl5oq5f!Xj~AvV#z@3lq0xsJ<#8-!jOqOxzZs
z`sytC79n<N;<gO5PZJS@T6|;&VItD5P2ARj_H81p>m<rL^j(}V(;*Y+==(T9rb9}C
z>)1@kv#S%4Ss`0N(Dx@HOpX*GCYUJMt%U9t^ld2!x4aXhkz25CQbBeXw)L?Hcm0*4
zfxAE@Up{QLEW$0A#T{rx2FNXt!c|<87`MRJXP_o9^c5N)V?hb*ZDSlZV-f2$5blGd
mRP<RNgh9cESlkCSC?`KXz?+o~q*#bSh#`fYfkDRw!~+0sA@0}!

literal 0
HcmV?d00001

diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/soclabs.org_user_ft1248x1_to_stream8_1.0.zip b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/soclabs.org_user_ft1248x1_to_stream8_1.0.zip
new file mode 100644
index 0000000000000000000000000000000000000000..bd8f20f74f0cc9c44da89578d526ab1afbd7f276
GIT binary patch
literal 22475
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
a;5x}7z?+o~q=uD&l_7wUfgv>v!~+0G+E0-H

literal 0
HcmV?d00001

diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/ft1248x1_to_stream8.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/ft1248x1_to_stream8.v
new file mode 100755
index 0000000..6c55abc
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/ft1248x1_to_stream8.v
@@ -0,0 +1,187 @@
+//-----------------------------------------------------------------------------
+// FT1248 1-bit-data to 8-bit AXI-Stream IO
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// Abstract : FT1248 1-bit data off-chip interface (emulate FT232H device)
+//-----------------------------------------------------------------------------
+
+
+module ft1248x1_to_stream8
+  (
+  input  wire  ft_clk_i,         // SCLK
+  input  wire  ft_ssn_i,         // SS_N
+  output wire  ft_miso_o,        // MISO
+//  inout  wire  ft_miosio_io,   // MIOSIO tristate output control
+  input  wire ft_miosio_i,
+  output wire ft_miosio_o,
+  output wire ft_miosio_z,
+// assign ft_miosio_io = (ft_miosio_z) ? 1'bz : ft_miosio_o;// tri-state pad control for MIOSIO
+// 
+// assign #1 ft_miosio_i  = ft_miosio_io; //add notional delay on inout to ensure last "half-bit" on FT1248TXD is sampled before tri-stated
+
+  input  wire  clk,             // external primary clock
+  input  wire  resetn,          // external reset (active low)
+  
+  // Ports of Axi stream Bus Interface TXD
+  output wire  txd_tvalid_o,
+  output wire [7 : 0] txd_tdata8_o,
+  input  wire  txd_tready_i,
+
+  // Ports of Axi stream Bus Interface RXD
+  output wire  rxd_tready_o,
+  input  wire [7 : 0] rxd_tdata8_i,
+  input  wire  rxd_tvalid_i
+
+  );
+
+//wire ft_clk;
+wire ft_clk_rising;
+wire ft_clk_falling;
+
+wire ft_ssn;
+//wire ft_ssn_rising;
+//wire ft_ssn_falling;
+
+SYNCHRONIZER_EDGES u_xync_ft_clk (
+	.testmode_i(1'b0),
+	.clk_i(clk),
+	.reset_n_i(resetn),
+	.asyn_i(ft_clk_i),
+	.syn_o(),
+	.posedge_o(ft_clk_rising),
+	.negedge_o(ft_clk_falling)
+	);
+
+SYNCHRONIZER_EDGES u_xync_ft_ssn (
+	.testmode_i(1'b0),
+	.clk_i(clk),
+	.reset_n_i(resetn),
+	.asyn_i(ft_ssn_i),
+	.syn_o(ft_ssn),
+	.posedge_o( ),
+	.negedge_o( )
+	);
+
+//----------------------------------------------
+//-- FT1248 1-bit protocol State Machine
+//----------------------------------------------
+
+reg [4:0] ft_state; // 17-state for bit-serial
+wire [4:0] ft_nextstate = ft_state + 5'b00001;
+
+// advance state count on rising edge of ft_clk
+always @(posedge clk or negedge resetn)
+  if (!resetn)
+    ft_state <= 5'b11111;  
+  else if (ft_ssn) // sync reset
+    ft_state <= 5'b11111;
+  else if (ft_clk_rising) // loop if multi-data
+//    ft_state <= (ft_state == 5'b01111) ? 5'b01000 : ft_nextstate;
+    ft_state <= ft_nextstate;
+
+// 16: bus turnaround (or bit[5])
+// 0 for CMD3
+// 3 for CMD2
+// 5 for CMD1
+// 6 for CMD0
+// 7 for cmd turnaround
+// 8 for data bit0
+// 9 for data bit1
+// 10 for data bit2
+// 11 for data bit3
+// 12 for data bit4
+// 13 for data bit5
+// 14 for data bit6
+// 15 for data bit7
+
+// capture 7-bit CMD on falling edge of clock (mid-data)
+reg [7:0] ft_cmd;
+// - valid sample ready after 7th edge (ready RX or TX data phase functionality)
+always @(posedge clk or negedge resetn)
+  if (!resetn)
+    ft_cmd <= 8'b00000001;
+  else if (ft_ssn) // sync reset
+    ft_cmd <= 8'b00000001;
+  else if (ft_clk_falling & !ft_state[3] & !ft_nextstate[3]) // on shift if CMD phase)
+    ft_cmd <= {ft_cmd[6:0],ft_miosio_i};
+
+wire ft_cmd_valid = ft_cmd[7];
+wire ft_cmd_rxd =  ft_cmd[7] & !ft_cmd[6] & !ft_cmd[3] & !ft_cmd[1] &  ft_cmd[0];
+wire ft_cmd_txd =  ft_cmd[7] & !ft_cmd[6] & !ft_cmd[3] & !ft_cmd[1] & !ft_cmd[0];
+
+// tristate enable for miosio (deselected status or serialized data for read command)
+wire ft_miosio_e = ft_ssn_i | (ft_cmd_rxd & !ft_state[4] & ft_state[3]);
+assign ft_miosio_z = !ft_miosio_e;
+
+// capture (ft_cmd_txd) serial data out on falling edge of clock
+// bit [0] indicated byte valid
+reg [7:0] rxd_sr;
+always @(posedge clk or negedge resetn)
+  if (!resetn)
+    rxd_sr <= 8'b00000000;
+  else if (ft_ssn) // sync reset
+    rxd_sr <= 8'b00000000;
+  else if (ft_clk_falling & ft_cmd_txd & (ft_state[4:3] == 2'b01))  //serial shift
+    rxd_sr <= {ft_miosio_i, rxd_sr[7:1]};
+   
+// AXI STREAM handshake interfaces
+// TX stream delivers valid FT1248 read data transfer
+// 8-bit write port with extra top-bit used as valid qualifer
+reg [8:0] txstream;
+always @(posedge clk or negedge resetn)
+  if (!resetn)
+    txstream <= 9'b000000000;
+  else if (txstream[8] & txd_tready_i) // priority clear stream data valid when accepted
+    txstream[8] <= 1'b0;
+  else if (ft_clk_falling & ft_cmd_txd & (ft_state==5'b01111))  //load as last shift arrives
+    txstream[8:0] <= {1'b1, 1'b0, rxd_sr[7:1]};
+
+assign txd_tvalid_o = txstream[8];
+assign txd_tdata8_o = txstream[7:0];
+
+
+// AXI STREAM handshake interfaces
+// RX stream accepts 8-bit data to transfer over FT1248 channel
+// 8-bit write port with extra top-bit used as valid qualifer
+reg [8:0] rxstream;
+always @(posedge clk or negedge resetn)
+  if (!resetn)
+    rxstream <= 9'b000000000;
+  else if (!rxstream[8] & rxd_tvalid_i) // if empty can accept valid RX stream data
+    rxstream[8:0] <= {1'b1,rxd_tdata8_i};
+  else if (rxstream[8] & ft_clk_rising & ft_cmd_rxd &  (ft_state==5'b01111)) // hold until final shift completion
+    rxstream[8] <= 1'b0;
+assign rxd_tready_o = !rxstream[8]; // ready until loaded
+
+// shift TXD on rising edge of clock
+reg [7:0] txd_sr;
+// rewrite for clocked
+always @(posedge clk or negedge resetn)
+  if (!resetn)
+    txd_sr <= 8'b00000000;
+  else if (ft_ssn) // sync reset
+    txd_sr <= 8'b00000000;
+  else if (ft_clk_falling & ft_cmd_rxd & (ft_state == 5'b00111))
+    txd_sr <=  rxstream[8] ? rxstream[7:0] : 8'b00000000;
+  else if (ft_clk_rising & ft_cmd_rxd & (ft_state[4:3] == 2'b01))  //serial shift
+    txd_sr <= {1'b0,txd_sr[7:1]};
+
+
+//FT1248 FIFO status signals
+
+// ft_miso_o reflects TXF when deselected
+assign ft_miosio_o =  (ft_ssn_i) ? !txstream[8] : txd_sr[0];
+
+// ft_miso_o reflects RXE when deselected
+assign ft_miso_o = (ft_ssn_i) ? rxstream[8] : (ft_state == 5'b00111);
+
+
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/synclib.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/synclib.v
new file mode 100755
index 0000000..1daf61f
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/src/synclib.v
@@ -0,0 +1,139 @@
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module SYNCHRONIZER (
+	input wire        testmode_i
+	,input wire       clk_i
+        ,input wire       reset_n_i
+	,input wire       asyn_i
+	,output wire      syn_o
+	);
+
+reg sync_stage1;
+reg sync_stage2;
+
+  always @(posedge clk_i or negedge reset_n_i)
+    if(~reset_n_i) begin
+        sync_stage1 <= 1'b0;
+        sync_stage2 <= 1'b0;
+      end
+    else begin
+        sync_stage1 <= asyn_i;
+        sync_stage2 <= sync_stage1;
+      end
+
+assign syn_o = (testmode_i) ? asyn_i : sync_stage2;
+
+endmodule
+
+module SYNCHRONIZER_EDGES (
+	input wire        testmode_i
+	,input wire       clk_i
+        ,input wire       reset_n_i
+	,input wire       asyn_i
+	,output wire      syn_o
+	,output wire      posedge_o
+	,output wire      negedge_o
+	);
+
+reg sync_stage1;
+reg sync_stage2;
+reg sync_stage3;
+
+  always @(posedge clk_i or negedge reset_n_i)
+    if(~reset_n_i) begin
+        sync_stage1 <= 1'b0;
+        sync_stage2 <= 1'b0;
+        sync_stage3 <= 1'b0;
+      end
+    else begin
+        sync_stage1 <= asyn_i;
+        sync_stage2 <= sync_stage1;
+        sync_stage3 <= sync_stage2;
+      end
+
+assign syn_o     = (testmode_i) ? asyn_i : sync_stage2;
+assign posedge_o = (testmode_i) ? asyn_i : ( sync_stage2 & !sync_stage3);
+assign negedge_o = (testmode_i) ? asyn_i : (!sync_stage2 &  sync_stage3);
+
+endmodule
+
+module SYNCHRONIZER_RST_LO (
+  	 input wire       reset_n_i
+	,input wire       testmode_i
+	,input wire       clk_i
+	,input wire       asyn_i
+	,output wire      syn_o
+	);
+
+reg sync_stage1;
+reg sync_stage2;
+
+  always @(posedge clk_i or negedge reset_n_i)
+    if(~reset_n_i) begin
+        sync_stage1 <= 1'b0;
+        sync_stage2 <= 1'b0;
+      end
+    else begin
+        sync_stage1 <= asyn_i;
+        sync_stage2 <= sync_stage1;
+      end
+assign syn_o = (testmode_i) ? asyn_i : sync_stage2;
+
+endmodule
+
+module SYNCHRONIZER_RST_HI (
+  	 input wire       reset_n_i
+	,input wire       testmode_i
+	,input wire       clk_i
+	,input wire       asyn_i
+	,output wire      syn_o
+	);
+
+reg sync_stage1;
+reg sync_stage2;
+
+  always @(posedge clk_i or negedge reset_n_i)
+    if(~reset_n_i) begin
+        sync_stage1 <= 1'b1;
+        sync_stage2 <= 1'b1;
+      end
+    else begin
+        sync_stage1 <= asyn_i;
+        sync_stage2 <= sync_stage1;
+      end
+
+assign syn_o = (testmode_i) ? asyn_i : sync_stage2;
+
+endmodule
+
+
+module NRST_SYNCHRONIZER_LO (
+  	 input wire       reset_n_i
+	,input wire       testmode_i
+	,input wire       clk_i
+	,output wire      synreset_n_o
+	);
+
+reg sync_stage1;
+reg sync_stage2;
+
+  always @(posedge clk_i or negedge reset_n_i)
+    if(~reset_n_i) begin
+        sync_stage1 <= 1'b0;
+        sync_stage2 <= 1'b0;
+      end
+    else begin
+        sync_stage1 <= 1'b1;
+        sync_stage2 <= sync_stage1;
+      end
+
+assign synreset_n_o = (testmode_i) ? reset_n_i : sync_stage2;
+
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/xgui/ft1248x1_to_stream8_v1_0.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/xgui/ft1248x1_to_stream8_v1_0.tcl
new file mode 100644
index 0000000..0db18e9
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/ip_repo/ft1248x1_to_stream8_1.0/xgui/ft1248x1_to_stream8_v1_0.tcl
@@ -0,0 +1,10 @@
+# Definitional proc to organize widgets for parameters.
+proc init_gui { IPINST } {
+  ipgui::add_param $IPINST -name "Component_Name"
+  #Adding Page
+  ipgui::add_page $IPINST -name "Page 0"
+
+
+}
+
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/driver/uartlite.py b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/driver/uartlite.py
new file mode 100755
index 0000000..4da3b33
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/driver/uartlite.py
@@ -0,0 +1,88 @@
+from time import sleep, time
+from pynq import MMIO
+
+RX_FIFO = 0x00
+TX_FIFO = 0x04
+
+#Status Reg
+STAT_REG = 0x08
+RX_VALID = 0
+RX_FULL = 1
+TX_EMPTY = 2
+TX_FULL = 3
+IS_INTR = 4
+OVERRUN_ERR = 5
+FRAME_ERR = 6
+PARITY_ERR =7
+
+#Ctrl Reg
+CTRL_REG = 0x0C
+RST_TX = 0
+RST_RX = 1
+INTR_EN = 4
+
+class UartLite:
+    def __init__(self, address):
+        # Setup axi core
+        self.uart = MMIO(address,0x10000, debug=False)
+        self.address = address
+
+    def getBit(self,num,pos):
+        return (num&1<<pos)>>pos
+
+    def setupCtrlReg(self):
+        # Reset FIFOs, disable interrupts
+        self.uart.write(CTRL_REG, 1<<RST_TX | 1<<RST_RX)
+        sleep(0.0)
+        self.uart.write(CTRL_REG,0)
+        sleep(0.0)
+
+    def currentStatus(self):
+        """Returns object that specifies current status of axi core"""
+        status = self.uart.read(STAT_REG)
+        return {'RX_VALID':self.getBit(status,RX_VALID),
+            'RX_FULL':self.getBit(status, RX_FULL),
+            'TX_EMPTY':self.getBit(status, TX_EMPTY),
+            'TX_FULL':self.getBit(status, TX_FULL),
+            'IS_INTR':self.getBit(status, IS_INTR),
+            'OVERRUN_ERR':self.getBit(status, OVERRUN_ERR),
+            'FRAME_ERR':self.getBit(status, FRAME_ERR),
+            'PARITY_ERR':self.getBit(status, PARITY_ERR)}
+
+    def read(self, count, timeout = 1):
+        buf = ""
+        stop_time = time() + timeout
+        for i in range(count):
+            # Wait till RX fifo has valid data, skip if timeout exceeded
+            while (not (self.uart.read(STAT_REG) & 1<<RX_VALID)) and (time()<stop_time):
+                pass
+            if time()>=stop_time:
+                break
+            buf += chr(self.uart.read(RX_FIFO))
+        return buf
+
+    def write(self, buf, timeout = 10):
+        """
+        buf: iterable
+        
+        """
+        stop_time = time() + timeout
+        wr_count = 0
+        for i in buf:
+            #Wait while TX FIFO is Full, stop waiting if timeout passes 
+            while (self.uart.read(STAT_REG) & 1<<TX_FULL) and (time()<stop_time):
+                pass
+            # Check timeout
+            if time()>stop_time:
+                break
+            self.uart.write(TX_FIFO, ord(i))
+            wr_count += 1
+        return wr_count   
+
+    def readLine(self):
+        buf = self.read(1)
+        if len(buf) ==0:
+            return ""
+        while '\n' not in buf:
+            buf += self.read(1)
+        return buf
\ No newline at end of file
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb
new file mode 100755
index 0000000..cef03a2
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz104/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb
@@ -0,0 +1,372 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# SoCLabs cm0sdk mcu overlay\n",
+    "This notebook demonstrates how to download the FPGA overlay and communicate with programmable logic state.  \n",
+    "\n",
+    "## 1. Instantiating an overlay\n",
+    "With the following overlay bundle present in the `overlays` folder, users can instantiate the overlay easily.\n",
+    "\n",
+    "*  A bitstream file (\\*.bit).\n",
+    "*  An hwh file (\\*.hwh).\n",
+    "*  A python class (\\*.py).\n",
+    "\n",
+    "For example, a `soclabs` overlay called `design_1` can be loaded by:\n",
+    "```python\n",
+    "from pynq.overlays.base import BaseOverlay\n",
+    "overlay = BaseOverlay(\"soclabs/design_1.bit\")\n",
+    "```\n",
+    "A `drivers` directory is provided for device driver templates for comms channels. (uartlite example).\n",
+    "\n",
+    "Users can also use the absolute file path of the bitstream to instantiate the overlay.\n",
+    "\n",
+    "In this notebook, we get the current bitstream loaded on PL, and try to download it multiple times."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "application/javascript": [
+       "\n",
+       "try {\n",
+       "require(['notebook/js/codecell'], function(codecell) {\n",
+       "  codecell.CodeCell.options_default.highlight_modes[\n",
+       "      'magic_text/x-csrc'] = {'reg':[/^%%microblaze/]};\n",
+       "  Jupyter.notebook.events.one('kernel_ready.Kernel', function(){\n",
+       "      Jupyter.notebook.get_cells().map(function(cell){\n",
+       "          if (cell.cell_type == 'code'){ cell.auto_highlight(); } }) ;\n",
+       "  });\n",
+       "});\n",
+       "} catch (e) {};\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/javascript": [
+       "\n",
+       "try {\n",
+       "require(['notebook/js/codecell'], function(codecell) {\n",
+       "  codecell.CodeCell.options_default.highlight_modes[\n",
+       "      'magic_text/x-csrc'] = {'reg':[/^%%pybind11/]};\n",
+       "  Jupyter.notebook.events.one('kernel_ready.Kernel', function(){\n",
+       "      Jupyter.notebook.get_cells().map(function(cell){\n",
+       "          if (cell.cell_type == 'code'){ cell.auto_highlight(); } }) ;\n",
+       "  });\n",
+       "});\n",
+       "} catch (e) {};\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import os, warnings\n",
+    "from pynq import PL\n",
+    "from pynq import Overlay\n",
+    "\n",
+    "from pynq import MMIO\n",
+    "\n",
+    "import sys\n",
+    "sys.path.insert(1, './driver')\n",
+    "from uartlite import *\n",
+    "\n",
+    "ol = Overlay(\"/home/xilinx/pynq/overlays/soclabs/design_1.bit\")\n",
+    "\n",
+    "if not os.path.exists(PL.bitfile_name):\n",
+    "    warnings.warn('There is no overlay loaded after boot.', UserWarning)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**Note**: If you see a warning message in the above cell, it means that no overlay\n",
+    "has been loaded after boot, hence the PL server is not aware of the \n",
+    "current status of the PL. In that case you won't be able to run this notebook\n",
+    "until you manually load an overlay at least once using:\n",
+    "\n",
+    "```python\n",
+    "from pynq import Overlay\n",
+    "ol = Overlay('your_overlay.bit')\n",
+    "```\n",
+    "\n",
+    "If you do not see any warning message, you can safely proceed.\n",
+    "\n",
+    "Next try relative path:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from pynq import Overlay\n",
+    "ol = Overlay(\"soclabs/design_1.bit\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Now we can check the download timestamp for this overlay."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'2022/7/12 13:24:34 +609181'"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ol.download()\n",
+    "ol.timestamp"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 2. Examining the PL state\n",
+    "\n",
+    "While there can be multiple overlay instances in Python, there is only one bitstream that is currently loaded onto the programmable logic (PL). \n",
+    "\n",
+    "This bitstream state is held in the singleton class, PL, and is available for user queries."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'/usr/local/lib/python3.6/dist-packages/pynq/overlays/soclabs/design_1.bit'"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "PL.bitfile_name"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'2022/7/12 13:24:34 +609181'"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "PL.timestamp"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Users can verify whether an overlay instance is currently loaded using the Overlay is_loaded() method"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "True"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ol.is_loaded()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 3. Establishing communications \n",
+    "Next set up a serial channel (configured for 9600 baud clocking rate).\n",
+    "Re-download image which also resets the MCU design in PL.\n",
+    "(No explicit to reinitialize the UART after HW reset, as preconfigured baud rate).\n",
+    "Poll for start-up banner from MCU internal boot-ROM.\n",
+    "\n",
+    "Expect a message of the form (sometimes characters are lost as uartlite has no no flow-control support)\n",
+    "\n",
+    "```python\n",
+    "  SOCLABS: ARM Cortex-M0 SDK\n",
+    "    - load flash\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "SOCLABS: ARM Cortex-M0 SDK\n",
+      " - load flash\n",
+      "\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Address of the uart core\n",
+    "ADDRESS = 0x80030000\n",
+    "uart = UartLite(ADDRESS)\n",
+    "ol.download()\n",
+    "# Setup AXI UART register\n",
+    "#uart.setupCtrlReg()\n",
+    "#print(uart.readLine())\n",
+    "#print(uart.readLine())\n",
+    "#print(uart.readLine())\n",
+    "print(uart.read(45,1))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'RX_VALID': 0, 'RX_FULL': 0, 'TX_EMPTY': 1, 'TX_FULL': 0, 'IS_INTR': 0, 'OVERRUN_ERR': 0, 'FRAME_ERR': 0, 'PARITY_ERR': 0}\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(uart.currentStatus())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#ol.ip_dict"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 3. Overlay downloading overhead\n",
+    "\n",
+    "Finally, using Python, we can see the bitstream download time over 50 downloads.  "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0xaefaa6b0>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import time\n",
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "length = 50\n",
+    "time_log = []\n",
+    "for i in range(length):\n",
+    "    start = time.time()\n",
+    "    ol.download()\n",
+    "    end = time.time()\n",
+    "    time_log.append((end-start)*1000)\n",
+    "\n",
+    "%matplotlib inline\n",
+    "plt.plot(range(length), time_log, 'ro')\n",
+    "plt.title('Bitstream loading time (ms)')\n",
+    "plt.axis([0, length, 0, 1000])\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.6.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/driver/uartlite.py b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/driver/uartlite.py
new file mode 100755
index 0000000..4da3b33
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/driver/uartlite.py
@@ -0,0 +1,88 @@
+from time import sleep, time
+from pynq import MMIO
+
+RX_FIFO = 0x00
+TX_FIFO = 0x04
+
+#Status Reg
+STAT_REG = 0x08
+RX_VALID = 0
+RX_FULL = 1
+TX_EMPTY = 2
+TX_FULL = 3
+IS_INTR = 4
+OVERRUN_ERR = 5
+FRAME_ERR = 6
+PARITY_ERR =7
+
+#Ctrl Reg
+CTRL_REG = 0x0C
+RST_TX = 0
+RST_RX = 1
+INTR_EN = 4
+
+class UartLite:
+    def __init__(self, address):
+        # Setup axi core
+        self.uart = MMIO(address,0x10000, debug=False)
+        self.address = address
+
+    def getBit(self,num,pos):
+        return (num&1<<pos)>>pos
+
+    def setupCtrlReg(self):
+        # Reset FIFOs, disable interrupts
+        self.uart.write(CTRL_REG, 1<<RST_TX | 1<<RST_RX)
+        sleep(0.0)
+        self.uart.write(CTRL_REG,0)
+        sleep(0.0)
+
+    def currentStatus(self):
+        """Returns object that specifies current status of axi core"""
+        status = self.uart.read(STAT_REG)
+        return {'RX_VALID':self.getBit(status,RX_VALID),
+            'RX_FULL':self.getBit(status, RX_FULL),
+            'TX_EMPTY':self.getBit(status, TX_EMPTY),
+            'TX_FULL':self.getBit(status, TX_FULL),
+            'IS_INTR':self.getBit(status, IS_INTR),
+            'OVERRUN_ERR':self.getBit(status, OVERRUN_ERR),
+            'FRAME_ERR':self.getBit(status, FRAME_ERR),
+            'PARITY_ERR':self.getBit(status, PARITY_ERR)}
+
+    def read(self, count, timeout = 1):
+        buf = ""
+        stop_time = time() + timeout
+        for i in range(count):
+            # Wait till RX fifo has valid data, skip if timeout exceeded
+            while (not (self.uart.read(STAT_REG) & 1<<RX_VALID)) and (time()<stop_time):
+                pass
+            if time()>=stop_time:
+                break
+            buf += chr(self.uart.read(RX_FIFO))
+        return buf
+
+    def write(self, buf, timeout = 10):
+        """
+        buf: iterable
+        
+        """
+        stop_time = time() + timeout
+        wr_count = 0
+        for i in buf:
+            #Wait while TX FIFO is Full, stop waiting if timeout passes 
+            while (self.uart.read(STAT_REG) & 1<<TX_FULL) and (time()<stop_time):
+                pass
+            # Check timeout
+            if time()>stop_time:
+                break
+            self.uart.write(TX_FIFO, ord(i))
+            wr_count += 1
+        return wr_count   
+
+    def readLine(self):
+        buf = self.read(1)
+        if len(buf) ==0:
+            return ""
+        while '\n' not in buf:
+            buf += self.read(1)
+        return buf
\ No newline at end of file
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb
new file mode 100755
index 0000000..4a2d262
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/pynq_export/pz2/jupyter_notebooks/soclabs/soclabs_cm0sdk_mcu.ipynb
@@ -0,0 +1,372 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# SoCLabs cm0sdk mcu overlay\n",
+    "This notebook demonstrates how to download the FPGA overlay and communicate with programmable logic state.  \n",
+    "\n",
+    "## 1. Instantiating an overlay\n",
+    "With the following overlay bundle present in the `overlays` folder, users can instantiate the overlay easily.\n",
+    "\n",
+    "*  A bitstream file (\\*.bit).\n",
+    "*  An hwh file (\\*.hwh).\n",
+    "*  A python class (\\*.py).\n",
+    "\n",
+    "For example, a `soclabs` overlay called `design_1` can be loaded by:\n",
+    "```python\n",
+    "from pynq.overlays.base import BaseOverlay\n",
+    "overlay = BaseOverlay(\"soclabs/design_1.bit\")\n",
+    "```\n",
+    "A `drivers` directory is provided for device driver templates for comms channels. (uartlite example).\n",
+    "\n",
+    "Users can also use the absolute file path of the bitstream to instantiate the overlay.\n",
+    "\n",
+    "In this notebook, we get the current bitstream loaded on PL, and try to download it multiple times."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "application/javascript": [
+       "\n",
+       "try {\n",
+       "require(['notebook/js/codecell'], function(codecell) {\n",
+       "  codecell.CodeCell.options_default.highlight_modes[\n",
+       "      'magic_text/x-csrc'] = {'reg':[/^%%microblaze/]};\n",
+       "  Jupyter.notebook.events.one('kernel_ready.Kernel', function(){\n",
+       "      Jupyter.notebook.get_cells().map(function(cell){\n",
+       "          if (cell.cell_type == 'code'){ cell.auto_highlight(); } }) ;\n",
+       "  });\n",
+       "});\n",
+       "} catch (e) {};\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    },
+    {
+     "data": {
+      "application/javascript": [
+       "\n",
+       "try {\n",
+       "require(['notebook/js/codecell'], function(codecell) {\n",
+       "  codecell.CodeCell.options_default.highlight_modes[\n",
+       "      'magic_text/x-csrc'] = {'reg':[/^%%pybind11/]};\n",
+       "  Jupyter.notebook.events.one('kernel_ready.Kernel', function(){\n",
+       "      Jupyter.notebook.get_cells().map(function(cell){\n",
+       "          if (cell.cell_type == 'code'){ cell.auto_highlight(); } }) ;\n",
+       "  });\n",
+       "});\n",
+       "} catch (e) {};\n"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import os, warnings\n",
+    "from pynq import PL\n",
+    "from pynq import Overlay\n",
+    "\n",
+    "from pynq import MMIO\n",
+    "\n",
+    "import sys\n",
+    "sys.path.insert(1, './driver')\n",
+    "from uartlite import *\n",
+    "\n",
+    "ol = Overlay(\"/home/xilinx/pynq/overlays/soclabs/design_1.bit\")\n",
+    "\n",
+    "if not os.path.exists(PL.bitfile_name):\n",
+    "    warnings.warn('There is no overlay loaded after boot.', UserWarning)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "**Note**: If you see a warning message in the above cell, it means that no overlay\n",
+    "has been loaded after boot, hence the PL server is not aware of the \n",
+    "current status of the PL. In that case you won't be able to run this notebook\n",
+    "until you manually load an overlay at least once using:\n",
+    "\n",
+    "```python\n",
+    "from pynq import Overlay\n",
+    "ol = Overlay('your_overlay.bit')\n",
+    "```\n",
+    "\n",
+    "If you do not see any warning message, you can safely proceed.\n",
+    "\n",
+    "Next try relative path:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from pynq import Overlay\n",
+    "ol = Overlay(\"soclabs/design_1.bit\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Now we can check the download timestamp for this overlay."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'2022/7/12 13:24:34 +609181'"
+      ]
+     },
+     "execution_count": 3,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ol.download()\n",
+    "ol.timestamp"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 2. Examining the PL state\n",
+    "\n",
+    "While there can be multiple overlay instances in Python, there is only one bitstream that is currently loaded onto the programmable logic (PL). \n",
+    "\n",
+    "This bitstream state is held in the singleton class, PL, and is available for user queries."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'/usr/local/lib/python3.6/dist-packages/pynq/overlays/soclabs/design_1.bit'"
+      ]
+     },
+     "execution_count": 4,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "PL.bitfile_name"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "'2022/7/12 13:24:34 +609181'"
+      ]
+     },
+     "execution_count": 5,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "PL.timestamp"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Users can verify whether an overlay instance is currently loaded using the Overlay is_loaded() method"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "True"
+      ]
+     },
+     "execution_count": 6,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "ol.is_loaded()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 3. Establishing communications \n",
+    "Next set up a serial channel (configured for 9600 baud clocking rate).\n",
+    "Re-download image which also resets the MCU design in PL.\n",
+    "(No explicit to reinitialize the UART after HW reset, as preconfigured baud rate).\n",
+    "Poll for start-up banner from MCU internal boot-ROM.\n",
+    "\n",
+    "Expect a message of the form (sometimes characters are lost as uartlite has no no flow-control support)\n",
+    "\n",
+    "```python\n",
+    "  SOCLABS: ARM Cortex-M0 SDK\n",
+    "    - load flash\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "SOCLABS: ARM Cortex-M0 SDK\n",
+      " - load flash\n",
+      "\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "# Address of the uart core\n",
+    "ADDRESS = 0x42C00000\n",
+    "uart = UartLite(ADDRESS)\n",
+    "ol.download()\n",
+    "# Setup AXI UART register\n",
+    "#uart.setupCtrlReg()\n",
+    "#print(uart.readLine())\n",
+    "#print(uart.readLine())\n",
+    "#print(uart.readLine())\n",
+    "print(uart.read(45,1))"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "{'RX_VALID': 0, 'RX_FULL': 0, 'TX_EMPTY': 1, 'TX_FULL': 0, 'IS_INTR': 0, 'OVERRUN_ERR': 0, 'FRAME_ERR': 0, 'PARITY_ERR': 0}\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(uart.currentStatus())"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#ol.ip_dict"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## 3. Overlay downloading overhead\n",
+    "\n",
+    "Finally, using Python, we can see the bitstream download time over 50 downloads.  "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<matplotlib.figure.Figure at 0xaefaa6b0>"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "import time\n",
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "length = 50\n",
+    "time_log = []\n",
+    "for i in range(length):\n",
+    "    start = time.time()\n",
+    "    ol.download()\n",
+    "    end = time.time()\n",
+    "    time_log.append((end-start)*1000)\n",
+    "\n",
+    "%matplotlib inline\n",
+    "plt.plot(range(length), time_log, 'ro')\n",
+    "plt.title('Bitstream loading time (ms)')\n",
+    "plt.axis([0, length, 0, 1000])\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.6.5"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_batch.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_batch.tcl
new file mode 100644
index 0000000..789b276
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_batch.tcl
@@ -0,0 +1,122 @@
+# build_mcu_fpga_batch.tcl
+#
+# cmsdk_mcu sample design 
+# A Vivado script that demonstrates a very simple RTL-to-bitstream non-project batch flow
+#
+# NOTE:  typical usage would be "vivado -mode tcl -source build_mcu_fpga_batch.tcl" 
+#
+# STEP#0: define output directory area.
+#
+
+##if {$argc < 1} {
+#puts  "target_fpga arg must be \[ac701 \| arm_mps3 \| pynz_z2 \| zcu104\]"
+#}
+#set target [lindex $argv 0]
+#puts "target requested : $target"
+#set target_dir target_fpga
+#append target_dir $target
+#puts "target directory : $target_dir"
+
+set outputDir ./vivado/built_mcu_fpga
+file mkdir $outputDir
+#
+# STEP#1: setup design sources and constraints
+#
+
+# local search path for configurations
+set search_path ../verilog
+
+set cortexm0_vlog    ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical
+source scripts/rtl_source_cm0.tcl
+
+set search_path [ concat $search_path $cortexm0_vlog/cortexm0_integration/verilog ]
+read_verilog  [ glob $cortexm0_vlog/cortexm0_integration/verilog/*.v ]
+read_verilog  [ glob $cortexm0_vlog/models/cells/*.v ]
+
+# Arm unmodified CMSDK RTL
+set cmsdk_vlog    ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0
+source scripts/rtl_source_cmsdk.tcl
+
+set search_path [ concat $search_path $cmsdk_vlog/logical/models/memories ]
+###read_verilog  $cmsdk_vlog/logical/models/memories/cmsdk_ahb_memory_models_defs.v
+###read_verilog  $cmsdk_vlog/logical/models/memories/cmsdk_ahb_rom.v
+read_verilog  $cmsdk_vlog/logical/models/memories/cmsdk_fpga_rom.v
+###read_verilog  $cmsdk_vlog/logical/models/memories/cmsdk_ahb_ram.v
+read_verilog  $cmsdk_vlog/logical/models/memories/cmsdk_fpga_sram.v
+
+# ADP, FT1248 and streamio IP
+source scripts/rtl_source_soclabs_ip.tcl
+
+# FPGA-specific pads
+source scripts/rtl_source_fpga_ip.tcl
+
+# soclabs modified mcu system 
+set soc_vlog ../verilog
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v
+read_verilog  $soc_vlog/ahb_bootrom.v
+read_verilog  $soc_vlog/bootrom.v
+read_verilog  $soc_vlog/cmsdk_ahb_cs_rom_table.v
+read_verilog  $soc_vlog/cmsdk_apb_usrt.v
+read_verilog  $soc_vlog/cmsdk_clkreset.v
+read_verilog  $soc_vlog/cmsdk_ft1248x1_adpio.v
+read_verilog  $soc_vlog/cmsdk_mcu_clkctrl.v
+read_verilog  $soc_vlog/cmsdk_mcu_pin_mux.v
+read_verilog  $soc_vlog/cmsdk_mcu_stclkctrl.v
+read_verilog  $soc_vlog/cmsdk_mcu_sysctrl.v
+read_verilog  $soc_vlog/cmsdk_uart_capture.v
+read_verilog  $soc_vlog/nanosoc_ahb_sys_decode.v
+read_verilog  $soc_vlog/nanosoc_chip_pads.v
+read_verilog  $soc_vlog/nanosoc_chip.v
+read_verilog  $soc_vlog/nanosoc_cpu.v
+read_verilog  $soc_vlog/nanosoc_sys_ahb_decode.v
+read_verilog  $soc_vlog/nanosoc_sysio.v
+
+
+# FPGA specific timing constraints
+read_xdc target_fpga/fpga_timing.xdc
+
+# FPGA board specific pin constraints
+read_xdc target_fpga/fpga_pinmap.xdc
+
+#
+# STEP#2: run synthesis, report utilization and timing estimates, write checkpoint design
+#
+source target_fpga/fpga_synth.tcl
+
+write_checkpoint -force $outputDir/post_synth
+report_timing_summary -file $outputDir/post_synth_timing_summary.rpt
+report_power -file $outputDir/post_synth_power.rpt
+#
+# STEP#3: run placement and logic optimzation, report utilization and timing estimates, write checkpoint design
+#
+opt_design
+place_design
+phys_opt_design
+write_checkpoint -force $outputDir/post_place
+report_timing_summary -file $outputDir/post_place_timing_summary.rpt
+#
+# STEP#4: run router, report actual utilization and timing, write checkpoint design, run drc, write verilog and xdc out
+#
+route_design
+write_checkpoint -force $outputDir/post_route
+report_timing_summary -file $outputDir/post_route_timing_summary.rpt
+report_timing -sort_by group -max_paths 100 -path_type summary -file $outputDir/post_route_timing.rpt
+report_clock_utilization -file $outputDir/clock_util.rpt
+report_utilization -file $outputDir/post_route_util.rpt
+report_power -file $outputDir/post_route_power.rpt
+report_drc -file $outputDir/post_imp_drc.rpt
+write_verilog -force $outputDir/cmsdk_mcu_impl_netlist.v
+write_xdc -no_fixed_only -force $outputDir/cmsdk_mcu_impl.xdc
+#
+# STEP#5: generate a bitstream
+# 
+write_bitstream -force $outputDir/cmsdk_mcu.bit
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_ip.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_ip.tcl
new file mode 100644
index 0000000..a1a6c43
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_ip.tcl
@@ -0,0 +1,127 @@
+###-----------------------------------------------------------------------------
+### example: build_mcu_fpga_ip.tcl
+### A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+###
+### Contributors
+###
+### David Flynn (d.w.flynn@soton.ac.uk)
+###
+### Copyright � 2022, SoC Labs (www.soclabs.org)
+###-----------------------------------------------------------------------------
+#
+# developed & tested using vivado_version 2021.1
+#
+# usage:
+# vivado -mode tcl -source scripts/build_mcu_fpga_ip.tcl
+
+#
+# STEP#0: define output directory area.
+#
+
+set outputDir ./vivado/built_mcu_fpga
+file mkdir $outputDir
+#
+# STEP#1: setup design sources and constraints
+#
+
+# local search path for configurations
+set search_path ../verilog
+
+set cortexm0_vlog    ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical
+source scripts/rtl_source_cm0.tcl
+
+set search_path [ concat $search_path $cortexm0_vlog/cortexm0_integration/verilog ]
+read_verilog  [ glob $cortexm0_vlog/cortexm0_integration/verilog/*.v ]
+read_verilog  [ glob $cortexm0_vlog/models/cells/*.v ]
+
+# Arm unmodified CMSDK RTL
+set cmsdk_vlog    ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0
+source scripts/rtl_source_cmsdk.tcl
+
+set search_path [ concat $search_path $cmsdk_vlog/logical/models/memories ]
+read_verilog  $cmsdk_vlog/logical/models/memories/cmsdk_ahb_memory_models_defs.v
+read_verilog  $cmsdk_vlog/logical/models/memories/cmsdk_ahb_rom.v
+read_verilog  $cmsdk_vlog/logical/models/memories/cmsdk_fpga_rom.v
+read_verilog  $cmsdk_vlog/logical/models/memories/cmsdk_ahb_ram.v
+read_verilog  $cmsdk_vlog/logical/models/memories/cmsdk_fpga_sram.v
+
+# configured Arm DMA-PL230 RTL (include ../verilog/pl230_defs.v for local configuration, not the distribution, already on search path)
+set search_path [ concat $search_path ../verilog ]
+set dma230_vlog    ../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog
+source scripts/rtl_source_dma230.tcl
+
+# ADP, FT1248 and streamio IP
+source scripts/rtl_source_soclabs_ip.tcl
+
+## FPGA-specific pads
+#source scripts/rtl_source_fpga_ip.tcl
+
+# soclabs modified mcu system 
+set soc_vlog ../verilog
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v
+read_verilog  $soc_vlog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v
+read_verilog  $soc_vlog/ahb_bootrom.v
+read_verilog  $soc_vlog/bootrom.v
+read_verilog  $soc_vlog/cmsdk_ahb_cs_rom_table.v
+read_verilog  $soc_vlog/cmsdk_apb_usrt.v
+##read_verilog  $soc_vlog/cmsdk_clkreset.v
+read_verilog  $soc_vlog/cmsdk_ft1248x1_adpio.v
+read_verilog  $soc_vlog/cmsdk_mcu_clkctrl.v
+read_verilog  $soc_vlog/cmsdk_mcu_pin_mux.v
+read_verilog  $soc_vlog/cmsdk_mcu_stclkctrl.v
+read_verilog  $soc_vlog/cmsdk_mcu_sysctrl.v
+##read_verilog  $soc_vlog/cmsdk_uart_capture.v
+read_verilog  $soc_vlog/nanosoc_cpu.v
+read_verilog  $soc_vlog/nanosoc_sys_ahb_decode.v
+read_verilog  $soc_vlog/nanosoc_sysio.v
+read_verilog  $soc_vlog/nanosoc_chip.v
+read_verilog  $soc_vlog/nanosoc_chip_pads.v
+
+set_property top nanosoc_chip [current_fileset]
+
+# FPGA specific timing constraints
+#read_xdc target_fpga/fpga_timing.xdc
+
+## FPGA board specific pin constraints
+#read_xdc target_fpga/fpga_pinmap.xdc
+
+#
+# STEP#2: run synthesis, report utilization and timing estimates, write checkpoint design
+#
+
+update_compile_order -fileset sources_1
+
+set mculib_ip  $outputDir/MCULIB
+
+ipx::package_project -root_dir $mculib_ip -vendor soclabs.org -library user -taxonomy /UserIP -import_files -set_current false -force -force_update_compile_order
+
+ipx::unload_core  $mculib_ip/component.xml
+ipx::edit_ip_in_project -upgrade true -name tmp_edit_project -directory  $mculib_ip  $mculib_ip/component.xml
+
+update_compile_order -fileset sources_1
+set_property ipi_drc {ignore_freq_hz true} [ipx::current_core]
+ipx::merge_project_changes files [ipx::current_core]
+
+set_property core_revision 2 [ipx::current_core]
+ipx::update_source_project_archive -component [ipx::current_core]
+ipx::create_xgui_files [ipx::current_core]
+ipx::update_checksums [ipx::current_core]
+ipx::check_integrity [ipx::current_core]
+
+ipx::save_core [ipx::current_core]
+ipx::check_integrity -quiet -xrt [ipx::current_core]
+ipx::archive_core  $mculib_ip/soclabs.org_user_cmsdk_mcu_chip_1.0.zip [ipx::current_core]
+ipx::move_temp_component_back -component [ipx::current_core]
+close_project -delete
+
+set_property  ip_repo_paths { ip_repo $mculib_ip} [current_project]
+update_ip_catalog
+close_project
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_z2.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_z2.tcl
new file mode 100644
index 0000000..28b5b35
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_z2.tcl
@@ -0,0 +1,118 @@
+###-----------------------------------------------------------------------------
+### example: build_mcu_fpga_pynq_z2.tcl
+### A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+###
+### Contributors
+###
+### David Flynn (d.w.flynn@soton.ac.uk)
+###
+### Copyright � 2022, SoC Labs (www.soclabs.org)
+###-----------------------------------------------------------------------------
+#
+# developed & tested using vivado_version 2021.1
+#
+# usage:
+# vivado -mode tcl -source scripts/build_mcu_fpga_pynq_z2.tcl
+# vivado -mode gui -source scripts/build_mcu_fpga_pynq_z2.tcl
+
+# for TUL PYNQ-Z2 as PYNQ target
+set xilinx_part xc7z020clg400-1
+set project project_pynq_z2
+set importDir target_fpga_pynq_z2
+set ipDir ./ip_repo
+set mcuDir ./vivado/built_mcu_fpga/MCULIB
+set pynqDir pynq_export/pz2/pynq/overlays/soclabs
+set exportDir /research/soclabs/pynq_export/pz2/pynq/overlays/soclabs
+#set_property BOARD_PART tul.com:pynq-z2:part0:1.1 [current_project]
+
+#
+# STEP#0: build the cm0sdk design (without pads) as an "IP" library component for the testbench (in MCULIB)
+#
+source scripts/build_mcu_fpga_ip.tcl
+
+#
+# STEP#1: setup design sources and constraints
+#
+set_part $xilinx_part
+set_property TARGET_LANGUAGE Verilog [current_project]
+set_property DEFAULT_LIB work [current_project]
+
+set paths [list \
+ $ipDir\
+ $mcuDir\
+ ]
+
+# Set IP repository paths
+set obj [get_filesets sources_1]
+if { $obj != {} } {
+   set_property "ip_repo_paths" "[file normalize $ipDir] [file normalize $mcuDir]" $obj
+   # Rebuild user ip_repo's index before adding any source files
+   update_ip_catalog -rebuild
+}
+
+report_ip_status
+
+#
+# STEP#2: create Block Diagram and add specific IO wrapper (and import matching pinmap.xdc)
+#
+# using script written out from GUI capture
+
+create_bd_design design_1
+
+read_verilog $importDir/design_1_wrapper.v
+source $importDir/design_1.tcl
+create_root_design ""
+
+add_files -norecurse -scan_for_includes {../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_defs.v ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_defs.v ../verilog/pl230_defs.v}
+set_property is_global_include true [get_files  ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_defs.v]
+set_property is_global_include true [get_files  ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_defs.v]
+set_property is_global_include true [get_files  ../verilog/pl230_defs.v]
+
+set_property file_type {Verilog Header} [get_files  ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_defs.v]
+set_property file_type {Verilog Header} [get_files  ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_defs.v]
+set_property file_type {Verilog Header} [get_files  ../verilog/pl230_defs.v]
+
+add_files $importDir/fpga_pinmap.xdc
+
+set_property top design_1_wrapper [current_fileset]
+
+#
+# STEP#3: save in Project mode to complete flow
+#
+save_project_as $project ./$project -exclude_run_results -force
+
+update_compile_order -fileset sources_1
+
+#
+# STEP#4: synthesize project
+#
+set_property part $xilinx_part [get_runs synth_1]
+launch_runs synth_1 -jobs 8
+
+wait_on_run synth_1
+
+#
+# STEP#5: place and route project
+#
+set_property part $xilinx_part [get_runs impl_1]
+launch_runs impl_1 -to_step write_bitstream -jobs 8
+
+wait_on_run impl_1
+
+#
+# STEP#6: export design_1.bit and design_1.hwh files for PYNQ
+#
+
+write_hw_platform -fixed -include_bit -force -file $project/design_1.xsa
+
+exec unzip -u -o $project/design_1.xsa -d $project/export
+
+exec mkdir -p $pynqDir
+exec cp -p $project/export/design_1.bit $pynqDir
+exec cp -p $project/export/design_1.hwh $pynqDir
+#exec cp -p $project/export/design_1.bit $exportDir
+#exec cp -p $project/export/design_1.hwh $exportDir
+
+exec rm -Rf vivado/
+
+exit 1
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_zcu104.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_zcu104.tcl
new file mode 100644
index 0000000..87ae9c2
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/build_mcu_fpga_pynq_zcu104.tcl
@@ -0,0 +1,115 @@
+###-----------------------------------------------------------------------------
+### example: build_mcu_fpga_pynq_zcu104.tcl
+### A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+###
+### Contributors
+###
+### David Flynn (d.w.flynn@soton.ac.uk)
+###
+### Copyright � 2022, SoC Labs (www.soclabs.org)
+###-----------------------------------------------------------------------------
+#
+# developed & tested using vivado_version 2021.1
+#
+# usage:
+# vivado -mode tcl -source scripts/build_mcu_fpga_pynq_zcu104.tcl
+# vivado -mode gui -source scripts/build_mcu_fpga_pynq_zcu104.tcl
+
+# for Xilinx ZCU104 as PYNQ target
+set xilinx_part xczu7ev-ffvc1156-2-e
+set project project_pynq_zcu104
+set importDir target_fpga_zcu104
+set ipDir ./ip_repo
+set mcuDir ./vivado/built_mcu_fpga/MCULIB
+set pynqDir pynq_export/pz104/pynq/overlays/soclabs
+#set_property BOARD_PART xilinx.com:zcu104:part0:1.1 [current_project]
+
+#
+# STEP#0: build the cm0sdk design (without pads) as an "IP" library component for the testbench (in MCULIB)
+#
+source scripts/build_mcu_fpga_ip.tcl
+
+#
+# STEP#1: setup design sources and constraints
+#
+set_part $xilinx_part
+set_property TARGET_LANGUAGE Verilog [current_project]
+set_property DEFAULT_LIB work [current_project]
+
+set paths [list \
+ $ipDir\
+ $mcuDir\
+ ]
+
+# Set IP repository paths
+set obj [get_filesets sources_1]
+if { $obj != {} } {
+   set_property "ip_repo_paths" "[file normalize $ipDir] [file normalize $mcuDir]" $obj
+   # Rebuild user ip_repo's index before adding any source files
+   update_ip_catalog -rebuild
+}
+
+report_ip_status
+
+#
+# STEP#2: create Block Diagram and add specific IO wrapper (and import matching pinmap.xdc)
+#
+# using script written out from GUI capture
+
+create_bd_design design_1
+
+read_verilog $importDir/design_1_wrapper.v
+source $importDir/design_1.tcl
+create_root_design ""
+
+add_files -norecurse -scan_for_includes {../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_defs.v ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_defs.v ../verilog/pl230_defs.v}
+set_property is_global_include true [get_files  ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_defs.v]
+set_property is_global_include true [get_files  ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_defs.v]
+set_property is_global_include true [get_files  ../verilog/pl230_defs.v]
+
+set_property file_type {Verilog Header} [get_files  ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_defs.v]
+set_property file_type {Verilog Header} [get_files  ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_defs.v]
+set_property file_type {Verilog Header} [get_files  ../verilog/pl230_defs.v]
+
+add_files $importDir/fpga_pinmap.xdc
+
+set_property top design_1_wrapper [current_fileset]
+
+#
+# STEP#3: save in Project mode to complete flow
+#
+
+save_project_as $project ./$project -exclude_run_results -force
+
+update_compile_order -fileset sources_1
+
+#
+# STEP#4: synthesize project
+#
+set_property part $xilinx_part [get_runs synth_1]
+launch_runs synth_1 -jobs 8
+
+wait_on_run synth_1
+
+#
+# STEP#5: place and route project
+#
+set_property part $xilinx_part [get_runs impl_1]
+launch_runs impl_1 -to_step write_bitstream -jobs 8
+
+wait_on_run impl_1
+
+#
+# STEP#6: export design_1.bit and design_1.hwh files for PYNQ
+#
+
+write_hw_platform -fixed -include_bit -force -file $project/design_1.xsa
+
+exec unzip -u -o $project/design_1.xsa -d $project/export
+exec mkdir -p $pynqDir
+exec cp -p $project/export/design_1.bit $pynqDir
+exec cp -p $project/export/design_1.hwh $pynqDir
+
+exec rm -Rf vivado/
+
+exit 1
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cm0.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cm0.tcl
new file mode 100644
index 0000000..b76287f
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cm0.tcl
@@ -0,0 +1,17 @@
+### Cortex-M0 rtl source build
+set search_path [ concat $search_path $cortexm0_vlog/cortexm0/verilog ]
+read_verilog  [ glob $cortexm0_vlog/cortexm0/verilog/*.v ]
+set search_path [ concat $search_path $cortexm0_vlog/cortexm0_dap/verilog ]
+##read_verilog  [ glob $cortexm0_vlog/cortexm0_dap/verilog/*.v ]
+read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_ap_cdc.v
+read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_ap_mast.v
+read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_dp_cdc.v
+read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_dp_jtag.v
+###read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_dp_sw_defs.v
+read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_dp.v
+###read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_ap_mast_defs.v
+read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_ap.v
+###read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_dp_jtag_defs.v
+read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_dp_pwr.v
+read_verilog $cortexm0_vlog/cortexm0_dap/verilog/cm0_dap_dp_sw.v
+read_verilog $cortexm0_vlog/cortexm0_dap/verilog/CORTEXM0DAP.v
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cmsdk.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cmsdk.tcl
new file mode 100644
index 0000000..cd99c87
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_cmsdk.tcl
@@ -0,0 +1,17 @@
+### CMSDK rtl source build
+###read_verilog  [ glob $cmsdk_vlog/logical/cmsdk_ahb_gpio/verilog/*.v ]
+read_verilog  $cmsdk_vlog/logical/cmsdk_ahb_gpio/verilog/cmsdk_ahb_to_iop.v
+read_verilog  $cmsdk_vlog/logical/cmsdk_ahb_gpio/verilog/cmsdk_ahb_gpio.v
+read_verilog  $cmsdk_vlog/logical/cmsdk_iop_gpio/verilog/cmsdk_iop_gpio.v
+read_verilog  [ glob $cmsdk_vlog/logical/cmsdk_apb_timer/verilog/*.v ]
+read_verilog  [ glob $cmsdk_vlog/logical/cmsdk_apb_dualtimers/verilog/*.v ]
+read_verilog  [ glob $cmsdk_vlog/logical/cmsdk_apb_watchdog/verilog/*.v ]
+read_verilog  [ glob $cmsdk_vlog/logical/cmsdk_apb_uart/verilog/*.v ]
+read_verilog  $cmsdk_vlog/logical/cmsdk_ahb_default_slave/verilog/cmsdk_ahb_default_slave.v
+read_verilog  [ glob $cmsdk_vlog/logical/cmsdk_ahb_slave_mux/verilog/*.v ]
+read_verilog  [ glob $cmsdk_vlog/logical/cmsdk_ahb_to_apb/verilog/*.v ]
+read_verilog  [ glob $cmsdk_vlog/logical/cmsdk_apb_slave_mux/verilog/*.v ]
+read_verilog  [ glob $cmsdk_vlog/logical/cmsdk_apb_subsystem/verilog/*.v ]
+read_verilog  [ glob $cmsdk_vlog/logical/cmsdk_ahb_master_mux/verilog/*.v ]
+read_verilog  $cmsdk_vlog/logical/models/clkgate/cmsdk_clock_gate.v
+read_verilog  $cmsdk_vlog/logical/cmsdk_ahb_to_sram/verilog/cmsdk_ahb_to_sram.v
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_dma230.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_dma230.tcl
new file mode 100644
index 0000000..356404e
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_dma230.tcl
@@ -0,0 +1,8 @@
+### DMA PL230 rtl source build
+read_verilog  ../verilog/pl230_defs.v
+read_verilog $dma230_vlog/pl230_ahb_ctrl.v
+read_verilog $dma230_vlog/pl230_apb_regs.v
+read_verilog $dma230_vlog/pl230_dma_data.v
+read_verilog $dma230_vlog/pl230_udma.v
+read_verilog $dma230_vlog/pl230_undefs.v
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_fpga_ip.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_fpga_ip.tcl
new file mode 100644
index 0000000..376d757
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_fpga_ip.tcl
@@ -0,0 +1,9 @@
+# rtl_source_fpga_ip.tcl
+#
+
+set fpgalib_vlog ../../../../../FPGALIB
+read_verilog  $fpgalib_vlog/pads/verilog/PAD_INOUT8MA_NOE.v
+read_verilog  $fpgalib_vlog/pads/verilog/PAD_VDDIO.v
+read_verilog  $fpgalib_vlog/pads/verilog/PAD_VSSIO.v
+read_verilog  $fpgalib_vlog/pads/verilog/PAD_VDDSOC.v
+read_verilog  $fpgalib_vlog/pads/verilog/PAD_VSS.v
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_soclabs_ip.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_soclabs_ip.tcl
new file mode 100644
index 0000000..a661717
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/scripts/rtl_source_soclabs_ip.tcl
@@ -0,0 +1,7 @@
+# rtl_source_soclabs_ip.tcl
+#
+
+set iplib_vlog   ../../../../../IPLIB
+read_verilog  $iplib_vlog/FT1248_streamio_v1_0/ft1248_streamio_v1_0.v
+read_verilog  $iplib_vlog/ADPcontrol_v1_0/ADPcontrol_v1_0.v
+read_verilog  $iplib_vlog/ADPcontrol_v1_0/ADPmanager.v
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_pinmap.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_pinmap.xdc
new file mode 100644
index 0000000..b8889af
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_pinmap.xdc
@@ -0,0 +1,983 @@
+##################################################################################
+##                                                                              ##
+## AC701 Master XDC                                                             ##
+##                                                                              ##
+##################################################################################
+
+set_property CFGBVS VCCO [current_design]
+
+set_property CONFIG_VOLTAGE 3.3 [current_design]
+
+##set_property PACKAGE_PIN AB22 [get_ports No]
+##set_property IOSTANDARD LVCMOS25 [get_ports No]
+##set_property PACKAGE_PIN AE25 [get_ports FMC1_HPC_HA02_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA02_P]
+##set_property PACKAGE_PIN AE26 [get_ports FMC1_HPC_HA02_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA02_N]
+##set_property PACKAGE_PIN AC22 [get_ports FMC1_HPC_HA03_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA03_P]
+##set_property PACKAGE_PIN AC23 [get_ports FMC1_HPC_HA03_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA03_N]
+##set_property PACKAGE_PIN AF24 [get_ports FMC1_HPC_HA04_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA04_P]
+##set_property PACKAGE_PIN AF25 [get_ports FMC1_HPC_HA04_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA04_N]
+##set_property PACKAGE_PIN AD25 [get_ports FMC1_HPC_HA05_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA05_P]
+##set_property PACKAGE_PIN AD26 [get_ports FMC1_HPC_HA05_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA05_N]
+##set_property PACKAGE_PIN AE23 [get_ports FMC1_HPC_HA06_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA06_P]
+##set_property PACKAGE_PIN AF23 [get_ports FMC1_HPC_HA06_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA06_N]
+##set_property PACKAGE_PIN AD23 [get_ports FMC1_HPC_HA07_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA07_P]
+##set_property PACKAGE_PIN AD24 [get_ports FMC1_HPC_HA07_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA07_N]
+##set_property PACKAGE_PIN AD21 [get_ports FMC1_HPC_HA08_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA08_P]
+##set_property PACKAGE_PIN AE21 [get_ports FMC1_HPC_HA08_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA08_N]
+##set_property PACKAGE_PIN AF19 [get_ports FMC1_HPC_HA09_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA09_P]
+##set_property PACKAGE_PIN AF20 [get_ports FMC1_HPC_HA09_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA09_N]
+##set_property PACKAGE_PIN AE22 [get_ports FMC1_HPC_HA10_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA10_P]
+##set_property PACKAGE_PIN AF22 [get_ports FMC1_HPC_HA10_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA10_N]
+##set_property PACKAGE_PIN AD20 [get_ports FMC1_HPC_HA11_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA11_P]
+##set_property PACKAGE_PIN AE20 [get_ports FMC1_HPC_HA11_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA11_N]
+##set_property PACKAGE_PIN AB21 [get_ports FMC1_HPC_HA01_CC_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA01_CC_P]
+##set_property PACKAGE_PIN AC21 [get_ports FMC1_HPC_HA01_CC_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA01_CC_N]
+##set_property PACKAGE_PIN AA20 [get_ports FMC1_HPC_HA17_CC_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA17_CC_P]
+##set_property PACKAGE_PIN AB20 [get_ports FMC1_HPC_HA17_CC_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA17_CC_N]
+##set_property PACKAGE_PIN AA19 [get_ports FMC1_HPC_HA00_CC_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA00_CC_P]
+##set_property PACKAGE_PIN AB19 [get_ports FMC1_HPC_HA00_CC_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA00_CC_N]
+##set_property PACKAGE_PIN AC19 [get_ports FMC1_HPC_HA12_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA12_P]
+##set_property PACKAGE_PIN AD19 [get_ports FMC1_HPC_HA12_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA12_N]
+##set_property PACKAGE_PIN AC18 [get_ports FMC1_HPC_HA13_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA13_P]
+##set_property PACKAGE_PIN AD18 [get_ports FMC1_HPC_HA13_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA13_N]
+##set_property PACKAGE_PIN AE18 [get_ports FMC1_HPC_HA14_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA14_P]
+##set_property PACKAGE_PIN AF18 [get_ports FMC1_HPC_HA14_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA14_N]
+##set_property PACKAGE_PIN Y18 [get_ports FMC1_HPC_HA15_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA15_P]
+##set_property PACKAGE_PIN AA18 [get_ports FMC1_HPC_HA15_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA15_N]
+##set_property PACKAGE_PIN AE17 [get_ports FMC1_HPC_HA16_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA16_P]
+##set_property PACKAGE_PIN AF17 [get_ports FMC1_HPC_HA16_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA16_N]
+##set_property PACKAGE_PIN AA17 [get_ports FMC1_HPC_HA18_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA18_P]
+##set_property PACKAGE_PIN AB17 [get_ports FMC1_HPC_HA18_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA18_N]
+##set_property PACKAGE_PIN AC17 [get_ports FMC1_HPC_HA19_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA19_P]
+##set_property PACKAGE_PIN AD17 [get_ports FMC1_HPC_HA19_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA19_N]
+##set_property PACKAGE_PIN Y16 [get_ports FMC1_HPC_HA20_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA20_P]
+##set_property PACKAGE_PIN Y17 [get_ports FMC1_HPC_HA20_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA20_N]
+##set_property PACKAGE_PIN AB16 [get_ports FMC1_HPC_HA21_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA21_P]
+##set_property PACKAGE_PIN AC16 [get_ports FMC1_HPC_HA21_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA21_N]
+##set_property PACKAGE_PIN Y15 [get_ports FMC1_HPC_HA22_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA22_P]
+##set_property PACKAGE_PIN AA15 [get_ports FMC1_HPC_HA22_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA22_N]
+##set_property PACKAGE_PIN W14 [get_ports FMC1_HPC_HA23_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA23_P]
+##set_property PACKAGE_PIN W15 [get_ports FMC1_HPC_HA23_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_HA23_N]
+##set_property PACKAGE_PIN W16 [get_ports No]
+##set_property IOSTANDARD LVCMOS25 [get_ports No]
+##set_property PACKAGE_PIN U24 [get_ports HDMI_R_D21]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D21]
+##set_property PACKAGE_PIN U25 [get_ports HDMI_R_D16]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D16]
+##set_property PACKAGE_PIN U26 [get_ports HDMI_R_D11]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D11]
+##set_property PACKAGE_PIN V26 [get_ports HDMI_R_D7]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D7]
+##set_property PACKAGE_PIN W26 [get_ports HDMI_R_D8]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D8]
+##set_property PACKAGE_PIN AB26 [get_ports HDMI_R_DE]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_DE]
+##set_property PACKAGE_PIN AC26 [get_ports HDMI_R_VSYNC]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_VSYNC]
+##set_property PACKAGE_PIN W25 [get_ports HDMI_R_D9]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D9]
+##set_property PACKAGE_PIN Y26 [get_ports HDMI_R_D6]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D6]
+##set_property PACKAGE_PIN Y25 [get_ports HDMI_R_D5]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D5]
+##set_property PACKAGE_PIN AA25 [get_ports HDMI_R_D29]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D29]
+##set_property PACKAGE_PIN V24 [get_ports HDMI_R_D17]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D17]
+##set_property PACKAGE_PIN W24 [get_ports HDMI_R_D10]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D10]
+##set_property PACKAGE_PIN AA24 [get_ports HDMI_R_D4]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D4]
+##set_property PACKAGE_PIN AB25 [get_ports HDMI_R_D30]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D30]
+##set_property PACKAGE_PIN AA22 [get_ports HDMI_R_HSYNC]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_HSYNC]
+##set_property PACKAGE_PIN AA23 [get_ports HDMI_R_D28]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D28]
+##set_property PACKAGE_PIN AB24 [get_ports HDMI_R_D32]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D32]
+##set_property PACKAGE_PIN AC24 [get_ports HDMI_R_D31]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D31]
+##set_property PACKAGE_PIN V23 [get_ports HDMI_R_D23]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D23]
+##set_property PACKAGE_PIN W23 [get_ports HDMI_R_D19]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D19]
+##set_property PACKAGE_PIN Y22 [get_ports HDMI_R_D33]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D33]
+##set_property PACKAGE_PIN Y23 [get_ports HDMI_R_D34]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D34]
+##set_property INTERNAL_VREF 0.90 [get_iobanks 13]
+##set_property PACKAGE_PIN U22 [get_ports PHY_TX_CLK]
+##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_TX_CLK]
+##set_property PACKAGE_PIN V22 [get_ports HDMI_R_D35]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D35]
+##set_property PACKAGE_PIN U21 [get_ports PHY_RX_CLK]
+##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_RX_CLK]
+##set_property PACKAGE_PIN V21 [get_ports HDMI_R_CLK]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_CLK]
+##set_property PACKAGE_PIN W21 [get_ports HDMI_INT]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_INT]
+##set_property PACKAGE_PIN Y21 [get_ports HDMI_R_SPDIF]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_SPDIF]
+##set_property PACKAGE_PIN T20 [get_ports HDMI_SPDIF_OUT_LS]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_SPDIF_OUT_LS]
+##set_property PACKAGE_PIN U20 [get_ports HDMI_R_D18]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D18]
+##set_property PACKAGE_PIN W20 [get_ports HDMI_R_D20]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D20]
+##set_property PACKAGE_PIN Y20 [get_ports HDMI_R_D22]
+##set_property IOSTANDARD LVCMOS18 [get_ports HDMI_R_D22]
+##set_property PACKAGE_PIN T19 [get_ports USB_UART_TX]
+##set_property IOSTANDARD LVCMOS18 [get_ports USB_UART_TX]
+##set_property PACKAGE_PIN U19 [get_ports USB_UART_RX]
+##set_property IOSTANDARD LVCMOS18 [get_ports USB_UART_RX]
+##set_property PACKAGE_PIN V19 [get_ports USB_UART_RTS]
+##set_property IOSTANDARD LVCMOS18 [get_ports USB_UART_RTS]
+##set_property PACKAGE_PIN W19 [get_ports USB_UART_CTS]
+##set_property IOSTANDARD LVCMOS18 [get_ports USB_UART_CTS]
+##set_property PACKAGE_PIN V18 [get_ports PHY_RESET_B]
+##set_property IOSTANDARD LVCMOS18 [get_ports PHY_RESET_B]
+##set_property PACKAGE_PIN W18 [get_ports PHY_MDC]
+##set_property IOSTANDARD LVCMOS18 [get_ports PHY_MDC]
+##set_property PACKAGE_PIN T14 [get_ports PHY_MDIO]
+##set_property IOSTANDARD LVCMOS18 [get_ports PHY_MDIO]
+##set_property PACKAGE_PIN T15 [get_ports PHY_TX_CTRL]
+##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_TX_CTRL]
+##set_property PACKAGE_PIN T17 [get_ports PHY_TXD3]
+##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_TXD3]
+##set_property PACKAGE_PIN T18 [get_ports PHY_TXD2]
+##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_TXD2]
+##set_property PACKAGE_PIN U15 [get_ports PHY_TXD1]
+##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_TXD1]
+##set_property PACKAGE_PIN U16 [get_ports PHY_TXD0]
+##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_TXD0]
+##set_property PACKAGE_PIN U14 [get_ports PHY_RX_CTRL]
+##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_RX_CTRL]
+##set_property PACKAGE_PIN V14 [get_ports PHY_RXD3]
+##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_RXD3]
+##set_property PACKAGE_PIN V16 [get_ports PHY_RXD2]
+##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_RXD2]
+##set_property PACKAGE_PIN V17 [get_ports PHY_RXD1]
+##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_RXD1]
+##set_property PACKAGE_PIN U17 [get_ports PHY_RXD0]
+##set_property IOSTANDARD HSTL_I_18 [get_ports PHY_RXD0]
+##set_property PACKAGE_PIN M19 [get_ports SI5324_INT_ALM_B]
+##set_property IOSTANDARD LVCMOS33 [get_ports SI5324_INT_ALM_B]
+##set_property PACKAGE_PIN R14 [get_ports FLASH_D0]
+##set_property IOSTANDARD LVCMOS33 [get_ports FLASH_D0]
+##set_property PACKAGE_PIN R15 [get_ports FLASH_D1]
+##set_property IOSTANDARD LVCMOS33 [get_ports FLASH_D1]
+##set_property PACKAGE_PIN P14 [get_ports FLASH_D2]
+##set_property IOSTANDARD LVCMOS33 [get_ports FLASH_D2]
+##set_property PACKAGE_PIN N14 [get_ports FLASH_D3]
+##set_property IOSTANDARD LVCMOS33 [get_ports FLASH_D3]
+##set_property PACKAGE_PIN P15 [get_ports CTRL2_PWRGOOD]
+##set_property IOSTANDARD LVCMOS33 [get_ports CTRL2_PWRGOOD]
+##set_property PACKAGE_PIN P16 [get_ports FPGA_EMCCLK]
+##set_property IOSTANDARD LVCMOS33 [get_ports FPGA_EMCCLK]
+##set_property PACKAGE_PIN N16 [get_ports FMC1_HPC_PRSNT_M2C_B]
+##set_property IOSTANDARD LVCMOS33 [get_ports FMC1_HPC_PRSNT_M2C_B]
+##set_property PACKAGE_PIN N17 [get_ports FMC1_HPC_PG_M2C]
+##set_property IOSTANDARD LVCMOS33 [get_ports FMC1_HPC_PG_M2C]
+##set_property PACKAGE_PIN R16 [get_ports FMC_VADJ_ON_B]
+##set_property IOSTANDARD LVCMOS33 [get_ports FMC_VADJ_ON_B]
+##set_property PACKAGE_PIN R17 [get_ports IIC_MUX_RESET_B]
+##set_property IOSTANDARD LVCMOS33 [get_ports IIC_MUX_RESET_B]
+##set_property PACKAGE_PIN P18 [get_ports QSPI_IC_CS_B]
+##set_property IOSTANDARD LVCMOS33 [get_ports QSPI_IC_CS_B]
+##set_property PACKAGE_PIN N18 [get_ports IIC_SCL_MAIN]
+##set_property IOSTANDARD LVCMOS33 [get_ports IIC_SCL_MAIN]
+##set_property PACKAGE_PIN K25 [get_ports IIC_SDA_MAIN]
+##set_property IOSTANDARD LVCMOS33 [get_ports IIC_SDA_MAIN]
+##set_property PACKAGE_PIN K26 [get_ports PCIE_WAKE_B]
+##set_property IOSTANDARD LVCMOS33 [get_ports PCIE_WAKE_B]
+##set_property PACKAGE_PIN M20 [get_ports PCIE_PERST]
+##set_property IOSTANDARD LVCMOS33 [get_ports PCIE_PERST]
+##set_property PACKAGE_PIN L20 [get_ports LCD_E_LS]
+##set_property IOSTANDARD LVCMOS33 [get_ports LCD_E_LS]
+##set_property PACKAGE_PIN L24 [get_ports LCD_RW_LS]
+##set_property IOSTANDARD LVCMOS33 [get_ports LCD_RW_LS]
+##set_property PACKAGE_PIN L25 [get_ports LCD_DB4_LS]
+##set_property IOSTANDARD LVCMOS33 [get_ports LCD_DB4_LS]
+##set_property PACKAGE_PIN M24 [get_ports LCD_DB5_LS]
+##set_property IOSTANDARD LVCMOS33 [get_ports LCD_DB5_LS]
+##set_property PACKAGE_PIN M25 [get_ports LCD_DB6_LS]
+##set_property IOSTANDARD LVCMOS33 [get_ports LCD_DB6_LS]
+##set_property PACKAGE_PIN L22 [get_ports LCD_DB7_LS]
+##set_property IOSTANDARD LVCMOS33 [get_ports LCD_DB7_LS]
+##set_property PACKAGE_PIN L23 [get_ports LCD_RS_LS]
+##set_property IOSTANDARD LVCMOS33 [get_ports LCD_RS_LS]
+##set_property PACKAGE_PIN M21 [get_ports USER_CLOCK_P]
+##set_property IOSTANDARD LVDS_25 [get_ports USER_CLOCK_P]
+##set_property PACKAGE_PIN M22 [get_ports USER_CLOCK_N]
+##set_property IOSTANDARD LVDS_25 [get_ports USER_CLOCK_N]
+##set_property PACKAGE_PIN N21 [get_ports ROTARY_PUSH]
+##set_property IOSTANDARD LVCMOS33 [get_ports ROTARY_PUSH]
+##set_property PACKAGE_PIN N22 [get_ports ROTARY_INCA]
+##set_property IOSTANDARD LVCMOS33 [get_ports ROTARY_INCA]
+##set_property PACKAGE_PIN P20 [get_ports ROTARY_INCB]
+##set_property IOSTANDARD LVCMOS33 [get_ports ROTARY_INCB]
+##set_property PACKAGE_PIN P21 [get_ports SDIO_CD_DAT3]
+##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_CD_DAT3]
+##set_property PACKAGE_PIN N23 [get_ports SDIO_CMD]
+##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_CMD]
+##set_property PACKAGE_PIN N24 [get_ports SDIO_CLK]
+##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_CLK]
+##set_property PACKAGE_PIN P19 [get_ports SDIO_DAT0]
+##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_DAT0]
+##set_property PACKAGE_PIN N19 [get_ports SDIO_DAT1]
+##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_DAT1]
+##set_property PACKAGE_PIN P23 [get_ports SDIO_DAT2]
+##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_DAT2]
+##set_property PACKAGE_PIN P24 [get_ports SDIO_SDDET]
+##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_SDDET]
+##set_property PACKAGE_PIN R20 [get_ports SDIO_SDWP]
+##set_property IOSTANDARD LVCMOS33 [get_ports SDIO_SDWP]
+##set_property PACKAGE_PIN R21 [get_ports PMBUS_CLK_LS]
+##set_property IOSTANDARD LVCMOS33 [get_ports PMBUS_CLK_LS]
+##set_property PACKAGE_PIN R25 [get_ports PMBUS_DATA_LS]
+##set_property IOSTANDARD LVCMOS33 [get_ports PMBUS_DATA_LS]
+##set_property PACKAGE_PIN P25 [get_ports PMBUS_CTRL_LS]
+##set_property IOSTANDARD LVCMOS33 [get_ports PMBUS_CTRL_LS]
+##set_property PACKAGE_PIN N26 [get_ports PMBUS_ALERT_LS]
+##set_property IOSTANDARD LVCMOS33 [get_ports PMBUS_ALERT_LS]
+##set_property PACKAGE_PIN M26 [get_ports GPIO_LED_0]
+##set_property IOSTANDARD LVCMOS33 [get_ports GPIO_LED_0]
+##set_property PACKAGE_PIN T24 [get_ports GPIO_LED_1]
+##set_property IOSTANDARD LVCMOS33 [get_ports GPIO_LED_1]
+##set_property PACKAGE_PIN T25 [get_ports GPIO_LED_2]
+##set_property IOSTANDARD LVCMOS33 [get_ports GPIO_LED_2]
+##set_property PACKAGE_PIN R26 [get_ports GPIO_LED_3]
+##set_property IOSTANDARD LVCMOS33 [get_ports GPIO_LED_3]
+##set_property PACKAGE_PIN P26 [get_ports PMOD_0]
+##set_property IOSTANDARD LVCMOS33 [get_ports PMOD_0]
+##set_property PACKAGE_PIN T22 [get_ports PMOD_1]
+##set_property IOSTANDARD LVCMOS33 [get_ports PMOD_1]
+##set_property PACKAGE_PIN R22 [get_ports PMOD_2]
+##set_property IOSTANDARD LVCMOS33 [get_ports PMOD_2]
+##set_property PACKAGE_PIN T23 [get_ports PMOD_3]
+##set_property IOSTANDARD LVCMOS33 [get_ports PMOD_3]
+##set_property PACKAGE_PIN R23 [get_ports SFP_LOS]
+##set_property IOSTANDARD LVCMOS33 [get_ports SFP_LOS]
+##set_property PACKAGE_PIN R18 [get_ports SFP_TX_DISABLE]
+##set_property IOSTANDARD LVCMOS33 [get_ports SFP_TX_DISABLE]
+##set_property PACKAGE_PIN K18 [get_ports XADC_GPIO_2]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_GPIO_2]
+##set_property PACKAGE_PIN K15 [get_ports XADC_VAUX0_R_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_VAUX0_R_P]
+##set_property PACKAGE_PIN J16 [get_ports XADC_VAUX0_R_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_VAUX0_R_N]
+##set_property PACKAGE_PIN J14 [get_ports XADC_VAUX8_R_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_VAUX8_R_P]
+##set_property PACKAGE_PIN J15 [get_ports XADC_VAUX8_R_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_VAUX8_R_N]
+##set_property PACKAGE_PIN K16 [get_ports XADC_AD1_R_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_AD1_R_P]
+##set_property PACKAGE_PIN K17 [get_ports XADC_AD1_R_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_AD1_R_N]
+##set_property PACKAGE_PIN M14 [get_ports FMC1_HPC_LA19_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA19_P]
+##set_property PACKAGE_PIN L14 [get_ports FMC1_HPC_LA19_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA19_N]
+##set_property PACKAGE_PIN M15 [get_ports XADC_AD9_R_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_AD9_R_P]
+##set_property PACKAGE_PIN L15 [get_ports XADC_AD9_R_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_AD9_R_N]
+##set_property PACKAGE_PIN M16 [get_ports FMC1_HPC_LA20_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA20_P]
+##set_property PACKAGE_PIN M17 [get_ports FMC1_HPC_LA20_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA20_N]
+##set_property PACKAGE_PIN J19 [get_ports FMC1_HPC_LA21_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA21_P]
+##set_property PACKAGE_PIN H19 [get_ports FMC1_HPC_LA21_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA21_N]
+##set_property PACKAGE_PIN L17 [get_ports FMC1_HPC_LA22_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA22_P]
+##set_property PACKAGE_PIN L18 [get_ports FMC1_HPC_LA22_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA22_N]
+##set_property PACKAGE_PIN K20 [get_ports FMC1_HPC_LA23_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA23_P]
+##set_property PACKAGE_PIN J20 [get_ports FMC1_HPC_LA23_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA23_N]
+##set_property PACKAGE_PIN J18 [get_ports FMC1_HPC_LA24_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA24_P]
+##set_property PACKAGE_PIN H18 [get_ports FMC1_HPC_LA24_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA24_N]
+##set_property PACKAGE_PIN G20 [get_ports FMC1_HPC_LA18_CC_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA18_CC_P]
+##set_property PACKAGE_PIN G21 [get_ports FMC1_HPC_LA18_CC_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA18_CC_N]
+##set_property PACKAGE_PIN K21 [get_ports FMC1_HPC_LA17_CC_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA17_CC_P]
+##set_property PACKAGE_PIN J21 [get_ports FMC1_HPC_LA17_CC_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA17_CC_N]
+##set_property PACKAGE_PIN H21 [get_ports FMC1_HPC_CLK1_M2C_P]
+##set_property IOSTANDARD LVDS_25 [get_ports FMC1_HPC_CLK1_M2C_P]
+##set_property PACKAGE_PIN H22 [get_ports FMC1_HPC_CLK1_M2C_N]
+##set_property IOSTANDARD LVDS_25 [get_ports FMC1_HPC_CLK1_M2C_N]
+##set_property PACKAGE_PIN J23 [get_ports USER_SMA_CLOCK_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports USER_SMA_CLOCK_P]
+##set_property PACKAGE_PIN H23 [get_ports USER_SMA_CLOCK_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports USER_SMA_CLOCK_N]
+##set_property PACKAGE_PIN G22 [get_ports FMC1_HPC_LA25_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA25_P]
+##set_property PACKAGE_PIN F22 [get_ports FMC1_HPC_LA25_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA25_N]
+##set_property PACKAGE_PIN J24 [get_ports FMC1_HPC_LA26_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA26_P]
+##set_property PACKAGE_PIN H24 [get_ports FMC1_HPC_LA26_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA26_N]
+##set_property PACKAGE_PIN F23 [get_ports FMC1_HPC_LA27_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA27_P]
+##set_property PACKAGE_PIN E23 [get_ports FMC1_HPC_LA27_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA27_N]
+##set_property PACKAGE_PIN K22 [get_ports FMC1_HPC_LA28_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA28_P]
+##set_property PACKAGE_PIN K23 [get_ports FMC1_HPC_LA28_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA28_N]
+##set_property PACKAGE_PIN G24 [get_ports FMC1_HPC_LA29_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA29_P]
+##set_property PACKAGE_PIN F24 [get_ports FMC1_HPC_LA29_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA29_N]
+##set_property PACKAGE_PIN E25 [get_ports FMC1_HPC_LA30_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA30_P]
+##set_property PACKAGE_PIN D25 [get_ports FMC1_HPC_LA30_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA30_N]
+##set_property PACKAGE_PIN E26 [get_ports FMC1_HPC_LA31_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA31_P]
+##set_property PACKAGE_PIN D26 [get_ports FMC1_HPC_LA31_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA31_N]
+##set_property PACKAGE_PIN H26 [get_ports FMC1_HPC_LA32_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA32_P]
+##set_property PACKAGE_PIN G26 [get_ports FMC1_HPC_LA32_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA32_N]
+##set_property PACKAGE_PIN G25 [get_ports FMC1_HPC_LA33_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA33_P]
+##set_property PACKAGE_PIN F25 [get_ports FMC1_HPC_LA33_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA33_N]
+##set_property PACKAGE_PIN J25 [get_ports SM_FAN_TACH]
+##set_property IOSTANDARD LVCMOS25 [get_ports SM_FAN_TACH]
+##set_property PACKAGE_PIN J26 [get_ports SM_FAN_PWM]
+##set_property IOSTANDARD LVCMOS25 [get_ports SM_FAN_PWM]
+##set_property PACKAGE_PIN L19 [get_ports XADC_GPIO_3]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_GPIO_3]
+##set_property PACKAGE_PIN H17 [get_ports XADC_GPIO_0]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_GPIO_0]
+##set_property PACKAGE_PIN H14 [get_ports FMC1_HPC_LA02_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA02_P]
+##set_property PACKAGE_PIN H15 [get_ports FMC1_HPC_LA02_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA02_N]
+##set_property PACKAGE_PIN G17 [get_ports FMC1_HPC_LA03_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA03_P]
+##set_property PACKAGE_PIN F17 [get_ports FMC1_HPC_LA03_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA03_N]
+##set_property PACKAGE_PIN F18 [get_ports FMC1_HPC_LA04_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA04_P]
+##set_property PACKAGE_PIN F19 [get_ports FMC1_HPC_LA04_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA04_N]
+##set_property PACKAGE_PIN G15 [get_ports FMC1_HPC_LA05_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA05_P]
+##set_property PACKAGE_PIN F15 [get_ports FMC1_HPC_LA05_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA05_N]
+##set_property PACKAGE_PIN G19 [get_ports FMC1_HPC_LA06_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA06_P]
+##set_property PACKAGE_PIN F20 [get_ports FMC1_HPC_LA06_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA06_N]
+##set_property PACKAGE_PIN H16 [get_ports FMC1_HPC_LA07_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA07_P]
+##set_property PACKAGE_PIN G16 [get_ports FMC1_HPC_LA07_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA07_N]
+##set_property PACKAGE_PIN C17 [get_ports FMC1_HPC_LA08_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA08_P]
+##set_property PACKAGE_PIN B17 [get_ports FMC1_HPC_LA08_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA08_N]
+##set_property PACKAGE_PIN E16 [get_ports FMC1_HPC_LA09_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA09_P]
+##set_property PACKAGE_PIN D16 [get_ports FMC1_HPC_LA09_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA09_N]
+##set_property PACKAGE_PIN A17 [get_ports FMC1_HPC_LA10_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA10_P]
+##set_property PACKAGE_PIN A18 [get_ports FMC1_HPC_LA10_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA10_N]
+##set_property PACKAGE_PIN B19 [get_ports FMC1_HPC_LA11_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA11_P]
+##set_property PACKAGE_PIN A19 [get_ports FMC1_HPC_LA11_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA11_N]
+##set_property PACKAGE_PIN E17 [get_ports FMC1_HPC_LA01_CC_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA01_CC_P]
+##set_property PACKAGE_PIN E18 [get_ports FMC1_HPC_LA01_CC_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA01_CC_N]
+##set_property PACKAGE_PIN D18 [get_ports FMC1_HPC_LA00_CC_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA00_CC_P]
+##set_property PACKAGE_PIN C18 [get_ports FMC1_HPC_LA00_CC_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA00_CC_N]
+##set_property PACKAGE_PIN D19 [get_ports FMC1_HPC_CLK0_M2C_P]
+##set_property IOSTANDARD LVDS_25 [get_ports FMC1_HPC_CLK0_M2C_P]
+##set_property PACKAGE_PIN C19 [get_ports FMC1_HPC_CLK0_M2C_N]
+##set_property IOSTANDARD LVDS_25 [get_ports FMC1_HPC_CLK0_M2C_N]
+##set_property PACKAGE_PIN E20 [get_ports FMC1_HPC_LA12_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA12_P]
+##set_property PACKAGE_PIN D20 [get_ports FMC1_HPC_LA12_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA12_N]
+##set_property PACKAGE_PIN B20 [get_ports FMC1_HPC_LA13_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA13_P]
+##set_property PACKAGE_PIN A20 [get_ports FMC1_HPC_LA13_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA13_N]
+##set_property PACKAGE_PIN C21 [get_ports FMC1_HPC_LA14_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA14_P]
+##set_property PACKAGE_PIN B21 [get_ports FMC1_HPC_LA14_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA14_N]
+##set_property PACKAGE_PIN B22 [get_ports FMC1_HPC_LA15_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA15_P]
+##set_property PACKAGE_PIN A22 [get_ports FMC1_HPC_LA15_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA15_N]
+##set_property PACKAGE_PIN E21 [get_ports FMC1_HPC_LA16_P]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA16_P]
+##set_property PACKAGE_PIN D21 [get_ports FMC1_HPC_LA16_N]
+##set_property IOSTANDARD LVCMOS25 [get_ports FMC1_HPC_LA16_N]
+##set_property PACKAGE_PIN C22 [get_ports No]
+##set_property IOSTANDARD LVCMOS25 [get_ports No]
+##set_property PACKAGE_PIN C23 [get_ports No]
+##set_property IOSTANDARD LVCMOS25 [get_ports No]
+##set_property PACKAGE_PIN B25 [get_ports XADC_MUX_ADDR0_LS]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_MUX_ADDR0_LS]
+##set_property PACKAGE_PIN A25 [get_ports XADC_MUX_ADDR1_LS]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_MUX_ADDR1_LS]
+##set_property PACKAGE_PIN A23 [get_ports XADC_MUX_ADDR2_LS]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_MUX_ADDR2_LS]
+##set_property PACKAGE_PIN A24 [get_ports PCIE_MGT_CLK_SEL0]
+##set_property IOSTANDARD LVCMOS25 [get_ports PCIE_MGT_CLK_SEL0]
+##set_property PACKAGE_PIN C26 [get_ports PCIE_MGT_CLK_SEL1]
+##set_property IOSTANDARD LVCMOS25 [get_ports PCIE_MGT_CLK_SEL1]
+##set_property PACKAGE_PIN B26 [get_ports SFP_MGT_CLK_SEL0]
+##set_property IOSTANDARD LVCMOS25 [get_ports SFP_MGT_CLK_SEL0]
+##set_property PACKAGE_PIN C24 [get_ports SFP_MGT_CLK_SEL1]
+##set_property IOSTANDARD LVCMOS25 [get_ports SFP_MGT_CLK_SEL1]
+##set_property PACKAGE_PIN B24 [get_ports SI5324_RST_LS_B]
+##set_property IOSTANDARD LVCMOS25 [get_ports SI5324_RST_LS_B]
+##set_property PACKAGE_PIN D23 [get_ports REC_CLOCK_C_P]
+##set_property IOSTANDARD LVDS_25 [get_ports REC_CLOCK_C_P]
+##set_property PACKAGE_PIN D24 [get_ports REC_CLOCK_C_N]
+##set_property IOSTANDARD LVDS_25 [get_ports REC_CLOCK_C_N]
+##set_property PACKAGE_PIN E22 [get_ports XADC_GPIO_1]
+##set_property IOSTANDARD LVCMOS25 [get_ports XADC_GPIO_1]
+##set_property PACKAGE_PIN V4 [get_ports No]
+##set_property IOSTANDARD LVCMOS15 [get_ports No]
+##set_property PACKAGE_PIN V1 [get_ports DDR3_D31]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D31]
+##set_property PACKAGE_PIN W1 [get_ports DDR3_D30]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D30]
+##set_property PACKAGE_PIN W5 [get_ports DDR3_D29]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D29]
+##set_property PACKAGE_PIN W4 [get_ports DDR3_D28]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D28]
+##set_property PACKAGE_PIN V3 [get_ports DDR3_DQS3_P]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS3_P]
+##set_property PACKAGE_PIN V2 [get_ports DDR3_DQS3_N]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS3_N]
+##set_property PACKAGE_PIN V6 [get_ports DDR3_D27]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D27]
+##set_property PACKAGE_PIN W6 [get_ports DDR3_D26]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D26]
+##set_property PACKAGE_PIN W3 [get_ports DDR3_D25]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D25]
+##set_property PACKAGE_PIN Y3 [get_ports DDR3_D24]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D24]
+##set_property PACKAGE_PIN U7 [get_ports DDR3_DM3]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM3]
+##set_property PACKAGE_PIN V7 [get_ports VTTVREF]
+##set_property IOSTANDARD SSTL15 [get_ports VTTVREF]
+##set_property PACKAGE_PIN AB1 [get_ports DDR3_D23]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D23]
+##set_property PACKAGE_PIN AC1 [get_ports DDR3_D22]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D22]
+##set_property PACKAGE_PIN Y2 [get_ports DDR3_D21]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D21]
+##set_property PACKAGE_PIN Y1 [get_ports DDR3_D20]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D20]
+##set_property PACKAGE_PIN AD1 [get_ports DDR3_DQS2_P]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS2_P]
+##set_property PACKAGE_PIN AE1 [get_ports DDR3_DQS2_N]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS2_N]
+##set_property PACKAGE_PIN AE2 [get_ports DDR3_D19]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D19]
+##set_property PACKAGE_PIN AF2 [get_ports DDR3_D18]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D18]
+##set_property PACKAGE_PIN AB2 [get_ports DDR3_D17]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D17]
+##set_property PACKAGE_PIN AC2 [get_ports DDR3_D16]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D16]
+##set_property PACKAGE_PIN AA3 [get_ports DDR3_DM2]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM2]
+##set_property PACKAGE_PIN AA2 [get_ports No]
+##set_property IOSTANDARD SSTL15 [get_ports No]
+##set_property PACKAGE_PIN AA4 [get_ports DDR3_D15]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D15]
+##set_property PACKAGE_PIN AB4 [get_ports DDR3_D14]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D14]
+##set_property PACKAGE_PIN AC3 [get_ports DDR3_D13]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D13]
+##set_property PACKAGE_PIN AD3 [get_ports DDR3_D12]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D12]
+##set_property PACKAGE_PIN AD5 [get_ports DDR3_DQS1_P]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS1_P]
+##set_property PACKAGE_PIN AE5 [get_ports DDR3_DQS1_N]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS1_N]
+##set_property PACKAGE_PIN AE3 [get_ports DDR3_D11]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D11]
+##set_property PACKAGE_PIN AF3 [get_ports DDR3_D10]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D10]
+##set_property PACKAGE_PIN AF5 [get_ports DDR3_D9]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D9]
+##set_property PACKAGE_PIN AF4 [get_ports DDR3_D8]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D8]
+##set_property PACKAGE_PIN AC4 [get_ports DDR3_DM1]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM1]
+##set_property PACKAGE_PIN AD4 [get_ports No]
+##set_property IOSTANDARD SSTL15 [get_ports No]
+##set_property PACKAGE_PIN Y7 [get_ports DDR3_D7]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D7]
+##set_property PACKAGE_PIN AA7 [get_ports VTTVREF]
+##set_property IOSTANDARD SSTL15 [get_ports VTTVREF]
+##set_property PACKAGE_PIN Y6 [get_ports DDR3_D6]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D6]
+##set_property PACKAGE_PIN Y5 [get_ports DDR3_D5]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D5]
+##set_property PACKAGE_PIN V8 [get_ports DDR3_DQS0_P]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_DQS0_P]
+##set_property PACKAGE_PIN W8 [get_ports DDR3_DQS0_N]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_DQS0_N]
+##set_property PACKAGE_PIN AA5 [get_ports DDR3_D4]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D4]
+##set_property PACKAGE_PIN AB5 [get_ports DDR3_D3]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D3]
+##set_property PACKAGE_PIN Y8 [get_ports DDR3_D2]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D2]
+##set_property PACKAGE_PIN AA8 [get_ports DDR3_D1]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D1]
+##set_property PACKAGE_PIN AB6 [get_ports DDR3_D0]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D0]
+##set_property PACKAGE_PIN AC6 [get_ports DDR3_DM0]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM0]
+##set_property PACKAGE_PIN V9 [get_ports No]
+##set_property IOSTANDARD SSTL15 [get_ports No]
+##set_property PACKAGE_PIN N8 [get_ports DDR3_RESET_B]
+##set_property IOSTANDARD LVCMOS15 [get_ports DDR3_RESET_B]
+##set_property PACKAGE_PIN K3 [get_ports DDR3_A9]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A9]
+##set_property PACKAGE_PIN J3 [get_ports DDR3_A1]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A1]
+##set_property PACKAGE_PIN M7 [get_ports DDR3_A5]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A5]
+##set_property PACKAGE_PIN L7 [get_ports DDR3_A12]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A12]
+##set_property PACKAGE_PIN M4 [get_ports DDR3_A0]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A0]
+##set_property PACKAGE_PIN L4 [get_ports DDR3_A3]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A3]
+##set_property PACKAGE_PIN L5 [get_ports DDR3_A11]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A11]
+##set_property PACKAGE_PIN K5 [get_ports DDR3_A4]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A4]
+##set_property PACKAGE_PIN N7 [get_ports DDR3_A10]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A10]
+##set_property PACKAGE_PIN N6 [get_ports DDR3_A13]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A13]
+##set_property PACKAGE_PIN M6 [get_ports DDR3_A7]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A7]
+##set_property PACKAGE_PIN M5 [get_ports VTTVREF]
+##set_property IOSTANDARD SSTL15 [get_ports VTTVREF]
+##set_property PACKAGE_PIN K1 [get_ports DDR3_A6]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A6]
+##set_property PACKAGE_PIN J1 [get_ports DDR3_A2]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A2]
+##set_property PACKAGE_PIN L3 [get_ports DDR3_A14]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A14]
+##set_property PACKAGE_PIN K2 [get_ports DDR3_A15]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A15]
+##set_property PACKAGE_PIN N1 [get_ports DDR3_BA0]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_BA0]
+##set_property PACKAGE_PIN M1 [get_ports DDR3_BA1]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_BA1]
+##set_property PACKAGE_PIN H2 [get_ports DDR3_BA2]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_BA2]
+##set_property PACKAGE_PIN H1 [get_ports DDR3_A8]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_A8]
+##set_property PACKAGE_PIN M2 [get_ports DDR3_CLK0_P]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_CLK0_P]
+##set_property PACKAGE_PIN L2 [get_ports DDR3_CLK0_N]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_CLK0_N]
+##set_property PACKAGE_PIN N3 [get_ports DDR3_CLK1_P]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_CLK1_P]
+##set_property PACKAGE_PIN N2 [get_ports DDR3_CLK1_N]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_CLK1_N]
+##set_property PACKAGE_PIN R3 [get_ports SYSCLK_P]
+##set_property IOSTANDARD LVDS_25 [get_ports SYSCLK_P]
+##set_property PACKAGE_PIN P3 [get_ports SYSCLK_N]
+##set_property IOSTANDARD LVDS_25 [get_ports SYSCLK_N]
+##set_property PACKAGE_PIN P4 [get_ports DDR3_CKE0]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_CKE0]
+##set_property PACKAGE_PIN N4 [get_ports DDR3_CKE1]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_CKE1]
+##set_property PACKAGE_PIN R1 [get_ports DDR3_WE_B]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_WE_B]
+##set_property PACKAGE_PIN P1 [get_ports DDR3_RAS_B]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_RAS_B]
+##set_property PACKAGE_PIN T4 [get_ports DDR3_CAS_B]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_CAS_B]
+##set_property PACKAGE_PIN T3 [get_ports DDR3_S0_B]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_S0_B]
+##set_property PACKAGE_PIN T2 [get_ports DDR3_S1_B]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_S1_B]
+##set_property PACKAGE_PIN R2 [get_ports DDR3_ODT0]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_ODT0]
+##set_property PACKAGE_PIN U2 [get_ports DDR3_ODT1]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_ODT1]
+##set_property PACKAGE_PIN U1 [get_ports DDR3_TEMP_EVENT]
+##set_property IOSTANDARD LVCMOS15 [get_ports DDR3_TEMP_EVENT]
+##set_property PACKAGE_PIN P6 [get_ports GPIO_SW_N]
+##set_property IOSTANDARD LVCMOS15 [get_ports GPIO_SW_N]
+##set_property PACKAGE_PIN P5 [get_ports VTTVREF]
+##set_property IOSTANDARD SSTL15 [get_ports VTTVREF]
+##set_property PACKAGE_PIN T5 [get_ports GPIO_SW_S]
+##set_property IOSTANDARD SSTL15 [get_ports GPIO_SW_S]
+##set_property PACKAGE_PIN R5 [get_ports GPIO_SW_W]
+##set_property IOSTANDARD SSTL15 [get_ports GPIO_SW_W]
+##set_property PACKAGE_PIN U6 [get_ports GPIO_SW_C]
+##set_property IOSTANDARD SSTL15 [get_ports GPIO_SW_C]
+##set_property PACKAGE_PIN U5 [get_ports GPIO_SW_E]
+##set_property IOSTANDARD SSTL15 [get_ports GPIO_SW_E]
+##set_property PACKAGE_PIN R8 [get_ports GPIO_DIP_SW0]
+##set_property IOSTANDARD SSTL15 [get_ports GPIO_DIP_SW0]
+##set_property PACKAGE_PIN P8 [get_ports GPIO_DIP_SW1]
+##set_property IOSTANDARD SSTL15 [get_ports GPIO_DIP_SW1]
+##set_property PACKAGE_PIN R7 [get_ports GPIO_DIP_SW2]
+##set_property IOSTANDARD SSTL15 [get_ports GPIO_DIP_SW2]
+##set_property PACKAGE_PIN R6 [get_ports GPIO_DIP_SW3]
+##set_property IOSTANDARD SSTL15 [get_ports GPIO_DIP_SW3]
+##set_property PACKAGE_PIN T8 [get_ports USER_SMA_GPIO_P]
+##set_property IOSTANDARD LVDS_25 [get_ports USER_SMA_GPIO_P]
+##set_property PACKAGE_PIN T7 [get_ports USER_SMA_GPIO_N]
+##set_property IOSTANDARD LVDS_25 [get_ports USER_SMA_GPIO_N]
+##set_property PACKAGE_PIN U4 [get_ports CPU_RESET]
+##set_property IOSTANDARD LVCMOS15 [get_ports CPU_RESET]
+##set_property PACKAGE_PIN J8 [get_ports No]
+##set_property IOSTANDARD SSTL15 [get_ports No]
+##set_property PACKAGE_PIN E6 [get_ports DDR3_D63]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D63]
+##set_property PACKAGE_PIN D6 [get_ports DDR3_D62]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D62]
+##set_property PACKAGE_PIN H8 [get_ports DDR3_D61]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D61]
+##set_property PACKAGE_PIN G8 [get_ports DDR3_D60]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D60]
+##set_property PACKAGE_PIN H7 [get_ports DDR3_DQS7_P]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS7_P]
+##set_property PACKAGE_PIN G7 [get_ports DDR3_DQS7_N]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS7_N]
+##set_property PACKAGE_PIN F8 [get_ports DDR3_D59]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D59]
+##set_property PACKAGE_PIN F7 [get_ports DDR3_D58]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D58]
+##set_property PACKAGE_PIN H6 [get_ports DDR3_D57]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D57]
+##set_property PACKAGE_PIN G6 [get_ports DDR3_D56]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D56]
+##set_property PACKAGE_PIN H9 [get_ports DDR3_DM7]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM7]
+##set_property PACKAGE_PIN G9 [get_ports VTTVREF]
+##set_property IOSTANDARD SSTL15 [get_ports VTTVREF]
+##set_property PACKAGE_PIN J6 [get_ports DDR3_D55]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D55]
+##set_property PACKAGE_PIN J5 [get_ports DDR3_D54]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D54]
+##set_property PACKAGE_PIN L8 [get_ports DDR3_D53]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D53]
+##set_property PACKAGE_PIN K8 [get_ports DDR3_D52]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D52]
+##set_property PACKAGE_PIN J4 [get_ports DDR3_DQS6_P]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS6_P]
+##set_property PACKAGE_PIN H4 [get_ports DDR3_DQS6_N]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS6_N]
+##set_property PACKAGE_PIN K7 [get_ports DDR3_D51]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D51]
+##set_property PACKAGE_PIN K6 [get_ports DDR3_D50]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D50]
+##set_property PACKAGE_PIN G4 [get_ports DDR3_D49]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D49]
+##set_property PACKAGE_PIN F4 [get_ports DDR3_D48]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D48]
+##set_property PACKAGE_PIN G5 [get_ports DDR3_DM6]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM6]
+##set_property PACKAGE_PIN F5 [get_ports No]
+##set_property IOSTANDARD SSTL15 [get_ports No]
+##set_property PACKAGE_PIN E5 [get_ports DDR3_D47]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D47]
+##set_property PACKAGE_PIN D5 [get_ports DDR3_D46]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D46]
+##set_property PACKAGE_PIN D4 [get_ports DDR3_D45]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D45]
+##set_property PACKAGE_PIN C4 [get_ports DDR3_D44]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D44]
+##set_property PACKAGE_PIN B5 [get_ports DDR3_DQS5_P]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS5_P]
+##set_property PACKAGE_PIN A5 [get_ports DDR3_DQS5_N]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS5_N]
+##set_property PACKAGE_PIN B4 [get_ports DDR3_D43]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D43]
+##set_property PACKAGE_PIN A4 [get_ports DDR3_D42]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D42]
+##set_property PACKAGE_PIN D3 [get_ports DDR3_D41]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D41]
+##set_property PACKAGE_PIN C3 [get_ports DDR3_D40]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D40]
+##set_property PACKAGE_PIN F3 [get_ports DDR3_DM5]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM5]
+##set_property PACKAGE_PIN E3 [get_ports No]
+##set_property IOSTANDARD SSTL15 [get_ports No]
+##set_property PACKAGE_PIN C2 [get_ports DDR3_D39]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D39]
+##set_property PACKAGE_PIN B2 [get_ports VTTVREF]
+##set_property IOSTANDARD SSTL15 [get_ports VTTVREF]
+##set_property PACKAGE_PIN A3 [get_ports DDR3_D38]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D38]
+##set_property PACKAGE_PIN A2 [get_ports DDR3_D37]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D37]
+##set_property PACKAGE_PIN C1 [get_ports DDR3_DQS4_P]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS4_P]
+##set_property PACKAGE_PIN B1 [get_ports DDR3_DQS4_N]
+##set_property IOSTANDARD DIFF_SSTL15 [get_ports DDR3_DQS4_N]
+##set_property PACKAGE_PIN F2 [get_ports DDR3_D36]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D36]
+##set_property PACKAGE_PIN E2 [get_ports DDR3_D35]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D35]
+##set_property PACKAGE_PIN E1 [get_ports DDR3_D34]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D34]
+##set_property PACKAGE_PIN D1 [get_ports DDR3_D33]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D33]
+##set_property PACKAGE_PIN G2 [get_ports DDR3_D32]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_D32]
+##set_property PACKAGE_PIN G1 [get_ports DDR3_DM4]
+##set_property IOSTANDARD SSTL15 [get_ports DDR3_DM4]
+##set_property PACKAGE_PIN H3 [get_ports No]
+##set_property IOSTANDARD SSTL15 [get_ports No]
+##set_property PACKAGE_PIN AB13 [get_ports SFP_MGT_CLK0_N]
+##set_property IOSTANDARD LVDS_25 [get_ports SFP_MGT_CLK0_N]
+##set_property PACKAGE_PIN AA13 [get_ports SFP_MGT_CLK0_P]
+##set_property IOSTANDARD LVDS_25 [get_ports SFP_MGT_CLK0_P]
+##set_property PACKAGE_PIN AF15 [get_ports MGTRREF_213]
+##set_property IOSTANDARD LVDS_25 [get_ports MGTRREF_213]
+##set_property PACKAGE_PIN AA11 [get_ports SFP_MGT_CLK1_P]
+##set_property IOSTANDARD LVDS_25 [get_ports SFP_MGT_CLK1_P]
+##set_property PACKAGE_PIN AB11 [get_ports SFP_MGT_CLK1_N]
+##set_property IOSTANDARD LVDS_25 [get_ports SFP_MGT_CLK1_N]
+##set_property PACKAGE_PIN E11 [get_ports PCIE_CLK_QO_N]
+##set_property IOSTANDARD LVDS_25 [get_ports PCIE_CLK_QO_N]
+##set_property PACKAGE_PIN F11 [get_ports PCIE_CLK_QO_P]
+##set_property IOSTANDARD LVDS_25 [get_ports PCIE_CLK_QO_P]
+##set_property PACKAGE_PIN A15 [get_ports MGTRREF_216]
+##set_property IOSTANDARD LVDS_25 [get_ports MGTRREF_216]
+##set_property PACKAGE_PIN F13 [get_ports No]
+##set_property IOSTANDARD LVDS_25 [get_ports No]
+##set_property PACKAGE_PIN E13 [get_ports No]
+##set_property IOSTANDARD LVDS_25 [get_ports No]
+
+
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[0]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[1]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[2]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[3]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[4]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[5]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[6]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[7]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[8]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[9]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[10]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[11]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[12]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[13]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[14]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P0[15]} ]
+
+set_property PULLUP true [get_ports {P0[0]} ]
+set_property PULLUP true [get_ports {P0[1]} ]
+set_property PULLUP true [get_ports {P0[2]} ]
+set_property PULLUP true [get_ports {P0[3]} ]
+set_property PULLUP true [get_ports {P0[4]} ]
+set_property PULLUP true [get_ports {P0[5]} ]
+set_property PULLUP true [get_ports {P0[6]} ]
+set_property PULLUP true [get_ports {P0[7]} ]
+set_property PULLUP true [get_ports {P0[8]} ]
+set_property PULLUP true [get_ports {P0[9]} ]
+set_property PULLUP true [get_ports {P0[10]} ]
+set_property PULLUP true [get_ports {P0[11]} ]
+set_property PULLUP true [get_ports {P0[12]} ]
+set_property PULLUP true [get_ports {P0[13]} ]
+set_property PULLUP true [get_ports {P0[14]} ]
+set_property PULLUP true [get_ports {P0[15]} ]
+
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[0]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[1]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[2]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[3]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[4]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[5]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[6]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[7]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[8]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[9]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[10]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[11]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[12]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[13]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[14]} ]
+set_property IOSTANDARD LVCMOS33 [get_ports {P1[15]} ]
+
+set_property PULLUP true [get_ports {P1[0]} ]
+set_property PULLUP true [get_ports {P1[1]} ]
+set_property PULLUP true [get_ports {P1[2]} ]
+set_property PULLUP true [get_ports {P1[3]} ]
+set_property PULLUP true [get_ports {P1[4]} ]
+set_property PULLUP true [get_ports {P1[5]} ]
+set_property PULLUP true [get_ports {P1[6]} ]
+set_property PULLUP true [get_ports {P1[7]} ]
+set_property PULLUP true [get_ports {P1[8]} ]
+set_property PULLUP true [get_ports {P1[9]} ]
+set_property PULLUP true [get_ports {P1[10]} ]
+set_property PULLUP true [get_ports {P1[11]} ]
+set_property PULLUP true [get_ports {P1[12]} ]
+set_property PULLUP true [get_ports {P1[13]} ]
+set_property PULLUP true [get_ports {P1[14]} ]
+set_property PULLUP true [get_ports {P1[15]} ]
+
+set_property PULLDOWN true [get_ports {SWDIOTMS} ]
+set_property PULLDOWN true [get_ports {SWCLKTCK} ]
+
+#PMODA pin0 to FTCLK
+set_property PACKAGE_PIN T22 [get_ports {P1[1]}]
+
+#PMODA pin1 to FTSSN
+set_property PACKAGE_PIN T23 [get_ports {P1[3]}]
+
+#PMODA pin2 to FTMISO
+set_property PACKAGE_PIN P26 [get_ports {P1[0]}]
+
+#PMODA pin3 to FTMIOSIO
+set_property PACKAGE_PIN R22 [get_ports {P1[2]}]
+
+#PMODB pin1 to SWDIOTMS
+##set_property PACKAGE_PIN G6 [get_ports SWDIOTMS]
+
+#PMODB pin4 to SWCLKTCK
+##set_property PACKAGE_PIN H7 [get_ports SWCLKTCK]
+##set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets uPAD_SWDCLK_I/IOBUF3V3/O]
+
+#PMODA pin4 : UART2RXD
+#PMODA pin4 : UART2TXD
+
+
+# LED0 to P0[0]
+set_property PACKAGE_PIN M26 [get_ports {P0[0]}]
+# LED1 to P0[1]
+set_property PACKAGE_PIN T24 [get_ports {P0[1]}]
+# LED2 to P0[2]
+set_property PACKAGE_PIN T25 [get_ports {P0[2]}]
+# LED3 to P0[3]
+set_property PACKAGE_PIN R26 [get_ports {P0[3]}]
+
+# SW0 to NRST (Down for active low)
+set_property PACKAGE_PIN R8 [get_ports NRST]
+
+# USR CLOCK P (need dvider)
+##set_property IOSTANDARD LVCMOS18 [get_ports XTAL1 ]
+#set_property PACKAGE_PIN M21 [get_ports XTAL1]
+#set_property PACKAGE_PIN R17 [get_ports XTAL2]
+
+#Board ref clock - 200MHz (need dvider)
+#set_property PACKAGE_PIN R3 [get_ports XTAL1]
+#set_property PACKAGE_PIN P3 [get_ports XTAL2]
+#Board user clock - 200MHz (need dvider)
+set_property PACKAGE_PIN M21 [get_ports XTAL1]
+set_property PACKAGE_PIN M22 [get_ports XTAL2]
+
+
+## auto mapped - to remap
+set_property PACKAGE_PIN R20 [get_ports {P0[10]}]
+set_property PACKAGE_PIN P24 [get_ports {P0[11]}]
+set_property PACKAGE_PIN P23 [get_ports {P0[12]}]
+set_property PACKAGE_PIN N19 [get_ports {P0[13]}]
+set_property PACKAGE_PIN P19 [get_ports {P0[14]}]
+set_property PACKAGE_PIN N24 [get_ports {P0[15]}]
+set_property PACKAGE_PIN R18 [get_ports {P0[4]}]
+set_property PACKAGE_PIN R23 [get_ports {P0[5]}]
+set_property PACKAGE_PIN N26 [get_ports {P0[6]}]
+set_property PACKAGE_PIN P25 [get_ports {P0[7]}]
+set_property PACKAGE_PIN R25 [get_ports {P0[8]}]
+set_property PACKAGE_PIN R21 [get_ports {P0[9]}]
+set_property PACKAGE_PIN M25 [get_ports {P1[10]}]
+set_property PACKAGE_PIN M24 [get_ports {P1[11]}]
+set_property PACKAGE_PIN L25 [get_ports {P1[12]}]
+set_property PACKAGE_PIN L24 [get_ports {P1[13]}]
+set_property PACKAGE_PIN L20 [get_ports {P1[14]}]
+set_property PACKAGE_PIN M20 [get_ports {P1[15]}]
+set_property PACKAGE_PIN N23 [get_ports {P1[4]}]
+set_property PACKAGE_PIN P21 [get_ports {P1[5]}]
+set_property PACKAGE_PIN P20 [get_ports {P1[6]}]
+set_property PACKAGE_PIN N22 [get_ports {P1[7]}]
+set_property PACKAGE_PIN N21 [get_ports {P1[8]}]
+set_property PACKAGE_PIN L23 [get_ports {P1[9]}]
+set_property PACKAGE_PIN L22 [get_ports SWCLKTCK]
+set_property PACKAGE_PIN K26 [get_ports SWDIOTMS]
+set_property PACKAGE_PIN K25 [get_ports VDD]
+set_property PACKAGE_PIN N18 [get_ports VDDIO]
+set_property PACKAGE_PIN P18 [get_ports VSS]
+set_property PACKAGE_PIN R17 [get_ports VSSIO]
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_synth.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_synth.tcl
new file mode 100644
index 0000000..a13e2b6
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_synth.tcl
@@ -0,0 +1,40 @@
+
+synth_design -top cmsdk_mcu_chip -part xc7a200tfbg676-2
+
+write_verilog -force $outputDir/cmsdk_mcu_synth_netlist.v
+
+# # Create interface ports
+# 
+# disconnect_net -net XTAL1 -objects {uPAD_XTAL_I/XTAL1}
+# disconnect_net -net XTAL2 -objects {uPAD_XTAL_O/XTAL2}
+# #disconnect_net -net xtal_clk_in] [get_pins XTAL1 uPAD_XTAL1_PAD/IOBUF3V3/I]]
+
+# set sys_diff_clock [ create_intf_port -mode Slave -vlnv xilinx.com:interface:diff_clock_rtl:1.0 sys_diff_clock ]
+# set_property -dict [ list \
+#  CONFIG.FREQ_HZ {200000000} \
+#  ] $sys_diff_clock
+
+#  set reset [ create_bd_port -dir I -type rst reset ]
+#  set_property -dict [ list \
+#   CONFIG.POLARITY {ACTIVE_HIGH} \
+# ] $reset
+
+# # Create instance: clk_wiz_20M, and set properties
+# set clk_wiz_20M [ create_cell -type ip -vlnv xilinx.com:ip:clk_wiz:6.0 clk_wiz_20M ]
+# set_property -dict [ list \
+#  CONFIG.CLKOUT1_JITTER {155.788} \
+#  CONFIG.CLKOUT1_PHASE_ERROR {94.329} \
+#  CONFIG.CLKOUT1_REQUESTED_OUT_FREQ {20.000} \
+#  CONFIG.CLK_IN1_BOARD_INTERFACE {sys_diff_clock} \
+#  CONFIG.MMCM_CLKFBOUT_MULT_F {4.250} \
+#  CONFIG.MMCM_CLKOUT0_DIVIDE_F {42.500} \
+#  CONFIG.RESET_BOARD_INTERFACE {reset} \
+#  CONFIG.USE_BOARD_FLOW {false} \
+#] $clk_wiz_20M
+
+# # Create interface connections
+# connect_net -intf_net sys_diff_clock_1 [get_ports sys_diff_clock] [get_pins clk_wiz_20M/CLK_IN1_D]
+
+# # Create port connections
+# connect_net -net clk_wiz_0_clk_out1 [get_pins xtal_clk_in] [get_bd_pins clk_wiz_20M/clk_out1]
+# connect_net -net reset_1 [get_bd_ports reset] [get_bd_pins clk_wiz_20M/reset]
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_timing.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_timing.xdc
new file mode 100644
index 0000000..cb4cef4
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_ac701/fpga_timing.xdc
@@ -0,0 +1,95 @@
+##################################################################################
+##                                                                              ##
+## ZYNQ timing XDC                                                              ##
+##                                                                              ##
+##################################################################################
+
+create_clock -name CLK -period 30 [get_ports XTAL1]
+create_clock -name VCLK -period 30 -waveform {5 20}
+
+create_clock -name SWCLK -period 60 [get_ports SWCLKTCK]
+create_clock -name VSWCLK -period 60 -waveform {5 35}
+
+set_clock_groups -name async_clk_swclock -asynchronous \
+-group [get_clocks -include_generated_clocks CLK] \
+-group [get_clocks -include_generated_clocks VSWCLK]
+
+#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports {dip_switch_4bits_tri_i[*]}]
+#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports {dip_switch_4bits_tri_i[*]}]
+#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_2]
+#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports PMOD0_2]
+#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_3]
+#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports PMOD0_3]
+#set_output_delay -clock [get_clocks clk_pl_0] -min -add_delay 5.000 [get_ports {led_4bits_tri_o[*]}]
+#set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {led_4bits_tri_o[*]}]
+
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[0]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[0]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[1]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[1]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[2]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[2]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[3]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[3]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[4]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[4]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[5]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[5]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[6]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[6]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[7]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[7]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[8]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[8]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[9]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[9]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[10]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[10]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[11]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[11]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[12]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[12]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[13]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[13]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[14]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[14]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[15]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[15]}]
+
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[0]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[0]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[1]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[1]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[2]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[2]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[3]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[3]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[4]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[4]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[5]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[5]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[6]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[6]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[7]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[7]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[8]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[8]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[9]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[9]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[10]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[10]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[11]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[11]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[12]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[12]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[13]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[13]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[14]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[14]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[15]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[15]}]
+
+set_property C_CLK_INPUT_FREQ_HZ 5000000 [get_debug_cores dbg_hub]
+set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
+set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
+connect_debug_port dbg_hub/clk [get_nets clk]
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_pinmap.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_pinmap.xdc
new file mode 100644
index 0000000..5fbe61e
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_pinmap.xdc
@@ -0,0 +1,915 @@
+# -----------------------------------------------------------------------------
+# Purpose : Main timing constraints and pin list for MPS3
+# -----------------------------------------------------------------------------
+
+####################################################################################
+# Pin Assigment
+####################################################################################
+
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_* ETH_* USB_* CLCD_* USER_nLED* USER_SW* USER_nPB* HDMI_* CS_* SH_ADC* UART_*}]
+
+set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[5]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[4]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[23]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[22]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[21]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[20]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[19]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[18]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[17]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[16]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[15]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[14]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[13]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[12]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[11]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[10]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[9]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[8]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[7]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[6]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[5]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[4]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_SD[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_SD[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_SD[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_SD[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports MMB_DE]
+set_property IOSTANDARD LVCMOS18 [get_ports MMB_HS]
+set_property IOSTANDARD LVCMOS18 [get_ports MMB_IDCLK]
+set_property IOSTANDARD LVCMOS18 [get_ports MMB_SCK]
+set_property IOSTANDARD LVCMOS18 [get_ports MMB_VS]
+set_property IOSTANDARD LVCMOS18 [get_ports MMB_WS]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[7]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[6]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[5]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[4]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports EMMC_CLK]
+set_property IOSTANDARD LVCMOS18 [get_ports EMMC_CMD]
+set_property IOSTANDARD LVCMOS18 [get_ports EMMC_DS]
+set_property IOSTANDARD LVCMOS18 [get_ports EMMC_nRST]
+# not used
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_BIDIR_P[3]}]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_BIDIR_N[3]}]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_BIDIR_P[2]}]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_BIDIR_N[2]}]
+
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_LRCK]
+set_property PACKAGE_PIN Y30 [get_ports AUD_LRCK]
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_MCLK]
+set_property PACKAGE_PIN AB29 [get_ports AUD_MCLK]
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_nRST]
+set_property PACKAGE_PIN AA27 [get_ports AUD_nRST]
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_SCL]
+set_property PACKAGE_PIN AA28 [get_ports AUD_SCL]
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_SCLK]
+set_property PACKAGE_PIN AB30 [get_ports AUD_SCLK]
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_SDA]
+set_property PACKAGE_PIN AA29 [get_ports AUD_SDA]
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_SDIN]
+set_property PACKAGE_PIN AA30 [get_ports AUD_SDIN]
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_SDOUT]
+set_property PACKAGE_PIN Y27 [get_ports AUD_SDOUT]
+set_property IOSTANDARD LVCMOS33 [get_ports CB_nPOR]
+set_property PACKAGE_PIN AU22 [get_ports CB_nPOR]
+set_property IOSTANDARD LVCMOS33 [get_ports CB_nRST]
+set_property PACKAGE_PIN AV23 [get_ports CB_nRST]
+set_property IOSTANDARD LVCMOS33 [get_ports CB_RUN]
+set_property PACKAGE_PIN AR25 [get_ports CB_RUN]
+set_property IOSTANDARD LVCMOS33 [get_ports CFG_CLK]
+set_property PACKAGE_PIN AT20 [get_ports CFG_CLK]
+set_property IOSTANDARD LVCMOS33 [get_ports CFG_DATAIN]
+set_property PACKAGE_PIN AT19 [get_ports CFG_DATAIN]
+set_property IOSTANDARD LVCMOS33 [get_ports CFG_DATAOUT]
+set_property PACKAGE_PIN AV18 [get_ports CFG_DATAOUT]
+set_property IOSTANDARD LVCMOS33 [get_ports CFG_LOAD]
+set_property PACKAGE_PIN AW18 [get_ports CFG_LOAD]
+set_property IOSTANDARD LVCMOS33 [get_ports CFG_nRST]
+set_property PACKAGE_PIN AR20 [get_ports CFG_nRST]
+set_property IOSTANDARD LVCMOS33 [get_ports CFG_WnR]
+set_property PACKAGE_PIN AT18 [get_ports CFG_WnR]
+set_property PACKAGE_PIN AJ16 [get_ports CLCD_BL]
+set_property PACKAGE_PIN AP15 [get_ports CLCD_CS]
+set_property PACKAGE_PIN AN17 [get_ports {CLCD_PD[10]}]
+set_property PACKAGE_PIN AP16 [get_ports {CLCD_PD[11]}]
+set_property PACKAGE_PIN AP18 [get_ports {CLCD_PD[12]}]
+set_property PACKAGE_PIN AR18 [get_ports {CLCD_PD[13]}]
+set_property PACKAGE_PIN AM16 [get_ports {CLCD_PD[14]}]
+set_property PACKAGE_PIN AN16 [get_ports {CLCD_PD[15]}]
+set_property PACKAGE_PIN AR17 [get_ports {CLCD_PD[16]}]
+set_property PACKAGE_PIN AR16 [get_ports {CLCD_PD[17]}]
+set_property PACKAGE_PIN AM15 [get_ports CLCD_RD]
+set_property PACKAGE_PIN AN14 [get_ports CLCD_RS]
+set_property PACKAGE_PIN AK18 [get_ports CLCD_RST]
+#set_property PACKAGE_PIN AN18 [get_ports CLCD_SDI]
+#set_property PACKAGE_PIN AH16 [get_ports CLCD_SDO]
+set_property PACKAGE_PIN AJ14 [get_ports CLCD_TINT]
+set_property PACKAGE_PIN AL17 [get_ports CLCD_TNC]
+set_property PACKAGE_PIN AL18 [get_ports CLCD_TSCL]
+set_property PACKAGE_PIN AJ15 [get_ports CLCD_TSDA]
+set_property PACKAGE_PIN AP14 [get_ports CLCD_WR_SCL]
+# not used
+# set_property PACKAGE_PIN N28 [get_ports {CLK_BIDIR_P[2]}]
+# set_property PACKAGE_PIN N29 [get_ports {CLK_BIDIR_N[2]}]
+# set_property PACKAGE_PIN E32 [get_ports {CLK_BIDIR_P[3]}]
+# set_property PACKAGE_PIN D33 [get_ports {CLK_BIDIR_N[3]}]
+# set_property PACKAGE_PIN G31 [get_ports {CLK_M2C_P[0]}]
+# set_property PACKAGE_PIN F32 [get_ports {CLK_M2C_N[0]}]
+# set_property PACKAGE_PIN E31 [get_ports {CLK_M2C_P[1]}]
+# set_property PACKAGE_PIN D31 [get_ports {CLK_M2C_N[1]}]
+set_property PACKAGE_PIN BB39 [get_ports CS_nDET]
+set_property PACKAGE_PIN BB36 [get_ports CS_nSRST]
+set_property PACKAGE_PIN BB37 [get_ports CS_nTRST]
+set_property PACKAGE_PIN AW33 [get_ports CS_T_CLK]
+set_property PACKAGE_PIN AY35 [get_ports CS_T_CTL]
+set_property PACKAGE_PIN AW34 [get_ports {CS_T_D[0]}]
+set_property PACKAGE_PIN AT34 [get_ports {CS_T_D[1]}]
+set_property PACKAGE_PIN AU34 [get_ports {CS_T_D[2]}]
+set_property PACKAGE_PIN AV36 [get_ports {CS_T_D[3]}]
+set_property PACKAGE_PIN AW36 [get_ports {CS_T_D[4]}]
+set_property PACKAGE_PIN AT35 [get_ports {CS_T_D[5]}]
+set_property PACKAGE_PIN AU35 [get_ports {CS_T_D[6]}]
+set_property PACKAGE_PIN AU36 [get_ports {CS_T_D[7]}]
+set_property PACKAGE_PIN AV37 [get_ports {CS_T_D[8]}]
+set_property PACKAGE_PIN AW35 [get_ports {CS_T_D[9]}]
+set_property PACKAGE_PIN AY36 [get_ports {CS_T_D[10]}]
+set_property PACKAGE_PIN AY37 [get_ports {CS_T_D[11]}]
+set_property PACKAGE_PIN BB34 [get_ports {CS_T_D[12]}]
+set_property PACKAGE_PIN BB35 [get_ports {CS_T_D[13]}]
+set_property PACKAGE_PIN BA37 [get_ports {CS_T_D[14]}]
+set_property PACKAGE_PIN BA38 [get_ports {CS_T_D[15]}]
+set_property PACKAGE_PIN AV33 [get_ports CS_TCK]
+set_property PACKAGE_PIN BA35 [get_ports CS_TDI]
+set_property PACKAGE_PIN AW38 [get_ports CS_TDO]
+set_property PACKAGE_PIN AY38 [get_ports CS_TMS]
+# not used
+#set_property IOSTANDARD POD12_DCI [get_ports {DDR_CHIPID[0]}]
+#set_property PACKAGE_PIN J19 [get_ports {DDR_CHIPID[0]}]
+#set_property IOSTANDARD POD12_DCI [get_ports {DDR_CHIPID[1]}]
+#set_property PACKAGE_PIN G20 [get_ports {DDR_CHIPID[1]}]
+#set_property IOSTANDARD POD12_DCI [get_ports DDR_nALERT]
+#set_property PACKAGE_PIN P15 [get_ports DDR_nALERT]
+#set_property IOSTANDARD POD12_DCI [get_ports DDR_nEVENT]
+#set_property PACKAGE_PIN C17 [get_ports DDR_nEVENT]
+# set_property IOSTANDARD POD12_DCI [get_ports DDR_PARITY]
+# set_property PACKAGE_PIN D18 [get_ports DDR_PARITY]
+# set_property IOSTANDARD POD12_DCI [get_ports DDR_SCL]
+# set_property PACKAGE_PIN N21 [get_ports DDR_SCL]
+# set_property IOSTANDARD POD12_DCI [get_ports DDR_SDA]
+# set_property PACKAGE_PIN P21 [get_ports DDR_SDA]
+# set_property PACKAGE_PIN AC42 [get_ports {DP_M2C_N[0]}]
+# set_property PACKAGE_PIN AJ42 [get_ports {DP_M2C_N[1]}]
+# set_property PACKAGE_PIN AE42 [get_ports {DP_M2C_N[2]}]
+# set_property PACKAGE_PIN W42 [get_ports {DP_M2C_N[3]}]
+# set_property PACKAGE_PIN R42 [get_ports {DP_M2C_N[4]}]
+# set_property PACKAGE_PIN L42 [get_ports {DP_M2C_N[5]}]
+# set_property PACKAGE_PIN N42 [get_ports {DP_M2C_N[6]}]
+# set_property PACKAGE_PIN U42 [get_ports {DP_M2C_N[7]}]
+# set_property PACKAGE_PIN AA42 [get_ports {DP_M2C_N[8]}]
+# set_property PACKAGE_PIN AG42 [get_ports {DP_M2C_N[9]}]
+# set_property PACKAGE_PIN AC41 [get_ports {DP_M2C_P[0]}]
+# set_property PACKAGE_PIN AJ41 [get_ports {DP_M2C_P[1]}]
+# set_property PACKAGE_PIN AE41 [get_ports {DP_M2C_P[2]}]
+# set_property PACKAGE_PIN W41 [get_ports {DP_M2C_P[3]}]
+# set_property PACKAGE_PIN R41 [get_ports {DP_M2C_P[4]}]
+# set_property PACKAGE_PIN L41 [get_ports {DP_M2C_P[5]}]
+# set_property PACKAGE_PIN N41 [get_ports {DP_M2C_P[6]}]
+# set_property PACKAGE_PIN U41 [get_ports {DP_M2C_P[7]}]
+# set_property PACKAGE_PIN AA41 [get_ports {DP_M2C_P[8]}]
+# set_property PACKAGE_PIN AG41 [get_ports {DP_M2C_P[9]}]
+set_property PACKAGE_PIN AG34 [get_ports HDMI_CSCL]
+set_property PACKAGE_PIN AE33 [get_ports HDMI_CSDA]
+set_property PACKAGE_PIN AF33 [get_ports HDMI_INT]
+set_property PACKAGE_PIN W29 [get_ports EMMC_CLK]
+set_property PACKAGE_PIN AC34 [get_ports EMMC_CMD]
+set_property PACKAGE_PIN Y32 [get_ports {EMMC_DAT[0]}]
+set_property PACKAGE_PIN Y33 [get_ports {EMMC_DAT[1]}]
+set_property PACKAGE_PIN W33 [get_ports {EMMC_DAT[2]}]
+set_property PACKAGE_PIN W34 [get_ports {EMMC_DAT[3]}]
+set_property PACKAGE_PIN AA34 [get_ports {EMMC_DAT[4]}]
+set_property PACKAGE_PIN AB34 [get_ports {EMMC_DAT[5]}]
+set_property PACKAGE_PIN W31 [get_ports {EMMC_DAT[6]}]
+set_property PACKAGE_PIN Y31 [get_ports {EMMC_DAT[7]}]
+set_property PACKAGE_PIN AE32 [get_ports EMMC_DS]
+set_property PACKAGE_PIN W30 [get_ports EMMC_nRST]
+set_property PACKAGE_PIN AK23 [get_ports ETH_INT]
+set_property PACKAGE_PIN AL24 [get_ports ETH_nCS]
+set_property PACKAGE_PIN AJ23 [get_ports ETH_nOE]
+# not used
+# set_property PACKAGE_PIN AV38 [get_ports FMC_CLK_DIR]
+# set_property PACKAGE_PIN AL42 [get_ports FMC_nPRSNT]
+# set_property PACKAGE_PIN BB40 [get_ports {HA_N[2]}]
+# set_property PACKAGE_PIN BA41 [get_ports {HA_N[3]}]
+# set_property PACKAGE_PIN AY40 [get_ports {HA_N[4]}]
+# set_property PACKAGE_PIN AU42 [get_ports {HA_N[5]}]
+# set_property PACKAGE_PIN AY42 [get_ports {HA_N[6]}]
+# set_property PACKAGE_PIN AW41 [get_ports {HA_N[7]}]
+# set_property PACKAGE_PIN AU37 [get_ports {HA_N[8]}]
+# set_property PACKAGE_PIN AT42 [get_ports {HA_N[9]}]
+# set_property PACKAGE_PIN AT38 [get_ports {HA_N[10]}]
+# set_property PACKAGE_PIN AV42 [get_ports {HA_N[11]}]
+# set_property PACKAGE_PIN AR37 [get_ports {HA_N[12]}]
+# set_property PACKAGE_PIN AN42 [get_ports {HA_N[13]}]
+# set_property PACKAGE_PIN AP38 [get_ports {HA_N[14]}]
+# set_property PACKAGE_PIN AN37 [get_ports {HA_N[15]}]
+# set_property PACKAGE_PIN AM42 [get_ports {HA_N[16]}]
+# set_property PACKAGE_PIN AR41 [get_ports {HA_N[18]}]
+# set_property PACKAGE_PIN AM39 [get_ports {HA_N[19]}]
+# set_property PACKAGE_PIN AR40 [get_ports {HA_N[20]}]
+# set_property PACKAGE_PIN AM40 [get_ports {HA_N[21]}]
+# set_property PACKAGE_PIN AK38 [get_ports {HA_N[22]}]
+# set_property PACKAGE_PIN AL38 [get_ports {HA_N[23]}]
+# set_property PACKAGE_PIN AT39 [get_ports {HA_P[0]}]
+# set_property PACKAGE_PIN AT40 [get_ports {HA_N[0]}]
+# set_property PACKAGE_PIN AU39 [get_ports {HA_P[1]}]
+# set_property PACKAGE_PIN AU40 [get_ports {HA_N[1]}]
+# set_property PACKAGE_PIN BA39 [get_ports {HA_P[2]}]
+# set_property PACKAGE_PIN BA40 [get_ports {HA_P[3]}]
+# set_property PACKAGE_PIN AW39 [get_ports {HA_P[4]}]
+# set_property PACKAGE_PIN AU41 [get_ports {HA_P[5]}]
+# set_property PACKAGE_PIN AY41 [get_ports {HA_P[6]}]
+# set_property PACKAGE_PIN AW40 [get_ports {HA_P[7]}]
+# set_property PACKAGE_PIN AT37 [get_ports {HA_P[8]}]
+# set_property PACKAGE_PIN AR42 [get_ports {HA_P[9]}]
+# set_property PACKAGE_PIN AR38 [get_ports {HA_P[10]}]
+# set_property PACKAGE_PIN AV41 [get_ports {HA_P[11]}]
+# set_property PACKAGE_PIN AR36 [get_ports {HA_P[12]}]
+# set_property PACKAGE_PIN AN41 [get_ports {HA_P[13]}]
+# set_property PACKAGE_PIN AN38 [get_ports {HA_P[14]}]
+# set_property PACKAGE_PIN AM37 [get_ports {HA_P[15]}]
+# set_property PACKAGE_PIN AM41 [get_ports {HA_P[16]}]
+# set_property PACKAGE_PIN AN39 [get_ports {HA_P[17]}]
+# set_property PACKAGE_PIN AP39 [get_ports {HA_N[17]}]
+# set_property PACKAGE_PIN AP41 [get_ports {HA_P[18]}]
+# set_property PACKAGE_PIN AL39 [get_ports {HA_P[19]}]
+# set_property PACKAGE_PIN AP40 [get_ports {HA_P[20]}]
+# set_property PACKAGE_PIN AL40 [get_ports {HA_P[21]}]
+# set_property PACKAGE_PIN AK37 [get_ports {HA_P[22]}]
+# set_property PACKAGE_PIN AL37 [get_ports {HA_P[23]}]
+# set_property PACKAGE_PIN T32 [get_ports {HB_N[1]}]
+# set_property PACKAGE_PIN V33 [get_ports {HB_N[2]}]
+# set_property PACKAGE_PIN V29 [get_ports {HB_N[3]}]
+# set_property PACKAGE_PIN T30 [get_ports {HB_N[4]}]
+# set_property PACKAGE_PIN T34 [get_ports {HB_N[5]}]
+# set_property PACKAGE_PIN R32 [get_ports {HB_N[7]}]
+# set_property PACKAGE_PIN P29 [get_ports {HB_N[8]}]
+# set_property PACKAGE_PIN P30 [get_ports {HB_N[9]}]
+# set_property PACKAGE_PIN K28 [get_ports {HB_N[10]}]
+# set_property PACKAGE_PIN L29 [get_ports {HB_N[11]}]
+# set_property PACKAGE_PIN K31 [get_ports {HB_N[12]}]
+# set_property PACKAGE_PIN L33 [get_ports {HB_N[13]}]
+# set_property PACKAGE_PIN U31 [get_ports {HB_N[14]}]
+# set_property PACKAGE_PIN N33 [get_ports {HB_N[15]}]
+# set_property PACKAGE_PIN L34 [get_ports {HB_N[16]}]
+# set_property PACKAGE_PIN R28 [get_ports {HB_N[18]}]
+# set_property PACKAGE_PIN N27 [get_ports {HB_N[19]}]
+# set_property PACKAGE_PIN U34 [get_ports {HB_N[20]}]
+# set_property PACKAGE_PIN N34 [get_ports {HB_N[21]}]
+# set_property PACKAGE_PIN N31 [get_ports {HB_P[0]}]
+# set_property PACKAGE_PIN M31 [get_ports {HB_N[0]}]
+# set_property PACKAGE_PIN U32 [get_ports {HB_P[1]}]
+# set_property PACKAGE_PIN V32 [get_ports {HB_P[2]}]
+# set_property PACKAGE_PIN V28 [get_ports {HB_P[3]}]
+# set_property PACKAGE_PIN U30 [get_ports {HB_P[4]}]
+# set_property PACKAGE_PIN T33 [get_ports {HB_P[5]}]
+# set_property PACKAGE_PIN M30 [get_ports {HB_P[6]}]
+# set_property PACKAGE_PIN L30 [get_ports {HB_N[6]}]
+# set_property PACKAGE_PIN R31 [get_ports {HB_P[7]}]
+# set_property PACKAGE_PIN P28 [get_ports {HB_P[8]}]
+# set_property PACKAGE_PIN R30 [get_ports {HB_P[9]}]
+# set_property PACKAGE_PIN L28 [get_ports {HB_P[10]}]
+# set_property PACKAGE_PIN M29 [get_ports {HB_P[11]}]
+# set_property PACKAGE_PIN K30 [get_ports {HB_P[12]}]
+# set_property PACKAGE_PIN L32 [get_ports {HB_P[13]}]
+# set_property PACKAGE_PIN V31 [get_ports {HB_P[14]}]
+# set_property PACKAGE_PIN P33 [get_ports {HB_P[15]}]
+# set_property PACKAGE_PIN M34 [get_ports {HB_P[16]}]
+# set_property PACKAGE_PIN N32 [get_ports {HB_P[17]}]
+# set_property PACKAGE_PIN M32 [get_ports {HB_N[17]}]
+# set_property PACKAGE_PIN T28 [get_ports {HB_P[18]}]
+# set_property PACKAGE_PIN N26 [get_ports {HB_P[19]}]
+# set_property PACKAGE_PIN V34 [get_ports {HB_P[20]}]
+# set_property PACKAGE_PIN P34 [get_ports {HB_P[21]}]
+# set_property IOSTANDARD LVCMOS33 [get_ports {CLK_CFG}]
+# set_property PACKAGE_PIN AT27 [get_ports {CLK_CFG}]
+# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_CSIB}]
+# set_property PACKAGE_PIN BA27 [get_ports {IOFPGA_CSIB}]
+# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_D[4]}]
+# set_property PACKAGE_PIN AV26 [get_ports {IOFPGA_D[4]}]
+# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_D[5]}]
+# set_property PACKAGE_PIN AV27 [get_ports {IOFPGA_D[5]}]
+# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_D[6]}]
+# set_property PACKAGE_PIN AU29 [get_ports {IOFPGA_D[6]}]
+# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_D[7]}]
+# set_property PACKAGE_PIN AV29 [get_ports {IOFPGA_D[7]}]
+set_property IOSTANDARD LVCMOS18 [get_ports IOFPGA_NRST]
+set_property PACKAGE_PIN AV31 [get_ports IOFPGA_NRST]
+set_property IOSTANDARD LVCMOS18 [get_ports IOFPGA_NSPIR]
+set_property PACKAGE_PIN AV32 [get_ports IOFPGA_NSPIR]
+set_property IOSTANDARD LVCMOS33 [get_ports IOFPGA_SYSWDT]
+set_property PACKAGE_PIN AU20 [get_ports IOFPGA_SYSWDT]
+# not used
+# set_property PACKAGE_PIN AN27 [get_ports {LA_N[2]}]
+# set_property PACKAGE_PIN AP30 [get_ports {LA_N[3]}]
+# set_property PACKAGE_PIN AN29 [get_ports {LA_N[4]}]
+# set_property PACKAGE_PIN AR35 [get_ports {LA_N[5]}]
+# set_property PACKAGE_PIN AR33 [get_ports {LA_N[6]}]
+# set_property PACKAGE_PIN AN32 [get_ports {LA_N[7]}]
+# set_property PACKAGE_PIN AP31 [get_ports {LA_N[8]}]
+# set_property PACKAGE_PIN AN34 [get_ports {LA_N[9]}]
+# set_property PACKAGE_PIN AL35 [get_ports {LA_N[10]}]
+# set_property PACKAGE_PIN AM36 [get_ports {LA_N[11]}]
+# set_property PACKAGE_PIN AP34 [get_ports {LA_N[12]}]
+# set_property PACKAGE_PIN AL32 [get_ports {LA_N[13]}]
+# set_property PACKAGE_PIN AK36 [get_ports {LA_N[14]}]
+# set_property PACKAGE_PIN AJ34 [get_ports {LA_N[15]}]
+# set_property PACKAGE_PIN AL33 [get_ports {LA_N[16]}]
+# set_property PACKAGE_PIN AJ29 [get_ports {LA_N[19]}]
+# set_property PACKAGE_PIN AJ33 [get_ports {LA_N[20]}]
+# set_property PACKAGE_PIN AH29 [get_ports {LA_N[21]}]
+# set_property PACKAGE_PIN AH31 [get_ports {LA_N[22]}]
+# set_property PACKAGE_PIN AG30 [get_ports {LA_N[23]}]
+# set_property PACKAGE_PIN G32 [get_ports {LA_N[24]}]
+# set_property PACKAGE_PIN H34 [get_ports {LA_N[25]}]
+# set_property PACKAGE_PIN H31 [get_ports {LA_N[26]}]
+# set_property PACKAGE_PIN K33 [get_ports {LA_N[27]}]
+# set_property PACKAGE_PIN H29 [get_ports {LA_N[28]}]
+# set_property PACKAGE_PIN H33 [get_ports {LA_N[29]}]
+# set_property PACKAGE_PIN F34 [get_ports {LA_N[30]}]
+# set_property PACKAGE_PIN E33 [get_ports {LA_N[31]}]
+# set_property PACKAGE_PIN C34 [get_ports {LA_N[32]}]
+# set_property PACKAGE_PIN G30 [get_ports {LA_N[33]}]
+# set_property PACKAGE_PIN AM29 [get_ports {LA_P[0]}]
+# set_property PACKAGE_PIN AM30 [get_ports {LA_N[0]}]
+# set_property PACKAGE_PIN AL29 [get_ports {LA_P[1]}]
+# set_property PACKAGE_PIN AL30 [get_ports {LA_N[1]}]
+# set_property PACKAGE_PIN AM27 [get_ports {LA_P[2]}]
+# set_property PACKAGE_PIN AP29 [get_ports {LA_P[3]}]
+# set_property PACKAGE_PIN AN28 [get_ports {LA_P[4]}]
+# set_property PACKAGE_PIN AP35 [get_ports {LA_P[5]}]
+# set_property PACKAGE_PIN AP33 [get_ports {LA_P[6]}]
+# set_property PACKAGE_PIN AM32 [get_ports {LA_P[7]}]
+# set_property PACKAGE_PIN AN31 [get_ports {LA_P[8]}]
+# set_property PACKAGE_PIN AM34 [get_ports {LA_P[9]}]
+# set_property PACKAGE_PIN AL34 [get_ports {LA_P[10]}]
+# set_property PACKAGE_PIN AM35 [get_ports {LA_P[11]}]
+# set_property PACKAGE_PIN AN33 [get_ports {LA_P[12]}]
+# set_property PACKAGE_PIN AK32 [get_ports {LA_P[13]}]
+# set_property PACKAGE_PIN AK35 [get_ports {LA_P[14]}]
+# set_property PACKAGE_PIN AH34 [get_ports {LA_P[15]}]
+# set_property PACKAGE_PIN AK33 [get_ports {LA_P[16]}]
+# set_property PACKAGE_PIN AK30 [get_ports {LA_P[17]}]
+# set_property PACKAGE_PIN AK31 [get_ports {LA_N[17]}]
+# set_property PACKAGE_PIN AJ30 [get_ports {LA_P[18]}]
+# set_property PACKAGE_PIN AJ31 [get_ports {LA_N[18]}]
+# set_property PACKAGE_PIN AJ28 [get_ports {LA_P[19]}]
+# set_property PACKAGE_PIN AH33 [get_ports {LA_P[20]}]
+# set_property PACKAGE_PIN AH28 [get_ports {LA_P[21]}]
+# set_property PACKAGE_PIN AG31 [get_ports {LA_P[22]}]
+# set_property PACKAGE_PIN AG29 [get_ports {LA_P[23]}]
+# set_property PACKAGE_PIN H32 [get_ports {LA_P[24]}]
+# set_property PACKAGE_PIN J34 [get_ports {LA_P[25]}]
+# set_property PACKAGE_PIN J30 [get_ports {LA_P[26]}]
+# set_property PACKAGE_PIN K32 [get_ports {LA_P[27]}]
+# set_property PACKAGE_PIN J29 [get_ports {LA_P[28]}]
+# set_property PACKAGE_PIN J33 [get_ports {LA_P[29]}]
+# set_property PACKAGE_PIN G34 [get_ports {LA_P[30]}]
+# set_property PACKAGE_PIN F33 [get_ports {LA_P[31]}]
+# set_property PACKAGE_PIN D34 [get_ports {LA_P[32]}]
+# set_property PACKAGE_PIN G29 [get_ports {LA_P[33]}]
+set_property PACKAGE_PIN AM17 [get_ports {MMB_DATA[0]}]
+set_property PACKAGE_PIN AL14 [get_ports {MMB_DATA[1]}]
+set_property PACKAGE_PIN AK15 [get_ports {MMB_DATA[2]}]
+set_property PACKAGE_PIN AK17 [get_ports {MMB_DATA[3]}]
+set_property PACKAGE_PIN AM14 [get_ports {MMB_DATA[4]}]
+set_property PACKAGE_PIN AN13 [get_ports {MMB_DATA[5]}]
+set_property PACKAGE_PIN AM11 [get_ports {MMB_DATA[6]}]
+set_property PACKAGE_PIN AN11 [get_ports {MMB_DATA[7]}]
+set_property PACKAGE_PIN AR13 [get_ports {MMB_DATA[8]}]
+set_property PACKAGE_PIN AR12 [get_ports {MMB_DATA[9]}]
+set_property PACKAGE_PIN AL10 [get_ports {MMB_DATA[10]}]
+set_property PACKAGE_PIN AM10 [get_ports {MMB_DATA[11]}]
+set_property PACKAGE_PIN AM12 [get_ports {MMB_DATA[12]}]
+set_property PACKAGE_PIN AN12 [get_ports {MMB_DATA[13]}]
+set_property PACKAGE_PIN AP13 [get_ports {MMB_DATA[14]}]
+set_property PACKAGE_PIN AK13 [get_ports {MMB_DATA[15]}]
+set_property PACKAGE_PIN AK12 [get_ports {MMB_DATA[16]}]
+set_property PACKAGE_PIN AK11 [get_ports {MMB_DATA[17]}]
+set_property PACKAGE_PIN AK10 [get_ports {MMB_DATA[18]}]
+set_property PACKAGE_PIN AH13 [get_ports {MMB_DATA[19]}]
+set_property PACKAGE_PIN AJ13 [get_ports {MMB_DATA[20]}]
+set_property PACKAGE_PIN AJ11 [get_ports {MMB_DATA[21]}]
+set_property PACKAGE_PIN AJ10 [get_ports {MMB_DATA[22]}]
+set_property PACKAGE_PIN AH12 [get_ports {MMB_DATA[23]}]
+set_property PACKAGE_PIN AH11 [get_ports MMB_DE]
+set_property PACKAGE_PIN AG12 [get_ports MMB_HS]
+set_property PACKAGE_PIN AH14 [get_ports MMB_IDCLK]
+set_property PACKAGE_PIN AF29 [get_ports MMB_SCK]
+set_property PACKAGE_PIN AC28 [get_ports {MMB_SD[0]}]
+set_property PACKAGE_PIN AC29 [get_ports {MMB_SD[1]}]
+set_property PACKAGE_PIN AE27 [get_ports {MMB_SD[2]}]
+set_property PACKAGE_PIN AF34 [get_ports {MMB_SD[3]}]
+set_property PACKAGE_PIN AG11 [get_ports MMB_VS]
+set_property PACKAGE_PIN AF30 [get_ports MMB_WS]
+set_property PACKAGE_PIN AL15 [get_ports {OSCCLK[0]}]
+set_property PACKAGE_PIN AK16 [get_ports {OSCCLK[1]}]
+set_property PACKAGE_PIN AY32 [get_ports {OSCCLK[2]}]
+set_property PACKAGE_PIN AY30 [get_ports {OSCCLK[3]}]
+set_property PACKAGE_PIN AC31 [get_ports {OSCCLK[4]}]
+set_property PACKAGE_PIN AC32 [get_ports {OSCCLK[5]}]
+set_property PACKAGE_PIN AT29 [get_ports PB_IRQ]
+
+set_property IOSTANDARD LVCMOS33 [get_ports QSPI_D0]
+set_property PACKAGE_PIN AU24 [get_ports QSPI_D0]
+set_property IOSTANDARD LVCMOS33 [get_ports QSPI_D1]
+set_property PACKAGE_PIN AV24 [get_ports QSPI_D1]
+set_property IOSTANDARD LVCMOS33 [get_ports QSPI_D2]
+set_property PACKAGE_PIN AV21 [get_ports QSPI_D2]
+set_property IOSTANDARD LVCMOS33 [get_ports QSPI_D3]
+set_property PACKAGE_PIN AV22 [get_ports QSPI_D3]
+set_property IOSTANDARD LVCMOS33 [get_ports QSPI_nCS]
+set_property PACKAGE_PIN AT24 [get_ports QSPI_nCS]
+set_property IOSTANDARD LVCMOS33 [get_ports QSPI_SCLK]
+set_property PACKAGE_PIN AT25 [get_ports QSPI_SCLK]
+# not used
+# set_property PACKAGE_PIN AL13 [get_ports SATA_CLK_P]
+# set_property PACKAGE_PIN AL12 [get_ports SATA_CLK_N]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[0]}]
+set_property PACKAGE_PIN AW14 [get_ports {SH0_IO[0]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[1]}]
+set_property PACKAGE_PIN AW13 [get_ports {SH0_IO[1]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[2]}]
+set_property PACKAGE_PIN AW15 [get_ports {SH0_IO[2]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[3]}]
+set_property PACKAGE_PIN AY15 [get_ports {SH0_IO[3]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[4]}]
+set_property PACKAGE_PIN AY13 [get_ports {SH0_IO[4]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[5]}]
+set_property PACKAGE_PIN AY12 [get_ports {SH0_IO[5]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[6]}]
+set_property PACKAGE_PIN BA15 [get_ports {SH0_IO[6]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[7]}]
+set_property PACKAGE_PIN BB14 [get_ports {SH0_IO[7]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[8]}]
+set_property PACKAGE_PIN BA12 [get_ports {SH0_IO[8]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[9]}]
+set_property PACKAGE_PIN BB12 [get_ports {SH0_IO[9]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[10]}]
+set_property PACKAGE_PIN BA14 [get_ports {SH0_IO[10]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[11]}]
+set_property PACKAGE_PIN BA13 [get_ports {SH0_IO[11]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[12]}]
+set_property PACKAGE_PIN BB15 [get_ports {SH0_IO[12]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[13]}]
+set_property PACKAGE_PIN AU12 [get_ports {SH0_IO[13]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[14]}]
+set_property PACKAGE_PIN AV12 [get_ports {SH0_IO[14]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[15]}]
+set_property PACKAGE_PIN AV17 [get_ports {SH0_IO[15]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[16]}]
+set_property PACKAGE_PIN AV16 [get_ports {SH0_IO[16]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[17]}]
+set_property PACKAGE_PIN AT14 [get_ports {SH0_IO[17]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[0]}]
+set_property PACKAGE_PIN AT17 [get_ports {SH1_IO[0]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[1]}]
+set_property PACKAGE_PIN AU17 [get_ports {SH1_IO[1]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[2]}]
+set_property PACKAGE_PIN AV19 [get_ports {SH1_IO[2]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[3]}]
+set_property PACKAGE_PIN AW19 [get_ports {SH1_IO[3]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[4]}]
+set_property PACKAGE_PIN AW20 [get_ports {SH1_IO[4]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[5]}]
+set_property PACKAGE_PIN BA19 [get_ports {SH1_IO[5]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[6]}]
+set_property PACKAGE_PIN BA18 [get_ports {SH1_IO[6]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[7]}]
+set_property PACKAGE_PIN AY20 [get_ports {SH1_IO[7]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[8]}]
+set_property PACKAGE_PIN BA20 [get_ports {SH1_IO[8]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[9]}]
+set_property PACKAGE_PIN BA17 [get_ports {SH1_IO[9]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[10]}]
+set_property PACKAGE_PIN BB17 [get_ports {SH1_IO[10]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[11]}]
+set_property PACKAGE_PIN BB20 [get_ports {SH1_IO[11]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[12]}]
+set_property PACKAGE_PIN BB19 [get_ports {SH1_IO[12]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[13]}]
+set_property PACKAGE_PIN AW16 [get_ports {SH1_IO[13]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[14]}]
+set_property PACKAGE_PIN AY16 [get_ports {SH1_IO[14]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[15]}]
+set_property PACKAGE_PIN AY18 [get_ports {SH1_IO[15]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[16]}]
+set_property PACKAGE_PIN AY17 [get_ports {SH1_IO[16]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[17]}]
+set_property PACKAGE_PIN BB16 [get_ports {SH1_IO[17]}]
+set_property PACKAGE_PIN AL25 [get_ports SH_ADC_CK]
+set_property PACKAGE_PIN AM25 [get_ports SH_ADC_CS]
+set_property PACKAGE_PIN AP25 [get_ports SH_ADC_DI]
+set_property PACKAGE_PIN AP26 [get_ports SH_ADC_DO]
+set_property IOSTANDARD LVCMOS33 [get_ports SH_nRST]
+set_property PACKAGE_PIN AU14 [get_ports SH_nRST]
+set_property PACKAGE_PIN AK20 [get_ports {SMBF_ADDR[0]}]
+set_property PACKAGE_PIN AK21 [get_ports {SMBF_ADDR[1]}]
+set_property PACKAGE_PIN AJ18 [get_ports {SMBF_ADDR[2]}]
+set_property PACKAGE_PIN AJ19 [get_ports {SMBF_ADDR[3]}]
+set_property PACKAGE_PIN AH21 [get_ports {SMBF_ADDR[4]}]
+set_property PACKAGE_PIN AJ21 [get_ports {SMBF_ADDR[5]}]
+set_property PACKAGE_PIN AH19 [get_ports {SMBF_ADDR[6]}]
+set_property PACKAGE_PIN AK22 [get_ports {SMBF_DATA[0]}]
+set_property PACKAGE_PIN AL22 [get_ports {SMBF_DATA[1]}]
+set_property PACKAGE_PIN AL19 [get_ports {SMBF_DATA[2]}]
+set_property PACKAGE_PIN AL20 [get_ports {SMBF_DATA[3]}]
+set_property PACKAGE_PIN AH18 [get_ports {SMBF_DATA[4]}]
+set_property PACKAGE_PIN AM19 [get_ports {SMBF_DATA[5]}]
+set_property PACKAGE_PIN AN19 [get_ports {SMBF_DATA[6]}]
+set_property PACKAGE_PIN AP19 [get_ports {SMBF_DATA[7]}]
+set_property PACKAGE_PIN AP20 [get_ports {SMBF_DATA[8]}]
+set_property PACKAGE_PIN AM20 [get_ports {SMBF_DATA[9]}]
+set_property PACKAGE_PIN AN21 [get_ports {SMBF_DATA[10]}]
+set_property PACKAGE_PIN AP21 [get_ports {SMBF_DATA[11]}]
+set_property PACKAGE_PIN AR22 [get_ports {SMBF_DATA[12]}]
+set_property PACKAGE_PIN AM21 [get_ports {SMBF_DATA[13]}]
+set_property PACKAGE_PIN AM22 [get_ports {SMBF_DATA[14]}]
+set_property PACKAGE_PIN AN22 [get_ports {SMBF_DATA[15]}]
+set_property PACKAGE_PIN AJ20 [get_ports SMBF_FIFOSEL]
+set_property PACKAGE_PIN AN23 [get_ports SMBF_nOE]
+set_property PACKAGE_PIN AL23 [get_ports SMBF_nRST]
+set_property PACKAGE_PIN AP23 [get_ports SMBF_nWE]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[16]}]
+set_property PACKAGE_PIN AR26 [get_ports {SMBM_A[16]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[17]}]
+set_property PACKAGE_PIN AT22 [get_ports {SMBM_A[17]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[18]}]
+set_property PACKAGE_PIN AT23 [get_ports {SMBM_A[18]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[19]}]
+set_property PACKAGE_PIN AU21 [get_ports {SMBM_A[19]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[20]}]
+set_property PACKAGE_PIN AY22 [get_ports {SMBM_A[20]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[21]}]
+set_property PACKAGE_PIN BA22 [get_ports {SMBM_A[21]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[22]}]
+set_property PACKAGE_PIN AW21 [get_ports {SMBM_A[22]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[23]}]
+set_property PACKAGE_PIN AY21 [get_ports {SMBM_A[23]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[24]}]
+set_property PACKAGE_PIN BA23 [get_ports {SMBM_A[24]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[25]}]
+set_property PACKAGE_PIN BA24 [get_ports {SMBM_A[25]}]
+set_property IOSTANDARD LVCMOS33 [get_ports SMBM_CLK]
+set_property PACKAGE_PIN AY25 [get_ports SMBM_CLK]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[0]}]
+set_property PACKAGE_PIN BB21 [get_ports {SMBM_D[0]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[1]}]
+set_property PACKAGE_PIN BB22 [get_ports {SMBM_D[1]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[2]}]
+set_property PACKAGE_PIN AW24 [get_ports {SMBM_D[2]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[3]}]
+set_property PACKAGE_PIN AW25 [get_ports {SMBM_D[3]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[4]}]
+set_property PACKAGE_PIN AW23 [get_ports {SMBM_D[4]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[5]}]
+set_property PACKAGE_PIN AY23 [get_ports {SMBM_D[5]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[6]}]
+set_property PACKAGE_PIN BB24 [get_ports {SMBM_D[6]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[7]}]
+set_property PACKAGE_PIN AY27 [get_ports {SMBM_D[7]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[8]}]
+set_property PACKAGE_PIN AY26 [get_ports {SMBM_D[8]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[9]}]
+set_property PACKAGE_PIN AY28 [get_ports {SMBM_D[9]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[10]}]
+set_property PACKAGE_PIN BA28 [get_ports {SMBM_D[10]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[11]}]
+set_property PACKAGE_PIN BA25 [get_ports {SMBM_D[11]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[12]}]
+set_property PACKAGE_PIN BB25 [get_ports {SMBM_D[12]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[13]}]
+set_property PACKAGE_PIN AW28 [get_ports {SMBM_D[13]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[14]}]
+set_property PACKAGE_PIN AW29 [get_ports {SMBM_D[14]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[15]}]
+set_property PACKAGE_PIN BB26 [get_ports {SMBM_D[15]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nBL[0]}]
+set_property PACKAGE_PIN AU26 [get_ports {SMBM_nBL[0]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nBL[1]}]
+set_property PACKAGE_PIN AR28 [get_ports {SMBM_nBL[1]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nE[1]}]
+set_property PACKAGE_PIN BB27 [get_ports {SMBM_nE[1]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nE[2]}]
+set_property PACKAGE_PIN AU27 [get_ports {SMBM_nE[2]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nE[3]}]
+set_property PACKAGE_PIN AV28 [get_ports {SMBM_nE[3]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nE[4]}]
+set_property PACKAGE_PIN AU25 [get_ports {SMBM_nE[4]}]
+set_property IOSTANDARD LVCMOS33 [get_ports SMBM_nOE]
+set_property PACKAGE_PIN AT28 [get_ports SMBM_nOE]
+set_property IOSTANDARD LVCMOS33 [get_ports SMBM_nWAIT]
+set_property PACKAGE_PIN AP28 [get_ports SMBM_nWAIT]
+set_property IOSTANDARD LVCMOS33 [get_ports SMBM_nWE]
+set_property PACKAGE_PIN AR27 [get_ports SMBM_nWE]
+set_property PACKAGE_PIN AF28 [get_ports {UART_RX_F[0]}]
+set_property PACKAGE_PIN AE31 [get_ports {UART_RX_F[1]}]
+set_property PACKAGE_PIN AE28 [get_ports {UART_RX_F[2]}]
+set_property PACKAGE_PIN AD30 [get_ports {UART_RX_F[3]}]
+set_property PACKAGE_PIN AF27 [get_ports {UART_TX_F[0]}]
+set_property PACKAGE_PIN AE30 [get_ports {UART_TX_F[1]}]
+set_property PACKAGE_PIN AD28 [get_ports {UART_TX_F[2]}]
+set_property PACKAGE_PIN AD29 [get_ports {UART_TX_F[3]}]
+set_property PACKAGE_PIN AN26 [get_ports USB_DACK]
+set_property PACKAGE_PIN AN24 [get_ports USB_DREQ]
+set_property PACKAGE_PIN AP24 [get_ports USB_INT]
+set_property PACKAGE_PIN AM26 [get_ports USB_nCS]
+set_property IOSTANDARD LVCMOS33 [get_ports USD_CLK]
+set_property PACKAGE_PIN AU15 [get_ports USD_CLK]
+set_property IOSTANDARD LVCMOS33 [get_ports USD_CMD]
+set_property PACKAGE_PIN AU16 [get_ports USD_CMD]
+set_property IOSTANDARD LVCMOS33 [get_ports {USD_DAT[0]}]
+set_property PACKAGE_PIN AV14 [get_ports {USD_DAT[0]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {USD_DAT[1]}]
+set_property PACKAGE_PIN AV13 [get_ports {USD_DAT[1]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {USD_DAT[2]}]
+set_property PACKAGE_PIN AT13 [get_ports {USD_DAT[2]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {USD_DAT[3]}]
+set_property PACKAGE_PIN AT12 [get_ports {USD_DAT[3]}]
+set_property IOSTANDARD LVCMOS33 [get_ports USD_NCD]
+set_property PACKAGE_PIN AT15 [get_ports USD_NCD]
+set_property PACKAGE_PIN AU32 [get_ports {USER_nLED[0]}]
+set_property PACKAGE_PIN AU30 [get_ports {USER_nLED[1]}]
+set_property PACKAGE_PIN AU31 [get_ports {USER_nLED[2]}]
+set_property PACKAGE_PIN AR32 [get_ports {USER_nLED[3]}]
+set_property PACKAGE_PIN AT33 [get_ports {USER_nLED[4]}]
+set_property PACKAGE_PIN AW30 [get_ports {USER_nLED[5]}]
+set_property PACKAGE_PIN AW31 [get_ports {USER_nLED[6]}]
+set_property PACKAGE_PIN AR30 [get_ports {USER_nLED[7]}]
+set_property PACKAGE_PIN BB31 [get_ports {USER_nLED[8]}]
+set_property PACKAGE_PIN BB32 [get_ports {USER_nLED[9]}]
+set_property PACKAGE_PIN AT30 [get_ports {USER_nPB[0]}]
+set_property PACKAGE_PIN AT32 [get_ports {USER_nPB[1]}]
+set_property PACKAGE_PIN BA29 [get_ports {USER_SW[0]}]
+set_property PACKAGE_PIN BB29 [get_ports {USER_SW[1]}]
+set_property PACKAGE_PIN BA32 [get_ports {USER_SW[2]}]
+set_property PACKAGE_PIN BA33 [get_ports {USER_SW[3]}]
+set_property PACKAGE_PIN BA30 [get_ports {USER_SW[4]}]
+set_property PACKAGE_PIN BB30 [get_ports {USER_SW[5]}]
+set_property PACKAGE_PIN AY33 [get_ports {USER_SW[6]}]
+set_property PACKAGE_PIN AY31 [get_ports {USER_SW[7]}]
+set_property IOSTANDARD LVCMOS33 [get_ports WDOG_RREQ]
+set_property PACKAGE_PIN AU19 [get_ports WDOG_RREQ]
+
+# native DDR pin names
+
+# set_property PACKAGE_PIN A17 [get_ports {c0_ddr4_dq[37]}]
+# set_property PACKAGE_PIN F24 [get_ports {c0_ddr4_dq[54]}]
+# set_property PACKAGE_PIN F23 [get_ports {c0_ddr4_dq[55]}]
+# set_property PACKAGE_PIN B15 [get_ports {c0_ddr4_dq[28]}]
+# set_property PACKAGE_PIN D23 [get_ports {c0_ddr4_dq[52]}]
+# set_property PACKAGE_PIN D24 [get_ports {c0_ddr4_dq[53]}]
+# set_property PACKAGE_PIN C24 [get_ports {c0_ddr4_dm_dbi_n[5]}]
+# set_property PACKAGE_PIN A22 [get_ports {c0_ddr4_dq[46]}]
+# set_property PACKAGE_PIN A23 [get_ports {c0_ddr4_dq[47]}]
+# set_property PACKAGE_PIN C13 [get_ports {c0_ddr4_dq[29]}]
+# set_property PACKAGE_PIN A14 [get_ports {c0_ddr4_dq[27]}]
+# set_property PACKAGE_PIN E22 [get_ports {c0_ddr4_dqs_t[6]}]
+# set_property PACKAGE_PIN E21 [get_ports {c0_ddr4_dqs_c[6]}]
+# set_property PACKAGE_PIN G22 [get_ports {c0_ddr4_dq[50]}]
+# set_property PACKAGE_PIN G21 [get_ports {c0_ddr4_dq[51]}]
+# set_property PACKAGE_PIN H24 [get_ports {c0_ddr4_dm_dbi_n[6]}]
+# set_property PACKAGE_PIN A24 [get_ports {c0_ddr4_dq[42]}]
+# set_property PACKAGE_PIN B22 [get_ports {c0_ddr4_dqs_t[5]}]
+# set_property PACKAGE_PIN B21 [get_ports {c0_ddr4_dqs_c[5]}]
+# set_property PACKAGE_PIN B17 [get_ports {c0_ddr4_dqs_t[4]}]
+# set_property PACKAGE_PIN B16 [get_ports {c0_ddr4_dqs_c[4]}]
+# set_property PACKAGE_PIN A18 [get_ports {c0_ddr4_dq[38]}]
+# set_property PACKAGE_PIN A12 [get_ports {c0_ddr4_dq[31]}]
+# set_property PACKAGE_PIN D25 [get_ports {c0_ddr4_dq[48]}]
+# set_property PACKAGE_PIN E23 [get_ports {c0_ddr4_dq[49]}]
+# set_property PACKAGE_PIN C23 [get_ports {c0_ddr4_dq[40]}]
+# set_property PACKAGE_PIN A25 [get_ports {c0_ddr4_dq[43]}]
+# set_property PACKAGE_PIN C22 [get_ports {c0_ddr4_dq[44]}]
+# set_property PACKAGE_PIN B14 [get_ports {c0_ddr4_dq[24]}]
+# set_property PACKAGE_PIN K18 [get_ports {c0_ddr4_adr[4]}]
+# set_property PACKAGE_PIN C21 [get_ports {c0_ddr4_dq[41]}]
+# set_property PACKAGE_PIN D21 [get_ports {c0_ddr4_dq[45]}]
+# set_property PACKAGE_PIN C16 [get_ports {c0_ddr4_dq[32]}]
+# set_property PACKAGE_PIN E12 [get_ports {c0_ddr4_dq[16]}]
+# set_property PACKAGE_PIN D13 [get_ports {c0_ddr4_dq[25]}]
+# set_property PACKAGE_PIN C12 [get_ports {c0_ddr4_dqs_t[3]}]
+# set_property PACKAGE_PIN B12 [get_ports {c0_ddr4_dqs_c[3]}]
+# set_property PACKAGE_PIN E15 [get_ports {c0_ddr4_dq[18]}]
+# #set_property PACKAGE_PIN P18 [get_ports {c0_ddr4_ck_t[1]}]
+# #set_property PACKAGE_PIN N18 [get_ports {c0_ddr4_ck_c[1]}]
+# set_property PACKAGE_PIN L19 [get_ports {c0_ddr4_adr[0]}]
+# set_property PACKAGE_PIN J18 [get_ports {c0_ddr4_adr[5]}]
+# #set_property PACKAGE_PIN E20 [get_ports {c0_ddr4_cke[0]}]
+# set_property PACKAGE_PIN E20 [get_ports {c0_ddr4_cke}]
+# set_property PACKAGE_PIN D19 [get_ports c0_ddr4_act_n]
+# set_property PACKAGE_PIN F12 [get_ports {c0_ddr4_dq[17]}]
+# set_property PACKAGE_PIN F15 [get_ports {c0_ddr4_dq[19]}]
+# set_property PACKAGE_PIN L18 [get_ports {c0_ddr4_adr[2]}]
+# set_property PACKAGE_PIN K16 [get_ports {c0_ddr4_adr[3]}]
+# set_property PACKAGE_PIN J16 [get_ports {c0_ddr4_adr[1]}]
+# #set_property PACKAGE_PIN E17 [get_ports {c0_ddr4_cke[1]}]
+# set_property PACKAGE_PIN E18 [get_ports c0_ddr4_reset_n]
+# set_property PACKAGE_PIN F14 [get_ports {c0_ddr4_dqs_t[2]}]
+# set_property PACKAGE_PIN F13 [get_ports {c0_ddr4_dqs_c[2]}]
+# #set_property PACKAGE_PIN P16 [get_ports {c0_ddr4_ck_t[0]}]
+# set_property PACKAGE_PIN P16 [get_ports {c0_ddr4_ck_t}]
+# #set_property PACKAGE_PIN N16 [get_ports {c0_ddr4_ck_c[0]}]
+# set_property PACKAGE_PIN N16 [get_ports {c0_ddr4_ck_c}]
+# set_property PACKAGE_PIN F19 [get_ports {c0_ddr4_bg[0]}]
+# #set_property PACKAGE_PIN F18 [get_ports {c0_ddr4_bg[1]}]
+# #set_property PACKAGE_PIN E16 [get_ports {c0_ddr4_odt[0]}]
+# set_property PACKAGE_PIN E16 [get_ports {c0_ddr4_odt}]
+# #set_property PACKAGE_PIN F17 [get_ports {c0_ddr4_cs_n[0]}]
+# set_property PACKAGE_PIN F17 [get_ports {c0_ddr4_cs_n}]
+# #set_property PACKAGE_PIN F20 [get_ports {c0_ddr4_cs_n[1]}]
+# #set_property PACKAGE_PIN D20 [get_ports {c0_ddr4_odt[1]}]
+# set_property PACKAGE_PIN K13 [get_ports {c0_ddr4_dq[10]}]
+# set_property PACKAGE_PIN J14 [get_ports {c0_ddr4_dq[11]}]
+# set_property PACKAGE_PIN H17 [get_ports {c0_ddr4_adr[16]}]
+# set_property PACKAGE_PIN G17 [get_ports {c0_ddr4_ba[0]}]
+# set_property PACKAGE_PIN H16 [get_ports {c0_ddr4_adr[14]}]
+# set_property PACKAGE_PIN G19 [get_ports {c0_ddr4_ba[1]}]
+# set_property PACKAGE_PIN N11 [get_ports {c0_ddr4_dqs_t[0]}]
+# set_property PACKAGE_PIN M11 [get_ports {c0_ddr4_dqs_c[0]}]
+# set_property PACKAGE_PIN J15 [get_ports {c0_ddr4_dq[8]}]
+# set_property PACKAGE_PIN K15 [get_ports {c0_ddr4_dq[9]}]
+# set_property PACKAGE_PIN G16 [get_ports {c0_ddr4_adr[15]}]
+# set_property PACKAGE_PIN M10 [get_ports {c0_ddr4_dq[6]}]
+# set_property PACKAGE_PIN L10 [get_ports {c0_ddr4_dq[7]}]
+# set_property PACKAGE_PIN J11 [get_ports {c0_ddr4_dqs_t[1]}]
+# set_property PACKAGE_PIN J10 [get_ports {c0_ddr4_dqs_c[1]}]
+# set_property PACKAGE_PIN L17 [get_ports {c0_ddr4_adr[6]}]
+# set_property PACKAGE_PIN K17 [get_ports {c0_ddr4_adr[8]}]
+# set_property PACKAGE_PIN M17 [get_ports {c0_ddr4_adr[9]}]
+# set_property PACKAGE_PIN M16 [get_ports {c0_ddr4_adr[7]}]
+# set_property PACKAGE_PIN M19 [get_ports {c0_ddr4_adr[10]}]
+# set_property PACKAGE_PIN M15 [get_ports {c0_ddr4_adr[11]}]
+# set_property PACKAGE_PIN N17 [get_ports {c0_ddr4_adr[12]}]
+# set_property PACKAGE_PIN N19 [get_ports {c0_ddr4_adr[13]}]
+# set_property PACKAGE_PIN L22 [get_ports {c0_ddr4_dm_dbi_n[7]}]
+# set_property PACKAGE_PIN P11 [get_ports {c0_ddr4_dq[0]}]
+# set_property PACKAGE_PIN P10 [get_ports {c0_ddr4_dq[1]}]
+# set_property PACKAGE_PIN L12 [get_ports {c0_ddr4_dq[2]}]
+# set_property PACKAGE_PIN M12 [get_ports {c0_ddr4_dq[3]}]
+# set_property PACKAGE_PIN N13 [get_ports {c0_ddr4_dq[4]}]
+# set_property PACKAGE_PIN N12 [get_ports {c0_ddr4_dq[5]}]
+# set_property PACKAGE_PIN K11 [get_ports {c0_ddr4_dq[12]}]
+# set_property PACKAGE_PIN K10 [get_ports {c0_ddr4_dq[13]}]
+# set_property PACKAGE_PIN J13 [get_ports {c0_ddr4_dq[14]}]
+# set_property PACKAGE_PIN K12 [get_ports {c0_ddr4_dq[15]}]
+# set_property PACKAGE_PIN H12 [get_ports {c0_ddr4_dq[20]}]
+# set_property PACKAGE_PIN G12 [get_ports {c0_ddr4_dq[21]}]
+# set_property PACKAGE_PIN G15 [get_ports {c0_ddr4_dq[22]}]
+# set_property PACKAGE_PIN G14 [get_ports {c0_ddr4_dq[23]}]
+# set_property PACKAGE_PIN A13 [get_ports {c0_ddr4_dq[26]}]
+# set_property PACKAGE_PIN A15 [get_ports {c0_ddr4_dq[30]}]
+# set_property PACKAGE_PIN C19 [get_ports {c0_ddr4_dq[33]}]
+# set_property PACKAGE_PIN B19 [get_ports {c0_ddr4_dq[34]}]
+# set_property PACKAGE_PIN A20 [get_ports {c0_ddr4_dq[35]}]
+# set_property PACKAGE_PIN D16 [get_ports {c0_ddr4_dq[36]}]
+# set_property PACKAGE_PIN A19 [get_ports {c0_ddr4_dq[39]}]
+# set_property PACKAGE_PIN H22 [get_ports {c0_ddr4_dq[56]}]
+# set_property PACKAGE_PIN J23 [get_ports {c0_ddr4_dq[57]}]
+# set_property PACKAGE_PIN K20 [get_ports {c0_ddr4_dq[58]}]
+# set_property PACKAGE_PIN L20 [get_ports {c0_ddr4_dq[59]}]
+# set_property PACKAGE_PIN H21 [get_ports {c0_ddr4_dq[60]}]
+# set_property PACKAGE_PIN H23 [get_ports {c0_ddr4_dq[61]}]
+# set_property PACKAGE_PIN K23 [get_ports {c0_ddr4_dq[62]}]
+# set_property PACKAGE_PIN J21 [get_ports {c0_ddr4_dq[63]}]
+# set_property PACKAGE_PIN N14 [get_ports {c0_ddr4_dm_dbi_n[0]}]
+# set_property PACKAGE_PIN L14 [get_ports {c0_ddr4_dm_dbi_n[1]}]
+# set_property PACKAGE_PIN H14 [get_ports {c0_ddr4_dm_dbi_n[2]}]
+# set_property PACKAGE_PIN D14 [get_ports {c0_ddr4_dm_dbi_n[3]}]
+# set_property PACKAGE_PIN C18 [get_ports {c0_ddr4_dm_dbi_n[4]}]
+# set_property PACKAGE_PIN K21 [get_ports {c0_ddr4_dqs_t[7]}]
+
+#set_property CFGBVS GND [current_design]
+#set_property CONFIG_VOLTAGE 1.8 [current_design]
+
+# set_property PACKAGE_PIN H19 [get_ports c0_sys_clk_p]
+# set_property PACKAGE_PIN H18 [get_ports c0_sys_clk_n]
+
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports SATA_CLK_N]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports SATA_CLK_P]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports GTX_CLK_N]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports GTX_CLK_P]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_M2C_P[1]}]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_M2C_P[0]}]
+
+# set_property PACKAGE_PIN AB31 [get_ports GTX_CLK_P]
+# set_property PACKAGE_PIN AB32 [get_ports GTX_CLK_N]
+
+# set_property PACKAGE_PIN AH39 [get_ports {DP_C2M_N[0]}]
+# set_property PACKAGE_PIN AF39 [get_ports {DP_C2M_N[1]}]
+# set_property PACKAGE_PIN AD39 [get_ports {DP_C2M_N[2]}]
+# set_property PACKAGE_PIN AB39 [get_ports {DP_C2M_N[3]}]
+# set_property PACKAGE_PIN Y39 [get_ports {DP_C2M_N[4]}]
+# set_property PACKAGE_PIN V39 [get_ports {DP_C2M_N[5]}]
+# set_property PACKAGE_PIN K39 [get_ports {DP_C2M_N[6]}]
+# set_property PACKAGE_PIN M39 [get_ports {DP_C2M_N[7]}]
+# set_property PACKAGE_PIN P39 [get_ports {DP_C2M_N[8]}]
+# set_property PACKAGE_PIN T39 [get_ports {DP_C2M_N[9]}]
+# set_property PACKAGE_PIN AH38 [get_ports {DP_C2M_P[0]}]
+# set_property PACKAGE_PIN AF38 [get_ports {DP_C2M_P[1]}]
+# set_property PACKAGE_PIN AD38 [get_ports {DP_C2M_P[2]}]
+# set_property PACKAGE_PIN AB38 [get_ports {DP_C2M_P[3]}]
+# set_property PACKAGE_PIN Y38 [get_ports {DP_C2M_P[4]}]
+# set_property PACKAGE_PIN V38 [get_ports {DP_C2M_P[5]}]
+# set_property PACKAGE_PIN K38 [get_ports {DP_C2M_P[6]}]
+# set_property PACKAGE_PIN M38 [get_ports {DP_C2M_P[7]}]
+# set_property PACKAGE_PIN P38 [get_ports {DP_C2M_P[8]}]
+# set_property PACKAGE_PIN T38 [get_ports {DP_C2M_P[9]}]
+# set_property PACKAGE_PIN AE36 [get_ports {GBTCLK_M2C_P[0]}]
+# set_property PACKAGE_PIN AE37 [get_ports {GBTCLK_M2C_N[0]}]
+# set_property PACKAGE_PIN AA36 [get_ports {GBTCLK_M2C_P[1]}]
+# set_property PACKAGE_PIN AA37 [get_ports {GBTCLK_M2C_N[1]}]
+
+# create_clock -period 15.515 -name clk_mgtrefclk0_x0y4_p [get_ports {GBTCLK_M2C_P[0]}]
+# create_clock -period 15.515 -name clk_mgtrefclk0_x0y7_p [get_ports {GBTCLK_M2C_P[1]}]
+
+# # False path constraints
+# # ----------------------------------------------------------------------------------------------------------------------
+# set_false_path -to [get_cells -hierarchical -filter {NAME =~ *bit_synchronizer*inst/i_in_meta_reg}]
+# set_false_path -to [get_cells -hierarchical -filter {NAME =~ *reset_synchronizer*inst/rst_in_*_reg}]
+# set_false_path -to [get_cells -hierarchical -filter {NAME =~ *gtwiz_userclk_tx_inst/*gtwiz_userclk_tx_active_*_reg}]
+# set_false_path -to [get_cells -hierarchical -filter {NAME =~ *gtwiz_userclk_rx_inst/*gtwiz_userclk_rx_active_*_reg}]
+
+#set_property CLOCK_DEDICATED_ROUTE BACKBONE [get_nets iACLK]
+#set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets CFG_CLK_IBUF_inst/O]
+# set_property CLOCK_DEDICATED_ROUTE BACKBONE [get_nets iGPUCLK]
+# set_property CLOCK_DEDICATED_ROUTE BACKBONE [get_nets iMCLK]
+
+set_property PULLUP true [get_ports QSPI_D0]
+set_property PULLUP true [get_ports QSPI_D1]
+set_property PULLUP true [get_ports QSPI_D2]
+set_property PULLUP true [get_ports QSPI_D3]
+
+# set_property IOSTANDARD SSTL12_DCI [get_ports "c0_ddr4_bg[0]"]
+# set_property OUTPUT_IMPEDANCE RDRV_40_40 [get_ports "c0_ddr4_bg[0]"]
+
+set_property CONFIG_VOLTAGE 3.3 [current_design]
+set_property CFGBVS VCCO [current_design]
+set_property BITSTREAM.CONFIG.UNUSEDPIN Pullnone [current_design]
+set_property BITSTREAM.CONFIG.PERSIST Yes [current_design]
+set_property BITSTREAM.STARTUP.MATCH_CYCLE Auto [current_design]
+set_property BITSTREAM.GENERAL.COMPRESS True [current_design]
+set_property CONFIG_MODE S_SELECTMAP [current_design]
+
+set_property PACKAGE_PIN AR26 [get_ports NRST]
+set_property PACKAGE_PIN AR27 [get_ports {P0[0]}]
+set_property PACKAGE_PIN AW29 [get_ports {P0[10]}]
+set_property PACKAGE_PIN BA25 [get_ports {P0[11]}]
+set_property PACKAGE_PIN BB25 [get_ports {P0[12]}]
+set_property PACKAGE_PIN AY28 [get_ports {P0[13]}]
+set_property PACKAGE_PIN BA28 [get_ports {P0[14]}]
+set_property PACKAGE_PIN AY26 [get_ports {P0[15]}]
+set_property PACKAGE_PIN AR28 [get_ports {P0[1]}]
+set_property PACKAGE_PIN AT28 [get_ports {P0[2]}]
+set_property PACKAGE_PIN AU25 [get_ports {P0[3]}]
+set_property PACKAGE_PIN AU26 [get_ports {P0[4]}]
+set_property PACKAGE_PIN AU27 [get_ports {P0[5]}]
+set_property PACKAGE_PIN AV28 [get_ports {P0[6]}]
+set_property PACKAGE_PIN BB26 [get_ports {P0[7]}]
+set_property PACKAGE_PIN BB27 [get_ports {P0[8]}]
+set_property PACKAGE_PIN AW28 [get_ports {P0[9]}]
+set_property PACKAGE_PIN AW26 [get_ports {P1[0]}]
+set_property PACKAGE_PIN AY21 [get_ports {P1[10]}]
+set_property PACKAGE_PIN AY22 [get_ports {P1[11]}]
+set_property PACKAGE_PIN BA22 [get_ports {P1[12]}]
+set_property PACKAGE_PIN AT22 [get_ports {P1[13]}]
+set_property PACKAGE_PIN AT23 [get_ports {P1[14]}]
+set_property PACKAGE_PIN AR25 [get_ports {P1[15]}]
+set_property PACKAGE_PIN AY27 [get_ports {P1[1]}]
+set_property PACKAGE_PIN AW23 [get_ports {P1[2]}]
+set_property PACKAGE_PIN AY23 [get_ports {P1[3]}]
+set_property PACKAGE_PIN AW25 [get_ports {P1[4]}]
+set_property PACKAGE_PIN BB21 [get_ports {P1[5]}]
+set_property PACKAGE_PIN BB22 [get_ports {P1[6]}]
+set_property PACKAGE_PIN BA23 [get_ports {P1[7]}]
+set_property PACKAGE_PIN BA24 [get_ports {P1[8]}]
+set_property PACKAGE_PIN AW21 [get_ports {P1[9]}]
+set_property PACKAGE_PIN AW24 [get_ports SWCLKTCK]
+set_property PACKAGE_PIN AU22 [get_ports SWDIOTMS]
+set_property PACKAGE_PIN AV23 [get_ports VDD]
+set_property PACKAGE_PIN AT24 [get_ports VDDIO]
+set_property PACKAGE_PIN AT25 [get_ports VSS]
+set_property PACKAGE_PIN AV21 [get_ports VSSIO]
+set_property PACKAGE_PIN AY25 [get_ports XTAL1]
+set_property PACKAGE_PIN AV22 [get_ports XTAL2]
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_synth.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_synth.tcl
new file mode 100644
index 0000000..4b89d74
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_synth.tcl
@@ -0,0 +1 @@
+synth_design -top cmsdk_mcu_chip -part xcku115-flvb1760-1-c
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_timing.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_timing.xdc
new file mode 100644
index 0000000..78ac5e6
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_arm_mps3/fpga_timing.xdc
@@ -0,0 +1,99 @@
+##################################################################################
+##                                                                              ##
+## Arm MPS3 Rev-C timing XDC                                                    ##
+##                                                                              ##
+##################################################################################
+
+create_clock -name CLK -period 30 [get_ports XTAL1]
+create_clock -name VCLK -period 30 -waveform {5 20}
+
+create_clock -name SWCLK -period 60 [get_ports SWCLKTCK]
+create_clock -name VSWCLK -period 60 -waveform {5 35}
+
+set_clock_groups -name async_clk_swclock -asynchronous \
+-group [get_clocks -include_generated_clocks CLK] \
+-group [get_clocks -include_generated_clocks SWCLK]
+
+set_input_delay -clock [get_clocks oscclk_0] -min -add_delay 2.800 [get_ports {USER_SW[*]}]
+set_input_delay -clock [get_clocks oscclk_0] -max -add_delay 5.800 [get_ports {USER_SW[*]}]
+set_input_delay -clock [get_clocks oscclk_0] -min -add_delay 2.800 [get_ports {USER_nPB[*]}]
+set_input_delay -clock [get_clocks oscclk_0] -max -add_delay 5.800 [get_ports {USER_nPB[*]}]
+set_input_delay -clock [get_clocks oscclk_0] -min -add_delay 2.800 [get_ports CB_nPOR]
+set_input_delay -clock [get_clocks oscclk_0] -max -add_delay 5.800 [get_ports CB_nPOR]
+set_output_delay -clock [get_clocks oscclk_0] -min -add_delay -1.200 [get_ports {USER_nLED[*]}]
+set_output_delay -clock [get_clocks oscclk_0] -max -add_delay 5.800 [get_ports {USER_nLED[*]}]
+
+#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports {dip_switch_4bits_tri_i[*]}]
+#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports {dip_switch_4bits_tri_i[*]}]
+#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_2]
+#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports PMOD0_2]
+#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_3]
+#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports PMOD0_3]
+#set_output_delay -clock [get_clocks clk_pl_0] -min -add_delay 5.000 [get_ports {led_4bits_tri_o[*]}]
+#set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {led_4bits_tri_o[*]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[0]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[0]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[1]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[1]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[2]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[2]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[3]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[3]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[4]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[4]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[5]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[5]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[6]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[6]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[7]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[7]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[8]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[8]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[9]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[9]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[10]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[10]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P011]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[11]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[12]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[12]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P013]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[13]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[14]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[14]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P015]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[15]} ]
+
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[0]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[0]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[1]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[1]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[2]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[2]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[3]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[3]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[4]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[4]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[5]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[5]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[6]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[6]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[7]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[7]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[8]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[8]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[9]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[9]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[10]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[10]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P111]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[11]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[12]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[12]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P113]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[13]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[14]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[14]} ]
+set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P115]} ]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[15]} ]
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1.tcl
new file mode 100644
index 0000000..22a84df
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1.tcl
@@ -0,0 +1,508 @@
+
+################################################################
+# This is a generated script based on design: design_1
+#
+# Though there are limitations about the generated script,
+# the main purpose of this utility is to make learning
+# IP Integrator Tcl commands easier.
+################################################################
+
+namespace eval _tcl {
+proc get_script_folder {} {
+   set script_path [file normalize [info script]]
+   set script_folder [file dirname $script_path]
+   return $script_folder
+}
+}
+variable script_folder
+set script_folder [_tcl::get_script_folder]
+
+################################################################
+# Check if script is running in correct Vivado version.
+################################################################
+set scripts_vivado_version 2021.1
+set current_vivado_version [version -short]
+
+if { [string first $scripts_vivado_version $current_vivado_version] == -1 } {
+   puts ""
+   catch {common::send_gid_msg -ssname BD::TCL -id 2041 -severity "ERROR" "This script was generated using Vivado <$scripts_vivado_version> and is being run in <$current_vivado_version> of Vivado. Please run the script in Vivado <$scripts_vivado_version> then open the design in Vivado <$current_vivado_version>. Upgrade the design by running \"Tools => Report => Report IP Status...\", then run write_bd_tcl to create an updated script."}
+
+   return 1
+}
+
+################################################################
+# START
+################################################################
+
+# To test this script, run the following commands from Vivado Tcl console:
+# source design_1_script.tcl
+
+set bCheckIPsPassed 1
+##################################################################
+# CHECK IPs
+##################################################################
+set bCheckIPs 1
+if { $bCheckIPs == 1 } {
+   set list_check_ips "\ 
+soclabs.org:user:nanosoc_chip:1.0\
+xilinx.com:ip:processing_system7:5.5\
+xilinx.com:ip:axi_gpio:2.0\
+xilinx.com:ip:axi_uartlite:2.0\
+xilinx.com:ip:xlslice:1.0\
+xilinx.com:ip:xlconcat:2.1\
+xilinx.com:ip:proc_sys_reset:5.0\
+xilinx.com:ip:smartconnect:1.0\
+xilinx.com:ip:xlconstant:1.1\
+"
+
+   set list_ips_missing ""
+   common::send_gid_msg -ssname BD::TCL -id 2011 -severity "INFO" "Checking if the following IPs exist in the project's IP catalog: $list_check_ips ."
+
+   foreach ip_vlnv $list_check_ips {
+      set ip_obj [get_ipdefs -all $ip_vlnv]
+      if { $ip_obj eq "" } {
+         lappend list_ips_missing $ip_vlnv
+      }
+   }
+
+   if { $list_ips_missing ne "" } {
+      catch {common::send_gid_msg -ssname BD::TCL -id 2012 -severity "ERROR" "The following IPs are not found in the IP Catalog:\n  $list_ips_missing\n\nResolution: Please add the repository containing the IP(s) to the project." }
+      set bCheckIPsPassed 0
+   }
+
+}
+
+if { $bCheckIPsPassed != 1 } {
+  common::send_gid_msg -ssname BD::TCL -id 2023 -severity "WARNING" "Will not continue with creation of design due to the error(s) above."
+  return 3
+}
+
+##################################################################
+# DESIGN PROCs
+##################################################################
+
+
+# Hierarchical cell: cmsdk_socket
+proc create_hier_cell_cmsdk_socket { parentCell nameHier } {
+
+  variable script_folder
+
+  if { $parentCell eq "" || $nameHier eq "" } {
+     catch {common::send_gid_msg -ssname BD::TCL -id 2092 -severity "ERROR" "create_hier_cell_cmsdk_socket() - Empty argument(s)!"}
+     return
+  }
+
+  # Get object for parentCell
+  set parentObj [get_bd_cells $parentCell]
+  if { $parentObj == "" } {
+     catch {common::send_gid_msg -ssname BD::TCL -id 2090 -severity "ERROR" "Unable to find parent cell <$parentCell>!"}
+     return
+  }
+
+  # Make sure parentObj is hier blk
+  set parentType [get_property TYPE $parentObj]
+  if { $parentType ne "hier" } {
+     catch {common::send_gid_msg -ssname BD::TCL -id 2091 -severity "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be <hier>."}
+     return
+  }
+
+  # Save current instance; Restore later
+  set oldCurInst [current_bd_instance .]
+
+  # Set parent object as current
+  current_bd_instance $parentObj
+
+  # Create cell and set as current instance
+  set hier_obj [create_bd_cell -type hier $nameHier]
+  current_bd_instance $hier_obj
+
+  # Create interface pins
+  create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:aximm_rtl:1.0 S00_AXI
+
+
+  # Create pins
+  create_bd_pin -dir I -type clk aclk
+  create_bd_pin -dir I -type rst ext_reset_in
+  create_bd_pin -dir O -from 15 -to 0 gpio2_tri_o
+  create_bd_pin -dir I -from 15 -to 0 gpio2_tri_z
+  create_bd_pin -dir O -from 15 -to 0 gpio_tri_i
+  create_bd_pin -dir I -from 15 -to 0 gpio_tri_o
+  create_bd_pin -dir O -from 0 -to 0 -type rst nrst
+  create_bd_pin -dir O -from 15 -to 0 p0_tri_i
+  create_bd_pin -dir I -from 15 -to 0 p0_tri_o
+  create_bd_pin -dir I -from 15 -to 0 p0_tri_z
+  create_bd_pin -dir O -from 15 -to 0 p1_tri_i
+  create_bd_pin -dir I -from 15 -to 0 p1_tri_o
+  create_bd_pin -dir I -from 15 -to 0 p1_tri_z
+  create_bd_pin -dir I -from 7 -to 0 pmoda_tri_i
+  create_bd_pin -dir O -from 7 -to 0 pmoda_tri_o
+  create_bd_pin -dir O -from 7 -to 0 pmoda_tri_z
+
+  # Create instance: axi_gpio_0, and set properties
+  set axi_gpio_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_0 ]
+  set_property -dict [ list \
+   CONFIG.C_GPIO2_WIDTH {16} \
+   CONFIG.C_GPIO_WIDTH {16} \
+   CONFIG.C_IS_DUAL {1} \
+ ] $axi_gpio_0
+
+  # Create instance: axi_gpio_1, and set properties
+  set axi_gpio_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_1 ]
+  set_property -dict [ list \
+   CONFIG.C_GPIO2_WIDTH {16} \
+   CONFIG.C_GPIO_WIDTH {16} \
+   CONFIG.C_IS_DUAL {1} \
+ ] $axi_gpio_1
+
+  # Create instance: axi_gpio_2, and set properties
+  set axi_gpio_2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_2 ]
+  set_property -dict [ list \
+   CONFIG.C_GPIO2_WIDTH {16} \
+   CONFIG.C_GPIO_WIDTH {16} \
+   CONFIG.C_IS_DUAL {1} \
+ ] $axi_gpio_2
+
+  # Create instance: axi_uartlite_0, and set properties
+  set axi_uartlite_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_uartlite:2.0 axi_uartlite_0 ]
+  set_property -dict [ list \
+   CONFIG.C_S_AXI_ACLK_FREQ_HZ {20000000} \
+ ] $axi_uartlite_0
+
+  # Create instance: p1_i_bit15to6, and set properties
+  set p1_i_bit15to6 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_i_bit15to6 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {15} \
+   CONFIG.DIN_TO {6} \
+   CONFIG.DIN_WIDTH {16} \
+   CONFIG.DOUT_WIDTH {10} \
+ ] $p1_i_bit15to6
+
+  # Create instance: p1_i_concat, and set properties
+  set p1_i_concat [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 p1_i_concat ]
+  set_property -dict [ list \
+   CONFIG.IN0_WIDTH {1} \
+   CONFIG.IN1_WIDTH {1} \
+   CONFIG.IN2_WIDTH {1} \
+   CONFIG.IN3_WIDTH {1} \
+   CONFIG.IN4_WIDTH {1} \
+   CONFIG.IN5_WIDTH {1} \
+   CONFIG.IN6_WIDTH {10} \
+   CONFIG.NUM_PORTS {7} \
+ ] $p1_i_concat
+
+  # Create instance: p1_o_bit1, and set properties
+  set p1_o_bit1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit1 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {1} \
+   CONFIG.DIN_TO {1} \
+   CONFIG.DIN_WIDTH {16} \
+   CONFIG.DOUT_WIDTH {1} \
+ ] $p1_o_bit1
+
+  # Create instance: p1_o_bit15to6, and set properties
+  set p1_o_bit15to6 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit15to6 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {15} \
+   CONFIG.DIN_TO {6} \
+   CONFIG.DIN_WIDTH {16} \
+   CONFIG.DOUT_WIDTH {10} \
+ ] $p1_o_bit15to6
+
+  # Create instance: p1_o_bit2, and set properties
+  set p1_o_bit2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit2 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {2} \
+   CONFIG.DIN_TO {2} \
+   CONFIG.DIN_WIDTH {16} \
+   CONFIG.DOUT_WIDTH {1} \
+ ] $p1_o_bit2
+
+  # Create instance: p1_o_bit3, and set properties
+  set p1_o_bit3 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit3 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {3} \
+   CONFIG.DIN_TO {3} \
+   CONFIG.DIN_WIDTH {16} \
+   CONFIG.DOUT_WIDTH {1} \
+ ] $p1_o_bit3
+
+  # Create instance: p1_o_bit5, and set properties
+  set p1_o_bit5 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit5 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {5} \
+   CONFIG.DIN_TO {5} \
+   CONFIG.DIN_WIDTH {16} \
+   CONFIG.DOUT_WIDTH {1} \
+ ] $p1_o_bit5
+
+  # Create instance: p1_z_bit2, and set properties
+  set p1_z_bit2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_z_bit2 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {2} \
+   CONFIG.DIN_TO {2} \
+   CONFIG.DIN_WIDTH {16} \
+   CONFIG.DOUT_WIDTH {1} \
+ ] $p1_z_bit2
+
+  # Create instance: pmoda_i_bit2, and set properties
+  set pmoda_i_bit2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 pmoda_i_bit2 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {2} \
+   CONFIG.DIN_TO {2} \
+   CONFIG.DIN_WIDTH {8} \
+   CONFIG.DOUT_WIDTH {1} \
+ ] $pmoda_i_bit2
+
+  # Create instance: pmoda_i_bit3, and set properties
+  set pmoda_i_bit3 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 pmoda_i_bit3 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {3} \
+   CONFIG.DIN_TO {3} \
+   CONFIG.DIN_WIDTH {8} \
+   CONFIG.DOUT_WIDTH {1} \
+ ] $pmoda_i_bit3
+
+  # Create instance: pmoda_o_concat8, and set properties
+  set pmoda_o_concat8 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 pmoda_o_concat8 ]
+  set_property -dict [ list \
+   CONFIG.NUM_PORTS {8} \
+ ] $pmoda_o_concat8
+
+  # Create instance: pmoda_z_concat8, and set properties
+  set pmoda_z_concat8 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 pmoda_z_concat8 ]
+  set_property -dict [ list \
+   CONFIG.NUM_PORTS {8} \
+ ] $pmoda_z_concat8
+
+  # Create instance: proc_sys_reset_0, and set properties
+  set proc_sys_reset_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 proc_sys_reset_0 ]
+
+  # Create instance: smartconnect_0, and set properties
+  set smartconnect_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:smartconnect:1.0 smartconnect_0 ]
+  set_property -dict [ list \
+   CONFIG.NUM_MI {4} \
+   CONFIG.NUM_SI {1} \
+ ] $smartconnect_0
+
+  # Create instance: xlconstant_0, and set properties
+  set xlconstant_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconstant:1.1 xlconstant_0 ]
+  set_property -dict [ list \
+   CONFIG.CONST_VAL {0} \
+ ] $xlconstant_0
+
+  # Create instance: xlconstant_1, and set properties
+  set xlconstant_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconstant:1.1 xlconstant_1 ]
+
+  # Create interface connections
+  connect_bd_intf_net -intf_net smartconnect_0_M00_AXI [get_bd_intf_pins axi_gpio_0/S_AXI] [get_bd_intf_pins smartconnect_0/M00_AXI]
+  connect_bd_intf_net -intf_net smartconnect_0_M01_AXI [get_bd_intf_pins axi_gpio_1/S_AXI] [get_bd_intf_pins smartconnect_0/M01_AXI]
+  connect_bd_intf_net -intf_net smartconnect_0_M02_AXI [get_bd_intf_pins axi_gpio_2/S_AXI] [get_bd_intf_pins smartconnect_0/M02_AXI]
+  connect_bd_intf_net -intf_net smartconnect_0_M03_AXI [get_bd_intf_pins axi_uartlite_0/S_AXI] [get_bd_intf_pins smartconnect_0/M03_AXI]
+  connect_bd_intf_net -intf_net zynq_ultra_ps_e_0_M_AXI_HPM0_LPD [get_bd_intf_pins S00_AXI] [get_bd_intf_pins smartconnect_0/S00_AXI]
+
+  # Create port connections
+  connect_bd_net -net UART2_TXD [get_bd_pins axi_uartlite_0/rx] [get_bd_pins p1_o_bit5/Dout]
+  connect_bd_net -net axi_gpio_0_gpio_io_o [get_bd_pins p0_tri_i] [get_bd_pins axi_gpio_0/gpio_io_o]
+  connect_bd_net -net axi_gpio_1_gpio_io_o [get_bd_pins axi_gpio_1/gpio_io_o] [get_bd_pins p1_i_bit15to6/Din]
+  connect_bd_net -net axi_gpio_2_gpio2_io_o [get_bd_pins gpio2_tri_o] [get_bd_pins axi_gpio_2/gpio2_io_o]
+  connect_bd_net -net axi_gpio_2_gpio_io_o [get_bd_pins gpio_tri_i] [get_bd_pins axi_gpio_2/gpio_io_o]
+  connect_bd_net -net axi_uartlite_0_tx [get_bd_pins axi_uartlite_0/tx] [get_bd_pins p1_i_concat/In4]
+  connect_bd_net -net nanosoc_chip_0_p0_o [get_bd_pins p0_tri_o] [get_bd_pins axi_gpio_0/gpio_io_i]
+  connect_bd_net -net nanosoc_chip_0_p0_z [get_bd_pins p0_tri_z] [get_bd_pins axi_gpio_0/gpio2_io_i]
+  connect_bd_net -net nanosoc_chip_0_p1_o [get_bd_pins p1_tri_o] [get_bd_pins axi_gpio_1/gpio_io_i] [get_bd_pins p1_o_bit1/Din] [get_bd_pins p1_o_bit15to6/Din] [get_bd_pins p1_o_bit2/Din] [get_bd_pins p1_o_bit3/Din] [get_bd_pins p1_o_bit5/Din]
+  connect_bd_net -net nanosoc_chip_0_swdio_o [get_bd_pins gpio_tri_o] [get_bd_pins axi_gpio_2/gpio_io_i]
+  connect_bd_net -net nanosoc_chip_0_swdio_z [get_bd_pins gpio2_tri_z] [get_bd_pins axi_gpio_2/gpio2_io_i]
+  connect_bd_net -net const0 [get_bd_pins p1_i_concat/In1] [get_bd_pins p1_i_concat/In3] [get_bd_pins p1_i_concat/In5] [get_bd_pins pmoda_o_concat8/In2] [get_bd_pins pmoda_o_concat8/In4] [get_bd_pins pmoda_o_concat8/In5] [get_bd_pins pmoda_o_concat8/In6] [get_bd_pins pmoda_o_concat8/In7] [get_bd_pins pmoda_z_concat8/In0] [get_bd_pins pmoda_z_concat8/In1] [get_bd_pins xlconstant_0/dout]
+  connect_bd_net -net const1 [get_bd_pins pmoda_z_concat8/In2] [get_bd_pins pmoda_z_concat8/In4] [get_bd_pins pmoda_z_concat8/In5] [get_bd_pins pmoda_z_concat8/In6] [get_bd_pins pmoda_z_concat8/In7] [get_bd_pins xlconstant_1/dout]
+  connect_bd_net -net ftclk_o [get_bd_pins p1_o_bit1/Dout] [get_bd_pins pmoda_o_concat8/In0]
+  connect_bd_net -net ftmiosio_o [get_bd_pins p1_o_bit2/Dout] [get_bd_pins pmoda_o_concat8/In3]
+  connect_bd_net -net ftmiosio_z [get_bd_pins p1_z_bit2/Dout] [get_bd_pins pmoda_z_concat8/In3]
+  connect_bd_net -net ftssn_n [get_bd_pins p1_o_bit3/Dout] [get_bd_pins pmoda_o_concat8/In1]
+  connect_bd_net -net p1_i [get_bd_pins p1_tri_i] [get_bd_pins p1_i_concat/dout]
+  connect_bd_net -net p1_i_bit15to6_Dout [get_bd_pins p1_i_bit15to6/Dout] [get_bd_pins p1_i_concat/In6]
+  connect_bd_net -net p1_z [get_bd_pins p1_tri_z] [get_bd_pins axi_gpio_1/gpio2_io_i] [get_bd_pins p1_z_bit2/Din]
+  connect_bd_net -net pmoda_i_1 [get_bd_pins pmoda_tri_i] [get_bd_pins pmoda_i_bit2/Din] [get_bd_pins pmoda_i_bit3/Din]
+  connect_bd_net -net pmoda_i_bit2_Dout [get_bd_pins p1_i_concat/In0] [get_bd_pins pmoda_i_bit2/Dout]
+  connect_bd_net -net pmoda_i_bit3_Dout [get_bd_pins p1_i_concat/In2] [get_bd_pins pmoda_i_bit3/Dout]
+  connect_bd_net -net pmoda_o_concat9_dout [get_bd_pins pmoda_tri_z] [get_bd_pins pmoda_z_concat8/dout]
+  connect_bd_net -net proc_sys_reset_0_interconnect_aresetn [get_bd_pins axi_gpio_0/s_axi_aresetn] [get_bd_pins axi_gpio_1/s_axi_aresetn] [get_bd_pins axi_gpio_2/s_axi_aresetn] [get_bd_pins axi_uartlite_0/s_axi_aresetn] [get_bd_pins proc_sys_reset_0/interconnect_aresetn] [get_bd_pins smartconnect_0/aresetn]
+  connect_bd_net -net proc_sys_reset_0_peripheral_aresetn [get_bd_pins nrst] [get_bd_pins proc_sys_reset_0/peripheral_aresetn]
+  connect_bd_net -net xlconcat_0_dout [get_bd_pins pmoda_tri_o] [get_bd_pins pmoda_o_concat8/dout]
+  connect_bd_net -net zynq_ultra_ps_e_0_pl_clk0 [get_bd_pins aclk] [get_bd_pins axi_gpio_0/s_axi_aclk] [get_bd_pins axi_gpio_1/s_axi_aclk] [get_bd_pins axi_gpio_2/s_axi_aclk] [get_bd_pins axi_uartlite_0/s_axi_aclk] [get_bd_pins proc_sys_reset_0/slowest_sync_clk] [get_bd_pins smartconnect_0/aclk]
+  connect_bd_net -net zynq_ultra_ps_e_0_pl_resetn0 [get_bd_pins ext_reset_in] [get_bd_pins proc_sys_reset_0/ext_reset_in]
+
+  # Restore current instance
+  current_bd_instance $oldCurInst
+}
+
+
+# Procedure to create entire design; Provide argument to make
+# procedure reusable. If parentCell is "", will use root.
+proc create_root_design { parentCell } {
+
+  variable script_folder
+
+  if { $parentCell eq "" } {
+     set parentCell [get_bd_cells /]
+  }
+
+  # Get object for parentCell
+  set parentObj [get_bd_cells $parentCell]
+  if { $parentObj == "" } {
+     catch {common::send_gid_msg -ssname BD::TCL -id 2090 -severity "ERROR" "Unable to find parent cell <$parentCell>!"}
+     return
+  }
+
+  # Make sure parentObj is hier blk
+  set parentType [get_property TYPE $parentObj]
+  if { $parentType ne "hier" } {
+     catch {common::send_gid_msg -ssname BD::TCL -id 2091 -severity "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be <hier>."}
+     return
+  }
+
+  # Save current instance; Restore later
+  set oldCurInst [current_bd_instance .]
+
+  # Set parent object as current
+  current_bd_instance $parentObj
+
+
+  # Create interface ports
+
+  # Create ports
+  set pmoda_tri_i [ create_bd_port -dir I -from 7 -to 0 pmoda_tri_i ]
+  set pmoda_tri_o [ create_bd_port -dir O -from 7 -to 0 pmoda_tri_o ]
+  set pmoda_tri_z [ create_bd_port -dir O -from 7 -to 0 pmoda_tri_z ]
+
+  # Create instance: nanosoc_chip_0, and set properties
+  set nanosoc_chip_0 [ create_bd_cell -type ip -vlnv soclabs.org:user:nanosoc_chip:1.0 nanosoc_chip_0 ]
+
+  # Create instance: cmsdk_socket
+  create_hier_cell_cmsdk_socket [current_bd_instance .] cmsdk_socket
+
+  # Create instance: processing_system7_0, and set properties
+  set processing_system7_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:processing_system7:5.5 processing_system7_0 ]
+  set_property -dict [ list \
+   CONFIG.PCW_ACT_APU_PERIPHERAL_FREQMHZ {666.666687} \
+   CONFIG.PCW_ACT_CAN_PERIPHERAL_FREQMHZ {10.000000} \
+   CONFIG.PCW_ACT_DCI_PERIPHERAL_FREQMHZ {10.158730} \
+   CONFIG.PCW_ACT_ENET0_PERIPHERAL_FREQMHZ {10.000000} \
+   CONFIG.PCW_ACT_ENET1_PERIPHERAL_FREQMHZ {10.000000} \
+   CONFIG.PCW_ACT_FPGA0_PERIPHERAL_FREQMHZ {20.000000} \
+   CONFIG.PCW_ACT_FPGA1_PERIPHERAL_FREQMHZ {10.000000} \
+   CONFIG.PCW_ACT_FPGA2_PERIPHERAL_FREQMHZ {10.000000} \
+   CONFIG.PCW_ACT_FPGA3_PERIPHERAL_FREQMHZ {10.000000} \
+   CONFIG.PCW_ACT_PCAP_PERIPHERAL_FREQMHZ {200.000000} \
+   CONFIG.PCW_ACT_QSPI_PERIPHERAL_FREQMHZ {10.000000} \
+   CONFIG.PCW_ACT_SDIO_PERIPHERAL_FREQMHZ {10.000000} \
+   CONFIG.PCW_ACT_SMC_PERIPHERAL_FREQMHZ {10.000000} \
+   CONFIG.PCW_ACT_SPI_PERIPHERAL_FREQMHZ {10.000000} \
+   CONFIG.PCW_ACT_TPIU_PERIPHERAL_FREQMHZ {200.000000} \
+   CONFIG.PCW_ACT_TTC0_CLK0_PERIPHERAL_FREQMHZ {111.111115} \
+   CONFIG.PCW_ACT_TTC0_CLK1_PERIPHERAL_FREQMHZ {111.111115} \
+   CONFIG.PCW_ACT_TTC0_CLK2_PERIPHERAL_FREQMHZ {111.111115} \
+   CONFIG.PCW_ACT_TTC1_CLK0_PERIPHERAL_FREQMHZ {111.111115} \
+   CONFIG.PCW_ACT_TTC1_CLK1_PERIPHERAL_FREQMHZ {111.111115} \
+   CONFIG.PCW_ACT_TTC1_CLK2_PERIPHERAL_FREQMHZ {111.111115} \
+   CONFIG.PCW_ACT_UART_PERIPHERAL_FREQMHZ {10.000000} \
+   CONFIG.PCW_ACT_WDT_PERIPHERAL_FREQMHZ {111.111115} \
+   CONFIG.PCW_ARMPLL_CTRL_FBDIV {40} \
+   CONFIG.PCW_CAN_PERIPHERAL_DIVISOR0 {1} \
+   CONFIG.PCW_CAN_PERIPHERAL_DIVISOR1 {1} \
+   CONFIG.PCW_CLK0_FREQ {20000000} \
+   CONFIG.PCW_CLK1_FREQ {10000000} \
+   CONFIG.PCW_CLK2_FREQ {10000000} \
+   CONFIG.PCW_CLK3_FREQ {10000000} \
+   CONFIG.PCW_CPU_CPU_PLL_FREQMHZ {1333.333} \
+   CONFIG.PCW_CPU_PERIPHERAL_DIVISOR0 {2} \
+   CONFIG.PCW_DCI_PERIPHERAL_DIVISOR0 {15} \
+   CONFIG.PCW_DCI_PERIPHERAL_DIVISOR1 {7} \
+   CONFIG.PCW_DDRPLL_CTRL_FBDIV {32} \
+   CONFIG.PCW_DDR_DDR_PLL_FREQMHZ {1066.667} \
+   CONFIG.PCW_DDR_PERIPHERAL_DIVISOR0 {2} \
+   CONFIG.PCW_DDR_RAM_HIGHADDR {0x1FFFFFFF} \
+   CONFIG.PCW_ENET0_PERIPHERAL_DIVISOR0 {1} \
+   CONFIG.PCW_ENET0_PERIPHERAL_DIVISOR1 {1} \
+   CONFIG.PCW_ENET1_PERIPHERAL_DIVISOR0 {1} \
+   CONFIG.PCW_ENET1_PERIPHERAL_DIVISOR1 {1} \
+   CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR0 {10} \
+   CONFIG.PCW_FCLK0_PERIPHERAL_DIVISOR1 {8} \
+   CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR0 {1} \
+   CONFIG.PCW_FCLK1_PERIPHERAL_DIVISOR1 {1} \
+   CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR0 {1} \
+   CONFIG.PCW_FCLK2_PERIPHERAL_DIVISOR1 {1} \
+   CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR0 {1} \
+   CONFIG.PCW_FCLK3_PERIPHERAL_DIVISOR1 {1} \
+   CONFIG.PCW_FPGA0_PERIPHERAL_FREQMHZ {20} \
+   CONFIG.PCW_FPGA_FCLK0_ENABLE {1} \
+   CONFIG.PCW_FPGA_FCLK1_ENABLE {0} \
+   CONFIG.PCW_FPGA_FCLK2_ENABLE {0} \
+   CONFIG.PCW_FPGA_FCLK3_ENABLE {0} \
+   CONFIG.PCW_I2C_PERIPHERAL_FREQMHZ {25} \
+   CONFIG.PCW_IOPLL_CTRL_FBDIV {48} \
+   CONFIG.PCW_IO_IO_PLL_FREQMHZ {1600.000} \
+   CONFIG.PCW_PCAP_PERIPHERAL_DIVISOR0 {8} \
+   CONFIG.PCW_QSPI_PERIPHERAL_DIVISOR0 {1} \
+   CONFIG.PCW_SDIO_PERIPHERAL_DIVISOR0 {1} \
+   CONFIG.PCW_SMC_PERIPHERAL_DIVISOR0 {1} \
+   CONFIG.PCW_SPI_PERIPHERAL_DIVISOR0 {1} \
+   CONFIG.PCW_TPIU_PERIPHERAL_DIVISOR0 {1} \
+   CONFIG.PCW_UART_PERIPHERAL_DIVISOR0 {1} \
+   CONFIG.PCW_UIPARAM_ACT_DDR_FREQ_MHZ {533.333374} \
+ ] $processing_system7_0
+
+  # Create interface connections
+  connect_bd_intf_net -intf_net S00_AXI_1 [get_bd_intf_pins cmsdk_socket/S00_AXI] [get_bd_intf_pins processing_system7_0/M_AXI_GP0]
+
+  # Create port connections
+  connect_bd_net -net nanosoc_chip_0_swdio_o [get_bd_pins nanosoc_chip_0/swdio_o] [get_bd_pins cmsdk_socket/gpio_tri_o]
+  connect_bd_net -net nanosoc_chip_0_swdio_z [get_bd_pins nanosoc_chip_0/swdio_z] [get_bd_pins cmsdk_socket/gpio2_tri_z]
+  connect_bd_net -net cmsdk_socket_gpio2_tri_o [get_bd_pins nanosoc_chip_0/swdclk_i] [get_bd_pins cmsdk_socket/gpio2_tri_o]
+  connect_bd_net -net cmsdk_socket_gpio_tri_i [get_bd_pins nanosoc_chip_0/swdio_i] [get_bd_pins cmsdk_socket/gpio_tri_i]
+  connect_bd_net -net cmsdk_socket_nrst [get_bd_pins nanosoc_chip_0/nrst_i] [get_bd_pins cmsdk_socket/nrst]
+  connect_bd_net -net cmsdk_socket_p0_tri_i [get_bd_pins nanosoc_chip_0/p0_i] [get_bd_pins cmsdk_socket/p0_tri_i]
+  connect_bd_net -net cmsdk_socket_p1_tri_i [get_bd_pins nanosoc_chip_0/p1_i] [get_bd_pins cmsdk_socket/p1_tri_i]
+  connect_bd_net -net p0_tri_o_1 [get_bd_pins nanosoc_chip_0/p0_o] [get_bd_pins cmsdk_socket/p0_tri_o]
+  connect_bd_net -net p0_tri_z_1 [get_bd_pins nanosoc_chip_0/p0_z] [get_bd_pins cmsdk_socket/p0_tri_z]
+  connect_bd_net -net p1_tri_o_1 [get_bd_pins nanosoc_chip_0/p1_o] [get_bd_pins cmsdk_socket/p1_tri_o]
+  connect_bd_net -net p1_tri_z_1 [get_bd_pins nanosoc_chip_0/p1_z] [get_bd_pins cmsdk_socket/p1_tri_z]
+  connect_bd_net -net pmoda_i_1 [get_bd_ports pmoda_tri_i] [get_bd_pins cmsdk_socket/pmoda_tri_i]
+  connect_bd_net -net pmoda_o_concat9_dout [get_bd_ports pmoda_tri_z] [get_bd_pins cmsdk_socket/pmoda_tri_z]
+  connect_bd_net -net processing_system7_0_FCLK_CLK0 [get_bd_pins nanosoc_chip_0/xtal_clk_i] [get_bd_pins cmsdk_socket/aclk] [get_bd_pins processing_system7_0/FCLK_CLK0] [get_bd_pins processing_system7_0/M_AXI_GP0_ACLK]
+  connect_bd_net -net processing_system7_0_FCLK_RESET0_N [get_bd_pins cmsdk_socket/ext_reset_in] [get_bd_pins processing_system7_0/FCLK_RESET0_N]
+  connect_bd_net -net xlconcat_0_dout [get_bd_ports pmoda_tri_o] [get_bd_pins cmsdk_socket/pmoda_tri_o]
+
+  # Create address segments
+  assign_bd_address -offset 0x41200000 -range 0x00010000 -target_address_space [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs cmsdk_socket/axi_gpio_0/S_AXI/Reg] -force
+  assign_bd_address -offset 0x41210000 -range 0x00010000 -target_address_space [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs cmsdk_socket/axi_gpio_1/S_AXI/Reg] -force
+  assign_bd_address -offset 0x41220000 -range 0x00010000 -target_address_space [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs cmsdk_socket/axi_gpio_2/S_AXI/Reg] -force
+  assign_bd_address -offset 0x42C00000 -range 0x00010000 -target_address_space [get_bd_addr_spaces processing_system7_0/Data] [get_bd_addr_segs cmsdk_socket/axi_uartlite_0/S_AXI/Reg] -force
+
+
+  # Restore current instance
+  current_bd_instance $oldCurInst
+
+}
+# End of create_root_design()
+
+
+
+
+proc available_tcl_procs { } {
+   puts "##################################################################"
+   puts "# Available Tcl procedures to recreate hierarchical blocks:"
+   puts "#"
+   puts "#    create_hier_cell_cmsdk_socket parentCell nameHier"
+   puts "#    create_root_design"
+   puts "#"
+   puts "#"
+   puts "# The following procedures will create hiearchical blocks with addressing "
+   puts "# for IPs within those blocks and their sub-hierarchical blocks. Addressing "
+   puts "# will not be handled outside those blocks:"
+   puts "#"
+   puts "#    create_root_design"
+   puts "#"
+   puts "##################################################################"
+}
+
+available_tcl_procs
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1_wrapper.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1_wrapper.v
new file mode 100644
index 0000000..ce586c7
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/design_1_wrapper.v
@@ -0,0 +1,107 @@
+//Copyright 1986-2021 Xilinx, Inc. All Rights Reserved.
+//--------------------------------------------------------------------------------
+//Tool Version: Vivado v.2021.1 (lin64) Build 3247384 Thu Jun 10 19:36:07 MDT 2021
+//Date        : Wed Jun 22 15:58:42 2022
+//Host        : srv03335 running 64-bit Red Hat Enterprise Linux release 8.6 (Ootpa)
+//Command     : generate_target design_1_wrapper.bd
+//Design      : design_1_wrapper
+//Purpose     : IP block netlist
+//--------------------------------------------------------------------------------
+`timescale 1 ps / 1 ps
+
+module design_1_wrapper
+   (PMOD0_0,
+    PMOD0_1,
+    PMOD0_2,
+    PMOD0_3,
+    PMOD0_4,
+    PMOD0_5,
+    PMOD0_6,
+    PMOD0_7
+    );
+//    PMOD1_0,
+//    PMOD1_1,
+//    PMOD1_2,
+//    PMOD1_3,
+//    PMOD1_4,
+//    PMOD1_5,
+//    PMOD1_6,
+//    PMOD1_7,
+//    dip_switch_4bits_tri_i,
+//    led_4bits_tri_o);
+
+  inout wire PMOD0_0;
+  inout wire PMOD0_1;
+  inout wire PMOD0_2;
+  inout wire PMOD0_3;
+  inout wire PMOD0_4;
+  inout wire PMOD0_5;
+  inout wire PMOD0_6;
+  inout wire PMOD0_7;
+//  inout wire PMOD1_0;
+//  inout wire PMOD1_1;
+//  inout wire PMOD1_2;
+//  inout wire PMOD1_3;
+//  inout wire PMOD1_4;
+//  inout wire PMOD1_5;
+//  inout wire PMOD1_6;
+//  inout wire PMOD1_7;
+
+//  input wire [3:0]dip_switch_4bits_tri_i;
+//  output wire [3:0]led_4bits_tri_o;
+
+  wire [7:0]PMOD0_tri_i;
+  wire [7:0]PMOD0_tri_o;
+  wire [7:0]PMOD0_tri_z;
+  
+  assign PMOD0_tri_i[0] = PMOD0_0;
+  assign PMOD0_tri_i[1] = PMOD0_1;
+  assign PMOD0_tri_i[2] = PMOD0_2;
+  assign PMOD0_tri_i[3] = PMOD0_3;
+  assign PMOD0_tri_i[4] = PMOD0_4;
+  assign PMOD0_tri_i[5] = PMOD0_5;
+  assign PMOD0_tri_i[6] = PMOD0_6;
+  assign PMOD0_tri_i[7] = PMOD0_7;
+  
+  assign PMOD0_0 = PMOD0_tri_z[0] ? 1'bz : PMOD0_tri_o[0];
+  assign PMOD0_1 = PMOD0_tri_z[1] ? 1'bz : PMOD0_tri_o[1];
+  assign PMOD0_2 = PMOD0_tri_z[2] ? 1'bz : PMOD0_tri_o[2];
+  assign PMOD0_3 = PMOD0_tri_z[3] ? 1'bz : PMOD0_tri_o[3];
+  assign PMOD0_4 = PMOD0_tri_z[4] ? 1'bz : PMOD0_tri_o[4];
+  assign PMOD0_5 = PMOD0_tri_z[5] ? 1'bz : PMOD0_tri_o[5];
+  assign PMOD0_6 = PMOD0_tri_z[6] ? 1'bz : PMOD0_tri_o[6];
+  assign PMOD0_7 = PMOD0_tri_z[7] ? 1'bz : PMOD0_tri_o[7];
+
+//  wire [7:0]PMOD1_tri_i;
+//  wire [7:0]PMOD1_tri_o;
+//  wire [7:0]PMOD1_tri_z;
+  
+//  assign PMOD1_tri_i[0] = PMOD1_0;
+//  assign PMOD1_tri_i[1] = PMOD1_1;
+//  assign PMOD1_tri_i[2] = PMOD1_2;
+//  assign PMOD1_tri_i[3] = PMOD1_3;
+//  assign PMOD1_tri_i[4] = PMOD1_4;
+//  assign PMOD1_tri_i[5] = PMOD1_5;
+//  assign PMOD1_tri_i[6] = PMOD1_6;
+//  assign PMOD1_tri_i[7] = PMOD1_7;
+  
+//  assign PMOD1_0 = PMOD1_tri_z[0] ? 1'bz : PMOD1_tri_o[0];
+//  assign PMOD1_1 = PMOD1_tri_z[1] ? 1'bz : PMOD1_tri_o[1];
+//  assign PMOD1_2 = PMOD1_tri_z[2] ? 1'bz : PMOD1_tri_o[2];
+//  assign PMOD1_3 = PMOD1_tri_z[3] ? 1'bz : PMOD1_tri_o[3];
+//  assign PMOD1_4 = PMOD1_tri_z[4] ? 1'bz : PMOD1_tri_o[4];
+//  assign PMOD1_5 = PMOD1_tri_z[5] ? 1'bz : PMOD1_tri_o[5];
+//  assign PMOD1_6 = PMOD1_tri_z[6] ? 1'bz : PMOD1_tri_o[6];
+//  assign PMOD1_7 = PMOD1_tri_z[7] ? 1'bz : PMOD1_tri_o[7];
+
+  design_1 design_1_i
+       (.pmoda_tri_i(PMOD0_tri_i),
+        .pmoda_tri_o(PMOD0_tri_o),
+        .pmoda_tri_z(PMOD0_tri_z)//,
+//        .PMOD1_tri_i(PMOD1_tri_i),
+//        .PMOD1_tri_o(PMOD1_tri_o),
+//        .PMOD1_tri_z(PMOD1_tri_z),
+//        .dip_switch_4bits_tri_i(dip_switch_4bits_tri_i),
+//        .led_4bits_tri_o(led_4bits_tri_o)
+        );
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_pinmap.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_pinmap.xdc
new file mode 100644
index 0000000..5599cd2
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_pinmap.xdc
@@ -0,0 +1,33 @@
+##################################################################################
+##                                                                              ##
+## PZ2 PMODA XDC                                                                ##
+##                                                                              ##
+##################################################################################
+
+
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_0]
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_1]
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_2]
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_3]
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_4]
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_5]
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_6]
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_7]
+
+set_property PACKAGE_PIN Y18 [get_ports PMOD0_0]
+set_property PACKAGE_PIN Y19 [get_ports PMOD0_1]
+set_property PACKAGE_PIN Y16 [get_ports PMOD0_2]
+set_property PACKAGE_PIN Y17 [get_ports PMOD0_3]
+set_property PACKAGE_PIN U18 [get_ports PMOD0_4]
+set_property PACKAGE_PIN U19 [get_ports PMOD0_5]
+set_property PACKAGE_PIN W18 [get_ports PMOD0_6]
+set_property PACKAGE_PIN W19 [get_ports PMOD0_7]
+
+set_property PULLUP true [get_ports PMOD0_2]
+set_property PULLDOWN true [get_ports PMOD0_3]
+set_property PULLUP true [get_ports PMOD0_4]
+set_property PULLUP true [get_ports PMOD0_5]
+set_property PULLUP true [get_ports PMOD0_6]
+set_property PULLUP true [get_ports PMOD0_7]
+
+set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets PMOD0_7_IBUF]
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_synth.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_synth.tcl
new file mode 100644
index 0000000..1a9e44e
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_synth.tcl
@@ -0,0 +1 @@
+synth_design -top cmsdk_mcu_chip -part xc7z020clg400-1
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_timing.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_timing.xdc
new file mode 100644
index 0000000..879aaad
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_pynq_z2/fpga_timing.xdc
@@ -0,0 +1,95 @@
+##################################################################################
+##                                                                              ##
+## ZYNQ timing XDC                                                              ##
+##                                                                              ##
+##################################################################################
+
+create_clock -name CLK -period 30 [get_ports XTAL1]
+create_clock -name VCLK -period 30 -waveform {5 20}
+
+create_clock -name SWCLK -period 60 [get_ports SWCLKTCK]
+create_clock -name VSWCLK -period 60 -waveform {5 35}
+
+set_clock_groups -name async_clk_swclock -asynchronous \
+-group [get_clocks -include_generated_clocks CLK] \
+-group [get_clocks -include_generated_clocks VSWCLK]
+
+#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports {dip_switch_4bits_tri_i[*]}]
+#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 18.000 [get_ports {dip_switch_4bits_tri_i[*]}]
+#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_2]
+#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 18.000 [get_ports PMOD0_2]
+#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_3]
+#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 18.000 [get_ports PMOD0_3]
+#set_output_delay -clock [get_clocks clk_pl_0] -min -add_delay 5.000 [get_ports {led_4bits_tri_o[*]}]
+#set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {led_4bits_tri_o[*]}]
+
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[0]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[0]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[1]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[1]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[2]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[2]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[3]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[3]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[4]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[4]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[5]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[5]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[6]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[6]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[7]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[7]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[8]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[8]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[9]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[9]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[10]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[10]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[11]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[11]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[12]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[12]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[13]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[13]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[14]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[14]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P0[15]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P0[15]}]
+
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[0]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[0]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[1]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[1]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[2]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[2]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[3]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[3]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[4]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[4]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[5]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[5]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[6]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[6]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[7]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[7]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[8]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[8]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[9]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[9]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[10]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[10]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[11]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[11]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[12]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[12]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[13]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[13]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[14]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[14]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {P1[15]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {P1[15]}]
+
+#set_property C_CLK_INPUT_FREQ_HZ 5000000 [get_debug_cores dbg_hub]
+#set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
+#set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
+#connect_debug_port dbg_hub/clk [get_nets clk]
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1.tcl
new file mode 100644
index 0000000..4859c7b
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1.tcl
@@ -0,0 +1,1017 @@
+
+################################################################
+# This is a generated script based on design: design_1
+#
+# Though there are limitations about the generated script,
+# the main purpose of this utility is to make learning
+# IP Integrator Tcl commands easier.
+################################################################
+
+namespace eval _tcl {
+proc get_script_folder {} {
+   set script_path [file normalize [info script]]
+   set script_folder [file dirname $script_path]
+   return $script_folder
+}
+}
+variable script_folder
+set script_folder [_tcl::get_script_folder]
+
+################################################################
+# Check if script is running in correct Vivado version.
+################################################################
+set scripts_vivado_version 2021.1
+set current_vivado_version [version -short]
+
+if { [string first $scripts_vivado_version $current_vivado_version] == -1 } {
+   puts ""
+   catch {common::send_gid_msg -ssname BD::TCL -id 2041 -severity "ERROR" "This script was generated using Vivado <$scripts_vivado_version> and is being run in <$current_vivado_version> of Vivado. Please run the script in Vivado <$scripts_vivado_version> then open the design in Vivado <$current_vivado_version>. Upgrade the design by running \"Tools => Report => Report IP Status...\", then run write_bd_tcl to create an updated script."}
+
+   return 1
+}
+
+################################################################
+# START
+################################################################
+
+# To test this script, run the following commands from Vivado Tcl console:
+# source design_1_script.tcl
+
+set bCheckIPsPassed 1
+##################################################################
+# CHECK IPs
+##################################################################
+set bCheckIPs 1
+if { $bCheckIPs == 1 } {
+   set list_check_ips "\ 
+soclabs.org:user:nanosoc_chip:1.0\
+xilinx.com:ip:zynq_ultra_ps_e:3.3\
+xilinx.com:ip:axi_gpio:2.0\
+xilinx.com:ip:axi_uartlite:2.0\
+xilinx.com:ip:xlslice:1.0\
+xilinx.com:ip:xlconcat:2.1\
+xilinx.com:ip:proc_sys_reset:5.0\
+xilinx.com:ip:smartconnect:1.0\
+xilinx.com:ip:xlconstant:1.1\
+"
+
+   set list_ips_missing ""
+   common::send_gid_msg -ssname BD::TCL -id 2011 -severity "INFO" "Checking if the following IPs exist in the project's IP catalog: $list_check_ips ."
+
+   foreach ip_vlnv $list_check_ips {
+      set ip_obj [get_ipdefs -all $ip_vlnv]
+      if { $ip_obj eq "" } {
+         lappend list_ips_missing $ip_vlnv
+      }
+   }
+
+   if { $list_ips_missing ne "" } {
+      catch {common::send_gid_msg -ssname BD::TCL -id 2012 -severity "ERROR" "The following IPs are not found in the IP Catalog:\n  $list_ips_missing\n\nResolution: Please add the repository containing the IP(s) to the project." }
+      set bCheckIPsPassed 0
+   }
+
+}
+
+if { $bCheckIPsPassed != 1 } {
+  common::send_gid_msg -ssname BD::TCL -id 2023 -severity "WARNING" "Will not continue with creation of design due to the error(s) above."
+  return 3
+}
+
+##################################################################
+# DESIGN PROCs
+##################################################################
+
+
+# Hierarchical cell: cmsdk_socket
+proc create_hier_cell_cmsdk_socket { parentCell nameHier } {
+
+  variable script_folder
+
+  if { $parentCell eq "" || $nameHier eq "" } {
+     catch {common::send_gid_msg -ssname BD::TCL -id 2092 -severity "ERROR" "create_hier_cell_cmsdk_socket() - Empty argument(s)!"}
+     return
+  }
+
+  # Get object for parentCell
+  set parentObj [get_bd_cells $parentCell]
+  if { $parentObj == "" } {
+     catch {common::send_gid_msg -ssname BD::TCL -id 2090 -severity "ERROR" "Unable to find parent cell <$parentCell>!"}
+     return
+  }
+
+  # Make sure parentObj is hier blk
+  set parentType [get_property TYPE $parentObj]
+  if { $parentType ne "hier" } {
+     catch {common::send_gid_msg -ssname BD::TCL -id 2091 -severity "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be <hier>."}
+     return
+  }
+
+  # Save current instance; Restore later
+  set oldCurInst [current_bd_instance .]
+
+  # Set parent object as current
+  current_bd_instance $parentObj
+
+  # Create cell and set as current instance
+  set hier_obj [create_bd_cell -type hier $nameHier]
+  current_bd_instance $hier_obj
+
+  # Create interface pins
+  create_bd_intf_pin -mode Slave -vlnv xilinx.com:interface:aximm_rtl:1.0 S00_AXI
+
+
+  # Create pins
+  create_bd_pin -dir I -type clk aclk
+  create_bd_pin -dir I -type rst ext_reset_in
+  create_bd_pin -dir O -from 15 -to 0 gpio2_tri_o
+  create_bd_pin -dir I -from 15 -to 0 gpio2_tri_z
+  create_bd_pin -dir O -from 15 -to 0 gpio_tri_i
+  create_bd_pin -dir I -from 15 -to 0 gpio_tri_o
+  create_bd_pin -dir O -from 0 -to 0 -type rst nrst
+  create_bd_pin -dir O -from 15 -to 0 p0_tri_i
+  create_bd_pin -dir I -from 15 -to 0 p0_tri_o
+  create_bd_pin -dir I -from 15 -to 0 p0_tri_z
+  create_bd_pin -dir O -from 15 -to 0 p1_tri_i
+  create_bd_pin -dir I -from 15 -to 0 p1_tri_o
+  create_bd_pin -dir I -from 15 -to 0 p1_tri_z
+  create_bd_pin -dir I -from 7 -to 0 pmoda_tri_i
+  create_bd_pin -dir O -from 7 -to 0 pmoda_tri_o
+  create_bd_pin -dir O -from 7 -to 0 pmoda_tri_z
+
+  # Create instance: axi_gpio_0, and set properties
+  set axi_gpio_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_0 ]
+  set_property -dict [ list \
+   CONFIG.C_GPIO2_WIDTH {16} \
+   CONFIG.C_GPIO_WIDTH {16} \
+   CONFIG.C_IS_DUAL {1} \
+ ] $axi_gpio_0
+
+  # Create instance: axi_gpio_1, and set properties
+  set axi_gpio_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_1 ]
+  set_property -dict [ list \
+   CONFIG.C_GPIO2_WIDTH {16} \
+   CONFIG.C_GPIO_WIDTH {16} \
+   CONFIG.C_IS_DUAL {1} \
+ ] $axi_gpio_1
+
+  # Create instance: axi_gpio_2, and set properties
+  set axi_gpio_2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_gpio:2.0 axi_gpio_2 ]
+  set_property -dict [ list \
+   CONFIG.C_GPIO2_WIDTH {16} \
+   CONFIG.C_GPIO_WIDTH {16} \
+   CONFIG.C_IS_DUAL {1} \
+ ] $axi_gpio_2
+
+  # Create instance: axi_uartlite_0, and set properties
+  set axi_uartlite_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:axi_uartlite:2.0 axi_uartlite_0 ]
+
+  # Create instance: p1_i_bit15to6, and set properties
+  set p1_i_bit15to6 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_i_bit15to6 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {15} \
+   CONFIG.DIN_TO {6} \
+   CONFIG.DIN_WIDTH {16} \
+   CONFIG.DOUT_WIDTH {10} \
+ ] $p1_i_bit15to6
+
+  # Create instance: p1_i_concat, and set properties
+  set p1_i_concat [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 p1_i_concat ]
+  set_property -dict [ list \
+   CONFIG.IN0_WIDTH {1} \
+   CONFIG.IN1_WIDTH {1} \
+   CONFIG.IN2_WIDTH {1} \
+   CONFIG.IN3_WIDTH {1} \
+   CONFIG.IN4_WIDTH {1} \
+   CONFIG.IN5_WIDTH {1} \
+   CONFIG.IN6_WIDTH {10} \
+   CONFIG.NUM_PORTS {7} \
+ ] $p1_i_concat
+
+  # Create instance: p1_o_bit1, and set properties
+  set p1_o_bit1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit1 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {1} \
+   CONFIG.DIN_TO {1} \
+   CONFIG.DIN_WIDTH {16} \
+   CONFIG.DOUT_WIDTH {1} \
+ ] $p1_o_bit1
+
+  # Create instance: p1_o_bit15to6, and set properties
+  set p1_o_bit15to6 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit15to6 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {15} \
+   CONFIG.DIN_TO {6} \
+   CONFIG.DIN_WIDTH {16} \
+   CONFIG.DOUT_WIDTH {10} \
+ ] $p1_o_bit15to6
+
+  # Create instance: p1_o_bit2, and set properties
+  set p1_o_bit2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit2 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {2} \
+   CONFIG.DIN_TO {2} \
+   CONFIG.DIN_WIDTH {16} \
+   CONFIG.DOUT_WIDTH {1} \
+ ] $p1_o_bit2
+
+  # Create instance: p1_o_bit3, and set properties
+  set p1_o_bit3 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit3 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {3} \
+   CONFIG.DIN_TO {3} \
+   CONFIG.DIN_WIDTH {16} \
+   CONFIG.DOUT_WIDTH {1} \
+ ] $p1_o_bit3
+
+  # Create instance: p1_o_bit5, and set properties
+  set p1_o_bit5 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_o_bit5 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {5} \
+   CONFIG.DIN_TO {5} \
+   CONFIG.DIN_WIDTH {16} \
+   CONFIG.DOUT_WIDTH {1} \
+ ] $p1_o_bit5
+
+  # Create instance: p1_z_bit2, and set properties
+  set p1_z_bit2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 p1_z_bit2 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {2} \
+   CONFIG.DIN_TO {2} \
+   CONFIG.DIN_WIDTH {16} \
+   CONFIG.DOUT_WIDTH {1} \
+ ] $p1_z_bit2
+
+  # Create instance: pmoda_i_bit2, and set properties
+  set pmoda_i_bit2 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 pmoda_i_bit2 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {2} \
+   CONFIG.DIN_TO {2} \
+   CONFIG.DIN_WIDTH {8} \
+   CONFIG.DOUT_WIDTH {1} \
+ ] $pmoda_i_bit2
+
+  # Create instance: pmoda_i_bit3, and set properties
+  set pmoda_i_bit3 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlslice:1.0 pmoda_i_bit3 ]
+  set_property -dict [ list \
+   CONFIG.DIN_FROM {3} \
+   CONFIG.DIN_TO {3} \
+   CONFIG.DIN_WIDTH {8} \
+   CONFIG.DOUT_WIDTH {1} \
+ ] $pmoda_i_bit3
+
+  # Create instance: pmoda_o_concat8, and set properties
+  set pmoda_o_concat8 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 pmoda_o_concat8 ]
+  set_property -dict [ list \
+   CONFIG.NUM_PORTS {8} \
+ ] $pmoda_o_concat8
+
+  # Create instance: pmoda_z_concat8, and set properties
+  set pmoda_z_concat8 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconcat:2.1 pmoda_z_concat8 ]
+  set_property -dict [ list \
+   CONFIG.NUM_PORTS {8} \
+ ] $pmoda_z_concat8
+
+  # Create instance: proc_sys_reset_0, and set properties
+  set proc_sys_reset_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:proc_sys_reset:5.0 proc_sys_reset_0 ]
+
+  # Create instance: smartconnect_0, and set properties
+  set smartconnect_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:smartconnect:1.0 smartconnect_0 ]
+  set_property -dict [ list \
+   CONFIG.NUM_MI {4} \
+   CONFIG.NUM_SI {1} \
+ ] $smartconnect_0
+
+  # Create instance: xlconstant_0, and set properties
+  set xlconstant_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconstant:1.1 xlconstant_0 ]
+  set_property -dict [ list \
+   CONFIG.CONST_VAL {0} \
+ ] $xlconstant_0
+
+  # Create instance: xlconstant_1, and set properties
+  set xlconstant_1 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconstant:1.1 xlconstant_1 ]
+
+  # Create interface connections
+  connect_bd_intf_net -intf_net smartconnect_0_M00_AXI [get_bd_intf_pins axi_gpio_0/S_AXI] [get_bd_intf_pins smartconnect_0/M00_AXI]
+  connect_bd_intf_net -intf_net smartconnect_0_M01_AXI [get_bd_intf_pins axi_gpio_1/S_AXI] [get_bd_intf_pins smartconnect_0/M01_AXI]
+  connect_bd_intf_net -intf_net smartconnect_0_M02_AXI [get_bd_intf_pins axi_gpio_2/S_AXI] [get_bd_intf_pins smartconnect_0/M02_AXI]
+  connect_bd_intf_net -intf_net smartconnect_0_M03_AXI [get_bd_intf_pins axi_uartlite_0/S_AXI] [get_bd_intf_pins smartconnect_0/M03_AXI]
+  connect_bd_intf_net -intf_net zynq_ultra_ps_e_0_M_AXI_HPM0_LPD [get_bd_intf_pins S00_AXI] [get_bd_intf_pins smartconnect_0/S00_AXI]
+
+  # Create port connections
+  connect_bd_net -net UART2_TXD [get_bd_pins axi_uartlite_0/rx] [get_bd_pins p1_o_bit5/Dout]
+  connect_bd_net -net axi_gpio_0_gpio_io_o [get_bd_pins p0_tri_i] [get_bd_pins axi_gpio_0/gpio_io_o]
+  connect_bd_net -net axi_gpio_1_gpio_io_o [get_bd_pins axi_gpio_1/gpio_io_o] [get_bd_pins p1_i_bit15to6/Din]
+  connect_bd_net -net axi_gpio_2_gpio2_io_o [get_bd_pins gpio2_tri_o] [get_bd_pins axi_gpio_2/gpio2_io_o]
+  connect_bd_net -net axi_gpio_2_gpio_io_o [get_bd_pins gpio_tri_i] [get_bd_pins axi_gpio_2/gpio_io_o]
+  connect_bd_net -net axi_uartlite_0_tx [get_bd_pins axi_uartlite_0/tx] [get_bd_pins p1_i_concat/In4]
+  connect_bd_net -net nanosoc_chip_0_p0_o [get_bd_pins p0_tri_o] [get_bd_pins axi_gpio_0/gpio_io_i]
+  connect_bd_net -net nanosoc_chip_0_p0_z [get_bd_pins p0_tri_z] [get_bd_pins axi_gpio_0/gpio2_io_i]
+  connect_bd_net -net nanosoc_chip_0_p1_o [get_bd_pins p1_tri_o] [get_bd_pins axi_gpio_1/gpio_io_i] [get_bd_pins p1_o_bit1/Din] [get_bd_pins p1_o_bit15to6/Din] [get_bd_pins p1_o_bit2/Din] [get_bd_pins p1_o_bit3/Din] [get_bd_pins p1_o_bit5/Din]
+  connect_bd_net -net nanosoc_chip_0_swdio_o [get_bd_pins gpio_tri_o] [get_bd_pins axi_gpio_2/gpio_io_i]
+  connect_bd_net -net nanosoc_chip_0_swdio_z [get_bd_pins gpio2_tri_z] [get_bd_pins axi_gpio_2/gpio2_io_i]
+  connect_bd_net -net const0 [get_bd_pins p1_i_concat/In1] [get_bd_pins p1_i_concat/In3] [get_bd_pins p1_i_concat/In5] [get_bd_pins pmoda_o_concat8/In2] [get_bd_pins pmoda_o_concat8/In4] [get_bd_pins pmoda_o_concat8/In5] [get_bd_pins pmoda_o_concat8/In6] [get_bd_pins pmoda_o_concat8/In7] [get_bd_pins pmoda_z_concat8/In0] [get_bd_pins pmoda_z_concat8/In1] [get_bd_pins xlconstant_0/dout]
+  connect_bd_net -net const1 [get_bd_pins pmoda_z_concat8/In2] [get_bd_pins pmoda_z_concat8/In4] [get_bd_pins pmoda_z_concat8/In5] [get_bd_pins pmoda_z_concat8/In6] [get_bd_pins pmoda_z_concat8/In7] [get_bd_pins xlconstant_1/dout]
+  connect_bd_net -net ftclk_o [get_bd_pins p1_o_bit1/Dout] [get_bd_pins pmoda_o_concat8/In0]
+  connect_bd_net -net ftmiosio_o [get_bd_pins p1_o_bit2/Dout] [get_bd_pins pmoda_o_concat8/In3]
+  connect_bd_net -net ftmiosio_z [get_bd_pins p1_z_bit2/Dout] [get_bd_pins pmoda_z_concat8/In3]
+  connect_bd_net -net ftssn_n [get_bd_pins p1_o_bit3/Dout] [get_bd_pins pmoda_o_concat8/In1]
+  connect_bd_net -net p1_i [get_bd_pins p1_tri_i] [get_bd_pins p1_i_concat/dout]
+  connect_bd_net -net p1_i_bit15to6_Dout [get_bd_pins p1_i_bit15to6/Dout] [get_bd_pins p1_i_concat/In6]
+  connect_bd_net -net p1_z [get_bd_pins p1_tri_z] [get_bd_pins axi_gpio_1/gpio2_io_i] [get_bd_pins p1_z_bit2/Din]
+  connect_bd_net -net pmoda_i_1 [get_bd_pins pmoda_tri_i] [get_bd_pins pmoda_i_bit2/Din] [get_bd_pins pmoda_i_bit3/Din]
+  connect_bd_net -net pmoda_i_bit2_Dout [get_bd_pins p1_i_concat/In0] [get_bd_pins pmoda_i_bit2/Dout]
+  connect_bd_net -net pmoda_i_bit3_Dout [get_bd_pins p1_i_concat/In2] [get_bd_pins pmoda_i_bit3/Dout]
+  connect_bd_net -net pmoda_o_concat9_dout [get_bd_pins pmoda_tri_z] [get_bd_pins pmoda_z_concat8/dout]
+  connect_bd_net -net proc_sys_reset_0_interconnect_aresetn [get_bd_pins axi_gpio_0/s_axi_aresetn] [get_bd_pins axi_gpio_1/s_axi_aresetn] [get_bd_pins axi_gpio_2/s_axi_aresetn] [get_bd_pins axi_uartlite_0/s_axi_aresetn] [get_bd_pins proc_sys_reset_0/interconnect_aresetn] [get_bd_pins smartconnect_0/aresetn]
+  connect_bd_net -net proc_sys_reset_0_peripheral_aresetn [get_bd_pins nrst] [get_bd_pins proc_sys_reset_0/peripheral_aresetn]
+  connect_bd_net -net xlconcat_0_dout [get_bd_pins pmoda_tri_o] [get_bd_pins pmoda_o_concat8/dout]
+  connect_bd_net -net zynq_ultra_ps_e_0_pl_clk0 [get_bd_pins aclk] [get_bd_pins axi_gpio_0/s_axi_aclk] [get_bd_pins axi_gpio_1/s_axi_aclk] [get_bd_pins axi_gpio_2/s_axi_aclk] [get_bd_pins axi_uartlite_0/s_axi_aclk] [get_bd_pins proc_sys_reset_0/slowest_sync_clk] [get_bd_pins smartconnect_0/aclk]
+  connect_bd_net -net zynq_ultra_ps_e_0_pl_resetn0 [get_bd_pins ext_reset_in] [get_bd_pins proc_sys_reset_0/ext_reset_in]
+
+  # Restore current instance
+  current_bd_instance $oldCurInst
+}
+
+
+# Procedure to create entire design; Provide argument to make
+# procedure reusable. If parentCell is "", will use root.
+proc create_root_design { parentCell } {
+
+  variable script_folder
+
+  if { $parentCell eq "" } {
+     set parentCell [get_bd_cells /]
+  }
+
+  # Get object for parentCell
+  set parentObj [get_bd_cells $parentCell]
+  if { $parentObj == "" } {
+     catch {common::send_gid_msg -ssname BD::TCL -id 2090 -severity "ERROR" "Unable to find parent cell <$parentCell>!"}
+     return
+  }
+
+  # Make sure parentObj is hier blk
+  set parentType [get_property TYPE $parentObj]
+  if { $parentType ne "hier" } {
+     catch {common::send_gid_msg -ssname BD::TCL -id 2091 -severity "ERROR" "Parent <$parentObj> has TYPE = <$parentType>. Expected to be <hier>."}
+     return
+  }
+
+  # Save current instance; Restore later
+  set oldCurInst [current_bd_instance .]
+
+  # Set parent object as current
+  current_bd_instance $parentObj
+
+
+  # Create interface ports
+
+  # Create ports
+  set pmoda_tri_i [ create_bd_port -dir I -from 7 -to 0 pmoda_tri_i ]
+  set pmoda_tri_o [ create_bd_port -dir O -from 7 -to 0 pmoda_tri_o ]
+  set pmoda_tri_z [ create_bd_port -dir O -from 7 -to 0 pmoda_tri_z ]
+
+  # Create instance: nanosoc_chip_0, and set properties
+  set nanosoc_chip_0 [ create_bd_cell -type ip -vlnv soclabs.org:user:nanosoc_chip:1.0 nanosoc_chip_0 ]
+
+  # Create instance: cmsdk_socket
+  create_hier_cell_cmsdk_socket [current_bd_instance .] cmsdk_socket
+
+  # Create instance: zynq_ultra_ps_e_0, and set properties
+  set zynq_ultra_ps_e_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:zynq_ultra_ps_e:3.3 zynq_ultra_ps_e_0 ]
+  set_property -dict [ list \
+   CONFIG.PSU_BANK_0_IO_STANDARD {LVCMOS18} \
+   CONFIG.PSU_BANK_1_IO_STANDARD {LVCMOS18} \
+   CONFIG.PSU_BANK_2_IO_STANDARD {LVCMOS18} \
+   CONFIG.PSU_DDR_RAM_HIGHADDR {0x7FFFFFFF} \
+   CONFIG.PSU_DDR_RAM_HIGHADDR_OFFSET {0x00000002} \
+   CONFIG.PSU_DDR_RAM_LOWADDR_OFFSET {0x80000000} \
+   CONFIG.PSU_DYNAMIC_DDR_CONFIG_EN {0} \
+   CONFIG.PSU_MIO_0_DIRECTION {out} \
+   CONFIG.PSU_MIO_0_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_0_POLARITY {Default} \
+   CONFIG.PSU_MIO_16_DIRECTION {inout} \
+   CONFIG.PSU_MIO_16_POLARITY {Default} \
+   CONFIG.PSU_MIO_17_DIRECTION {inout} \
+   CONFIG.PSU_MIO_17_POLARITY {Default} \
+   CONFIG.PSU_MIO_18_DIRECTION {in} \
+   CONFIG.PSU_MIO_18_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_18_POLARITY {Default} \
+   CONFIG.PSU_MIO_18_SLEW {fast} \
+   CONFIG.PSU_MIO_19_DIRECTION {out} \
+   CONFIG.PSU_MIO_19_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_19_POLARITY {Default} \
+   CONFIG.PSU_MIO_1_DIRECTION {inout} \
+   CONFIG.PSU_MIO_1_POLARITY {Default} \
+   CONFIG.PSU_MIO_20_DIRECTION {out} \
+   CONFIG.PSU_MIO_20_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_20_POLARITY {Default} \
+   CONFIG.PSU_MIO_21_DIRECTION {in} \
+   CONFIG.PSU_MIO_21_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_21_POLARITY {Default} \
+   CONFIG.PSU_MIO_21_SLEW {fast} \
+   CONFIG.PSU_MIO_24_DIRECTION {out} \
+   CONFIG.PSU_MIO_24_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_24_POLARITY {Default} \
+   CONFIG.PSU_MIO_25_DIRECTION {in} \
+   CONFIG.PSU_MIO_25_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_25_POLARITY {Default} \
+   CONFIG.PSU_MIO_25_SLEW {fast} \
+   CONFIG.PSU_MIO_27_DIRECTION {out} \
+   CONFIG.PSU_MIO_27_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_27_POLARITY {Default} \
+   CONFIG.PSU_MIO_28_DIRECTION {in} \
+   CONFIG.PSU_MIO_28_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_28_POLARITY {Default} \
+   CONFIG.PSU_MIO_28_SLEW {fast} \
+   CONFIG.PSU_MIO_29_DIRECTION {out} \
+   CONFIG.PSU_MIO_29_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_29_POLARITY {Default} \
+   CONFIG.PSU_MIO_2_DIRECTION {inout} \
+   CONFIG.PSU_MIO_2_POLARITY {Default} \
+   CONFIG.PSU_MIO_30_DIRECTION {in} \
+   CONFIG.PSU_MIO_30_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_30_POLARITY {Default} \
+   CONFIG.PSU_MIO_30_SLEW {fast} \
+   CONFIG.PSU_MIO_3_DIRECTION {inout} \
+   CONFIG.PSU_MIO_3_POLARITY {Default} \
+   CONFIG.PSU_MIO_45_DIRECTION {in} \
+   CONFIG.PSU_MIO_45_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_45_POLARITY {Default} \
+   CONFIG.PSU_MIO_45_SLEW {fast} \
+   CONFIG.PSU_MIO_46_DIRECTION {inout} \
+   CONFIG.PSU_MIO_46_POLARITY {Default} \
+   CONFIG.PSU_MIO_47_DIRECTION {inout} \
+   CONFIG.PSU_MIO_47_POLARITY {Default} \
+   CONFIG.PSU_MIO_48_DIRECTION {inout} \
+   CONFIG.PSU_MIO_48_POLARITY {Default} \
+   CONFIG.PSU_MIO_49_DIRECTION {inout} \
+   CONFIG.PSU_MIO_49_POLARITY {Default} \
+   CONFIG.PSU_MIO_4_DIRECTION {inout} \
+   CONFIG.PSU_MIO_4_POLARITY {Default} \
+   CONFIG.PSU_MIO_50_DIRECTION {inout} \
+   CONFIG.PSU_MIO_50_POLARITY {Default} \
+   CONFIG.PSU_MIO_51_DIRECTION {out} \
+   CONFIG.PSU_MIO_51_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_51_POLARITY {Default} \
+   CONFIG.PSU_MIO_52_DIRECTION {in} \
+   CONFIG.PSU_MIO_52_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_52_POLARITY {Default} \
+   CONFIG.PSU_MIO_52_SLEW {fast} \
+   CONFIG.PSU_MIO_53_DIRECTION {in} \
+   CONFIG.PSU_MIO_53_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_53_POLARITY {Default} \
+   CONFIG.PSU_MIO_53_SLEW {fast} \
+   CONFIG.PSU_MIO_54_DIRECTION {inout} \
+   CONFIG.PSU_MIO_54_POLARITY {Default} \
+   CONFIG.PSU_MIO_55_DIRECTION {in} \
+   CONFIG.PSU_MIO_55_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_55_POLARITY {Default} \
+   CONFIG.PSU_MIO_55_SLEW {fast} \
+   CONFIG.PSU_MIO_56_DIRECTION {inout} \
+   CONFIG.PSU_MIO_56_POLARITY {Default} \
+   CONFIG.PSU_MIO_57_DIRECTION {inout} \
+   CONFIG.PSU_MIO_57_POLARITY {Default} \
+   CONFIG.PSU_MIO_58_DIRECTION {out} \
+   CONFIG.PSU_MIO_58_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_58_POLARITY {Default} \
+   CONFIG.PSU_MIO_59_DIRECTION {inout} \
+   CONFIG.PSU_MIO_59_POLARITY {Default} \
+   CONFIG.PSU_MIO_5_DIRECTION {out} \
+   CONFIG.PSU_MIO_5_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_5_POLARITY {Default} \
+   CONFIG.PSU_MIO_60_DIRECTION {inout} \
+   CONFIG.PSU_MIO_60_POLARITY {Default} \
+   CONFIG.PSU_MIO_61_DIRECTION {inout} \
+   CONFIG.PSU_MIO_61_POLARITY {Default} \
+   CONFIG.PSU_MIO_62_DIRECTION {inout} \
+   CONFIG.PSU_MIO_62_POLARITY {Default} \
+   CONFIG.PSU_MIO_63_DIRECTION {inout} \
+   CONFIG.PSU_MIO_63_POLARITY {Default} \
+   CONFIG.PSU_MIO_64_DIRECTION {out} \
+   CONFIG.PSU_MIO_64_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_64_POLARITY {Default} \
+   CONFIG.PSU_MIO_65_DIRECTION {out} \
+   CONFIG.PSU_MIO_65_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_65_POLARITY {Default} \
+   CONFIG.PSU_MIO_66_DIRECTION {out} \
+   CONFIG.PSU_MIO_66_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_66_POLARITY {Default} \
+   CONFIG.PSU_MIO_67_DIRECTION {out} \
+   CONFIG.PSU_MIO_67_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_67_POLARITY {Default} \
+   CONFIG.PSU_MIO_68_DIRECTION {out} \
+   CONFIG.PSU_MIO_68_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_68_POLARITY {Default} \
+   CONFIG.PSU_MIO_69_DIRECTION {out} \
+   CONFIG.PSU_MIO_69_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_69_POLARITY {Default} \
+   CONFIG.PSU_MIO_6_DIRECTION {out} \
+   CONFIG.PSU_MIO_6_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_6_POLARITY {Default} \
+   CONFIG.PSU_MIO_70_DIRECTION {in} \
+   CONFIG.PSU_MIO_70_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_70_POLARITY {Default} \
+   CONFIG.PSU_MIO_70_SLEW {fast} \
+   CONFIG.PSU_MIO_71_DIRECTION {in} \
+   CONFIG.PSU_MIO_71_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_71_POLARITY {Default} \
+   CONFIG.PSU_MIO_71_SLEW {fast} \
+   CONFIG.PSU_MIO_72_DIRECTION {in} \
+   CONFIG.PSU_MIO_72_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_72_POLARITY {Default} \
+   CONFIG.PSU_MIO_72_SLEW {fast} \
+   CONFIG.PSU_MIO_73_DIRECTION {in} \
+   CONFIG.PSU_MIO_73_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_73_POLARITY {Default} \
+   CONFIG.PSU_MIO_73_SLEW {fast} \
+   CONFIG.PSU_MIO_74_DIRECTION {in} \
+   CONFIG.PSU_MIO_74_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_74_POLARITY {Default} \
+   CONFIG.PSU_MIO_74_SLEW {fast} \
+   CONFIG.PSU_MIO_75_DIRECTION {in} \
+   CONFIG.PSU_MIO_75_DRIVE_STRENGTH {12} \
+   CONFIG.PSU_MIO_75_POLARITY {Default} \
+   CONFIG.PSU_MIO_75_SLEW {fast} \
+   CONFIG.PSU_MIO_76_DIRECTION {out} \
+   CONFIG.PSU_MIO_76_INPUT_TYPE {cmos} \
+   CONFIG.PSU_MIO_76_POLARITY {Default} \
+   CONFIG.PSU_MIO_77_DIRECTION {inout} \
+   CONFIG.PSU_MIO_77_POLARITY {Default} \
+   CONFIG.PSU_MIO_TREE_PERIPHERALS {Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad SPI Flash#Quad\
+SPI Flash#Feedback Clk##########I2C 1#I2C 1#UART 0#UART 0#UART 1#UART 1###CAN\
+1#CAN 1##DPAUX#DPAUX#DPAUX#DPAUX###############SD 1#SD 1#SD 1#SD 1#SD 1#SD 1#SD\
+1#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#USB 0#Gem\
+3#Gem 3#Gem 3#Gem 3#Gem 3#Gem 3#Gem 3#Gem 3#Gem 3#Gem 3#Gem 3#Gem 3#MDIO 3#MDIO\
+3}\
+   CONFIG.PSU_MIO_TREE_SIGNALS {sclk_out#miso_mo1#mo2#mo3#mosi_mi0#n_ss_out#clk_for_lpbk##########scl_out#sda_out#rxd#txd#txd#rxd###phy_tx#phy_rx##dp_aux_data_out#dp_hot_plug_detect#dp_aux_data_oe#dp_aux_data_in###############sdio1_cd_n#sdio1_data_out[0]#sdio1_data_out[1]#sdio1_data_out[2]#sdio1_data_out[3]#sdio1_cmd_out#sdio1_clk_out#ulpi_clk_in#ulpi_dir#ulpi_tx_data[2]#ulpi_nxt#ulpi_tx_data[0]#ulpi_tx_data[1]#ulpi_stp#ulpi_tx_data[3]#ulpi_tx_data[4]#ulpi_tx_data[5]#ulpi_tx_data[6]#ulpi_tx_data[7]#rgmii_tx_clk#rgmii_txd[0]#rgmii_txd[1]#rgmii_txd[2]#rgmii_txd[3]#rgmii_tx_ctl#rgmii_rx_clk#rgmii_rxd[0]#rgmii_rxd[1]#rgmii_rxd[2]#rgmii_rxd[3]#rgmii_rx_ctl#gem3_mdc#gem3_mdio_out}\
+   CONFIG.PSU_SD1_INTERNAL_BUS_WIDTH {4} \
+   CONFIG.PSU_USB3__DUAL_CLOCK_ENABLE {1} \
+   CONFIG.PSU__ACT_DDR_FREQ_MHZ {1050.000000} \
+   CONFIG.PSU__CAN1__GRP_CLK__ENABLE {0} \
+   CONFIG.PSU__CAN1__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__CAN1__PERIPHERAL__IO {MIO 24 .. 25} \
+   CONFIG.PSU__CRF_APB__ACPU_CTRL__ACT_FREQMHZ {1200.000000} \
+   CONFIG.PSU__CRF_APB__ACPU_CTRL__DIVISOR0 {1} \
+   CONFIG.PSU__CRF_APB__ACPU_CTRL__FREQMHZ {1200} \
+   CONFIG.PSU__CRF_APB__ACPU_CTRL__SRCSEL {APLL} \
+   CONFIG.PSU__CRF_APB__APLL_CTRL__DIV2 {1} \
+   CONFIG.PSU__CRF_APB__APLL_CTRL__FBDIV {72} \
+   CONFIG.PSU__CRF_APB__APLL_CTRL__FRACDATA {0.000000} \
+   CONFIG.PSU__CRF_APB__APLL_CTRL__SRCSEL {PSS_REF_CLK} \
+   CONFIG.PSU__CRF_APB__APLL_FRAC_CFG__ENABLED {0} \
+   CONFIG.PSU__CRF_APB__APLL_TO_LPD_CTRL__DIVISOR0 {3} \
+   CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__ACT_FREQMHZ {250.000000} \
+   CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__DIVISOR0 {2} \
+   CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__FREQMHZ {250} \
+   CONFIG.PSU__CRF_APB__DBG_FPD_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRF_APB__DBG_TRACE_CTRL__DIVISOR0 {5} \
+   CONFIG.PSU__CRF_APB__DBG_TRACE_CTRL__FREQMHZ {250} \
+   CONFIG.PSU__CRF_APB__DBG_TRACE_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__ACT_FREQMHZ {250.000000} \
+   CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__DIVISOR0 {2} \
+   CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__FREQMHZ {250} \
+   CONFIG.PSU__CRF_APB__DBG_TSTMP_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRF_APB__DDR_CTRL__ACT_FREQMHZ {525.000000} \
+   CONFIG.PSU__CRF_APB__DDR_CTRL__DIVISOR0 {2} \
+   CONFIG.PSU__CRF_APB__DDR_CTRL__FREQMHZ {1067} \
+   CONFIG.PSU__CRF_APB__DDR_CTRL__SRCSEL {DPLL} \
+   CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__ACT_FREQMHZ {600.000000} \
+   CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__DIVISOR0 {2} \
+   CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__FREQMHZ {600} \
+   CONFIG.PSU__CRF_APB__DPDMA_REF_CTRL__SRCSEL {APLL} \
+   CONFIG.PSU__CRF_APB__DPLL_CTRL__DIV2 {1} \
+   CONFIG.PSU__CRF_APB__DPLL_CTRL__FBDIV {63} \
+   CONFIG.PSU__CRF_APB__DPLL_CTRL__FRACDATA {0.000000} \
+   CONFIG.PSU__CRF_APB__DPLL_CTRL__SRCSEL {PSS_REF_CLK} \
+   CONFIG.PSU__CRF_APB__DPLL_FRAC_CFG__ENABLED {0} \
+   CONFIG.PSU__CRF_APB__DPLL_TO_LPD_CTRL__DIVISOR0 {2} \
+   CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__ACT_FREQMHZ {25.000000} \
+   CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__DIVISOR0 {15} \
+   CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRF_APB__DP_AUDIO_REF_CTRL__SRCSEL {RPLL} \
+   CONFIG.PSU__CRF_APB__DP_AUDIO__FRAC_ENABLED {0} \
+   CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__ACT_FREQMHZ {26.785715} \
+   CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__DIVISOR0 {14} \
+   CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRF_APB__DP_STC_REF_CTRL__SRCSEL {RPLL} \
+   CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__ACT_FREQMHZ {300.000000} \
+   CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__DIVISOR0 {5} \
+   CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRF_APB__DP_VIDEO_REF_CTRL__SRCSEL {VPLL} \
+   CONFIG.PSU__CRF_APB__DP_VIDEO__FRAC_ENABLED {0} \
+   CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__ACT_FREQMHZ {600.000000} \
+   CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__DIVISOR0 {2} \
+   CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__FREQMHZ {600} \
+   CONFIG.PSU__CRF_APB__GDMA_REF_CTRL__SRCSEL {APLL} \
+   CONFIG.PSU__CRF_APB__GPU_REF_CTRL__ACT_FREQMHZ {500.000000} \
+   CONFIG.PSU__CRF_APB__GPU_REF_CTRL__DIVISOR0 {1} \
+   CONFIG.PSU__CRF_APB__GPU_REF_CTRL__FREQMHZ {500} \
+   CONFIG.PSU__CRF_APB__GPU_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRF_APB__PCIE_REF_CTRL__DIVISOR0 {6} \
+   CONFIG.PSU__CRF_APB__PCIE_REF_CTRL__FREQMHZ {250} \
+   CONFIG.PSU__CRF_APB__PCIE_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRF_APB__SATA_REF_CTRL__ACT_FREQMHZ {250.000000} \
+   CONFIG.PSU__CRF_APB__SATA_REF_CTRL__DIVISOR0 {2} \
+   CONFIG.PSU__CRF_APB__SATA_REF_CTRL__FREQMHZ {250} \
+   CONFIG.PSU__CRF_APB__SATA_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__ACT_FREQMHZ {100.000000} \
+   CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__DIVISOR0 {5} \
+   CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__FREQMHZ {100} \
+   CONFIG.PSU__CRF_APB__TOPSW_LSBUS_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__ACT_FREQMHZ {525.000000} \
+   CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__DIVISOR0 {2} \
+   CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__FREQMHZ {533.33} \
+   CONFIG.PSU__CRF_APB__TOPSW_MAIN_CTRL__SRCSEL {DPLL} \
+   CONFIG.PSU__CRF_APB__VPLL_CTRL__DIV2 {1} \
+   CONFIG.PSU__CRF_APB__VPLL_CTRL__FBDIV {90} \
+   CONFIG.PSU__CRF_APB__VPLL_CTRL__FRACDATA {0.000000} \
+   CONFIG.PSU__CRF_APB__VPLL_CTRL__SRCSEL {PSS_REF_CLK} \
+   CONFIG.PSU__CRF_APB__VPLL_FRAC_CFG__ENABLED {0} \
+   CONFIG.PSU__CRF_APB__VPLL_TO_LPD_CTRL__DIVISOR0 {3} \
+   CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__ACT_FREQMHZ {500.000000} \
+   CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__DIVISOR0 {3} \
+   CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__FREQMHZ {500} \
+   CONFIG.PSU__CRL_APB__ADMA_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__AFI6_REF_CTRL__DIVISOR0 {3} \
+   CONFIG.PSU__CRL_APB__AMS_REF_CTRL__ACT_FREQMHZ {50.000000} \
+   CONFIG.PSU__CRL_APB__AMS_REF_CTRL__DIVISOR0 {30} \
+   CONFIG.PSU__CRL_APB__AMS_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__CAN0_REF_CTRL__DIVISOR0 {15} \
+   CONFIG.PSU__CRL_APB__CAN0_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__CAN1_REF_CTRL__ACT_FREQMHZ {100.000000} \
+   CONFIG.PSU__CRL_APB__CAN1_REF_CTRL__DIVISOR0 {15} \
+   CONFIG.PSU__CRL_APB__CAN1_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__CAN1_REF_CTRL__FREQMHZ {100} \
+   CONFIG.PSU__CRL_APB__CAN1_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__CPU_R5_CTRL__ACT_FREQMHZ {500.000000} \
+   CONFIG.PSU__CRL_APB__CPU_R5_CTRL__DIVISOR0 {3} \
+   CONFIG.PSU__CRL_APB__CPU_R5_CTRL__FREQMHZ {500} \
+   CONFIG.PSU__CRL_APB__CPU_R5_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__ACT_FREQMHZ {250.000000} \
+   CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__DIVISOR0 {6} \
+   CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__FREQMHZ {250} \
+   CONFIG.PSU__CRL_APB__DBG_LPD_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__DLL_REF_CTRL__ACT_FREQMHZ {1500.000000} \
+   CONFIG.PSU__CRL_APB__GEM0_REF_CTRL__DIVISOR0 {12} \
+   CONFIG.PSU__CRL_APB__GEM0_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__GEM1_REF_CTRL__DIVISOR0 {12} \
+   CONFIG.PSU__CRL_APB__GEM1_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__GEM2_REF_CTRL__DIVISOR0 {12} \
+   CONFIG.PSU__CRL_APB__GEM2_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__GEM3_REF_CTRL__ACT_FREQMHZ {125.000000} \
+   CONFIG.PSU__CRL_APB__GEM3_REF_CTRL__DIVISOR0 {12} \
+   CONFIG.PSU__CRL_APB__GEM3_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__GEM3_REF_CTRL__FREQMHZ {125} \
+   CONFIG.PSU__CRL_APB__GEM3_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__GEM_TSU_REF_CTRL__ACT_FREQMHZ {250.000000} \
+   CONFIG.PSU__CRL_APB__GEM_TSU_REF_CTRL__DIVISOR0 {6} \
+   CONFIG.PSU__CRL_APB__GEM_TSU_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__GEM_TSU_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__I2C0_REF_CTRL__DIVISOR0 {15} \
+   CONFIG.PSU__CRL_APB__I2C0_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__I2C0_REF_CTRL__FREQMHZ {100} \
+   CONFIG.PSU__CRL_APB__I2C0_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__ACT_FREQMHZ {100.000000} \
+   CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__DIVISOR0 {15} \
+   CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__FREQMHZ {100} \
+   CONFIG.PSU__CRL_APB__I2C1_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__IOPLL_CTRL__DIV2 {1} \
+   CONFIG.PSU__CRL_APB__IOPLL_CTRL__FBDIV {90} \
+   CONFIG.PSU__CRL_APB__IOPLL_CTRL__FRACDATA {0.000000} \
+   CONFIG.PSU__CRL_APB__IOPLL_CTRL__SRCSEL {PSS_REF_CLK} \
+   CONFIG.PSU__CRL_APB__IOPLL_FRAC_CFG__ENABLED {0} \
+   CONFIG.PSU__CRL_APB__IOPLL_TO_FPD_CTRL__DIVISOR0 {3} \
+   CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__ACT_FREQMHZ {250.000000} \
+   CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__DIVISOR0 {6} \
+   CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__FREQMHZ {250} \
+   CONFIG.PSU__CRL_APB__IOU_SWITCH_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__ACT_FREQMHZ {100.000000} \
+   CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__DIVISOR0 {15} \
+   CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__FREQMHZ {100} \
+   CONFIG.PSU__CRL_APB__LPD_LSBUS_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__ACT_FREQMHZ {500.000000} \
+   CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__DIVISOR0 {3} \
+   CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__FREQMHZ {500} \
+   CONFIG.PSU__CRL_APB__LPD_SWITCH_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__NAND_REF_CTRL__DIVISOR0 {15} \
+   CONFIG.PSU__CRL_APB__NAND_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__PCAP_CTRL__ACT_FREQMHZ {187.500000} \
+   CONFIG.PSU__CRL_APB__PCAP_CTRL__DIVISOR0 {8} \
+   CONFIG.PSU__CRL_APB__PCAP_CTRL__FREQMHZ {200} \
+   CONFIG.PSU__CRL_APB__PCAP_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__PL0_REF_CTRL__ACT_FREQMHZ {20.000000} \
+   CONFIG.PSU__CRL_APB__PL0_REF_CTRL__DIVISOR0 {25} \
+   CONFIG.PSU__CRL_APB__PL0_REF_CTRL__DIVISOR1 {3} \
+   CONFIG.PSU__CRL_APB__PL0_REF_CTRL__FREQMHZ {20} \
+   CONFIG.PSU__CRL_APB__PL0_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__PL1_REF_CTRL__DIVISOR0 {4} \
+   CONFIG.PSU__CRL_APB__PL1_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__PL2_REF_CTRL__DIVISOR0 {4} \
+   CONFIG.PSU__CRL_APB__PL2_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__PL3_REF_CTRL__DIVISOR0 {4} \
+   CONFIG.PSU__CRL_APB__PL3_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__ACT_FREQMHZ {125.000000} \
+   CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__DIVISOR0 {12} \
+   CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__FREQMHZ {125} \
+   CONFIG.PSU__CRL_APB__QSPI_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__RPLL_CTRL__DIV2 {1} \
+   CONFIG.PSU__CRL_APB__RPLL_CTRL__FBDIV {45} \
+   CONFIG.PSU__CRL_APB__RPLL_CTRL__FRACDATA {0.000000} \
+   CONFIG.PSU__CRL_APB__RPLL_CTRL__SRCSEL {PSS_REF_CLK} \
+   CONFIG.PSU__CRL_APB__RPLL_FRAC_CFG__ENABLED {0} \
+   CONFIG.PSU__CRL_APB__RPLL_TO_FPD_CTRL__DIVISOR0 {2} \
+   CONFIG.PSU__CRL_APB__SDIO0_REF_CTRL__DIVISOR0 {7} \
+   CONFIG.PSU__CRL_APB__SDIO0_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__ACT_FREQMHZ {187.500000} \
+   CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__DIVISOR0 {8} \
+   CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__FREQMHZ {200} \
+   CONFIG.PSU__CRL_APB__SDIO1_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__SPI0_REF_CTRL__DIVISOR0 {7} \
+   CONFIG.PSU__CRL_APB__SPI0_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__SPI1_REF_CTRL__DIVISOR0 {7} \
+   CONFIG.PSU__CRL_APB__SPI1_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__ACT_FREQMHZ {100.000000} \
+   CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__DIVISOR0 {15} \
+   CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__FREQMHZ {100} \
+   CONFIG.PSU__CRL_APB__TIMESTAMP_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__UART0_REF_CTRL__ACT_FREQMHZ {100.000000} \
+   CONFIG.PSU__CRL_APB__UART0_REF_CTRL__DIVISOR0 {15} \
+   CONFIG.PSU__CRL_APB__UART0_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__UART0_REF_CTRL__FREQMHZ {100} \
+   CONFIG.PSU__CRL_APB__UART0_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__UART1_REF_CTRL__ACT_FREQMHZ {100.000000} \
+   CONFIG.PSU__CRL_APB__UART1_REF_CTRL__DIVISOR0 {15} \
+   CONFIG.PSU__CRL_APB__UART1_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__UART1_REF_CTRL__FREQMHZ {100} \
+   CONFIG.PSU__CRL_APB__UART1_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__ACT_FREQMHZ {250.000000} \
+   CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__DIVISOR0 {6} \
+   CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__FREQMHZ {250} \
+   CONFIG.PSU__CRL_APB__USB0_BUS_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__USB1_BUS_REF_CTRL__DIVISOR0 {6} \
+   CONFIG.PSU__CRL_APB__USB1_BUS_REF_CTRL__DIVISOR1 {1} \
+   CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__ACT_FREQMHZ {20.000000} \
+   CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__DIVISOR0 {25} \
+   CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__DIVISOR1 {3} \
+   CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__FREQMHZ {20} \
+   CONFIG.PSU__CRL_APB__USB3_DUAL_REF_CTRL__SRCSEL {IOPLL} \
+   CONFIG.PSU__CRL_APB__USB3__ENABLE {1} \
+   CONFIG.PSU__DDRC__ADDR_MIRROR {0} \
+   CONFIG.PSU__DDRC__BANK_ADDR_COUNT {2} \
+   CONFIG.PSU__DDRC__BG_ADDR_COUNT {1} \
+   CONFIG.PSU__DDRC__BRC_MAPPING {ROW_BANK_COL} \
+   CONFIG.PSU__DDRC__BUS_WIDTH {64 Bit} \
+   CONFIG.PSU__DDRC__CL {15} \
+   CONFIG.PSU__DDRC__CLOCK_STOP_EN {0} \
+   CONFIG.PSU__DDRC__COL_ADDR_COUNT {10} \
+   CONFIG.PSU__DDRC__COMPONENTS {Components} \
+   CONFIG.PSU__DDRC__CWL {14} \
+   CONFIG.PSU__DDRC__DDR3L_T_REF_RANGE {NA} \
+   CONFIG.PSU__DDRC__DDR3_T_REF_RANGE {NA} \
+   CONFIG.PSU__DDRC__DDR4_ADDR_MAPPING {0} \
+   CONFIG.PSU__DDRC__DDR4_CAL_MODE_ENABLE {0} \
+   CONFIG.PSU__DDRC__DDR4_CRC_CONTROL {0} \
+   CONFIG.PSU__DDRC__DDR4_T_REF_MODE {0} \
+   CONFIG.PSU__DDRC__DDR4_T_REF_RANGE {Normal (0-85)} \
+   CONFIG.PSU__DDRC__DEEP_PWR_DOWN_EN {0} \
+   CONFIG.PSU__DDRC__DEVICE_CAPACITY {4096 MBits} \
+   CONFIG.PSU__DDRC__DIMM_ADDR_MIRROR {0} \
+   CONFIG.PSU__DDRC__DM_DBI {DM_NO_DBI} \
+   CONFIG.PSU__DDRC__DQMAP_0_3 {0} \
+   CONFIG.PSU__DDRC__DQMAP_12_15 {0} \
+   CONFIG.PSU__DDRC__DQMAP_16_19 {0} \
+   CONFIG.PSU__DDRC__DQMAP_20_23 {0} \
+   CONFIG.PSU__DDRC__DQMAP_24_27 {0} \
+   CONFIG.PSU__DDRC__DQMAP_28_31 {0} \
+   CONFIG.PSU__DDRC__DQMAP_32_35 {0} \
+   CONFIG.PSU__DDRC__DQMAP_36_39 {0} \
+   CONFIG.PSU__DDRC__DQMAP_40_43 {0} \
+   CONFIG.PSU__DDRC__DQMAP_44_47 {0} \
+   CONFIG.PSU__DDRC__DQMAP_48_51 {0} \
+   CONFIG.PSU__DDRC__DQMAP_4_7 {0} \
+   CONFIG.PSU__DDRC__DQMAP_52_55 {0} \
+   CONFIG.PSU__DDRC__DQMAP_56_59 {0} \
+   CONFIG.PSU__DDRC__DQMAP_60_63 {0} \
+   CONFIG.PSU__DDRC__DQMAP_64_67 {0} \
+   CONFIG.PSU__DDRC__DQMAP_68_71 {0} \
+   CONFIG.PSU__DDRC__DQMAP_8_11 {0} \
+   CONFIG.PSU__DDRC__DRAM_WIDTH {16 Bits} \
+   CONFIG.PSU__DDRC__ECC {Disabled} \
+   CONFIG.PSU__DDRC__ENABLE_LP4_HAS_ECC_COMP {0} \
+   CONFIG.PSU__DDRC__ENABLE_LP4_SLOWBOOT {0} \
+   CONFIG.PSU__DDRC__FGRM {1X} \
+   CONFIG.PSU__DDRC__LPDDR3_T_REF_RANGE {NA} \
+   CONFIG.PSU__DDRC__LPDDR4_T_REF_RANGE {NA} \
+   CONFIG.PSU__DDRC__LP_ASR {manual normal} \
+   CONFIG.PSU__DDRC__MEMORY_TYPE {DDR 4} \
+   CONFIG.PSU__DDRC__PARITY_ENABLE {0} \
+   CONFIG.PSU__DDRC__PER_BANK_REFRESH {0} \
+   CONFIG.PSU__DDRC__PHY_DBI_MODE {0} \
+   CONFIG.PSU__DDRC__ROW_ADDR_COUNT {15} \
+   CONFIG.PSU__DDRC__SB_TARGET {15-15-15} \
+   CONFIG.PSU__DDRC__SELF_REF_ABORT {0} \
+   CONFIG.PSU__DDRC__SPEED_BIN {DDR4_2133P} \
+   CONFIG.PSU__DDRC__STATIC_RD_MODE {0} \
+   CONFIG.PSU__DDRC__TRAIN_DATA_EYE {1} \
+   CONFIG.PSU__DDRC__TRAIN_READ_GATE {1} \
+   CONFIG.PSU__DDRC__TRAIN_WRITE_LEVEL {1} \
+   CONFIG.PSU__DDRC__T_FAW {30.0} \
+   CONFIG.PSU__DDRC__T_RAS_MIN {33} \
+   CONFIG.PSU__DDRC__T_RC {47.06} \
+   CONFIG.PSU__DDRC__T_RCD {15} \
+   CONFIG.PSU__DDRC__T_RP {15} \
+   CONFIG.PSU__DDRC__VENDOR_PART {OTHERS} \
+   CONFIG.PSU__DDRC__VREF {1} \
+   CONFIG.PSU__DDR_HIGH_ADDRESS_GUI_ENABLE {0} \
+   CONFIG.PSU__DDR__INTERFACE__FREQMHZ {533.500} \
+   CONFIG.PSU__DISPLAYPORT__LANE0__ENABLE {1} \
+   CONFIG.PSU__DISPLAYPORT__LANE0__IO {GT Lane1} \
+   CONFIG.PSU__DISPLAYPORT__LANE1__ENABLE {1} \
+   CONFIG.PSU__DISPLAYPORT__LANE1__IO {GT Lane0} \
+   CONFIG.PSU__DISPLAYPORT__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__DLL__ISUSED {1} \
+   CONFIG.PSU__DPAUX__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__DPAUX__PERIPHERAL__IO {MIO 27 .. 30} \
+   CONFIG.PSU__DP__LANE_SEL {Dual Lower} \
+   CONFIG.PSU__DP__REF_CLK_FREQ {27} \
+   CONFIG.PSU__DP__REF_CLK_SEL {Ref Clk3} \
+   CONFIG.PSU__ENET3__FIFO__ENABLE {0} \
+   CONFIG.PSU__ENET3__GRP_MDIO__ENABLE {1} \
+   CONFIG.PSU__ENET3__GRP_MDIO__IO {MIO 76 .. 77} \
+   CONFIG.PSU__ENET3__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__ENET3__PERIPHERAL__IO {MIO 64 .. 75} \
+   CONFIG.PSU__ENET3__PTP__ENABLE {0} \
+   CONFIG.PSU__ENET3__TSU__ENABLE {0} \
+   CONFIG.PSU__FPDMASTERS_COHERENCY {0} \
+   CONFIG.PSU__FPD_SLCR__WDT1__ACT_FREQMHZ {100.000000} \
+   CONFIG.PSU__FPD_SLCR__WDT1__FREQMHZ {100.000000} \
+   CONFIG.PSU__FPD_SLCR__WDT_CLK_SEL__SELECT {APB} \
+   CONFIG.PSU__FPGA_PL0_ENABLE {1} \
+   CONFIG.PSU__GEM3_COHERENCY {0} \
+   CONFIG.PSU__GEM3_ROUTE_THROUGH_FPD {0} \
+   CONFIG.PSU__GEM__TSU__ENABLE {0} \
+   CONFIG.PSU__GPIO0_MIO__PERIPHERAL__ENABLE {0} \
+   CONFIG.PSU__GPIO1_MIO__PERIPHERAL__ENABLE {0} \
+   CONFIG.PSU__GT__LINK_SPEED {HBR} \
+   CONFIG.PSU__GT__PRE_EMPH_LVL_4 {0} \
+   CONFIG.PSU__GT__VLT_SWNG_LVL_4 {0} \
+   CONFIG.PSU__HIGH_ADDRESS__ENABLE {0} \
+   CONFIG.PSU__I2C0__PERIPHERAL__ENABLE {0} \
+   CONFIG.PSU__I2C1__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__I2C1__PERIPHERAL__IO {MIO 16 .. 17} \
+   CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC0_SEL {APB} \
+   CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC1_SEL {APB} \
+   CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC2_SEL {APB} \
+   CONFIG.PSU__IOU_SLCR__IOU_TTC_APB_CLK__TTC3_SEL {APB} \
+   CONFIG.PSU__IOU_SLCR__TTC0__ACT_FREQMHZ {100.000000} \
+   CONFIG.PSU__IOU_SLCR__TTC0__FREQMHZ {100.000000} \
+   CONFIG.PSU__IOU_SLCR__TTC1__ACT_FREQMHZ {100.000000} \
+   CONFIG.PSU__IOU_SLCR__TTC1__FREQMHZ {100.000000} \
+   CONFIG.PSU__IOU_SLCR__TTC2__ACT_FREQMHZ {100.000000} \
+   CONFIG.PSU__IOU_SLCR__TTC2__FREQMHZ {100.000000} \
+   CONFIG.PSU__IOU_SLCR__TTC3__ACT_FREQMHZ {100.000000} \
+   CONFIG.PSU__IOU_SLCR__TTC3__FREQMHZ {100.000000} \
+   CONFIG.PSU__IOU_SLCR__WDT0__ACT_FREQMHZ {100.000000} \
+   CONFIG.PSU__IOU_SLCR__WDT0__FREQMHZ {100.000000} \
+   CONFIG.PSU__IOU_SLCR__WDT_CLK_SEL__SELECT {APB} \
+   CONFIG.PSU__MAXIGP0__DATA_WIDTH {128} \
+   CONFIG.PSU__MAXIGP1__DATA_WIDTH {128} \
+   CONFIG.PSU__MAXIGP2__DATA_WIDTH {32} \
+   CONFIG.PSU__OVERRIDE__BASIC_CLOCK {0} \
+   CONFIG.PSU__PL_CLK0_BUF {TRUE} \
+   CONFIG.PSU__PRESET_APPLIED {1} \
+   CONFIG.PSU__PROTECTION__MASTERS {USB1:NonSecure;0|USB0:NonSecure;1|S_AXI_LPD:NA;0|S_AXI_HPC1_FPD:NA;0|S_AXI_HPC0_FPD:NA;0|S_AXI_HP3_FPD:NA;0|S_AXI_HP2_FPD:NA;0|S_AXI_HP1_FPD:NA;0|S_AXI_HP0_FPD:NA;0|S_AXI_ACP:NA;0|S_AXI_ACE:NA;0|SD1:NonSecure;1|SD0:NonSecure;0|SATA1:NonSecure;1|SATA0:NonSecure;1|RPU1:Secure;1|RPU0:Secure;1|QSPI:NonSecure;1|PMU:NA;1|PCIe:NonSecure;0|NAND:NonSecure;0|LDMA:NonSecure;1|GPU:NonSecure;1|GEM3:NonSecure;1|GEM2:NonSecure;0|GEM1:NonSecure;0|GEM0:NonSecure;0|FDMA:NonSecure;1|DP:NonSecure;1|DAP:NA;1|Coresight:NA;1|CSU:NA;1|APU:NA;1}\
+   CONFIG.PSU__PROTECTION__SLAVES {LPD;USB3_1_XHCI;FE300000;FE3FFFFF;0|LPD;USB3_1;FF9E0000;FF9EFFFF;0|LPD;USB3_0_XHCI;FE200000;FE2FFFFF;1|LPD;USB3_0;FF9D0000;FF9DFFFF;1|LPD;UART1;FF010000;FF01FFFF;1|LPD;UART0;FF000000;FF00FFFF;1|LPD;TTC3;FF140000;FF14FFFF;1|LPD;TTC2;FF130000;FF13FFFF;1|LPD;TTC1;FF120000;FF12FFFF;1|LPD;TTC0;FF110000;FF11FFFF;1|FPD;SWDT1;FD4D0000;FD4DFFFF;1|LPD;SWDT0;FF150000;FF15FFFF;1|LPD;SPI1;FF050000;FF05FFFF;0|LPD;SPI0;FF040000;FF04FFFF;0|FPD;SMMU_REG;FD5F0000;FD5FFFFF;1|FPD;SMMU;FD800000;FDFFFFFF;1|FPD;SIOU;FD3D0000;FD3DFFFF;1|FPD;SERDES;FD400000;FD47FFFF;1|LPD;SD1;FF170000;FF17FFFF;1|LPD;SD0;FF160000;FF16FFFF;0|FPD;SATA;FD0C0000;FD0CFFFF;1|LPD;RTC;FFA60000;FFA6FFFF;1|LPD;RSA_CORE;FFCE0000;FFCEFFFF;1|LPD;RPU;FF9A0000;FF9AFFFF;1|LPD;R5_TCM_RAM_GLOBAL;FFE00000;FFE3FFFF;1|LPD;R5_1_Instruction_Cache;FFEC0000;FFECFFFF;1|LPD;R5_1_Data_Cache;FFED0000;FFEDFFFF;1|LPD;R5_1_BTCM_GLOBAL;FFEB0000;FFEBFFFF;1|LPD;R5_1_ATCM_GLOBAL;FFE90000;FFE9FFFF;1|LPD;R5_0_Instruction_Cache;FFE40000;FFE4FFFF;1|LPD;R5_0_Data_Cache;FFE50000;FFE5FFFF;1|LPD;R5_0_BTCM_GLOBAL;FFE20000;FFE2FFFF;1|LPD;R5_0_ATCM_GLOBAL;FFE00000;FFE0FFFF;1|LPD;QSPI_Linear_Address;C0000000;DFFFFFFF;1|LPD;QSPI;FF0F0000;FF0FFFFF;1|LPD;PMU_RAM;FFDC0000;FFDDFFFF;1|LPD;PMU_GLOBAL;FFD80000;FFDBFFFF;1|FPD;PCIE_MAIN;FD0E0000;FD0EFFFF;0|FPD;PCIE_LOW;E0000000;EFFFFFFF;0|FPD;PCIE_HIGH2;8000000000;BFFFFFFFFF;0|FPD;PCIE_HIGH1;600000000;7FFFFFFFF;0|FPD;PCIE_DMA;FD0F0000;FD0FFFFF;0|FPD;PCIE_ATTRIB;FD480000;FD48FFFF;0|LPD;OCM_XMPU_CFG;FFA70000;FFA7FFFF;1|LPD;OCM_SLCR;FF960000;FF96FFFF;1|OCM;OCM;FFFC0000;FFFFFFFF;1|LPD;NAND;FF100000;FF10FFFF;0|LPD;MBISTJTAG;FFCF0000;FFCFFFFF;1|LPD;LPD_XPPU_SINK;FF9C0000;FF9CFFFF;1|LPD;LPD_XPPU;FF980000;FF98FFFF;1|LPD;LPD_SLCR_SECURE;FF4B0000;FF4DFFFF;1|LPD;LPD_SLCR;FF410000;FF4AFFFF;1|LPD;LPD_GPV;FE100000;FE1FFFFF;1|LPD;LPD_DMA_7;FFAF0000;FFAFFFFF;1|LPD;LPD_DMA_6;FFAE0000;FFAEFFFF;1|LPD;LPD_DMA_5;FFAD0000;FFADFFFF;1|LPD;LPD_DMA_4;FFAC0000;FFACFFFF;1|LPD;LPD_DMA_3;FFAB0000;FFABFFFF;1|LPD;LPD_DMA_2;FFAA0000;FFAAFFFF;1|LPD;LPD_DMA_1;FFA90000;FFA9FFFF;1|LPD;LPD_DMA_0;FFA80000;FFA8FFFF;1|LPD;IPI_CTRL;FF380000;FF3FFFFF;1|LPD;IOU_SLCR;FF180000;FF23FFFF;1|LPD;IOU_SECURE_SLCR;FF240000;FF24FFFF;1|LPD;IOU_SCNTRS;FF260000;FF26FFFF;1|LPD;IOU_SCNTR;FF250000;FF25FFFF;1|LPD;IOU_GPV;FE000000;FE0FFFFF;1|LPD;I2C1;FF030000;FF03FFFF;1|LPD;I2C0;FF020000;FF02FFFF;0|FPD;GPU;FD4B0000;FD4BFFFF;1|LPD;GPIO;FF0A0000;FF0AFFFF;1|LPD;GEM3;FF0E0000;FF0EFFFF;1|LPD;GEM2;FF0D0000;FF0DFFFF;0|LPD;GEM1;FF0C0000;FF0CFFFF;0|LPD;GEM0;FF0B0000;FF0BFFFF;0|FPD;FPD_XMPU_SINK;FD4F0000;FD4FFFFF;1|FPD;FPD_XMPU_CFG;FD5D0000;FD5DFFFF;1|FPD;FPD_SLCR_SECURE;FD690000;FD6CFFFF;1|FPD;FPD_SLCR;FD610000;FD68FFFF;1|FPD;FPD_DMA_CH7;FD570000;FD57FFFF;1|FPD;FPD_DMA_CH6;FD560000;FD56FFFF;1|FPD;FPD_DMA_CH5;FD550000;FD55FFFF;1|FPD;FPD_DMA_CH4;FD540000;FD54FFFF;1|FPD;FPD_DMA_CH3;FD530000;FD53FFFF;1|FPD;FPD_DMA_CH2;FD520000;FD52FFFF;1|FPD;FPD_DMA_CH1;FD510000;FD51FFFF;1|FPD;FPD_DMA_CH0;FD500000;FD50FFFF;1|LPD;EFUSE;FFCC0000;FFCCFFFF;1|FPD;Display\
+Port;FD4A0000;FD4AFFFF;1|FPD;DPDMA;FD4C0000;FD4CFFFF;1|FPD;DDR_XMPU5_CFG;FD050000;FD05FFFF;1|FPD;DDR_XMPU4_CFG;FD040000;FD04FFFF;1|FPD;DDR_XMPU3_CFG;FD030000;FD03FFFF;1|FPD;DDR_XMPU2_CFG;FD020000;FD02FFFF;1|FPD;DDR_XMPU1_CFG;FD010000;FD01FFFF;1|FPD;DDR_XMPU0_CFG;FD000000;FD00FFFF;1|FPD;DDR_QOS_CTRL;FD090000;FD09FFFF;1|FPD;DDR_PHY;FD080000;FD08FFFF;1|DDR;DDR_LOW;0;7FFFFFFF;1|DDR;DDR_HIGH;800000000;800000000;0|FPD;DDDR_CTRL;FD070000;FD070FFF;1|LPD;Coresight;FE800000;FEFFFFFF;1|LPD;CSU_DMA;FFC80000;FFC9FFFF;1|LPD;CSU;FFCA0000;FFCAFFFF;1|LPD;CRL_APB;FF5E0000;FF85FFFF;1|FPD;CRF_APB;FD1A0000;FD2DFFFF;1|FPD;CCI_REG;FD5E0000;FD5EFFFF;1|LPD;CAN1;FF070000;FF07FFFF;1|LPD;CAN0;FF060000;FF06FFFF;0|FPD;APU;FD5C0000;FD5CFFFF;1|LPD;APM_INTC_IOU;FFA20000;FFA2FFFF;1|LPD;APM_FPD_LPD;FFA30000;FFA3FFFF;1|FPD;APM_5;FD490000;FD49FFFF;1|FPD;APM_0;FD0B0000;FD0BFFFF;1|LPD;APM2;FFA10000;FFA1FFFF;1|LPD;APM1;FFA00000;FFA0FFFF;1|LPD;AMS;FFA50000;FFA5FFFF;1|FPD;AFI_5;FD3B0000;FD3BFFFF;1|FPD;AFI_4;FD3A0000;FD3AFFFF;1|FPD;AFI_3;FD390000;FD39FFFF;1|FPD;AFI_2;FD380000;FD38FFFF;1|FPD;AFI_1;FD370000;FD37FFFF;1|FPD;AFI_0;FD360000;FD36FFFF;1|LPD;AFIFM6;FF9B0000;FF9BFFFF;1|FPD;ACPU_GIC;F9010000;F907FFFF;1}\
+   CONFIG.PSU__PSS_REF_CLK__FREQMHZ {33.333333} \
+   CONFIG.PSU__QSPI_COHERENCY {0} \
+   CONFIG.PSU__QSPI_ROUTE_THROUGH_FPD {0} \
+   CONFIG.PSU__QSPI__GRP_FBCLK__ENABLE {1} \
+   CONFIG.PSU__QSPI__GRP_FBCLK__IO {MIO 6} \
+   CONFIG.PSU__QSPI__PERIPHERAL__DATA_MODE {x4} \
+   CONFIG.PSU__QSPI__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__QSPI__PERIPHERAL__IO {MIO 0 .. 5} \
+   CONFIG.PSU__QSPI__PERIPHERAL__MODE {Single} \
+   CONFIG.PSU__SATA__LANE0__ENABLE {0} \
+   CONFIG.PSU__SATA__LANE1__ENABLE {1} \
+   CONFIG.PSU__SATA__LANE1__IO {GT Lane3} \
+   CONFIG.PSU__SATA__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__SATA__REF_CLK_FREQ {125} \
+   CONFIG.PSU__SATA__REF_CLK_SEL {Ref Clk1} \
+   CONFIG.PSU__SD1_COHERENCY {0} \
+   CONFIG.PSU__SD1_ROUTE_THROUGH_FPD {0} \
+   CONFIG.PSU__SD1__DATA_TRANSFER_MODE {4Bit} \
+   CONFIG.PSU__SD1__GRP_CD__ENABLE {1} \
+   CONFIG.PSU__SD1__GRP_CD__IO {MIO 45} \
+   CONFIG.PSU__SD1__GRP_POW__ENABLE {0} \
+   CONFIG.PSU__SD1__GRP_WP__ENABLE {0} \
+   CONFIG.PSU__SD1__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__SD1__PERIPHERAL__IO {MIO 46 .. 51} \
+   CONFIG.PSU__SD1__RESET__ENABLE {0} \
+   CONFIG.PSU__SD1__SLOT_TYPE {SD 2.0} \
+   CONFIG.PSU__SWDT0__CLOCK__ENABLE {0} \
+   CONFIG.PSU__SWDT0__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__SWDT0__RESET__ENABLE {0} \
+   CONFIG.PSU__SWDT1__CLOCK__ENABLE {0} \
+   CONFIG.PSU__SWDT1__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__SWDT1__RESET__ENABLE {0} \
+   CONFIG.PSU__TSU__BUFG_PORT_PAIR {0} \
+   CONFIG.PSU__TTC0__CLOCK__ENABLE {0} \
+   CONFIG.PSU__TTC0__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__TTC0__WAVEOUT__ENABLE {0} \
+   CONFIG.PSU__TTC1__CLOCK__ENABLE {0} \
+   CONFIG.PSU__TTC1__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__TTC1__WAVEOUT__ENABLE {0} \
+   CONFIG.PSU__TTC2__CLOCK__ENABLE {0} \
+   CONFIG.PSU__TTC2__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__TTC2__WAVEOUT__ENABLE {0} \
+   CONFIG.PSU__TTC3__CLOCK__ENABLE {0} \
+   CONFIG.PSU__TTC3__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__TTC3__WAVEOUT__ENABLE {0} \
+   CONFIG.PSU__UART0__BAUD_RATE {115200} \
+   CONFIG.PSU__UART0__MODEM__ENABLE {0} \
+   CONFIG.PSU__UART0__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__UART0__PERIPHERAL__IO {MIO 18 .. 19} \
+   CONFIG.PSU__UART1__BAUD_RATE {115200} \
+   CONFIG.PSU__UART1__MODEM__ENABLE {0} \
+   CONFIG.PSU__UART1__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__UART1__PERIPHERAL__IO {MIO 20 .. 21} \
+   CONFIG.PSU__USB0_COHERENCY {0} \
+   CONFIG.PSU__USB0__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__USB0__PERIPHERAL__IO {MIO 52 .. 63} \
+   CONFIG.PSU__USB0__REF_CLK_FREQ {26} \
+   CONFIG.PSU__USB0__REF_CLK_SEL {Ref Clk2} \
+   CONFIG.PSU__USB0__RESET__ENABLE {0} \
+   CONFIG.PSU__USB1__RESET__ENABLE {0} \
+   CONFIG.PSU__USB2_0__EMIO__ENABLE {0} \
+   CONFIG.PSU__USB3_0__EMIO__ENABLE {0} \
+   CONFIG.PSU__USB3_0__PERIPHERAL__ENABLE {1} \
+   CONFIG.PSU__USB3_0__PERIPHERAL__IO {GT Lane2} \
+   CONFIG.PSU__USB__RESET__MODE {Boot Pin} \
+   CONFIG.PSU__USB__RESET__POLARITY {Active Low} \
+   CONFIG.PSU__USE__IRQ0 {1} \
+   CONFIG.PSU__USE__M_AXI_GP0 {0} \
+   CONFIG.PSU__USE__M_AXI_GP1 {0} \
+   CONFIG.PSU__USE__M_AXI_GP2 {1} \
+ ] $zynq_ultra_ps_e_0
+
+  # Create interface connections
+  connect_bd_intf_net -intf_net zynq_ultra_ps_e_0_M_AXI_HPM0_LPD [get_bd_intf_pins cmsdk_socket/S00_AXI] [get_bd_intf_pins zynq_ultra_ps_e_0/M_AXI_HPM0_LPD]
+
+  # Create port connections
+  connect_bd_net -net nanosoc_chip_0_swdio_o [get_bd_pins nanosoc_chip_0/swdio_o] [get_bd_pins cmsdk_socket/gpio_tri_o]
+  connect_bd_net -net nanosoc_chip_0_swdio_z [get_bd_pins nanosoc_chip_0/swdio_z] [get_bd_pins cmsdk_socket/gpio2_tri_z]
+  connect_bd_net -net cmsdk_socket_gpio2_tri_o [get_bd_pins nanosoc_chip_0/swdclk_i] [get_bd_pins cmsdk_socket/gpio2_tri_o]
+  connect_bd_net -net cmsdk_socket_gpio_tri_i [get_bd_pins nanosoc_chip_0/swdio_i] [get_bd_pins cmsdk_socket/gpio_tri_i]
+  connect_bd_net -net cmsdk_socket_nrst [get_bd_pins nanosoc_chip_0/nrst_i] [get_bd_pins cmsdk_socket/nrst]
+  connect_bd_net -net cmsdk_socket_p0_tri_i [get_bd_pins nanosoc_chip_0/p0_i] [get_bd_pins cmsdk_socket/p0_tri_i]
+  connect_bd_net -net cmsdk_socket_p1_tri_i [get_bd_pins nanosoc_chip_0/p1_i] [get_bd_pins cmsdk_socket/p1_tri_i]
+  connect_bd_net -net p0_tri_o_1 [get_bd_pins nanosoc_chip_0/p0_o] [get_bd_pins cmsdk_socket/p0_tri_o]
+  connect_bd_net -net p0_tri_z_1 [get_bd_pins nanosoc_chip_0/p0_z] [get_bd_pins cmsdk_socket/p0_tri_z]
+  connect_bd_net -net p1_tri_o_1 [get_bd_pins nanosoc_chip_0/p1_o] [get_bd_pins cmsdk_socket/p1_tri_o]
+  connect_bd_net -net p1_tri_z_1 [get_bd_pins nanosoc_chip_0/p1_z] [get_bd_pins cmsdk_socket/p1_tri_z]
+  connect_bd_net -net pmoda_i_1 [get_bd_ports pmoda_tri_i] [get_bd_pins cmsdk_socket/pmoda_tri_i]
+  connect_bd_net -net pmoda_o_concat9_dout [get_bd_ports pmoda_tri_z] [get_bd_pins cmsdk_socket/pmoda_tri_z]
+  connect_bd_net -net xlconcat_0_dout [get_bd_ports pmoda_tri_o] [get_bd_pins cmsdk_socket/pmoda_tri_o]
+  connect_bd_net -net zynq_ultra_ps_e_0_pl_clk0 [get_bd_pins nanosoc_chip_0/xtal_clk_i] [get_bd_pins cmsdk_socket/aclk] [get_bd_pins zynq_ultra_ps_e_0/maxihpm0_lpd_aclk] [get_bd_pins zynq_ultra_ps_e_0/pl_clk0]
+  connect_bd_net -net zynq_ultra_ps_e_0_pl_resetn0 [get_bd_pins cmsdk_socket/ext_reset_in] [get_bd_pins zynq_ultra_ps_e_0/pl_resetn0]
+
+  # Create address segments
+  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e_0/Data] [get_bd_addr_segs cmsdk_socket/axi_gpio_0/S_AXI/Reg] -force
+  assign_bd_address -offset 0x80010000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e_0/Data] [get_bd_addr_segs cmsdk_socket/axi_gpio_1/S_AXI/Reg] -force
+  assign_bd_address -offset 0x80020000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e_0/Data] [get_bd_addr_segs cmsdk_socket/axi_gpio_2/S_AXI/Reg] -force
+  assign_bd_address -offset 0x80030000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e_0/Data] [get_bd_addr_segs cmsdk_socket/axi_uartlite_0/S_AXI/Reg] -force
+
+
+  # Restore current instance
+  current_bd_instance $oldCurInst
+
+}
+# End of create_root_design()
+
+
+
+
+proc available_tcl_procs { } {
+   puts "##################################################################"
+   puts "# Available Tcl procedures to recreate hierarchical blocks:"
+   puts "#"
+   puts "#    create_hier_cell_cmsdk_socket parentCell nameHier"
+   puts "#    create_root_design"
+   puts "#"
+   puts "#"
+   puts "# The following procedures will create hiearchical blocks with addressing "
+   puts "# for IPs within those blocks and their sub-hierarchical blocks. Addressing "
+   puts "# will not be handled outside those blocks:"
+   puts "#"
+   puts "#    create_root_design"
+   puts "#"
+   puts "##################################################################"
+}
+
+available_tcl_procs
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1_wrapper.v b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1_wrapper.v
new file mode 100644
index 0000000..ce586c7
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/design_1_wrapper.v
@@ -0,0 +1,107 @@
+//Copyright 1986-2021 Xilinx, Inc. All Rights Reserved.
+//--------------------------------------------------------------------------------
+//Tool Version: Vivado v.2021.1 (lin64) Build 3247384 Thu Jun 10 19:36:07 MDT 2021
+//Date        : Wed Jun 22 15:58:42 2022
+//Host        : srv03335 running 64-bit Red Hat Enterprise Linux release 8.6 (Ootpa)
+//Command     : generate_target design_1_wrapper.bd
+//Design      : design_1_wrapper
+//Purpose     : IP block netlist
+//--------------------------------------------------------------------------------
+`timescale 1 ps / 1 ps
+
+module design_1_wrapper
+   (PMOD0_0,
+    PMOD0_1,
+    PMOD0_2,
+    PMOD0_3,
+    PMOD0_4,
+    PMOD0_5,
+    PMOD0_6,
+    PMOD0_7
+    );
+//    PMOD1_0,
+//    PMOD1_1,
+//    PMOD1_2,
+//    PMOD1_3,
+//    PMOD1_4,
+//    PMOD1_5,
+//    PMOD1_6,
+//    PMOD1_7,
+//    dip_switch_4bits_tri_i,
+//    led_4bits_tri_o);
+
+  inout wire PMOD0_0;
+  inout wire PMOD0_1;
+  inout wire PMOD0_2;
+  inout wire PMOD0_3;
+  inout wire PMOD0_4;
+  inout wire PMOD0_5;
+  inout wire PMOD0_6;
+  inout wire PMOD0_7;
+//  inout wire PMOD1_0;
+//  inout wire PMOD1_1;
+//  inout wire PMOD1_2;
+//  inout wire PMOD1_3;
+//  inout wire PMOD1_4;
+//  inout wire PMOD1_5;
+//  inout wire PMOD1_6;
+//  inout wire PMOD1_7;
+
+//  input wire [3:0]dip_switch_4bits_tri_i;
+//  output wire [3:0]led_4bits_tri_o;
+
+  wire [7:0]PMOD0_tri_i;
+  wire [7:0]PMOD0_tri_o;
+  wire [7:0]PMOD0_tri_z;
+  
+  assign PMOD0_tri_i[0] = PMOD0_0;
+  assign PMOD0_tri_i[1] = PMOD0_1;
+  assign PMOD0_tri_i[2] = PMOD0_2;
+  assign PMOD0_tri_i[3] = PMOD0_3;
+  assign PMOD0_tri_i[4] = PMOD0_4;
+  assign PMOD0_tri_i[5] = PMOD0_5;
+  assign PMOD0_tri_i[6] = PMOD0_6;
+  assign PMOD0_tri_i[7] = PMOD0_7;
+  
+  assign PMOD0_0 = PMOD0_tri_z[0] ? 1'bz : PMOD0_tri_o[0];
+  assign PMOD0_1 = PMOD0_tri_z[1] ? 1'bz : PMOD0_tri_o[1];
+  assign PMOD0_2 = PMOD0_tri_z[2] ? 1'bz : PMOD0_tri_o[2];
+  assign PMOD0_3 = PMOD0_tri_z[3] ? 1'bz : PMOD0_tri_o[3];
+  assign PMOD0_4 = PMOD0_tri_z[4] ? 1'bz : PMOD0_tri_o[4];
+  assign PMOD0_5 = PMOD0_tri_z[5] ? 1'bz : PMOD0_tri_o[5];
+  assign PMOD0_6 = PMOD0_tri_z[6] ? 1'bz : PMOD0_tri_o[6];
+  assign PMOD0_7 = PMOD0_tri_z[7] ? 1'bz : PMOD0_tri_o[7];
+
+//  wire [7:0]PMOD1_tri_i;
+//  wire [7:0]PMOD1_tri_o;
+//  wire [7:0]PMOD1_tri_z;
+  
+//  assign PMOD1_tri_i[0] = PMOD1_0;
+//  assign PMOD1_tri_i[1] = PMOD1_1;
+//  assign PMOD1_tri_i[2] = PMOD1_2;
+//  assign PMOD1_tri_i[3] = PMOD1_3;
+//  assign PMOD1_tri_i[4] = PMOD1_4;
+//  assign PMOD1_tri_i[5] = PMOD1_5;
+//  assign PMOD1_tri_i[6] = PMOD1_6;
+//  assign PMOD1_tri_i[7] = PMOD1_7;
+  
+//  assign PMOD1_0 = PMOD1_tri_z[0] ? 1'bz : PMOD1_tri_o[0];
+//  assign PMOD1_1 = PMOD1_tri_z[1] ? 1'bz : PMOD1_tri_o[1];
+//  assign PMOD1_2 = PMOD1_tri_z[2] ? 1'bz : PMOD1_tri_o[2];
+//  assign PMOD1_3 = PMOD1_tri_z[3] ? 1'bz : PMOD1_tri_o[3];
+//  assign PMOD1_4 = PMOD1_tri_z[4] ? 1'bz : PMOD1_tri_o[4];
+//  assign PMOD1_5 = PMOD1_tri_z[5] ? 1'bz : PMOD1_tri_o[5];
+//  assign PMOD1_6 = PMOD1_tri_z[6] ? 1'bz : PMOD1_tri_o[6];
+//  assign PMOD1_7 = PMOD1_tri_z[7] ? 1'bz : PMOD1_tri_o[7];
+
+  design_1 design_1_i
+       (.pmoda_tri_i(PMOD0_tri_i),
+        .pmoda_tri_o(PMOD0_tri_o),
+        .pmoda_tri_z(PMOD0_tri_z)//,
+//        .PMOD1_tri_i(PMOD1_tri_i),
+//        .PMOD1_tri_o(PMOD1_tri_o),
+//        .PMOD1_tri_z(PMOD1_tri_z),
+//        .dip_switch_4bits_tri_i(dip_switch_4bits_tri_i),
+//        .led_4bits_tri_o(led_4bits_tri_o)
+        );
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_pinmap.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_pinmap.xdc
new file mode 100644
index 0000000..4a635dd
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_pinmap.xdc
@@ -0,0 +1,1031 @@
+##################################################################################
+##                                                                              ##
+## ZCU104 Rev1.0 Master XDC                                                     ##
+##                                                                              ##
+##################################################################################
+
+#Other net   PACKAGE_PIN V17      - SYSMON_DXN                Bank   0 - DXN
+#Other net   PACKAGE_PIN V18      - SYSMON_DXP                Bank   0 - DXP
+#Other net   PACKAGE_PIN R17      - SYSMON_AGND               Bank   0 - GNDADC
+#Other net   PACKAGE_PIN AA12     - 3N5824                    Bank   0 - POR_OVERRIDE
+#Other net   PACKAGE_PIN AA13     - 3N5822                    Bank   0 - PUDC_B
+#Other net   PACKAGE_PIN R18      - FPGA_SYSMON_AVCC          Bank   0 - VCCADC
+#Other net   PACKAGE_PIN U17      - SYSMON_VN_R               Bank   0 - VN
+#Other net   PACKAGE_PIN T18      - SYSMON_VP_R               Bank   0 - VP
+#Other net   PACKAGE_PIN T17      - SYSMON_AGND               Bank   0 - VREFN
+#Other net   PACKAGE_PIN U18      - SYSMON_AGND               Bank   0 - VREFP
+#set_property PACKAGE_PIN B21      [get_ports "5N7582"] ;# Bank  28 VCCO - VCC1V8   - IO_L24N_T3U_N11_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7582"] ;# Bank  28 VCCO - VCC1V8   - IO_L24N_T3U_N11_28
+#set_property PACKAGE_PIN B20      [get_ports "5N7577"] ;# Bank  28 VCCO - VCC1V8   - IO_L24P_T3U_N10_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7577"] ;# Bank  28 VCCO - VCC1V8   - IO_L24P_T3U_N10_28
+#set_property PACKAGE_PIN A23      [get_ports "5N7578"] ;# Bank  28 VCCO - VCC1V8   - IO_L23N_T3U_N9_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7578"] ;# Bank  28 VCCO - VCC1V8   - IO_L23N_T3U_N9_28
+#set_property PACKAGE_PIN A22      [get_ports "5N7569"] ;# Bank  28 VCCO - VCC1V8   - IO_L23P_T3U_N8_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7569"] ;# Bank  28 VCCO - VCC1V8   - IO_L23P_T3U_N8_28
+#set_property PACKAGE_PIN B19      [get_ports "5N7570"] ;# Bank  28 VCCO - VCC1V8   - IO_L22N_T3U_N7_DBC_AD0N_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7570"] ;# Bank  28 VCCO - VCC1V8   - IO_L22N_T3U_N7_DBC_AD0N_28
+#set_property PACKAGE_PIN B18      [get_ports "5N7565"] ;# Bank  28 VCCO - VCC1V8   - IO_L22P_T3U_N6_DBC_AD0P_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7565"] ;# Bank  28 VCCO - VCC1V8   - IO_L22P_T3U_N6_DBC_AD0P_28
+#set_property PACKAGE_PIN A21      [get_ports "5N7709"] ;# Bank  28 VCCO - VCC1V8   - IO_L21N_T3L_N5_AD8N_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7709"] ;# Bank  28 VCCO - VCC1V8   - IO_L21N_T3L_N5_AD8N_28
+#set_property PACKAGE_PIN A18      [get_ports "5N7704"] ;# Bank  28 VCCO - VCC1V8   - IO_L19P_T3L_N0_DBC_AD9P_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7704"] ;# Bank  28 VCCO - VCC1V8   - IO_L19P_T3L_N0_DBC_AD9P_28
+#set_property PACKAGE_PIN B23      [get_ports "5N7581"] ;# Bank  28 VCCO - VCC1V8   - IO_T3U_N12_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7581"] ;# Bank  28 VCCO - VCC1V8   - IO_T3U_N12_28
+#set_property PACKAGE_PIN F25      [get_ports "5N7703"] ;# Bank  28 VCCO - VCC1V8   - IO_T2U_N12_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7703"] ;# Bank  28 VCCO - VCC1V8   - IO_T2U_N12_28
+#set_property PACKAGE_PIN G26      [get_ports "5N7702"] ;# Bank  28 VCCO - VCC1V8   - IO_L18N_T2U_N11_AD2N_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7702"] ;# Bank  28 VCCO - VCC1V8   - IO_L18N_T2U_N11_AD2N_28
+#set_property PACKAGE_PIN G25      [get_ports "5N7694"] ;# Bank  28 VCCO - VCC1V8   - IO_L18P_T2U_N10_AD2P_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7694"] ;# Bank  28 VCCO - VCC1V8   - IO_L18P_T2U_N10_AD2P_28
+#set_property PACKAGE_PIN C23      [get_ports "5N7693"] ;# Bank  28 VCCO - VCC1V8   - IO_L17N_T2U_N9_AD10N_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7693"] ;# Bank  28 VCCO - VCC1V8   - IO_L17N_T2U_N9_AD10N_28
+#set_property PACKAGE_PIN D22      [get_ports "5N7690"] ;# Bank  28 VCCO - VCC1V8   - IO_L17P_T2U_N8_AD10P_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7690"] ;# Bank  28 VCCO - VCC1V8   - IO_L17P_T2U_N8_AD10P_28
+#set_property PACKAGE_PIN D24      [get_ports "5N7688"] ;# Bank  28 VCCO - VCC1V8   - IO_L16N_T2U_N7_QBC_AD3N_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7688"] ;# Bank  28 VCCO - VCC1V8   - IO_L16N_T2U_N7_QBC_AD3N_28
+#set_property PACKAGE_PIN E24      [get_ports "5N7682"] ;# Bank  28 VCCO - VCC1V8   - IO_L16P_T2U_N6_QBC_AD3P_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7682"] ;# Bank  28 VCCO - VCC1V8   - IO_L16P_T2U_N6_QBC_AD3P_28
+#set_property PACKAGE_PIN C22      [get_ports "5N7681"] ;# Bank  28 VCCO - VCC1V8   - IO_L15N_T2L_N5_AD11N_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7681"] ;# Bank  28 VCCO - VCC1V8   - IO_L15N_T2L_N5_AD11N_28
+#set_property PACKAGE_PIN C21      [get_ports "5N7678"] ;# Bank  28 VCCO - VCC1V8   - IO_L15P_T2L_N4_AD11P_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7678"] ;# Bank  28 VCCO - VCC1V8   - IO_L15P_T2L_N4_AD11P_28
+#set_property PACKAGE_PIN G24      [get_ports "5N7676"] ;# Bank  28 VCCO - VCC1V8   - IO_L14N_T2L_N3_GC_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7676"] ;# Bank  28 VCCO - VCC1V8   - IO_L14N_T2L_N3_GC_28
+#set_property PACKAGE_PIN G23      [get_ports "5N7672"] ;# Bank  28 VCCO - VCC1V8   - IO_L14P_T2L_N2_GC_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7672"] ;# Bank  28 VCCO - VCC1V8   - IO_L14P_T2L_N2_GC_28
+#set_property PACKAGE_PIN F20      [get_ports "5N7532"] ;# Bank  28 VCCO - VCC1V8   - IO_L10N_T1U_N7_QBC_AD4N_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7532"] ;# Bank  28 VCCO - VCC1V8   - IO_L10N_T1U_N7_QBC_AD4N_28
+#set_property PACKAGE_PIN G20      [get_ports "5N7533"] ;# Bank  28 VCCO - VCC1V8   - IO_L10P_T1U_N6_QBC_AD4P_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7533"] ;# Bank  28 VCCO - VCC1V8   - IO_L10P_T1U_N6_QBC_AD4P_28
+#set_property PACKAGE_PIN D21      [get_ports "5N7524"] ;# Bank  28 VCCO - VCC1V8   - IO_L9N_T1L_N5_AD12N_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7524"] ;# Bank  28 VCCO - VCC1V8   - IO_L9N_T1L_N5_AD12N_28
+#set_property PACKAGE_PIN D20      [get_ports "5N7525"] ;# Bank  28 VCCO - VCC1V8   - IO_L9P_T1L_N4_AD12P_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7525"] ;# Bank  28 VCCO - VCC1V8   - IO_L9P_T1L_N4_AD12P_28
+#set_property PACKAGE_PIN H22      [get_ports "5N7520"] ;# Bank  28 VCCO - VCC1V8   - IO_L8N_T1L_N3_AD5N_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7520"] ;# Bank  28 VCCO - VCC1V8   - IO_L8N_T1L_N3_AD5N_28
+#set_property PACKAGE_PIN H21      [get_ports "5N7521"] ;# Bank  28 VCCO - VCC1V8   - IO_L8P_T1L_N2_AD5P_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7521"] ;# Bank  28 VCCO - VCC1V8   - IO_L8P_T1L_N2_AD5P_28
+#set_property PACKAGE_PIN D19      [get_ports "5N7512"] ;# Bank  28 VCCO - VCC1V8   - IO_L7N_T1L_N1_QBC_AD13N_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7512"] ;# Bank  28 VCCO - VCC1V8   - IO_L7N_T1L_N1_QBC_AD13N_28
+#set_property PACKAGE_PIN E19      [get_ports "5N7513"] ;# Bank  28 VCCO - VCC1V8   - IO_L7P_T1L_N0_QBC_AD13P_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7513"] ;# Bank  28 VCCO - VCC1V8   - IO_L7P_T1L_N0_QBC_AD13P_28
+#set_property PACKAGE_PIN E20      [get_ports "5N7726"] ;# Bank  28 VCCO - VCC1V8   - IO_T1U_N12_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7726"] ;# Bank  28 VCCO - VCC1V8   - IO_T1U_N12_28
+#set_property PACKAGE_PIN H23      [get_ports "5N7508"] ;# Bank  28 VCCO - VCC1V8   - IO_T0U_N12_VRP_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7508"] ;# Bank  28 VCCO - VCC1V8   - IO_T0U_N12_VRP_28
+#set_property PACKAGE_PIN H24      [get_ports "5N7509"] ;# Bank  28 VCCO - VCC1V8   - IO_L6N_T0U_N11_AD6N_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7509"] ;# Bank  28 VCCO - VCC1V8   - IO_L6N_T0U_N11_AD6N_28
+#set_property PACKAGE_PIN J24      [get_ports "5N7500"] ;# Bank  28 VCCO - VCC1V8   - IO_L6P_T0U_N10_AD6P_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7500"] ;# Bank  28 VCCO - VCC1V8   - IO_L6P_T0U_N10_AD6P_28
+#set_property PACKAGE_PIN H26      [get_ports "5N7501"] ;# Bank  28 VCCO - VCC1V8   - IO_L5N_T0U_N9_AD14N_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7501"] ;# Bank  28 VCCO - VCC1V8   - IO_L5N_T0U_N9_AD14N_28
+#set_property PACKAGE_PIN J25      [get_ports "5N7496"] ;# Bank  28 VCCO - VCC1V8   - IO_L5P_T0U_N8_AD14P_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7496"] ;# Bank  28 VCCO - VCC1V8   - IO_L5P_T0U_N8_AD14P_28
+#set_property PACKAGE_PIN K23      [get_ports "5N7497"] ;# Bank  28 VCCO - VCC1V8   - IO_L4N_T0U_N7_DBC_AD7N_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7497"] ;# Bank  28 VCCO - VCC1V8   - IO_L4N_T0U_N7_DBC_AD7N_28
+#set_property PACKAGE_PIN K22      [get_ports "5N7488"] ;# Bank  28 VCCO - VCC1V8   - IO_L4P_T0U_N6_DBC_AD7P_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7488"] ;# Bank  28 VCCO - VCC1V8   - IO_L4P_T0U_N6_DBC_AD7P_28
+#set_property PACKAGE_PIN J22      [get_ports "5N7489"] ;# Bank  28 VCCO - VCC1V8   - IO_L3N_T0L_N5_AD15N_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7489"] ;# Bank  28 VCCO - VCC1V8   - IO_L3N_T0L_N5_AD15N_28
+#set_property PACKAGE_PIN J21      [get_ports "5N7484"] ;# Bank  28 VCCO - VCC1V8   - IO_L3P_T0L_N4_AD15P_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7484"] ;# Bank  28 VCCO - VCC1V8   - IO_L3P_T0L_N4_AD15P_28
+#set_property PACKAGE_PIN K24      [get_ports "5N7485"] ;# Bank  28 VCCO - VCC1V8   - IO_L2N_T0L_N3_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7485"] ;# Bank  28 VCCO - VCC1V8   - IO_L2N_T0L_N3_28
+#set_property PACKAGE_PIN L23      [get_ports "5N7476"] ;# Bank  28 VCCO - VCC1V8   - IO_L2P_T0L_N2_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7476"] ;# Bank  28 VCCO - VCC1V8   - IO_L2P_T0L_N2_28
+#set_property PACKAGE_PIN L22      [get_ports "5N7477"] ;# Bank  28 VCCO - VCC1V8   - IO_L1N_T0L_N1_DBC_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7477"] ;# Bank  28 VCCO - VCC1V8   - IO_L1N_T0L_N1_DBC_28
+#set_property PACKAGE_PIN L21      [get_ports "5N7472"] ;# Bank  28 VCCO - VCC1V8   - IO_L1P_T0L_N0_DBC_28
+#set_property IOSTANDARD  LVCMOSxx [get_ports "5N7472"] ;# Bank  28 VCCO - VCC1V8   - IO_L1P_T0L_N0_DBC_28
+#Other net   PACKAGE_PIN M23      - 5N7631                    Bank  28 - VREF_28
+#set_property PACKAGE_PIN A9       [get_ports "4N9784"] ;# Bank  68 VCCO - VADJ_FMC - IO_T3U_N12_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9784"] ;# Bank  68 VCCO - VADJ_FMC - IO_T3U_N12_68
+#set_property PACKAGE_PIN G13      [get_ports "4N9781"] ;# Bank  68 VCCO - VADJ_FMC - IO_T2U_N12_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9781"] ;# Bank  68 VCCO - VADJ_FMC - IO_T2U_N12_68
+#set_property PACKAGE_PIN G11      [get_ports "4N9820"] ;# Bank  68 VCCO - VADJ_FMC - IO_L13N_T2L_N1_GC_QBC_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9820"] ;# Bank  68 VCCO - VADJ_FMC - IO_L13N_T2L_N1_GC_QBC_68
+#set_property PACKAGE_PIN H11      [get_ports "4N9817"] ;# Bank  68 VCCO - VADJ_FMC - IO_L13P_T2L_N0_GC_QBC_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9817"] ;# Bank  68 VCCO - VADJ_FMC - IO_L13P_T2L_N0_GC_QBC_68
+#set_property PACKAGE_PIN G9       [get_ports "4N9823"] ;# Bank  68 VCCO - VADJ_FMC - IO_L11N_T1U_N9_GC_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9823"] ;# Bank  68 VCCO - VADJ_FMC - IO_L11N_T1U_N9_GC_68
+#set_property PACKAGE_PIN H9       [get_ports "4N9826"] ;# Bank  68 VCCO - VADJ_FMC - IO_L11P_T1U_N8_GC_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9826"] ;# Bank  68 VCCO - VADJ_FMC - IO_L11P_T1U_N8_GC_68
+#set_property PACKAGE_PIN D7       [get_ports "4N9778"] ;# Bank  68 VCCO - VADJ_FMC - IO_T1U_N12_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9778"] ;# Bank  68 VCCO - VADJ_FMC - IO_T1U_N12_68
+#set_property PACKAGE_PIN H14      [get_ports "VRP_68"] ;# Bank  68 VCCO - VADJ_FMC - IO_T0U_N12_VRP_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "VRP_68"] ;# Bank  68 VCCO - VADJ_FMC - IO_T0U_N12_VRP_68
+#set_property PACKAGE_PIN K13      [get_ports "4N9759"] ;# Bank  68 VCCO - VADJ_FMC - IO_L6N_T0U_N11_AD6N_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9759"] ;# Bank  68 VCCO - VADJ_FMC - IO_L6N_T0U_N11_AD6N_68
+#set_property PACKAGE_PIN L14      [get_ports "4N9760"] ;# Bank  68 VCCO - VADJ_FMC - IO_L6P_T0U_N10_AD6P_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9760"] ;# Bank  68 VCCO - VADJ_FMC - IO_L6P_T0U_N10_AD6P_68
+#set_property PACKAGE_PIN J14      [get_ports "4N9755"] ;# Bank  68 VCCO - VADJ_FMC - IO_L5N_T0U_N9_AD14N_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9755"] ;# Bank  68 VCCO - VADJ_FMC - IO_L5N_T0U_N9_AD14N_68
+#set_property PACKAGE_PIN K14      [get_ports "4N9756"] ;# Bank  68 VCCO - VADJ_FMC - IO_L5P_T0U_N8_AD14P_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9756"] ;# Bank  68 VCCO - VADJ_FMC - IO_L5P_T0U_N8_AD14P_68
+#set_property PACKAGE_PIN J11      [get_ports "4N9771"] ;# Bank  68 VCCO - VADJ_FMC - IO_L4N_T0U_N7_DBC_AD7N_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9771"] ;# Bank  68 VCCO - VADJ_FMC - IO_L4N_T0U_N7_DBC_AD7N_68
+#set_property PACKAGE_PIN K12      [get_ports "4N9772"] ;# Bank  68 VCCO - VADJ_FMC - IO_L4P_T0U_N6_DBC_AD7P_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9772"] ;# Bank  68 VCCO - VADJ_FMC - IO_L4P_T0U_N6_DBC_AD7P_68
+#set_property PACKAGE_PIN L11      [get_ports "4N9767"] ;# Bank  68 VCCO - VADJ_FMC - IO_L3N_T0L_N5_AD15N_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9767"] ;# Bank  68 VCCO - VADJ_FMC - IO_L3N_T0L_N5_AD15N_68
+#set_property PACKAGE_PIN L12      [get_ports "4N9768"] ;# Bank  68 VCCO - VADJ_FMC - IO_L3P_T0L_N4_AD15P_68
+#set_property IOSTANDARD  LVCMOSxx [get_ports "4N9768"] ;# Bank  68 VCCO - VADJ_FMC - IO_L3P_T0L_N4_AD15P_68
+#Other net   PACKAGE_PIN J12      - 4N9503                    Bank  68 - VREF_68
+#set_property PACKAGE_PIN J20      [get_ports "7N10213"] ;# Bank  67 VCCO - VADJ_FMC - IO_T3U_N12_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10213"] ;# Bank  67 VCCO - VADJ_FMC - IO_T3U_N12_67
+#set_property PACKAGE_PIN J19      [get_ports "7N10210"] ;# Bank  67 VCCO - VADJ_FMC - IO_T2U_N12_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10210"] ;# Bank  67 VCCO - VADJ_FMC - IO_T2U_N12_67
+#set_property PACKAGE_PIN G16      [get_ports "FMC_LPC_LA09_N"] ;# Bank  67 VCCO - VADJ_FMC - IO_L18N_T2U_N11_AD2N_67
+#set_property PACKAGE_PIN D14      [get_ports "7N10403"] ;# Bank  67 VCCO - VADJ_FMC - IO_L11N_T1U_N9_GC_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10403"] ;# Bank  67 VCCO - VADJ_FMC - IO_L11N_T1U_N9_GC_67
+#set_property PACKAGE_PIN D15      [get_ports "7N10406"] ;# Bank  67 VCCO - VADJ_FMC - IO_L11P_T1U_N8_GC_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10406"] ;# Bank  67 VCCO - VADJ_FMC - IO_L11P_T1U_N8_GC_67
+#set_property PACKAGE_PIN F13      [get_ports "7N10612"] ;# Bank  67 VCCO - VADJ_FMC - IO_L10N_T1U_N7_QBC_AD4N_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10612"] ;# Bank  67 VCCO - VADJ_FMC - IO_L10N_T1U_N7_QBC_AD4N_67
+#set_property PACKAGE_PIN G14      [get_ports "7N10614"] ;# Bank  67 VCCO - VADJ_FMC - IO_L10P_T1U_N6_QBC_AD4P_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10614"] ;# Bank  67 VCCO - VADJ_FMC - IO_L10P_T1U_N6_QBC_AD4P_67
+#set_property PACKAGE_PIN E13      [get_ports "7N10207"] ;# Bank  67 VCCO - VADJ_FMC - IO_T1U_N12_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10207"] ;# Bank  67 VCCO - VADJ_FMC - IO_T1U_N12_67
+#set_property PACKAGE_PIN C14      [get_ports "7N10204"] ;# Bank  67 VCCO - VADJ_FMC - IO_T0U_N12_VRP_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10204"] ;# Bank  67 VCCO - VADJ_FMC - IO_T0U_N12_VRP_67
+#set_property PACKAGE_PIN C12      [get_ports "FMC_LPC_LA14_N"] ;# Bank  67 VCCO - VADJ_FMC - IO_L6N_T0U_N11_AD6N_67
+#set_property PACKAGE_PIN B13      [get_ports "7N10197"] ;# Bank  67 VCCO - VADJ_FMC - IO_L4N_T0U_N7_DBC_AD7N_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10197"] ;# Bank  67 VCCO - VADJ_FMC - IO_L4N_T0U_N7_DBC_AD7N_67
+#set_property PACKAGE_PIN B14      [get_ports "7N10198"] ;# Bank  67 VCCO - VADJ_FMC - IO_L4P_T0U_N6_DBC_AD7P_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10198"] ;# Bank  67 VCCO - VADJ_FMC - IO_L4P_T0U_N6_DBC_AD7P_67
+#set_property PACKAGE_PIN A14      [get_ports "7N10193"] ;# Bank  67 VCCO - VADJ_FMC - IO_L3N_T0L_N5_AD15N_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10193"] ;# Bank  67 VCCO - VADJ_FMC - IO_L3N_T0L_N5_AD15N_67
+#set_property PACKAGE_PIN A15      [get_ports "7N10194"] ;# Bank  67 VCCO - VADJ_FMC - IO_L3P_T0L_N4_AD15P_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10194"] ;# Bank  67 VCCO - VADJ_FMC - IO_L3P_T0L_N4_AD15P_67
+#set_property PACKAGE_PIN B15      [get_ports "7N10185"] ;# Bank  67 VCCO - VADJ_FMC - IO_L2N_T0L_N3_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10185"] ;# Bank  67 VCCO - VADJ_FMC - IO_L2N_T0L_N3_67
+#set_property PACKAGE_PIN B16      [get_ports "7N10186"] ;# Bank  67 VCCO - VADJ_FMC - IO_L2P_T0L_N2_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10186"] ;# Bank  67 VCCO - VADJ_FMC - IO_L2P_T0L_N2_67
+#set_property PACKAGE_PIN A16      [get_ports "7N10181"] ;# Bank  67 VCCO - VADJ_FMC - IO_L1N_T0L_N1_DBC_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10181"] ;# Bank  67 VCCO - VADJ_FMC - IO_L1N_T0L_N1_DBC_67
+#set_property PACKAGE_PIN A17      [get_ports "7N10182"] ;# Bank  67 VCCO - VADJ_FMC - IO_L1P_T0L_N0_DBC_67
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10182"] ;# Bank  67 VCCO - VADJ_FMC - IO_L1P_T0L_N0_DBC_67
+#Other net   PACKAGE_PIN L18      - 7N9719                    Bank  67 - VREF_67
+#set_property PACKAGE_PIN AF10     [get_ports "7N10601"] ;# Bank  66 VCCO - VCC1V2   - IO_L19N_T3L_N1_DBC_AD9N_66
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10601"] ;# Bank  66 VCCO - VCC1V2   - IO_L19N_T3L_N1_DBC_AD9N_66
+#set_property PACKAGE_PIN AC14     [get_ports "7N10603"] ;# Bank  66 VCCO - VCC1V2   - IO_T3U_N12_66
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10603"] ;# Bank  66 VCCO - VCC1V2   - IO_T3U_N12_66
+#set_property PACKAGE_PIN AH8      [get_ports "7N10599"] ;# Bank  66 VCCO - VCC1V2   - IO_T2U_N12_66
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10599"] ;# Bank  66 VCCO - VCC1V2   - IO_T2U_N12_66
+#set_property PACKAGE_PIN AJ12     [get_ports "7N10597"] ;# Bank  66 VCCO - VCC1V2   - IO_L13N_T2L_N1_GC_QBC_66
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10597"] ;# Bank  66 VCCO - VCC1V2   - IO_L13N_T2L_N1_GC_QBC_66
+#set_property PACKAGE_PIN AL13     [get_ports "7N10593"] ;# Bank  66 VCCO - VCC1V2   - IO_L7N_T1L_N1_QBC_AD13N_66
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10593"] ;# Bank  66 VCCO - VCC1V2   - IO_L7N_T1L_N1_QBC_AD13N_66
+#set_property PACKAGE_PIN AM13     [get_ports "7N10595"] ;# Bank  66 VCCO - VCC1V2   - IO_T1U_N12_66
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10595"] ;# Bank  66 VCCO - VCC1V2   - IO_T1U_N12_66
+#set_property PACKAGE_PIN AP8      [get_ports "VRP_66"] ;# Bank  66 VCCO - VCC1V2   - IO_T0U_N12_VRP_66
+#set_property IOSTANDARD  LVCMOSxx [get_ports "VRP_66"] ;# Bank  66 VCCO - VCC1V2   - IO_T0U_N12_VRP_66
+#set_property PACKAGE_PIN AP12     [get_ports "7N10591"] ;# Bank  66 VCCO - VCC1V2   - IO_L1N_T0L_N1_DBC_66
+#set_property IOSTANDARD  LVCMOSxx [get_ports "7N10591"] ;# Bank  66 VCCO - VCC1V2   - IO_L1N_T0L_N1_DBC_66
+#Other net   PACKAGE_PIN AB12     - 7N8282                    Bank  66 - VREF_66
+#set_property PACKAGE_PIN AE19     [get_ports "6N12439"] ;# Bank  65 VCCO - VCC1V2   - IO_L19N_T3L_N1_DBC_AD9N_65
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12439"] ;# Bank  65 VCCO - VCC1V2   - IO_L19N_T3L_N1_DBC_AD9N_65
+#set_property PACKAGE_PIN AE22     [get_ports "6N12442"] ;# Bank  65 VCCO - VCC1V2   - IO_T3U_N12_65
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12442"] ;# Bank  65 VCCO - VCC1V2   - IO_T3U_N12_65
+#set_property PACKAGE_PIN AF20     [get_ports "6N12436"] ;# Bank  65 VCCO - VCC1V2   - IO_T2U_N12_65
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12436"] ;# Bank  65 VCCO - VCC1V2   - IO_T2U_N12_65
+#set_property PACKAGE_PIN AH23     [get_ports "6N12433"] ;# Bank  65 VCCO - VCC1V2   - IO_L13N_T2L_N1_GC_QBC_65
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12433"] ;# Bank  65 VCCO - VCC1V2   - IO_L13N_T2L_N1_GC_QBC_65
+#set_property PACKAGE_PIN AL21     [get_ports "6N12427"] ;# Bank  65 VCCO - VCC1V2   - IO_L7N_T1L_N1_QBC_AD13N_65
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12427"] ;# Bank  65 VCCO - VCC1V2   - IO_L7N_T1L_N1_QBC_AD13N_65
+#set_property PACKAGE_PIN AH19     [get_ports "6N12430"] ;# Bank  65 VCCO - VCC1V2   - IO_T1U_N12_65
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12430"] ;# Bank  65 VCCO - VCC1V2   - IO_T1U_N12_65
+#set_property PACKAGE_PIN AM20     [get_ports "VRP_65"] ;# Bank  65 VCCO - VCC1V2   - IO_T0U_N12_VRP_65
+#set_property IOSTANDARD  LVCMOSxx [get_ports "VRP_65"] ;# Bank  65 VCCO - VCC1V2   - IO_T0U_N12_VRP_65
+#set_property PACKAGE_PIN AP20     [get_ports "6N12401"] ;# Bank  65 VCCO - VCC1V2   - IO_L1N_T0L_N1_DBC_65
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12401"] ;# Bank  65 VCCO - VCC1V2   - IO_L1N_T0L_N1_DBC_65
+#Other net   PACKAGE_PIN AB20     - 6N11582                   Bank  65 - VREF_65
+#set_property PACKAGE_PIN AA17     [get_ports "6N12707"] ;# Bank  64 VCCO - VCC1V2   - IO_T3U_N12_64
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12707"] ;# Bank  64 VCCO - VCC1V2   - IO_T3U_N12_64
+#set_property PACKAGE_PIN AE17     [get_ports "6N12705"] ;# Bank  64 VCCO - VCC1V2   - IO_L15P_T2L_N4_AD11P_64
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12705"] ;# Bank  64 VCCO - VCC1V2   - IO_L15P_T2L_N4_AD11P_64
+#set_property PACKAGE_PIN AP14     [get_ports "VRP_64"] ;# Bank  64 VCCO - VCC1V2   - IO_T0U_N12_VRP_64
+#set_property PACKAGE_PIN AP15     [get_ports "6N12788"] ;# Bank  64 VCCO - VCC1V2   - IO_L5N_T0U_N9_AD14N_64
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12788"] ;# Bank  64 VCCO - VCC1V2   - IO_L5N_T0U_N9_AD14N_64
+#set_property PACKAGE_PIN AP16     [get_ports "6N12789"] ;# Bank  64 VCCO - VCC1V2   - IO_L5P_T0U_N8_AD14P_64
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12789"] ;# Bank  64 VCCO - VCC1V2   - IO_L5P_T0U_N8_AD14P_64
+#set_property PACKAGE_PIN AN14     [get_ports "6N12782"] ;# Bank  64 VCCO - VCC1V2   - IO_L4N_T0U_N7_DBC_AD7N_64
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12782"] ;# Bank  64 VCCO - VCC1V2   - IO_L4N_T0U_N7_DBC_AD7N_64
+#set_property PACKAGE_PIN AM14     [get_ports "6N12783"] ;# Bank  64 VCCO - VCC1V2   - IO_L4P_T0U_N6_DBC_AD7P_64
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12783"] ;# Bank  64 VCCO - VCC1V2   - IO_L4P_T0U_N6_DBC_AD7P_64
+#set_property PACKAGE_PIN AN18     [get_ports "6N12780"] ;# Bank  64 VCCO - VCC1V2   - IO_L3N_T0L_N5_AD15N_64
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12780"] ;# Bank  64 VCCO - VCC1V2   - IO_L3N_T0L_N5_AD15N_64
+#set_property PACKAGE_PIN AM18     [get_ports "6N12781"] ;# Bank  64 VCCO - VCC1V2   - IO_L3P_T0L_N4_AD15P_64
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12781"] ;# Bank  64 VCCO - VCC1V2   - IO_L3P_T0L_N4_AD15P_64
+#set_property PACKAGE_PIN AP13     [get_ports "6N12774"] ;# Bank  64 VCCO - VCC1V2   - IO_L2N_T0L_N3_64
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12774"] ;# Bank  64 VCCO - VCC1V2   - IO_L2N_T0L_N3_64
+#set_property PACKAGE_PIN AN13     [get_ports "6N12775"] ;# Bank  64 VCCO - VCC1V2   - IO_L2P_T0L_N2_64
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12775"] ;# Bank  64 VCCO - VCC1V2   - IO_L2P_T0L_N2_64
+#set_property PACKAGE_PIN AP17     [get_ports "6N12772"] ;# Bank  64 VCCO - VCC1V2   - IO_L1N_T0L_N1_DBC_64
+#set_property IOSTANDARD  LVCMOSxx [get_ports "6N12772"] ;# Bank  64 VCCO - VCC1V2   - IO_L1N_T0L_N1_DBC_64
+#set_property PACKAGE_PIN AP18     [get_ports "6N12773"] ;# Bank  64 VCCO - VCC1V2   - IO_L1P_T0L_N0_DBC_64
+#set_property IOSTANDARD  LVCMOSxxn [get_ports "6N12773"] ;# Bank  64 VCCO - VCC1V2   - IO_L1P_T0L_N0_DBC_64
+#Other net   PACKAGE_PIN AG16     - 6N11370                   Bank  64 - VREF_64
+#Other net   PACKAGE_PIN AD9      - MGT1V2                    Bank 224 - MGTAVTTRCAL_R
+#Other net   PACKAGE_PIN A24      - MIO0_QSPI_LWR_CLK         Bank 500 - PS_MIO0
+#Other net   PACKAGE_PIN C24      - MIO1_QSPI_LWR_DQ1         Bank 500 - PS_MIO1
+#Other net   PACKAGE_PIN F26      - 53N7803                   Bank 500 - PS_MIO10
+#Other net   PACKAGE_PIN B26      - 53N7806                   Bank 500 - PS_MIO11
+#Other net   PACKAGE_PIN C27      - 53N7809                   Bank 500 - PS_MIO12
+#Other net   PACKAGE_PIN D27      - 53N7788                   Bank 500 - PS_MIO13
+#Other net   PACKAGE_PIN A27      - 53N7844                   Bank 500 - PS_MIO14
+#Other net   PACKAGE_PIN E27      - 53N7842                   Bank 500 - PS_MIO15
+#Other net   PACKAGE_PIN A28      - MIO16_I2C1_SCL            Bank 500 - PS_MIO16
+#Other net   PACKAGE_PIN C29      - MIO17_I2C1_SDA            Bank 500 - PS_MIO17
+#Other net   PACKAGE_PIN F27      - UART0_TXD_MIO18_RXD       Bank 500 - PS_MIO18
+#Other net   PACKAGE_PIN B28      - UART0_RXD_MIO19_TXD       Bank 500 - PS_MIO19
+#Other net   PACKAGE_PIN B24      - MIO2_QSPI_LWR_DQ2         Bank 500 - PS_MIO2
+#Other net   PACKAGE_PIN E29      - UART1_RXD_MIO20_TXD       Bank 500 - PS_MIO20
+#Other net   PACKAGE_PIN C28      - UART1_TXD_MIO21_RXD       Bank 500 - PS_MIO21
+#Other net   PACKAGE_PIN F28      - 53N7824                   Bank 500 - PS_MIO22
+#Other net   PACKAGE_PIN B29      - 53N7822                   Bank 500 - PS_MIO23
+#Other net   PACKAGE_PIN E28      - MIO24_CAN_TX              Bank 500 - PS_MIO24
+#Other net   PACKAGE_PIN D29      - MIO25_CAN_RX              Bank 500 - PS_MIO25
+#Other net   PACKAGE_PIN E25      - MIO3_QSPI_LWR_DQ3         Bank 500 - PS_MIO3
+#Other net   PACKAGE_PIN A25      - MIO4_QSPI_LWR_DQ0         Bank 500 - PS_MIO4
+#Other net   PACKAGE_PIN D25      - MIO5_QSPI_LWR_CS_B        Bank 500 - PS_MIO5
+#Other net   PACKAGE_PIN A26      - 53N6816                   Bank 500 - PS_MIO6
+#Other net   PACKAGE_PIN B25      - 53N7794                   Bank 500 - PS_MIO7
+#Other net   PACKAGE_PIN D26      - 53N7797                   Bank 500 - PS_MIO8
+#Other net   PACKAGE_PIN C26      - 53N7800                   Bank 500 - PS_MIO9
+#Other net   PACKAGE_PIN AA25     - PS_SYSMON_AVCC            Bank 500 - VCC_PSADC
+#Other net   PACKAGE_PIN AA24     - PS_SYSMON_AGND            Bank 500 - GND_PSADC
+#Other net   PACKAGE_PIN A29      - 53N7791                   Bank 501 - PS_MIO26
+#Other net   PACKAGE_PIN A30      - MIO27_DP_AUX_OUT          Bank 501 - PS_MIO27
+#Other net   PACKAGE_PIN A31      - MIO28_DP_HPD              Bank 501 - PS_MIO28
+#Other net   PACKAGE_PIN A32      - MIO29_DP_OE               Bank 501 - PS_MIO29
+#Other net   PACKAGE_PIN A33      - MIO30_DP_AUX_IN           Bank 501 - PS_MIO30
+#Other net   PACKAGE_PIN B30      - 53N7736                   Bank 501 - PS_MIO31
+#Other net   PACKAGE_PIN B31      - 53N7739                   Bank 501 - PS_MIO32
+#Other net   PACKAGE_PIN B33      - 53N7742                   Bank 501 - PS_MIO33
+#Other net   PACKAGE_PIN B34      - 53N7745                   Bank 501 - PS_MIO34
+#Other net   PACKAGE_PIN C31      - 53N7748                   Bank 501 - PS_MIO35
+#Other net   PACKAGE_PIN C32      - 53N7751                   Bank 501 - PS_MIO36
+#Other net   PACKAGE_PIN C33      - 53N7754                   Bank 501 - PS_MIO37
+#Other net   PACKAGE_PIN C34      - 53N7768                   Bank 501 - PS_MIO38
+#Other net   PACKAGE_PIN D30      - 53N7771                   Bank 501 - PS_MIO39
+#Other net   PACKAGE_PIN D31      - 53N7773                   Bank 501 - PS_MIO40
+#Other net   PACKAGE_PIN D32      - 53N7775                   Bank 501 - PS_MIO41
+#Other net   PACKAGE_PIN D34      - 53N7777                   Bank 501 - PS_MIO42
+#Other net   PACKAGE_PIN E30      - 53N6798                   Bank 501 - PS_MIO43
+#Other net   PACKAGE_PIN E32      - 53N7783                   Bank 501 - PS_MIO44
+#Other net   PACKAGE_PIN E33      - MIO45_SDIO_DETECT         Bank 501 - PS_MIO45
+#Other net   PACKAGE_PIN E34      - MIO46_SDIO_DAT0_R         Bank 501 - PS_MIO46
+#Other net   PACKAGE_PIN F30      - MIO47_SDIO_DAT1_R         Bank 501 - PS_MIO47
+#Other net   PACKAGE_PIN F31      - MIO48_SDIO_DAT2_R         Bank 501 - PS_MIO48
+#Other net   PACKAGE_PIN F32      - MIO49_SDIO_DAT3_R         Bank 501 - PS_MIO49
+#Other net   PACKAGE_PIN F33      - MIO50_SDIO_CMD_R          Bank 501 - PS_MIO50
+#Other net   PACKAGE_PIN F34      - MIO51_SDIO_CLK_R          Bank 501 - PS_MIO51
+#Other net   PACKAGE_PIN G29      - MIO52_USB_CLK             Bank 502 - PS_MIO52
+#Other net   PACKAGE_PIN G30      - MIO53_USB_DIR             Bank 502 - PS_MIO53
+#Other net   PACKAGE_PIN G31      - MIO54_USB_DATA2_R         Bank 502 - PS_MIO54
+#Other net   PACKAGE_PIN G33      - MIO55_USB_NXT             Bank 502 - PS_MIO55
+#Other net   PACKAGE_PIN G34      - MIO56_USB_DATA0_R         Bank 502 - PS_MIO56
+#Other net   PACKAGE_PIN H29      - MIO57_USB_DATA1_R         Bank 502 - PS_MIO57
+#Other net   PACKAGE_PIN H31      - MIO58_USB_STP_R           Bank 502 - PS_MIO58
+#Other net   PACKAGE_PIN H32      - MIO59_USB_DATA3_R         Bank 502 - PS_MIO59
+#Other net   PACKAGE_PIN H33      - MIO60_USB_DATA4_R         Bank 502 - PS_MIO60
+#Other net   PACKAGE_PIN H34      - MIO61_USB_DATA5_R         Bank 502 - PS_MIO61
+#Other net   PACKAGE_PIN J29      - MIO62_USB_DATA6_R         Bank 502 - PS_MIO62
+#Other net   PACKAGE_PIN J30      - MIO63_USB_DATA7_R         Bank 502 - PS_MIO63
+#Other net   PACKAGE_PIN J31      - MIO64_ENET_TX_CLK         Bank 502 - PS_MIO64
+#Other net   PACKAGE_PIN J32      - MIO65_ENET_TX_D0          Bank 502 - PS_MIO65
+#Other net   PACKAGE_PIN J34      - MIO66_ENET_TX_D1          Bank 502 - PS_MIO66
+#Other net   PACKAGE_PIN K28      - MIO67_ENET_TX_D2          Bank 502 - PS_MIO67
+#Other net   PACKAGE_PIN K29      - MIO68_ENET_TX_D3          Bank 502 - PS_MIO68
+#Other net   PACKAGE_PIN K30      - MIO69_ENET_TX_CTRL        Bank 502 - PS_MIO69
+#Other net   PACKAGE_PIN K31      - MIO70_ENET_RX_CLK         Bank 502 - PS_MIO70
+#Other net   PACKAGE_PIN K32      - MIO71_ENET_RX_D0          Bank 502 - PS_MIO71
+#Other net   PACKAGE_PIN K33      - MIO72_ENET_RX_D1          Bank 502 - PS_MIO72
+#Other net   PACKAGE_PIN K34      - MIO73_ENET_RX_D2          Bank 502 - PS_MIO73
+#Other net   PACKAGE_PIN L29      - MIO74_ENET_RX_D3          Bank 502 - PS_MIO74
+#Other net   PACKAGE_PIN L30      - MIO75_ENET_RX_CTRL        Bank 502 - PS_MIO75
+#Other net   PACKAGE_PIN L33      - MIO76_ENET_MDC            Bank 502 - PS_MIO76
+#Other net   PACKAGE_PIN L34      - MIO77_ENET_MDIO           Bank 502 - PS_MIO77
+#Other net   PACKAGE_PIN N24      - PS_DONE                   Bank 503 - PS_DONE
+#Other net   PACKAGE_PIN T25      - PS_ERR_OUT                Bank 503 - PS_ERROR_OUT
+#Other net   PACKAGE_PIN R25      - PS_ERR_STATUS             Bank 503 - PS_ERROR_STATUS
+#Other net   PACKAGE_PIN P24      - PS_INIT_B                 Bank 503 - PS_INIT_B
+#Other net   PACKAGE_PIN K27      - FPGA_TCK                  Bank 503 - PS_JTAG_TCK
+#Other net   PACKAGE_PIN J27      - FPGA_TDI                  Bank 503 - PS_JTAG_TDI
+#Other net   PACKAGE_PIN G28      - FPGA_TDO_FMC_TDI          Bank 503 - PS_JTAG_TDO
+#Other net   PACKAGE_PIN H28      - FPGA_TMS                  Bank 503 - PS_JTAG_TMS
+#Other net   PACKAGE_PIN H27      - PS_MODE0                  Bank 503 - PS_MODE0
+#Other net   PACKAGE_PIN J26      - PS_MODE1                  Bank 503 - PS_MODE1
+#Other net   PACKAGE_PIN K26      - PS_MODE2                  Bank 503 - PS_MODE2
+#Other net   PACKAGE_PIN K25      - PS_MODE3                  Bank 503 - PS_MODE3
+#Other net   PACKAGE_PIN M25      - PS_PADI                   Bank 503 - PS_PADI
+#Other net   PACKAGE_PIN L25      - PS_PADO                   Bank 503 - PS_PADO
+#Other net   PACKAGE_PIN M24      - PS_POR_B                  Bank 503 - PS_POR_B
+#Other net   PACKAGE_PIN T24      - PS_PROG_B                 Bank 503 - PS_PROG_B
+#Other net   PACKAGE_PIN R24      - PS_REF_CLK                Bank 503 - PS_REF_CLK
+#Other net   PACKAGE_PIN P25      - PS_SRST_B                 Bank 503 - PS_SRST_B
+#Other net   PACKAGE_PIN AN34     - DDR4_A0                   Bank 504 - PS_DDR_A0
+#Other net   PACKAGE_PIN AM34     - DDR4_A1                   Bank 504 - PS_DDR_A1
+#Other net   PACKAGE_PIN AG31     - DDR4_A10                  Bank 504 - PS_DDR_A10
+#Other net   PACKAGE_PIN AF31     - DDR4_A11                  Bank 504 - PS_DDR_A11
+#Other net   PACKAGE_PIN AG30     - DDR4_A12                  Bank 504 - PS_DDR_A12
+#Other net   PACKAGE_PIN AF30     - DDR4_A13                  Bank 504 - PS_DDR_A13
+#Other net   PACKAGE_PIN AG29     - DDR4_A14_WE_B             Bank 504 - PS_DDR_A14
+#Other net   PACKAGE_PIN AG28     - DDR4_A15_CAS_B            Bank 504 - PS_DDR_A15
+#Other net   PACKAGE_PIN AF28     - DDR4_A16_RAS_B            Bank 504 - PS_DDR_A16
+#Other net   PACKAGE_PIN AF26     - 68N6692                   Bank 504 - PS_DDR_A17
+#Other net   PACKAGE_PIN AM33     - DDR4_A2                   Bank 504 - PS_DDR_A2
+#Other net   PACKAGE_PIN AL34     - DDR4_A3                   Bank 504 - PS_DDR_A3
+#Other net   PACKAGE_PIN AL33     - DDR4_A4                   Bank 504 - PS_DDR_A4
+#Other net   PACKAGE_PIN AK33     - DDR4_A5                   Bank 504 - PS_DDR_A5
+#Other net   PACKAGE_PIN AK30     - DDR4_A6                   Bank 504 - PS_DDR_A6
+#Other net   PACKAGE_PIN AJ30     - DDR4_A7                   Bank 504 - PS_DDR_A7
+#Other net   PACKAGE_PIN AJ31     - DDR4_A8                   Bank 504 - PS_DDR_A8
+#Other net   PACKAGE_PIN AH31     - DDR4_A9                   Bank 504 - PS_DDR_A9
+#Other net   PACKAGE_PIN AE25     - DDR4_ACT_B                Bank 504 - PS_DDR_ACT_N
+#Other net   PACKAGE_PIN AB26     - DDR4_ALERT_B              Bank 504 - PS_DDR_ALERT_N
+#Other net   PACKAGE_PIN AE27     - DDR4_BA0                  Bank 504 - PS_DDR_BA0
+#Other net   PACKAGE_PIN AE28     - DDR4_BA1                  Bank 504 - PS_DDR_BA1
+#Other net   PACKAGE_PIN AD27     - DDR4_BG0                  Bank 504 - PS_DDR_BG0
+#Other net   PACKAGE_PIN AF27     - 68N7393                   Bank 504 - PS_DDR_BG1
+#Other net   PACKAGE_PIN AL31     - DDR4_CK_T                 Bank 504 - PS_DDR_CK0
+#Other net   PACKAGE_PIN AL30     - 68N7399                   Bank 504 - PS_DDR_CK1
+#Other net   PACKAGE_PIN AN33     - DDR4_CKE                  Bank 504 - PS_DDR_CKE0
+#Other net   PACKAGE_PIN AH32     - 68N7405                   Bank 504 - PS_DDR_CKE1
+#Other net   PACKAGE_PIN AN32     - DDR4_CK_C                 Bank 504 - PS_DDR_CK_N0
+#Other net   PACKAGE_PIN AL32     - 68N7402                   Bank 504 - PS_DDR_CK_N1
+#Other net   PACKAGE_PIN AP33     - DDR4_CS_B                 Bank 504 - PS_DDR_CS_N0
+#Other net   PACKAGE_PIN AK32     - 68N7396                   Bank 504 - PS_DDR_CS_N1
+#Other net   PACKAGE_PIN AN24     - DDR4_DM0                  Bank 504 - PS_DDR_DM0
+#Other net   PACKAGE_PIN AM29     - DDR4_DM1                  Bank 504 - PS_DDR_DM1
+#Other net   PACKAGE_PIN AH24     - DDR4_DM2                  Bank 504 - PS_DDR_DM2
+#Other net   PACKAGE_PIN AJ29     - DDR4_DM3                  Bank 504 - PS_DDR_DM3
+#Other net   PACKAGE_PIN AD29     - DDR4_DM4                  Bank 504 - PS_DDR_DM4
+#Other net   PACKAGE_PIN Y29      - DDR4_DM5                  Bank 504 - PS_DDR_DM5
+#Other net   PACKAGE_PIN AC32     - DDR4_DM6                  Bank 504 - PS_DDR_DM6
+#Other net   PACKAGE_PIN Y32      - DDR4_DM7                  Bank 504 - PS_DDR_DM7
+#Other net   PACKAGE_PIN AF34     - 68N7353                   Bank 504 - PS_DDR_DM8
+#Other net   PACKAGE_PIN AP27     - DDR4_DQ0                  Bank 504 - PS_DDR_DQ0
+#Other net   PACKAGE_PIN AP25     - DDR4_DQ1                  Bank 504 - PS_DDR_DQ1
+#Other net   PACKAGE_PIN AP29     - DDR4_DQ10                 Bank 504 - PS_DDR_DQ10
+#Other net   PACKAGE_PIN AP28     - DDR4_DQ11                 Bank 504 - PS_DDR_DQ11
+#Other net   PACKAGE_PIN AM31     - DDR4_DQ12                 Bank 504 - PS_DDR_DQ12
+#Other net   PACKAGE_PIN AP31     - DDR4_DQ13                 Bank 504 - PS_DDR_DQ13
+#Other net   PACKAGE_PIN AN31     - DDR4_DQ14                 Bank 504 - PS_DDR_DQ14
+#Other net   PACKAGE_PIN AM30     - DDR4_DQ15                 Bank 504 - PS_DDR_DQ15
+#Other net   PACKAGE_PIN AF25     - DDR4_DQ16                 Bank 504 - PS_DDR_DQ16
+#Other net   PACKAGE_PIN AG25     - DDR4_DQ17                 Bank 504 - PS_DDR_DQ17
+#Other net   PACKAGE_PIN AG26     - DDR4_DQ18                 Bank 504 - PS_DDR_DQ18
+#Other net   PACKAGE_PIN AJ25     - DDR4_DQ19                 Bank 504 - PS_DDR_DQ19
+#Other net   PACKAGE_PIN AP26     - DDR4_DQ2                  Bank 504 - PS_DDR_DQ2
+#Other net   PACKAGE_PIN AG24     - DDR4_DQ20                 Bank 504 - PS_DDR_DQ20
+#Other net   PACKAGE_PIN AK25     - DDR4_DQ21                 Bank 504 - PS_DDR_DQ21
+#Other net   PACKAGE_PIN AJ24     - DDR4_DQ22                 Bank 504 - PS_DDR_DQ22
+#Other net   PACKAGE_PIN AK24     - DDR4_DQ23                 Bank 504 - PS_DDR_DQ23
+#Other net   PACKAGE_PIN AH28     - DDR4_DQ24                 Bank 504 - PS_DDR_DQ24
+#Other net   PACKAGE_PIN AH27     - DDR4_DQ25                 Bank 504 - PS_DDR_DQ25
+#Other net   PACKAGE_PIN AJ27     - DDR4_DQ26                 Bank 504 - PS_DDR_DQ26
+#Other net   PACKAGE_PIN AK27     - DDR4_DQ27                 Bank 504 - PS_DDR_DQ27
+#Other net   PACKAGE_PIN AL26     - DDR4_DQ28                 Bank 504 - PS_DDR_DQ28
+#Other net   PACKAGE_PIN AL27     - DDR4_DQ29                 Bank 504 - PS_DDR_DQ29
+#Other net   PACKAGE_PIN AM26     - DDR4_DQ3                  Bank 504 - PS_DDR_DQ3
+#Other net   PACKAGE_PIN AH29     - DDR4_DQ30                 Bank 504 - PS_DDR_DQ30
+#Other net   PACKAGE_PIN AL28     - DDR4_DQ31                 Bank 504 - PS_DDR_DQ31
+#Other net   PACKAGE_PIN AB29     - DDR4_DQ32                 Bank 504 - PS_DDR_DQ32
+#Other net   PACKAGE_PIN AB30     - DDR4_DQ33                 Bank 504 - PS_DDR_DQ33
+#Other net   PACKAGE_PIN AC29     - DDR4_DQ34                 Bank 504 - PS_DDR_DQ34
+#Other net   PACKAGE_PIN AD32     - DDR4_DQ35                 Bank 504 - PS_DDR_DQ35
+#Other net   PACKAGE_PIN AC31     - DDR4_DQ36                 Bank 504 - PS_DDR_DQ36
+#Other net   PACKAGE_PIN AE30     - DDR4_DQ37                 Bank 504 - PS_DDR_DQ37
+#Other net   PACKAGE_PIN AC28     - DDR4_DQ38                 Bank 504 - PS_DDR_DQ38
+#Other net   PACKAGE_PIN AE29     - DDR4_DQ39                 Bank 504 - PS_DDR_DQ39
+#Other net   PACKAGE_PIN AP24     - DDR4_DQ4                  Bank 504 - PS_DDR_DQ4
+#Other net   PACKAGE_PIN AC27     - DDR4_DQ40                 Bank 504 - PS_DDR_DQ40
+#Other net   PACKAGE_PIN AA27     - DDR4_DQ41                 Bank 504 - PS_DDR_DQ41
+#Other net   PACKAGE_PIN AA28     - DDR4_DQ42                 Bank 504 - PS_DDR_DQ42
+#Other net   PACKAGE_PIN AB28     - DDR4_DQ43                 Bank 504 - PS_DDR_DQ43
+#Other net   PACKAGE_PIN W27      - DDR4_DQ44                 Bank 504 - PS_DDR_DQ44
+#Other net   PACKAGE_PIN W29      - DDR4_DQ45                 Bank 504 - PS_DDR_DQ45
+#Other net   PACKAGE_PIN W28      - DDR4_DQ46                 Bank 504 - PS_DDR_DQ46
+#Other net   PACKAGE_PIN V27      - DDR4_DQ47                 Bank 504 - PS_DDR_DQ47
+#Other net   PACKAGE_PIN AA32     - DDR4_DQ48                 Bank 504 - PS_DDR_DQ48
+#Other net   PACKAGE_PIN AA33     - DDR4_DQ49                 Bank 504 - PS_DDR_DQ49
+#Other net   PACKAGE_PIN AL25     - DDR4_DQ5                  Bank 504 - PS_DDR_DQ5
+#Other net   PACKAGE_PIN AA34     - DDR4_DQ50                 Bank 504 - PS_DDR_DQ50
+#Other net   PACKAGE_PIN AE34     - DDR4_DQ51                 Bank 504 - PS_DDR_DQ51
+#Other net   PACKAGE_PIN AD34     - DDR4_DQ52                 Bank 504 - PS_DDR_DQ52
+#Other net   PACKAGE_PIN AB31     - DDR4_DQ53                 Bank 504 - PS_DDR_DQ53
+#Other net   PACKAGE_PIN AC34     - DDR4_DQ54                 Bank 504 - PS_DDR_DQ54
+#Other net   PACKAGE_PIN AC33     - DDR4_DQ55                 Bank 504 - PS_DDR_DQ55
+#Other net   PACKAGE_PIN AA30     - DDR4_DQ56                 Bank 504 - PS_DDR_DQ56
+#Other net   PACKAGE_PIN Y30      - DDR4_DQ57                 Bank 504 - PS_DDR_DQ57
+#Other net   PACKAGE_PIN AA31     - DDR4_DQ58                 Bank 504 - PS_DDR_DQ58
+#Other net   PACKAGE_PIN W30      - DDR4_DQ59                 Bank 504 - PS_DDR_DQ59
+#Other net   PACKAGE_PIN AM25     - DDR4_DQ6                  Bank 504 - PS_DDR_DQ6
+#Other net   PACKAGE_PIN Y33      - DDR4_DQ60                 Bank 504 - PS_DDR_DQ60
+#Other net   PACKAGE_PIN W33      - DDR4_DQ61                 Bank 504 - PS_DDR_DQ61
+#Other net   PACKAGE_PIN W34      - DDR4_DQ62                 Bank 504 - PS_DDR_DQ62
+#Other net   PACKAGE_PIN Y34      - DDR4_DQ63                 Bank 504 - PS_DDR_DQ63
+#Other net   PACKAGE_PIN AF32     - 68N7356                   Bank 504 - PS_DDR_DQ64
+#Other net   PACKAGE_PIN AE32     - 68N7359                   Bank 504 - PS_DDR_DQ65
+#Other net   PACKAGE_PIN AH33     - 68N7362                   Bank 504 - PS_DDR_DQ66
+#Other net   PACKAGE_PIN AE33     - 68N7364                   Bank 504 - PS_DDR_DQ67
+#Other net   PACKAGE_PIN AF33     - 68N7368                   Bank 504 - PS_DDR_DQ68
+#Other net   PACKAGE_PIN AH34     - 68N7370                   Bank 504 - PS_DDR_DQ69
+#Other net   PACKAGE_PIN AM24     - DDR4_DQ7                  Bank 504 - PS_DDR_DQ7
+#Other net   PACKAGE_PIN AJ34     - 68N7374                   Bank 504 - PS_DDR_DQ70
+#Other net   PACKAGE_PIN AK34     - 68N7376                   Bank 504 - PS_DDR_DQ71
+#Other net   PACKAGE_PIN AM28     - DDR4_DQ8                  Bank 504 - PS_DDR_DQ8
+#Other net   PACKAGE_PIN AN28     - DDR4_DQ9                  Bank 504 - PS_DDR_DQ9
+#Other net   PACKAGE_PIN AN27     - DDR4_DQS0_C               Bank 504 - PS_DDR_DQS_N0
+#Other net   PACKAGE_PIN AP30     - DDR4_DQS1_C               Bank 504 - PS_DDR_DQS_N1
+#Other net   PACKAGE_PIN AJ26     - DDR4_DQS2_C               Bank 504 - PS_DDR_DQS_N2
+#Other net   PACKAGE_PIN AK29     - DDR4_DQS3_C               Bank 504 - PS_DDR_DQS_N3
+#Other net   PACKAGE_PIN AD31     - DDR4_DQS4_C               Bank 504 - PS_DDR_DQS_N4
+#Other net   PACKAGE_PIN Y28      - DDR4_DQS5_C               Bank 504 - PS_DDR_DQS_N5
+#Other net   PACKAGE_PIN AB34     - DDR4_DQS6_C               Bank 504 - PS_DDR_DQS_N6
+#Other net   PACKAGE_PIN W32      - DDR4_DQS7_C               Bank 504 - PS_DDR_DQS_N7
+#Other net   PACKAGE_PIN AG34     - 68N7350                   Bank 504 - PS_DDR_DQS_N8
+#Other net   PACKAGE_PIN AN26     - DDR4_DQS0_T               Bank 504 - PS_DDR_DQS_P0
+#Other net   PACKAGE_PIN AN29     - DDR4_DQS1_T               Bank 504 - PS_DDR_DQS_P1
+#Other net   PACKAGE_PIN AH26     - DDR4_DQS2_T               Bank 504 - PS_DDR_DQS_P2
+#Other net   PACKAGE_PIN AK28     - DDR4_DQS3_T               Bank 504 - PS_DDR_DQS_P3
+#Other net   PACKAGE_PIN AD30     - DDR4_DQS4_T               Bank 504 - PS_DDR_DQS_P4
+#Other net   PACKAGE_PIN Y27      - DDR4_DQS5_T               Bank 504 - PS_DDR_DQS_P5
+#Other net   PACKAGE_PIN AB33     - DDR4_DQS6_T               Bank 504 - PS_DDR_DQS_P6
+#Other net   PACKAGE_PIN W31      - DDR4_DQS7_T               Bank 504 - PS_DDR_DQS_P7
+#Other net   PACKAGE_PIN AG33     - 68N7347                   Bank 504 - PS_DDR_DQS_P8
+#Other net   PACKAGE_PIN AP32     - DDR4_ODT                  Bank 504 - PS_DDR_ODT0
+#Other net   PACKAGE_PIN AJ32     - 68N7408                   Bank 504 - PS_DDR_ODT1
+#Other net   PACKAGE_PIN AA26     - DDR4_PAR                  Bank 504 - PS_DDR_PARITY
+#Other net   PACKAGE_PIN AD26     - DDR4_RESET_B              Bank 504 - PS_DDR_RAM_RST_N
+#Other net   PACKAGE_PIN AC26     - SODIMM_ZQ                 Bank 504 - PS_DDR_ZQ
+#Other net   PACKAGE_PIN U34      - 69N6524                   Bank 505 - PS_MGTRRXN0_505
+#Other net   PACKAGE_PIN T32      - 69N6530                   Bank 505 - PS_MGTRRXN1_505
+#Other net   PACKAGE_PIN R34      - GT2_USB0_RX_N             Bank 505 - PS_MGTRRXN2_505
+#Other net   PACKAGE_PIN N34      - GT3_SATA1_RX_N            Bank 505 - PS_MGTRRXN3_505
+#Other net   PACKAGE_PIN U33      - 69N6521                   Bank 505 - PS_MGTRRXP0_505
+#Other net   PACKAGE_PIN T31      - 69N6527                   Bank 505 - PS_MGTRRXP1_505
+#Other net   PACKAGE_PIN R33      - GT2_USB0_RX_P             Bank 505 - PS_MGTRRXP2_505
+#Other net   PACKAGE_PIN N33      - GT3_SATA1_RX_P            Bank 505 - PS_MGTRRXP3_505
+#Other net   PACKAGE_PIN U30      - GT0_DP_TX_N               Bank 505 - PS_MGTRTXN0_505
+#Other net   PACKAGE_PIN R30      - GT1_DP_TX_N               Bank 505 - PS_MGTRTXN1_505
+#Other net   PACKAGE_PIN P32      - GT2_USB0_TX_N             Bank 505 - PS_MGTRTXN2_505
+#Other net   PACKAGE_PIN N30      - GT3_SATA1_TX_N            Bank 505 - PS_MGTRTXN3_505
+#Other net   PACKAGE_PIN U29      - GT0_DP_TX_P               Bank 505 - PS_MGTRTXP0_505
+#Other net   PACKAGE_PIN R29      - GT1_DP_TX_P               Bank 505 - PS_MGTRTXP1_505
+#Other net   PACKAGE_PIN P31      - GT2_USB0_TX_P             Bank 505 - PS_MGTRTXP2_505
+#Other net   PACKAGE_PIN N29      - GT3_SATA1_TX_P            Bank 505 - PS_MGTRTXP3_505
+#Other net   PACKAGE_PIN T28      - 69N6536                   Bank 505 - PS_MGTREFCLK0N_505
+#Other net   PACKAGE_PIN T27      - 69N6533                   Bank 505 - PS_MGTREFCLK0P_505
+#Other net   PACKAGE_PIN P28      - GTR_REF_CLK_SATA_C_N      Bank 505 - PS_MGTREFCLK1N_505
+#Other net   PACKAGE_PIN P27      - GTR_REF_CLK_SATA_C_P      Bank 505 - PS_MGTREFCLK1P_505
+#Other net   PACKAGE_PIN M28      - GTR_REF_CLK_USB3_C_N      Bank 505 - PS_MGTREFCLK2N_505
+#Other net   PACKAGE_PIN M27      - GTR_REF_CLK_USB3_C_P      Bank 505 - PS_MGTREFCLK2P_505
+#Other net   PACKAGE_PIN M32      - GTR_REF_CLK_DP_C_N        Bank 505 - PS_MGTREFCLK3N_505
+#Other net   PACKAGE_PIN M31      - GTR_REF_CLK_DP_C_P        Bank 505 - PS_MGTREFCLK3P_505
+#Other net   PACKAGE_PIN U31      - 69N5804                   Bank 505 - PS_MGTRREF_505
+#Other net   PACKAGE_PIN AE16     - VCC1V2                    Bank  64 - VCCO_64
+#Other net   PACKAGE_PIN AH15     - VCC1V2                    Bank  64 - VCCO_64
+#Other net   PACKAGE_PIN AJ18     - VCC1V2                    Bank  64 - VCCO_64
+#Other net   PACKAGE_PIN AF19     - VCC1V2                    Bank  65 - VCCO_65
+#Other net   PACKAGE_PIN AG22     - VCC1V2                    Bank  65 - VCCO_65
+#Other net   PACKAGE_PIN AK21     - VCC1V2                    Bank  65 - VCCO_65
+#Other net   PACKAGE_PIN AF9      - VCC1V2                    Bank  66 - VCCO_66
+#Other net   PACKAGE_PIN AG12     - VCC1V2                    Bank  66 - VCCO_66
+#Other net   PACKAGE_PIN AK11     - VCC1V2                    Bank  66 - VCCO_66
+#Other net   PACKAGE_PIN E21      - VCC1V8                    Bank  28 - VCCO_28
+#Other net   PACKAGE_PIN F24      - VCC1V8                    Bank  28 - VCCO_28
+#Other net   PACKAGE_PIN H20      - VCC1V8                    Bank  28 - VCCO_28
+#Other net   PACKAGE_PIN D13      - VADJ_FMC                  Bank  67 - VCCO_67
+#Other net   PACKAGE_PIN E16      - VADJ_FMC                  Bank  67 - VCCO_67
+#Other net   PACKAGE_PIN H15      - VADJ_FMC                  Bank  67 - VCCO_67
+#Other net   PACKAGE_PIN F9       - VADJ_FMC                  Bank  68 - VCCO_68
+#Other net   PACKAGE_PIN G12      - VADJ_FMC                  Bank  68 - VCCO_68
+#Other net   PACKAGE_PIN K11      - VADJ_FMC                  Bank  68 - VCCO_68
+#Other net   PACKAGE_PIN J8       - VCC3V3                    Bank  87 - VCCO_87
+#Other net   PACKAGE_PIN N10      - VCC3V3                    Bank  87 - VCCO_87
+#Other net   PACKAGE_PIN D3       - VCC3V3                    Bank  88 - VCCO_88
+#Other net   PACKAGE_PIN E6       - VCC3V3                    Bank  88 - VCCO_88
+#Other net   PACKAGE_PIN C25      - VCC1V8                    Bank 500 - VCCO_PSIO0_500
+#Other net   PACKAGE_PIN D28      - VCC1V8                    Bank 500 - VCCO_PSIO0_500
+#Other net   PACKAGE_PIN B32      - VCC1V8                    Bank 501 - VCCO_PSIO1_501
+#Other net   PACKAGE_PIN E31      - VCC1V8                    Bank 501 - VCCO_PSIO1_501
+#Other net   PACKAGE_PIN H30      - VCC1V8                    Bank 502 - VCCO_PSIO2_502
+#Other net   PACKAGE_PIN J33      - VCC1V8                    Bank 502 - VCCO_PSIO2_502
+#Other net   PACKAGE_PIN G27      - VCC1V8                    Bank 503 - VCCO_PSIO3_503
+#Other net   PACKAGE_PIN N25      - VCC1V8                    Bank 503 - VCCO_PSIO3_503
+#Other net   PACKAGE_PIN AE26     - VCC1V2                    Bank 504 - VCCO_PSDDR_504
+#Other net   PACKAGE_PIN AE31     - VCC1V2                    Bank 504 - VCCO_PSDDR_504
+#Other net   PACKAGE_PIN AG27     - VCC1V2                    Bank 504 - VCCO_PSDDR_504
+#Other net   PACKAGE_PIN AG32     - VCC1V2                    Bank 504 - VCCO_PSDDR_504
+#Other net   PACKAGE_PIN AJ28     - VCC1V2                    Bank 504 - VCCO_PSDDR_504
+#Other net   PACKAGE_PIN AJ33     - VCC1V2                    Bank 504 - VCCO_PSDDR_504
+#Other net   PACKAGE_PIN AL29     - VCC1V2                    Bank 504 - VCCO_PSDDR_504
+#Other net   PACKAGE_PIN A1       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN A34      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN A4       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AA11     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AA21     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AA29     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AA3      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AA4      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AA7      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AB1      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AB11     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AB17     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AB2      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AB27     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AB32     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AB5      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AB9      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AC11     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AC15     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AC20     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AC23     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AC3      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AC30     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AC4      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AC7      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AD1      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AD11     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AD13     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AD18     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AD2      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AD25     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AD28     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AD33     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AD5      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AE10     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AE11     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AE21     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AE3      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AE4      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AE7      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AE8      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AE9      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AF1      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AF14     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AF2      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AF24     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AF29     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AF5      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AF7      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AG17     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AG3      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AG4      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AG7      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AH1      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AH10     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AH2      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AH20     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AH25     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AH30     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AH5      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AH7      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AJ13     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AJ23     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AJ3      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AJ4      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AJ7      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AJ8      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AK1      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AK16     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AK2      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AK26     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AK31     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AK5      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AK7      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AL14     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AL19     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AL24     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AL3      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AL4      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AL7      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AL9      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AM1      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AM12     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AM17     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AM2      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AM22     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AM27     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AM32     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AM5      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AM7      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AN10     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AN15     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AN20     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AN25     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AN3      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AN30     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AN4      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AN7      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AP1      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AP2      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AP34     - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AP5      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AP7      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN B12      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN B17      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN B2       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN B22      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN B27      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN B7       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN C10      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN C15      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN C20      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN C30      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN C5       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN D18      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN D23      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN D33      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN D8       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN E11      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN E26      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN F1       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN F14      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN F19      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN F2       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN F29      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN F3       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN G17      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN G22      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN G3       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN G32      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN G4       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN G5       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN H1       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN H10      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN H2       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN H25      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN H5       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN J13      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN J18      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN J23      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN J28      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN J3       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN J4       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN J5       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN K1       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN K16      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN K2       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN K21      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN K5       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN K6       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN K7       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN L19      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN L24      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN L26      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN L27      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN L28      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN L3       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN L31      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN L32      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN L4       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN L7       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN L9       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN M1       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN M14      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN M16      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN M18      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN M2       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN M20      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN M22      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN M26      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN M29      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN M30      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN M33      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN M34      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN M5       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN M7       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN N15      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN N17      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN N19      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN N21      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN N23      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN N26      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN N28      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN N3       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN N32      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN N4       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN N7       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P1       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P10      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P11      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P14      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P16      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P18      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P2       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P20      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P22      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P26      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P30      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P33      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P34      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P5       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P7       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P8       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN P9       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN R11      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN R13      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN R15      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN R19      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN R21      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN R26      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN R28      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN R3       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN R31      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN R32      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN R4       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN R7       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN T1       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN T11      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN T14      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN T16      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN T2       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN T20      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN T23      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN T26      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN T30      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN T33      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN T34      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN T5       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN T9       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN U11      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN U12      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN U15      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN U19      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN U21      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN U24      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN U26      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN U27      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN U28      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN U3       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN U32      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN U4       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN U7       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V1       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V11      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V14      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V16      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V2       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V20      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V28      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V29      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V30      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V31      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V32      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V33      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V34      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V5       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN V9       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN W11      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN W13      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN W15      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN W17      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN W19      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN W23      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN W3       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN W4       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN W7       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN Y1       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN Y11      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN Y12      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN Y14      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN Y16      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN Y18      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN Y2       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN Y20      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN Y26      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN Y31      - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN Y5       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN Y9       - GND                       Bank 999 - GND
+#Other net   PACKAGE_PIN AA8      - MGTAVCC                   Bank 999 - MGTAVCC_R
+#Other net   PACKAGE_PIN AB10     - MGTAVCC                   Bank 999 - MGTAVCC_R
+#Other net   PACKAGE_PIN AC8      - MGTAVCC                   Bank 999 - MGTAVCC_R
+#Other net   PACKAGE_PIN R8       - MGTAVCC                   Bank 999 - MGTAVCC_R
+#Other net   PACKAGE_PIN T10      - MGTAVCC                   Bank 999 - MGTAVCC_R
+#Other net   PACKAGE_PIN U8       - MGTAVCC                   Bank 999 - MGTAVCC_R
+#Other net   PACKAGE_PIN W8       - MGTAVCC                   Bank 999 - MGTAVCC_R
+#Other net   PACKAGE_PIN AB6      - MGT1V2                    Bank 999 - MGTAVTT_R
+#Other net   PACKAGE_PIN AD6      - MGT1V2                    Bank 999 - MGTAVTT_R
+#Other net   PACKAGE_PIN AF6      - MGT1V2                    Bank 999 - MGTAVTT_R
+#Other net   PACKAGE_PIN AH6      - MGT1V2                    Bank 999 - MGTAVTT_R
+#Other net   PACKAGE_PIN AK6      - MGT1V2                    Bank 999 - MGTAVTT_R
+#Other net   PACKAGE_PIN AM6      - MGT1V2                    Bank 999 - MGTAVTT_R
+#Other net   PACKAGE_PIN AP6      - MGT1V2                    Bank 999 - MGTAVTT_R
+#Other net   PACKAGE_PIN M6       - MGT1V2                    Bank 999 - MGTAVTT_R
+#Other net   PACKAGE_PIN P6       - MGT1V2                    Bank 999 - MGTAVTT_R
+#Other net   PACKAGE_PIN T6       - MGT1V2                    Bank 999 - MGTAVTT_R
+#Other net   PACKAGE_PIN V6       - MGT1V2                    Bank 999 - MGTAVTT_R
+#Other net   PACKAGE_PIN Y6       - MGT1V2                    Bank 999 - MGTAVTT_R
+#Other net   PACKAGE_PIN V10      - MGT1V8                    Bank 999 - MGTVCCAUX_R
+#Other net   PACKAGE_PIN Y10      - MGT1V8                    Bank 999 - MGTVCCAUX_R
+#Other net   PACKAGE_PIN N27      - MGTRAVCC                  Bank 999 - PS_MGTRAVCC
+#Other net   PACKAGE_PIN R27      - MGTRAVCC                  Bank 999 - PS_MGTRAVCC
+#Other net   PACKAGE_PIN N31      - MGT1V8                    Bank 999 - PS_MGTRAVTT
+#Other net   PACKAGE_PIN P29      - MGT1V8                    Bank 999 - PS_MGTRAVTT
+#Other net   PACKAGE_PIN T29      - MGT1V8                    Bank 999 - PS_MGTRAVTT
+#Other net   PACKAGE_PIN P23      - VCC1V8                    Bank 999 - VCCAUX
+#Other net   PACKAGE_PIN R23      - VCC1V8                    Bank 999 - VCCAUX
+#Other net   PACKAGE_PIN U23      - VCC1V8                    Bank 999 - VCCAUX
+#Other net   PACKAGE_PIN V23      - VCC1V8                    Bank 999 - VCCAUX
+#Other net   PACKAGE_PIN N22      - VCC1V8                    Bank 999 - VCCAUX_IO
+#Other net   PACKAGE_PIN R22      - VCC1V8                    Bank 999 - VCCAUX_IO
+#Other net   PACKAGE_PIN T22      - VCC1V8                    Bank 999 - VCCAUX_IO
+#Other net   PACKAGE_PIN U22      - VCC1V8                    Bank 999 - VCCAUX_IO
+#Other net   PACKAGE_PIN R12      - VCCINT                    Bank 999 - VCCBRAM
+#Other net   PACKAGE_PIN T12      - VCCINT                    Bank 999 - VCCBRAM
+#Other net   PACKAGE_PIN V12      - VCCINT                    Bank 999 - VCCBRAM
+#Other net   PACKAGE_PIN W12      - VCCINT                    Bank 999 - VCCBRAM
+#Other net   PACKAGE_PIN M15      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN M17      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN M19      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN M21      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN N14      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN N16      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN N18      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN N20      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN P15      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN P17      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN P19      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN P21      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN R14      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN R16      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN R20      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN T15      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN T19      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN T21      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN U14      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN U16      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN U20      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN V15      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN V19      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN V21      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN W14      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN W16      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN W18      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN W20      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN Y15      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN Y17      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN Y19      - VCCINT                    Bank 999 - VCCINT
+#Other net   PACKAGE_PIN P13      - VCCINT                    Bank 999 - VCCINT_IO
+#Other net   PACKAGE_PIN T13      - VCCINT                    Bank 999 - VCCINT_IO
+#Other net   PACKAGE_PIN U13      - VCCINT                    Bank 999 - VCCINT_IO
+#Other net   PACKAGE_PIN V13      - VCCINT                    Bank 999 - VCCINT_IO
+#Other net   PACKAGE_PIN Y13      - VCCINT                    Bank 999 - VCCINT_IO
+#Other net   PACKAGE_PIN V26      - VCC1V8                    Bank 999 - VCC_PSAUX
+#Other net   PACKAGE_PIN W25      - VCC1V8                    Bank 999 - VCC_PSAUX
+#Other net   PACKAGE_PIN W26      - VCC1V8                    Bank 999 - VCC_PSAUX
+#Other net   PACKAGE_PIN Y25      - VCC1V8                    Bank 999 - VCC_PSAUX
+#Other net   PACKAGE_PIN Y23      - VCC_PSBATT                Bank 999 - VCC_PSBATT
+#Other net   PACKAGE_PIN U25      - VCCPSDDRPLL               Bank 999 - VCC_PSDDR_PLL
+#Other net   PACKAGE_PIN V25      - VCCPSDDRPLL               Bank 999 - VCC_PSDDR_PLL
+#Other net   PACKAGE_PIN AA23     - VCCINT                    Bank 999 - VCC_PSINTFP
+#Other net   PACKAGE_PIN AB21     - VCCINT                    Bank 999 - VCC_PSINTFP
+#Other net   PACKAGE_PIN AB22     - VCCINT                    Bank 999 - VCC_PSINTFP
+#Other net   PACKAGE_PIN AB23     - VCCINT                    Bank 999 - VCC_PSINTFP
+#Other net   PACKAGE_PIN AB24     - VCCINT                    Bank 999 - VCC_PSINTFP
+#Other net   PACKAGE_PIN AC21     - VCCINT                    Bank 999 - VCC_PSINTFP
+#Other net   PACKAGE_PIN AC22     - VCCINT                    Bank 999 - VCC_PSINTFP
+#Other net   PACKAGE_PIN AB25     - VCCINT                    Bank 999 - VCC_PSINTFP_DDR
+#Other net   PACKAGE_PIN AC24     - VCCINT                    Bank 999 - VCC_PSINTFP_DDR
+#Other net   PACKAGE_PIN AC25     - VCCINT                    Bank 999 - VCC_PSINTFP_DDR
+#Other net   PACKAGE_PIN AA22     - VCCINT                    Bank 999 - VCC_PSINTLP
+#Other net   PACKAGE_PIN V22      - VCCINT                    Bank 999 - VCC_PSINTLP
+#Other net   PACKAGE_PIN W21      - VCCINT                    Bank 999 - VCC_PSINTLP
+#Other net   PACKAGE_PIN W22      - VCCINT                    Bank 999 - VCC_PSINTLP
+#Other net   PACKAGE_PIN Y21      - VCCINT                    Bank 999 - VCC_PSINTLP
+#Other net   PACKAGE_PIN Y22      - VCCINT                    Bank 999 - VCC_PSINTLP
+#Other net   PACKAGE_PIN V24      - MGT1V2                    Bank 999 - VCC_PSPLL
+#Other net   PACKAGE_PIN W24      - MGT1V2                    Bank 999 - VCC_PSPLL
+#Other net   PACKAGE_PIN Y24      - MGT1V2                    Bank 999 - VCC_PSPLL
+#Other net   PACKAGE_PIN AD21     - VCCINT_VCU                Bank 999 - VCCINT_VCU
+#Other net   PACKAGE_PIN AD22     - VCCINT_VCU                Bank 999 - VCCINT_VCU
+#Other net   PACKAGE_PIN AD23     - VCCINT_VCU                Bank 999 - VCCINT_VCU
+#Other net   PACKAGE_PIN AD24     - VCCINT_VCU                Bank 999 - VCCINT_VCU
+
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_0]
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_1]
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_2]
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_3]
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_4]
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_5]
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_6]
+set_property IOSTANDARD LVCMOS33 [get_ports PMOD0_7]
+set_property PACKAGE_PIN G8 [get_ports PMOD0_0]
+set_property PACKAGE_PIN H8 [get_ports PMOD0_1]
+set_property PACKAGE_PIN G7 [get_ports PMOD0_2]
+set_property PACKAGE_PIN H7 [get_ports PMOD0_3]
+set_property PACKAGE_PIN G6 [get_ports PMOD0_4]
+set_property PACKAGE_PIN H6 [get_ports PMOD0_5]
+set_property PACKAGE_PIN J6 [get_ports PMOD0_6]
+set_property PACKAGE_PIN J7 [get_ports PMOD0_7]
+set_property PULLUP true [get_ports PMOD0_2]
+set_property PULLDOWN true [get_ports PMOD0_3]
+set_property PULLUP true [get_ports PMOD0_4]
+set_property PULLUP true [get_ports PMOD0_5]
+set_property PULLUP true [get_ports PMOD0_6]
+set_property PULLUP true [get_ports PMOD0_7]
+
+set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets PMOD0_7_IBUF_inst/O]
+
+#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_0]
+#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_1]
+#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_2]
+#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_3]
+#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_4]
+#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_5]
+#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_6]
+#set_property IOSTANDARD LVCMOS33 [get_ports PMOD1_7]
+#set_property PACKAGE_PIN J9  [get_ports PMOD1_0]
+#set_property PACKAGE_PIN K9  [get_ports PMOD1_1]
+#set_property PACKAGE_PIN K8  [get_ports PMOD1_2]
+#set_property PACKAGE_PIN L8  [get_ports PMOD1_3]
+#set_property PACKAGE_PIN L10 [get_ports PMOD1_4]
+#set_property PACKAGE_PIN M10 [get_ports PMOD1_5]
+#set_property PACKAGE_PIN M8  [get_ports PMOD1_6]
+#set_property PACKAGE_PIN M9  [get_ports PMOD1_7]
+
+#set_property PULLUP true [get_ports PMOD1_7]
+#set_property PULLUP true [get_ports PMOD1_6]
+#set_property PULLUP true [get_ports PMOD1_5]
+#set_property PULLUP true [get_ports PMOD1_4]
+#set_property PULLUP true [get_ports PMOD1_3]
+#set_property PULLUP true [get_ports PMOD1_2]
+#set_property PULLUP true [get_ports PMOD1_1]
+#set_property PULLUP true [get_ports PMOD1_0]
+
+
+#PMODA pin0 to FTCLK
+#set_property PACKAGE_PIN K9 [get_ports {P1[1]}]
+
+#PMODA pin1 to FTSSN
+#set_property PACKAGE_PIN L8 [get_ports {P1[3]}]
+
+#PMODA pin2 to FTMISO
+#set_property PACKAGE_PIN J9 [get_ports {P1[0]}]
+
+#PMODA pin3 to FTMIOSIO
+#set_property PACKAGE_PIN K8 [get_ports {P1[2]}]
+
+#PMODB pin1 to SWDIOTMS
+#set_property PACKAGE_PIN G8 [get_ports SWDIOTMS]
+
+#PMODB pin4 to SWCLKTCK
+#set_property PACKAGE_PIN H7 [get_ports SWCLKTCK]
+#set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets uPAD_SWDCLK_I/IOBUF3V3/O]
+
+#PMODA pin4 : UART2RXD
+#PMODA pin4 : UART2TXD
+
+
+# LED0 to P0[0]
+#set_property PACKAGE_PIN D5 [get_ports {P0[0]}]
+# LED1 to P0[1]
+#set_property PACKAGE_PIN D6 [get_ports {P0[1]}]
+# LED2 to P0[2]
+#set_property PACKAGE_PIN A5 [get_ports {P0[2]}]
+# LED3 to P0[3]
+#set_property PACKAGE_PIN B5 [get_ports {P0[3]}]
+
+# SW0 to NRST (Down for active low)
+#set_property PACKAGE_PIN B4 [get_ports NRST]
+
+# CLK125MHz (need dvider)
+#set_property IOSTANDARD LVCMOS18 [get_ports XTAL1 ]
+#set_property PACKAGE_PIN F23 [get_ports XTAL1]
+
+
+## auto mapped - to remap
+#set_property PACKAGE_PIN C4 [get_ports {P0[10]}]
+#set_property PACKAGE_PIN C3 [get_ports {P0[11]}]
+#set_property PACKAGE_PIN B3 [get_ports {P0[12]}]
+#set_property PACKAGE_PIN D2 [get_ports {P0[13]}]
+#set_property PACKAGE_PIN C2 [get_ports {P0[14]}]
+#set_property PACKAGE_PIN E3 [get_ports {P0[15]}]
+#set_property PACKAGE_PIN F6 [get_ports {P0[4]}]
+#set_property PACKAGE_PIN E5 [get_ports {P0[5]}]
+#set_property PACKAGE_PIN F5 [get_ports {P0[6]}]
+#set_property PACKAGE_PIN F4 [get_ports {P0[7]}]
+#set_property PACKAGE_PIN E4 [get_ports {P0[8]}]
+#set_property PACKAGE_PIN D4 [get_ports {P0[9]}]
+#set_property PACKAGE_PIN M10 [get_ports {P1[10]}]
+#set_property PACKAGE_PIN L10 [get_ports {P1[11]}]
+#set_property PACKAGE_PIN M9 [get_ports {P1[12]}]
+#set_property PACKAGE_PIN M8 [get_ports {P1[13]}]
+#set_property PACKAGE_PIN N11 [get_ports {P1[14]}]
+#set_property PACKAGE_PIN M11 [get_ports {P1[15]}]
+#set_property PACKAGE_PIN H8 [get_ports {P1[4]}]
+#set_property PACKAGE_PIN G7 [get_ports {P1[5]}]
+#set_property PACKAGE_PIN H6 [get_ports {P1[6]}]
+#set_property PACKAGE_PIN G6 [get_ports {P1[7]}]
+#set_property PACKAGE_PIN J7 [get_ports {P1[8]}]
+#set_property PACKAGE_PIN J6 [get_ports {P1[9]}]
+#set_property PACKAGE_PIN E2 [get_ports VDD]
+#set_property PACKAGE_PIN A3 [get_ports VDDIO]
+#set_property PACKAGE_PIN A2 [get_ports VSS]
+#set_property PACKAGE_PIN C1 [get_ports VSSIO]
+#set_property PACKAGE_PIN B1 [get_ports XTAL2]
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_synth.tcl b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_synth.tcl
new file mode 100644
index 0000000..7e6b0c2
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_synth.tcl
@@ -0,0 +1 @@
+synth_design -top nanosoc_chip -part xczu7ev-ffvc1156-2-e
diff --git a/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_timing.xdc b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_timing.xdc
new file mode 100644
index 0000000..fe6eb50
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/fpga_imp/target_fpga_zcu104/fpga_timing.xdc
@@ -0,0 +1,95 @@
+##################################################################################
+##                                                                              ##
+## ZYNQ timing XDC                                                              ##
+##                                                                              ##
+##################################################################################
+
+create_clock -name CLK -period 30 [get_ports xtal_clk_i]
+create_clock -name VCLK -period 30 -waveform {5 20}
+
+create_clock -name SWCLK -period 60 [get_ports swdclk_i]
+create_clock -name VSWCLK -period 60 -waveform {5 35}
+
+set_clock_groups -name async_clk_swclock -asynchronous \
+-group [get_clocks -include_generated_clocks CLK] \
+-group [get_clocks -include_generated_clocks VSWCLK]
+
+#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports {dip_switch_4bits_tri_i[*]}]
+#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports {dip_switch_4bits_tri_i[*]}]
+#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_2]
+#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports PMOD0_2]
+#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_3]
+#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports PMOD0_3]
+#set_output_delay -clock [get_clocks clk_pl_0] -min -add_delay 5.000 [get_ports {led_4bits_tri_o[*]}]
+#set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {led_4bits_tri_o[*]}]
+
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[0]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[0]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[1]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[1]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[2]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[2]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[3]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[3]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[4]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[4]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[5]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[5]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[6]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[6]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[7]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[7]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[8]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[8]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[9]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[9]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[10]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[10]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[11]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[11]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[12]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[12]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[13]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[13]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[14]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[14]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p0_o[15]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p0_o[15]}]
+
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[0]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[0]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[1]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[1]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[2]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[2]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[3]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[3]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[4]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[4]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[5]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[5]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[6]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[6]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[7]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[7]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[8]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[8]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[9]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[9]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[10]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[10]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[11]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[11]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[12]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[12]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[13]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[13]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[14]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[14]}]
+set_output_delay -clock [get_clocks CLK] -min -add_delay  5.000 [get_ports {p1_o[15]}]
+set_output_delay -clock [get_clocks CLK] -max -add_delay 18.000 [get_ports {p1_o[15]}]
+
+#set_property C_CLK_INPUT_FREQ_HZ 5000000 [get_debug_cores dbg_hub]
+#set_property C_ENABLE_CLK_DIVIDER false [get_debug_cores dbg_hub]
+#set_property C_USER_SCAN_CHAIN 1 [get_debug_cores dbg_hub]
+#connect_debug_port dbg_hub/clk [get_nets clk]
diff --git a/Cortex-M0/nanosoc/systems/mcu/rtl_sim/adp.cmd b/Cortex-M0/nanosoc/systems/mcu/rtl_sim/adp.cmd
new file mode 100644
index 0000000..d0b75b3
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/rtl_sim/adp.cmd
@@ -0,0 +1,29 @@
+A
+A 0
+R
+R
+A
+A
+A 
+a 10000000
+r
+r
+a 20000000
+r
+r
+a 30000000
+r
+r
+a 40006000
+r
+r
+r
+r
+a 30000200
+z 400
+A
+C 201
+
+  A
+X
+!
diff --git a/Cortex-M0/nanosoc/systems/mcu/rtl_sim/makefile b/Cortex-M0/nanosoc/systems/mcu/rtl_sim/makefile
new file mode 100644
index 0000000..9254704
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/rtl_sim/makefile
@@ -0,0 +1,555 @@
+#-----------------------------------------------------------------------------
+# customised simulation makefile
+# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+#
+# Contributors
+#
+# David Flynn (d.w.flynn@soton.ac.uk)
+#
+# Copyright � 2021-3, SoC Labs (www.soclabs.org)
+#-----------------------------------------------------------------------------
+
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M0/Cortex-M0+ System Design Kit simulation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Name of test directory (e.g. hello, dhry)
+# TESTNAME must be specified on the make command line
+TESTNAME    =
+
+# List of all tests (this is used when running 'make all/clean')
+TEST_LIST   = hello dhry sleep_demo interrupt_demo dualtimer_demo \
+ self_reset_demo watchdog_demo rtx_demo gpio_tests timer_tests \
+ uart_tests debug_tests default_slaves_tests dma_tests \
+ gpio_driver_tests uart_driver_tests timer_driver_tests apb_mux_tests \
+ memory_tests romtable_tests
+
+# Default to DS-5 tool-chain
+TOOL_CHAIN = ds5
+
+# Choose the core instantiated, can be either
+#  - CORTEX_M0PLUS (Cortex-M0+)
+#  - CORTEX_M0     (Cortex-M0)
+#  - CORTEX_M0_DS  (Cortex-M0 DesignStart version)
+#    Note: for all processors, make sure that the __MPU_PRESENT variable in the header file agrees with the setting made in
+#          the processor configuration (refer to Section 4.3.3 of the Example System Guide).  The header file is either:
+#           ../../../software/cmsis/Device/ARM/CMSDK_CM0/Include/CMSDK_CM0.h
+#           or
+#           ../../../software/cmsis/Device/ARM/CMSDK_CM0plus/Include/CMSDK_CM0plus.h
+#          to match the CPU_PRODUCT selected
+#    Note: for the M0+ processor, make sure that the __VTOR_PRESENT variable in the header file agrees with the setting made in
+#          the processor configuration (refer to Section 4.3.3 of the Example System Guide).  The header file is:
+#           ../../../software/cmsis/Device/ARM/CMSDK_CM0plus/Include/CMSDK_CM0plus.h
+#DF#CPU_PRODUCT = CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0
+
+# Select Verilog Command File based on CPU type
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+ # For Cortex-M0+ product users
+ TBENCH_VC  = ../verilog/tbench_M0P.vc
+endif
+
+# Select Verilog Command File based on CPU type
+ifeq ($(CPU_PRODUCT),CORTEX_M0)
+ # For Cortex-M0 product users
+ TBENCH_VC  = ../verilog/tbench_M0.vc
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0_DS)
+ # For Cortex-M0 DesignStart users
+ TBENCH_VC  = ../verilog/tbench_M0_DS.vc
+endif
+
+
+
+# Simulator type (mti/vcs/nc)
+SIMULATOR   = mti
+
+# MTI option
+#DF#MTI_OPTIONS    = -novopt
+MTI_OPTIONS    = 
+MTI_VC_OPTIONS = -f $(TBENCH_VC)
+
+# VCS option
+VCS_OPTIONS    = +vcs+lic+wait +v2k +lint=all,noTMR,noVCDE -debug
+VCS_SIM_OPTION = +vcs+lic+wait +vcs+flush+log -assert nopostproc
+VCS_VC_OPTIONS = -f $(TBENCH_VC)
+
+# NC verilog option
+NCSIM_OPTIONS  = -unbuffered -status -LICQUEUE -f ncsim.args -cdslib cds.lib -hdlvar hdl.var -NBASYNC
+NC_VC_OPTIONS  = -f $(TBENCH_VC)
+
+# Boot Loader image
+BOOTLOADER  = bootloader
+# Debug Tester image
+DEBUGTESTER  = debugtester
+
+
+# Software make options
+# - Pass onto the software makefile to define targetted CPU type
+# You can append additional make options for testcode here
+SW_MAKE_OPTIONS = CPU_PRODUCT=$(CPU_PRODUCT) TOOL_CHAIN=$(TOOL_CHAIN)
+
+# ------- Simulator redirect -----------
+
+compile : compile_$(SIMULATOR)
+
+
+run     : run_$(SIMULATOR)
+
+
+sim     : sim_$(SIMULATOR)
+
+
+all     : all_$(SIMULATOR)
+
+# ------- VCS -----------
+
+# Compile RTL
+compile_vcs :
+	vcs $(VCS_OPTIONS) $(VCS_VC_OPTIONS) | tee compile_vcs.log
+
+
+# Run simulation in batch mode
+run_vcs : code
+	@if [ ! -d logs ] ; then \
+	  mkdir logs; \
+	fi
+	@echo quit > quit.do
+	./simv $(VCS_SIM_OPTION)                         < quit.do | tee logs/run_$(TESTNAME).log ;
+
+# Run simulation in interactive mode
+sim_vcs : code
+	./simv -gui +vcs+lic+wait +vcs+flush+log &
+
+# Compile RTL, and run all tests in batch mode
+all_vcs : compile_vcs bootrom debugtester
+	@if [ ! -d logs ] ; then \
+	  mkdir logs; \
+	fi
+	@echo quit > quit.do
+	@echo Run tests ...
+	for thistest in $(TEST_LIST) ; do \
+	  echo $$thistest   ; \
+	  make testcode TESTNAME=$$thistest ;\
+	  if [ -e image.hex ] ; then \
+	    ./simv +vcs+lic+wait +vcs+flush+log < quit.do | tee logs/run_$$thistest.log ;\
+	  else \
+	    echo Cannot read image.hex ;\
+	    exit 1; \
+	  fi ; \
+	done
+
+# ------- NC -----------
+
+# Compile RTL
+compile_nc :
+	ncprep +overwrite $(NC_VC_OPTIONS) +debug  | tee    compile_nc.log
+	ncvlog  -work worklib -f  ncvlog.args      | tee -a compile_nc.log
+	ncelab  -mess -f ncelab.args -access +r    | tee -a compile_nc.log
+
+# Note : If coverage is required, you can add -coverage all to ncelab
+
+# Run simulation in batch mode
+run_nc : code
+	@if [ ! -d logs ] ; then \
+	  mkdir logs; \
+	fi
+	@echo run  >  run.tcl.tmp
+	@echo exit >> run.tcl.tmp
+	@mv  run.tcl.tmp run.tcl
+	ncsim $(NCSIM_OPTIONS) -input run.tcl | tee logs/run_$(TESTNAME).log ;
+
+# Run simulation in interactive mode
+sim_nc : code
+	ncsim -gui $(NCSIM_OPTIONS)
+
+# Compile RTL, and run all tests in batch mode
+all_nc : compile_nc bootrom debugtester
+	@if [ ! -d logs ] ; then \
+	  mkdir logs; \
+	fi
+	@echo run  >  run.tcl.tmp
+	@echo exit >> run.tcl.tmp
+	@mv  run.tcl.tmp run.tcl
+	@echo Run tests ...
+	for thistest in $(TEST_LIST) ; do \
+	  echo $$thistest   ; \
+	  make testcode TESTNAME=$$thistest ;\
+	  if [ -e image.hex ] ; then \
+	    ncsim $(NCSIM_OPTIONS) -input run.tcl | tee logs/run_$$thistest.log ;\
+	  else \
+	    echo Cannot read image.hex ;\
+	    exit 1; \
+	  fi ; \
+	done
+
+# ------- MTI -----------
+
+# Compile RTL
+compile_mti :
+	@if [ -d work ] ; then \
+          true ; \
+	else \
+	  vlib work; \
+	fi
+	vlog -incr -lint +v2k $(MTI_OPTIONS) $(MTI_VC_OPTIONS) | tee compile_mti.log
+
+# Run simulation in batch mode
+run_mti : code
+	@if [ ! -d logs ] ; then \
+	  mkdir logs; \
+	fi
+	vsim $(MTI_OPTIONS) -c tb_cmsdk_mcu -do "radix hex;run -all;quit -f" | tee logs/run_$(TESTNAME).log ;
+
+# Run simulation in interactive mode
+sim_mti : code
+	vsim $(MTI_OPTIONS) -gui tb_cmsdk_mcu &
+
+# Create work directory
+lib_mti :
+	vlib work
+
+# Compile RTL, and run all tests in batch mode
+all_mti : compile_mti bootrom debugtester
+	@if [ ! -d logs ] ; then \
+	  mkdir logs; \
+	fi
+	@echo Run tests ...
+	for thistest in $(TEST_LIST) ; do \
+	  echo $$thistest   ; \
+	  make testcode TESTNAME=$$thistest ;\
+	  if [ -e image.hex ] ; then \
+	    vsim $(MTI_OPTIONS) -c tb_cmsdk_mcu -do "radix hex;run -all;quit -f" | tee logs/run_$$thistest.log ;\
+	  else \
+	    echo Cannot read image.hex ;\
+	    exit 1; \
+	  fi ; \
+	done
+
+# ------- Software -----------
+
+# code target is used by other simulation targets (e.g. run_mti, sim_mti)
+# Before simulation, bootrom and testcode need to be compiled.
+code : testcode bootrom debugtester
+
+# Compile bootloader
+# Note : The use of ls after compile allows the computing server to sync up
+bootrom:
+	@(cd ../testcodes/$(BOOTLOADER) ;\
+	make all $(SW_MAKE_OPTIONS) ;\
+	echo Compile done ;\
+	ls > /dev/null ;\
+	echo Copy $(BOOTLOADER).hex ;\
+	if [ -e  $(BOOTLOADER).hex ] ; then \
+	  cp $(BOOTLOADER).hex  ../../rtl_sim/$(BOOTLOADER).hex ;\
+	else \
+	  while [ ! -e $(BOOTLOADER).hex ] ; do \
+	    echo Wait for hex file ...; \
+	    ls > /dev/null; \
+	    sleep 5; \
+	  done; \
+	  if [ -e  $(BOOTLOADER).hex ] ; then \
+	    cp $(BOOTLOADER).hex  ../../rtl_sim/$(BOOTLOADER).hex ;\
+	  else \
+	    echo Problem reading hex file ;\
+	    exit 1; \
+	  fi ;\
+	fi ;\
+	cp $(BOOTLOADER).hex  ../../rtl_sim/$(BOOTLOADER).hex ;\
+	cd ../../rtl_sim )
+
+# Compile test code
+# Note : The use of ls after compile allows the computing server to sync up
+testcode:
+ifeq ($(TESTNAME),)
+	$(error Please specify TESTNAME on the make command line)
+endif
+	@(if [ -d "../testcodes/$(TESTNAME)" ] ; then \
+	  cd ../testcodes/$(TESTNAME) ;\
+	  make all $(SW_MAKE_OPTIONS) ; \
+	  echo Compile done ;\
+	  ls > /dev/null ;\
+	  echo Copy $(TESTNAME).hex ;\
+	  if [ -e  $(TESTNAME).hex ] ; then \
+	    cp $(TESTNAME).hex ../../rtl_sim/image.hex ; \
+	  else \
+	    while [ ! -e $(TESTNAME).hex ] ; do \
+	      echo Wait for $(TESTNAME).hex file ...; \
+	      ls > /dev/null ; \
+	      sleep 5 ; \
+	    done; \
+	    if [ -e  $(TESTNAME).hex ] ; then \
+	      cp $(TESTNAME).hex ../../rtl_sim/image.hex ; \
+	    else \
+	      echo Problem reading hex file ;\
+	      exit 1; \
+	    fi ;\
+	  fi ;\
+	  cd ../../rtl_sim ;\
+	else \
+	  echo "ERROR: invalid TESTNAME value ( $(TESTNAME) )" ;\
+	  exit 1 ;\
+	fi ;\
+	)
+
+
+# Compile debugtester
+# Note : The use of ls after compile allows the computing server to sync up
+debugtester:
+	@(cd ../../../software/debug_tester ;\
+	make all $(SW_MAKE_OPTIONS) ;\
+	echo Compile done ;\
+	ls > /dev/null ;\
+	echo Copy $(DEBUGTESTER)_le.hex ;\
+	if [ -e  $(DEBUGTESTER)_le.hex ] ; then \
+	  cp $(DEBUGTESTER)_le.hex  ../../systems/mcu/rtl_sim/$(DEBUGTESTER)_le.hex ;\
+	else \
+	  while [ ! -e $(DEBUGTESTER)_le.hex ] ; do \
+	    echo Wait for hex file ...; \
+	    ls > /dev/null ; \
+	    sleep 5 ; \
+	  done; \
+	  if [ -e  $(DEBUGTESTER)_le.hex ] ; then \
+	    cp $(DEBUGTESTER)_le.hex  ../../systems/mcu/rtl_sim/$(DEBUGTESTER)_le.hex ;\
+	  fi ;\
+	fi ;\
+	echo Copy $(DEBUGTESTER)_be.hex ;\
+	if [ -e  $(DEBUGTESTER)_be.hex ] ; then \
+	  cp $(DEBUGTESTER)_be.hex  ../../systems/mcu/rtl_sim/$(DEBUGTESTER)_be.hex ;\
+	else \
+	  while [ ! -e $(DEBUGTESTER)_be.hex ] ; do \
+	    echo Wait for hex file ...;\
+	    ls > /dev/null ;\
+	    sleep 5 ; \
+	  done; \
+	  if [ -e  $(DEBUGTESTER)_be.hex ] ; then \
+	    cp $(DEBUGTESTER)_be.hex  ../../systems/mcu/rtl_sim/$(DEBUGTESTER)_be.hex ;\
+	  fi ;\
+	fi ;\
+	if [ ! -e $(DEBUGTESTER)_le.hex ] && [ ! -e $(DEBUGTESTER)_be.hex ] ; then \
+	    echo Problem reading hex file ;\
+	    exit 1 ;\
+	fi ;\
+	cd ../../systems/mcu/rtl_sim )
+
+# Compile all software including boot ROM
+compile_all_code: bootrom debugtester
+	for thistest in $(TEST_LIST) ; do \
+	  echo Compiling $$thistest   ; \
+	  echo Removing old image.hex ;\
+	  rm -f image.hex  ;\
+	  make testcode TESTNAME=$$thistest;\
+	  if [ -e image.hex ] ; then \
+            echo OK    - image.hex     created for test $$thistest ;\
+	  else \
+	    echo ERROR - image.hex NOT created for test $$thistest ;\
+	    exit 1; \
+	  fi ; \
+	done
+
+# ------- document with v2html -----------
+
+# 
+#	rm -Rf *
+#	../tools/v2html -f ../verilog/v2html_M0.vc -ht cmsdk_mcu_system
+#	cp -p tb_cmsdk_mcu.v.html hierarchy.html
+
+v2html:
+	echo building HTML tree
+	@if [ ! -d ../v2html_doc ] ; then \
+	  mkdir ../v2html_doc; \
+	fi
+	@(cd ../v2html_doc; \
+	rm *.html; rm *.gif; rm *.gz; \
+	~/tools/v2html -f ../verilog/v2html_M0.vc -ht nanosoc_chip ; \
+	cp -p tb_nanosoc.v.html hierarchy.html ; \
+	cd ../rtl_sim ; )
+	gtar zcvf ../v2html_doc.tgz ../v2html_doc
+
+
+# Remove all software compilation results
+clean_all_code:
+	@(cd ../../../software/debug_tester ; make clean; cd ../../systems/mcu/rtl_sim; )
+	@(cd ../testcodes/$(BOOTLOADER) ; make clean; cd ../../rtl_sim; )
+	for thistest in $(TEST_LIST) ; do \
+	  echo Cleaning $$thistest ...  ; \
+	  cd ../testcodes/$$thistest ; \
+	  make clean; \
+	  cd ../../rtl_sim; \
+	done
+
+# Remove only bootloader and default selected test
+clean_code:
+	@(cd ../testcodes/$(BOOTLOADER) ; make clean; cd ../../rtl_sim; )
+	@(cd ../testcodes/$(TESTNAME)   ; make clean; cd ../../rtl_sim; )
+
+# ------- clean -----------
+
+# Remove RTL compile files, log files, software compile files
+clean : clean_all_code
+	@if [ -d work ] ; then \
+	  rm -rf work ; \
+	fi
+	@if [ -e tarmac0.log ] ; then \
+	  rm tarmac0.log ; \
+	fi
+	@if [ -e tarmac1.log ] ; then \
+	  rm tarmac1.log ; \
+	fi
+	@if [ -e tarmac0track.log ] ; then \
+	  rm tarmac0track.log ; \
+	fi
+	@if [ -e ft1248_ip.log ] ; then \
+	  rm ft1248_ip.log ; \
+	fi
+	@if [ -e ft1248_op.log ] ; then \
+	  rm ft1248_op.log ; \
+	fi
+	@if [ -e uart.log ] ; then \
+	  rm uart.log ; \
+	fi
+	@if [ -e uart0.log ] ; then \
+	  rm uart0.log ; \
+	fi
+	@if [ -e uart1.log ] ; then \
+	  rm uart1.log ; \
+	fi
+	@if [ -e uart2.log ] ; then \
+	  rm uart2.log ; \
+	fi
+	@if [ -e uart3.log ] ; then \
+	  rm uart3.log ; \
+	fi
+	@if [ -e vsim.wlf ] ; then \
+	  rm vsim.wlf ; \
+	fi
+	@if [ -e image.hex ] ; then \
+	  rm image.hex ; \
+	fi
+	@if [ -e date_file ] ; then \
+	  rm date_file ; \
+	fi
+	@if [ -e bootrom.v ] ; then \
+	  rm bootrom.v ; \
+	fi
+	@if [ -e bootrom.bintxt ] ; then \
+	  rm bootrom.bintxt ; \
+	fi
+	@if [ -e bootloader.hex ] ; then \
+	  rm bootloader.hex ; \
+	fi
+	@if [ -e debugtester_le.hex ] ; then \
+	  rm debugtester_le.hex ; \
+	fi
+	@if [ -e debugtester_be.hex ] ; then \
+	  rm debugtester_be.hex ; \
+	fi
+	@if [ -e compile_mti.log ] ; then \
+	  rm  compile_mti.log ; \
+	fi
+	@if [ -e vish_stacktrace.vstf ] ; then \
+	  rm  vish_stacktrace.vstf ; \
+	fi
+	@if [ -e compile_vcs.log ] ; then \
+	  rm  compile_vcs.log ; \
+	fi
+	@if [ -e compile_nc.log ] ; then \
+	  rm  compile_nc.log ; \
+	fi
+	@if [ -e transcript ] ; then \
+	  rm  transcript ; \
+	fi
+	@if [ -e simv ] ; then \
+	  rm  simv ; \
+	fi
+	@if [ -d csrc ] ; then \
+	  rm -rf csrc ; \
+	fi
+	@if [ -d simv.daidir ] ; then \
+	  rm -rf simv.daidir ; \
+	fi
+	@if [ -e inter.vpd ] ; then \
+	  rm -rf inter.vpd ; \
+	fi
+	@if [ -e quit.do ] ; then \
+	  rm -rf quit.do ; \
+	fi
+	@if [ -e ucli.key ] ; then \
+	  rm -rf ucli.key ; \
+	fi
+	@if [ -d DVEfiles ] ; then \
+	  rm -rf DVEfiles ; \
+	fi
+	@if [ -d INCA_libs ] ; then \
+	  rm -rf INCA_libs ; \
+	fi
+	@if [ -d cov_work ] ; then \
+	  rm -rf cov_work ; \
+	fi
+	@if [ -e hdl.var ] ; then \
+	  rm -rf hdl.var ; \
+	fi
+	@if [ -e ncelab.args ] ; then \
+	  rm -rf ncelab.args ; \
+	fi
+	@if [ -e ncvlog.args ] ; then \
+	  rm -rf ncvlog.args ; \
+	fi
+	@if [ -e ncsim.args ] ; then \
+	  rm -rf ncsim.args ; \
+	fi
+	@if [ -e ncprep.log ] ; then \
+	  rm -rf ncprep.log ; \
+	fi
+	@if [ -e ncelab.log ] ; then \
+	  rm -rf ncelab.log ; \
+	fi
+	@if [ -e ncvlog.log ] ; then \
+	  rm -rf ncvlog.log ; \
+	fi
+	@if [ -e ncsim.log ] ; then \
+	  rm -rf ncsim.log ; \
+	fi
+	@if [ -e run.tcl ] ; then \
+	  rm -rf run.tcl ; \
+	fi
+	@if [ -e RUN_NC ] ; then \
+	  rm -rf RUN_NC ; \
+	fi
+	@if [ -e ncsim.key ] ; then \
+	  rm -rf ncsim.key ; \
+	fi
+	@if [ -e cds.lib ] ; then \
+	  rm -rf cds.lib ; \
+	fi
+	@if [ -e logs ] ; then \
+	  rm -rf logs ; \
+	fi
+	@if [ -e ../v2html_doc ] ; then \
+	  rm -rf ../v2html_doc ; \
+	fi
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvopt
new file mode 100644
index 0000000..59bbba0
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvopt
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\apb_mux_tests.c</PathWithFileName>
+      <FilenameWithoutPath>apb_mux_tests.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvproj
new file mode 100644
index 0000000..9b96ead
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0.uvproj
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>apb_mux_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output apb_mux_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>apb_mux_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\apb_mux_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvopt
new file mode 100644
index 0000000..e735ca8
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvopt
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\apb_mux_tests.c</PathWithFileName>
+      <FilenameWithoutPath>apb_mux_tests.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvproj
new file mode 100644
index 0000000..f19bc04
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/apb_mux_tests_cm0p.uvproj
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>apb_mux_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output apb_mux_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>apb_mux_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\apb_mux_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/makefile
new file mode 100644
index 0000000..3705c8b
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/apb_mux_tests/makefile
@@ -0,0 +1,251 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = apb_mux_tests
+
+# Endian Option
+COMPILE_BIGEND  = 0
+
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST        = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# D5-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+		   -I $(SOFTWARE_DIR)/common/retarget $(USER_DEFINE)
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		   --rw_base 0x20000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+	armlink $(ARM_LINK_OPTIONS) -o $@  $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output  $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF makefile
+	fromelf -c -d -e -s $< --output  $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+                -I $(SOFTWARE_DIR)/common/retarget  \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvopt
new file mode 100644
index 0000000..54e406f
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvopt
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\bootloader\bootloader.c</PathWithFileName>
+      <FilenameWithoutPath>bootloader.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvproj
new file mode 100644
index 0000000..cadb326
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0.uvproj
@@ -0,0 +1,425 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>bootloader</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output bootloader.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x1000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>bootloader.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\bootloader\bootloader.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvopt
new file mode 100644
index 0000000..d7a2948
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvopt
@@ -0,0 +1,216 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\bootloader\bootloader.c</PathWithFileName>
+      <FilenameWithoutPath>bootloader.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvproj
new file mode 100644
index 0000000..ba95d12
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/bootloader_cm0p.uvproj
@@ -0,0 +1,422 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>bootloader</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output bootloader.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x1000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>bootloader.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\bootloader\bootloader.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/makefile
new file mode 100644
index 0000000..c62e321
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/bootloader/makefile
@@ -0,0 +1,254 @@
+#//-----------------------------------------------------------------------------
+#// customised Cortex-M0 'nanosoc' controller
+#// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+#//
+#// Contributors
+#//
+#// David Flynn (d.w.flynn@soton.ac.uk)
+#//
+#// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+#//-----------------------------------------------------------------------------
+
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+BOOTLOADER     = bootloader
+
+# Endian Option
+COMPILE_BIGEND = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST       = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime -I $(DEVICE_DIR)/Include -I $(CORE_DIR) $(USER_DEFINE)
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x30000000 --ro_base 0x10000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS  += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_bootloader.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+all_ds5 : $(BOOTLOADER).hex $(BOOTLOADER).lst
+
+$(BOOTLOADER).o :  $(SOFTWARE_DIR)/common/bootloader/$(BOOTLOADER).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(BOOTLOADER).ELF : $(BOOTLOADER).o $(SYSTEM_FILE).o $(STARTUP_FILE).o $(DEPS_LIST)
+	armlink $(ARM_LINK_OPTIONS) $(BOOTLOADER).o $(SYSTEM_FILE).o  $(STARTUP_FILE).o -o $@
+
+$(BOOTLOADER).hex : $(BOOTLOADER).ELF $(DEPS_LIST)
+	fromelf --vhx --8x1 $< --output $@
+
+$(BOOTLOADER).lst : $(BOOTLOADER).ELF $(DEPS_LIST)
+	fromelf -c -d -e -s $< --output $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/bootloader/$(BOOTLOADER).c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(BOOTLOADER).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(BOOTLOADER).o > $(BOOTLOADER).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(BOOTLOADER).o -O binary $(BOOTLOADER).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(BOOTLOADER).o --adjust-vma -0x10000000 -O verilog $(BOOTLOADER).hex
+
+# Note:
+# Objcopy use --adjust-vma so that the Verilog hex address start at address 0 instead of actual address 0x10000000
+#
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(BOOTLOADER).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(BOOTLOADER).bin > $(BOOTLOADER).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+clean :
+	@rm -rf *.o
+	@if [ -e $(BOOTLOADER).hex ] ; then \
+	  rm -rf $(BOOTLOADER).hex ; \
+	fi
+	@if [ -e $(BOOTLOADER).lst ] ; then \
+	  rm -rf $(BOOTLOADER).lst ; \
+	fi
+	@if [ -e $(BOOTLOADER).ELF ] ; then \
+	  rm -rf $(BOOTLOADER).ELF ; \
+	fi
+	@if [ -e $(BOOTLOADER).bin ] ; then \
+	  rm -rf $(BOOTLOADER).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvopt
new file mode 100644
index 0000000..c834b4c
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvopt
@@ -0,0 +1,293 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\debug_tests\debug_tests.c</PathWithFileName>
+      <FilenameWithoutPath>debug_tests.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\generic\mcu_debugtester_interface.c</PathWithFileName>
+      <FilenameWithoutPath>mcu_debugtester_interface.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>7</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</PathWithFileName>
+      <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvproj
new file mode 100644
index 0000000..4571bb5
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0.uvproj
@@ -0,0 +1,445 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>debug_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output debug_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget; ..\..\..\..\software\debug_tester; ..\..\..\..\software\common\debug_tests; ..\generic</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>debug_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\debug_tests\debug_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>mcu_debugtester_interface.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\generic\mcu_debugtester_interface.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+            <File>
+              <FileName>CMSDK_driver.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvopt
new file mode 100644
index 0000000..80d160b
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvopt
@@ -0,0 +1,272 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\debug_tests\debug_tests.c</PathWithFileName>
+      <FilenameWithoutPath>debug_tests.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\generic\mcu_debugtester_interface.c</PathWithFileName>
+      <FilenameWithoutPath>mcu_debugtester_interface.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>7</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</PathWithFileName>
+      <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvproj
new file mode 100644
index 0000000..ab2bfbb
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/debug_tests_cm0p.uvproj
@@ -0,0 +1,442 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>debug_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output debug_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget; ..\..\..\..\software\debug_tester; ..\..\..\..\software\common\debug_tests; ..\generic</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>debug_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\debug_tests\debug_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>mcu_debugtester_interface.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\generic\mcu_debugtester_interface.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+            <File>
+              <FileName>CMSDK_driver.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/makefile
new file mode 100644
index 0000000..bb0cdf6
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/debug_tests/makefile
@@ -0,0 +1,265 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2010-08-06 12:28:21 +0100 (Fri, 06 Aug 2010) $
+#
+#      Revision            : $Revision: 145378 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+GENERIC_DIR  = ../generic
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = debug_tests
+
+# Endian Option
+COMPILE_BIGEND  = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST        = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# Configuration ID values
+GENERIC_FILE = $(GENERIC_DIR)/config_id.h
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime $(USER_DEFINE) -I $(GENERIC_DIR) \
+		-I $(DEVICE_DIR)/Include  -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget \
+		-I $(SOFTWARE_DIR)/debug_tester
+ARM_ASM_OPTIONS  = -g
+
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/debug_tests/$(TESTNAME).c $(SOFTWARE_DIR)/common/debug_tests/$(TESTNAME).h $(GENERIC_FILE) $(SOFTWARE_DIR)/debug_tester/debugtester_functions.h $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@
+
+mcu_debugtester_interface.o : $(GENERIC_DIR)/mcu_debugtester_interface.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@
+
+CMSDK_driver.o : $(DEVICE_DIR)/Source/CMSDK_driver.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@
+
+$(TESTNAME).ELF: $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o mcu_debugtester_interface.o
+	armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o mcu_debugtester_interface.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF
+	fromelf -c -d -e -s $< --output $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/debug_tests/$(TESTNAME).c \
+		$(GENERIC_DIR)/mcu_debugtester_interface.c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/CMSDK_driver.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+		-I $(GENERIC_DIR) \
+		-I $(SOFTWARE_DIR)/common/retarget \
+		-I $(SOFTWARE_DIR)/debug_tester \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvopt
new file mode 100644
index 0000000..cd7bd16
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvopt
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\default_slaves_tests.c</PathWithFileName>
+      <FilenameWithoutPath>default_slaves_tests.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvproj
new file mode 100644
index 0000000..dc2614c
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0.uvproj
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>default_slaves_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output default_slaves_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>default_slaves_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\default_slaves_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvopt
new file mode 100644
index 0000000..5b56980
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvopt
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\default_slaves_tests.c</PathWithFileName>
+      <FilenameWithoutPath>default_slaves_tests.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvproj
new file mode 100644
index 0000000..9b1eb99
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/default_slaves_tests_cm0p.uvproj
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>default_slaves_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output default_slaves_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>default_slaves_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\default_slaves_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/makefile
new file mode 100644
index 0000000..2437c5c
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/default_slaves_tests/makefile
@@ -0,0 +1,251 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = default_slaves_tests
+
+# Endian Option
+COMPILE_BIGEND  = 0
+
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST        = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime $(USER_DEFINE) \
+        	-I $(DEVICE_DIR)/Include  -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+	armlink $(ARM_LINK_OPTIONS) -o $@  $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output  $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF makefile
+	fromelf -c -d -e -s $< --output  $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+                -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+                -I $(SOFTWARE_DIR)/common/retarget \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvopt
new file mode 100644
index 0000000..41e4c6c
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvopt
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\dhry\dhry_1.c</PathWithFileName>
+      <FilenameWithoutPath>dhry_1.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\dhry\dhry_2.c</PathWithFileName>
+      <FilenameWithoutPath>dhry_2.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvproj
new file mode 100644
index 0000000..ecbc35d
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0.uvproj
@@ -0,0 +1,440 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>dhry</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output dhry.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>1</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls>-Ono_inline --no_inline --no_multifile -Oloopref  </MiscControls>
+              <Define>CORTEX_M0 USE_PRINT ITERATIONS=200 MSC_CLOCK EXPECTED_SYST</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>dhry_1.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\dhry\dhry_1.c</FilePath>
+            </File>
+            <File>
+              <FileName>dhry_2.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\dhry\dhry_2.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvopt
new file mode 100644
index 0000000..0eea87d
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvopt
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\dhry\dhry_1.c</PathWithFileName>
+      <FilenameWithoutPath>dhry_1.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\dhry\dhry_2.c</PathWithFileName>
+      <FilenameWithoutPath>dhry_2.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvproj
new file mode 100644
index 0000000..b5b42b1
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/dhry_cm0p.uvproj
@@ -0,0 +1,437 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>dhry</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output dhry.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>1</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls>-Ono_inline --no_inline --no_multifile -Oloopref  </MiscControls>
+              <Define>CORTEX_M0PLUS USE_PRINT ITERATIONS=200 MSC_CLOCK EXPECTED_SYST</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>dhry_1.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\dhry\dhry_1.c</FilePath>
+            </File>
+            <File>
+              <FileName>dhry_2.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\dhry\dhry_2.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/makefile
new file mode 100644
index 0000000..70c1b5d
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/makefile
@@ -0,0 +1,260 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = dhry
+
+# Endian Option
+COMPILE_BIGEND  = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS -DITERATIONS=200
+else
+  USER_DEFINE    = -DCORTEX_M0 -DITERATIONS=200
+endif
+
+DEPS_LIST        = makefile
+DHRY_ARMCC_OPTION   = -Ono_inline --no_inline --no_multifile -Oloopref
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime \
+        	-I $(CORE_DIR) -I $(DEVICE_DIR)/Include -I $(SOFTWARE_DIR)/common/retarget \
+		-I $(SOFTWARE_DIR)/common/dhry \
+        	$(DHRY_ARMCC_OPTION) $(USER_DEFINE)
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x30000000 --ro_base 0x00000000 --map
+
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE) -fno-inline -fno-common -Wl,-Map -Wl,$(TESTNAME).map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+dhry_1.o :  $(SOFTWARE_DIR)/common/dhry/dhry_1.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@
+
+dhry_2.o :  $(SOFTWARE_DIR)/common/dhry/dhry_2.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o $@
+
+
+$(TESTNAME).ELF : dhry_1.o dhry_2.o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+	armlink $(ARM_LINK_OPTIONS) -o $@ dhry_1.o dhry_2.o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output $@
+
+
+$(TESTNAME).lst : $(TESTNAME).ELF
+	fromelf -c -d -e -s $< --output $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/dhry/dhry_1.c \
+		$(SOFTWARE_DIR)/common/dhry/dhry_2.c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+                -I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget \
+		-I $(SOFTWARE_DIR)/common/dhry \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/transcript b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/transcript
new file mode 100644
index 0000000..58d44cd
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dhry/transcript
@@ -0,0 +1,14 @@
+# //  Questa Sim-64
+# //  Version 10.7c linux_x86_64 Aug 17 2018
+# //
+# //  Copyright 1991-2018 Mentor Graphics Corporation
+# //  All Rights Reserved.
+# //
+# //  QuestaSim and its associated documentation contain trade
+# //  secrets and commercial or financial information that are the property of
+# //  Mentor Graphics Corporation and are privileged, confidential,
+# //  and exempt from disclosure under the Freedom of Information Act,
+# //  5 U.S.C. Section 552. Furthermore, this information
+# //  is prohibited from disclosure under the Trade Secrets Act,
+# //  18 U.S.C. Section 1905.
+# //
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvopt
new file mode 100644
index 0000000..ad90f6c
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvopt
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\dma_tests.c</PathWithFileName>
+      <FilenameWithoutPath>dma_tests.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvproj
new file mode 100644
index 0000000..7487889
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0.uvproj
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>dma_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output dma_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget; ..\generic</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>dma_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\dma_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvopt
new file mode 100644
index 0000000..617768f
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvopt
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\dma_tests.c</PathWithFileName>
+      <FilenameWithoutPath>dma_tests.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvproj
new file mode 100644
index 0000000..b453d95
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/dma_tests_cm0p.uvproj
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>dma_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output dma_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget; ..\generic</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>dma_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\dma_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/makefile
new file mode 100644
index 0000000..c4aff4d
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dma_tests/makefile
@@ -0,0 +1,253 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+GENERIC_DIR  = ../generic
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = dma_tests
+
+# Endian Option
+COMPILE_BIGEND  = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST        = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# Configuration ID values
+GENERIC_FILE = $(GENERIC_DIR)/config_id.h
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime $(USER_DEFINE) -I $(GENERIC_DIR) \
+        	-I $(DEVICE_DIR)/Include  -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(GENERIC_FILE) $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+	armlink $(ARM_LINK_OPTIONS) -o $@  $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output  $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF makefile
+	fromelf -c -d -e -s $< --output  $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) -I $(GENERIC_DIR) \
+		-I $(SOFTWARE_DIR)/common/retarget \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvopt
new file mode 100644
index 0000000..32eab05
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvopt
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\demos\dualtimer_demo.c</PathWithFileName>
+      <FilenameWithoutPath>dualtimer_demo.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvproj
new file mode 100644
index 0000000..19d2564
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0.uvproj
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>dualtimer_demo</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output dualtimer_demo.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>dualtimer_demo.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\demos\dualtimer_demo.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvopt
new file mode 100644
index 0000000..97f2811
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvopt
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\demos\dualtimer_demo.c</PathWithFileName>
+      <FilenameWithoutPath>dualtimer_demo.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvproj
new file mode 100644
index 0000000..22abff1
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/dualtimer_demo_cm0p.uvproj
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>dualtimer_demo</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output dualtimer_demo.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>dualtimer_demo.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\demos\dualtimer_demo.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/makefile
new file mode 100644
index 0000000..6863911
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/dualtimer_demo/makefile
@@ -0,0 +1,250 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = dualtimer_demo
+
+# Endian Option
+COMPILE_BIGEND = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST       = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option (DS-5)
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime -I $(DEVICE_DIR)/Include  -I $(CORE_DIR) \
+		   -I $(SOFTWARE_DIR)/common/retarget $(USER_DEFINE)
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		   --rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+	armlink $(ARM_LINK_OPTIONS) $(TESTNAME).o $(SYSTEM_FILE).o  $(STARTUP_FILE).o retarget.o uart_stdout.o -o $@
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output $@
+
+
+$(TESTNAME).lst : $(TESTNAME).ELF
+	fromelf -c -d -e -s $< --output $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/demos/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+                -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+                -I $(SOFTWARE_DIR)/common/retarget \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/config_id.h b/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/config_id.h
new file mode 100644
index 0000000..3a4f01b
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/config_id.h
@@ -0,0 +1,408 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//-----------------------------------------------------------------------------
+//
+
+#define TEST_PASS 0
+#define TEST_FAIL 1
+//==============================================================================
+// Cortex-M0+ & Cortex-M0 IDs header File
+//==============================================================================
+
+// Values used by generic tests, such as debug_tests, romtable_tests
+
+#ifdef CORTEX_M0PLUS
+#define MCU_CPU_NAME "Cortex-M0+"
+#define MCU_CPU_ID_VALUE  0x410cc601
+#define MCU_DP_IDR_VALUE  0x0BC11477
+#define MCU_AP_IDR_VALUE  0x04770031
+#define MCU_AP_BASE_VALUE 0xF0000003
+#else
+#define MCU_CPU_NAME "Cortex-M0"
+#define MCU_CPU_ID_VALUE  0x410cc200
+#define MCU_DP_IDR_VALUE  0x0BB11477
+#define MCU_AP_IDR_VALUE  0x04770021
+#define MCU_AP_BASE_VALUE 0xE00FF003
+#endif
+
+//==============================================================================
+//
+// GenericID values - DO NOT MODIFY
+//
+
+// CoreSight Component Identifier for Peripheral classes
+#define CORESIGHT_CID0          0x0D
+#define CORESIGHT_CID1_tbl      0x10
+#define CORESIGHT_CID1_dbg      0x90
+#define CORESIGHT_CID1_mem      0xE0
+#define CORESIGHT_CID1_prm      0xF0
+#define CORESIGHT_CID2          0x05
+#define CORESIGHT_CID3          0xB1
+
+// Component Part Numbers
+#define ARM_JEP_ID              0x3B
+#define ARM_JEP_CONT            0x4
+
+//==============================================================================
+//
+// Cortex-M0 ID values
+#define CORTEXM0_CPUID          0x410cc200
+
+#define CM0_CPU_PART            0x471
+#define CM0_SCS_PART            0x008
+#define CM0_DWT_PART            0x00A
+#define CM0_BPU_PART            0x00B
+#define CM0_CPU_PART            0x471
+#define CM0_CSI_PART            0x4C2
+#define CS_CTI_PART             0x906
+#define CM0_DAP_DP_PART         0xBB
+
+// Revision Codes
+#define CM0_ROM_REV             0x0
+#define CM0_SCS_REV             0x0
+#define CM0_DWT_REV             0x0
+#define CM0_BPU_REV             0x0
+
+// Revand
+#define CM0_ROM_ECO             0x0
+#define CM0_SCS_ECO             0x0
+#define CM0_DWT_ECO             0x0
+#define CM0_BPU_ECO             0x0
+
+#define CORTEXM0DAP_JTAG_TAPID  0x0BA01477
+#define CORTEXM0DAP_JTAG_DPIDR  0x0BB11477
+#define CORTEXM0DAP_SW_DPIDR    0x0BB11477
+#define CORTEXM0DAP_AP_IDR      0x04770021
+
+#define CORTEXM0_ROM_PID3       0x00
+#define CORTEXM0_SCS_PID3       0x00
+#define CORTEXM0_DWT_PID3       0x00
+#define CORTEXM0_BPU_PID3       0x00
+
+//==============================================================================
+//
+// Cortex-M0+ ID values
+#define CORTEXM0PLUS_CPUID      (0x410cc601 ^ (EXPECTED_ECOREVNUM & 0x0000000F))
+
+#define CM0P_CPU_PART           0x4C0
+#define CM0P_SCS_PART           0x008
+#define CM0P_DWT_PART           0x00A
+#define CM0P_BPU_PART           0x00B
+#define CM0P_MTB_PART           0x932
+#define CM0P_CSI_PART           0x4C1
+#define CM0P_CTI_PART           0x9A6
+#define CM0P_DAP_DP_PART        0xBC
+
+// Revision Codes
+#define CM0P_ROM_REV            0x0
+#define CM0P_SCS_REV            0x0
+#define CM0P_DWT_REV            0x0
+#define CM0P_BPU_REV            0x0
+#define CM0P_MTB_REV            0x1
+#define CM0P_DAP_DP_REV         (0x0 ^ ((EXPECTED_ECOREVNUM & 0x0F000000) >> 24))
+#define CM0P_DAP_AP_REV         (0x0 ^ ((EXPECTED_ECOREVNUM & 0x00F00000) >> 20))
+
+// Revand
+#define CM0P_ROM_ECO            ((EXPECTED_ECOREVNUM & 0x000F0000) >> 16)
+#define CM0P_SCS_ECO            ((EXPECTED_ECOREVNUM & 0x0000F000) >> 12)
+#define CM0P_DWT_ECO            ((EXPECTED_ECOREVNUM & 0x00000F00) >>  8)
+#define CM0P_BPU_ECO            ((EXPECTED_ECOREVNUM & 0x000000F0) >>  4)
+#define CM0P_MTB_ECO            ((EXPECTED_ECOREVNUM & 0xF0000000) >> 28)
+
+// DAP Registers
+#define CM0P_DAP_JTAG_TAPID     (0x0BA01477 | (CM0P_DAP_DP_REV << 28))
+#define CM0P_DAP_JTAG_DPIDR     (0x0BC11477 | (CM0P_DAP_DP_REV << 28))
+#define CM0P_DAP_SW_DPIDR       (0x0BC11477 | (CM0P_DAP_DP_REV << 28))
+#define CM0P_DAP_SWMD_DPIDR     (0x0BC12477 | (CM0P_DAP_DP_REV << 28))
+#define CM0P_DAP_APIDR          (0x04770031 | (CM0P_DAP_AP_REV << 28))
+
+//==============================================================================
+
+//=====================================================================
+// Cortex-M0 & Cortex-M0+ Configuration
+//=====================================================================
+
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Processor configuration options.
+//  These must match the expected hardware configuration of the processor.
+//
+//  - EXPECTED_BE            : Expected Endianness (0-1)
+//  - EXPECTED_BKPT          : Expected number of Breakpoint Comparators (0-4)
+//  - EXPECTED_DBG           : Expected Debug config (0-1)
+//  - EXPECTED_NUMIRQ        : Expected number of IRQ lines (0-32)
+//  - EXPECTED_SMUL          : Expected Multiplier config (0-1)
+//  - EXPECTED_SYST          : Expected SysTick extension (0-1)
+//  - EXPECTED_WPT           : Expected number of Watchpoint Comparators (0-2)
+//
+//  Processor Tie-offs
+//
+//  - EXPECTED_STCALIB       : Expected value of STCALIB (0-0x3FFFFFF)
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+//  System ROM Table options.
+//  These must match the values in the System ROM Table.
+//
+//  - EXPECTED_CUST_JEP_ID   : Expected JEDEC JEP-106 identity code (0-0x7F)
+//  - EXPECTED_CUST_JEP_CONT : Expected JEDEC JEP-106 continuation code (0-0xF)
+//  - EXPECTED_CUST_PART     : Expected Part number (0-0xFFF)
+//  - EXPECTED_CUST_REV      : Expected Revision number (0-0xF)
+//  - EXPECTED_CUST_REVAND   : Expected Manufacturer Revision number (0-0xF)
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Engineering Change Order and Revision Number Tie-off.
+//
+//  - EXPECTED_ECOREVNUM     : Expected Engineering Change Order and Revision number (0-0xFFFFFFFF)
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// <h> Processor configuration options
+// <o> EXPECTED_BE: Expected Endianness <0=> Little Endian <1=> Big Endian
+#define EXPECTED_BE             0
+
+
+// <o> EXPECTED_BKPT: Expected number of Breakpoint Comparators <0-4>
+#define EXPECTED_BKPT           4
+
+
+// <o> EXPECTED_DBG: Expected Debug config <0=> Absent <1=> Present
+#define EXPECTED_DBG            1
+
+
+// <o> EXPECTED_NUMIRQ: Expected number of IRQ lines <0-32>
+#define EXPECTED_NUMIRQ         32
+
+
+// <o> EXPECTED_SMUL: Expected Small Multiplier config <0=> Absent (Fast Multiplier) <1=> Present (Small Multiplier)
+#define EXPECTED_SMUL           0
+
+
+// <o> EXPECTED_SYST: Expected SysTick extension <0=> Absent <1=> Present
+#define EXPECTED_SYST           1
+
+
+// <o> EXPECTED_WPT: Expected number of Watchpoint Comparators <0-2>
+#define EXPECTED_WPT            2
+
+
+// <o> EXPECTED_SIMPLE_CHECK:  <1=> only run the simple CPUID check <0=> more complex check included
+// like Lockup, Sleep, other ID check etc
+#define EXPECTED_SIMPLE_CHECK   0
+
+
+// <h> Processor port Tie-Offs
+// <o> EXPECTED_STCALIB: Expected value of STCALIB[25:0] at CORTEXM0INTEGRATION or CORTEXM0 <0x0-0x3FFFFFF>
+#define EXPECTED_STCALIB	0x1028B0A
+
+
+// <o> EXPECTED_BASEADDR: Expected value of BASEADDR[31:0] at CORTEXM0DAP <0x0-0xFFFFFFFF>
+#ifdef CORTEX_M0
+#define EXPECTED_BASEADDR	0xE00FF003
+#else
+#define EXPECTED_BASEADDR	0xF0000003
+#endif
+
+// <o> EXPECTED_JTAGnSW: Expected Cortex M0(+) DAP Protocol <0=> Serial Wire <1=> JTAG
+#define EXPECTED_JTAGnSW        0
+
+// <h> System ROM Table ID values
+// <o> EXPECTED_CUST_JEP_ID: Expected JEDEC JEP-106 identity code (0-0x7F)
+#define EXPECTED_CUST_JEP_ID    0x00
+
+
+// <o> EXPECTED_CUST_JEP_CONT: Expected JEDEC JEP-106 continuation code (0-0xF)
+#define EXPECTED_CUST_JEP_CONT  0x0
+
+
+// <o> EXPECTED_CUST_PART: Expected Part number (0-0xFFF)
+#define EXPECTED_CUST_PART      0x000
+
+
+// <o> EXPECTED_CUST_REV: Expected Revision number (0-0xF)
+#define EXPECTED_CUST_REV       0x0
+
+
+// <o> EXPECTED_CUST_REVAND: Expected Manufacturer Revision number (0-0xF)
+#define EXPECTED_CUST_REVAND    0x0
+
+// </h>
+
+// <h> EXPECTED_ECOREVNUM
+// <o> EXPECTED_ECOREVNUM: Expected Engineering Change Order and Revision number (0-0xFFFFFFFF)
+#define EXPECTED_ECOREVNUM      0x00000000
+
+// </h>
+
+// <h> CSI and CTI - Used by romtable test only
+// <o> EXPECTED_CSI: Expected CoreSight Integration Level <0=> Absent <1=> Present
+#define EXPECTED_CSI            0
+
+// <o> EXPECTED_CTI: Expected Cross Trigger Interface <0=> Absent <1=> Present
+#define EXPECTED_CTI            0
+// </h>
+
+//=====================================================================
+// Cortex-M0+ Configuration
+//=====================================================================
+
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Processor configuration options.
+//  These must match the expected hardware configuration of the processor.
+//
+//  - EXPECTED_BE            : Expected Endianness (0-1)
+//  - EXPECTED_BKPT          : Expected number of Breakpoint Comparators (0-4)
+//  - EXPECTED_DBG           : Expected Debug config (0-1)
+//  - EXPECTED_IOP           : Expected IOP config (0-1)
+//  - EXPECTED_IRQDIS        : Expected IRQ disable (0-0xFFFFFFFF)
+//  - EXPECTED_MPU           : Expected MPU config (0,8)
+//  - EXPECTED_NUMIRQ        : Expected number of IRQ lines (0-32)
+//  - EXPECTED_SMUL          : Expected Multiplier config (0-1)
+//  - EXPECTED_SYST          : Expected SysTick extension (0-1)
+//  - EXPECTED_USER          : Expected User config (0-1)
+//  - EXPECTED_VTOR          : Expected VTOR config (0-1)
+//  - EXPECTED_WIC           : Expected Wake-up interrupt controller support <0-1>
+//  - EXPECTED_WICLINES      : Expected number of supported WIC lines <2-34>
+//  - EXPECTED_WPT           : Expected number of Watchpoint Comparators (0-2)
+//
+//  Processor Tie-offs
+//
+//  - EXPECTED_STCALIB       : Expected value of STCALIB (0-0x3FFFFFF)
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+//  DAP configuration options.
+//  These must match the expected hardware configuration of the DAP.
+//
+//  - EXPECTED_BASEADDR      : Expected BASEADDR at Cortex M0+ DAP (0-0xFFFFFFFF)
+//  - EXPECTED_JTAGnSW       : Expected Cortex M0+ DAP Protocol (0,1)
+//  - EXPECTED_SWMD          : Expected SW Multi-Drop config (0-1)
+//
+//  DAP Tie-offs
+//
+//  - EXPECTED_INSTANCEID    : Expected DAP instance number (0-0xF)
+//  - EXPECTED_TREVISION     : Expected Revision number (0-0xF)
+//  - EXPECTED_TPARTNO       : Expected Part number (0-0xFFFF)
+//  - EXPECTED_TDESIGNER     : Expected Designer code (0-0x7FF)
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+//  CoreSight MTB-M0+ configuration options.
+//
+//  - EXPECTED_MTB           : Expected CoreSight MTB-M0+ config (0-1)
+//  - EXPECTED_MTB_BASEADDR  : Expected CoreSight MTB-M0+ BASEADDR (0-0xFFFFFFFF)
+//  - EXPECTED_MTB_AWIDTH    : Expected CoreSight MTB-M0+ Address width (5-32)
+//
+// NOTE : When the MTB (EXPECTED_MTB = 1) is included, the RAM that is used for
+//        the data accesses is shared with the MTB, so if you set the address
+//        width to be smaller than the default (EXPECTED_MTB_AWIDTH = 16), the
+//        addresses that some tests are using to write data to will alias to
+//        lower addresses,so some tests will not work with smaller memory.
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+//  System ROM Table options.
+//  These must match the values in the System ROM Table.
+//
+//  - EXPECTED_CUST_JEP_ID   : Expected JEDEC JEP-106 identity code (0-0x7F)
+//  - EXPECTED_CUST_JEP_CONT : Expected JEDEC JEP-106 continuation code (0-0xF)
+//  - EXPECTED_CUST_PART     : Expected Part number (0-0xFFF)
+//  - EXPECTED_CUST_REV      : Expected Revision number (0-0xF)
+//  - EXPECTED_CUST_REVAND   : Expected Manufacturer Revision number (0-0xF)
+//
+////////////////////////////////////////////////////////////////////////////////
+//
+//  Engineering Change Order and Revision Number Tie-off.
+//
+//  - EXPECTED_ECOREVNUM     : Expected Engineering Change Order and Revision number (0-0xFFFFFFFF)
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// <h> Processor configuration options
+// <o> EXPECTED_IOP: Expected IOP config <0=> Absent <1=> Present
+#define EXPECTED_IOP            0
+
+
+// <o> EXPECTED_IRQDIS: Expected interrupt disable <0x0-0xFFFFFFFF>
+#define EXPECTED_IRQDIS         0x00000000
+
+
+// <o> EXPECTED_MPU: Expected MPU config <0=> Absent <8=> Present (8 Regions)
+#define EXPECTED_MPU            8
+
+
+// <o> EXPECTED_USER: Expected User config <0=> Absent (Privilege mode only) <1=> Present
+#define EXPECTED_USER           1
+
+
+// <o> EXPECTED_VTOR: Expected VTOR config <0=> Absent <1=> Present
+#define EXPECTED_VTOR           1
+
+
+// <o> EXPECTED_WIC: Expected Wake-up interrupt controller support <0-1>
+#define EXPECTED_WIC            1
+
+
+// <o> EXPECTED_WICLINES : Expected number of supported WIC lines <2-34>
+#define EXPECTED_WICLINES       34
+
+
+// <h> Processor port Tie-Offs
+// <o> EXPECTED_SWMD: Expected SW Multi-Drop config <0=> Absent <1=> Present (Serial Wire Protocol 2)
+#define EXPECTED_SWMD           0
+
+// </h>
+
+// <h> DAP Tie-offs
+// <o> EXPECTED_INSTANCEID: Expected DAP instance number (0-0xF)
+#define EXPECTED_INSTANCEID     0x0
+
+
+// <o> EXPECTED_TREVISION: Expected Revision number (0-0xF)
+#define EXPECTED_TREVISION      0x0
+
+
+// <o> EXPECTED_TPARTNO: Expected Part number (0-0xFFFF)
+#define EXPECTED_TPARTNO        0x0000
+
+
+// <o> EXPECTED_TDESIGNER: Expected Designer code (0-0x7FF)
+#define EXPECTED_TDESIGNER      0x000
+
+// </h>
+
+// <h> CoreSight MTB-M0+ configuration options
+// <o> EXPECTED_MTB: Expected CoreSight MTB-M0+ config <0=> Absent <1=> Present
+#define EXPECTED_MTB            0
+
+
+// <o> EXPECTED_MTB_BASEADDR: Expected CoreSight MTB-M0+ BASEADDR  <0x0-0xFFFFFFFF>
+#define EXPECTED_MTB_BASEADDR   0xF0210000
+
+
+// <o> EXPECTED_MTB_AWIDTH: Expected CoreSight MTB-M0+ Address width <5-32>
+#define EXPECTED_MTB_AWIDTH     16
+
+// </h>
+
+// <<< end of configuration section >>>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.c b/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.c
new file mode 100644
index 0000000..75f73a1
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.c
@@ -0,0 +1,131 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: $
+ *
+ *      Revision            : $Revision: $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+#include "mcu_debugtester_interface.h" // For definition of interface to the debug tester
+
+void EnableDebugTester(void)
+{
+  uint32_t i;
+
+
+  //
+  // Initialise GPIO from MCU to Debug Tester
+  //
+
+  //Initialize the GPIO0 higher 8 bits output value, set to 0
+  CMSDK_GPIO0->DATAOUT =  (0x00000000);    //set GPIO output to 0 for default value, disable the function strobe
+  CMSDK_gpio_SetOutEnable (CMSDK_GPIO0, DEBUG_CMD);    // set specified bit in out enable register
+
+
+  //
+  // Enable the Debug Tester in the testbench
+  //
+
+  // send command to enable the connection to debug tester
+  UartPutc((char) DBG_ESCAPE); //send ESCAPE code
+  UartPutc((char) DBG_CONNECT_ENABLE); //send debug test enable command
+  puts("\nEnabling debug tester...\n");
+  // If debug tester is not present,
+  if((CMSDK_GPIO0->DATA & DEBUG_ERROR) != 0)
+    {
+      puts("DBGERROR bit (debug error) asserted.\n");
+      puts("Debug tester not available:\n");
+      puts("1: The ARM_CMSDK_INCLUDE_DEBUG_TESTER macro is not defined, or\n");
+      puts("2: Cortex-M0 DesignStart is used\n");
+      puts("** TEST SKIPPED **\n");
+      // End simulation
+      UartEndSimulation();
+    }
+
+
+  //
+  // Initialise the Communication Region
+  // (Zero the 4 words above Stack Top)
+  //
+
+  for(i=0; i<4 ; i++)
+    {
+      DEBUGTESTERDATA[i] = 0;
+    }
+}
+
+
+void DisableDebugTester(void)
+{
+  //send command to disable the connection to debug tester
+  UartPutc((char) DBG_ESCAPE); //send debug test disable command,
+  UartPutc((char) DBG_CONNECT_DISABLE); //send debug test disable command,
+  UartEndSimulation();  //stop simulation
+}
+
+
+//===========================================================================
+// Start a function running on the debug tester
+//===========================================================================
+void StartDebugTester(uint32_t Function)
+{
+  // Write function onto function select pins
+  CMSDK_gpio_SetOutEnable (CMSDK_GPIO0, DEBUG_CMD);    // set specified bit in out enable register
+
+  //setup function select and function strobe
+  CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, Function<<DEBUG_BIT_LOC | DEBUG_STROBE, DEBUG_CMD|DEBUG_STROBE);
+
+  // Wait to see Running asserted
+  while((CMSDK_GPIO0->DATA & DEBUG_RUNNING) == 0);
+
+  // Clear strobe
+  CMSDK_gpio_MaskedWrite(CMSDK_GPIO0, 0x0, DEBUG_STROBE);
+}
+
+
+//===========================================================================
+// Check that a debug tester function completed
+// Return pass/fail accordingly
+//===========================================================================
+uint32_t CheckDebugTester(void)
+{
+  // Wait to see Running deasserted
+  while((CMSDK_GPIO0->DATA & DEBUG_RUNNING)!= 0);
+
+  // Return status, check ERROR bit
+  if((CMSDK_GPIO0->DATA & DEBUG_ERROR) == 0)
+    {
+      return TEST_PASS;
+    }
+  else
+    {
+      return TEST_FAIL;
+    }
+}
+
+
+//===========================================================================
+// Execute a debug tester function
+//===========================================================================
+uint32_t CallDebugTester(uint32_t Function)
+{
+  StartDebugTester(Function);
+  return CheckDebugTester();
+}
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.h b/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.h
new file mode 100644
index 0000000..162672d
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/generic/mcu_debugtester_interface.h
@@ -0,0 +1,102 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2013-01-18 17:35:18 +0000 (Fri, 18 Jan 2013) $
+//
+//      Revision            : $Revision: 234195 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//-----------------------------------------------------------------------------
+//
+
+//
+// Definition of CMSDK example MCU to the Debug Tester
+//
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+
+#else
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+
+#else
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+
+#else
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+
+#endif
+#endif
+#endif
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"   // for stdout
+#include "CMSDK_driver.h"
+#include "config_id.h" // general defines such as test_pass
+
+
+// Functions used by tests that communicate with the Debug Tester
+extern void EnableDebugTester(void);
+extern void DisableDebugTester(void);
+extern uint32_t CallDebugTester(uint32_t);
+extern void StartDebugTester(uint32_t);
+extern uint32_t CheckDebugTester(void);
+
+
+//Test command sequence definition
+#define  DBG_ESCAPE          0x1B
+#define  DBG_CONNECT_ENABLE  0x11
+#define  DBG_CONNECT_DISABLE 0x12
+#define  DBG_SIM_STOP        0x4
+
+
+// GPIO0 bit allocation
+//
+// CM0_MCU GPIO0 --------------------------------------  Debug Tester
+//
+// GPIO[15] 7 <----------------------------------------< Running
+// GPIO[14] 6 <----------------------------------------< Error
+// GPIO[13] 5 >----------------------------------------> Function Strobe
+// GPIO[12] 4 >----------------------------------------> Function Select bit 4
+// GPIO[11] 3 >----------------------------------------> Function Select bit 3
+// GPIO[10] 2 >----------------------------------------> Function Select bit 2
+// GPIO[9]  1 >----------------------------------------> Function Select bit 1
+// GPIO[8]  0 >----------------------------------------> Function Select bit 0
+//
+#define   DEBUG_BIT_LOC            8  //GPIO[8] is the least bit of Function Select
+#define   DEBUG_CMD                0x3f<<8            //GPIO [13:8]
+#define   DEBUG_STROBE             0x00002000         //GPIO [13]
+#define   DEBUG_ERROR              0x00004000         //GPIO [14]
+#define   DEBUG_RUNNING            0x00008000         //GPIO [15]
+
+// GPIO1[7] 7
+// GPIO1[6] 6
+// GPIO1[5] 5
+// GPIO1[4] 4
+// GPIO1[3] 3
+// GPIO1[2] 2
+// GPIO1[1] 1
+// GPIO1[0] 0
+
+
+// CMSDK example MCU's view of the memory shared with the debugtester
+// (4 words above stack top)
+// This macro uses the SP value from the vector table as stacktop
+// The stacktop cannot be set to the top of the memory.
+#define DEBUGTESTERDATA ((volatile uint32_t *) *((uint32_t *) 0x0))
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvopt
new file mode 100644
index 0000000..3b1eeed
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvopt
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</PathWithFileName>
+      <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\gpio_driver_tests.c</PathWithFileName>
+      <FilenameWithoutPath>gpio_driver_tests.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvproj
new file mode 100644
index 0000000..6262fae
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0.uvproj
@@ -0,0 +1,440 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>gpio_driver_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output gpio_driver_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>CMSDK_driver.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</FilePath>
+            </File>
+            <File>
+              <FileName>gpio_driver_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\gpio_driver_tests.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvopt
new file mode 100644
index 0000000..c0fca7a
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvopt
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</PathWithFileName>
+      <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\gpio_driver_tests.c</PathWithFileName>
+      <FilenameWithoutPath>gpio_driver_tests.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvproj
new file mode 100644
index 0000000..bdd4ec2
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/gpio_driver_tests_cm0p.uvproj
@@ -0,0 +1,437 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>gpio_driver_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output gpio_driver_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>CMSDK_driver.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</FilePath>
+            </File>
+            <File>
+              <FileName>gpio_driver_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\gpio_driver_tests.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/makefile
new file mode 100644
index 0000000..d4bde33
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_driver_tests/makefile
@@ -0,0 +1,255 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2011-01-25 10:05:56 +0000 (Tue, 25 Jan 2011) $
+#
+#      Revision            : $Revision: 159421 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = gpio_driver_tests
+
+# Endian Option
+COMPILE_BIGEND  = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST        = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime $(USER_DEFINE) \
+        	-I $(DEVICE_DIR)/Include  -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+CMSDK_driver.o : $(DEVICE_DIR)/Source/CMSDK_driver.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o
+	armlink $(ARM_LINK_OPTIONS) -o $@  $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output  $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF makefile
+	fromelf -c -d -e -s $< --output  $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/CMSDK_driver.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+                -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+                -I $(SOFTWARE_DIR)/common/retarget \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvopt
new file mode 100644
index 0000000..39dfcaa
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvopt
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\gpio_tests.c</PathWithFileName>
+      <FilenameWithoutPath>gpio_tests.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvproj
new file mode 100644
index 0000000..284bc45
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0.uvproj
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>gpio_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output gpio_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>gpio_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\gpio_tests.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvopt
new file mode 100644
index 0000000..44d9aed
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvopt
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\gpio_tests.c</PathWithFileName>
+      <FilenameWithoutPath>gpio_tests.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvproj
new file mode 100644
index 0000000..8e0ea89
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/gpio_tests_cm0p.uvproj
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>gpio_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output gpio_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>gpio_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\gpio_tests.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/makefile
new file mode 100644
index 0000000..74e83c0
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/gpio_tests/makefile
@@ -0,0 +1,253 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2011-01-25 10:05:56 +0000 (Tue, 25 Jan 2011) $
+#
+#      Revision            : $Revision: 159421 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = gpio_tests
+
+# Endian Option
+COMPILE_BIGEND  = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+
+DEPS_LIST        = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime $(USER_DEFINE) \
+        	-I $(DEVICE_DIR)/Include  -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+	armlink $(ARM_LINK_OPTIONS) -o $@  $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output  $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF makefile
+	fromelf -c -d -e -s $< --output  $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+                -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+                -I $(SOFTWARE_DIR)/common/retarget \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/.project b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/.project
new file mode 100644
index 0000000..b4807ed
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>hello</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello.c b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello.c
new file mode 100644
index 0000000..ab9d771
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello.c
@@ -0,0 +1,52 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#include "core_cm0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#include "core_cm0plus.h"
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"
+
+int main (void)
+{
+  // UART init
+  UartStdOutInit();
+
+  printf("Hello world\n");
+
+  printf("** TEST PASSED **\n");
+
+  // End simulation
+  UartEndSimulation();
+
+  return 0;
+}
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvopt
new file mode 100644
index 0000000..5145b64
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvopt
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\hello.c</PathWithFileName>
+      <FilenameWithoutPath>hello.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvproj
new file mode 100644
index 0000000..6baba57
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0.uvproj
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>hello</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output hello.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>1</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>hello.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\hello.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvopt
new file mode 100644
index 0000000..c39e058
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvopt
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\hello.c</PathWithFileName>
+      <FilenameWithoutPath>hello.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvproj
new file mode 100644
index 0000000..38048cf
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/hello_cm0p.uvproj
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>hello</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output hello.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>1</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3>"" ()</Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>hello.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\hello.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/makefile
new file mode 100644
index 0000000..e8ac4ee
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/hello/makefile
@@ -0,0 +1,255 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = hello
+
+# Endian Option
+COMPILE_BIGEND = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST       = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+#ARM_CC_OPTIONS   = -c -O3 -g -Otime -I $(DEVICE_DIR)/Include  -I $(CORE_DIR) \
+#		   -I $(SOFTWARE_DIR)/common/retarget $(USER_DEFINE)
+#ARM_ASM_OPTIONS  = -g
+#ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+#		   --rw_base 0x30000000 --ro_base 0x00000000 --map  --info sizes
+
+ARM_CC_OPTIONS   = -c -O3 -Ospace -I $(DEVICE_DIR)/Include  -I $(CORE_DIR) \
+		   -I $(SOFTWARE_DIR)/common/retarget $(USER_DEFINE)
+ARM_ASM_OPTIONS  = 
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		   --no_debug --rw_base 0x30000000 --ro_base 0x00000000 --map  --info sizes
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+	armlink $(ARM_LINK_OPTIONS) $(TESTNAME).o $(SYSTEM_FILE).o  $(STARTUP_FILE).o retarget.o uart_stdout.o -o $@
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF
+	fromelf -c -d -e -s -z -v $< --output $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+                -I $(SOFTWARE_DIR)/common/retarget  \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvopt
new file mode 100644
index 0000000..08449be
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvopt
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\demos\interrupt_demo.c</PathWithFileName>
+      <FilenameWithoutPath>interrupt_demo.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</PathWithFileName>
+      <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvproj
new file mode 100644
index 0000000..ea6f928
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0.uvproj
@@ -0,0 +1,440 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>interrupt_demo</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output interrupt_demo.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>interrupt_demo.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\demos\interrupt_demo.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>CMSDK_driver.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvopt
new file mode 100644
index 0000000..d09b1c7
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvopt
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\demos\interrupt_demo.c</PathWithFileName>
+      <FilenameWithoutPath>interrupt_demo.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</PathWithFileName>
+      <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvproj
new file mode 100644
index 0000000..58b9dd6
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/interrupt_demo_cm0p.uvproj
@@ -0,0 +1,437 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>interrupt_demo</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output interrupt_demo.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>interrupt_demo.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\demos\interrupt_demo.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>CMSDK_driver.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/makefile
new file mode 100644
index 0000000..7966b80
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/interrupt_demo/makefile
@@ -0,0 +1,255 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2011-01-25 10:05:56 +0000 (Tue, 25 Jan 2011) $
+#
+#      Revision            : $Revision: 159421 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = interrupt_demo
+
+# Endian Option
+COMPILE_BIGEND  = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST        = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime $(USER_DEFINE) \
+        	-I $(DEVICE_DIR)/Include  -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+CMSDK_driver.o : $(DEVICE_DIR)/Source/CMSDK_driver.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o
+	armlink $(ARM_LINK_OPTIONS) -o $@  $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output  $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF makefile
+	fromelf -c -d -e -s $< --output  $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/demos/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/CMSDK_driver.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+                -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+                -I $(SOFTWARE_DIR)/common/retarget \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/makefile
new file mode 100644
index 0000000..0f01637
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/makefile
@@ -0,0 +1,251 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = memory_tests
+
+# Endian Option
+COMPILE_BIGEND  = 0
+
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST        = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime $(USER_DEFINE) \
+        	-I $(DEVICE_DIR)/Include  -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+	armlink $(ARM_LINK_OPTIONS) -o $@  $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output  $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF makefile
+	fromelf -c -d -e -s $< --output  $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+                -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+                -I $(SOFTWARE_DIR)/common/retarget \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvopt
new file mode 100644
index 0000000..e832157
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvopt
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\memory_tests.c</PathWithFileName>
+      <FilenameWithoutPath>memory_tests.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvproj
new file mode 100644
index 0000000..f724aba
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0.uvproj
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>memory_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output memory_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>memory_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\memory_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvopt
new file mode 100644
index 0000000..9a16501
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvopt
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\memory_tests.c</PathWithFileName>
+      <FilenameWithoutPath>memory_tests.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvproj
new file mode 100644
index 0000000..a339a79
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/memory_tests/memory_tests_cm0p.uvproj
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>memory_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output memory_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>memory_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\memory_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/makefile
new file mode 100644
index 0000000..b1b195a
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/makefile
@@ -0,0 +1,266 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+GENERIC_DIR  = ../generic
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = romtable_tests
+
+# Endian Option
+COMPILE_BIGEND = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST       = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# Configuration ID values
+GENERIC_FILE = $(GENERIC_DIR)/config_id.h
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime -I $(CORE_DIR) -I $(DEVICE_DIR)/Include -I $(GENERIC_DIR) \
+		-I $(SOFTWARE_DIR)/common/retarget -I $(SOFTWARE_DIR)/debug_tester $(USER_DEFINE)
+
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		   --rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply take 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/romtable_tests/$(TESTNAME).c $(SOFTWARE_DIR)/common/romtable_tests/$(TESTNAME).h $(GENERIC_FILE) $(SOFTWARE_DIR)/debug_tester/debugtester_functions.h $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+mcu_debugtester_interface.o	: $(GENERIC_DIR)/mcu_debugtester_interface.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+CMSDK_driver.o : $(DEVICE_DIR)/Source/CMSDK_driver.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF: $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o mcu_debugtester_interface.o
+	armlink $(ARM_LINK_OPTIONS) -o $@ $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o mcu_debugtester_interface.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output $@
+
+
+$(TESTNAME).lst : $(TESTNAME).ELF
+	fromelf -c -d -e -s $< --output $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/romtable_tests/$(TESTNAME).c \
+		$(GENERIC_DIR)/mcu_debugtester_interface.c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/CMSDK_driver.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+                -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+		-I $(GENERIC_DIR) \
+		-I $(SOFTWARE_DIR)/common/retarget \
+		-I $(SOFTWARE_DIR)/debug_tester \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+                $(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvopt
new file mode 100644
index 0000000..f5deaa3
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvopt
@@ -0,0 +1,293 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\romtable_tests\romtable_tests.c</PathWithFileName>
+      <FilenameWithoutPath>romtable_tests.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\generic\mcu_debugtester_interface.c</PathWithFileName>
+      <FilenameWithoutPath>mcu_debugtester_interface.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>7</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</PathWithFileName>
+      <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvproj
new file mode 100644
index 0000000..94e86e6
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0.uvproj
@@ -0,0 +1,445 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>romtable_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output romtable_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget; ..\..\..\..\software\debug_tester; ..\generic</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>romtable_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\romtable_tests\romtable_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>mcu_debugtester_interface.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\generic\mcu_debugtester_interface.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+            <File>
+              <FileName>CMSDK_driver.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvopt
new file mode 100644
index 0000000..1819e74
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvopt
@@ -0,0 +1,272 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\romtable_tests\romtable_tests.c</PathWithFileName>
+      <FilenameWithoutPath>romtable_tests.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\generic\mcu_debugtester_interface.c</PathWithFileName>
+      <FilenameWithoutPath>mcu_debugtester_interface.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>7</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</PathWithFileName>
+      <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvproj
new file mode 100644
index 0000000..b3ed42c
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/romtable_tests/romtable_tests_cm0p.uvproj
@@ -0,0 +1,442 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>romtable_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output romtable_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget; ..\..\..\..\software\debug_tester; ..\generic</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>romtable_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\romtable_tests\romtable_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>mcu_debugtester_interface.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\generic\mcu_debugtester_interface.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+            <File>
+              <FileName>CMSDK_driver.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/RTX_Config.c b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/RTX_Config.c
new file mode 100644
index 0000000..262cc79
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/RTX_Config.c
@@ -0,0 +1,187 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2011 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+/*----------------------------------------------------------------------------
+ *      R T L  -  K e r n e l
+ *----------------------------------------------------------------------------
+ *      Name:    RTX_CONFIG.C
+ *      Purpose: Configuration of RTX Kernel for Cortex-M
+ *      Rev.:    V3.40
+ *----------------------------------------------------------------------------
+*/
+
+#include <RTL.h>
+
+/*----------------------------------------------------------------------------
+ *      RTX User configuration part BEGIN
+ *---------------------------------------------------------------------------*/
+
+//-------- <<< Use Configuration Wizard in Context Menu >>> -----------------
+//
+// <h>Task Definitions
+// ===================
+//
+//   <o>Number of concurrent running tasks <0-250>
+//   <i> Define max. number of tasks that will run at the same time.
+//   <i> Default: 6
+#ifndef OS_TASKCNT
+ #define OS_TASKCNT     6
+#endif
+
+//   <o>Number of tasks with user-provided stack <0-250>
+//   <i> Define the number of tasks that will use a bigger stack.
+//   <i> The memory space for the stack is provided by the user.
+//   <i> Default: 0
+#ifndef OS_PRIVCNT
+ #define OS_PRIVCNT     0
+#endif
+
+//   <o>Task stack size [bytes] <20-4096:8><#/4>
+//   <i> Set the stack size for tasks which is assigned by the system.
+//   <i> Default: 200
+#ifndef OS_STKSIZE
+ #define OS_STKSIZE     200
+#endif
+
+// <q>Check for the stack overflow
+// ===============================
+// <i> Include the stack checking code for a stack overflow.
+// <i> Note that additional code reduces the Kernel performance.
+#ifndef OS_STKCHECK
+ #define OS_STKCHECK    1
+#endif
+
+// <q>Run in privileged mode
+// =========================
+// <i> Run all Tasks in privileged mode.
+// <i> Default: Unprivileged
+#ifndef OS_RUNPRIV
+ #define OS_RUNPRIV     0
+#endif
+
+//   <o>Number of user timers <0-250>
+//   <i> Define max. number of user timers that will run at the same time.
+//   <i> Default: 0  (User timers disabled)
+#ifndef OS_TIMERCNT
+ #define OS_TIMERCNT    0
+#endif
+
+// </h>
+// <h>SysTick Timer Configuration
+// =============================
+//   <o>Timer clock value [Hz] <1-1000000000>
+//   <i> Set the timer clock value for selected timer.
+//   <i> Default: 6000000  (6MHz)
+#ifndef OS_CLOCK
+ #define OS_CLOCK       50000000
+#endif
+
+//   <o>Timer tick value [us] <1-1000000>
+//   <i> Set the timer tick value for selected timer.
+//   <i> Default: 10000  (10ms)
+#ifndef OS_TICK
+ #define OS_TICK        200
+#endif
+
+// </h>
+// <e>Round-Robin Task switching
+// =============================
+// <i> Enable Round-Robin Task switching.
+#ifndef OS_ROBIN
+ #define OS_ROBIN       1
+#endif
+
+//   <o>Round-Robin Timeout [ticks] <1-1000>
+//   <i> Define how long a task will execute before a task switch.
+//   <i> Default: 5
+#ifndef OS_ROBINTOUT
+ #define OS_ROBINTOUT   5
+#endif
+
+// </e>
+
+//------------- <<< end of configuration section >>> -----------------------
+
+// Standard library system mutexes
+// ===============================
+//  Define max. number system mutexes that are used to protect
+//  the arm standard runtime library. For microlib they are not used.
+#ifndef OS_MUTEXCNT
+ #define OS_MUTEXCNT    8
+#endif
+
+/*----------------------------------------------------------------------------
+ *      RTX User configuration part END
+ *---------------------------------------------------------------------------*/
+
+#define OS_TRV          ((U32)(((double)OS_CLOCK*(double)OS_TICK)/1E6)-1)
+
+/*----------------------------------------------------------------------------
+ *      Global Functions
+ *---------------------------------------------------------------------------*/
+
+/*--------------------------- os_idle_demon ---------------------------------*/
+
+__task void os_idle_demon (void) {
+   /* The idle demon is a system task, running when no other task is ready */
+   /* to run. The 'os_xxx' function calls are not allowed from this task.  */
+
+   for (;;) {
+   /* HERE: include optional user code to be executed when no task runs.*/
+   }
+}
+
+
+/*--------------------------- os_tmr_call -----------------------------------*/
+
+void os_tmr_call (U16 info) {
+   /* This function is called when the user timer has expired. Parameter   */
+   /* 'info' holds the value, defined when the timer was created.          */
+
+   /* HERE: include optional user code to be executed on timeout. */
+}
+
+
+/*--------------------------- os_stk_overflow -------------------------------*/
+
+void os_stk_overflow (OS_TID task_id) {
+   /* This function is called when a stack overflow is detected. Parameter */
+   /* 'task_id' holds the id of this task. You can use 'RTX Kernel' dialog,*/
+   /* page 'Active Tasks' to check, which task needs a bigger stack.       */
+
+   /* HERE: include optional code to be executed on stack overflow. */
+   for (;;);
+}
+
+
+/*----------------------------------------------------------------------------
+ *      RTX Configuration Functions
+ *---------------------------------------------------------------------------*/
+
+#include <RTX_lib.c>
+
+/*----------------------------------------------------------------------------
+ * end of file
+ *---------------------------------------------------------------------------*/
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/makefile
new file mode 100644
index 0000000..b1edfa2
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/makefile
@@ -0,0 +1,101 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+TESTNAME        = rtx_demo
+
+CPU_PRODUCT     = CORTEX_M0PLUS
+HEXFILE         = rtx_demo_cm0.hex
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0)
+  HEXFILE         = rtx_demo_cm0.hex
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  HEXFILE         = rtx_demo_cm0p.hex
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+hexfile_select:
+	@if [ -e $(HEXFILE) ] ; then \
+	  cp $(HEXFILE) rtx_demo.hex ; \
+	fi
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+all_ds5 : hexfile_select
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  echo "Found rtx_demo.hex ... use existing hex file. Continue ..." ; \
+	else \
+	  echo "RTX demo compilation not available for DS-5." ; \
+	  echo "Please compile RTX demo in Keil MDK and press ENTER when ready" ; \
+	  read dummy ; \
+	fi
+
+# ---------------------------------------------------------------------------------------
+# gcc
+#
+all_gcc: hexfile_select
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  echo "Found rtx_demo.hex ... use existing hex file. Continue ..." ; \
+	else \
+	  echo "RTX demo compilation not available for gcc." ;\
+	  echo "Please compile RTX demo in Keil MDK and press ENTER when ready" ; \
+	  read dummy ; \
+	fi
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+	cp $(HEXFILE) rtx_demo.hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+clean :
+	@rm -rf *.o
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.uvgui.*
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo.c b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo.c
new file mode 100644
index 0000000..9e885b7
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo.c
@@ -0,0 +1,86 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+/* Simple demonstration of booting up an RTOS : Keil RTX */
+
+#include <RTL.h>
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+#include <stdio.h>
+#include "uart_stdout.h"
+
+OS_TID t_task1;    // Declare a task ID for task1 : Event generator
+OS_TID t_task2;    // Declare a task ID for task2 : Event receiver
+int num = 0; // Counter
+
+__task void task1(void) { // Task 1 - Event generator
+  while (1) {
+    os_dly_wait(1);
+    puts("task 1 ->");
+    os_evt_set (0x0001, t_task2);  // Send a event 0x0001 to task 2
+    }
+  }
+
+__task void task2(void) { // Task 2 - Event receiver
+  while(1) {
+    os_evt_wait_and (0x0001, 0xffff); // wait for an event flag 0x0001
+    num ++;
+    printf ("  task 2, %d\n", num);
+    if (num>=3) {      /* Execute 3 times and stop simulation */
+      puts("Tasks ran 3 times.");
+      puts("** TEST PASSED ** \n");
+      UartEndSimulation();
+      }
+    }
+  }
+
+/* Initialize tasks */
+__task void init (void) {
+  t_task1  = os_tsk_create (task1, 1); // Create a task "task1" with priority 1
+  t_task2  = os_tsk_create (task2, 1); // Create a task "task2" with priority 1
+  os_tsk_delete_self ();
+}
+
+
+int main(void)
+{
+  // Starting from CMSIS 1.3,
+  // CMSIS System Initialization function SystemInit() is called from startup code.
+  // So there is no need to call it in here. (This test is based on CMSIS 2.0).
+
+  SysTick->VAL=0; /* Initialize SysTick timer value */
+
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - RTX Demo - revision $Revision: 371321 $\n");
+  puts("- Execute task 1 -> task 2 sequence three times\n");
+
+  os_sys_init(init); // Initialize OS
+} // end main
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.hex b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.hex
new file mode 100644
index 0000000..1ab6c31
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.hex
@@ -0,0 +1,4996 @@
+60
+1E
+00
+20
+01
+03
+00
+00
+09
+03
+00
+00
+0B
+03
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+E9
+01
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+8D
+02
+00
+00
+ED
+02
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+00
+00
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+00
+F0
+02
+F8
+00
+F0
+48
+F8
+0C
+A0
+30
+C8
+08
+38
+24
+18
+2D
+18
+A2
+46
+67
+1E
+AB
+46
+54
+46
+5D
+46
+AC
+42
+01
+D1
+00
+F0
+3A
+F8
+7E
+46
+0F
+3E
+0F
+CC
+B6
+46
+01
+26
+33
+42
+00
+D0
+FB
+1A
+A2
+46
+AB
+46
+33
+43
+18
+47
+28
+12
+00
+00
+48
+12
+00
+00
+10
+3A
+02
+D3
+78
+C8
+78
+C1
+FA
+D8
+52
+07
+01
+D3
+30
+C8
+30
+C1
+01
+D5
+04
+68
+0C
+60
+70
+47
+00
+00
+00
+23
+00
+24
+00
+25
+00
+26
+10
+3A
+01
+D3
+78
+C1
+FB
+D8
+52
+07
+00
+D3
+30
+C1
+00
+D5
+0B
+60
+70
+47
+10
+B5
+64
+29
+02
+D1
+00
+F0
+73
+FA
+10
+BD
+00
+20
+10
+BD
+1F
+B5
+C0
+46
+C0
+46
+1F
+BD
+10
+B5
+10
+BD
+00
+F0
+50
+FB
+11
+46
+FF
+F7
+F5
+FF
+00
+F0
+25
+F9
+00
+F0
+68
+FB
+03
+B4
+FF
+F7
+F2
+FF
+03
+BC
+00
+F0
+BA
+F9
+00
+00
+80
+F3
+09
+88
+70
+47
+EF
+F3
+09
+80
+70
+47
+68
+46
+80
+F3
+09
+88
+06
+48
+00
+78
+C0
+07
+03
+D1
+03
+20
+80
+F3
+14
+88
+70
+47
+02
+20
+80
+F3
+14
+88
+70
+47
+00
+00
+0C
+13
+00
+00
+06
+4B
+9C
+46
+EF
+F3
+05
+83
+1B
+06
+05
+D1
+EF
+F3
+14
+83
+DB
+07
+01
+D0
+00
+DF
+70
+47
+60
+47
+00
+00
+C3
+08
+00
+00
+06
+4B
+9C
+46
+EF
+F3
+05
+83
+1B
+06
+05
+D1
+EF
+F3
+14
+83
+DB
+07
+01
+D0
+00
+DF
+70
+47
+60
+47
+00
+00
+09
+0B
+00
+00
+EF
+F3
+09
+80
+81
+69
+89
+1E
+09
+78
+00
+29
+33
+D1
+A6
+46
+1F
+C8
+A4
+46
+74
+46
+E0
+47
+1F
+4B
+06
+CB
+91
+42
+24
+D0
+08
+3B
+00
+29
+10
+D0
+0C
+B4
+20
+31
+01
+23
+4B
+70
+EF
+F3
+09
+83
+20
+3B
+4B
+60
+F0
+C3
+44
+46
+4D
+46
+56
+46
+5F
+46
+F0
+C3
+00
+F0
+BB
+FE
+0C
+BC
+1A
+60
+20
+32
+53
+68
+10
+33
+F0
+CB
+A0
+46
+A9
+46
+B2
+46
+BB
+46
+83
+F3
+09
+88
+20
+3B
+F0
+CB
+50
+78
+00
+28
+03
+D0
+10
+78
+EF
+F3
+09
+83
+18
+60
+02
+23
+DB
+43
+18
+47
+10
+B5
+08
+4A
+12
+68
+91
+42
+09
+D8
+07
+48
+89
+00
+40
+58
+86
+46
+1F
+C8
+A4
+46
+F0
+47
+EF
+F3
+09
+84
+0F
+C4
+10
+BD
+00
+00
+1C
+00
+00
+20
+48
+08
+00
+00
+48
+08
+00
+00
+00
+F0
+A0
+FD
+15
+4B
+06
+CB
+91
+42
+23
+D0
+08
+3B
+0C
+B4
+20
+31
+00
+23
+4B
+70
+EF
+F3
+09
+83
+20
+3B
+4B
+60
+F0
+C3
+44
+46
+4D
+46
+56
+46
+5F
+46
+F0
+C3
+00
+F0
+75
+FE
+0C
+BC
+1A
+60
+20
+32
+53
+68
+10
+33
+F0
+CB
+A0
+46
+A9
+46
+B2
+46
+BB
+46
+83
+F3
+09
+88
+20
+3B
+F0
+CB
+50
+78
+00
+28
+01
+D0
+10
+78
+18
+61
+02
+23
+DB
+43
+18
+47
+00
+00
+1C
+00
+00
+20
+00
+F0
+0A
+FF
+CE
+E7
+00
+00
+00
+F0
+E4
+FA
+00
+F0
+04
+FF
+C8
+E7
+00
+00
+07
+48
+80
+47
+07
+48
+00
+47
+FE
+E7
+FE
+E7
+FE
+E7
+FE
+E7
+FE
+E7
+FE
+E7
+04
+48
+05
+49
+05
+4A
+06
+4B
+70
+47
+00
+00
+85
+05
+00
+00
+C1
+00
+00
+00
+60
+1B
+00
+20
+60
+1E
+00
+20
+60
+1C
+00
+20
+60
+1C
+00
+20
+28
+4C
+29
+4F
+01
+20
+BC
+46
+00
+DF
+28
+A0
+00
+F0
+A8
+F9
+29
+4F
+01
+20
+BC
+46
+A1
+68
+00
+DF
+F2
+E7
+27
+4D
+21
+4C
+27
+4F
+01
+22
+29
+46
+10
+46
+BC
+46
+00
+DF
+21
+68
+25
+A0
+49
+1C
+21
+60
+00
+F0
+18
+F9
+20
+68
+03
+28
+F0
+DB
+25
+A0
+00
+F0
+8E
+F9
+28
+A0
+00
+F0
+8B
+F9
+00
+F0
+97
+F8
+E7
+E7
+00
+23
+2B
+4F
+1A
+46
+01
+21
+28
+48
+BC
+46
+00
+DF
+11
+4C
+00
+23
+60
+60
+1A
+46
+01
+21
+26
+48
+BC
+46
+00
+DF
+26
+4F
+A0
+60
+00
+20
+BC
+46
+00
+DF
+80
+B5
+24
+49
+00
+20
+88
+61
+00
+F0
+66
+F8
+22
+48
+00
+F0
+6B
+F9
+22
+A0
+00
+F0
+68
+F9
+FF
+F7
+DC
+FE
+2D
+4F
+00
+22
+11
+46
+2B
+48
+BC
+46
+00
+DF
+00
+20
+80
+BD
+00
+00
+00
+20
+15
+0A
+00
+00
+74
+61
+73
+6B
+20
+31
+20
+2D
+3E
+00
+00
+00
+6D
+0A
+00
+00
+FF
+FF
+00
+00
+C9
+0A
+00
+00
+20
+20
+74
+61
+73
+6B
+20
+32
+2C
+20
+25
+64
+0A
+00
+00
+00
+54
+61
+73
+6B
+73
+20
+72
+61
+6E
+20
+33
+20
+74
+69
+6D
+65
+73
+2E
+00
+00
+2A
+2A
+20
+54
+45
+53
+54
+20
+50
+41
+53
+53
+45
+44
+20
+2A
+2A
+20
+0A
+00
+39
+03
+00
+00
+81
+11
+00
+00
+55
+03
+00
+00
+FD
+11
+00
+00
+00
+E0
+00
+E0
+A8
+12
+00
+00
+2D
+20
+45
+78
+65
+63
+75
+74
+65
+20
+74
+61
+73
+6B
+20
+31
+20
+2D
+3E
+20
+74
+61
+73
+6B
+20
+32
+20
+73
+65
+71
+75
+65
+6E
+63
+65
+20
+74
+68
+72
+65
+65
+20
+74
+69
+6D
+65
+73
+0A
+00
+00
+00
+00
+89
+03
+00
+00
+DD
+0F
+00
+00
+0C
+48
+10
+21
+01
+61
+41
+21
+81
+60
+0B
+49
+20
+20
+88
+61
+70
+47
+08
+49
+4A
+68
+D2
+07
+FC
+D1
+08
+60
+70
+47
+05
+48
+41
+68
+89
+07
+FC
+D5
+00
+68
+C0
+B2
+70
+47
+04
+20
+FF
+F7
+F0
+FF
+FE
+E7
+00
+60
+00
+40
+00
+10
+01
+40
+10
+B5
+C0
+B2
+FF
+F7
+E7
+FF
+10
+BD
+10
+B5
+FF
+F7
+E9
+FF
+FF
+F7
+E1
+FF
+10
+BD
+00
+20
+C0
+43
+70
+47
+10
+B5
+C0
+B2
+FF
+F7
+D9
+FF
+10
+BD
+FE
+E7
+FE
+E7
+70
+47
+FE
+E7
+10
+B5
+00
+F0
+D0
+FE
+00
+28
+05
+D0
+60
+21
+48
+43
+17
+49
+40
+18
+60
+38
+10
+BD
+16
+48
+10
+BD
+10
+B5
+16
+4A
+11
+68
+08
+29
+00
+D3
+FE
+E7
+0C
+23
+4B
+43
+13
+4C
+49
+1C
+1B
+19
+03
+60
+18
+46
+11
+60
+00
+F0
+C0
+FB
+01
+20
+10
+BD
+B0
+B5
+04
+46
+00
+F0
+B0
+FE
+00
+28
+04
+D0
+0D
+4F
+0C
+49
+BC
+46
+20
+68
+00
+DF
+B0
+BD
+B0
+B5
+04
+46
+00
+F0
+A4
+FE
+00
+28
+03
+D0
+08
+4F
+20
+68
+BC
+46
+00
+DF
+B0
+BD
+00
+00
+FC
+17
+00
+20
+FC
+1A
+00
+20
+14
+00
+00
+20
+3C
+1A
+00
+20
+FF
+FF
+00
+00
+65
+0D
+00
+00
+BD
+0C
+00
+00
+04
+49
+03
+48
+08
+60
+70
+47
+02
+49
+01
+48
+08
+60
+70
+47
+00
+E1
+F5
+05
+18
+00
+00
+20
+00
+48
+70
+47
+FC
+1A
+00
+20
+70
+47
+00
+00
+0F
+B4
+05
+49
+10
+B5
+03
+AA
+02
+98
+00
+F0
+E7
+F8
+10
+BC
+08
+BC
+04
+B0
+18
+47
+00
+00
+0C
+00
+00
+20
+F8
+B5
+04
+46
+0E
+46
+00
+20
+2D
+E0
+E1
+68
+20
+46
+88
+47
+00
+28
+2A
+D0
+25
+28
+02
+D0
+62
+68
+A1
+68
+20
+E0
+E1
+68
+20
+46
+00
+27
+88
+47
+05
+00
+1F
+D0
+28
+46
+41
+38
+19
+28
+02
+D8
+01
+27
+FF
+02
+20
+35
+32
+46
+20
+46
+27
+60
+29
+46
+FF
+F7
+9E
+FD
+00
+28
+08
+D0
+01
+28
+04
+D0
+F6
+1D
+F6
+08
+F6
+00
+08
+36
+D9
+E7
+36
+1D
+D7
+E7
+62
+68
+28
+46
+A1
+68
+90
+47
+20
+6A
+40
+1C
+20
+62
+CF
+E7
+20
+6A
+F8
+BD
+00
+00
+F7
+B5
+00
+26
+75
+29
+10
+68
+00
+99
+14
+A5
+11
+D0
+C0
+46
+C0
+46
+00
+28
+02
+DA
+40
+42
+11
+A5
+08
+E0
+00
+99
+09
+68
+8A
+07
+01
+D5
+0F
+A5
+02
+E0
+49
+07
+04
+D5
+0E
+A5
+01
+26
+01
+E0
+C0
+46
+C0
+46
+00
+9F
+00
+24
+24
+37
+04
+E0
+00
+F0
+9B
+F8
+30
+31
+39
+55
+64
+1C
+00
+28
+F8
+D1
+33
+46
+2A
+46
+21
+46
+00
+98
+00
+F0
+23
+F8
+FE
+BD
+00
+00
+00
+00
+00
+00
+2D
+00
+00
+00
+2B
+00
+00
+00
+20
+00
+00
+00
+10
+B5
+04
+46
+03
+E0
+FF
+F7
+11
+FF
+40
+1C
+08
+D0
+20
+78
+05
+49
+64
+1C
+00
+28
+F6
+D1
+0A
+20
+FF
+F7
+07
+FF
+10
+BD
+00
+20
+C0
+43
+10
+BD
+00
+00
+0C
+00
+00
+20
+70
+47
+70
+47
+70
+47
+FF
+B5
+04
+46
+0D
+46
+81
+B0
+24
+30
+00
+90
+21
+68
+88
+06
+04
+D5
+10
+22
+E0
+69
+91
+43
+21
+60
+00
+E0
+01
+20
+A8
+42
+01
+DD
+47
+1B
+00
+E0
+00
+27
+04
+98
+A1
+69
+7A
+19
+10
+18
+08
+1A
+A0
+61
+20
+68
+C0
+06
+02
+D4
+20
+46
+C0
+46
+C0
+46
+00
+26
+08
+E0
+03
+98
+62
+68
+A1
+68
+80
+5D
+90
+47
+20
+6A
+40
+1C
+76
+1C
+20
+62
+04
+98
+86
+42
+F3
+DB
+20
+68
+C0
+06
+0A
+D5
+20
+46
+C0
+46
+C0
+46
+06
+E0
+62
+68
+A1
+68
+30
+20
+90
+47
+20
+6A
+40
+1C
+20
+62
+38
+46
+7F
+1E
+00
+28
+F4
+DC
+07
+E0
+00
+98
+62
+68
+A1
+68
+40
+5D
+90
+47
+20
+6A
+40
+1C
+20
+62
+28
+46
+6D
+1E
+00
+28
+F3
+DC
+20
+46
+C0
+46
+C0
+46
+20
+68
+00
+06
+02
+D5
+02
+20
+05
+B0
+F0
+BD
+01
+20
+FB
+E7
+00
+00
+08
+4B
+70
+B5
+0C
+46
+7B
+44
+00
+F0
+27
+F8
+05
+46
+20
+46
+FF
+F7
+A5
+FE
+00
+28
+02
+D0
+00
+20
+C0
+43
+70
+BD
+28
+46
+70
+BD
+00
+00
+3F
+FD
+FF
+FF
+01
+46
+80
+08
+08
+1A
+02
+09
+10
+18
+02
+0A
+10
+18
+02
+0C
+10
+18
+C0
+08
+82
+00
+12
+18
+52
+00
+89
+1A
+01
+E0
+0A
+39
+40
+1C
+0A
+29
+FB
+D2
+70
+47
+01
+69
+4A
+1C
+02
+61
+08
+78
+70
+47
+00
+B5
+8F
+B0
+02
+91
+00
+21
+05
+91
+05
+49
+01
+93
+79
+44
+03
+91
+11
+46
+04
+90
+68
+46
+FF
+F7
+E5
+FE
+0F
+B0
+00
+BD
+00
+00
+E5
+FF
+FF
+FF
+75
+46
+FF
+F7
+C9
+FE
+AE
+46
+05
+00
+69
+46
+53
+46
+C0
+08
+C0
+00
+85
+46
+18
+B0
+20
+B5
+FF
+F7
+7E
+FD
+60
+BC
+00
+27
+49
+08
+B6
+46
+00
+26
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+40
+3D
+49
+00
+8D
+46
+70
+47
+04
+46
+C0
+46
+C0
+46
+20
+46
+FF
+F7
+92
+FC
+00
+00
+00
+00
+00
+00
+10
+B5
+00
+2A
+06
+DA
+52
+00
+52
+08
+D2
+1D
+D3
+08
+DB
+00
+10
+22
+03
+E0
+D2
+1C
+93
+08
+9B
+00
+0C
+22
+00
+2B
+02
+D0
+9C
+18
+8C
+42
+01
+D9
+01
+20
+10
+BD
+82
+18
+83
+60
+41
+18
+02
+60
+41
+60
+C9
+1A
+D0
+18
+88
+42
+02
+D8
+10
+60
+02
+46
+F9
+E7
+00
+20
+10
+60
+10
+BD
+07
+48
+01
+68
+07
+48
+41
+61
+00
+21
+81
+61
+07
+21
+01
+61
+05
+48
+01
+6A
+FF
+22
+12
+06
+11
+43
+01
+62
+40
+17
+70
+47
+08
+13
+00
+00
+00
+E0
+00
+E0
+00
+ED
+00
+E0
+70
+47
+01
+46
+EF
+F3
+10
+80
+C2
+07
+D2
+0F
+72
+B6
+08
+68
+00
+28
+01
+D0
+03
+68
+0B
+60
+00
+2A
+00
+D1
+62
+B6
+70
+47
+70
+B5
+0D
+46
+00
+28
+0F
+D0
+08
+49
+09
+4C
+88
+42
+04
+D2
+22
+68
+01
+46
+10
+46
+00
+F0
+A3
+FA
+20
+68
+45
+70
+05
+48
+00
+F0
+15
+F9
+00
+F0
+62
+FB
+70
+BD
+00
+00
+FF
+FF
+00
+00
+1C
+00
+00
+20
+CC
+1A
+00
+20
+10
+B5
+0E
+48
+0C
+49
+42
+68
+0D
+48
+0B
+68
+00
+68
+93
+42
+04
+D0
+0A
+60
+CB
+88
+42
+1E
+9A
+18
+8A
+80
+8A
+88
+80
+B2
+82
+42
+08
+D1
+00
+20
+08
+60
+04
+48
+00
+F0
+F4
+F8
+01
+46
+02
+48
+00
+F0
+A1
+FA
+10
+BD
+30
+00
+00
+20
+CC
+1A
+00
+20
+24
+00
+00
+20
+70
+B5
+1B
+4D
+E8
+68
+00
+28
+31
+D0
+A8
+8A
+40
+1E
+A8
+82
+00
+26
+26
+E0
+A0
+68
+00
+28
+08
+D0
+61
+68
+41
+60
+60
+68
+00
+28
+02
+D0
+A1
+68
+81
+60
+66
+60
+A6
+60
+10
+48
+21
+46
+18
+38
+00
+F0
+7F
+FA
+A0
+8A
+A8
+82
+60
+78
+04
+28
+04
+D1
+0C
+49
+E0
+8A
+09
+68
+40
+18
+A0
+82
+01
+20
+60
+70
+20
+21
+08
+55
+E0
+68
+E8
+60
+E0
+68
+00
+28
+01
+D0
+05
+61
+E6
+60
+26
+61
+A8
+8A
+00
+28
+02
+D1
+EC
+68
+00
+2C
+D2
+D1
+70
+BD
+E4
+1A
+00
+20
+24
+00
+00
+20
+70
+B5
+04
+00
+0E
+D0
+0C
+4D
+A1
+78
+28
+68
+01
+26
+82
+78
+91
+42
+0B
+D9
+00
+F0
+70
+FA
+28
+68
+46
+70
+20
+46
+00
+F0
+EB
+FA
+70
+BD
+05
+48
+00
+F0
+98
+F8
+F8
+E7
+66
+70
+21
+46
+02
+48
+00
+F0
+43
+FA
+70
+BD
+1C
+00
+00
+20
+CC
+1A
+00
+20
+10
+B5
+03
+21
+FF
+F7
+62
+FF
+10
+BD
+00
+00
+10
+B5
+04
+46
+00
+8B
+08
+43
+20
+83
+62
+78
+61
+8B
+06
+2A
+15
+D0
+05
+2A
+12
+D1
+0A
+46
+10
+42
+0F
+D0
+02
+40
+62
+83
+88
+43
+20
+83
+20
+46
+00
+F0
+63
+FA
+01
+20
+60
+70
+02
+21
+20
+20
+01
+55
+21
+46
+04
+48
+00
+F0
+1A
+FA
+10
+BD
+0A
+46
+82
+43
+ED
+D0
+10
+BD
+00
+00
+CC
+1A
+00
+20
+02
+46
+88
+00
+70
+B5
+14
+49
+40
+18
+40
+38
+C4
+6B
+00
+2C
+1D
+D0
+20
+8B
+10
+43
+20
+83
+61
+78
+65
+8B
+06
+29
+17
+D0
+05
+29
+14
+D1
+29
+46
+08
+42
+11
+D0
+01
+40
+61
+83
+A8
+43
+20
+83
+20
+46
+00
+F0
+36
+FA
+20
+8B
+02
+21
+A8
+43
+20
+83
+01
+20
+60
+70
+20
+20
+01
+55
+20
+46
+FF
+F7
+8D
+FF
+70
+BD
+29
+46
+81
+43
+EB
+D0
+70
+BD
+E4
+17
+00
+20
+70
+B5
+03
+46
+0D
+48
+0D
+46
+04
+68
+00
+2A
+20
+8B
+08
+D0
+19
+46
+81
+43
+01
+D0
+06
+20
+09
+E0
+98
+43
+20
+83
+02
+20
+70
+BD
+02
+46
+1A
+40
+01
+D0
+62
+83
+F6
+E7
+05
+20
+C1
+B2
+63
+83
+28
+46
+FF
+F7
+F0
+FE
+01
+20
+70
+BD
+1C
+00
+00
+20
+81
+42
+02
+D3
+42
+68
+8A
+42
+01
+D8
+01
+20
+70
+47
+EF
+F3
+10
+82
+D2
+07
+D2
+0F
+72
+B6
+03
+68
+0B
+60
+01
+60
+00
+D1
+62
+B6
+00
+20
+70
+47
+01
+46
+40
+68
+42
+68
+4A
+60
+0B
+78
+00
+22
+02
+2B
+05
+D0
+01
+2B
+03
+D0
+03
+2B
+01
+D0
+42
+60
+70
+47
+43
+68
+00
+2B
+01
+D0
+99
+60
+42
+60
+82
+60
+70
+47
+70
+B5
+04
+46
+15
+46
+00
+20
+20
+70
+01
+22
+62
+70
+A1
+70
+60
+60
+A0
+60
+E0
+60
+20
+61
+A0
+82
+E0
+82
+20
+83
+23
+46
+60
+83
+20
+33
+18
+70
+58
+70
+60
+8C
+00
+28
+03
+D1
+04
+48
+FF
+F7
+9B
+FE
+A0
+62
+29
+46
+20
+46
+00
+F0
+0F
+F8
+70
+BD
+70
+01
+00
+20
+03
+48
+00
+21
+01
+60
+03
+49
+09
+68
+C1
+80
+70
+47
+00
+00
+30
+00
+00
+20
+04
+13
+00
+00
+30
+B5
+42
+8C
+92
+08
+03
+D1
+0E
+4A
+12
+68
+12
+04
+92
+0C
+83
+6A
+92
+00
+9A
+18
+53
+07
+00
+D5
+12
+1F
+40
+3A
+01
+23
+1B
+06
+D3
+63
+00
+23
+91
+63
+1C
+46
+9D
+00
+5B
+1C
+54
+51
+0E
+2B
+FA
+D3
+C3
+69
+13
+62
+42
+62
+C1
+62
+80
+6A
+02
+49
+01
+60
+30
+BD
+00
+13
+00
+00
+A5
+2E
+5A
+E2
+F8
+B5
+04
+46
+40
+68
+00
+26
+0F
+46
+00
+28
+05
+D0
+60
+78
+02
+28
+18
+D0
+A0
+89
+00
+28
+2F
+D0
+A0
+89
+E1
+89
+88
+42
+3E
+D2
+20
+89
+80
+00
+00
+19
+07
+61
+72
+B6
+A0
+89
+40
+1C
+A0
+81
+62
+B6
+20
+89
+40
+1C
+80
+B2
+20
+81
+E1
+89
+88
+42
+00
+D1
+26
+81
+F8
+BD
+66
+70
+20
+46
+FF
+F7
+70
+FF
+05
+46
+20
+30
+06
+70
+21
+89
+E8
+69
+89
+00
+09
+19
+08
+61
+72
+B6
+A0
+89
+40
+1C
+A0
+81
+62
+B6
+20
+89
+40
+1C
+80
+B2
+20
+81
+E1
+89
+88
+42
+0A
+D1
+26
+81
+08
+E0
+20
+46
+FF
+F7
+57
+FF
+05
+46
+C0
+69
+04
+21
+07
+60
+20
+20
+41
+55
+01
+20
+68
+70
+28
+46
+00
+F0
+3D
+F9
+29
+46
+03
+48
+00
+F0
+F9
+F8
+F8
+BD
+03
+20
+FF
+F7
+25
+FC
+F8
+BD
+CC
+1A
+00
+20
+03
+21
+01
+70
+00
+21
+41
+70
+41
+80
+41
+60
+81
+60
+70
+47
+F8
+B5
+05
+46
+40
+88
+00
+28
+04
+D0
+25
+4C
+A9
+68
+22
+68
+91
+42
+01
+D0
+FF
+20
+F8
+BD
+40
+1E
+00
+04
+00
+0C
+68
+80
+3B
+D1
+21
+68
+68
+78
+88
+70
+6A
+68
+01
+27
+00
+2A
+28
+D0
+28
+46
+FF
+F7
+1E
+FF
+06
+46
+05
+21
+20
+30
+01
+70
+30
+46
+00
+F0
+08
+F9
+6F
+80
+AE
+60
+B0
+78
+68
+70
+15
+48
+21
+68
+40
+68
+8A
+78
+80
+78
+82
+42
+01
+D3
+30
+46
+0A
+E0
+11
+48
+00
+F0
+B8
+F8
+31
+46
+0F
+48
+00
+F0
+B4
+F8
+20
+68
+47
+70
+77
+70
+10
+E0
+FF
+F7
+50
+FE
+21
+68
+00
+20
+20
+31
+08
+70
+0B
+E0
+08
+4A
+52
+68
+92
+78
+82
+42
+06
+D9
+05
+48
+00
+F0
+A1
+F8
+20
+68
+47
+70
+00
+20
+EC
+E7
+00
+20
+F8
+BD
+00
+00
+1C
+00
+00
+20
+CC
+1A
+00
+20
+70
+B5
+0E
+46
+18
+4D
+04
+46
+41
+88
+28
+68
+00
+29
+07
+D0
+A1
+68
+81
+42
+08
+D1
+60
+88
+40
+1C
+60
+80
+00
+20
+70
+BD
+A0
+60
+80
+78
+60
+70
+F6
+E7
+00
+2E
+0F
+D0
+62
+78
+80
+78
+82
+42
+03
+D2
+88
+70
+A0
+68
+00
+F0
+A0
+F8
+60
+68
+00
+28
+06
+D0
+20
+46
+29
+68
+00
+F0
+71
+F8
+07
+E0
+01
+20
+70
+BD
+28
+68
+60
+60
+28
+68
+00
+21
+84
+60
+41
+60
+09
+21
+30
+46
+FF
+F7
+8C
+FD
+F2
+E7
+00
+00
+1C
+00
+00
+20
+70
+B5
+18
+48
+01
+21
+00
+68
+41
+70
+00
+F0
+77
+F8
+16
+4C
+65
+78
+13
+E0
+E8
+00
+01
+19
+48
+68
+02
+78
+00
+2A
+17
+D0
+01
+2A
+1A
+D0
+00
+F0
+BC
+F8
+E0
+78
+6D
+1C
+85
+42
+00
+D1
+00
+25
+72
+B6
+A0
+78
+40
+1E
+A0
+70
+62
+B6
+A0
+78
+00
+28
+E8
+D1
+65
+70
+09
+48
+FF
+F7
+8A
+FE
+00
+F0
+D7
+F8
+70
+BD
+89
+68
+89
+B2
+FF
+F7
+FC
+FD
+E6
+E7
+89
+68
+FF
+F7
+E8
+FE
+E2
+E7
+00
+00
+1C
+00
+00
+20
+60
+17
+00
+20
+CC
+1A
+00
+20
+10
+B5
+12
+4A
+D3
+68
+00
+2B
+17
+D0
+13
+46
+9B
+8A
+04
+E0
+00
+2C
+12
+D0
+22
+46
+A4
+8A
+E3
+18
+D4
+68
+8B
+42
+F7
+D3
+C4
+60
+D0
+60
+02
+61
+C4
+68
+00
+2C
+00
+D0
+20
+61
+59
+1A
+81
+82
+90
+8A
+40
+1A
+90
+82
+10
+BD
+00
+24
+C4
+60
+D0
+60
+C9
+1A
+02
+61
+91
+82
+84
+82
+10
+BD
+00
+00
+E4
+1A
+00
+20
+30
+B5
+02
+78
+00
+23
+02
+2A
+03
+D0
+01
+2A
+01
+D0
+03
+2A
+00
+D1
+01
+23
+8C
+78
+00
+E0
+10
+46
+42
+68
+00
+2A
+02
+D0
+95
+78
+A5
+42
+F8
+D2
+4A
+60
+41
+60
+00
+2B
+04
+D0
+00
+2A
+00
+D0
+91
+60
+88
+60
+30
+BD
+00
+20
+FB
+E7
+03
+49
+4A
+68
+42
+60
+00
+22
+82
+60
+48
+60
+70
+47
+00
+00
+CC
+1A
+00
+20
+10
+B5
+83
+68
+04
+46
+00
+2B
+05
+D1
+60
+78
+01
+28
+0C
+D1
+06
+4B
+03
+E0
+9B
+68
+18
+78
+00
+28
+FB
+D0
+20
+46
+00
+F0
+1D
+F8
+21
+46
+18
+46
+FF
+F7
+C3
+FF
+10
+BD
+CC
+1A
+00
+20
+10
+B5
+01
+69
+00
+29
+0F
+D0
+C2
+68
+CA
+60
+C3
+68
+00
+22
+00
+2B
+07
+D0
+8B
+8A
+84
+8A
+1B
+19
+8B
+82
+C3
+68
+19
+61
+C2
+60
+00
+E0
+8A
+82
+02
+61
+10
+BD
+00
+00
+81
+68
+00
+29
+07
+D0
+42
+68
+4A
+60
+41
+68
+00
+29
+01
+D0
+80
+68
+88
+60
+70
+47
+06
+49
+06
+E0
+4A
+68
+82
+42
+02
+D1
+40
+68
+48
+60
+70
+47
+11
+46
+00
+29
+F6
+D1
+70
+47
+00
+00
+CC
+1A
+00
+20
+10
+B5
+41
+68
+00
+29
+0E
+D0
+FF
+F7
+D9
+FD
+04
+46
+FF
+F7
+C7
+FF
+01
+20
+60
+70
+03
+21
+20
+20
+01
+55
+21
+46
+04
+48
+FF
+F7
+7E
+FF
+10
+BD
+41
+88
+49
+1C
+41
+80
+10
+BD
+00
+00
+CC
+1A
+00
+20
+10
+B5
+07
+48
+00
+68
+41
+6A
+80
+6A
+81
+42
+03
+D3
+00
+68
+04
+49
+88
+42
+02
+D0
+01
+20
+FF
+F7
+98
+FA
+10
+BD
+00
+00
+1C
+00
+00
+20
+A5
+2E
+5A
+E2
+02
+49
+48
+60
+02
+21
+41
+70
+70
+47
+00
+00
+1C
+00
+00
+20
+F7
+B5
+06
+46
+00
+20
+04
+46
+33
+4A
+34
+49
+02
+E0
+83
+00
+D4
+50
+40
+1C
+0B
+88
+98
+42
+F9
+D3
+31
+48
+30
+22
+01
+88
+30
+48
+FF
+F7
+25
+FC
+30
+48
+01
+21
+00
+68
+C9
+07
+80
+B2
+42
+18
+2E
+48
+01
+68
+2E
+48
+FF
+F7
+1A
+FC
+2D
+48
+08
+22
+01
+88
+2D
+48
+00
+68
+FF
+F7
+13
+FC
+2C
+4F
+FF
+25
+FD
+70
+7C
+84
+2B
+4A
+00
+21
+38
+46
+FF
+F7
+90
+FD
+29
+48
+04
+21
+01
+70
+44
+60
+28
+48
+01
+70
+C4
+60
+04
+61
+84
+82
+78
+6A
+20
+30
+FF
+F7
+93
+F8
+25
+48
+26
+49
+07
+60
+02
+20
+78
+70
+23
+48
+04
+70
+44
+70
+09
+78
+C1
+70
+FF
+F7
+99
+FD
+22
+48
+01
+6A
+2A
+04
+11
+43
+01
+62
+C1
+69
+02
+6A
+52
+02
+92
+0E
+92
+06
+11
+43
+C1
+61
+FF
+F7
+07
+FC
+1C
+49
+00
+28
+08
+60
+0B
+DB
+1B
+49
+41
+18
+0D
+70
+C2
+06
+D2
+0E
+01
+21
+91
+40
+40
+11
+18
+4A
+80
+00
+80
+18
+01
+60
+00
+23
+30
+46
+02
+9A
+01
+99
+00
+F0
+67
+F8
+FE
+BD
+E4
+17
+00
+20
+FE
+12
+00
+00
+18
+13
+00
+00
+40
+00
+00
+20
+00
+13
+00
+00
+1C
+13
+00
+00
+70
+01
+00
+20
+22
+13
+00
+00
+10
+00
+00
+20
+9C
+1A
+00
+20
+ED
+04
+00
+00
+CC
+1A
+00
+20
+E4
+1A
+00
+20
+1C
+00
+00
+20
+60
+17
+00
+20
+20
+13
+00
+00
+00
+ED
+00
+E0
+2C
+00
+00
+20
+00
+E4
+00
+E0
+00
+E1
+00
+E0
+10
+B5
+0B
+48
+01
+21
+00
+68
+41
+70
+FF
+F7
+DD
+FE
+FF
+F7
+01
+FC
+08
+48
+01
+68
+49
+1C
+01
+60
+FF
+F7
+1D
+FC
+00
+F0
+0D
+F8
+05
+48
+FF
+F7
+01
+FD
+FF
+F7
+4E
+FF
+10
+BD
+00
+00
+1C
+00
+00
+20
+24
+00
+00
+20
+CC
+1A
+00
+20
+70
+B5
+0D
+4C
+20
+68
+00
+28
+15
+D0
+A0
+88
+0B
+4E
+40
+1E
+A0
+80
+0A
+E0
+E8
+88
+FF
+F7
+CA
+F9
+A8
+88
+A0
+80
+28
+68
+20
+60
+29
+46
+30
+68
+FF
+F7
+CF
+FC
+A0
+88
+00
+28
+02
+D1
+25
+68
+00
+2D
+EE
+D1
+70
+BD
+38
+00
+00
+20
+10
+00
+00
+20
+FF
+B5
+08
+06
+81
+B0
+0C
+46
+16
+46
+1F
+46
+00
+0E
+00
+D1
+4C
+1C
+16
+48
+FF
+F7
+95
+FB
+05
+00
+25
+D0
+20
+02
+00
+0C
+AE
+62
+68
+84
+EF
+61
+E1
+B2
+28
+46
+01
+9A
+FF
+F7
+D4
+FC
+01
+24
+0F
+48
+0F
+49
+06
+E0
+A2
+00
+12
+18
+40
+3A
+D2
+6B
+00
+2A
+04
+D0
+64
+1C
+0A
+88
+94
+42
+F5
+D9
+00
+24
+A1
+00
+08
+18
+40
+38
+C5
+63
+EC
+70
+28
+46
+FF
+F7
+FB
+FB
+06
+48
+00
+68
+20
+30
+04
+70
+20
+46
+05
+B0
+F0
+BD
+40
+00
+00
+20
+E4
+17
+00
+20
+FE
+12
+00
+00
+1C
+00
+00
+20
+70
+B5
+21
+4C
+00
+25
+21
+4E
+21
+68
+00
+28
+02
+D0
+CA
+78
+82
+42
+1A
+D1
+4D
+70
+FE
+F7
+B4
+FF
+21
+68
+48
+62
+FF
+F7
+C3
+FE
+20
+68
+C1
+78
+89
+00
+89
+19
+40
+39
+CD
+63
+81
+6A
+17
+48
+FF
+F7
+6B
+FC
+21
+68
+16
+48
+8D
+62
+FF
+F7
+66
+FC
+00
+20
+25
+60
+FF
+F7
+C8
+FB
+19
+E0
+13
+49
+09
+88
+88
+42
+17
+D8
+80
+00
+86
+19
+40
+3E
+F4
+6B
+00
+2C
+11
+D0
+20
+46
+FF
+F7
+6E
+FE
+20
+46
+FF
+F7
+55
+FE
+F5
+63
+08
+48
+A1
+6A
+FF
+F7
+4C
+FC
+21
+46
+07
+48
+A5
+62
+FF
+F7
+47
+FC
+00
+20
+70
+BD
+FF
+20
+70
+BD
+00
+00
+1C
+00
+00
+20
+E4
+17
+00
+20
+70
+01
+00
+20
+40
+00
+00
+20
+FE
+12
+00
+00
+02
+48
+00
+68
+00
+28
+00
+D0
+C0
+78
+70
+47
+1C
+00
+00
+20
+0A
+43
+6F
+72
+74
+65
+78
+20
+4D
+69
+63
+72
+6F
+63
+6F
+6E
+74
+72
+6F
+6C
+6C
+65
+72
+20
+53
+79
+73
+74
+65
+6D
+20
+44
+65
+73
+69
+67
+6E
+20
+4B
+69
+74
+20
+2D
+20
+52
+54
+58
+20
+44
+65
+6D
+6F
+20
+2D
+20
+72
+65
+76
+69
+73
+69
+6F
+6E
+20
+24
+52
+65
+76
+69
+73
+69
+6F
+6E
+3A
+20
+32
+31
+34
+35
+35
+37
+20
+24
+0A
+00
+00
+06
+00
+20
+03
+00
+01
+05
+00
+01
+00
+0F
+27
+00
+00
+00
+00
+00
+00
+C8
+00
+00
+00
+00
+00
+00
+00
+2C
+01
+00
+00
+F0
+15
+00
+00
+10
+00
+00
+00
+44
+13
+00
+00
+00
+00
+00
+20
+40
+00
+00
+00
+04
+01
+00
+00
+84
+13
+00
+00
+40
+00
+00
+20
+20
+1E
+00
+00
+20
+01
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+E1
+F5
+05
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvopt
new file mode 100644
index 0000000..ff858fa
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvopt
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>26</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>30</TopLine>
+      <CurrentLine>51</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\rtx_demo.c</PathWithFileName>
+      <FilenameWithoutPath>rtx_demo.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\RTX_Config.c</PathWithFileName>
+      <FilenameWithoutPath>RTX_Config.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvproj
new file mode 100644
index 0000000..6c7674d
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0.uvproj
@@ -0,0 +1,440 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>rtx_demo</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output rtx_demo_cm0.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>1</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>rtx_demo.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\rtx_demo.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>RTX_Config.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\RTX_Config.c</FilePath>
+            </File>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.hex b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.hex
new file mode 100644
index 0000000..1ab6c31
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.hex
@@ -0,0 +1,4996 @@
+60
+1E
+00
+20
+01
+03
+00
+00
+09
+03
+00
+00
+0B
+03
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+E9
+01
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+8D
+02
+00
+00
+ED
+02
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+00
+00
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+13
+03
+00
+00
+00
+F0
+02
+F8
+00
+F0
+48
+F8
+0C
+A0
+30
+C8
+08
+38
+24
+18
+2D
+18
+A2
+46
+67
+1E
+AB
+46
+54
+46
+5D
+46
+AC
+42
+01
+D1
+00
+F0
+3A
+F8
+7E
+46
+0F
+3E
+0F
+CC
+B6
+46
+01
+26
+33
+42
+00
+D0
+FB
+1A
+A2
+46
+AB
+46
+33
+43
+18
+47
+28
+12
+00
+00
+48
+12
+00
+00
+10
+3A
+02
+D3
+78
+C8
+78
+C1
+FA
+D8
+52
+07
+01
+D3
+30
+C8
+30
+C1
+01
+D5
+04
+68
+0C
+60
+70
+47
+00
+00
+00
+23
+00
+24
+00
+25
+00
+26
+10
+3A
+01
+D3
+78
+C1
+FB
+D8
+52
+07
+00
+D3
+30
+C1
+00
+D5
+0B
+60
+70
+47
+10
+B5
+64
+29
+02
+D1
+00
+F0
+73
+FA
+10
+BD
+00
+20
+10
+BD
+1F
+B5
+C0
+46
+C0
+46
+1F
+BD
+10
+B5
+10
+BD
+00
+F0
+50
+FB
+11
+46
+FF
+F7
+F5
+FF
+00
+F0
+25
+F9
+00
+F0
+68
+FB
+03
+B4
+FF
+F7
+F2
+FF
+03
+BC
+00
+F0
+BA
+F9
+00
+00
+80
+F3
+09
+88
+70
+47
+EF
+F3
+09
+80
+70
+47
+68
+46
+80
+F3
+09
+88
+06
+48
+00
+78
+C0
+07
+03
+D1
+03
+20
+80
+F3
+14
+88
+70
+47
+02
+20
+80
+F3
+14
+88
+70
+47
+00
+00
+0C
+13
+00
+00
+06
+4B
+9C
+46
+EF
+F3
+05
+83
+1B
+06
+05
+D1
+EF
+F3
+14
+83
+DB
+07
+01
+D0
+00
+DF
+70
+47
+60
+47
+00
+00
+C3
+08
+00
+00
+06
+4B
+9C
+46
+EF
+F3
+05
+83
+1B
+06
+05
+D1
+EF
+F3
+14
+83
+DB
+07
+01
+D0
+00
+DF
+70
+47
+60
+47
+00
+00
+09
+0B
+00
+00
+EF
+F3
+09
+80
+81
+69
+89
+1E
+09
+78
+00
+29
+33
+D1
+A6
+46
+1F
+C8
+A4
+46
+74
+46
+E0
+47
+1F
+4B
+06
+CB
+91
+42
+24
+D0
+08
+3B
+00
+29
+10
+D0
+0C
+B4
+20
+31
+01
+23
+4B
+70
+EF
+F3
+09
+83
+20
+3B
+4B
+60
+F0
+C3
+44
+46
+4D
+46
+56
+46
+5F
+46
+F0
+C3
+00
+F0
+BB
+FE
+0C
+BC
+1A
+60
+20
+32
+53
+68
+10
+33
+F0
+CB
+A0
+46
+A9
+46
+B2
+46
+BB
+46
+83
+F3
+09
+88
+20
+3B
+F0
+CB
+50
+78
+00
+28
+03
+D0
+10
+78
+EF
+F3
+09
+83
+18
+60
+02
+23
+DB
+43
+18
+47
+10
+B5
+08
+4A
+12
+68
+91
+42
+09
+D8
+07
+48
+89
+00
+40
+58
+86
+46
+1F
+C8
+A4
+46
+F0
+47
+EF
+F3
+09
+84
+0F
+C4
+10
+BD
+00
+00
+1C
+00
+00
+20
+48
+08
+00
+00
+48
+08
+00
+00
+00
+F0
+A0
+FD
+15
+4B
+06
+CB
+91
+42
+23
+D0
+08
+3B
+0C
+B4
+20
+31
+00
+23
+4B
+70
+EF
+F3
+09
+83
+20
+3B
+4B
+60
+F0
+C3
+44
+46
+4D
+46
+56
+46
+5F
+46
+F0
+C3
+00
+F0
+75
+FE
+0C
+BC
+1A
+60
+20
+32
+53
+68
+10
+33
+F0
+CB
+A0
+46
+A9
+46
+B2
+46
+BB
+46
+83
+F3
+09
+88
+20
+3B
+F0
+CB
+50
+78
+00
+28
+01
+D0
+10
+78
+18
+61
+02
+23
+DB
+43
+18
+47
+00
+00
+1C
+00
+00
+20
+00
+F0
+0A
+FF
+CE
+E7
+00
+00
+00
+F0
+E4
+FA
+00
+F0
+04
+FF
+C8
+E7
+00
+00
+07
+48
+80
+47
+07
+48
+00
+47
+FE
+E7
+FE
+E7
+FE
+E7
+FE
+E7
+FE
+E7
+FE
+E7
+04
+48
+05
+49
+05
+4A
+06
+4B
+70
+47
+00
+00
+85
+05
+00
+00
+C1
+00
+00
+00
+60
+1B
+00
+20
+60
+1E
+00
+20
+60
+1C
+00
+20
+60
+1C
+00
+20
+28
+4C
+29
+4F
+01
+20
+BC
+46
+00
+DF
+28
+A0
+00
+F0
+A8
+F9
+29
+4F
+01
+20
+BC
+46
+A1
+68
+00
+DF
+F2
+E7
+27
+4D
+21
+4C
+27
+4F
+01
+22
+29
+46
+10
+46
+BC
+46
+00
+DF
+21
+68
+25
+A0
+49
+1C
+21
+60
+00
+F0
+18
+F9
+20
+68
+03
+28
+F0
+DB
+25
+A0
+00
+F0
+8E
+F9
+28
+A0
+00
+F0
+8B
+F9
+00
+F0
+97
+F8
+E7
+E7
+00
+23
+2B
+4F
+1A
+46
+01
+21
+28
+48
+BC
+46
+00
+DF
+11
+4C
+00
+23
+60
+60
+1A
+46
+01
+21
+26
+48
+BC
+46
+00
+DF
+26
+4F
+A0
+60
+00
+20
+BC
+46
+00
+DF
+80
+B5
+24
+49
+00
+20
+88
+61
+00
+F0
+66
+F8
+22
+48
+00
+F0
+6B
+F9
+22
+A0
+00
+F0
+68
+F9
+FF
+F7
+DC
+FE
+2D
+4F
+00
+22
+11
+46
+2B
+48
+BC
+46
+00
+DF
+00
+20
+80
+BD
+00
+00
+00
+20
+15
+0A
+00
+00
+74
+61
+73
+6B
+20
+31
+20
+2D
+3E
+00
+00
+00
+6D
+0A
+00
+00
+FF
+FF
+00
+00
+C9
+0A
+00
+00
+20
+20
+74
+61
+73
+6B
+20
+32
+2C
+20
+25
+64
+0A
+00
+00
+00
+54
+61
+73
+6B
+73
+20
+72
+61
+6E
+20
+33
+20
+74
+69
+6D
+65
+73
+2E
+00
+00
+2A
+2A
+20
+54
+45
+53
+54
+20
+50
+41
+53
+53
+45
+44
+20
+2A
+2A
+20
+0A
+00
+39
+03
+00
+00
+81
+11
+00
+00
+55
+03
+00
+00
+FD
+11
+00
+00
+00
+E0
+00
+E0
+A8
+12
+00
+00
+2D
+20
+45
+78
+65
+63
+75
+74
+65
+20
+74
+61
+73
+6B
+20
+31
+20
+2D
+3E
+20
+74
+61
+73
+6B
+20
+32
+20
+73
+65
+71
+75
+65
+6E
+63
+65
+20
+74
+68
+72
+65
+65
+20
+74
+69
+6D
+65
+73
+0A
+00
+00
+00
+00
+89
+03
+00
+00
+DD
+0F
+00
+00
+0C
+48
+10
+21
+01
+61
+41
+21
+81
+60
+0B
+49
+20
+20
+88
+61
+70
+47
+08
+49
+4A
+68
+D2
+07
+FC
+D1
+08
+60
+70
+47
+05
+48
+41
+68
+89
+07
+FC
+D5
+00
+68
+C0
+B2
+70
+47
+04
+20
+FF
+F7
+F0
+FF
+FE
+E7
+00
+60
+00
+40
+00
+10
+01
+40
+10
+B5
+C0
+B2
+FF
+F7
+E7
+FF
+10
+BD
+10
+B5
+FF
+F7
+E9
+FF
+FF
+F7
+E1
+FF
+10
+BD
+00
+20
+C0
+43
+70
+47
+10
+B5
+C0
+B2
+FF
+F7
+D9
+FF
+10
+BD
+FE
+E7
+FE
+E7
+70
+47
+FE
+E7
+10
+B5
+00
+F0
+D0
+FE
+00
+28
+05
+D0
+60
+21
+48
+43
+17
+49
+40
+18
+60
+38
+10
+BD
+16
+48
+10
+BD
+10
+B5
+16
+4A
+11
+68
+08
+29
+00
+D3
+FE
+E7
+0C
+23
+4B
+43
+13
+4C
+49
+1C
+1B
+19
+03
+60
+18
+46
+11
+60
+00
+F0
+C0
+FB
+01
+20
+10
+BD
+B0
+B5
+04
+46
+00
+F0
+B0
+FE
+00
+28
+04
+D0
+0D
+4F
+0C
+49
+BC
+46
+20
+68
+00
+DF
+B0
+BD
+B0
+B5
+04
+46
+00
+F0
+A4
+FE
+00
+28
+03
+D0
+08
+4F
+20
+68
+BC
+46
+00
+DF
+B0
+BD
+00
+00
+FC
+17
+00
+20
+FC
+1A
+00
+20
+14
+00
+00
+20
+3C
+1A
+00
+20
+FF
+FF
+00
+00
+65
+0D
+00
+00
+BD
+0C
+00
+00
+04
+49
+03
+48
+08
+60
+70
+47
+02
+49
+01
+48
+08
+60
+70
+47
+00
+E1
+F5
+05
+18
+00
+00
+20
+00
+48
+70
+47
+FC
+1A
+00
+20
+70
+47
+00
+00
+0F
+B4
+05
+49
+10
+B5
+03
+AA
+02
+98
+00
+F0
+E7
+F8
+10
+BC
+08
+BC
+04
+B0
+18
+47
+00
+00
+0C
+00
+00
+20
+F8
+B5
+04
+46
+0E
+46
+00
+20
+2D
+E0
+E1
+68
+20
+46
+88
+47
+00
+28
+2A
+D0
+25
+28
+02
+D0
+62
+68
+A1
+68
+20
+E0
+E1
+68
+20
+46
+00
+27
+88
+47
+05
+00
+1F
+D0
+28
+46
+41
+38
+19
+28
+02
+D8
+01
+27
+FF
+02
+20
+35
+32
+46
+20
+46
+27
+60
+29
+46
+FF
+F7
+9E
+FD
+00
+28
+08
+D0
+01
+28
+04
+D0
+F6
+1D
+F6
+08
+F6
+00
+08
+36
+D9
+E7
+36
+1D
+D7
+E7
+62
+68
+28
+46
+A1
+68
+90
+47
+20
+6A
+40
+1C
+20
+62
+CF
+E7
+20
+6A
+F8
+BD
+00
+00
+F7
+B5
+00
+26
+75
+29
+10
+68
+00
+99
+14
+A5
+11
+D0
+C0
+46
+C0
+46
+00
+28
+02
+DA
+40
+42
+11
+A5
+08
+E0
+00
+99
+09
+68
+8A
+07
+01
+D5
+0F
+A5
+02
+E0
+49
+07
+04
+D5
+0E
+A5
+01
+26
+01
+E0
+C0
+46
+C0
+46
+00
+9F
+00
+24
+24
+37
+04
+E0
+00
+F0
+9B
+F8
+30
+31
+39
+55
+64
+1C
+00
+28
+F8
+D1
+33
+46
+2A
+46
+21
+46
+00
+98
+00
+F0
+23
+F8
+FE
+BD
+00
+00
+00
+00
+00
+00
+2D
+00
+00
+00
+2B
+00
+00
+00
+20
+00
+00
+00
+10
+B5
+04
+46
+03
+E0
+FF
+F7
+11
+FF
+40
+1C
+08
+D0
+20
+78
+05
+49
+64
+1C
+00
+28
+F6
+D1
+0A
+20
+FF
+F7
+07
+FF
+10
+BD
+00
+20
+C0
+43
+10
+BD
+00
+00
+0C
+00
+00
+20
+70
+47
+70
+47
+70
+47
+FF
+B5
+04
+46
+0D
+46
+81
+B0
+24
+30
+00
+90
+21
+68
+88
+06
+04
+D5
+10
+22
+E0
+69
+91
+43
+21
+60
+00
+E0
+01
+20
+A8
+42
+01
+DD
+47
+1B
+00
+E0
+00
+27
+04
+98
+A1
+69
+7A
+19
+10
+18
+08
+1A
+A0
+61
+20
+68
+C0
+06
+02
+D4
+20
+46
+C0
+46
+C0
+46
+00
+26
+08
+E0
+03
+98
+62
+68
+A1
+68
+80
+5D
+90
+47
+20
+6A
+40
+1C
+76
+1C
+20
+62
+04
+98
+86
+42
+F3
+DB
+20
+68
+C0
+06
+0A
+D5
+20
+46
+C0
+46
+C0
+46
+06
+E0
+62
+68
+A1
+68
+30
+20
+90
+47
+20
+6A
+40
+1C
+20
+62
+38
+46
+7F
+1E
+00
+28
+F4
+DC
+07
+E0
+00
+98
+62
+68
+A1
+68
+40
+5D
+90
+47
+20
+6A
+40
+1C
+20
+62
+28
+46
+6D
+1E
+00
+28
+F3
+DC
+20
+46
+C0
+46
+C0
+46
+20
+68
+00
+06
+02
+D5
+02
+20
+05
+B0
+F0
+BD
+01
+20
+FB
+E7
+00
+00
+08
+4B
+70
+B5
+0C
+46
+7B
+44
+00
+F0
+27
+F8
+05
+46
+20
+46
+FF
+F7
+A5
+FE
+00
+28
+02
+D0
+00
+20
+C0
+43
+70
+BD
+28
+46
+70
+BD
+00
+00
+3F
+FD
+FF
+FF
+01
+46
+80
+08
+08
+1A
+02
+09
+10
+18
+02
+0A
+10
+18
+02
+0C
+10
+18
+C0
+08
+82
+00
+12
+18
+52
+00
+89
+1A
+01
+E0
+0A
+39
+40
+1C
+0A
+29
+FB
+D2
+70
+47
+01
+69
+4A
+1C
+02
+61
+08
+78
+70
+47
+00
+B5
+8F
+B0
+02
+91
+00
+21
+05
+91
+05
+49
+01
+93
+79
+44
+03
+91
+11
+46
+04
+90
+68
+46
+FF
+F7
+E5
+FE
+0F
+B0
+00
+BD
+00
+00
+E5
+FF
+FF
+FF
+75
+46
+FF
+F7
+C9
+FE
+AE
+46
+05
+00
+69
+46
+53
+46
+C0
+08
+C0
+00
+85
+46
+18
+B0
+20
+B5
+FF
+F7
+7E
+FD
+60
+BC
+00
+27
+49
+08
+B6
+46
+00
+26
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+C0
+C5
+40
+3D
+49
+00
+8D
+46
+70
+47
+04
+46
+C0
+46
+C0
+46
+20
+46
+FF
+F7
+92
+FC
+00
+00
+00
+00
+00
+00
+10
+B5
+00
+2A
+06
+DA
+52
+00
+52
+08
+D2
+1D
+D3
+08
+DB
+00
+10
+22
+03
+E0
+D2
+1C
+93
+08
+9B
+00
+0C
+22
+00
+2B
+02
+D0
+9C
+18
+8C
+42
+01
+D9
+01
+20
+10
+BD
+82
+18
+83
+60
+41
+18
+02
+60
+41
+60
+C9
+1A
+D0
+18
+88
+42
+02
+D8
+10
+60
+02
+46
+F9
+E7
+00
+20
+10
+60
+10
+BD
+07
+48
+01
+68
+07
+48
+41
+61
+00
+21
+81
+61
+07
+21
+01
+61
+05
+48
+01
+6A
+FF
+22
+12
+06
+11
+43
+01
+62
+40
+17
+70
+47
+08
+13
+00
+00
+00
+E0
+00
+E0
+00
+ED
+00
+E0
+70
+47
+01
+46
+EF
+F3
+10
+80
+C2
+07
+D2
+0F
+72
+B6
+08
+68
+00
+28
+01
+D0
+03
+68
+0B
+60
+00
+2A
+00
+D1
+62
+B6
+70
+47
+70
+B5
+0D
+46
+00
+28
+0F
+D0
+08
+49
+09
+4C
+88
+42
+04
+D2
+22
+68
+01
+46
+10
+46
+00
+F0
+A3
+FA
+20
+68
+45
+70
+05
+48
+00
+F0
+15
+F9
+00
+F0
+62
+FB
+70
+BD
+00
+00
+FF
+FF
+00
+00
+1C
+00
+00
+20
+CC
+1A
+00
+20
+10
+B5
+0E
+48
+0C
+49
+42
+68
+0D
+48
+0B
+68
+00
+68
+93
+42
+04
+D0
+0A
+60
+CB
+88
+42
+1E
+9A
+18
+8A
+80
+8A
+88
+80
+B2
+82
+42
+08
+D1
+00
+20
+08
+60
+04
+48
+00
+F0
+F4
+F8
+01
+46
+02
+48
+00
+F0
+A1
+FA
+10
+BD
+30
+00
+00
+20
+CC
+1A
+00
+20
+24
+00
+00
+20
+70
+B5
+1B
+4D
+E8
+68
+00
+28
+31
+D0
+A8
+8A
+40
+1E
+A8
+82
+00
+26
+26
+E0
+A0
+68
+00
+28
+08
+D0
+61
+68
+41
+60
+60
+68
+00
+28
+02
+D0
+A1
+68
+81
+60
+66
+60
+A6
+60
+10
+48
+21
+46
+18
+38
+00
+F0
+7F
+FA
+A0
+8A
+A8
+82
+60
+78
+04
+28
+04
+D1
+0C
+49
+E0
+8A
+09
+68
+40
+18
+A0
+82
+01
+20
+60
+70
+20
+21
+08
+55
+E0
+68
+E8
+60
+E0
+68
+00
+28
+01
+D0
+05
+61
+E6
+60
+26
+61
+A8
+8A
+00
+28
+02
+D1
+EC
+68
+00
+2C
+D2
+D1
+70
+BD
+E4
+1A
+00
+20
+24
+00
+00
+20
+70
+B5
+04
+00
+0E
+D0
+0C
+4D
+A1
+78
+28
+68
+01
+26
+82
+78
+91
+42
+0B
+D9
+00
+F0
+70
+FA
+28
+68
+46
+70
+20
+46
+00
+F0
+EB
+FA
+70
+BD
+05
+48
+00
+F0
+98
+F8
+F8
+E7
+66
+70
+21
+46
+02
+48
+00
+F0
+43
+FA
+70
+BD
+1C
+00
+00
+20
+CC
+1A
+00
+20
+10
+B5
+03
+21
+FF
+F7
+62
+FF
+10
+BD
+00
+00
+10
+B5
+04
+46
+00
+8B
+08
+43
+20
+83
+62
+78
+61
+8B
+06
+2A
+15
+D0
+05
+2A
+12
+D1
+0A
+46
+10
+42
+0F
+D0
+02
+40
+62
+83
+88
+43
+20
+83
+20
+46
+00
+F0
+63
+FA
+01
+20
+60
+70
+02
+21
+20
+20
+01
+55
+21
+46
+04
+48
+00
+F0
+1A
+FA
+10
+BD
+0A
+46
+82
+43
+ED
+D0
+10
+BD
+00
+00
+CC
+1A
+00
+20
+02
+46
+88
+00
+70
+B5
+14
+49
+40
+18
+40
+38
+C4
+6B
+00
+2C
+1D
+D0
+20
+8B
+10
+43
+20
+83
+61
+78
+65
+8B
+06
+29
+17
+D0
+05
+29
+14
+D1
+29
+46
+08
+42
+11
+D0
+01
+40
+61
+83
+A8
+43
+20
+83
+20
+46
+00
+F0
+36
+FA
+20
+8B
+02
+21
+A8
+43
+20
+83
+01
+20
+60
+70
+20
+20
+01
+55
+20
+46
+FF
+F7
+8D
+FF
+70
+BD
+29
+46
+81
+43
+EB
+D0
+70
+BD
+E4
+17
+00
+20
+70
+B5
+03
+46
+0D
+48
+0D
+46
+04
+68
+00
+2A
+20
+8B
+08
+D0
+19
+46
+81
+43
+01
+D0
+06
+20
+09
+E0
+98
+43
+20
+83
+02
+20
+70
+BD
+02
+46
+1A
+40
+01
+D0
+62
+83
+F6
+E7
+05
+20
+C1
+B2
+63
+83
+28
+46
+FF
+F7
+F0
+FE
+01
+20
+70
+BD
+1C
+00
+00
+20
+81
+42
+02
+D3
+42
+68
+8A
+42
+01
+D8
+01
+20
+70
+47
+EF
+F3
+10
+82
+D2
+07
+D2
+0F
+72
+B6
+03
+68
+0B
+60
+01
+60
+00
+D1
+62
+B6
+00
+20
+70
+47
+01
+46
+40
+68
+42
+68
+4A
+60
+0B
+78
+00
+22
+02
+2B
+05
+D0
+01
+2B
+03
+D0
+03
+2B
+01
+D0
+42
+60
+70
+47
+43
+68
+00
+2B
+01
+D0
+99
+60
+42
+60
+82
+60
+70
+47
+70
+B5
+04
+46
+15
+46
+00
+20
+20
+70
+01
+22
+62
+70
+A1
+70
+60
+60
+A0
+60
+E0
+60
+20
+61
+A0
+82
+E0
+82
+20
+83
+23
+46
+60
+83
+20
+33
+18
+70
+58
+70
+60
+8C
+00
+28
+03
+D1
+04
+48
+FF
+F7
+9B
+FE
+A0
+62
+29
+46
+20
+46
+00
+F0
+0F
+F8
+70
+BD
+70
+01
+00
+20
+03
+48
+00
+21
+01
+60
+03
+49
+09
+68
+C1
+80
+70
+47
+00
+00
+30
+00
+00
+20
+04
+13
+00
+00
+30
+B5
+42
+8C
+92
+08
+03
+D1
+0E
+4A
+12
+68
+12
+04
+92
+0C
+83
+6A
+92
+00
+9A
+18
+53
+07
+00
+D5
+12
+1F
+40
+3A
+01
+23
+1B
+06
+D3
+63
+00
+23
+91
+63
+1C
+46
+9D
+00
+5B
+1C
+54
+51
+0E
+2B
+FA
+D3
+C3
+69
+13
+62
+42
+62
+C1
+62
+80
+6A
+02
+49
+01
+60
+30
+BD
+00
+13
+00
+00
+A5
+2E
+5A
+E2
+F8
+B5
+04
+46
+40
+68
+00
+26
+0F
+46
+00
+28
+05
+D0
+60
+78
+02
+28
+18
+D0
+A0
+89
+00
+28
+2F
+D0
+A0
+89
+E1
+89
+88
+42
+3E
+D2
+20
+89
+80
+00
+00
+19
+07
+61
+72
+B6
+A0
+89
+40
+1C
+A0
+81
+62
+B6
+20
+89
+40
+1C
+80
+B2
+20
+81
+E1
+89
+88
+42
+00
+D1
+26
+81
+F8
+BD
+66
+70
+20
+46
+FF
+F7
+70
+FF
+05
+46
+20
+30
+06
+70
+21
+89
+E8
+69
+89
+00
+09
+19
+08
+61
+72
+B6
+A0
+89
+40
+1C
+A0
+81
+62
+B6
+20
+89
+40
+1C
+80
+B2
+20
+81
+E1
+89
+88
+42
+0A
+D1
+26
+81
+08
+E0
+20
+46
+FF
+F7
+57
+FF
+05
+46
+C0
+69
+04
+21
+07
+60
+20
+20
+41
+55
+01
+20
+68
+70
+28
+46
+00
+F0
+3D
+F9
+29
+46
+03
+48
+00
+F0
+F9
+F8
+F8
+BD
+03
+20
+FF
+F7
+25
+FC
+F8
+BD
+CC
+1A
+00
+20
+03
+21
+01
+70
+00
+21
+41
+70
+41
+80
+41
+60
+81
+60
+70
+47
+F8
+B5
+05
+46
+40
+88
+00
+28
+04
+D0
+25
+4C
+A9
+68
+22
+68
+91
+42
+01
+D0
+FF
+20
+F8
+BD
+40
+1E
+00
+04
+00
+0C
+68
+80
+3B
+D1
+21
+68
+68
+78
+88
+70
+6A
+68
+01
+27
+00
+2A
+28
+D0
+28
+46
+FF
+F7
+1E
+FF
+06
+46
+05
+21
+20
+30
+01
+70
+30
+46
+00
+F0
+08
+F9
+6F
+80
+AE
+60
+B0
+78
+68
+70
+15
+48
+21
+68
+40
+68
+8A
+78
+80
+78
+82
+42
+01
+D3
+30
+46
+0A
+E0
+11
+48
+00
+F0
+B8
+F8
+31
+46
+0F
+48
+00
+F0
+B4
+F8
+20
+68
+47
+70
+77
+70
+10
+E0
+FF
+F7
+50
+FE
+21
+68
+00
+20
+20
+31
+08
+70
+0B
+E0
+08
+4A
+52
+68
+92
+78
+82
+42
+06
+D9
+05
+48
+00
+F0
+A1
+F8
+20
+68
+47
+70
+00
+20
+EC
+E7
+00
+20
+F8
+BD
+00
+00
+1C
+00
+00
+20
+CC
+1A
+00
+20
+70
+B5
+0E
+46
+18
+4D
+04
+46
+41
+88
+28
+68
+00
+29
+07
+D0
+A1
+68
+81
+42
+08
+D1
+60
+88
+40
+1C
+60
+80
+00
+20
+70
+BD
+A0
+60
+80
+78
+60
+70
+F6
+E7
+00
+2E
+0F
+D0
+62
+78
+80
+78
+82
+42
+03
+D2
+88
+70
+A0
+68
+00
+F0
+A0
+F8
+60
+68
+00
+28
+06
+D0
+20
+46
+29
+68
+00
+F0
+71
+F8
+07
+E0
+01
+20
+70
+BD
+28
+68
+60
+60
+28
+68
+00
+21
+84
+60
+41
+60
+09
+21
+30
+46
+FF
+F7
+8C
+FD
+F2
+E7
+00
+00
+1C
+00
+00
+20
+70
+B5
+18
+48
+01
+21
+00
+68
+41
+70
+00
+F0
+77
+F8
+16
+4C
+65
+78
+13
+E0
+E8
+00
+01
+19
+48
+68
+02
+78
+00
+2A
+17
+D0
+01
+2A
+1A
+D0
+00
+F0
+BC
+F8
+E0
+78
+6D
+1C
+85
+42
+00
+D1
+00
+25
+72
+B6
+A0
+78
+40
+1E
+A0
+70
+62
+B6
+A0
+78
+00
+28
+E8
+D1
+65
+70
+09
+48
+FF
+F7
+8A
+FE
+00
+F0
+D7
+F8
+70
+BD
+89
+68
+89
+B2
+FF
+F7
+FC
+FD
+E6
+E7
+89
+68
+FF
+F7
+E8
+FE
+E2
+E7
+00
+00
+1C
+00
+00
+20
+60
+17
+00
+20
+CC
+1A
+00
+20
+10
+B5
+12
+4A
+D3
+68
+00
+2B
+17
+D0
+13
+46
+9B
+8A
+04
+E0
+00
+2C
+12
+D0
+22
+46
+A4
+8A
+E3
+18
+D4
+68
+8B
+42
+F7
+D3
+C4
+60
+D0
+60
+02
+61
+C4
+68
+00
+2C
+00
+D0
+20
+61
+59
+1A
+81
+82
+90
+8A
+40
+1A
+90
+82
+10
+BD
+00
+24
+C4
+60
+D0
+60
+C9
+1A
+02
+61
+91
+82
+84
+82
+10
+BD
+00
+00
+E4
+1A
+00
+20
+30
+B5
+02
+78
+00
+23
+02
+2A
+03
+D0
+01
+2A
+01
+D0
+03
+2A
+00
+D1
+01
+23
+8C
+78
+00
+E0
+10
+46
+42
+68
+00
+2A
+02
+D0
+95
+78
+A5
+42
+F8
+D2
+4A
+60
+41
+60
+00
+2B
+04
+D0
+00
+2A
+00
+D0
+91
+60
+88
+60
+30
+BD
+00
+20
+FB
+E7
+03
+49
+4A
+68
+42
+60
+00
+22
+82
+60
+48
+60
+70
+47
+00
+00
+CC
+1A
+00
+20
+10
+B5
+83
+68
+04
+46
+00
+2B
+05
+D1
+60
+78
+01
+28
+0C
+D1
+06
+4B
+03
+E0
+9B
+68
+18
+78
+00
+28
+FB
+D0
+20
+46
+00
+F0
+1D
+F8
+21
+46
+18
+46
+FF
+F7
+C3
+FF
+10
+BD
+CC
+1A
+00
+20
+10
+B5
+01
+69
+00
+29
+0F
+D0
+C2
+68
+CA
+60
+C3
+68
+00
+22
+00
+2B
+07
+D0
+8B
+8A
+84
+8A
+1B
+19
+8B
+82
+C3
+68
+19
+61
+C2
+60
+00
+E0
+8A
+82
+02
+61
+10
+BD
+00
+00
+81
+68
+00
+29
+07
+D0
+42
+68
+4A
+60
+41
+68
+00
+29
+01
+D0
+80
+68
+88
+60
+70
+47
+06
+49
+06
+E0
+4A
+68
+82
+42
+02
+D1
+40
+68
+48
+60
+70
+47
+11
+46
+00
+29
+F6
+D1
+70
+47
+00
+00
+CC
+1A
+00
+20
+10
+B5
+41
+68
+00
+29
+0E
+D0
+FF
+F7
+D9
+FD
+04
+46
+FF
+F7
+C7
+FF
+01
+20
+60
+70
+03
+21
+20
+20
+01
+55
+21
+46
+04
+48
+FF
+F7
+7E
+FF
+10
+BD
+41
+88
+49
+1C
+41
+80
+10
+BD
+00
+00
+CC
+1A
+00
+20
+10
+B5
+07
+48
+00
+68
+41
+6A
+80
+6A
+81
+42
+03
+D3
+00
+68
+04
+49
+88
+42
+02
+D0
+01
+20
+FF
+F7
+98
+FA
+10
+BD
+00
+00
+1C
+00
+00
+20
+A5
+2E
+5A
+E2
+02
+49
+48
+60
+02
+21
+41
+70
+70
+47
+00
+00
+1C
+00
+00
+20
+F7
+B5
+06
+46
+00
+20
+04
+46
+33
+4A
+34
+49
+02
+E0
+83
+00
+D4
+50
+40
+1C
+0B
+88
+98
+42
+F9
+D3
+31
+48
+30
+22
+01
+88
+30
+48
+FF
+F7
+25
+FC
+30
+48
+01
+21
+00
+68
+C9
+07
+80
+B2
+42
+18
+2E
+48
+01
+68
+2E
+48
+FF
+F7
+1A
+FC
+2D
+48
+08
+22
+01
+88
+2D
+48
+00
+68
+FF
+F7
+13
+FC
+2C
+4F
+FF
+25
+FD
+70
+7C
+84
+2B
+4A
+00
+21
+38
+46
+FF
+F7
+90
+FD
+29
+48
+04
+21
+01
+70
+44
+60
+28
+48
+01
+70
+C4
+60
+04
+61
+84
+82
+78
+6A
+20
+30
+FF
+F7
+93
+F8
+25
+48
+26
+49
+07
+60
+02
+20
+78
+70
+23
+48
+04
+70
+44
+70
+09
+78
+C1
+70
+FF
+F7
+99
+FD
+22
+48
+01
+6A
+2A
+04
+11
+43
+01
+62
+C1
+69
+02
+6A
+52
+02
+92
+0E
+92
+06
+11
+43
+C1
+61
+FF
+F7
+07
+FC
+1C
+49
+00
+28
+08
+60
+0B
+DB
+1B
+49
+41
+18
+0D
+70
+C2
+06
+D2
+0E
+01
+21
+91
+40
+40
+11
+18
+4A
+80
+00
+80
+18
+01
+60
+00
+23
+30
+46
+02
+9A
+01
+99
+00
+F0
+67
+F8
+FE
+BD
+E4
+17
+00
+20
+FE
+12
+00
+00
+18
+13
+00
+00
+40
+00
+00
+20
+00
+13
+00
+00
+1C
+13
+00
+00
+70
+01
+00
+20
+22
+13
+00
+00
+10
+00
+00
+20
+9C
+1A
+00
+20
+ED
+04
+00
+00
+CC
+1A
+00
+20
+E4
+1A
+00
+20
+1C
+00
+00
+20
+60
+17
+00
+20
+20
+13
+00
+00
+00
+ED
+00
+E0
+2C
+00
+00
+20
+00
+E4
+00
+E0
+00
+E1
+00
+E0
+10
+B5
+0B
+48
+01
+21
+00
+68
+41
+70
+FF
+F7
+DD
+FE
+FF
+F7
+01
+FC
+08
+48
+01
+68
+49
+1C
+01
+60
+FF
+F7
+1D
+FC
+00
+F0
+0D
+F8
+05
+48
+FF
+F7
+01
+FD
+FF
+F7
+4E
+FF
+10
+BD
+00
+00
+1C
+00
+00
+20
+24
+00
+00
+20
+CC
+1A
+00
+20
+70
+B5
+0D
+4C
+20
+68
+00
+28
+15
+D0
+A0
+88
+0B
+4E
+40
+1E
+A0
+80
+0A
+E0
+E8
+88
+FF
+F7
+CA
+F9
+A8
+88
+A0
+80
+28
+68
+20
+60
+29
+46
+30
+68
+FF
+F7
+CF
+FC
+A0
+88
+00
+28
+02
+D1
+25
+68
+00
+2D
+EE
+D1
+70
+BD
+38
+00
+00
+20
+10
+00
+00
+20
+FF
+B5
+08
+06
+81
+B0
+0C
+46
+16
+46
+1F
+46
+00
+0E
+00
+D1
+4C
+1C
+16
+48
+FF
+F7
+95
+FB
+05
+00
+25
+D0
+20
+02
+00
+0C
+AE
+62
+68
+84
+EF
+61
+E1
+B2
+28
+46
+01
+9A
+FF
+F7
+D4
+FC
+01
+24
+0F
+48
+0F
+49
+06
+E0
+A2
+00
+12
+18
+40
+3A
+D2
+6B
+00
+2A
+04
+D0
+64
+1C
+0A
+88
+94
+42
+F5
+D9
+00
+24
+A1
+00
+08
+18
+40
+38
+C5
+63
+EC
+70
+28
+46
+FF
+F7
+FB
+FB
+06
+48
+00
+68
+20
+30
+04
+70
+20
+46
+05
+B0
+F0
+BD
+40
+00
+00
+20
+E4
+17
+00
+20
+FE
+12
+00
+00
+1C
+00
+00
+20
+70
+B5
+21
+4C
+00
+25
+21
+4E
+21
+68
+00
+28
+02
+D0
+CA
+78
+82
+42
+1A
+D1
+4D
+70
+FE
+F7
+B4
+FF
+21
+68
+48
+62
+FF
+F7
+C3
+FE
+20
+68
+C1
+78
+89
+00
+89
+19
+40
+39
+CD
+63
+81
+6A
+17
+48
+FF
+F7
+6B
+FC
+21
+68
+16
+48
+8D
+62
+FF
+F7
+66
+FC
+00
+20
+25
+60
+FF
+F7
+C8
+FB
+19
+E0
+13
+49
+09
+88
+88
+42
+17
+D8
+80
+00
+86
+19
+40
+3E
+F4
+6B
+00
+2C
+11
+D0
+20
+46
+FF
+F7
+6E
+FE
+20
+46
+FF
+F7
+55
+FE
+F5
+63
+08
+48
+A1
+6A
+FF
+F7
+4C
+FC
+21
+46
+07
+48
+A5
+62
+FF
+F7
+47
+FC
+00
+20
+70
+BD
+FF
+20
+70
+BD
+00
+00
+1C
+00
+00
+20
+E4
+17
+00
+20
+70
+01
+00
+20
+40
+00
+00
+20
+FE
+12
+00
+00
+02
+48
+00
+68
+00
+28
+00
+D0
+C0
+78
+70
+47
+1C
+00
+00
+20
+0A
+43
+6F
+72
+74
+65
+78
+20
+4D
+69
+63
+72
+6F
+63
+6F
+6E
+74
+72
+6F
+6C
+6C
+65
+72
+20
+53
+79
+73
+74
+65
+6D
+20
+44
+65
+73
+69
+67
+6E
+20
+4B
+69
+74
+20
+2D
+20
+52
+54
+58
+20
+44
+65
+6D
+6F
+20
+2D
+20
+72
+65
+76
+69
+73
+69
+6F
+6E
+20
+24
+52
+65
+76
+69
+73
+69
+6F
+6E
+3A
+20
+32
+31
+34
+35
+35
+37
+20
+24
+0A
+00
+00
+06
+00
+20
+03
+00
+01
+05
+00
+01
+00
+0F
+27
+00
+00
+00
+00
+00
+00
+C8
+00
+00
+00
+00
+00
+00
+00
+2C
+01
+00
+00
+F0
+15
+00
+00
+10
+00
+00
+00
+44
+13
+00
+00
+00
+00
+00
+20
+40
+00
+00
+00
+04
+01
+00
+00
+84
+13
+00
+00
+40
+00
+00
+20
+20
+1E
+00
+00
+20
+01
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+E1
+F5
+05
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
+00
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvopt
new file mode 100644
index 0000000..a123b28
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvopt
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>26</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>30</TopLine>
+      <CurrentLine>51</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\rtx_demo.c</PathWithFileName>
+      <FilenameWithoutPath>rtx_demo.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>.\RTX_Config.c</PathWithFileName>
+      <FilenameWithoutPath>RTX_Config.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvproj
new file mode 100644
index 0000000..2093cad
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/rtx_demo/rtx_demo_cm0p.uvproj
@@ -0,0 +1,437 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>rtx_demo</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output rtx_demo_cm0p.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>1</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>rtx_demo.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\rtx_demo.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>RTX_Config.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>.\RTX_Config.c</FilePath>
+            </File>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/makefile
new file mode 100644
index 0000000..c8c4fb6
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/makefile
@@ -0,0 +1,251 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = self_reset_demo
+
+# Endian Option
+COMPILE_BIGEND = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE     = -DCORTEX_M0PLUS
+else
+  USER_DEFINE     = -DCORTEX_M0
+endif
+
+
+DEPS_LIST       = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option (DS-5)
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL  = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime -I $(CORE_DIR) -I $(DEVICE_DIR)/Include \
+		   -I $(SOFTWARE_DIR)/common/retarget $(USER_DEFINE)
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		   --rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+	armlink $(ARM_LINK_OPTIONS) $(TESTNAME).o $(SYSTEM_FILE).o  $(STARTUP_FILE).o retarget.o uart_stdout.o -o $@
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output $@
+
+
+$(TESTNAME).lst : $(TESTNAME).ELF
+	fromelf -c -d -e -s $< --output $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/demos/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+                -I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+		-I $(SOFTWARE_DIR)/common/retarget \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvopt
new file mode 100644
index 0000000..5b72456
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvopt
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\demos\self_reset_demo.c</PathWithFileName>
+      <FilenameWithoutPath>self_reset_demo.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvproj
new file mode 100644
index 0000000..c4b4745
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0.uvproj
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>self_reset_demo</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output self_reset_demo.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>self_reset_demo.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\demos\self_reset_demo.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvopt
new file mode 100644
index 0000000..549db58
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvopt
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\demos\self_reset_demo.c</PathWithFileName>
+      <FilenameWithoutPath>self_reset_demo.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvproj
new file mode 100644
index 0000000..d891cfc
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/self_reset_demo/self_reset_demo_cm0p.uvproj
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>self_reset_demo</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output self_reset_demo.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>3</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>self_reset_demo.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\demos\self_reset_demo.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/setup_ds5_tools.scr b/Cortex-M0/nanosoc/systems/mcu/testcodes/setup_ds5_tools.scr
new file mode 100644
index 0000000..fa703ec
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/setup_ds5_tools.scr
@@ -0,0 +1,6 @@
+export ARM_PRODUCT_PATH=/apps/arm/developmentstudio-2021.0/sw/mappings
+export ARM_TOOL_VARIANT=gold
+export PATH=$PATH:/apps/arm/developmentstudio-2021.0/sw/ARMCompiler5.06u7/bin/
+
+
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/makefile
new file mode 100644
index 0000000..504d509
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/makefile
@@ -0,0 +1,256 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2010-08-06 12:28:21 +0100 (Fri, 06 Aug 2010) $
+#
+#      Revision            : $Revision: 145378 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = sleep_demo
+
+# Endian Option
+COMPILE_BIGEND  = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE     = -DCORTEX_M0PLUS
+else
+  USER_DEFINE     = -DCORTEX_M0
+endif
+
+
+DEPS_LIST        = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option (DS-5)
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime $(USER_DEFINE) \
+        	-I $(DEVICE_DIR)/Include  -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+CMSDK_driver.o : $(DEVICE_DIR)/Source/CMSDK_driver.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o  CMSDK_driver.o
+	armlink $(ARM_LINK_OPTIONS) -o $@  $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output  $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF makefile
+	fromelf -c -d -e -s $< --output  $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/demos/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/CMSDK_driver.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+                -I $(SOFTWARE_DIR)/common/retarget  \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+
+# ---------------------------------------------------------------------------------------
+# Clean
+
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvopt
new file mode 100644
index 0000000..e742bfa
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvopt
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\demos\sleep_demo.c</PathWithFileName>
+      <FilenameWithoutPath>sleep_demo.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</PathWithFileName>
+      <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvproj
new file mode 100644
index 0000000..e2c4d05
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0.uvproj
@@ -0,0 +1,440 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>sleep_demo</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output sleep_demo.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>sleep_demo.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\demos\sleep_demo.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>CMSDK_driver.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvopt
new file mode 100644
index 0000000..f87fdd6
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvopt
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\demos\sleep_demo.c</PathWithFileName>
+      <FilenameWithoutPath>sleep_demo.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</PathWithFileName>
+      <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvproj
new file mode 100644
index 0000000..02c40bb
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/sleep_demo/sleep_demo_cm0p.uvproj
@@ -0,0 +1,437 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>sleep_demo</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output sleep_demo.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>sleep_demo.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\demos\sleep_demo.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>CMSDK_driver.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/makefile
new file mode 100644
index 0000000..7fa0fa3
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/makefile
@@ -0,0 +1,254 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2011-01-25 10:05:56 +0000 (Tue, 25 Jan 2011) $
+#
+#      Revision            : $Revision: 159421 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = timer_driver_tests
+
+# Endian Option
+COMPILE_BIGEND  = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST        = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime $(USER_DEFINE) \
+        	-I $(DEVICE_DIR)/Include  -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+CMSDK_driver.o : $(DEVICE_DIR)/Source/CMSDK_driver.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o
+	armlink $(ARM_LINK_OPTIONS) -o $@  $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output  $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF makefile
+	fromelf -c -d -e -s $< --output  $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/CMSDK_driver.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+                -I $(SOFTWARE_DIR)/common/retarget  \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvopt
new file mode 100644
index 0000000..6663e83
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvopt
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\timer_driver_tests.c</PathWithFileName>
+      <FilenameWithoutPath>timer_driver_tests.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</PathWithFileName>
+      <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvproj
new file mode 100644
index 0000000..8fe263e
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0.uvproj
@@ -0,0 +1,440 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>timer_driver_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output timer_driver_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>timer_driver_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\timer_driver_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>CMSDK_driver.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvopt
new file mode 100644
index 0000000..a7ff673
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvopt
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\timer_driver_tests.c</PathWithFileName>
+      <FilenameWithoutPath>timer_driver_tests.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</PathWithFileName>
+      <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvproj
new file mode 100644
index 0000000..2d1ed68
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_driver_tests/timer_driver_tests_cm0p.uvproj
@@ -0,0 +1,437 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>timer_driver_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output timer_driver_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>timer_driver_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\timer_driver_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>CMSDK_driver.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/makefile
new file mode 100644
index 0000000..7133f7f
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/makefile
@@ -0,0 +1,250 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = timer_tests
+
+# Endian Option
+COMPILE_BIGEND  = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE     = -DCORTEX_M0PLUS
+else
+  USER_DEFINE     = -DCORTEX_M0
+endif
+
+DEPS_LIST        = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime $(USER_DEFINE) \
+        	-I $(DEVICE_DIR)/Include  -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+	armlink $(ARM_LINK_OPTIONS) -o $@  $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output  $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF makefile
+	fromelf -c -d -e -s $< --output  $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+                -I $(SOFTWARE_DIR)/common/retarget  \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvopt
new file mode 100644
index 0000000..173dc40
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvopt
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\timer_tests.c</PathWithFileName>
+      <FilenameWithoutPath>timer_tests.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvproj
new file mode 100644
index 0000000..b12e58d
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0.uvproj
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>timer_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output timer_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>timer_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\timer_tests.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvopt
new file mode 100644
index 0000000..c4485d5
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvopt
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\timer_tests.c</PathWithFileName>
+      <FilenameWithoutPath>timer_tests.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvproj
new file mode 100644
index 0000000..ce4d631
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/timer_tests/timer_tests_cm0p.uvproj
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>timer_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output timer_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>timer_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\timer_tests.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/makefile
new file mode 100644
index 0000000..1d02777
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/makefile
@@ -0,0 +1,255 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2011-01-25 10:05:56 +0000 (Tue, 25 Jan 2011) $
+#
+#      Revision            : $Revision: 159421 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = uart_driver_tests
+
+# Endian Option
+COMPILE_BIGEND  = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST        = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime $(USER_DEFINE) \
+        	-I $(DEVICE_DIR)/Include  -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+CMSDK_driver.o : $(DEVICE_DIR)/Source/CMSDK_driver.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o
+	armlink $(ARM_LINK_OPTIONS) -o $@  $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o CMSDK_driver.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output  $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF makefile
+	fromelf -c -d -e -s $< --output  $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/CMSDK_driver.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+                -I $(SOFTWARE_DIR)/common/retarget  \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvopt
new file mode 100644
index 0000000..dde1fbb
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvopt
@@ -0,0 +1,277 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\uart_driver_tests.c</PathWithFileName>
+      <FilenameWithoutPath>uart_driver_tests.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</PathWithFileName>
+      <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvproj
new file mode 100644
index 0000000..3c667aa
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0.uvproj
@@ -0,0 +1,440 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>uart_driver_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output uart_driver_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>uart_driver_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\uart_driver_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>CMSDK_driver.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\CMSDK_driver.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvopt
new file mode 100644
index 0000000..c2f595c
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvopt
@@ -0,0 +1,258 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\uart_driver_tests.c</PathWithFileName>
+      <FilenameWithoutPath>uart_driver_tests.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</PathWithFileName>
+      <FilenameWithoutPath>CMSDK_driver.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>6</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvproj
new file mode 100644
index 0000000..cf69fa2
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_driver_tests/uart_driver_tests_cm0p.uvproj
@@ -0,0 +1,437 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>uart_driver_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output uart_driver_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>uart_driver_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\uart_driver_tests.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>CMSDK_driver.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\CMSDK_driver.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/makefile
new file mode 100644
index 0000000..e645bc4
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/makefile
@@ -0,0 +1,251 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2011-01-25 10:05:56 +0000 (Tue, 25 Jan 2011) $
+#
+#      Revision            : $Revision: 159421 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = uart_tests
+
+# Endian Option
+COMPILE_BIGEND  = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE     = -DCORTEX_M0PLUS
+else
+  USER_DEFINE     = -DCORTEX_M0
+endif
+
+DEPS_LIST        = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime $(USER_DEFINE) \
+        	-I $(DEVICE_DIR)/Include  -I $(CORE_DIR) -I $(SOFTWARE_DIR)/common/retarget
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		--rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/validation/$(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+	armlink $(ARM_LINK_OPTIONS) -o $@  $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output  $@
+
+$(TESTNAME).lst : $(TESTNAME).ELF makefile
+	fromelf -c -d -e -s $< --output  $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/validation/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+                -I $(SOFTWARE_DIR)/common/retarget  \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvopt
new file mode 100644
index 0000000..2ae0b81
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvopt
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\uart_tests.c</PathWithFileName>
+      <FilenameWithoutPath>uart_tests.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvproj
new file mode 100644
index 0000000..627ff29
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0.uvproj
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>uart_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output uart_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\uart_tests.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvopt
new file mode 100644
index 0000000..583a77a
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvopt
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\validation\uart_tests.c</PathWithFileName>
+      <FilenameWithoutPath>uart_tests.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvproj
new file mode 100644
index 0000000..cbe308e
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/uart_tests/uart_tests_cm0p.uvproj
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>uart_tests</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output uart_tests.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_tests.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\validation\uart_tests.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/makefile b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/makefile
new file mode 100644
index 0000000..d7c2ba5
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/makefile
@@ -0,0 +1,250 @@
+#-----------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+#                ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#-----------------------------------------------------------------------------
+#
+# Cortex-M System Design Kit software compilation make file
+#
+#-----------------------------------------------------------------------------
+#
+#  Configurations
+#
+# Choose the core instantiated, can be
+#  - CORTEX_M0
+#  - CORTEX_M0PLUS
+CPU_PRODUCT = CORTEX_M0PLUS
+
+# Shared software directory
+SOFTWARE_DIR = ../../../../software
+CMSIS_DIR    = $(SOFTWARE_DIR)/cmsis
+CORE_DIR     = $(CMSIS_DIR)/CMSIS/Include
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0plus
+else
+  DEVICE_DIR   = $(CMSIS_DIR)/Device/ARM/CMSDK_CM0
+endif
+
+# Program file
+TESTNAME     = watchdog_demo
+
+# Endian Option
+COMPILE_BIGEND = 0
+
+# Configuration
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  USER_DEFINE    = -DCORTEX_M0PLUS
+else
+  USER_DEFINE    = -DCORTEX_M0
+endif
+
+DEPS_LIST        = makefile
+
+# Tool chain : ds5 / gcc / keil
+TOOL_CHAIN      = ds5
+
+ifeq ($(TOOL_CHAIN),ds5)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = --cpu Cortex-M0plus
+  else
+    CPU_TYPE        = --cpu Cortex-M0
+  endif
+endif
+
+ifeq ($(TOOL_CHAIN),gcc)
+  ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+    CPU_TYPE        = -mcpu=cortex-m0plus
+  else
+    CPU_TYPE        = -mcpu=cortex-m0
+  endif
+endif
+
+# Startup code directory for DS-5
+ifeq ($(TOOL_CHAIN),ds5)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/ARM
+endif
+
+# Startup code directory for gcc
+ifeq ($(TOOL_CHAIN),gcc)
+ STARTUP_DIR  = $(DEVICE_DIR)/Source/GCC
+endif
+
+ifeq ($(CPU_PRODUCT),CORTEX_M0PLUS)
+  STARTUP_FILE = startup_CMSDK_CM0plus
+  SYSTEM_FILE  = system_CMSDK_CM0plus
+else
+  STARTUP_FILE = startup_CMSDK_CM0
+  SYSTEM_FILE  = system_CMSDK_CM0
+endif
+
+# ---------------------------------------------------------------------------------------
+# DS-5 options
+
+# MicroLIB option (DS-5)
+COMPILE_MICROLIB = 0
+
+# Small Multiply (Cortex-M0/M0+ has small multiplier option)
+COMPILE_SMALLMUL  = 0
+
+ARM_CC_OPTIONS   = -c -O3 -g -Otime -I $(DEVICE_DIR)/Include  -I $(CORE_DIR) \
+		   -I $(SOFTWARE_DIR)/common/retarget $(USER_DEFINE)
+ARM_ASM_OPTIONS  = -g
+ARM_LINK_OPTIONS = "--keep=$(STARTUP_FILE).o(RESET)" "--first=$(STARTUP_FILE).o(RESET)" \
+		   --rw_base 0x30000000 --ro_base 0x00000000 --map
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ ARM_CC_OPTIONS   += --bigend
+ ARM_ASM_OPTIONS  += --bigend
+ ARM_LINK_OPTIONS += --be8
+endif
+
+ifeq ($(COMPILE_MICROLIB),1)
+ # MicroLIB
+ ARM_CC_OPTIONS   += --library_type=microlib
+ ARM_ASM_OPTIONS  += --library_type=microlib --pd "__MICROLIB SETA 1"
+ ARM_LINK_OPTIONS += --library_type=microlib
+endif
+
+ifeq ($(COMPILE_SMALLMUL),1)
+ # In Cortex-M0, small multiply takes 32 cycles
+ ARM_CC_OPTIONS   += --multiply_latency=32
+endif
+
+# ---------------------------------------------------------------------------------------
+# gcc options
+
+GNG_CC      = arm-none-eabi-gcc
+GNU_OBJDUMP = arm-none-eabi-objdump
+GNU_OBJCOPY = arm-none-eabi-objcopy
+
+LINKER_SCRIPT_PATH = $(SOFTWARE_DIR)/common/scripts
+LINKER_SCRIPT = $(LINKER_SCRIPT_PATH)/cmsdk_cm0.ld
+
+GNU_CC_FLAGS = -g -O3 -mthumb $(CPU_TYPE)
+
+ifeq ($(COMPILE_BIGEND),1)
+ # Big Endian
+ GNU_CC_FLAGS   += -mbig-endian
+endif
+
+# ---------------------------------------------------------------------------------------
+all: all_$(TOOL_CHAIN)
+
+# ---------------------------------------------------------------------------------------
+# DS-5
+all_ds5 : $(TESTNAME).hex $(TESTNAME).lst
+
+$(TESTNAME).o :  $(SOFTWARE_DIR)/common/demos/$(TESTNAME).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(SYSTEM_FILE).o : $(DEVICE_DIR)/Source/$(SYSTEM_FILE).c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+retarget.o : $(SOFTWARE_DIR)/common/retarget/retarget.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+uart_stdout.o : $(SOFTWARE_DIR)/common/retarget/uart_stdout.c $(DEPS_LIST)
+	armcc $(ARM_CC_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(STARTUP_FILE).o : $(STARTUP_DIR)/$(STARTUP_FILE).s $(DEPS_LIST)
+	armasm $(ARM_ASM_OPTIONS) $(CPU_TYPE) $< -o  $@
+
+$(TESTNAME).ELF : $(TESTNAME).o $(SYSTEM_FILE).o $(STARTUP_FILE).o retarget.o uart_stdout.o
+	armlink $(ARM_LINK_OPTIONS) $(TESTNAME).o $(SYSTEM_FILE).o  $(STARTUP_FILE).o retarget.o uart_stdout.o -o $@
+
+$(TESTNAME).hex : $(TESTNAME).ELF
+	fromelf --vhx --8x1 $< --output $@
+
+
+$(TESTNAME).lst : $(TESTNAME).ELF
+	fromelf -c -d -e -s $< --output $@
+
+# ---------------------------------------------------------------------------------------
+# gcc
+all_gcc:
+	$(GNG_CC) $(GNU_CC_FLAGS) $(STARTUP_DIR)/$(STARTUP_FILE).s \
+		$(SOFTWARE_DIR)/common/demos/$(TESTNAME).c \
+		$(SOFTWARE_DIR)/common/retarget/retarget.c \
+		$(SOFTWARE_DIR)/common/retarget/uart_stdout.c \
+		$(DEVICE_DIR)/Source/$(SYSTEM_FILE).c \
+		-I $(DEVICE_DIR)/Include -I $(CORE_DIR) \
+                -I $(SOFTWARE_DIR)/common/retarget  \
+		-L $(LINKER_SCRIPT_PATH) \
+		-D__STACK_SIZE=0x200 \
+		-D__HEAP_SIZE=0x1000 \
+		$(USER_DEFINE) -T $(LINKER_SCRIPT) -o $(TESTNAME).o
+	# Generate disassembly code
+	$(GNU_OBJDUMP) -S $(TESTNAME).o > $(TESTNAME).lst
+	# Generate binary file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O binary $(TESTNAME).bin
+	# Generate hex file
+	$(GNU_OBJCOPY) -S $(TESTNAME).o -O verilog $(TESTNAME).hex
+
+# Note:
+# If the version of object copy you are using does not support verilog hex file output,
+# you can generate the hex file from binary file using the following command
+#       od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+
+# ---------------------------------------------------------------------------------------
+# Keil MDK
+
+all_keil:
+	@echo "Please compile your project code and press ENTER when ready"
+	@read dummy
+
+# ---------------------------------------------------------------------------------------
+# Binary
+
+all_bin: $(TESTNAME).bin
+	# Generate hex file from binary
+	od -v -A n -t x1 --width=1  $(TESTNAME).bin > $(TESTNAME).hex
+
+# ---------------------------------------------------------------------------------------
+# Clean
+clean :
+	@rm -rf *.o
+	@if [ -e $(TESTNAME).hex ] ; then \
+	  rm -rf $(TESTNAME).hex ; \
+	fi
+	@if [ -e $(TESTNAME).lst ] ; then \
+	  rm -rf $(TESTNAME).lst ; \
+	fi
+	@if [ -e $(TESTNAME).ELF ] ; then \
+	  rm -rf $(TESTNAME).ELF ; \
+	fi
+	@if [ -e $(TESTNAME).bin ] ; then \
+	  rm -rf $(TESTNAME).bin ; \
+	fi
+	@rm -rf *.crf
+	@rm -rf *.plg
+	@rm -rf *.tra
+	@rm -rf *.htm
+	@rm -rf *.map
+	@rm -rf *.dep
+	@rm -rf *.d
+	@rm -rf *.lnp
+	@rm -rf *.bak
+	@rm -rf *.lst
+	@rm -rf *.axf
+	@rm -rf *.sct
+	@rm -rf *.__i
+	@rm -rf *._ia
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvopt
new file mode 100644
index 0000000..d037b58
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvopt
@@ -0,0 +1,261 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <tRtrace>0</tRtrace>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <Tracepoint>
+        <THDelay>0</THDelay>
+      </Tracepoint>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0.s</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\demos\watchdog_demo.c</PathWithFileName>
+      <FilenameWithoutPath>watchdog_demo.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <RteFlg>0</RteFlg>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0.c</FilenameWithoutPath>
+      <RteFlg>0</RteFlg>
+      <bShared>0</bShared>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvproj
new file mode 100644
index 0000000..1c90f5d
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0.uvproj
@@ -0,0 +1,435 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>4803</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>watchdog_demo</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output watchdog_demo.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <RestoreTracepoints>0</RestoreTracepoints>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <uSurpInc>0</uSurpInc>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\ARM\startup_CMSDK_CM0.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>watchdog_demo.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\demos\watchdog_demo.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0\Source\system_CMSDK_CM0.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvopt b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvopt
new file mode 100644
index 0000000..5b4434b
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvopt
@@ -0,0 +1,244 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
+
+  <SchemaVersion>1.0</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Extensions>
+    <cExt>*.c</cExt>
+    <aExt>*.s*; *.src; *.a*</aExt>
+    <oExt>*.obj</oExt>
+    <lExt>*.lib</lExt>
+    <tExt>*.txt; *.h; *.inc</tExt>
+    <pExt>*.plm</pExt>
+    <CppX>*.cpp</CppX>
+  </Extensions>
+
+  <DaveTm>
+    <dwLowDateTime>0</dwLowDateTime>
+    <dwHighDateTime>0</dwHighDateTime>
+  </DaveTm>
+
+  <Target>
+    <TargetName>Debug</TargetName>
+    <ToolsetNumber>0x4</ToolsetNumber>
+    <ToolsetName>ARM-ADS</ToolsetName>
+    <TargetOption>
+      <CLKADS>50000000</CLKADS>
+      <OPTTT>
+        <gFlags>1</gFlags>
+        <BeepAtEnd>1</BeepAtEnd>
+        <RunSim>1</RunSim>
+        <RunTarget>0</RunTarget>
+      </OPTTT>
+      <OPTHX>
+        <HexSelection>1</HexSelection>
+        <FlashByte>65535</FlashByte>
+        <HexRangeLowAddress>0</HexRangeLowAddress>
+        <HexRangeHighAddress>0</HexRangeHighAddress>
+        <HexOffset>0</HexOffset>
+      </OPTHX>
+      <OPTLEX>
+        <PageWidth>79</PageWidth>
+        <PageLength>66</PageLength>
+        <TabStop>8</TabStop>
+        <ListingPath>.\</ListingPath>
+      </OPTLEX>
+      <ListingPage>
+        <CreateCListing>1</CreateCListing>
+        <CreateAListing>1</CreateAListing>
+        <CreateLListing>1</CreateLListing>
+        <CreateIListing>0</CreateIListing>
+        <AsmCond>1</AsmCond>
+        <AsmSymb>1</AsmSymb>
+        <AsmXref>0</AsmXref>
+        <CCond>1</CCond>
+        <CCode>0</CCode>
+        <CListInc>0</CListInc>
+        <CSymb>0</CSymb>
+        <LinkerCodeListing>0</LinkerCodeListing>
+      </ListingPage>
+      <OPTXL>
+        <LMap>1</LMap>
+        <LComments>1</LComments>
+        <LGenerateSymbols>1</LGenerateSymbols>
+        <LLibSym>1</LLibSym>
+        <LLines>1</LLines>
+        <LLocSym>1</LLocSym>
+        <LPubSym>1</LPubSym>
+        <LXref>0</LXref>
+        <LExpSel>0</LExpSel>
+      </OPTXL>
+      <OPTFL>
+        <tvExp>1</tvExp>
+        <tvExpOptDlg>0</tvExpOptDlg>
+        <IsCurrentTarget>1</IsCurrentTarget>
+      </OPTFL>
+      <CpuCode>255</CpuCode>
+      <DllOpt>
+        <SimDllName>SARMCM3.DLL</SimDllName>
+        <SimDllArguments></SimDllArguments>
+        <SimDlgDllName>DARMCM1.DLL</SimDlgDllName>
+        <SimDlgDllArguments></SimDlgDllArguments>
+        <TargetDllName>SARMCM3.DLL</TargetDllName>
+        <TargetDllArguments></TargetDllArguments>
+        <TargetDlgDllName>TARMCM1.DLL</TargetDlgDllName>
+        <TargetDlgDllArguments></TargetDlgDllArguments>
+      </DllOpt>
+      <DebugOpt>
+        <uSim>1</uSim>
+        <uTrg>0</uTrg>
+        <sLdApp>1</sLdApp>
+        <sGomain>1</sGomain>
+        <sRbreak>1</sRbreak>
+        <sRwatch>1</sRwatch>
+        <sRmem>1</sRmem>
+        <sRfunc>1</sRfunc>
+        <sRbox>1</sRbox>
+        <tLdApp>1</tLdApp>
+        <tGomain>0</tGomain>
+        <tRbreak>1</tRbreak>
+        <tRwatch>1</tRwatch>
+        <tRmem>1</tRmem>
+        <tRfunc>0</tRfunc>
+        <tRbox>1</tRbox>
+        <sRunDeb>0</sRunDeb>
+        <sLrtime>0</sLrtime>
+        <nTsel>-1</nTsel>
+        <sDll></sDll>
+        <sDllPa></sDllPa>
+        <sDlgDll></sDlgDll>
+        <sDlgPa></sDlgPa>
+        <sIfile></sIfile>
+        <tDll></tDll>
+        <tDllPa></tDllPa>
+        <tDlgDll></tDlgDll>
+        <tDlgPa></tDlgPa>
+        <tIfile></tIfile>
+        <pMon></pMon>
+      </DebugOpt>
+      <Breakpoint/>
+      <DebugFlag>
+        <trace>0</trace>
+        <periodic>1</periodic>
+        <aLwin>0</aLwin>
+        <aCover>0</aCover>
+        <aSer1>0</aSer1>
+        <aSer2>0</aSer2>
+        <aPa>0</aPa>
+        <viewmode>0</viewmode>
+        <vrSel>0</vrSel>
+        <aSym>0</aSym>
+        <aTbox>0</aTbox>
+        <AscS1>0</AscS1>
+        <AscS2>0</AscS2>
+        <AscS3>0</AscS3>
+        <aSer3>0</aSer3>
+        <eProf>0</eProf>
+        <aLa>0</aLa>
+        <aPa1>0</aPa1>
+        <AscS4>0</AscS4>
+        <aSer4>0</aSer4>
+        <StkLoc>0</StkLoc>
+        <TrcWin>0</TrcWin>
+        <newCpu>0</newCpu>
+        <uProt>0</uProt>
+      </DebugFlag>
+      <LintExecutable></LintExecutable>
+      <LintConfigFile></LintConfigFile>
+    </TargetOption>
+  </Target>
+
+  <Group>
+    <GroupName>Startup</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>1</GroupNumber>
+      <FileNumber>1</FileNumber>
+      <FileType>2</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</PathWithFileName>
+      <FilenameWithoutPath>startup_CMSDK_CM0plus.s</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>Application</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>2</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\demos\watchdog_demo.c</PathWithFileName>
+      <FilenameWithoutPath>watchdog_demo.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>3</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\uart_stdout.c</PathWithFileName>
+      <FilenameWithoutPath>uart_stdout.c</FilenameWithoutPath>
+    </File>
+    <File>
+      <GroupNumber>2</GroupNumber>
+      <FileNumber>4</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\common\retarget\retarget.c</PathWithFileName>
+      <FilenameWithoutPath>retarget.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+  <Group>
+    <GroupName>System</GroupName>
+    <tvExp>1</tvExp>
+    <tvExpOptDlg>0</tvExpOptDlg>
+    <cbSel>0</cbSel>
+    <File>
+      <GroupNumber>3</GroupNumber>
+      <FileNumber>5</FileNumber>
+      <FileType>1</FileType>
+      <tvExp>0</tvExp>
+      <Focus>0</Focus>
+      <ColumnNumber>0</ColumnNumber>
+      <tvExpOptDlg>0</tvExpOptDlg>
+      <TopLine>0</TopLine>
+      <CurrentLine>0</CurrentLine>
+      <bDave2>0</bDave2>
+      <PathWithFileName>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</PathWithFileName>
+      <FilenameWithoutPath>system_CMSDK_CM0plus.c</FilenameWithoutPath>
+    </File>
+  </Group>
+
+</ProjectOpt>
diff --git a/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvproj b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvproj
new file mode 100644
index 0000000..82c742c
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/testcodes/watchdog_demo/watchdog_demo_cm0p.uvproj
@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
+
+  <SchemaVersion>1.1</SchemaVersion>
+
+  <Header>### uVision Project, (C) Keil Software</Header>
+
+  <Targets>
+    <Target>
+      <TargetName>Debug</TargetName>
+      <ToolsetNumber>0x4</ToolsetNumber>
+      <ToolsetName>ARM-ADS</ToolsetName>
+      <TargetOption>
+        <TargetCommonOption>
+          <Device>Cortex-M0+</Device>
+          <Vendor>ARM</Vendor>
+          <Cpu>CLOCK(12000000) CPUTYPE("Cortex-M0+") ESEL ELITTLE</Cpu>
+          <FlashUtilSpec></FlashUtilSpec>
+          <StartupFile></StartupFile>
+          <FlashDriverDll></FlashDriverDll>
+          <DeviceId>6268</DeviceId>
+          <RegisterFile></RegisterFile>
+          <MemoryEnv></MemoryEnv>
+          <Cmp></Cmp>
+          <Asm></Asm>
+          <Linker></Linker>
+          <OHString></OHString>
+          <InfinionOptionDll></InfinionOptionDll>
+          <SLE66CMisc></SLE66CMisc>
+          <SLE66AMisc></SLE66AMisc>
+          <SLE66LinkerMisc></SLE66LinkerMisc>
+          <SFDFile></SFDFile>
+          <UseEnv>0</UseEnv>
+          <BinPath></BinPath>
+          <IncludePath></IncludePath>
+          <LibPath></LibPath>
+          <RegisterFilePath></RegisterFilePath>
+          <DBRegisterFilePath></DBRegisterFilePath>
+          <TargetStatus>
+            <Error>0</Error>
+            <ExitCodeStop>0</ExitCodeStop>
+            <ButtonStop>0</ButtonStop>
+            <NotGenerated>0</NotGenerated>
+            <InvalidFlash>1</InvalidFlash>
+          </TargetStatus>
+          <OutputDirectory>.\</OutputDirectory>
+          <OutputName>watchdog_demo</OutputName>
+          <CreateExecutable>1</CreateExecutable>
+          <CreateLib>0</CreateLib>
+          <CreateHexFile>0</CreateHexFile>
+          <DebugInformation>1</DebugInformation>
+          <BrowseInformation>1</BrowseInformation>
+          <ListingPath>.\</ListingPath>
+          <HexFormatSelection>1</HexFormatSelection>
+          <Merge32K>0</Merge32K>
+          <CreateBatchFile>0</CreateBatchFile>
+          <BeforeCompile>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+            <nStopU1X>0</nStopU1X>
+            <nStopU2X>0</nStopU2X>
+          </BeforeCompile>
+          <BeforeMake>
+            <RunUserProg1>0</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name></UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </BeforeMake>
+          <AfterMake>
+            <RunUserProg1>1</RunUserProg1>
+            <RunUserProg2>0</RunUserProg2>
+            <UserProg1Name>$K\ARM\ARMCC\BIN\fromelf.exe #L --vhx --8x1 --output watchdog_demo.hex</UserProg1Name>
+            <UserProg2Name></UserProg2Name>
+            <UserProg1Dos16Mode>0</UserProg1Dos16Mode>
+            <UserProg2Dos16Mode>0</UserProg2Dos16Mode>
+          </AfterMake>
+          <SelectedForBatchBuild>0</SelectedForBatchBuild>
+          <SVCSIdString></SVCSIdString>
+        </TargetCommonOption>
+        <CommonProperty>
+          <UseCPPCompiler>0</UseCPPCompiler>
+          <RVCTCodeConst>0</RVCTCodeConst>
+          <RVCTZI>0</RVCTZI>
+          <RVCTOtherData>0</RVCTOtherData>
+          <ModuleSelection>0</ModuleSelection>
+          <IncludeInBuild>1</IncludeInBuild>
+          <AlwaysBuild>0</AlwaysBuild>
+          <GenerateAssemblyFile>0</GenerateAssemblyFile>
+          <AssembleAssemblyFile>0</AssembleAssemblyFile>
+          <PublicsOnly>0</PublicsOnly>
+          <StopOnExitCode>3</StopOnExitCode>
+          <CustomArgument></CustomArgument>
+          <IncludeLibraryModules></IncludeLibraryModules>
+        </CommonProperty>
+        <DllOption>
+          <SimDllName>SARMCM3.DLL</SimDllName>
+          <SimDllArguments></SimDllArguments>
+          <SimDlgDll>DARMCM1.DLL</SimDlgDll>
+          <SimDlgDllArguments></SimDlgDllArguments>
+          <TargetDllName>SARMCM3.DLL</TargetDllName>
+          <TargetDllArguments></TargetDllArguments>
+          <TargetDlgDll>TARMCM1.DLL</TargetDlgDll>
+          <TargetDlgDllArguments></TargetDlgDllArguments>
+        </DllOption>
+        <DebugOption>
+          <OPTHX>
+            <HexSelection>1</HexSelection>
+            <HexRangeLowAddress>0</HexRangeLowAddress>
+            <HexRangeHighAddress>0</HexRangeHighAddress>
+            <HexOffset>0</HexOffset>
+            <Oh166RecLen>16</Oh166RecLen>
+          </OPTHX>
+          <Simulator>
+            <UseSimulator>1</UseSimulator>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>1</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>1</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+            <LimitSpeedToRealTime>0</LimitSpeedToRealTime>
+          </Simulator>
+          <Target>
+            <UseTarget>0</UseTarget>
+            <LoadApplicationAtStartup>1</LoadApplicationAtStartup>
+            <RunToMain>0</RunToMain>
+            <RestoreBreakpoints>1</RestoreBreakpoints>
+            <RestoreWatchpoints>1</RestoreWatchpoints>
+            <RestoreMemoryDisplay>1</RestoreMemoryDisplay>
+            <RestoreFunctions>0</RestoreFunctions>
+            <RestoreToolbox>1</RestoreToolbox>
+          </Target>
+          <RunDebugAfterBuild>0</RunDebugAfterBuild>
+          <TargetSelection>-1</TargetSelection>
+          <SimDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+          </SimDlls>
+          <TargetDlls>
+            <CpuDll></CpuDll>
+            <CpuDllArguments></CpuDllArguments>
+            <PeripheralDll></PeripheralDll>
+            <PeripheralDllArguments></PeripheralDllArguments>
+            <InitializationFile></InitializationFile>
+            <Driver></Driver>
+          </TargetDlls>
+        </DebugOption>
+        <Utilities>
+          <Flash1>
+            <UseTargetDll>0</UseTargetDll>
+            <UseExternalTool>0</UseExternalTool>
+            <RunIndependent>0</RunIndependent>
+            <UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
+            <Capability>0</Capability>
+            <DriverSelection>-1</DriverSelection>
+          </Flash1>
+          <Flash2></Flash2>
+          <Flash3></Flash3>
+          <Flash4></Flash4>
+        </Utilities>
+        <TargetArmAds>
+          <ArmAdsMisc>
+            <GenerateListings>0</GenerateListings>
+            <asHll>1</asHll>
+            <asAsm>1</asAsm>
+            <asMacX>1</asMacX>
+            <asSyms>1</asSyms>
+            <asFals>1</asFals>
+            <asDbgD>1</asDbgD>
+            <asForm>1</asForm>
+            <ldLst>0</ldLst>
+            <ldmm>1</ldmm>
+            <ldXref>1</ldXref>
+            <BigEnd>0</BigEnd>
+            <AdsALst>1</AdsALst>
+            <AdsACrf>1</AdsACrf>
+            <AdsANop>0</AdsANop>
+            <AdsANot>0</AdsANot>
+            <AdsLLst>1</AdsLLst>
+            <AdsLmap>1</AdsLmap>
+            <AdsLcgr>1</AdsLcgr>
+            <AdsLsym>1</AdsLsym>
+            <AdsLszi>1</AdsLszi>
+            <AdsLtoi>1</AdsLtoi>
+            <AdsLsun>1</AdsLsun>
+            <AdsLven>1</AdsLven>
+            <AdsLsxf>1</AdsLsxf>
+            <RvctClst>0</RvctClst>
+            <GenPPlst>0</GenPPlst>
+            <AdsCpuType>"Cortex-M0+"</AdsCpuType>
+            <RvctDeviceName></RvctDeviceName>
+            <mOS>0</mOS>
+            <uocRom>0</uocRom>
+            <uocRam>0</uocRam>
+            <hadIROM>0</hadIROM>
+            <hadIRAM>0</hadIRAM>
+            <hadXRAM>0</hadXRAM>
+            <uocXRam>0</uocXRam>
+            <RvdsVP>0</RvdsVP>
+            <hadIRAM2>0</hadIRAM2>
+            <hadIROM2>0</hadIROM2>
+            <StupSel>1</StupSel>
+            <useUlib>0</useUlib>
+            <EndSel>1</EndSel>
+            <uLtcg>0</uLtcg>
+            <RoSelD>0</RoSelD>
+            <RwSelD>5</RwSelD>
+            <CodeSel>0</CodeSel>
+            <OptFeed>0</OptFeed>
+            <NoZi1>0</NoZi1>
+            <NoZi2>0</NoZi2>
+            <NoZi3>0</NoZi3>
+            <NoZi4>0</NoZi4>
+            <NoZi5>0</NoZi5>
+            <Ro1Chk>1</Ro1Chk>
+            <Ro2Chk>0</Ro2Chk>
+            <Ro3Chk>0</Ro3Chk>
+            <Ir1Chk>0</Ir1Chk>
+            <Ir2Chk>0</Ir2Chk>
+            <Ra1Chk>1</Ra1Chk>
+            <Ra2Chk>0</Ra2Chk>
+            <Ra3Chk>0</Ra3Chk>
+            <Im1Chk>0</Im1Chk>
+            <Im2Chk>0</Im2Chk>
+            <OnChipMemories>
+              <Ocm1>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm1>
+              <Ocm2>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm2>
+              <Ocm3>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm3>
+              <Ocm4>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm4>
+              <Ocm5>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm5>
+              <Ocm6>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </Ocm6>
+              <IRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IRAM>
+              <IROM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </IROM>
+              <XRAM>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </XRAM>
+              <OCR_RVCT1>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT1>
+              <OCR_RVCT2>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT2>
+              <OCR_RVCT3>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT3>
+              <OCR_RVCT4>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT4>
+              <OCR_RVCT5>
+                <Type>1</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT5>
+              <OCR_RVCT6>
+                <Type>0</Type>
+                <StartAddress>0x20000000</StartAddress>
+                <Size>0x10000</Size>
+              </OCR_RVCT6>
+              <OCR_RVCT7>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT7>
+              <OCR_RVCT8>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT8>
+              <OCR_RVCT9>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT9>
+              <OCR_RVCT10>
+                <Type>0</Type>
+                <StartAddress>0x0</StartAddress>
+                <Size>0x0</Size>
+              </OCR_RVCT10>
+            </OnChipMemories>
+            <RvctStartVector></RvctStartVector>
+          </ArmAdsMisc>
+          <Cads>
+            <interw>1</interw>
+            <Optim>4</Optim>
+            <oTime>0</oTime>
+            <SplitLS>0</SplitLS>
+            <OneElfS>0</OneElfS>
+            <Strict>0</Strict>
+            <EnumInt>0</EnumInt>
+            <PlainCh>0</PlainCh>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <wLevel>0</wLevel>
+            <uThumb>0</uThumb>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define>CORTEX_M0PLUS</Define>
+              <Undefine></Undefine>
+              <IncludePath>..\..\..\..\software\cmsis\CMSIS\Include; ..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Include; ..\..\..\..\software\common\retarget</IncludePath>
+            </VariousControls>
+          </Cads>
+          <Aads>
+            <interw>1</interw>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <thumb>0</thumb>
+            <SplitLS>0</SplitLS>
+            <SwStkChk>0</SwStkChk>
+            <NoWarn>0</NoWarn>
+            <VariousControls>
+              <MiscControls></MiscControls>
+              <Define></Define>
+              <Undefine></Undefine>
+              <IncludePath></IncludePath>
+            </VariousControls>
+          </Aads>
+          <LDads>
+            <umfTarg>1</umfTarg>
+            <Ropi>0</Ropi>
+            <Rwpi>0</Rwpi>
+            <noStLib>0</noStLib>
+            <RepFail>1</RepFail>
+            <useFile>0</useFile>
+            <TextAddressRange>0x00000000</TextAddressRange>
+            <DataAddressRange>0x00000000</DataAddressRange>
+            <ScatterFile></ScatterFile>
+            <IncludeLibs></IncludeLibs>
+            <IncludeLibsPath></IncludeLibsPath>
+            <Misc></Misc>
+            <LinkerInputFile></LinkerInputFile>
+            <DisabledWarnings></DisabledWarnings>
+          </LDads>
+        </TargetArmAds>
+      </TargetOption>
+      <Groups>
+        <Group>
+          <GroupName>Startup</GroupName>
+          <Files>
+            <File>
+              <FileName>startup_CMSDK_CM0plus.s</FileName>
+              <FileType>2</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\ARM\startup_CMSDK_CM0plus.s</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>Application</GroupName>
+          <Files>
+            <File>
+              <FileName>watchdog_demo.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\demos\watchdog_demo.c</FilePath>
+            </File>
+            <File>
+              <FileName>uart_stdout.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\uart_stdout.c</FilePath>
+            </File>
+            <File>
+              <FileName>retarget.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\common\retarget\retarget.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+        <Group>
+          <GroupName>System</GroupName>
+          <Files>
+            <File>
+              <FileName>system_CMSDK_CM0plus.c</FileName>
+              <FileType>1</FileType>
+              <FilePath>..\..\..\..\software\cmsis\Device\ARM\CMSDK_CM0plus\Source\system_CMSDK_CM0plus.c</FilePath>
+            </File>
+          </Files>
+        </Group>
+      </Groups>
+    </Target>
+  </Targets>
+
+</Project>
diff --git a/Cortex-M0/nanosoc/systems/mcu/tools/setup_ds5_tools.scr b/Cortex-M0/nanosoc/systems/mcu/tools/setup_ds5_tools.scr
new file mode 100644
index 0000000..477a508
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/tools/setup_ds5_tools.scr
@@ -0,0 +1,3 @@
+export ARM_PRODUCT_PATH=/apps/arm/developmentstudio-2021.0/sw/mappings
+export ARM_TOOL_VARIANT=gold
+export PATH=$PATH:/apps/arm/developmentstudio-2021.0/sw/ARMCompiler5.06u7/bin/
diff --git a/Cortex-M0/nanosoc/systems/mcu/v2html_doc.tgz b/Cortex-M0/nanosoc/systems/mcu/v2html_doc.tgz
new file mode 100644
index 0000000000000000000000000000000000000000..182d8c652424d5ed3c4caf2b2d26d32de7d3df16
GIT binary patch
literal 661430
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%0Av#$HX?y`SRe>OZ=
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%0D@(p~gYUCBZ~fl#C;vk4!;?pk-gKS%@8q)*
z`>=3}5=;Ap%QJ2(*Bp|RT(+|J%>fzl8vT2AdM|7`Z*Jdke<o|ehA(ZiGNn9yro3K!
za=Fp1(hHNV&Mq~cGgWqWjBmx{E4gPkwcmPQy!p%m-M!9L9lkIBc-}Ss{z#9Rr{tkf
zjHQjF!Pegac7Hl^xx*)=u>{>bpBC|_<kLCdYnF!Zl4swU<fmXcbJdZ(X1~9gFfI9z
za)93|*PXXdFILy#%h&a5*&O_qMHy_`XRB(ltH$U+M4m3|jT0_&UZ@sa*m3-=nu}r3
z>c*!lW=@ph?3`8LyOZ_v=ae4jPFXFF2IqdsxEZTM<&UOioh|xTx@bL*`h)6X>&HH<
z&oh@KdKH@8V#%|){jZ;sw|2swlZxt#uXL)gS!f;92~XC3c5AZ7ACArc{%kAgEVoKA
zDCql;lJVVq>AQqwwyD!+nr~Zt!y#;27Vl;Ebyu{tzFvH4zTm`*vZ`5UE?uzUi*-A-
zDKza%M{#ak;OvFgGg|ju-^aT3*k7?md!bt|e(mD&%RCct^yS^<`+Fy)uX_5<>Sx2+
z=V3|N_H!f6Vuki7Dql&zlDgi#P`JEv-o-*8{b|;<CGKt?lr!G_U%Scd&*>jqzFJup
zZ!eCuRr$W7t88s+NPvOYoT=LktpnejzmzcX=$p%DcFeyj-2TZeNg~iWujQ$m@cp0_
zqA?{0Y(;8qE;gn4@oxNfy?Yze&K@J)T??MAPkn#t>3_ZWmn%a4>3nwWJ0(<I!PO<`
zsw6J$d|Za-N08^A9(gHKo7AI=yDyp<`aQbSFu{XqrHXu`|AvVN55+XsZ253;)60iW
z)suR~MgD9zjFWr0=@^^)(G#cIk8Eo@q9*2IW|Ylx%|-5_0mCjcW7CYyH6l4DdrxJ^
zrYZ;au2^{Co7i>xHv3OA4(UmJ5Pm-;_D4eL4Znn*bMJQkI)AV;YyWZO>iMSs4G(I~
znii=r`~Kq1;_tE;=hZact8!S~xg@d7G9`(3^279+4(9)cYYZ*BoxN9eM}KjQyEcFB
zqbU<q=d|5h;D2}D&h`M7-z}OUlf-tdFR)EszI4YnPLrSd>nbANhhMb%K0!5j*9XB9
zqEqvWyS5+k_F7%`X2q4qSIrlAm~IX*h`JcQExUfwr~1QH;hrlK|NE{^`gc5^|6i|P
zUvaNa#iw~pTQ_W;eed(!ohuz>m3jTk<@RjIJXI9-@2<Czk=nHd?hndq*w_je-9N|X
z8n(;h-Pet^<{DaW|7!{*o0*DDGc$X)kYQEy-A(dpQGah49G_*W@$$g3*jwe?de06e
z9Xs^w>4FCxcR$RK@R4U<Y8`7FT3qryVE^Xj!WymD!*j0gx%$SjFhlyY(*9S1IuSM%
zZ)=Xvme((P^YL-g@-pSK6dcS}bVWHC?O-;hJPjY=%X82BE~$R*H~UQc-iQCs-@9tI
zwKwPG&o}WG1K%AhOO)QKvj5=>9mO+z)y9)U6pFK_E!0Tl4mh@L&m_)=_fG!%X1jd%
z*L#z66JLKy)Zohbdi(NnfBRa${hr~GruUv)-I)+}VDblrDaY(C{j-x6ez0FcIl*V<
zj&DV+>x*{mHP2tW@zech;h%eKL&EyKD>iJ}xAxoq1Hp2l4Eq?Se{ef7d#~`9EKW~p
z-%t8Vd>=GVb=2@bzH?*UbkUcqUkaT#WV-&%(O&0cPZpIeoTI6mYV>_s{f39-Pd8Lf
zIu{;hZ1e4I(1Y?sJ(=?}V;*{^{@vi%pVpGWrq*5dHg$gc0@lLP(y3bhJ9E~yUOL^p
zXycMsqG9){V|@Nh*f+7Y<+fhx!7rZ=ybxgWPk*+xJhkR^{M@q#*8e-;xAfP<UAv~S
zzIpScHZr8yCgd>7s>Qos&p$ggyS`b&J9f*QTcMj-%f7tZzUf3;<%wOhPiPB^&-T~u
zJRR`4;On)=Mkcdv_AUQk93&=ow)yIPmat_zZk$PqjER!dOJ<JQGQX8OJofaVOP>>X
z%`WI&yHZs6u*)Yh#w|`mP9}ZB^&=<V^~l@JpYD3?tbX|pv6}|%;r7#9ub$>Udiu(z
zz>g9|A^w@iY@*(NZ(d@4I@)+z!Gud%t3FP6aBbP932l`Nn@gLdmOK$*{nj$?gj@fc
zr0UlNPr2U6tM8xE>iT(VWc=!PReBrLx1@xh=9bOMp1>QN<|1;V@Mhu0+vne=+m^=q
zzgc=rp7Hekuwbzp3fphI+coWp;id-Lh}6WV-`w|DW%I5{Jk`^2;Lz{+ryjm~s%3Ze
zdZ~w;GPn5c^kAWgb+;b#n!je5W~8EY;KrFW&xERdHrKN1ZUy*yozZ$-`lV>=n(cjG
zt39u!`x`E@oEb4MTqx9j`sd%TS+4n?(snqi-r?PJD)i64UH@+QmmOyinLS^xQ*(OA
z@7E#w_J=(#oVrP7i{rX${MR<VQn0lNl4F`U?@Hg{n0@l=HZN$`WS+(4AHL`Q9-TFJ
z=2^sC7jDn|t=)1o&LWCWY@a|??uTCzktc3+hn`kCtzJ_)cj4h=kE`|-y2Y6}Kj-Yf
zX0s&ovq5L?v}4m=JAZoc)$r4Xi=T>4e^sjd@JnLnjZ>#}?>B{Bmy*c3=HvQf(d$b$
zKK0(%`kBe3I8LD^vM@5oWWM8zD7J-}Y%f18_^|iP(t}SYbHsWpnM`-NaXQsI`Lw#=
zu4yhAdYv1>zfC(f&0ncRxAQ`bP@=w*Ua#(amlsh&3wNp<iqnskimr2Cnr*G+TY6>3
z_Q-oli}%*#?A>~!s`AE>sfSY!KApX*WbIn-%g5eLX#eo~#?u{H(-+^m@~z-*u2q=3
z={C#H0_8Ouo|^n9X@6Z%leo_9$h)4y*S{(5Udb(fmM`x8?HbYbZXFypY_scAeGe;q
z{PU*Hv2M#c&Z`}6{9E+?2>D+9Vj!o-a&5y5sngvZJ+8mxW7FrI+H&pX8}&Nh@_Tkx
zR#~@C|4lyrHSFA>tl$kAbtUh_gSY*vEd5pZ|E+uPs<+$c->z6Z;a1tpNr&98&szEW
z4X^#P9DCJGf7egTcFwR`^4T<!d*eLGsfim-tX}nhp^V#+pW5fe;+1(-A6z^=)p^6u
z4_kGXyji9F|M(RLOO=*-)xUk~$}-ybJMD9mdXc-P;PNYFu_K%3&Hk42ROW+7ZS3Fk
z6^y4IZhXAfr(b5aaq+*aKM$vQ-#+WNrSK1H-t~QZ4^O@M`mn<9<!i*_PhacVS@K>-
zCu<E)@+IG+ZOe9+E$jawUu?hT?}zt)9-8i(WhETHa@zH9IlY}RXW#Gd{P*{WQNY3K
zHpc(eA1<ffFZ~$5)Hd|`7x@(nzniYjE(xvhQ=IjYIdFT>VN?6>3q17{?S16)Ud+jw
z`7v)==z^7ho`3Bwm+w1Y|GVPQ@88GI=ii?%C%km;{{Q@cE9(E>{b~K_^3U_{J1+*F
zw48Tv!^8s(bH4f41x|<!XpO%g`Aj78SX^V%`+0(kwPrmzvg4Q2^5hv=>(jqI;%A!K
zJJtBk(nohAuX!ozl&s;%`=q2;oSijWpz=}FwL{Ns95aQ_2S@yWdiC6G4X00KT@Tp!
zKbM)t&4_;+UHo*%-0Jg1{dsGTuG(C5&zgT)bxu{-VoN2Rb#G%GL-w58d9k5Hw%Ty(
zzS<p`SDv4<e|z)H8uR#`+gm*2_O3d5c<<83cOvrkT25<c{;s=Fwqf2Y-#w`gQk`?N
z&YyX7a93Qd=t99g#h<$$Gd)=Pvg+E)q^lgSv-GALe5kna>*FuU@7`+`u6VOL{EhPY
z=LJ4J8Sl0o-PY;!Mnf$1-OXv2j&RE``k0ud>3%x4WM`%G!@Dsmu^nfX{BysbNivjY
zX!?BNW4UFi!;12X=j9s9?$@vXec*(2Q~XKBmG7^g)VL%3By#oZ-=bfH_={qE<YzsJ
zml4rFH@o+v=CmTm8|n$~e_Lvu?R|W1FZb6?$!B$H4%jt&=K3ZC*t_zu<mlO$T;6c-
z(Wdz7&F9WU-C6g}?b|)MY039Z_S|f(z3KBL=e*-)TaFhM?^0r(%Py?-wch^Cw>ISP
z>ZYI5?)FZ~RJ!?H>fZJ}o~m<HZyzdi%sQHV=it3|r}f)kN4Q(MI2pZC>)+>Yyr};9
zp&L6S)<zgEe6erw!9SIatF}7K=It+R;IjN|`Jc~hPCI+c9@T%jlV?8u)A;==$0lc8
zgOiuGhG}oOeKP!>XsZ+V;yHa0%zHVkmaXr4!}sfBFQ;j%+~Mu39@_oaUJ`jhXBpSS
z;C+{?3hie*zHvDJQSbM)Rib%?yOZv!1bjc5vS!;l@$bby(zov`(6QULY=3xP^8?$%
z`}TgSJ~tyq;Hm7rE9cyFTDNq3lKb_vXHW6l^*f$!bj>>TT(#?E$;LhLuJg3*nFNZS
z-PtYNU7OyuB&LW((fjYubO-G{?-}&X*YNFDOSQQ+tH&trz~r6ATk{=G-CHdz67&4c
z^2_q)*Voxu{jT18vn3~MVoFa8=fove|2~}lxt#xfa|w%UOZo5af9m@7`%5w(W($5U
zy6t3pW4mFXVdf^oNQQSgYdW7r?fkyLsPSCGt~tr?W!z8v=Z*ZRSM4z2iukndKsU#x
z`xejJITzd!7d&<BOTPsBWovWu1IwSE6RMI(Pp@+kXe;BM8(Lj>`(=qp++?>EhjXSh
zv*oeG3dvWCJNBFwe=OS3v^g{6d-M7Ak3DOb@gAC3xYI9PwDD53qx1E32bcd<p7O1`
zCBQapYMcI9vB^Q&Czi8jMi~gP-Eo<;so|G;^t!upg(ZmxT#e4D?n~zF{JLgdR`SI|
z{1<{285k&t^;Yc-eO`Uc-s<#u?;pqZ2Kk0YA8NkzC2#LZ?d~a!tR52fFA8TiuPd+b
zy`HC^C!M8jEX4IPq~~0X0y}HH;W|?}tJAJF+%*cl=h&v6OL=Axy*6y$DUVnD0f$fS
zJ>Ij=f#tD|V8JBO*cEc7$6G6-{3nQcA7)|X6uZW3Srq$uqhlybpR&50+oE-ewVn}E
zr@T;lb>zmp#v9HeN&niuhI?ABum7H2Q5Vl(lWE1UDbS|D;@IzL4Js-e!j?7tPa5qk
zcJ7;NVSHRx+o4|D+jClTkzJ47!O3xFwjGdtTb}T~Ia8mDzt?QxgtLK0_8w=?&Nw_r
z_~`oYt}@f6O*}2GFjaqj`(k|$iA{GNWiB%OW_c&&=(k|g&;2fun<Z~>3t#xL@zg%u
zvoELAb~7X`Hr^~>e9}=s?$(1tyS{Yqe!M8lg)L`;V4}l1^;tzdZhBV~^Df24UHSfI
z@2{sT?yXu_%P`Yj`uh1;1Dnchzkd}5cULZV@e-KQS;@XFb(KP*^|n_j>%+pM?RGST
z-`>LdD<+>+VUxn27dw~^mN8D)%Fs7)>Xd0pRU7?-ysSL$&R^)I#XWnS(B@Db9VgeG
z2eUT1=lpkIzI=Rs`=1>P*RJO}EnBt2ep9Q=R<+53o!?|veL8n|?lS%9hF)D73oqPI
zlhP1Q|H;v{r)Zr*@2v`t+bad5<*Qi^e7nZ{Is16#OjV(!OkP5pKD(-@w3UZ+x4e04
z_&K_wWMacMvrYUPySLrG@zJ2gT3F+v;r~<nU4EH}i|OC{wmUzhXa=+Re0k1&3ne1j
zE`7V@(_<JtZ$qI$qBl!i^M#yC39^S%_-7g=+qx<(v8!jgHvem=hwQI_H#x#~3C+so
z+g??#@xL<j_|?SsDw%JN|5^7p?a*6=HOZ$g_1E*qn8{B5*T=q4iQ~hC5Z9-dU4A~&
zxi-z~xvs;vhN#C2Pbp6OaBJRup+XfORSuudhmZ1|k}p45qi0ci{@KH0r+PO>Y|THj
z)3(~?!<p9W-*m3;lN9{+r%}?6{rb5at$7vS?AJ19>Fjqr84w)OzqiWbzn)HmL;s^L
z&y-o5T%wZiHG0aWdCLDq9Ix)Es!ZIj`E5pw@vXGID=zF|vwD71XvN~FD_)t$jwrS%
zUt1}6@UGkRgIm+o?(Ke4{iI?6Z}{CP{&hQ3<R8f$SJMl#kiVe9xu0F5o%K&s{z>k~
zj_b<JZm97}nRM(mXREm&7sSu~*U_&|M{3!r55|`nTJF!}>-e#7_Rj?`bz1yq@pb%I
zafh4tLeuZ|#~Q__DmOmhu`Oy>etJ;#P0csk94GsKM@rK+Z|{F_;RDa@3GpRN{l1S}
zAJ4O{iz)GJn%S1{Z1J>p0{#_Tb6<zwuF6noPrh}*dz<^#6GsC2<a$(gwtEHre<@;B
zTBF2qoG(7`=9{-khn|_<J8~{r?!lSs;U9TTd^AdI9N!c?W1N5LQ?S8xACb>Y?$ho6
ztJLZJxLfZ3*CP2}&-PQ@otqoZJYTb$u~h5Lqz>sAzLx@tMzgjr+xsBjDfF9^-70e~
z=A|+k9d4QLG;?JC^j^wQdm<q6X0g*nma?t#T&ep585*DZo>_YJ!7Voa_=kttDp|e?
zoNCxu|NDT+)Rw>v(#xb6R{v;`dekLz?Lw5##-<2!MW6kdZwjqve33ex9+`Fj=I_@Y
zLebMA4U5mb{9o0ZmT{(+xqeb{a`#u)jALRSZ`?n=kxM@JPxpZ%ITA}mB#tGUN*Mgj
zTz{lO$W81p8|Np6|Cel|OmnuyFdS;*d%Mt4j$8UCo5r%F4>M+M^#9I%aYfv!`orfR
zOLR>Ae60LpO5(2>6AVr`YX#k!vU0<8#o`QMHI6_3_fC5zFej;l-&jsMeb(ZX)l15o
z49f3DCTRD*u8Zz{b=zW@tYXud<XaQh&F`6f?ALW&<@&oupAgjle_pn~quqWS4Vn0R
z^@rBy);kv)MRHi~-^^irxq$JeS$Ym@<x4B?>)RZde(;5U(eiz$ryrKEF7i?C*=_9C
z414m5KN}j?ORSUsm}Zufdgp%nq@_=*CQPr~zpFS#TE5vfW9Of1-v8V}B~~-?9-H&{
zn8VB2MiK9HoMYy1+$$RQl-)O9*QSj9{n~6p`5CvTxxbsUXS<@g2A}?n=*lB|7(Z;=
zxoMAI*uR-i-Rh){`xgCq_&9&Q-~ZRkix;g7$vrH;H>FeMWAT@NwuzSW1^4`Ua(TV_
zd#>hG>C}y-vD~}`((&2aaau2<E?l|%n=`3JZRXhmw<FtZYAQW0?3*c>-0k^ju^r1>
zJM-mXYwjML^yS^b58wBD-Df_yiGP;-)udMf=LKgqX)(#BpX-{sWxwdQy0mB3m%BE{
z*DEehoUb{ZbGNym!(2V5Pz#0nYW5v`0mpyk1{kjrx@G&KjQ<PcP3FD9o{#_B%Mz^k
zm$)hE;;bk6PZ?@9?Yp%@RAp5+!-4u5hc9+lO{467&rEf)c4c9`DQ~Se<K^4=CvPs^
zzUkSMxla$CaQv6Ievvd|_p}Jk{;(hp%R{Xh#Z8lg-R18KZ96Xb>r+mue)_fTSsQ1v
zgohvRN;$oB#yQhY2~*|31*<o0`^wMj(X{Se@Xm){Hd;1s{PF1Xrv{Hp6I^C_yGF=f
zKbOTS8*BBwW<SsKdBWS>kFD$Lx%=kl=kx88q}rWM8XS*5b@YgKo5R5q9D$p5efsNW
zc%+PD#-5xjkIMUucz<T>x}fFICpT%?RtN9o_?+oV-Y??gRxxgEJTdV|>V_|yxsD_(
zsw_QoR{P<<N8fbsNMCXK#{OJR$DpwK`NRoFywCi9-0uJU)zy>w?)mrUf7o=aWm}eF
z+rvIX9!s`a&5q&a-He~zd7|Xlb|v#nNxtyeAjA6Df<hiQIkwv45+!{LXSW}`VaV2;
z{Nicii+2*v)01C3PkixK!nr?L;z{C*_Y%(YlO>)d-Z1ok)uf);qaiF&c4qRf^OH@a
zn>QxUGhy)$(q%u~S9wXm#`CKTkM%Q8=MO5TMFwwXsPi72yk+)*3u`92WgScEUVrt3
zNuzxeuk#_@yEpGW=G(v$bUuMediw<S>4%OVmOJp9uSxF<^Vdl^7c@+Arfk0a_1czu
z%yTQti~c;k+xhX^7a2phsjAI3W^HfdOZJOx3llM0b@S%QYCa2>J7-@!<J-*{ls0d=
z>l$}~`VU*@m;IKRK5IgX`Qq34@sr#FJs%~U(wpUzcy2+LuVMU)66d9F#g6s_rI~9l
zGf1D2aC>_3dW|%hHRtdBuln?I@~lg@c$zbRN8O&D{k9=n*VoJVaL28EChV+BZ!X_=
zZJB}n#4Pjcw-N)-%v!%y^UTzbI-%W7*O<31_1yY4)NR|8Q(wzYd=2wHu{m7w_N7J4
z;r0t|i@Z4XV%jTLNA{Z8OtF&pFD+t@wpWSKUAl9spx#?A)9uTP&R(7TX-!Yz${dF3
zlkQ<5=S4Q1s+jt1=?S)de9I<;9-p@<kt_es7g1k-t*HH0T{5Rcdy8C+g`8f8yG@L`
zsF*Ggkiu1xDzZ}a>tZ%W*JTc1;e#0hK}#lHx^qe+X!7nLi;l(5%0QMVZC&Ji&R~OA
z@B-~*|FtWOO?l2-5_$3J&i_UCt{9kj@Af<^8**&ttUGf*sjF9UR`RWSd}q<WD+Ukl
zh`e}Zv3-TJDUXFY>n@{nSG)W24o@hq);znmr?_;dbL%sktUP<o^QSDrr}rl6vo}W0
zatf2&_{wPg%clwk-oYodlKo@N{2soxuW@~?E}9#0*Cey;|K+D$W*!{55t6R2SleZs
zc{Pk!cNukENnIDH_o6{5c){w$Cz_fkE^HIA^vKLB6`A=k;OmZOd|-d@-kk8cNFpGG
zD>79i^TeKI(+@W&1)tDb?BQ&+hR3-}MoqML)zrcz6CW~kZdI8T^W;GEr`3~Ymt-U|
z9Qjf$6_c8iaUw>x%zwZA`FU*NlCLE%{WN7eFyG&QEpy;jqcUTo81Z^ljh!xy=1;>_
zcP@I|DyGM_G%?)0j`gm%Gxzo8OB=M4kL5YCAG@HW?X*%=(Mvn|Y+f6;^0k(XqLobX
z+yPU4xc!buMkPdhC4_J1i7$vfae?V|5Yuj>WpBmiEHmD6Vc(LKOBKDeA3s=k$NW|I
zR>fH{FBWVu;(I6dweQP>=F1zjA3w+o{O`eUX~DbOicin#(Mv%-zqOWuYpwXE{r0Hc
z_`+p!wqnTYp5|)T<EFMx9+<p2Ww9f?;Ni&&&U}7{*X5aqTom;0FDS@*+nF`Bu)zOa
z_1B}1gnid_2COyWdnYP;y$5Pb+(A~2!yF)Mz~Uc!IM|n8Taa;W=N#FL4R<CVPEB9O
z<2f@;_WDhcD8^8U6AK<@A9ZbBz999(8@?rK@;h%NY2=3-xhQirCH>j9{lPIoCnWEs
zw>+QvyyE`FBQv8cCvNZ8xTPgI*I=2*mTs?&2l=kN*zu>|;X_2*)(1;_PVV<euJv<0
zC;x!4CG4lqQ+Dl$Wu{7hHDjmzkvS>+@ihO5H%#@%Di<t&c;4d07U4giievqc=-Y4D
zCj95q=SmQ>Vh2cc8i?tz3naP;#N^n+{YUcoy!mbRj~&d@y!Q1kN(;W`xU$HZcPgK0
z#IY;03ixj3teChiJJIgr;@}9?#db^Yo=pig2!E{E8@oZLR^9Z1)|!KDzoHDnx9*bS
zIjNUrpm6o-g8h@FzG$s+ELS%*&|1^DZ?aT|=(UD-OV}zh>uO${w0gr<|Ms@)gX(G4
z61SF4EMCYGJBRn1vzN9B5C6VN;m>L;Z=G_ea7=KyYq7gjPv)6fSC?6Gh`v_TOCR^`
z;+A`U=(u`s*NT!7&uz<(3)%8Xxa{9c!M8V0h2372vvo#JwdD6Ok!fp7=AOUrvCKaD
z=BwzbYvrcr9{ZD#c+>0o$6ptN{m%z&I~JCjeI#|Z;lb#TZJ(Mg|HeIuIk$OAZu#m>
zZ;z$UHgt}S*mh}Sj)Stg`@E$&)zMRP_4RJ|JUw+tY(|NW^cSUc>3K_Yen(Huwb#4d
zQ+<%@bePpN-pmy1|C^`0O<282_DJgNjZqLYB<>dc(@C|yvnr>(@Mhjg?bA1s*Z#5&
z4XJ<mawg~WysP?)3-{~1_Nh;Ncxw8B(EG-V&xh`a{(2_kj`8VT(-y2KF#fhPD86{>
zbFDjTccq!UoAq`3lUb=b2bb)7_6n@>Y{nh))4R4T+EDPcT4&3RcL$zp+*xatZt`wU
zYV4lCkR6iJ*G=M!cZ1cQ)2K=he3^H$^~8-3(RW4Pmj154E%1K+rk!7oeN!uIJzze=
zWxCw=S8U7owoLu<T<z+;jA=VOXYF2Vs~c4P@~hq52MMZo^WMIEm%Uze<=!uPo2Tzx
z@Nw(gu=v}xU%xtCz5m2%&D+rU`?X(tm99>YyZmL7{FZ$i@4k}Wy}oXHz}KZ`uK%z9
zwr=a{+|-lv&i@nb-C@2>yw3BOM6!>bV#=YIPZA30YR;SXwA?-BmEsvb>0!b7llAjg
zy}NdJo6gqD6Hc~o*u*sL*T&VmR#lbn4()Q^|9Quw@_BK8_Vyk*&r|#R<BRvU>wZ-G
z>(`YFe_Xn$&t~3_yUWGv>y<wmJICwG{r!7fwEq9gqwjNFs#1isZ07ygt1cdYzvuHw
z+sFSSKE3uo|LaR{MEtYQ&u&*~Kdk+=_|*R|d;ITrd{4DoyXUOjbU*vae=<JV+kU)k
zu2eVk{I0ys?YWozx7f}4<A46om);ri&n8d0y=!96|92prSN!jH{7SV;-@aD*<d1T>
z(7I!P#maQArS82|ab2nUu<q9_2Cq{UmZo=#%Lu%jJI6=-waU%_mtw87iM-}>Z^p^x
zrOo>C)^C!YNBA-A$(L%F56m>%GhO3G0K3k_lU2+If>uts%HW;iGL3!C%$V}svok8f
zB{%pe-Qi_O{}p3?vA|t+gUi3*$^$c3nr#0r%==!Gd75YSPR4|ld%Ck4R4=LLF<4xF
zS=HJ0{VJn(%Gt^6I@7oLa&8FuWLkM(Qsn+A0;iX}o8&fU=Ksvustck{d|J{Jp%psW
z=26bRWy?!)G?b@#o>lI*sBT@kyyQ-po6h7e*Lmwx*K_tx=_?Nv^j>;zg8Q7em2O_g
z_Z(z>mAl4!%QnNW=X^>RsQ+wTq|c-M<ovde&mUiSpMU>}ufgOC$7Tw3|JW{*Cds#t
z@!6V|s@rodW@iYpPd}`4^sqU@+@D2r-|mgL?CKIDw3SElKFiiK*5OwIPaAyV4M^X&
zG<mo5>s=j_PA{Cc=;`bQ=e``xTk~2ePOmenZFYW>)n)1L$+6-Si%+glcfMfmpgVO-
ztn5}E@B1vJ%gnze#fo1n@w{RbQp<cL=;r*Xf!-g#`Uad<6%1?Bb-rcZIQM0r&fQ$A
z<!iKZG@tF`<URStecEG_xgH^s+jwg4vy?4!-gIQz%Qq8GZAi8F!?wYAGH2fAoVJ%!
z8dq&t+VMwi!{*pa9$V%ned1m-*Xr?1>v^{W*9q*n|D~oX#7f5T^%Z+7p0m=kyFTT|
zPnej^-mKU7x+34lM>^ua!{eo<MftslHJ7RW+|4#4{hiH%<nMA^3g_Ge>~3r+eEci<
z75}Me!WTB&>E}MT_e|0|8xhciXZFD|ceQ=9s{-alT`~WA@k^uX%;umUd@nD2$<MU7
z(6;b(rju+p>(<5BFQ#8PlV~jSKjzUD^-D~hi*8-iKE3Rqzt%aQxH&Tgp7R=?nIF2q
zA#Q;KM+xT*-{0w?8dJnIM3`b{9=tw3bWZ2yMrO;2>}Tf+RzLrHUNuCbiv8@fzkh2V
zr@eEw*yfvlM`GvZXLB2O%nr_~KKyRO-J~R&^OGwNFH`V4)aoMb%k$gUO#MK<q5FY3
zMxS)`RW96kduPv5=C}4|tv^qSy>f`1U$5m$|AwEe>pm@FC|Dh*@7uDklX-i)T*%sx
zlk;7Cie_C?zdy-H_%#1D(Ot&1Ouj#!T_{r1lbrDS($=z-S1)mT=6>$uOaE;DsAb9T
zg8GdoUU{GBU2@<Hn@Q)>MZ4X$GnZekd-wK}wI|!uhXpej9e>A6K5%{Vf$QgvUXMPu
z{Bz-5w^<7r)-Ha2|9I~9)HgR%uPw@6dB9l3Wc%^cDa;SrzlSPpQB^1@R@{*5Cd#o}
zNZ{LNg^tB+S`y#7dJ?X3Za%%nR3w)5-m01F_K8L7n~11#2nDXl7Ln=_V(E0aoGUKf
z#nra=P{$@NqupnsoDD-Bc)Cn^7gyKF$L(#IwuB`>>0U|q<6a?_&Wg)-^)F3~OGxqJ
z=w5U&ZuN~55i_^CT?=beKjywDq)${+@y2wg4R&&$-`j-<d|4v!#KOv+XDP$NXpydO
zC7jwPH$J}nIaahnXko_w8Fw@sCvcekK6=oNv&m({&FKo}UJ_h~PreFBogSI3AuC!T
z^kiAMPu>&-j|sEm40i@LDLCd;2|aORJzSUQ5?Q+9jZrplsz2*I7nhf!?jSD-E)ACn
zoTA|2GG(5NOW>gZiNG+&G>}=bq7^|bsrwriXedrl()i8F;>y`5;&@YENkdDZs`cR#
z<wRBO>hMhMo8gV&GJYTKKKS{%;a=6hBl9<eFh<Dae6W4sdeDv2sc^%=?N#D0G}2WM
z`Kzy1(BW~d7IND*Jw3%%v?6HXig1ChDFPm?i{czLf}9jYyQ*9ldayD*Yt}Yk?40{x
zj;gNp!bL0>CIkxUPuqTUIol##_9WY*!s^*m9NwI2Jh71fk;6Wru0uPNHY(5A%zW@1
zn<k@9oY_O}E!^K*t~!Y5&-qY#qjmS8EQPM=em{y{KdMbs6{$*WnRr9;+--wH!I54J
zsz3S~!`{#6lisoTVMbPE!Es|3=G}W`_CG&AS^MGS1=enccLP}z9V>V`uTE9!TJ+%Z
z)Ef-%p5-yT){5@`!Be|%)~%{_x@-CGKe}0?S|e1rQde;L6$g(aOSk#N1UV&&99_EZ
zh*_a|`Rs`Bn{%)5cJ8<mSJF}Wp#5W-`|buC?M0J2ym$^;mAsxV_Grm6A*;@UtM|@3
zPInGCayh~41J~mjN6r<Smp_jTzxm+`Z>Pn!+2Y50=IArI_HlwN%Mt(j_@>+Lqg+3}
zn0f4DJRPa`fqA>v3l*k2dDh|8mdV=l-Uc(?(Ceuc`aR`t(@ZbU1ry^BoOrP9W@-^z
zBxl0z1rEpbqRM9O2@G?(F<Da~IE^u}{r<u}u5EW~XEGV3Zt{EI`!Yjz$ED|WnK`T#
z{|ap~zIwm$z2yFbE2C_U;J;aqDn05PHn|+p{JGfq^^2@5Ru+DJIT<tEx>-W^r<~27
z_u~rBON*VV>*CMJe(Jg>a95$NE}`UsykV4^wPriJk@pSX&aJL4hZp_RzCU-ZNmQ1}
zEbsq5^<nmQcI%?!J|Fqoe4#WWHvi?}@OO74HwUjcy!rcC@%OxYL+d{-ymx5+uJzSc
ze_jUfzPjaZbau+Evph>p->=9&_;*cp@9tF3BR4N?k$cR%eeJdTTNh99s(;QqdE#pa
z`33euyI9;O+_BjZKCAvZXT-nm$fhzEj{hFJddpTXH2)E-ts1oR`&xq~eBW4PKQ2pO
zmfHS~as9>I?f*93Xe=vv#I{g!g79Ut^zwJ%-Ll5(%q}sD$eMjyds}nfq`j71v%@WS
zS5Gdjo1R_nwQ+Uhwdf1)yfP(bNtgd=*uU}X;!FAa>z>sA;NU&}ZpF^Jpzt@$bBprJ
z#p~W5^lz`t>%PCXY<upDyZ1{TTxq*_^X--gyY^i--L-$>wZ$G0AB@>gf9L#}TVsDQ
zeb>fqcaHoP%&7Zu{^7OL<?7+`_ve55@#Wv)?$4Wr7hRow_J7`dliB*~<0f4X&p&rE
zZ?WsTn#-IzJi7z}W-re-?P+^a)E=DGXQ&mWXz`@K^U=i4G}n(uY7{*Te3m-jF4`xQ
zk+UH7kucxEDVGA2-@J1W-e}@+cjm>7sZI|k`mYo|njzTa?zmuM#o?pps!udLu}y8@
zXP>eC;Q_<<Yod)y{vNYg@b9B;=^?il^LBr~VsFSCwelOMb~dZC#;GFzkOgsvi;jKi
zFQ4pH`Rw2AO}U$6?n+(xs#W=I&6W!L4>9FVe~U^d)XFDqWq-`@a7)b5>#Nelifj{9
zvS;sDZvJrYj@gH-jrZ@cWBBG{zaZT&!ZXFxmS61@gIj&zzPmfyg}4&u+a}k4D(hoQ
zF~7UZ_2%Q=0IOct*{ot$SEY1wPSWf3?cTOAEARG&N_BBhcCXEcl27knvgV1cL&1CL
zi^4{{0k1?ZPgcqL^<||Dqw;yqIu-UMcXTG#eX{X%I6S+OBTmSn``nLxUjLpfs3>o=
zJ+S)5Y171d$1n5FU&v5fXV1MZdcO3PWfhHoWe>CqPMBbP#GygmNpk{A#G+D(8@#iv
zwm;mG|MpFS{k0`RH?CiM{wnD7H69)72I<}d^1P?+2);6}dVFoxl;5gZ>@^xsR!J_p
zW&WZ+B&DUm_S=ukrkc5Wh0J^Tr^c<D9(XLLqh-xR-Q7R>_AUEizK-W*UeDQGo+00P
zJ^!(@`<`~}<6P3+z`1j?<bR$y#tc^8O#J`X3*Ro?FLb)ILpiF^(`J5~qK@ea*>cy!
z3rUI#zu#oYJ=!NZQ>pq`xq+c$&<BZsGbZP<Jrp>s6Cq~Y`b4YV>-x;wW>fm!%FGvC
z*Sht|#}$gjlW*LadvQVN?!srrKT@ymE6@?#mi1+hDEmR%!@FeN<{2wocd7PNpLRG+
zr}s)n8DCxI<mvlL+xt&n_3-@tVBxHDGWl}L)@83};MiI6{9nhW^JgY(IWOZVwDjLE
zZ9eTg<qCS?8IS9-dY3gf2Bs<|bFVvdXQL^jF8g`Ez{1|s*V93Vk@V^Rk6atJaAwdd
zDeiSGDOap2zkhr6=x$|9|AH=ufY=}LW&eNfO)rb<nDISY{MkV}UJvfodi-j;8~u+?
zJyOv6PsT@Wo20>X?JwsXwSL&EE0*76ZgRZ4&`#{-aZ$TZGv<dh)NKz^lzwfWAi3tf
zpPGRG`WSwj9`|&Gnuj(GE9XA?b*m^(y0`6^>Pi)}GijC*54_$?s<7PA=UsD8s$~I}
zobTmr^8aghM3{DM`B>Yt<Ib|{rH!|^6Bl@!Z{YhsE2BEwb0wqjQlZSv$F_uY-(KlB
zSL#elVUE)2T?{{`yRVCTUtDss_w`ew`HHtT9jJ<olT0=|^xYt6k+Fh+-_n?MQ-6Lw
z_CEG~GyD7>TDLN`W+fd>-(vk#OI*yEt!#qe$K?KK>z7LWJhc)JyjE}9CZP4w=ghep
zC3fcfQd6|P^PZ2)VbV_#OP}nOoU*%T_0)awDLk*fD?H4QGq@zaI$?t!tIY{6ajoSq
zcPv=`bm@YluMAurSljPSPQGt0uT{m}`1nlcbi;t@0dbQ$HZ9sU#d2fDd51R&TpOPs
z`D40x{$c-%>#nG?KS;gCtPu2+;ZehaX)EV97OZT|UujlwzTwWDzL?uz*`-?cPslp`
zcfq{=OW_9FWgd(DF!>_#!!DruVx`lq7RRvPr{6l}`X%?hdR@;qdlAp-(@m$vIke*W
zs{iUs7;K7)UNc$m;*)~utl8^4#Fk!Ou#LASkwwftW265(OS#SdnhrT-X@3mOEjk+7
zWnwm*Ua?y<JXF;*kr{Lq)*h27%qlw-4l6DFT@!n6W7(<szn?~N{$w<nCwFH>so=wt
z+{ItM-urUAaoQ`#7M~pJXVbK0Ip0NSPo5jJGqn4_(Za3kt{<3pdaJ|{D~|Os@d_0&
z3`+zKaJs3kUB;>3*ED5Y)KZzZD|Dr~Z^sGm&VCc8C9;trJa$Km^@J@=U&Ys}e+-=T
zdOJ%oJAZ%LHWfEflS}HE_b*1@sr<3%<>}|G6Q&qBC2kB=(NMl#&EU*;SMf?_=)3UB
ztghFK-5K62kcd!`<v+b<(hJdmNh((H%irldcso6)ysS*(ubB3(E4{leZtuI``nt5l
zX3t@9;T0Dd|DUj5QZq}tyFB0Z-Rx^J+YVe67j5!i!FDa-S;fhfg^j0$&G_{SJ1ed#
z=*$k8kv!v#l5yIU;E+QX#B(LwcVCgxZ06T}a`XUqPSKO@wV(JtcN#?(nx>_3yt^3_
zQEs~0`!wGn8ROOe9t7`6$xgoNKf^`2l|eY~&w_tnm;Q5=>vw-Ox1Zr=<Aq%n;ns)b
z_}1Rk6@2Lu#nPC`y`$n%*tWIjQx2||x?y+6VfGHci1{;&PuE#+_^7X7zp`De_RzZf
z#*a!09^XnXRNe5;m;X!bd;S-aDz2YzXsX{A=U@}KeQ{CZB%RYN&0c5At<IDSU5+)m
zUdW$WyKmbot12J8-fc6)bGNK-?EZXKYs;^tCf+OcRyg~(pIIrFu(Q{jZT>9-?)w)r
zT>DN2e3*Uc*53T8H~mLN+s_DT-{fC0X=y2ci%i*LU9~U1ryN%YbMNqU?Pou7OOnA(
zqW_Gj*gE#g56MS2T$@$;Op9UTyO_NbquNicbqt>^kbUW@^h#5$_|{_?i9g#vYeY}^
zoR?_$<$$=1w)PIydFSoaoh7Eq|6G^5zoLPaH-7`)+ok3oZm7lWdNWme>QPnCJ(mUE
z*GvgxeI$DRz|OkuFKStnEw1^7oebMQ<(9;$jm>p#uRAABiJ#vXte?m7@Q$FQ*6qEe
zZaMLfe>&;SXTI}um+<@phgux<!y-K16d%~WX^~V;rrNHXhi*Pyzu)5uS6$z<<$*I9
z_aAdl&3<Ba;YZI-=@!3Ui#(3NoOeCaE&*<zuWfPAxIb4gce&8Qs&$3|w;J0rw!G>)
zwr_X+y3p0$RUOuS0SmK|;$-i(?wg<8(7>jAd9i3-Zox;%xHS{l4fqpzB7Qx#PFty>
z*_5}#h(TjfQ_GKD8845yhFl$+I8)u6lX+i#Ty|Zddiv5Yy&Ha?zH#j$*KO0||GBiT
zww&R8^i`$5*YsJpL651>hX3+xx<4)-`Y$-+25<8$ro#yry425P+|JIl^W^HzY(A2E
z;MXO4K5enzyBMbM^2sVF#_zb^&!KTG>BEef8}~o!lem&_bpONWi42WXkN4&$otX5C
z+v`v?W1G_2b;iPc*IvjRYtdw?uh(9COyEvZ#GEuHv-2UpPcPn7Rn@9{J(k@)GobI-
zs`$Ddk@%Gk8_bS|pZYre^qQo<Qx|>;Z#xw)sa2o4;?LBDpZ>?Mm~ZE->Yp{|RBcVs
zm7Hg9`1Ah-3u#W7Zmk#|>?PrQSbu`<<+S?>)%#xm6l3MJ5r|p%%Q#qP`don*QnHW3
zPgw9B09}VQlRx`*`^#UAcLJIg_dFN$eH3Wlu<cBxMQJU!KC}E1yVn*a3nRNur#LjL
zrdLcT+_SCpnnIm@GOOYm15O^>Ql>wr_k7iiW-iXFd~^Q9PS&-K<p=hyF;IBMav(a*
zqxsmbZ`Z%g_FG*Wq^kb@Ui}`6-~HFak7T@DYxQS&eR}_C&)xm!&vRz~oD?%BZeHA<
zx?e@f8{QP?_pS4v*wEZ{B1f*pLd&joq1<`*4#Bn~+X~%}EMhEFKlx)_u7tbJVw+pe
zHt&p!eZ-H+&PXv}e<WYabInYi-+tE78>)@kI;_4dGU>;5ot3Dc)${MxvH54T^y=%q
z&k4={xzEjSS;-eshq;!Wnlcmi?`4T$&q%&&HDl&IrK;x(E?Z{2pDep!x7f;<vzfgI
zzLqbZAi8?e{#yA4?yB^MffKgqGBv#T#F$zBb=$)F`p;&jiF1Ownx6T`$Y)gj<=vU0
z{{4h^SAMS2|1F2UI3Dn={-ap<rM<+d?_+mHam(!B<L~1aJQS`w@$vYfuDI<}3vUIz
zc{0nzXU0Wihl1-xi`%8e^!T1@>psZan0fe0_1}Zm3fxOi2E9B#Yk|0Vo<x&-dY;kw
zy(yC`Uy3qwzZZ|F$h<Mz++FgMs#e6|-P<=$J>=@N;DDOY6d$j;4H=9Zr!uJBo_gug
z>oYSn=UC+=N<KKL%TcpqX@lCqG{0v%<Sc?^qK&00J~|vLNjmp-!!f4+N9O)MeYNxC
zavrm4^CGF_;4>WS9FLU0U-4df?tu;OXWGr+V#&_XX1ONNqIQYLO-Nds?P^}?{(ZW6
zs*V9aZgpPi7Pv3(o<H{hpM&q=%l~&u?W->@Tq=F|^7iBU=lnNbcU(PfkJq}j_NF4W
zoL<$sQ%v7auCviNCN$;l)_`07yi518EZxkadRqLP+6hsee6DpF#f$eIeShNPO4W$G
zmf$2d{&N|xcJt{dEm&s#i>oE6&AQ(~H*Wr%|C5C!y3UllG#~g{-1B#_wYu@2N1YZ^
zCJPtas0H#L$oSiFd|vDy@p<koq1p33&*9Yb{cn&i_hSpkTbr^gliDuHIussTv9Y+|
z-jpAfvUmMg9-duYUG(qa)0YCXWaH{;sz3dDboch=|F(NQ?uc3+@Qure&sT8be=fVE
zk6*)9V9&}*_u^k%cOs+yDO?kE>6oJO=ZKaz4-dc7*{pyYwXYU5$ga8UG4H0T;1tc$
z#2W?tSLQK)Wv$BE7|7}-DfBHzvQI{DL7)D;ggfT~AIbVi{<+EV=xptI-i&60&xZqE
zUzTi%%ClN|O!0-=WTpkDjI9-ocHO@E^6AwNpZ@&#9-PONcA{6Jw!YHB%HLLIZi<E2
z#?I?^U*A0Z(QaF8;jSj%t{RyDX-T_D99#ciaeAxIS^DkS7pFbTCf9bZxNfA(Y`*A3
z%Nj|K?RTSE_dnaZyq|slbjJAqc0Yb`{W%w0U9o&C$N#78k3V1G5IG=!-Z#48c}Zbt
z!*Vt58;(&8{Kv(^JHL9olGjd+^nbqcCu`Y;p1A*ZUnGxxzA}ZyI>If#M!rhfl{uw8
zEUNBxn}}G$BG)-9YJaWY`Sfs17h`|zbt`7RX7(z%h1MU9w=tb>%Zz_>DRAGPANJqw
z?cJX%9Vv0I{`!2T!1=-6`)?TO@47XyTIP1<pDWvwwLO2Qe7<~1D0TBh7hTVrAGh6n
z|GDn8IP(X;2`nyNg~e~)T213%GHyP2$3UXz%j~1N7wr;^&Une3dvBq+=Hay`SI<>g
zTRoQN`_-P`uUA*5ZkvAWAYVnpnUxbOrG+JYv=8k#dPPR^$L-vb242q-TbDl9-uwQg
zVA1S%0r#bxi&mu@vWxTH{jolM=8TE+wF<>HeoS=uA$g3^YVrcjc`>rmvfNq4M{*yX
z;7RWnY;awCdOLUbm&nI$K}wP>ea$<2%C@wo{0Y5KSmnOQ`HSa@nNoMJ<ZO2S#$>o=
zk(+FVn6l6mro*PEuk`(Kxv*lfv9NTuT<+mI?q&Z(q)V?Ua~+E=;@Q5y`NXW_li#*h
zt-PFIccX<{W^y?Xk50>Ln-^*ovVr$DF7&o&wl-5ZwLba&frbJmw@+yYebp=)vd$^w
z@~(Mo!guSFi-6<7*?isAA_8$!j(%k+U(Pq{;MP5l_Z@cIFRt3}!*e8DXRh2$>77n8
zzoQaLE<D(C*!l>E+L1YvWBJc6b56`my1d2t&Bn;Z>}P^XPq^?ee)Y-jy}>b$<6G)|
zKCG`z*Hcp#`m&t;_z9E7&5H|lZ%b^Be5SihXxlEc+!q1!Rbmf+TU9G4@nGxoa*wUN
zA-*}67mBh(2(RPy`1L?0`PVehpBoI8y?pRCdzIC(TLH@_y8q#wmnAUGe461dUXgkB
zp>su)FE=DlKeMs!X8i#--%E=g?3gjH@S%>ez}*QO<C!1IH|U5wd$r`ol+_Gj581*F
z#+`}2!TRRB#va9nV6j753~6_N&S5f`_j&vE<I4+QZR=wC9hmpdYkoyT?g!@X=YQTF
zym&EG=9WlyaKje)RKJW!bJgVzw+~$Sww~|Y`o|BJxfq2V<kYPzFs$GAx1jWreP8oz
zp`8K?*B$bVy|(tg=7Vhwh5rBIWp3qpEpTFqnksyY&wk4c=lgMSv0olvSmvS{c93h$
z@7KW#-U?`z6?}=7xpPSB(c)9PFQjzJ#{~$=FIW^Ob5BGyQE!gG0o6>CnWgHxUuCiQ
zobE2~yqPb;>fbPji`!<Y_p({8yF^O23SBZ>zd5`!@6f3)M(ezGAAM?TpY!LH=TW7X
zmo|rZyysNDXnyo1U-+S@ck2R8PyAWslN)@d?puI&!Z+g|Sr=L)X5U!MGjslg^eIQS
z><D{!d`dj`D%q}=A9r?VF<o}vWtw?MdcyN5nNhz_oC+#jd!%1?zfkB$m6*0Op>4{I
z6E~Gamrr`f6jK=(;!-oE^UouPRfmNH->UhDA69CaZE#I}-!7jUQ5EO(BiTgnOxS3)
zbG=8-gA|57#qX(^y-o3nug;VS-!M9%$<bZ6BR0AAfnllI#wlO*`_}M0+h*r^LEp7y
zJ&VJ#M>!5$ybLQgG5Sp0qs_SCAlrqd3C)}f<|yfeGbK#sOgOwW!I&jM;*jaBgIxPR
zHRT#iH(WdMSqA5!b;fCj*0;{;Wypz@wpBaeCpcZ3arXV?*=<J-un4`HloMprb?Cg>
zpLemFpLVmG&0ceHPuS1BHa9+fK9IKQq*QMDRQozkwJ!CZn>mX_%=muZba~pJ+9X!i
zYBJe(is>=EkbfO%-dqRLHg;}0rm_9hdz&W5XDg40m}%;;vEFF8Z=R#MZ&k|XlU9%K
z{n@o?DO-Z^%_SS&h%wBL58o!$m^kT>TJ{$E&}HGvcAY%M-u`#;_j#=IC3#QYy56EP
zYl-vRX$5;Hy?hwHHdm)cY}Qi`=GUh+&IM)8yt#VDOt#B!l@$Vh$gtJ4-VI{>F=L)Q
z<H2Ts|D1&<UrC9lHpd5Vi(QfWY|Z+MiMa-U9hsO~`%PbGPZ8%`X6@nd;X(45s;IJ`
zUTJgVKW>d(A$o0%c~H;dsR3J$F41amc$j>qYH`JzKKXrS(srs1=jWGRN{(UuqPWp~
zCG(|Acft>e|EW_<QJWBwlG$Lo)zEuF-CU=h_|j4-y&FXmInN^HI^INg?`+oCu5#J_
z>6V=Dp)MA)eL}A{_9o=kIU6&xx3L%3m|YUO9llXume11btqpUg_s(K`A*JdyS@Opl
zr-XCtQ{HefIBd05o4!W%{L3TW{j5Hl*PQsYkn^n1siwZ*`Sz;IB(FV|Z{iKy<I>9*
z@=G=Cf7}e~pfx;Z>;(reBpkk=Vz49dA_s?Nn+v1BtQ>(T7M5A}=QSv~eiCU|bhK@e
z_X35`lE)5Pf?B+qlr!RZ_yuy!1Z0_x+%cNV!lU^~iLv<<uX8)E^X#IQ<hv>f9vh7&
z85D5;))QvC@v-6L2PT1>i7bbAg{mr~&zW;{w%)!cx%ajOz3F)xxk`28h71#p<jEB*
zck-qysIOn}P%Yg%joE4Wlq1D68m8#wMsZ0CoVssvMbKfAtnY_&o7K`co!zO&`XJ3a
zD?#!)TT16Cv+uW_%=1{bMUA<#AmZR74#z_~ome#viQGz2kQdT_Al9g&Y8AvFwCsTz
z^UvbP$1i+4B$pm_sfsb;#wTfsOQySK)&%`)N<UR#G=ZIcw*RU4k3OD$Y@ZYpKY6}P
zbDOQ%d(z?Goee*i1n;uRG-lnz#lx8%!)e1cIoxXL=_zKxYLgoeZ7}$$`c}u0@sxpT
zt}x#^w*`qGeQqT-GF>oun!8zYv9HwqDSGj@d{*9WNRhjroLuDlQfS%PX}b&p7&vFA
zdrddYU3Mkc=~^j=nA-6v`l&M}ZNE8H$@s{#>06e3W4f^6ZAOBRRDHUkcht6DpUzxL
z?7p||P4mGgQ?}TAdHV8V;;C4p3G5u*zL$i~a5Eed+ZAg%V}^*FX6&+(8{2ZjKP~#|
zBc~a=pyb9fU7jaR2cJ#6wA8ab_h#8`Mg@?>l#&}t+ir8JwVhP<ijpc~47gF2yZz<S
zZ<02PJf5BwTvnjUyfa}#g^TCu1U(1-WihJEl??_JE}q`uadH#%f;UZS+|%j#aN?z>
z9@Ax08n&og%(PQzlrUR7MbBrK&qpsduEU3(O}nJ(HC;3Dq=R6_44vRz5igBcbtN^7
z{B!nsp1!5az;FGB+fUq}TWWd78O<;jg#@l!ZBLvo_&EgZvUzFrG~2mM@r9a#M*IW=
z*KFs!AdVDGTNUvfkt)$=9v@6spPD{tnsGD(<2H|J(RC6hW*lAo+$)Oj&8LJDLeWa6
z9S=0Ky1!f<Gi}DB89gF9)=3G^xb!_NrBk;*aS6i=X)%M$$jz<|iQUN(noq9qpUvc0
zVBoTJeO+WycZw_Lr6mzdG-EkV2nCBxp17yRTuebzGS!tKu`9)BlDpvNdr1d_cEu`t
z`#kh<`_wUs$@`^~-?STI8!mlHVBFSP&3I$YZYIOSV!ORGu6Mi6{N&nmX4-CpNz=C+
zXHZ#tu29h7MpO7yrmhV)Ro7l96pXl06h4)C(UJo}`zB1jnG_ys6JZo-uA9A;!y#wo
zYt`jiIoCo@iyIh4zgl%x;qwGmkDr%Z)4XH1iUz2(#-7@~IAz<Fuajb?mR!?~KXEc=
z<?3H67tUNWd)kdC7KLS3a<|vm@-Dr9T=;WiYS2>EwPFqKiCp)~PM@D~u4Q>m<YI%=
zg56KouTZf`Y&bRDlq*``u*btW2Us#siJNgn^Ozrs_L%lou=U})*lN?m|9$i1yMESr
zhU>3gR4gcSW76zp6H_A2Wd2;`>X3N)otrsBtLEOzLP6aPho;^0)nri3mRy!PPpq*+
z_i&;LS72A=j4<|{92z--e9DyzHauThqwbwJ`;5UPcCTkPQ}ySDY<qhrr$S)q4X3l8
zj!r(cZQks&3?kobrsngm%$a#Nhjl^9x!|8>6HiUM>pSWAbh)Qm_Nn1vH-&cG{HU0C
zZ09Ne+fzfgG2{s`%5*(9Sn%-debL4?-R5W)w)D)Zdp2=`5jQSvS9MP~dF5+f<Spx5
zvsn_GZ!amzU+W;TQPuQDp7}A|Rt?9!B91Nf$(vJVZWdgbV3L$@K=$d+yHBrdsbwq=
z{@?QCthD6YL-s*O6rOq?`MT}+j|<7#iZ{OQSN?gG+5Dy5Ns;9bnXY%F98<1nJ}4X0
z<j(PqEjV;#z|sfjgc_yGZeKc}7w=_yBa7E<)0f)^d+j#JZ~2+<B4TpmyN{uD``1))
z+B=k;kKTSm`&Z!XbKfhB-p#b#dU&g^{i*pob|=ev{AT=A+tf7qPOYx0;H9DihFcf6
zm$F3Y=kUk;OgP|{TEiD?Az*I&poy)BQ9I7`!n~NLSu-cANEa>Z=U#ZgOhF;M>f6zW
zj)`p3qi*nBVQiW8DKnxaUFm33->GLz2TtcaXpF7ACSYE@ljpSJ+sIbAx(24*b(+ye
znS19ovF-~=p72vDW7mxHcW+m0?Cku%>#|z%mxL(gZ=5?!CxleJQmJKBnR?07OF~R<
zk@105lI@)*H`TAZ!#X>qBuGf;3j3`4nPsP*3RJkM@!wkf*7nc)tS_2(l+AWsWmW6(
zWL4FeD`#)|>iXUOI{VA{N7>RsJ%2EMTI-y8A-gmA?*2FT6PV61F&&qePUdfURey>}
zX@ZU8y*fkA`+gHYyg1&u`MPt<<8Kl-UJ6I2U$$@g?$yI?C8~X-l66;`>w%jm9?M>P
zwPmulm70R{o&&=21-gN9Pj39v?|C%q{N<z58_&E~=!g<m=<+sSuz}x6@;U#!x$(<7
zm$zh>)Q4P&-T5_h^^$uZ-e~k*s>*)6Qg5~X&Yib^ekt7^^Jr>!-p*i00li|ieeag8
zE6DoOAnC%ps3&w@SyPiJd&E6YwsM<CD$eDrBcC$qUC#>J*|30lnL|ys*OKr(JO+=u
zbo4&nJKZ*OO2dhSOuwa5%Zd+d^6Hk=Y7Kn1=D)00w|R|<g5J*EPo_V=6RQ-bdhG7v
z4Qjuqy;z?xX@{tEdB1Ab_9+FgCf(|d{kvRnpXQObZ>q26{`nN(vYqqGu9iIEcYAYY
z*xo(%=*0(FNp9=4S56gV_1p1p`FZxh{tLw$Br?j)nUA-uuhkR38D?o+e6Xzgd-Z3p
z`A7G!e{+0)W1wM}eaP#A>qpurFa8&O>VN3Y(A!GIA^WZV{d}^kzQ$A`o5kMK=7)p4
zhiSo~!x^DBQ{OkFZ8P+m<jL#x!##et-Ocrv8~isssuatJ`>;Yx%VpWApkoi>_8gU+
zpIor+hHpxZWpd4?-HI(W@BBPV3RIH|ssuajt&Trf^Xr0r!^0Qx#qQyuB5bD2Y~{hn
zn46f{`grHP_|U8KYx0cM9GssXZ@+kPw&dc=($`$v(x;aGVVvXof7`YfFV^;4yt_M&
z#pAqI_+REJavXY(y7}&(i>XTa?~_o`w|B>j4|8?itjts}u=yTVtQ*4@7JBHDyNh5<
ze9Y4fCf1Dj{+R2>n%Q@+SuC~t$J%4N;yAm1bWc&5wMt39H-m4U)*XkC{)pn3G8t=W
z9<$HN({fufMN&&6OkU<(lzvn(Rd%zRkxaz*>aLH`$)Ow?6P^ctf4}~bOGB(o(6XE9
zb%h>n_X1|Ec3#5WQL&PBPsavsYm?g#xh4nlL}?#pm@~2J#U)KUo*SZy8JnV4IHZbn
zetR_`;DpJS^>N)Fgm<e*oMrob+R82P#Tq_V$$$@2^!2&Uw3y9QyZ-a4;bM)F@a+;&
z4NdD0S_URu|B`WRRgYUi!1U`aJ1t5$_>#DqV&_Z_VdNEm-qRIc+WL!e{g$dHN?daF
z4VBATcZMln3N2AH@+o?6<tcc&BU9qg)R_nGPT8t^<eSvSZeKld*N}fZp6gHgX})S!
zqE~zz=j>vptuBkVoZhff|7dSi<E>SJ21YrrPrttW{djn|Qr=n*$KYL>^Ml;2V^)<t
zlK9;DuQiazUbTp6zUNgwn;^}DlMC86{_rf(IW|2{g!Pezr-{BPw=$EYX<w(?hvQdf
zynONSoW#9_J2NfKF6qeX=Gabo(h~6Z)1y`TyesZKn<bHUNZ04|$)68j?q2+uQSHZq
z`l7NL)uoYdRSIQ1IW3+%DkzaGIB~P!1gFK6Lj?yeE-;XBf6wQ)Ig^R=>&liu=7yAO
zr;RTsp3hlqp;ja!yu(jJl+$AOL5BU2GF+;huCKNTX-wLDON*~{R*Tcg7AH@Ki*aRI
z)<+NKyC3{taKXN&y5wWA6x%(|HWrP$sf812J(Yhg(wCYxjpyu)6pMZD_}BUK+a$Lr
z%9h+NG-Y3+axYt$`E|nKISYRtYGOI8GQ}%U<De4ji@y4|{7SaFUYSXF>Do+@k@oVH
zUKLoOp=uVQoVz0J;le970?vL2xZ<a<KlzmG(l?58&fM6zG|Wxr_lqAN9=+J{@t2B>
zx30*Xj{7l;2RS1<-PEHZ)k<{M^t&iL+IjrY+#^duo7mk#tB!j0zB#%p*<sP|LuK1F
zJ-6jgy>mbL`iZ2=rq{C)1NN=a;5jX#d{Ed)Pjid+X<zL!)9Rb+gY-5YHd-6Q9p`mU
zj^Bc5>666_sW(3z*&HdP(5Ur0u)#>_`MTnXEgkF%6NSD9?%y37_MzcyyX<uSr%QiK
zkUgJiE`0Tqa!6kK8=fG$Dbr_{H3oeRY%p4)^YpMPqtJ>+@~j%cCxq;LoQ`bnR1b2p
zKi0l_YI|HlRAd|f&8t5=Z`Qk+{?k}moVsY!l`GxT4)!xm)fS)5;`L!!gGRv5O@^GJ
z`~izpe=V-L8M(41$5StU)#(qayNy;o3S|uq_L<f2J>;0lVadl=rZ<>J=&wBWZ0?hP
zOZNIaH~6{DJZZ)YZBaJeo2pgGnu!OlF~wPa5xKo$vNpSvx2|Pl)7QX?BG&_xK70uO
z)PHF5{$G<BJ|0jGaJN6zeD|te&C#a^pBdSl&^xJL{q$P!n?-r+Vz0#Ho%_lC$o=6-
z)9z_4?f;iGXxRJ=3lvh2t6+Kc<#<KG)}nyY$_-mZ_&2R?_Xyhaq<+e=okbhA-kI}R
z{7(O&$=dAGTiXAtHEG!VEHdB}=wGQ&!0*t)E`2HMX~N;B2fqce3GAN5x1{Y?>rG?c
z1>cO=1YWDwF>CxRyTp*?u{!pL@AMaQm+~lV+wp$GyBS=c%bZWe{+|2v4&TDpa~CN*
z)%&mND75RZ7FW<d7LP+mm?zyh8XQ<RC0v^&O3%J*x)4*2D~sl>e|I@%IxX1UBapE7
zh(61teB+jeJyD7eT05S)^vq~~k@J_$^5wx&ftexGB`2PXS+zOt(ekQKxolUtpNM`A
zxXa(6rnJZ=Bwf6UA@|@8Cv~N;DSsBc2vW4axI251!&7#*>C9dqs^)71$Q-=L5@O@f
zd2hAw<I`8YnDrgB)RmUlw3p9tXH89D`rEC%xwf%wQa1kyZ`VH}&mx5+Qzmo!a+yDq
zV)j0C*yr(NN5{$!8zc?y3wbadVdnq5rJIMnYR^rthX*ei`OdVt@vUiLk&@J@W>MpX
z@oi68BUa|fg?v7$q?~keqTQ)A*@~xg<)zH{SN#+!)T|JBrYJATXH@yYpwhs2@ztjX
zSsZM>B+8jhd3qsd>Bk3NPZMr;^PcW}V8B0BI!EqJ&>AUCn;H7-)4OU{oiXk;ieS<+
zfe19WR~`#yYd+oFezsYr$beCR-{ws6^i7LcHcvg&+<WzuqrRDrdedPWn;R*g7Q6}C
zdGgsow|z1(THjV~DwUTo)-%bG%XxD8;L`_*a>Y}px-sxiW|xMVlN0Tl$+}te;lUq2
zRBSutWPP4UOicMMx=EAsF6+~%qc^6^o$v1y9QpI-6Pbgj3W8LU*p8o$E_i(8UQhPc
zP5pKzQmJznC!GtP-X;9~g%iulrThjHUNqidY<s)N{*BPACGYKW9^KY#wW`0l|7!ZK
zrIx8zqC{-W8meqnt{Y{=EsAYfsBG+RB*-SzW;erkmgjyB`|@C$la)#>ES4c@t88wt
z?EI2#qp++;@vx(xGV94X%&xq}VrS)!_11~Cb!tvZRBkB|XPDaXGTmnRVunq#TV-3@
z!ukYS+H@x*ia#-m>1>MRxpr-?0m~U@n<s8_Hkw_TDCl`=se<#Ol^Tq#mrP$86kLla
zk+{cv{F9#N%cabflHZ(|Kgus(+C0H{+M*i;@>@!dD}+X~9DiWX;mKxcw`Ye{UH!jz
zIuc7ZR;pj!Ce%}6b6Cmcx^8mWZreSV)3*QGmf8DZ*Oo8Uhufa~lRnJJ?ZQ`PvY3_Q
zj_MYcTTL%F-ita~*7Cw3sq^4FF6FL(0)>lzqO9ib|K@+rH9WFec21_r--R1uGnQ~K
ze5}tGrzoryqg3p<<<iN@cn+C&(UY@t#JJ!6H&S-fG8Dda`sXrnFTXuUE-W)PUKX&K
zd(qU>7Xx_T@`wIp)_eKm*VNFh5fvqjX6+Xf{TELublowp@3c;_u9cqodBJJi$DXDx
zyQz^TaO~|>(}<px>^4Vr-7JqMO_{HIEWLZ<frDIDXEq=Gkz=^-T#|_OiAQU%s_M9H
zRJM7?6@4g4#E#Q>d9h~q#JyWDb98JE>lWm;+xCku<Ifdex1BtXJsXyWCm3;ksGO;`
zSm5^b45LrRvJZEP-ssWpFO+jk?af$Fd^aq+%u+z`^i})HRQ@R)Kc#F6a&HuPXPtN^
zlegTcS~Gb1@ikwjo`1!2v{cIJbVUE5<BBf>vNtR27k|vBzg9we`jhpoyY20!H^0j?
zODSr-d91|l;>Cc?Ut^#9edqe45S7q#FY(zm$!=+Z6pqxJici)khUGIYf3sy;!biQr
zkZbczb0(flT6|K-x=`d&Zqq}P`v#BKW;!<px-=%Hr=PlOU|{aeRII_pV_hHG$+dZ*
zB`-tM%!s|3Qo$2jb&Va{oS#ZB^}etxL^v>mSAb2cxI}STe{bBnslOij&42i``KZFI
z<V=hGhx2`MitY*&ept<(zMg+V&~YP?MvXGtT#f3-zYa;JY3Uk!uKse+XzQ1HT^?`w
zs~5L+%9ZSpD_+JgyFU2%5hJ@R#x;spg;(l4*<q*Zb1?Nl-;=|x%x|(7{^_(N1bQ{K
z=H4l}lx4xvcWYN|KmSIdtnB{j=~runKU)8ZDoC7v`1hr+7JvHB-#a$>gV~Wj=}V3C
zYIz;wA2Y}K1nTKsy<V`}p08>4!_9F|44<8xdE><%o`2K73A^x5Vq@uL$=k`XYD4Z6
zH)WHEgsJKqzm-^Dd-yzEUGT|WNio)rTm!R1+4nd7O(+s`5X;%B816qaEaO{P{;BpY
zeu=XkJLJO>4s(CtnE6b|H-j;+gZFQa{pZ-4(+BI{<nn6VKWycCZo|CYsga-F*yd>D
z9I^QN|7}kCigkb9Dt*gLUGLhHrXe77+FLDjq4>h(_qC26iLW;a_%SE?QM2$#UCpHW
z&)2P!&j;3Voi5Hh8C=3SZBuybtNl-lxvdYUbROZ~XjS<xD^lsb^Ok!ul9@{*ZN9FK
z?_bnC?{$on^-7noFH>tJTg7a>|L~MPj#GEtxcI}D>5a<|T77MK`0?edCkHNX-!jwI
zbPk7up3U*+k3Jaa|DJr+jiKM}^rS93o8vA`J&R1LYCpVNQC}nxv^4ZvQRP})Hx3<+
zFRpot?96Z0NrtGdoWARALfp!u=?br;i{4Gy@H$+>tD)$G<(Y%Oj(C6S^f`L9sA1#j
z1zK4LR_|=6d^3wF;{WyT@7^g+8&6NxR8%v3zm_BCrO0lEjT>hy4a(DGxVd!llr)E(
zF$}e*QkglXEw6BKN}4Vi6eZWNA+kmFk;Vy4Z-$B&W{Hg3s_x%6pV$4%nrYV7n(grp
zwbN$$sV(yL?lJkGC4K1F)5Ozjga0IY-<tJA?2T&wY2EGKa^WsI)2%ji?9eSu2sHe4
z-6nK$)!u0ZTb$4Jl+|n&Ha&l_FVx+dMJs#r^B0!4KJM4Nr5KcHGe7!NcNs@$N_qHc
zql<h8Pd!UnqAu|^V}o|^%6~TNtZyA$m%9Ad=k4z@*mtj+d5iPG&v%Pt-#DM};&_@b
z{C2`k_1FhW#r@&?eYZHLJr7?M<ghVc`t5|9(breW1iZWLW}WhlZM%5M)c;Bs`;7X|
zb7ou<b+P_&HGSnpKE~Xrv@OlSHwDb}3~wD=4f4#V)}5@?J0E{K{dUrEQNhzo`E-=>
zyk#Rodj7dCmd(6g!R>B6<xEEVCz-cD@)pbfDYw`N_es(6P`m9@#NP_+`h7Z9*W1O~
z<^2UEW!s|}?7P{D4#$6e-B-3{#<YaP&sUeaTi?p5n8Gmcz3wf=&D$CFu62KU+tvC;
zbxW4<gRA)>ZxiyBsuZ1{-gdXXvFmQ}>nZv2ZxdDvpJxpD2l518IycM{Gym=HFw-@@
zb#P@4hxBxbw-2sr{@bAX^U$59y-x~vJ}o=>xU1u75WAS*_N9C}T5kU*U0wg{#tp|O
zdCXaV?qmxmyPWD=^z+cH+1uih_wQ|sT6Z==_xj`4{~rAM^5E~r3<I?tY<bE;6FK*N
z=i2=%UWDtcjx1l~jbGoTgar2{P0TI&m*3qT^L>3Bck*F7uN#wIo>l5Ab>0wIzV!Y3
z9e;y9ihqpO{T#V@i^3V9?+v@wZ1z!c`=ND~_u5{Qr_=d)St??5bP^S~{mOsNYkV<h
z+AFyZze3Hlv$NLDa;};oy+-1=%P;XgTIsh`3afVCeKVyv%_>Q|?Vb9Oq%IAW`*QJN
z;wvY($X<56wEV)y_hub;jRFF1ocy$4dF<5ZMn^Z@@(YbJ%oTTA9D1p;YUgP;=IVnX
zH!ELfMcOXcGPD&xxM<1dA6&l=v|M4(X*zvn$A*NgAkl5B56>#eSMF(xx|DL_O@PN?
z``0;1na1;G@GHizdc(|KKdp9xg3-g?Ng7KxEH>w@FRr)r;#AfC5a6Z3spzyaEpkfI
zViA|RX-lSfENJcyQexz3)7)BQZXHtd>&dHnw(I-n%J18|%fkL={qgX5i**YvZnb?~
z-}u);`d;L-GaE{^6IWl*%1?fEOUkV2*tNNq#^PofFSq}At!rX@(dYO-{eO@6{uJ#$
zUhn>@Sp2!%Hpwdr^CJF~h|M>6WcN1I@1k6p!iI~y0vlKaAK00N@iDzAy*R~|CFP;y
zgL4kr?2Kg%8&<M#aGYbP*NWEUSn=lJEM9&_*AliLiyu8zI1t8oHm#xI1y4cy_0x_G
zZ#m3Ps&4pby|Y5#!M;bUWj@@z?0Y!!<7>qq(+u913O_w?eqOHBL9VG?qLZBt9i4G{
zqFc`HrJAh25<HtbP6iz@PbiP(v&wO6yW``(L$96h_5n3Eo87mIEP8YGE^`zM7EjG(
z71o}8_ify#b)Qo|Bo;?^7ep_LQ<PWx!zyrkrqH&(j)$Lg?rN{m_#hq>lgY=rU9<0P
zZOUx!>=l!Dbx2)SDPN%TxOrY$&E;<9nAx$?y^GYWYb>{OOuP_MZgTr#UQg#ko3yg@
zb57escTSal{m}e{+`M-6s2}yeL_aI+e=hayq{SblXPT}WvH#2hFG!YqZ)d42yF24<
z(&rDkTe|e$3Hu*8S^4s6lhfY#J+F&J+e8bxv+};1hA&xizVpxC^PLV0m#98-IdJ*$
zeBr0n^MxCWmwBJ*Z1{Z2Uj0?Mow|~H&h#0=jP-Ns{iN>yp2Lx%(S5$tqoc9jZx)EF
zlCE#4&J-y8&oZ<2e(@pMh{!CrABP?O2w(cQPu=B#)t%I|7W+*{?Um=guXQ`Jz9u>?
z>qt}CpUap3o?Gr-AzY`a>|?{D`M|yI{kgp#-u({>R*{Pmow4Zs-Rt6h))8LEI@`Nh
zm%XSi|J%AQIx4BiCFwrX<xhL7|0_-R(>2yr`uOL?77>ee!YO8@r*?6zIO+GRxnjQA
z{*B`1-xk|`IQ-aTy8I?bMc<pQ+MhnR-zh4dzForqp}JuG^yu4KVo%uf;}_4@_t(3?
zFJzRa{P-TjZ!M0q*AFTFyusfy!z}LBiW}?gt*jrst~U)T(Pls7X4o+;U~i?sN>)Xo
z?bkmk1bIE<+NmJk@sr#0#UuewR>eo<dN;RtIb6}@5UBstD7?ULr_BYoP_6cqCv$hj
z%oNG0O!jO_o+`ta+BCOeTcm(OV}yddgRAP21IM`J9b8$L99YLB?-2QE;}hK|y9O?<
zh>3qsuCKOX`1#3n!@6BTp3kFaz4@%W;KQM9)d?{lm)3DuvM#Lou`XuX)fF2)PC9(e
zbk5V#^GbzkPdFp57F4LT9C>Q@Yq_D^%jA-RQn$VW`Ivb5_^<5Z&lUT+_XU1PhzQ%y
zzHM!Ef!dk4uP-k8{m(qpHu<QByZyiHM62p;#)s6drZl{4D(#Nlzc{{~i$SGPNqya0
z>taL6h0?O;XYQ*_w~EY|(<A7ku&biJ>loX-iY>gIHq-cKe&3<_EdTPMs@|9-R+k#D
zPq0**|Db1P-t8Z^7g}D@H4Ccn>Ag_=A^)xsyTl?#jzuofEp;pY2_H79D868Cad%R5
z^b_Hy?Q3WJ>D=dgve<C84b#0TB2ONeOFaskA$9A5;k$<yYHXcOX6SDXxgeHe_TYgf
zyV%uV1)p|usY_%<ukgEeIU%g{{Dte=jPALV7VQc8Z?t_?{SGrxo?TC+YM#8GVCiL7
zJ^ka3`cntz=QW@3eLM4Tdwml7yX{}}`_{13uR1ut_rZC!zruAZpOnx3^KR1pO<%UQ
z)xPvmvzy^_f!#vaebS+Z%MVVJ{8)DX<)N|!H+i4zmYm1;t^S!xADVO6utIpVgV^cY
z-9PVaSy0hr`FVHwpI>67SJ?l_&z|PDo}cagw_`>d{QWIX7QfxxHe=@IT=^Y>RSRy|
z+>tzNeX4iby4tiwVRKX0hifT6c$Hi+`_KLMJ<ldF*8lEsdzN$gW5LqwJy}-_%UV2U
zI^THm=&@zN+cPV#UW}IgzKhko!g?Cx_R7PL=AYLs&XWv~^_Aw^D6`<QXu@1m7F7>h
z{}hSKme(woobuRr#A4sBT|0zC#ZP~b5>Pke{U;(aLFdV$B8F53XWoPrjjLL``IeoW
z`C?J&Qom&#g{(n8RP`<{No-DE(Qgnfz}R~KGyjW4@>^fl^#5^U6J*?&&yn}={i^?+
zC#Of9d*Qrh(${+3MT?#1a#>VeyRm2D!yidu{E8<JC!DfdBY5U&pQVX<M#XY|``2P?
z+J3qm_E26V`fyeL*+P>)6;C$uSgvq;$8fw}W`4U+z~oK5JKXtKzF2A2#JYN?cgd=3
z<J-U2I8UA1%J*y9x1MPGMI8+uUUIV67Nto>@ZJkxOiX4LTCeeGyLI@DoVk|*Kg`%J
zHN|jAL_*J`Pr8|D4wbX6T&*_Pztg5AHL_j#Z8N{R``_(6+55D%Z+br4&uUJb-+SlK
zieCqoIb?}T^hL!4sVrr6lhRR1PP3L0Yise}Fr`3_{oLai_t2H@uGhpSJzRfO<h1wF
z_FmOBu11lQm@3K&?%MB@ijn<)e)r_nk2gR5{O`f1SC2ORzx~vZE#T21K`yzaUj$w%
z<yE!+TF~mwmVa-q{5OBSbNotIs}Gf&deJmZIPv?zo2+bm<}<OFi$okxEtz=RnU_2D
z(D9eLs|A;NN?n^c%eklVkm=%2sbxFn2~Xdkc6Iu`9e0Bp=UkRMA-9FyafW$Ae8~yn
zBbNFsOD8bxo!GrKoQpk9ajGBN<)hPWPW+i=#$pt-xaINI1!^Hz*Djp+*(rc;<*Upc
zd(8jrat>WT$4QP=DStwiG0W7R>4(J1etf+7&;IMp6ZTwkwI1KrE_;??$XT{F?rp-P
z<W9pYikCM2Kc#r9d7FKG?}m9>s&iZRx2H!K`fWJ!IyB=oSCxU=x!Cne=KoeV`MzDb
zbHmq(KO3YQR;|8$?y<}I`xAst@AcJ*EKM&ypTA><@$8uuz8A}OJe<I$qNZjlSUtO(
z?OM#W5AQbCJ@--HAv&d?(BySkdDYa$<a6422}-v%Z2EugH_ye+aO-m~G8b;Pedcx|
zH|l16vQNqH&PB#g-P2z!Dt43jyizIUvvSIAj@ZkWz5GQK+vOFHyRKM&bN+lStH(1B
zFwLse&M;J7x^SLEP@nPryEiK<DpuUr(b4Hszw!CNx{D>x;~008zx#5s=7QV`A;-td
zb>^_{K2#)BFBp)_e&iqDMb01b;qD1@jgH*g++2{po%?Or`_O;u%htzE*4IwZO<wX<
z|J=FvKca7mF#kxZu1<b)N&2@zyv&-q{I6NOe;e;q6ffP>zK<>USX=6H(_PnfRy<A3
zWKK3S3*@i8^CM#Cx}4Cau6ZWbhb}JvTHPeAvNk95L%nfs+O1~=4fCazeczy1?%dy2
ze(X*)Q>13}#H+UXm(?dQ8cXm<IEUHg79Lofc5t!BlUz=wS1Q^ksxRd&X>|5IrX*l$
ztQfSYpY7J&vkh)-fBBx6+&Eyb%@Cn2Y@nd>uWHfV8_mb2e|sSHh*x~cn<Rt%Z%r<A
za7Qz2D^ttqt+_F4)fBeq|F0hW*~L*X*XO}3nU>(7M&)INf)94hJg~K*!8?7&<p1F;
z+ty9tjGoPIX3A^!=&x9V@41$>!p(0VynE(Ttn-*V&nP@Yd*|ghOS%O+1VkA0gU@Nj
z_OV{fTKY+bQ%sb>?`+*Vt#?Ou=WggI_IMZ=FI%#Sv;5<_3s=lG&DXx`$Fk>(Sq?{c
z(E6F~wyLwMR!v#uv+>(59j2&d5@E5dLXwfo+|Kh)Kl-J@JownEw{s@e>lu|SV+pnX
zcl+|gB!f9Ma#q)lRO<+ToXvIZV<qE`1#>FI67J?45L$JMea(hW=GF*f=`FK=YOk3q
zGS9AsbuFic_bl5o?^EsTr(U>eSK~U>EJWt4WXv-LgN56f8MserM4l213XnIiZ@Vnc
z&RZzfv|;Yu2C1}*W+~jcyM8<>zvSg`V~Ky0?jI+EvZ92L$u%<?HqL!;SfD4XP-1tb
zLD7Yca}$mV^z<GwI2FX#!z*W{C23&ReRxLZM$^zXw(d_-ypiIK3YW$6%(OV~-`Sob
zeYa(<EOXx*4H3q56FFmyr`x=H=OQRzB>O<^^sdfzTOJut$&5F>J=1s!N92(PZ5!vA
zYBQE!+{_aAP%_9!cV1dZkZ#WD^0E-qhi_b110JpnHu`&X+7!m9Lqgq+VI_~I_?&cJ
z(_(T#NG-xAM|}RpGpYBPPCOTOoqFQ+w7Tr-^HFnU3S(>BjG0SyO_L3s{?(Wjv_3Zp
z4%@mZ#q!CebnRV_HqT1Fz9MTKw{*P7lh@6suY=c!wemQd7F%v<p30SX`OXa29u`eU
z>z$7Bl{3FDcG|F0Yu3|qZpR9_`Yu0^bJu^uxoT$3t-KUr>%@|l#>w2myU)6^>@?VD
zedn==a+z|l?KbP1NBnN^Cq9_6=t$m)7?*%9q1_7$`hzFjnE7hq;xu7v!G)7Uf1U6R
zJ-+CM23y>-L$9Cc>}lC5!sxHZxJPFFrpssh4_q+gR9&dbpDW(DW#;4PvZa4K*mH$d
zSFA3c+`fQ|QTsWA((}nvx1D60re-J3xMgaxVntixD=|mwjV)GRI%gM!aqOCNW1>{I
ztl<K0p9+T9gAPu{=XZR{IUMr9s*{tiVe!qD)(58}Z>_p?Ryoe;56g#(SN<_Q*jjXL
z^Qw|hC#D;`WB#CUce6l=C3i&Vt;!3kI#&dqTVC^3d{Ol1*Q#0DH(vLvn6hxC?yHSk
zi<&O=x|O7EINZQ#t<iAd{A^v8)V>$lCbxD5XnD2@HC;NLtILua_hZk*JBK_kY?^(v
zyUwgo(BO9E>YYag=jN$>KeXstMBv1`=M3tSl|}iYw;1z0_z~f{Sl}&BxvAg5LyoOw
z_x4rHRz7k5Mo3T8w$|mlj=Br&>{)rPAmMSc=)6}v>Slfi4+Y;n8GSW(Ug%tbiR=E0
zTYrt_xbUU*ti+lRE#*aD@;9$kd2uLjGIv&B9jE01&4efK6U-+khFlX7OW$s@+wsv&
zEx%n~3fHeR*q(Y~+L4H(Gj)$MWt3T_ZJ2$=(ZeZf#`PkbMQZK_3ukhuZFsicV0Gzd
zmFV{NtCL)MS#rBSMNZcb3vb(c=_&X1sflY!DwAKQ`V`Mwd+5Q5Cno9dOhwE?cS$}{
zu?qN@`HXk#bc3^dE`ED-d5uTq>Yb-I&oVBz<hrfVbws*S-{x%B5$PH*wSCs<4g6E~
zq-<|Hw0YKL+y0E7ZB7%4D&!Yl?DDs0XBU!N|6xsWg<@is*t}nR&KPYyZ2WcQ%tcFf
z`78b?deq9>$-eK&wRnzwWr{zFY^Jd#J1cR<7g=ku#BUd<vCQ*wem3#J%AHrXgas=y
zSU%=ll9aKqaYr+!E4x?xVb1q{+BOl>>o?3^)Lfa>kZ$lluFr}2Q`Gq-PN@qgR`jN?
z{^0RvrRKA}p(PvC%%fC!j-}^&Gq2~%OZ@i0-$v6a=$BFV@;4$fp1$$Pg>$;j&p4HC
zb$aQB_EXzuJiT<I*_hKu^PHU4eWPHn1pa-d%cdNbtBG41#8>@6H*KlOw~Qw<_Pw1p
z%b@p0u8~XZjvKX#3B_+7l&wC<n3KjeCq`~V<?+W7v!}f=lgtT_+8`O!H1Tjq#tI(8
zi6<O3b@NW$H|vk?t4Th~-FD^m@P<bGGQB)CIcLSD9gAnKQ&d)-mXK_6`D=2{ibo|r
z+sl%jr@9^g5-KLSktOwxPkideg<Y2oW2KL`Y4!HK)Ve9ZQKo+9Nkzv~g)?T$FsW2+
z^qP1vO2%l3PUHPY6Xa4o|AfU|W#?PET4n0G>Q&E<?P#6U5H)d0hN}K^uZK5|hfMlC
zBkyCo^{n`Cjh(@nPu1qTnYT)+S6}kdz8jf(VEW`5FX<0kI%mln)uz1M-Yi|4V4v}s
zaZ0d+h?Vn#C#mZ-dtMmr=9S;#>TuR@!_=~U<_@=A9Nu11->mPKIialRllD|UBkn18
z)sjUWZ!L;pIrT@$<R@SEB%9CDvEDNS@@j6~mXI`CQr%y5=^oq8o@9Bgd6Tk=eyq3F
zaCU!vDOX{;#mj%%$@9a0T+91<H{6;{H;KLVz{|tV-tDIqo7~@hzuqlbwfMe5q+{2f
z)g~Y7Jtm5nX0VrjFiV)hdr7>=y6k>^^32OF%cZ~m@_S={c2=Iej7*O7=ef?puX%Rt
zah~?%pmedJ^u$N?&67{hy*|B5CwG6{cHM*Lx2c{_{j+?j|B|_#mDxO7Px3WqSl{q6
z{7`&t^RHSN;q6P}XY|$0b@u$V{#0GZlJ}X%GcwM7kl@qp;tTG~lRLTA!CO>r$$x=q
zE8Zx(*e@!Jo%*UMR@MA+&H}9^SFC^WxE*4?xNi9@!@@JMzucmy{<F4nNd13di|kpq
z_FFEq@6Ddi8+3PL7{C97@W&U8^4>47czAZ-{o09>I?dN?>YTEx+=_>FyLju$*%`gd
zpB<C2J+%MA?|;Yc&#S-o+c~|`z^HxUQW2}FxMLC<HbnQb{oCGJKkLcnSO2t4r?>@Y
z{`bvWk;`fw@5@=QZyvq&+x-b4#~xJLbML9rY58YXC2=}9(lgh5-g@R)TmSE=Dl94V
z=z1mGS@QGU*Ow<1SLM8aQxm{nUe@=^{YCEoHzKC5gkDA8I%DQgki2kDaZMa!C)eq3
zSLd$lb=V}u7k4G%i~3UIRLwo_JSX>t3nzb*Ow_!;I>vcz#BaarbGelKt3|_YZY@*~
zmc9LD$HxnozRpxHi(P58<t>+>qDa@8qO}^U<FuzlUd@|(&u6!Jp6T%|uehVP^KGzy
zct!T}m6{7{ozGrdz17y`mee-}^VZ)-R)zkFyE~)zi@x~dSI@5e*={&9WA;|@y}3Kv
z>i!fe|GG18_OpoXX4$siigoIqM>r;N?u=|+?J%SF!7eu4t=;T@kL@g<-}Yc`*8bUI
zY!&Mwx78UHuVP$xtER7Xes8*YSA4P|J5Ov%{hx_{Jb&MOztC+*xwHD!TZOL;bf&J%
zeKA$4%29xGd)vCZ`yO6Bv+v`BvpycP3iyRh<Rq_c^^3Ag5IEDmD?EEgUuPBj_VcVM
zzmD6R*&evy&tbPHcFWGqo!^>H?b-J3j*d*uz8gD^-+ZyK?cV~2ix1y;^6zU6v{U*d
zF1D;&)8OolEz7>SzYLC@|KbDd&)di3+itA0V3ZIr`&*#h!)f-XC;ZzIyNl`D&)uE(
z@sny#a?k2-PZob%Dfas2jHGkhJ~r>l<*lAwqL_34#MkKLJv+BA^v|&pty!=6E<65X
z#fnqSEtcx7OY9f%7WTZ}@T=j)?Ax;&l%-u-f(nw&>ou2~{P*fSXxpP?=HswyeZuzr
zvl+9`9>{6=U2MQT^RnjOp0gg&yRT2QZNGmzBWc$BhjLcoHyFh;3f!kYPB3S>dwJ;#
zqb;wcPgJKg#r@#Eoa|aun3%sN(dT2=Le|CVv)=MJoJl&Tv__!D`@QuHT{Yo5x1Ja8
zU?@C&lZ(rj|Af)Uo3&<dJfqDw9~JqZob%T&@ngd3O3~Gt0wt*uH(r;9`|;PhOjX|T
zvtMHZ*Da^1!F%-7Uz{*{xA4Ocv0E$l%x0c>!dH3Wd+mG!g%`JCBAn;esP%;WbW!A3
za%Fz~ucX#>vO3dOSIxZ>bnUgKsghCLgZyRBPDmtc-L{uwe)#HozW=>1?CI>+_g~2}
zy>r&>g{e}EVA7t_io$#QcUgSB@9dz|v*OJ<`)@yPE;eRA-#Vjj_uEbEKd(3o?U9=A
z^NHbAcm9scPb0X`7}=dqD0_MM)tlCq|NbWydY6ee2F!mcW^(g${EyyKe;%;fyz8ED
zqV2o<Lf$?3ea9o_eLHIzml$G|{QGp|jfkzUA6QFozFoC9ZsCj&W;wMeKL3KN@smDm
z{d+P0<4f1`2bV0kWOC;Bzx(SKt*@GNt)5S4`lpgx0uHw9{$JR3zSCRqty>~6x5?}3
z;%8zDFHO6DUaT&iJKHJVY@vm&!M~3)Z{NGO_yQ}x-Lcy>hb~Ryxc2(&5t-e_e;U$H
z$?`}GY<~6Z*)_GjJ0D(}vw!wu|0{-JDw(HCABk+;8M*jG(}@N~38DM(g)6<pWlD}8
z5{{X=El8SiqF>BgA5qJ+58``!Upd#>b(b;58_X778YJ)Mle9Wlr{9R<D|^qwf<)oP
z=hYqcds#wG?DEbq&XL{y>}8ry#>8?C#Sh%Ze;H*XrhSW;s>&c^qF%$>RK@(kl~IfH
zQtORQk7}kP-VKL%l_!2ZCGq^K{T_$Q_GuC}&#EN^)|E*dkz>+&EyjE(f<NB5)<J^d
z?j63fota;?BK}xbsoL>fsI>pXdnd>>hkHl(Bfi_eZ)_=N=kGC_u9#i@@!yBrS9)%q
z-*NNX)xO(pd%RmtzmHh)=ijQ`->o@#!tyVcAJQ$;*im?-OlU@>xbVx#oZH0PW<0JI
z`pF_{dSbbNgNwEBZ^K}V9ZdW=1=n|dY1_Sc$*MLHvu%PKo$mGcrt<g1^f+Hx^7~8S
z=cONuK3~4~>>Aq*_8p%;JgM5dTS#v2wYK^4CfO<BPRcu!gnxa@J$=Ms-P;{oJLB?l
zyrSg__Ql+tw%x!!Kkui*lEx3mw#0CpVr6*BRKO9ma#Ltw_(t_5S|`KJ_9{fqiS#&f
zhIhuqbj3gymKfbnqAM>4wtioHpZ(Ls%h#sIoR(c*;J=yGNNf3ITah^HO)ld6rL*e(
ziwJrus+Cx7V`DpYVUGPFz2%k%-g{haUoux})7M1Tgbi<N4%oa|5uv8Pb8(VJpu$}H
zws|fO?%w9Gt^7G@#{G5f;#C{gzLEUB!DajQ#D@okU->Y&R)10cD-d;gN<>M;;plyd
zryTjG)Wj+O;XL7Bm2ys8UQ&6RjZ&3Cn)i>m=F>M<c!{;S?Nd3!Q?X0G@x|w)191;_
zHko~t>bhgV5-;%7WA56s(^GtNg!)(8wcdUH%J0bgTPu&=;d2pFd;RyGea&>=*6{y~
z*9BV@8di5-GubC2eSfdu$|V<H@+_DhvBhnE*tf)%@MB-Zc8VK&axkoRd9dou@9T<!
zF$v!rjy$ZIy3w+D+woghX4t&Db?eN%ZKbCr-Yb6k%WOEOEdR{O6Mxy>{k}U@`m=sT
zN{{A-<EPIia39#pP-E9+q?S~umbPNTzR4T+Jq{?Jw{Eev%damNZ%j)(nlkGmTcoQ~
zA#cICqj3|ynH>uA(skksm!0VPwc~DXfuv4t(^i9+ZeLZI7;V<s_0jy(%+%{$Z29EG
zwL93a1e|$)P^sO<;`p*?{fzeNy~Z1IgQouFG>rRZP*Y(yLr&~RbI6a0X&=J6=Fem~
z@YQ-Uzf+yYeEwN)4t@2U%<p8U_0_31W8-i3swoyvOCsLz*ao#LKRkH!P0c6E8BXi}
zUNBOhe7*n1!iBPVkN+KFv=KVOz5VU%xab1UKOW8UKW}&_xy0KX?0&s>p?!#B+u_}f
z({tYBwlFzM)@(Tb!Zu;j+3o5Tf$q$X3#@J2R4?AXIpK(DUDutiZQK*rSAQ3NW-xu>
zVtto&9=De+)OpYQXx7fddl=q+dOrWeYgW7JcPp<ibKk#s^QWYYa|O?XH{IFrV$B5Y
zi^n(k$GWdOx#DgXo7*X)<tsjIdgb^vxRoLF=2`}mskcsZ-R%3nGHCVD7Z3Q~II=GJ
z_%`dkrrhu4Tx|~9+i%6J56U|n|BoX+?4oiS|8&U(U-QLVf&(wGOiN5+VmQhqafnSa
zVa0j3289RDgf7pPTD<)&``)TI8mEtiyUaVD=xwa6w#@9;^w_nm$70TZS6`WPM=4v-
z|FPJnlkbnuYx!^Tz?|Wk+u;wh^?3Hqd!p^5|3>t(x?^&9uEKu)H}O&IepeN4v(C6t
z;dnb?g8RI;m24V&Tn{Mcxc!SdbH{V5@N4P+Hs3ZREG>Gx+B)^%Z$YJl%F-@@snKdW
zIm<7|oaa<z`SZI}S<_kJh(M^Z*+t{6dw;A^5f19uop&x_TGi}(F>iCH6-Fj`2rP-4
zCK2^(p;;$yj=B1TJ+qHI{K@y=xpl+*_Y8IWn1B4_dywCMW%7Pz3-3sc%2SIp*EUV~
zz5c*?x4aX7+WT1kuYPk{z;B*q<>cK`Ga@F>UN+5G%`kNGd+nXZt#8>4oS)q~Gk4kH
zzjNpIaP0rVFCn<&_un5189O$}7H8c^*<QcT_Tu}moR{`zT(*2R)A{nDY3IMqWLdeC
zFCuZ*)LWMsf890t@WgJ$wR9FsmNwp(3_Fr@{@!^}ek-NtjNvXb{);QilJgaFPP`Vg
z+OX_J!iwH6D-Dm-^OW9ptFS7u>HWH8V^E?6i$U+~*5s&dA5Od9+H2^Puhzd=a@C_q
zI~&^_``*dAO^$N^+Wt#o)}QUURyQ_WZ~J=m`6;{4*^{pBV&VJjKIv=MKl>Af)3#65
zou9FS%jwYGIa~9hwy(UqzNLDfVE?!GB`$LuJ%SClaGngF8U5^zQOO<=dBGzG*Q|WT
z_B5@J&3%SqAgh?&w}Xb-{#%b<`L{9nLx-hEV??7%8t>WC)5mHvxu2iga^lf~GhEEp
zYVX3@6J*-hqWlz@tESwtekoAa$a~u`ZM$Ca;rLr?mrnMO{+f`eI!9`Ud4$o8y~R08
zdJR9cJ$te3M-<235dQ2JA0B<$zIyWf``-+MPhK+nr>bwM)b&?p&OD_{pG})?+poVT
zFVD&B?Z<lHO_bG+pEF!Cx>SYFbS-_nQckxmWJ1Pd&LgqBci9pjozKrYZjjvb?EwG3
zJ^mZNbe^&P7XJ3=hjagDXn8liWZxz+^MqNfAEVg8L$zLQsb}`fovF)uuKl>{_4ns5
zR3eN|mllDh6p|PCr7>#1S@gfS<>4(>x$OL8v&pI|=H;``#%^tnOWHR%VC()1+Xepp
zOL{RO&GbwCH0B3h`^_B=w^Rx;Kd9Z?eP!Dktxuos`j_yY5AF!qQSGm~D7&bDS@xxw
zS?C4*Heow<C96kKPhLc^IkHc9w}@Afr7l-M`_Y3>rd8zySL=VBSgur>Idl6ov$?OX
zE$dzO%wzr%v#I+M)b=lu`SSYW@o($CbQWC>Fn{;4=-_MT(`kG7pOo8wF*=!aT#2D~
zQ`|9S^9!PtzjxJN_`l-O_Ma&~+`kI5iQUyXmaMbufyLIXGcInnwVLF(h4*9BhM?Zw
zi2PIPJhhp7PbS_tHsMsr-b-5rC*Ipr>yg;8<M#oUw>wyD-^9-qYC4otV>#3E_-5Ub
zr++X0ce0mT-gQaBX087VU9*o9Y_B_(zKFQY7``yMsF5pO-PcK?f8Re*2M_U=OB^+V
zHwd4yQ~!6`DI*{+@>A+58K?CDaVIKS{r@WNy7kkbg(vd3)CJp3b0>fP_weP%gHr`!
zg^q|So!OKhe5zxgYv<(u)4s4~7wj^Lliy=)WmWk<@ZF(L6>D|fGEx%!wGM~!{0&)t
z?92?kWiR4p>y+eVDej!QRq1LnXYS$s`Fw&_mWQrA)ZMoFOG&xE$A|oc?fjSiJ$koi
zcG3dH>ykb@<&6J)O?bH9R-s+aQ>xjluxe`m`)9i~?ufbGu3NQ(af0;agXb)*zb6{<
z7s)Ht-PHdbEVQ^Z(CJ}%diw9cBQ}eE&N!;P&t8SY@gl<qnPRyEZU&1Z-w9guGWdk}
zT1;5cvF>^3y&Eacj&k+84EHld*py|J#t1EV5h7WTcVPC)8=KkR@cit5!GC75rS+1B
zTIKwl=NufG{)$<cM;EPax+AyFf78y;w%>f;_4)nl8Bc6`!O)p;<cLh2-=fR0!d6`Z
zR$8vl)8*&0SlJ)`_(^2RtxK~e1hr1cN?3AW{k!uqTZBAf54Ki$3SJAl*5dEXF<<Q1
z^ItzqnxFS=U^l-a=xgicH#v%DZU3e{-J#ibQND^>Zb__dUc7j9$vta{UY)z!CUclx
zGx66|Y}s&RmyMl$MQzobW93J58M|-w@~InUujAajO&~3zBDQXa)ywJ*Rm0y7HB&>j
zM6p^1Og$KK%6+wRQ&=$5mOj2;?3Nj=b5BgzqOoFO%zF*_m3qvY&n*ARGc0+0xO?^E
z@6X?#;|SvH=}X^!%;);UnzLrMej9yxgmT1p9b71Vc;n<7WkD%>cNRFkm}bzrNyO>9
zl5lJ&>&1$xmd!`9dtDf7dY&Xne2kXZ#Nd{@Xb)dso%hibqTiP6sux-*A{u5F)Wr~_
zAi3WEzI=S_QcpK=%{MMH4|IK#nLXF4nLAje{^yI8cU~N<75V))p8Y+)pMM{l+Cc-B
z!Y-HRapt*xnu_K-6x+N`GZ^a3@e_K~bZFN6V@}_kx`Sq}>1}jO<YU}xR_=I0E#u+S
zil-af1l3C%=QqqZZP`-mt!fbbtmE(<-4$#<Ufy|_mfrC4)MFmwbCP$rdLGd;KcXve
z`ER`cx!*63t(QM!=XqpW&6OaY-<JY|f0P!jcD|u5Y-+w`e(TL$Pxc&IKRbFs&9D7&
zd-i{t=sn*=pJQfYlH<_>{Yv|n<uz{Gb;|AHY#TnFU=h!s5}&kRi)EPKh%Odf^VU$w
zBG2=CN{G2+@8YMretipW@VQAnS{428pKQ&`1vitb7CTo;tJJ>KD4OK6PO2eg73a$~
z_U9M6_Sl>d>)-LedG+Rl4{v_GsL#xEn;}6uW}b}ci8o&Y(m(rUy<t@fp0?y_lM7qI
z;VV1`Ra_G$h4W6H!xpS9s+M}yKr_=|Yj9#vIPc_HY?DO}EIA=KLuz%~%86`~We$AV
zCEU1jXV#2anFgASKA&E5_^b^*e8sETvotX)p{}dpN}Q=ju9`=?VA-TTC4<s1-e7g!
zWdhcFJ1=D(4VuGqpiT3LUyw1+<ULu2dYg~_NIc-T;mrmO4=umTMtQw6%@i{m#r_l)
zP3-w{YLoWaQyYX1@qKESInp6m{X|JI|K156>xWU>6}C^>k<D{L`l;i+CvAH)h0SL=
z>}$WVn|0z73755oY=6#vdXUd~z~4#u_;W_4mme-q=@w-E7FM}o`_9Dt2C=5IfB&6)
zs4w!5<xR@=`<G;7L-(IpEA>kH;65oQX=$F4)Av(Sd7Rc%M6^1nST9cec|qm6sBMDF
zs;7=qik~a)*?B-fh->|X2eUr#eQ!BjJMA~a!-gWInV%>839WEt5RZvv-0|T+OGakH
z$91{u&PIANY)BI^@brpQFL~T*rqtt*GIjdyLkW!cM9;TQ)M*IRZVPM{Uz|NjacXPu
zZl5_KjB{=o&av8Ku`}C*d!^q@kCjXwrAZ#Vl@qy&{=B)P`FdKX?EZsH=Ih-yOx`IT
zwqW8T&kVb;RYwkS1uOQ5^tu%%h?=FX+qAK%Lwe%+f~|+nE?&Gm@#*_d3tuLIxBjqx
z3iH)y``+;XRnC109%=Wfr(M<@?VYhoML>E&VDN;+Z``IR9yO9TR-G@nb9+i?owNsQ
z+(*M|gS8X0PjLF&JUq9vGB`BI;Bnx$lKi>M#*C@_o;=0LOZYq<rMA^}wJL~-7#}}-
zf#=yOMu~%(t9Ry|eZS&+L+sKoFOqHuS@m>=waG3qnwl_YZuFcbFF&onoF=aJcUp{^
z@F$yyg;#C<E-;#UZ<6;W#gC5}#8@6Yc)+?-;`0vqmdea78)p7x^P<K0XG-^roiI6Y
z_|)OU+)vUM9}LL|G`ZuF#%Ch(?`6Xu|Dwf0VgAf(X4<$I*=R|h$~vESdHUq{Pi~aN
zrtYwmiQ0Hj#HH|(iKXY_Pul!9LcVz#x1>}nyB6O$vhl#COhy+6Hj!_IU!rYGR;e85
zIh_CSc+dT=z}XeNlTNQpn$a3Fo$YdI=X!0wkM|#JcfC?(?)P=0!PVm{thQx*v=h5o
zStF5m<wvq!R&?Lw+Bpi={rZP^XE)d~?y<P~tk~A8<k+OGCAaikau+p7wmh47c28K<
z;=|{i?`{YvE||aa#1FIh13nkzLZ6B?%~n6D8Tntbd!_}8xqaWCZ4F#AEm-y+tzp^u
zcpuxT2=yxgyDsOHEPj2W_M+|C>YrAfF_T|T(0Q3=`tz}P*5ruo0o<o2@64R$H|@nz
zTZ0QpyOd8aIx2r8VC5#&jNa+4*>n2D+Vv0hi`C0Gv+};Z$$vxt+=kYedW!?+j-J}C
zD)Iip4_@Zjc@L!4ugKwYu~5*Jd-uKc{Jqo#-jjsinEa^R!}0EA)`!_Oy$6a)CwpJ2
zJ)Xhml^3%tGEHNx<_1}2$(x)tMrRB8mrs26;;_fYMuyo&U&ANc=PV5P=w7pAj-;20
z(^LPznF}|o?Qgx<!ux{7>E=B7<1$;lLIar+xwbm??)($V^3~(yo)_=JyenQB8fb-D
zbG}Ji;oB8xciqsSNJwJo+d9XV>56>OGI?_5w{-tCxSTHjd_we#n0P$f#8+QRuO(TP
zpMIn)FeAfzUd8#t$Aw#CUQF3J_39&Yy(j^`l9|~yhVpE7K|7O@k5{)B=GYuqeTH|f
z*nZKAP0AT!;&Fz(N87_@)}?gYZ@Iwq{jR>xg7iXp!@ft=c04{6W}EDa+-^kwQFG-!
zlPN#Bajo@Azb9MYE%>+I`phaeMmd|R>C*iFRycFNIm5so^iV~0K@rFKO9qKEpY`p2
zH0j2+nfp#mdbl`jcJwb(hhK?>f=~CA1b%$>t4GU-jmw7XWpcAH>%SMS%xmn!`PnmC
zl3d;zU6zgd!{)>sGK+nRbeYG2uw}C{KD+ZsWofg_HuSz-QrG*uX5Wk(Ykoevb@gG&
zO|$)n@>WbqReZ;?aeGX#e9_EDeZ?HSdMD4H+?HGCdbi<?!t`9_6)ig#pE*0rtX^aP
z#loGB&q-Kcd^?NBYVtKnwZPfli#{hEUY{&IcS1u);*``?kL5R9JDjgN@zs=<{#$=u
z&1J4=e#bfKtuI&dDXnG3k5vyAD1<KazWVI?Uf$~!Une#lh`r@=&{(BOq`&K_o0r2;
zC$o9oA|X27Q^WT!y6zZj%=RbMswTJY@2x2*=O0R^o@&&;IH`j1LF%jf+Zz70Do-o9
zo6aN`_37D-(sPmzANkE(wM%)ys)sIeTjkg$W_l<%Nv9?REPH?LVgF<EgzfjDukHL+
zvSY`5>ABTAE~lHwAK376SNrK*2}d`S@}2(Hw?y<t|7OLN8rEiNKCxFdi)XJoJU{+I
zNW#WiNnVCSjdRqr`_8bQoIG3NbMBj4=Qy1}3siH&%wp%cSmx#Yc-ygTQOkzFQ-|8L
zt^FRZIdf>g;Dr_$g#&3u=TF63?zpb|R*Z{f{w)3%LiPRkmJ~!zPiOCv7H<5oe^tf7
z8w|52+`Xx5T)0=c;1pBYF&+PI>CGaRg}!2Y_lwpF*}a&w@k^v|z%u^J54Uqh6=a?2
z+Ie?nL3-ug*mZkM{Jt+$P7rNqDS7<UXZ`NzG^f(`_}AN2OcipwuHSt+@!g)w_n!98
zHBbD0v}^aem!Ido+^Hqh|N5Zy*Vww!dpW26U0GhSt}A32`^Bf<SIs`_mY|c`5dQ31
z{dD`TyDcAfit_K~aETS^)IN1=ruXfq;dN`<goMt{W1f3%*A;`)cCw2-Z00eV8!>In
zy6|M)hb{$?XM*#3?DFIu-angnvLxT`eEb)lTTAwyQ7D-?tv)<KSh`F(#>xEy=jEMe
zWIFWz_myn+wU9cn>7=e@<~6pxPRBpJ+81ok@`t}$IXH6SsVmK~b+$Khf&-Zk@IH9r
zyloSwvLk=V9h*r_iYdv-Yj`6!tvJ&#Pv_(ABf3i^)3i?o_9Sx^RBHVA61*d(B%|-r
z>6XdC@(%>u&XpV!-o$+6=JWj@^Zz()m>>Uap<mG~ld=`U>tvsunDk`*<rOTdu^0Pi
zy#F5X)n3L>@*m@@hh1~mD4GA@zgy(=Jhy?J)7~m?V$iV^gR31sQa<SG6}6bvP5PSY
z!?v0)<`hG(N8*iH)+b&)v##EidfV~v@rNxg4__FanNhT?NNiqFqw%391x25F46ZK`
zw^e@YYw!L~=>L@!3$2dlX+DkPKPe>guJLuH^O3YD{zpfil^dSe`SQufr|&1<D4KG^
zr`Ti8jX!q6mKWyQg#WD-itZGeojIpdc=ml}751}}pYPr8pR_tK$@r{mVG{S1(}6RN
zpWpAFWS*rXJ!9T#^XI#ky1qMe!q!3R`>n@Ug|?n-{+3bA|9`hst(AFhZHaVD>?HrZ
zJSB&u8TFPfds-Gh?U(pjx9omb<KbO56;u6|oY=~@wbx={o`It6zk40;CH`#6@3CD`
zv1T_@0V{XlNA84AzveQrPdn-P@<n6nm&ZqLzFuf=Rexf(`K9aYt9guG2+yv(=-cA(
z+TcZ&bhav&`<vPIr=lNrGj}}RJ3Ya@*6h;^!y`gjUKf9^D0%kb(a+VjhwG}g+%TWd
z9QxwT9{(v{CI|0(^0_~F$#gS?<x-~>%s$}BRn($fIf+TQ-~GCX-S;QE7lqDy8nGkk
z;{2si@tRl5e#G8iD!%yF%COZ7?ZfMPwD+tC_Oj$QUha^vM0GRY(E_9NhsyEi&+HT_
z*7|cM@(qLZ<_Qn3u7AO_edj0t$7@eMNx8dWT2fJ2)9b7AbkC{koNJTWX5k$g{3OP}
z+gI>27tcA-S+kio&6@MI_uz@mkGwi&74imKv>eR0m~OUv>8;RA^$=s-j54|Rn=O9t
zI~o}*B$EE8jn~rUyiv|IrE@>FT3d?0x9Q$&l)gR0+vaV>t`!#E+P&Xp`2W-$i46Cd
z!#O2EWvl#QRf)Y33DvwC4;+e4_+zwyWzw1p`?H_AF;#l;F3Np!?OF9S#`|-5INq5)
z=c)TVKU49j)nij*TgwF=*#a!B<vgrrtfv;9=4xeJ*)?mk{sfMT4ouVbch2BxUVgVm
zS0+=$;P!%fk!#jS9OBv9C-LK2)T{81JwXQRXQX#DxySB**ZO_trMx?0sUnR`H<uWd
zZ*ee-zn4<^J$&QidHFo2%Pz3=TP$Sv|0p$EZ(q&^)i|f^>$KJ@#MVCJw*RNaw?v?H
zi(E-#WA~}vr|x<wKXmQaICLro-PVXoT5&=|{7Swwr>eeDRipOv?lXmoiIemHigw=6
znQwhXWv6qlhwQ4SGna3C?yS4vbQniUa`;b?ZGp|v*FN@lG2VYV)8=2)t)eHBIR3}+
zuh9vM=dM5O>=h>;RR8B<LGSyuL9RNhAHBZL;G8;F;?y4rv7M1hE%Sc4sBee}-6hb}
ztG@LO*S)(B)L8=W%!>Z7+qG`{_4afPb3MhpgJCi+lXDFVSM+A+&B<V`Y-=ftFOYsy
z)Vkr+ktf{8R1!bbIToLuGkd$B`Xol1GFN9QwUvs_>t3BIbDDO2weF(u=m>#5nv252
zIa4QVgqi;q&bxNE>Ha6Ne@hRnH|^SB@SMB2w&}26U(=htZ*R1^m$f|Rxc7Q;N@~??
zOY!B#evzK>_hdXX#2>1yn5g3XS>Lm5&*@viFD?|kyx?<b;aBmc&fi!+YL>j%QIeth
za)aH`a6Q>g`b+&69$x6(UN(tu?tTr~D<)P;VuL$g7Q8vh&N)$e`;uE9WX}1Y7rQKd
zSE(#$lFQxw8l6&^Dw8ZdR1Povc1-=tZoBDAuN{!!z0w#`&V8&UqwRpq3xgG9AH<hN
z8TV#!v0oLLo;9s5|Hci5JBL`9rTV@o%DKs3z3Uau7#hvowyA2b*{#AHRgn&N!Mukb
zy|`mpJ>5Rmn17sqhBNdo=g|yTHBq&~tiGO&hAPwc?UtGpT=_#hmM!<0k;R!Q>+>73
z+7;p_mstGjzO-<%TRV^9uVoJ}Il4`sW_XqV>&X@~&r45#=zEE8tF4=%sdm34W|xMi
z)t;Z(mmJe>KX1RcOky@)yPoV73E54Lq%&%*4)*7%EcEBke{#&+h*{>2U|&i_;@iUc
zOoD58gqEahZQ!4xqPMKhFXGodp=l>VpE`MVGezzysc$RgwUW)PeLj<0tV75nL1(Vb
zQZKnp-=|NpIpo=U{nv##y_Y8IG5rf#I>{)MrRY^?YoX^~_bc~YZ!CGXNaMfGB-SJI
zj;e%S@85FguIpU?InUj?MJ~Mfy62PRi{+(n%oC3o#O;2;AIaI-pYNL|I=SgXgoMsB
zu3ZrppIe1jggu#Y=5#^m)+HhOmNgITmoH%m6hAmK`(~`gQ?96>Kl*wZJ7>5j%)8RD
z^66RO54}=80UbBqPU_J8EF7)2>*s?P=K4$dnpKV8JYr5t5$vl>+2FZc<%DS63D4BM
zmqEukto!M8E_A6=Ufs2t1Cw`dyv=04@~e7t%J1k}w#;p5UXyC0vcIo-pi(QH<+*Yv
z({jxRT03sA9#0T2&^@9QDe=W>hq&#M2S0nRY*7Bbb-E*4qxGYcPrr0pKN5^j*?2Ht
zdga@Kd9enU+}Hg`l4L$Pf7>Rdp4W^{k>cB4EpIthcGs`S^dzUP^5eO)PDUJi5+%Ip
zqLaA(T8HS~Ue7a`BHNTbI<`)`xRF_Q@~)2y=04S(qUk#+!R7w+Nlr^6Cl%@x9N#Om
z|M9#}V)Gj#-V~KZH7Gy$pygjG$mr<U5*!rpr{eT;H&HWBPHWW(Pb6miSChE9+teZ<
zr@5=|**YJgw0{$3uZv|~>amYiW)ipi>Gs9P{O;KI$3358p>aGyU-jl8-o`EO+oI1Y
zv}xY&%KVU>xb<>jIM3el#3QvH(FtEyf4sWiE`M#~-mN-sx5=@&-uB3wcxg|7-n4^L
z-oJPnFSR4hg+K9}%u8qQ`AG)zyaQ_TAD*A4R1r6MK5J?bw{SD--vi6_mBJ-{icD}Q
zTD*G=i`KI%95URx6aOq-#kpvfM3$4qrdLt>lf9)U`Th@yy`gpTVLn%gQ0A$9-z3^|
zkDJcyi}@3G$N1$}h3V#rCpoK=UB4Iwn;+#-oA3VY-Cr3Qv5?(Mn3nSXyZz#cTT*7g
zvzJRRO*=0BFg<$eEEUGvMOUPCvUW7avTCwRnw_tjAt`M$Ve-7BCi`gX|Et%`-ImZQ
z#rSWsw6EF!pV#~zR~wdfX`Gq#cc+Vq`++H1g?Zjr#a-MDzqD@9{A$em>iGJFO%Zdd
zkACi5Z*cdv;{0x&x^koS%25-Sui*I@eza>f&$NO@_I?vBFaCI?rSJFcT)S~)({wdM
z=d@qUXLFkKCuJAkHI96hGJ!j0(&UYMDwMC^-nEJM57Qgf7h*LtW^6z9A#zb|zR+52
zt&2a_FP<j-@P%&7@7-Y&!!qQ%y=RE3wl>s;%3ZxKo%KL7)#`G4ivML{(@qCxXD!V@
z2SE>!hTE*5G2&PAW&RzS+o^BhpYl}oS!Zc%h~`P1d#*v!jbA*qE?$Z5p8xc3xzc;-
zO<HR2S+&ldoN!olwMqN6^n+siQ?+&~{d3W?JKVW0(ll`KMw>@dyX<$aH0}J)rM_H4
zu_8Zu;?K){*1APkMLnl|*|vW2$+rFT5<D|r-V(_?eE#*kI;*cj&ubHTmo8yZu++&Y
z+GHl((g7Y*WO>J}9kFkcY@OZAoeR?*9hM2Q*U$9UP<<M=jdh#m?cDuutTn1SoGUZs
zWxAKEI_OULQz5e7MdW7Pq@U}xwQ>#|h&w7DcP-#p8!LO`&+hG}AzfuHJM=Hg*RS}q
zbO%@RKhvjbs^1^XHr$<R_-u3P*S!&82OloE^fS6miK*}(Ur+PaH*IUq-_-3lSn5@{
z$WkI`&XO#y-+LRkEvo(y`uB9eeCrn}CKp!+^`^+yU*KtHdFYTA@-#|!<=InK7cPr!
zn0NcE!*QOTn-^5AG&XBpG}fN}cB}pM#b(!6npeKl)hXgx{8e*K-J}QZr&`<2Ppyb}
zEyyds@iFsFh4N!>Wj8&yQd#tR8}n9|g6!L;{m!3Av1d8Yc~`}W+vMonIbnzYPH@<3
zSnQK>Uou&}aI<g6<K0gSYTOf^Z@v5}H{cORn?)UOjmF2#iH?V@COwh;9m&0F{q;7j
z{}z8HP4sxYBgMya+Q(T7SDNiHPOCb`HOXLcW7G{Nqma^$jMlY1-$m~Hy46^+PWtdo
zC#`=KDhsXtIU0SbymGE0a@xt;&t&4BnT4HxBCvC<i>1n4t=OIFaS2Zrb(Q{H*gfUo
zdD9(>`B}UB#UC<dxjW7LSn`1>S8%WBgykLk8|L2T<2lsexwEfmjdz9UCW!|Om;6_B
zicaV$JGuXoobkjj2g4r=gp_QEI$kv=>(7}c$BmP$K84MCmw2T|VN>w2{xar9i{>d|
z6S^J-PSq`4z47XutlX{Jt)lPhT23wvY7g4>@aP1Kql-$cm7K00Pgos#M8G2O;hJ?v
z1Wh$p$u=8R++3rW?kAOeZp9;~=oi<HoUtgLJon`j$0RL{EBS`yHis6jINBJVTgodY
zGL`pK-sHG&#;3*xw?D+hhqTyQTB`jr2&<aAUm%>**l+Q|_y|*1A=l#-hyJXcWOg|E
z&-ZDk3MyO9r<ttow7(HQVeZBG_h--EYWMYT`pIh%O+^KAyEa-*x_pkMW$}Hrl|i59
z1b?{ey6<+=#P?2q3x03jccPrLXp;T6Sh-BEtGP$|yIya5%5;DEGP7F?9ryiPFIl*6
zQ=V!Lw~Su%C(pP!{M{EBT~sxBZ1*t<*DI<{5q(|V_d|5k{==?)Qg0{qUE4OBsYb{3
z=L{Y5>j}|6w**ao;3qiahLF=5#)H<XOAl^g?Q=O0Y2k0fwD#|7<DEPyb(~i-wg;(*
zgg@o&ygw%->fhJxdU{W`ab7<?xzdUG&+*sN@7TOs$|`Jr3i}5gU9VZ~cAo9o_oRff
zsHT;oOjBhY?9`{}My1<6EK;#P-`Q%Equ6NEcPVXQNTRO@i+2R~>`m?hUzf$@UaEVm
zrMgm)@%!S-9}J{Fwo7x*F5qI3Nu0Xj^51J|c^_6BIONs2!XYTcG^e;^wyLTs#~ZP-
z2j_AgCGo9TBsQa%ahXz&Oxh~(nAa2UZ_n}Cl%CaNWOio0vgiH%i`3UBEP26t=(DWp
zp|pK9pZu4f(7y8VsQ9*qd%C?E+M+6~=QRFzovFUNNzAyVes<WK4N)C)y;dE#D`H{J
zQCP9YG=|}Nsmh_%nMXGUunOJx*c5B?vG@LZ{l^}cHl@4GF7ixda6Mo({bb<`W&M;L
zL8g*jhNe#^aTRJZ{bTfr_<#LzaUP%kj+t9GP2L#(E5Q6+X^Q>1w(@C~#{bqvtNg7>
zvRh!8*LLifibz;O71OgvX-v~j&h9k4FXw;8vZOtAuBeLM?!C9qGj_c{nwPj#al_{e
zv$_@}UVf-QNxM8@V~r$lLnC|9izf<OGo2hbuBpG}u=o(G$<i{3p~-cXYJP~YwP=h2
z`=`Z!Itx{{@HfwRTo@83QIIP*Rk^J<ZQ0~AJ?9@z-CD%ft|ib>*KAwldi9>1y<Dn6
z_{t|r-6mdoe8)tM68SfTuDIK@$RkkiU{a`emwYM98}ai_>`Fe*?(wl5KPxep&3@{`
zs5uuHp417<TVlxArZ`FOltJcoXBJ1+H!gQBMXk^*{=8=0|68xDwrsoA)HPxL-lywi
z67$0YRz`52TFqmy=3`A-Vb&C_tsP5xJar%5a8j7zxzxf<XW<&_*;Y(;Vd9I7<5+He
zXyUYaxJ>EO58>_2@hK9M=FOPa_^EcmiW+B;rCS&7$U1Iw`u(%jKQHD?6On)Usr{UY
z=cgr?j7;sV{yaP|?aI=irnw%+M1`JA_jKVqmJ)Q<TK$S<$cM$J=g+&8BiR4ow)h{8
zj}e}kKV$!Ov2eAp?48^6Uo<DIDDv19shY~){pVzNp8R8Z|Hbbw{83GuZ<!`}zbl(O
ziF>W_{Jk=ahu`Z>ahntL)p#SP#IK!Gvh+N;mxKnHRfmhtuu&DbvC&F*PHGfa)|1j{
z{)uhnm$+xOr7c_X=Z)Tfxs6I&YwmUDJSzHV@qg)!vt|z&Bn}-DcFaHe%v$)`)BRia
zsg|EOqrX%3?$h%M8BX7f<v9Ij^FMf%rGI;#>G$g_k0Y`Sbghc7v?<uCp42$|_l9G~
zCI+tH33~GRp@PCIUT>_dSbI>g!D9JV@2(eI1r17DC1nmAO)u(>o_uI6M|hm5hqB3k
z{jhTxncHTWF<GCzJ*jXtf9U#B_I2u$a@AMllob4wvJ8-^oKva)q1Wz;*fzgBANR{g
z#UCj2ul^!fXJe*&*Vo7U+RLnIrL#N}wrT{a?~D?7{&o*<opD#pow^#W9dCZ_<UV&L
zR&Kuh9y?n;ZP9sLAO0jK<UjuO;Khrsw)Q8nPlMO1dq2tZ7vx`l);>wN|Hs2uOX}Zn
zZd}u|T>D<n@=boyrmSVXvs{jGq}xngoOEr0!SxlVZ#+5^tn+B=qKv&lI#2%`Qq5Rm
z{p-R>otti4?t!J-PyGtav*uaV^nd-M|K=b5&)$7vhR>Ji+)bNjBz9UaQZudJlt0sv
zf9LHkHe0SK$y!oB;_IFq@;m%JqIngEILFlmS!KJLOjlSjRaf5K_TJ0o)R{HPa@*%w
zi5bO9YVGHmqQB|X3frl16<Q(XSy?@9S7vO9Og^p^pc`4owSRlg$(2GsGPf>FSvV<}
z=~7Qi?4wIP+n<D#&E0TkQn2~055_4P`k@)CcsMsyc~!j*D!TskV3fD<RENcryp6Xm
z*;K^Ba_&#5^}<d;owFfR7%$9!VSU-;XSKZ?@4WKbeVb$D7fo&1bg1ix;Ft8;-FB)S
zB8@y7H)#Z~5>sfah~d`Re*be#@U8Fqd?^QK8?ru%?7HG}Y%|lk_>aDst>5`8HW_rW
ztz!K)-FtEM%Got3$rCr8RM*MA;}KJ$uUvm!OJY_+$5x*cD{eW3t=Mqz`jfO!Z_Sm9
z8g)2jn5OPZob+?^;jOVp<*V3D3%<U7@M1yzg@w06muwOA@mcrrxgXQYa@q9-e|3KB
z=RdffYu?ptjyvH?cAexl<kMe$>w?vh{Rh?_T`IUN#?rYZI^<l3_tQ7oSy5S@OWAk*
zkuL1I!tv&I!9}Tk$}vY{O6Cd2#Qt;n9Olf)`%v_L=EbgpO7@*6uGn}#e;;gR&cbiV
zZ7^49rROqk&*$HyCK+?*UFDo{cIm~XA&PD+>fRlx-Y-JuI$Aa|t6oc*7nalYib=M6
zw!4dfUsh9^XJ))^;}o6=M#s)<<S6FJx%;utcI}>k_EYumR%9d{lY1;7KkFrbptkMI
zm*3y2J4GFK(fA`AxWVZ3WbFqrTMh;OSajrxf78o*8NxxoS*MufFtxw4I<sH=<HS2N
zmrR~}Xr}XipY2++RhJ5GV<`%Zx@*Aw+ePX5H^nsz3M8hlYKUsy5xqo6<nGqLr|kd!
zNps_#^g%)3LGqWFnh*7BQ*R1w(TQeakB+LFYa8Je_&f9H!+SwjMEy@}=UJ#!E3`v<
zvC6OMUQS8xHhO3XC00yRs*lxFs*&t-n835{-y+9N`xl5zysqw=BB&W8^!K`=>k}DG
zp+|=%ZOf1P(>D7}8plD)hL1;TBz~AYQuGT}khwVFZ$#mb3kRd_%zd_euffdIn~wiH
z|K!x#W$_7RoJQO^(+<t`e<!MttzN8rRN(t#!+W})Ce(YMOL5$ndMPn$dP#JR_X3%?
z)v{5$>sBSM%<f&2e=X|quG-1-Z$`bVH9p;YSU<A!T8~%QI>8^h4oP?2bq`G0om#Pq
zd%Kk?>(?hAly;st!qD~kYrU=I`|7H8@8=?m0wS)IdY#G*RjKRojP(rc;Vz72c|1vL
zmxhu3u_X;(j{er>&(!PjjyNy4$9t2kNUQvNwKH2Z?x~(Q&2djvv)J|NacTaa?;fmr
z|M|zO>n8IB<1z$4@&+<p|HK=@HQU8}hTix8nLX~mBxGae^784$^Yg7+-@pD>bNA;9
zf&DMIo2-K}twYw-@#jQumpMG==4v@xzvi0-n<QSoI9{*olYYL;ZAQ^##%0}xm*4)9
z{c9!i*n_Dw^JVebOM+_*a-GiZ?Ebzy1GL^rdUN!*13T2u6uww|r$xe~r&Hd7dB4^P
zfi?Qc`kzx>jOs7P$vxlWQ~ziB$!_Jxbqmf<tC+YfqW{wUB^MRG+z&PX(5&FZy#2=R
zh2l?+DP^s+onYblDwyT#>ec^GzGW@^(h~Ii@NKv0(f{mz3El0P?D;unZ_6@`DG@G<
z)&9ut2v)tsSa!j9o^wUo)-TWEL}gr_$EnCHc^+jfV|-wH%cnG@FFDHjPnksDy=h#W
zJY(524|$7eh1J}p4jbanyqa&ZPC1!F-SVSXb@rWmvFA&BSV|ae7g(P?X59O7F|X|7
zxZ)e7nH&cEY}2MQ8cfih$mG-aC%gL7`O;6BFV$8o<b0kT{Go#Rd2H#~xCwhVuqQvc
zb8wz|%pu8@HAh>lBrff(*Ed<hu_4SbVf{3QYeI}+yv*Ja*LQE!V~)s}&Kw@~K29t^
zE@o}ZvF3*E|6;+;mvu7}^j$2jF6imeT%CQ``iVsFTqoX{Vu!7B+e|NsZ7O}_aQeWz
z@)>t0zWu!Ww(qjFLc47gR|;hIRh#`^9M@*DqRRNwqT_QkEN;INe3AV6vfipTyTskb
z(R^2mGQ7C2DhX|D>vCzCGNo%uOZ1F$&fJ^z)@nUB?Yv_9c&T5?+=C|*_^zy$wYVPb
zygO1Q<rH5~+tt%kZg)BT`RaM`XxHVVNtcgCP1Cz(RN`s)kLyO=>+Sz8iMLI-IrV|h
zlm8d;7BH-JFb{i}w`h*s>$VMS@%CYye_c{6y8c|KyY=($nxkfCpSGo*mB_OzEc&W!
zzW&MTsJuGCEzLWAx?f0n_-uL0-VHq7t!HwMTwu7q(4s+{dBLlOC2_qQfAp(ANsD}~
zc*cXJ=d>mN<m8#tpKY7xxOhtWilfSZq&%mbHg)%07578;M9<mk?vR7r`<M2*O|xM9
zE8=%C{BXEFKa-^x|B;3Jm$dOj2<ZxTZJ1Uo7$L0tRq5$@)wm@u*Lv^ac=N3JSG!JU
zYqduI@Aa#@63%EoxUHJdzv-QDkBF;f{~Im6qgCNd`EHf`UTu0utMfE3EWOb$b|<Eb
z(X;fz(u#gH3H|fsF-j)${~n5;RC461=Euh~_ip$SaPt)Fw_gwaj!4f9d~bL<_Ofoe
z!R7ZipWltms9W*x^P|5nAN+Xr>QPqrA5Zh-ZAP#5$G*F~ms8#)`B~`PCGXNwUMu}d
z+w~)U!rT4_9%63|P6w~ySD(Ln!Md#I6?reW^<7+Bm6fKQ-Sz57(6#+%)<#&qy1vzZ
zalFj2{T8eK&b(T@<zwNWx8_@;`o!P+?LR!{pStnab6m^rMgG2G{c&cQOWLi@^IJAw
z@j3ooHe&_b%*`j2CHyuV<UM%sN$-kIKHs9rtLl~5tX!8cd^)ki+)Z-N1EU_px&8`P
znKL50HgMeDGduCnWTsu7FJg{#pXk$2W#4jGbmPRf*p&<IE~V=kFMX@L_r=kDCtj9k
zoXhze-<`7mVeJC@;BBQwz1fasN1SV??B3n$|KfP`F+Yi@GitkX-ES?v?-((0?u?zO
z_o8l<%#v;U_bkR-YyRssrbe+jIWtx~`NL@xGh^YYC+g+eUn2KRJ)H4aUGd(r!jEQk
zj~?lkXibyJ`&M>qi{Z`(N0Qh5TmNsX_>uCDd8QLCIeu8XPM=S|TCvjm-lS~-R<oDh
zh_mDRHh1TY1FTZ-KFsjQoFTIL%pSqZf!zhOC3au+eEOWx)A}&W@pEhIa~oc7s513g
z$^Xih*O&Lz*9qlMUA{%^`}_P>fm~YTnW=}P)suJqe<R%>v`T7mXB_iP)y1!x!(U4&
zotk0wH@;thZTr8sm7EHk6&}mX|41y6+x|4OxX7IQ<H?i0`oV{{ZRF5B;-`H5(sZ^@
zQW9E8Gy0dzSZX)PRf0`;&GpIV`A>{)x;lpL|F-kI+@;CM{GFTFZ4b$YWb3yIPci-A
zm~w5Zs+z6yuWtWcyL6Kc3so8?*k%2`yzZ>rT<aU_Rvt_8+p2z?f14TW-sWR%sh3{|
zF6gNLa%zL%S-DT|I<#8DuQVp}rDV>X#H^Ej$YkEDkMcezm?L94maxd2PBDyRJLshS
z+P-${<I|#C1)6J=);sTa+1j}$Ew^aPh7Nz`Zhe_)!5xX(ml+<-E$e@ICu#Yw4OMG*
zy|Xp`t1~Nq<?~xdQmf*0%918E%rY`IXY2}S{@0oL=+iuRQH8eHhWj3QPY%fZRy<>B
znfh~QMo3iPp^a9@jMrLDl-YP@Zm(9cM7YH%Q==#^>2SYaLMFU(Hm3R=E}piv>9D}Y
z%keQ=dp+lx$xS|}c<<eJ#V6-CUH(<Im+#nK&hUbC(~PTGfj3V^%rMDp4d|S~S0o&2
zEB0)PQqEJu<Vi`|+k_vs<@XpKdL?Ilp`tO;WP$Oyx$CE{5U*<#2($RYbo$GeD1Eum
zWdRZrn;Ch`6%MoB*`<^y7!=59eJpy_%GJhG)}7uxSLl|Yqkh$!E1Q%U=X{vcRxWo~
zYTe=ar+4M;O>zA)X?3Sk*NWhIa-YfrH@Bp(oTXv@+dTS}{`!_RJG9Rix-i%#Fdv)S
z^mNJYsRH-j-kLAzZ|&{z&1_X!%adIvRxR8V^=Jd%{CkfQrAjZI>anUfbmV!{xpw)~
z8>M3HvFV0??w3S7a*N%*CbT_w)tc1fn^uG+1#R3_+Q00ws@tLTV>8mab1z=e|8U~v
z%GxDo-CmsfpYYOSwogD+OR}%`1`9UUYxkLE>$9abu1xedO|RI#ZmRo-!)?E&{$Ahz
zaK2rg>89HZeXhH<S(-QJWGm*CcfPCATlrUh)@AABwzFaNA{~;&#o3c$HShKCswx%#
z-rvSn)SGPd{N22Ua3i^#^tW-wY8RAbrS!rbP6#Ko&s?Oz>aNb==bBSve~CrM%lg!;
zrwz`59j+IJ4yxTZ`tHsC`~DBt?!(qC6Z20*GA#TdA~3<IdZI+=f4}XA_->qWnU>go
z`roCA8!A5j<TSo?VuR-5gV$#M-+R7op_qTy<vTfhCAL>C5KA}TzWnQlXwx%=^8$Vu
zA8GIUzE)nEzqt28Ue1@JPj8;R9F!rWrMI_L=1}Xpqpw{JoJE(M|J}a)ID7cPXGfbK
z-f`5BGC0qhy(UVso<VJqMng~UgJ<g%@>IB8uQzgbYDAWQ;yk<Odl56ou}Hc2J=-iQ
z6L)?QnN;u3-nabt<a}fCWD{*Ueep>v7X0E?oA#S;cCAM2=kGt$b~I=fOwHtqSvr$R
zYN!2y-R1}Ox<8oR{mjDXsWjuY?Z!-hxRsqUpT*8!f9QHC)Ai01kF>YFx<51e*S}+{
z7xKw$_<u?<-8;kl`TC9OrW>oZ4&6U&d`3|CaoM%i7p{p$IWGziy!wBYLa~{t_%=Hu
z`2uDQ(^kWpIWN9SUzU0qmVfyG_r;rcK1=I8JCpY8P~q)|ZO&0AvXX)f@7(qgSv5<0
zNtkFJ|5FY_&-~Km;gS~5_Dl-9eX4fprux30BBvtv-YRs<KA!jg>Ww4D{hT>bdr$Gp
za{ddyIX(XEf$#U(mQ4+g;XJXIS!S#A4c`B+H^rODZ~OcsAa6~#R(V@q=Cu#+4Ex0{
zwoU!J{a!lXvEOVja{6})7R?U(c3(pHZr!36K0hzc-1TD4%*979yPkOFexgjUh<~De
zV2ey$i;VcfeQEV|t6ub^GjV4;Tf5+Bjt7^Ro$eBu^nJTGfBx_xV1HypgpB_N-wxha
zFVF2|DtLeA<>a3WYy(uAj`>GgaF?|{Rr#kB9(lw0^Z_;PcW=rT-hH+A)c>pRwq}1y
zJz6>EvA)cjN9A?L?_XLbaX|d`ZRzCc_c(Mya}M8sbyeyY^UkkEm%m<@`z5u<d(x9h
z`jg$h&tkngNjEp)%rUiB3;U(zwXaWI`z2a!o7Rv0GtG>1i!CJXNq$baA)m5y;RUvb
zM{TETZmeVYU2GuXvU^?4ty6NFW}7dWW&Gs)q2z5#_ZUk5+kN>VQ}vSh2i3l5cb4B;
z`5~Y=T1H8ge^J<z*y=@hUpK#e)Xg6p?brJ9*N+ex1ylY7Wg-iX_WsSV{&nU3f}5VK
z9FtxjRm^(gc;#gCirHL(w%iJQ!N&Z{^7wpoHAU5m6dYxigz<U!YVt2B@l$etcGR(G
zsaIL^i4Nai4}N@j^y<gopSz788d?XvQVz{cWptKbzUJN15ARP%HgDaWcyf{nyZipm
z!;4aQuAOXCt#yo_zt4W3Q2eF2Zm$-%DS?!`HwM03{BM2pclPD#?##h5^U_`^yH4Hw
zU}68|2Mfb*=`;G@i&DGv_`!>!RcAN++Wu$dE0su#hBl)<MLyqog%^TuTqv1bta{l!
z{9cSMqwl=C7lMK_CSPG<G$~njWZ_G%eI2J?%ngd0!@uig_qMBnn|@5P^LyAb`SU&t
zjjUr4S!NnpR+-b7RAZ~QSoP)vNWBbMDE;x#g(au^!j{kE^);SraN6neDG9yczgs0X
zEq0XO`IGt3ffGemmoKDS_6KJaZ(&h+X>)msu_<5eoI}Q^9VVUA_q7bZe&M+01ey8z
zj9yloO_rQ#b&+>>D17?<b#uA<-^tE}^#Ng*X1bnC6H}cV`9MpnTt1bv<I+sGiN-IT
z<=qvFd~bgU-R0ddC2{46nU~t^&arw<n#Q0tw_n6E_{D|eKOIb`F|3+vn6>Pqul#f7
ztC37A{En@d8D>#ChyO|e=Yn05i_11Qdff`)S@1-)!pryj<0(0+>kX#VL`eCF$FrID
z_wC~ekmQ>?iBqKZ46{hikuK(GPw%F#GXG^Ey@CC*lrCd%n@xVYcWc=ybvtvnR}bQ5
z>r9(4H>+(%R@!Gv<)$aXo$qGrGy1hP1Z{e`SmmWK)A6%sgxNJ>Ew*mj`#|h4Hy>k)
zE_Xm%LRPBx>9C-vHil2yhdG+Bc%)}-o%(X(#p5>>c7C0AWTBUN$d$CR3#(@)EY+)J
znkjd*!OJ}KO4+lb#r>8ZTUq=~FSRz@I+s#pDw&x+DNAy}CD+DVC$4Gtw!{@S&dU0{
zGmc?NN#cUC&5v8}{@Loz7us=niXQ(JKQo`XEI#Y@3$0^Q<qI@czIEr!wcTfV_F5Zm
zd={H@($x6P<ebKpX`DVx=Y(vooY~+dHB(Nuc8*p2mKE297*Z?z-{vgdG<VDWJ1;oq
zXh~kU-9NoS<FHz0iu*k2N~`O8RjN1_Tsj)KdG1NKvrqc^_(KF6jP5LZle#QLck_qP
zTiy&)^?GLoEo=6aH)ghUWynh1;ge-nzB)7N$l32Pa?46Om#nz?k;_zYJ;%Y24nN6-
zZ*rv9P0c-g(K~iJgNE{gyXR8!e_1$l=x_$O`B>jB%{GkLu95xw`wl(EFt>u;b7iyg
zm$%(|eEqZ@W7w`8IjPdS)-G9id!c{R?^n|s)DQP(r+qFrK6t;df^9;g9$(O|H94u)
z8f%v{Ph#klkr8BHH8*db$)@SC%^Tk^>BSe_y7e+?<;1m5q&!u{MW>#2nzGUN{;7NN
z8B6oF{Cp6wxSDgtrPg3&>%)r=p7_w=oO)(j$AWFfW<i?{=kvP#&}HbHXFFea<AYl-
zjaDv9nRV|=A)B!%gI278=_Ye^>6e|n6Qjx>DJ<n)=B8f#%&M|GuX2Uaq#05-*(#b7
z8`xWv*vk|nJQIc6weQZ#PPxt6>$Cendw0dGM+vDMpWe(p%$EGzfJ<ynMI6(jlE`~g
zHkns0_1Vt%N}$Vmvf}aGGuaqx=bU?TnqjiyzTGq3WNOcRJGfFWa-LHplg;Ip#r?*T
z)t0Z9Onw-rbyH`_lFb5BHr5=`@)KiUF<WoSEH5?ji^p#=XnHeD(d(Uc^W{`ux2jZ*
z1t)7bXU?6t`fAALlZ(@IH$7!MHNo-b#qDWEzr;RGTk+0dTEU*plO`|8argAPFBoxa
z&)c+?omMj+m`vW;a<Ss%CV|w7yr8m4bEjCQw(`8oYg5TeeeP$t=??RXX=W;-n$9Ao
zn^TjGvxS#S1V}zwG4rMF#p5%()(Rv@PFguNbL++9H)FQ;9A4rfskp<ftYgu{h2C5@
z?sQENY&m^RZS4}XPS0khfK-=9n}pk<dRi7X1bENh)-^@%$n2ZdK4+iE1yAu~Z8&vn
z<B70+Z+YsN8gg>2;+2B^CtgaeG`=04WmK~?;n@O-V+~85bu>>AYz^M@c)3@Yft~68
z<j0rqwS_NPq5d}a&6@>p-`1}9<G|<qX#cwhBC57wI~(t8{`z};&)<J@6O}D)?f9K_
zd_lT_xj>P;T+$cWS`nL~{rlt2T#)|Dc9JXTN$k?j|IQJ=RytZ+9NWowIA_AX3AZ=?
z{wIBUj+)io71zt(m7bn4W4m?Xqa)U3{2gr<Klz{ax>O(f%~@jK^4diUEq5<p8XzOg
z=y~z1^0AVW$!osI8<|e6ZF%8-W!>ta*mbK5=85Jm&{BDBiR;LYBTV<<M|Kp2?Fi$)
zeA?PDM{;|4!IiIR_uub3!FWgdnqrLCU2EC4SE0KEU#UesUb)lIz5j#$mwo#`Zr^{3
zf9bh|6h7fQ&);^6%Q+viU+c#F|Mnq!-%pXH|EH?F(b2qg{|Vba_e`@{LjU6O5{2L7
zduTE4zcZh8%1Xx<`HR~(+Dx5#rR?!fs|At2&#xAD7jOT2U$1{<&W@VzzrH*X2;Ej*
zX1Ai<+S>iE@|SJ(WnEIGoL?6%n9G=cc<ae?=RQ`lst9iQz1n(>zJrn^UmTAlQ*TGi
zk_V~IQF(i2No+oU;*$E_Q>HR^w!bgAyHerPmhi%*-Lh3iSKZs%r1^DY=T`=u7WHzz
zy>5c2N8?E=>;6rA=MUd3dwcEW*)7$N!-{=Y@7qxN`a#%y%hKaErt&4P12%un%H^N9
zt<Cm;ui&eNS)%*H&C`_so<6!`m!;|dTpzVtX>VQgqt`8zufNk_xBdAt%WG@TM)m)d
z@m|04nMA~aoJqgto^g97qkZ;@p4=Dd=l5!*n#x!G&5M$FuruxEuajq1vhB$FY#An7
z5FaM8|5y^A#I6(neklK({B84n=iY+%ZGNkaA6`q0&<ehNLECi2mcB-e13Nl(P2`Xd
z?D(;;ud~Yh^0F$2W%YlOFEjJ}ZF!)4%XPN(><oR4_Jr5x&K@c}GqbmPPOn_n3w|yU
z*>m&0JcyQfs;pF>ICIwwrprCP*;(~d?5=+8<cpuMKlcygyI330fgLFiwryS2cvj-^
zRNIyQUv91~-k!dvhV!w+<5jjlGip{Htuk9SV{`7G1$ohj@2SOd+%_-zdrcz$UG4$V
zPg^F4U(fFPeJk8XZq+A+#B-jZ{rwrvGLNm+*eU#a_D$`<2{yrnB6n__jX$M%c7IS(
z0srC-Uf~Jvv?CV2PdgB0d|cPKJ@UjHznAGN{_}p__tx^yJvZUYe|Wwgj7?;ZS+H>D
zQft0#Z5M50yY!rQPg}RgUF}8degoSum95vRl6jN6!g<zSa$NPLamLX(t`Ukqrism;
zb<p**#)HrGH$!Vr-{e|V&4c5(j#MWNfs#~-?acX4zg%z+vAlHrSkH@zD93ehodF-$
zF?myi@s1eHANxMBF*mI{+iH5{WcneGss18O4qktMF4qrxajS9Cf~vm{&q>_-T2+w9
zA||Q-!92J)rN?mUTlxORg0HW)tLOh}-rW2;K5MJgyENr5QiAI^4DVU(v3MUJJLlJX
zMFqh-QBQFn+0nHthq5C(F7vprxm8-g*n2Z~Z`}F-pH+<f!n*D1J6`E~{<!t;#r7Xx
z7Clc03dodtR{Q^b_{DHr&)4?so!*sJxf~1THLF)WX0z^^&z!ZtL-4BFiV)kZJVCA8
zpMP^6mT%jj_9a!g>oU`0`T0BFzP06w{qP`p&sp^qTX>qjRv8-}f5&70U}h2fVYVY{
zcJ17`)$?>l?5xk_#eX_~O})W)zo=HhH8<~?#wG=$1ctUF-@{{8U1~j~z!$SIoT4K;
zRCXgB*%2`L%YjW>j<3>Te6YasVYa{(=>~nS0M7|}NBmrF2`j`giR1;etO-A6vHst~
zR^NYyhaVW;Kip8T^{~P>fq=;E5(3Anen`Dy-jh*M{93H{$fNTYwLca%ocsMSe?gbl
zM%@J`#CKXP3NJ)Et>eDm|H`e8w<*3Cdicp&Ol$xCSMUDvF*RR}{xY|qTb3(NX5(Cz
zw797rwMGZO9TF(6@mHF^Ku7<l2vbK!dXjw_7kl`FM&5T()9)3OPYJm?;m|QNrLYsT
zH?DlsII+91V^+z0yS#lSad~yOZr{1Z@SCArZeGm#^6*28uiyIcxjC)(jaLRsc#6~g
zeYrCwPHdIkZg%l>uW#mQ=5y0m-~J@_?D<(;`3@6-do!kSJMLsy5W~Rds1>?R>z&rO
zmJrpSr<RE)cNueYTI~F&_DM&jtD|AH>pms+wACN#zWjEuE4uY-QufZrqVF=dIk-J7
z+0=e0+kM)LM+^Nfzn`z9q<N%8@A$O?4wADzyPsHW%Kk%k<*x}_f}OY7t>NI=HkW@!
zyR7KxC#vNkJgQtvJ|Dj@nPX42^g?z0c%jd?zrJwd-!|1YS$^7!Z)Q3+6;5+G7i9F;
zEs=N1o+Z@HmtS$(+{f}o<D~Q1E%uC(9_?p-K2lCTGR@tE|5y&^{p<ou>ClshE}WR&
zGLzB&yQ)BK9LLq}+hG^f;+!WI^?zUu?7MRFR*mPiBWfRayn2!}6~|#6TNRxJ9Ar<L
z_Ua!$R(?8onu*n1#xFwM*IrycW!LlJ)Qo#d+r5^xFl_K*S$Aq*{Om~&m=2Z;wZ9Hs
zQ1$s+#B8a_$77>s-@LsoPx7&?%f5Prw#)B&EhTr}zj18;*Vvtg|C`*8&0wnDbB9Oi
z#X8mpp97~D3U(VCI=6nA+w)bneb?s_*;vI(%lnUQ<Iz^T++%h^OQ<Wmp;+%*)0XXm
z+k&zLi*~%~&{^gFCa?K)!b{=an55TU7Arn-7G7P;?mc_5{USN`{%+AD%vl=Gz9&p{
zmYb7&d9C=C!+Y;Z-Y{Ev>R*e5ezk<1jl2&(_a8^CKOV*v+DFg(Fg^G+_awWb{gm_U
zzGV-8Ejh`qC_lAoq1~1nf0=E)<`h}!l(osNJUsEkgQPOMpE5oRuh(VFoP6@N`<n|F
z__i0;KV*>OeAIgTo9}wv9V&H84))jNs0c37pZDPC*LxS_S1BBRc=v#}**7z%#)Uj~
zH<G`|8Jv7}TX@fk#f=IVWaSo5dhs^L<B^oTtJjrxPETIn``co9CiTS&?uom$>^`w~
zS<^np7~}F8;tOK`{SmI*dm#P1?blmhUX+)F#qpe#d{^T&O<HWOXp#Q88!>0xN}tT?
zxwSU!%!{+xQ>TaWubQvLvf@-8>w=Y6;=)e&9rvFarR&CCpTMuB(3>A#?f>zHeW(G;
zF54^5s-_l6|NG?rV^f!$VfBtP3~TFmE6nL?Qro~IEX<%Gc3?ux^9I8!>B<fQ1;w2&
zeS0t7{?;64TQ(*2v9{9r#~YT;6rHf)um0{R?w+0V-unmL+~ImnY2Gp2l*#w|Z8`sE
z9>`}n)7$pYJXWI0_GI{sxEtEb{F{!gyX8<Pe`Eg^zB#KLw{aV6{MfYZphCaR?aw>`
z72OT)H+ueTow0LrmijgGf0b_%4|+X47G8d;>ASK^le<~RqEp*^B5wFCw45jG#PQ?%
zYqy{_hYrP6X*rA1v#LKvdM*nWD8D=Bpw3sby*qE+)>&Ls>LHL4x=w8-$HYxn6)O)!
zf3oVl@mZJm{B{$Y`<Fh{cpv_(%X?pLrFy;h;rOpvnv)VLlar1Yb8UBPJ}0vCOUK8m
z)c-=O-{zM+6*0fIC}UFg>Uq~}qr9HTtra=9Bz*qb2cIr$zyB2c{oJ1AmB(LRt$Js%
zb>BhR<qLm**`w`uSNqGlX?st9S+!@k&w8)Dr$hd6-$||7x^B16+WhkAD@Avn{_?7N
z@9B`Z*Rjhw8J*ZeZ7#O9>UX}YY+odB_vtdnS$aI$>30_IlZ!mfU|q<sy*E$vkjkwK
z3(eP8m#-6>y#L>Y*OT_C#>Yyj#eLj;T66gi*-ssb79W^vTIT=Kk}Ws5cDeOTyyJ(e
z4A(#{mD=Xul-E-ZUj5(Vw(h8F;t$FFHqT<rVuE)5nm;3Eov!YTjjGBzb$=`WIq4P0
z)xE5^UUETj1H<GM6JJY3_xkTGar_+~A@KCxs=RyAHPiBEdOx&Zc=JT1>A9W%KQ7ze
zP_XyZvkA|P+gp}CHGei?nL&Gu=yQQHe0Gvs&s)v%-=erM<9~S7Rhz3$Pf{FKa0yf$
zn5>Y$Fyn5(8`g*JGtL?~?%Ue=yym0B_Xc5uFE#tP65s#h^s!<T{MXSS;OgV(<$q_T
z`~I&IEf=NzV&+QBi}v?!%l^h8*%7!*<F4D0;DYo!_a;W3{A8q29pyjCcCFHzmp>Kt
zSi=s?y0$&hxBFo0!{mSa{s-;y7fziL6k#T*%eBbm)bhApUsSmL<WoNg$UO*{?Kt5B
zA72_{bH&^YzK`8Gxn0N2KCG9nU7@?doA16{%sw~gJN=fkZ5B=J{C`#U#M-9qCYSz1
zukY5`==;J++|{zn-j{E8>ZwgWpF>YRUU>ZMmsyc#G){ZRnO}?I6ORAR|Lgs_`H?@?
zA3bD#zoAvye`>2_QN-7oGZNJ*e0sz-cjnz*r}iz1_1UNGX*+bHmAW6+9C6B+nq^|6
zXt}EH)7zH+8_w|9H78Y0USyy=zi06@xs$C&IC2yZGd7->wB&rx%wsbQ-Z{)aH}|+H
z>%&OJK(p>O?MH7sRLV(e)-uiPIk7vAO<(u&A*N!`jQiow7n^*he@;;9dAiomdDi8l
z(|Zn1e`N8)zeL*h0OJF9F^hHy&SVx*t_Pd;IL%?%dW<7>!F|TJ<pwhM*R}Q*gipVI
zeEB|w-H<aGWIVQ=<_}l@`{47_gBLGeb&tFkYFEklx{aa!U_rQoZS`LJe-ozKH|*V4
zcem@qvFl0~J?Dnal1TLbW_spoXwte4|JMpS+Bxhe*X~Jp%5zyWdwR3J&&f2M9X})k
z-x?M1a?Ib~v7zYQ2kWBM4je}3BCat+EB#tKZR^uO6|tB8Wu{XWE7o?MQ2!LGJ#V{U
zT4R4v`SwQXKZ@I9#2R&9+HZE_``h9+?eD~!_A-mp3X|WJaV=w;HA^{Q;f&rp9g}>W
zy~>Ymv%Q|_Ib~+1?^e!5^J9Il{uhn7Dv^4m_xgdw`HDKv4!ul%eEhVgQ(gooGml}6
zfi%M_rWo(tvJ(;ymc&b+ulgQx;APvfXC9Lxdbs(U_a1-nTS|X*i~Rhz|Ao7?liy@t
z{BSt_+sDnCCtLXDy}z(#+nP1rs`{@tY1X#?Y+voT%H!X|&xT#klSR%S*O=EIXd}P)
z$2Sk#pUEPv{XA{{LhS1Q7cFO2Zf~zVCpu|YRb48BM#A=wA9sHEQvC4c`z0Sr7X33W
zQ||cwU|pk87Ek*1`aF+Gce<|D=WUaE`~27W*FPfN|2}V6I*;4lUc9bO@6Vr@A3t|~
z_+0$(`SU~P&$rH>PnyKP^T;~?>+AhF6a4t+&S{^6PnlQwIn}_>pKMh{HLYiI@7}*j
zInsW#J|bNuLBJ&DMxUkW2bl%Vmk&i1{q}L1Z45pJT=>&VnG1K{Ox9b{&irLJr>d2_
z&uinRx#@@7d{gcyUYlwDYp$8(Va0vfp9SV-nVZewY)wvNza}Efvvs1KY1@x}MVWmE
zjh8=`T)(_`D%WAfhRlTZ*S6$5oZi2sI=SVZk6gNO$Wh_?imHOzyVgBvpL$>Me>F7u
znScApy5d;rYvS{@f1g?JsdZn-;*7lKD*0dk70w6U3)^0^Xra~ynRydA{{@(@y?y0f
z_#xB#9p=Bwt(5dwRLmuAwWOGz(JjuCw2GVC&#_4TT1c_8r7`<%p&4&^Rye2KxKVs~
z+Vzm+c|2-=Ctngaw_@UCxj9>E*6V4#zb}cMo0~b&)p6$3kh6<gwKmFfx?2>U)?89+
zblP|FJ<s+H<rz2lWKx!%@zsjC6J^zTK43q4*rAn;)y=BSbD562-I8F=&*;nRUf=q`
zara><t35mZynXfL`S#i~A)B`J*01#LldwNlUQpHLasE1oUrp>@dpjYvX(?)l-$Vs`
zxP4INllPrSt9h?3CV8-Sn$2|Ba_&N|fZD%5%gT6+k7e-xd2s%>i1+*xdy@5!$0aPk
z@*Dl|BBxp$hZk`yKW-SHzPUlP?BajRLj`Y{`nPU3oPAPg((K)5pRK#)sBd`RbH%Or
z7ttK`^@b%Lo27o)pJpsrdS7}$;-Nhqj34&hbIpnl6RrID?%|Y8a%v*)?gjU~_;s=D
zi>B43+?=Zm;(5|<PkR1on@Z%bmdF;v>?2!GT-?gj#HZltB<=Lzi&U0x)8%YF`{0?p
zk!v<|dAjNCYUTCu`2QzO0F)WEcy2nMwSV0CWaeJw^KW~3bC?_+HI!>z@>VG`*ED$|
z#dhxO0n^EQvNb=Lf0_ESz%YVGX#HWm4zq)5Pmh;>jupx4eYDm-G-mV6xYC37Y$DGz
zpPhVz^V*4zS5F8&-n{wmivYRGnj??aJ>l2vV5qoZ#+RVH<D$t<jyY}&X{HPEoEOEr
z`aAsJ)ZhE_=b^;Lf2aR3UlaZ(%)92VbJpA47bQ-pwS;Wd75EWd#B0s+<?3s0@tyLs
z)}H$J@TI=Nr!WqQ%Bu%7d=hR={rh?KYrBmS-<{T654iau;+O9K30WB@wDV86E#KrH
z_Uu7?3PaWBLva}|+&G=hXE>K@|9+?V@x}w`j|V-DEi>bk{oHT5<6?gA%=~%3Hk8}k
zILY~^ZHvj&D;iVl=2%p3nU*jk=<bP(1y83f^-=bl`Jut{&DWb6Aq;B2d}iBZ^lvi{
z{U58_&a{>HNXT@14c{kb#fks=e;4vURP)VDYu=bLLwU`Y^Y{Kq=Pu6U7Vf%orz6bi
z$HK^WIe(YW5#7{2X~t>BsD#TqI!vu5b>DPrGIo5kAx!jN@6!y&nQV)$OwFwDoZ3>x
z@vY2qgR!fEN1Q)P5#xFFsBfRLt#Uq0Ev@LgX7B!b{^GCaFaCO-@wa%(zuD7yJl66B
zfUX#r(Z2Gal}B~U+DU7@zFq!sYToKEjN44vns?Oy&eWFXvaFp`rY7>%LL~MV!y2|i
zgDYR$=js@o2o^Jpne8bv$?ezTJT;ZO7Al*3=Kl~AV4m@QbCt`FDc_5~cKnyUsywg$
z-z)phU-HU-(+aH{CN=B|4dR_}=9l~`rPEo;VgDCjoig?LFZtI$B7Oh%->9Eude_dv
z;)dBX>vlD>WoKsY)Aj!JfcMFKq2%I%qMe_A1x;M~_WJv6obfH+i^?{*8MIYgQ0YE4
zC16VR{L{TQ)1@o*%s<8CJ=uBZMDfmv&x@4LKXsc&kwnY-I~>LPYu2%ZAGevVRH;<i
zbN=L6II3U!<e7TK!OT;!3yPlTT~IH6sTFPd{NCPKi!MGqc6oWU&9j{j$BP^Lo-@gw
zXSMqGi`6PjNq_&u5H)-E1^xn8)m7ee{bSK%|EGS6t+$l-_Y^D9<5nkfH4c5{U0uY&
z^t^2f-@$r;ll|cvqT72Is!9r89;_+*!T02Fb78gh#|gjp|81UMzRrFLUqbM0+05cq
zD?e<SVYBRX$c4gSVQ-s?^Agg|ysKOJb~S$OQ$2Bhy1Mv_phZdtnKfA~<Q`wUbYk%p
z#kxP&50!j#TPV5szQXKHMxIlcgc_C<J-zmDW=Z9>`r4v<_WypqT2Nn9xNmA)<eNvU
z>i@i+DU$c5c4gZ>7Q<(CcRA|cCTN=P_I*2#<#$Oox9``Lom1^RzD@47n(KLXlR|o<
zMsO|Lwr<&Zs`X|DEAuXCKAFBydZLMgkD%?bEdnb(zld+<+@QY8u06NmX~?|OjmEbx
z9@tVCv*EY|$7jX}UTr=X{wcS2zx2M?a!Sv|h<BM#&ff#K?zq)D1%7D^;;TP6W6>PH
z<(Fz+-KmJ(WbOOGqip_;^^Jye*`2IqFBsf@V^E=1tq`F-aei*ehi|64c3C*5x3m|<
zUB9tj{=?pNcLg`S6nnNxQsvr(>+$+IYl58O_p^zec%QYTpZ(htJD!sh?XHOlv&Z^x
z`CYP1&GybY-eLvS0>z}IUab}LxeCuOKAP9}c}CQK{VS{ITzV}TXRzUYL1v=XgPVWb
zwzBAh7JwQu#%`0Evr;FbV6|Y%)mJYbyvix4D69Q)`oW7IUw6-E|NHp$zmKAIZ`T-}
zc)0J5->-1?_T%1rD=P|1Y%Hq3XL~KxtTi(_R(G}2=Zo}x+g~4FMJ4VpKgkunQO{yk
zPV4;$=cQ{u6zsXWZH9+#a3S|!fmJ)Ne#*`}>b3KXsZPjO2D?5houGjBr=JwGr#WuO
zx+r97FaM>Vefopmd6&ENCwR-PI(&7~e#wT4C)bZVTB`qF-oC`3;gmVEK!1<vlLv2p
zyg7R^ljBkx%cR$}SvHsM>ls8ZEWMspW6UEZ(hNFm419f#9N!G~ThTpQ-d@kAUza}E
zRroN!&iKdde>{8acJ!TTSe0|n^PT^U=&1WV*QW7j|9@n3<eJ@@Ptt#c6MN2?GmG{2
ztTk6lHi_uDnDo*0`|QU1OCK!%&^qZ!_c!y&hYdDyYj^82go%E3)jcAf8~-HqvFk6V
zt%Al~%9rFf-bzznY38u_@R|oV!h$`b%%*UuPkDRl-&59%UH^KTb~Q>&eZqJ4<rIrE
z4=Q`ME}Zw^b=fSQhpumui^G4ZM2PA!Z`6CXVDWW(`FXNO(-+KT(#RL|y(gJr@an|U
z;+pL%1sc}hn>&C0oc}WHR=zK$@|FY(yijBO_2bp6M_SFbzr@mJ@;rOF<YsW{`Yy5N
z%1alSH*_4H7;}8C33IpbqkgRdYxX0#h8?2fj}|xobCh{f+BvUJ;)KMS*Zl8|ceEc9
zH`=j$#fyioYfh_H%@Pu`{kyo^;^%eM@)XY;-t8M>4PNiws(YAWz4x;dYqAzbGHh>1
z{xIu}yxO$XS*4*?XVz#fj5Jt%Kv><dV0R|lG(+RlTO*aCCNsxzdeoE@U9{h=c9F%#
zOE+vyN$qT1lYY+Ll0S1@%Ps|#hlDc)WE{FAR(NDmV5-2o`sZ_IZJ7H(u{<qh#w_bx
zlTAra^LJ;SHf5Tn#1t7UV07kjxjFagvPTP+u05r3)x{y3v#G82*Y2IE#}p?o-6Fcf
z=IX7c1&LE@+0{#g7A%!?6}-?Au~wNws_ntK##3&bH!hu-&-8kMHiyi!@4MS4KFi>I
zaEWKGLBX5=%}EL&xeZ+BD%BQvacAiI8@Y-xt>b0vvF7$Lo1wQ)AohrHmy(HBw}FXl
zYDQnlyTlN~lqU?5r{@&)E2-t)4)}CW+V!!#t4~qcm2LK1cQYT$dHC>^MQv<MdDpmO
z>8#npKbm!#W8d*T<H;9#t*Gm;>x`DDa89ll+ueEGYncrhuPRx!^C)fN2{CNE9Hx>l
z(ipmci>uG=w0ujw;EJT8#fyJ6cdTU$^(iQcx>&eldc!GQD<|&-FMFS^V_4V7vb6n4
z@#ftp=SO5^@_iEW_7$CMkvsj?trvkQYgZ<@g>=uDS0eJpqEpwx@up(AvUBGeD?`Rh
zc_xdMKkDyon<4OW#l?w7uEjh1%qWTKIk-bSu{nB0i&&zv(SieBIUHSLD@7$Wb1gqv
zOq_FiqhiK+jU%@&s5^NtQB<37YeTg&n_z?tuj9^3)Aky&OlzGHlDXYBiBpfmv6E@z
z!UTzbOBFQyZt<2&G_qb0+2WSaKe0zJsdil<OKQiRu0CUfJ-17mLXU};DEt$9|Eyz%
z>*cTz^N`2uw{4J^u+xcO>0d(dh1MXcdG+VnCTKG({K4|1F(4$y^zH)=X@_|lE<f6t
z9UKFfvk2KY81N`fzpiiYnihHCdGN-?KCCwySf(bMJSjZP!YCrV`R=k;%o%5dK772f
zuIWSP$>)8yzCOG>`9q;=%h3nIJuQqJzr@)cd_Kuf7ZG7vubL6F&F0_a$Un<JcseRF
z9G&91U7BIW6Z=+uE^U_i3zF}=`t_mm&+&8TpPs4dU0CEPZ1ZBLO6l`8jLT*CHX1mm
zck90iiDqdn(6JR-C*#L{tRZ8!?vHAh|MyP6bm-jczm0zn---4;a#tew1)hGlYS{0p
z$dLPZFMs{>z4FT$E-sH_f8wmiHc{_Gw92ZvpTl-ow#+`tcCcX5fjR8URSlH(tiE0R
zKlIP`6SE^i+15YeKT|HrdGmhC^N*iq&oS#xs(z-If9=`Vi~FWe*54>6-!}bQmA~jG
znfJfkX7BI}wC<3t|D-P@>X~h0UF>Sf9PB^MST6LNWPDZiyMO2Tul_pt@ccXWzSBkC
zp4ICOCq?lu$eFvC|Kp5XEEi8-&No#r`J|UrxcJxW<Sj-U{-#v$WL~+@-&~t~C$HJ%
zVp?XxzoMJv2Xl^8dzY2(n{n?z?8ju6SN-RGo2S&xa7tQ}994Eo!F~N-%_*PQ7gqW&
zDLVM}P?yZszOUTJMbd9faR}g=u=&1aT185QXXx$|Z<SM9K9{GfhyQn02%j30b@`fR
zY^-byr$FP9Wqf>o{_Nq$?c<l1RMvibH)a3n%}0+IJ`>(?yRm)8_5HEca}GM*dF{SC
zpN0KXQf;k;rO1K5&EF#L$DMhp6WP5}c#gr=343Q87Fot$QdLw}!~1#agXbz2w&>Tk
zFdXPKynNZ>NAq^CfKWwo-IQ<AI+GXk*IxU@ASrHN6?HdZvgkR9$vyiNejeX`Df-Oq
z2kZU6z0UV|m&PN?=XvDRr*mD*KTh6rc*F98ftC4Hn$(r+{!Cd7On03Ub9dNGl#|<U
zQ+?c_r83t-;nO!yg-_F@1)s@2YB+Imvcr=O>4|<)N{-v=IVAa9BG|c%1OgX7=gL~R
z#@*6_d2)g{TTV8cp2e3*360n7)elCq7kCD&Tlaf?{cf8b`}!J`^6z<^c~)>sUGePR
zXF7$|oaSp5t~9%RXAwu>!P62Czx?>|>Fv>%7q5Q&|Km%eV2YYU#95j7kCz3i`LzBQ
znEdb4;j6n(Hy=(A<T~j8x&AOm$BjjGZTW4P`sN$oaJ*<xRK483N@Ve-_F%=8lP-O1
zSmwCfCFX1aZ^vcU&koD_=4>reUr_U9R>Qr6`p4fNI=(-weV)_G&e-`MF762BWxvf-
zTCn}zu1j@G51*WHl&wr>qSn7VKPOL5%DJl}F)eJurZ~G9LSa!~w-@X&vUwU46_yj<
znUYy$dBwy;>>^`qWvRz0Erpx=tt|HU8I=8exjRUu_It9BcWP_Ip{lCt+E4%cT9*eI
z)JIKn`gvJpmb7b7tm6JAj=JB!=2n-vv3PFGb({41P5L$C2{~&D)KVQjeR{P>-)3@>
z^wb3x{>an{U5lS+GUeo!xv~eId2lQb<&3}aeEH$IaV;jLrdG{wMb9a$xU^k<o!_tH
zO*vY#{_@TI?)a@*<ls3j!5jgWy~h1YI$Arfay^%8a%R^#JMrPIfFDX_7UyL|{66_N
zt@K#w$M@|3UtgUt`{s(c3=s#*)2@4Zb{pH2=*&{yr{o>prnAuM&Bc93{rmr@?$Rn;
zA`t!I(+`8J<~2DMN00K|zWQHy%{i0HpO0{tru~?u9{zuFN&4#g6{qAM2-f{QRib$Q
zyq|>r(yBQXJ;6Ei=F7KDciPIV>N#n`VeaEIIF7$Re}As4%_sXQeheYAR?2dUtINE$
z`zFwLK3Q;LiU0okih`<7R@eUUFP+NEc30?z+H8h^_>WQB7X%o+xwpwtIsYju>z&}E
z8<)<K5@}#w{$!7)`l^3|3F{=7ENf?<W9VqS|Eigd*WzeMIe&Ni!>FnEIhUR1=`XL@
z$G2W;()NU?<QHpmc5Jhb5wd1;zEBYN|AE$-MS9LE5s6&YZnvE;Uz!NLoj2wN$7}W-
zliJym-f!vLe2QT**CgwPUq3XYnmU_()-7-Io&GW@jVIYUM!UnXVg7~xUw_yZuY3H_
z`;wlVuYc_B;|--TFLs}u+_C(Os1N_V4fVPo=A?3L%`VEFvHM%N)m&Ynw-#U3i<Wjf
z=QYe^lsgf{lw~w!^TLY(+h?8aY7gG~u<yfvXTNK1n+h5uHhRDO^yRK;(lhhc$=Pw6
zf)`wy5bON#f!3nkMioifW^Phn7Msm|e^C6F=^furgC!jM+I!zd@A}!NR`E?evodAR
zi`I|~om91H_n3;5Tc`Y#)O(ri_Bl3AUcKyI@Ufb?9{wlgl#L@*Q+e*qnR;g8X5)w;
zw{spTCuMp#j(_*&b!)Mms9vL7TcO-{Ejrie-oJz><u7jKCsOCdB+reB>FQ^FdRv*(
zy2d&7@A-=-O(nHreogF~Wi@4fZc)mO0Is>&D>k1le-v@ho4>8N-73QHzEiAtfnD0O
zp8PX!mMpoGI^m0{vHR(B(O!~oz1pJ{`PGE~Twlw`$hPm`CgWL`PRyKqV~TB3+N|JH
z9UF6&pJBWgD<99f_{+I#Yv+2O-eIoxOE;#_;L=ZyAN%SR?QT`;d^KeLc5-ddyWV*l
zZC0Og+<bX=5S!@9Pp719m7i<pvRw||zloh&y{U8cf+;l{a@Lj?)bh-3UT0!GZHall
zisxFx^;10d%$=(|bEQvFkm}~?SKBu$Cr+ynZb`6nVA^|{wV=NxneQxTP|W16T~^Ac
z=M*zG-#s?J|F^n(V68%N(1!+*y{ao3c03K{zH#aEMgJ$<%L3=VlGRy|dpznwwVNmB
z$uEk^;l4{uSGQf}i`>*RF-bzcQ$>VLqaoJQXzQgkqd7mOzjz(BV*Q?yJuct#TX&uJ
zp5$FpuX3d}?p4&HYJJXAZ}0t{aj+upmxNHoQU6y$6;FNt|FSr6yEiIjW0;?nXtUv=
zmmzg0Ot$Wv?sv3B<EG6VzpW}v8!u$Au}$D`HMcfisJ=kp#ZCqF6K%8d40frWbpB`Z
z)WJch-eOjjr?rf)GpG5*Ws#56=afu-lE3Po%@hwV?+v@B{}Q|Tg7cn|rlNfD{iY|q
z7a}GkJxrHdvd?9bV$*bwb58%FC&UU!ab1}+ongX1p}Pm3&y1`8Ja@6?O*MW8#o0G+
z>L1va_k#6C<<l9HSHH;q*QR@Z^#*6@s;jqM&Q9+67p0(ovG=UZvM+be`K+_q$zdF!
zR_U*I=*!v6svqBO2y<2X9)7K~Jafj{;#qB$I?G=^y?V0xT-;%v$=nYAKdilO;=gKs
zOiQKKF8Nt{s(X9W`6`-xAKzJauPuL3xY_il){jcBUp#+E@8_kTH$8tWjp6z=d*70s
z+i%bIv#Gy4{hNPI7N6n#r-s$i`}P>@mfmL<d&qikWI@5(A8PTZjblzs%Wru!v#opg
z)6>0cc0WCRb5H#g!@oYOp3E}+ySTexdgS8Exnb*;ZAd?PQ~U0{6qD2q=^Mf&4%wfz
z6TkcLjMTdy8ub^`bNr1?{CoYe+K(yLb@sE59CxEc9tu8VQ#>7Jty=PcVdlG2AAR@l
zUVQAfNZDbbIZY86u}`AD<nwQM`tjEni~5YLyA}KD{em~7>D~M4`FhW?>(lET6lZht
zopU;uA9tC#epb=!x(E4H6=(0iHjEEmptXL}zk-rG_I6LQe%&_xwz5ypPC#8pn&DBM
z;jCpZzRL6+TG8HARbw^xhXbQ{!9Er_w--y<&RZvFwy{5|Y@gw7_xS%o*4ynTk{-Ie
z`1M01Pw45Cq6>e1ofR!FPFng~p|HX+MU-8?;HQejzttCt9y#xM|Jqp3r{Ht<g!_}P
z|M~MoBVgUnvkzZMH$GE;F7e~@;m5*FrCS9zib=YCdAggQUA^|+z4iY0AHVbWuS~3G
zUUuu^NmId>KleHtEUqsovin?h-t0}?Zo8fP7_zI5-MlkZdryh@OWO%ij_*zPzdIwe
zQ?WJAA~xEK!*{yleI0cbJHaJl0!=|OCRZ81D!4v!^<TAczQ7s9Tdnmf-_9(FKQue^
zoR`AUmcq+F_(RKH*S`|BRy8y;s&TIP!FK<{fkiLd?C<t{4~peDzj)18m+hC>6~%XV
zZ8C3twfwz5`@b@QE$8pGt)A??lI@4?`dU7llGu;i+0D&b3i5tOSOw($&XAn+=U@DO
zzRB~M=W(x*W@FEf=jZz!zC7~n&vlEI?Ty>B&u(9p|IAMIE`IfPrx@n9cXiYIxs7IB
zzrYl9K;ZnMq~33C6PAbf_125pUbl)ZJ8hVHTu^uW%Nd(AXIzxdj-QZrl(mv;<zmkK
zM?ZI~-H|SGG-MH3@%_uScKddz=iB&lzo<s5tK|Rv%4x>Iy!?K6sig8A%b!z^&HTMT
zR_%>JSlrSFX-T#znu_-$yyoZUzL5BCHERa{OBQ~fgHNk`g!*<qjO6fmHZLQuzx>$S
zSgR?O(#wAqPZdsha^KANzUf&8>+<VU>Mu{JS2ih@H}TsT{P~*1B0*n<n-|j~f3_z)
zsrbizJSfd7`{hb6HKpTBA72&yU+|oH=aeGl+O40PWj23`cq8gJ;pB})iw%YC#o~Cq
zwx&(!ZZq;*^nSwH$7`l5qzTD$l=W@Cr&xV#W8;Zqh1a|VE_Cv<{5~f6eva&X*)PB4
zWH(t%JEotkFj4o`ndu5_LiL<XiZ}IR<Jl@EFq{YrNHJ9w39_#&{`KzH+W%Sm46F`)
zc)s~$;EWZ@erA?k`wkyf``EbShKiYh`0OL>kCKJ;v-MY(ui9Z5CHKFpRsMWhgLGB*
z!kNPL#m*fcrx*R4`cX)J^6~gbiJus%=bv={>BHB;eeY?)r#~iAr=BgWk<jD&{$1ne
z4C^bl;_>Wvi#L|6sJ6@dcIIwP-m_fJ*<qEP3{&1SClvp*Q(%@q-F~aMu=>J1{~ae&
zzg@8Y8JK(OHRG`<*Z-Ext_kzM$(_DKD!e^^{crY@ymH$XPMDq;Xm9y`ehj;(NxcT|
zN&e%@BRxakFi3ARmGHCI$}%_3=lsRLH2H~S_VK^Q6$ekRIg$G^P-*qkhr3s=_P)<^
zDy#CtyX)rc@BM6V83kt^DYnkYVt=H{7@y`Ibh=ozjAMD3fswUQqqyfAfzz)~_`Obe
zJneZ|;quZC>7^gkOP4$^QHeUVWZq<Fo{iHadoJv^@jSa}Sz)BlAK`hu;`>YO7A#ph
zzi(P^jYh2UZOgau`|T}i%Vpj?Dl0PQ`DiV1@9=i^=l1gIf<Al)eP*64(hN3^6Z)(;
z;lrW%@0F&#n>6?Brkr)$^{cq+mvPrG@^+i&y{vzplm)wQX-#Qe0hiTN2`iue-f!=D
zq;Gzys`@j%Y`vs#Q3<Q{lY??oEN9#334UI;f2YmQuL7+rrm}YAz1CBa;PXyDeCb3(
zD^JBoHKT+undaS3PqOBpUi|;~-RFYtrz2QYPu@Sd^4tfebA3%;e&3m9leuZj()s;!
zZeKdT_I&Qk=a-*v`!adr=jf`=+dFmF@A&=2_@-r4T=i?~wTkci>K5*v{77cYq`9Au
zyt1qKeQWQ;mv`4^^z`m>*p{(5aKo<sx>Fuzs5H1f^1UUXcj4knpF^kKADi(~xnyyF
zqWT9n^R(?5eS4MHNPWEC*ZDwf?-jupiXW}!aJl^w&$T*!DYr-deq(;9d#&?*v*XF}
zJa(X~&5aEHG4;0}uXQ;$w{M-^xmT=Pj})xp`?K)m$HO0<r*5-ozwEZ=IGca}MP0Wv
zqeCTK=`0l|RDGmaI`2A`R~xLZeR4!Ldw1X5T(2PJmp6r;?RAO!t`egB^X}&smF5Y(
zBDK2e1;Q+fN$;Pg?yppwZ!zO$<9vlL!qR%`3{Tn{9vx0)Z)%#*X&<vi#pRodvy2K`
zy3VWP^PX$poi}^)gv_StKW4H?Yr6D3H9in3lD1A`DgURV*3*4z8olgmgw=Ih@>wjR
z&OObrv~hSB=X2m<(HGOazHj$WpIq}f!jey3U;Ff;^@4tV{l`w9{Fkw4jtui=6TfqF
zeyr9w6EoXO&~MshN57{}EHW!CX3k@IAaXAKU=-&%t7i$R|MzCSV0*O3d1YPNrvF8D
z`t6Kg@`cV>PkLo&^4>vZuZ=`Ub7f`qvd*jT>z2OVD^W7##2g-Pqw;m?xAy8ORXYp2
zCO>Pbt6Uy(nB7`w!ffvLX4ey*{TGf*{9#$C`**F#@A-B|>JzmTiqb8<G*_uSE|Hv`
zSR1a^bh4~<<+j?!xn(8G{C&G$?yg^LEo^AdI{mR;X{gfMu-&^G_w7llo2ak-dt(2=
zqaF4kiTT+Mo0bLDc`TgH5*q)y{MO#YNw4xQbNJr9{)%1xQdP-s-M>nQ-BRU$t1t_!
zP+5I#|BrSi6EiidGlzdM1Zg<TIF#?_*Pr~LW{2FI<&91UCNAn-zf*d@-(2tg8?SG3
zd*651X5+(43T78SGUv)^Z*QvBe~`X2YKqUX+{xbh>mHT9h^#2MqAk8#HENnv-QDu{
zYQIt*eh({<b-TG^a<-Dq%=xW${)UwotsR<@KFzD^44;zETAnhccW2bc)tA!!tgf%=
zj`O(iW!07T31xvjYukmt-R)ePr|mT3Li9@UAG+<)jjKN#`h4RY%k<L5JClL~Z_O=Q
z``{C|+L`Oem#a?Pp;*QrB)#hMZ?iz5H+gC|zARc6v%~U0Uf0Q8W-&7bDx_VmtaVk*
zKmIh+dWT1|r_%SXRvW306Ffv!0uS&0qq!hZsLFD-{>iVtOMNzI#GBpqp3C$=^u3dU
z+KP8?&33l%UH_f_<<O2rtyjHm?g<ENnW#KxQu%5f&w!2GOKy2BQ2e`;uXH1KZkqvr
z?flH*M>{4|bvhTDU2f-NI)7Php8Cq<7Y;>VBcgp|e&wzTe!esJ%DTq52g}<J32&JG
ze_Ot!1OMI+;u1ZLwmYA{WPTmN&v1+VpVGgoL%nlu?0WCIXo=smrD7jh^v_MIi;U(A
z@!s({{+s3lxy^+utPL53x0%Q8KeN>5<uYBv8_CPw#?4^4JIP}~SKJ11Q)^qJ4-*_N
z98xW_K75FGvg5>4O3g3U#_!{mN@KC}6EH6C6qGkDU%0K_foZ9V5XY^+O;`GE2L4gW
z;PCpi?FrvgA?rg-S)M<*rBa@#9a-Uctatx|t8<?)1^s__j^k7BrU~LxS_%%vpSkkL
zEiT|uiE?<A+lKsUt$QET9QZpSFu1q=73<xaMeKW4+bN&ee#$8>$8b`%UviqL{->k*
zXHM_F_C(rk?ZQpxgLxvdFE7nom~wQrY1p2q?qjRBzBi5Q?e()c%=+kR;`xmK;Nv#>
z|CI$sCvLHnbGYWheB!O!&V@%BCP&RRVm`6R%;&^{<vp`|<hM(o4PAIo&$v!U%C%SW
zlgM9<M{7eB@97%Wtm%pslQz3sJ13Us=c40p-O4gPce?i9?tL@iS#Xcs_SrWLj|nY4
z-lXOk{VhiDSW{-&ak10fa^gh_r~0Kgha?;2-3hrSVy^crQN{U~Z>g{1W2bYC^Y05E
zm@7N;X|MeB`gE%|=^Nks<eSgFX;AF8`t*J_*>9USt#iyb-~3(Vba(Ugg0~e)Jp1Cp
zU#f`wto7O_G(+>@iY?X)UH>dQ!SV6m;(H-!!RL>k%5kw>uOcVik@!k|mHh8Hceo0R
z1XuTSm+xE}*7S5@F7LX8(w4Um9$fk@pnEHOsq5tH2G1s+UUabbzDe4oMVrHdwp9Lg
zvJ2{{;%rQRaj8l1Q}o@^pe3G{dKawP7{cZ{Yf-dZ+@AY)8GJstM@MO!hV)AnNnR1S
zGl^rx!#qzHO~v(7g?#&kyfmi>h%R``)4yWvnyEs${X$uqQv`fZe%2_oHb2uiMWt<5
zSW<~?l8KjM+X}r-0cSs<#T&zNADupzrg=nwcU$F=f;RJo6M_$^cz0WDJuG%}(#K_{
zZgXzE<teay?EAXUVym^JL9tujHG$n9dj!lfUmkR9%vtBCG<UUf>RDOa^Pzqh91M2z
zZ>n2#(wwJzjq-D+^;4MlCX~fDr!QZ)_=(f{Y0P_PY`q+K+wMzaUb5nXXG#||*clC#
zmtO8tR9LQf;e_jgNIs@J+m6P3G`nZ5E6*9;zri3Q?Nr?RmI6K@8>@hvzhz0%ewlGD
z>fTpbpF4FQ)}QgyE$H2(nfZY?Hh-PRT|JLMtA2BTPU5qiZ>5{Q%;&G3_v7J1X~X@S
z7rQ0;Z(M5~EBE1Z3qSvlq{bG%ZpOMxQt#5TV)_5rTs+KdS3WJ;<DH3;28&q^$3LIF
z-mkc)B!67lG^;z}-orglRbI^Wnl7WE&sk!4O#S5Ai87ZpZp>UIcHo&oN!W({ew)}H
z{eG>u!B|wM;cVi=f=1nG=WYhpZU|QKF^}Gubi&d{TJHp_Xtp+&rSp!I)ge5V?Y@Uu
zEw=~C2<g?Gxj9+;ens)C6ShkW=azXrj(+F2(`n5X<rnWJPGPjHn&|Vc+lFuXPggk>
z&U!%w^O|E1?^Y_ADSi3&ebGrbpFI`lUr)>bb8Pe4pc280VcJLHAKs4Disx-Fo3?1h
z|GDNY*Cy_g%beC#zgGL()rm_@EOs)*XY*E-rdaYutmDz17pvx29GT}@K9kK&C_|Mu
zW1YyNsp<l*jiHxsHYzKo%zdfAcxI`ruE5=r+|6q9UuQHv$WyzytM`4{B75&OlYf5S
z|6lg<`P)h@>n5*#bX+{?e9uQ7{`ZruzkJBBXH^SozV*7VDd1Ng+s$2^@6(RF5If%0
z<e0znPgvVs(2RNZwx<ya3Yp@vd;k6X@TOy4oou%A+$+3GMPJ)XOxx$&b>n<*<b|fo
zc1!BKGnXlrOy9!s@b(5pj`@eb$+ISLUiQzOmh!9R;WX8yHk18L;ujqi+^&@Ooa@4~
zHRpr&$;)o~a>+pN^s(NgI}g0Ywd#vi=4egXYI!NpdbNX$1jo8LZ^Z4LE{UA^Gr{nY
zNb-Y%S=M)b67I%wUdt7K{rK~u%XdXgz8$bC+ITHpaEZ6u#>b0(JiGfdk!{k|OYV6I
zszL0frA71320iWPk^A-V=*{fDiL5op-9E2>Xl)i%uXumsML))GXN8rs(y!XBOPD9&
z*>(Da@N1JGXIcLf={(GLe0nQwc>8S%mn^^R!(a1Z&a=qhk@NhFO<x==?MYwTUSW0i
z$^!OqrK_hVuXv(jZxVF!bn&B%+ULDO407^GjDP?Axf`k0bM@G>xgtj`e6Kg0EG&v+
zI_A4k^aAU;LSAj<oQT{%b9XAc$YxcF&waUV?cG-y70V-U34DKX?{3SgFBN+?@3{Cf
z-c-;(s*Y>kmOU-%cdI_l+maD6;i0E`nWgnw_4l6L?<7q(e=miw<y1Q=FKI?r&Ak@<
zeMxlFE|H?s8pkB(mAqbAeM$FVz(l3r5%$%W{BKUKn^pH&_}irU%l!8^@kba;7xS2A
zBlG3R-@D7--L)%>|HfIp&i}6e-+Oy6UH!R0*D!oB_m7=woc;W}Caq20w)pkD43jgG
zpY;xJb)3wr`Z;gund>p;W#(HOe+%cBJk<Ot@~A1dBt`Q3E?()^;qT9#f5`MSw`A*#
zvpqN0daUo=64$?eo!+_+=EtX{Mk(2@+Wpplq1<_2_H`d+I7=>a9Ts6=4L=)yAolYw
zo^{q@FE-4)yU@YEH}-4rj^(Nwf^Qu7((mW8VosZ&S<SEZ{TyFZHdfF2x_;g7m3ITY
zXHKu}mE@RWu$ohtZ&yI_ghRcN+h#{H1@Gy-r<3+2>{j-1qx=d>mS27TUQ6<Me%Q18
z>N@YcMBl+_$>twlT&$D>{#U$y(`s;CUGi(|B<2Nq*BBbSc8PeGT|4=TXR*?S@M?3l
z4@WH3lx{N>uuQjo=aE`|#oo(zz1KHJwuKUQ$6d}8t~aW6yINMkQ*L-)=h(4`dp=he
zF07WjBxiW;ZM>eEu!)hpLMHbS#=Yeq-h7aaNm+1r_Aw6Lt(M#TAG~`WKk=Eu?Tb3>
zGYbkoml$4bNWA<z-Tr54eP4TP;NIgl^Cryr-|<)B)TSe1S#^iPE^KF8^iiZCU_O(;
zsbB`DIxYtf2A1TL-*l6u*PFPvm)c*`oqdPNOXuoN!_61hY4fj&_?!Q5>u%OGv#=SH
zqi#)F{Fe1Y7FSh-QJLRY{l4weUj#kpZ>#t;zx#RK$G#AYcrH(!d6D+1Pqzk6D_-(w
zO6s~}UxULUrBf~4wfrKNZHTo`y$X|hb?IyHwvA?|iuyw4Z1M@t{5vIgUGJtj%A(74
zE(^ukr$%Ql)_Lx6RP%O~)Rf%y5Sg6cnE~52L-ovE?s)UvEsfKbL4~Kv=Ch<e-TE_O
zkFu!!=1(Ry29>#X67M~ZYW^mPtvY9yietRnmFxT;+9s)aJedBaC*%AJzuCQStlt{v
zoOFof&Yg5->3g<vvDDB*4_0oRFl*OIzX{3@bIs=}p1A*HRZHNUP^a%bWzDDixq=)%
zSaj%^Pd@Hww{|jHqLRsJr6vjK5)SDJe<l|Qy^r#^@MFr9==({Rq_bz29Qfh6V9mQS
zyN|IeqBG3P!+)u0I4m?fdG2d_ZqQ<tifNlN|M_-YU-stFwAq?#DxPw5ex9zQQcx8s
z%D_KePv^vrIa1pnXq-84$9%?vYrCE}zRu)0uvK&KGhxB{J52ju+^Ug!v1-qYvep*c
zD}nFjV|P@rE%Vu}Q|%Ylk|U{c;jX<^=X}>F_GE4UWJT@QQ762vRPgHcYg#?tbfc#{
zVdq7iI~TUBKRTsa%2;px*^=I~72DTHKHpt_a(*F?*vV;q>pqnRI8;d)>#fZ`w({k?
zAmPNV?FK2|1&-yVztkza<!U`msrH3<fq+NU^4P6OH}^S)yU$uY@%Yk|52y3k_N$bA
zanz`fEc-m&Iw@IYSH|(+tq)5*JodG=oKWrT{hfRC^7i0gN2gpj)|@{vyZ2XH-<gjR
znUg!G2glA$6w>(+u{CARy4w#YRxF(_KKWr^+lflU0^8^>dAge%%AZZ!xBp|-3TMOf
zf5Z7cG~WLIGy9E`|C@PTAHILcY1w%6!Xrk{*IZQwZs%gxFIx3K^k9L%ufx5X1H25^
zcD=Rn`|_(dv$tgR_RKRmcVWkpRBYVww&1Yh(j!M?Cb4|ErzRY{J<Pt2o#S1`wYBfQ
zXfYq36TXS#$-c0g_Q#93Jw9h0ms~4*`fqr0@iT^nzN^E3E>u4FU+ed$)v`bS-9E6z
z?36a+&GLrBWgNdB*2k8ed3L%?F8)++Y2fp77j(}`-LrjmQTf(}P5-a`K69|)KEvF%
zhUQLrmrwnZX3n0Z-gRz@{M?n@=Vn?)*~GTw)V1V@FU;OG{fmoW(GS6*n3i9&{{CFK
z$ao&7&VrfSo9+lV`SWNVpZWgX8yg#&EBRt#V#kGZ%~tWBC2%0g3~P?^vfUT*Hs1VN
zzqR`9teVI|x#vH)*;oIXd;jD1Et+f}j(+=g?1uG3%ftQb#ecH4w*7Nh$2e{6;cpkN
zKlr;b@n#R7$KvX<PCKf-54YX8aU|`=@!tNauTO=Ql}=g9_3!*n$unDKX3lng@45K$
zr~5K~cF|Vz%-=@}%e7Ab8?%(3&%a)hhwbD;t@+zNIR;*K%v|1lsjpe-vgF@`tKB!-
zIIIn6*d<geBDup+{?gl}Pu+9V?b_Z}7?s3L7P)Ze@0X_sUq9)&dxm}eOg_1r&ts)_
z^!c!#&lh<rF}?caSwYu`9g9Eo%%3s$#E*chDU}Q%atv2k7~X}ZT$jJ6Z(s5%E7NPu
z)kn&;B^&?Du*_b1_iU=$B^9QK>2`{ad!8zuj#QhMb2599k*~?3JvJqG=PbNh^J0?E
z6aN<{FEvyaO+Bh__o?K2)=$GtGu`+O3NSA4oj>`K%W3|3XT^)c&&tW%Hj4PGZ(H?k
z&*{5v-(D1-j;Sk{+0nS>;?y@67tRW6y!dp^#iwsBdam8bbXeQ+aQUWob=KuvJnNtF
z+&?EN=hZ4Iv2S8>X6YpsKF!x2>lllQbN|>ybDloWJZ+l)T)lm3cpikwtq&4tdzR7a
zGC8<YEO!#)f>gh7_IPFYSvwRmRx>l|-Qt|c5pmLxz0H!}%45ZUjgoiQuAO4YnaZ?a
z4;O>;_seOL+8fg(7g!yh%~W7ktm0wKdyI#3Qh`fN!@?&ehK!SV^R@l23UP3q>X(_M
z8MN+?g72k=+G=)12eP+VXoUDwr8qN)PfpeMvwY~~)}XCpQ}iHvDr3Ch&52y`Px7+$
zZcf}Q60T|W;MhY6$;<2b&M{rwy}r28Ao}L(g;TX!ja6a}d2=U}Y5!iw^B`=VzHm%>
zK)|`D0)FRunJ%bVI*19ESsIwl+OtJV?c=6{4bmFLDqd|)9dVy`SSds=WsG$Bwv<Uy
zD2vzb=JgZo+h;JGQCu<Qf^ug0@#lvkW4O}X({Fj@{g`c*=q~WZGca;8bDZ_nWnSW!
z&W0$yy*Fo%Q^8Z!1HPeGS?)MJ(&WE$<>Yw=b5kFI82jx`9l^>gB?XpiEq<`8LDXrE
z))u2PJs~F_#7*35RS>=Mlx_2YnGe=QwH&<rX=ilE%5^1AvVJfbq`5cU_Ik(1kUL3E
zQC}_n>6?hc=#xQf7ph4vywk*x);{^R*E>6n+(~jT^*G|o_Uv5y#7HrB(!%%LOf$rH
zb-S2vtQ6mQXZg%K^+k=`=N^eS=-y6#WA^#`@t~=@=Ig{W?6J|_H`{mDmez;j;u;K5
z8~O$0mw3+JA^C^3?SxqD+%Umo6T1!jCh2b5b@$E$+uTWv@q)(!H?@W>4{a%YQgZC(
zk1g8`jdDDeNqt?iw|B1Wmc4uVHQ%VXbNw%6KN)IrJBxXz=JwyvQyNZ`-KyQ1eBp|Y
z$JFKg{2OJ8z65?a@%LYqp>zHhX%%gciRDw({_$&0TEzBNVRtrj+f9X9#qG)8|C--;
z=2x;SaQ*uu|1Ph2`R(ArgWC-6Tbk(JHcbDuP3L5@`LiT5CC%LC$*1RDpWdaDyT5Kb
zFXzWg+f>h|{#m}%f63g=%50vkC;cX+S%2S^`rvqv``6zVa(T0&W^~oPo2T+OJk{Ri
z!uKul7CZae3tp^bo#9gQ+2b6$?o=Q5|B7b<Zn}5WxxC$_b@k~kFFw|s1zI^uR=;@M
z4l!R`w|tgi;hET9ZqZZ!Sz9@z{=cwA_ALCEhe;bFR<|!demZ(f&uwdu9lLLS->pB1
zt>Um3>yj&bFDI^uTPnRUZ;|P|S<=N{IQ~1m|1Di#{jc(q{S-qs<>C`DHE|D?U64@V
zjOu0kx4pG~)|1Vz{%N0Fbth!%{*%00*J_+~3qExJbgpOU|F$KQ3eNnAJaCkU<8SU4
zgK5h*O}dq56VGmv{lD_-qZf}h{J;IwP_%pc`?&e@WEP$JcJ3Ve*MjutE9zVBeLL?L
zxL9wYU4;;vN0rXe^1k!h3N49C_wPEaX2g+v_+Zh4mn--dc~5L&6=BSIeD%nTTDKj?
z<DN<hZGCGUTdvh%^ENcbGOvA}&)10yA0Bh|zMej>uHfkZ3){3^t_9xNT(mSWY?H|o
z!|d&T`OEG~Z=aPM^|f_vH2d~nXI5H2TlsTAbo;Ee;n~$4TTI_D=5e+Atq%PYcXvkb
z7k%-^uby4`v)yoJ#_X-)dvkZT)%__{{&i>G>}L_%&9ZI36|Yf$R$;V3<Nlh3ar}nT
zGmCQsmX>{7aNpwlyUPN5g5Q>3KE!a|^z=3VG(Xb=p|j6#oV3l5+vQ`n&a;Mv-EaEs
zC)sD(|F*rt@jdUwyM>QAbf&J%eKA$4%25FQl!qOrnKnjivgdB8IiN6uzf}L?{=UvC
z_T^&CMt>j6&z4Jgq0S<IQSa8Bn=aLkuXeAsHs@y77nS~QA#Ho*g1m@^)g0TG2e%uX
za(DT6NU6q<b(!SsYghhh)UJ9hEW1yk{`QkRmD&;}1BIN0PNnl#HNFid^^AuX!n6HY
z?`I<&@o-YJkGLZqc8G(Ic-WA?@nE|F_sq+he|z4>M(@5p(YF2m?Tn;Z^Cud9?g@Lq
z#CulvZsCUI&F@|Yl}O$yO?+Z&<f#9r_2ot-OSjw7*%HBfl3sN7bf#G|3v8aTnM0f9
z{-wihn~$b6MgOkhJ6^bb&e{hm#~XBn=if~~Ja0>>akS4z`(xMMi-_@Wn^msT!sHm<
zR%rbp%#Xj;WvX&*&Y6x|s}|^nSRQ>{<domO=|Okzsoj<nI_Gfl*Tz>iGdf;>c1Y^g
z6XV1sr_{L|6_)<{b6H%w<ZZ&vn5(b(%a46ncRe`EC1uZn`#xtU8XgPTR&T?0=<53W
z^Y*;tKgYMOe&yAy9kY8cWV`H8I#Tia!=pX*rG>Bdw>P*HaNLZofAev(dph4dZbRAf
z+o}AYR<^5DnA**J!YK3LX2J5)8^va%*33Kj=2H9Bo7|lL=TC5+{zi{!q1|QOj7`t?
ze~_N~^B{M{9dX5pyzlLuq$}>r^l!9zJG*$#p%o=<-c4d=VQ;N=d_VSPTip6^4YjKc
z?VZyO3&(t&u2Pd*|0TMn>SD2h<_Z(u&-?y=U;SeByd_`fHy>GQGuMnI;QT@1y@kmy
zZ#{3grJv-ol~XIUe^zvhS9G0y^pCl^YdC9fwmjN$;K%Xwyz1(HCvlq}68WDwyAm1_
z_TKY3v(fr6f5oyp2RASpuFlKL%e|C5dHS<IcV+4q$?Z|{j9#~W<%+XsrCh~a*mw?1
z`0=mHJ9O8#N5{$@NNroSW$G=Cj*>@N>8nl{Ht&Ct8zTSebL1B8A5AysXiWW8kR%kH
zn_M}?afN*XPdoQ)iCR0(s!WvyPS;|cW+%?RW9o07?9{!-nWHg&#!LPe2R7k9<6%oT
z^o)n2htbY>kd*%G$&qYZ!~2!-BNyn92kryNhdexC*{J&<;JNI!?;A7U^T|o%>N#Kg
z_UP}!?JFfW&o2~zzgl)XZ{>83>GwAV{QMhQ{=Qs5V$Hop?^~kZ1Qa~(c&lRYc@@)(
z$(-B7+h#nj7W!#&-A(zECX2wub4TjVi14jDz$|@dtKQy+?=)7fQf%$bby+jPJURF#
zv$FVO0n?XuwRdVV_uTojW&6&pjNcgF+1Tuid%v#5ef`#l&)LsP-JE)XW8I0CeYLlZ
z3@2n;=jAS%E<O9wH1;|A;oG0;o;g1|+D;%-VUMA%cvBIh!%ha7rjS)Rp?5;xaIW<F
zG}TvsmUz0D(5+(S>L-yNB7%(J-8HU#0U;0nzWCl)^JL3c)$2vaweMWcY3w=mGKIhO
zdY{h4qt0`e-M4pj3F_dC?OWT}Xk_xdf5X~5z7N(xUllW#x8>AE2ukEw%Ny`pYfU@p
z{ceSXmx#yn{)Os-72nOA{NwhiJlp>IVyj$^cJ(nkor`aCBPu?$SP45^l>6&p-*U}F
zRZRBYhiUmUiY_p#&cDu4&tx=#Z|3Kt?#DWG`#a=%ZVK(Y{-DTg)uh&i6ZJWbndiOp
zR`|6iVXL^}`USpw+LVs}e#pH@X65FsKPRo}^nFx#b@{C3>CgR+yuY>b=p8;6F}2r!
z@7dQ(_iYXT&$yMrNx<Q51N58+!6{hIdC+QV0iE-p7j?QbM^hjsVRrM8hgG60Zf&-`
zw(QuG!t2-4zHM6@eXN3i;(Pgyhg+(X{oLM}Pw?5GZT>9&!wHGtg#PKX55~1-GybR%
zN%cAM$mdLeVy${|?eT^0Y+~KRJHEVJyixaX*GZGbyqmgO9!Wiz)4f;WZEnljDN!vl
z>#UTzUkUEM{lF-~>P}eA`f54LD<us(UR`TmdiJDzV1M)Rqg;;|O+`LeZ#bdIe{SKq
z@C$t3tI`v0FVXrfoV4dn;*SqC2DUmM*jIi~KKo#;h`ljq!|QT2`IbKccJd}STVGFB
zlW(aBdDZ&sLeh8sFB*lXUT(M{S+#`E{ZMoF&7V(-4O-)VFHH4QTQ9%S+1dKevA?a%
z6)GL#dAH5?ZhJ84$3!;!Pa7w?bnL5W62D&UT)(1;r@fq6|K^R`9IS0dKN9*cRv%EA
zo$vo)Q6F2ALwQAy*P`v46+5&4h-i9l;-0v^`n&KmgXs$w>$_x4cylRW+IP0Xvv(5X
z8p?it_J8t~X}<0EE7_M9-@h1HX=swZ<FjUDUPMWlz?I$7hv#|7?o?Y`wp!A-YG=jM
z)T_;}mUA(#+7!*0p|y3o=%&jbgO`SNUpy#(qnXR&@$IYkf^EL}i}Ez)@o(K3xAaci
z{y&2I)+};ABd2HV@cO<U$MQuBICTymVPWWEHBkA!G@0k?O%4H;J26RB!O35?{ap~=
zFPnPvN7sqZ7CD(|M~_@_`@d=R)&nzM|NN&iwKqCN_fh5@C$pb_Z%qC$pY0FZfjb!z
zb(dQgUY}gk`m%Lz(l3>aH>-G`d~f{g{rbR4sg&Ie!qWN~(mbC|Y_>hm(7K(YqUG#~
z`0kn3E6b8<AJ0E7C$=UeucmalPKCXbN<~Vu#;TmtEv;`wW<9o4Y-y<9pQn<_(IT-Z
z>zG>AvTfq?r>5NFDZGAG@=Q?v<=LzEo;A`EZDnzcTdFkayP#&U$Rtjs)V@g^cHz&f
z*PZ(wGxz;YtNX>J`||s*OkRKPd$^vVk5Fd5&zlxM_GdF*_+4DIy+=>$_w<O~`puUP
zJKfN4*3(S>v*neR_QYMMH0OAEC8>MYrROy0eBJzT`d>d0ar+%s))p!^`OeMl<MZX7
z-F!P;=urF*`M72K_iK45fBggAHs$_HLN+euYk$4$9M9>?->-|@dgbr5_v`xEMYeB|
zbD!{Mf%2WSf(~n&pQ#03emy_<)bYP=6i-`lrd{cYog1zGvZ$ZP(|z?phwWGi-+f`G
zhwYPF=Nj=iefY#+{5eE=lj5;^$CTDHI$hmmCoQ4Kzf>##-ifVid%^=^<?qd0IQ@aB
z=5x_x5n0zzv-h9c4z5mlAQ61Gb~3wBdg0=B#pXn*pk@_|XM3ua`^wlhZ2IMYOyt^q
zxjEnZ`-`d$9eVLOY2M|_FONRdf3NpBLCVjredV#Xmmj`N-&6Nu;wqUt>-zZn>P{~e
znzPTiNWsd&YS*t7r*>ajzUQ6C+3kDY>8;oMB_G;%@5IS%d+x3C|9AhRd+TEJsHr;b
z8Q|5>m9`g^8!c_WuID?q-u{z7@01l^r{})PajJ~!TlZ|I$l=(hMOwOtrW{WUsGHJn
zC|B|8_kp|jYwC<S&NA)Z&nm(CWBcEX$M=KJZtT%NINMVBhI6%mQquvBf3q!>Cq#)P
zStNumVt@bi<cpoTt*z?$|DWuwpLkpE^O4WJ4|R;0D&NOj&b>TK$a2q_7jyPazy7<R
zLpSdBxww*^dw0Konvu?@zW!+9^7l^<+RctW_E%`{<?o-Wj`uFR;VQPQ=X+e-|67xC
zRt9c+azT2-?8&RmBd(~wFXT-;xA+_Xdx0N&>o2~Z@QHoH^o2r|`uSWv^}6h~b^ZKR
zcM3FLoUGo-(-j(X;?&dhfKPFL&o8T5&;L~NFM;<^)`Z=~-);5IzUX~;i*Zr%gYR})
zvFj2$UcR{Gl_K%oc3x^)#;@s1e{kG8%pLh?gNjb<{Bv_vkH}W)^Eb{k=8$~-hvUcl
zr|VK*$1~?@=&if^y{KyYv0p)ZcfT(TNMCo}t@&nBSNntTl<$`vzr@OAyB42WX($qZ
z>s@uFaN+XE#S_jRy8HKTM$dAq@>yp)E+2gN_eqn5?9NzMn}u7}RoEyV?%9!%87nB>
z>s%(8c0|_qb>D4SQy=a4d-GyG>^7WHVk7(Mx8b)Zb~fwZ@U8d1Uu->j$KelemX)0_
z-o0b}hcC;%9kt%OWB-Rg%f21A-M{1T2bSe!C+rV8*v*q`O|y_$>)Ae0Im-DLm&~7@
zeH)tRUklFF*S*%cbfux&nd=WG#3+SH<rTHX&%d$j`e(N{lAPN&9Xjm(yKc)g*3fUO
z89ff}xW_wv)0K&Lx17kRH(7ML{&4CGxBJR{-YoSCn0Ffs&yonbeyE#`f7v8))3U{f
z6)#9$J-O$C{_9KUHgEo`_^!|F!-roBqwM$o_<8o^%a1<~-Yhh|^REgzo4!xsy81KS
zzlUnKhuvm)_i6E2z0Frki_}-2ugUvyt=6Y`w&HSatKk1UdJ3`1JNHJc;!je^`{m;B
zMQk5`N(j3huY$7D&2|%^x3x+W+L}+>EeO<pn#my57yY}zO?UHh#ue#WKOEe2FD_?H
zIpV;z_Ip6e-%f{D?4J$?oSQFIzN?yru}5(C_s#<nhKHI=zpyy|J-}kRYx55ihp*;F
z%(Wu-JZhyJe*NAiHz6SQ6Q6X5vXaewwh8Ux?#J`}&;54iG~~Z<F6VCVAv@WO^XvQn
zt0!H$c;U$8N%J3aoVqZRCq_bi$7F$4MXM(n^Y^}ZGP${C2|qhyPa01V*Xhd-Q^cO=
z^%P$4^mxa)u~gzq!3_hJG7YAmPY$wK?2TCN|LsKEt;@~x8`|qD3w}2wo6ku3XCM0U
zQSQ$q&Bskr%dBz?U-+Ni=EHc8)s$t=())aJHTIu9ncwG09F4VVYJ9I_Tgsz!<UbSl
zqxA<Z^;Rf8NQ_tS@VAM4@ci-71FTo?v+}H7InnN-+<ddw3|w|A6hFM(X=k$KWPBo<
zf@GtUbkqGglY>6^pPKK{D(~>sSWaov@p7a2dTbSM@14`-TJ^sASA@%U=lMEfKjhON
zF-gy27XNiq{CVcAlRPgNZwRm{zdg2P&VG)+oZE#PoFyv0NzZLj?{nn1vE%fk^ah(k
z5vK!f;zmzQSzosKOR($o*d#oDc0sr-Ug-hz2G2k#-{7i48VO6?8hmfLG&E}a{1=j7
z*ube1bNSIrZPuovXOnCeTu{^D$(qM^_UN0=ZdLh-oj(J^%A*riJf?lW{JmI1NN>Z#
zP+J-QEz$Cg%X#+a{ydQN@xX=nBqjqUy$y*!(*N_FKOo$GpWUqI;NSSp)_1imW**Z5
zYy{hvurHPSc*dXqRL$M<Oj_T{ejG_(=&~pxE96VU%2)GCTrZYcTYr0eX6NPH!)__l
zYnarz&V01cmF!-2V}bmtGtX~UT3y_>@@E`}?w!C@j<3Yk9~k%DJdre6ga2U2+6Mv!
zP13)nnO)J}xW1|FmW;l7a#{C=KB?DXx3sm}PNggCQd!^sVUkVV-*?X)|Nq!kUt{_r
zURFkKxg4)sPmKY4fK0%bFFkV(vX*=6%-gfP-v7zJSe-dP4{f};{{P*xiMuMUyPuh#
z^(E`k7M0`sFRx)PlaI6iQuTd}Ucz$Q)!dIxx&88Z<ehbM`Qqw|U*1+zR?I4F`2Ifb
zpZlxR)5UM9+ZOU)KfXNjaP{>SX<ry##zfjq*s*d>Y1O0md2s=5>MAz#KiYZTJXtaS
z#KJRs9__!Zv&tt*;{P>cfA;@(eb1e6Qu+U(cRQO=)xzwAT|Xw>W1q<U@=WO0dC$L0
z=<~Z;KkwerukGJovK)<l@LY4(v-g@Sk9OWkuy+^FGcGrdQs#O&z4p)T9dkdXzdY60
zS@KtL`y0-fqJ8pHy;!>Bj(c=n@R)nU<6Z6^gIjSe0%s?2EaVbe<auCm($v{(ypB>^
z_BsY#%%9p)7cB6X&EeTf7V-KOMv6P_Z>D`X=EXaQNBH>%zr$6s$&Xg0ZRtJqW1+N%
z?rkO3=o8;F_HB5!?5qhx7<;L~{=012#eb*Qdhh@G>|3(*>2Uv3Py9=?O)iGV_)T1-
zF|{@*u;rec<Aa|X+6M3BysSj8q^Ow3&6+GYE1GSmV8*K3+samNo{;lQ`KFN5Cf&Xz
zcUHa${==5%S`v}{Z$hEUdGX8AJxeUzoaZm?iM$iT_wdH4qlTX*_a~=w%Iuz6%kjz4
zsVCP*TsWxUxU)&4a$Z|gTEW4KKC>6B`m(f9yxlp=`g+8QZKvI~YWHPvFXsB)J7<NQ
z;{yR>P2p6rK3TKAC4Cd~R6jfkII=L|=vUAA+}=!Wf{9l+5+6tS`4sngluS9h`0l3G
zUY+jqbGmM_cP-;fNK`HGe(>bQWy@XHb(%vKD>vQV@VvroGKbcrBW@oKZYU9Jli?_e
zHf3yLINFiG{_FD9x%CboSLlX3l?XZ$)Hr+B_vYyBi56Nu^;edCwv`iM?G=lt{1<xl
zU%}S(I-!LvoDSIr|7$9X4$d;PtUq=nrSnYg%a$~sZ)rT)9G~6FpXb<4z8d#DWUKwv
zZ$@IbO&#s4k4@RMbpM`~lS+wJlX74G*z$HGt8!k~A>U4gi|*TZt$x{~uw?teivM2w
zO&QoaW)zl9Hn^eAe{1nu+duC!F8rQeYv5F9&(s%tgU#yX(^j*2W^WWH&+P8Y`E^U@
z*IyoOE5i<}B!QJvYxP$+=PBRs@V~47+kD2m%?WWrw{Gx9hyUNq_T$j%1Kat-PCWMF
z>R&9celCu`(d}k(fT~RJk7*y)`iB{>G?4yzP9xcMeqg?8o{!D?TdHBXzh>Qa{mfV~
zt<x<#Zl~oW)h!#IUN{ujD(^MtVT(K$Thi<q9r63$xgL1g)u8;&NNE4mw?=A9eCD(~
zZeXv}S?ctU|IV-7uMA^qrha?X{%UPi!}OxFw{xC9u6E_rHnA(yR=@J4@amR^-y5w2
zcHT*ztg=M2NG|R5%@EG*Zp&M%gkp@g`t-(s-l==O;k1&7_)@RJ6V<i}9d5l(8E1Yj
zXgMLF{IdIsLtC#-?F#AdzcQ2`KCdx8sq=oRfa#IhFKc$X6(!sMJYUME-fA&P^zK#p
z2V$Oc4X6Hmvs>z-$2O)TuE~*N9zh<*ItuUJ|8Jl2{FW;F=8|*umQQRa9cj!EI<D8H
z@;vA0@0L@~-))Y%b>sf(wHwd%_Psy3L~uj)m9jhQBBNtwXCMEuKFRs*(o6IF4Q?1}
zZs^ifkd~RKxngPa+zr2{9eE?aIb-4mTSeQzS<IfSUMD(54p`~eeAyqXzwUJ2Pq#Ij
z{cKy}lq~0(x7IBCH0|8l&DY-<)i7=ln3y~(Bk5e;_B{cLm(rB)cwJu;VaBk$Na(Ul
z{Yloz1}ghoHD@aRoWJ&DdbUxTZ;}4Z^v@f2{QNQ9RAHyjiAlXDmM6J!%|36lEzPau
zYW<XuGoKy*-+ldf4R7_N_pW8noj2OtdHUJz{;6+24Hhbf{k(qjRW|3_wVls3Cb@W)
z^(Eco`?qN}-^rRz)5k~mevQv7%f9$`dQj(u*As;voUsjViwx{by>nb((c_yQ@<&TJ
z!w;C=J63jP=k2z=-*<nR7pbAG{4vGr9S8rs_Y;1{8oyT#`}9sZ&+Goj-aV@w*PZCy
z6Ip!q-0ao)1)D4GvA9ZyeY;;Z-!kp_?3gL%dMDi8vg!Y^887_bbd|^-)3mn=7N2XZ
z<T6jo$;{qqTlWQ1%f%l;u+D~x8BhB4`^bc%IX~Z>J9qf7^WU_@#6p{kX^VednDg$A
zHpBOGbM0pG-(n6`%J?&-b#p>^gx@25rmQ6z+|?P9#q1By<%!?Y-FEW-`m*)0ll8UF
zJ(j6w-1p<$`ybJ_M3{dhRaYm!xg>q|K<NC(;j2x*uovm>_Dbci<-OIzdpga;>-wG#
z-}a^{-r2sCx98>!7uzp|kCUJ7+BCJe#O!Hhf=QXw4&L<58&qa&f4TU@#XAQRCcIhk
zDRVW)ntu=P2+S$i_|9W_`Hq{yZ{xo2)wh)Q`<{}`7%^LhCHvFGtuy)bZC~!@GWffB
zUyMqqk)w{^SvK~WQ8ia`mNvbTm5F0Jcf!prPP!wl=z!O3*MzB|zjQ>nbUAYE<~y0p
zWska~!?pIej?hMJj{JRln5NI>zLzI+Pp@`L$#w2Sch0ddJIY?H&A3_Ta=PdGeF_)e
zExG(($+;{;dhr8>yEP?O&BQ}JjK5iZJoKnFp*1#tpV^$VN*l~xEKUfot+do!e(8#B
zlz8OHHcR;fj@IuBH?LiG;@E=^_djjWEaJ<#n{(sR8t(rq5)NwmvFcxI+Z_2z<TA^X
zrVCm!xj&9<n<8*~orKR5AAQ^Jx#4#$&6~m3SiG>!EMcm&n^U7^Uh^|}-i0gg7TMYS
zO|1;LQW9|M<pLE}o>Hm04~KqeGUV3Wx-B7T_CsLtye-=|Zf@ST{d=N)`wq4r>#aX%
zu9&>B@s7vkf7;3W`)$=(_zt{VE!$kBA~1akKmW$1uU;&EF!A@_uSsq9UYL7?O;CET
z<@-ne(4IwXZx5`z*^p@F5r5+CjoSacseZz9^RB$M-uT}ndsl5i!G_#3<$S(pWS{xm
zpQc**;aJQWw~(K6V&3i97m||s`|Ix9pz74ylb##>yL?Ig(zzphOxtdysC#anTYcB)
zL-Mi3ziMUpuUm5mUo4MQeYs!jw_?-2<$o6~v^?zW@RolCYtwUqyEc<_+n3gO{OW%l
zr0in9s7%&+YEi7}Zf@xnTo()7=O6T_P`LFq#8|Cwr}zDg)tBns*;l-gpS5lA%@+Z)
zGcH$u-s~vzHOkh;cHZth$?fG2((k?beOLTrU4Dd|!P0kg`JBIM-Q_41Ui<ONof(VW
ze~4GzzyITQ{G;|sX$D5^Jl~Yx@lUz5!GQbhmxb!GEXNzRUdS@}uwVDjWtI7%-{U=}
z-JZ1SpKsoZTvy0Z<_A}M{F0s&)>QZ=y)p8f6P}~Y6Yv~m{wnBP4s(j^v}Eh!&qW2C
z54>Lgt|XV`(TRc&UKLu0CLi2eu~A6CJkGc0W_ru-ccJSP!_x1++!gHjBy;_vQzq75
zQdafz@S4j-?XvrvvQ(R^eOs*J>v=(n+A(dL9;FJLy_7fip3iRcJk#S_UU5fn=ga##
zGr0Ur@Mp*Ee5TRsuYD89%)Sw^_`dRrhQOomulC;b_+MnWF3<05z4YYHZIRU%Z%@m9
zaa`Vf(fPMKGy6)jH(yJ(KW<dqx16<m>shH+Uj;T#v^;*yF-x5PS8wrqJKlrVSL@7m
zc|OQQM<7lzk1$JX)2Qn`Dq~PG@$X0XPwH>e_qR(uyvI8?r|}W|B=av#3PO3jvAb&z
zubx@^_~7iB6HE%TFIA*OT(`>n+2Cj(|0-_HcF+`8BroI4e;@mO`3=4ZH}z+T=f2BX
zv{%8XYwf1lt<B=Sz17%`F;Cow?HF?}x48^F9MRbmYJ*KTtWDdqNxf8R(+%UeeJzDO
zg;(d*nAlxSvXu@#bJMIYVEfv{{K<MPZ>4wEW%rnWH&giCnCD)+ciE2hwMQQ>)Z!O<
zHizYt{UYANp4S_GHN2R8dv=4ev`b4+L9%(h=5mw&UY!SRdz8$49Cocw$l5=fF?*s_
z{)B%$kTcA4e&4*cx9^SRpL=aeA@di8%+h|-z-?l(z2x}8F#BE0y)UL_T%R-j`w5o4
zAH<g(?^1DHY<|sPS;f%{J8TM<Ih=7y)BVG8|I*)QH<OGGuC29e59!xU*Y0@EkK+h)
zYc>&%T}C~(8@Cr#y-;2y^D;TvO(cRfci}0`xaq>6MT;9gZf-TxdjHHpEy&jVOYKu$
zHkR1g+}SH8pKqC{HD80JamugH{_$%rY;As86uRF2j^yFpasDd>Cw^qAH#T)YCJ}t|
z-$x0K@cnhwpO)EMSnv3^G;H<5JTs^Df)Bd{9<M#z{rTV3qbvW*F$pEQq?Z5Pc>KKF
zT+0f*BPDlor`w)bE;s4H)gLL7*f;Fo{LpWDvaZ4DA2!W5m-4UPEH3oVUa?*8W-N<S
z?Xu_#Dd+1SnrnS-7XPqA-$_aOUVV$%hkcfE$(6UvpI5X7zU+BxpPra}bzSr7>@#_<
zzgD#-1@TtQ$gs3I7+UXn==wMJ{YRIJ+p<q?^15vB{&)TUu6?gOqyAfZ#GJaE>CEs|
z#^$25`3>oRG6BC`dsdh^E`1eP+#Qg4`h7b0{>`nX3-xCQ%n_6L|Km(<{`<feP3-cI
zbL|o{y;)v=O-t&#D_M8I_$gl-Z%1TladGzKcXQ$)Czw}l?o!F!IdA$RGxKbbNC8O$
z2Ioh=we><@-s+Z?nzr66dS!2ehx)p*WnD7HKf3R^eO+ib-*tC`{*1GoK`Z&y)iz!=
zo8~Ur@{9Rc!Hx}`7oSgFFx`zwE9I{07RhbrVn3G{t8F=9-6HU#b>_bYJ{|AsHK&9a
z_+|<3V{_cg_+t^nRF;=cZ(NqxGCopuc<5GlqAIoL^DFtdoEP%OJaV6Hc{swYd6M`U
zr<QgzCa!5;ztHYLxx4xHJR?!D`o6f%e&&*U{PoO{#YeU^)c&>3d7pgwo~(_*t(dko
zZ;$>yoF8nQX1`eME#bK>p~GMP&)=J!pCx_s)93B>uE+26zCC0%>CdqlI*lolcb%NT
zm9lLahbw1vgV60yUPU|JsQkY9ea^dUyKm=7cHg|!<i)D;^>Ml1{P694yOsxch#yn<
zsN5T;d*)<I+);+W_dbu0Pd(NsZPRnGvP80^{CGrYuVqe$;6cUkAZN=%3gQ_aZ6(vi
zr^Z%qFS1;7#alw&;qk|Vyiw1^=It>%e*e91`J<`Hwgr<rbK5tjE>o7XzNVeBJ>=pm
z#vK>dnSHT3QM^>HX@X<L>m4!&%NQqYW$3%8HT8Asx}%K~wbECIG)-N*Wy6J3y?v)#
z=O6VEG%eVAM0b{Y^wD1@e^0Cp>G^6Zx3js8eV*>7z-%eWNju)XkP4PF%luU~)4<bE
z@rh7(wBfX4=N>VJ3(wJBu{iYo=E5wUYwo=aH||v>FqWRtx$Lzk+`&`nb&X*4qyyGE
zN9VnHcj?3I^DmP4rH)-V=6~mn8?z|?{0%2rib{^?-E{R?F1b14d)b10h368vdukmO
zcQ~0{U~7H6^w=>M9sd>bK1YQfu4(i(TN!lJ;H9tD84vaKEz9&HcJPLEpI*XbHRZ&I
zL(*3)H=PVio&L(D_1unG#+TW@-tj)O`&-t^O!kFcnyc)8N%`H3iukI%tof)w!mAs?
zU)L}H^;|MD`qkWChMTOHXVpa69g*XEb5r+WXQ7m1!c!K#Z!6hj<CbrEFv&i)U3#kF
z>Yatj=ia<Lyf6LS-nR6e-_B0B@cX+-!L9ve%Y^IL{m<RFe!IKg@w|g(*YP~nsO`@M
z9W>lM52`4gWNGaBX)XI_Zqsh=8rjPNZ$BN%d$Gb$`*6nWtiW}pymRI}U%i0W`=iFv
zX$kD*?jbAX5_a_lvt2)A(k&lmpnQCbT}^!W{_?Y|f0ZpC2h2=zea&b(Y1a3KlMDIl
zj=yhMRCM9hT;7eIq5SMe?#VLRN$@}9;eOtH=EudP2ydhFXP6#*KKG{ihD}H=->lrG
z^PZdelZr#kxOp!g`ojNLWA2pAd5K0}4yeh@l#J0jxBU7=0k)^d*BQ^<SJ%MFo4tYY
z?NRX$FO=f;yxA!{<*26Tj!OdTYNl*r+1T~oap%7cYkzCqDp(_ZcGBBK&20u-ocP+B
zt|=?7+*8f(H8+OC>AoO`R_xxn{V#VNTkR6|%5GiF-v{9ei7^W%iwbG3`kkYxy~1&M
z+Me0sFJkNdsW@s^$olv<8!4Cd_nzwBXxx4*J>>3zl4&RJd_35t`+Tz6L&e3F*|&<f
zJua@?F14U4blHMazf)a;*S($gQu<5y(<t4e?He95h;CBrS>3$+!uQoi3LExp+__<u
z&#ec~y!S+^@+-*2NNo5re|bodX9&wx17ik{N6H#U#7jIDn$A~f^pH+ZGcftKLQt=&
z_sD9UrSUCx{>hVDMT3ve`7=Fyt?R)%8gu-OZbvNN#c?=7UGDGy#3cvkoBiuQ@FPp&
z$`c7UW!;h)2RDVEn(xxO^R_~w^o%J*Pr`G5?P8e0%k?(VVP1t94^zMz*N1_Ii|cit
z*97eCsXKiBFb9wJX6gMuCb)hT_BrG(H)~Om^Kzv(o)vt_PLhrL>!)rqW0@{7Deu_g
zx@BfQ{a$A6Eq>SMTJ~L9A=Gnq!=~PpuQL=UsI5L8Vjrv4{q<+`>gV}u=k4EG_3zrN
zpV6!L&tLKX^Zlre{wsrTr-&5qimcM_`)u8P!GJej;r6pB`yAtToIA8t_rU??gOaPP
zjenL@zH{D@=KDd^sE^s@_=CG?8$Z`wdfU9aPT{)P!N6mC9471NTyNfXW@-KN9cK61
zDlQad9^c1&Hp;@6%_O3zjk8ra^Ys?T8vEpGJGuXi&iQ9;|D4`as%yobw(;piYi0SI
z4BlPMFHV26O}fWWar=wzdd=+kTlsI6SH&nFUq1iepFjWX@68o<zPy#~&-Ggy+$a6A
z{Pm&n!nE@oY7grEJwEH1x54D7nEUmu1`O<C6K`JnTo@9=-Bz_pM%hhb(o2zWmz>jw
z7hgT}ajKcm_o&m;+$%Yb*QWWcIkLl9<)yCT2Y$U)_G_DZQ<@&SZ=7Lqq<F`Y1sx5K
z&SY$F`nY}3#pz~oGeYM4{b*e&|ME;)ugv|($L|?l)xJ4#xAs%N@PV!UM%S_%X1tWT
zX#IQcxw_T<WsdJmf^6fXN}0a<AGgyDQ~rO0=Ro@F_TH5Wg^?@_2jA9Sdi7G*`Tm}t
zD^m|y9F<@_D{rmW^0K%8$(w_p*GgJ${J>%H$^Ul$b5^^TnG@<Khb~+7|D9>4y3w(7
zM^jez`B&?t>18|nf8x2*>h5{)@=V?H%v{I(65f6Mmt*<$?a?d0ra!Lo{d7;geAyk9
z7YY6oN;Vy6zO=DZZ()4KCFy(nwmfnV>z%;%{0)0RRT_)a%HL0{k{w=nNP3^k2#>mQ
ziu1SE6x)bk-}I|?^Xp=QFFauFzb2Zqv8h5#V&W=R{o8$0uU?<>cEhGGE>%Tm_!8CE
z&wr)!YsV+n-;SD3ets(FP>bBHJ9WXvr7J9JG86q2nfCnHbVGbjy8ouFdZ%q}?JcX3
zPx1b7E_r9iy~-uuZhGcyntWsK^T)@XS=C(B4|y(YReH2^iLzqFBPS2mr);O2y#rE?
zb10pBd$W&K{WAOFTYUa4XJnr2jQFLbcjBDfner>!4xLNgtJm_b=JNI`mG<1fF9oD6
z1-~;CZn+*Mv*n}3g*O6~rWe-ES@4_T*NZ1lilvHPzx;9M9J}Os8+JSSxqm8uJ^kb3
z%{*O}H=bd=HPZuYjt6(2PhR|av5wiz%(tutTW9yLWS-0Uez{J@P081+4d-_1s>uD9
z^K6>OcCXsX^TbYF<vfXFsVdF8{+GOwdoo2(dBQ}V7YBuZ3F@k^uP#(H3_4-m|D~a_
z#pV1<rr%W>s**SSU$A|hQ&(_->xfG8uZeXA;;-iPZMfgx?Wx`SXW~19=`)^uZFkd9
zlf2Pi(za7V?^E0ABTHmEJlVbq@A9-=KK~8>qohlI%JoaupHWq-oSUjGGMVR%d)28J
zp7SrY*ylR<7_FFpA^25g>{2oD$$nBlmG7p?85(}tby}mw_wYNrhdCEdywqmD>)>PY
zO2os8+b;Ikk50*?Q|DTD8$Ew=A<FVZ@B+PeLH^A%oA2ea22Fmp=geP`#<i-)#9kyy
z%{p^*g%fvcBx6)G&sy=09I4r7CW;)~)+Zp%mi7MJy_yp~t9KcN2eNEiClTG9?A`u3
zcBZ`sQ?!52+QS={CZAY$=9PHkTK!|!9^bgs=pCMRz59TfK(cf}PG<hi$&&AxHf%N7
zIFD`Dg@>=Fw9Iv$vhni#wb9aRcbh6k+*1y{v$jX)ozMAIsXXQSTO2$;tSgmH3}?`_
z5=eEwp0MG)O?K7O%y7NizV@$nZk{`jxA6Sm1?jf8i_5KTw;!?PZ<^PebAIpJFL%Vg
zt;u#gzc%Om-?v}x2!3C~Zo7T6E&sO5n_pNcy|~Fy^^V21dkT|j<D3oU<*Uz?{meKk
z^S!agMEud^m>F$z>r~ReY;LKwIUrfL?t^{Jd4K);aeG_m_pJJ=$~1q2Fjr5<?LQA}
z4#?)rIc;tK!1G}S*F~Lr_UpF~yXN-jf6@Ef5&izr$?REb#@6nI%OpIPT{t~$f~L^U
zGpDEQo1nQ+(10t2ODLS%&;7pF@2d3p{L9~ZPi>v@_{~vG$Fl8{-=s}fD&zn1c0;v7
z(szX|Ol#L}zMb&qf>wFYj!>J6%JW`$&U@iB&m$(mZ{8MDMgLn1Q*~yk?`lzhetf-h
zn}lbZgsq^nN}QIybBUt!p$Q8%m$tp=QLOkf@tmmA$N75VbIk2^z8^gPe$Nea@$G$2
z73V+66ndEGKWm$8S?9URy9?KT7U=r?x;{i=*%OtzytA9Mwk}CA35f~{HeEU`Bqc=m
zLfxjv_gi)?aMl0QZS~ami(2yXwd(h7ueVk1J>N7*J7K3^VQ~9KHZPxMWA>f-R*zq9
z4HlkvBr|8D+;8bG8gpKLv0B;Lx90dkHe0TA3yWGWp8^%zSGPbsv%PUyNy@JS?=NtF
z*t6`qzi&p0trSSl$uDdxJAIzX>|bM%e(r#eZQr@i)n^#X9(}#GPB1<%G-$`8E7{Ta
zOz&&H{3%l8?PsliBt~k_(hLRlBQaY0ml`OmABizb^8V=U*Riwb)HEh#*WD_$Gb+6v
zYt<b%zsB#zPLnVERgVtoNY_YToZawsy{E{DJkGN$--Hr4(sb*$_Uzxb-Qd@2@p#7@
zL62g3|M<++oBJcsb^VSVvzYh3;Qi)jUBh`aZg~#p-bYNid|wXfEScLk?TqOyp_-$i
z_iR46-ZZqH8)n3w=KVo*de`Rz;;Fe0I7K?|^ynT8kI6sB7(c^zgLAyq(IU2jZIU;)
zhj|~}_fekp_cgIw=5Jc1Z_9KWbuIIqX}>6E(cH2bhZZGV4++qoWs-Vj(UWO&%j_q<
z{aJCPYne~%)RxOH{AQe3lW;sFL3@@#=?$mn*FDn?+sbWQ^fIVj_e<5>I3?@XA2*2l
zPTO@*sA~7RX(z;-szr?>Hs<?mOWI)N)ZDt4rSQ@HjEybtw#cd}wa$-NQ|wvad{b!G
zrLu3c8+0A+?|Lir>tdPG&Jaz$-_|@cK7_g**I52}`Sym|*I_;{7Fc)ccTG{+u>ar`
z&f<V_tIj=N`<TiOMmHS&(s;qFptxb@;r%aozv&+N``YI8`l&(7{Evt)HMd@6=JRrD
z&#KVCET7QxQ>B7KZI&JjF?C#N=z4L@#_MjMe4=)2%YR<7`1G4yZtkz#BDd}^$(<E{
zllKx!vw8RJXt!Qg7TK3PY06$LH)qV?mr_mE3S6|~hLrk}&7n>$D`($Tu)Y+a?vm?i
z=I4>Wx`pGjjp1bzug@XMF1ZiQ{7xjSZsC~hw7YXofT?O=^u1oeOLtdo>o)c<Y&Z2%
z2vv5;6}0d>Q8qR9;n~SjidmaGR5WjgmOpG~y!#;AzSL`qSiz*0obbD?^94%|KTR+7
zx-#w7#3^5XHy^PR{!r8Z*5TWp%%`81O+7z5>=b9!y)B<AFQ0nutNnA?)c$+Lmit6^
z=bV3f<lXC)PG5KqeGp-_dE;NDv+Ipdvd{0y@^bQdtV`-js{3s#)U9{h?!I}c>+qeY
zE53eR@p;ZCxdm~B$9_+1kbd3xJyKB7!6!^lC@x#qX2yNC^Bbpfp3d2~$U7`iG4|Yp
zguvY%TDN+-c(XbkH!tZ>5-h*=sdj<(hr1DqH|BROU9dZ@XxHlbuba09Ef)85%(rE|
zCB^k?wd;z2AAi3prL3vT%g{c$Jm5?7*E8?eZs@)kJ)6m~?Aq^B`}T3EoPMt<^ss8b
zMaJ3`<$XK!g&tJ>zy4mGXYTu$o9C1&x=w$8?Xn<LrH++7bIqakCwpbQ=W7YoRPQa>
z5^hxA8h`vsr_#pt-zWS%sLZ-NR;7;h|Bb4i2O?Z`d$VOq<P<GhlfplA2W{VHz{K?H
z(+h)|pV2C!T>mz%b!aWwckD7dx5~oZ_p14p2qyKkobw9Qn!;50M@6^)z0s$0P7$&@
z7l?YsY3qlq^o<L4x2kasQV;7F^;qhb?<>2rPSi6_T|K07#g1it6KrNN2dGpgo!-Fo
zifz^PiL2y%c{C>NiHlnyy&}$iRh3EX0*_C>Di`K0sQwgcJIf_NrLuWXz|wm)zOtH?
zu5JOgg%w*4apfgM?b7!3o*1`x`gOw$X^!P;!siSguk+yg{EN+3%6R=s<>dkT(+=%<
z=Xl$Jd8zRR1M`g@T%W5rVx{sxavMT*S}W(a>}#Ak(a+_u&N(H`Gq2T4US{2#WmUvw
z-5PY`d}ijapNA!0{?XrH%o;R3*y;Drvl;bUMRkoly7wjo>F;-(8v1Ri!>gjIpN%DJ
zOG>APZUgh$9sdcWZLn(6G;%up<O8o(PEdMiN0>sR+r1x0C+MlKU#YAzLET%-Gg15f
zqoC|&&KhsC#^;@DU4?F(%d{)4<U2jfN{A_wZ<AK*($k5VN!2qhnMh_jAN={Ye8!_A
zMf1E`)c48B-DrPazRlf0KJ$OV`83X;9a|-<D|ifQvW09PeLp{~_|vsrYP%eHYVW@|
zV4sxXrmfX(8K(MXnagdZJ&AGu*S<bu)H`j~*}YfnFV8jY>+6&Hmh}Ecq3!*d(Y&#j
z*Wa@`{j)`FTI}BcTfYCAyfC}>dc4$*mGi~yql)ui-MN)qylZ;uqkH_Pw?5qXU}D0a
zOD!MYY_y0zJjKfQ_x4YTJ%{Tz^nLi^@nW+4|E|S7$4^Z1ExvO@UrYC?v(pXLm!{EC
z!TFo~b-b2Ty?@lWx%dsIRg&*{pXyiEzt^~}U;4LtQ}d^X8z28%=H7R9rRDF3HQO_l
z64y$~uUD9RVQc<-1O9iv408S%-mJX7h{yKWU2E>$Qd8ME-=%pSz7S(Qnf*`iTKQ>p
z)&G9}|9@EJb=ISvomTgC^3G}-7~Q#)x0rv6?%gu!y7Gt1o!3YIF~4Kn6ZYJE@7-6D
zZp-gpe6a7{%Wb#z3+77CUH?0>>DaE8KW01kUrgVns9V0dg3HAJU-5@WPrm&4bKXCH
zM(p1&PrtT*KfdJ7joZJ^U;B9P-pQYwmF53FGH05b+OU?ryZOTUfc~4kKlk>8$@m^U
zDElL3%d>6#ZA%=|O^Vg7UAaB`;kifKo~F8p<w&*$Sk1Wg`8~_4zEkNlvfkc}oEES4
zC9@z*^J9{K+O;EQ3qRc0x~B4h*N){9)p0Xtxw<`Fm6N_n>#pSHDQBbWP0Z_WY+v?%
z$JwRnJKeWmyOaOx9Q*ToMg6|#S6ypsnYMMWwuV=MeVf*m>{}IgUcL0)YE=C1_B_9{
zUT=@CSa|)!>FG<K6z4y*FrOB^viHdOgG+T9-X?t2HofySJmN&8LxF1UqkFr))qhxS
zxX1YO?8i(GT3=RO`@J*1H^Wq%`@{2!l!{6Fz7;i!6eY#)TT;KNjL&_EZ2sMCFWN%`
ztooMPe9l=NqpYu?`0>&WlYHsb>vE*6-mh`Fbg+NI#t%oz&g(>dl2fqwepVrLKc~;$
z!~92;%xeEeaW+g0XVE`txAINs2?MX3?>hghUN#3+TzFJd6t7%w7_i1V-|Eor8>d+p
z);Dg9d$jzVuZ`i|-52y`Uz;LV=>MP3Zrbwp&q5t}A2)nh#k+BB?E~N0!P#}M@AJOB
z8~f(?zLiy%xqok(mUVMpV@mah1)c4`!+t#6cin2<yJ*R2FSecg;=Xd$!PS48{&|G9
za-=)%KfFU>=^qjEz~2*IPIY6=6meE@ahkp3$2vXDf8B=8JEfK5%>`fAJ-qVdw2W(Z
z-$DbqN<O70XVTtCIVJb!P1|tbzjVqgi~F6n{EwoiFiqBpIsHBHnoFHQ=o6;1%k6(n
z;JeTrV8|S}WWH2ip3edileXG?LsQ%TTxWGW#6(+P=>3i<*f+;-VTs1`A19OUu6Mtm
z853yAd9>C}F7xZ_pG9o@-~2LfQ#}yIZTBNVVMf}G?ct5jdQPxv&W|wvHpgm((aOo6
z*e{&cv@Cop|KqOT+$pEx#ZIVIv6a55`>D&In11e(Z1k5|bF*tt3b=&5dVc=G8iTux
zyJNP_`d<F+N1lmM)|He!4b~5qy^(&f>H8;Mqji<v-u=D(d3C>g`u{aovo82(hV@E?
zJF#r-^RKu6U-L_Gjr#;whZX0(`rrBg>R#*I^{!`r<raKg5U#u^@#>d^OYA=?{W|%l
zzt?k2ahl0kXzBh|=4j7<?MKE_@2Y29c|NV%wJovLe&*SJEr<R3Novxs?Gq%|yuWj&
z!Pd51Y(e4~E9aW$`nCmc#q>mPe7>EwIWlcZh_d9eI6k%=Qma(%ebYN6G+p1#ZbMV#
z<sEO@>*ZBevrRLr=@XlNa?2X-C-eB3V|SJ5ey%?9R$Oyg)s!h&2hLhO4YJKy&R6=X
zqRBB~w#O`Shx)1~QoV}K;<h_Hrtf6Q_U3&ZscL+zrsaL&l8STzhcm0EdhI=ASM%qI
z&OV(7UB2IVeOG_()NJ`bRZ3aRm#s`;!;gi>Jm;?4zUNzwINOd@SC_U<@O;0sJgrZL
z<<HR-A$#-no}E<t(6+&%RO{@=D+@P9Wfo7mxZ*x@>*J;F&HE;>Dob+DnD|sHq|^Pr
zjm_F6Jz{H}B^gDZU9+_;iv7HB)#IDI-(OgMG?RKIbje#O$Y@P>r|{NqB1iNVJ<v`K
ziD&&QQ^R}h(!O(y^ESva1ZuGhxU=lc*~!$hQmpRitpiJWi)yXQmi1X{HUIp)wrH39
zlh28N`05_}Cv*SN`ONpImg8;Z^S}$oST~vZY-isZDN%f5!he}JAC0!?nd;p?u%gCV
zf@lB2g92Nptr6DWc>KXK&fBL0#A>eR`z{yI?{R$OF10sm#$?XDU5tzF%{<nx-OFrV
zA<_K#h0%+5eH&Lv72gn0ZgO6?q^+pMQSZV8o|k(1TD!mHJuQk@Io-gn;n?G5=`H7U
zZ7Os7_TQiV?uhpBst0PqxA~G!`?%YbtqDJow{p={=7NQ>xi3m5JomC?QEdKjt<bXR
zEt5hvqs-z^t?Q>_x|x+j&xNgI;jYh2T)4WSMsR{%_e`a%2U(rbI|8yoH`aZsOOY2%
zuI+Vyx8Px8dUwv1S#E7A>#TPjo6_z(YhSFIPmmAC&Lh_h93-u~*<*H<ty|C+w)gz8
zl^Y}EO_>s^UpKN|G2HB<{V|SFwR6p9*EgO_?>C54Z`$pBINxq@w{3=m^KXIBEf*b*
z9#+pWYLt=P=v^jwIrEs#wY{<{^5+!aU`mb;;8-_-cZ=i0ij^A;1y2jVVh`TvVv+q|
zlJBYzL!YY2T*jA9YA<}reQj&=(Jw|T8~9Z1E*vLzu)XfAymLeRKl{M{RjcavEj%!-
zDqY#3?BEu)`P29}wli0kdH>kQ1{rPNR?AoW+adFyxl)O2UdX<}XLXN{&AEBG{qO(O
z_iz8-IySN4<6q1A)>-#*CuK9-u4I+^rg0&5-qKe63$>LIc9xSRKA3eDZwo&4?%Til
z&-eeyQu!IXE%mr(=Jh*qiW_y#_P8ycc`@TyQ2MpDr89rM)l<4}FK{&T`LP*2H_fO0
zYu~24{ki<d6QEr!;->E-nll;n<XI(!KUxSIPs!gu`D2~>hP#&4vayPnzE0i8xO8*C
zrPURRZ-uVvH^(#ge9qDL*e$w$+9i$&&AIL=fwoD-(mrg#vmeC%Xnq#)WWrR&bLO-8
zmszRTv*_{(3ZMSWZW3_f-9e>xn+oogQ}>kZxLz&$TCMcvT!Ftw84kBUZ_Z9^wDo9}
z&t%I#dShlF!;HI<wGTEsAI-UtA$~@!*Y3m36<4@Q7an~k|7P(Kjpc`vl3z@ek`d(A
zTk?GJ`FkQ(Z{3#}&fHUVgpK!Y0rU6g<qrha=k0&H^x+oP$w$7L?3mZ@C8GH2kzrhn
z{mWa<vMCmOUPqq%m3Q>Hgx7=SSikpjldsfS9P74v!O^t$aAL@#y>ojz;vesJ2%0GS
zp{6!rzCpWT8{a;G69$`{V<XQ=A2CTjY}0)A>H7T>E_2tEoe5rkwxP~F{prmUGajB>
zp0YFXVx+6_;bTELhSK>;%Zyf)uj-p<)T_B_-wNx1+Hh5e(DGFbzFR*o@>1g4x7tif
z(P{^?bpT^#%-&m-UB~~e>r%Y1W}?;gS5t0(n127z^wKXKH=7NaxBUA$r9kV`tOG_p
zJ`4+Xu(TC0uuEiZHdNr)VVGnUyqMoCX8HAo_o*vu7Hwrayy56dQDJA<|JPTU+oa|_
zxHUP%%<N>;k;^w+#D0D+RCs7#`a_%{`JTZawdO>F33qre7go1^6JBq4+ib#Z_HFuS
zYj>}k{FuonXU_uNfD_E;%Vb$a?kPPGG*hnEP0I;dd*atI`+jDfh?RGK99edz+TKB>
zBBfDdRo;n~*0mCltu6QGYXwR&>9svDOP*M}Y@_tNsTpT@4X^h~p1HK(*_o?(Ydd0`
z?HmPWXP?;q<#6tz4bxVBIu%lxx@wP6XxvP#_n(!&J_&w$@y)7*I?p)&J$z%I_wTdE
z+gH`Rf~LHD6G}^+{3bkKW@ui@8~i}9u{FytG)?b(&YE?Z$res+l?QGa-n+Z(RdUY%
zirsZC=2A_OZ5upA&zfF7RJ)S<_dSEsA5yQIXL+)1<Gr(%EzPKnEy_>vUXjdg>z4xO
z(o0Uaow`)<YU@na`jzF&+;S3DMZcRJT(ao#y$=Nuzc1x-uiP$C5xdni+j!mo8-;&O
zS^1=1JoxhF`sc^*>vy<xsd!8Om>+gd@USTNH-A5Ymp_>tKkfZIzmLzD+1qJSVwo?m
zNP&-%No<7KnXZ)&SIX(TF(}WQbdtqJX;+%!<7>0;-{?y`X7RRB{!ZomRmr*r?;|E}
z5sUa(ZWp!j?(WO{IfiBvQVskV#SU_(d$m11v;W!Ix}4|QkGs0(-&>TNfA-1iClBJJ
z_a1kUJ#Q0s!|}hxk%G4j{a?)tK-bk-ThBe`x4J*h!L}@9e@upN%YJ*=n@b{@|0>Hf
zJio;*>*V-nPX}YczI%>q=iLc<^5?F<iRk&s{Q*0EGao*Z_3M~)$;XVFw?t&KCfG{<
zU2*&0j{Rqp*SYpBs<luFbAMn_Rr~F)T~(|3g742?mAoz~D_DR2;?I|}w>rIes?LAR
z*(iQ>*Ntgr!Rc+OJ#ET7ONu8R`hU0JU|i_(fG$a!ov&E(yTji<vp#WO;HOkv_|0|o
z$v4d6GGgw(PkQ&W&RO#W^UveVmRIlZxyk+LvFNvsi!JlrKP<OksHn*Po}ip@QDZ*C
zoL%f{RdM}qF0-DC(`lZwa>gpDX_Xbe57zr`N_wRFoJ*l-#>%JHWcbhBxYHQ0=g!{s
z9fxl2n><hM*Zu!9pYE8x+qb_r`cs$tvA>7Eu`af>{8q~x`=<8y{no_ym+I%bUR$xC
zsx`Q=&1JId>T_GHYGg_>-c955So=yX$gLqfvTysf-?wKxVpq3kim1yfpWgf>>*de;
z6Us#<b{*Pd)m`KAk;S>`fx)u9s)kFK_P4%j<7n=3eS6+-BfI^Yzp05!7d%_D=Xm?p
z)<j$TDrvUT>fANwv?EWlZ|#lz+r)G#dh3?Fkdm9*MD6t0GSA;$R<xO8`>!DR{`c4Z
zWwdaWiL7%xlJCr3ad~5CPVm}F@mmjaTynSN96UFFf~~^(2krB|)$c1=6>}|B<00RF
zaSgHQYKNz|F+0uQapxPG-Wr=r4SgI{b7$0EyYlXj_LEiWry^|Q0!>%!{qm~jKkr)q
zGS#;_{)b-2`m>cJZF_Ua<4dK-mz1uSJxVG`V)c0{+je?v(GWV-H6cT^$7O-bigwrb
zq>E94V!4VsMjD=XqWS~=XQl9Zt`CquDQ)jo%l$UGZ^!uvm0Q}n?bq#MBIKR!F@`Pb
zT%DY>w0xQ0gHy~F#}*r@xJ7gL|N4})PPI#ads8a^`E6Emvk(726_ZncCs>{T)#9fN
zfAd55XEL-c?R{@j$lMTJCOM^e8Hc%2scQY5-51}LET1y{xKM1k)syGu3EBPk1#)ba
zzV6*Ib(iDYMOx?d*x7T<%DSrxEnkVvo^hnO@q?C|^ogoDH($9gi7qgIAsAVlyX5{W
z<?H6(o~U<uHZ9<)dd;A);c&5bK(pMt7kdPn-#=!LKk8yQ??K*~4S#n_Z$7~ERBSf8
z^f|+db*(qMqU|MnRIV#1?mqI)%0v6N=k3XxCrw+eSMul8p~=c?@7#R3zI~fl!?v|+
zwmi);T%f%(>dfTDYcJiJxcjwYp0>jszpzK2wyyR&y*$>|@>SAO_srsz-ruHebX>Gw
zY+BnENzN|AG>$DYE<uOytWwT3UUcwFRo$tlSM?qEKfM$`<gxtHdIk0HTYhgREtXFf
zS=DH?xbmvsg*@ggb(Zb_B0Dq{95fWKe%KY+Qn}SH<C5;RQm4u9STuNM`TrBz`By^P
zO8arq-sIf<<vm_qjU6K5hW`|pb{H7*y<K1*eQJKuTen{#D*ipO+><`)oj%wmb7Q7n
ztVhBBsuR=R9>1~4?(u{wW)`=%A2>Lf4^(pPjB@(RXm|hCrAfknvRrt3CAyz%+i&%7
zcWQIkoc9-R-mCv|dt+HQ-@OxuAD?bEKm2(6@#!|tpGhWesy}eWZ|lq2xwl*7gkOHk
zxWzR`f;HMyP;g@JU8ZA!LB|8RB;EaF-StvrG)rYV?a$5L``=+n@gtS@^Y=@>i;t0+
z8_(x|zv@`dgsJCF9Q<dPs{WUs*LUS{u|o?KHk~k=@ay1(<1fU&IL_7Sa4X*Y!0L$R
zyD#^+rukjcyEId3)Bn$^{|qj~pXmJ|E~r#9`wBzgq?nfl=U2q<p1!2TvtZWgo3pfU
z&f4xWJ2_Q7Pbodw-?;z96sOHI0=J7>OV_CtSloFaC8c?<v-`AddFzHSSH`<KepAeo
zuKr<8{^!xWT7ic@`=^#n{sbG7&z!x_g8s70*$6#Mos@X!(ziX0DjRMtDcy8r+SAXe
z@5MH>c1!4G);6pu?7e96PUl&Hr^|YuMyV9fM46h_TmQ8fmfYoW(K;f%HBRYjw?fe4
z);XPitrgSud01)Ad=b(!`9-%%$Z7u-7W+L<J!bJ$&I<l<*Kq2I#SS}^>h`%Z|2l1*
z@KkogC%%YE_BDH$zx|w8^{M>8w0(!(oX-&`Z?&9oM&U}wk}oBbCpo-3<1n*5fUCfw
zMg6Pfqol5%{!_}9*addmSz7$Oxc1zGW3Sr1d|eV=s2zL|IwwJOx^D2?s($B!3Hc8b
z)U8GKs%R)ZJ@+?2BWQ_A`<;dTb$lT%qHRm(vv@CQDr-=h_)A?+<GFkOX6H?FSv;5Y
z?UJAL)}vRi-CfV9`C?d-{8#3uhj;ilKbi1y^5+=i%M+92OSeyEc<J`))yAarN4A~g
zYnS=GLS6mf#cq-Cj|Uag+m-8*s@A$#D0v@aZ=WRF7xu?vu8W1zq%-X9+SW2}EBHK8
zuH@axTDUyoCgaN^>p3+GkGg2NSZW`$Wj)R3V?XcT-Xk|TuRm70zlr(OnS?KqJB@$E
zGaR?eU6}rUv+(Wo>Dvl?)BWzJwk}HTcA6sEaf-|3DgXEO`2WY3FA_CyEBZU%Z~67?
z_E-N)RCk76`yYAye0cEx_DwmF3@daPLc|!fxEZFhHk@K|NM&5Gi6MY^VTJF@F%0<h
z$-VOD;yr%?<Nj&r*H1w=SHwYkEyIPQKmS!}GZebop4{Ql^n>H<L#+n8>uL&@%`cuW
z$PljKV%vRPY2yw7mT0}e*cGZ#u`8zT+!df#@oUkCFWt?@cRGnMU)rYOar?E_0hZ!<
zE186oCv9R0F6+1!$#F8gX=T&CKT7VmC$zle6t$cb9{MC>_uc<NT{5}bx9^_;lIZ_?
zTBB$SujJBwCzRY{<E6rRDk7hE_<8T&VCDXI(QBELtXC|xcDV?ci_V?=Z{}6YsCf-4
zpWmFGI+f#5dha`yS2Ch~E*Djsesu1rZnSc5RaOjB%y?<#e!J1ioi%ad`V;<V&c%gH
zl((#&D4!SicAt#ar_V-feFB%P61sh@Sp7-cm3u0Bg&x`hEe|_xo=INi{dB$ig}2A9
zOn-Ik$@l)1`l>9Bv)ws8mWr=4_-Yh&DMK}s?bk)m1;N^r(gPNJVk`N&)@ttiMfSIu
zu5t&h(wOM-)_>oriRR_&TsOPy?0LIM=IUf!_o<12o~K2BJiNYi(toznl|~mL;?|wx
zw^!ZpsazvqYU7E6UZH!}xIB9<d@e%Z8TZ<dsj2*Y0hYy*yJzGadAmRQ<f^&_Ua@hx
zJ1<vfsjhx9M|E`)&!#h{RKok;x_Q0P3Eh-so%||C&{@6y<f^!1J<nYoC%>zSP&aw`
zZ_c3woYzviETvDJ+HrK+8les9tlnXrH(Mu83bl(;5x>lNy)tp@8ijh!{YLyIic`y)
zw&oowTBdXAb7l9Z1CO0vf1UF4%jpTPjF#-;S*ho|>hy$H`=jk@>#u!Y((+4S|E3bB
zTA`|=-d-{dN{UPESf-0i2#V+FYgzJ3z%nQzsMat;=+dkF-$uLjXNJY|Olvvv>-O9u
zi`Wl!er;voTz;)TVeY30lb!nn3?6Rz_Ah--&8LaSn>fE6P4HCUQD0v3WMjglTEmDa
z&SqER74CA}YPZCjm(Dea*uv)YWMjgnTEmDc&O4H8n*}O$rbWf^OsV^0?Dy*biR5(!
zA9t63KCor3LB^+B@7%7HIoUEPChQ72l(J>=^Hp;<sxh*zIJ0hl$*HGCd;d+J9cMr5
z|J`X*%l<F62{~STS3`xfCh1@KnJK!elm743^-lfwz4Xr-wg11_cdbi~SmkpmPAyY^
z@|NkIw@$0PO`Y`3$g_IplD)(W@BST(VL;{L1$zPm?rCV`i%c=++P6*R?c&x{>EKD)
zvA<XNJ+IhYRHW+t<eBoDJF`0Py`3NbXyxHH(UXU54d1=n;3<Clt=+G?2g*#V49<M#
z=v!RM?Kdsc=!5jzxVd+n+TL<MW|+IeJZ$pP`)zA({#Gts<NH<cU-FX3X_G6gtIxe*
zZiqX+Y+d59WjDHOe+K+r(0}pu$;UZv>(0x~c@rPQ!`IYU{rGJA+31W<`KJ$j`?AdH
zR?MFD?+W)X^NiW_*q~lzV(p9nj(3(_D)DT4b)a=xqxAiV*=?2Lw|{y`yfogp+FtaV
zYD=YJ<zu()f-Sd`+IHPlc-eJVg=@t+U-271t`=l3UHYft*e&)mejAr4eH4C`l4KLn
z!8TcUgQU?BDU+~o3dVa<?`Ih2Y`b6(+9BOgap~`2<0a>3N9ejs*!a#p_UX3QijYo~
zvwSWGT8*7=n>&{sKHQml?EVGu<%?NWTGiI?)@T3h^!xUrgxjS{+V~RG=Ez(5^#Ac(
zWE*rkPigY=hfn-jmwLAe8f5Rav$L$){r_3V((7OPOE-RhTQA<WxBKHQ8Q<eyn5C~y
z_X#W9ynn6MX5*d@moNTYeVLoxhtnwRYOTSMCw0Pp8MF1<!=~I6^>|yzowxkE^IVn9
zrEed0SnRN{_-Qz)-L=y*JyJn!Pl~pUPfAl~>e)+%J0<q@CJ9Y;ay2o`KNe$|H;F59
zS#ZNvrsND3h5lz1w)-r4ndD}3+|kJ5V*1IjH{=lC1GcdAwq5*Xd=Hj?PzrNAV7pq;
zE96VT`m+(2=5O3Sb63aFCwD~V2_C%TAp3617K5_&`uzRvGv10`_%Y{X=POl}(zw5F
zu{{$zH)gvm*HHVOc5z0*<^?C#iXDFPMMrXCaqg0r@*Cp3OgQ$;7j~VV`y+5kl2D~s
zZ%BWC$ZW;ZH||}Bt5k~SiSF<`)V=J`Iv1-G%i9WeIX(z>JRZHAGk4mRiam4Q2}U|x
zI@BVxCe1sjq~_(avrVn`$EtNsT1cv|QIN}6=DT5*r)*=Jr&G?y>?=7+(Jouo94tGi
zk@Gq5z#HRT{Hkra##a@l<figCZkD_h{%cB;v$?3?yI(K9m>$e={^mP#I=`K+eBQm9
z=n4NNx-&m7UisI&r$9UH!wIXiGya_PEmd)z<!ZFcs!CpN@7z8sU&XnG%=4$;U+c|w
zT<YQ3#cOx|4Aho+rqtQT^wZf@=-{@!tlO`MXdcu|`Z-ZWJv}bq{N6ji+t>P=MqTP`
z47q<JPf1hbvTUow*)<D{dY+UWo<A}2R0m7ER>OzFrH2%lKIyu+SzZuJXECXin9W!t
z9b=T{^HHP0nD=eju}5d5I9ZB44>bOc|DQDNkGrJwSL5c2?gKpPOrPWb|H@Tsk(iVF
z@q4_Tc=gLW)2FOb*t0U^sGI*3=65F5D(4uPs{7p=IvAQcI(aV7?mE9&!Cn5{-{a{8
z`dj5qjyzi-J!|n9&Re#bm-)P1)$)rjpS<lG>Gz@T?Z0o=?5$f*yX`DfX8#?Z^>3%7
z?ZF*iXHVI1K+%1EeedJ>_4>2lM`e6aFr6+pd4KHo=!18wrUq-MDw!NUbx+vg#mdu`
z@n$z<&U0>2;i-%)V3uB(A0O50G^Hnb%Ys0=!(GXTVg=qGl@?9<k;J|2naN`%&U24L
zKlNz(>^-vB>p-&brQ_9inT|bGvzclw`~QGj#e+CT=JFlP&HN{&fACusY<Vy>_m%V&
zW7F{C=K|#o!&g4nnpHn5Su5>))amc5HRrB~_cbV7YapmFi$6cLKEZVJ15e(`VY2<6
zmMJUN8DCRdl4hv1&-25P3}bG-$qI8g0`H3TIX{%>zNxpvFtk&@-m;}jM9gx!>|*H+
z^(Og`j$PCYy0rYo&N<b(U#%u?ZP_Fq?pd<zU6E1E@#s^zj@~;@3-9=wyDFDKb7i=?
z(Zr&DUBL*kiYAXQJFPk|*@o7{ma;g$Eo_xgwPDHG^?*w-j;HtwQ|X32_LqTWhdqm(
zTm8a<p1TA#sT(D}Uv+Z(o3JG%Ze5>JjApSO{}6FJoL}*K%{J%Ho}uhE%Z>iLaWm-J
zJdN|RKTk5>#k-e}9=T?IpngtB;cdz58<*cX&&<@o!qD(UwLY2e@TKeLPwt+lzpLO+
zcTDac*^qbd9GD7NWLK-Tm@c-ODjYud^$!W=PLIjW=Iv{5sOc{66uQ0SvB|{b*(Gz;
zHnyG(Jpa|d+T)1XyUE9%I50kzxc{<jL99*9CXoz@{?$6{QpYa)hB5Kp{>U5M*f#e^
z+gpdjc{PXq79{GM1+eX8pU<&b`p(&n7k=uye@Q4<V|l$)shY>qBsT8<Be@e=Z!c7?
znek3l?e&L8^<h(#<-Pd@=LY0lPZr{G5!tS?M)+HExWJ2)?XOZ6oqs3r#!_I9*`o9X
z!L>duDSw*oH&ikHn(?x5$+^?YLHP?Gm7m|Y{O{G5+n?`OIO8&Xe}LVr`>VyS*+zt@
zzB^pkBe&&L(W+T0RSOQRJ+F8=WNO*DeMT?YZ^lY3trNJy&+*e(gTt`+#<%l|x8;9_
zJYSp@uO@nM*Y*6|6UtAn^L4Rr&{HyRx%MmcwB}unOG`I|F)UrXp+a~ix5}n%>vmNv
z<O*3Q_^qTyXmjb&YkT|EMRzj1KWcWrVEWv^c9*QK*;Y;>?|x?gI>mK8?p#~D(#MYh
zF*axV`NUWkO>CTdG-CY+Ib&VRg>tFOj~{xW!FqFHD1-HfWTqJ{>}4Cg%QR-la=o5-
z<<zrEua%ysv%WUY^Ixj7s+!As(e@3F^^4<_{_?B;;fhnZ`uE07GxyG5t^ybBJCk~r
zWaq~Ve3$K<%l}Vx$rp~(9v?YHZ-2kd*Dtcd(}c;W`SpqOSyMmmy|H(Nu=M#k424H5
z8;`%AQX6}1?kbfD6Jq`;Uf*<ZpQ_E<eodEBjl`AF35o}ocJe046<X|7O*r<9FR}IJ
z1D6e5fxaicJ=pPkZEN1{riTyC9(~yFc<RTwphN3lZN9HKdB!W{H%BTKY`?aA)la#*
zugky7NEMl{TH|w^cW&#ByBSZ`EU<T|c)vJ%lR@ymRePCdS(v>LEimR1(-OJ5Xrs{I
zH=4=v1t|`Fyz+|+YMCP?Tc!JWHeQ&Mkz(j}a)*3PoSUHiUZJN`&bQWe1Pj%~J>P%i
z_a2K+9lJSy#Rk+GicdMD>#Vh1^%<K^Y{2}(tXHRP+OZ(%*@mm1&ntfZkh58NRnGB{
z$d6|=X1Gq<@PpAZ`p}bb$0N$CJ5%cU*2gECDIR1y^N`1jl|?M2_+siz2f^#pU)bH&
z@p4G`b>jNNMThK;KUEdY^NIGIn4A0VW}V#4YtNef`YqnrY+7qm7azCntMSQgGc4cy
zczz*LN?^VAqqCxWj(^NdWePG;2)r;MZhqC}XBp-5ijGh057CSJ=fvvhwsA(`JJrUW
z;*&V%SrqTwrY!IxG~~|*;qaI2%;slWSRQi8?uh^Q$*Sf7U*<2n47FXYF|QL&Mq8bf
zWn8)c#b3WZ<Hd*X${3wzHovh!{KGYiYoQCDe>$+#$=xNXMyhcBG}G&+c`{Smwir1_
z%~V`_X2Q49>oL!#Ze%&!HD$t6^@R`X{J9pgpE_0cQuw&T=dM$1lcid{?|x#;I?Al_
zdH?&CY@y!_O1q8}F>DQ%a=5a1KTp2XVhM$nueQrfnLCB8mQmq%r-70Br=o;!mtI^E
zQcTn4yKv#)t)dOzf)8eN9*|nO;a&Sx+e1-&SKfwb+)`TL#^v_g(N>S;N|;orH51Q;
z&eV_{Z+6JkWG;Eb5wJ;EaY-=SpE}J4x4fd7>#PbqKh3TPn#R0w>akQ=*9KARiI3jZ
zDQvvCUuHt4(ca6VGoE;?E$4T6CLGOmB5sw3xI&73V_%;~Jm0CjS0QCC&vsAddR|nt
zeEP1>6ZU$p2sD~gufv*d-)s8&Hq+*Pa~B9UhG$s{1WN`d9Q(~F{Ep2)pH+<|XZcov
znMIa~r>5V{RhSmBq%~kMi$rH|rKiW`Z*q}>f^WQ<9Fp{Is6O<$+aMyi)weVF_MXom
zuIQYu18OePs@zLdrw3|>7HxAa`Bv6cxbe%9?U!99=`4~w>A5QKQcL){a_v0Rtjy`b
zIgjOHSgxc8eC*oyvU>XWU9Mh_-|V?_X=O8G--Q>4nS-0HzuZ&)_V;K~TU@qz!SsNM
z<x}|n@dxE^-&6Kr@rnZmqL;*zWH*10pMA{aQf6v#@$2TaSHh3;y8V|Fd_Tkf$o*U?
zkLM-()zx-3^^0tsh1hL4R{!Q*;%eUiBt?7r^0t3TecDf^@Vw96w#2t`vumHS)(Sq(
zeL1;o%6m&rz1jHX#h2bV?_cEw4X^GsHkK=J%dQYE{dKTny>NL%@@0S1<C<=p<|pUm
z@6oC|{bNR6MV*>gY*^d&U9t=EmXx-N9$vE{YsS?4Q}PextsD<;G)y|}VE*i|wZE5$
zAzMtw>utAxl#Bl_Iq_WVx9--|mAanyPrMED543vQ*Rp@Q_1&=V(kh~c6}QeaB^3$$
zO8Zlw?VqZ;?e5ze*$Zp_K7YFT@a5*y@#p(iR9IDifA!=CL#X+-ZFPCFIk~cNa*O2k
z?$259ZJEpF8?U}RdwuQN#oJmO&bQa*_O>p{d;GOSHT#AA)j4@@-oMX(@p&!t;Vn7I
z%W_XlvZ>+Se!KH@bw$m#udjS2F6|9}Z^jXyGviatvHDrJTy7oO6e9o7u~|n-=z-kx
zq>~N`EBCZ`MR1fGu83>+eRtP&ligh>g4Ji*=;oZ9=d*R=x<|*9gD<D`C8QOVr$mM-
zrD$yOlq;C>go*w9)~a;=v{&qZ{kHNJ7bj*u`#0BYvw800BNZ3UFi#bEy0r92=2wRk
zuY=Y<{%%$p_HvJz>Awr=!dtIZnBADLP$p6J$DLWy$JVA@lVbi?th3<xj9(FL*F0GC
zwof!X{>w2(oc~tu-$vW72dzWv&3$-2#F*;7tw_6W8*}xi%=^B8YLyQ8DcLd>ONBf$
zUANEQ%b4}M`g-O?lRLNgy-TxRMokq-YkqWX-?a;-uchOB-^>o}>S<rX?8tjzhS;q3
zX&Y1D#2Wqm7JZhHr?&lp@-4@$Yo%^|z5c6YRl_5>^vCSWU(EGu->k;`W7-vc*C*?F
zLftNYT^HOZ!POEyIUq9R@3uVObzfe)tw;}R4O@ORyLoGN_P<}HPU|(_m`2_3W8vJ+
zR<3G&Y)h7gT2=01H?QI%M;8q?^SWY<YiDxbiOm(0aXV?&<8Bpn``ulhh-|hl)s(cO
zIw?NOzZi#^=zeW(TVwfWH{;3Vdxwt}sJ&_64q34-{dUAhclj4VDLiLGs=|yv&Rn0P
znd&N3Z}j1n<Kc4Q?KLZ0HWyUiza%i}W|C3kq5FLEon^c)KfCr-^^Ki0uS$@W)c;Gf
z_XkJF+;H03_wv*Suhzqc3ajLt*5z#S4-FI!_5ZMI&I0G){|xCneM466o6S74Px1Tq
z_rG6d^Kk4k5PRmKJU{c{#Mc45;VU#>O^Zx*m3v*9`}tv<{9S%FuC?61dFqW#kNwhJ
zw(09zL4mx_kJ=w!pMKc<x46C2iVyMip*7%5v(MKyU*10b`EvDl)f^rzf~DEHMaTW+
z=2};19VxlPdra=hWd_d=SrtZ^Vo4fvPA)sWa?8nzw)h{{%eemD`gdsGIqsK7Yjc;+
zSpQc4-t4%)JKlXXxcT%0%XMegyt`u8&$F4Su})o9cdz{av+4HV<~1K#Y9njTveKYO
zeOFPl?xXK=Tj#fSoH|v;cG}kbZk@;0jGYfpsvXhvmzlS-w>Oq6HYqjd<t&bC-BBrh
zH+k$GOslLUmfTr)J?pF#Z=0p@v-i(_2%F9o^~^Fd_RlQM^5cx}_)*RF^^LO7{n)~d
zv)65Hm=sdc^g76Ro1nnU8E?;(C?DtfmlLqkKIdHeLA?judBsuwb5itFuXYtL{?i#E
zx&P>jD3_PTo(3JtjG~)zIIsTkvIzFio_Of8!EXnSKZks(9eyucX?HDk#lK$+*6KC9
zO}m(WDDh9_cv%D4`O4~WaF2b;-lAibKW9IdS8~0-^L?U2%dJF#h0oTtwX(1u3gDk#
zQ#+w+t9iL{a?*@uEwTD-VZ5Ndub=Cg15dkbZwQ!Mz2<%L)p@+{^zZs{T)V;hz5V{O
ztTS;=OxLDIuR)ya`t;ko_X-9Tds**)+<s%xgEqn2T?x;QRAo)(ye958<1xF?Pm}QD
z$)8TL3+PVZ`IWq=px`y1xy;*3lJDkCTJ`SshK+q4=1-zBv=*NDEP70F#iiKzt8p*%
zv##&nn#THt`OePzqPh2Gwz#jqa`89&Rhj6}`y4(gPWRX4NlJFS>^mz}6}ZyVm)#<K
zUEYZR)1B8!8atRDZcQ}e=wfA9%2dD*wDQ)PO`&f%R%U&fI_t3;w=ws}m4?%$DxV3v
zx*RZNil4ZPskFlW$6j@L*3#O}%y$*7*4DGt7YAA0bp5wg*}LRpz~YzRUpIJsGE{tg
zgH1z2Ir(3Q<V~}-AF?a|30w`X-DS7hGjA#Lvjq2}MwOktT?<|2mF)Xu%XwgT^hevu
zk4-D?pIP+T_C`S2SKEk1($X6~Jm54{^AIikHL>o)+DtDUt3B^@;_aU<VE3|HF8Gfn
zMM1Xcxpz+wW31f7T7xCtJHnVB=S1=ET{#JSr0W}1f!e<5Hwt~j19{gkbhw~a<7nod
zm2)+2f@z?#*!5>2TR(of!*wGzx_83O#uJC0?6v=K*7Ro7hgbOm4_`JjEONYVvQI{8
zKI=>|@QJQW-PaymekIrAz-3i*+Bay&4OQL`PlaP1)HMEh$aXb4IW7Ors^HpBJCau#
zcQ5&|_pa-c-|UMl-rkXzZ20@wrT-Voo_zbGEGL=F_2%QEXR<;Dya%2xR!CNoOHXS1
z^tRmS-g}m9*6HgPYrE{)cgZ{@!mu-Ii(gov+I}{P=Qraflxf%LE)`T@zuk9YQPq)W
zW;1w}u}#mh%jk3E`^Z_4cD=^ns^w4RjKYo?5%cU9G&+^>i&;K77`@}b<E@AHI{oAc
znSPh^VmyyQO@-YKF|ixXAwMRjeF*EBE6Lh$bM8fUJL`}$Y`tX%b1uDLp5N=WHb6Wo
z=ifm)ubv_+9kVvMl?MekK5(kC`}xLq;pIA()Wz|(NzH9#I~sp~w*Jr|eE$BoO9i)@
zJRem_#hiCn?GmW{D51Y@e#zT~d`2?&zOG5B-TtVUNA<%&z2)Woo>}%Xk6mR;SPtHM
zXrT4+-Z{4;>p#XST&Q8UiI=~jekQSJVY5EVqI2adv`<$y&q&Lek-lN~pReLYRgLHS
zDqn4pyzu_T8XIXz<2yg6=$PwRt)4Jh&U@q0oIRa0POZ4N(#q|W$+8u{7QJ)$8atIC
z^zKR~ldH$NwJcr#ue+7e^5OyC8wb`Ug<rFtYs&rJt<~nR+3i)#>fpS?@pats*Dflj
z@gL*4@auZ;p_M1HnNAxRF*ZCBl9;snql9y=85;|uxtmXV)|Z2AufIrr*sC+u-z3yu
zVw=U*q@)#(|3`goTYiQ&rh3w;V``Dz6;iWLDE+tNQ~9%;?>|$*8R@qBDF!@jlXfRs
z<*mO^_sBHuHe1o}1K*bJ%)ee*6w}bzE53!5tMb9kb&DGgMYGr(N_(>YXpiqI(a8Hh
zo)<Q-YEPA(e`8AJd-e{NejNeVtGqKeY!G!Wwoz{p`0zVeRm=InQGq*YI-Aa$lpWqI
z)T^xcY?onkq|}u;J8!KOE&P8(og?Y}{2$Zyt@nL0r)J%S89Wu{UCxzjH|+_Fj9aa<
zK6Ki3EqnVQ|9?@bm(mt4$rY2$6m7Xv%~@uar1$xGE$6@RyOR&jwb^`Gt=!b$qndeM
zwBL*)H|Ey(d(PFIWvn>mrc(4((}Rn0E@nOYE~V6E*23VB6wtvqWA?E-S4?}JDKp74
zr*JOi>z~;xnwQJt$lwqXb-Z+y-LY@}MPYX{IF|7o@(4A#?!*0ksotCF!&e?=ueq45
zCV9iGV7rusm4V5HN!Kj<-_9-JP|w+w>by<ervFyYliHy7KD`x&D@r%y`(5npt3G@<
z@o(gI-6i*u9+Y0aw&v`Pf0Ml)TiAbXX0x)e{r&aNkKgio6O~SSojVxtBK`jpmWh7)
z7k*wmdhw^fd;83XDu$N~HZF6^n%4UvMOQ~!?Z}l6I{o6x4T9&7r7*qIiQTLaIn8?O
zM%lwDg}0cscLdvo9*;^mwNWxbcf-|ZHCvK)m#52FB;_caPViy6(|G;N6rR&FtIp2;
zapPS0F#&P=y{^aa6`j0(^59;xs{Tf+d6jE6H2*8?czBEP+pF9YLjU+r&YkO*zWl1Y
z{(?_JtK#*xsEORQL|G&Ar~+e+j7H5PWs!IP4j63g-TIL&)+TD3nQOb0%1uZ6SKI8%
zj9+(T3ogu-WO?f>(rCqW{!y!+)>)bP^A^58|L8LRde(JMCs-NxS_jYdGu@oFaHZij
zwT-@?`4nqgHl;kbXMQcK7HZwxmK*O};&sU>ara%hyXt#Yt?zCY@5_+;$*mj5bTB&i
zT{L?|;f&7rUvF0b7S>@;pRnWJ#s1)Sn~r+Z(wL(MKS`8`6&s4XhGZV!JHsx`{?n_c
zk8Ns?F#pS5`FQIhi+Pg5SFgN1zQr&)Q0H#=<>N;y7CksEenfr#BCS7XYBfvun8gW5
z|0sX|m2sNddO1URkBZIP60QfjE1&I>5C3%|U4Q?lxM@e@&Z%k5QOR-KI!pHJN{t02
ztG}E7%T_zze4kJJ-}Q$&fpZh?{(W_~hMhH9Y5mjEsW%nO+j5gj8>|29m{EPaf8m*o
z#w{6*F0J|Z-mn&aGUzMZWz&D5L5cA}BJ+{v-UqJCzRU%$><lh`t_tB<9l?<uu#snr
zE=R@Hh`vaVNc(m!#s~k8Wld7Il-a+``mV;TenHt}+1$3i?S2<!PI*d3M6<~Mvvm<(
zJ#k%!(6c&*d0wxoTkMlmh0h5YToL+{oVDQmBI_3=DLQH2(wx{mYxh^N7_I2;<V`$v
zgM-QHK!f1~_Z`<xKIk}PY5SaS<=u;yFMs}7q(ATN@yOXG>zU-r{y+Kj;?LWEPcMG>
zx_djj%Dri-;!}2S{eAt%^2n7RCfKD&6ssL;;&^{^uISOtpDRDSart0lQ?>X1yC;|0
zwPOBsI$ky3e?#x+vgTa>1q^2*!Yzw${<pDslo&5-c{01%o>?VvkJKEI6HZQMvsL;$
zxYw*w*4MGC+pHlccA{T$qM<;g{L?deGU=}_%$px}J${1vr^)(%jq00~I)mfo=lt;y
zPTtITXvW@SZExCk&NzEu&(r7Y-<4hOQ`P^QAu}zg^nJUD&dh`2&GGqfe{3~+pq~8a
zfO)ZHabVBk^H+4{v%P#It{xrM9&gQD_x9Djk1vm2?96AfynT#AI?u&=M)oqh{l`yv
zZ)vM4ul96VpCT!=G2LOyWX6kP3cKnnD&8eZiJC<8ZhUy{m9B;M@#M?vUt3jtTe8(Z
z!<>1Z?SaqFKR-UbxT1~sf#tCcA4BKN+w-M|P0b{E=`0hU-7Tg4|KCr1(c|<cUgV^O
zZC>f+o97!+*eC3<xnEzcXfQYHjLo)bbB~8zo4Ru@<59bZHxB<j{WnF#^Mr-=g}0LD
z;)1^3+w|)|sJ8ZQHlg>+A8?xP@8k13-(Oet`yKCLlcwhv-|)>&lZsKhwV>SHtm9?7
zx%jh9N6WbQzo(X8)ZRI{u<I$$sQ_;Ovo~M<eERWr%T}&=ey?8b2;JE0u263Hbg#qT
ztU%7Y{gW@4@YYzFZu(rkfbB@;rfc_=m44auK2(h=GMab)ci|*&iL-Bt&#ktTZ%^w!
z_w(iM(-kHs=LA<QzAT}>Evy3+s<~bF1GW5vD<Z#M)R^`5>*ABE_e!*@Mej;zvhHx}
z*IUHLYT;ql%h{g$m}i#gqtmOWNTg3re#p4F?2lPvu5G){?C1-<rlNdyUtj#Y-7kD@
zkwkj9VM^S|{T4kNXO$QHdM0{U;+?6hp`F1pa~++Ah40Sh?9gSA5jdvqC|h9nW=B#9
z_sLj|jH^eKdTUrtHyx2$@xrmz<=ft_{o5w<^_gC+VhMkck$Cf1$aa&WB%iihJrn9?
zuiPN;-B9t~oTONb3-%S>b!`uS&Xf7UST4H!gNCo^1FM-F;<EBlzAc&T*?mDD<62cR
zmi4A}zvRtJy|ZYal51e@T8Yp*|Ns4*t*AM{%Er!CnyKXQ=Eu$_`+qR}y&1G3+i#M{
z%gcFFrZ4GV-@hP-vrg3Wo#Jx&<E!Q39tQH<);_jDwtb;Y_ruk7GHtnS3wsRA-e!N<
zZ8m-By8wCqXy?qynzR2^vi{zF{@||7No%YNBeXY0oL>KE!#m?OqHS9jZ#NSZ5%?b~
zoxNC*g)5Os!-1h+>u#cTS9ST(9p#S;@{c~!JNoGh<KexcM;C8TvZ*Sp*z)*e#_<P*
zFV^^;tN9Y%<8IH_@AvJeMM+qKde`x9T_11s9bP<}nLpjPbn(~KDw$h5CNTb(@ueu?
z(V7Wz?2|>`UrAx$Q)Bo1J-tMt`DAv4GW&-5LW97t-cF%*&p&owt@8Zhwo9rRSs8y_
zS+>A&j)KX<gl$Qp%{&K=>(uE_vMQYMRWgl>eX{6kp%ex?wU5@PwJrH3Gq-tahiM<P
z&*#mle^}<Cf9w~_NBM&Xg<c#_mdZ`PE8TrkV&W0skAi#OooBl}Uok9U;X<n;>nGdR
zTsC+wrS$%{=$v0C7<=6mI7$nwmP@MG@=LHRyL2YlWZLbwakux}c6p}%IbPas`^Bhp
zIzQQz9C*{_Ouew7BBLf$E%o|Vfi1eVNAm;a-miP}Jz>7O9*gU-Rh$-^+Abe;4^z0_
zyneINk8Q0FCtK(8?|bO7SmD!;w!2D7Znqdq^AhImxvXn*Ste5R`_CP$Z-2enQTV##
z*oA%08TIBY@{8=UH3fg=b06Fh)LiK-wr1a%)umGH<;VNWC9++AHEjrM*_d~d>+mgx
z`9U1%Ke-Rh49~Y=d*1iv;TqTUsGm(6o?V^Ld$1~cQN(It=|5`)w?xMa+>%Y)a=Rdi
zBcqvn(m7MXnIF&Hl<2qatoo6}aYa;J;0Tu?)4`=>Zi`fydf#u^b?3&c2aM{aoxuu`
zoi`WFS6NwgXvr&&-0303$&U<znN~i?`P<yavD6~vRh?tXtM17w*X~GZk})cjc`C=H
zpe=Cq+~vhJxhvg{E_^n9$@HA=VBw^LX}1nv2$64C<a7PYhdj==mmbPDHkcRA4a`ft
zb^k@VNs!r|&0CVpuB3{7n>Od*f*WOzUH$qroZa}t{yg00cP-1pB2i!M<MV}S&hPxD
z9zA|}g>X@J==KSwf%XMvQ>IOrBBI*1<D5I2ngE|CgFtKIhLE0wik`gt;z}L+LYIHO
zyVU90p})>HbM=#aD_VYNtUAHrrO=_Z<4F~hak;7nchsX<t9d4g?o*j6pqt}+FC*|l
z(i4S$;@y7V@9enoRloh3eah}A-z&e3J!-$mPRceny44sjbpO*oxlc2l3K%bN1x7_~
zP`P^YNQJ^X-J*sUQID6@OtO+r7Bsk)pKmIx*U5f}!E&~rwcEB-wK6s}hIfw*7*)=Q
zEvl;7k&?oD;$Ox|?VnPATVF9LA8Ehg_T<Pm`$J;=1`-FRn6-$P<fSMa{~E9K<WxUT
z-2djrri&A$9&tRKvT^s+<p-LIPB!^ZVSQS<LBXGIzO#*z=7-1p#(f5_pE%ZTnbZD1
zPSN+!#gJt`xK2KBRh@TdgLvu8g~lt&yF^M}>Kf;;&0OHJC##S-oMrB{N9S}OZQ-`u
zKFu-u&VH9aX^j6b89naWo!eop^<-OQT1ufl$H#XpdlgRmZP}6E_`}C(U#sc`KaQjQ
zC*JvK2<;cVS(v{;%kr^wr~SL$kkeav!?Zp<m6gobY5C&v{f1}TCF32;YrotsW!Sy<
z^3mVHyUX-V|17A{yH#2y;$!K*`+Y^=wSDpo)BkM^{;+Y;olY5TuA5I!%fELum~y@I
z;r#k-Q+lUbJ^RNp_1)#=&$|52+ZAf8G<kUc+ANKmK@zKEJZ`Z}I(NU&Z@QJNi%n7)
zr(t!ydy-!HixbLe^9723zxOzk+Giv<-S|7FVf<g&&YgEQs`t-eZ<)~!QdVkk>gk!q
z`_~6;yz^1Bf5!UjUS}fqDy>+#**e-MGG04J-u@#~V*SmAC0k#~^8UJ#KbMEMp!dym
zuJ<)29TUu?f3NAUsODUyP#`5LTQMWEOligsMisw<Hro^xU$ba+TwW~dal$oEws^(P
zd8O;N+?}eCAgh<HGch~u(7r3GKFK-VX|w$;r?2&YR%|%me(ujHyR+x|@7#Pj{(6hq
z#rd^uF~@eE-5PfN-SNu19iOhvoc)je-O5QGf0&c4%+m@EbnU+>B5*kSE5k>zj_QXd
zKa+A9SRZLB{aSpd#;T4{uI$qB>+F}<{%}usQxI2<+1}&2%J+Yj*1PqG*4cE$<@N|H
z`FvDJ<>$L4FJw=0IPQwqah#-|*cG>}M_|eKr9vuijh4SydX~fWSG<;MP?6M<XL>jO
zKMXB;*Tk`M+y00kRdsic+mrsycTsxg(=VX-=AXFtjVFJ&cXI9yVQb^4j9)u>PraDe
z{U<W~0&DK<&s+DcVP=7GpwQBe>#hk-nPHq}^LIQxFz1j=(YnLO&OJFeeOJJxybs;?
zuJi{y`EYuvN0C~?9`k?7B2lZiZ;#+oO&1Y3D<iP*L{#jyqd_W`#*G<lO%(^fZZDOc
zys#)e(c@K!4!?5|ztc>KNxLJo#GP#l_nXvLb8YV4`EB18)rk%hr)(Aat)_o$M(j-~
zN#nBY)jJFxKg~P%q~GU^bjUs*gC~>rOs;?O<H&izl<3Ai=T{oe;C%NX)W5EIj>eh~
zMl76fj<dB1Tg`OfFkdn;CG4Y<6zdEpn{4irGLO&SQc9bmJG1;L*VnQMDk<H%mJ{yW
zbiDE6aYWK;`RL5IC+?Oibn-?ot^J#M{k+lbn-OY<_r?^NTNLPr_oNqb^AzTtv}bud
zIh0TF44=2asi!SxPWAem|Gsrp|ITVJ@%{1r8)7%h{IWSzcGkLU`;mP)7kAk$+;YqC
z+E!;B&8Yc3HzI#pMc)4v@o)*ZPnp{6a#cwUeYy0-)yd2LAJkg8fc@@1_vB>8(n{Uv
zy_YY%b(x=k$FJvSmQaWq<MY!?Jr*W6Fq*Kaq%i(bb35?qoRN*|HqptkhEqDymKq*j
zB-s>|o9GvI>s{*^MS%v{wZA^}o#gnW^6_2Df!)#vq94XNJ-4W3@_*jO%6Zmkhv$*x
z(^he&$1C1@Jor7cY&!3(ADdbPGpZU_wVdAJ_iuaBj+VWWZ~fdZn;c%1^>y)Tu3GDj
z<=u8!eLKS*#2<W{=VoKPMri`y!_X~pHuKxWLIm<TI0OngnL_vP5z3JKvLNYMz3lBP
zLQxa9+wG~keER8ulN0o3JaOcE#w`}4F#Y}mi&cVQoy)W|EA9m?2okzD(L>OpUSWTK
zoFV5Kqs!Shdo*6}Sr+=@OYtSw`bX*qB0KeJIEuZ!C3i`l30u`)z2~y%iT;|aK`d8o
zKT6N$5{Z=7^*M3cO)s7Q`KyXGy@zk*g)2<_D15Q>XnurN!1aP}hLVMiNB;V=eB@cm
zu&q{8?2&-J$;4$9Sz$|`pWb3Jr;%qKk7tsvCexyTRq>7jw<YszzD|)4P!3B9S6R8#
zphHq6bNyRp!MypIk1e#grn(ET2HKo&zx4W8!-*9ynm39EYbfm4x~@TT_gs}Uk;}f*
ze3ZQVVx07TUsZcOxqM1?3mdbF_Ywua$LmY^rmL=uW6X?Oza;yA)(g(3a<Pp*FUuyU
zc%96QXIy^L(XacW&ZoktwzUgyd*70>lV85J>{;rGC)Nwhzu2#C=nRbd<XheLcH3?L
zTY3BcWllFvnXj9*^|McSz;;iOO^s2y*VivtIgQWo6q`-=t@c_)))f(#1#&J)T%NE)
z;+4dosZn;lJbrCYKb`*gtn*23h1^;#&o#%Ko+&jiz4bJDl}YX~1+G0y{htf>PV?bt
z5$JZ|5KUX-==am<{Pe}D>Kd$NT7vEBip;u_4^OXl>WfP}+sMEp<kn(z+IiQ!9towa
z5XU$r`>3z~*P6+*9pm}0q8EO>kX>n-%sTG&wff~vD?1jqnl{Lv5<au0ppvN~`ea4H
z^n=FNa*J(~drqHZ^pnqNzq?0qR`yr_KU>2tFI23X685HN%~5S1ww|ySk4}w6NuGV8
zPV*hp7p$Dg6(-eHJb#^Y<^mOuYf|sN?*6@ef!P}4$=9sDvf0PYk1w3yee_{=sLZvU
znug2by5|KfD3A2;*En<i%g<#gwp~n;hLOPqQzIYsYN%wTbS9a-wm2ZB^zW1Vjcf<j
zeC2Fz&%}!wTWUU4H3j|Iqbc(EkIN(ZTe^wQGPl;AS$y_~pupN4uf9ys{O4!<SLDNg
z4hN|ftYtHKv>Xf#dn~<`g=MsCeqRu%4e*`2f&0hQ!#a<h{ns3MD?BsiW6!^}VGFJu
z$w+cj3tJ)aH~3&o%-uXqS^H<xo?S8h_E=BkisrFnkqW^U69R?hRz2a04D^<>JGe3b
z?J?Wm(a#-=twTCG|10x^8@5l<b3E`MZu0DV-dE1-4*FynF(Ip6mAj5jY)Z4v4z>CI
z4Xn01CBi@0@&~8gSS@ld?(6o6-E)^8pK_^cW|3=BVJ6?7-5p2OPc-^F=zKbJ`;zUi
zsk_|w+HRQpF~+p}=-aqAT+w%4?-!l<_SWOI$E}s@Zr)jDJ8kQv0NIa!lo^(G`_7PE
z_PI+?;G?46#lPGt+|OmbBGzSZc*z<g{PSgjZkf!6HSTF!Eq;9eYWkBe+(vVex`h9n
zon1TU_;8&PE6SPVn9RNEl>f^IDY1WktIE!O<G*2>Rd6n^<HVRr(dD+!)$8;`EgUM9
z@}AAJVE_8m;qSv4k0<B#Jr-uP_${g8KiyMq>5I*i*B!WdQg~+g$Am-Eikr?oyJ~Cy
z;h}Dk?_bXccLn+TGQKu_-Evo0+5S<|^sQX;_-C5SpRu+O=&}7>RBIe7c;DxxOpNt^
z%a4my|NrHUZJy^LvS)JqnicP~Yy$VjP5fb5x#|0pici`TI#~@KM5QL3Z1DHdnD$(?
z{`BWb`{sPyqte`a_h#SbjjghckHW;3#NM{wX=7EtyS~z-=I^_=2S0px@%7*C$=+EU
zt}AuxvXmb2ozK0@EkEmt{KHO}Svt;(rk1^zo3-Z0iIhzHwvK3PbIBv;e5RFqtr6?&
zX;*9A!4qzyduX|u|D63?R%SQ#H2OO(iG|;pvf$L8CFgvv9X;fotX%cq`0%pzE@pp0
z^L$o{k6&9Yvz(WxdNbyX{cY9hZ)b?~`oHg4rkuB9%iIcSi`>rL4>rk8{#m$Fcvjye
z#}kYk3QwY3=U>P<K4*{Z!O2{O(mQlD_eJ*3JHKVA#K(Uu8^!KB+zPtiZu-2WZNgHC
z@FhQD1o*hmw+ip%ows29J<%)mRU0?QHyam4ilr>PUC*ArM1cL@-8mEOHcD*XpZ@%$
z&Y`F-uI&90e{NM4{XY5e$#n&h>8S_yPYkH3;`zbSl2qyRx!h)9X8PJqa}OR;t7D$m
z`uAx}hTuf6oxPP87td66tB`Ux_MVur^zQn%cBeNT+tc8!WG~6mpEm8wp*3Qx`QGvU
z(+iFYD^+QH-lD#AhVsm9N-0Y@SBO3m-;}cSsq(d8s|k_9pX)roN9<vqbo%(uTmA00
z*3M{g^#4%dvWFvO_hZd`vt?TU8<yPdT6uNj6GqSQm?r`P4o|jl+bLvjXVIE$JF!yK
z|KyE4@5aifG82zn)vj-<_-_2*F7Jc0)+(9eV(aH7+C|yktNBy=XzTa+bBv#5e_+!)
z-%vlh;_dR|4gLqDUkG<4UER?odM$2Y@%|0}esdfR_wQ5R&$e)f4fDU;mPeP952!1M
zoK~K+|EZwo^64KtRGO#WeRU-ArvKXsDKnKP-Fdd>gP`X>!FeYHPa3I2WqyCOJ$#y_
zT;#1r#YZR3`LY~jp0sqY;A&T;%YvSY^A3sncYRPiDg1n0Q=jK9r)jeqvJ~gZ`G(zM
zEV5nMJgIc!hv}6eMQJ`EIR!TBY@dc(uUqq5*hc@RSo*?T|H-qZC(n31Deg?*#iHY?
zv6{^<7zG@@lyuqYb!y-K_oa__*Q2jCxA*4$-%{k~T@`;uGcf#){Ka?dJ7$(gT<YFw
zH|3`8<V>?&b8dd<VyyX^H?vv&`Lv&0f0|AkFNo$|kaA%E;`j@~U9}r;1s*;1Dz0C7
z^?x^~j~}3^BJIHbet4<~`&4eDee+$4jrPfe#P7EZ#lD4?giN|WMch^^GO1;GVaO(t
z&ahjx({8JH%S_XGyHB9N{mJsC8<8h3?d!PuXoBw9aK$`OP`rpdDV)A8sn5%5QoyDv
z#<Na;Qar<$jQ=n3^SX9qfBZ8?&TAoWTeq6d%E-F%ckiR!s<M{LdXDWn@8zP>UeP+&
z@AU3i)+bNrPb+ycV~K0$)2FNqX9H$+9$<L1Jo-bSr+c1lZ!xoAQ|JBJuYd5heDsqw
z-)Q*AJS5KU^N}w3nDUzN#|-CYCi-1HIiW&y3C9k@xV@<dMeo~K`6cS|?I`+@u}s;1
zqOzu-RLAi%B_ci7e5xh<LSOGSV+(RI6t|ud#b~{C@=ebS`M7KBZZSTJ;a9BwCb;uH
zRGD+MBJyu{h@h^2+?PvJtWSDxp7Sg8hdJ}<IKkDnsutfR%dB^bZoVD6Q10r!|8KZ=
zEbY3p!>(3ne&^CT`&bU&{gU+N_2Qky*3Lc8Sl{i-UTk^L;KVP(>e_voCpJi*zH|4-
z${Aa_DmH!c+wN~@c(uKBk>V*s$xUGsd?a6=i~6|bTvf_PS>F7`>rZc<cPHKUNXPl2
zYm<*UDx5ClYg%4*L%9Bq@{`l&-*!uQ>|XswZpEHki|0)hN}oD+|Abm|%}eJhr&+&@
zyk#Z!@z`^<mIs0Ug7+3*eKhgyj^z^W&%4sye(ZVPx%o!k8LLw@PcDm{YS3TM*D351
zwyW`Gy%*P~TQe$5Up?(QU-NFu%(PY8^3H@+T{wJwc6;*Gu&<JrbW`qUpQxJC`_4Cc
z+5d&T6YXZ}=bW<)v_AInrM-HU)^&j+{?gWdz4mu*q@^S#DotE0ey2(1YUYU@swT$o
zdm~#?<c?Y~wK~k>I9m0{^`cck<?FcpyXE}~*oDt~zH_!Y7Whj<P@LcGMTzH}1I|qM
z45beQABnyreW!7PYw-3hiV@3V_OS9v&F8xJXx&3TiDlbgr3f9Gy*+YHLykgHgC~c@
z%+~7{A~tUg+%rReuW<aj@<o#kH&#x|U3vEYw0RS<l@gi$30)|hzMJtKo8!8PFPJ<!
z^VPiC=f3<I!slqbI65FDa+<At$jle>{Izn{&eA!zw{6CJC*>C&SK<ts&g~6TR0uUP
zF!fw2ke2m--YwBx&qLQVF;_*q9Blk;>U2Wi^mOl%NHM9pm63Th>mv0u7P^U*@@=`&
zVby+Z*EH7?F%5#x4X^H6(sIG$^hf`O+Lpew?yFsnH~TY=z7`Y8PMq(vXurV6&3WH6
zSG{Wd5x8Sbj(guB$0OY<!cSXkw)hE8E930w-L!^L&+JsznY&YesQQbW-8jFkaZCTU
zv~yQZdf6_%XY}Ie4*gAf%s2htTy{zN{!y-`tg5c^*SjE#27kflGp3#4+St?UdL&wS
zx{RjruH3?sXpy^%x1UQ>Y{+YqS|fYYIefOOfS$+HY1WT8wrd^=xENd0bX417>$XTC
z%hII#dTEP2W)#JoTX4og`;mpWfOi?+#uT4b-3q$jTfb+zszowf`B<>)hlKtdzMh*t
z(v8;V_Qp2{hN&w=<|OxZtm*S=+!v6^#@Mp!k;vhqzrQy>zWjK*<PwLr%U8AuS;~A_
z-@PxuW;4Sv+rplYJaTjPRX$DBd7=}=_nhs6XQQ>pr+q@QnfEuD2*(`A$dfAm5xn_P
z^m?v!UG+;g@BRN`d-7Ycx1dd)|375ys4pxmsk5}HeXZ9M@cL%PCW-79xBu($RA1k8
z-1+h0l#c2P>9e+0`tL8B8|v6+rM&yMzxs<gu5Tib*z&3Oo7|ILx!F)k()hNCTF%C(
z8Vi9raZVW)x~V({FWNx6jX&lclAfpCxX*FXt;z8_i;g9%kN71&>picbNGAu=MdsCa
zcq4p{oc($v@5jV1X4^$pJdRJdc769fvvs}dJ+(~z=@s&N&3YfLI<-IeCMeBj`EgWS
z&xLuD>rCB^;+hM^EiAf|gkPq1lsmnyRq`@4x!B9Tq1ce)O!ukg<m}gXYk1lt%~vh$
z-Pq$cVTa0Z7K`S)eQNI$T@D_MTh4Q>C_JN}aPmR5D7j5%K5nm=x^&~o&@(3*qg6EL
z9&r%hsq=cpT%lrMm(x5$^TL9<nySJQA<yuVnySiu|Gypj{u4CqqI{>%#5?8K3x{VG
z_Z@<i1KX@VO@70-?njA=`mY6kVo@>+zNm=)-F=SFmvgt0PTS3ms!7i)dUx=h5KO+~
z-0~$l<p2E3?op3d+;KbiaIW>|caF0i^w<4}TP3b`<YLi=9fxXe#&vj{XYMwWR=1fG
z5%uro$9<<w_4mCmI@|F(cHPVmwbQft_PqZjc>lXcO6leV&hpCHw^-`smcMK`=j8s*
ztNw3fcvZ;R6I%@)P2s&J`DMc2TF)<knWly4$kyD~b#C0jU35A?_1&V!pZ>@{j7kdo
z%&@3RX3l}XKhyu8myoLYb)~0L<KSWcN4K>qIUA>aQ7OA*V)^vds>*Mi527W`E>}pE
zGguJT_GR0Rjhj83@|`XmYI>ccaBkK-)|YCXA3MFS7HV;vf2ftZM8k6>=Z1HkJUzSq
z<f!?pnSEIp>{x$H_)4T~d)H#&6JEED2^XyDco$Z;y~{Y{lm}~OZ6eD`VJ+jfGiOfr
zsF=;_`~Uu8sM3Dj#VH$q-?`w^u72!Ib6S+rq(^T1ll2qXmLy!-@6mpG!-DIj%@VDp
zw|*xyq{mE?>eP-b@VnX7cKRnz!U_3?C9ju#4t)1!!M^W-nQu?TzE{pVY3=pfD$>>a
z`2mw0)ymKtpFU=)2_<{xaJ#lRP7`0GBdvEci?`_BAC(XV!=#<}R-Vr=tTqS`xS?3a
z*rZc=tftR&+u}M&X|4OlJNEt6tNe4J`BARiqZ7v#x$Sz!?DSUd_^VEveUsMPZdU&l
zvWxGQEz`d?pEaLn?&XSU|L{EWSLX(n{c-a;D<1uR5GTFY{ngs@Uk;XC`gl##bl$9#
zwv(FDqOVWvG8aqkk=W5wx?_=h)R`^)5ytg0zFU0LEzTvh-;&vuZ_{A-Su*26sB`Hn
zRfcU0bEHdB%rtI>mvHwoMCJBeu@0RdS#~JkN$UQyGq<$wWs6&K*m#ZlF=jOn`MWR5
z_H6H&kj=5;xM^kF|MM^X)ekTJ{Q2@{wMny!g0qhKD`$H1_so{dO00M}@x%FfncT)k
zAALEO=_=3mS>EFN{^QG;&IK2?hZa?9RUD9M)hzSXYqRSXG@8}Bwey$7k(Tc2#rrzX
zy0*U!oSUc6TTzuWE8uXU#p1Jbzs|iN7yYTi&ZEZpz`WAtj-B~=xq*uuSQ=-g{AjOx
zRho7GLQ7UN<Jo0urWfKnezUx?+;GIP#^6MXRb59~gCeUVmuHbinvn4{j{5exNgDat
zVrqYm@8m2IeAAz4v4!PSf<VmLC((fil5VTYce;k#vTU1n+V1=&_EWZdOaGh4ek*#j
zNj&L;>DuaPpY->9IC(ug{%6tln9q^d|MVtK&;GY^O{KbaV&QLF_f<8DNv+HMC#=7&
z5O$zUv$sQ4_4Jjh|0cYhQ#r)_n@(KX`uMclOcoEG>wjg>v{l(=Ss2{<d49>dZ5wNj
zG3}PCxWBVqB6nuZj15eQfw$yNdvx!g_*YO=eAAYe9Ung5y?^)~hd0kJ2Zxj&(sg1p
z9p`S%|E6E(QV`3%(yZyD>1n4+$G530?clAon*U<4OIr0jhpWEan=R62xmRh6|77t!
zG-si2ndS3Bk3W0fm}(UZ-Jc!RIN`t5c2!Ze=MKDwo@`%cxb%nv|F0A#B`+?HIS*cQ
z8c$Pdo5LM+#MxeD`*We^3L33N9!i0kOU~uwF6rH9ut@vpWRGVSu1bQ-PH9bOGU9ZZ
zwC2jY+X-?<d!1PYderRPgia|Zr)B<+t<c!~deVkl(Oes^o;dGyEp~rQ`Mq7Q>*tkD
zH(;;dTzdWgs%x@)FM9R={kN_A%)&z@i8tq+`dhI6tibLkJnoB)54%<9y(oPns=s%l
z;a)}ctL0HT8!cb+_5BUs_v%%>;Ubd@#!|X7ds}6*tf#Lp+O%%^gc%*qGh}T_bu0}#
z(}F)<f0wFrDQNb@N6ibgCm+t!h+cVA@9Oz1Zneece#iNfpDFBEV*8><)j&no>55Rz
z-XQM{@8T?#&Rl7=uIl^xpipw>uJ1E_7Avejp0_YjW7?%fcO0sHB3oEbhRp3P7cg7j
zcQ5Ic+v+?!)pg6ocJl~{C9u9LyLd1rRz#WkeC771^V*`73+x-Nt~vc?L%|dgP8+d8
ztFFUb^D}*aywem)cYI>?I9}tGJ;zR&%7YczMSMH{aPYj+TmM&hlHu~0goCWd-c7EX
zs=a1@0$atK50>JRi}yXB#2xqh?DlhaCWrStzWDR@-_wf~7g(`8-g`lGMk%M#o{Q6>
zV=7pMzP`wgsrQ;B`EJ9Z=P|YGl3wZAK0j7-ul2j+ck=}=o~}=KfBLCQNB@I&%~Wok
z%;wKG9vbT#J`&~9HJTRjh&whdeYyHmt?o6Ob_$mNeA*qCvUW;rkI~`uxa1k%9;&((
zudk8R?x{HFG;c!l<j?wPt${znw;uC&AHUmt$=pZ02j6@M*{kSh;&N_j*psO0ou=ld
zXR?)fZO&Ee=RV3^=6iqNA?=(b-YAZG{`1E?=DsN3>^ODXx<%|eKAW%D7WIFPQnHz;
z*fcXUxdP@BQ@Yas7cR=ZC-E%8nBBCtt#bLc*Jd$icAhopjj+B`;PQEcA5WE==?d3R
zYtD&I$`ak){$}TlyYEb@17vR<+aoo7*3`X0cdNUXGAv1{-I>~dz3=Y5)6vOn=k9bS
z@~t}mTj<aFUF!SqG`+Xy_t9Ry<I%)wZi}q$4buP4-q4@PU!7T_vHiO1)aqE{(BhK+
zGu*lp4!^p`e=eQz*l(T}Id`~}kIV}D9`{=KY}KL{K1VOkG%C3#@%ZRv*AqhSCz3c~
zFU+y`7g3CsQJk$<vNG!Zd@ZZ(n|Zi1o~>DMw1?%Vo#B$4>V2EHe*N%aL*-_JjTZ9~
zVylH;--(tNX{df3H~UQc-b8PujGE~!#mCldm~$k4NuJoX6IY&_9h!Sr_lk9Hz+d}U
z>|dK|B3auR-K6qAM(=-|pBc>aU~_NpDc!~9I~(oiJPv=&`$awJ<-Nz>*T;T2S^YiC
zT=(4RB^TM(+<CmtSM+x1b~dR6t51b~U39BQzwYLmUH(^p&kmR>b+pz@R(C_$|GJdf
z!ru$`_sjpD{&$b}`~#kU3oLm0BKPL09lqq-=6dLS+N(1gdM*}}tUrIZisP-HM2}qU
zCuco_s*?#Pp3F39v21vC{M_U?Yd)^5wJGdN=JR-1e>h{dpqW94G2z!2M$gbWvQyrs
z1VnKz__Ax`f`-hglGEl*;qlgIoL1Ko924P@_w3Dq6DJRp2shm9Gw3mQKmOmGUB}Bv
zXD&-b%1Tjg9?$pFWM_pLnf!IhP-;3lTfHOV44?0&IoVs2=9emMzOs<N54Hfsw=7|j
zs!#VpDT$C}zb_Z>xKr@Q?DK?L&2NF~9DM%`>-EkRpLLD*lvp#B$GgS*Z;54X`Apdv
zVTUr_rX(oMdC2}u<G9LJVYb&QhlK=l>LN}|tV+w+_3`l6r7jsKlJA9`NV460_>#AT
zk6)WB-{DJ({3A?a(;`wV>t-!531%|*Qdlr6<=2Uo&!;fY@%yvcPl^3>;7u{c^hHk_
zR>=D|`WZD^ak3P7C2X4_qmZlKGjqq57mr0IY+_z=gga$L)N}@cS{Z(UC8}rm`ef|m
z)C(Ig9`AgRQTal6zo)~+?J5o1lrJ6UpCG((itM5va~G}sGFf3!f3o7DMwy!rJH?&f
zF3>z$KZk|i^7A>qz&$EWN$Wj>qP!-!yc0|;YY^JDq3n^;;{M4DN}Yc<JB#SITitb0
zThz}ikb7BupV6k9j9EwZYj$p(%OX%K!_Z-+J#TkreQ|^E{x_nQf-=7>4yIY0%nJ+*
zwRstN>ahZ|;o-)(w&k8%Ham-~=RA2*N7p@amY_z>jp?EqOQ&vlxP5Z@^%d{ccAV?z
zc0I=!bg1pV-;};Dg;E|jO9htBK5+Xa*H)p>6*Gmbqh_eZv?=ZW7bDxhwUF<?qjIyQ
z^D`z~JRY;~OJU>!p)GITy0|UxpDeoMPQX!amZj5e+V{F_ZE+A?v1bzVjvsIRUaC%B
zGu>~K!^)X52aa;<souO0X3<tAVKJ@T-2AB!ON4%8l*`@Ood;5v$7mlc%T(?D6Shh0
zaLMO6*$bB%)U9{h8|uU1!;?IZ`JqbklBqd8TUdGoH6*6UE@P>7@x1fs#bc2f3Oh87
zede+p^Z3@aWl@~qyxu9(jdwZCnOMu6TPkd^c(#Vii^nEC#lFsm_TBTkCmeOMnu%FU
ze1G2Y?%QRXl<xLvT?))L)lbj)?rO1k>f*;gwqBSf)T&ZDrzc--UxxQby?NWFyfNsQ
zSMTC*>agfrmg;45-^|QbuYM*o-_dVh#`axGH5boaEIeeDp|0om%YyfD%$$h{`dcUW
zPA;2O=+toPsPtZz`b%Yx_}t}}SLT1()K>gy;u)#AGP1{4pMD#+spHMkPLG}fy>l;A
zH)Pva3N1>%9XR8Yft!2Z{Sxc7Pd@Jo`?9C+vFquRlCsDB=be$fD<i8e!=-hy&qwv_
zM9$y|(hpmh4?XeSJ9*bicdhzo4EhKEuU46VNwf2p#`+tXd>@4P1gAbRE>PX{^JmTa
zeL)5@6SLHRG+UoEzU4XRVrSOPO8(_mb6YYRQ%rXYhi<-kQUA%bB`0Tn3S2c=p>@~E
z_Q!WSQc8{<J{+W=%3`E4|3Hb5UqXquwA0L`a|~2F*5w&Zc27RG>&wZtRx?!^Lw4R<
z+f&M&q;i}&bNi;Pt!8H59?WCstUXeH*ZGVJ@1ivdVxIfI2i@Pj=ejOSV~@4|_7bT=
z&hQQ3y=6~a5PQo!!X_xa*O2`qAEdJM>DJ~2XSsNS6>Al*8CL(_n(3oFH_Xg@yVL)b
z&q|W(>+7B8=gUegOO-axb)NR*VRo{i^kk2#4?o_#w%XWrnpxc5+X^c$oB34gJ+}AF
zRm%14v94X>x2@^Rt)?TXKQ4w<NFDmHc}1}O*E<0*p1;yd&%2+PpD};UDb*z<n|N6!
zx97<jIu;*0b}7Dvb5%9R#r_rBZ%#6MdRC0(<RY$B%{Fb^?iDIF0&lBUy%N5CV`2W6
zs7w2snM1zw@$C5;{la1Hip%`Rs^_vOn4A5*{HR57c0`fGpEqac-TrG7xYvBoi8!yj
z)x2#|A={a+^lmv8T%6n^|Iqx)zVM&V^8Yz^+Q~>S<_NZKZ}RSET)p~s-sAhRe=aM|
zkAAaVW$W&{anGeCXIFP!$}Cs;v-eJ@%1>z((T4a}=b6??D}6cp<6+pmQ(if{Z~wGf
z5c&K3>GbyH>;=v9yXI^zU+>q)A5fZ{{rdT}gV(M-e5&~C;it2lS@~WsgwENPPM8;A
zlqb7)ZBs*Y=$B7%!N(O|lt{1NcwWEn<h~Y>Juf&NrcM{GW&7Ts-u#O7PU?ntrf1hF
zeJTk^-E{Gj?aZv?*rUDf%a)y$nR(jf)rn23T<QYmOkO9vV99S5fp_cg-E5xu%W;2j
z?%_Kz5wmvIFF*Un_qIjjpa1NumR^<K-Ld8BTE)CBfhQjhzR!KNdE>W_U$(`~ma2a-
zxic!;MmpyN@0YjRr#>jo&Xd?aD>9qs$N7zK=05g3@Mz<;hSkgOxT&OP;oENZM?LDY
zWk-CqAv=%cru%i?|CaoH!y9n>{_b@XxmWMlDnISjl}lT-JUu%bKW=YZ7kU3fR?_{7
z4}MB2vUg^g$i05n>K0{}Akfq9`&{pgn%b+sK6A6=X4d^)`;4J&pYsR7w+n8C@xHAx
zchNb!FY-o3XT*-<H-9W_{I|s6;=?s38TPdXt`qpl-Tm&U$c$%Vw<E4iE!n%$*W^dj
zpWKK1%4<Son0Yv|t9OVVV|iWm%R76M<;Aq}Z-3YQd&Jta`2MxEC#Tlk<@mbB-!MJ;
z$H8T(eQc(?1kCcDoVEVDZCkV=tHsIw3)x)NZ-ZG+b#^Hvo;m5dTs!1s-$%7Ib_!Lw
zi`gtbL3XZv7BBMo>_0`~&|!_6Z67_pbB25^H%?e9`JyMH(`iO)&&w%w$E=ntt-CP6
zw7uT^!V!ae&YXd2psi~r=BBrgg)tYMS{>Y$_N-x#x7v%DyA5Q+RKh>A-`KLjWKYtI
zqpC?;nr0lG;~H`B_q2P*=jy5n-?{bl^Z%&QwVCF7x&56t`NWjX?_~@6oVIPoqxh=N
z<y_s&(T8_hx;8G*cHS>-rJdfeF5qjx?yKo3yH_nzTQ%=NsikB4vVV+v$4mp4{>tM^
zv6|;-%8Rm_jZ-;vy(Y`NDZgIphePgwjJ;j6<GTCz=Eh43N{=P~rDgSejrK`>eOp=K
z&a<QZ$Jgs;&f4O}Tps*!uUm_@)12*me)r?%&7Zg9y`qAkTS(gLe*3ylFYX)+R$TTt
z&*0mI%s5NVI9`9XN`~)uv~qUk6gNg5dn$QGZ~6u+cDslFWjDQ?bk|YgO8P8L-?F>n
zbxV!zS2OniKBK<r;a~R*=J(Ruw@1v2lPcbGXhjLz`lp8uMek-?w#jby?K^kY1o^y@
z<DVSM=U;F)cG8EfrBAo*s59GOsJX)A>*syHzn^}vx^GG8eCP(afb++MV|O0B_NBW2
z)_EtFtsGjV?X!HHmM**PFTDTq5$lE8vjb*`N&NqCCO79z(2G6n;SbHO2khfudF`re
zbUdd`{)5lPgBzF(SA%xK?TxHSJ9Gc+NA)aG?MYWs#O7Rjbwvtt|D*e(-P(F(m$!<U
zPs@G8xz79S4L64+$=j?i_sSUm*zCCU-v-P1th*cZcbq-BY?I|I377EIPuw9lKyKO4
zaq0P_1Oay@t(2QWtA3UiE}M7F$*FsfGe@Jx#q2HlvtA{~PGcyzVfipy;EL!0@yZo0
z9?z52mELj+=reFVvs8LL)%e`$`!e@0<s0+JeYfT52(adP#IWgSvf{x;gDZ#C<K-VP
zJD8X2^s^yvg8Nz7k;nLb-usRF`a`SDb}Zjw*p~CA?f2pQVAHgG<$uqgie)?BQ$6&w
zTqmTie&^ob)*L)>`3KAY=x)>4k$7aA(hSQ^<1HsyUUMs-`N-T^({z~+v<L3y+|GY9
zG-PHRV3wVeIsIJ0_bDNz_uG0)UG^wmcM7&-P!)eH5b|=}`Yin~;#*(ejoQrgi}BqZ
z`<;I8eGV-SfA!*Tb5`HlRrxGxMho-9xA*WIDLJ0TyLZKvCCixSXos6WQG510>N2Ym
zU(5BjlL{JQ3{$ucFnTP_+I%W(qw<nf7sIpq+I7z89Em-)C-uope-S~(>l`(%eig4i
z)P1P-x8r*COX%{Qk6h(tX8vwVOEz`?$#$Ri;?Y94%kQr<PJEK=bZjGUK!Dq^KY}sO
zjtT5nzAC?{YL)->cG1Rz+b%H{Z&;i(bI%dCqXA0(R`EaQu{^lD_Q$+E6^>W((=Ps$
z%hA~VOHSuvFK<M}hZZSehl`AVJ?wv6Gf@?jjVqtFetyvfX4UzZIqI2=Ch+b2tm<~G
zL9hRWox~;8nAMGiW~(N*I<CGWn8s#v(_7(}4Eu)1rRx?+#W^?fNPJ+uDYJ58Xtm=t
zm)?k&*}+$joi5f+D9<%@N@G{zp8Wma1M}-C*#}qecihDz&oUt@+4u43g&!l2^)<OI
zH*SbaxF}T<b+=hC?$u@MBSP&S91N@39;|w|^Q9GsUO|b&pMqvBl`Xe+gf9Q}r0{qU
zF(*Ku|9{?uVS0a4PiMuPPRUc-@1LyLFMQ+OoV|VP1YZ8~x<4WDsLHB~R*|kV|41dw
zNw0Riwf4u>DQ*oiIo3+uuLNh`PB5Bri{<?xd6VNx?OW6zgy-7Lcs1vb;1&xPAD#2^
z7aSCKvv<pUdY~J2mo3iv&g;E>rIUBP@$2}P)bQ}|=Yv}}9FSXbsNbY{d(xXT8VqON
z_1Jy5xiHBrV+(iMWH<RAIU!lCyDlVs=KmI$H05&QM#C>2ynP+4;+H<3OwZ?<`%U@s
z44*iv?}p1h&sVX}ZiD}f!xGNy@f=HD-CVd%=Q(fEtc{8D4!-+zJ^sW?Ry*rwD=()x
z>|eb3Q%=g6g6F}T?reCmX3`?N?FC|+Ae-TS^-QZ;y$}8HXFscbtI0n6S>?C-v4GjV
zjE)C-1uxH(s@?F=YA;)jzV}mMrSpUH@Mj(_l*6A>;_MtJOgYniB#_0Z^5>Jr46zLw
zNvV%c85O3^+_A|gCQ@zPpFbY9KaWg}&)SwN)KQh3aJbmYB=6+BnX3FI&%eI9CwXt1
zeY99!;+oBiJdG;t*Is$#rLeVvCw)@Rhnw668y;n(a<Uy`-6zBoU%You^Ovg1`8#=<
z_s7L;iIG!ukp27KQ~d1dJrbEKw-o8RU4L{v+H(EeFw6JG>kt1pRq1Caa!)EITXRYc
zH!st=(@T%VX2s`<?p>05KDl#wwCj8B_#)7dRM+EmJJxSq6nE;Ko8+UFVOM@13Xk4-
zWrugJN#|0xij{l+O_~<v)q3On{&No&*hKuhb2342^Od}hIWE^{>n}do{BoVym+2ZN
zf=QF&oM&<z>uqVBnamh|DEO29LHWAp6<+m@$`cq0&u{*AUf3|bEmJu;QTg?~2%lq5
z7=E5>c>2qGmCeruGY=nq^Y=_ehw1I6CRVoJl5?`p`WUeUJyH(a%V2w8*DqBC)28=F
z&WCy=oiQ|-Q2im9X?pX96^HY56ck-r4%dsnYKi%|;`CPO$PCeIlFus51&t2h>ao~7
z|Ch@7+6`jX7jMk^EA;H=i?>0S*ZAc;VV!OJ@gyHZ^qm}Qz9agHyAG<)EI-u$FyKJU
znfd!(9Gm6Y_?i3vfp34WJfALF^wVfr_&LM10kX>;>^!>d?AhrC+t(QQm2LfS_Flch
z`~SM%ANE)OxH*NTtKvMXmxFd@`z6_z+BWlId4o>NoSzn$mO3R;GBwO?=G4Hn`SL5(
z<x{sU`gFo6b;9Gr>ngWSJpH6K_0u7v%7>HeC;q9wnDo%Qf8w0~>#x6in7;5&{aU}>
zXZ~;Rn}7Amf9|eX4Bk^cf1X-WlNz+oNHc!sl=VKR!quK?PyR%LaB)470q^tYOz~Iw
zA2&1oy(X*mRKW?UEGd$Vk!}ukk%AMxBsIVPclhAFYhg|G7Qgx5SF!OlxpAL1TV^$n
zxrAXlvwhy4i2=FG&hea<xT<jKT-)B+^~>jd+0b9t9_{hspuzpg+CO)(wx8JHyeIu$
z#`jlG#3Z-BIAr0V{;Kz?OT^#HK3nqrF8=e7%?_?@`7e<<t@Xp1%!*^?kB@b=K4ds>
zWn*aejId|Z`LFW-lGr=X=3Lr}KJ|YOQvN?mDiG*-FP(3fbI)mVeKecdT=T0JpFOHA
z?f-4c`Qdcq;Xe~u7#96!cbxahZS_kb-m8sIKlJ!~X!kw5r~7T4YRu=E6`w!FIUi|h
zc)%7rcfyOdotbBRV-K(XEZF${$edMYrW!Z@`a0w723tlWrs%wg&$CwbZ~U7a`bn@@
zgNc*HaIV&@>}9RLgT%k>O`PQFI8&5u8}FozjISpaoaEj<$I0M@#kTTGigRRNO<Q~Z
zoka2B_*ZjR3jXKWTAiRe=fw{52%{Ss8{m6N-((-GzxjVbBcI>-I$QgH|JuFJglyW<
z_&@WhjNu%vg#S-iCeG6rxT9<R|K$q<;|(f0Qfb$(9I!Z|;uNeiF(J%{*Z*sU;i4v&
zxjqM?muHJ{2$$C-TenF*-ojp2@VvHbsei(~jZ>3#Hw3<_>6xl}?+bHu4{wTOPjG|l
zhJg8#5-mTkuiPwu`{$`0j~*@G{^CZo@lPwol@SI3$Bp|%%P!dS8OB&2NZ!kPCT&y8
zlXHH{H(!3WSbWBN6|85jmr2;`Co#-fUmmbpeY=Qd{dZyCqo1EBi@dvcQ|98)#i`lB
zB`YE$R)hDF3fR5w$ey?uyq9!Bixt!Hm#ublg%@9!*!w+GK;_n%V52SlTA68rO?7b(
z?n`ZJW2{e3xafSOmHF>nuWReNj$XDE(-htnc%inTss7tD**BgMtsXbHZ}8uoY0}RY
z{VrbrLd0x`7m_R5X5ZVlTB#$kAg}$`p;<R4c6QB}b;xAf!xwS$tu=f8-sk-|dyd_M
z1h=^fy5B*2I)BDH%n@I=+GpnSlM{csTXpX&Un0Egiu8_)(mVYAK06ziV$wcCuP;&h
zd!>yVgUYqrwj7+3Oj`6A*1luxo_F20X?yB7Rjx$_;l6)lyeq`HMSJ>~vq}t>3$U0v
z9f=YCHh0;T17)1M1^1p0sO0-AKj+U6+b7Ak&2K-yRh8sx+NE`Z-=mwqgYRS4yQg0s
zY-Zmx_t(3%$|?*?-#Atl&N&d`mA-q|_tQ`RaqgUXr{q_E#^#it5h^vC9-UP=ymGJH
z9Ff2|yMjvJzx{c1sr*t6zk*Xg9i4?AH)b?G<5|7rNmXsh-fg>IAKakYvoPrHZTsr2
z^#zrGE>CPu3+b4@w`jwXbgzpmU$14~xXmD`qBdrZjO<+5{eSPx-N%t6F6=w|_@gWF
z{C={Db8hi0cmDJL#z`xdDU$?m$MGk{CLS^P9`mQlF(`13{NH+!tuImnMZ0x$|Gcjk
zpOxxf@Y>_`!L{l=($5wh4!^(rLD`DCI`1w8bl<G*a$Bq46SaI-c~RAe$GeT^H}ouU
zi$3x($vu)k==LFxQrRUZrW`$Uo$-hKy9;c)npaq7@m{!j_?Xh0!UxJT+|3)#&Dv%W
zDRfMnySe#&{NJi=^@W1^8vK8<-k*IeW8dMIn(n)U^R<et4$p^gvMzc}w=HLyui5{5
z<0s$9GuP5|a^&M!7d#F3_LFVhaDP$O)JZGC_Fmiav9~L|<3^C0*pvu%!!?3;{%qzo
zwhA?jj(%vdwZh_Lt&PnRQQvE;<7UrlJ99LL&Bp!BIt@8P>&S-{TPiCKyhvY}F(-4G
z-TvcFNkYvo=4q$3WIFlyIVEH#{IHvNa9_I%3&$-%G3M3_ZQeV!&yo~nxjUnGRYA+H
zns-T;i@um;MlTY|UDMq9u0mNO&wdZnd)WmQ$*&&oo}u#L|Hb^{w{)!<=CthRx$n{L
zE`I#}{=GZy*zfQ0u5$h8-k^2(<C`hV?k{qh{$0#7=Es7WCvGMjvHpMXdU?)spOsAe
zH5BBmT`csco8L54^L;q^?qh$mY3E9o&ztyp>fI}@63MellU<TT!W1+9dR;lc&fxeK
zDc=*07uMxJkx-mg{3Q3@iQ5%C(?02%RO!3@nsIBc^^d7cqNy!D+57JmzU#YJ=C)lf
zeX-(8D-M^QBOfL!Fbfz>|1pDQbN{ys%q@%?-)uVeV#nuZ_RR?$yKm@R+sE1^aDX}g
z$Tq$&w)=K^zp^ds{FY=Q@n59dc*dd+%Ob)IDxdT0`S3<;*On<_`DLj~eV2<TaP-H&
zU<$sq=VKyIt;O-x(cJ4d)SclvZCTTP`pzWdKXZ-iTDQM+4RKy_xyCY3cBA~`#3TP-
zl^grdKfm%uQ`B3nZ5a&;?<?)fpL{Mm{k+Ph{%Ofh8}@qt1ACb~Wp;%46eWF2{&ra5
z=BIZG8@xBlvN%qt6cl-^?73D+VDk56hL`_8DD*h9>r|IkeB9xA0#mO`Jh$(@+qP~&
zorADr-erHmpoA1P&|&@xpWj!Vc%L636(-m{=h_6R)K8%+W|mFQO_+E2w`Ij0S@v?}
zreD2f%dIa<RK9p;T=7uMXxHhm+w1yO_8()6@-10)al3GJc|+7zY0pVz${LOeTiV}s
zvFS(Eb}AT3TU-3_h`QkQRD1f}1x1=F(~Q;zJgqX1v2k+nfBd9}O}KrgE2rk7hb;Fm
zo-r``zxsF0<%;T+#{Ft*k3IY>YF6Xft9)0;u<0rLWC@P0H4+8+U2Bq$ybzylFmuh(
z9qj^b|Mzc^v$;E^P-$94(3(e_*^WDwhnR{Prv_=|zxr$EZ<Ifu>95V->PjxRU%%$R
zpWx8a=Q+zh-=4kxSY*dn*^drWo;#Hlt;^&4wLjieJzMMk$BV@lySZdV4^BE$zUre)
zU&tO|o^6Xh%c|M5Pwu&JkkP&IPn8JQ!o3Mgy;>Dm?9A?;TM}8o8*8xaZ&{v$h{%G#
z6v-_P$(EkI9QMiSad$fA9*_}}WpNIYKDt@>R^#Ix4|%fYCUWO`^snA=>BHJarin2R
zez49rj4wZ-$k957<wy(j;pFM*sd_%b-_0wR<b7vcTN&|u*9z&@gSyXRJ(_;6O`Lq;
z<st_!`|8Af!iw1zSM_H<vgMO`sM8zutMkmRz~cV$1qU`(uC9{nV-cLF@ipjrcEU!r
zxwhFHlTw>==HHzC$8y2N$5Om&&GK&k<g?y+D1Wj<{+{DeR-S6L>(4e7F_;J1ulU9C
zNLToL?YHyydHC<e$o#X|V`2IC=c6|-UKG3#S1|00S#jH3UGy(U!s^Z9ETOjqZ0@D0
zJ-?FuQ}&;~Onz3KWzeJ#buC#R-BX|3;6HtAx3$gQfTzy|d*$3GC^i)|WGNSYJTWW#
z){cX$OeHT_{{7{VZuI}tt?@tm4ilGie8|UVM@{Y87o2k7QNF*>^TdnR*A<_d+qicJ
zc_`1i_4!wt2diep>`apr7Je36&21KX&$VF@xbaNwk+lD27AfED*B5X9z22|SrAl<R
z<MP*sA9KI>QEk{z>F9M{(dCr<geN7uEH)}Ef-kK?Gdqgk{Z^9gIP+uQ$D;;k?+QPX
zGF1HZ<c3<T;^SLiKCZfuBeQAR4|T6&IczJH9~vz*bQk6c^3nVv^Zas-cWIKZLVvHc
z2>Z&M1FZd_hRbx0y!*XI`k9?;;awHEhU0R9lP&t3Y_8lf5abB@=-MgppqNd{uHE3c
zLx7?}`~gmmWp}ms?t5;CRh;tl*r(E(g*C0Sv?>oVK3(Le@^fOU!1ZUW(>Nb#N$CZ6
zEIe$~>NC@6nU7-dvI&~OC#Gno*i{Sey-`(pwL8nWs`Td0trzniF8{HANAxm7{|!g4
z@aVkVd1q<A$AZfRCw9K5x$DEaY%T-OHtrw(zvdd~-2TG&qN-ByrJCcS9qU(pH=nV-
z?bV-SmA58UDHfc#zV5V&zQbOXh8rqu>MjfY=T^_GWPhj5d&f^&V$ttUeS7Ab6zNaP
zoEp)vXY!jl3Z+X_CNu;oPx497;(dO(^|a916Iq#;)%R(%>=8KWDNt&0`LGzft<8Ds
zRg+Az%s;I9n(;F}ccQBtzu-dmxD7&2-PafdZ#yio^@Z^9!xP2l_%T`RwJ1Es=sxYG
z@^yi8+yVM8Gv|9we8RTTDgGpPi2X}Vi7O`qE{ZX3kO)c8e9qc+Qf^+wVylCnH~-mN
zuDbBv=dL&F=J>3C8`9-wd4c`f#oK!dN+-L&U3y6LUX<;Q6}vU{6FPNnykEAqJFn+Y
zgY%X-0=eq8cl~A`d>bKn=ue;JK_w^cx+`T;5rP-xSx$30pXH8Ky1#r=?UdIykBRWG
zoa2sJ^k(YRE3PMRib;I7-gjcp1Xb<?)!eYmZi_>L4~m$?^jm&!X?=X<w55Z693MN|
zj&A9P*_y8NB6e)o5&rjeD(CZS|L48l{IKL>q3+lHsY{n{v7Y$rzU|62|M&LIFTMJ|
zEOOPF|FPHp>%Fd@{&oN9U-wi0zTfn(Jo5i;;)S>W4#qH`vU2sFJ)v>;wDj|*PT#(7
z+pqhny-znCD~e3sxn`pb(}Fb{=lJ%mOBJZ^eQK=JxV*b_?RoWE?vpeQhu=K0()WzE
ziH=g`GApwidk&qQFZ$BsUB5?5x|ik?%iT?qtJ>b|ofE-4(=<BxX|ma@_M)n%j}7E@
zYRO->+}TxhMpk|1>5tbmXC*(|{OI-*iH>JCc>BMen=gGbar(6VCma&|Hi@oVWPkHi
zLB-Y8Dob~55Acnank9dHNz}~gJC<MVY&M8?bPeQSU8Q85?e=a<3VVSyS4H{W25u4S
zZ;b0I8ZKY4t~*ivI+ZJLl2v3@pg^iz@R#e}(T%r`*xlMDd%)6X<KDOftXcfO8Qxbk
zxX)OmyLP(fkJ5K4ZqcoWMdAW~eZ3I2z+prGHe2=&8o^tper3`NV7b9wai954BG*5*
z;+6iES0~=u_^H~}y5~r`3{M*`gO_uT{cFK@eWKU2n~c(w-xz76+E39mjX&piFP1|s
z)2^<%;M2Pg89$zV3O&kRq0(p&*0GhlL(XA`YS+c?%w>-=4*LEo_MBvBR=l^OO6;?o
z?`(~T-_6VO=Pokdzw7C_`t+Z=@405rUSgE|FR5Tti}>vrDYqM&H~*=d&b!Cwl*?}S
z1!iJp5^tWC@6JisZrpgc{6Jq$+1(pw^IRL!gA5k@;AWGVtyl2t*$EEuZ#V9yxUM;)
zZ?D5Rp=ip~-D^!JZ=2q_C15X`vux_qyfq8AC~Yv#6rVedxopbR>D%XTVw~r>yP@Q$
z#0LfKV%P68GkZ)<8~K>1rEXGcm9*(eZhe~dt*CW%p+-QAoBS;SdEuFpBX;gk;@Eks
zZP6D7r`L&VZU<|#B;}udweQef0nw%2jxxUYZZH0xD3L7sPxRmk-@mIhWQ{H++w$C-
zb+t<M@;mm(8pbSTp0A%iSxR4-xy|mz9gZsj4>Wjwep0fMeloKs`^NVZN!<c9clp-&
zNGEN7+b}ohPvY6Cb$yGwO7$I!O~W?))o84}9PEDJfc0b!w!jDKx8_<^^&FbFVBb2H
zZ@G4F4p^mc5_q$(==N#u<30zr|0vsjr_4n7)h>1!i$Bex4ZP-4c+7jmBI7oP-F_tf
z;=z^F7a7L#Zi{~Wc$R+l(yFN^H}Y0re=}+6ljjApA?C9)rLIhAQqDem<?2Z`!>2RL
z(pbCZS4OOlys>r1(jtbg(}$DWrMnO79ek><VX!Ij`ZF#bhR2VdAAWrKw7K}gv&-aP
zKaUXnyHoWUV^{Zle!sdsHa`q`9?Y8hUF>=ltA-xGzvm>)yuCYmWH#+$cG=LB_Nrya
z#V%XdlI1D4uW|%;%=10)>#D$dmE~(J{3P9Xz5C>~NSupvJ5M{$aSI+H|10m^m@d}v
z`P^S|Z<@PMt;3$aOdnpcb;ZtEZv)%<dM!L&O=sGoed+zFi1(sX4CZWPY7XA9+`#Bq
z)IyyTl2bcYu9)T7H{r7PJdTgd<<HCczTQ#Jdf~m|M0Z0qPu}BSURON~x%Jrf?ko;{
zuHzNQsplmizHrhlryT|UEDs}$3KSwV^xi7y&3#nSvs!n%WqZg`#moFkmv#9h-*sgc
zpWD>soc6nF`=jG-D|StmFpKdIS^nI5X5kg?g@@c%vSlWOwP=}lK0K&@Z^@4pGdTN0
z9#4t)_%KE8v#L~i%5{B?+<kG3Rz3l11*Qqda4)+2UB2?|Cy^rzr}7GO4{w<$vX!lK
zZj1=)j!mq87#*EujD&duKKY;fJoWkAY5!$f-{ikO(i5XDu9<t>dQAnNyV^l#&N~l<
zp1z&4L(1ICXT`C(0*Oyeg~KAHPitf!TN7$>dJ9WrTehNgpn1_poy$?iiMO+pXMUSy
z_*&$wk*wpihjV!+N9}Cn*!(DB+2*{DcW=Io>wbIA$w_F}?buR@P?ZiYr{y<H8(YE(
zj`ke$%AI&Zon<KxXe-C$*-^re{p1_1J?BSm<C=cqz_t1dhTjTK>KwbLX3MVi_du_p
zRNDEyJ0Gvk>7H{#H{4R?*Q3z)R%_Mtk`6{|d`Y`rJ=vR~XRg&u3I1uu1~GFN*)|3{
zJHJcqHrzXt#r#3X_0vk69zUl~G;-@cs=4k~&z->MtJbb%nrgOAIBWLvW}(oS%Hs!@
zeA{mSVkN`Xt)X*NPuiEh)SlxkF8J0of6m#@>#DPsp5+QnFn;j;W=X`lgUpj<_82H^
z+uJd5yN0P5b0w?E%|{=!y=I<mxSxJGy)sbn{KI?BAF>=Lz6qY<HM?;SQ&eu@57DJJ
z(hj`e{Bql!f497T2swcyt7g0I=+55JBsAsa4$fIUxvwU0=}H-BZtuQ*F!|100XCPt
zbHhD^oNZ2TlzADFkuPjps$%<2VQ1NAcf~V`4&s%fB@?-qckjvDrLlTJcaTNwl+w#f
zw{q>;!nNEx`)*0*`X;@%hhAQaGmo`ey})~U!LE{PzTyXaEu>?2wO(GjJ8##QFvsa}
z4@+LIovrsb^up43i`ZYUm!1Bm^<q=3MeMfgKH`<4zt+X<*r&Zd`u^1Lh3`+bzTW+5
z*VkC$g*W-%|0=txq`RB3xARWZZC{fD?>nlK9|ra8@OJz1DBz*q%#vLld4V%uDD86X
zyu9>*uGU<=MbRN@Ai+l^nibt%%e!BQP3_cM6g|Zvmh0Z4OD~mnxu!1aej%pnH@#{5
z3KZ=L(|xRBU1E)9zEFBKNpQLML9p?=Qj9LTUQt!{o8A;_^s+>-^kmAS?iJo{bM#nu
zr(Ale^lH*c7xBR9Jr=QCWha+ha=oECxmE9wo@C-Kk++jPm!H=95}OE;y|(r}*X|Uf
zi%Sb?w`YKC3R?&gIP!8+UTydd)ybWDt*>{xf{fh61rkv9o8I89CgJ;8e??lV?YW+v
zUo#YMhooO~*}8RMVKw(g^9d_*3}@;*`|;lL=i)lG#>a~`O8;@|t6A)_FVl5jru)8^
zF8f}(?R)9E@1^^`n|$@k?g`VB4NeQrc*=36h$U_2fj7Us`UE_PM`au$hch;x+P^KV
zcKiPcDjOvvH_vqQ789L4|6XbFB$Z0not8UaOHX3_wfV!u13rq9NA{j#kF374$6|M#
zOV@7cbN<HHC)Y+ko5K;T=yECO0m}sq1EC4k{ZgN}*o1#|E>fK0sn+1V-Xdm)w9t}5
zo+thy^Mp3;vHin+b-GTE@Lip}eACNH(~UE(Nlpv8xoGKwAKBlI+y0qXr)|y8npER@
znWs}=lC<o-Z1$qZonH>`{eJZ|%jB!3i>i1X<4!fzL^Ul~ma)Oy-2U<Bd5_K?*0{o7
zuKFcv;hBzJj^BTFEI)g!F-kjP@6AO|ub%3flj?eIlTx~k6NHYOI63r5%&rAn_MfYX
zaeV2J`7=OSgTHUL!Bs_(2S==~hdy0Z6`1RGdVX%*0!`iMw@a2!uv-)9oBuHWN%2l!
z`JI^u+YTpg`E;YySab`Yto6!MBAF8mcFnE-l6UJx*MS!iFHcz3=+At$_DW@@>OnPq
zWBtD-r?v!ZDC-;R-_BfI&f<37RzFvB=Bu|?Dl^p&F4Hm8&$a9|+ADHO!~2YPw5Rl5
zeS@lhl`mC-_fEFbpUaV>`|HH~N<ICOyH7UmUU{KZc;V#fP3tBrW&c`v;j8k6i@l#M
zJ$a{#uQ9Q_{O!TD-k%@x)=A5G1%7<q$l~{Qj=@sT`DONu%U)dKKQLwX&)q>%A-6dL
zTqW-}cijy+$31=08ME6fd$!7Q&z>`X<F2(LMWs_>dQ|lfM%*ov@>vUF9*@Y>ida6k
zd*hQ-$<_0}i0pZOvd1-=CE@jD^*(<a{e;^m4}S|{e0`MZn9M3m#n-A@dJi7>HS26*
z{i(1x@AaMqCr>gje|vX}>zSOsuX_TPYMR8(`}t7%#tG|!SrxB7>G1zQ@Zi-M>xx-2
zMJ?$%{m<O2eXo^Nrnx3Oxl^=mx`zLgvQ>50`d+2`T$}4zndl{=y2+SdQ}>6#Nz24n
z>gz%}Bt05E{cf&YP#AY(($wCtS2Ej@o*M|nOcdX<rS<CLwXbr2O_5pqOm@cF)mO}7
zK0o^O!Q%an*z!9b&v`PRPtkeLVas?%>Gw)=3tPFf))n@0w$sa&TUy`GQ!QFG=hf87
zi{o}K_&It0#O;%9+t!9iUhpz(7P=n!v}(K2HQf(;`q(e&u{7u8yg4{guW-eq{qGJ6
zd&h1TJ#y~(x42i;)4%U(J&?QWbCLJ*x)=-gCH(w8yh0vT{WrdgcS}~Sy{i!E*tKVI
z$%lH6iBqOs=ZiTgDzVJzm(!Z$Z~w9{&v3I^o0FGUd%>qR=}vCp36XcRf6n|nW9PYY
z@XELLC;nTaIRXzVZ}=qc5MA=w<6J;-<>8n5M($T_TVA+dxt-%V`%_x?oDbmve-B>C
z&B;38QK4|_YsgjgZ5y5Mzu3B@o}GQgJ6VZoYop*R-()OJ%>Jqr^U3*W?CIIK_h#|#
z_+$O`hd)0JeswR~;L3tspwrn+=gpE%{=>0<;rG3#%%7fLRrjKX@A$D3+f#I;Z_6s*
zo?~!x(-R4ye=m{GX!p!rQ-1pXiML_=x250qwd|k1+ji$y-bq{s4W6bqUhnL@VE(v0
zx>8Gf<J-LFuN%_d+Uw7kohKLbud2*t>CKzF!_|+ouh_M5>(}Df3E8hdd=mIu@bekV
zR&&)7PRB+onQ1F0uU)%%d+3C@8yw>AWxtY0S&{en>FKG5?4}($J!i}6J#$`c{(j<$
zTJtN`IpI;?XQhP;R$8qv%FOtQeAN1sRHqWqQR{{p8lLWL8ZXZX^!>VGU2PC-|Dt?V
z?u^;o-p1eGZ<)C_Q(FC4bDG?WX<_+qlrDvBZ`+}HB=PF&AA5ak&92$ayLT-+_%VO2
zQDAm&dNc3N#(jUc3DxAC<$WAxoZZX#-*Vcv;;Yv-I;=6hkkGKBx5x6{yX4&!7xLcl
zzgfwDZ{@GuiB8*6u5Q`#cxLSPg3#y1d#*-SbT$9jDqehGg5vMD+n@N~I)9I0>)*Yv
zrMN|T4g}4O+7*_&Ae}|9KKsS2ue|HkzV))dS8=*@aINR#jd^hyOP(^b9jv%fa&EV|
zVc>hkr1Q#`^Y>qsIdGwz!)}pm$n8}NW8atDxb$XrYp%30_je0vdy@<EMKrADm`Wbl
zZg5IesXnoD*9@l1cch+O*)?gM`PNRh_zC-U|0K3t?MQB5OuWn8^y-z>wLM>^UrQ-o
zboSkw-?4v>a!a`HUmHDH`|mEnSCR9R&Tae9?0Z^<H>*T3=gx`Q<-c-sw=eS53A^C^
z!nAeoH_ra{S4tid#X@HaTD5K(-fOwa?y^4j3WK{{2glI|$MXL<^=1C+6mqVRP`zy+
z_tLKM(VslFHKxqEf=1oRVn)k?e@SNdPW$EPd`;%xT?gUA75!gkF8;+Rz9J(pYg_Nv
ziZ6|NuE#F;SWYiL$zoe9zU*+9N=kmg>Lj0!T?-w#g|BXES4cBV7YzHbZ>eGV=A$W1
z(YtH-7S{Xje#vUhbJD2rX04f&$JyC8le+3(p1rTB!<WOWp4G(U7~WQAUJ`bWA$H-b
zg=MSHpU?|(^$oE-_`0Zx&-X7g%YKu<rQkJiZHKb=y<ffFP~k<BN`m@)PSRJvwS)F8
z<(NqAnBDc>R4GRA(Vo(RU*A6c`EsO|pRv<mkx_L0pO2H>pYzS*GL$WE-pKyb#6f6}
z)I6V03`sE*E`n?0c--2$y^OafytZun&Yh7<XI!zBQ`;>w@4>F!Di5<?pUN%#o0E_n
z6p;DqdF}W2(+`HrdcL+}@AR&;%HvotuUCCnQFHEX$SLqyf+4T?OlP-v`EH-DR=2#f
z+$r2_p@FW!zlSq#-?*{#LM8vYL%Hh|gKgo*!9SRp)SSqg6t@2AEK@1l3g{v@cF-a?
zv)MFR1Q(iuSOgb8Ba=VlzRA_&yL1>IY$!f-U15cGgZ`(0&I#v^`?=f_R)}K|In(ca
zO*?(g^!=9e=G{+|uz6Q4A+WGa;s_&?R<;`SF!+Y6{dw=)jvX;z57qgXvsOxu{l%W=
z|Jjnxb>=Z{?EM~b|M)6f={v!<B%IC44*z|)eWldq=>-#C5MBp&@Z+tNrmwAn&wezz
z*qy!laYoH2MwhbmMfPf3>}nqz*wb$<HNIo38hUqoVzR7Y{)w#@Liij`9<^Wz-Sv9)
zE$+XrZ>zRnThmb2VEx^H-DT^^A6`tgs`|fRR`Tjs(v6)yFK%DeRc1E4yD`#PU(0mm
zONQsCuJZ2e{7L9Acwug1?!pO%|0Upu!8h^;u0H(x;CtJj8Y^CV`xGD7zH{@YjpWoz
zC-pw9myKN1-7e+3Kc3xXQa`8Uai`cfr%ueUPjcJVt61m0%HHK`$ozHu+Dy&4q#g&~
zu!xzI<KRQoxt&$xg<vb;rmugT4p|AOQU0STr|-&*ReKe(7rE)IJG(OL@zb568+LD#
zQryfuvGrti{fF7vo3=i<dS5~19y?>p`SqDKmL_)Hr}Q&Qte9W0img4k{Hm?Q!=-k6
zo!=BSv@mSQV$iGVpJ?%nQ?DQbv=Z*sTEorec~@83Ro>ZnW#(4KtuOM+1%Li))bO)5
zKbCT4-^MTYTV!|I{_k)<HiM~p&x%U9`elqeYD7|ejy(1`6R_{E-?86w50pKBQ(DsM
zaXtJOo2Tuh6>hInL{mRyHx$l$%bL0U(e)rH#-a^xJ9JjL=j1h?Ovn=6!(D$trdwv6
z*@2hQpAUvSf6~9;sA5u5<-Z0tuA8<IPbRSEKkQq5o$q_q`sBMy^mYp`+Aopt<3mk>
zuFeMbl^>MPK3FSZZOp~6*?KX5P1%YWyi#wQZZ5gVZYMo8YN6hi8-JQ>r${_4iOAux
z4Qf_SI@tQ9=F`pDPRsvttU9~5>IfU}+XCkA&&wYOs?Xd1cIm?{tdoy?HQ6z*-%CXC
z*CWHY82gvEoMlri_PmZf`77_}a|y2p&9Q#(<tAULvpCjm^@5{m@8QIdM|<b?cEms4
zec<dI*$*|f3G)rw4cqwk3G7(5**P}yob(Zs<ij@2cb~4`KjAWWP1%{?<!2k}+|!@l
zJTc?px#cN46E8-(8XrCulw&BJue8i)RrxBr#iop_^<VLY+z;gpxH?zMAvkx>ib<b8
zykFJp*1`Ag0AGlMRQUR`d5<>kU!BBZlD*{IR;#CGf1YmtkSc4N^ey2G!`gaV)j3^z
z)Hd)a3o~fwH7d@T#MpK#hlhhHuV==&D=(UPufH^XP#vi?U!YR1P1kSj42f4i_J{3#
zs9DT>ecqBy8$GWn%{!*H>BRniX3qaB5ASD?_}uo;T#~1`@k!o{zT4Vc=2!II+}3!<
zZbNP6yW6F6WyBMb9<$~)I>}XRd#$nHgBWA~2Fah<hRKt&T(6n`tCUGN==JoNx>@SI
z-;7EJmAPF4OP$qpa*ke*InSxc^5<Vj=P7{#LzeB5-EWM0?|xY0qU_YMGw)2oG&a-p
zb!FMEF*iPQHr?Q^-nUdfPq=mKp8U9b=KAkvPyc@Q^zUc$<yWfL-=DKg<K+AbFB{WP
zliTNPHSKFxA7<RN&hG^0r#mLkmaR+VvQgR)aCYUXGf!vsUNz0_@hHr@d+3(omA)|f
z<lo0{e^s8cqb;(n!%6h4>E%PUE4hE)GbsHb^}2bMC)+mO6+eAn#h=f~uxt%DQke68
ziL=H0i@LKzgs&U=dd3!hJ$I#p*QfM!ZE=@h$sK7qzU=s2xr$%KnE9U``}uV1!v8l4
zYcbAtzr^-$`P5<;kzY6MEghFU=Ps!$DJ=PS`C?*Pg69F9GwW71GWB`3EaN`i7HMc|
zbM^62j)Xam6N^4{yqMM66P=H|7-v=A)&qNzeJ@2N9KHWD<7nA?Kl=?wZ#YalXu%r6
zqCZDda+>k~S?0et&RyT5tyfpo-M80t^7_fm)wy5fm`iOwM<lZUeJpTzE3?hD+Xr&g
zyglB%DY3F%Ygg6y)6ePa>DFs5KYm}H=sU~wg8e7Pf_1eQ6h)4l@0MVA{#y3RtCPB}
z=kEV?3I1sFlcROFy@Ah~W%+v?#rvnN^}V=|ZRWlU{k!%io+_?%p5&9Olqy@OTU4Uk
zyr9;iBh3B5oLv`|f94dtYqo8zhXVhyTdMbd&H0k?#CrOYin;wJr;W~RO?r^J`msxz
z(fajWH=ez^w_>LL9Ba0H>)W~&_w#?yT`jyPFn;gs_X_u=JANN4ovNu~-j<szd7#u=
z|Jl6gT|z#FVkh*)JnX+cJ1duNvtFXGXW2g+PF)6(*Ya{xSc0XxL>eN#Gq|09y=PC=
z^9^S<cx;n5$!&|1pYz9q#iHOW$D*Ws)8N^?2f|F<-Yc6<nVMU->EO<+N6#aqc8hqP
zegEuqa^<%7OUj%7@%PtD&3hj&H+f63z~w9JdmYz#`sOV<;QY7Q&wP4yX_5Dh*x<zU
zoyQlcHaU1l>M~uhcYE;T!;6}Vx{{(@^(Qt6oH(fNHZlMGo7f-w@7$Q6y&}-DG{16d
z(xu{80$0T*tAAwFX4$7RG0F2^ieH}HxkI4~7Fm9nVc(ok!4&`4S88VWO`dIecDJ`C
zeJT~}6W5p45??Q7=2E|xA@xnsu}zk3ACqoRUzxaAMT;}K*3Qdhr>g&kCoY}y(?o^3
z;vRKcR=xJ&<*(Z`@raLSkBUI+f3KHsJgzf+*k1WzyEV(dzmp$_`?+1J__6WN9z*6V
z2`Aoq$xUTF0R~&G?RTz!GEd^fzcW*x^PQMmCTb;<bkj~ocxGx_(9UhiT?<<e2+aGb
z$Io*@gePHwZ`(6|-U&_`2lLNGGSB;XRw|9rf_G}R`K7#)U-zV*-_pIsk?*<S5W~k~
zQ)iU!m-4vH6Eu_g<<aW5iVPYjud%huykZZX-!OB3Ttc+<l26Cyd;RuTc(>eNX2HhF
z2HoZSuTmB&?nq;}CTh7?;<d8JZtpi1za;)Mo@jXc?$pK`y*GM1y84c!uWT?8h>g0_
z)NIg{pUJ!YmrvU5yp7#ck65}tEBLg)E{ad>|GIV&Zsy5v{e<Ty-Mhwh^7EZq6P*Iz
zeH-RxmfvK1md4aR*L=f8(?vVmwp!O7d(OSb`Tj1?j{o5@9CG<PJFmL3D3z~r{PB6&
zuiKq_yRT2UQ+_SL<m`tdmu&U~pP1w@V}Doco<PC73Pl$dKM?i0{#UQvF7Z*FS&h+(
zpPV<&94pj5^1Wj=``sP8XE$`e^E>`(iRA8yQ=DFG=3JO(-!1ScD|NxI)-6WI7PweP
z&3vI*=F7`=BW%C=_0>mP1Kg@Od=~7u7yZP^c0sDkiHEJAiSP?5i@3kGbeTRed39jP
z7s*nmTmE9wiaxyoeSeKk{=4k3oTo~oS?<(=cB2;$PjgiL5SsL+UHGy~@lE#Fd;iLv
z^H2TtD0-?_%QUN0!E;(U&ykalL|HZGJg|GQwyk`rV!*+wIlW9T6@R|GA`@FKIpNpI
z^VJi-to)-^!?1GEW}b@MC(qxW=(6;WTH%96`#jDMPBkKx_c~M39-DJEsb5xCd|E4M
z5PkCe?ujLj|EO(DFj6hy6tJFjptw;jbBan_uZ6|_dp_ljGTy1{b{k!vdw}2m|Lw)0
zG2gaN`IBF?{p!oDhko9_)fMurKKl6iTc7q@>V&4%Yj55^_2&IkZ}L;WZ8!QIJ@fC{
zGylSf7e4z}6T<+W7Cq*LryX7x3GCu&`FCs6{$8<ZxjvpkX6nHcTC#K|?Rb_VJ}YBm
zWb*~PUw03vnSd{$_M2DA%{MXAX`^&+N}6Hb#n!?Gzbn$KPX<*uK3n^DqSdu!zc~Ig
zuI!xiB=+X#JXwYrR@<_8jm>69ygA+eioLcc&R;IwxJdgQY*{L+4Ay0-yOn21w*OS-
z6m$8{f5`M{Z`fs3sa4FUA4<-Az&{&w3H4vE9m~%6M5L+d7z<CE$$8R$=FAOed}d6V
zIbqU?%d#GGX1abB-PKaFxZmgS^<zr;wzXbIgC3kQdFNAVb@j}w)@8?Tl(XC1F?la=
z$(>Vw>F4>4{`Y0}O3KB|o3B#*xi@dIcFU6NGdJAxzn#CpCY8PYRZ`Ms9{Zw43AtuB
zZq6>h$#z&@X7Anl(jpN_gR+Se7=OR0;da~e<Ezr`2KD9a_WP`r#jp3>OOyG+;LlO=
z-E7J$kBEW?ej8E_Pw023YbXzKIKvhY(4@h!SNU;yot@3!d3y@$zWnFBd}`;z=^y+Q
zy<2AgncVjD_|ktz`b(AP{Fz)M>GS{Pw?qE_JnuQoF~2tT&*Z*onqSj7mhS1a-^=1@
zI8#{pr{3qZLye4avKwoJC)Hc`6+Bq&UhepawXIa~_Oa?lGwIi>cH3!j1Vt%%#7ezQ
z_}?CG;&T1+$vZMSMT(M2(|u|s6YfmAa%@?>*C+2?4;RjEZT(Rxw%c$gXSchK=J!;N
zjeKrr=KnU5+~~mO!@qGxPWw^iYeMd8qCIw9%BzlDvGr)+>(KA#{Fo<;nPxm#Bq$MO
zXdLEKcC)8*Ptb)|$zgjetUPBK3P|4wyZron#5+HM-qwz!aG$=LJ(lG`8*Zy{=l=f?
zE^e<^wrpA7LE$FF-bbR7i#%l3Yg<<59ZT7h!uhzga^L@NN|O50>;Bzsa{X)3|E%cU
zu_YJIHq2CNi;R~smi+PY$A7s>o|8x4$Tdw_Bym*bs_s1Y?MDp{NnhZ%pD!OTr+WUX
zE$8>1v^`xX|7rGInyPc6Zj(x%@V)A~8}>Ff{xeleZOjg;_m*$eNIIP*6RsP0<VYx=
zWJuq9{_pzVC#!d#5tUlK?bUJJu$NY<o^vftI&Qu&QrjrDu<_8@ifiwzm_B{Eo9ZK%
z=kE}-;XrixMn=sm_ZPf;lq|AxMs6Of$H&V%w*C&;YvujW@64>?<YS&i_q%VNYB3Z@
z_pNh!RK{=Mk?uT0%usI$+tzc2D`J;iSF=tn{OU4s&z6ZdE~s7Uc<{_$r2qfl_fDG^
z-L9yQwAAXGx1(-Rg5-;GyAL0KOFDHNKNc(1_S*R25mQmt_jOlPCvTA8KX>ooU$ue`
z{b!yzH6;aI7t`mxzL`{Y*mL^b_-hqAlwR(4J#ip7d*0z666ZcIo_}v&wXkxK@P`NM
z?kzCBq3J8^YU>sn+xX<}v(vgZw~si_GPoI>n>C|f;_phU{-gk(P<FxW*hk3?rqb8n
zN*PzDA30OK_}mriDyE-#%Wiwjc64zPwtX>~Q>MrA`|5`pr9OOCT8SEu>lU43;CND!
zKdrrUo2>G!Fb9*F{#&+fKGCVr{lt8kjsJ_oDKqN4#rAB!73tdf!P{xxC7*X8=W>!R
zReitxxL>=wUA0MnZ}|IPVkak_|G4mKkDq0<y1)Ws#ka-Q3JX{N{cL`?*<8Hc{!#r>
z#d`%0uOw8I)!ZoiWOVpE=!S`ix+Kr6&#RO?<m2VNGT0x62U>G|Eh`MjS9iGE*&fx^
zyzA_OcP<O2sjf8G;2FQMpuG6N-SmQT%YxIahji5s+&#_sow0fM@y2LPfjm{lJWa8@
zrP9pbCmy~lq!T<l_g?sf?em&FRy(*vadw>8*s<r;am7aldwLAMpj}gu>1Zd@sl4#~
z;Z3m$)84Y^OpVZa8eSM-b=o;G!YV3USee73f9pj7KW+1w`llB=l}m^wY`UT;aNUn-
z-P$+auTDe;>GIvV%k=Qwv4gb}wk%n4SYk)~;Yn5vsz)1lhb!FK%d+Ef_=VRNRr~Xd
zcchl2y$XKo(ELFw<IusyJO0l4BHHc#M{1%~VZ|3oIWG2hkIHf`h3nk;_~)NjU-R#V
zgLk_$u1$QF&l}x*O(j75w9%wuCcXs<S9-FZgHCpuY^cOpEq8hMorFzItnL#Y1S$D5
zEnMpP{&#D3?UM#Gw$KpaR}V`3Hvg*JrsDGEVvn;)0m`)!&c(c1dg&9AIc~76ILNk9
zNJ@;qw|t%cX~TEx5;j^qJ8?Qm>8I@4JXemTy3U>)r8aZ)?AlIUJL%Q)cbkcZuAIiF
zvh&QT9ElPVvot<3Ut|?%_pIr)sb9b5h{e1grQeMX+<!Ld(#my?HXJ?E_7$H0_HXh1
zN3Jaw4!->P^rHS@^Ggpe9{u<|UtjP0`JIN2>D3({l-NBa((PgcZr4r!{%Q8!|3A7<
z{#YUOm@R&m)}1b+Q`>x2K5~*?%G1!b{PQ&C?4HLNnGrjm2A)`Ge84M~;fS(8q_AP%
zf&x!Z)z`CL6e>1-a+$K+K<9yKx@k1mR4>j&?_~7X=~k_HV)0Y$*j&4)&XOk{hr@a<
zo5Tx7?2o^qo9K3I$Hn(6Tne}S{?l5!_rS{Z0^1+fL9s&bKW=$2nSbky(i!|)bM3M!
zc)tEiTQN!7f@k}hqxWL?ja+0Zmj4d_Wcn*??z!^fW3@Kz8-&%5IPXxuCwc61-gS9D
zL4~3-oss*xb_>lv5$lz*$;alOX3-^$(oggL+qZvUe!s%rVZH?8?0!2V`T253+0C-T
zXUDPDx^x}jys%tQA)sf^^EqcY1Uw!pu`FM;x&PaTXBV%viHU78k4l;6vc)OU;K#4<
z<?i2Su^8NPl3J*-yWpzE&c~|)BSd*t@W@F#>YB?S5wq9zT~4sUiB)~g&I|ULR4f-+
z82Rv(N>P94ndS*oPyA47UFy1cPgD%A%e&2!8dNrDGC7?2CZo`hamI1=`RxHwelNIf
ze>}RuqRu$GLDs!7*WteRCY}B5HPr#)k~`!A*KJpr<TBT%hdrsSzP_yH)wP!@=Qm8W
zn|HwTmhMWP-0F`x4k~@Km&S%vI_zU$R6HuE5WXa8OM~2DTm5(6Y6bH*-2C7AimA46
z@z#0HTV_blXtkE+agfd8$p6hG;I!?^ewPiRO#++WBrHgfSlVVW<&d=4@*7{WEFJYM
z6EpoL?C0_em}jPbBA!A0M0~qX#?(0*Ow`wSsC_V*>ddix&i&OYPiI=CE!_7YLVeX~
zm${a|PCs9x%J+S1-4B_qM;_W;<(JgzbU*ZA+IrP<jEYu%3_SkMZ+1v6T5$Ey_J>io
zW2F18-pFgVQ)b;0Ft_el;ZHYdi8h(Vx&g26n7=4H=J-=BD*D;%jD=jUFIsYlF!$Sh
z+4Jn9PEf~UuLj4kBYYhbS5!<t+V#UjCeBbkgw3J&V_e}m7e>Cm+9S8!WSqrbabAoz
zP{|aYaX_V%Yl&x~XY0W$N8gGm^ZqX_H@}!({`A@>mu+JHGrmPhwrbu#e<iG`PVLx<
z`cs$YD|pz~-in>OM&w$L)T7g8!qZq+wmx{-z3Ss5?nysxd?=bT{q)D~*uGlT$3;(e
z$KGB$;r7+Y{!`O;%4|-I><R2zyXDE%6VZJIk9s{+eg5ZexxyMY!=WqI)ADeThlr1Y
zPU=j>AEyLbrnn^8Op|c?z!ZFkW9lD81(ioF!c3cZ&i+`l{)^>AS#O@nz6<@tXB}Lw
ze08#p(wTXZ5(Pir6u3y8mpY|?lSN$d%@f(6+3VRa&g(6iF^MBgAtrZC!VmM=ZyT;N
z)I}XRa{r`!>vE5Y8a5_BKA)d<=G)w~M#iG~7xGkDcKzAucwXSB7;F5$H&f1w+z@kg
zh+}=NaXV7rgaG^Th5PTQL|lm9<WetsE?9s~F5qy5P{YzANlpo&3N<_p0)eG9NghXp
zw<)z6HQ#tEwDI=ZyW8W;r%l@Bdg!WR()HOd%HHnVyV+%lalKo3MR1Y%su!1}C#J{!
zQu%-O1jDMi%UiNueLW=+a$7OPIwoYdKSyYz_DsVa-<)@p?cDKgp2)hD*DaC@Y&jm@
zdi>~CebA0&aetpYt`dn`CnSFTt$J(rtG5><Vh+C!efDVA|0M;!dzGb{vn%#$#l*y~
zWx8%(tUSBQQ{>UVU)Pna<}cXke<*sk1J}K??o}5}JWjk|wW;|1z|+w8)zVPA%X_9>
zXf&KFZOmccGnKX7pX=(C>UD-Iwl%N#<a+SpWGB<FS~)zc{wl1h@%-@1bK$J2YBRR0
z%?hjjY}K0hRc~_rRJDK0LvIzW`#U-3RA*FC%<inKCg+6uAJ%iseN)hPA*NpGl5S9k
zP?uQ!g+De^%iOj^^|bcCcV4s2>4wDar5_@fZT1msv^PpyI49ur{P`U5_o5HA>Q#Ac
zJ(Ae)!$!BT=8*0B);-JOxGtvp`Et)$%f>lRr0^=oxnAi7vlV~%eS9a(xz6leY*kU|
z{rc&0)1vaGJ-E}h-|0r$ajk-dwWsFFwp=Z_e{K60xdYN}po=P+9FMcLUE23=%j@|k
z*BmssW9|MVZu0+g6L0u*t+D=SDe|iKY@Fj>PX9>~%ijGtqG95FEWxhQkj31si~HlB
z7^n17?eeEi>7}1O1-CI=+S)y1s?Os>yP_NaL<b$I=`)Q|@n6>@-aT`EYSVPfXGgn&
z=J;IQDc!pB(h;?J^Dg!7^pHQfTft!YoebNhulav}YM=bOp<}1pdbW3Sby-`EusU_@
zH@bIv`SlHRWL5t^%>S{^cK3e%<(D?O6z%W4|KrrOjE7u@L@RUN8>y?bZO-|+ZqLK7
zPaf4x%{$f|a_Hi$cd2TXt&00^URz&rC*Muy^SgwJDuUse3-`ai6}u;BX7<g*qLew@
zhYFvmPMTlU`9yqz$Gjb(_A7q1{D_n<`F$@ubl$WxdmCy#%=Wb1U-?{3=(4W4cx}u#
z>s`W(t67`gPpDpM@GDB=y=?ob{DoIe9AW>>VZT4zJ|jST*3?SX#R&<Et;_Azo_qDp
z-F<d1)3O5x(-~s_y^{_1S33Sqmfb^JY=V9j`}u;+d+r?kZ)g3ZEKI*(+G&A@+9$Pd
z9^JhDF^_d+S<dxsv)iBUx1agqR@twF-dA65P1ap$QN8KxUdOwWo_KIrmd9s#9*vw@
zxWI#RLCr<$$wBXYo}LrAIWsCK?6%SEyW76L@wL2G)OJ^s|5*I|t&%I3?a*6&IW;uW
zWZ@cy;|0O}Tb_J4>iN%1<+w`T+0DF187_6RKIy*Kax43Oi`y%i@^{w~yfxUoUYRZX
zI6dR*^RjO1^<J}|ZR30z^ZdYHW6y)C&Pi<-U4j>z%6rDU7AEp+;bM=P_H*+;d%=Tq
zDra_XZr||Z%p^D6!@Q2uzWF*xKTOkTzqEOw*80rIUtROPes<6Ds!R>m?DkVN|137;
zCU5wb*#9wF@mFHBv}b#}nn)*a`+ernfg)~J`*x?JalQ}O>enYdb;?)&Rr9zk>CD8*
z%iOom_3|~B@_zW(|E4kfe5>^44$n99+~c!~EtjdbTDr|{ow_uv=eNT7st3*sb3QK=
zxHP3`O{-ID-NB;g-l>1jKhw_m=<qJ7@N3o4eNATN32QFToxARAqyk5CzG1m>7565U
z6$_^spEcU#mG5Y#Iq6{F1lgNcrG!@YH8CffU3N2DX}#e7-E6g44;HFlT&uE9s&$rO
zugU&4t1AWN-YbNYxLG%LPWSr!p~EuqY#00fNme06{31c(hn1rXjrqkDfBPrY<TVy+
zY>-=*uh-&x>{EJOOA?n>YMN1Nd%*g)PmbHxK40Lh9A6_K65{QgSFETYSvB{EYogit
zn3#=M#Xk9SF1Yw;(Zz-5QvPQx<-6zQ^24Y1W6~owp9gHw74N=l>AOpb9Jy1SDcm}J
z--mCaQj)^i7o2}oSD3lIVmWNR;?lLyFAMtLR%=v#I<M7MljR_o{Fu?4A;VnvH}X+`
zk!zqw{q?k-z4fq7*^67_50~5`$G36UeXh#fwa>eE`!Z)9tJ1}=v({(jLfW?(t~Xl5
zBAxWhVt%8W{`NN?FFU0_4wF#4Ci2?(m&@jP8dkxDCChl`nztCw*K(R>;Uwn#g6Z%&
zzj<0t+bo>SoL>ZOy=Na<l9w(icHvB<WA{xCtEwcAo8M~Ev$?%2@9X&J^r^qf*<)$6
zEE?AdeHB-3Fm2rL`i<q!?6-my!ICq7-D%SjDd*0S;9K?I{qKUf3HqzQJ(j6Y%$9$<
z_WsB1TQu1|+&t#?blOGfvmYKml-VDZzrbGb_N!G_W51ltE?zx5EM_tPs?GxOWmYV{
z()s1#Q&+!o-5M$DyY}Pnhb3DiqWZ6$FjJo`&yiMe<Ib8#|I<Ln@d?^o<9(j!o%LI;
z_ubc>pItJ`KM4Q7HShZiVT+w|eC-n%S6@FH5;4Uk!s<zECdZ5D{>>9VFS*{w+&ZhR
za$%;b(`DX0*0c6}->;p_YRwWn-L7&kOXaOjhOaFrm4nySy}NO)^5ILBLznsOq@1oj
z*=S~TY}Vyv_j_mW=w3W|k3*?&<E>-;AFd03Jtnoy{#)Dc@8<a-x3AbgQY$_>bB|xj
zH=DjgS(R}Ysyr8*4C2_*-TBMWI`+or*0(0Fwk)wY;Nf~}Ps3MX#>tl%v$c!fgvkBB
zzj#kUuKJ;+9S20c4T4^ps3+KJ3T~LjkWi%0XK-T4eDQTIiF(^vE!IfyRy(=SBksU0
zPyd7S)C!hw>4=|rBj6l&q<ZC@I;|AWO^+Vw=!e{WVpzR0;OM67KaDQW*r6c0O{=Mz
zS9sOF!!2`~zYB}Y3Oam=Ev+-&B4++$=UU&nY`2SCgigr*I#F*lQGDBx*5w*9hjK2r
zUn!ni9<fYt$u`cOGZ)G(pL#00XZo2&FRgy9iINjvDnCj(%N=H4c_B<IVr@k2$&WLh
zvE)X3$?cfS6_ujL9OE*>LOrLz*7~7g#m7mFi*<KgetGZ8InG&=Jj{3S%;S;Doyc>`
z<uvcyIUdvUZt*!qA8~ko$Lb7s^rLrd^L~rm*e0xYwSKyie$7cE7q7duOI>dLe4P2&
zX@-tp)XG`j+KYCwq+ho@e3~;}J8<)&{>#xU50b67&6ZX(&*(hkF28&`$8Y}m)mO`l
zn5V6XJ-M=2%l+9E)}CXlpS5ZinqD~mQg=szpyhP&HAhqxmTN683Xx2`9k!w(DUU&T
zyB^08U&alSH`w11WlXfLWPiQnq^0Gni5y;n=3kTZIE2d$JC6G`7g%#T)ytIU2~0h5
ze6PvbzHJ?>f=&mEo3DA*-0{EMn%Nz3!NYCsoeiq*1iV%`t#J{3)ZneK-HNAER7ie#
zmik?nw@0S0SJZF$d!#b-SLW{3LR<I!_;uMR;Lz8FM~-KfEYWS*vSR6jDU-L_T87@9
z9K0k!fyqdJir1nUjTOs8G^Sc;>k6<<mELpY?7FLyf<!N^P;T*d(RKT{I_7=YoGGHr
zncJQ8{NFmNh*@4bRDbtyq=c=^Y6UUHjj#ja*uy~w#8pjV+ZgxdA>+LxIk|6alkUgs
zq`lZ$)||qs`Kj;H!T*Y`K~Ztm7CoyE7>HgHPm<mIJ%08vlS`SY#l^3i(_RTb&g*tw
zS#bZ&lJosDtN&<v{$KO%=Y&6<Wv4Iw-}E6}L4Q}J%Ero_=agUS8~Gxwa#Qm(=+j!k
zSCgM@EWyd|vU}dDUq{T!UP$kq_T~KphO2v-4{r+PmR%uS`s-lD`pb)^&90kd>Arti
zT{(aHH1q1b@2BT1x%a^@ShMuKsYF)5UA_SGOH%%4dkyPa?qB#F_jLC156*`2eZ7Lo
z>sqsJIhXD4UVAw8c!SWlyJgb<-#wbo_w!EDe$~i#TdUXRZ-}}SJjHLf^27H}_5MAU
zRuOGXxOJYXcnZE1ZrA_fTj7?u%GkTTxwdrE*3vKAxPsUsem=Dgd*yiRg<0B{jy+tP
zMB@0DL_U4$GJmi8GBe2#eT6NDc3n5w-F4!!<J3;x)8A88B?`-%%gvl+R(wQovYGPf
zRg;#wDtdP1Ie0$g6_~mJ$02XliYSM?ozPYMb8nfQbhf;I{_CwPKepS=T(R}o=7Vfc
z*8fCZ-zMe_THp3$h3SJ;>e~f1tEF!rZ7xf$Pw=n(;CJ;tuQ0PsxUaYMyql%`;iY!}
zJD)Z3Ke`@whS9n0&G!3~>@)4FnXi2NzAjs*%8<dkH0x#5*2Z~)E`Qc8%)Vy6XVwjK
zxjmCPJlVIa^&a0<xp3k%ehHSxiI+Lg-aO*6x4px!-)H~duwn-1`-(q0$^vp%x0UU6
z5L=URM<?g@j7Y2pym4P)O?h;yW%WkL0dF2zdY`rjEB=v4aES0cxYj@|!u4W&)a0|B
zX1h1PFaIj8pCI#hTb}Q_FR$HJq}O&?-af={rdw>X;$rKDLgoB>FSl>K%f<5TvO@L3
z>muK7soTh{>Q+cR<9X+*=&F?C6~bZi0(-XwGRyo_P!egD-v5)^a@kLHFP?{qQ*sVh
zEcwkM^=!A~hHE@mG}pu{oN+o<;$@%w^;FZIROFRy%8cR;UdCs)Z9LaKXA;kpg)_yp
z-%sMKdZy>oF6!Cw@j=+p8IMGrAFozhmCEmUCh45gng_Mshnv&8PqJ(;`zhlzb#~e1
z?$c6}QXg&lonta#migwRBL6SV-X9zxb3@9nL7cT|9nasq7i;D)?sB^7{5EX<MBgP{
zvsP3!U4P0VJL?yF$K~urUSIFZoG7uGt)FxM`_=0b0wsw$XC}JY3A?R|3+AxV{CYip
zUBtp{_R~*yZTnfUzW*INv&Z!&*JH+i&R&sty?w^1Yunu&cAV{&?~9M;yZ<Ks&y5U|
z0&~&(*)BVjj#R#W@a65(pD#Oq%P|Q#zA(eRw(ZbI3fHzBvzoDY!-s3@8W%1<|IW<Z
ze6`5rUB?fnOg}6fQ$Ag#CO3Ac?z;KBIX+xkzJK?;|M%DE$13H_yU!I0HT{qCGG5vI
z(Iq@@gW!*Qi@$9a2-I!zy1OuKa=^-$-!30{Z}QRa#VIwBWvs{SZHlF(cZ*oPKNz~>
ztmzUVhJ#gs-DeDEKV-KF&M{cyaOTz4sLgK7bI<qu+->>Kh1bn>(yTK(0;A?eH7ju|
zF|$4Js3|{sG;f!{>x9FlM|NH5$z^e|O51IG_k>}yy>!Sc{@I@+H*o)Gx;-aHYxd$!
z$C9mHbyFNy*eCF~b9Zah>T$9asw{Atrn_)fymQ*COkI^NC#+ipezeZ~*6__YxOUBH
zAqGBc^%~x$T}(fe_@{Ebta;<I#Fp_9tHVJVxs<&{$0~o$ek}Aex9#BLeeH~bS?!K8
z3JW%+6)Et1{c!R+`;6l+p5>+Z@Dv9eeRTfXs)vOQ=c@nZKd|DvsH?#9TkiGmh^^_(
z)n3xcCywRqu>WHgn*2>@)3ZHyl5$V%cG>Z#ul3Y>{q5!T?2QLs>;CB5e^iXsyyr$3
zi}7>0ezTbgwTUg3bqW*xi%V_P=GQPxygTznf9Ih_PMZq{XO_L>Dfjmb{hoUx!u^PJ
zk*>*9=71tYKF6u=ey#fER3Ete-da=b1@aHh{hj>!%Q+RBs-=DR>{mRyvFevwf|BsB
zveMHh9DK@iu3hN%^3Ae3u(PPtIWMVhooTGXBZrFI89Yr%j1DUqWEw(NnXS$dwRT!1
zRlD?=MgO5QPBxxrCc4b~=^`jt(0d^K$jO-Y@6GqCKLrL{pFZPRU-*vAn=6g9mQId+
z5^uf9MV#MsR^5KS4i$M}qrTjRCL^O~{WB)!GXMD#^jC4!@?Ryj5rPsq+Oh`h)>_j}
zdgp}jsD4`VdFp#lhI@Cr-k<CiclnzpHuwF(woR+w9~8QKqoI}Ee}y5Vi0p;_FU|SB
z!ATb%mZtywrO9p^@X50GgSrCq%L&%;Nhv%pK6SilR*XHgRZ1d#u~npm*3U@>#t%-$
zF<pHA!%en5NA&6kDXy3kjru2^dGxNm#l1-_>&T;9b5@zf&5LH-oxNJn$XXzB#-8u&
z`**5EbI1MV&3petp<%XNwp2V{?|D4|Q4_1Vj9-|#uRXZ@O0MTa(ENLfW&NH`3=yUb
z;(MQa+1y|e|FBBf{?3A`>@#nAqf1x$%a!YtrsYP=T6zDS(x<=7fpg08dQQ%$Wlle6
zT~z%~u)oKU^;<>Y=a|Pn%mqI+PR!^yK6A#xn%{GKzFRlGJ$Li<3$BUl)_>uhv_vzo
z_u5IVQ%|llJhr*beJStg`lTjJPZDkmMuzm?xWhL2;1xA3ky9l)MLSwqkB6LP51u>O
zzDcaTqx0!cW+{!7?+Fu~<@U5%Ul=M!ygd+lh;qc+9gRCgAMy5ybNjI*vwJQ+sUhz}
zWR+8;f<tNp%NP7w=hd+4T?pf>tjDfXWn}8Zb4{E|3fRjQFkRYFwe_<||KC_q=LM0<
zrR%P0Zhxr1zg7SB3&G9o$!r;aUu!-Ld1Bg_DlwD6p^%g3;RGIoD{09N0tLxON|w3F
z=j`xX&v^fI(9f0=pAB*fvyL7KIR1a@D_;MZ(mTGXOzrjEB=*t7Y@+MGS{aWY{<8mA
z56m#<*?%%Yf=8wNaLJvxg@2D^pV`Ly<Xhug@8bLGUO(BvAS|t)!7cLXz~)$Y#@6i|
z6)k5^#CJ>14$<DU@8kK$4BTN_=5`x3Ki}gQ;FOD0=vpOhl$fa9_N>B>L-E1)<z69e
z4c&@6&PJrn&wSICt}12ac&0R&ZL`S=%i^uk+K=)!`U@Pnr~6I!Z^3MhHK|!WMy75v
zr55}21};1H19ZCE6$z8sK^kkL|1EjVS$RWw=i@mhOWuDwuYd8UetX`s+@QU$#d6kl
z7M8c4-F`#w+r{^6+ZJAIPTc2S@MTSOL06CU(b>;>%hvnlO)Tuz>tQZgbT7iU<*WT!
zm*3As-u7SFXm-{82mg-EO&_jgR-A&Kkfqi3^2QodAMMXbOA#hjet<1S5JW6R*oJgM
z*6Hn#r3gwc|M{CNo-Xq?3SsX{-hSDf_p{!%&r=P~rYD^}UCk@V&6FfvQtH$s{cM?`
zc`2{{x#JF^%o>vIx}0Z9Zp>j2bgV32Wq0hG|D{h(YH>OZ3R)qq#b>t^#J@VU&)i3L
z-?BAa%(vOzg)#H<wXsF{DbAS^J-zRXpH<6Z=ewH}rL|IXe|YaTHjOgrpJBU!540dp
zM<Pe~hFDO(;Rma@>0#fdKKQ*--sHl;mp9ixKYsszL1(1bG_w!(Yv(90x^VvANlqo(
zc!eF&)zGzg7mUy7iCNq*JEG!rxi$6hni*2_vQBjS9O<x{*|6E~x{iSAyFbUuc#Mx_
z^8a~o?zhP4c?b3+D<6+an0@7^gtq6Nm+adlq)!-0ENAFWm}#eaxae8@=QR6mpQjcc
zJ?fu-(QtW*(=tE4cUv!3^IZ9OCb?DiOTRPEb-oV~`OKSV>L~8qeEH>@Ex%r{KC|Y$
zsxKZT{P4ZMyIJNnhyN$o5A6Kr*#7q@j<tB@UXF{nCs{O#Zg#PM^{q|w{8L^}qph7&
zN{?(kad9h8(>FyoC)vjPCGx!=V;(H!an+w;#u!(vb8zFjg>`Wjokte_)LB^eB5Bpb
zxBuK%m}IT|@jg2E_j{+=y&FO{T<F~;p)71%w#Ub2-o{wRx#tS|UAhmgTHKZ@A?MOu
zck)}4=RvN?Oq>%OKb<-t5&U(rU93+s`-W#yb$jdD8gp`#B>Fp62yS@M?8Y^@FXC7H
zfx}8>LN1FR<!_jA`0=6DA35eEeK^a$=enumA4WYEcJa~!4bPU#o1aXUXtmjK{KDgR
zoh#JNKW_b)(IQ%^!=m1@hW}Q|q}ZmP>gNt=Su!3wv}N`M(_aPaAAb9;WuPc_<dXYJ
z-$eP$U+lRu{*8ZU8p|s0Ih~LcFSEb0d{cd8&9AbGFW)9?XiJ+M;3?TF=U(wgnzx>-
zXWoYJ17!=&&x!e8!SR?;(xLQ_n)!^I?;Nw|CHG3MW)c3om(7dsO<2K+#`1|blh^EG
zw>5h3v92?9%F_d4i}(U`?9ZC6srLOKm#+KFfWvB+#SMFFr_z^;|E%f^|LxIUw3BPv
z%Lxa0CU>t{_~WkR{(iF$A`jmtF#mPx3*?)z;J|zXzu)icEO*%0C+=AKU3s_lLDqSz
z4lfRWzfV3+E;dGPE`MZh>YbHy?)5+VR?Kj<>QPk@>t6l$g<qaAT3-zjG*)>tThY7m
zag6!l`xWAA#GLcQ3rbe`ZIG?{nzyg{PrkxE>Fc3s`S&HZ^?v1exAJw;JL}R|Hakn}
zhEG+BA)B06q_i1KF|?eZXE|Zd&$F}lzNm<s^-UuF-e;C$3<i!;y9|U}GS?I_#NFjz
zcX-R(zR5|yDt9n3i!BM}J+1fA=JLLjSLwg~W@Sn|eDdY@_2cRlKlc<~Uitgjt{cC<
z?dLvxkM)b0`Z3wRN7{0KC43dtjSyT@(K5g9T>RWPivq6zvjy*(71dO?^BsI_I8{%n
zG^%LYz8<6fmx2@??+bpoP;$%pMXk>~&z1#!<j>ET_=;if3@c;T$H%mDPafp$y0Gz<
ztm2W19kK^(b3)3mPIF_~o9Dwgd(p+mp-K;ZW2OD?>bEz&m}{)7w!&feilbL9FWs%a
z|C*cJl^riXOf?HRTo|gh#_(rhS3=Rlmnye-=9nhevX~!S<Z<-MDh;WXeEgb{9;a^p
z(ab6ooqz1s*++dDrE{$O?#`Gcy68vD*CSqHWjlX31hOp)x%kPp^Ub#XKRD*GeV(}E
zs?T9v)kmI(^4k0RR^Hty@SQQ~VdsPCu@gU78QSx$t^O<aiTO@zmr6-;moJOP^JZn)
z9=r7cr_1JF%}kuovamzb;-R{mxv=53oktoLX?)Q-G@-S-?Lo)Qd4CGN7#&pfj&Z1}
zsJziFJ?SUAv-7b%lSE(K=Jz|(w~58VNPJH28I^(q_AI~kT_(q^xwCz%wSTIEWCO>W
zgz0&Xyfzc$<ZRrGerpJb{JGgx`NJZ4wvooPmConia61bt2TgBii{G>SDAx%!XJKW5
z#ZEC2v-ry2CS78P=aCI}km#GiWaAys8Xp#(*2-s^ZNg$*$uZ58u`S$XLd)BLYN=bU
z-zLZHVmQZDR`gK2^kX51q=V4GzBe-K*eCS6^!$i(aw^acck0{7AjDJm?_2q~t{aK9
z+GXlr0z9VwjeOpy|HqokHL<4HJ+x=x{smL|=f|$pR{3ZYcJk8`*(twg^&RV+((*gd
zIJe1ESxO>x#*uzD&4d$$J}34+UT|T0Qox7LuF=23>z&1dyF}jYyLkLgyQ3tNMj;Qc
zqa%w}!PaXhPF~qw{!Q<fxZJ&B^Qb`9mFHV>5B$0R`@BS+a{3DW7mNQc<TiizOLp5d
zeLeoUN)fuOuZk}JQ4>9P=5;~CtM%qH!uk!aJbG00UVfY1)fY24vLo)_$Wzi>!Eb%d
zW>%!5v)seIhtx}dHwv}<TpqyXw=h6gFVMYJ{!Uz2!Ow0sG4*JZM01X1A9U|5De8z8
z2{*sf^}*FKw&6%a)k?c3{NMjQ{@f(GQK@XP_snTBuD4#?Q*aMHcE(6;AJft~sSm@J
zh|J_=yfsn#_DgO3UElH|@7{XUkohTW?b=6AZErccFUy?a`=vciO6S5<wy+tqOwAvN
zNMG(RdY!-dfYJ9Ez0J&G&e!%fH$QrOn!&N=sGhyP;Q_^yTc*o?v5naka?;bzx<FC-
zhP|rAgXaAEGBS(m>s<c3{h!m8ap{Xk(26zLVw)Ds%{&oOIOXSJ0mHVti}p{ft=YYR
zt1V`>jL-iKzI@jU|DB1}jre3!<XWY@?w9qauj=>XHpwQ7r7z{We}{3iR?@ozQ>Qr<
zPFly#yh2QJEpu!|X8OGSKP)X)hsWHU`MkNFkDVcV^=loL#?xUbi#COnKJzpG@%7N=
zv#VtO@BFJC67~0s=F(Ngt?E~eua=3moq6osw_Gw$V4<|^lgU=Q+V>ZH_DcJl?rF4C
zI7`$)<kj;tJ1kpb#V7t<C?etSoNz+&^nuTRqaN5l-nCUi`_iIAo!pI^D@=pV&54Uk
zUKp}n#V`5Dp;gCb`K~i%7ylyUq<*^W*IKK&@3~56^``V02)~Pu32G8ElK7JS{nKhU
z<>n_RZC@6x`V)OQXDw^A=H?l9;%i*kw@H4PFm2PP&Qo4X=Ld!rg{xV--MQ}zQ;O;b
z;qx!gu{>wv++OVTd0!r<*7}GhubV0vabZ7<R9^)3?4QG;y7B5#mfBfDTXa*WEVwgy
zPn>zxgy#}*wFY~Zg#4Z&Y<uj-@h|O>t*KhYzY{a15>v#K{~ck?+}3)MC3D%*`K8CW
z$~UWa3&`sqn`50`da$s0t-__#;@PStNt2%5n5E6lU%N5=%_>h#hWXPN-e^d&Dwy*z
zJmP(Hh+*1AB}>B|yR(6MrpKL3j`uK?a`IIeoq9aoHnFSzkdo8%XAAqIO}Y*&itJVp
zxGD6w>BQ!|&N~%Z9MAeVmy6w&D{gfuOncLt7CGTj?waV&oztZiQoCL1Z`&5JpKTX-
zA)UFUX|9ph8m8S_`$KE@&6u<BioizM&Lzjz+)&m&W`3n?+QJ_PcM7na=|AgxbA7(8
zoxsF-nu#X^CMN%klQ`nFzT+I*>GF?GempBard{GbDmHbOq|^QB$C)=B{-)U0zj_C&
zbCQsp+I-V>ccZ7Qsa9{=vgt5ChpqM>8HW|;d*&JT_c=}RvFps8q@!f~+(lO?eBOoA
zieFb<?2z}cC|Eqv#Q#;!9T%+%j|1$__s^Vm;pWG?J#qf*y&7Ld<4hv>TFYEdExhuq
zO;+NwLt4Xa4?QNnbJ};Jp4?T{*uE%LqgT3q?TY7r-R|sCy!<(=y5Yzd%^LarM~d>K
z7i?-N<8AbHjw$8LmDk*4n%`0KqV9`vnd2<`M^ehB|1&4AQ9bbK{~V`^e|%hS37?#9
z?(Mi5G08TTRY(2(kvj@CMyq0UjE}A=z1_IL{GqE>MSs8<3(+u<?hC@@^N%!f$G$t^
zU1+eLi6#HYVsSgZKW9`tIBMd11GOBcUa7U)?Dn%|`|hbSa%(f#xJ9qOV4cK$>zT0v
z<L#{c*^56knYHE|b`VZ3yIx|GZNjYVxu|6Gj=f*ykEcI5xcqFZ;L_K{D`MjtABC=p
z^Y{EJ6gR70JN5PI@a;!L)~T;7TI=yL%1ip`c0u04&-UH#c71;Mba%MBXufZel2d|o
z+v{&(3eSTopQ#o+YxQLF+q%5ujq9dWDHh$2mZiPaESwp6DarlQJR=w7ye{@wi#a;(
z-{z>A?pm{B!veOvH*VXQr-)|G_IJO$r$y(q`{s>ieDOQ{u306s6t0@O$1Nv0F#E%z
zDh30O52tS(VfpvO*7=ER_k<<&t}fjL!CX!nUMh<h%qW{tT5EmKS?Q2X_Bw5Y0;MfH
zPuh;2-=6Vy`lgtONWC>W;$r;)U^;9Xck<Ii)7F)})Nhgwe`^%*-RufS*7T~ct3RHr
z3EjCWE@bu`l^=eGl5@VAto~tNCzk#E?8PUxo_=rlT|M0Y$GckZ^cT*p3)-CHF8z6(
zW@T}E<AX0zf8I~!(9!+Ha(na6hcCQ7reyBUzjtfXrFZpH+Fw<yllJ4Dx#dCd^XZ5G
zD4gu<cl@fXu-ufBY1svL#;tnx9bS);XD(2<pu&(e+wNhD=JWQ=Q+Zr=&*oCk6uNh3
z-sab?KN(-E^lNPmW}KWf^L+h|Y4V5i9zA|rC)KdTm0@4*uLJY%tJqiU75V1X+Hdwy
zZ&HJ`k$uPCCm*X{b}tc+R56-dX%}Bz$FO~}`+dLkLvJ;Ntr)EG-rafdbw<Xr|Ez2;
zFN;<E+c!CN%^lyV8@G7M)U)?q{F9(|I&wqp<!wxtTJ+VF+=}ZgCO>^sre(Ta`AABR
z2uI#I{&?$3y{BJl9r)feJ6io>p7gnS<|b{8mrlN&T&D6f8YQ0pNl?q@Eyy%04WHU_
z;0$l#sdpCwgA`SKlN5R4D^BreZsK|O{Sw1l_bo|kZOaz_dA(F$)!r{w@9&AM!~n~m
z#>oz#iJ@a(g6>x+ybas7?ZUBRa&u+~T66s`<!6)FdP1vX=Tq<r2m%-Qu3b8JT6gZO
z{0Cl3K?fkb+Fyxz07Age?N7Hdb8lce9O4n*QF`WHeXi7HkL6R(o?Xj7Yh`lC_6iZM
z@^f#z?X%Wh)CJEAZTQpqjoVW2gTR_4vI1hSRxH{RX7Kmu947FsKb>cjDmS~{*&-Uk
zet!4bvk9O}e`Z}xTZVMw&*?DTk_CQOUa~*l>lee@>uY~jrkz=HFYMTZy8RDtewecB
zyA+S<iahoe(wV)>pB<C1Ka~HXcKxTb*FQLGn#)KpUMr}%%4%xc=a)@u?<5^-FnNJI
zCG_!AkjTovy?64yiY&eS&f`b5PG0rh{0SjvKAg1YJ~L6x>3)xV-v9b<^Zu>Pm3evp
zbNGs#)w7;>IK6TB>EW!;y6wXhrsK!I{kmXhIa#9M^^LgOnbUTE`+NJor02F&cfO))
zZ#I=b-TAsH_iT^b=cN}tE~(9$_xo<|_v(PpyZ`U0*;c-(`s2fr`8RtnpT6$izI(~7
zsMy;3cVlDk?!KYSF8;pnMAU9)y_&<EIy}6*)upBXcXWkug+6>bH?!wrRHUK?m&Bek
z|9R>!N%64ho{sL#d-rw?pWd~tey_i#c6T|ReqS*+Z29ZiW#ytdvrL&}Ho9EeEmR{l
zRqdFG>beC>MJk^z&9#i@Xm}ZZ-ter%otbG7s$X(Te#>#Tm<t!@NPhTu!rWKgXwn_F
zzNQ6UqVvAy2QKT^@%ozBc5Vmn@4k;$cOCt`_15JBU)Z-V6W-?hog=^Lwkgx*doKik
ztrg{Y7;Iy=Gp@ZXms?-JX6MT5YVY>z-ZsnXP5&$QZfkv<=YD>h>w69VMlIH_?>C>#
zBz<t+RjG=9JHIGjXZD}Vos<^W9{)4C@m}Z0n_n9f&VOM3e1Y?|XFTtDX8+dhj>~^<
zH~YGweb46e^DoCs&Y5c$DZDURE!Mepy=&B}$p?&9^Tvp<CmmTYXwu&6D}IRW$!l)S
z$oBOwk0+nDH-9<ZSmEH@t&2@crDs&NXK&=3ZCAI(wPj*B%YT*IOSVNR?^RhTJ>%h5
z6P{RghK_R;*A)IIx)_!;-aWp&<7wB0`v-jdKW_SD7WYRWrqph$@9cYVe)aqh_-!sV
z#F=|4lpV@iyo+_><gZ2>ZtFB&+#D7r&|ezN|3>?Durl+_Sq&-d9~Sjq554xIbn11f
zd*P9<LknW(txeZ9y<EBZeMA41P^*VkCA^QiLb|^1=)KkMvwmyV4R_1VmM33)|NZQm
z_W5V|F`iVDDnk>_*ZYzmRKHx1VJYz>QP;d<g7wS|`xRes^Vs~md$>OONZDQe9XqE;
zTTfwXuGlBpCeSo_y^rWlhtCh9USDLa64Opo=_)z8w?5gy-!b_{RC6xNLxHn8*FHY-
z|1?E+s&(+~w)M%D$EW^IyWw+9qb<ZYsj%GbuixieGyNXehkZ6)th#8epl+Fg(u}l-
z?T0;ze?936`Tjvp{MD>gOFUP(FPLt2^YhyEJJPPIOntSqJ;&<EZPnK2SLZhf6utBN
zJJIuhn)%kcBoURcSGTv{SYvRPad(XQ?akKNCD-4-=FKvicTjkSXSDf&rw@MG8Lg|W
zEBJBw=!d%x{^Tyc$Y3D4P||c=i$~Pkc{1^H=E@v>%dv^WYE|Li$&cfEV!Qr0c1hk7
z6X*XGKEGr`W|_gyT&e$xqINM0?O7*wrm`J*%CvQ}zQq4<l@zVrz86+lFYBNG<q@0w
zjI;hy4ENHTP9FRA{Ri*1^8CC5^Wt{MWk_s3Cvda%GDFPn&d+|Qcjj)t9eQnYmD1rW
zrw=k*Po8?@_`%RWN0+Dn6^J;vW~IjOkMH#_`zm`&?|1J$onpn$TBP67xGv`KoiE;p
z-lj_~W80$rwPUvLsikQ=%Q<srJ>X2f?Xqc4!@qR*byr^*zM3Q+ely>$aqH5yuY1hQ
zkJYrK8wANn-g60Be|47WwiorUs;0~RIl63P)$+?vg7x<9j?3O~ZqZ2x7NKtW?3i_z
zd6!++`5F7(q}bj`O}6O$85v8CADioz+GSV!NwL^XsPmiaRh_ciBy6?L{Zx}z#xEXb
zNL^T<pXO-a&wA!Wk?5+<LUVrqY{|v0w*%Z9n2*ny*!W)hdnvDe=ZuBVj~vffp?xEM
zQb}rGX_G}@wtr`YqgI7n+pE<q=TG+sE_=3^`HAOkMn$jtjGeVjF=n-#t&$w~StTqo
z)vs??zFzjXPV`KCM%d<x3FoaJ3F|CbypeU9${oi&{0nW}=dt9*C`j+svB@}lXvW;I
zf9Fq!{^QN{?meAupfx`}@2lP7gA*LRw+rr%NPUuKz0K<S<`v7%ZprNscT@QIm+$Xs
z<73IcraK6HJ!euElOeO?;9-e5?$ZT#Ssz=q>%j&^H<tF8(>$s2%`q>Wt(N>Q360(u
zmNma>YZ~igW(GaJJeIl96`yWN)XtRrXR(4yV#i6B8-+QR?H$Ma&PqkDykd2>W5<nk
z+qS5kC|)ZmJkkA-|GM*<8q*m*DKPHNn7Zn$*7ZjxJVKw(zOraaSXe|xUH9_sFRTxW
z1TtUuuw8U?duh)6x_LL;k4Ef2tXzKK!->tRX0I3(Y?WU1T}wQ5Sj~67{ZgMv3N0~7
zA0ItEb>izg!^02w7Wyu?o82GW8X<4Wbb?P#P3M)Y@#!ss$GJi#9kGh%%n$nVP3zF?
zsiIPKpC#vhShV!J&Yghttx+o~ezf_jO;}v}P5rm?h0J3*ZTGsagg=pSN_f+4*R+2E
zugHRuJy&kb=z7ZewRvWQ(md0GlWL`_B-m;_S|xv<lwSC<+h|+htQ}ri3!GOzGO2Nx
zt2{gBYS;?DD=&Ih+Zs9roWFWyPxjV{Gs^^4&DiwqZ~w<BYrB2zlT>FrFox~@>-S?T
zPhFf(xKNoHQwpn3_OIMhcEdee)V8-=|5C~!6y|&J===Le_E^2;e)cO<Ze9G|!nqqt
zlYMl4*I66PSs*%NU+HD#FF$+O{BB=gXZy^b>Gl0*+qOOX%Qa)+at%4{ttyG<l^Y`Z
zE;V_kOyXox{b9}fXKvH(?i$(46V5HyUcGeTF&&=8x~p7UKS^0w>R(%Md38sim-11*
zcYP~@?jA0YUe2?x)B9ii*$lTn(as%J*XI0ebFcS2ZxOOA!qaYnqtRzM1IsT*4d2Ci
z>|<V0UeO&N+s%F?>Lqinf!rlYv2*M*KQ5l1xOz_IGaJU5dzSy5X0)$5>-gO9gXPOV
z+=+ds(iR$SHTdgn@1_2fN7twA-OZNdJhthbpI_cTDd2X$zvlY3`1^-j+8A>fZ44XT
zCs#b$E}r*A*U$5jkMo?LE6$X6nA)&B{dLnQy>!dN8)h?AqxW`Akcd)Xx8?le;*rJP
zzTnDB7lB`W9s!x(u1Q|pb8K~p<6E<|efvJ`cQ~}eVY&2@RoUAkwY0Mwm#4{`HU6S^
zf8Rt7u79$={)_W}y^)ljny!4E@qzHFyacP&M+%)cBn7A6QL{-g$>Zg=db(RUD0ZcL
z$lg^!i&otZU9#*}#L7!w--KUvQ$E}-QRpJNNv&`7;_VH;Lq#<b)X!a=x#i&D=RY?1
zy>qnLVesI(yx)o?lb#5N9Nx)zK<{6h+@nj<-!7CKyW#joIz7$ABy7K^`rcokbiAKh
zFMPjw%hOiTZP`8boUeLSX1qTB*)vUgc8GYQ#B7xX|L=Xb{;<0Bzfz)&G@Gs^@83H0
zvKfK5v>*FV>fd==!H`EMORA-`TTh%}v*SW$o)f|Es{$Fi)@oFSoOzKS+|Hk6u>Agq
z;`{7}PrW%-ZkOWuTV(Qw(1v9zZe3cz!ER~OZn&`L!2i1SXKoAl7%sW%<M7vK@pRd#
zKfCy>V#{S^me%P?t&UsUV^w`n;K{X{+^gpQO`CU3{`Qf&9O2&^ecv26+bDng$iE+c
zwm)-|a?%T*MNDA*`S6kb$JYBdH@oY-`_PfVak+r;rcutWrZ+#=J&#r^crfn)&(--7
zHM`!l2&~&E{p{tz17EVfdKTIIm#HbZ{=I_7u+K=0Me2z0Uxoz9%OB2t)ve+AxZq{*
zk%im|zH`)=O@BOP(dIn9^Ma;B%>0c^RS&Is_P)H}eXlqA{*vMZv1q<?_a-WHFPQnb
zOm0hz&LRKW?T%&se)e-@_gU^xs9L`HW>fvPDGw%}Isf2AM}Wn1mhUI#{@t@be1=KX
znJ(q$vn67jzn@HzYB^DOza>$|-~B*B%J$skZHJARAKg<)p3Xf(j?4VNZC|O)GU4Q$
zWyeGo9ZBGFto@Qcf!j_lO6Jo>Z>H(qjC}SQM_U$6?O8jsCr9tYB)30*o+lU0@c3Wk
zQ1<@JMe!HU7Eb2*WA^j)Ji%GFHSD9;`fXpjUO2Zl`u>f$_mf0*DwV%}f40N(!B6WM
zY7f$RKV5&yVPU*KD&mTwmz;or?LD=q^w{XzQF427r3|!~7BkeuoVuR0v}R4y`p2`&
z)cNl$p0V5h#EN(G=ET1FFTBhD+keZ7@~SQVe)nVbt|gY;Vu`x9KB0^Gg8hc3V@I0P
zmq##jG(C{meq}+dRhY*shK-KLuB{c7T5(hOe5u$=mx}b3ixWRw5nFt3=DfG}f~R(~
z^Jq%UbYuv=GE?->ADOu3eS-Z$hGpsr|BENG7?evVzO8yEE|ocv(RLqKuMo5Qs~KV*
zSM2v4>%T2~Y?hmzk8I+k2X-81IakiFx5&3~NuRzgp`7vR_qhF)8xB@-{OSs}Gue7&
zQ)B8Uo9SZL9+$|yWIGeszu;j>lN<N^Xp1h3BJQ&sW#*0r$<cAIkCp9JxIb5BH-8{Y
zY_~>M<7qZF$qGS+h1T0Qa@JTxJ%}spnBb|)*TUtP{p#uEE!>IMr(av^s9R<-Vaq9=
zKm3!XbX@1K=bgaC@#=2Nub3P1cQmIaL`^HvKgFh7Ji96E&hB9O(>@0U{c<<V+4u9b
zNR0B?*5|^1CCn5p8<(Hve;{~q-|e5*B~D-Bl9{F^<G)2*HnVxb!SlTS{`cO`fBT+S
z-+wamwy(EJmro85y!-MeM~K3U8C{1Tn;+gg`TOxX0!y5PS6q<m=h8jP-N>=TNw{*M
zy_{%OoA{v#3ZhE-yZYT-!xtn~RPNdSf3nBX_4~QlT{^dZnxk;wB*VvMzP82Ir@PH^
zI?uOVPF!ZG_eIj|%&c{KdvlfQyf59aTlJ~(;a2H3fpwnY><2F$S=~I7c~;PJ<E4Gu
zs=nvByNGDk-dUNm?1}y*J%!8)dk-J+x1y^VeJ^Hks!aM4*pm?R&uqsY3&}Zqf8Ku8
z^jY5jMeWwY4Qon1%zI;^w`c#?hWR&d=v2H*W=dJSYjZe*M>to?=3T{c3?8ovHa>Y{
zYmon*zx;du`EUOha(Py*ysH+mBDSDy`TO&F{_ML?rFiQ1-aTS`zVF+2e}2EdZw*H6
zj;mMj+-?(5xWUsQ%Xi+tk4^k{pH|`Qpomzm*E#=_3M$s{WO;LC^)@lhb6pm~8uIGO
zeU@uh99LhPyY61$d9>y;E9*2RpU&U2LLQhqK2V&&*70S@ET&D%JX7n7Cm*u*aGw0q
zR@YL0*|+RX#a<sp_RZ(Yh<??!frYE%;Y-h=dn<*OhzEHnw6M3%+^NXA)o<p^7^jsi
zS;1VdS`%2h1h%QRZabJ8oZ~me#h~`ol8Qfne;>SEE2g6{Gw)^N)`}`6Q{U<j^{D}u
z9@l?Nd3)oOqx@7?r}th58$0$fUe$jxZ^@y33%k=+Dtuqs)F1v>_1lt$>I+LR^@pE-
zyRY)^!;*r!bBmkW{&ZdblrFo|Ev?k<SVc|NBn9L5r=qw!h1buHxWsab>FT;`zGoH{
z1i#?kYZI07No9GeZf=Zg)vl)(m4!VlZC^_Y-xXfQl2LMckw@Cqry_e#L{v?5)jy@|
z@l1LN%gecy^@^9a1j_ju@hhhX9edsJC1;vj{}s=ZFK-ITPWSLVxAO4m0OjJ+PlA_?
z-}x(KEDn})G-}sWU!h&NNGb5?OxKmSrwVVKR(4d$_UTNwm7k|w-mF*nLMia+P4|`m
zrwe~|5)$rkSv%Ez%BG9g%r8xB&Dd;S<g>*4?>>i%lXkXlJ?Azl=EYHM&*H!%4<4AF
zeiJt72={V>;|Y3>3rpm-x7p>sPvr7{%wrPGaAKj^@i}^qYfGl>aLaWT%=*dX&bQO@
zTN!83)14B$wHs#i2u?{fKE6$_F=p1jm+RJ_f1Y3Uc@NjSxfkcYw|ZxCK$NlP?=y+5
zGn0#^F9@9_d&&Csq%RXrtdWu4&BAyoXVSX$XO~WP`C@skg!9WKmMQn{o=98Z^2Rc)
znDfo0IaBxDJE^wT<&9<GTO+feS<e<Z=BS-leWZWU&AYcG{QjwB$6UTVl}xBqTYLLz
z%1V=oEuYq`viZ5}act_%H?v=;Z!gLb-5WP);r>h8tmlX9negSBm+WtjZB-I2I{gb?
zTrx{Nu*>7!k6+W6g)MeYO+MaIClGq&((P>}b2e|T<MEyMH?XkmQuO^@7BAEOJ~(h>
z-IItTs%=ZO_xkv{zp1#f%0h?hKuKlzE}j_{I;uTQw}d>rrWBvKdFInuk+RlxU8la-
zefv4Xku&G=mv=GMIX(M$<|a;%-6J!58;@XikWzu1-QipMDhYhGeZJ9be|O2)Cd`nG
zKeN)j-{$x%-R3{7B9-O6{0Aid+4tM4zldi0-zH+Ox2oUa!rqzoUu!;3w-nmq*Jm5s
z*5+%;duARJXM~!LFw@$}$vo2)lf1oH+!plkODc7gq^5V;ytU+yTYKP3W+LClO{bk*
zH=fY2F5CFQVCocw9o64gd-nO=OO{pB=CiV>DK-$d>DGRFSaWN`9ixUshF^~ZHG;N&
zcqjY(QwOt~hx5a%&NsyZC(j7aOH+4onyjD}rL+3S<fv8l_IEPp*IV36{TX?zV5;@w
zDPfnSd?#}Fsx+PGSg_g2?uD!Vy2*N6%Q!E{t0cTPxF|Js_2nz!6E00DxjaQ=;w+0N
zrzcCDS-bJvoB|mx+ljv&OSTx9-^ln<#Fe?DNF{G|%u|oMdyM|8Emrsv>E;?VrPF!S
z#|2$;=GyP-%K4|L6*SLjg|6iCUu()wU2B~(L1#Jdr3N15eI+*EHpqSW@$zJ*qf_`(
z{s}+q*Ve2KF<i2=`Z1^1c9VPePqqB!KebI@p1tWuzscX64|RL&h^qDVI<Y(3Kj6gD
z&t7wOq%E7uTNVG-$@BXUkq;|7cRF1E-_WD}Y1=hT>j~ldbG(HY**YGau4ZD8Y&8FT
zM8;#o^cTJIiXHJ~ZL`%fCLXcBmh$a<_SLJ}T$h>l{d}Uf>Qjtl+GCZSo7kIYxC?#|
z(%C&}#{cOO--M3F>^)<u`t0><{|kMmKX07zaq5%gN)hFg)rXEqn{&@9@m?U=(h{e#
zNkcxnEu}2oN=46WNwv;GYi_Bxx0XGeo$Ps7u-@6<(j#B&=<5{)$xAKsd~N?EFf!fI
z?EdZT=}^98m-&-p^ZwnMclt_JrResXQ+6CW6yk2hR8o0?$8a)>PU?zZPp|&$e))G#
z*Im_Li%$M#;&9tG|K;ibQ?E&Wx-+A~R<vPN_C}dSU4{XXOOH+7>vHei+dtkn%)_r8
zyYkcM$98MByF7BekM6&IxqY7WjK{Z`b}Pzn+j8?1bNsgU4{!UD?};5*^DIm&Qu=?{
z@m-yJuW$bJf#cO@CzIEyYh5NkFT3$tcx~C;m!4Lw>1R(`YL{&HdHi{;&)57Axz<S4
zZ{a*Iw(NQIOqFMe-qHOBuRUmg+z`ic%Ezs8Ys;Nkwtk%r)525tvXnnb73w%p)Yjt|
zb9u^+#piNT*+f?;PiXagevH@FSJCQS^0OsMQ>BfJIgc1hG#_BtwvN}vi={E>g~_2P
zfxRvV{fjt`%oTj_Q1#0Uxg)P<cX06cGw^Ww2t{o>Td3bupUZtE*`RfK_qLM<`0l73
z@k`qNVyCd#AKPPjilJL%eq8$^uHaBq$-w#6hkKT5`yz#V*})x8#Ey0fnQ^C=ro31f
zVff*6Qe1;V`?8-FhU*I|IG;{<t)_IK<yXP0hjaXHmWZtKV0;}Pw?*w%-=0g)RBtHj
z>pQUsRyX~2xVvdp@$cC|GgbuEN0iN&Q5@ywd~&AtwQS9UL3fVNnbh-XPuHC^<)(=b
zdG>zvnZUzpsIQQ@D$n)iM@|0{E|K%AnPd0$1fJGD9iL?Jw2fQP<?zfKj#D3oT>Bz3
z-EXgkZIEF?d(8bP<)G#5KP2a+KNhTipe|&7KjJ|+n`6Q+MbBQr(`6D)4hk(&I+;!H
z4}Mqv-zlosU|)LR^5@_K24@)5Yv1}Ewsd!6`mo?z?d)rtUDMru9b-DN=Jp>44XNx4
zQ+$?bUpvbr5Y;R<eWr{4midf3*_aA7n0PGLot0i<qn-cf%~scg+^M<~!ut8H%P<<x
zuCP+FsxSK{*2dLaslP7Z>N>5xLG}xh_vyY1vSAhE&^Rx3O1Lh%hHZ+fQ(*g*>aXm#
zTuKkmO{&eDmK|&N^UkBo$(*lGi>_drqjluB#@2b?gQrWJO}TWqm(O$2bM^x(pT3wM
z5Y<;x-Qg@$ta|ImMoDS?ynk%F^H)Zi<T=ea(2yDWEcRvGzlHlwPUES2qAG8%zp{Kw
zQ>Euh)rI@=?@junck*P@I<Hi<pbKo`9wB1S;$HH2giBmZh<~=@LHz4$o^Os$n#}pq
zGWW#lP0DRX=8X-v1^sXJ_67Xqo$a9FyXfso-$UguFFlx}&vW^U+`Ma9(!uE^?aNO-
zD!jG3dbe)RPEOk?WsC(JYZ4b3E`2_6a`bI3MmK|cr3vev=D7H^>vC}^pM4qpK_^Zs
zs!>|^<<*PV?S1dhsqT8^^gX72)k3$tEO*mAVRvKiDa<_O8XJ6T(h7yhOJ8hQ<#W|~
zT~_~3ao)G5Fe2t7+uu#S7fMd8WRvRM_~4}EY3-&<`IA>I`0}}gF~()S!K+`7&c>$y
z&Ofq9_7ex|%w78`vc)F|usX4NwbvzY6;ils?|1Ybm&erHS5AA9u1->lOYQaky!XtZ
z?427PDKWmi+^LbwuM}ka-ZXZ>^4F=61}}X&o1Q;@(cbq!dj1;0)8BhfX)-@O9Q5z>
zAKk$8iLWMVu?l@^-BxmbcTsF+X^^Af63Y@UJ0qQmYJVhSe>U|>JMbwqtUNOL>(e=V
z_Hf-lUVNv%&U|gwz0+lvPu-eQbos84Ipeff%S8Kw&R4w5i#+Bz>)Y}NKMkrL{}<I?
zYxg?($&&eRWbDs-rvJS+>(Z>grVLMSZjB!v!OAzQ4%O+0uao;!V{@Ql)x7@6-w%Hl
z{a&+5ZFA1~<!k&k&u@==_K<IBmEF<V_M3J$fBm|NXUdj{wx;wmb9j%hTO3yqQ@|Dc
zjc1wqrWI>gwohT=nzxDLb$!<c58K3br<A{L@$Is=Om7r>)?Xsn)wKNg1-Eb0GcKPI
zE-QNaW=3b;9IN~GcK7?=&(Ye-Vpu+NS4ixC-iRw#U3(O!yK9I~U+d=;HI03JoQO*F
z;p0M^n6z(c)pkywBOm)~yY{DxJI(U{&)>WJf0lH3S^c?q#hUZElbr3|sHiw_)K0mS
zdq3AZeqr_fd3o{IRQL*K-`Kg0`Sjl0|KH4&Pi~ZrKE%a%Y4hp22Hi-hOgj^)vpsJD
z+&ej^lwJBW&$}Y!`0ck#554{LGv)cSMLT4A7D<0@o;&w>iT>1QQ*0)v-4jjVx-vyW
z{Nb)nHx6IDU6m$Ufdb93sv7d$8Z6@Zc6`1Z4L5Tp1r+}IBdDQt`^-lRmWjNl(=InR
z@qKm{aQXIW9)qpD>z~I38NFwIs`!ZipRvNEOT7M%fP}yujyaQ6gIf!?8a-ufYgILy
zv`InqWBk9Z{14)H?_T{Zes;F<;aF$+tgSo5_urkvGw=TPu+(Q^Qv@W-B{&Z4t+Q1=
zKlAg8>RBgme~bKZU10C$d;@J>?i-t!AMvpj`#(EVX}e8bXOGs@)opIN%ata+_$$5L
z`s*`=?{~^yKRazTS^q%s-OSK!a>qSNe%H<unv<+hb%=fDQmI+9nm4{Z!E__+twG7Y
zN(22TJ->8x?XK|JE;3}S&r(}uV`(SC$DnduQS1yC|Jm+G%}SDYu3S%H$xClzz3?pZ
z&vUN0bNxaebw3uVm6z<kwSwc@9rb%V^NWH$><Zd-_|Y|qom*Nqs6FG|Z>uk-(*AJ0
zPQ&#3p~tyDyPSJ!Srcr*adP_Sgl3+<Pp1ew1fMV6>%(_*V&wzp+5GPfgFYwUS8>~|
zoBh$PdeiX-zfW^I+~idFK5Ivsdc&VTBIQgOQg3}rnNI9GBarVMv+K0MONQ$v*Hjl6
zo$t^5EHm*HUxD<pJ5R#di{f=E%f)y2PI|oZ>iUV=i(U90ohq5M^lbZ`RnM5VM@~`o
ze^X=6SFmZRe)U6d-Rgy}qj~OI_sj0TnzJRp`@Ywj?$@!B$q6NS%*m}=jn;SgIw|e%
z$lQ9>*xX*t@#gOStHr$8>Ce99Zr{77I{Mp!#pO@e9SxXPDXM?(>+F4<<&#zCJb19}
z5A(A1(Z{~*%5j*PD88lgn5p4^&0mvG8?4Hxi`f2kq4fL}rj;z)jQcNVe*Uv>hNzm>
zepbErE>G{ftEg#SU%TJ3>U>GqqO*%TWRBfc`>B$vC9gH}sJQvfgf6AqlDC*|)cuaU
zrjz!4S-NWAv#Z_GLi@R&hfOw`H+Rdb%^P1vr{q{U*XPu2JW=wFeZ~d8>ccP0eO_`U
zr_6n*Ug4F@9I~z7GB?$nX~9LCQ@rfT8zMGERBfA_I5BUn_xf`s$&1b^f7L76!n9ob
z$GuglwPz>a)%IU*`Cezg?&K?%W9B~H8~Uel$CGW2Z`b#~T`5wjkeziX;9^v;O|A81
zCg0iZrV75FJU(ZuS2_LD@8=GDwyCeXAco;sk8pXqa%ks<XNf1a9s0P>{F0Ci`v?Cd
zuD%<^%PaY%<5a_Zn=bEak6ka7uktYR`BtB7Q<?N4^{TaLM$emBHa+p*x2MXZ?UdUa
zzP(TGA6=t4LA6*gKI-s$ffJLg`@dQ-MHcm>1~W&_(spf0d9|VX*d(smm*s8E#gCRR
zd;5$lAwBExLhGCu$$#1tQhC>%&0Z?RYPjNs@?Q^^kIQ*dBG*3%*s=P7`+^SpM1|8;
zt}b=5&)O9_<h3WbGEUWI*<>T+ZC9eeE#0XxK{f5AZzcC_JImUSO%J}RzUye&eLpAo
zT|A@VcX@%!cP@)ECw<E4c&Dh~wr<WnZx0{8z=Z-riw(+OZ=U(w>!{w|{WoQ66sK1x
zO)<Zqc%AdYiKDC8K1LmOyu!R+sN>Av4?o)PzTvs5w#lOV!<Kf|^Z@_YE6QBn>DnH@
zTWUG&!<ol1w|-cZxy{gCV_Ls#+8=Q>^UX^b;#fX^zWDQ`x8Ca|afd8=zDl&7J@|B!
zszjXYv-pYycmJ#nv9|iRGiA!@JAb+rju>8_^vmhsf;d;Ui`8aK?cbH2iK+hNP|JIm
z^Rnpp>h%5ltgWnrH~vd;t1e9l>#ygNj%G`odr~vGWCQbCr9*!9b1pyooS=Pr)vZQN
zu9cRRS1w*EezI`S-s^tL>X~zER-AbLGnRW-((|Lo)4f<6OT>!pbtE2MnIPY(VVr9B
zrfcZ|=M4)so-6L#y)j{#e=Pg0%6Vs-+|qS*X1o+|k^cTZcctj&2QNNG7JPZ2v%{?I
zbnEHksXN??lO^<wZ|&Z^T6UhQgr1q_d%pVZ?#|gR1*=&WTUXZKv#*u5w9ySMWt;r-
zf|CC~)AHtZ@;txaU0uRI|90Qg>&M=d{&;(d?~yETP+3~V+_~@1FW-EiZ0^y23XzjP
zWZV4yR$}IO-Dri@D$j;{_4a?Cmi|9_@#n?YTz`exK0Q3^srs3lEoH?ux9_b%%Qv<}
z-@dWWhfninKqQZ#k!+sdie=LZye8Bz-3f30rJAz1sP)Q=i$(V}TYnd*Slzt7B+aVP
zbVHj1U+wGunc-di&%Ui^Z{RDrz`g&U+&MuZUo%IY4^JZMSu6!p4%k=4nYg}m6I3*e
zNpxymF`;Me$q5JU6_l2!UY_6-{JmSt-XQUo#_MTb_ZLrWG4%Ub-m&*~bjw-;XPIM_
zlPkL8FR#tza!U@6OMCn!&t`^;*0!$=5vr0As^y1XeOFzhxBXj1MDLtC#y?E7VwmTv
z&Al%_!+-Hamzr4;yNu=^i~ch!FE`j=)}za*bME!}Pxh$IuseG|Yo~D7e*MJKom(Zs
zj7ydnzcP?d>-w0y?&TjT@1(<4?|aWM#=W=OW^-CH;`=i9MyHByi+GtU78^c)T;pi4
z(=)|<*W@3|{_($Ke(kH1%W4(*f8QIM4NX#_yCt+uPPlC^_+Y*<wSRBKsjhj>0ybh@
z&o^5uRoLAYVX3cJ-gnQWEcnFVd57M8=XKJT+i_2ty<N_Szc-<5+EzWjzNI`5IC^yJ
z-y99{xyPpbMemPP)$AM&tMG@{P4xCJpYXGmbN0j6DH;WQGRFBWrrpU~qGFitT1*$&
z-<SWJk*7cA_Q4rPT1rLg%)h@^Sah+4adP2)j`$V+s(II(W4w=iN&X~mDqUH8+>s|>
zbzp~3_KsgR!NC*#`3>YJZT=Ct$V$G@##Tt!X1bB157WAK&NlutEQck8J5ukrX|zhH
zN$cwMC_l=cuz%aq_Ep{Adt0kxs#QL{`DpM{Pi*Pis+P)Y5qxYuza{sGZr5DjcXo%b
zOyDi{Ii4;@Y9D;fJ66c4=Pcbcqo88Nian>V`0p^<^z3-&@`W){`z`<6Eo$Qq-}XdM
z;Om1qyAJ<!d30FP`f|({hO<}F=ds4}>TL0lkz?^N{j+=f`3I{z@4ptP=udS{@_XaG
zeEG&(QWq{8NPIV0{I$Gy$GI!6{CWX9tEA?oUj6eRE$OOWOnye?-bK8Z<wbUPcYTgb
zGcA|<P!&*k!0%MU0?pfBx{_~y^2s;Yw~#$2fIF6(`SR{9P4lkt-<f&r{FzCjTMtiv
zXgqJB?3Lz+X}rs=PT4BNg<97nGS}z7C|LHh-T3L@O6Qm5!R$|-%TGAZUc$Cv_GDk#
zfC=>ujPe(DzO27_<zbHuD_fBh-z;n9s<yq6&0I}4>-N^w*2eChQLWIYzRbAgX?E29
zEQLE?H=54;YW;VaU;D=pv$Uhj9Q+P-XPCXx`1ZQQx8Z(GZ^P2`2RAo2I3!Om{(R|G
z=KtKdndx7airqQ$fK|uT@vrfo)KJC)YqPc*Jo@bW;lyJ5W`FP0Px6Ok6;0N9?{h76
z+xEO$D|V*bvrpg8?0ef2b4gjATYjtY+DRYoaPBp*%5`M?Wff+kbEf3(3YChgYl*Bo
z%HMqd{qfrtf6>VAvVq@^^*Mdl4f_zY^LK3E_uger-`$$0&e8n7UtPoCR_?w18w@xP
z@@fBizWVXx?eG2nxpQ{K#s)NavI=chIK#bx#c#6ck<tLu4jxBG=lg=^xwX$6JM((-
z<Z^xgc>DI9g;yLhJF2p`gw3AA>N7DjmUq!IjzwwD&j}P>-Y4atE9hYTYcAuXW!|O@
zWiBkaTf&(&L<}aDhVm**oN`p8>L$Zemh`1B1vz7V%r&3rh0Smgj+XpC%|vGPL8VCt
zD%^W!T+Up`F>SiG<E3ZG<vz#1-gT@u*p@DMH(=iEUx)SozD(%5{nPP*uNc$JJ|#xK
z*;Drf#0uWxl@!tS)7<gnxB0n*jeQ-<o23P=G-RA=xFI;jB&u3zYl3OZn-dE%)CC^h
z|54at679=bYhWI08gWY~LMrBz=X8gs7t2!?`xkuJx>tdv`BHy`X+Uhp?cGKi-&_LT
zEcubhc=V#ZpWU9|=0tz9@4Y=c{nz|D|Iprasn7JU*Y~Wozhaay>#D^%WnsIJixzgZ
z^>v^2=YI*$Kkr{xS6}k))tB5Q+RJauH;#MpXcb$x4~wbGoqo=Zd9g=BPp(%McIn+F
zFy*$mPpU_hk%yJi#2X%+M*{Q;%BxiszPWT&C6|Y9idYuDT)_B`+U~6fF5J0%)L_FQ
zohctqB&rIu>~7xXQlHqmDRaY>iZBj0<Cr5yTPMv7Xm#3QKhg1`hx5kcUW;xsUuSkR
z4pBSOs$>wR$UE^_zJ#}QRml8DUS;k+vcjil_1--xz+XIP-+HzQ9-qyns@NPlb3NER
zYD8PNUQ601opqo?q<-<moy-Q$#JS(k3uAU&@?HAuHLe9m0!>@~hb$Dll^E4#WfF5l
zee))*gUK(HG_$vqg)e)&BzT^ZgHmF;&h3s*X983{hPAKIZSmN~B{3=V09Qb#YtBkW
zC863jAExw-SBiIi_Dp^7f+KU8a^%d&g&wEAwAa<Y;?s5YXj$>{M8M=_lVih@tZVtY
zr6iozy?b-=fXB<6LeJxyC$Dr=+OlDjQ077rp_r9d6$BThg}2R$T{z+KOu4I!f<<T7
z^<<Z|#t1K+6T<AWCginIZqWYN_<&~#3*An7EopU{SjJw^qH$~T!VG`48)0qB5;@M^
zYjZiA(t7gb!`1xh^0&)H83k9C@H!V|9Og=u+HR!4tEj*$snGl7Wnhup9*11+LuET3
z31u$Kaht-J$;Fs?iXn5EYF&|AnzO4z)S=i&?`_)IceiN=v!%Fmoap13Fn5cj;kIzT
z$=kG=lu{nZN;1D+B5A?L<<Ga0qwB{Jud-JY5+6MZdm1@K&zVzbkEBPKlCDUg&VFGJ
zL4k{HJySinQ>80X9e5NK+IR$%bDwyf>(F}rAhj420uU!;F40^(F|ErjscqTRh#faY
zKKgFfd?+2J(UKy{cg!RZq;NuW`|5%MZx1zH$(dVHQYL+n4{LU-xO8XI3zjtjM{Kp7
zFAL2wjOg5A@Y*JM4^xvt?bJ0cQ8PTZtY%2;kezEKq`<Rq{ltu|nl-P)4sjo>s@m>g
z94NOa*tpcJdH=B&OOM^T#?|s$PhRdu`}5?UR0I9Bf17umt+``RH(OM$T8xds)%DNc
zn|BoT*KjA9cpScw|K`B{B@4}G1=^NO)=n^Iy(RXL_w)PsigzYgGZu!e*8iJbb@|oB
zi-A|?UG0Bau{!_DuZutX7KYESUGeHi@YgRh<F3x0XPS9U{oPVq1NE;*pCknQT<X4;
z<8}D7bm!KpqEpiypRKF?$Qk{^`qi)dTMys3^Y>7c3iI`yNtG;2(-r1@(6ZRHidpHm
z>&LaSLWkr$mtVV*?Y7o)vzn;K%Uhe94-{=sf6-xTYx>sn!Mn}+R=$7tPm;}OKfX?W
zhMlFE`m-;m{w4+MpD)tw>%4IN@@D<xFP2mk?#TG3w{Eg{<h#i^Wyi(Ju3r8ow0ZU_
z-W59w+RcARN89WC`EvdI;=cwhhq>%JZgAcWW^;VeTln2>!tUE^#s1_SKF?R1_v!wJ
za|XA1=l6tdzRbW|>)!s|?e>k#KQ3Q(m)HJ2FS9vU;M3&~RVhBbZ5!@od=t1}^W*%%
zYo9Ma{v3aQu0i4VcZWA$U*Fdmw)Xn}n>OpN&!2Cvu7Cdi9<{Zz{La~4{+KIrP+{h4
z^?Xy2btew8C!dyCG+`_AgZJ&z{&5$vGCDJA$oS+u=Wbk9bxYD}`S0Y@TqaK5)l$<B
z*R4s(;>{J-;<q_n<n;60(eDSon`*7TA(8s;q02LczPh{5QZE#r(f)mjCuY6bcis0d
zE)_LJJ=k~5Vteu#*Z6lrQP;oy4wxFN&vE~1PI|`QLMtuN<?r^tJ$XcD+V-l@#Xj?F
zG*wRjo%y;?XMM!G)alK0<{u1c($Je`_)mNDBx~lSt~ZWsEftLUcu8VU@aN6184nm=
z{=7EaFQDsK*15C|Cw?^?c=99avt-`{{%<FRf2n6b-{2ng@mg*-+bqYo7CN`CY}Z}u
zv+ae$qpce=@0rzU<w{%KpXjuy`CxWLWkz+n*xE{7g&o(o8thoeHreXflJ1Kpf4@Z=
zvh>)f{_yzbxiL=Vu7=2g?M>a40z3Nnb*&D+Hu}lW+*SJAzv_or^-qr%@d~S+2dm7Q
z_}cex|F7k<OgDaD{d>E;ol(PJy#O22DU~Zt6C1QL<$p}Rb)-nIx$yeEd&lbD1fHB<
zv&DYu^r&si9d6o*T&c;wpl#%~B2HqfcXh}cF#}m!?q8?BMmE=f<Nc+))TX&0^4rn=
zB@65xNfpWaRc(wqVwl$K(UFjI^Xhh9$FKQ0Mn&b91754m+LgaU_{Rf<Ov@GXlWwUh
zD3)8Lo?o#3*R!dve<c6y_flK;n>F}sabkN&!laq$tc-8mPKYME`dz5mo>-#Uv`wr>
za+1<nm#fk<4T2s>h%GcSbbPgF2J5LsO9b|&GEO^JW7K$y+v<48f~gCHT(^DEoUL=>
zuH=_5r&^8YAJX6bY34zpLt%W*DG~xb#&1s7ov^h1G%@46;YIb>c_u-Mx3V9c=B#{o
zGhE_jh$8FT!#vA7Re$!}%hqQQD0+5oZ=>scO~uUl5-by^{Q6a@7$)()Ax1B9>+6lS
z65p$OjYK7*Kcv0ldn<Tm)Bh(d>g&qBeY)EH`QPlt#%I>Do)t-&ANbJA<5>9d<@x9D
z&)*kU<6hA9K}h^u{ms9ptIxmr6V?&AKh#g|%S!i>KP8egw=giz;*yDNG-sa_d4Xrb
zY0IK?eYHRHCpBz*W9PW=U4&fNOFg?EQ&0YR!Th3JTW!<F-_mQE@9$nLc;a$#Ih)L}
zCB~=MGI;N9jV`#obIsK(DQQp5MTxskF*bQ~Pdjq`-*MMo|LDC8%bGkdTfEi(XXjBT
z<#o%|(ksU8@*=&0Z%hs)51Gtf$1l2hFKSlEe7>b3=h9lw1*Kl}W8Js%fY*)*zA2S@
z34cz{SRJ;TXV;1ckBjE|E99<Bu+?5xaK^BPcgCZ+jZ6=xbRG4Y*xI$PI9)#N!;!KF
zys_&)+)Y}%GgxQy!9^zy@ENK6YkJ($z0Q9B2WEbOm`mD+yevG||9EvqtVrR*+PH-!
zv9m2ts(o-xE8Vr?3Y+lsS6QuB+k2e;O1W9g_#N^x+Q-q~gw^Lnk(k!8()@Mv#HP21
z{cZDOsd*4_{mF^XXJ$`YsQh3@(W7jUE37j5oo$n5?UJwz%=B-(;ij=8vFlT|n?3vf
z)@7^j%P{DFwq{TXw`JJqUNB8ppZU;Iv3*BxIaD+6+#$0=`1<Qig?~)m(eK!w|1|i=
zHd#LCE)#R)@dfXjv(8)hPcieG@bq0#^#{}7WWLpp<~LidcizAB&{JcMspr|N@1EB%
z*c9bmC%ir|{ed3;nt4)@GdK^<@^OflU^x1{<d=zYyYnv*=8kpeLh7e*vFm*ZV1Irq
z^~T*9zM-1i5}NxsxQhxor`m=TCGvPqeRuizqiuU*|6I`x<60r_@VM|v+uCAI|9LZ;
z^{+28|FSiLKPDyVHuqhltAf{MwOu#GYP^~%u%k6*t(543=SiuIEgUW4>y9f%=rcSC
zW9SRi$`tJ_F4S1E<%{~!3sT#Cbgq~j*Dc<nqt>;eL0dg;;nz!A55J%MKC$M^%Ga-B
zirM-2!?$_3-M!>7{Yd5U3zDBV_+EbQ&pA;<*~xEXYDfUvyEklWdGh4<UG%=5X=}Rd
zwX!?Ijel<&S{ElL&8$08&8p$4GS~i?m(YhY?v0b)=B}#yEE~IK!L1j!+D|OHs%0cM
zZNpiXa~b`%o7yG(H=j(pdt34Mv2?!Zgv;V#P3m*lZY8Mg`{bMKG+n(!Hs+G5*lsqz
zn@e0I4=>TzG<<CF(_Q12Q*v>}!)qRb6&e#SF~nauIx%-!*X=3lT_wjuXU}5XkZ!y2
z{i^BHx5>5`rCs~J_r6&4HnqB6($DNW92<5D$*rhQURgh{DbaVYG0%itfwd=t-U?J(
zY*;?MCB5kaC(|<32T9?97nB*T#B7!=DBCg5tZ426E2HJ#o}}G3m)-v=dY<hop<n-I
zY5DyYf0uIN{*Q0_*VZmJ{mop}Hc_cEM||;Swsnj;FEl)7sB{}OE=YPkm+^IM-&4Jq
z*Ane7=G)y0Wwvx%<#u~Y_mnqMJ1oP0JG>Wr6y;@UC|hH>$fuO~cJ3Xcifb%k54E-L
zOiY&Jw((mNQ~j*x-^4qGPi`i;erqs_y!E}|#6s5mkFzGNklW&ATrs_e)#=S!xdZG!
zPTWa+ST}*wK8kn0&>Q2+3?FLKcPVV+Kf9gX*Zko3B`=$9$W49gB!1!0H~#B^yEN19
z9!h)BmTM7Yy+hS@zMZ=U&uf00a-+&JW@)Kw38J^Ur9Z3?)Q|gqhxhfPX(@@B5fOG=
zFBv!T$1@iHO^Uv*I_2Sy+%4YQcDK$*^l)Oo+jC7>NpoKftIu2$mWQ_lg|xQbvtrJ=
zUNOt#@TUH0>$U%}h#cdz`st{oe%j7BwKe|2TFLim+~L#L$9vx3vTMJ6d4pg7-sFgz
zQakue?3TV^TNJ$5lGFX&9m#7P;gV;)ecUWQ-O;?b&08_V-;`_0w)Ki8QI*k)+5h-&
zEvn3v6O(NZcz8wU%c~6{zv@;ovP`o#NDu1_l-^U*r0@NN?L@OM^R<6prvzzru2PU*
zCeYx#=P*a+rfP|WPk9O(EX?d?DrUWjD^2|JDm6Ni>pq8We4Fo*FrS#>ANu=4`ljr>
zmt=o3CAsyJ(t?dnHNXDPp2t^z>qk9HPxRpj-h9sQ|KI$5?d`VSB?o_6+oa!H=vyD}
zu}*_ap+eL*HN~@U>qOo4s?Rs|@rf%bavE|PFle~Wthk?kzi9QYLU-nz2^Un2ucYWq
z%qR&D1;cV))%t^94#jQ!s*>?WPx{Dv=0D!q_gB6u+0D?w%aps=QLfVL15ZFrca!_g
zo_|{n?s#q${={ql-8o>5Pkv45a-9l$CzYC%#adeVr>C^O6`6H-PJq*c_v@D~;X5ec
zTrzXxORHe%Bk8I$A35DEy?h{2Ds0bAsgSN6b2XQ61m&l5b=K|i6}oozY18b}tmf0X
z^Yp~;#OVF_;$i#yH0#aUEgN5F8$UYyv%cc`w@cPV=kqtn@z2QI(YR)HaM+IHM$f0M
zV`P2DS+(MtPwCy%!;Hngvmb~VonwwTzG2tdE5EP&OWe8dJNMl9dyn%rr`^0TeOE!A
zkN5HQ2j#BlSZzqYH0kAru*X-=UMOnwoG|&yz0CF<_KR<S3Hz!!Z^3b;R|(-!QePWq
z=I;FeQP%R}Li5~99<Oyvr(E#=y1<Rk&;HM!k3V*Af4)T1vv%RS$J>?O&z~c3>!{>G
z?<scw3QA^3Yt6dRJvl8iBb@nJ%C-%%D%+MG<na?rUZ5LPWp&h{ecjC?d$^YAZcU!U
z;a5E;t==mAl}opex<tn}rZ<)EmA}X3gdMs!J9N(5PS2dnsSI-}C$vk-PBUH`Ww3JP
zTyc||>Gpfnk25}Af9>SKUbBBp8FJDGkG!As-zr2lclxGt+m_^*rz(|~MW0%CM>%@N
zN4Hh!tAf=({I&idupzSd&-E;Znk#vwXP$Eu%P~Bt-RqsQ^6KkTtIO@LhRm2Muy8@O
z{p9@Fsh>8o*qywzEGVj+f6>c%9`iSG&t<4B`f~Z-Zhm$5kOSvCXKybo`eGQp;O5k4
z5%md+Zf?j+^5YK+W}ds^+_T^*xh4DVF3JiPkp7|;SW<In@)f~=UpmEWZkp{Wese(R
zJFEBBiLX~ya;}<R`u5I>3-)_BlGZ)i%5Od`^S~qSruWk?pS~h{eTO}(Po8n+71>Fb
zxXt*kzF2(t_LHEko81l=q+XcIy}5P!o!fr9E_GfM6Lxoe9v~`mW$EW|dAFDR@9h+K
z=9T6|^v=_I5XQAY`EQP%#@CEbXKaJ#zdJCaXDdU|o!Q*oO+2e+w`Iyl8VH&0zZ(*1
z&a+<V`mKj|YeoO%ZQ<D4saRLa_3hGg|Ie{Pd2WBw#8a<J>@ksLk7(Ylx?u);G}A`y
z|CitYuK%8=-`DFNEI)Tg_m@e{_J^4qSyt;e^eY_`I-s=Sm1010>Z!zk|BnA#{`vCX
z{`-IXW$PZgoYG&;oxYDF!eNQX_A}Zu?&eMVz9(BzaNaHl_d7w~b6MA1tNB}?U6H)E
z^8LSnhx4ND%)2G$BH#Z{{B@_h=d6R%yC>wv-TWdZ@M-tt%h!La|8#hMEg@giv9)rd
z->y4;4U_VVOD;VwV{)-MbJ27DZBO<)1$+D~Y{Z#(v<t0YGaYYxSIV1KR@rW}{jl6y
zgObd(1`WP>^?yIzJHENNZ0Y=haIW>Mx3RQX7ky>XO@FVMm||Y_tlOn@Zr`0fYWl_c
z`fs#7{~e3D+hS9Dd<~Q7#yiuPuD*J-K%|-3zvYL;7N(6-Eo*MG@Z}#!{BU~SMlHu3
z+KCCj#B`3|V6T#%lWmdhsS|xP;pF5(yJ>G7-WhMaQ~!Hb^PSr<C$@Gw_ARgeaiWx|
zc1q`+g=IS*oV}Z<_r>byg5#IFYQF5^^tF7js9bE)x>eTMrso$dJ+^nZgmLz*ecNSo
zryW@z%~KcSd)9r!^egvbOeYCDzA)~LU9a$_;xwE5Zo7O<NuA^G3>xR=Gp9bduFqk=
zF*Rp`Ql|V${iiFdW$zdjRob^7U*aWLSv*ffC*}qhW9`XJl3{{2YR=PNcU-IYW|G#~
z_IAqAYfIdAypLFu*7$wt3RXK0=5GoCNpZhLT&Jm&pYob5&baPrzt4X&&U!Vb{Nh9N
zH?=)$o&UP<M3DZoq9uh@9E}b(u7Mtrnx7XPC@r<RJ7e|aHpiIv7lfK!%+>OCx*lmO
zeWJNIs7<))n37zecYkZh1UDU*$7f4V9QOL+-0yvJx1?{%Cf);&mE2Y>WZg9FqnB{p
z!33UT_YZsf1xc5t{JV4K<urLSflF==PyW0(U*^T%w%8`CL*4I6P9>*AEHHQdr*mbl
z)Pa=c$E)4CFZTBL`tMkJxZSP(`#IUW`tgF=MMD4g?GgXq)+fcL(y;xpc6UV1(>E3C
z8MS8#`e^0`_S`zQX_g(!TLvbf_6Di-iVQ9a5mG7*7k4%@?lM?@{QX}+*9&J49u-`(
zJ8{kD56%8pP3kfZ3q5{R^y}puKBb0^h>#V>G}`ZdJ*9Ono>yqq(&#B!nV;2`a;qHA
z-rSVw=+NpS5m&9}B*V7!%Zs4jE1aZ0xT-t5u2I=)nG`MPFmLviWd*zD9DCXLM<}nx
zJUiI=#O#g6QR(ILG#iR1KS~O4;hJ<HKy<~2a>bLyoo-2w*(ZFvb#wLekH0slaGhCR
zu*IgDmz!TJTyLrR<U4Wt&P5kr^YH5(`QTl1<HUo%Ia?oAzUE<@c<^Y=e*>P{l@`5%
zy3uZd455iT?yg_;^zrPdg{pNsLw~0*Ny^!kO4bB?<X&cRy21BUa$sEcM5DbW-a5G(
z*o7XdPrdQacv8f~yUC7?UwMwJ3*XdW@K@f_dNLzUT=`7mrjRYCcbAy|viGRVZ25GP
zV?)F(w<9|JzxF*)TeAE~z-BAG*L4Cyb#ZSu?0J4Ra3(TZ?*8hg{M5+bOVWQZRNV4B
ze`4nQ2<58J3+v07;|wMCE7(=}e>$D9cG``@bt__?R6X6lSLWK2)~|&XQ*<hRRX*qx
zVTu==6?V)y^3_vDbq)4Cd=77W+UMr+%u88d;=Z;daYmHn*4c*h`~NSQzM|{l)qcL8
za;pzc4m==P{Q1>FsdtZGPA}jsw~XAj<M6yaouOOA+SL|!6mOm%cipbn=HsPXj~Y^@
zY|H-^{5op8&{YK+w>ZfOJ-fc0t;>ph9kwYUEZ}vuE!#Pb>ia&rQl}$2*E2dx-(Br^
z<#dzA+HD<+RJuR03bdM~hc%xJ-FJGH%kk+qh3`L)@qO*--JYj@I;`qW;g(A?E(WdN
z(|&qhara4=ZQH_`*34#&F#j$ju&PU>cW*)C?U1U-_v`-qZk_JCb^6)!yX^P;(l6hY
zUM+6ymiAXXGOwvsZ1w+3d1X(0|4u*t<EQzG|4uhcgMX(|jE?@ld8G~=$z<F_MqmY;
z*Xv&9=5rm$;X1ISTq%UX?VZ5R{kLDe-IltZ;f(d=6~aIM1#%rQnSJ;F1SW$ghY!t~
z&5+OG_G$4i*W3S0*ku|%uVJ+iVz0}b8uCV-<K7Wg$?{(oag&>iomZBBYWSS7rQml*
z*z*TlRJJ^QEb^kEu}I`Ohw_G?M85g!eE+v?nSNE{PVv<yu>*{cu5WK!m-b`B``CF6
z%6}?q9^C)Xpy;&H&*FQpqjrf+Zp>1L(o>D|J}u;p75(UN;hV-5_2cjR&)x8FzO?$|
zg4+EvVw;-Sw)PY>pI?8|v!Z!-X3~}3d#rE&J=rbzs>1U3b`{HzY~>lHu3n2DcNKhG
z_xD80>d1S>FAi?7NGUov;iI1Y$rhhPo`PNVCr(8lQT!NL%Jz<ncj87?v6f(OgN92w
z5_7}iN}@#OHcwvsx8Kh0<%^!gubVb~2t4xP=NgUOmyUL+S{Z%J46b<)Xkfi(lli?<
zPw!jJ57cnT6zvgte`>GK5-SnSGb(2u>@2r%lnlPCH{)u>^q$nDgCc(~R_{OIBegp7
zP0+6scRpk>Xv}R2d~|pBlun^&UcU3+`1hIH%-IwWbbMy;72m_^Re`$<>}v1jx)w<<
zy!Zd#i_7ggl8)N_I?w*;JUIJ%kEKU!(P9H`?)Edg4{$cT3l5quyElD%P~lE>&e;7K
zFLspcos#Wz`u^}m?X^`O8bvQ$etb(k@{UsJ-`I(QDesOJ8{NzH{VDDe)KTwz=D^bj
zVXr>z(R%P_73<t(tGyjQyx{c9lbkx^fvaW2mtA+h+K9YU-F>|>|7t9M+fvb5owrv1
zmBe;x{#|TuY;=Za7FQ>e3a1OR;eutX3=0o`%2r+IxAO94sVlj9S2EhqI$C{p=zVLv
zz;ES#;kKw4E~}UoAKe@ZzPi1-u`~7iJbm5%&9^?p-uqx%{-x8`|9P|_$E8(w*04GD
zvpe2zbueyViMQdH=d*#|K(A)+hAZB+tE|8GYdu!nwVb2!%ca`DUEeFOCp{8)ygFNK
zN`l>n16Mn}_tuv=J&sli*Gt{hy?@CE*%fa^I=Ph9*09eK65lwlU!wHJ-6+-nQL=k0
zc08D!o$esAG)#Zj>1E}<>A(CBDxW&4tY~W{bhhrHhe>sRpUd_N6|4R}m)#XAQT=@`
zADiyhlpM?x)4y@nT|8%J#ldOvu^XN~VvVjVIXJCbJm=>{)@Z%B4Nno0o*$ch<zhGB
zqI&1u2w$fkJLmnZmp<)D<>splH|Af_kE;6Y&h%=r^uHy)6Q8*#e+#+%Y=>m;R<pei
zR^;to`q61-L>=$qDJwXRTYs-(nRBxs;8uBB;fjEoW7?MLK~<BZ?cFlnzvrJYf0bjW
zVemtSOYUon7W*^R;K|-<mQKq)UMV{HrM~;{8P%x{{Z3Q-Pdxoz{pyR~-tD%R{us|&
zop|fk6Dtp+NX`BSs%hF4Cz(FJsGATj`19U{b)R|9tmSWd$>C_mpuJA;_WRvM?JKx0
zL}c_dh#o!~8^$*+$;M1hNA<qX+=CZ-i&YB`Jyx$-_3H-L)EGgohlXsTD-));U+)Nc
zc2;?+>Gln$oPC@(uK0ZT!tclWZI$M(6Fb&PgqK+Nu6VrBtb9_X(_i*TQxQ3<T1}x~
z{xDv~gO8@^23c*iEh<da*zr?5%KR7qro4h|rteQV7B-bGHrUf59$~mEKdje1#`ITZ
zIPW{Q@My2Rg1@HWy*9htGOnIboLm{!yXSI%&MW_y1&MBt`OY#gdDpx4B6n84vAK~v
zlS!Up(OF-i9ihv)dwopqR3CTdTjuyeboE4LcE_hX!X{d`-Qj91;dxx1{^Y66gR+H}
zeqGP%T&^!_IVtwn*VP}S4(L8!y+x_B`QhD=NUfszJ8nJ{UVeCzW5e0Ky^q|(ZTIxt
znC@jf>zme+VwbcvVoM88O*7rwV(G6}W&B8d9y?1LV@c-bUFqxIE&1_u?lQ}#QTKP=
z3|i|qLFcKK(zZ1VxDJZ`dwpFsd(ZYwuJhtqmxxEsp8n}tfRxBZ-bKr{aJ|fma8Zvg
zI@^DFU7}X!@<}y%Os}{<<rZ?yOuc!<>ESCUq5oV?AvcZ)MbGMP)LQi5sZ;T!su+_3
z9uv`vN|%q+`ZRtyqrSz=P}J(g(laO8YdI>Mgm36vad{G@SHkneS^waa9cGITtWrtY
z^CRrhs-s&)RckWbPKXJeSX{bVo_&elr3WE9yr%axKJI^~<A2n)@uX&wMps~@&in0Q
zdrV{gZWf4J<@)wvTHv=0N}s=)@GUqkUH#+Y+eFp%wr8%&&v^BIWxx97_UWIeO|adw
zM>?@Of?<)8Rb}6|4@E1EzDfM}HA!`H#m}q=fpv$}HqOut;t3IyT`!U;q<!bCqZON8
z!#-ElEho5T{#H75SJd~E_X(AmXFiI#7~HTm(onwWXwK8SijQtJt&O`P^2hrfpJ<vs
zcjWfUZOxx9?2)jUAH-VuGPk_q;Q6F~PhOVY6D--IetJ$O-@Pv1ypY*3S+g9^$3JR~
zFxT?kX{?`ncGuG-cTVOm^*BCx_gwem4x4(#ipw2W{nJ$PIDK8^qsi{4g7UBWY;Ts#
zyQKVJhV;sK=`Z`f9)G$)z<tRL4W2C={yNL8zfWS_b4qbXGNZLnkU-KI)iZ)hSyoeQ
zo%JI%di4Hu%S?&;BFAoch@;)j)pPRWKkBc8a)QG<9=$liX7YZ?ld`pL#qYj~c-a?O
zw`v%3-MUxrIB9uG=UTU-JiY?&uH_8eb0>;9v7PtmPC3sx|5m!)dKtyQ%^pI9pYKK$
z>D*nLAhdSY+rzs<8(PjScIVAX7TS4$f8P5IuQScfXXWRa+`p4CukXS$x6fyLpUsv&
zdsq7Gb-fdU>n=|Yo1h#tOZ{4h*otr7If<$-E<OJgxl?Xu#P!|Z*WGMq|8RfOY}bcR
zXWITWn$;`5_~Vz;H#RQ2m%Q_O^YKK^`Q<l+d06}07M}>+CjONtLBx|`h8nAzlp^Ds
z>cjOrZ+A6cOy`d{qbIMhi9vxYTUatEZ}ajz5smu`d>b93Z#G{#5wR~&v@!7ZP2O2|
z)7X4IIN5bXF$t7TbGYJZkjkOtv*;{)P&C7mydO`0<~-!~SU#DN+m>?%|BOBcgS|O+
ziSC}CcyIewHYiG1Mf`HMlQ3B}iN7uGmBC*fiC>aS7Ch{(3HWlE?UjdQz=ihAfCbL;
zxjUv!vFe+{+A`;)=!-|sn4SG(SI%U0n|5eHUW%QDRVMSv$bb`^8h2EipM^eSQV6w}
zqQfvnMRLZ*kCWb|Ja1A6HHmu5!|}rTolC`SrJoBtgnQ%I1orw!?0Mm)XK^d@(#7))
zi|2E;i#wlScb7`uX8p2Yi}35#M`ElAffH*4mV9)bcFj-gtp<z9p6T2@akpB&7=@(i
zhbFuEzkJrL;+y={=u4V@Xs(;T+4H6)^G_|2G<lhRNyVah8vi7dSznAZE}dWES&*kM
zu41&c;PU(wyC+fq^R89+X#|OjXgU|%JbZ=K_4M{Fr{)PBH+)*Prc>|f>p;I)l_xsV
zetugY{*j$sQ(zLTzH_GO$+K%b&+Sc0Iu>zl@|pIR-DbY_r#Vl2>YVoZ>x?`N?MUIZ
zDSjn&T-&FfQJ=~GGhxHp%Pb;GyB#wZ-InN{nXvGEO6Vo&p0gVgd^>jt{@xq@>)y}a
zyvtIDcCRlh5xaRXxAfbG1D8VFXS4L*d4FDvt#Wa!&`!@;pYk^I{-3z)N=Q?ggpAfh
z1JzsNh1O;F>yu}0c3HmEEm{5B{H(LvzJLF|{p-)Z_|2K^SEp9}&6GZ!TFJUh#Cx`u
zb@1mX`PG+Y=UbRa&z`&T?#`<^vQlqcJmuJL@@BMhK6C%6@^b&_YQ<ZB4^$m_RI&X_
zpUR%;vd=la7f%d5ocCtBbgN2Bt;*dtCDSKuPTLE-mQ<xD3Ys#zH#J6FHx8X|^-QmN
z@oJC%J$wQ8tPOJAx1MaY3QgbsOnmM!v+UjvJ{5v~-uw3*ym05~y!(Hx7!P~LU6>H~
z-R<zg4`~w&N`==ZW^Ldy_;>8ycdz=}e{8Ps&pv<gh|K#K%MEY7xNT!zm9T8~;^<11
zon2Xb4Ff8y*NXjlcffykUD%!blkVhtuRVAF$+SzkX1CXFW4V7?mUW*}kfBD}f1M2+
zmWuVW@5G)o-Z}HuyR3f_7i@l=UoGCgoc+0dy+zWkH;0#BS3l0aWY6BspBEQx*j!vu
z=W%b|erv_GZ7%0@r^c;MkXlet-gj?$VELkkeY-AR;d~Wvm+@n7=C{ZE>c`iY-<zX8
zQ@i!C1Mh`8uk{<ASumE`>&$<6th07;rr*p9%i|a=lG^8;+0wbr>G8&;nQhBkV^yuU
zy*0Y3!E<HJUhYX-D;ul%UTrltxf1<1s?=xo#to*~|D%lOv?b4*Q9i45!L6vRW(r%@
z=JhYo^c7xlsG3(c`^Mb3P;KMS{Iyo0+FQjB=k9dd_j8#@ZQgm`&t99gwkrO&%y?|6
zQ@+4J+f?V)xm=g`Gd<ou^4ndKcXzpBMf$7t%UBuChn~LH$GcqW!K!o5H;5$pp46yY
zdsN1-Wa8gv(!bPSr{{Y_J-k;MHcu|9JyG*~POSFz4_37dYIme|m;F8#Zv4CL;O&_c
zwiwP7koGTm?Xy_-?x(N!jzu$fR5kxpVVqg_bLk^Sw|%NVCcc?;%CD8DDOc-*v%Yv=
zvXt4E44-#dPvUtr%;wn2KH6?^D&6TnQ}6BrC5PCiUD;yqEzX<kr9JP`{@fo1Y{t!D
zHYy399JLRy@YwyGYMbk0`uNsP$rsVl7JYT0TbIxO+8wnfy_RiG?%`&(FrPI$M1}QJ
zb!J9LPBB<JOZ70v-fJcCzquYyT*V>uY|gt?b!tohNSFuwn($)kTdqeZ*e6a9x%1=f
z_9s)G#Y-Btv}Zn(R#UhezU8{T<cTP@sEHAc;t?n2oV}60K`U33Kjh5E`?*G@XZ0i6
zZ-$ngVAYy7xkToJ<OyA2*Xavm=R3$<;H-Mcz3h0GNqa`cQl@1JhB@C$R^2+saaE^4
zEVcDP^t3<8I?IAH-hQ@xrgU{~)rQwri;^B~-fbx7_0>DsusOc!Z#Y{wd-U1c`%)bY
zPF`5=KJN+7$@Cz*E9**{*BPY-sXrB-a9Y!H%a`aot?MTT{k$x5vZUweC8zt-?=vVo
zITI6++*_A+)Jb20rE%J?&;Idi4Q?{-jkzjSZvN{>nnljF6{ji~@1Hr-S;rc(ZNH_{
zA=7jB<n~+2KWvLy8`hlXweb3iBGs19*ABk?{kea+`oC%xPnM2T>;8N^eqL^_^^c&A
zn>%jnRbTLTR(iPl<H;rb1)KLi@tdBk+mKo_kFm_s{iRIXl>gh0Br5Ip4p=EYtJRn7
zAGf{nT=_i=kN0t`%&GY=cl*KbXIDjETrMu=6FRoV*gAp5dv{ykro0$)sa~VQOQb#+
z#6C@ETD{NX(e-cX`;Q*&UdX&8;g-pn-~aBfU$nkz*0uURsp%g}ZV7nUva9VX;S4)F
zz2TOAlFL?2t<e5irCv*S-S?NhxAL&pi`QyG%UK`D&)@m>En~A@#RtoK&zQF8hOSAU
zdPHWoaSgliQ$9AfmcX?kuSBOE`*Ltj{j9_4&(zITSHAmI;=43<rC~~7>H`Lu-uK=y
zuNHN0Js``iwnOV`u(aaDzPndv>OMK}K)-G2tJvf`m)!^Scbt8>=#qrLZ`SImVeXPs
zf5|3T#ND{^;<KlLk1}KMrga>lht#%Y&kIZP>fYzf$*3=JOZMh=ov-_}yg4k^&G})f
z^-AcGH&ckv67G${SHFpL=(Zf<l@F|Z+VlC9xc-4J-HZ<k?=w5J++yr--owZ{g@yf4
z1b@79Z9+&xOkDrjm6^P!7yOf1D<jYTa*y~ww#khva~nOw%oE->XTIl?lgQO`zQ*?P
z--Fz=V{cODT&>vpc-zAFK~FzvYfO!g|H{69(V+)l#cI{>B(*n6yXUAk&YZq<weRu-
z{hr3h?LvP|!qtU;X|f2!&RzL;#!8u()^@WU*|AlJ?-~S!I&+)d=-8kTo)m29qAXs}
zF{?y;zIODlu%}4@E2m$uYdCj!^6RhfvMN4B$=2@-UfUVV*ZW|V&zsxZb%mLCZcE<l
zw9QL&<vYgbudn9r<ogq|^0&j1#t+A~#Bg-6Ht4WEVAvY8Gp=mujo_fCPqan#)5Oxn
zq#TMLr+<m`5DjDv@2+VzbX(i?-hDs+m&FU#>hGLp?XhF~CRVE~PjzOYX|j<?hYrtK
z7O$_QrFo=9?|72o*-JO(+)q}yA#>0==&N4l^0u7XDI5&9<M?K@%LbqRqFNr(Fp1^X
z&*B%JEcYBWzocY$&$_?PUA$_;U6~gZzRmmg_BOTq&oFKjk=@k)#@S<;<i;BxcB$`6
zJeA1bQxm8Bqa|g5Y|(S?o*u#Ic^66z(!77fHJ`q@#EaE=X?#$co6X(n0beT>6ZQFG
z)kG&O^w_0a=P2&}EGKl^3ZIY_$FI&<$=C7R@5uXGE05mcb7GzR{oe=i`>DYnuEraf
zo3k)J`)GIRM^R3Vx$TYx7jN=R&<$97arskQnTJ#DcB|!0+vFm!p@>DV>{J`uJ59YE
zGaVim9R4&l)8cmcE1&uI-rri4n16fL(s*8uzyJEA{B}=&R`RGW`E`B9?xO5});&Bk
zl&W(=n`9ZUGky4}acV}(@tFq#7Jl_>`|6jl^Yb+;HN{Iu(`%#MI!~G`F4c0~`AF);
zoafb!Qd16vdFeXwm0K=yD&>D?wu@()S?EVUw)4uzWwP&lS$#k9)trBVUoBi>)+opY
zC>!o)58<o*Am^XJ`gXx}Y1y2~tKRr`>@#Kgkzlt&PV85+&(Di#Kf=1^&ty69)p|0&
zQ{9Rg{IlL1`sz8E-^otvvr}!x!M}$~r&vABi704$H}mks4-b;c?EcF5EWBQqGxPGx
z*VP3X5$(4x#9K7DH&;B|_I%lOu~;GdOAp-bygXZObRSoUv43$ZR<zV&pLE5^UkgOI
zcv3$cY`9!~KxOLo;|f<UItZ+jm0Nu2#ahE<g}wR8?kr`7pGsfXG4T~kTK#f*vgd#v
zcWPyR!1Xh-&sf*#)&KL{6Zc{B^LbUdZEvj2wDpfgXkMQcSjc=eQmyS}gIKi0WVS+I
zx35uG88uJOnfNK}YV)hxMy#v$M7w32+Pc>0ZrlHDF{_Whc)<V0v31GEw^{Esd;aE1
zDqMK8(dzoDp4$&j=YKe@wUhl@!A!>J|21BgQ(1fic!Y%;G}bjLzFVZ&Hp|eFMbLcu
zjC)sJ9L}|WVfw^9(kq^`R<2$5?3x*~UOh429mU<VbK!e`qq`ByH*s8!P&fPgy-wrc
ze5-%m4LdIyR9tRNw3zaT^)h$$(QA_zY}}nAu%G{f{@U8*t1iD~QZVD#(#ux)<mLfm
zhmX2ka;e6@t{*B;zv_3w{LdYJ$BjmNKVF@?>A_!)i618Ru3E82H&|?2a0Xwo6KCW8
z{nI8{u{iTwOg*;jwNI|V{HZBQT&352nbR{PK0eC|(0ueHz(a7!JQ>&|^TF$9kq~%9
zy(YC>)#kxd``iCNtpDG6-#umahliKg4&^paH&g#@FDpFFp?UYB{B!*MoTs-QjB#bZ
zUU=5)eeV1}Sxxr7?|fc!AI#0TdrUSpx5?E@Z>w}^mFpSpqBOY)!V+8k4v1aR*_40w
z#J`BS8OF6d^*yGy)eL%P$ldjj)sgLDZV6#mzrN*-Xq<gW{#VXQ<GtoQRpQ4Fp8R+7
z<_CpYT9%o2OxJBVX`d@x^Rmq<PiNnh?>piz$DEw{VaEN-IbNUs8+dMu{LbmV>O}Lq
zJElIbt@i$If4I1w<@%Bjo7Uaw=<|wMB)KY)X^V2o#$&n3_ewUOcaHBDTdbYV^!{>9
zu#{2Ia)tW&_GimIcPMh2?$Ox&>glBtnGcFP9G4xn;V?Ryr`H)1EwuCL)4RKE<&qBS
zMrm@tKP^&ZP$Lj>L7j1qi0iZ{fyPLF2Q~fwfxoIn|NZ~Y(p<C2^t790sJgJv`lg=+
zA7)FRz4T}0qdo3Ne@SdTKh^45M@;^;Xdgr2YQy=-vpzqOKPi3q&hFETW$X4o=buxw
zGU;CR+MS|Rg$3p>-yeT``15v=35pHpRC!zrc(M<OA6oa`<?rURdk)?gv)Zw~+<X?}
zKaI6!8MkFps{K22&bxnm@Z|U9?{b^|Yb@R5Sn=y%=C;kt{$E%!&*JR+9qQ+L#p-?r
z?KbD#6Bytwo0Fk9@p;Kt#R|bMzy7_qvP|wiZY`Rhr@CIetmERjdaE-{+FLho)?B9V
z`umr}yVcXQl#VZNm=m4axNrN}Yg?CH`s0z&@Te*=^G3r7>$7vO`SpvL`Wd+t<XXQk
z%9tGY`uOwC6QbQe^*VT8DLtC{DO^J5w~>)xkJUrQLtL$l=L;UZw-@^Jr|3XLEBAx#
zxyhD)(ieaC{2{8zU3ZtGalhQ3J=|Ww*YqRb8E!dn&d|L|WW7q#`@ZvjmK`TueR>Y4
zUOQA(8ZEYa#;&7tGgC~wgoJ(eCv393VqwetlEs_%@pY-h8AeCXbj>Tiw%~>6?|Rjw
ztv{0#TRWHjlu_~0-ELJAnkt@t|Ai^v*(v+A&RW&XI+-}@@5Jc`lT>EUvYE8CE5OX(
z(J1cimy)+vxr2kmpWAsc&d-sX>g3mWNwcLP)^JJX*80m6r|q3uvgrP@#XS6_UwjW*
zZa=P7u{XoK!JX?GQ*7eP*6W{kZ?7*nF(GSlW9r^Xm2US>Z#WY)U1rv=HGa##pOIp7
zZhyCRMMEvqyCbKy?g^DTPkMAQ=*O|b#?=M(=ckk<o@DHKk<vC}!_}$+1Lg0(_0nxG
zd^_MbD|yF)Pq|rEx7V@mxzfkC;q9l5x|d9z-dg6%sdDOPtx-|l!NYS^(iD$Q7K*Fb
zl`@@UCF4KcExw*b2WPM7o7J%H|A&yr_y61~UwEi?sYOWc%ZHZJ!_^h07XR+z*8Pz@
zxjOM(?6V!L9LqDNC@pWyZZu7ua?&D=F(!M}1er6Zwd3a4$;(}_nU}X+eqMD&*)eaK
z8(vRePWccxG2p2Y%Z7kmqJhx|E^K9d`ugjl6$f9<d(%EAko(o#F3&(I3Fc(s$*VWV
zMVdNEi=SP5|G9(BUB&!!_XN{U#J+kM#qx4t#w`K=Dwk&NKWU#>rFs@$UYyE1Tl~p`
zyARLxpT4Cj{-of4&GW~b%5)pvzj@IjzVzKLDbeq(%S`TU%_`ult}3>h<aWGW-Ca?-
z+~d|%?<%%h0l9F!oS2z?+ROX2-H+vpndMFH`@KJLnSoSg(X06R{Etsfk~ti%nG@66
z_nPnbH;WaD2aio%{9_xJ^mb9X>+a?f=3V)_Hx%CPIk*1&&L78~Zx6n)WA29?oHdXC
z+|kXsqbK|Q_>C{S9-sR7^R1{^p1w(5L!LpN$o;y+$KNF9K4z|d?Dq1Gwom-m8T)?C
zaC$Bg|CQ@<xUHp0-lTIq>kldKo~4|{7;$TBzW3H6ix?+9;;3_NRtsBvki%qM^_FMc
z>8)?_FSj1qcX7SU{y#Fdu4lI$^~jf=zxbl-who^h9kJAgz}I<wlUJ{-n!C^IVzS|z
zx2<b$T1@jzmMJY-Zf*YKXYqR`{{N3>+z>CkJku~;Ao%{lpr6d=OCMjA439eY&CIcQ
z+L7b0-ky56amkB_j+Q)~kg~vUmjwTIzSf()V_w3`j86MP9WPhwC6~W#_;&N7=FbiF
zFV1Gz-jH5g!f@)s44L1%3Rb^;uh{sam{lo9h<k#`n~lF)oi;o_ZC!gwSpSrg%nBL4
z>a81`UT)_)&=lRuUhSq6#oy$r-Q~KQL1#zn+70PP7X4I+Fj*W?!gXNL(W8qFZ<rv@
z!o5>0R_oW^)QS$bzS+5QW?R;2ubRUdXTQ?7X0Nd92PyxgOIKUO=bZ@k37R1>qvh`E
zqiwrdrk;B6tM+4(>*}B-^Hn$|%#h29Dhz(K^paPO-32}N*GUKNPV32&nrSI05H+)_
zah~+jL%HW~m?<{P9sD0|p5MBmWHCq0_x17Dk2UVjf1YO0vi<EI$shaq`<ZmF9DDHG
zrpxowXTh)6J_~)V-#Vi^L_g?-=!=@#dBW4GmL{wWmkWI*8vknQ{xw&$=UuV4;A*_`
ze`?FVpJ!V3JwBG)CHmW4^jDJWKSS1gqTiKRpMF%Cd-7-Vp?}v!3U_|{QFQ0)k%(u4
z6Wz7!C3l@H-66-9^3rLA)%p$VChD;Xmi%&EpuDDLiPKbn9&vsBZxgRf{9^D*!@*sT
zNj8yH)wZRn>%n2(M^BHo&o95+y{tvtTEEcjaofkDYz95KzZqE;4?Zrku!$1yJkdM*
z{_;5KWp7_38(lp1%*DHZX>vlRK+~3az5-VH40mRvrS9tdA3FI`ZlwEU>pg-qMJ`M<
zeOUgb>Gs8D_Vb2kj|VJok=^%kvbwy&Ud5SJBGQ}vW|aK+`DEMfg^h}JXLlU?!u`w3
z;;+(!3j6tbweij-CvH64s3rEg;Awe|#hN2!E>Hd(*%`ucXV2NE3<awfoPIlvy&>(x
z_ArM-FF$JLAE*yYUcS&Ln)$S24C9AOR`E$zD`)SM^!M|(OiRtU{`1(=XPNtsuv}D-
zpL|8=hP&+g{pz1)F#is4N#;DT;mGIDm50wy7fxZYW8b!mlW$4pS!bb}-P8W+?AUr^
z?bYs0(q&>j-@d2Js<^Sm|AO54PakJ08)ot|ZEkQ^(EI*EXw9@|eXhQXU%uJeXmP3X
z=A)lVzWY>#Zt6-L(A}waXy(iFa+w?dKHJ{<k|$%^zEr7S@)hakf4f4|xkbC9R$Px-
z`@z&=CzHFw0!@|**L4ehGp!EU`WkPzDX3p-bk(S8Rg&Gh=H>D^y!xfbSKD`F{Z^jA
zJ=;gDLU;50Sr1Z^50uYQwk=A3S*3Tt+E(v<$?k>04O_OAB^kcgi9N&W_I%c!BJ-*)
zcQ3{T`|TLGt~*XOEY|J%=i%4$UNvEz>Ao}a`wuHN@E<z1<Y)E_lQ^}d4{l98)IHa3
zzWCqL=)R&<_4^Anc{G+9Db!!dv#ah}UuqSz*4aa9)!v%sPg8x>eQ&zB)g~q9h29f*
zF*Cc@V_{wF+RqnwLQ4w1G)8_@yf&>p?FoBS|Gc%9o#FO7#q(IMr#AdF15FAp{1DNo
z9#Zr4O1|DnMbQ~OYWYU9bj6O8)$L#O<+)7p(&<MpB$XK7{m6UGy!+*pWY<rVjXpE3
z`oNgV*YS1tG{zU2KUegc+H8M!u+n6<^>-VGos73@8n*pt*reOH`=jk<qsa}I?j)CO
z=G)DB=3%_Xk@Kt0uqV&vSH4`__Di*Q#$)N+Kdrko-hbb(e&C()-GI3t7QQ;7{oKAX
ze6jBqO|h;`oVHfa?oM#KxJ>f;Jnu>K=A9Kf8R=wkR%f~A%`agEk7gAA5?O!Dd44<Z
zC+Ui!swL+e`tJN)BWkokbY1?PkQ<Sq-&Z8wShb)%oBPK72YEaRA5@D9!ZU&cIM}6j
z^(qCOI41nR#e^+n5&IJEBTJ@lI_UU*`-17FF%$dkfBtIvwA|~x;02qqeK9c$|F60I
zrY&vVvurO`l_KrL#YgTlE{hGmnx478^F0IS%fNi|B?(!@FaBP<&UbKD=W$jgEu|7B
zm6gg&LB-o|hjaYVjwxPyGiiCdue0~5&qkq2HYWA;e81Z()6~~0E1zbX<&u%|&oRH}
zz3chP?vo1?Sf_J5s8nc}*Ab}rgj?w;|0#2sXA`(B#4b(RQKX^0ZtWC*K35+7a6Z<w
ze(4WK4?n)R`IgM)!=j~T`pl1Jm)RROZ4yuky7TMqQuDuB*(Z<l-MQ_bZfsgp=$+v-
zZQiOMYdGRo9JO8R%)UeV{GQguNBe#kaU9sv-I^G1`=R40+m%~|mfR7xEMd^*TRA69
zG0kz;pO$uwC3k|&OBz;dEGc61UB8U`w;E^u8pFHO(i<XmLKhtEyAYJt^S~!g{-NNW
zw>w`Y2*fWrt-arSf#&N;%yTl1hX|~Y`}F?%QW-yfhh6%&m+ab**)cbAiO!Pqe(q^(
zw`cpVvlpLf?>KqOQQLeMc88e`9(OJOgbNGbaVZL6ee%Xw?v&0lb(<p1!%IZ3#$SHF
z{zRPUv_9!G4=$y;Rj}>MtS@26ekvKWuHGd*V8QYjV~q><xr{X~XwN=)LT26j`0YQ!
z44=(QJS1juXrAKt`MZt>9e#aXu0~kZXzjw)8R7E}mZh-$ePQeIK%q0Rs=+S2Z%e{7
z*R#7XuFH56b|%2*PMq|`DSxJ1ox^5%-|*PF!hk3~&l~B2haGPyiH9*pely;kmvJo5
z)@$Pq^Q_06-{LZ_t=ZxBaQVG&Q!<{d-EgAw?j{k@oiS1q=7-;Z-FEqv^3IHfjlU|{
z9<@)%s4(MDT-tMGQc>>_e(!__8XVqBdR3lFb?)YL*e>ogn?Y0Aw7B<3ukwYp3j<^n
zZ>0JC%8C#_)W5mme*Kq8A=*W)yDV+=mo9zM)GwXC#M)_L#bS#Z`TDBIhn7E-;}bs+
zrpK_eTCrrh>J9Er1J`e1Pgd>z;_A1(;NHRql?@L!XtcIywlftxz0sy#Z|5K+5w>=T
zTWpi8<kY<@BB$<nbY|a*Di>+K!_y~Sz4Pqfv>IKD=zt|6f1fUo)d_UTIrdpa_L|4F
z8s^HsKkEc%=6@;>*4w1<XlwYPNbx3V(?`+vcXk)VZ(I6f?sl1}@BY{&N!$Ee<{$Uz
zNz}>k?;9Vr+wRG%XHz=1Q)2zJ<okXq%nR5isVQw$+HGt3!>d4l@v+1;(#2Ma+=nkN
zcag0(JhNN#m%?O?a@$4fa*|nV*rpvgB_mQUQB?6aX;qc^VJ}aiKac$-oYafG&2??3
z1UYl`GwtlqeRH>a*OR8-FCyQ?2i8qqaZRj;i91)&uI>NH-CxTlWa@mrv1GxH$cH>C
zI~f10k?_b-ezDUyAdt`e`sp)gCmo&SrIMpMP4`23A*X{A_x=LOed5k5+w=~sikZ0M
zNcHv;9FeDb)GHQgyeM~ew&P#vt?D%~>Cc}F&+bg!XZCE4-F*2+b57s7?l$N0^Sn!O
zIoCY9XNbMr)WQ*cBVmcXlG?9NyQ}A4{-sm1vi8>`SGgNKLOa}leAM`*Z{ELpU)K7M
z-Hlbd*LJUOoo#>BzPovS?Z$JLPOfI(`0LfrJrcz~uU_asF{8y~qA7REnP<l7K2Pt@
zGIX}@KjEyiedP|zN#-_R4%mb|$T)vK;7Q2N$lC!=zU-W>HbL;Wzlw;i2wTOGP)75q
zEJtQWAAhI%&d%l4RZ;!ZtNoHT@m#DjoT`3d+mim5ukSsbci#Pl#nSd^m$&Vx6q#`J
zQCX3z@_MDqzjl^yT$a$iw5cV?Za(Mn58s%K!`8I~%UPcG-q15K?<OB(uI1Hf7B5_9
zesYSd-grc;$@@$X<1yvz8HRIiWvz}j^sa2YYiWA@Sj9@^cb-Dtvmb8_H28SX^R)Y{
z@`X1JeKw81{`stY-M#s(?Eh+(=i9!2T<H^kqo``%l)Qhg8nH4hNp@%B^_Rs~OkmQV
z`Xk%QY|ih%WwW}L>Oa3YYufn)-n&Ph&!1;~L-K*xS}iY~zrT)Es_@-pIrTqC=2A?r
z^E`#NPvV^s_D@qzeaU0E7bBK&KtyDVU}wFJThCGcjUMOQM1?esSml_z7igb}b3DS9
z?`SN}ckkvQ{}tyqZ+bH4{C|!|>tD(iDD9eaWyVIUc0SWZv%fr=yEE?wi-W>5(S_?L
z{_M@tpMAZZ`%>7;^-WG&Gd^Gc=e&5Ut>qEk|N9Q!a^K{@#r??3#7QwAI(W}7)6~ya
zpYDZk(!R2FLvPDouk*(Oq9!lBxpm%`W$MrU<n6_z?X~ys4A^&g_WFOewjXNdeA78}
zzuuE?QuosZ=}#7lpLg_sST1gLvqi+}=J^xN@wuD2rE?xnx8Iko(XjeLuQAWMf1f{`
z`n=X#NpHrMylrPLKXnpyWf0#c&id1)@<vM5tm5|zewBDt={)jQZoAd;f^Frjup4@5
zno_rxe9M=+t{GP0dRhPT+MLr(E)$;%zx9gsk==gw^XU)1_P@m4jZ10|ZnB>6@0_;D
z?~~Vb9{kR(?Mc+N{%U1iVPUM^ooOJkWlr?1xR+NW4hv~lub0vBdA;w$KU2xs!PPfZ
zKiJyMZg6>d{n&;xQPUj-{pU#Q@czD^s&Mhl5iY@JvL+6jOmd#rtuoc~&0Z9FxGV3*
ztYFC>yyC@q#ur}aS!Y<Jxy+xHeD$Jla>UMyrrukRnSbw<PB&`}tFWB9IO_T=W1W7P
z;<&Pt^0^WBs$bV0n_02-vClkltJ~p+IClCr?)<Vc%|5s!?a_-fF(vl`&(*BsxcP|V
zrk+#!8m}kDt|tWDPZSDTvG0Gjb5U{X69I+8lNYoa9_yPY8PsQd|L)D5yLV^D=;;I;
z58hBHom{-F__oWA^1LlCYp%#@3b{VMtuv>%jI~N=AIFM~%~|#B>o`B$j#W+wl#Kp$
zNAbeVuTFcfwLSg6^4_ZSFQ+#Z+qdh>ye&_E9{yvRDJw&KPX6?DF;&9Ma{bRfWNmf(
z=X%F<YmD54^^Vd~HU60;tE1MKUGy+t=VPQY-+TV)^ruxnPc6KzyrGC|m*uXh?m>^I
zDSa3E^Z5<irbQ0i3*8bkLF**S{4bu6>2=$~cS^ieP~o@t@%&DPn_ldb?(NtuHlgc?
zgF(pQEoVPw)GR*#@aCSEeR|)cPA)&qSiHV3n%k&SGF79oRcfh|=X#Tv$xUaM8f$d=
zY~CW`muqV=b*aJ$rGiu55C0_FT120=*fjmv#I@goZd`kE@|@9)Cu^49&8aoMn18)#
z-BO*#b+`Q&#u$5Aw%R(H?hy0wP8a@JXEWJths%S|$@ga8ZK;}=`mH6_X|G(w-PBXj
zLIP~pG`JRfZ(pExyQ)Ah`o#vXc?@$np9(b!Gc&zze3_N>E&i9ogKn#A-Yaq2V!j5l
zedD)36T*Ck_q6z(Jbht<D*oqH6Lf>uN3`br^f`HQ=BFL|6fCB5ro=xA-Z1^iSA&%7
z&jGvN8eh1S_A+73`NY#9HSvB6{f&h;d@Xg%*KF5}W#n7jd+Cj5&-AtIPlArF`r^{y
z(~-@vWNGYr)}(q#+22h2ob5MG+0EmmeE0Ri>q40dm(+OoU90-A)m5rvi)ZutopLp@
z6WNq<FFlxiy*Yp7=UXBIg4Z;BUGDV0-uht5bSclG=p(1|(xdk#Ge3wGzOYmzx4Yuj
zTb}l5anXC^rp#UX<PF!0{A(Jw-!5}~c)ht)({;C!&8#iECh^S-VcFsBtQ*TX_lOkd
zgfiQo(|2FGB*rAwWh$inZWhD$>8%zY`mR3huF_6aWM#14AHSCKanS1(steXcEH+vD
z>vz?*iF-;?k26^@8Kku&7$n#GDoodXe|B1fQEG2cgUOYzO<X(r_nv7G>EPYumg)C!
z*FT=PnR=I;Rs?FfN8QTLcG_uj=z`G4=;+A0)tPJ5Eh27No9=tSpS<>^<YUpNO1dpl
zOIPjOs_qk)c5joIQ}3cFIh)-pp8lMrpjXP2D(D~T7h&};Wj+6+pl#D#|AbgxJrF5<
z=-DOL?V6ijm`zUXykPVA>bLBsogo>sl$<X6aQIfN<7Oy+xk~L(iRom&>2H3u=IuT8
zbwSLo=T}8;F3wc@o^dGP(j>l>1=IA{mUiYnw)>c(!Ruvhol;%Re|f@-Z~A{qn|~k6
zQQqltCub3K!HDpkCwFVNF5VoQzUK2WIk^ZEWBrOJb@kf}PDsC<bi()2l=9iRKl)9U
zE)&{vxc9XXU+|(@!R^W4|C&#;^e&0YGATRsU$)-DvTpC=d)ws?mbd#K|MBA8zDkL5
z`<V`t{_Wl)u5_4x)>8ko*+yo)(Pt02xE@#Ws41%S7rqsC>u&n~7b?@fb0o@pZeQrZ
zyK~_Mk?le&ADs>9OMBp9An>|s*{k5=cT)39L|@Lo$at!nU9F(Sm+#6-tKFviUzoHm
zy2c@V)qBYT_AQLJPuuSQUHVB#uW~16&n|N*K2x3V%2#~1w5{A}qW=AdboG7hzqy}3
z=l?o<Bh$q2xb+;}GfBq|ct=_xtpEvf&np*snqTDo@=(#GEbk9{?}SZxcE2O!%!ixy
z+#z>b{^S;wtDb+7mbH8J&t!+sFYMRH$;^|R^Z(Do4$aH_^W)~r$WQq6?cBNkQwPtT
zd-zkavije<mMv03mfJ%PUo-sfG56gYnZ5dpU%CDL@X9S%eZ`?t_ATr>yxV=Ek4JD_
z;m!@HGQHZXf8^4#!=EId)!sCp^=t}ft(DI1s2hB?Gc$!_TaP7sU*_@Oz57&k&h6Ay
zD<ya$SB9%-f9DEbb|pJKW5xDgTVKrxOHRzb_HS#N1@Cbi!}lhy9ky=G%5}(yzRTAC
zd)frWm0=I}w&nS3x$nPz)zq0k+wJDAntH4I;kFp%`!&H`cH5sXt6Um6_11*{GFxmS
z(yTNddG+$Nx7<E4r&)H=t)p|xUf$W|@BHE1m3UunhIy-}t(BGbGd&PG_k3dK*2KKU
zKemb$AGzTAZFc^P`D^CyRm^OyzHT~e5AWK;8>XahTQ@cP39G9L+5(V;rnxp3*BbY3
z+runyW_R0k^BW9{?j_8;*Wk1NPtZpO<@-W^Jjy&%mpidJPMf>days{MLtg1B6SZ>F
zPx@>k(&y&!eT<fQYP_(%Q7iV$gv@n5*=hCD^rUWu9M*qv->gQW`Dam&fxrf?g`x>e
zW()tFnrF6bR^i(_JYUx8%DC@eb?fr^U#_~>Hrp|u+xF1$@U~-zxrAHZdhaY;8z0K1
zYSVF0=w)kM_OA7{tsgx?SvZURCOg?r4yx;s)~NOPa;l8A@JX|W2Up&oXVFDopV#+D
z96D_BnOAtiJMCFt=JTZJGOrCbxX!U*g5~Uu=M&c6dbQT=jpe`Hz3m129z;rq-&7P|
zk&>6$$IQpJGj-7mqb;w^PB2?J>en3n5;0M3i$vVY22Bqh?|)0IzpY4X+^nI^a(~li
z?qf+-t=H`4KW^;Z70f@$%{|1Yrp)}9^UAtRowN_$>;Ioh_?WP|^5$|L4mHVNUr$V)
zqxjS3RQs)|c^958_Ib6WhN;L>wS8J$x95@4Ag%gY$}{_Ve;(qjjjv;Fm|$F-*lYT0
zrcuz(CP#scmG=L?T;-Z9d*O8G+QRb1{rPQ&(|T9+h<`YHX3mRnht%J*l~rOMzj^y{
z_UDVc|89Pty;Z6tm}{@wRBgpM+xh(N&#$+!{diy5L#c`Np2TTf>p%>`cTlzt<e8gJ
zPQ)$KFRMx)@4A>VMN;i*L;FiDcHx+>u0s2_+5gtni{p`1V7<I7@!t3Ub)vObFK_u*
zd}T+^^2==wuPhBNF7^J9wV&lmouKk6-@uhsSJnh;UHx14>Vuzbm{Yv@L<?Pp|3A*;
z=JQLG9Be-S(M-HzjezLuNL9n*?|AMX^x4_m$e0+SJ+-QJ?x7zE=j_iu6#l$__N0*V
z+M~-Zt-B(zX@yY%L*KFQs(Pgtw~9~SmVA&Ud}&pdvdX26yRA02%1Hb<x*=q5_L<%c
z@gJ<)En`EZ9<TJw-FoSj#^Rv;%sj`rXG_)EakgcuBzRpDUFdbgtnBP%FQ3ed<r<0)
zSe<t(|DLw=UU(`e<MFA&``uh)ooYNAyqZcB%NE_5$F#9EV27ZZ*7`Yxaep5jT~KGp
zVDqk;p(DVWq0nQ(saZ!G4Xz!&9w0A~t1$g~a&cDFVWSoH?%KzXJ6gSO-G4B+;mWoH
z#!6UMg5)m$zvour?F;2Ai++kuIkkTMujcr`#1B>7`-Jm09zM{kylwJ<GuA092IEQ)
zG4XUUsTswOi@rocSAw|aUtRy`_r>?je>E~*d#`)SC-iP@PGeuxrIQUUsqWKed@xx4
z@_KiN7nk9}(;H1q0**cVBPVgw(EUSS$X@STD;1;VRhbTKo6h_!@%R;^+LN-P3sf4*
z{>fAcHI@f(+1|Xh=-Kwy7hC0W%-Mg*b-nmz#wBN$c#b8g<b>TOe#Mz-N0JV|p7*0o
zv)$I<Q)TZ1;Yp2UC+6xK8oA|EI$b|FL-%1duU`6OEm5ASb)GXNKbFKhU47m<YwwS;
znIR5sO3PV4a__P*N?*OnHFc4b?Yd(=r4BabN_E%$bf1+8XwBI3y?y@=z1dCc|24UD
zI}1E8JmM}D-`D$oUY<@yi5YVWcS!b^%u0Uuilyh*bylAUQsRiPWD2i5Z-2|9@Src3
zRJ-)F^*)Dh?h8u)^`-857;p9MYdU|k9A11czfy2(ugP-Z@6yr#oo`Q#{(L_%<$%b|
z<kdoNOm>JhoOcgArebrBrHyNCxzU<(rqgq`Uo+&KsAu>3wvm_5GRd{Unx{msJ3P0!
z&wXiu$hM#?!J-|f1w~g?7i_<nx?zjvnnT-XJ)ihkFz}A}n)}#Sg7|Dtyueqr_u@gb
zm8br-yoh#g;D6TqI&q=>i7E2AZTU-o%=Bc4*>C();YoYf&jly-V&<FtRCu!3NdHQ^
z*d6;A_m#ot+E~+H%(Il?<kw4ke);@Ck*c@Hr&-S3w~xKOt#k+P-&W=dlMeB`>b$Dl
zi>e=$dF!4mp5oH6w}R);*XDJ1Lj&6%?{1vFhTm)9fdDpn9*e!~K0%e$JWjH_EDvuz
zG}P+7CzUL9{fAl6p-OS(`0el19~ewuxLDt%&-(qQfN9^^O3&U&jC=6v)ARX9UbEU)
zzgu}d?Zm$1&7YETq%QpI>5^V?&dAV*eanqQGfX<NjaFS>#pe<EtY^yhRdONsr)dT}
zy=&wYye@a@OTWL{pGN7rvDYW?YpL|+hgbV2zR5q$(3sYLb!S-W9k%$o=J>Fawj0_{
z^W6CLJowZ~m5ipO88aAM3VC@l<CqgxND8|M6c%^B^zF5~^Q}3~xo*nRFH<i(FT8Q-
zOxMbles!ByZ#^(W`qw{|%e|#q-3Gm-Ntf&2w+sDQ`FKCa3~AnG^H_;C=acaUdpCsV
z*m6qkKF#*=H^cu+x5`&p-PL1AYIeAtF~NNvuMM-v{Y4J~%@)_|@{|X?ZK*kY{;z<D
z_GRh#yPDkh`UN=UZ?5P%b=xR4(Yp1Sf%+7IAHTCTS2`OU5r|F8*>&y;+s8=HXR89r
z@0t`$YZJ|1$2L_-&yGX0=}I@h(<1q-!}d{b_kEH!>^z%ZJp24Jv-xLp?PlMunJ2e0
zy?(a;wWNzN+ak6sZC7}5Py5TJPHBVso0C7(Ked%?KH0W8r%0Yn?cS45;!k@teIk#3
zpXHt28GBiL_fLK0ZS(&h-)(9TX_uU6{mf_kOS}Iy)vNAi1s5emCA`krKe@xbl`Cz%
zRYqfGSXTV+C*i^EEB6|&)o1z4ULqaLxFCB&4R{4fYpUhBGt5Pc;%=2Px$Q}tSexzk
z?f5H~*)NlSB(J$?)_C$lf{=7(^3p>E4GFKNb06RG=8nGns_nm8_RPE|&9>Lz+k=$<
zZ*nRG&d#1|@=hxJ#*_KmUN!`-@00G<e`@>gx=CRftIV_SCL5>yvG=K+wtea@f0H0r
zQAT5<R({^gyZqk%bNunVbH|rIZpv2#kBErs9O$;xDn30YdKcTG3V#E(w6h`R3h5RP
z1U7Le2EIA?pY5r6@cZE3?ClTaET$|7IvA5V^^EE1wtZJxi<6^5Y$P^6I?%^?H%p>}
zIb*|9p2=&}SMI&cSI8c*UH0ydvYFEVgVyWzy4{@dy=zjzBIkS!qX)Mv%>vgmRK%8=
zSnt<qsawTvT2%1s;q(6E_xIYeFPpS9_lJ9Ap^MP(oA#E9Tb>(#`uO6_i^u%#?K>Nn
zwzC$L>GH<bC<xAM%sUjh(PYM}lSyYpIOG0Un?2u^w%F+7bMvjqa}52epRm{8OJ7i{
z^qFtps=X5Tf5-=ydK&yaAtpTe#<J6zCzLAIn#xWy{vT!Vd*xhviSRjpKg^S1H`*Mf
z&Tf9|2RB1$4$GPi-v3?;Jh<g5_d1Vx_DP|Mw|Bq&w(gR0^nr4rmGktsST(-)KhBpM
zru=`a6odTMXxZ=?2Kr14_pa}Dd3nk!IBxInm2Iv2oLidS?L9hi&fVL6X3Fiec-y#s
z#+7f=t<=l+p0w0==^kafF1gw%jwkGv?OKt{Q$K%p@gX0sp76~5t2bME%*&5^^P@gj
zFyfDH@y>}KH8faO&-F6+ubg#zr?s!v!yC1WcUo=Sn;hQBzWAudHNm{BmB9uo_Vu&g
zPddV_^6QZ6&8=PfzU*tv{*~QGlFMm7`mUodMnHCF$FIA)_kM7Yi>;A)?AS0p#zw$o
z&7;?cT?3On`voPw3Un-yYW#Hg-v5j1)ozLYEco^K;_-{^kH4qy$^5mUJ+eDOgTaPb
zTV&FohaW!t*fQ_^)Xkgkte25{CfEG?(C)qe7fTB7_j5c@xK?km{~{K)XET0Hzv({z
z;e^glT1@84in(qrH7Z>ne((3)z~x`;LZV)-lVjR-oL!1TsA-qLg2SmR{C>(wG;bGe
zy54j6cD;$x=T&UWgm&`tZEUP|D`eWf)RgfbPxr<WMWzC6@dHJb`FcAa6umNgAhkjE
zO6CER%&glE@=G0V?yxwOZ8XuMFV|6R(o?&m=Y0<LH@ZFBFlQp?vU>H2S$0xEvVlux
z3AuWCJ8}sd<(U>S&s)*1aFlmViInfEa~nU+VGH}@GCTXr7YE(W?VmC#%3D9Co%!W%
zb}#sI9`BauezoO$V~TFEU3uE{WXs=-;M?MJqn0{<jCS_3?r)o-!<l?_X@u>X1<P(o
z^Ed9$>8a>f`o}Qo)OO47_WPt|_gGv1sVn*O@4=JH4==u`pZC6gdftn(liTDh40hzD
zN3_qGKBsfu$FA<^KcdAc&x|##Uu!LuQA;(R9@cdA>b}`8(hl8wxn^~8QNtRY=U)FW
zT`vp%=+Jk2%G^>@555V}J00>W6|xH_T%Y<^MuB@qjN*jbawqDKIQo4wk!zZ6U0D%1
zO(OlryTHx~w-$&v+$%jBeJ69)xlr%9os9>zU5*CNy7B+u$?x~y&X@1COR)I%*HZP$
z1dnC`k+bY=Ouy`Fw%c1(?Ee4n@5PfZ{w^=q6DgA5dfK?K;h(K9--Qnf8MX#27yci7
zdHnO@`EKu*B>b8BE%1_gPr=EisYfsBIM3bG%5>py#AliJ$F}D+-|ZB5rFriCs-#O#
zul#yEX^DKFf`ne+HU8iq<>$*E3wB+o`5q+mB6Q+APNlmpVLXonRxDmru+(Dj>O)t>
zTfH66mw6rRYM%0F(>kdQ6I~p$40(?oP*h<F>|$j8|LVFM&$35O9&6)lT2zj$Z~f@j
zCAj64%ZIL_BIop6eJ)kKC8rO?*!li`$Pq4aQ{;1|YkYI`x_R=CUTzeacF-%Ut^V5Q
z$<><IuC9{!cxw6b$bhwahfgK1@>w&j`uJXv)!CsTQ9A=(R<G#Uazn+o$NP?Oq(X7R
zX>HwkZEKr~9wcQSxuAQE|J#PQ-D?~yH@xNGlH-*<ZL>4l|III@)8TwIEN5mngm1i~
zb8O+Hr0q>tz6K|)Se>M_L9f*yvvS6frSB43*3I8^Y<<_76^d8*KlGfu-OSSQTPb^&
z#jLIsg{s<lEH@<1itSH7pKe#EU3NE&rDuwQ--VaICW{}=5-rp&+Z)EBGeJOY?}Qz$
z6Dk!7waZ+?KS`*2t(Ts*(_kC_<|8MAHr|^*>3Ch{<870rpPD4Ot=AEK{ZF&fr+3?(
zkI6GR?>kTH`pP8AxLJWE(wt@H_J1vn!jY224Aawl^A{f$U`Q`mARKwB$YFZ=-Mq)o
z)`_>3C~`NeEm~XLptj*uo0biecO`47u!(TszDEsPS*{%wNZ?}a5xeNipteY(m_hAT
zOLFL4+x>TZm{uhvSFE+kp4#)VG2r4Ii=3j3r?yQ^&zyL%mP_=M?}4y2`*NQ~a-_t3
zb2?fmyg_tzVKh^AWA<zJXP2LD4Jy*rGhsItx$f8Zg>lW6+)kPKi%y;ltLZ*-<!6lf
zy36;gG=3Z^p0bEHtk<Q>ZRMR64t))GHks(Hf4)s5rGU4qfFt8vNTZ3+*{fNn9al{g
zXuZb2V(o*J3r|)vtyG@%rL{66?%Z^V(rbMeZF?R&ZQjA9vLNG|gxZ$MlgUXeG1hOw
zR~Uc!@++p!?w5_7(B8G*<~8_p?bG<VX2JDtb@7Nmfo+GYmiArdmlix$D|h>6qu8~p
z6Y3oQ%L!!gmQ;Lyx%@%K)0UW5!Vyo8zghI_i?jR5#4{H-@+6MPwm;yTRbU^rMqZbp
ze!}9}_DOdo_S8AOUK#Y}+`Jv7y=k>ac8N`TnQA$G-=+-Km(#u&9b|d=!RSeHfW`6m
z_BB?^gB;IW#_6wlad1sTkY?jyQB74Di#Nv~x6Oa~$4+MLp*s^FtzFl#Im0Y-x2(!!
zqnxLwmOk+cVTkEEzDud#P~^h5eiKBbn)G-gH@dAVxRthBIwkklgp(!O|6lG5t8-X4
zHCW}(gD2HRzh2q|ADTaDJ8R~qv?=YU&QA8~eDgV}uwjjgNRh%i#mZdK)whny*6*BI
z@JHUyW7f*k4_@9h)N5JZub`H#G2t1rmcRnvz@D9xlmw3C{xx`b`888u$n}0JyOqlX
zU5o!RJTs2CJ(XR=SJgFl?%cig*Rppj_+GoCQCU?PHt+PUbuHJvEf?q9x%YOJN4NOy
z=NxSrDUUtZ#wA`_GrQ-}#Fr;qRoG9xPG7qt!hYjY-M&J`mD+NrPJWhse%yWW_Twpx
z`yYmHefZ*5Z`{)VNk8|y%vk<7)ojUoMlOxgi!we|GOWj}7dgq6$qA`17vcQjI&sFV
z&|muUon?X^9rLso9u7=kQVHN(Uv@)HM#FE#_RW`>e`NISzi@l$hmKz7v{eh^(&L_Q
zdADKCj?C-*v%B7iaSKF$In&g1Qdi#ZW6e#=+shuX{C;o3o&RRh7tbR1?Xd=L7OkAu
z#iG2Qw{c#~{%`m9`LXT}*13`Uu-I@$*KbAXH~i~wUagq5^nAXF_uOSk7j-4LFLvy1
zTIt@te*ftsj{|nc#0bxh-7vMyaeV@h%l8MfPwdFw!|e6(;mr7iOsS1xZH?|9VoX--
zd$8c5z65V$>KWU#)}RTU$09k3wq5-H@a}RIu7fjoH3bM1xJl|i4BYShe?<g`($0hq
z7w1f_d7{>j9k1v}C|z8-w{y}z#o}4^EVq<eJ*&MAUg%!;(sxQx%fH=M&OCS@;^TJE
ztYo!Vhywe+rs*fQ{kXW#uKE9q+9<Olj8oTj)~$ZLcA^MtM2*a3t<T=x^J9uPxmU5S
zpZnHk;a{;`fed&59sK!`-+hmQxNA>Y|JD-a=$njOJHr$lZLBH}NpMwhJ-3(rJ3-)D
zjCZ$2M&%q2*3wt*av3|PaVOqr@%Mc6<JiyRn?FBYzV*W^kxjnmOm7$ZKFOM}<B;cz
zm(QczS^|Y*`CtA>x0jPUZt(cgR%Two?d9n#(>#AvFS61)-SJpqTDGZ>n@`EqC6DL-
zm55`Srd;;H)|Dsj(Sym^y28iQ!{>=aJ!E*5*~DuZ#&h(<e3fa2M-OUUms0Nuo%flK
zYu(k3sr#dz965EC;ju#a2c{b*OQnR81Jdp12TuO~_~L)B?Jm!zbza|pSW05s--q|_
zi!E@q$PnGbQ&uF~d*msz+UwmGahzM;ZQyuxWRKX<RSEo?mETE}+a9;D@wHiebWZFg
z?Q5)tS~qUL>AJ7V`1)!^n*Y8YA)Xy(L9EsbVgto@b$afZ5pGzv<|RjiY@o-(`}ZF`
zbK0Nqev@{VhK6o~;GUxz=ByJ;mp08kw(f=1`UhW?7-ot$KREd9|IO;}`*#%T#+Up*
z6TdKIe&z!<uKlk>gT4qT$SzYfaIo6#ZzaEOrO^Ywy~oO0H>7|6TYs*;a;u7cO7tYv
z@W8Wn!fF2Ot8!lMUb6J-rAwD4-96rS?%gWh#50pOH^<w}nO>lKv-8c16*0@NdKXMA
z)NYL4)PLjRr8&6<_x$?$&h_8_ALFzw<>~c{fpunAnwyhi-ml`_@Y(0@#M>4doA~cW
z^UpbG{pRVSa+~5aM$^`?SX+5r$V;C0XUG53foIlobe{bEqVD5`nrR*(Qh~oJY7Qu7
zo|M|KcnxFjnWGYyF8<!b^kh<T&4iRY&ov$$J)x6)QfkBMr!SnIx;tI{=P1f=6tc5f
z|3Fnu)wDH#c3Iuq$h=zi@S!hzEG@NkzpK99v#uyXqRQ?-)zd$ZSvfr08d(JMcDa61
zj22q-&}{k|-QA~d2^oD3o>lZF*j2bLVw1ud)z>%HRb8+M6n%frkME;S>QTE>e%DTX
zPW!S*zUaKiS1a@BYZmQZH8K5Cv6q<KZ>f~Pcg^8NThoO1M%{b3^^B_a-*s6Lx7$oa
zaxNurv$6R-<CLiz&kXNtzhbY>*vk7ba95Jcg=uRx?mo49TS0`P^j4vDs;lp=+jZ;h
zM(40YTT`Ci3@(+=wa9Hg{`$wKH!QOYj&ku&+nJ(!Blw={*2xo2UH$j*x6wM))d%Kn
zy3L;M_rax$?M&1rx!0MhZ?~L{aFKiTU*9o$lhdorrB|B1Z>g`C_ub>?q3VYJeGW1F
z&mVtG-gI!2x1O84kGgQaz{J<Dl<HfYDkRn&=Gn3Qq>i`#i<J&rH|^VG&>tro8#i~J
ztlZO_OF~Ce*b{AJm$Aoap3F%8b(Nb*zFyAGkL~-xl1Kj!b2~k8ZT|GFDK+yYvuM!N
z?FqRXEcm|NH~zM&A;f5>rIuw&Mkc?g)0Fb$+{r>kfA&2%JB_39z3{uot+#c(y|1qb
zShz<$J9<jjX8!O>qaT+G3*P^ld_ze{UbgKjdznaGjz?MH{dxcQoL7w2n0a^B%Jr|f
z&z;lX@x?}2nI(5&%{p%X%83VlozWN4b67ZK9e2RYpNV&$&YaI3@PgqA>xwhiH!R_*
zIV)qV?S1v&-xRA^_iXdpjq@Me|HWKVSG4K#v<l{CcY#$G_lh_9xbk2AnbGlXPp9~f
ziBEo5ANrf8=+WmSeMm*);nb~1)=#>7^28KgeRbzaLD#&T*H6e<leN=nnP9M8^jd>2
zOj9pe-WGFye{F7m$9J=theXyH+8pEQU%abim1e-Yr@Wc|lG=GTOaE@@tgCvo(S7~2
zla^0Uy{_2ib^43?3|({0^$e$_qW^Lno3!)#1K0ZuuN2?&B)7C%tlOn*BHh)L+3DG)
zve!`5&1?1IG&wcfSiLiedlJ5X5?Jw7T7O;a6t=q`|4*75mBu+Ws^$2*y_`&eX7d+T
zmz#Z7Q`{>#>s~N#dfbJ#C-yqmbrkIPJ(rWRDeK_Y6???J$`W^0FZBAn>BBVpU(dbD
z9$d7)KH*O~>%M4H4%WyWC$=g6x+r_TEPNyTj+0gwZ<@9TZHs%9W^uDkJikqQ<F};U
zx3X&XI`FxDlu?{)HY;|9j~Qq3Z=G{73g+`CA9wMbq0{jCr>Q94<AX9KLOtnG{R<}9
zxpB;$ckId3S>72>z6Af`uxc~?a@cKi!R(2LPDOrLx8$tvi<!o9(%Cik6MyV@`fzI$
zQ}>ro73+U~U;S5j^5n2(4smN&hnUU0y?M>H1Lv6&-g}m%b50l9Fe|(}AxFoek(>3w
zj4h94oLCFEpIJOV?k`}@+z~0|RL2vl^3TbVzp|yNAiQhBF^5w2!h;Rja*GZqv37K-
zX>WQcy!xz-onwdAVR3Cowk2HqT21r#mL%l2oH5RB$ZU!UGK!L0ov@o_!?Q~pO*ZPy
z_%-#ohTu(h`~5%P*8Kmp>DZ~b1M5>SmZ}s<cjxNuS?;EOq0>Zp=3)`+HE*s2K7F||
ze_<ly^C=xkTPN|EusQzRr)M!caL+pJ^#_aGqo;c-S<bmsGke#SDiba1>rX14-ab>3
z(D~X%vQXj8tmmbf!FF%?0#_E#i=1K|yesCCL!|lT$vL~0XwGkJ7oG5J((<+6TWn^Y
zk+$8jz;n*4UCPIQY>I2xm9#}?-*L;mg`YpX`1IrX_vzuk#lsivFzVc3I(hLM$q!E^
zpVejA8kOjsZeVud0&}`n&mD(~bMv?TSa(6;R>gGF6}Of4UfikUUCb^$-FBtyj4N;E
zY`eEa%YEqs75>ZIg?m4lKZ{!B&MGQ0x5|wxZvBK3>plDQ<9jn#&Jzf^VAWP-)HTyV
z>XU-zvziqSLH^Dgg*+0uG!KVx=r`;)?-1kF@@YQt+stgzwM#Rc9v0_J5wla=yG-L+
zLvOd)>5T{a)6cbuu3b0Z|J=Pd^Hu(=PT!&TK+pJwjH219{io;s3DRwik+ADuqw4Z4
zPcUVxmQ2FR=sE9lDw*G0nzOz21;4ms{OTQz0)GQq_9?sQf8v@Nv-T)|+|$S<+ATBr
zH)mC~aI=<t=J+XXYUs4@`Yx&YQ=2`WFfHOe!SrB%aU{=D(fbecR?p?!V?En4C-}00
zAjc0m!v*KFZYiH??e*|f-6lOvI_KG%vy)abbN`a<w@`f*a#kv+<mKFs9p8in-B-Oa
zFLtfp;<D^hoWPD{JM%t$DV^70*KyGFbG4Jy6U}_yiOmNqJz2|)%F8<x?%J6?dMpuH
zXk;?~$J3HMkK6*BUgX%sPukfQtu-@iN$I!sH(ZkKnXK3P%s&vY+4Z?#%C!q#J&MsK
zGL0IOjQjrXNZA>tbz_>lI_J^PTR*%y)B5R+_$RY6uS{v4#7Po%#Z5lbH?a1vo+#iT
z7~~c;XLHenymv(}Cbj(CJh|@Hn=Lms9-5-V7+bLI!u$!@CGS3oPKpeh!t!8p^Rm*i
zRxyjKvo0?6k93>y;tli7$P;s=&YTFIxv8~J{h8D5ZK^jbYvpFQZF_OViObOX-?HR>
z{fcvX{DDfZHcx)=YxZGoS?lx4Q#yVhT4=S_G3L#eIJreG1>$_yGaX~zh{Ve+a$)-)
z8r@oTE=uoiz2W2;8{f+`-#Bc#y>N>278RX2{1=}sQ!fums65iR@`}wG&pB0Frnk)a
zeDR)5>9xrL?2ooqM$Wc+x`weM>^bxC%2%)63&wk#Fm}{3yZMVRiYa2I@xjSy)h91+
z`!SEV-9%~qtfP~EopNg_@)6Y%6sbNrdHauh=Iu5`HY*}6x>oB2PYIuUQ&aZG+2HGS
zLa!dglo{903wKV^T5n~se$IPU|2vPYf7?8Iko7R_-<6$Kg{RVQpIrH?M!)ir*!|nj
zb*&2wX15BTe`UNpXZP&Amv+9gDeZp$?(+&}?!`0hXRJ3YJ@x5Qj(Gq7=N-lKj`%3H
zPM)>YOJUWKmG2%;@KRqI_vwpm=Tax01((!VU#8BK7FjZBw#~}EH=Aq@vK+dWzIjUD
z`c-GA1}{`Fi@&AJ<Xk;@{;dDc3ft=4O}@%WTNeB)e9-GApxE$B>z}Tc%G|@2iq0SX
z=BVaPc;=t3Irn_D!RCGb{;O<5kA%K#xi_iE;l#fj8L9Y!eN(i5Iz4;%@c)*dQDJR7
zE6?tq!x_9Ua&vatb;dvZvo;+4)LvoqwW4W3?vvW$<Hj0&j!sXaGu*aqpJY6J;_su}
z7jvHQ**xh#e(%EZ+<v*)H5X@@yjgUhc{l%`1cUF&Uo7S>-dJBQzp(Q;@57j>)-sD0
znit7C3p^}1QT(X3JK&4KR1+C-&4p)Jt@9Pn{+P{Hz$-QDoQ;%*o;;uGMMGA%*fd++
zpp&abCI;`e$g{k<yn}hS%Brc^RtMI_Xr5T^_SI?Y+K5f8St*UH*?gRze=}pRiF$wg
zO_dw>`6<s_70kq$R%}*&;Na27P{Z+OMbG->4euvs?lZDm{rIw_^AiV`_6LWXlr#>V
z?z?sJ!Of}<TlxeX4SM<Hr*!E*G@hSOReElt<%5)@nq{T7+<OB#=YM7SvE|&R?{7rp
z!$b}r7jpW|DWJuDwX97~#?f(&kWHhR<{|IO0M>b%zGPe9d{B7PU*W5`q)l+T_-#gQ
zd4XFs-?Hr)?bg0&oHzN=<IVSlH3Wh!8-=R;-TKehb-i+K|LgPgjpqwnNgKW2D>eA<
z9=seZr{?;i;O6?pi)>3izRcj?oVxtSjyKmUnf@ledcnW>X^QfR)PsGCxGp9+%8Di(
zQoNZWP?>Y1l1X$?(Y%R?hb0ob&$o41xp2=vS6Q<<b=i*}IX_scT$Y|=YMvnJXeX_;
zN=Vi$#L{V!W67?Y3TZhfN_Qwu)ns6ww$nQ##O=ttS6-T`m$s~1z@}?g-h5&Q-#*@M
z<@;Bs273M2QX{cJSz}*Ev;XyDp@)_)ZFA^X|FI|OZrtwG+ViI{yn3-vtiq7t!V|v@
z>uQ1yEq{8nLDli&N41D>E6s<OKP6eYwe=ex+?BRY$U&C(%BIJnNrmbW*H45VS{^FM
zwuYmt-~8Y%M<LOgZPVm0Z#1r%!+FiLWGcg}jQL_Y#cuy@aQ9@tkA5;;;oCf??i*22
zEM{7qE|XhNB!x`8GXG4N)Y-s8E0%gX+&tHlT`qF>oO-j7lW5?I-T?3E4O?c<WNmrM
zwPk7dd-0!w(|TKPm-HW;(V4w?@xu1~OE-QG_;IaWa$EH__PiGh|6Vr#ZLlLny4<QU
zu+iK2n4a0hm>v3lH%?3z&{)Cc-_P@gzr9hs?ZqMK-J4UQm!zz>JXKy=yQ$GPM8ZW|
ziSyE@M=whD|2nrqDfUB<({-_39~b8`Yvm+Wy!i8`$@%4`)%#{|n-<Ej@8!{(FH4=Y
zXWIS~nK#KeigA{2Ge@kPbVl>Esf*Qlj_JvDFi1W<^{wyK-Jp%}3!N5EE9MsLDgWKx
zE`I%8!L<1oKV|i(e@crhQ<iz^z0^)qcu{iW41tci^3sj}|7~*d+*woh!0%A>irqgf
zwBvWYdJ*fi)TOI$V^Wj#mv@hke!M!7P19L^n_6XixXe@T6?Tzb!H-`^n5(s@-;0&|
z|K7+_sA@r(WxL4LZo4a<7Y&<z3R3Rv{aH|08ER{q|BUg@=_9FzPggIS(z;`Dvi8gk
z+TY*(d9=pIZD!x+1gXGlLfWcVcQ3hebjIT3@R<+l_x!HdQNK0bR$o3*dD5LdXBH;E
z)H;4q%bjQU#P@#R_1F8I<EuM4IcU-26ssSPcrU76IXaK0!e?34&5lhTWm^`VpRo0J
z-v7f-10#2GlyckX_JmrVnjW(<c!}uRwvvW&`KuaAIoo{oemoOgn&Eb2>JNp<u1T&d
z?xil>_$TDD!7Ue+xD~p4xzEd9vOd4ltmWR-aIcgVc}KT(UfOGM%l^;WSv<dFc75IR
zu-E!WkebW;RXVCpA?CTaU0PyfV&}cih~D!p?Z(na9D+|*Z=EuIPEqAXvx`CES*Lj;
zy!YIivZicu_SV^RzAmehpZcpRc;)1YZ&@caDu(?oc%zrJRr|jCQoG$&WgV_9>|1Yj
zPk9mb)_ebyQz0jhrg;<wt&W{5(s@<SYGKs<E1@St(_Un%hgF;Qheo`ewkdywPgkF!
zlV8Tsu<EB*POK^W$eK{PwruLI<vg-`k7TW%CnUN$wkA0u*KnC|%?26et+%wFyQXdJ
z))!m7_e*IKznEc3@M>H4u6<Ya_O-0p<`K44*5m%hqj8psSz^1_%B&4px@>Kh-GqI~
z*|EKQ#Wr8_owxPeX1N^KrK|V7xwXpkckYU-!qKm%CI=<1z3m;oBlqf=t=lg9t^Mj{
zq_ws*`gK>5s#8euom;xf8?TveS#u+5`*gY1+|_agS<ch^bJl8ayw-GW*U_!lbk9`@
z$IlC|-kUj7e!_zZQLnElJ=?Xp<nD!QMh*$Z2FBOdw!SG%zj<AJcGUJck$26q*RQ^$
zWOzgN>Wzh)rmiksD5be_lGK~foUp`=-TE?Xe7nPrDdZTXiB%tca>A#~-7;xK)~3~0
zjwW*?`hHvG8MyK0+@<*vt760_3tl;W^Npynvhgk1(9orO{)PIr8n?_~U3@p{NLKlj
zSm&pi7rX4f6iur>x@E=8ce+n=ol_@mVG`Io=jXaZncX+vi=D4~ep6W2Rd>xsmQa4x
z?YDKW)vcG9!o|FAYYFd~BK9bs_M=iCL`y=VKCE4ue|x3Kn{LfaW3fG(Zi&wRuy$#C
zO6aNdV_QlhgyR}_i*0$ByN);i^R+vd%6EilHKnRbdamfY@uB%<ji7K`$=Z~^FR!lt
z&2=sy=a9JO#jOuq#RIR!mqsnE^h}*~qbXe7HR-_i>GNV11>K*z@VFn(k1V;>8}7Sa
zFVJ)73X_fa(3<pnZ&6mtv)wP&o%{7{x7S<swmuX8WmR4wYsxR4o%i+V46l#TZS!>e
zmlegO9NYck*Ll`y`>uUm`G7U`SaqLB?d{l-@E1%<k*n|MUwPY;`~8$>pz&Q-@oqhb
ziD8_1r#*ekP0gau6m74ZW_`X(AXZ@4fltBbPQRG7@@br<nrPeZ7it%Ot@ht}B29W-
zWDoCmFC(qD-_Bh!e>dfI=C<8oN!znCqBq{W7g?1Nw(~&B?(F4hyM?k}M!lW>d3L73
z7xe;L+sLBjtyi`bJgNJ-V`k>urP^Fmo4$P9FoCCS@#O3`(KA{vbEQgga!$X;vATdy
zvP;V;w&2T@@1Y(s(|5?FT79YMKX>VBQ_<efW}PpB_Ahp6Tle^4WYvoe%Vl;bFvh+r
z$+)2S(aP!+-@;WZ?*;e8PDs%EXdx1@`q0xCdVi-l`dj8XChfd(cf~xBnfot>mNAC@
z<$c;UHCO16>b|x^DJv|b@1`Et)P0)Omn*eL^_t(;o)b2`?>040nO4+#xJ-X~@BHP?
z_s_o2v-ZebIi;&xGgCF}_RIGD;enGp*S>6VKfZ~1$}}(6oiqB%UTKAHo;qv&mDp|H
z(^rZt=sx*!N!_GJS{F;E{Fo*!T`W2~Z`F5|><<3W?1kP&uk=KYy0>m$Qnho_v0cGi
z#dfKDp0Z~5W`5V5>)z{qo%Z&7q}I_dNnTZ*yO$(ub^Kj=Z_|0vh*PQGJ??MZzvNh~
zcfkywzQaen`QGTpd#{L6khLiAl~pUx(S2s{b=us=87oEDdQN)yyH9y}p?F4>_jO*a
zr_9M(w`Lv=QE|SW_)6FM@WmiKqZ@`+GY>EEYd@0sO82)(<I<Q(8<>~hNp4>`Ypa&b
zvU{6k?Y);)B>K4P7thdAcYS2Al_zz*|HZ^jAzCuWLa+2*NnACLhqZlWs*ZKwl_1SF
z3E|{4zTl@l9x}_OEtKjAiGRJy&56Blt1(}2A75_!%B3+cUFHgf3NK8)W!diO*Lf!~
zOY^#6;B}=_T6ar~+E-3mJ4I&Mw2dYI{g;L%`}k=W&$tqH@)6(Ulf^SEmPKd3+!~`Z
zm22V^oA)WpH>_rNduOn9iuX>9_1061CK$?wolBgwez#Wp%B^3#^rm?|JTYU^7nyB+
zD-}v+M7;`)nX=RSYK%gyI^SfWa@~W8n=JT*)ulHtjjD1<?whJBaQc*tTD4;P%B4}2
zF3uGix8+P270YJ4VU<~S?UHw2gjTCjvX;!X#7*LbGontlx?P#+b@R)Hs5OU|c(vb1
z%<6nMd;R;26(aY0Ix~&=f<?1W$}XFhHC4FODx|CASV>7l`^u!C6u!wty~3&Oo=YdB
z`?yRmoUuyH`DkL$+TuleTSC0*jve^|QsxFy)++pT>$)J}DMF5`&TZhEytm_UitgR7
z!7F8@f|JB#)Ff3!`6h3D<NSD<SLf*&eBGrpv~GBvO$=Hqw%D<6Q&#%91KR5*9hFt<
zes1v5$NcIfU8zUTSEF9sRC{d@%Hz{|cuCAE*V?-)qqz63$qRjBaPnI0(!)z)R=Um=
z3JqSE9^G?zNsd;BtlHNs-Bov%27Q}k<>O)*tD(1B)zZi8c;X|KgWINX_h_8o=*8=+
z)px>Bs$j;U;{}HGo?AC`?0OTha)D&<M6t8F6Bj<$yXk$MM=RAhS!vCcSgoLiuXR_7
znOuCJk-EECX4b-cldL3#(mi*s>fAJWVUUUOvZJ1JmS*i+^<nCi>{%-&FU%>P;B0&)
zeAOJGnX8w?opHGu8niC!rXqW4$LbJUQLTBC_P&|SKCLM8G@qr8v+dGTKPOmvox60|
zf6D5pvN<uGYh@&V)lJHBlqhwYk{wl+!MN;*|0Lm{hibZerFxbIwN9Gk_)09$eC4F&
zSN5nptulCZMMJwJXxEFyQl{QTlXB)wK4N@5#CzikZ@#s=rY)J4`$i+Q&$o5{l9(RX
z+Pj%|bCaH$O@ETT{!(a=?vX`~J=bhyrp?^pEp@EvMs$$g@kRUogz&OmDu1J^x$%b3
z9M$&6I+k;;UXR+hDqx#q)ZLu&mAhwb-|}UW>NKy`Gc$VRHt)U?dn7hUFJjTT#i!Uf
zM66GgP2a`+)7x7=JV{gh=$kFRW#yhz`8p3TiCgb-^>V<vw40gHXWj*gW`|bztX*nd
zcj~E*b?)rDv8!f?%shQ1sO)!0tlHC{X|gMFC%n@O^=<1qzvas;{b@ypr}<WHp7KsF
z^i0Q@%%FAO7wx+?^)crX6T#ge7i33O?G*Q3`Xj~1bNPndDvOsK$_>*0yy#5WDXqPC
zQ_H7=5?X$c{?|o5eVelKzu&m4IyH3Dj>k_v$f(bIx$R4o_B1bE?_JX!`{u=KboFzs
z&wRNxOlPXlG(*|7hu%%fxf{C6=TvLh70p0X(W<+An|Fg!+TW#1r$=lIITapM->G?d
z*|FGe3m=Wh3f;cbS01g|y);~XV~AH`P~(-%biLqw!|9$|%{q7e2+*vToP04cX4yR@
zy~~$QPl`CTRm*y=-fN?;Vns8pyw86MSr>Zq<(G)*pg=o)C9-U3hWE~x)aBU*dcmUE
zp*ws|9gV&6GQiAsm)dKiP@k?dsX@AL7rirD88WS>bA!b6m03n1F=|)2^j|r7FWr^m
z({py0kEpRy@yuy)_l^dw)Rq)}C<3;8a#5~$sn?WbuDf9eQzr!mJv3T*y(}<IJ9X;4
z+|7EytkElX`n(E_n{qNR?Co8?*G4PXOgb97OzeE>qnUZDj)s{WX+Jlw?clW96*6<U
zwrBo)8n(qNM5^@?|EI6vFRe7iV*{7FEq7aba7z6J1L-60E`M6RZbit7CGUhw&xuZ7
z(DZxB3;V5>|AJ?4=a|0UWD4)3xFE(uzr%J|hup3Y(hXar=RKu6q^v5FwZllZ>fhy0
zr>AIyuXyui6PJLhQOV!s_byGgn|eC9tSXX~gV##sU$B3re8AQB0eV_DUoI6@0M(-P
zLF>LQ@@wBDd+D^6Lx_LZnfjo$UlzTy*A$=nMk<q)qxEFK$N3@L`!YCmpGF0`g)uIw
za!dJl`P1sX8sSskNbTejsI>a>SN&;_{;Me~qBvuf!x<MfP2&3Rx%W!9QS{1HU)D_w
zZCH_}t@?lE+PE*S6J?@zZb-R)Ld!v8-K48O{d2G0(mwU*aF~9WXV|^gML#C|_ItZD
zJZ|Gv@6fc@e1Dd8m4-hx-#RsW{fgj4F>5Y)Xgj=^!R0i6<=!ucw6|3)_1g4CPh@&*
z>-jBVHHp<L?Oz`FtGai=W6vk7HxA55h-U7+tMOq!=ls$O|8|?-Rt|WYT(#73N2}G%
zcIEGa#V!20_jWPs$LMA*tvpngP~oL<XvU!vPhaLtt6ul~`j6`qtA*pN?^|8}{oVY_
z+iV5BhflN2QcDiM%sjK?QJL_xsb6*e@fkD*>pS<EUEAcUskN@4a?kae@`6v^aYu4O
zf>%$P>&vm_gr)SQ*4^889!(OO;maZ{=HVVL%r=cl?P;-;*;L^|an}eYZH|OknYr)g
zKR@QhIBjLo8tc<D+M2c%+OtU3zyB>^Qd_jSL(#0srTy(mg~>OXt><K(-?y@;$x`*?
zmdlenmTW%M(0%TraEHl;fFmnd0-x(iOqOX)wbD)!(a30;$i|zMcxC6^vnuT?W}fSk
zVC|Zopt7+cDtK+toEZmaJlj>I$R!ibG;!C@(zd{-Df-NY-pNmsrgVBeI(l8&ZLaq<
zAM3prySW3^ELY~oWlNO$-I-BV<|!_|*rg|JT{+(}A-B1UO_t5Qt^V}jmPqwL_v7*N
zG+$S2YP{F8Ub)LL<4jl4!3<;DEyvYE1yq);YLGa)b%&e#?wMuNqD~#v2o9HjoqXk{
zu<=`+_$l2N<5*A6Xi2^CbgARIEQK?Mo7ej2tvtu&!OFbR)AoYQ(yS$`Zq<C`bX+#w
zX6f2cpH<Epsg~YzgPtDV{c+}QrvF+qCN8_tBO+UL{>+JoH?D?vX{lFkUcK#Y$^M>_
zusM!14=tP)E4Wz5W$o)*ow)}~!VYLy%|16{;#PyK*h79(lrBdKF81*iIKA#(NcP=T
zdCOUU?hr_gYKkh`+7{?OIkGG)yT3c|*;SANgI5_w-5HzKY*unv89e#Uy><3IR{IvZ
zX1z6-D{6RZ&a5k&P9F?8wBoT$RN1;U%;IUkUtVRuS>=7^ghb1)H5&4ti{F%GxfOX%
z{ptSu<k~mCVivDCG4ob=Oij@96=rr%H?QUkKGWB|emhr~q0#5S`Jo}@#WIT~>bG=n
z-^%rz>xZG4eDRc36IV$cD|z!Jg>QOLvFPNi^k<9zEm@Vf$f7Llxq@=&!I~{co-KZ%
zQF*Rr%a`j*rX5oAyzG;HRC7w^tSd`SH-;Qqv2=r{mC5Z$!6iBk({7dgQrH?|cG4%s
zTDxgVX2+2gs|{~QS<Ox{Fa~*Oi%Ztkm;6io9Ih*EKf7tJsN<=aSx44fmiL(2Je9}e
zTANO?$lUGcq$l2DURji4boj<;$%!%(jOMqQzA>8PrLeWexoCd$!p%y4*{oSdjEd5h
zOnoJ&Iw@56=$vV1XHAreO63d6y7$t!Z<_v{(>Eu{Ob8NRY3HGvzGJ$vhNVKd!0uO0
z1v58lnC^5l4ZoBbxyJS6!cx{gv6XexXHJ<mZ{gCK6Bjcrdpu7nZr#k4nD8{m>uhG|
zy;&JsBW7O;GS|x87^rD=aIWOk=9@A0hZYs-8O6>v<BU(4E4nP8#A^0N&2EWMg;jIP
zQWR#b^gVf0<8F~+Se$N;71tfL)H+apN!`^XQMq+l)YBPC%@_T2y!2dVE?Zz0w>I%g
zV7i&++0!LqM>L8HJ37PjB}%u<e7hw2c1%YQd;5#lsKYBBYu@tPw)N~$jnDZ(%=+xX
zoQwOGXG|{I`SV<t!EWsf@@4wQYRLkxHZQ6PIrVbMclHmSQ!Tx&>{)%()GBYI@B8Ja
zth5tE=K7`ioQ#qv-IFx?j@{S5o<h+?oeq7~X-mvbYsd?gcwAl1{ZQ%Mx&v30M5~jX
zjoeq>dKJKTxa^YB>KL!^3F|MEo;lNZWjgbzYT+-BjxzoKboPXCQJ1NujH2hnH|vt#
zx2ai9m}UPl_MO$71u{$7c;~-XJ<qxNgN8%pv2W$`LR7t`F21s)Eoj|zo0Y2r>PlWK
zu9H1-X_d>WP5wTwbe>k9yu7PRR<+&Z?T&pD%+{U?R1WIZyzkw2?H<>*DZ8%xU;ecH
zOJu~&|LUT%i}pV8jBPc_o0yOgv(TeDYU<zmp!1sdz2{vEWwBdnwyd@1%kt2h9~4aI
zLsVMjP2AuY^UR|-O804UAKyxzsqa<&Uvqt8->o|-bb6?>*U8XDp*K$`wJ!GB`{ZP-
ztHQRcUbcEcMxOmKsotw!KjAViJQ>^i@XDfRENhz=ojrM~P55TT+3%B<mx?Y6?!F-`
zpM7anj@8A#(VS~9HAkMwx_;}+2A-!)oH>oEdJZ#p&lfdLGSp%W(Q67=G3&^|8-jD~
z{Qb7ioqjBUcX3fK^D;3Z@%cI?wFeE_pQ&iiX4$LbJ(F?8qtl(Ar&u4;67jq3S-bPc
ztjf~(b4F9%c5FEnc*(o&U)aLzTWiluKRt1k)5?`OZYix3ek@t%bbib29{uCsFcm!*
z;{E9IE-u^4?+o_MF<W~|jU_m+)Bm+r&6hIs&rd-?S$Bd<@1tjIYxli(hWqAx+oCm_
z-^W)?Z|yU!m@j=3e-{0^yeg}6%ce`dH9_GI7nS=Qn|^s-*wfc*XB_gYi2{kd*`q&w
z(rTC0t8%ZLx?cZi@@_8ky^o*NTG|#(_4a($?eY;EYMF-n=9sCkmh#hGHce#ywa^)U
zbIl%~et9WNGydUOky(!}Yu)zWpAfct-pu@!QZ^~B&#knWrsOW$+?u&H$XM6=s@Kc1
zqU*Y!48uaSEcJUAO1Xu;ZaTraZLyNwO8YaQFk3x~MfY+-_SI9DcYoS9=f?$y<58`L
zUf$}_PtX2UG;Nb?;;otb>C>N`k7`}Fu)SYc|Ma!ZGjvjo50yy7_c_1P`r@;F>gT69
zwl`PjxX#eMHvRDhP^jfTud(!vn(E83`RuPEnW*rGi_5Lo=r2Eg=+w97n~61+d@ENM
zT-<$kj{b7<wc9rROel+t?{j{w74s#p|Laqe<yXVDx<sY*e|&1OWZfax_mY<Je#KE!
z*WcU3b8Wiz<y~E?%<s+%{qi)Y^!c%{t-VpxB0oH}c(U%0@B5ps@qX<wslnR2W#_zA
z^?#?uvwYs<&reM(BX1TYP15?gW!<5YS6hqr%~4x>YMJolIVYEgPD`pgxTeh3IDY9g
zdBz*crGNBPl3b_7pW79&ZJPe_pp*J+86q{7d~Pe9Wp+nw+XfaomSMP0hJF4O`Lr3%
z`IACd{WuzPBe`}b%YrU_b-UG<3&R!^RJBe0QS>nR#EzmY<|R4q7lhg)^>@B34qK2_
zwMBrTaMPzLT7s)`Tqih*<>*&>g)d00YMWeHWEnJ7BXpahhv$+Q{mP*51u0c-+Qm=4
zc!qA1_c+-H7JD%Ndr#S`<5wTVr`}f7Ryw-0g!NwK`4=g9bN(&Sistjt)zVw3U2v}2
z&HU@5ET2_H7h0dNZQT1rGqy4Ro^jPo;pO%#PbrE=wM}}f>i>!>=JUMFXEi%|qEv&X
zD(gKF$=x{JW~=sxbJfeH7C-#5B6QvP8$~|XS|11Q?mFaYd-<G=MXp)c$~zLlv!_Np
zn6!(l`DBR^yWjkf)aH{Xxl9W@r_SB7?}XT{Wv>^8{x#HV)|#TFd(-pvmCdI>^>DGv
zjg3XoMKLpi!X@Uce&n(0;FVQZ@|PZew?km*xq@RVyEd=Q5wVDrUC%SWOa6Js-yPSq
zru3y6RTstjdOI!sr6Mao!DeUNr_0;9TAf$ttL#pV_1(E7$8*9Wt(|d2OSXkC%+;~p
zu0H)Ds8m$Fxap>?CEwcB0p`;t-=2JVap=wqDXX7us0Js;h0(fY{(h5Nr)v9d^I)6_
z4%mkaqu<_{H|N<Ft!Tl5M@uh&3d9{R!rJdnzC1VV=>hIJ6(_$>QZE&?+jaHq+mo4o
ztBW2iy_)*{iN%(6hdj6UKAIO3UOU-q>76v6?DZSek1Ljo&fAqM_Weo8iO_9ZZn-7;
z_c_1Q;!(eS>g~zQqD`9~UNM6>&|q$k^>+2;o~t*#yt3_v?M|b$my}Y(&tzS{y)JO2
zve)s(IAMJ;?Mp%_Z^9zOv;F;+wq@{a2)!}+al#a<V;{pJ!*7QMtyGjseq&HwBvTW#
zd`2SQUe7R1d8y*W_Pdk48CLx$(%q<kJ+k#sA<wbtuQPuYX>GN6$uRL(K#u;;pV6)B
z7K#=K>91a%Zn#o}rB~Bb5|XcblAqS>oHy-F=sMP0N;7Z%jQg}@ozr=XvUAffFA2Tb
zqLBINXI#;ivhatCt@&P`ez|GGroRrGZWe<pmu|n;hD+n7Jp&brOXPz0O}AOQy5M4_
z>#`%KFU<{mdVzc8i7BsD{a<OtltfL`{JQDOve2b#vV5}Izdi+prt9+1t_c0r%irBu
zF(th>^Q~BoCEw1~1(&1UE>6F!7=H80t1n#pWZLh9O89Mw2z-?a4o(*?V{k3Vby;&=
zSjgnC)XSYBX}>fUhAw=^S?PcN%=J~a*&DX{?@+j!HGhM}REJk0^G&(F`d3&~U;XOO
zmAtYoc)7~zgI63LCWWkM3`##V^(^zNJ>r%@N7rX}|J@ZTa`)BNs?PZ5waM?_gh(r-
z&TfjaJM?AJ{C%M-=5Cv~tF+Q9lp|EH;LfY1rB8NFS?Bb4%h@xlPfuLsvT~E{#nY!Q
z7JJ6F9?FcK8NA$o)h6AGr&rwqiLAf3EqMMqw*OkU1@~^Tu$z7<wBpqk9pTb#U(`cy
zcD+b7{bsqOtT)u+)fPSBk6S_6nPJ)VX|J9K?c%bZJ1uq5x@rHGXtl>zMINo!Te-U6
za^})SS1zAg5vmkw`Rmf@SeXM$%S7i@?Veuz++=0wwhbP!%aZgfv%(YgE*807Ie#fV
zIkmWRO4_Nfpmfa^9J6kP*vf51FK?QyJo6>cC#&?X@TXbxekW>A@6MIJ=^7SO<CW@P
zBrx^E%3Er0*Qf>D3KUFAy*l|3$12B=t(v#oqQ16puiy2;bFE~UDa$RlvgM&|{qJ|j
z@_o2JQQR%VLcU*K_<pXq?=nFt@LIV_XOsCZ|2SGdY_R9ttMF<0<Vp3{O;vX<ozDLI
zegD1p`z<Xmsm4TxM@?`(^euRXc<`o3uJy9}>&pv1b(`6Q{!Mc{$9|i?@%s`X{zqOd
zCVM7LvYYxc=xT~s%6w6)n@37=->qA_R#Y-C`lEX4I;F$=W+olmV`1%T|L=N@)LW;<
zuwT-<zBYesmaaGye*9fdTjk9kX;NR(rT<rX*SF~JoUACPQBqj4tN!1~A2D}#Of=>D
ze?scIY){Yho0U7}#qa)Ze%-tx!7aG_1?!a4TW7rbVlwZ+5>=aZC;u49n|_;NzhLsE
zKT2N?yA}U`+?JV>#OLsX`LlS*=MGgKpIcGec62Sc$hJ91cV>hBy1-J-^+j@xn@o0c
z=|nH#F{+&K`O}N6Ag1LFK0h5M`KDIi31pn3+np09H}{H++1Kc}6TPN~qT_aL(^<u-
zsK$3->AkZ~?`EF7fA$mS*Eq@fpAAwy?N#hTj_tfs9eP66a8h;Xu5CJR*^^{T*@Hr-
zPrU7S#Jr_sDXXH#ot4i7R^4KH@=Ee#scvkhE61b!>rN}`TwQ0!&C_0^dVlQ-_Qto5
zXK_r`{TQdc{qYIbodp3?78hn%RX<{SaqPp??x)sw<MK9lc;7!XF+i@?uj;&v_Z+R-
zQ`e14pKceO;PmIT`nt(?bix<p?%d8{VY|4b+aae!@9r}j3u~KOjfp-ze&snA@2@)R
zsBO%?mMc2=zKo8E!7RQz7tb91aN*za?!Up@Ujy^Sdp1nV+$&gmy85)qiR@*GmiedZ
z;)<TktPJk1J@;Kz*gI;u0|#@W!MVJfg{HUnzX-gdCbD&Iyah|Dd+p6-bvLU&FzbtM
znm@1SSg!PJ1uo}|)$t)rCzak6NGu8UFP~XDU-tXd3EiCAd_!YSeV^<QcKq;#-WWTB
z>YE3q=&LqbR4cGO(_lP&BBXI;)%Dm959Rl8%7=OLiv102T>7fLMA5!Lz-Yxai;GMD
zmgfhUxK5vO@uKeo{`Y$>-FjTH>Eaiwma^bmS(Tfb3oZT}+BV%mzqXN6v(Ck8*}ONC
z*Zw-|J7u|e{{uFAFZRbCdh_+wLrZQOEnoFSd;Kx*yl|P>C#p|sf9}5>w0-3ZdHt{F
zWQzX#KRhRM(B=1{&S^hGRNq&w{Qh8qb?v9`4{R2inRN42Mn79URp!&uxNhflKPJX>
zU(P+fXUin*eOFe;o-j3iv^sWI?oB_xlbrFdc&(poQ#i?MeRrGAq41*p)2rrl?38vb
zn(whacIJr{y}qHhC!e<6A)eGB%Iv%UF-On2LpvFrWV0^LimDW^UAbL;OHZEi{F5_1
zd>#KO<}---i3{*G+<ZB;_Q%qD{uh<JJ!<S(cUC<-xomrQ*`w)Ig)XNPgcBmw^z#Fo
zzIseiN^etD;=8x|gs0Hb*lVmdY`f+jS9dtGgquCF<+8`A>CW%3SOxedT`Vv@Sa@#d
zOiRAlKN&MxoZrsa)_+qdWRdU9P*(k)3oZ8Z6mqN2?0mj<?uD{1b}yYe%~F>O{fWG`
z@=WlzlB(vAIQCO~dZkO2wZ(Jk89tuw<THVV)%A6ejck>2q6B}SS6+I#-a_SXoGUka
z$yj_6{diBy=JuC^sXMlA*_e57xv!nC%&jNyr&er^UQzkF-)2FrvU=C|j1^mM-r-zy
zvGhfM`Jau|&rRR&&HpmH;(=LUolW2yzR%BnpYWabE1y!{7yg*<v|sU*?Y7gk7kW1y
zurcaf9Cwc;dR>ifJJaV2D(8M3=N9O>)f{I1Y#O`T$HV+y(T7h@&1+o|z4hS1NCocs
zHy(5=G+fhplc{_CLDP$ZgAcrx{QmU4=F@H4vN_2id+#Tw|F-?M>U;H@sNc3_SL^)s
zJvnP9{gu09#ky(DU%A~$`<G8o%~+SVf4RfrPj&r84eQu{f9RaCo%=S+-Z%GdtLCoO
zXg^=Ip?)6MPa}h=wdT4Bs~)z-`OTQpxbp3UmG8f6uz#)Epeg@)o{`ShzZ-wJvrfx;
zCZajr*|h(!%WvCn|8sxawuZ*vdB3srTlJ2OC#Jr8$FXSP>bs{OHm%rNytu|$ZRgv~
z1<uPZo#PeHURx{m)LPGa+Fgx1g+E)ObnY#GcquYF-0f$RcTr^e&n9oX@+&u+1NTju
z7^5G#YtlsSCD;18KiSTB;&=X&?Ti|g(r@8Y-v3bkE;{Y~58)I2QoA)zg<mSo*}P%4
z(tZ=KZL=>$|4BRa^!+l8`}Ws1b(I<lc`n-n5?lun6u7>r=&FYI_Ss*>_RlK#3DUiN
z>l(f1ugs3#6}fk4&Gzz59baS9-!Iu-@$KWK?|xTe%@&6j-2C)sN5P|ypT7HDxodY>
zV^?kEqj?4AS3kSgxvQCNpW^EUPc@?dSRGvYe(s9j6%XQ!?B+eY=XrGB@t`}qOO)F-
ze>}LW>?ON)@tYu{*Kec0$ei^17QZF`VzG*+)z@#jVjLMyCwc~zym}k0BXsGMW45Q+
zf>&>&uk_14ZS*W#2x9ihUA?jW#nx$4&IAi7x+Gt@u_Iu6nZlXK4P`<XcYUetUY!4<
z`NDj^GCu#Aygl#4rWAIU8?NA#aC?{XpjG?!+!xnw&3zH}&QIm!G5^ihjBA4xPJ;yA
z`fUm2lh!d_H+gwrZMl<a%Qfc9s)En%CI#$XTh`&2EbL$!bFJC-S;&;>ja#Sl`mA<Q
zVPR!5+;MJGxyF?DM(<NkI;Te5O?@Arao_x+w{iV0|1HiJ|L)IgSK9xn+gjxAdux&U
zhkUJ{Y8#)tJAA0NQTyJ)fPEkP@5Ig6|M5Mi>CH>!8dKK)Rt^`Rw*L3yV)wbSTu-@Q
zok*=-%Kd7GL)O~>jr&|4c@{eNxlXtTrMEl%JZ4-}9sTo|apRvA8=V){IEF93oB2Wi
z#j1_Y8!I;cehPBOu`5~JdC8Y<ER5Lm=kF(wGf!u2m3>(ox%VjdJ^lK2r=Loz!*-wD
zc_QnpwFr0AgRNznRsP$zhEz{?x>?G+?##|S%Xx2X?{cpGwOi!WJNb?|?T`K#9kIR3
zxcb&^kyCzB8e-QxPX~W1nYHMfUhAg$?0RaCpX-)SPtw%8XMA(%1B-IanI+R7eLbi1
z;oG%1{({GG8@^i=<-5h*`S#m9!$7vRR{G)jhr1Pv-2dHW5%!#yw}8D~;_i3pZGZE5
zc`9w@w%;rG)gaF><E%lIOyyb7Jbu$Zs}SDaYvq^OpBukR4%TsaS^VQ5qby6ue8;^P
z|5?QcJYJp{rEI?A^P)Ot<0oqrr@rak`~BW_j$=>0`kBO7rdF@dUoNb%&T1Ch-(&o-
z%>UMJOy75}@%(=&AAhS`VP;pX4|rO)oc*xh@b<}{>w}NhFWbCIaOd~E2YA`O_lGJ^
ztQU~BJ9(eW=eziX&9$q20{&zqzh7(r=}@}Yxrn)Q3VqJKEU~EH$I|+WrPa`J`j!cw
zja4;*)HS*|cNHDhKR<QO?apINvsAP*>?9qW&-bj*n6>xT&B}_3jC*I8b^6@jrQDG5
zIc^=Vdth(z``)zcbF*(Nr2J7?9JyIjNBtxF)Kf|_EdO+zc5K|ev%1}P=l_EJyQV)m
z?Doatu)Ise-uHhR?U(i^HRx~Kem(E;M>pX=U%&F~-?g#xpY&0)X&%*Y7ujz%&;P6N
zWRI8JuUBjw<}y33|9eu__3OpuTg#87CU?j0-O#*Wqo)0~Y}-vw`(F&ZH>9V{uKTH5
z<bJ*R;`HqQzkbciUG%Zi`&wrB2iNPGi%-_7yBl70zPMUpZ+d~p`-|_@4E|MxZ0}k1
z&*xr1@Vq~XX)nssx%L_O@;&^i@5=FoZAWUS)kX{FiT{II4qSFl;I=kQ<?!Kbs(+#Q
zprEAgQuHQI^HTM_s*6tMd2^`6cL`+pRYl+6bieXszlh?6IbZrVOkT(17~bTNf9dwr
z$@d=nR>{2MmT&tPQhe|BoJ#-0?YgI*U5c%6U~=ncy(J@-@axg(ABUKQ465#2cvirC
zIeayjk2jy&WJ3#{8Oc1CH$0uQaD9%o?M?Ab@3lhyxp2E(7pO@rO`4Rck!3T(`E#>|
z#M1TCc5Yts^Z7(Msfk5fa!#(ep#Re-$)z!)QQ)Qf>4_QYzf$>HeD_;g{B&JkKXKEG
zPvNfL=H5`cl)|-elR@gDTO!?A&eBajb{2E>PS5^VQdVpJdHKv`n#F3#Ixjz|9M?*l
z@a2ieDJSFpBbQ~w`mT5!yb-(4FtEabEqzg^`o>=E9@VpMmfQx?AJ@f}zw>>&^L-&t
zC|hT6`Ma}L#rKOtj_tap({(nu^Tfh<uV*zj|Cg~lXD!%b?OJQHxHjd}@~i_}89jTa
zlx^plaHnp$%z|D|wZ1oc_h;za1RS;AHN&Sl+122fRD7<O+yu$HRc~^nWQ>(wpItLy
z(ig^=H`i*q`Z%jyh)O#;=OVk-hm3U<Sr@vhpRE3Qh*@+($<hg#7C~wc+10uDJ$OrE
zZHy{Ygp39Mzc(||U0yBg*7&^7@MZkjY~{%es<|SwPiznDy)Yy51k0qE8E%$~CQUda
z(E89tdZI>}hxMd7O$Wno&aw8lO;XAx&XhQJsd1y19}9P;RMzj?%QPo<r6sL7nZEkS
zWz~SHy6u^#QWnpA!Ed=@(hj}GOP}}q21`sTNnz^<HgfQCF!{Mcx5sDO&x2CWPVafq
zId}hw@9#<tIo596mSb=$HCyMf!KIYDeC{HX^K+C<t9r8wbPpdtsle;c!MowJ@hq10
zolYh~6T;UwE^^*q5zgIwLVVk&XZGq2NnO2bKSu?)2!`Cwc+J!9yx*ecbFr?7QfGc?
z)KummBk4!1zr)NulDHnHPxDEMNS!#*pxulq@x_^EZ|^<b|Kwb|9aG?rGi54;QomHM
z2kg4iuD~;`^pT^09^>DAE{AS<J#yT%ukP9#9~H*6H7D9nKRZ;R!eCjozSCt}=YuUp
z-FkjIO47||=4gD9{#o(=&)I(muYO$bJ}V-HZN*(7-^w)|>;Bb!S)Ep2l)wFu>H_{J
z3uk=U&0VXpcgl{W#hxp^zIyb@YyHI({n_RjCujYss91Azg^I>>vsHV4EeW*TEu6ie
zd2{#b#rx+=9e=;RuWsLs{Z@9>^S3<c_?zYPc&3`v%>P;Ho7}tHUW77B-F3Y+`R6*n
z)v<=M`(uSdYYM;2pLO?Cs<U27TkD}xi~XGPhfkcowDIgGq0EcxKWO}k5uSP?ZPB3)
z(~vzU1^%mhH7`>=Idk*fFB3a_)VimqP5M7+`*dgbP5(+bbC*w3ZFJuE<d9_TPPVhn
zy!$>_efZ$;=>NazYHAY|Q>_h`9W?3KlV5Qx?Qvz-O7(4D{q3*J*6kK|>sdG>Nu%th
zeCh&~uyuA4GZ*Kmubbf@I%kgTpHB~CHaoxE=Ds?m^nqpiTE5$wXFd3MBw2l3f)sC?
z{cxVZwRQ61#h)L4uPU3a%FA>sSJYJb)Bn1A`>igSeb#kWOL|*Y*lY7+<@3~Sr`pPt
zqQBQ$UV6sAFl1})$5#foQ`gRJu&}eJTEAa!iCV&><ioQ4WuARc7rc>w;n!P|ZT8Ur
zWS8JO(WHZoANN>ZH15}R&QVr7$q*qow|-B<(-oHQ_GBd4{Ppo*JOAfvg2jTasTnO#
zHWt;a;P9;eQ@Qa-MGCK>`z29TF-h>Iz!xuCRdp_}GOL<=&2ZtawcRoPv!{E`_#c$=
z@u8u;&F>ZGzb-Q{yFSUq?#1*bi-25>Lkx58t~@^Z>BoyMDq@pt8I?5WU6RN=B-r-m
z&9y_!B{h|0O`)^&w7YWxZs+OqynOT`>;I3vdP)mfv&vs9o=RJLPa<;DT<P6&e_l_r
zEbjOpzd88jIiE?58ubfgo?F_iPyZKnC}Fnh=Q*c#XJmeO{^HZCFK+^Z7e^g3n4{|%
zw*A!aw8)O)|FyDL^EzGTrk>u!WVw%%`N@yH`)so~%~f({@@G!Z)n_|#vt7GZWluuF
zp1k18-Rq*u3#M27Sh~SGXYT!-6V3PRyMFfCmI_6uWBO}alUDRQ=^S3OOT#Hv#7zIV
zopFcpPdy&?(o>8xZa974cXnO+Jr=&`%%n+DFUwX-1@GQ6BhrVzQU0aVq*QK;ZHo<j
zRL}Rdy1YuvP|P|l(l_~6`6fp#&RKU9CTfXQO-OllVq=x6hw}H;)4l7ny(>;`S(m=h
z{8Ecb?}RT}CMvZKP3j-+JY1}%6#b%9Bty3LD^u(;0reWOhU+t8GauYATa~_DIdbZ<
z*z~g0mtlVEAJudP^Lae`cxC3@zEdnWOw+fozELsv=2UKr;KVZ3M@LGs&g8kz;<>8j
zxua5I3ERF{yS8cW!O3~nLD{=QFELiy2z~T-Th3-*l5*&5PGph8Qib@$hA)*Xl+V^~
z_pY$82{E#i3|MPrqteYAy|&9F`BwvrzpUP*&cKVy{2nsi<hc4!d8WkHNk=B!<oNB8
za*ye~p6&B%@4^^X9dzGgGE*n>x*lt0x91nPn}wZsfA5rbIac~1cLk?M){QN$(OY-=
zDZlkwy39Lzibddy5aY$So~52KNX`%MtF?4Er(l%bv$tgSp1Z5%*ft-#;hj6TFGG6u
zg_YlKc>8aDQfv6`#`NUlJW8vN-8kKUCGzUwgsT$OKVMo#uMK{?ar#Yr-Q#Oysy+4I
zLRQx=shoA-o#)d9$)QPF?;mfRaVBcU6ZN-6n|9Xh^R4;Aojom(B{b0Fp~q6^?V;j*
zk=%XCcmI{`5=~E;Q?x02R!v#SuJz(FWlL^9@>@NnE9TZKo$QM&XKudSYA5s3amtZ{
zH|%ZXcME?%$Nee!l<x;c)BSfJ`UrRU?3>{^rHOrsi8ZG{)RbuX&MzEZNzV%=OflXd
zq_Rb9o0-thos*9gJ@4(*kn=p<{F-^<uZYf{2bq<89@c+mEYkTp(PQpv6^@h6L6dfI
zPWs%v*~%fsNOdjSVP>T>J&Q|EeVuqh#jC2SyWM4mQ~j>`%F?2;58k{6M#8=!3d=q)
z#ILH^VY5mxtm5_wpYlJl8xAr5Ik~FSeap#<eqn<DlAhdaxqfc@xvwjwS^sT!&Nq;)
zx)8ofx!NhPIB;^O%Wb*0E)Sj-woVkEknQ*>k<Ibg^M4QXe@&>U-fpO}oG0`DzqY<>
zUr+S!F`1=jr{?4}<#n@A>ZvWlHy0b#=LYkvmW%(mEqrr=W0NkQ*q!?^$IV>7bwo%A
z)Y{3scIB42XQs`3LX1J_{&y><MBma~c2b!-st?r#r52hkt%{ZJJ@aCd&|O6*Ws!+4
z+g~?Nl#C0T^iTPjjI++>m3`OURg4c@VsbKaaf(yh6(>DGck|&jDz1I@@pp@STlVa`
z?yhWnOlNnrrOi_&ch$Y?`Mu_BoqqknFWv6)XP<UO>`x6;^RTuIR+#d1$NCWQXs5)|
zz~Uy?PQ~2idu3wR@Ow^Cyp&gXhIyi%*r~up-CrF!b62LYJ7)enwVSgtc1`c;iFyH!
zyw?sf2l?h?KAQN`XW9aZ$cKzOjjpk(e4e{z)uZsRoj*c7<zF*Rit-QLTCwKS#}A9V
zt{qi2owtf9EX*<?^wNo44NJZSZ$H$#>D2R#Zmvl2{wqzdLS@vq9(fnMYH}%~=h_u<
zSNqcZJyl;PO}Z7hca`ngIL%8Dm!8aOhzhb^rS<l>*7Cnoco<?G7CFCvTQ=34eeTN{
z47*OaMDBk3WWgn&9EMn*MI!ggW+zYY=wY~d@WN-S6)j;gn<Q78wR5F4=o!77S?<0e
zc4qLm=9@8_{WD`d-6wpQ7yjbbT(8M;moG0bTDtcB$}bVim2XTqqnY;CZmIioS@(PD
zq5FQ#J+(&FT62<8=!RdlUi|r1O;@`12wi<2Qsr=2a7ow{k)?I}jUFFcr}Zv(dUy5n
zuS@LYULHKN>es!po%_n;d|y2lJl3{5v`*}uw`JPe-tOt09)+r@DPmVA{+iJ8@S&c2
zE_cWh7vaXPE9|OUiY7TVYkdxv+<fi0>XkdOeYS<1nVnx=ot?7uRC;32Prm6X{>PW8
zDJ4ExdU~U(MTf;vkD_0D*i=CL#G-c!oY!M(vbWl)B|cbsnsd&_wv{oDjPrS~98eJn
zvh{1}>h|36=EdAww<ffd9=&DTcjt-UTmhl2s#ys_Tr1?<9SYk$HH<q~1~N|yu=#57
zsMFl%=_!s%?<H(%3x8jI{KmFuxu1p4%7sD9(=IT-F8p&fWbcM&j;m|#C@=qf;_Z`P
z2U-^GS*~_!Zjs`nJ))t^lLKaaztXbvNYc*;@yQ?3)}`EkmS)vku>0imr>_@%atr3=
zP;$KK`|Vf4<rNIhLJvIji>|vJ@?O$2@yij9C$l+B13J3bJbgP`%C~!3_VIwJN=3}a
zWwYB<TEtmOc={MtCO>%LETnt6Z($Z|n54z887^+&#{;%7YxBy~`Y2tzXn2L^pck{d
z{G<=Bl%3D=tuZSoG2Gg+^tjcsRk9I@AiXzZWP>mAtuZP1V%XWUu5V=;yOyNIuMI9`
z;m4ocXo_K8t}D0Z%z=ySY9ddU&C*zJR`A7;vvuc6wKJ>1R-C+fHr`q6`gYzz{*^0(
z_lc}cc>Q9r;H+rb)l9vr=d{oJ$kjSHJzo7dglW?IIWL+GH_LW#op#@!`Os=x$Wia9
zPm{Big!B@+l_Ot8+U=Uq^7?v^DgSC+`B)#P>@z_o0-`!lW{Dn1)Wa$HOwboyxTvXs
zwywOd$03n-eM>VGv?A<w&1ktMp?`VrzNd@1y)!1<lu@3T{j=m$s%7Q0em#SQ8rwyc
z+qkCn>!~d?cs_U0ip-xcl7u|Z#Vz!4w>|AH-s_R}jY~B#E81>XgNxAS^zhk9Q>XRo
zNfcIIpY(L`%`Lhy$NN@QOpLM%P>A85Q1I6(>t6cQhl~3?c2voRKHhNX-NkkllcO@O
zuQ!}}bFp1z%MlsZ{>_J8U36F3a#+T-e)FjpAko7WD?gd$$kn<yX`cz)!n4{(F4v>)
z0#|X!_6e(X<!VEmtb59THD!M&IeqoF7hAub-a>}wvZX7M-@kAc>MFSB*lzW#&rT&%
zQ*3og@|13`&Z~D^ea)s%o4eU7jE#L#O|}S+d~L|3B;Bx+COV6?;@Kx|uKOa``TFY9
zUir7vq7SLw4H7j84V=GDP3dD&*qM-(eZO8f3F$rCwyH5g_Upx?DqBw6>M~p8bj4kK
z@&%R0sRyoigA~k4$u-puRDHF$+cRUz*3h#@POa$IQ&|{z%sMpC7%V#N<2k)6{l78}
zJxV=ye1pX`rRyB8roLbHz_qrdk<+y@+Hl4S0g(A3&vK7uK+N|j`Zh`CTI(XaT^TM$
zo2Ree8EXG(F}H_=h__Idc;~MdO@iT!daku5v&EJzDz`fAnOb(-*4O0_>z&9Tt<82S
z4}U#<`uh5oni50KwHwcE3Yz&9#8{Wb<-PRjVs6ijo{xPES0K`c_aeKirh!~+c+5I8
z@bV{+N006D_DQ|gu4-~(SLn(!Ws4M|xK^IIb)Y5kx9rhiO)W?|3AdTPDCy^mq(>g-
zoB|iPu9c5<+2q{a7Mok35$UjNK}w^M^6t}X_K7ax*0A0anaTRnOgHB8spV=*!UXO#
zEMoPTk$CUn-03S4Szam&txGxDEHu?@f}P63$Ym9Ni!QNTYFF8Es_OK~(rfN2TTWJa
zdzD^mSJ`xO*Rdj_xnBi4bvCWrxWpyB*5go3NOEQ6xnC<<Dp#@{_j@8`zbts}vo-zR
zGv=+TNLYI5+r`!^V$VL8i~6q#nPvBD!m8}Mu~!~lD>M4NX_|1b%l^WTx*?X6o%TNr
zD?Pl`ZI||)fLCR!c$Np9)cmBm^MbGS+@0EY++LNf-n`Q5lk!gO+4r7?G52~{msRha
z@%ZhVb9>YJ&P{#a;^}pqy>w#7mZa^`Q$L64J(|YXZN8G(bp`M4(4VPKox(RxkZt+p
zP<2S;f80`brRR}*UAD~oFzaL7()?wIHt))C(cU?IzhTdZ9M<_FGsDEYG7P_K?cM0L
z>}so0)JfarUh6^()~X47G;>>@_4UNeF#W!J!ubhb-l!U^)su>J>r5;WPmPJSI5g*8
z+|`E*y^dXNRXX$RZD_7Zs6n3OiCfR_Ze1vUsCDb%eH(Xg+uXcu`}b>c?^~J=%y<2<
z{WrsZ^(OXj*Dk!)xKS<3`#tV=b@=zXj<k1kzrXt0xBq(;d;PAqfIm+i9~^wT=VtiF
z=hHuPR=vKfaM@|v&r?|s|0|x}@aE0VxgB4`C!A}m*2uG{`>%U#$5OZJv(C<4ANQbt
zS-JJkL~XO(!j}&Uw95TSEV-YbFzxsDV{*>-*Kct(nc-LPc!q?CuV9bruF4}NyEKZL
zt@U4-e~>vN^}_B$-tXSu$fI+2{+yW0GrRd^#q-sy?~nbTV43+w(dEC(+-12YXVv7`
z%K6tW<lV8>{FB-R;ddQowq<_<O=?~5zqoO1|8wh%H?ls5Pw-xBv@SXxzdZhrK-BG=
zO^aLaOsqG5Y0mWjo!y};_uec$8?LnfyW8g1=eGK;=l->F<9EJ#hS)v#b|$h}N<OYA
zd2jn-)%_Pw-L`)*nKx_p%MXJ8TCaV-_HSF4yw}aI1y(m6axYT-lK5c$w#N_ZZ~s{C
z`fuCgdfwfs<+rZg_c{J9BJ6ag<d5RbSMx0EosS9qTK8vWav!I_uiGCUUXz(U?ZeL7
zH?=OT`Sbj1_u<XWtM8xdf3eH%|A%K!elVDBD=)LV#cplg9^U@q?$wu^MYGs;aozEJ
z;r_4WQD0eE-#v4OE{4_n_I<yj=pk%>s7FV{)g?rU+t{Wu@9ozU^J^R%&0m@8Ej~U`
z{9bk36^AFc>y)Q)D}FwEL;9CqU4=l!J(Y>(8!aST5}Vh^a<!hyYYG2wSLXYz{6Fo#
zukKZme<UZD{$uiq-(qk7G}<pa|7h#ar0VLo+Rxa&>%H>7v;N;)Y2W5&HeZ_lTIUOy
zE`E9P%Rz3wI~Q)>xa0aH(*DS+C)!T6TQ)Y{&;B)e;rF+1%93ks{<hmo?R-63|JUtj
zYQH`n-}>kK!yK!<Uz@(3wfkSKQ=XRhB>CcoeVxB*kJM&Z9j@}baiqCixVCqH>W99&
z_RARAY>JyNSkH5jmR$QTr>(WFW4VR@eB=3yt%e)z|9R9cef#F?#KYU(RddvRxU4hn
zn8la9$JDAEITGi$EqlD}VQA*<9iOL(cyinO%E|pYxYT`K%>jXB{AVwgJYafl_Hn^I
z|2rF}^Im?xf4%yF3;rDcT-IOsb<XNmZ1e614|GMUE}pgNS~gi=yM?4(&Z7Uz7G#t^
zT){uzNq@e;PhRgUKP6^7E0gLu?0@X}GV@Olm_Jo_{Fg{*t>TdoFmw12JVPj_?#KGW
zfyGaJ-!1wb`~Ru;i{tz6a=6d`bAEQ~w7-VW-U!rR<Y{)SpR3pMR(f;g^ZV=Gud7@<
z!LRjJcG#a=^LN;9S?F}6gw0vF&MEtsh<W1IgA3N@uV?P9>EPhZcx?agl8DVeby=RL
zc{+RZHZA-uyyiH+aKc*78{Rh>9A>mGdu;eu`nLbV-&dU<^8DM~>vs92_!EC2WsV&O
zTsI%+R?0cBXnl$1F&^3I70>i$E)ait$S30B@2=l3?(dorv?uAG%KY9t2D{h{yDhsn
zIDLD`@ZbE6|Fgw{byiP5|K~E_vo?d<-|s=(@5#4cnntQ=?)GP^O@5tbB>%Yn&suwp
zX)L$Z#GYNWnW4bdw2tThJF7^`+Ao}@e0!toowj%|=Po?P88=<IMB>Mch#v`SKPIvr
zcHzo2ns0tDN#RA26+fHY&)Eh+kBwa?c&@DfXDq5+@-|`To`<IL@BSXF-JhQ;H1Q)-
zz0o|rztJ|Q9`?H%6r4R>emsBuI{)wb^*8U_IdXQ5;d;S`T>{V7HgEnOE}pLbvYMlf
zLpbZ$>;C)u_mt;7pW2bR|F&WEg#EuxG=z6g_S|=%x%t|omt9SkX)~v!8|;ob`09=E
zq5tY47gc|AH3rPDV6@pZd*27?sXuRW@3=4CbE56L{6oo#`l{;gr!TLTw1rDdJ$Hkn
z`<Y_cTe*tde^1uk%rVnYm6qfe)@@g>P>!ASq40-h?W51#buH~pUcuA8U%nszJl<C&
z_m{0l%&E(Z^b)=(*<8#vzj5&Qq~34chZeN8OzBNA*?vMJcj?=lhvnNgsQIJ{YxS`%
z+iy{P`}S^;*l$OdKQf-baf@ox*P^{9$3ODeKbYBNeVFY?N^)&&_FtiD*LN>!tbQ9D
zt`F?LVAQkrM)k%w*M6y~in*|r9GLjyWtXtl-GVw{H^zAnc$2+<2=H7gTr+p2(s7=D
zi}r8(cwvt3C*K3?caC=kW%9WNC#_z4Rb8^>7xS_L1OCp7)A=0ZO;|!s9P`eYYdSIc
zbID$XEhnr~6h3eZzh`{Q-uQb*q7;LSiFyrBQx)$ES4qvK3zKhjdQ>w#QeDu|ESa*m
z=vU?6YN2;OYMUMw-aqUxW!_<d-yCi?xh*)jb^n~)!uU^r*G_34_sa|JA9$qyN$O}_
z!kq6n`~|9fbGc3C^1R!)x8L{oj?ZT@x+RN>x8IPfn?1|0`u3yw*R4MqKZ#X}`FFtS
zY5(=TckLY#K17|~f7ouL^FuMt+nRx5$NAarWwg9)WqkHypX0w-I}a=V>}GV?V!Tm)
z=^;h2iiGCl*HSOtwUu4P>z0@-EvWtE>!FZu2TvR|dE&e4{QPV2zx1!$zh9TXwz0NB
zI$hm7({|d27roX$K0RPNyy4&%fo`7+>#e%pvPZW)zGhXmb6Z}H>Vu%2yK?gq>*DTv
zId&-QnagI_^pweADg&Q`mgzRBk6L~$A&dW<suGgbGUDbGJvve8ldN)AN5kziwJaA+
z@|o|Qub+3)-8K4thi>_vL&9gLom|o7RwlT+%%@pT?v=^kkCy6_B-DB=%Y=ER94z_P
zA!#`)?s0ifZ~LaXr*8b(pk(l7gH(i*tmx?{OLv6#2&G>7Dg4=&@BKTe&u33hKk}!~
z*6LYzZua&2&8oZh@^bU<TX>G8Cu9CU&;JS6Ok{O#?VYa^U-o1Ht5wZO=O6kKY?l<u
z_g!f-Oh2u>h@E?z%PZ3(b9&8A94a{3-ZHcC+z(ZOTF(#0ojc4fSj9PCK3QSKZ@WiC
z?Jrx6!xZJxZP(%_nQrv6S@-Nl?}tx!PX3Iwp3S<Qd1C9y>iz$#Uv0Yi;nn-syDeEh
z-#qopock}o+rI~=FI6o!Ziq{|IP3qmjqJ92z8x=rktW5nmmyn(;o6CZS#K^bFq^04
z#NBe%Q)b=$9drE_y^St^(=Qj_`cCBz-`)fJ@47zu%${Vich}6mwvXxy|MS0}`tr=a
zhw}`V9+1<&zWGLZ4&#!VDd|2(9{ZdL=-FqyabIvidFQ&t+DCr;IeFhK@u<hyjQMMn
z*6v`lcwVJ1u{(Rs)J-#``yyl~x_<4rn_D2sl;5)TL%9CO6Y4*_J67k}vb^j0GwHiU
zNX!}?xec9Mb^KzMPrAR~D0!WJ{$ber+ML-rGhVj*(ElwVKaYQ1JL^9M(Yhyw72Xfh
zr!gL>OaIAzj6d|V<7wX`c9}o9kGU_6%jgo@UBAG+GuUtU(Q_A+OD(+QVh)~DuTKx2
zVPns+Z1Kg}?r$z!VB20;ox{-2^6^Ic`ei3KKbW*+Vw=gQjbUmX`zm_Gudm<teFLMB
z%)PUFQtHclIe9#PBuu|tbxh^;`@WBh&apQ+l&kc3E!sYru`~OR%Z=|+cK2=^xop6_
zXZ^?c8HbbF&h0OF&93;F&2i2i$C%AKW{WR~{rA&<$`+=2^>>+{eCF4=r9VBIV0Ey!
z|76kOMVlMdE^~Nq{F!pYW#h>g_jcN;Y0c;heEig{>D6*J#;X-q8BBW5PUqcp`D1W$
z@n!?Q%;TI|60@$X^V@f{_WzXw9D52LoZG{DD)+}>`G<#jzjWMGPGhV1wcYs8N{wok
zX^ELk4M$itT4IeBT$s(%=&(Rn?o3M7pMPaiUtWD)tdm`@^r=>G_K7tTzIPwiC$6_P
ze)emny=UrUvB>TUsqFzC|9;;v|FGWfk9fn;iw1wvdKTU{4{Dv+vX|?ZO0`9pv_>xT
z@978Ywmh8tmdWNug=2fdgy;Ki`|<=-bRSU8ajTo{|HzZq`?d6cn{OKvmKHreUvX;F
z_u^)j_*R83soQFa4+9LIRrsB7IIzEd-PBZ$7Ku+;YARJ}#oH~kpKjrJw9a4M!29pl
zlyzm-waf0O%+7y##<+<=SX}v`YKuw3nw~_XOock#dpFebr*%p>EU@$V_HLz4&40FN
zwZ$9mJD&VkJIU2ye%=yEk#qY^1J2FqefM{RXU_7poPxE#h4;i9{FJ=L?_BcbN)h|^
zpw9-PqOUWXxEHe8Z&mj?e!}*~jq2%t=FX}(-!<oLbZXNhcj@Z<jjBR+!9~YjJ?Tj<
z@>_oR=Vw)o5Os|n&P9dSo_hr>@e2?UE_vD(KTq3oyKpb7iDy`Vj>CM(z*#>djAn^@
zywzG-`u2#G(>k3uTB(V*S4(-sDLp+avU|?s*DrN1PM@@Jb=}U5<$YJTGQIw@ROI!<
z8#j#q8#R54bAH2e^tOV13Ga{n$L6s{vrP6lH}OV6lT64Lt2sL-&rs(7wqa&*<;Hq1
z^Q+DV<sY_JulR81>BqRw51xoWi~e!*Ky%wd`3s7Dxmq5=4Yn_I6;e*$IkH(``^UgT
zX45Vo;_fba_%1hZ?MH?K8?W0iu`*0kVmM)T-#hrYs>X@T12R0UBHN6(c5j^iwC8j}
zjLhEaay;&mZOw^CUfvWEV4u#~7r=Nih^;YF>D-xf1|N1#pSRn4hj?<sUzbVS?kpAb
zZrUd_>!5>m_rlKNH{WN8PZ5tPb<0>SbpO~}_DVN~Pa8jP4U=NhaZ_5erN;czgzvd*
zD`(tz+*r8qK97yZ?80<oej^Fxl$zI)U({tcI!#v4b2k<*@BL=~sI6*6f7Nb|?^li1
znp@@1WUD-DqVt?Lz0Rlo9RKH4*G%TV|IBV^t<7i~V3M-PKq-Cu8P~Mm;<lS^wXE6p
znS1)GvO}dg(fi-n{%D-OZic_V*Nbg`PyJY9Fl}yD+nHSjb9~$;#g$!;SY^!>lDsQ7
zm^Uh%JE~i7j!e$or%A70CS*&WiF%gsS~KzRgDV?mwp}~0H8?Q7Elo1(!i#<;6V~d6
z#%rD;4m~-&%KyLL-^=*Y?aBej(!!<`>mBnpt2b|&cs;Uv`Etv<2P`u~elZCL{pl$A
z16p#rxanSmgHTT1BAc@nBIaJNY-CSoIe&;fDHO9&k)!=+|2j1uHc^IE(-!11G%eva
z>^Qwx_-|l<Da*o&`*BhA{f7j6X2jbjs-BKyUA1Z>N9f;gn-0}9eC-UCK9O;8%>*wK
zowZs^R?S)xpj*(d`9nRm|MCCYCAQC2JyV?W`1Wb7S0@W5SXu01UX&nugt<voBRDsJ
zYsm|Xl?;I!7#}fiWb}yI=dEY^jlcdf>!Jl8k`+R#3|t>1=_F0`-aCClvd68tPj~1y
z%}PF*FsF9MqP;6Du5evreaX<Z=<U<j(~lOdG2xiR7%}O;ng%mF^Mub2L)aWbr*7r&
zj}xh!v~=C~mdoBNt#{d6FAC5NHNDv-X}gZ)xPj$;SM@BfWlJBd?4HvT(6D=fY@BTH
z1H+|{ZEkKUO}w_CdetURd9K3?o*r#1pY{3CCm&9>8<P!}%1-`n7+uQsB(t*VL7SaO
z`pl*4|CVgN?sua3!JO4Ov$8C69_Vf2i*DSt{IZ0AqUsgL8~(9zuYT4%C^WK*m--^K
z_R`0a7rm=&?4tTIJm1A>ibVXdDExYfKkU_urArPS$o+G^`@6o_`KYur^#?y(HG2H7
z+qGqy<ezvAhLCLb1-UlsWf^q4Sr1KP?RMS4-BADG{lB{`OACFTnXzAS-?p{R{>z<2
z@&6NEd}aN|?D+acnq1eS`#Z}X&;PTRM}RMWzu`;Gq>Slxy?M6z6_5G$Wo(m)-{274
zdtOalce0i6_P7Qn{W-qs3zuK}w!FgRlD1gEW47BSUTw*<dDv~(k55)KcfHaabbe{&
z3&YPB4%>UrX}>r5jPrZV=L^G=<xb7fx12Zqw_ws8dmH!P)7g(7fAQhP+4lK@Qx@1-
zTUa-~aua;wT-Ep^_RaqJ@AlvSFR3h=xBR8jlSu2X^`D%0X4vExJ@>Z}0j;9&eA_s~
z?9Fu7xPsSwdjc-CXyv)RYx=x;N9lqGQ?-ux2CvL)5;mRD_xEM#m$y>FHZ?lAIVE$m
zO6FS~SgZ9y#A&Id)#jrMn9bf#ySR0lWf|8+U$)rUj^D4!{ybdqy0vxrwu{R-{1u;_
zJYXzb(O8fry6xAM<zdI?nJDHexvI~II(pV_>&D9)4bR4PJ0ADZb<#O7Z>LX#)wRBx
z#}13TIp5sHDqoU0Is5gDqsvl_Ui_GRJ9^of&80r6mp4h2G?m_tUKX)Yl&SU1uD2>5
zT3&BkKEY(6-PS0s#aELra4svGX>|Ttki=TOW<QgyTuH9AAGVmZr8W!O?%p@s*ZXjq
z6c;DUs~uZHS`$@w{K?BaaALbn!j%Z$1-i16CmwHkd;h9myMse!@Y-FD8I4ztuxZ@%
z+i&sfyr>|rD(eoz!-p@|9$VFZ*hTT(Cat;-&Ip~N4(X2Sz5lY}q))yOu~Sn%TIaA!
z<?iHwxXxM47fU|0Mtl~Z!RPno@R_IfVoVkSkM_#<?3*G~InUtSai`az4$V6|)hbK;
z=e;=ibOy7P`karZXI&S2GhJhlmiAL@IMW~0y3&d*%FT4+^V4pnb=!QrZK64SF3i~#
zcqvul2J4bC(@PQESxXso4&TsID1G9wIOo;Z33>;k^%P<&`~wa=Ggzp(c1nGT+3M0a
z8jn6tmwnH)kUO8Ri({*#Q*d2?T8O*!qz{fa+w}!@eXv{D5wPaitd%=w3CC)&tCsBH
zdURpR-Y%wvLcB8$>U8LdF7f_gz~!OJW#}9w5Ub@e{Xy=NiBWE%L47ZR5<jc9aC3Rg
z_p)!cKXKtym)=y(i?=4cj@)y?xiR4NN{-y;9I39;xfVwKu2oPu?byS#@LO<XOvDTm
zVRojcbs-#ACtY~3Zu38{MwiZ52ixOK2iJ8KD*m6DFZX_b_2$|~?s8V8hdHW4j-M=J
zIv%m@)>N_jgEs<~c$<1}$(8o>dSt5BYy4?$*8G&P<lDEyeC2a*`%MZx&K~jfJgcg5
z%-fU&Sz+n7&rOp0$sv9&Q)G?*q;;MdJqh0@#xB)jSyi>BZ{pL6V$Ln%ei{Ot3dV{P
zuB2R14Y>NYv_~g>w*Q0RmuLDW3vhUvTN<u*TJY*7=W!2yl@BkgwL&?UGi%fa-0_=j
zca>SZZ>HM+&o8UBcyDH^ez|+5+2B%Yz|~+eK9<l&t22MH=*_9uR@yLEz~a~~o~CRo
zzgdf`stz+Ax8Hqus{iBQ$~y&7?UyXLmrXRAyo#+(mP6v=>6)KkY^N^fRZmXRoYk+s
z;^OiwFN?IY2P%pMy(wuMUAVSvtvhfx&{RQ&<LVLfd&hP>+A`a2)3y8=IkPuuwzqB)
zZ~OB`y-lNW_A37n@2f8g6m*2|&s^<!#XVr@q#UKd6ZhxdjX8f<VVBzW_M>0)CYjAK
ziLg+Ts-HEFzxRKi@_!w!EeAJEQ|>%IZ+dX~RB;Dy%T4@EPi%VMe0KkThx^aXz2ZBR
z|Gb>y>6pwhu_b%q&-s;8RtPN0;*VUg?eRPzFRzwAJmTLJE4uC+IrQwM;S!HO+df~K
z8Oj?JqASnsH0Sx7KDPELcftbuma4qFS^09yYPOoWKPEF@TmC&a&FcE*3(_ZNWdHx;
zJ8f^61>5OKsvlpTJ8k*wRm#hXKYTZI3OK*&7}na)e5U=nI8M__=>5AtFaG|UJ$Z2z
z&yvSKtQXAU49RCQZ8^2;_Cyw~^WM*WO%q<dVYN(96r8bg`xN(^lUOv*pO*alN~82!
zqm02Z%~MCD8iR{;&b00o+*h|TQEKCjlj<v02d~U3xFM?@yTQ>d`D@eMu5;ICu5Fc-
zxHzHY#Doi<_uq296lNO!rf(uIr@h|YsB40UggPHI&x@b;r>dkda6w?JOX%DDatTA*
zU$0ml58c}Hw5+6{tnkb0-~7v$UYNPLE<Y!4s>RceCEC>mQ_q|2-I+T3ij#BW_p9nx
zd-MKuBp<o>wtKlm1p7CeS>g5j|CRoK^5a9*s+ZvzZx2pL*}Tej#<fl7_{2H3IxsRX
zRIu3ftL0Tr_ry8-SLJTp=F*ou!(`U$>m5@1ij5l;PTv+<{6{Hqu2sPF30zSUA)Qxi
zC!VR5UE=MrQdgl?$<y=ON`0Y!7gLMZ&h?rUeD?0jm}s-mx9eQP-hceP`jXi-wl3Yw
zzAQENs$+F7-}9S(>ePqSujI%z`ml>be^2A{`mYzX1guhc&e!eLX!H^2V*kK1<zdYx
zt{J*U6QT?*2gWG+Y;d-J6CX1*UFPr;6;r?C<`F;nD=(OR_S_@;wWj*1%HwU*q8M1V
z7Z@I!zVN@PU*6kw{JgVSqilNpR2YTBSBZ!1>h(GOGVZc+><&jWj#Iz+8m8H+a?~lb
zADx}Q{=|3re*X3M4*u2sawq@O$Ac&J)8Cu-_`38hP-^2dn!2-cqD9A^mSER~yIYoA
zUUy{1gQv4sDMc$hpW>R{b<r?p+3G3cshNL*5A57<UMo3nQ={nR+2Lorj;vxk?X!5U
zz^N}m3MGmDA$}{IIe8Cz@;Zfn=k~q9ulqGfAw+1`k@bCl3!;w8<g9-8bK=4Tt4Bq5
z4@D<kI@xf9)$6rL^^7+)D+E^U`tE+|p7&l6j@XKPpL3;deF6Uc0atk)E}KL++3GFi
zR$q9E)3mtdpL2h})wvEuYzwY<HwJhnm{*(bKM-QDitVM(g^rzl782ro8Yk2aGnHkq
z-ETX3ndkKR40ZSOtBr0|8#yxsTsyru>R8|hrhraghlXkAjCAZ5#}sJA1W2?kI8^U?
z^kK7=5bGnA#Ey=KqOp&r6)fAsQ1VctrKIq{P6w}o-Z`vml}(;h)La#ub#HQ3)M*3Z
ztk3L<)9QJSpWxfhB6BR(DszLeo95y_=g%m2U3M1uw|{B4fu+qp3#%PY%iWi!i|=3f
zx4C)oY45wQRG$Th={E+K+`PsgqsQ@m(Sv@09^+5@c0Rs&!uescMCId8(<Y>@S+~gU
z?4(0-e8*~PKji)Y`+M=^>`mo@)8)ceu39h5raCpEJ^A{k-q$C-cX;nRE$RG6cGkUn
z$24_(&%J9;<;aSEk@hU(QU3G~i|u~BSD)YepRM)N^ZAb^?>qeRh_kW2!-jT~hgUdF
zbc2`PIcl7wGj}cn_obVUI~x}s;1{@;WO*z^W5q%SZ}me72mk4{nJO$e)gjVU#nn-w
z<97Phv5rT*K0zW&&xBZ)-#fznV3z2P)XzWu9z5B8cyacFE#kE)Ig6y<^LcLx=dds9
zojqA3WK}s|ty$B`Iggi#bIYc^RmnNIZO&i0^o6PNS8UqyPWEm4Tk3v6_on5x`qszK
zr>Wj7IC8ml?alv})-Tw(;+<B{#v@1AI}!yS$1?;9{bB0hUnlRY&T~%GQG_q@NuS$J
z<A)p5L+`K9^=5fgG3nhM#u(3eJQv&&--z)&{IF}=qjkcp3(rYL{Sur~A89Yf5o58i
z#W_J+(cqf7)aqdG^)t)j*6Y@^o!|6SY4f$8d;79fcJpek`uKBigzZ!H)6-bIU(LJw
zdd0B~w{?{*cOPe07ra(_{%vW<<8!$MzK@HmYf8BDOFxJisoc40wf=gbT}IN@OP{N1
z4vF#I{lL*|vODVe7pqh1K5NRV{QCWG914_@OB6V`qSS8v;u;s$FS@q#k1x-D__p6D
z*5pvw>zKIkpHsMAI92KO`(GDc;U(q0x>Roc>KY}nkc1k!e*YW7D?GUS=9_2FJ^Wg0
zehX{q#JPtbU*7g%9Y?>}jR)&W|E*hH!y&fK_~lP)z1VYymd~gxv2@Y8){$5~m4E*v
z<v;S=RX!7P>MV=)R|OTjmGxw`$p){V!N16<d)2`N$9X(+G#71e6;bneWPWk7;V-@7
z@b@wvb8g&E@_Y0|!0XPk$jk><1oXZy>6*Ix^fC^^Yxj0t-hCxlYucL&p*3M1x07NI
zom6>T%((1{Kxokx*J=fE8xQC1*Wv|st=rjp%{Cv_wc_@>+O^gCZOO*e<r&wyB>Tg>
zA3S)`{$uy5vK4m=jWTXttF5`|z&FQX#x;iJb-z|j<y`qi#;YjZk#CN}ylXdPE^?JQ
zH`t25VPmNMa$fZ4FU#p~V-?CxoG$L2{&u3vWo!O=fs|^mpWFY*x9mA7P`UWRY1W<U
z!D<#hhy0)3Fw6O-`Z2eniO<|imSNY7N3)Gyyp>qz`oI59-$WVjcH`}Dey=<&ZhpX)
z|J=P$LECeCVz^i4AAPanQmJ?jx3m2Rwu$z0pUm>q`S+vMKg@?C@0gEt(riY3mFrGf
z(bJ<1e3rGECp??}(qqjYmImMW@)NJ!%H&U2nptT6OR4*Gc%nq;Q%=dKFaJ-pOi=#%
zWZ$Gauh+=xN}m<ZIalpm^78NXJF|H{O}Vg(^=k1c-Ove(T{kKQRx)hcSn_pQ($XKQ
zV%8nsRkclxJ0t5Fy!0ZuSrTm|-Tnk0IjB>6qfYmY(Wco;Q*`~?PUc;^^?&o{lIg2M
zmZ&LsYg#(~2<d&o(zm(bmERrf8||~%1b5kNyTE4a*O%A)Qld9A;>xWj76OZoMAmM-
z6x?TQp(bp<F=(=jf>Ud$-40itHR}$ftaF@D)WEoBgU>u;k(F0}obayT^JJ3V&E|P(
zA?xw9=JK#}=k>c?4LxU`dU!$A;8ga7r7~d*%k{5T@I=<ERbSTq!hz4zd-aUV!F?JN
z{yq$0HNJCvRidG1Ptdaqo3|uc+CKdhnKD^rBj*jxN4Hp?&eBcQUg$Gjqjnox?5WVr
z2iVW{OqpWPxbV<=7MHVPe74@7S67{q7Jm@-Y|XMcQ&xxwx>|QRU%B*W<GfGHSZ}6z
zowdjfTo=}SO6V!?^#wka*PGtFt6k$8nX0%dRXUD6T|C^q{=S{*g@ZrY@1_J)XMPJa
z%ig9aA~lD3Hdk@Fl$EC#-w{8(`rUi#>Z@dyM@*|bwfUJ_^Y4dW_<aAIG~33!-(k+g
zv`w4TgCmt%C#lR2%Fs^xGqcT4;y|MWkHF6Qf6spXcw}GMQsn&f;h#3O`$~Vr(of!O
z3z+fbrBU>%l9w%kbIN?KpMQQloo)W6qKkTe-fUA;@z8L7CA4JntcMP)Z7mAH?Fz>3
z0eQ8YzTbDf_I_^C&3l~ZecHb(4aNt}D|%Uu-toIF5cQ~3@KwvMT#wC6Ez4LIF7o{w
zl6>P)@4~1(1(MobMb&jKBEFxN&)RI3e=fv5<)iA%9u8}jXO~20p4&E^_xQ074nD{J
zeND)j5^*DD7u%(qA2&T*BjNVE-LY+5P4rg@k?dt2&LX}S559b=xOTmV->V%P`Hj8=
zJUF}Ax~+H%*E*9crp%@32Q<z(7~Rw=pRJp*{mBdQIo%hR$LIH*eI!%wv^Kos#=+GF
znUC(3U7yEz_wD&tpZ8hZU9!D?onNJWGvm88B@NcEnD>a>e!N~j;c{i`F74=@Tehb=
zmS<1xajgzcT*JyAyz=YD4<A?Tully(YtpvxV_UbFn{M1-qb+k|^3`vPHk*_li?>{K
zJ#V?--h(-QyW+D9&Wp+JU+Fxx$YlLp&&8FqLPA+T?NEQR%<)NWbA(L9o^nRhTz82o
z%N=nRpQrz`oULE>qCZnZvNh)R8TkumrKbEyvO696V^ivJhkKl-&aZ#sGhf%5=~G$b
zp&!du?y}Ez^t%*oXW_Z)<wK^!X<FCcw)#$SwlniQ^zy0FjVb&thuTi4%FkB0`ep8d
zP5(}v+IDlB%IPnEdieb_pM;dB=6dWoSEcoE@{<{I`+m;k4&a>sN=%#ck%8@02Cq%t
z`g-f{{VCg5Um3~1ph(Ru<#assGM2&*o~O)Z_wC)aCi49~lhE&WCpYds-Te3aNmYhB
zpBKK=<6E+^K;-Qs%l|U6PF=QU_b+yf6nXM_DKFR)&DFX$^OE<P1)qYS=+tCN_L~*W
z6gca1Qh2$`>`k4lTlYNvBW_p7eLeb#5c}8U`$xZ<W(Y6O%aqJi<C(vsm0zx?v$;4>
zC2%QQc+{zt5xK^m?GG<+`*71)FSo#?D{ajS|2a$NOl4i?IY<1kdfvm&?J<uY<cN62
zuQV<^^)pi7^>R<6np<La%_o+w^$m;p>BXmdYfAB!1u0c?G(hT`J7OL^_z*tp{GkiW
zUFH;R3)_7(?d*q_lUKYh|M*tEw8!;n^MiuLAvHd886&P-`LWznHk-};S>|EwCLi8U
z&yGKuEpM5h)~sY@>BQbzE!%f#frh*Td#8-N!}D{qUVQOLdOZL7nlo#%5+_{x`Q=C5
z)g`ea?f(|pe37}V^QHYB@062*$DN{jd~|!6ZZfP&&CuJmf5x<@`odr9PI>n%yk7W`
zBgdOV<>C4&7QG#=Gv}y27ML+@p*!P}Tdfm6tTNnvHL){#T8e6D-K_9>`(Io8+(Pt{
zxo;lvRKHono%WYwSI7DSC+X?#`<33$HlN{sZ^C4i{LRxp6|9qPw9D4bo$GCpv*D@!
zmlvlE4d355@bT%vizhkDPM@=jQL3zpGn0DLYIgdGkj2u9%A%5zx<CKYeZQ_Q%JnWQ
znfq2n|M2Z+mnU5F_OL$kfBwZ~F0+b!1XndawbHzhX3Ltp<WAk^$N%)*<<AwLj_x#j
zYOSYO7y622J(J&|$Kw2F(^sxhW>2t_lmGDJ#<VqAe@<Qe-MzTUCS1wO@)fJ#={55u
zIHs?7%<R(N@%*Kg{oezNPgl<BY>QxO+`T?mZgq^jn16}7oba~EU5171@d|(445ZdB
zkGvEh$>H<EDrddSwdRyNYbNix@;vua0=Jrr@}!9Uw(~!_E&gk=hjHPI`QO*~O|s>k
zdoh4d$!W@rw@Vc6TTOae^YgYU=e=j)TZC-Z7I7xXJ^PiEw$>zZx=G?pkt`oEv;1=@
z*Nz`Qym|iVDVl=ILiaKF9IlC%OntQGbGiKLm9ITl+_tw_Z=M^qIjt#h!fP+H>>rLT
ze;53`E4%ajL}%H`{%9WIIOp3h?ALv(ce~6GTh;i!Phg4ZvwOOGHMZQa-sHQ!zrFOY
zZuHM2HVY3|Ypr$1`%=!o{-j*)?8iE5an`GeOcM&-UzRynX0%@4F=>*RH@|V@gE@z;
z%n_ZVX!<C$*D<Kc=;cxaeSbmQ%?DIfQ!Yk1%t~2#tMSR9)-}_M8U?L)D|pX)y;tSC
zPMPiQnc2&xT-=<oH}l@jt|eQHU$WWWsTO`RDN5|}OmUT+CjyqrS?`Se_%-VJww6X)
zA^Vv}lzOX=E#AGRCEoq&nKtD$#*d}ee}3I*?m2UF|3CYwaa-Qiy-$g~IInD{QM=fZ
zqh+_4XYF)0;d!wBWlz1=t#f{!`c_G+($q!T=gd6W5!?U#e$ufpDZ{w|v8(5nPW>8U
z_h*$sQpDp=#?y}_pZU3AwN78uw<%pOE`Mh8xL9)R&H~}PFI7ziy)-}BwsL(hd^erV
zLiTaL!-=wqpI?Nm+pt9aqUnW9)?*A#yMkx2Ki6nD{a2$Q`=v~sg1{!*S2k7$Z}zwD
zShsYtmX|`x@5;&&E%Rv^{d4>7DGS_Ny8Z6+uQmFmT^n}4?n}#i(D(I><V90)pZ`1h
z&3{jKSIKTx*<rMd*LMATiMC4L?wcDPRB1C@*KRQW`QQwbg}U|8KPeA9<TWimw4e7|
zKk3MPi95Q-MEmD_Sa$Qt`45I)man|JE8>?%=IR*^QsonV8~Z7xUiLWoe5Xs$@d*`{
zi%QNeKYh(-_XF26dCcc;^F5o~X}|OEe1G=%Q>!ir&OP||brEChmpT6OdlG)<Z1T-}
z>mYr_<Hj*JrgZ+}g0gp64{bWLQ>x|axr@R=Wlvi#ev>%I>$h;-wEp@==T^agH}-yX
zulsUhvHzsz9j|)QG^Lv~-Tt&3EHV1XHgSgN(@X(v|5;ZRGzE%MCQ76#Ulo+SrFyuq
zvLvXyDSDOmX6B#MF9@G-Y-@}x)Uev^?GW^NTbRSDrMnt0ob2j0)ZkV~ohelq6*c$5
z6tBCtBvQgQX*x$TXm-9ajP$x?c~ncZD|y1sUv`G)m^>omtj{*CHov>dQ-AK7h$$7j
zRJC-!Nxy0g@%4R?;(Gjug6b>H!o67^mt+a7J}k0P_|p=f<26s7C1^J0td_EtUDh^D
zV2Mxek$Dli6IQL-aQMnO;if4u8fqRNgPB*Zx?}alPV~jgFNg2{Tzxw#YG3WS7iy-5
zFVC@k+p}QXs(o34n$?P_V%eFQ-&ut`^Q_MPy3GH1d+65K?ltU_KC4gBxpryNdu|o0
z-j?w5c26eFo$3*Cb?VwT=Tz?S9$s;D>EvlmO5aqz6<U~0d9!TG=U;A{ye_DgU9<Xf
ztfgt{oZ0#_+1uj(?wq$Ph;#1|iQOW~vs*%sXj}|?{?)fQHF(ODwYK`RpIP<@rB02B
z3UoelZLh4dv^(SNs{0?>6>~1P+~b(T@$j6=PU)wd(@a(d+-#Y2HmoYO?cAiWtva5w
zVpq=o^X8`i;%bkJUQUZ*yIr3C7PwUyTOaN8=<*A>phJ@;yttwec=MuCr}WY|E)l!l
zSBgt@X8&9rYa+J6Xm;6~N32GvT+_>btTt%pTRLH<o=Y;{)b+<2Lhc3WvvN%@V_D;{
zaB4uro;A6i=0^g!qW2zpYmn-?@rP{*6W7}kKJM>tbYD)JH{(#=$F_M!t=^|oGy`sU
zX`InB2wEOcDeLqua;3Pa>nnBhbWY(FGB+>2h;W^{Zd=GDkyqIlJf|j>x%wymQ@NM)
zDeL2_Ak_(0zt{MkKi9DA`->-yR+A)B7kzjfowsF@L1><GpSv;h%)85j88kZsk7@0`
zHf8mla^dDT%Z@c>oJtknt-Ai&%%Zhtl$SqGac~XR>kL+73s|cee$ODQ+$h-F<f+hp
z{cVY_e0F*j=$<ypja+$9Wlm}5`{{e4lCOn6%I5L2KCC&br1Ssu8!e`4v8qRoJt#3^
z4l#KzByUh3J@Z<{s+jI+OW#}G{d6_s=*Kk|oYq!-URUHUH90M#=$)tbgEavzV3Am<
z=F5*_W~y;<IKKUHXy;Wyd$TK5O66<3&uvZp>L2)Pafv~Q_HB+&dS0<lmv8v$Vkfyo
z(~LXyxygwuUeQKpf?9XqP!K6Ra7Oya_J0g#719&h^UibSvlmABKmL3}z$`mXX70QB
z@$xaTb28ZEr>vi;?x`uBzWn+QWkqS5iI<t#duCO{edAx(SAX`ZUZ7Io)%D6p<Gt>R
zc+^O(Uw%DH<eczJgI%W%PO-RpS5sD1D{#k_kbi$vzMTl%e<)MFRA_2{&f$P*yEG?g
zT<ke{a)*_4s#f|3qekY7doCsJXS%Sw^W?235hibE^Guf8U3!K8dL(D3k9nogZGYj(
zTTe!w`h1x`vd}<x=E7ZzbUZY)N|l48Kd4#RJ<e$Vb~z(JNHl+1)=I7HfVEemn!~qk
zwYcjqe0z&9<E;J59cKE?J+=SIq$x$=i!AN!CeQB3?W{H{hg|HE{p3kW$(t`?IlTsZ
zKZeBr?qsTyO$fYIKIQ9LpJkuco(RZZe#N)(i29{k*>1&&mikNFlEN(mSg%%r{5|D`
zUB%TkC-Y)ulXtU5%lPEq*;%pZuSe0EIp1QN@9sL)Id8-4m{)54NzXgKDL<T$>9xpi
zw<i0^195t#!3u#w;;rFpcfDCw+_sLjS`@5VNqkxe)6&}OiRMpjH4CPCgTi)Et!t2g
z$;;^Zcc*O6QFsyfYMH|#6*cLf$@&KC_U2Etzt~%l&H6lQgXDzwy*Jo*?)vJ&=ecl}
z>B6j+wKs%Ld{;9}J@8=Rbw_XAS$!%FR>tf87D@FhrJhP(t{7|l&T~rcm6vwCid^rC
zC(paSc4GUAn){|Y-$8kE{)tMK_m;~Hw%-u#f4Z7&&aS(Mc0M<1y{rC7_TXDKuDgLH
z*7JExSZ93_z5j$GXQi}HQlHz&d3VpO**{}S{@XU^BZcmZwqB{#TFz&~Ts3L;xu~G6
z$tO%isx<?CxEzdrVYO_-v8bSZ=cLPSUKak?wDpV0#^|C6QW|S^PMh*pz9VPauA3@V
zI`L-@d#(?T-|(gJm+D;s0|mjV7vCoTwcL5U>h1cbguh<}&g_?Ciplx>Nb|dgL8i{*
zrK!APOTtwTtM&bhobyJ?=uO(YA7xRO6C6{tIu#5znW=NCI38PDTsmh;<3iT;N7ALL
zn{KIbi%JIUJZQIh)j^Ig>lZ8Ztjjz(?M_1Ze5U!+uKIUL#<%l3+e@{lHtb!_uwt|9
z{U+lEh600MLcIG#1h?@xIxce+h>F_%NcYC}1Hm?5PCp3Y+Mm&UnQJ{G3xm0CbFk*0
zMZA9Lvl|=~9_;a~EZxF0^_KoEhSEpBS(qYa=RB-#dZa(?+R`N~Os?Y7n;%WnNLs~k
z=}=R^kz%>3!)i{GS9hOYty@xB(WB7#^wkHRoj*37G;tC>FI{!`C|9Ltcctw6BZ4h6
z?HwQgG}n-3R9JL?U)lVVi~g&!Gf_3V!3NoS&)2<MdfG_I@AD>}T`yN}Y&+Li#C<L-
z>DU3;qwk{n%CD|#ty7xnyd}=>sX}ky1+D+A$MqM^*DM#9;&n80P3+Sv+{&#-t!8yG
zZ_xRfs&%#YvO>J2F7uK)uew*QT9fuKXh>mqNT|6g$MAH9${8;+2G6Sp?1DZxh+P*r
z!x7PSRA;KYgXLbXf~Q9&ALBYPRnKbL7pC8{J=K@q+|IHrGWS-ft^Z|%PfnaKFXXMd
z^lr)Af@iS_5m%SmhJRWXa&)TeRWHf;o&Pk})#z^LZmIS=@=U#cXIR73)pn|~4I<N)
z+cQ+v#V*%L`JB8VM*6_1yJecP%_2ALzZ`csU;3u#$(ki{GG;Cd-7>87tTvwCB5)@`
zhHrmNKYL~|=iR0HQq@cQ7d+mf5%Y)h)`R>5wKw+f&~mql>Ykr1_DH>IcjPIarunI=
zibrSfKFYErrec@s?t?QtUtK&u>5|dY+i#t?0vVU2tZ(x@ofxR6&Dg<sQ&WvmG(c}p
zwDLo--4nf)FP$k1xM%rV>~lMpiq|EE8FOU*t`Xjw{ieE=X93fRt|RuF^|rsT;8tPR
zoPRjjVQ0a$`7P0N-1N9TCPz<M%~jI<(w<dF^(U8)SFhdn7Z&eT7&WIK2xf?!xIO*q
zQ!&~5vz7=v4K7I7J!|#qbqcFn7OxT8KPBQ&z=Yf3r}hNOaXo$fG2q|c8@_eB#P-jP
za7x`B=p%S(VNj&%;m+P9bA!8wY@UD4oG`b&Ug*^0E0b%Cm=?~7cK&>j_aa+mov`mR
z{x4118sGf--+g|^l6$hRTusuvl&^iol5YmwYfnG>E>hvG#I<S99GhdQOP_hXQ`Kmg
zGUruFaa_sMsa|EiY(i^J)wKC)t)F&w)?T++6BeJCCH<tZ^xTwKw%JeCUwP!C+q^J)
z^G&0lp81~V-lj+D{hG6K(u+e1C0sZ4SSJWQo^V#-;xixJQvRQ2KWju6s;Nrfv#E>t
zv88FkTwRW7CO36+_Wr!I>;9VX8@m3N{HOZ{wND7S(<HF=!WYkPzaFVOT<r^dy1hMR
z#f!-?f*XHiT5(<yOXb}4bnfH=@B6XlH|~D@^C{O`iSgsS^0_T1T+427GpHuby7~QD
zsk+$RRQ-l29<Nf~uV~YY%vipvAwX%_=DWPPv6~*mbp?1hr|q$R@<e&7n0<)aHmihm
z>uYOXPW5`_ys+jhL(Hs6@0S{cbE{wO_H1Er*<3Pr@+!5Uot9mbZaj>UI%>&LSXr~}
zx{djdlX5W=Yx6`*JXV?pFE=&L?w#Az=kjVoOaH8-iy`+OF)g=v*BMtD8KwOGGLP_+
z`->(lS&=h6IOIt4*6Vv7#o2dyHiiUM?SJ-Zx9#HZar0v5PUBiu{9L0l!tDLW+Nt47
zt9~z1dwJMDt7pP0qwuHEDx7LtdN%sL3p<l*S2_7%h1Hz?Nj$4ee^l-@=C(QWkeUCJ
z-S;^6Ct+#7PC<{p;eH4|`ew2l{OB9q$M>Zw8jb}YFsMDie_(;h;TMHZO!Jo=yukhI
z^*@y_i@x6da`0!*Z;5F<AB#aJ-xTe5!||^B_4?v4mO7Cu4o}$1<F4e#xL=NR-cu)4
z{bb$J>(&<wp0d2%yKk=Fg0iz2QeUK@3*Ej}vD@_<zCGaaenRGf|Hm#X&7bdg_0NoR
ztDZf-_npaH;*NcoukXKu$L{TZlHYpsC-;e)`$E+;>b7kBeoemep|NWE8ozTEYR{*f
z=zH!Ju);4uLb${;`1X8F$B9;sfj$?eO4n7cdveFmMC^h}q~qt43{q8TF0L2fTs?R0
z@L}iAX>tjLHbv@(pCwq``<cb~Zf<qH$?kVCx7idQt4p4p<(p{PX@A1ad4bL$#|P(?
zTBLW+-d%np?=S!N)zzMMIWGOie;l9Gc9;D-F#nRf;Q{g6x3jl@tVj-i99?32czs^Z
zqW^9ik6zArv&epPdR}dZ%2c^WFJmg+ua;K0lLg)+p!sUCfA)N->Akx9Cf<I@xv%lI
z<u<8H`ZuTAy}pqDpltK&*V*5e9(%6K*(CR^oAv$|ovwyk<?sIT&b#>9py2q*+Uwd2
z6y`e#zRvy=5-#lS-Enx`fker&LW?tEf4i>mtZ!bX?D9CI*DIQXt-8r{K}l;slxV;S
zo@Wbg6iNj~uzT$O<12O3phu7USy|chu--1u{hV8tYrMWP#i>YZx!0)!d!;HYat=RO
zIZI#EZC!KMVaJ=>bCWN2u4e93{yw8IOMlm~EQd`znoG_lW&277tPyv)B%oK*(<pI$
z!Hh%4Pb&P}^tj^+)7~~WZs*m9B?WHzs?U@EbM(Ys&h>Ni=e|BY@%L40<?9ER=-yar
z==tFQZ||+emtM_qa*<Va;fq`l<MPDnnA8Lv#U<+=DM%`Ld|9+xYKDu}-pi&}+D;m^
z3bUKDTx&?-ZeO{a!_&g&ix^1OYTxCpSC_4e6>`>8D_R`Q>!Vb?;d1U&!?*YE&)F6D
z!1;)-p!u|mLVY1sQ|H-j&}(0A^fDvd)4h8Jds09_ZWM2T%(^6pQf-I8*R%OoJ^NE?
zSv1@6%4!)kL!})K>*u9S=9_%8*YU1f0NX#S9;WlMzc0UD|7`2TM@HT@Q!}<}+DO;#
zRy+PKJ7Mz2shP)o_SaX~m8sug<=!-B=cEoTC8p0y+I%(VI$h4`7Ua}zV7VCn<`RFl
z!lcNlKioT31V@!vx;XxgoE$kN?U9nF<*5n9Ap!OOQkE^9`NO9ur|2G6*7=nF<O3-;
zZhhP_HRtw^P6H{uE!V1KqE%nt75W@_(qGGYm1U&u%8X4qic8`;YrQ7CIybTAZ~2kM
zA!S}g6JF_WpLgc0X>{dUquo2_wL4}li74xw>Am5V-@FjLt-FjOWUAM(tbWJh#oCbC
zeKhsr@4mx~n_us~8B$;4<NPe}kf%mm!}<>m41MdxcW=~L`M~gvmd2fl2c2hx9KG)J
z_`{z1PrkRGS!gWJlc+rSv1Q|))4@~C)z>FZ*`n}q&wq(Y%7%N^yVpHQeYf2}$9s)=
zZor-czC2xz7Y4Yr-%GIivS9rc4c*hH_RL(}dwRmE`qk=DiG4S?7wlVSC-gGPe@AEY
zlAH_A?t0d$1SMv0PhB0{_w%Wf&@Uh5saD$pmIiSh@!M}Fu=32t)*^{h^Eey!fUoXj
z?!0o+L(GD|v%qowyZE@db7cPnG51{I+T1GFpUknC_qlj_shew7^-U-D<AT;J<zJr^
z4$dl4t=sd5@gLW(g36F|PS3Y%k91GBKOjFps^ZK#jT0HFh36;fx|#>oTU@`(Z&G=%
zX~+7!(s=vqww;#DzSggwealnWnPc$FsG}*6ZHvmfAO+J!cMC$dRCvvGsY^eW!}0Mz
zOj_phl#JumLN|G@R85E~^6=xl^hd4c$hIIUzgJtlw3VA()=OV=Q3)>UyBp>Z5+$vp
zR8_f7O>L&(qZ@0peBMsdJ&>dnE|&dik`JqO=d;O9lRgC12yc^9xo7A4?v{V&`n21s
zXD2^@vw%%*<<v`Byn%B5nJ>jZyx4KmP;TYMOImBU+Q^+WI=$}Sm2!p3-D<7*+VUq3
zW?f#Nr#xYq^Z(WJwwNu++9>^bg3czlwRVO}UawSBT6uA9&f^n;Q+v+x1WNdA5$ufF
zcIAvnJ?O}!!!Nh4=X8E0UMkwO;7YHs)2y}tL3jQscZ^?d3r$<CvdVkGmz1rV--C9^
ziUz1A#xi~7_YF{LK0jq?>&&M=oH;v;<WtLUdQIP(8WQn*&RqNUI#Ze5({f|n_ocsR
zp5!Mz=d8+tH02kJX15|PZ;b6)BdWl=T$tZHig~Kf>8Q0_jlS{%52OM@eoaWRI<jfk
z&c;Jsx*y&hDp@dR5>EnS<_nWo;Ww3v_rEPL@_KdTuYsPg$0C)6vTornk)wZGCJGCE
zzs#<B>fb`)ASrdVckREu9@kAXNN{*ucWZ~v%=vk$WxDkjzgjt&n0#B_@1`|fs8riY
zd5)3P|I6;m-G-5!(m_s#Pk1J-={&;tmGNYbvi8TTE{BzQR!)dmU?(wia@tL$!dQ=I
z6OOQay*?wP@y1;*mp%h`tzO<&{FBe*Y@T#ra?XqvAD5(-UyD_YZ|WSMU>F!a$MxIB
zX@3kWPb!(jTsir+vFNbtQ`;Q1ywWdmmt&`7h91}3d3jDo;7PW`nqy(T8G`!Lj`>WD
zxj4Nz{8PrOiXTCZH;h*2C`OvB4LyH+`l|I|N9%NI9n6xW;_PDM`$D)%f9fSaWL$Y}
zgULq^-Wz)Ne`?q$T>rSMVac=XN5-e*C#<fFbqLz#_s8`obI{RM-R`HZ+|_!&CVFjn
zDWm7pfbB`2k7%8KxrpuZQRS`8Rc@?uAD>mOI#R;unY%D<YQh`Mo3guRENOFJ?`1NL
z-~LJYgD;F*m$bPTsrdYBNa6Nl54g2T*Y`zX)Kl9<NiqAw?^*e7n)iV1$M@yOO&v~#
zbOiUkneI?}bY}@e*8e}eF<$Y^Gkm67yp=Ji_u4e;QuV*6SWUGZme*EvdS&h0`j$0t
zrfJ~GB|CCMGDM?i>|%V;`}$x>&0~M1zp@<BQolE^PO9H#aG$+kCijC$ZIg00AM#ts
z|D>SwWw^xIlsEB*A8OV5Y--JzExL@W)}i4fKeMb)NQ>9`>|0^29838<Qhp_vT|c56
zd}Lc_;_FN7DoU~9{Wk@3uSU$hv&``NY#qZgnaujt^9vMD*=&*hw<&$!lh!o;uYw(Y
zS8wvwHyX!(YF%i?@^GT*ZIA77q35iZ+5L^|l@SQ8Q0h75m@0D8XV1@_Y+R>>(jG+A
zJf8W}$X?>(%GTA3Pp`hb`LMFD#G!=lv)gCR)Mt&^`2QbhwVJT4LZ8XO!+uEtPKm62
z8@8>PwCvuEKF#-&t#<!n3R-nV#`~UTX~tLUsad+mr<Hrn3Hxi8I&I-wj=qCWWP|_u
zrMAtV`(|~QmFl_Wb@MkRG|tVb;!K}nG2_=<uUt>}35F3xN?U)6&J)l7+~;)t=H1Kk
zTn`<a*PU!WlC$LDzM#$fwHo8<SGY)RpPO>A<?8OfryQAi*8^|MO_DQSva()gpXbyw
z_xtOvzVX+(zFV|Wa`xlyqpg~HB?}{hmS4!@4)Ixa!>_OJT>t&oPxnP#suC`XUXWB&
zEBEOCb(Ih;>7e;FQZDz*b6(l}SUEL$TCwNkS<>>~>n(pR;C7k9m9YHfM9z+z7O|aa
zKabRMJ^JzB#ol+GD&Dgk($v|Fc0RtScXUrtz&HLcJ_+7Z$2Z<)`g>(Df5VY$^O#l^
zWgS2D^1+)&uU@=ge(dA#)r;rre_P*o{@(JWGa@@v?BB=BW=>zU=y}`Gi8_tjQj`p~
z`YoP$iFv-CcKodd>8slEYF?2KKfHN9YlYE5<t0BJFD%+)kar~{Bc%S`l4mjQtrJ_^
z(+zvmXJsteWMgTd=o)Mnd0@fCJ6hA^+_$eb+fdQol`L+)Pbc-!%bnAM*1mr7{i63r
z|BZ*|#@$`Sx=h`ian+%DkCYV(U%usByLWB7=Q5$Fw|7>iIW`trYS{WnZk=>=c5&HP
z>1|rl%jDM9oi0l~eWdwH{*9G6GkzWZrMrDqw3^%gy3=n@O<Os8@!_>wj)}dW-FMhC
z;mZ0;t)X+(6as&&dR$PmPRe!H7eP*LTh+MwrvjX@x>7wC+MaM^ueOwlpULg{LVLN~
zo_`LVN{?jY>h!jIO&1X5T<}6!XeXy^d$G=bH%;SOmqU-T_>PyZ5B}gQKWRfogwUIn
zO(CHteB>u-H1C}3BBK3#?W2Z$|0W5G@jp=weeShdRcTN3w?^-!SHBc`-sRU0pDP@s
zb9!Y<5@TIp{<kHX#(k+_&P6FxHO^-%OnRGYHEpSZ$EQ^l0S$iQQ+0diT8FLF^Op>b
zE|R&nB`c-Tt9gH4Ziw?M55L2+%49u~qILaqdR2m7`ZWblReLh!atl|-m&rc2lO}IB
z*!t_`qO#qqFYSoU*I4SkCVZo<zx)KnRfbb!U9(=N-1Ax-@AvP3{*KBBiw%+tCDwiN
zb#~T!?e1RZJ~s2xs%F3La7!uu`y#%Yj2$(5>i?zvfAH!@_}RJfm5;(!PsxgxnkA(D
zWYH8Axn-RmQd>@hZ+NDpwf3_~;DayDy|$UNr*E0a%K1iU!KJV3Qr~q>W_w_j!>lKE
zokb<oH8=2$$@R=7cURgR_TQ2m@*>1IEyerv%x#~pitb2`Ph(@77@7QL>7pffp{H4~
zy18#j4Sf+({U+6G(NukgL$be%7$!QVT$QL^x$>6a6Q3v6SLLfKc|s=`2fhKRn)qZ|
za#&xj=1aqyyHnrKyMFk}<Wr8vR~-rAo3?4j8L1f+I$qYssyB1Kcn4-gi#N^DELMC{
z)Dyd6^&^Sh_gFk#ORi6F)-3j6Q{9&prN2$@X8ozAC$kpEIxezV9Bp)K*|!Yu?epf;
zcxunxE4umIy)NDRes8zE^4lAk{Ytj-QSDVn)#Y;vXWzQ*E_Kc9@dl6Ym7i|!YtlZ;
z`t#PuyN^v3PJZ!Pt+jfu>bWfccXI0)Jy(^S;aa~T^qfF~!o}|6TMf4^IbINzn%_|T
zc}KyswqLA4QEd^c40*N1PbW%=<)7KedwA*{Qz>zFt%z+anWJSsoZPxb^McRH)Au%M
z2_1`?)ODHPS;KDW%JL^)=SGJeb=((Lncj4ed1+P2!xJ$F!mj?DJk5f=`OwACwq+(g
z7mT#czDGaO>EY=&WA}`8Z>)`|Sim$X&(3Z3Wz8vRJf9b=jtF1x-*@BO*PE|T?!Ka_
z;#xhWa`oC(n?2Tk+Ln~~;Oha8xi?ldd#v5`=zQ}<Z3i`5(W{$QmDEK}e|qqRsNCc@
zlM7klH(k;q?~3O{+)bJDrA&&?{+Od{k$cU`i(Aj{&UUtMDOz+Geg?&Zdj&;;8vowP
z<q0ee?^?I;N8HQ3*Z<wSx>sIl$Ggv0U(3$FXAeDkV&_EjGyA&i_s{Xa5dEHQrr4%4
z;bGkW`6Js>)6X9iU6y^}tW+lVQQqV4_wz1$9JDz5?6Y&>`XAgc@1FbTfynIM^=_%1
zUhlh2d+M{_7=HQd746delEu8Q)A6FnL61eV-HTXj)^f+Zv`=x9s^++8AGkbI+IMs2
zWa$UjFR)z+>fOWnrNw%YZ+~pPh;RHwbE|D1-~Z&3s%F1zP~=?lpzqGd>o3LU-<h=g
zW{SJ^PHpoK@83O~bba>TEk9k?&D;Ah*52Fw`@QCMzk1{HO1%9auiQD4PyS(iMs5Dv
z{GIY#534L>-*lvWyf60G@Pq&D!Vmj%|6Eq8zx{E4+e?eG(?4gwydj$-X06LypSLY{
z_h0iAojaQkotN>?ZMbm1jeq;I8(Uh=-#r)BnD*3ueZ0&(*_gj&buQu$ezu#dA7@{&
zaqs5O7wvA`wA^Fm@_wD4|AfmX7eXKSImxe6DRZ~Bc7HFu;ZEc7xck-b1g7nkPwW#u
z(KBPILHwlU*W&vBoD>(SSX}p5=v@ondt3c1g-^Nr1@-Sw_?h;Gw^rQVhQlU*Qb%jW
zRsKU893$p1O^iL=lk(l@@ZFQ|Vz12K5&zfPd=}f;$``D^%kQaVxm}+8vRPba$HMI!
zcXprHT-UMmUwF%}jAZ8h*T1MczrTI+?Xh1KzxeA-imsc-f7yQ4_siq{?4R!s-z=$m
z&H8$F?Z594HfQdfIIdk$EBy6$$L|XzZBr+1=wyGd_Dib%^aI)5^*+oz70=ifmfLii
z8AaW_$#eRdfPcX}yL3BduH>ZpKNJ6W-M;x+xjpypcY!|-mPhLJ7QU$N_5IQ$aLA6=
z_jvB%)t9yvKG)TpBvv=e#^y`2cfZZg21OtFStsW{^0is<UAX*B>ftZH-@oQG_#)h7
ze^GnOzRi7Qo27R+>+hQBez8R8k(m17cHb}eMMU1}$$Whn{Nkyw(*DFsD|zP2cl??Q
zf1Lbr=Zl+MjYA#(M|tKo-}@Mu50x?1aRoQ6W%*xfk=3{7WNgX)*ZXTY|Nhu6{qV))
z|CO6BY_dN#NA{8atVDws>o2!%s7*F||L6ACyQcXfmsSQ;pY4kOE&RRRETm(`xf87)
z=U<p*chonc*5JkK+pisz<&~V6ZvE)rZ^GLD-;>>Wr?mI_**P!%u_(Vk%o35!l*W7Q
zGsor&B{s|Ila19&_E%}lIat5_Vusb<razuZs~N<1WQbJ+wygE}GF9*BjD^Y0m+q(v
ze^H8^!KqypUnu`KT0FQboM$g<-IKP9rX7)IB3nc^`LqAnpIC1s-}~XR=KTNRJ09k`
zM&Eq<@p{V4C2#B`zx1x1eX^$K|HtkB7DNc;%szSciwH}s<iES6n~HwD5YCdR+WxQQ
z#RRrnPQAi=^xR(<d@$Vj;b7F`!#r)Bb55n$<?lJ_aN%i*9FNT>^TZ{`(z_HU2mSw(
zt`+v;*1@96!`XIsemDQFyMIeX=`riS6dT!J+bgCVmhVq^Fl+kzzWZ^p^WVk)+q83M
z=j_PjIORj4isz!))8DVxJLh-ly8w@%+LfN`^84#6-`_c>EqJ+Zd-6Ah`mYli*Ndr7
zu4!avUwibjC~NT<BhB*(WjmX$-b`=#@2|1Q`<p1!Lc5Pl6)EPm56!hcZx%1uuP-r?
z_r3ig;}8G7d=oo;dG$-4^#)pVH*$)dbzXDJwqWg_ld+p`<^*_|8Of<d@%evn+okgG
z@rU4FN1luS<=|(Xx=iQ&^8NeI?Vsgw>r3^79aEOO#vXX#TCwPQ-Uj(^s?u-8TOD~h
zHKk8x<V_5`<#qe!q4zn7zB5j#g~)LG)E7S6w!K_)*PCwtqv>|Zncgg~pH^k|J(jFH
zU@ThR#@li7*sovLeyNtl-MRR)<Xd9f|3!VXQzfD|PENeJ_N%X#P6yA62IY^JMb$%g
z6%^=lePGF#h(6SwFrhE`t&gZ>+6VE!TYKA|<xI+FvU_0XH^r;iV3tsH?pnK(3RmO}
zTAM39diIrY{92^Az{xDm>GhgMnc2%<vo3VKr^wtGKcj*_!=B^Lao)=e4;ENHOcuD3
z?Vx|kLz7qbu%F8<VF7(cSD9jk*HbT_e|>-QiX-oZdHR3Lu`T){({{t%;8ffJ$B2xF
z{>yj^f-j!En*cgGoK38L;&qL0%#ZgRuWP!HofW;{WlBN++uEF4$LFTIMW2~4d-u_A
zA8udixp`ac|DJoD^A+C<J^aKjrd7Y^-P?bROwHG${>gspl;zs)al@~3(~Yz86^jM8
ziL=dk{G073civgWdc%f}GPQ4uLoALk@#lQFvCC)I?&Z!~4{GG(C?~b<iJNiCPGaYb
zwmqKTe_sCO{r~B&=XbxZHQm5p@c7LWwYA5E<n|V_$IIPGkT9Demo$+xclox|m5Xnb
z-HCG7zkaQEElZ46`1Z59XU@Nl*5nXu*?w8UZ9@#h3ZVmx9!rmfDaRe{oRBpoKGMI*
z!Zl4%aIVDy=Y7d8f`SFJclMuPb&~#2_wTchoz|^iZaF(2i_Xi~=HnJ>vZ?#V)?}%Y
zj{(bH_Mf+$c*G#_%*NRX3wV}oc0Y6C;uop?$vHMt-i92z)-KwZ*nahZ(5n>@YWhd_
zCQZ?pd~W`X{Gy8T>ofA>_NhE8e{<0=J|}wjKRKO?Z*wCmKJb>RCAj?l;{S_%^Rkx-
z7vKF&`MF7%UH8I6Z@EMD2Ms2$?fksdtj981PS7@DgKE%v#b-HN9L3ta?NrY2lpND<
zeBqrm#WP_`<F$`cv;2--u6*%usliM02h59PR&L(<Z_=91(np1+$MagIKleNL{?<*M
z9kLxdKKFkAy&pXNY+HDJ{Qa|vGtP%y+aLL&-ry5^{IqM<a~Zz~bzl3lz1Q}|!>#uF
zoXsyMykL!3%&@_YFFd*b*u0M+f>8>)d><A3J@&RlDEI!Z<oYi^v`W+;mc3y8_f}77
zzP-TVmsii0nDp3l{;jWA@00$G_j`{f>$i%X^IBIVb1OVuY?G`cm!8y?^kr`6*SSr*
zyh~(b6^}jl|F?}(+bzrOcZz7{QPTsK*Q*cSh)rHQ<?Nk;Bd<DiR=K~)Yd$Sdp}eMb
ze^sZu-NE=neiyGfKR9<nzp~%?=+RS;7-z3|@I7Io^S+9H-|cnZWb(e=JHG8?+f2WX
z|C{<hKK%KhD&hfu&_j2*=ItzXX_5|a%BSs5_!D3%zvYh0o5|DmC)9+zYF(DG@i%+b
z6pN=@qTle?2DLAKa!~Y5&8Kp+){~!`6Rf26RvzKw%`K4Lew^)thd_Vrx2#z<+<Kl;
znI6jW*{Mx0x{p^B{(V)=FRgI+;oURd-^#DgI544wzsz!Ny3eM6?<DkJ)hKY3xF1@f
zQe`bUVaGB5mfH0XANTs&@NPcvTk3zSrB2$5Kiu2xRJJY67dUcK`iN=w?n=g6Pv`%4
z@znlM{%D@s`7bZiOTyxKmI>eaF+;~($4WZGsCR?NZ2vZ2k=Z@(=Dto|)bvuqG%inN
zMO~IaKyNs&!{r+_Hx;V4+nbu1b3dL?HfKT8LeICao<!gI?$6tEfSdi@ncEBQwAud=
zw7cWbKf^XDtzmh+wep;<P3{Sj)6^I|Vj7%oC^K{IJt@G!a_iASpJm71=P!3$Z)bmM
z(>Hac`{Elr&vae9BKuGL+b-keb@P8s4l&D{xV2+>A$RMO{r$Df|6d)hXN-{HJ)D0`
z;#aM5=nT&rs~7lhYERzUc*$%-z2qBrX}g<x2bz1uOE}mn-|fD8grRjihs~k1C)<Cj
z%)7E-%f652ljXU?w9NnYEZ3>FH~07u%CTt0##|vWKGx*E=Pf)ee||rYifnV}P+Xtp
zv?$%IynA!dxj2P)ze<=kUy1jBmQ}tt>AUZ?pVQ9SD03JT8VcFybv*6Mc_}_$Gg;Q*
zkF7`9xs@H&|JkHv7K2WIcvrcp-G6@GlAqk*(;vKgL8m|XEK1992c7=Fb#Os)k0<Q(
zht>L18D3`=ao#LH?*F!Pl423R*|&SD^~<N--mH}VJ8b5H9~Y0^i_S@CIX`92Mk~w5
zGv-`=S@5rhlj|xcS8`Lvk1sogL{<um9A$~!`EdGkuXAr*k{Nv`iHdZeN_U%*W;Uhg
z8LQB0FV9fxjeQZ-y<7P;HqNx}G(CFo-nl*%yEXrrS8<x}4}ZhL`z+B!_P63q?RmNV
zd)D9MkezU=|MqgWsQ%BH*Az?jm~`K<9@_TpqI~chpT+H&A6O5{ZIM4zW|SwDeO~(g
zJ=wd9Uh3|eBey{KyV@P68v<XLw#fHf{C7aMD!IO)Ua}&w<AY39#k<*y_O(dxF)Zu<
zdplDgYk$p)y07go-o7X_a+IFI%IEh@U;j7z&n0^kKQFB0?*CJ5an!HmvaHGTc&X|;
z{hrt2c%{<%RaW!=mG@X-vi<Gak_#8u4B|ajZ!=kbaPEem>JR7d@9<v#&emlPr$_OJ
zyMiZ+XRuz5d{A96*G{QpF-x*J-zy)bHz5hz4$out;C^#BQ99?19oOySZcmk;1+Z-5
z5HgK5`P?M1{pq>IzcU@Cv8RT;u$c8I&6eX?g2{&`5=J)dhpu@xZ|Hu}KGA+>_e|-!
z;`dDbE?FzsS+pM>IllJbq=WAqMU=jaHGjW*g8S=rrq7!TH+1ryJ6FHk;@{7^qG?)}
zZyfu-G5cEwm;G;b^^PqyoeM4;Ji6Y!{Z@h}m(iKL2aU5k+BteR<}^ie+Spt@{Ih{e
zsNAG!$K3a=3O<*9ikk5lAFGu6p*Z)u;WWFQmB;`2SsZ_t`DuB;w3N&IIfio<6-X6x
zZQu}lpL|I-{omf4Z>_!dlHoD`e#yzEXD^FWX8(Tg0XJKz&B=&|qQBzXC9Z2f*m%w?
z&G@oI+UwBOUr)VTG=0W<o-Ku@-?s_;`;#Lu@wnN=|Et&^9QysLxh=6$klDkouJuh{
zW^~%$XYTX5pLa@X+^Jb4b5T{ZqnmH9z-{vv;`X=r&dl7IE753fR8k$&DHH3do*{op
z^$uf8!1`szF1}nHl@<5zeB@cb=gOWNp7qt88$R(byXtn#%j3kBx!nrw3*zleMe-we
zXqfRWn*GGUt*D2&ev+)z%=phy4Y`8lExBj><<r&+{APNz=fh6H*_X^ObKK7P!#nk-
z&h3Dcny=%(9Xq1f<LUgSeEIU~rS~Q+^wiX;nql9e$u!}{tTO^aN|{Wtd~4@7x=LH_
zcwYT~eZBRUyo*0?9$(!3`t#%O)A!u8y5G!Vk@Meqk5$5==>2kXa`SUv?k%cZ`S;Yr
zg=O-0#Qnbii_bUulJDK~e9Pm9jz3STtW__L{K2=&XTMing3|KI%&%mQ9@O^O*K%f`
z?uD-CXKLT(XGm8lJc|6!$nfWH*8d|cBGD_h+^Rh>JLdEb)wa8lk~!V{yPXrGnQjCJ
zRc`Frz1!%HnY=mMhkuVgbsf@s+&1^xdO0ay`3;dRbMG0k?q${d(Q<X`$H-Quc7H~;
zf;@pglG59IrY_7X3}kF5-rR92=4Q_JpDPR)R%Fzdl~zR_Nn6Vk-QIteDTiHse~j!O
zr$0CDZrvL7ZvKUU4~l;b58jh`z<1hfyJ|#_>B%=nDRn+8Ok{U&{0_R=<cWu2$@bF<
z0y@iPaa7r`+?8Wah+?=Pwr2J&rF#$h9J#qqbLJF_z0Btp^EkUSbJm@AyJvW4Sh!f}
zciSX6<h6hQm+Mkfb>gympWrr2uSe^3Bg{$#qiv4Zb~DW5VhFz5ly+l>tFuKwfLo@%
z_|mhknZi@%F{G~XeD`<vZx%zw?zsh<(ziCYi(7BF!6{c|+%IErQ%Crb&UArx?+#~<
zpY3x50y@9G%+Q_QC)Ur`Es&(wd6Bg(G4@FAyA#_vAFxWqCa_;~z4>s_8-XeQr(bC8
z@@N)VXY{I+Q_=sxi<utpbs`rRl+NNTQd~DPFhEmQbn2qSzn@KKC93=tH_dW)b<Fs3
zK0LE+=9l-PzrzLpO8qSs6}hso^Y?%EjrF3PYcJY|f1M%gWuF|pcIwZ{l^bP_UC{YH
zB{$=!BX`Lue)F|_OH{Unbcike9BL_fCd$IL_jyxzqRM@%-{PFo4?E8*uaKXeImv=2
zbs6uc-^&aVE~zlicoO*|_S>6>iHDY4Shwfuo0F%#|4lyh!+W~+cm4kFv({X8h`SXr
zk9*Tei>AAAx@<daCL1`2b2p~ldl}$xUi9nQNxu&@y)WF#%M<@7e+A#%Nv|ipp0zq-
zLH4U`jq;ecTXKq+e4>uUoR9h^Gh1!m%(O?#RtTI5Rn0wi{o%#PT;^|Y)D_MdX%x=W
zDvYtcniiuXSLkghTYWD0LVnP%{|mkBuW!yWo;S7SUu(>2x$9e%USGHp)qd6P>Z8{i
z{;~w8ZkKKeds=#;^ysY~?XY6mvUyEA_*DHWWs7Wgm_0sdd)MlX9qZp%ul=8_p3Gv%
zJ@&DBQ|XD`)I(N2vZha$u6Xig<Ea@IDc&-FVrCv`VY<qC?7O6O+PTy-i_PbA?VY?R
zJl3(Me{=FvnR7P3o<@o9bn4-(3jO!|_v!~C#&4foES7yXBj5CGzH5G|@NS1YZ~In1
zUi`ZJct+p<qyKYEl<)8UZhoSEp+HFC$(e3SMMw5+W6D_fN-cNtJWux8ly&!K?2b92
zp3Y+UuU$dT*Zf5N&JN#X$&Q_?W^M7UIwv4qUzot~d$xkLd7YhQU2|Pq^Vfe2bAOmK
zs)+jCxp`)OisZD_JbYIQw;L`f_Tjm}lKMEnV*Xh-yWN|oRsX5^|6$gy=byh^&n|X;
z;;~q*PV3vl*7GSkM_>2+`2P9J^;hRS1RVAoOMU#frS0LTHwv=sQv+Anv%Tb4abf+X
zUY!YnLL4s=Ok`_rI*CuPb(o~AZ+LmP@)tp&P`<shf65vvS^nNQ$3ZlJDO2qF@kpmB
zbv;~BmUZ>t9<Hk1RsZ+j8;y<Yy5^gI>zXg%d1!%yw7}j|+FhG%CC;SquAX6jwbS5+
zhj#gv>o%vAR%qSwaP)Z=vT*XML$hYZm|Qs0VbwQ#o%Hdhx4)7kx~;uZ?oCN|cKzFU
zNKGobGyMEK*7fsrTf;>+&7XE?b=OMn8L{(cSY9le;g$MwrIF~9?7v@`CM=5J3JzVq
z?62vk^;av^KK0A@w57<JiT%CPB7f54_iIVhwv8fwq28;b`L=7lHE|A?Je>B@u-^1=
z(bMwd8f-aY=@Co+X2?#nwfOlo@`KL7jUvlJ&uovG+mRY+cKZB}?#OBKt6y5Q2Anmj
z2=hK6_IKs{^Zm1rzmR$Kj_p_5nQfaMm*mB$Ctlp&x0$nJ>4wr!s~_rzf5bf48h0$4
zdt+tkthAk<*M0Pnn7jWV&&us5{~58KPcm<1UVi-7RnF;4@<R)G&!pI~_nCzsx%lk)
z(vD2ge`j}9eY?XIATEAdYft8~J)IMT%A?LVTCWu?T)x%n-Ijl)J1$2_mPb`hx?IP%
zCv$y=`P-`>m;GITc=oqb6_>9)_I+;oVcBM-dnIAVXP?{8mv5#0*w?+^Jo<d2d9?PU
zv)5i#Z2r3b@a(lyKc;zKf0Sd-{w`;IhxP5%kI#ME&sV-J{Mg)F+mkmd`S#q56wEIR
zJ3f1Ez3ja=YkJJBcTL*-TV}`R-AeD?tn0Jh{om@&%~;9uvac%X?=3&1<-6{=87-Ut
z?O$od=IuuJ-eh|DeYSj~HB<Xms8R3KLiNj6i=X>3m8#y!eD#)p=J~|>6EPS6P1w2X
zuj1$U^!gJqH~&pox!XR)uKllKvFmT=XRp4spQ)ewSFt$txAU@l|0evD`PP0$^ez9)
z)wku1{+E7hKQr|$|IBUcp49MJyFBYE>o{}ut-#FxR@N@hPL*}|?3GpeZ23lDruHpG
zqwwv{DgR!BIJXszK3ls?DhUiWj=fUD_j1v*O_y9(zxtvkIlJ4qC^hqNP|=F3)n=W)
z@37=)gwGVQ?VRi^p8odKq?W3c3!W8wu$oSv$`y5X?dhVgqC39s-0_QR&rX%__(t=u
zF}0s9mo&{f?ZvwG*}2r6zqs!FjESjbeHSxn_4)&It=8@PDHG&)Hg#!J*ym@PVrp6M
z)#$C;$CR&k@@n`4-?<?H2;FB>Eq`(C`57Zq%X%+n(&F_8W?S{4=mtsD==FhhUkrcX
zyBAsaxzwdiS_RLGJy}B^oKpp{m-}h0K(;){QMBUo&LvG+AD&GDv4izRuhj6ZT<~mD
zkmKr|#gQu)fZQJBD7vHA6U1IQnJde#JtP1mb9K+oH6Z~Y$FE$#wP)uN5c`TZtLc1a
ztra`hgk11?XA-_WImK>z$c3zTCgI!cQ(nF0w{3=N-t~83`ed$E2WD&EmcQhK(3kZt
z=I*}>o57Br`j$U)Y16FpilSFy!n86>^Vj9ozqko@@2PL?Cc%zppHJY*($f~*GRr!A
zyYrVEuv1g5U80bqX!h#cidAM{S8kG3QWG_q&hhK?Jafsu<%fT2><mfet&4kqhABV)
z?N^5H4_T|%D;Mn)u6_Df+GIxGp*nW>vcM(x7x<fBXtwWp_i$1}eRjf=$1iQZv|VQZ
z!>}N??c(DT+4p>!7m9zm{@3$`>+9Vwn?Fl_-}us|YyM$=z84Wa%b3kSEuZ}F*WUN6
zc?LV`Rg7EbH@S-LJUCbUtMv7YCD%IGRsSa>zmNT79@$}i@k8ZA>=)W;K0FIw-q*Qt
z_hRhF@Li}eYG|7$85n3%y>;{F4<9b<naLg@(|_mW2Fn?J<@=%<s-NGJKD*BP`ZmWC
zKRn$wrv*p&J>uVV@do3@{mvy!|IDumMy%ywsuxqdbK~xvy@$7*uip`W*ZWhVa@CxN
z{7Ubmw|r**H^r`tao>%5al3nuOZ$Gfe#33oXEU>l^@}5}no8|{asJKBX!&)f5A45O
z<rT<NDp>#b<Xe%i7ng7K?>&7i>?VhI$*#-C?l1eFEdKgT&Sm!#uGZJDUtek_HGjL-
z?Dra``B!uIY3J;7pRZtEcqM0#`mwwt+m;1x&dres+ZJ1XCVJV9w?B3rc;eKy%Qk|`
z_QI>5rPVJ^?Q1<feTmJ~*xHco|L48Aop(mE>Ght~4!+q<S<;srGfRIo3$16VlJ>g0
z&NuUVtn<0k1z%R@ouBsR_B_>joI6UQdzODwxe;Wujio=;<3mO1M~fhvKAwKfgP;3%
zRYYydU&}IKL;7aB<y)32U!2y{a(CK;m1i|&HRtv5_`5ePH(TzJnzdg0@a3rwR-V?B
z-D#2CZJ~P2;A5&~sr7Vjlfw`C+}^E9)?ByC=kmlZ>m7e~Foj3{eNu2WbzWb{n}c(m
zM0Z3L#cZAFq4n=fU*t)b?iri~`o2%EU-f^o@a7loqPxDaG0SRlXUcqgW}|q>RH)!P
z<TUrDXp=Y6yR)B!-Ltg_@!cc)=eF$*&nx*+&V?Ux-f!Js-a6Nj#qR9t>(+Lqo306T
z?YH5uG5^$t>-=`h50|ekm~DDVtV_D@e!aBM@ukS;x6gT~xlPu(Q73g}dXB{ZYd4ZR
z{!BINX1mP!jxo4pk!F*jt9idlSoG=8rT>r2vv&I8e<d^N{?(jYDp9-J%;cEtyNH@V
zJHl)>`^^N^z{Ugnce9s&OViJ-6IB1*_B`YA#l7Dbtgc%;UHa~&%N1F9%MQE$5RbYa
z{rmR!`Iq?TcD#OAGU4N|969br)vt+YN3Z8p&fNCV{LO_@oz+jb@ch|%^U$vU`6nWR
z{$HAJnf8HU;eKBEyt5lKIp^=5yO!zfsrtD67B<#9e!czE(Y5e1f4*NIe?W3|`t!xL
z8#WhLly=;UojXrqdFF!E2j;fewJf-E@!YwKzu7o!BO=$ow=L&5biV(?uE(AJ37UKK
zPJYi`@BZ%zH`kuP{e_$t_kXzec@dk^{cqA6e{jvrKX&gz`NzY}2R^HHM)WMbr@$kf
z(izOLi9u$P>jQ;?XZKwHcK*J)zj$%xg*okU8|t6?E=n`8ZQOmDA91MqulJ-LsxFtF
z_avEf8{$y)$QwuS9I9R#+_Bt@3WutzRNXn!T*d$U;!T6U|9)37@%(Lh;Qxhd?fW&0
z@9JEW!hf3jCG4lE@2%&N5HOntK22Tg=X#1yQ+M0OX1CC^wrlo=UkMkkZ@=E?X6Mqv
zvgM<EeI}RO|H*u9Mds7u%x_-!%Q@{`JLiULEN858o-3Sjy8Lm*zuvQZF8qD9uz>CV
zUAM(Azi@w2?_A3k^I%cr1J@hd_%4L+5=n0BTbo%t-RDAgNut^skFtZmx9cqvSue4R
z)u8C`3#lVI&vXuP-CSP6UJac)JDm3`Y|GSK*_g?xlQ#WMxnRC6PwlhezvK6RH79v)
z$W^Nrz??bD=tr74+kYtRl2}xB&5VNvvi@nGJAUr@D8}qK{c@$jhZFZ(CQ8lMZ1VB?
z`+5G#h=tkgr=Rk!|5@;!|K0D}?8zNH;y)&TEO~MNQ6OKvO;clb+&=5N>eAX>^*>KP
zd#09`)?3-j5#C~vFFR-N{#_Q<p7)&%TxJ9q$JPJ&_jGTu^?Dbd-*@|NHvhTm&bB9N
zj?X97Hxd+2o_!QO3z|IpVD$H7EV+|s#=odCd1iID+kXBzyE7l+uM}?ON!Bjgq_cbL
zKF?0piHx!ZDs{UawRoA&x!)4lpk8tKhL9agbBRoL`l=I#&HG=h&$Tg0pIjsSf$@9c
zqL5k57pL6F%Kqxfw(wtrrpy`Vq%TXIFNpIpif;NS6qWA#_=ZiaK8NlnK1q&0hmKS`
z{C0d`mp6lrf&DC}eDi`h=Bhw9ugn(`WlERkHB@kFJUYM~xqePv-2ZtkX?61xD(-wY
z5Lo)$;D}vQ;5R0|Lr&cFM!5~M`|{qgUA}1Y!hFMz?mccB<t3imeiJ?+p}dVXh3igo
zwfyXFh0kYR6f=JEEN`RjA2ZYBZ`+RAuP=X;eqy)Fjz5j9r{vdH@2+n+@L=n-`u5tS
z_CvZt+kzMAc$$88Q_j)nF*yF6_tW(=vV14wc@!4S?fk1D%D3?Vv$V}Ny~*$1y$r}T
z;F7-G5uvzVeAy;`H@#(w`Il<{ZTWYpe&@f+^4e_PH_Ue|tap08-q_-vf9K$Ic5{g~
z-ev6(DNeUn=0?8K*e1LE+QrjbOOv%3r=Pl-Tg?6W^RF;2CzgkAO*#a1#2Hqx6fgv>
z+<3JkyijS0)YI^5lNG`yMtZnt^JPqYFA?a%awqMbGRLpVp*VH6#WP_CXzJ|L)1HIu
zE|x***?(0dg<l_eoYi-iL;w8TIrq12jx4Yih@7$K`|thB^=9*~|HsFf#>3>{79IFM
zZQ*~5<GG%DFH1V;Z_GGbfBQzWT-@)+)*{PqNpdup7VUVHQq!?SI7(rcKY6odFQ_(K
z#@E@jA$HqWfgQ%5yze~@DBQTI;((gg58H?*6ZG#L=Inc8dFR#M{@lsD#&ZS!r^-J*
z{Q2P54F}|x9O}1W%jf)a#;D=Od!71&KNe=$W$f&{p{`qh@W+ZP+`bo+zVm<4C_I(9
z{f1=K5<d5n&DuA9K6#(RHTgOF!4i|I&mFQ-w;q_~_47WMs37<I%~g|1v6x9FmnOK`
zT|32cQM~`-qhD9Q%b7W}9o{{2`kVLb3>y_W<=+%Vou85N_pV{wm7fj*FZx;nJ-?J0
zDHQh3FREO(Ug6VM(|_E>5oa#^6fg2zzdl1lyRvylTA{hV!|p$y=WArL{`0$Y`N>SX
zzdh$pbssEgl9r$Rw9Pf0*>{=Xw4~1`H*_XVzPPuz)+fY3cJZ;(y)0M#d6`yyT*a6n
zHCtagh57gLW6#nOWiIszhZvZwjGbH4{rlg_M!|}Q2j*5vPr3b}-TqL!^b5hw?q_&D
ze92F52@d?mp>y~W3qvP&0LSiRhlS>nOpOlFHZx9M`SJIy$&0Jc-6OC4b9wSx$!ubz
z;jCSU|8tp}4Wel>zlX@vWVMnn-}fj8EZcAFz5j=g<m>O3qwo9Y*V^y>`uEGV@0X+N
zZ3EB$`yyuhA$o_hn~?mq|DNlnYsR`5&uG6`^5(In1N&u$?2~VUnb#iwY5aPEfkflG
zZ%m2YzhCrgmMy$^*yKl3!t<N_iNccR9i`8D%is6qUHl>z>&JhgvsyS$G3Q?;<1PMU
z8TAkN_HML4u%Bm-flI|R8=J?zf$>f}><pKW$GtV-*cxwFvj3O!m$EMwGbae&XIK9{
zefr<#npKZB{JgNI)%~CCoTTeJU-HfRtlw+<?zl?$MmFBf?vqY;{NsNzY1Zv;VOAL#
z%n^L&PjLLdIEStL(6jk1+5eR8?b-ERpiog^=fQG!mEDPAKIx6`A71_0p-?5%bJt>u
zapwl@#+!V<g%y-HJa5xozwx(5j{NLN{WF{eJrq3rOD~?`cDggoy8qpB#z>JVkqaMZ
zbj|*%(9(SIz~tl;*|J>G>b!^UEtGfr_e3u(@5kA_+%`h<7uNBwX%Uv+&gRW#%^KKo
zCz|J8xw8J1c<wXjj~!IAvatUD_R){$<>50{`Xo#LKfdm!veutB^XDjB`lPzcVwcUX
zA75VtNb8*3*LIWFrhxCGz(T`m9tPTt?aQky<O3WZ^|=YG{k&J8#nWp4p|-?h7U!Am
zmwdK6c1hj*{f*O{&u?h@{u4PhDd$(CZd<U3U$P&g*g>aSpIuMS?4N#i--eIskGoFC
z-(UPV=j@g2ClBsP*Bo5Xr!J|z$LarTfyY&>HrH+*%Sn?uk+U~zYuwG)FG8Q^Hkz$_
zc2Dfk{Q0~}pKhrAivP+GQxRW#!9YhpiQ(k&^%L$I=AK@2|Idlyk2Z$Pt+V~7DDSG_
zQO@t-+ba-lieu_&lFA)M7Qe@eQkC(01*I-EHqBrco&T<)?RsKbPRo;*qOUgxbuPGR
zvzo(2bpHc~z;`Lf{#e~-cvHMXIme{#mqB&w4fnuz7ti<J(AqcC?Z%%+?|aXr-@NCs
zu)t?sme0DTvoBxDUG_Ixp&96E{*hg-j-jph9*?ME=d=A!1%637d^zl9wyI2jr@20V
z^)t2~)jD#)Ppm?l&V8T!$?C$tgD3Uv-^a_w&ToEKS?{{*wQ{ny^Fs;$Zl+uH#UkRW
zNp%da3)cxmDn8Txa%}(MTX`=Y>-U65D7y&8aeZmtnzJtH$1~x>$KUS%`Si~!4+nY6
zm>=(-KbBteU_+F0XNGaom&r>$9yojRt|sF(Vc~|`_BEf2Gnsy!cp_Br;_jLED;z7$
z`9Db+9L=#eOuO^%H~;eE;{Rv1-*w-%^{Dh0{^bUbe*82FdEUA3(Kmg6`#Dp7HlM$@
z{Bz)w^KKK|V+@b2RcGtFz5mbKNr!LL>^t!46<2xSv72>Cb9VggKhA#Y&+m(WA0;kr
z_$z&<++e<IPkA5j*_%A8uNVo=RaaZ&++kr^S6^~6s7dnHL&GnsM?2rT{}Ef#Q6Y2i
zVr|ly9e?{%54Iadi%xp~;qla%C$<|OHGgxw9~+ze{PnL#FP>MNan1fz;I-`z6TjJ;
z1Fc+ptl#ui$h=sqer?)?e;<E0Pv&oTzy7~)>-?_V6Oz*%?C0^g6~9?_Q2WKT;==Nk
zm)p&*3nZ6rVcB%M{mj2DmlFT&W`9$W<|^=5zI9c7&RN%;doymCE&C&D7S3=xtnZ<h
zOa6i48~Ux9w{-j`Iy}l2Ug5EHsjI4)`n^?wKgFyMXw2|edmzT|7TotHm$T$Z@Wia_
ziCvO!gL<#r5ET;83^4F_U9#9!C2d=|%QYXal4-H~%kw?<sH#o#m~FI?$@NRfk!@Q#
zj=m|YJGOY6%Nxr%Ct5nDH25^WtI{&M9hK5_bj`6H8#kVL9^E*tT1(10%4Az-_<@<;
zjJ<y<bGWZO48C~d>LS7QOS@06Hs3$@eSF-h%smRL{y!5u`@ub<xh2s?XoAk`>DvxG
zu3=)mby-P#{mR4J!>7A*Pu`_AAx^#SiQ>Aycf?-Yd1;fx=4z%kKj-t*kC8`LJP399
zcks=FtKahefB3LyOV;TnJnf8c7T-N{`de)Dg21bsj`Kq}4R^Mb9OT=z>qdQj<dP+O
zbQ#qD<txtlXYu*e5{@s+*fdwwWJT2keMs2%yP~kBbcx?70cD8-*+<(POker*F10W<
zn=iNL)BRYv|L=t?g{l;;?(*q!_-o6m$v0nQ&EtD}e-=3Yt$%rC&rJ42l?21auFDG#
zhb>urbUCy1%=hQ?&v~U3_)JQWs%$P1H<{7r^`(U6)f>$t5wrdMrKg>F`0r}n(>*mU
zhn+KCxaG~{YwW7(T6+KCWyZ3PFaJHgdh+H${i4<qBUS0t>G$f-?mg+SC%jXmip9a$
z@^{|<!%r`=S_kyBw6A}#!dk`U<+k4wFY8Hu%9SXpyZrKp{+p&%pC?Z9yu!p;w(v-t
z_&jTsJ4dfho|{@Zk4q#g(otaRA-<dc9_CLKxpe%(+ULCaF@22pBd0xHDd23dCGFxO
zzvnyK<PN<~G@IKp>8a}pr=zI_2P4@INIeQYuvt$3@4|BCbMFuSZ2$37aGQm<^S#(<
z_6rT3L|xSE*s{moR&RI99E%qvn`&RR#d~;tE|hBJbJ*9KdU@yW4b}^Fv~|`7h#rZ3
zBs)WE($Oc=RNccj-2ck5>*S+Zh0|IEWB&eq5kB?6l=jMLQ@%P#Pj}y+cWl=ppDVAL
zR!s}5;bPJi&)O1K!F>MztD{eZo}^ldfBSsp<rArzX|0^QY%Hy;?Cbs)hw^C6aN4I*
zR`Bwq{+8ZD6Q7^m(Ue}e-+!jTx~J)pduMEL{`0@6yVLoGz-8B!+LO0g*<W}h-JGD~
zAjYJ>=ltFM&YvTd95QBIKmNGcD7O1|^Qn^3pTTW{4Yj`)F6j_okX3j+VCE{h`fVF@
ze((5y`eM+^s4$(7#D1sKQ?hQSB!7GH_vpp?unyrHonO^l&OUu%YyUT3(e~{dlvn!c
z+xM`n(^1UX|DfKJ^KhEMlB^=nsMs5quWbre&@1_QTa`2Qd3xZM^DgF9u56M12@7mk
z7e+~E37Gz>sQ6YqGw9r*9=7j?U&e~ATx}ekqq~`v$@_QvbFJbo`Q+^yU0alne0AS*
zpxpho{K4yr`qSIfO3%$-yOopuk>tAez>RVCazXs_^3Qyow)Of7heg-eWLo@B{584y
zPj|wJ`*p9^`c1qQv-x<_Yh%NG#&c&1{Se=KlzHu`BOh{QH~V&4R{5WM`(~A}@at(N
zHV2~nyChG}G4DKXS?GRL!{x7E#Sf0|+(6FFuKYJ9@V;|Wuspq~v6^{@aoC)x{$`vF
z+GlyP*Vmpg+3Rfb_vyvzU0;vid&_m5MdRRwhXThRJZf0??fm^W@-ediy&5?zS?t*Y
zU0GNQHyrmgQ#>iK*n0XLrkVE^6???$z27%$*#W-D4yDQd6KCG|?jmSt(y7zktaG)X
zpt}99(W=RRqF228o*Gwn&L=n_SI4FAs5*OjtFCp9&_2tRGZX|Z-LLqhym6j(o#kL-
ztH;KlHvQ?(9(*`^{<*w<LeW3t#cmV!IeZSZOIg=-;FPJaqe6nBlFYxFEfPve#<9H|
ze>U9sZs6Paa+3h(oz+dA;VKy)-@SPvaQ?8$(uHS&1m-Mw&UA9)5-<5vCam91I+YaU
zr<>ijZR4}qW%}ZTu}JvoqncMVJ{?a<pRvD^<$B%Ai)$Uq+TFLg79Ci>VZqX<+Ub#J
zrY(y3m9jPD>-58WS#CA4<ntu`fAYh3&Augy>lGup9v!?KyPs>v&Z_H8f81s{m2Rys
z43)CK>$+mX>f={;PrI31C?h*<!V5iRR+X6AOh=<9f(}3Zr*<ycc={91tzBx}OmXX+
zwj}i3dpp12*qN}{CKFy~PUiT@j$0l+c=O@K-H*RlA6_iP7yH_Qkv(40QRBg<KQ9!#
zZBIQEVBr!wc<{Q0ZF?WPS=#^2El$@D1UMYL&VJ$Y)7^i&7hef^WK>*cBkVW(&c(?#
zUtH2V*UwaLx&HYzW98?noEYQ$WmjI#k+rbx4V0hr@aq5X!OX^&E}j?v9ezCh{p8z+
zEaDGpOt))!cl`$ApTxyG>pv9#Iqr7Wn7668V|KL6afU1fr)lSG4(Q3g7FtuNzT@XJ
z4&4qt>-jq(x1RlZZ2#?Z^3FPoem?z^<!ExI@UU;?3+Jy(5*d}Jo$v08C|gvpS!tc3
zrB6fyt9rOv1?#o;qt;f=A2|~o)wFHZ%3kyB3D;;-VDLDvtY?z9Gr0H71<z+@cLT-G
zK0o^J=%UXjZS}UEw4UxZx&6Dl@}KC39U+Wjb2?)L#ELg<O41CGU8R%s`)$$1)KfC^
z)*J}4Fpq3ts@CUrI(g1LY^~ee#S>HKJo)g5$%5Nm!Tjj&+mkN$yGC^GS<A0&{nX=K
z=R}_Pr;P4vtXOBs=5qXT?ASD+Vz)v;W#yjhOP(L)dZK;d^ljJQjDE*e*)Qzymf0tg
zymL)w>-LLZnN>n#Pi;6b{RJP_&%=KgEe&v#ytjMShl-sE_6IyqmK#;PFL@|?t>yS_
z+n<a<)qJTR_(~t9rtg;M;QCPUJKX+&r`fj+H=bRSO5bN8yXwn{+dh97g|6KTEjcl#
z^3<-77Zb{NylM|yU(k^?dFATFPv_kjIi3Yf661(l^`8HN@4G3%axB*;s%ro2P!1Ax
z_^_$4z9H|@W_JmO>z~yxp5AC(_&y_Y{hm9?2E})6nk?nBmV5}k;i_CUQ{FDmgmXcP
zr*c(x>+E@-n4cWqkf~8Aa3?^h;e>mCvVzv*g>n<Z=KAcqeth=XINj}LcdMrC*s6A7
zMw({cY7?fK{qj!dmVPUmd{9O((#+EA%_p;)OJqyeJyK)*%4O+L>2yY2`N+nC<7XfJ
z>yb+Tv^ZtM){q>2i^+<|>kd_B9^A7;v(QRS!u%*-(VtDvK5c$v^KebXl)abcCY64B
z^xo#MocZmzd6TYP4rF?BA;sA1s(Q=pRg9XOa*8XRZuzSpIB+~yY|?d+<t^EFohQXD
zv}|PPujRjYQ?6**x0M=f^D>vQmu}4|d3P}0K<v}mr)ukempr;<lB=NFJN@;9L!#Fc
za-PgSJ^51!)9fW|CYKkljoN(3Hkr|K=FexJmPGiUNLb*qdGT7SB?bMboUWzr+i9ce
zzr5VzpQo|y-BqUAcMc0DbUg*@-_@?dZd%OlG}ZH=SI&mGPiLQcR$4uEUh^caY)x!>
z*pA~*Zs&fRQd1c=FW|3$?JQaIYl^Ma9jrZ%Yl@lH&$pXYY#(a%)arn2yX|GIms8}p
zuD+Y{`a@IcWLe{>rCiHRKG$vQntAA}kag~}JL;#bV(sF;OuAZiWYtUFDcg5e`)eH2
z4OsWHxA5pj;hZgpr`7G-d&lUt?LwLD9aE>@jtO7d`hJCTl*7KgHoE>ACpv`>=3UVK
zyd~kVd=U4IZ!F)kD&>0?PM`gd>2?2`t)h!#v|jgT$2PNyy}x(Sc>B-5=V^bKxQYsP
z@NwluNcr6Qp<xvMETKjH#`Mbi16;d%-~HN~IOVuloW-HfwcxuQb`~sQ&7WfBQOiDm
za#6nI9TP#Jo!*<ylrZo0>dby)6VYZ-Gb3f@%ccOY7-0jwyV>`aEtOpESo5VtX7l;n
ztf_HpZi&r`5uCkcLG+og(#G~OcNR0JSlG$Q#m|k);%EQ9=M?|mvNAnY_J;XQevA(!
z_gMXKwQf6gm!DB{!aS*m>v~o@-?KWR?DlhxIcMvJXOmfs4=C?jblfE(#(&8j*+qBM
z!%qhG#nhi!W1IS8*<FP@;R=zd&vu?;@VK{Rr;VV0y0vwhy4oUx9xj&x{~Hb;rduW)
zmWrCD8KRrRl%@7&`i#r7<j<?~@Hn1|-8|#?s<em?=NCu3Es9&?;C6Wudx7@lnn(OU
zzV6U{&AB$#<9C*tspgj)mb^bpPfyu#;_L#|D;KtSx%BEVzl+mpan;+w&~nT2q|CL_
z3sWXdWNqWoov&a~k{;>*qRN@^T-vmnHO~6~OZZpLpR;Yc{O5DRMS4FnBL!Jxk3H-<
zn73}3)4ZN{mnSl+PMwt#D_Cl@W1(5c(v4@Ia#o(w4YXENS*g6phr@gc^TaJN#j`6E
zb3a{PXzz1EHt|b~+d{5Nx4jzEW&U5^pZv+_m6l-<i^}>V4>mF6JbgP&v0t&cpxS`f
zM#RpK?fbzJqoYEKA5NS-Ws?5vo@`-Dvxa2se4c#_%FoS=7~RqWr}H?(*$C{v^LYEo
ziOZJG-RH}`V}iatUwizz<IO)yC3xN9*#ZrsbfV{7PT178qqfkl<=w&DABl@AEB?GT
zjqJEF_r*H?hg$l{!eLyGoYG%^jK0Zgz_qgewCC^S>g`AOs#|wPtu)J;8L87G*1TYv
z&6G2#?GY~{mn2MF!E8B0y~`@)`T`q9Q3DrWwJRGuZZx@kxUqrtV~yh?@x1e&)DGWa
zjr#Fhwu<%j_vqdG@8A0S_gbEz<Nf@%|LU^8e~;e%IC}SC#1S|Vq5mNFBAYE(VWD>G
zH~3oQrTs|_`WtL3r2EZhJy^d!{m0c_-!Jzyu9fs2)B9yy{p=dQ(?#d_y9|A=+25JQ
zwDjb@fF6Bw?U0X%?zef{q~3(jiSF{cKWY7eo|~t1-$b_8F?*(7zrIu3z&_to!6H<^
z=TB~$j))KI=G(fDGA`%e%X*X%`fvlQGo$GYZh<pD)_VK$yw&32ljMFZwM^b-{*`yd
zE}I?C2FMD`)e_K66;O+{wpU?SE=ed^oe**8=L?ZSi!ZaC&%S&S>X@P3@6x1TX}6GZ
zac;=L7ad|NuWFy|@Z9g!AMk>~aCJk8t3!v(Lq3i<i!K~|@WH-a#gEBv3!g%I(DM1y
z7R+C#_`ZFK#*30GVx?CmmAeG3D6x9gVP*7G)-i6epM7kg{j@#ulS)=x4)nh=QTIJZ
z5R>VzmlBKWZiyPRct%;t&Ro<dQ|a!Rw7@SuG;2F+!UuEZ?`nI>_LZ*lzpL?Kzid_W
z%L}KyPhPs^SK9xMA>?JkqRh_=9t3<dT*9~H(f;J_(ue;Z=37;)`cimW>%q<a`xibg
zvHhg1zxec&70-)#UG8edUdTGR&(zy3y1(x0zb_H&u2YpVwl3AU<th^U>*~j&^{*Ce
z_%Z+RIo0x=Gt6ok%D75@tu&exEwgoc?QLD%{t));M*=JCZfHEZJUe3H$74Ny@l0Rc
zb-PyWOL*_H+;}3F&lAU^HzodE^5Wa^f<bVF$Bn=zL9*-Rb~P@)Jki6wEGcgB@>d&E
ze?D05w)CdfZ%N%>qPDS1nHQYel6zaH>!wBX4ZXGZL|khY1v9(*FNwBpOHsHrP2|wN
zX=-mex8%8N9l0fYQ|rVzm6r+|SE;c|H0(O`?#(l+Irm$hL<GBeMP5^3J}h$ST4RXn
z?@w+K52G(@tV;T18T>Me-D|3m-!;B^H#@mk89U;p3eUOW-*oQF6F+|iKAm7!hH2N6
z-9FFc<7%|coteujqB?)JYvGqTX7)KVh1Ym2m+DZR%=_fUGCmRG&);^;nRDg;)vU`R
zTW4NZ-{LmW@9?w@4^0FnUpag=EBr<AY_89NLY^B%kIl=!=5$#oC^9F~UvNfRv`yWb
z%E?pwFJwhOsofsRv+7C3KEM8H4(l(T$W30IBpu1p{*FDHQSjzVzuiI}mZ#1zH0s9c
zDkv?!rkAzzQTd|)xg~cp5(RGTnvi|!X>(A%dwbO1PM@gV5)2x3)13vo17^)%e0jgF
z!3UkyN)=8)zqeEg-7K_iw4UM7{bj<GuzaRvX2RW`C$_(|R9pKlC$PNff`GHk9Ft40
zw6lXeT!OT>+;|6BO>t=1jScy4)=hL-Ve3(*R2}<cd-V;K#k<q8HT>q@sDArC_U>=R
zCfT*&>&t6)9c5b?{pED?f#z9$IG0o0SQ_1&cg-VOBhRAlf3AV-bg9^Ev+{jajrOzd
zy?t_Q`HieSKaXFU@~%Vb*nZP*5})dp@;b3v-7&keylWZ9F`;#8?xou`UfQSlq3lP#
zGShU+M}Z%KPka}s-x18Mdh=^>#;>k@7dQ6SpD({~!+J*BMCnD$<xl$d`|bacB44rj
zBwyGjX_+78-#7GDZk}$o|HQLby!p*j``+zkk3Co${N}~9dB=i_jb-f)?Z5Er-mUxl
z{{Qj*6Yy+@oFDtkQ-|f=ZLO{^wpD3-9^s*TslBoOR$ue~+{g39e%|i;Z`vdFZD-H^
znSFORu9<e(=)?20<J+w2osVtmnDY0GBELAkl@-TuudKMRx~|rvy#TT`S)n6w>;8S;
z?<jJl*dN-|pnRrVr}ZdXWeL)S_KKRSd%o{k(RgC}UpJjt=V!AwntzG?^FiUm9#5sM
z$qQ{b4zo>k5b4#?XE`b4tT6xZ-tJ$*-&fbOe>I=|`2zR1_j^3A^ej^knDOQS@7~_C
zu`ctzI<J|u-|5qrV{CQnU;4M*+rIgB@7IrC<o{(nS(m@>MgHvBFOJJ!|8&27^UE*S
zxUZT2{`20G^}>ncOl9zW$!A#;h57IKelh(w?Vxqp{~2r&AI|VPy{{0;P1&+*vt-!Z
zg3m5k_a#3{`6NU1RrM+>S9Y?0mD`lHIq}!u?_XIYesLb0|3WnCex&>ENUnevuI8UL
zX8AeYd6e>FL+8KQO^fcfF1D-T+FRrF#9SxjdBCo9mDaq+9;!bszAQa4s_e;kf&YdF
z(oPyCINa!Jw(c^k$vI4obrnX}h+9{&(~WNxL$>dMS1r5u7;yU@PyS`T&B^)u>h?pD
zf6AqMmtEFBF<)hwN<m|HTBEpYK<+Q?*e*lo<7xYLdaJ!~-DMygrn2)UbW`$KAL*Tm
zCA>*u#bSxAZ-Qq<*v{;C`|)zhdBx+^+P6*_-CB3j$n$2c(F^Hl^T|IY{y)zD>$p+n
zhS}sR7F-zD(u;T^T}vOYc({;zt*PCagc&E)j6YXC)@5tbTmCuW!NmQX%BFU~EHkJ4
zdTt-Q(djzhwA0dYpC8_nzw`a~H8nv={SWGoUtZXMbg|4ok8|l}`uAn`@7-m0cmJQ%
z;$mU*&Byk*wP-ud+0J+FUVQAFxl7(3bp6h3;VHb{zV830dpqZbD=qt*cl?dxzgNo4
zak_qLKbeFiuTyw2{g-WGpbg1&WUr|>v6tg!#(oW+EDw*H9&W|mJ(t36ofE4|=gvM9
zVz%&6M8dCb<L!I*dS6V9uhFvmEa@Gs6rq3JyIAJ@2j+PzcNph5_?TV0zWrKe*AM7s
z<hre(&B**27@Ltdbc(T7G@1A4K6EzlIKHuLS(l9QkM4iBjyV^boit~ZFOXOFT52ib
z+qrgI*!&cMSNt;$9kfw#i??E_y(kc%D6PM+^qN=S*~?#>E-1a9(0D-KXAk=pd6svN
z+cFsnF3kC0$nnZ_fq3eYDQ$g;>Pl}pJEk`%^>Ix6dg|r#ukSt2y!g)9cD$CKIk1Y)
z`Hiwfs{R87oh={KFSEG_UVv^!KE{0K>LuuAWG4309l4C0Z@%BScYImxoyxQ=M|pPc
zjLzZT?|XKJ?a7x1uUiwik$&2ohEIcYMTJE4#7K_=x_#RbD=IoXtB7AwQK0_eR)SS^
zOSk^A>px_ZA1};VZnVvA4F`|)8n$Tx?njL(HQ$LYc9~i7??}z$!@GAMtNHv%)o_1u
zf8Wof+qb@cPw33cKYXY;e}yrl@~!3dm+WVl`m%SIy;nayUDh(AkuUy}z(4M`Mw1hB
z^|vOTx%sK%#la@siB-IY>5F+c8N_^2OiWu~T*v7WFXZI+=o;^qzUu++G=ys$rYM&p
zZlagan|J@l$)8wmqAz&Y>Bx}2B<#xm$QSl@Ra=+bd&#q4dc>Az`*Yto@~{8<QMSv!
z0kWjxMP#zj3-v7ro-ubG{wlrwvgelC*L{C4K3;ucZp-b3;y<?U?x^|az_UEu{PIPE
ze=1-8Kiq3H_on$B<7FZ@9zU(x)+`Xspeg@UQuw2Vu(8PE_daXhi(H9a^!f#tp<Vr_
z?Y<F)LB_Y#S9@r$V?4L>9`~_#QrSy$p0z25xu*o$CY4Lav>lM%S+KVB(Zs_)O>Z2(
zUBz)n@~7(i!WBCrB5e|cMgPd@6rB)%|4^oi2K$ehcc{KTt6Y|m(R_P{tyzP6Q^lLj
z;g_F87I<FraF+TRp)KqZZ*#2sb@=`28w`?s@6+No?caTjrA?(~!|6=h<Vj!4k5>df
zXLej*E##(p@%G7vBc^qyWcSywPFxSaetv>=_s_1jO_R(!vc<|jGi^C-|G#rm*n{^+
zY<=gwynOz}nmr2TyIGSr-P!OWXTeF6LqR!ql4gN9M!U+_*)L3umeMyD3b8lkSaEDM
z+k(uTeK`~6ew{Bhdv<G~hqYh8!3#^uN<Zno`@Nja?LjMZ`Lo=Byu<SUIOOvdxSx?T
zG(K>7|6D;o*PF^4c)W!fRP-DaH6xlezo<DY2xN4#8_$&5zke><-d}$-PT!i}Q4@be
z%}CoVxco=_!((Y_XTAp4Pdar>cazvhle~o!{(Rq<{~*5hhdx91;=~_kC7k!?FX1xg
ztQP&^`K@4$S->r}Z~D!DGY+fYX06!pv5D`X!ui_mvn3XM5NmY5(euY_{*lR2)2^BS
zt9+Au(Cg{3`5&jGzJJcfxsS_H#B`hQp+gH3&U~CRp|PR<e~k8N0S?0_SA9IboOza4
z7<Ou>>XF#_ehJfly*?T9cAfs?5Hn?tmgSpfE{(5Q*7LPGaN>Jc*L~umKjT84R0mGn
zKW{~Pd`Qc+g<4Z)tX^TT{QKl<i?y$9ls<Df!|L0@3yEcae^<@%+I;TL3hkUk`M-|u
zUe(QDi}$z~Y2V_Ta!29XO!Iqtt#`G0r|B<ee{p0l=XL?J|9cqTvL|n`FKEAaL;gWL
zTbzWFO|jg(kIPo*E4DE=yi8s{ZRftQpHH2?ueNu|ckiFfxzf3;U{ihNP5Tq+L433M
z&qh}~xqn!*Z0_uL3oQR%y79Qq=k<h_mkp{_R!)2I-(k|~ow@l-o7>D9o<5p<;%sJt
zdd@%39nbV1on2ksAJ@Qpk~bh#Zj*G{!4k0_a&dF}ITooOywU4yIhkX((2Tbm>=})i
zs`GAqlG@#W=-WokpB<JW6OHDZ_fOz_$f}rkdanET%MChQr`B93G&y><O5jlAt5ZKt
z8ZNoZ*SdBxTjKi*{L1x3;>PBGp50@W+nYA&hwTO-znVKzI+AZhTojA)4J+>V?g^;Z
zHL#avpZ(&&n?KvTAJ4xZo4CyA?X0;A51s#al2fTSPRZg}$;a0h7n=D^666z>u6Q8+
z=%Qn?PEUdp6aV>71$GOJj>z^Z1U#=+JTb8(tCja~O5r^AFpuRmJ*@tDr#3bVpWA3Z
z>yM_0^35~M?mWvi<{a~3y3_dd=ZuomGpqDxS0q06KPE7J|33HQH;YzYKXGuc`Hv<?
zS%0Ijiq?PE6_0)8x^eoJnbqxWoj#wZ-mJR%YSHunE0NrovwL-0?Em-w?6BF^`7hj-
zLHu60{1oof-4YI;4A~OPc<uzgeTLY&D?Ztqjo(&-zq{_^;<pFp%)H$uSfT8^{rJ?5
z3sXy)zA4%tl65#UMJFpNU095Z(_?b$L%w##6&16lc#AJ<_qZu{>dOy*(U-*q{~C2Z
zJW(pR^=tR(#ghx>F4<hE7k9Mq^OY86g@144?CpXk7yMS<vn==v>yrz|UtXQPzvPJV
z-WVPIIp=HpzK6z$+%`HB{LjQvV9M_gRdu{y(%v6F*K2(!?Za~Z&EXo~bxzs--YF>k
z%ltA&^prnu=l#^V{Z8{r`dQKRvsd5Q+TMLUdHU4|F^hxt9PO=>SPM3m&QDaGa>-@C
zOrCvnZ{3XtSLgiu`RB)(1Pk7~4GNu=%R_i?35xK}-^ut-PJ3dBOi9-JdGFOj3m5(c
z-E*@<ORVu&$maLTx1;u#^BmsOrYv}8HOm9p;JGsI_CE4fSstoz{K@2Gy-t~TtTEmy
z%MVW|{(1Z9!K+6(gGFprpHG``c=2<UvOHl&@$6;Yn}bVO&!uj53GS}Wz4$4k>09J1
zgDKh;juO{bv(IXfIaHXPQOuh=!RhRx?waqc!I!;GUlHe2{O<kn$Z`GZ0?W{!%T$&G
z-JDgPDjD82iF?s|=l&^y=~|iFqqv!tg>Tkmem2!xoFOmyzy=nLq<<xI(!HNedZYaL
z-K5M?SCdPtJ-(#5K0K!Q?krzg^7*-rN2g@pGx-w6J+b<`UQBYa`RC<q{E4?Cbe$gB
z$~RniqGS@@J)ypl{aKXF@c@^G?!bcI2Z9ry+~0psRbpf4X@@84*E_$zHn(3%r0>r9
zr>9+SIX(Pna^*w*r$Y*D_i`<M%?g@)^~Q6}<$ufbx!g8Ck>h<l+u1)&D#QBUW8HrT
z*B$xyQ+moYhgDezQ=$!ecd+ubZ2WtXZDWg>_HCn^+k8Bu(@LZBZ*IHCb?eYCqs}d-
zqH9j~iT-Tf7IEc2_np2)5BfA-bskBU@_qlu@$c#o5r)*)^LK{YZCAT<$JER;l;_3H
zrY^?nwev(B-x+w${&`XMeA(;x_De}2mJ&Q^zl-<hZ|juJ%qhydadKL$=L>`FH}y?g
zVnjKrEY>q!ES7cR=6@(9^jGJqVfXLbcYLM9Pw)6tq8WQ9<gy&YVwHUUKm4=x);(Tn
z5vx|d>(=R+dg}^V#G)=*{E|0~WjbzUpD5%TJ5TRj=+a-8k8Tw{7@>Qk^Z(+o={ji>
zd}kiviP|}Hvhnr*T)&s8cWin2N%{Jv{OP*2503x$e=3yVI$h>(@EO<B#j6XW|HsVZ
z?h#{I`{uY-W7t=VqZ1Am{;o5>_1)yy`^=vEmnHTuH>~qd{v%&vF17tu%*(z_myY@U
z6Pn;{@b8=lgIVrDy{Sw4xaT%mrLD>kGh5`{YQ@SB9n|nPt6>h)Jx+&B?fVT5<vmqC
z8ttm$Kb5P{IPA%zfa<FXI;txcS)T8?*m`hVZ<a*rJ5gIzrffaVHIclF*Rq5~e4b}I
zQ~Y>#sPap#hobicPDniMKAanBcS)O@>tgU8tt&mB)g6D=XA3?kx_jdN*M|Mqng9LU
zyhpz7@BJ%NBE94<{n|e*Sz2~?!2j)6vn21o{=e=~dg|Bu#-;nF|NR^H?R)jj`|nfh
z_fy3A@*JBf&rjE%pZ<TI{(sx}f7Sc`eBZQxsh0fx)Bo!9fA8*z+c*7h?WaxqkA3@o
zYybW1|8}`=@1Fyogb?s!``1(FuKznaAG{3h^3{J^t(WE2uK&9`D)H=<f4%J)Pinuq
zWq7c2CCP=<?0PI2*FJOO#PzSYD%Bp-oc`M1HMEHR`@c0mw_0xgv^C}7<JUh+H*(f3
zjH!?im5U2q8dJY2RAKtUMSih&w)W;!$U1Jk7<1CQbyaEi)#o~A=D(ES`xeUQSEtDO
zv&d@gk!$%IH{9cUHkq@d;MA%guU|g!-WjoG!J`|WGN(@crgQmL)|<KW8=Lmcdh$~D
zdR}wN=eL_rersiCyw~ujocY_geO0#?zdW2aGtIGc!_&(-*%$8|JNNbC)2lCUJ`7|%
zJLSsk<C6babdDD^>_09Qwr1|ajQRY1x7S*0glCnogzlJTuhe&~qhy2js$(A=<~JN>
zHBF!9AMM?}O>bH6@dq`xLT*F_%+CJVvaOWEbfZZt)Az2)5*6ho!Q$WQr)EcMUzWJ8
zd`&wf*jIVlq9;ZTLK8QAT9o>V<>{^~E1joFmB#A6+OVhQ`?JGGpN3Af(JM9otnlPa
zOn&H{o0k`zJ+@^o<ZSFGPkE-Bt!oh!Rlh#NEIRj=k8`(~&ei*K<L69W*6S}_7IXUY
zwWuq00coDWrzMP{6+-*|f1fCoJ0UT6S#F^91K}VMwPn*jCMP-md-p2o|KFvTs=6Pn
zc&ID<+UKQk%;gO=iJ4iFR%$E0_P75I|Lyf<;u;^566Nq9|Nkd-OLY$)WqJDV<D(y|
zj?7EqI(=mAnF7PDI^vt%b*BG4e1A#@w@vwv2sOWiHBYpg!{c=pILK^on9F+Y(r)fl
zH5RRHKW#J&Jf~;|&R5I(Xv57Dvq9zjRTsr=HffhVPdqel{Q8llrQo%B)PvT5V^+Tl
zLf3Y4CM)*%1?>@9wLy40gUrK<=oK-`>q`Iao0gmO@S{a|as3RYXEpjO_FCD;pLW|A
zHRag+)ib}RuULO5sLGh%^~$<4hqrH8BgV}=x7c)f|3YKF2M3-pd@wF#J*}d@>djTp
zYes2n&iy}sZ@=EQUghpZAO3s`R(Q4b);IC^ii=nK?wsB@H}k#coSfS;@6}$qDHXLS
zw@f9_*{jgzuI2mUd!L*c_cW+5Fp8*JXJ(&$6`{ltBFfde%4uPj--nYoV=Sv#iaXiv
zrRP65);)DcLg%!{!cW#S<rgTgKEcrYV2iedvr+w|7vDl&e9z$87IF8N2$##_Wi!?`
z+rF-wIU_9p&`P#NTinB#WX+9pW#0rgoO|Z9e9QY#CRy{#xw1N54eQRe`ehogX0cjV
z7s$R?U_o}lLSc!+-VJ@LjjuSSAGq*U?VZFStD*;6S)?Bc9eA9@RJy|0;ehh2LOH90
zVas^#vIhs2Zn3I)v4&&UmOmj}a}u5hvipUu-^y!O@O4JXg0;^UM$dH3$bQ>hW-Zvv
z$p2>Q%*t)o?xmFnZE%!4+q~C^`P{Wl`(L~5ddXwI+p)1-yi{d%ap$y9-t^FmWk;S)
za;-i5>dCcD)0GPy4?HV8xyUcRbi>v^-zM^?&9<NJEmrzsRdMGueLJCs1!5m|EZJ+6
zeEwR|CU<Ki#@UBe7o7_5W{5uR#%k`hrsd-fmyo`dReCG4Z_eHL=&nG)$x~}q?z-kC
znf-*9ar&BfGU3^adqTguP4lj3^<Usr*1>x~+o0T8$j1K5G4rFB%(RW|U)5aZ?Fx(e
zQ+3h0y4dRcwEfN6Cz<~*bN74Dd^2U&`j}PjqVsoLSjA*llg!V-^&^3KS9#UH{gQLI
zemK}=2i*$jy3k~Hj(zjOE`jTITMj;D<(O!dDmkTVo$4JH$rIfFVr{0p)yd$=d~k59
zO0LE%;m3(tj~gdsO!ZYLNSn?k))BK<woxYLkk(_VRb~}u&iUVy+4uVB)eYNRR`-~A
z|8WbCyXbyRu;aLD!r|@N2NySAzy9#z)0g&}-JN6X#Vjl`kFeiju$L$-TO{4?^6c03
z4hz5TMukOM-rf$AvlZNVy#LI3t{&w1N$<l$KGp|fXK$CidB?M;U|s$B7(WZg^wfPD
z+3ufX+xX%1$J_hGH|i+-^j7)zeBl<O-%A%REk3YQz{P!!zKntAvdMApj&J^XOTF;=
zW>3NUQ+K|Q5{uua(lOC<%EwF*nVKmvI!=FIOZUjm4SYX~rR_sO%*@5>4_*z*c~n>b
z`QMW_2CID3r&%b;_;+**Jd8_Wef{B>^2KXD$*Jl_yt?z5<}jR@laTeLNuSxW_TJ;P
zielb7`?!T>R!ihaY2P-Gu32wU;jZZv?Aqe-=fsKGT?SD%m)(3&ed*v*spKbpOSKsI
zm0e=*$Q%h1mss`mK*M701J^@RJd5SL*X6B#l5M-zt!ILi_pIW`qSS5i&Gk$Sa+f5O
zMW>mBMi!;+JFslpb`>$LX-eKvpCgJ=Zzo-T;-8@I=FzLVwo)f^-J26@PKKtvdT_nR
zFeuT}d!p*usg`oHquM13)J(p*<t2Q%qkltT(u@1kFYx4Zdqyxc&TW2ms$|NtX?;we
zCNId+T9m~V@bqQw1EU8Mk}mEw{8Xhe!RfUQ>$wUwxAUjl&wJD;G8A51ojj}iUDqp#
zPj{_&ySn(B&l;{)3em{0i4nWYf3@&ob>;z=B|CO}UYDI((7A+<f2nJ)bLo^FUfp+J
z2uzvtP$Wpx^J!*_P##xy-m66_KQA3SBE9(H8}Ezm$+NiS=W8mjC|$tJZYCUD+dA`*
zXqxUWRjuS3k9K9e>GKQ-j7wZr(Hhx(e9nqThe9LX^oc%RwC&KDo!V!jEP`AmRrmd7
ztvM~Bn$~*uphs$>W9bJ|wv#TWoYUq$Ji<9=BGVBb`@PmZjB0cD+U&7t?2h{q(pYxa
zb=%guXmg&;?4i59{p66CP^ZWl+q(PLqU?laS62zW3ggS#%&=9n?belsU9qZHa@n#9
z)b`gFOYYvFbYZ>Wl_?M2w3M%6VJiRjspa9B7nfZte2O*%sYHpI|E>IciOXOEgLCBO
zEMeXm+Z_0xtlZnRE5AGRbG>H<?{B`~1Hx=~pDS`~Jg{S~v9w>H$D!(#w<jK+u+8CU
zG|LYw{tE8A%|{MQF8-NuKGE{Bm_}x0#-rvK(G01Wj0bkkOujOACNR1#h|zVLp*G(@
zcbdV&7N<iEN~gAN;Ly<3Yi@jbKqRS8qNn<u8~^r$lJj<&=|3|G6l-<eknwrLirZ;j
ztsR$Le)5Vv+`=a>)!o>3JhQaXx`y%47G66IGj9pG<)QkgZmG?`{Na;VcZRpB<i(r^
zGs0U>t`bkr?QU=2-S}FN$w_W?+^nrTrJH%Tmn0|b&<WdXkX^iV4{!NG;Y|e=J|+A$
zf*w1B?y-DNjrzIAh)+27TO14HyL}1H3!+*YIu5&R-z@&n;N7`|?XxuvZ1{xlE{<!_
ziFui~U79DdLS`F_<gux5)OJk1ne}ziTO%tIzeRZ>l5491uRYA;Hrw%2$fjjY*j|Iz
z1>4!A??h=@#H6i`n^XEDNN!IXPo_|r@OdM%Ll;#4&u}Q&Un01HwXMnX0N<ZLw;!EP
z?qAV&;5T&p^TlY{i$^b%GCugWWi$$!7}a!2qzS~nifJ+YX~z6UgVVxhUk=wH2C;=a
z_tO&8XC!*d#T%V0*${Z+JG<+-GfO&NpRKyE$Njb%$IBh;_x7Bu3~+p0lDB@5-QuVZ
z_8;b7<NL8+*rM)6gmTO6lfPyt73GDz-g@iKBi=MU8;R>TLu7hBzR)q4am0O#r`wYM
zXML;|g@|?TaGqGMz4y%2+MkcUB($Ge_(m$=Kv%i!bM{HomAs~JJ=yYY_RF<8d<<XI
zlGvD787dMr?HkhOKiPE3=|Ymig_)a=ywr|2-teKkNNtytTurxp4foD>n|^GW-ot;-
zr)*Q(f?Iny-khpZ&JRz!_)<r5ZdFU)%5J{<9i3}^CinYQ1!jA`c<^=0<nY3&7anGx
zSup$g?$b&sdXfvxTsyAzOnK(MAj7n~D@;s2d*=@aiJyMwRM)8S{rJ(KZ+%_%4gc(#
zsnb(<mH$1xm}Bu(&G|dG`q41Q-3KBjY_D2;Q@lxhTZh<X<6nylK4{)9^ie#w_!i@H
z_prS;D!+gGbLqv!h6I+SFSk9jbo^{-zR2&4<y?XDhppw6jJV%Noq9j3wfwE+`y^k5
z`uVDr+t+>2yTKWJ?Ud)eyfc;7R?{{1T=%(etQ6bv=bq4?dt!g?J^WMmhkJEN{*5rd
z&kqe%k|xPUw<%uJ&iE9Xd$djb?ic2h??h6Klb&{@&JbdFlw!%l!^Q9+sjIHzbBgQ9
z@=XR2K@uM8jHmH%85B%j_4h)?hLe{!8Qc((*x;5iCE&x9ekU_l#?<8kcP2(3<vH=S
zGNt<Wze$bJtSNho`*m1Vt*lN?NXt0C=vbz+m`LX~zsu(&cloR>W}Do)R5e{Ec>cyI
z{&r@r=2;TQj4XSuh9&3(cW?Z1&T13On==o!gXgcG(l22&VTMtn?~PMeQnh=Nr|W1K
zZS387O6y?gs^zj;F{z?EPtDPOY8W0_6|=N--$c~~KKGczBY(v#tywdn)kW)A<7%DU
zbwT!7C!3UnAI@0)Mkr=!-Jy*q_lKP=n0of1*2)$AJ5F7Dq;>ajj}B+*Be@@^u07M9
zE8L=^6J*IZC-rsFv}-55#3W`)9N!aq{kiT}V=h+K)p1XBy|vye-&^(i<FtE~E^STM
zWJ3SO#?Ie*g`aWL0*_S7g0R@xn@#%MHf=a_@s6~rN%>O^OV(pq1rpw_#rZEX-&Jia
zjO03Z`Hu9ho~42lr?IB4dv@=_wL7Mdz9{XUciio)jr7dd;cbV$m|I?6zbM{3-2Crn
zkvGpyExSK&b)va^#;<7A<@-bD)J3}r=B>^7^|o?WL3Zh7`*6`b+Y4W|d;8VTHvX$6
zm0ewW+1@`fcYWTk=dV`3WuNuW@8rw(BFp!$TNF|jX7=}MrB`Zt>gD+Pt3%4B+5FWp
zSfim;x=+p0$|!OE?UNzV0WKZ!dlp_icQsF8O=QBE?M>WeVS6|Fq%=;k_Uz?Za?az=
zB<Tb0p81h%S$d`C)<m6Y=aJLOC|IvxZloHZlD_cxn_B6m#ur|w=p0h)<&F8kVsbh6
zqln4p8Md5fZ4?$19DH(wP4}mWkILt1<<C@a#d|5NNM8KucyCwC%Xw=)7WMyQ;CsC#
zYub!$+LouYLp0cT`0z_cdUfXi^YeXo>g?T>(%kF~XAhs!(p>&i+HU8Iup1wgEvGM1
zUG=~D|LeO3uQ$9&^I!K*)a>^QvDJdL7T@!Ylf++b?f<K}t95^3n^9**MNst5O)HCb
zl>c;Wna#>;__DFM_ef00*5EIPx14|EcF->MJLk9Z2IiC#{L+<6%Ku$Ix%+am%I};5
zyAqf1tnXgDJ$?G}^!NPw{`coiefj9_!=F!Y{x;Y5Kj-aSSoi7tW$u3;n)Ez4^4E1<
zi&=T>y_@1;);4QN|K{qH2UjPHB-hV-Huub-s-m*Wf2#%g9TQqr%abJ5$30Y?-lBTB
zOojW&P1U2E(c#ZzBz(A<s~_II<9BiP>FEqy><pV34rm`%%C_Tfn8|qHMvrsFC-0PA
zAzSt-0h`kfJBd%bwI|gzPgCS-ke&6^uZJc(a>Z3ty;t1qzA<sJx6}1UxqFvheER;l
z!HGMMCCnC;c<w0TU4CiDr}9jRmf~xNW2=|{Nihz)o#wf4!GY;V9rd@Zjh)_jG;p`~
z<gmvIlUmm+Huv9Sn!%r-8qQmhy;HMUZ<U9wxXn}nM!k~UZEwD^uV#q#W{Zsqj^bNz
z>Q2$Z*H5^@(-X5#CoDEys68`0&-InO!V0aGHh&N51*}t!6<xBb*!03jq1gWnj$xi}
zUp(4V#v@rGGkL2?30K*h_Ct$a%rN?}Xw#{w4aZL(|G^y7=GSdrES7tG(joV5rEn(s
za1m$E7hAp*i5b0=JNS`jN}JEw*aNMPpS;k$c4}jseR#o@jURVtez-Ap``=5u7C(HH
z7Vq_E&t3PgeSz~=Y!}!P-1_i%$@Hy1jUJ2CDKY=wu<>)z#N8d9t5&$=>-RL*-+%C|
zr)jqu)6rwo+9K8~*xa8d9<sOTLrt`p@84B2f;+64=k)A-B;;7+^7CEpL@q9df>!%E
ztxNwtZJZ$MH?8<#)={@j3r;Ybg*{B(x^&|O@2@(>1|H1|y1RT#t-QrpZq8Iq-yM7C
zT$Z=<Ov^AAQ?}-r*KKn$6^z|YS9x$Rs<sSY(|yNiTjWJf#`N=>ABt?c@{qy)-HavK
zGo{OOW{b|{D=^HOZX@x)U2n3E_N5c4w_|=3?O>T5cCt98?v3%u_`|)m&kCPf>P8yx
z`_?>>*)ybjk7l>kIgzriYm>UpEsWCCGUnV=@i^zBDpzOMyM=M*G`YK6&K$cs(ZrQ|
zJI`hQ05&b%?MEz+_rzQ<zjx#4u3taWcGth|$-k3pFR_D>>(2Q&j+KS$_h`=63^{pW
zff?)k{GyrjTz1aQ$)4H78?%1Nx!KDk9)wS4ZZ?RH(X)PfS|sCv@p+N7pj4^6x#}y7
zr@qwfK4Fw9S<z7(y5)+%!?f0SBH2ZP)m{nDCsjX+>tJhauXelMXzz46T6|mFQVY=?
z-B*lPZLocOudBWHgLd@^j{C}!C&xXstEsIlsw=Cgyj1=5-<uWRpM7{FKV|({HCy>-
zcTMd-2Tu7d)y3#k>LB#)yYshowd-C#o*dr(K0f~3%U=Z+E&C3uoPT%a{FF`w+x=(e
zGG*x;+bLG^kj;9oTIuJRtN+)&547<%Y1zp!ZHvX#d_H>z7XI=hSKT#rFBd)G+Yw?t
z(fZM)wN7^P`cJXt=*)T4vH$yotnQ^e4*yguCskFPQ?1;+v7ky>(5TGwc7Ofxc`7{9
z?rhvH&Hda|NHIu1^V`SuFDA>JnWOzH=G^p*-`uyv?mSe8KKpX!H>by9&A%E$7JIF-
z`^bE{Q>kKB$~@64OE#|VNjP&x_lUpH8e>I8EsbL5&7PI3wpfWgu;EV)d@Hp(aN@W4
zBRfSO))Xx}e*TYE(2^d}XjiS>TH@#O)DJC^O=OfRYHH^ayVEVOq$qS-fk^yuy(^ne
zK3$Vkkgw;xrD@i7=9-eKWyiOc=6#H`xZbaQRl0C#Rg_xC>4Pnm%{NnKrQdrc*jn&%
z@%H?<G(p!wgAG3x7#Z4Y?LM+WM*E`GlZ}$sT}<{z3ty};65P)&9B9jXVRGk>6s5ZB
zYDv2fc`p#1+3`o=o<;FYmB&->uKO@4-BnG=JW*`r4@J)zsoS;p+zXx9dE)#RiS$C_
z{qn*SrFp$ityD|(7B>>KJ{`2pdv?d4Ps^6<%Zj>JqA0v^v(9w)OyP;~Y*Vi!rk-Aq
z7N#nF|EGnIOWo7ppeobopCySPH5a4qxjeBldoah=Oz>>}DVHa2@60s0nUFBi=<P$X
zs``q$$e482+eJlJz3;6*vM0s*%*`1$H(J=Itvy?=U#<TC`6hRv+T}NQc|OYa<F3x@
z{&h!;H?I5g=Ec|F_xm>lSBdYRC;PYN-!~rZRnIe--t1ugQd(J5cyo6}?T_=qaq>%!
zzMMVz^NM9$o{!EZ@BCL_*6=EH@yQEIgJ;=?>y~6rdvQsmtn!as^i#nl#k*wA%t^fR
z@Pz!CqR7)X{TkILXBl}F9FjIV^KfV6B6q__AMR*fT)b8J&8O*yPcNR|fB#?XLhp$4
z<>$84TYt!}xDvC=xtU}3oR}K|)6_k<*EYWB?22XNyV>%$^T$eW;e=1`PK3((#Lb_4
ze$xZKl^5g>IVp0_d>VUdwZ&B{?yj^aIiX?&%Hmeh)74s@#8yRJV_m+>L|o<lzY9W2
zvtD1)nXpGX>#BR%b=}A~lY6rJvfjN;O`I`XW7Cn847Xp`m%dc2G{3iM-`!&elEPEv
zK82VHRi54%y>8QspYwWlIo)m96+89k@xv!yZQ1#fF{I$peZQ6GS62jVU%iRt=j0=2
zgBCwo`tbPm>p!omxTv|;zxZyim~P|1c%(@Ddu3$Z@p9Ggm6KnWH(s%PUm?9$XSwp8
z58s70oqlvm&qAiR>daw<iLoD!ot(Mv#)ciyQYy<ks?RVhPK<r;m1QGVuG~09@ckyO
z{)Wao`oZNsdrE}uAN**3^);2NC9HWza8j&GH}j6|917yoey3iVeL<^Z&uqu9zl>C!
zxThUFx7%g%g@YZ^E*FfHdfqYRzY?ohwdu@+niQWVAI{3$V%ez^u5>FY``r#&uk&Ad
z{$s0#AhT<6g>^d?YMu3KnPlA;?3%i@r7E=0&8DQIZBMiK#>}s3nW}E8B|EmW&*E+3
zyBu4Vw~9;Qk&?5}L?)wcW=5rYM!sD=x(>@$St!{VeLQnz>%@m{S4^TsW?IS5JjLX(
z^Td_MGcz-k4}bk@c3Wg7TQ^UB|Du=OCsX-utYdqZzW#k%#hHxnht8(%4tGupc3-U)
zB)zyc+;vOg_B+$&>d5R<x-}u<s-eb$so9N(LLH;Niiq4wmJ{iWls!G^VY<1;D~{C-
zhfEhm^;mRPojI%&7@!=uz}`7Vc>h!{=7T(*B3C6u-by}_+Oal_i>tm(<yV%D!q)VT
z=#*Vo{Zf}Cw5eoetK9#R-tl@yR;iHS@%amv9Z8pHUS#Whr^i26nYGp0+4p4am55i_
z=LN2B$eO+K!SnM0!H<sgv~2svb9JX!*ln*T+Y;KIaoln1lw4KJns?jJ@!|OkGL5%2
z44q5Y9mu_Y`EJi#MX?#H4!P{e<Cw%Nli$(qK7ILrpQ}-#Ej!%Y*_Eff?5hqdGAv!T
z*?=oTiJkw7Y~f>{y&rpZ<aNzA3oMtN^FqY@>ogZG*pSs(5gp!l(;S@^&(JHDxfZpI
z`2x%N(3bO4_}2CCgg2@z44nCI(+Qo+7t9yV@M_}Wy%FHrR<F%;Xz`}Msp2u-n|?jC
z-OMw&pj=n@l9FNUvzNPkil@0<y>PH}W=nlK<0tLZU#FEe`xv@4XFodlbw<l;UL(cu
z;BEV5CVO1bsW`87P{sG%u}r69YRgXB#7@ubx>O-%wL@*P$<K}96FzHRj%S<s&B!<K
z(I@{27n3Hb*|Ts@a!>vJxYc#i-xoqn+FjB?(Tl!JsNh-LF3Oj`X7Lx3o!_Q#MlRbF
z`>a!cV)YZ(%`7^9&I(@gP2D|Z#>b``x@;d(f1SJ~kh6`MUHggW`R<2`%Bx;@#;^-N
z32PNF<IwA5y0K~UMxXLX_OOS3GD{{odvdC;V;6YFSYTCMEcNhkH0P5YnzPP4iYc3>
z$!N79A$Sj`iqDjJhtdvy^(~(@XN!GdBL~~xdYK)M8GAXpOk;c)a++n<?0vD@fRkO{
z<Jp@Pe{XtU`QDzmz4gQU4>=8U7M2?yvzT<vwB$MOvh8<gMgD&;)mHQ5yi@su`w!U|
z-uhYWmEUC@uCi>`?svV0+g|_nJbbg|Hjls06+ZJf!BGi!=crV^T6e!H;w#^;?cZA#
z>=5<2dxbOaPUiM&vwuyFa+#8I_}0PmAIlZab>DsYpm5>l+O<6aSGJUWI3>O7p|WfG
zlD=~qPS1H0&m8XxSkV_Cp;+QL+1oa#W!WnZU*#6PxgRbkyFRa4v$5gWN3JfXOY)LI
zmtUsjmw$ivF7J7kSVEyq$+70S`|NN1&0)N=d;7bBOW9v@niqVW%#(h0-G(_w?3Y}*
z!Mbt3_cxY5`CHr{*e;c?h)_H<_wJcF(tC3M=|A6G>{z$P_r3a$cFnNWW%bARUs@({
zApQ33?31DmhIMylKL|HByC|=5>s8j)+ApTL#cx>`uDF=4-thVVftQY44p&^|ui0JE
z%Zk4F;L8)969@cfwEvCHZ<_DB=1G}@tiA8%=CAGZZ@fuRyVknR=ymm_CH@bdWvst`
znkVY_4%OD9bJ)F`4<vnI`2C^oj{mv(*OeMRR@wGPc9xYoZhY2wNyl#K#elHo4Bfu+
zjvs!_-hNzt*M=+44_*>F7?l4cG4rCj{qz}gkJ%X9I<;BYIWRA8RxyKN<MNM_7Z!_t
zdletGmwUx}SJ_#G>b$pw7)uL3MTsxEX47%zr@+;-(>RoZ>^+5-e6yLLBdRo0X@bX1
zp4b^ypA$BPCTwywIC|8`<Y3kr;l{Ms#BVx^5dvkaxi8sxW|)OI2%VF2QGVTI;;%Hz
zcj`%F7lnxxg|Rc<R2pm*NysvDHJB)%89U>dXZGf`Mx{<x6D3SyXFTi7+dR4X<%e&t
zdX0Ja=;v%MTfE`s@}@r@euT%an6*efOy|+_E2l&mgVSzBB_&9GZd`eK+m7;G8@3$X
za7C0u`N>?1H!;HVp4l*Fx(0kSHK+|;Z0Y|eve%ONUu^l2%1dXnPF;O)=-yn1V6Wqu
z=O*WbdGq-Pa;B~*E?UOz=e%alHX|9!hlMGd8GM`VJd=e=8HG;uRjv7Xf+0(E8VB=)
zST2Qye^wmN>K9pXDC{glh(7CtfQ~E4t?pa_j=PK)OuZPd2nMeRWatoosLi6mcll~d
zM?oWlQnj6nFQ>3;<K0~hGm{#0ScOElrHd(a%)Q=vT<CCcxWa^%m5UP!V;i1zy6!%E
zQ)1I0H4Wo;HcQXFJ29_}YnvmVN=L~h*35Z+;?-p-MbleMU-H?U|I>HZLg;5y7T+_;
zo2A}X?5w=H>_IavXQZbbPjcCIb;_*f%4sFGUvC|}HK)}vDf&j)!Fwm)nWm~OxAk{j
zW3Iv=I%T<xgX*$nw*IYa%vBjYSu&+ItmM9EBRV-FX!62TX_iF?_Htf6TXU`~ChOcY
z&dXKNpRQz`2$|+~GIF+h`fDT0Y}03&x=Ww=uDQ9jdzIRI3;Xq*?jPKaf86z;<Lj=n
zK+)%}J{|`;mE=ksg|f=Za!v+Lu&JNqdGd0G_d?H2XR;1m7JOAY!8Oyc;*8OU8%`B#
zdKNne2&(f>@|0iNnp^U4C3obC$bvmSwGWoC$SCWtK6&0VWTT$S#gc+D&$bVRZ`$&n
zCrNJ%-qKL<QKNE#Qs$v!lV2P%@$bz1AaaAR_SdW_XD`YIYUnS>x?uB6Tf<i}fJ3n4
zp&&Q+YE$ufO-gfjm_EAYG3$YY&W;+lS-m_S!ufLyr}RGhwdS(BXUk4A52wn&{FzNx
zCrK7ZCHZXh$%xEK-nGk5@A8cF!zQ<jZi(M)Y&@ysTD|c?hUv4*2SKbhLFwqv$8;Qj
zS8n4@H06BT?f#C(CrtBJx2?;@gUa%oS>F0?<k#4i`K))Pe|7P^!b_`8XU1Dx>v!h4
zp^%ij;+f~6Ycie@8?=oBW~wfnrLG*c=mq;_of(B6^Bl8!Gn|z~c*~SG7mHpwHLc+G
zqN@g56a~3>c3+(4ti&^=^L0_iVWn&OQnHphu6llnok7d9oQ=;L3PnHsQ+QS=C(&~a
z@6NBviQJocq9dHX8$S83dr~aTa@&TMb;-Mvr>Amn)``Ax=(D!*`)LRLJMS77{Qh^~
ztb~^2f<?Xw58~PnpI7-h-z?zK=l5<0dAd&(T$nuTOl2d_DhtIKW*LtzfB2JV@O-7n
zBB4I5%VP2!>8k5z1hMMwby!)jh&wEH$EUM<HqSaA`u5MCiSaXYCfyR~<e!jZ?7w17
zYQCtFrSX9&PnYca!Eth4{gTwuCk|5+m+iW-Yg4Xe@0+GaQx^wv$_aTd`}4A?q1`3X
zAakQ{?hKW#zJm(|#2!Z0Mltzi+D%$vb4_MOm);E-pQSfE7JdIPEvn69(E*!fSqt@S
zcsmVVX&6q@XwlR?xtMoygkq*R)65cylRD=;csC|pdS+=qRq~|HNe|wQ<vU_KY%V9N
zY*tbBELr;K-udJui)1BM-k)f_UPiyOb&}=%PCNM}m;R`T`8=!npJkY{h9O*Yo)EWs
z@xIAhGt9(0m!1#zU1(tNxqU0szDWl~e=H8lxhm4dygK&A>tBid#}v!!HraX{)H)sI
zyD()#l&tBEF0nMZZANddidc28ElYg=m^sYEg4^Zs#v8Ye|J~Xs?iAm=ZsY!KySuk-
z=YO!uXs37U|6Q%#5nsZtNp-DzCb#DUpI-i6frGs(_lob9+k1#L{MO6E$~LaS<rD0>
z>h{m*y{P@23v}b5?drz=?K+1yT`nu&&f#r~RIXjP;_-{W;Sy7wmS<aA@1B46fb=i(
z-Ihwve)q1MzA-|z{2kBZ{n_k1P5+m~I&n(gu|CGu#meA$@v804^|7ynWd64M_`YRO
z{3W`zEGPN+osB11-<ob=JeU_;&ZGRWG2^=OacRH5w!hp?oBdO_c6j^X1pjisj=nhy
zjeotV|8&Cl@LAbuF&}FWAK1OKwYw;s-Sc~Q%>CVuVjnKPvbQvGMc&%U3-cD5&YPuO
zU%>z0={<XPef6)J-}0v{_cq?Y-}|V*p>An)vS_ly!K-O|`~K%X@^7x$zPP@(>T<@d
zXZJVs-rBUrZExa(`x~2XnEY?+(PEqbeda?^Nrf-l58mBsX{4LD`}Ik!1(83WAKm<T
zyZiM0`>YoheZKp9`g;HVfZXcx@8Z8R%D?~kB=NWA=QGn)?<HOsHOMS2kiIVY?%ljO
zR~@{XH7W|bw^vWNc29(xOXqd*|Kg^L-yS}ExXt{gZC&vW-kfj8UbEZ%yJWrS>HfC7
z4Zq)+)@}Ox>91L0&)WktByP8f?r_dF-&4v|zM;Ey@Ac!&!C`ZG-TXGKeX>)$TbJqV
zt?q^9|5^(4@7`jK+0B<9TOQ^7By+o%=l2PfMn&xNnx(%pUza_;+ii>Hm%|&}R1{nz
z%05e;TxWN<H}!eiEm`aNd!^G~v0HDxz{{6^=VM9wtNq{J-+6F?^KS3iT9;c@iecP#
z%2!;arGM;|&9^Dozi02g2>GA?Kejoi*M5#HzkSEW{@;#iwQ_zn|8MbLGvEE^dByh`
z7Qy`7Kfd~2d8?GCT;H@+EK$7t-PJF}U#2vcKl$^HUE)EfaLc=w6}u)rdgY^5@%q^9
z{}$cxwPuVw$|<1x6Fq-hzF1^+d-wB6Dw;b?xxI5ms`7G$ZIwGVtX=qeMSex-Epxd&
zimgi;qbDC@*56U!dD@z%seZd~{O$V(UG}!h7-`O|`<-jc20H&$`<C<T-LEt3_db!^
zb$Rv8l2`rCcOF+1Z14QHz~SP<Ly6*bt$}t5pTwu#-YjTvcB_2PA^u~>Wy@b2;(wB#
zBeSD+jo4f!9*)-&C)_GHd^l>!cO{v3Ja<2y{Ze+n`k&0PkL%12J!F6XIBi{eev75`
z5&p763+~4*=T7{6>dwxO>#l#lekajmxzk%y?W(uha{Rd~6dw9}__gt8_{u+)ji`0_
z^7U=$fr<P|PE2=xoSi?r=~=v{;gt4`U)nr9zl-)Xd{0hTYnZV&z>InG1beBA?<2VR
z=APH%QvYy2*W}Az{}a;3SLqZqHmfyS&rK?3sa@u6nDpYr1%vM=S!}(<(#~|L{0;bi
z>)?z>qRz$oJaY?fF&lPUc5iU{rR^(gGLN@?N9m#G6OLtM@0$87=f%X-NgICexNo{`
z-LcJr|Bm1OHTRIv;cb%Y^$Q#>OnrFw%cH56UF8Gb-q`!?SjzfU3w1-Pd#^tgkY&G@
ze&XTA)@xbs)g9DkO||~J_Zt^;lir`m3*{%v4|#0u7ikLd`uj6oDGYLX;@zFQzy8{O
zcimP`mt)3%PM?skxIW|5!+v##9do<q`^U#la{4}d_Us+AO`n-6#RxvyQ~KrGn@@k<
zzJ6lMqH?HX*2Q0s`}O7LTK|aYc)8=YVD*Ij*pvgSf1Xs~R|q{GWfFTip)FGFq2w98
z=^Lze_k8%z>HBihU1x<W$MYC`zfBgeTWVxq%h><BNATu{f3{m1zyE!mt>dr%moqLg
z#HwB8y!O3Yu^SHV{do4=IltbdO%p#E+<f|hC11r`sE*HGMc2;mwV$Ep3X{}I`=7sE
zzg>;Eq;}r%QP4awUdAi4A9cp<K2-K=`IKAdi(Gg)wWJMAw{uM0HmPpg2kYnxb)OXB
zQ<s?@&!4~Z?b}+e*k2Ev_nmdu$?Z(o8=-%u(ByD=#j-^QH!vCAi-^A;wcK;Uy`Pi6
z3;*f8^>tcej;q;<RP$@*nwu1i5*Yf9_=n9YxZE1NRa2zsp24=3-Ug557vK4q7oB-<
zepj}1x%K42ZQMT^Z_mlmvi`f!zhvvyPa4eu`wvTeOIHm1B_vehs<ObzEXwKi8YQ`v
z%U@f9ZcS`Cpx<-Xx<rEI+~2lLh6fvp51m(7ah)N4%Az0z$gPPA^O!{@`gg4fKWCv|
z*S$Avf3G3v=vM`=w+0=tEFopgd@VcW_8HYSh%?9D{qlFAd`Wi1AK$xCbutS+GydjI
z;Zxbgx+FvC=)v7vGd_f5c1si$+uxV3o4v}A{r02t-FH{;R!--bet%=Y&%dte|H}m=
z_T1a_euHkA=8noEW!y84TK>E9P~bIp?U|3U%{9%hCqI#97PvXL^Ph$&-^2sVvNo6W
z9zV>}Txm9gSNe5Fg>&3_-&FA_F+I*<OMm}J{JZme&ELoWeqED#!M>xotmyGQWzPOM
ztH1u`eg+)bXE-LFXxS%xcauTD66?IRi=St|J{HCkqZAIkGm%q3Ng(d0Ba7o!h6Otr
zWEw+O<z8JBD#N`p>f_X}H;zwF7kl)f`%mo?N#(ANhTCWUxacwDANYOqe(=u~D_%=a
zeAX9Uv1jvAqbxu5-yN~m%N)h|O=s2ppCRbUBkU%#o0H4y{`@=6VnO@c?;D!E>#EXP
z{Q7X$frR$YjNKa-C(Ya=(%ZGrWo5~~12!iQ?B0LOrt;sM7568)9=Ex%?b}}Fh()(=
zZ}{+l(^RctQS7g&b&1zZRK;ZPbx+s#wtUezNk6Y;Kcl2a`<<Ub%E@li-BaYxycFuZ
zDo|*4OM&~aqP<WWo6X|s4quMyy}6Me=lr^YH+9n2gZwGQOO9RpRlG^<TIbQN#!WqI
zq<2g1&Mr4jFH_iLQ2D;R-rL7aI_@v8(QiWm2eAX9z4_0M^-tmsGqIY>_(i7s+MCO_
z7<)b(lD@k@<M_fxh7D0{db1*@%a{nnJowQ3<KeEY+4VMe_m#Qb`%tG}a_nK*3$}Y-
z?UeT47d)Ez{**l5qIjqG_V4CJ&aXMBob1zRJ8%7Rb%}{=6Fvk^GZgGMHgq=pJ-73_
zb?aNbd*EG4bsx5Yb}5<OQeN$GdOhPY&@QEaQmdEdq@57Vbx#Srn_MjI({@1iQS6V+
z($P;QEEMz;+Ww9y-Ra+nC>brauvh#yTr799cguWwz_Uqj`P+i^+vTqLnw?2;+Veb?
zM}8jvx>nY23ZivOB=@LpFz#k>DNFyznB2bV=7OVoO0&28XxJFIQgoI>_gVWJ?wx^t
z?MIJYur;;d5{vOWuYUisX3y>K2haceBqwdM<#6sD`PT=O{cN_qT`Iqwb+XDw6P0=W
zTa}!?91Y&H<KN4j<<bg=AKty<_3hhriQ^Mm_`g~1UGB5#-)GIZE0OL3Z)6P@3%!54
z!~c(zeX3B;yT<3Qi@)#|M;y6uQ{3pL+xHdP+I7t{(k>dDPbmNS*<a*4)BWVnCV7{a
z?!OpWdF}i09iIgw^CC*FUAWOc$$0a}1a?=g#l?>+lB2ZNeXCJ!d$nAOan-hP=8UY_
z=d+*W{9k_SSy~_8$peNV4zpa=_sxH_v3^w|$DIxDeeUp{%KdR%{^4=nlKz{@No*N^
zUq>HWsgcWcdV>LD!y_h%Ly<BGFZ$RU6ds5P8qbqjzk9C5-d#2Nr*DP3%zK_Fyi(Np
zzT_Y4J2!l$?#xT_54yR-^_tSWW4a=f{@*L-{j;3?KkEUde2F^ariHgnC-EAWRX_bU
zc}wAz+yzVcbK=?BFZ1@xh$kdHW|eJnnpe3^UVFg@F~<H4l0UP}`qWHy*5v=$`92A>
zN$GmVsY~CDU7Fk#I~LvA<{4ojazW-iry|Rr-=%9coDUqGa5v3q)A^it&(oJm+;uur
zTF<ljN^Jl0toprOdk*&~2t1Qbn`U=;SwWaw>~_WXVucl6%l}XD`>#3oU$E8R<t4xP
z`>!naU#@>!XHDg7*TWHPiu`d6b9<Gh|K!hQ{<pp?p~<?^X0G|p(~X_xI~V0f8g(9;
z`{%$c>)<V6e(M%ZIC6OXe@`tTQLc)+yE-&(2{1jdbQWSZ;QZtHV5h{{Y8Jb;geNY1
z{U1fN@4RDZVrW=#W8c9wrbX{s|0cJ-mW$oVv5Y4vM%JXTS>XHAGt0KuJvewiVsSaM
z(T6L?@9ui=;=l!m(}FC=`C9f)=6l$3mV4nLwL_m@^f~`Hy^}NM(a{dC)cN}z*W2Ei
zZGA)VtC~#e;|yWhy|v$8|9pABexJ*<M3e0w>!ZBpE;@XDy<p`>CdYHrKiAKb$!2z7
z+K^bsB;KRYqat<okmd!`f{!V@X|+CX3a<({;xzfWn&OumtGtoOIG4$9JnPJz6Oub-
z&OCgp#^Ug?@IR&^W%GR$eBK;zUnqap)W<08ub|{K<K{f8`a|c$=Z6QJ6{ui5uzXVd
z{zKdQ^6vgq@456+V*l6p<L9p2WuBLjEB$TTO^3AP^Eq!NOTXO7xWRU7$DX;l59KdP
z=WKM`?E5AD(7N+?&&#!35Kuo~fAs#h37K1F`<|>0C^y@5_Cxi9^9KzsYMgjH`K_Py
z0`J8NyoLUY?uRRP-#gpX+5fzbU-sW0q0g}vy+;mxob6oF{huR$uK$fV_LY@yzjQum
znsMH}(buhRzvU0{ZC>r09b*K2H@}EZ^KY!a7AR8s_QCP`^M792{ciZjRLv87!ua&r
ziS07Y2flG9uK&1p(wFJ?)`V9`%6vE{kY6Ex&;QX>rrf}NZ;wZ9DUJVmSu<{4%=*7M
zld9epw>~inePU$#?cN^C6MR#r-4MQ^WzTVe;lqc0a}T*0EdCfNX|Y$tXUoCW4=Y@{
zteKnVIiK9SrQq|Qlg~syJUe!Fa?zLVe;=wdFl+Ijdp|pTV)TV__V2!@So<cw`|NS(
zmi4K1#-a)pN3DK3IIxyJ*nQydcB{TUzh*bR%e_^*;%dF~-v3r_|DXG~>|aFogk`@J
zdO12Z?>)TAp0L_@zwPw?3rmy_MBYgcukF}&OhDJ_$N~A?PGyHD)&DlVckW}I=aK)J
zI&Vs6tY7RCvEsC+zT~RKIiFrha_=&K$uv9T%Q`(NE3q$p+XYN_ZNH+vrg{3gw<3Dk
z8DH|Vzw}Q(r`!4U!i)XuF51VLZlAC_cJc2vx9=4v?;M)A(e3-5OK+R*eazaqcNXiz
zkj1~JRej&EwxNr)dd4x1JyI{51QUu69_!@$vuDxMKlgl@!`{WV{rtS?Nw4*%jjX?q
z&Gd=6u{hsGKvPlK^HctUFJgj!D&O8c!<6;w)4h57g;#rXdH9q&<aNYbF1$V4$8^TE
zAaThhvugjB*}Q2j-|+ZcjO@QnS3<diGUxHM=++-PW?OY`jp3|ae2!fwCto!1vpsWd
z{ulS)a7~Y`<wj8<*3Q*BrC*ywlGT%anfQw;Uh*$nmo_2k)yD)ou`}O)UgY9t`}TZx
z>opH=W*h6P3SVAcxF)gUT$b}M=at$D6PA2rh~BbSGp=*S{FW(wozY&B*C#lu#d%)&
z(zhd8HaFUtZ{|m#MUjRH^EWKtx6*J%n-cTOzbgt<_X+koR<J&FO-`8ilE2yIUS?0w
zbqUtZ+}p07>bZ15f;D?u@c(CQr_DHm<abNCwXa?Gc!roxMwRU9BMz@_^<_3zGQYI?
zwOQeS?H7*siH1e17tg=(>Q;Z|!%~-Q=bel<Pk-c?{X2Wk(!D(SBJK@)J~wMh?f4<C
zwNAC_LYIQj4}T$bu^o0D-&s@ly2!<B^WOEeM(pGM4RMCTJ-=`K+!QafEMd>S%F2#)
zX^Q`Nlf#ZI-)vHIq$^TvzT2^fo7Z>wA2`>)Xu5`@w2aN?i~kPT+1ULMe|$gq+ibb+
zKg;ZIM06|heY|(^eENEQhB>*#=YQ;&pswwGE9_XWY5x`ngQTeV$GWybN4lqM-k*7@
z)AW_j(_4}Jck4u_tggR2Mff&*<f&4NeaCAxpDHyioM>Or9g?l%>(JRdfyeDZ|7i;=
z<1-4+SwHy+E?1LRpC7{8H?eBVoCOaL<u*;5{q^BHZQ=fX!As&^&t5jKt$bHzMCA7^
zeG*OODYqZTtS@sah+y!JYD!vcvYX}g8gHBRUq1vmyPS7@GFQpz*{3NM8zW~QU2(AD
zA$Qgsk;Mf~qN(R}R<1NLOAPj1A`%+>sMc@Jf3M3d!YvPamF$>YmA9Yaei2gp;6m0W
zbv`c-)$9pX+FdI+O&WEwp8oKEzGm^&B!25J0n!zX-cAbLH#p1Q+&MBe$z|*0X<J$r
z9F*I>Lf1IsZCj$C?pEL1T8I0s)NP)8u(f*>=&Tv){vq4-$dzxGgE};S#!h-^^v10E
zz>*^qmY6OIH|<)%x#p{u*sMv*)m_)-J>%Q{BuZrgo30{r(Ek3P8wDb!JkZ$i;PdIV
zXTE6uoHpZSw!!i2tTmi#@74*OJn1|^X0@*Of)(@MZFQXL>;HYqjL9dio%!}nAib%m
zG~xE0xOJ;?Hmxdp|MaD5==8O@6Ew2Vn5h45`?2}LPqo#nBcA9O)Nj+=7OebCrMUBf
zsL4mq3-ax;tkOr#lb(C~<!xrkDfZ9(?#i-cU5QE2G2?WNl1UScZ{^Rd%8K*Xwp{mA
z#`S&o%J%5XvidGtY}*^W<X#>3b}+raZ0a1xV!!LEEIu{9KX?r}r_OoQKfNW(&rjPj
zQon`g&FL_MTwRrUE1&3A>^Tzrxj1T>YER>h=>q)Q<tz{W)vG(qd+gkn6@8N%+Vf{N
zWaWi&GpV~2%1&aH*?#Wh{4yC1=lA))U7Us1Oj=srEWJYM*80cGI<js)dipPSewK$)
z!KN$OT#NF*wO(25`}|UV<#Xvt6XxsWt##VLpL|!OAbGmzo=KmJUb1i*rbOJ^xl84e
zhIbpE`YDebL6`DI7Ck#5pCudgPE~}e82U=K=r~K9KXQAK2lFHc$vCGEK~Jg$ZcbWl
zQ)nptwPIp?j9lEjC2dP)nkwsV<}waapRziX=jkN5qQ-QEZR#hbUEghFIroQ4CS1xe
zJooUkqcLy01s3}Tikuh8zbW%(O3d%48-n}4WHpvg5Pqq8M=&#(^~<#9_pWpN+Z>%{
z_(T8c=|xSZC9=D|d^Xc$cUBdzx8%9X%>OoRvqXi)L4hJ0%}3vJ<u7ErC|;Xgyhz~t
z^&?3kUo=03m7QF`8=&)%VYbXA{qw2o1+{Lnt*=rGDcZN&uG-GqsCn<-b{FlaKo{lC
zjXa)iGu?%=e)cyX*qivQ=;!hsWufgmid?)trvCh$$t`#D+{`IU<x|a8Tb`WLd`yUc
zR(JR>uepZj9UpAWGv<zcsw>U*t@lz^qxH$u=6yyhx%mD)jZF@jWWpvYc%+N-)3-M*
z0;;=0C(K=Jty6KyvuaCm$kV62qAPvRNWbU%$NJLXXTQKT@4ORCKgFG8yd(srerJE`
z^%b04errZTTIq3S{j_WBd*(ZNYug$<)oeO5Um>cS!^X@!!118s&8{S&cH!;sW2<Xj
zxVXhc-?n|2k@)J~j>d|2qGCbEK2~VPdor|(>(6AGH}SB*L@&ROFFlL8+~;Jj=#TH@
zc%bB7v*nJ!4%vMZb(fs`W%x9@Blh?+?rM$mybSYvYdscSn;zhk@I0NhN>gs-X1_D>
zPi~le=zEcnQT;if>bGQc_PqnH&sB8Ie!byImw6xMERY<)8a2%-O4ldWzG;W}mt*lF
z0?j(9EZQf6%KWa`J((uG>!V819!cIt?OjZlm*%bhta4|k*G17qzxYz@rzL-sn(mtt
ztZ;bWRMFV*WpT27SJkJOY~XRy-2Eg|qQl>Q_Wd0JIV&b_n5Vq3;&SJfsWWOeoVs(c
zw>z|9rNWDwIeLL1W>-_aW^>i~+*??z|8!z<#zVeGLNiTnCcV0Q?NF?O|7rmP-BL#8
ze=RKEcTSdm?HMwwtMB71rkjyRw``lbd@G}p&EiGw$G5cd)bpo4DfHakt7IxadHZ|*
z8B11j)<!oquggD@vZj2>^9_8H!ZLKdbS(QUOC3*tRrNCL?T}15&^F<k$<NkFu_;1K
zy@J<O&NN8wQgKU<XF9+8O#@@-nddVXxgL)Z;(Fq1(xzOLJ?ZYJ9h?a_558u7o@TUz
z`>Oqs#m{%nS-jwkx{2k!zP@!o^*iln-juALnZ>aBq3jASC)uDb*0xRN&hJiWIDFV_
zFC*}8;kJ@I;hu-PiW;{%ng4k6b!$UZO9$)zGyA$Wx2R83*3syi5xloCWVP7cJ*yMW
zXG^@Qj$1u%@^qG>m41g0PHCR!5WLzUI&;RUTV9LLy88Frs+B(^qM)H}w#Z_IrsTGz
zd}UIv+H!BV?H1+SvsWT6b*fJB%|$0x@~_mMA)q6^{{7+2n<ro2yEwdFoK-pU<yF;>
z?v3BJS-pL&vSRjyjo0_@o2V}?d3T|Vpc%i1*Jr_<3%^M8C6v6(4|l3BwcdL-BkhI0
z;eLgkHoc2_`j{7<37Oz)Fkfj=O58Ln_k5EnJ6AjR*&fQ|cV5*p^Ut%Ds=M9<vxdEL
zD`rpfV_5w}XIA^QR(tMW>n_D;-t2k0A!}taYnrdbm!-v`il*taT+D@5Ie6UVc-NrF
z#o@WU^QqlY?q$<nusMj{Ubd_8#>UrEcp0B)%->UUYs$x9VY$=~*{ifmWOsW$&$p|4
z|Ht}F&w`%&Kc`q`+TIg5RnF0`?V+%nX<q6&C-bZQ+ExYKv2X703+Q#);-dIO^u<Hp
z(%f~y$L~0I^`srrah1H@aZf$X)!TQ<lqA<u-Ic-TGgiFfm?(WWxV&fGoPX*CTT@Jx
z+0H-hoRStR>u(X0YEmd<!M1?gP^~q)gI6X<lKGIBz}B_ee;BrXiPoyHN!+L4Eg~0l
zu<qiOfH0}ICHr6SG8(dOVL$UPkn8)?l_tKtQ<r5f(K;)0=l+?t;C!PaY{f^OM1Q>F
zEafvz?n@iT#-kRGP6b(|=^X#`YB|H)usM%ycfLO4e5>nqmG7gq&ulI>DO^9sA>2}I
zczDy)C*hVe*DT>$x-&N+{P^$3SNN+8_c)cD^emh&w)a=R^p6+s#JD$F99I0~<kbD+
zOuL^wd!^~Zu&nyfOOqv@Je-rgFTK(DZ2zIIwd(0w>3bJ%e}7)DRcy`OHHVsVHIMc!
zd9qdL-lZtV+Iq8TF<qN;91H4MS1(_>WWiF2YqQV1IvAj?o;7QQozeFxR>@bjcdB0x
z3Q`H))a*1#arYT})y2Qf{%X4flzx_uzWlXHbxC;F-b9c4Cnv>ud^0}hrxA0h^kC>p
zt!Y~(Et;*wk^c2@ivASc4868V%7Ux+xg1=&<l?f3L!Fk*OLP8yxS;dsnt;li6%TBd
zT)mPUcp}$)-ukn1mP+>;KPyUg)?Bkd#?MP{hlsjIg3Y}B$LG}kw)R>)i6u_g*HmKD
z<vvlf$(!FNz0TO8y|B<dKeo(@v-kPDy=sNeH<~ieJkYJZWu;1~T<!z^Xj_Th_Y#6b
z8BLGub3DOjQ1om2y&H4g_doUAv2EA-&G$Nz-Yv=4$jPs^eS(dCir`%R4`I6`M1_4L
z&Uzh*y&aUcL~VwD<~+`oTP9EbBfa2rQb_Cup~(}LJV}{z_>j`u9jX(GLe~V9mX~+S
z6gXK3rpk0mDLH<UPLOK*FjeNy_N)B=qMv-xTexw;f#u2huPmMUJG|dbZ9UN`^DbC@
z#-&G}Pwr%HUp!4b{a)DjwcB4Uaf#{ay0QM9waK2o78e&oHJ@Ek9}EsZcCmb{uxHO{
ztK8D|s?`@y9lPpKai(U=$)8J4v>!ZJT4`Q->y_S@u+0;TFL_L~EnDo-A)$Zf;`IgT
z)}22ik8Ig%V_y|*yJUfD(UX7`8|QR>5J=XV@K4U5NY9?peEnqARr5kvZ@rqxrpvLm
zMPBsDRmHPO?ozD>_T9XzxZl!Xg`R&v>6K=_r~?^3m+Zo8UOyL~v}ShX<6{0w*Qpt+
z90Ft6^S5qROqcMtpTH7*tW0XV$;7L1aTgrjZC@;4Eib*?<ZWbQq{%O2;-VV2%E8(B
zqtew4k8Jp2CJL#Gc5hI8UbG?hf!gJqJoY_Lg!JPK*W8Rsx>DwD`)C1cYR01_S^su~
z^Hr7!3ROOCeNpw|&K(C!mX5uT+smRCU3jOJv0$-GsgX&?fw|sn_s%jq2}NnBpVDsi
zoan22bisa?$|Zu;3EPZcq+ibPJalv2NBbAA>SnP;@-4FNQsJ=V@>2NYaEk5d+7oF<
z7Pdv%IL-9v>Dy&=HP0<D-?L32aKS`{TeglT%&sIYKlQ}=)r!|XZ_8q)@JwNU$$MF1
z<;|1_9sLt>k~=4P$7*IBx9sAG6B7QZ`t-v6bj4|hIVZ_%neuMt6mS336}#nc%ckvX
z@t9a0u#>0k(9fuOGYolqExcFsiQiw~+0v8qtir=f{LZHm#mg5u4zT!XDQQJl+4!6c
zbK1_=qAQm_!#L@~KC1`5+ckde?mAQ6R`sugPcwYN@+Ort(_$v}n(^A7VA*u?@!i~`
z6(52;xq0_G=Q8`vbKk6A{7&t}gt_&}2g7&-^xHSw`?-x#P^n?Vn_EtEL^&o2H(V20
z{31U7b645zMF&1;Z3>X8O25M<Q*$x9kR@W{!?Q<UPLvC_JHIPFclD&|{ACN5q^oXG
zJ=)wL{w1S(-Cq3#DNcHG_ZiRKb?{wp^Gz*}Prgs{{OvD&{&7ep<Pozu?_TCg;b-$^
zw!~F1zhr)P>*LJR?d5e1-}RNQcCC&SiHkd#b<J8*edp8@S;rEbm$ej?>$;k%=N`@Y
zROA{vbx(%oss|Um1Exk9UzvA1b$!y#$BiuBrrv91rg?>L3f6i1;?jYJD~BXb2-+64
z{gs^ZNz$eIy<Ylb-AAj%T;hb{_cr)Us_RcloBD9(&d(FxY%{tVX&SOeq|1wMhsaSC
z$NW`B_7Ps5o?geNzw0%Zb6&*xU#eGzU+)Vq%kp)f)=g_Xby)SG$~K=l7vI=SzxVXu
zf+!oq)VfTI!`9F3dgT9|Z}Xbbyg|TcW0hv?GYPg$I-8w;d+s{_Gr6n#wCHDt3x<b}
zvWtqRYO6UcXm)a#WFJ?P;^}zYNr7{vrk2L54m0k|iR%*%9-r`Lq34`?laB05nH{%W
zLHncYN|rS%x_kaU{rc~5!K}5fw{=zQd;0KlY}oPhzK67p@)D=~scH}XBswksr_Lt%
zX{{gK&s2JglzF%OK5xIXF-!Wi$YO7o=kDnyH`V_O9=R_X`ZwoO<P#RXw%iK-safnt
zo@$&|+E;RMzfjh~^wqaLrnO&qX6ODUVQ=?(#!dZQH52pFlKuuNGH=!Oy4v&q_1zxR
zEn;7bStot9nx7}-y`q=5HFa-<5Yv^nO4WZ)9a#4B&(;+h8Ctu-)|`CXegDtRJ0hOp
zT|Y0WKW^TdUe_YI@!ER1$1Q(;F25Ao&!y(XS<ZS!TxS(W@y3|@T2F-g7k5|hpYy%1
zpI@JobB7%Bq*JVY@{?A*dC6N9Wz;0IbK~|83DrJ&GD%D0!nU90-E&fRn{4|FrB7b}
z=T<G{e|+m=O!}fFr@ehTCAO^me3JLF&&GnuavQHQbuZeXx#Q(Z?JiTTKNFpre{$7(
zoqF^r=RDUQ(W9?dc1o~vZq6u^7yBNXTlHY&Q~k}#K{Jc~IY~DK7gfFXnfSH-W{zAV
z_dS!7yJqyBT>VG1{rb_}Cw4zpWvqyJt*bX-+JUvJ_c~nZu9+0I_@~nR1*>)b@+G94
z)3^M5<k{lb*3<D~=NF|Wa!hND+9(`dlIRlM944-{<bc=4O`Ok8+lT5r&MI29*wXmN
zf4$3lSDo6xZ4vxZfGZ*-wc=c|^VdrzpKb5YJf8fWO)DVdN6u71wUdjO#8*os@0@S(
z`S%h2uM9%sIr?3yJOTATJg=tCS!dMuc3ui=c#+if<x=+!_~vX)stDeAd7H`KNv|d*
zJh@;S?b-3hO@wQmaI(a%mGVh}PMLQmD_{S*>H8C<=kK^y2Cd8qUlV0|-ulRgwMQI7
z776t0?mDn&@BNkTdnP}!Z(U{WRdy<=T<@a)>idDytB-Ba4BUC?{5+vsq0=1WIp6)^
zEqmzX>wh~p^>*&26Y@9nZf9n_+xAL4!lQJ(Po(bOvt_CuLbNVj<yxsZr_tq&(#<EI
zj{YjzIe9gQu;CS5h8=rMixxyA^xyj*VN&OG_lV)ceXb#Qdt&607pb!_q?C1gmAC8^
zohQDa^X?Uf!+!dgUEg(aaV}aYIUy+b>g6QI)T%~{Wvwpfm>#dv=2((sSj`c6c1iTB
zI^N3}#yeMUi21Q(gGT6{rdRBaAGg|6b=Ds&G+nn~^6U>MMZc`_Sif%83^!w?+KTJJ
z2~D9gP5K5~s^*3TO)`sL9_ng&diwF&uEo_|i?uf~*!T5a3BPt}f%b~Kd(JfMx^i;L
zb#wpqH)XgBR=8eW>u490E!ws8+DAXrT~D$eKj(VVJ|#SmkNx?n`M!z=&xmfjwX!dK
zMoYSOS;-o;xOG9YJFjLIm!{<1;3~IEF#1(+>J8t8tF~v4u&K>tRu$Sb^G3<DrAqs6
zC(oR8v}S77X2aIzKhZlr2JX;xw3j|wen($LE^S7dk7~KmgKw;H5ev46O&8s+{NC#2
zqief&`bIRbnpd!X){Evn_pUHql1u+!Dt&Xgki~*^yUlft*Y8<xA`#6v`;zBMlcP7y
z6&IOXI!<p5eWWgW<HCjgx7D;;S#DQ6xu(o{G%(6A!&z}c$YCG#xC?XA1Je8C{=WLN
zP5il$@sX2BAv>+@G7fAoKC&u8?I_ddK+ZSoPt4uq^5}V3Y2jn(=Vcep&l66yJrXj@
zC+0?9zD>Zr!%8#59({|rx-amF*hN*=wYhGGzdF6M5sA^Sn)GI)_Poy$LisWRn=M<T
zFU$;CWfimhVezW#y^GFgR=!YQ5nlat*#m}P`%<pStp7@~Vt%ePwASx`{b0t2z0+=I
z2ioh|uKt^R_1|fGhR^HcwXN5$YvWm6X#8qkRQiojvAIiwJ}zx~{91L+4BJ;zm_ubx
zX?ZO3iJZ0k^Q7gUCn<4rob#5NC4Kx5>ts2L-v`VKdH>%2UU=e={eI@%%Y#bowfCq>
ze{IbQH4Hkpy6Zt^uTavGNs_xSJe+lb>&Z!GHO6M{)-Si-o|Gu6u`MXmF6%L8|Nm*-
z$9v1{u4Y-MOxp74?M=>`s)<}7pHv=&?yU8eDY=s}Aw@D==w1B8ORhOOljTp&)m}IC
z{8xMNtE==9!X;THAD?de^6o)=LdeIRKV&Cwu<)Gc7JgWO*|O#HhbQ9YXPzB6UDhn%
zDwFDP_(*ff;sSQDzdH}kG799d&lKes*coqrQ0-a&#JW1CuDxg9XX#(Qy3e6(|LG1c
zFRmyrt>?QZ3j7k9mA;$9!<2W@r*G$^eey3}?OA5{;`a>RlV=+R)ErX|Ppo6tV`!|2
zTAyqq9eeRnn4o_9iRS7{6LN3KzTtS@f1@dZrD%D8g}RIC(s@&7e3CFVyg51S9?R#W
z^4q3XFo(qb{Gji)efd|%-7yWJyABsDTG!)fc4J~@-kCh{iLTQE+sq8@&93G1Cj0L+
zpOr2Ao$bZ!=p~GW91GVM<}a(t58JohK53KM-pE&bZ?@ihQ<J}~D*vlf{@0rP(y#ZV
zTJK5yyeIW)uPOIl)6aWNuU2P^R%Jh}&R+Tbn%<Xd=e}PHd%rgL#oEd5*DgM|mo2i=
zGrxX@+dgym#pcHMXU}~9)@!l3_WkHY-7lt9n?LUry>`f9@%E~H+Ydz*m{w&!sn%Z8
zn%#SE*3WyNvJYOFn7_6r|L4|(tP|#&=f2n7FXqGhGp+2?-lx}_Rw~|K^CxNpNY#Y=
zusYoch%)W{Vr%|H8JIqqJvE*?tWI}^)Tgtj*0X9uv_8GwG&P=kSzFEKPuT~x*0A#a
zOnZ90DKvr`qH6U9F%yW!MBR)N=GObg-W-a$Fd@IJPWMLZR)y*LR`QGXb8dCJuzqL%
z3q@Y{&rfgiS60uOtmSramDJ<uyCij|UG4H@<ys`^?JGIyg!CC!(BiBo?+uSL#O+MD
z)spw&=4<0pzSd>VB_DbgP4?rE?dYo$oO5wigrLr<M?1f++vq9Te`wCquFA%@=5{~M
zOwQe>d1%(9J%JoCGjA3h|NJJBFXiV?y_3^zqKbZAlCLjo&P@EZ@!`u38%3{Yi{G`l
zpW`vy`ylBr+ou<rQ{DR~M@$y@f8*<khn*X^jW%g5cVVdgaNyjX6ARjQp1VC|<Ee-p
z30Kl}-6!N{sfx#hhUz_cdhQ)}IrEQA^|8s<a>62>D^0jLKWxi|M(1Z14&H13Ds`p)
zcoOKrC>SzPLnCRIN#z3P`R45Znd(z&QV#e(oH0AI()EJd;#D$suTp)_rl~)_QoeYF
z<~NT`4L7R0I5?})PpccfUlGGo`DJF|!vuqqJ=Ilzel3|WH&8KX*TRtQPM#YL!C%gl
zsF+Uq94^9D+!U@gv)@Vd<?bzICMJ`nho-sDklzvKS(<TF;b)hZq4s1$&q}XPs~*jt
z*>lV$>#6mjL(jbL&%Gex`e@6s!fByZ8dL6R1j;by%Vj1#vCgmJF4vy>;M8H;)Xj=Z
zwSyndh+KSQ_tn00rykw4l;5%U)SQKjW^}!Gk~+9hfA;d<FFyS-^*5<ek39LBXPfx+
z_VxSIW2AZ39nU}i!fx_OF7;DFviH-~)i^~zP1>`gH*Bwz?BazXZWEKPpFA!jXmGiu
zanqXnl{No84Zd`|6rJ$*^htT1)86Y3xGP>ryBICf<$3n=i=)%G%rIfyU>`g?s3daV
zkHDQ5e(C1jd)58mrJeiJ@0MNOKML=@QaH8QuV7tUlHaP#Pokfvsy$qLXv^i3N1`=5
zweE(V@Kd`NT9RL1Fe5tYroOUVpwjh4)lWBA^8DGj#Nt)gL#6})GYhrNTKfAUWK&lr
z%u;!HY>RoR=fg*?o6WYFxb+!bX6BtXVbe#=@~4YW#oi1w4_M2mB5`1G*vt(@jk^=L
ztgFu)_YYq<Z=I89WJA5^s?3aORvD{rKUng9hUWBoZms=$=f+LGB4B={xow%r^V7Z8
zr>FEL+poUy#O$K~s-s@)j2isc8|{+<Cf=T)eN$_?#mefKTOVrnW?3?prhnITPOua1
zw%WeS^MHMzK5M0ck@2U!DvK`Z{9gKSN&A|88x8J;#K}EK-rd~%WA$&&f2DylKWgMB
zhE<sx1}^!r{&UZ+_a|$zvU_6EHy70IFKgcAd^pSb-ODL5>x$T3OzHFI`ZJj+K83N7
zDSu`a*Pq3{o3^uv{#!WpN7j`JRo8u73-=a<&huXwQrcq{uH`PSeyMz=-Ku=wwcAeK
zoTYVr&LUf%HP&lS?5#EQHFmezv0nDj)<;gyP3lZi4m_UoH9XMLQ#tO?lOx_!u1}Y{
z^gi}tWOyZm$)W{1PG56GLQK1gga5W%+;nzFR_V63no6M+q8pYkcCMRT7|NXOq7gB7
zn#!IHvmzrjCZA!FSuyY3N<q;yKcVK;E&?h^P0wEXgaq!MyJ`{Fk&RbovM8<IblC0N
zsY{EGRoqU#@7ct7Wz9xb){koHPZC@MFI6k$dau|ww}|PaY8%gf^}7vSqSaa2x020D
zk9w+Vr|tB)k~HJR9}CXBr{QN$WX{rlP{>$OWTyY&$IjP07X)LHEW1i}CFf{~?D)5P
z#)YzJN#gJI&fny$opJH>nd_k8L_I4>{tMRgReJy1sjr!=dh=tJx{pECOipXI{~bBI
zrtMv=v*Kj=$y&C<23q~=roLWx|M9j%mwmsrUXJOx_NOo7qDhg_#~&Yx_$<SApX_3Y
zamc9Oemnc}nK(A9bH2|G_pGxF-p_LHit3|V(!u_=<@=`Tt<(Ncsp0vG^{zDkF6k9M
zhZYHMoNzliGn}t7x}@r9!R7*okF_VnyJH`=FK?Z@$m05<v!8!2?0mrVY+uS!k!=B`
zyK2QvW~Z~+Z8>!?xw!WJRs9H#iQV^_tUI{#61gJT#DwPFU--zreyyF(ea-{gOC8RZ
zYt#y}>EH9+@9mf3d!byszCQdCOKdCCwik>6e3RZM{n}B<A$Fl9<awaobgt+_kFFiN
z^z{Y*wc{_e*6%!-xZr(T=d)c4zx;f$dm*p+PuGcNTv=P47PsI1vU5?&ylp4D{iXQA
z*C&Q;HxJn`^{?uY`{f(=Om(>*e|Dll{1e+E&tuLG_jBydr5OL{Q;RtDg+C$hg+K4v
zi0P-pzSo|+I_Jb>RsZm`FO$3L<-YSs)OzRdIv0Dw;tgNMha$ZvwI?OEa7)Z!X})@4
zeXzvcsJkz87aQ!_d+6fXLoZ4<-7+=$Q^U<25<27GV}||D&$M0UXqb9AaVP7(vuw%s
zGI8@JthsGqlydK%lE!CSIRnS#le{GlU8?=~wE4`|W`@^q64f@P-CNpx=J9fq?3mZ;
z;wpc4Tw1-g<UO~Z)E=3oGwXM#rgBURSt@zgB<O9_hT9^+Z(ltrUY+KrHFcTFkNq0H
zTZMNlJ?&Q0s58IIUimUh=1tG0<Wt`*C6`CbRy>>;ws6m{saN_OukA73(f?Og>v+#A
z*5v333;FAO1Q!agwl?&iefE;s?2;_Gn`z0}&pzc`zj}51w6l8amhVmTtoBt6-ZUvY
z%IY`I=A<LP&vd<GJMR8(1Ha{A0p6Gsf(9LvSni}9ebIbB#m<-e_Ynr`%Mxc2xV}!2
zDf#nEKu~_?66Kb(#|x#MUcLWWD*9*^FUNcB7vCc-j@J9Ay_=zVb_&Pbs>O@u#@TM&
zc2%iTG3k`c?LWuLCti(v5+NLxnP9IKs&$2x=ca!V)3ck+EOj|uMnB~*Tg2q~8U{^l
z@zpu{A;;CV+2qo}=mO)w34Hsaf9}23o)~*DS4H(&uf&d98#LqYPX03Q!ki;N6swcw
zeBxWuwYH^Pr}SQ<Psz)j1>biIlr#mY{;{llYwgp^K4b1a`+eW?(gN2l+QD)}@?Wi)
z*eu%;^*u)%+@zyCma@FGyu{t%*edO^b^bAlW=3Jz69!JJ7xnr-e&@*j!*XrtRq3Q%
zI`>aq-L10W0pI5W>o+pjX5af6V9E7w&X4j4%R{@a?=;)*Sat5-h4=M`q@?fdn3Mfy
zQ_tp)s|`-BTVTO1%b1;cfz>n9`QWb7cIGF&#;s=y!Z!z8xj5N9fwAAAXglX;rpU?t
zXACdoWLU99Nrh#!@4PMg_`JkoDO0;JuJENzGjrH%4z9`86u0zzG{d&+ccZnEmHt$x
zL>2!zN1C+rqIEYf%JqKyPkxD0x5JT57EHe~@2`6HYsCo@A&WNK3)4DYTWtJfJWsMM
zSWByV*~5R^Zke6`+k2D6HdxdB$BpL!0n%Fo=I4KH`}^tU^zzI%`c1o%LXW){EX|vE
zZ2z$}#kP@3nQ!B&3m?@T)9^K}aeEgZw8xO=Zo;Y0N4II;x-EYGz}?u3I(m2IH7DIz
zrMLEd1B=qfui;9J;XNOx8|{rdC3P>H&+PkhJE@(@_B)>I+)i^n9roC&*gAbf%Z)c4
zenI<~A8Kp;*7^SPQ$P2uP+9RQx*gwYeL9axX;rSfyise`ie1NCZq6*0O*^NR+Tmj=
z<$7^-l3{4ctfaiK`tROGa!V#?p0xbHU_O6R@aHp*<u#LipJjbzes-im@Z-mo2ftp}
zxwDY{!Ngv_9~a!Zn5O)>5%Om46H%u|X}>>(FOIpcz5g${{qQ$Y*4sDN9L|pWE8g~2
z*=fb*y}v#wdC%Iu=Lwt3QupnjyzX%~1qM#c|ChAmOMc#?tqdm%)EloCw_RSr!Mf|y
zGS;*#Y0<g)w|IHe4o$XE-H`QpQk(Ro9d<wSJX9-pZQN+pm=)A`YG=~3-u!L%e?FGx
zxOUT4Mr_lwDWM0o8*iJq6vV&zC%aeimwr`=Lvm97q^GBtt#(~r&b1{hEqm+jYr@)b
zY6W^z_ZIrDoO@#Sp_2>j<?gw+Go^EVSl@Tp_wbDKnlp~dOD<2?t89E!sBfiEg{tE8
zPn=hLA3cwrBV4~(Xxh<L(P?KM6`DN^fBk=6vs1~p4~mOD=h%Ao)V%#7Z>MMC#Wc$^
z`e?UJ!A03j$=A!*xii^1D$nr!&>s=nyY;aTgHOoQQiGxgyG=HT$Vl6Tg)Y9)!8m!w
z6-k~AOw#YpG#7$8SPfi@CNx_MYVVEsDQkI8BEN#6QsyE<a?eRUx%pL#CiLh?w{$O_
z&iya-YbA%qqQxR#-);+?IQ#0G6{|hiWODB@-jPylmf}-<)bhx>B}Mf5hv)n|eInNd
zAM{D$>#wu3v9_+fYhCsA`#r-SS?Bw1cpv3wnj0$aSYG(+{~Q~e3SGGh@#pUSO%*wn
zCv{5tn<}>H&bnRxJYQe9{qf;LH$*0W5IlGy_TY1^g0taaR#m6GmOD?KDrw3sKSi(f
z-JQ8}|I9yq?|1j)>F>|$>uE0x48ALQIWuLF;n$8V#&&6j4xYaC8neBZZgAYMzKf%L
zcG!i5qGeIedwa@e@0hbdqjby7cijuv%4M$}z9*BG@bqWWy}GjI1KnP^Y7=Mm<X_mW
z*6(mL<on;PZ@U&vkbd>>MVflD{MSDm#&dV`<ffio&f9G?JtcPCgahhaAMZzhds(o_
z{clZOO-1Dm>tA1AeC3?X+g^QRO0jqPluJpur%Kkn7JWIFx3^g1f_3E92`6uVT(HV}
z-iLm-r`gXLs!d)^Im!5@Fe9k+T#TI(>(Zl&cOEmYpBK;Rwd!(_<Eh{^Rcl?7cPm9N
zN!UF}OILM?`QBBIcR6on^e?|Hc2)Ja=k~?NOV2O5oAK)I=8TLx-`a~U**;%QO)%IQ
z*L3xH;)+MJ=J;u~WvML>%I(Q$kjeG2e$T(TNkz>&giq(wqojvy+wVP)x--?BcRow>
z(<WV>U$zS0lqYBT`mVfoamP~Ep4}X|X;&i>_UXnio3bx*iL$$vLOWCNrbAvecdbiH
zC3$-SY|gM3pZ~E!+eIjEs>g)s--E^XmL1cpGM4t+d-B5HAcO494&Tx)iiubz2z7_2
zn^%8U+dbE{_Grqv{t18mj-7UFEWE8zpxkR-UF@+w%C$1JE3CRZ((cV`@#XB+4u>!N
z_E)OiB;PvuVO!M?@8jDviZ3$GZ9c1;HgS7Yk%s2#DJ?<CoC2AL^%~FW8a}lAswLTD
zmDKZMZr#N6Kt|=@T5*Q*BpW$L_d^~{i~2N!a=RV9(mkKFI@S5kDEOSG{?D}V^9$e2
zR>rs5W?Dr)zUZ*3>yVW)|7wkg3A;B*RDC_&WtLIP$+z0W{Kwqb4AGEvbB{BHZ+`uH
z`H?p73-&YbzB7C|U)J0I{}szO8++ZpZBW0oBPaXswFC3z{-m>Zy=V$@cb8w=WHa?0
zYfA9x_pG-x*^=)~%~(8Vv1!%1useQMqOm_OTD(wlXTRC3x0K;U>*Uj~j;;yYSh><*
z<u3y@QAOd8owv{bE0{39vQg=xq1G;EmW3ByWlPC~UD-J2*w@!9M7m{Htctx``Q{hP
z|5fX(+&%i@tleBA^?aTGJ~(7%WwS0p%R^_n?iEdUJ>9^-uC&K1r)$?dXgwj_v1zhh
zW=^+E>yw?23s>gJ25<h;n0e#XF3yrT1%|~-GE(M6H6&a;S!t`f&dDiMdt1jEkuKf0
zi@TWGy+!uyoNn*PtkV`MdUS8(#a^%8*R^6Up`Gi#YjRf0&U?{O$)wH9zj5Q57mto?
zy#1a1vl6d7$F|coQkP!8kaC+heSORh5yqpZ_w2Jy$aD9wN<a5!$#=uP?(gOW$1kRy
zeB`xJ>(g#ilORpu#U^vU8AS9<F1q>Z>7CVVl^4U7q|Yim`<vhW<eF6(Ue3<14)n2X
z>EUM$b3Xl3T=~b5Gjlz>e+cFAhd7;{#-_XY^6smjp5BR;2?{!w=($@dJL2)2Q%!3-
zZI?&!N<NP_pSgdZ<K7u8|E{Qt-$;r)w=m0frl_>kOi|z2dL<40JFow;$UEr~88UN~
zXs)Yo@0;|3%VHI!M?*q)Uq8J3)ozPQQ_qaE_qNY@aG&}6ed9A1WnP7Cu{1TE6yo?I
za)NbxOrwgxeUC@MUvkcU4b6<4b~?JCKOnee@8eVV+<Ln!k9O{x{6sY3=i+cr8%LWk
z6ONeRnMuFZXLshXuQ#Zgzis;7fY~at{#|Di<Q#(YRn{9YTb6A4c`Q>usP^-rxtE@(
zY`(B}7Hi_1xh__hehVzh*;uBtF16U=Nc=Is66^LO|Jz*Gty@*)8@zZHv&N(c***qw
zoo52}_^aJ`k|fl%G=J}+ZV#zWDV@_gDp?VYH7kmrI{$mtFC@vz9enKf{s#HSIu~y{
zJz>e4w2P}UIHF83E_jDA^S{Tv>~Zqb4t}{dQ_1g%dcJ^C|A$wy_a97k*(58ve%{2}
z4O7qTaNB0;VXeBWam6&X^<8tc?Nz^@es<USbhWsAm$bZDrCUt#Ta$D19Y5c#N||3%
zu>Ev){u9^RGNBd+KQt^&jt>9PXz%wfRqRu}LH9zfuO5f_lT3r0SDLfvT$z4Qsj>ON
ztL+NXd}~;KG{<a-c{L%Xa+aUW?2;vC-k55C5;HNi(HDDMd2ya?@0P*`p{FV;yw2TY
za{lBmlz&ogTWemY$npP^W;UPE-k#uhGx+`yVd>MHH_KeBo3c48&NuVieBvT_@#f)K
zO3&K<?`X7N-okfsYN?e(ki@w^AImt7U644%^X%L00<)Pv8Vy2K-uo2q^R7K;botQX
z(?6A0%LfSQYXn|D`QoI@Nre+{CTdS?c<Q-v$J=;8K{0War=1&iM0-AbVfC)F*x`2h
zB<5SIyzdr@ol|=*P~mz|Gg@16R&+;#tMlisx-}UYdDni4_MY`FoqLPx(bR)2ep`&T
zuM=6!WD>^oWbLxw&$`|`yRx=z>c)Fde?GkFx=G+$<dJAqf$gRO>z&n111!T@D(<ET
z+S^;&=q<RT*I4AtoO;H4`^?8vQWxJz2yA1Xa!)`1e0N3pmydZ_G0QhAxM(h3q``VN
zbTQvs?rYUj?>Eirbq{z~WIAcX#dCK*c4RTF&nR(pO;Qc~bC=_uiL-}R#rb>lV(0vM
zuQR)Dd(*e|ied9xUc6er%9eAIy5lAlM<=1xIiauh72{ql+W+Krvap;~oP^NVzz>IP
z#5O8w-2A0tw$FcK;>M1DMRiq@(%W}WK5+C{t-O<2Q?q!m&{DtM*43TA{u#Wv#qpo-
zJlhG$D)YyAz1!9;w9Yr!`}SJS@BP^lrzY~d-uY{Nhe6>s=ko8)<<C#?v*lfg{eEnr
zb?kkAsdH*~(*EU0Z9UBUTjc%1`|9i(cS|p3YUJ@RnPqjb*ZS?Xs^I#d*~JY}))vK?
z5B_)GeVOp|hU}gl-#lYZU*O-hRsI&+pZK>7-bz3ICMHB#9bG%+&h7(&yIbyl*f03|
z<j)PJ{rqQtty)p^dS|2Xm;Cq7FDl*MQ1+qtPi*5yIfl7!vr}6ZE!)~0es99Gu-cXv
zJy$MDy1v-+k$v;=ZrHgWr#{<-VLkU_R&Qp)v&T+ZR&(FHeRuEf-M2AknRNQv&sA)=
z{M~)`eBFlX@7HAgs@BfS6)>rr^l;5h(P@)^wC|kldV_z@Ns))=^3u-r-d_6`<+P7`
zkIIow`?xN+_vGGJ_gMDt+SvKeVPci)z5U-VUjK48n_tO^TYs|K{J9Jd*D)`D-n+hb
z&7Ina-vPT<<aWNlmUng1^34Z3PS%DT-`_uXqx`SGasRK)R{7?=w{iZ4)wP!v`9GMJ
zxBmKRzR=%0RM{6QvoW&0>hF>3Y}hOReRBCLC5{(&qjME*O_S&do5<&LYDbyeB&%AM
zo#ss6@Bf-`Bgx~|QbkVh#vt+LOPai==05iQTc}wf<y2wC_Wk=b&BZ6LNb-Gc%;1tY
z)t$^b;eP~+Z-`!;^qgrGHisuQIm>k)Xq>g^)`1C;0zLvCgwm$LP6aXNV|hQnPknP{
zk;JV{M^E39yz}~Sa@WJmCl4(5?5%q2!~EVmzoYkY$b~H`lhPLPPmDNMGK-aq(c(*9
zUVrAz4YQnPcvK1IF39<~I4t;>^A|&Lkw-ok*_Y}`u2yAtwFo|PcOk!5^LLHOI#c-l
z)^Uof>{zpse`3U!l1<W<{|&{39(}#i)}mc1bc8pW#djU2xKh<aSLr3&YWD2%Fnd0$
zz)>nOvGr<j?bBtKXF9j;^l_P8uu$n<Y;4DZjCm2<lkyVYK4P1uvoWaYxJiq()t!TW
zakFC*Ltm*CYMS*l{Yt;A{$$OYQ=E72rL5Y&&u6hF+j3pD<04JW&&wai>hH3TU|KLu
zVnLsTf;U&dJHJTI6)kSfsZvQRax_C02s}#tw$diV$(l*epL^jd?}dvvFM1tL;SyCk
zz2%63=@Nrf?rGB*yjF-hK3FBN;+f5YnmuRlO>g(g`0n7dQ9w&6VX0S6W<$%h{#3J8
z2Gg@me9<AFyqi_TrZ01e*~V?{G28CrvCH>FSSGK|H=Mo9g{vbqc=L)qWiKWR8ge`m
zUC!TE@iRJU;gv01SsbUY-n_wGyFe%S#~Ri9+0jS$PP_ZqV?h~b#gSKA?@l_DEbjYK
zVqW5eJk4JMg<Es1Qi8LpFC3TbIOCDYb@!!`Lgb<J+{4ovUF6dpyH=Qd&Ch$#lvZ*z
zL|$WK@3mJRrS-pNXir>pB<g9SkhDta&nH*ACyO()cBRZ|>DF=5Ig)=`W0%-<r3J!Q
zUwS;>xMQ`-nyF9nF1IZg)HV2Jzs^SQ;>sENZ+3}z{<7#^;weA%TDbJ2t9K^MdjF;H
zAID4fbhEFgSD)wISbQe0Q%C<<;WUdcEf3mvghcf(d9TeVa$RM~;%!UitbbL=1>9mV
zJvuwYcJ+Zz^2Lm^c06u0-`BX4`}D<?n$O-;#qx#4^6J!1P<eBAn*O$JIUB#Sy}Phe
z-&2jVzx;`G#_}DFVhNYp-Ot?XZJXlu#W4J6!uDpPU0L3HmR_HINq4T@JnoR2wqB2_
za<{w+$`U<)prT=-jp$R0?)MD6K3tYLxx6>NJQOOnnX+}t+t+0W-DM7k>a?!pouT@9
z4d>ndGs*iTCu!z{GieyMJ7&5`2J|-7JYZPLKVimNt7(6>EX=Sz=B4ag6UiiDs9&nH
z(|d1*rO|;YpH`*URQ-II^KzQI{Abg!Sv7(3Qo(D)9kjSKO<Y}D8<)ux`WPyg=d84N
zC1TruCPdZnlB&a`4V!e+Q=@bCY%091nlPzg%ZG@z$}`v5y$&coe7Y;-`#X`x-b&(u
zYK}APJcROnmh0Ka=*TgPoAcFHsL0%%@J{^8N12LAHUX*%lMTw8&$;v}2|t}~w=+4A
zNrN-p{OP5QkrVnVBV)zXIHzx4a!apP$L6~B)BG(tdhN^EFFpHXoV_{Y$1%M%*7dL0
zJ+G}7x={FYu4I(Uh8W?-4z2Y&ZpPS$S*<dipL5M-(@SPm`wQD%E#g(X?qWB6bD`$@
z{h{*@XFC0ynr$S%D<~>|?&}w6$L5{Sa?PH?J<l$qc*a^w`7LRTTPm7;!qZoJ&OKbD
zJMr4|Y$Nt9LB_WpNQKXw(o&qLo#X3z<IBTGyTmRz-u|5G{;{U7arGOfr@NCbJ6bQ2
zHNNh`7QVA{&fyfN>ow~-c?@zF%u2ev_ud3+X=zrir-!8!9&Kgu5Sl;rPQiL{-tuc3
z!-Zrvdfk|ETlDOr*g%_8I!C>9Kd#yO<XW|N&R%uaTVA@mr#+eDm$!7=k+3YTNp?1m
zGP6&f-4J$>$NLbQjmQ7zt*H+LwLj|q<P2P0;B=(e-LdGcP(bI^A7R0MOP|%$N~#1|
z?zlDS2jkDmTJM@T|IahOPpWyTdSH^l&O6z6wJO%0JbxiaP%qzm#~$6~!PfrjTme!m
z9>0<oiJY|JPgu0p?w5}%W8{*KX*sKL&Ng3iT;Yr1{Wbcfy@y_TL`2t3yQVd7>CvW5
zXO^;h7qMM_<?(mUmyJ4G4#`j7?V0Gw7a#Sh_;1+9nEf16%=OBDBzf}1TP?d|oN}()
zIgxwM)CQk3cXBHYyrP9XMZQ!oP5PSaeCGb!H-_~wOD*eiwxuez6xzNJ67ckEdg8P)
zR>Z5a!|R3DwkIkpbmJ>>KOX94ywvV?=;o){A#)%3uDVmG9(`>SONx;C;tyh6pCfoT
z1=*-tD;qu4%L!hwK*ZrPyZ5_HlUJYLFTdh?uIb_%@14Rrv+HA~@LAqZPZOz4;|WRi
z`<e5vGSF(#h0XJ_mA1V9^E$iZ_!YJ@ldNls%9W4!cI}cq@%d7~Nz2n)o=xgDo9HBZ
zZ-PR7?Sm&gY3III&3YsuGs9aavO2NTBXD+o*<?QJ``&3{ds8Y;oXWlOM|n=kouB15
zea;=!Tx`$d(eQVHN=0#B$(f%{hjqAkzj--Xu6U-?eD2TBHz)MnKW$&Uwf}ea#9bCI
zq<&}b-knkXn}LgOf)4kO_0b;Z9X^|`S*VeD{vh}JhAAS=b2zK@%WP-eVf?i5a=UwD
zH}77@UmCyuCYiadzoVTJb;9WT8n%D(n|Mz9-FB?&FqKH_{nEOqZ}Ind)_*H5yu5Yp
zT;98SKZ9F#Ha2&@sqH?V&$pfNxp|!ZhmX_aLe$e<u<cgqzxM6)_uFhW+nAG+a-_o^
z@U6Z3;Tq?igYPcv|M=@%!SqYKd5&-D%9#28@0mTn%Z4v-68E$w&u9FHf4slN=zOOB
zlHI~2;dgajt33}qS-84-(#AC*T719w6Ps=^I(^a3dVAwo-_GR8HL2Md$}9Ow`I#@S
zbMG^s^Q-zx@3h=M{$&lf4o>VpdqqIj(mDOh&Hqm()~L_6eskqWq(9U9XJVI1V`NqC
z>Q8cc(ly<qCFuLL)`h#a`nBz9y;hO6?$1HnKiqre*Zj>jmG6??7XO>|Ugz|WhmslO
z&0m-P$rrAdda_&gZ}yDdw%GhXXV=`;J)Lz$n(g1+oGm@S?oSA0tSh!RK4Z-2R4;ue
zcDC|mp>4b8tznuqwLZ?qx~{t9=j+|VyEfh5TmSRd7mlmj%FF9F_Lr6S>-S$gKRrKg
z@vpu{y@%WEH9ebK&%Zkv$@_%E;B|NOb;$;skIQCEm2ZEde4Am@hhIt#Yxhc2J@)4)
zzqU5kVcMb(*GiY0y38xfo+!aJQ(d|If#r@u`+~cLI`@=bUgbY56}d_zKXQ?R%4rdn
z&YC&1Gt1x9e9N1&QvS^uCv%HE2d7;;ccq^9t5^S=3wLkaabL1l{98e=$MYQ<8}Hx#
zc#Qe`>D#Y+zfSxwpKnoe&3u08_OrfU9`|S8eE#sr_w{!ZYB!&*=W}0t?#kgw8MVTv
zR0^ek3h(LX-o2xE{j&Lsm-FmVeqL^WfWd!`LW%$J%e^Au=|%^ueL8+>Vm)oe%`@3}
z!xguM&##$XG;ZR!Ew!ufS6lef+Q$c_gFK{mm}c61XyTr}WzS)SALZ7C(^kv+T#5Gh
zIe*g2?f0)GAGqMpv2T&>mVLYXzFofKf5T?SEZ^k;UZs!oY<ApssSjB2qTt~M?)`@}
z<OP0mcfXgc_*uU0Z-Pjjf!(_u&X2yS*C(gmd;9qBZ;=Fth@DNp7D~&7t=%L3ups?K
zU;eV~zwdp1ZqQf0SCG%XLf*XCwp#hjO~twm%~$Wfvx?=o9scZGZ~5MR`=9YSTZv|^
zkGz;2|FI&&nU%BNDQHHmL-sF;_Xl1vFIu0!p1H3^Kv3wxvHX8`L`?pBbuP5&S!(X%
zwQKzX$^G)o*%O;~1nlA7Ji)$;>q%0nZi(G)jX4MEw_m*Q-QIEHU5^`#;uaY~J1(ze
zKdSdKs7J!;(!R5`MvmtvwMuSQIw^2_Z<)ceilY~%q&TxnJ1V3ZrVEC7)GwWBc6{?g
zf$e@jWQ@+{`EI`yl4iTfN2pBx`|e}cu2z^G`d<;fKR6=khS}pe86q6JjP}fq+f%gb
z1@o$<SH-e3xUa@NF12(y-uPWI=w9x^t+#%2PUuY0NUB@E_fUgN=#G=*oU-!mo=n`I
z<l<uCa`=VNefQ?Y&f8x*cTanRi$tJtRQ;ciPZt-n&*wIjEw@hM|FpK7r^3{J<`c%0
z4bk1pvZc-#oK~@EzWG!rEPcA*Kl_E6v74$nT7KQ&U2wAQ)1mbt&z9>yD4cJoBz<px
zyV(c3((N(7g!dd;QL@bZ^T%uNnnGXo=9iU~Wr<Agozi|%uU)-DIdam6;vb5cA3sKx
zcX>K4)ja+C<bC~3>yJ$`tK<`!{%K1F$AWtz{$Fm1n#I{Ky;3(#Im;v9X2;5%t}C`o
z{j$0B{>?+yiAu8r=7~xC|8pic|9$X_OYHKWa_y2by;)u#txD`$EV=Knu_$kwXvfE6
zzkXe_IxG3>-26TBALL(Q*vgZvZ8S}1_r`sm6ImxRG8d@SZF<x)JI`V_*K)>r4|tQk
zZ*X*!NWDE*qI{g^-<sXq3bz|ertfZ$-*NWjvQ3xef4PK5Yxf&*e6{XLtQQkns;}r6
z?!u&%vRHM?xmS-TR_&T69Q8!jiQ~_q8+)DG9Ut7upTWk!XRZE+r>TnfgR7<%>m|cC
zE=z0~A6YsGT4tT7dfM~((e@itKi`&U2Hgj}=n7x+4OfR$^9K$yUO&{n%s%7xi&tu=
zCiEV?e`W2{<BV4F8}>Wgt6CK8;C4BB&HLo5c2YK>x0KrM+&TZf{r<A7GmT5)-V;7#
zMRVg_#33uQEt(mB9s`|qvB=)5)mi0(1AG6L(-k|Sy;kw29X@8IbZ^4-;^3RCs^X6)
zgub+^i>QBR8~=aD{(W27elfnAGxyGp?;eL1Pxt$Od9E<eAt_@g6{CgkUAF7+h`j8J
ze*NO-tz8>MnWvw)np@2M`SY(ZrWTHt@Hzp<09}R*JqCA$saermGenO&tqQA2wJmdd
zI<vK6nbL8Q%3~c$N)OD8?I&7mN`I*P_C3T->(wu}B|9IB%DvB7*)!|%NxP)$eVG@I
zI`=NSZ=dEObht(EcwSS}rSIzBXG~mP$G<;0=Z@&t5Vz~?qKyano->OjyMr!+mJ)UD
z40`#ev2s#ld3|r?r$3f~`<1)<DmUc5t!CfgvVD8v!-K+EJ`AqAzi9tGv?kL_$7+wb
ze*Cne3(TtVcR1>qjVAEz{JhldSdU)+3A-7WRfSe7KFZnRDAwj&r*ej;!cD*NMR)Dm
zjm_KJu6>j`^<-O{{E25Cy=%WdPw`zN+?}2N#OLFuJ7;gi?w)PAnR#OC$?E;Tqmwq>
z{O~G&0>|t|hDmAbGir>@>!x(?UUcy#&w}R>ThiuV<4b4}zxRU8Rr4S(OT$&8f{RWa
zN0j{v81-#G9xlxeSe5kqmSpAO-+M1ew%=YTU2*+)$DcZPk>z`}>n%F!8kv9FZnpc`
z<bG@hQ?*UJf9zW-oUvjhpez~vq`+MG&#LJ1Mq|bL6kR@1VePN%Ig94pZFc3WEMRjr
zx?Hy7dNluQHR&`X#e1Li+W612Uq8fDJ%P*q63;!M8#7%Qly-0a(Xi3^YR-iu@rk}s
zH3x32xWeVT;OH~?H;a#GEI*u-{9>Mz3@f+Z^5>J^zZ5z4_V<Il`pSM@sap@t-u0J0
z5LB1D{q0i!?IzDj6;eXyk4FhA{(7Vt7xVwio!z_>9)8HnQmy`--IMHbi2e7Rd%<dv
z|9^_;zgnZr@vU!0VCVO;JL+}4^NoJ~_<rE?SIb{*mO4o<-f+)U`BQyms_1@4pUoLF
z(l_k>^HaU6y7B$SN~!HHFWrB!#^&|!<U2n*bj)?EvNPWJZxor`%Wka^Bso|5_+by$
ze;ilm<sS+78=~xR^;;H$Z|>*H-Z>?ILT=wVb5T*!qK(UA@{6k<gKfU~oANYDf1BI6
z+i@rF{~yYKb~L^-tadrWu(rO|+d_1yZ-S(l8bd$~gR{jXW}dqr83b7FC?y>Weq6d;
zczO8r_o<P;yH0$z$x+(M)b#zoY+lZ?Q!(Zn)mP@+QOXwde=Npzvi|*UwtttK|1%{_
zH0RkbdGNwpsgrGzyZ09T_Pk|r%Pim$`!@aN!!O(1`?w7@er)1%R6K8UyI(Y*qPqcf
z5wxka`(!DxYv%v%ly6K}TJ$*EB=zNQNu`5}1zZAiZ>#9YaAov8ZxLYn_jgy=6vYQg
zC-RIHZ>F1l|GYVf=cmH6UG{B}uhtze-nu`|bta#iz==~O6DG9!^zymMt+@7GL+M+{
zq*p6dt_FLqT0SYnUv;IN+)DTONw1>UF7`~aTVIn?(O31)^rmsCmQ7LIdf7dPZ+~mP
zdOhS=l(=uu;?ISmyjzW2omuC2zS@%|x+OMnYKHgTMMfgl=he8i0#$CsmG!>Z<<|Ma
z%JoIyw2p0?RTuT^osZXF>axYp@>Bj!r;^XnIs$v0Iyc6!Nb59-FaLku^ZoSg&yWA|
z(2K3vVEV>?DYL`QR%XA>mg6ceQ9S~d_B($(FFeoiVOyAS)oz1bI}cs7ZoRnnYVSQG
zuEn>tW$x<q#Qi^=D_6FBN97#3{d$U#@?WndZi<*UUuK%XDu3(a=KG5OJZ6}DW+w0Q
zz{$tAom=~LwSIiqu4fy5F1CEo)V+YEi@RtEuX0`Blj(;J?-SmY$$WA5Om=tn-Mcd;
zF>F6pKX=QaY|+YuUvbv8;*1aSWI`R@86SOL6z4j9yPi~Ac!%7%c8;J(1^K=?3%GQ4
zl`a1pee<`$w#)B#C%$Mq!5Q;}=lz`D6Sg&0Gi*7%HN?+RN9E3kEz%~pl>GVs#J^9Q
zGa=>Ok!_J-lZu0E)?b|SFHrTmL)BfK>p2H^8FU`COF!jNmFaSRZOV~4Yq@)iFG%0#
ziFFaP<t<;>!k<35lRrGUa!X#g^XopVwHu9mxK}UZK4HM4Xt>~p<_7LWRncR$XZHzw
zl$-PF)Cq>$<)SGDyrotNr_`^;C<irc&#3Qp=JZrq_s!jD_u+#I3|jJ*hyUex$h1AW
zrrq?i$<3(!$t-S;1&z{vdkq=;KK<ItU7q#tv6q!%_`8q)6_~}E{;QunIgxqe^Ar2s
zf_2_}m^9PUS!=tJl~3Nrif0?WT~{A7nYuS+g2yujzaK&yPq!W7nD(oVtMwmWhnCBv
zvlktwtqGrXwx_l1&Tb34Ju2ppF8XV+Y?;c*5o#o~U-MwDe=38l{jyN&4&&3ut(M4H
zAFp}dySSxeb@EHMP@xSA4_@Lubx9)D>Wi><@|RgsI(L`o%oPaeTpBH<lN&ItkL|%b
zUyWTd{_C=Y)^$hp9^?KLDPb%Y$o{zf|K^Q3g)?RE@`oM1G@EtpJkx&)`_>;{vh2|f
zj-JMbX?}~(Ufpr@lCkIq<vo9<?z;JXhnVU0u($~>+-KF5jT0BDZ&UvnvEa0p?xAg)
z{xVcv<dabAG^;lf$$oi=|Jkc!X2r>~S0BE8=5g*izI@~6?N@$p)|#;7Ui+G6$IA=1
zwrq_*zvl1!Wc5epn|{dWEPWn+`?6Pk)XV;wrRGN3e=`?OPyQjQ_vKMib<_)g?%ID&
z`DtQSme1>=UixeQ&0K2##%uZ<xAkIMx%h1(<2&EnDbAEz!TNGjgYc@wHbz%Wtvg=z
zue4e?W6u3hi-lq;!8%iwJ9U1anOVK1cip??GVSImDd#QnMUuAgmafrRTz24siCwrF
z$I2tkt9{Ft@yS|0^)#v2vR=pSV03y#?Q{0#62-L>QdS9m;STDVb5dI8?wMB0_Xjh!
zF=Yw*otu!IXtw*?z5_dL|NcyTu`R^al2_mUwd~&7`m&qVl~t9D$@behX4m_^h`eg|
z@9gC#-aeDHl$X!g>lfMCu|xRWjziF0ZpM2{nN2wNOccJec!ic!`s$56S?9uZdpFCT
zK6fT9<V3UIt64db^Wqjux(F?;a6MkF!q9V2KJd?HZqa%(Gm*YR-Ck|~(hGu<iaveR
zT*qs4Yr#wXaMO92IeClZ=Uz;i|Hs|S^F#^v^M!YW{|UtIba+}PlJ!`uj7#Ck_Zq2v
znyT~o1#>rFaJ_6TA6pq5(f)#G5nJOD#kj}`%ak3?32atUTQ~b*FrO~B@{w>QXOmg2
z!8WoQ>z*5Y{pf#qrFmn9RsIt(Gvz-&Isbl4SX5|zPcLkNc&)+rp8k(z`tuDZu$9Zr
zGcwApn6^$)eT9aU!p{{mZe{(BSav6<PXF<7y$f$n?mm7-=;&<sK+cD)lJ^oNJuHNk
zc-;MdXx@@{c&pqk|K(ZkC*8i_$=^6;Zdm@WWdfhko8+4gsvmQF-d*37X>ZuDZo%Pv
z%{_;bl6O22{4KjjC677c!K$*{eXlMicWziPO;^|_VcEnTr%uJjI`4da!9i}C*r{+W
zuk!)dxUOD|UhU|6P(Z8qHv8>6#`Z;LkG<y)e64){(Qoa9sF}K9yo@=IBL99``u*u?
zA(=I-m70bV`tHjFEmpYq=y&D~3saGd3EDZWJ$z>jC#>SK+iK$1lw*??Q|cEhq;)oN
znT&kB-1f-OuAhHCw&&*73s)_jWjJf4siuL)ey&4aD{bd)wSSqrglnqY>Xm!6)}}R^
z&R?LnAgm`nWK+>Ru1#Ds!i8Vl%t-a!Z&Jy&`<wNxDt~Y13CCWzA9+64S#KuC+c|%K
zzx!lU&ROFsA-($0j>$)V{CH?!7T&zkY1)kUy{l*Q9Q#=MPc(IkfW?$BlU+0CzIuGM
zFK^>w`FZP#URW7_Ir{YB>+9MwyASr%{`r<O_0BP)U%R{a?~i_X!9O$k&GIdVceWVv
z@0zWX!V=DOeUnmm5^rqMm!h>oeT-)|7Tp$oYP#XptFU!flQLGkbbG0>JJ3gY-YRVy
z#=R#^62iIPe_q}+Gg<l-!wk16r&w=Ku}!yld$Ea`CAuhR`6LdPyBnj~d)M1@GyN&*
z?|I#SH+q(RQgL?g-20I2E=_^+<F{_{>Qrmkei(EnPm1-qo<Hv%#82?IeR$-I^2aM1
zGIBr09g}#t^-1jV)h=IFddV$`W7(kl$;k0o`bO>ix>dauyv`>Xzuc5OSK*jEw`<yl
zwRIA?w<nxzukcH1XBG(ylW?|m_3U2q;K-z$sqBZ94$lzz{p9?!^2Tikti)PHQ$EC3
z%{aW-LjH8xw;H>@EAAwQe?Dxq+Uj}t)BZIj0c*CHFH_zwJ?C$rbIgirCFB0%?|Q9w
z6q>TQ#a8O8ylgYbc~_!iKlAJ#yN}Mk9a66Z99PZ$_hIs??O(zQf@bGfdOhF5Jz<S^
z@W+(A>S(v-(h#kl^^>jF3ZAT3wSi~(?<WhMi|M;8PM6sDTyOaWzNg!nO-?SICw7SG
zx5m`jw&inndvC6J6teZ`vPlY(s`t`9zl?qsDX_ix-083>`Y%77YxfZ1P?|YGK=i-V
zTxFs2huL1+3Y1*?Z|mQjXb`ga<b|iL&!f{qXHDC+G3DUI2Vc(3|K+IPrgLq(2-~He
z%}llmk~;fVUaURPaQnrZ{K@-&&pq6kC+{?&=8L@fhl_XDTDxt?Y;XLX-;vJJcewuC
z9Rt67749;pchmP-&zw~Js66k1Z{FPll8d@EwtahVvhAB}ujA8??#reAt&o=b(`fo}
z!SnjE<^$3yYZe-HtbF%1<1uGf`wP~UjNWT+gl0Afyy#L$44j+M+&1Y`=yeH6zhkPW
zuI-K}iJZBDNs7O`@2kO~yucHs>+5TqBi|q6ZdF=$<>rT`Jqs7S3}6g!47hb@fsyy=
zQyNx+%o=C+yJ>~)mh9f2Av=>TusrE@JKyRO(=APjXU}ZN+McK_aqS%6Zmpc?HyfUv
zdiKrA`c2mc)6Iw1W#zrSvqAgNwxfL6>vHbKJ#UNU-IkUYarwrn8q=HWC04z;{^s(V
z-K%HmTOUohc>4wS;Y~dShcfCX&spB!C?KhRLe_b&THmJd{IDf&R;GX6;^3J0_4AEW
zp{whz1kCFZlgUeGYudFiWrh9!Ge7ooZK>{+F47ATvE%Yej<tQA!hKGCvF71zu2WW;
ztY2~Jfn6E*OW)M_>7kL8D?g^1?U*+2z_-N8k`ou^JiM?<DdM$M+>Bi_ljnS?NpO|X
zvaAR!7Fo@?w&dO#H@AXLyQSe>T?^J8xp3d@SzXzSpQ}^&vh8**n*N|GP5s@)$|ai@
zZVoNXQ;B&cvu^3W>+RnHbnlDDwa#1cly`kv(yCi=5;s+EB$d=Yo|*dPf!?Rh?vMHG
zA6pzgnpLn_YyR>!f0>Z?g^N^PY94&W=px(PVVzzOf9T=Q7yf@-8~JK-C!ZGHv_fQc
zYUp8cUS9R2y>lOOtC^&}48J7*QIj+O-MlZGR9~cOzP7bmyXNY(%crDXwL6C$P6(IX
z{PprFNAK(1V)racwk-1E2%dVyd#Rwu?L|*6U+s`!n>M37{c~+{sH>>?75?{Y+NN?m
zsYsftu{Lh)a@KP8nU8H32Cvz3^#6f4!_d|7PgVtd=vt|((6;&ZQP(Ml))_5u+o~db
z%CJ(gp!B@__d^RmOL})IOvrL8-cvBQODNa$%KM4Yy>7e2N@NN`b=W5U_tkXUTr#bN
zefPXPyZBERzW%w8AHR2(#m+geU$vaSclhA9LPN(DVWwG*bN9aZaHjUuPy6RHKKVy|
zI~4UTxumAdM0S3+ivPdWKWxOW{4WvteRTQaRl0K~hPx$7>o2~v`QO>ChfXWk8%XbZ
zq-XR%_3xAX$-Tc1-*j+x*znD_O<=R(;g+q<^8al=FaLeh{fqe~#-s|h#_oeJcPkX|
z$N4yxcU#$2cd~vocoPL)P|@*Z&FgC!ucdZ<X1jblZ*AhAa^Az%pVA}F{4C$WcwmRH
z-~0A==cdZ@+*z>uUGK+V@u=%5rZ5$T9e-yvePKaz#Fk+79fiy9M&-Zq&oW|LBRj$S
zynfm8=Bdi1A0FM3_itQRcVX?{3uX`gXR%-Fj{RZVlqtSqulF*h|I)s_HGNT^pPg8<
zKC3U!*1VwU-`l@?PM$PdBl}0DK77Vpc8B!eQIZQ+WWIec)x6}ed)GM+*|~u&=cJWh
z%V|3;v~o&pxxm_XR}%LkikrWWw_Yi+x_SHV-rc)z@0`UNA;UlSW5V+H{blyi4By|a
zwVv}O%J#NG#vhf#k(;%3)IaiTnzA4-qu{-^;s5l{H+L%7Ut9KF_|M@he~s?`mHqEE
zJBeX_ZvOgM_b+P8gZFaQl_m@SZB$ZS5_a1?{<7KiIDsOmkL9rypEnCD+{u6NWzWa0
z{kvWqzSVxqHP`#el8i3-#NFwu&7K?XexR=V>xtN>ZQrW)zNy~YA06bOvs$(B(u5`_
zxpaq>m(>fOe!6!-y7ID+L8;1*@+VJTcAPNg{Ik;bt8Z<APqfXv*y*5^4<0N67h~jh
zDU_-RY@JoaWa`SIw7l`xf-9=YTc0f0;<CV@sJJ%H>?}|I88&70R88gD+@h=8cV-`1
zkQ>#intEAXC6aCCf=_oYKm1gbbXu~^*<o>vu%iEK=OeKn&lD&zPRTyh%F+F61B*xQ
z&x+DwJ&z@v;!7q9`+em5?kTM`d;f=-hR=gn#VrVFx9c*_eO<gWm23W19l?b&j>q`T
zSBo^?dUUbkO-G%dX<;#yKV@CwBf3{!-l)5C!?sTsW?Zy!in<f@z=79Yv)<%caoJ*n
zOdjsa$90{OkC{Y$J8OP#;JVFjocy$5V$Qd1F^n6zxj3v7Qx`OH<zG4}u*zkp+96l5
zRFP|H!OnV0Yx_L(PnkY640_{zWtrIS)kSV5yc3xwWKS|rs85)z|Jqqq{Pr@_a=uJq
z%@7mS63)9}O7mY8)vk=YFg@v*SDx$Z_j@EKo>=9hW*FqO-@atsp}4=^tG^$c$#!pg
z^7i-qcjPW_3KZe`c+Z<J$@|QLm`tPRt2NRBT@zE8XFraSx0!9-K2yZ;^8szHuMvH2
zD_g%<uGXCP%2)B=jN`>$nm$f9@($eh*Rg5k&M8_Rx?<ZjwnlNDc+w;{N%w5?n%E1c
zKTnuC%j0rJ$F&r<>!)TK@-9xu-t^$eNj~q0&^7^?%R<eU1)73=YFF@woEEZcu4xxa
zTi(C3L9|$9+63NWv-#(0_PyeGyVv4r|Gt8ZPFptJo&1Ycza=h-oLcfQlT){J*Q#I2
zi`m;!D(v5>zZZGnQ6^c$vYy{1nun#wwCtGOz5fRG6_Z;gls<g&rTv#$n!BF7ZnEC?
z3u;Mu7oUr)^Ao?>e<^o~s@d}!f1-aWoV}T^TWmM=4Aayz8CRdLyY|XC{CU*@qjIh1
zj^TG6b6uEv@%&oLLnn-$H>Zg?8o%6ZqT9XiM_xy-orji6qR}r4ZUI}zABtyPLJs9B
z6egXRx}4AbvX90R`{X;58_z6#RB4=cHo3HR!Lu9lN++IIxSnFyK7AseuA%<cSxQBQ
z{m-3Q71#VK*s5B$YuX+E>q5U?esa96dgQ81qSgJ1ja|pMr{^pcnfhxE>xDV`n`Rl=
zyB8gGu3s<q>Y$n>%gI@%Cfs{nVl&fM_~2Eo7jswsd&Kk3dqUQ^O*x$`nd?r<1WlcF
ztnH3*3a7tivG213%lO5w=XtQt&HonZx>^6Zo3`qaBft4wuAFXhb$%gs%Jt!E=cD#o
zi&h_;^1f?XfcTR;i!}`Ui$$KFi;<VlRhsQ?_jrBno%rqoiIU#GTkpnh*;~uNI6>tO
z!~at5LN1enL|)g6+3fmznomdTy9k7A_?~oqaUh?-R!@1kL`8#A_LqxaeDA&~vA1ab
zgiOWLcQ#A?s6Sz(W1Y+1D3on*M(QQEtE~I`{ak+n7hc{vckbOg|K}uZsjaBk@z%Gj
z|GrEf^SS&zbq^lv?^TYnPXf)weklL_^mp!w&FMMp$Bx`ETXR4*YWKsn!aJJpF06n2
zb?(DFEw%EEanBykFaJDw;&H{UZwZ<+S`J7YtG~`Ck@Ro!H_olP1>b{by%Ao<AA5K5
zj(b6dnqTA(v2A5;c@ci)*2Z4h;`S+_j@cQ?>-P4#AHq5n%ew$E6?<U*S=q9zM<3>c
zuF}{sb#?QS->!=?*Hs9bPT93xkLT*zQll%nTaE=6KjnY-F#g5ggtz(r@)z6Bx#vIl
zo?Lgn>ewm?=4)}A<BtC~`?%b3-|dV0+wLAJoBz{%bKn0BQeWE|>&>OhHvcnE2{HV!
z=RD8n%7zQ~*~+g!JF%tZ?K<_<4QWs3i=XeiFBkjo*Si+4#pUng_u1JxZGC(9Zv30Y
zckezvo&4qV)7jTo>`PwY&9U>N!V@0uGj}I%mO5b<k)WTq(Tl_A!t6&+zc09C^)OC{
zhr=XWzwO=+;X`{%vc(0WCGPEdx25gG<viU<GZjClJmIrpH$P_9ZQYkzsFL+NF+#bh
zRY`~Yz4N9Yb{z+b^OoJ+`1$7U!VQ9(m{VW!=WpoUV*EAUx$B;?dWpH&cfript+sbW
zCjL?(`reBLv#o;pyU%|0-641+_lf_8TZ(TUo!dLBu5X^vhrT)Y|1vP!6gFM3mGw6d
zikW+oCBH*4ZHZ3Z*PAQ`Jrn+ZbpNFO_W6SDS2^$JdFLH@a7{;NYv7BWTYXP#>1j-i
zcD^2X|HG;+`8E~KT%OF^)q2_E3LZ|HRxZKvKTo~S_b%w#3+qrU*Ix8K;ko<rYL3;{
z<BIPJvCPDtek&<)&H8$s0hhgmeEA*4jayFM-?C)AwFRq$z%>>{)gNu`Umf1NTHKM`
z^?3HnxBI^TvFv#qo8NMn|K9PlG3W1b6qj|#ziDyYzuQmz(6^~Oiyz0Xf4}}<sAiS5
z=Sx#<q+2f@d}QCUtp6k58astwzrI;LIKeKc$e8!%*?C{b&+Dg1oH`s)b$H2=-&|RL
zej9GMCQ;(4!Q2;lLcaG!`I_jq8)1$QS^n+rZQJ*sQ>fbg5Z{gij*}0}_1kFMXm@$3
zgkedF){NgNP4iT_jniC<ey^;4o8a@YYvINt&gyf%Ih;v4r?h6mKd<-4d(sap=FR<J
zd1ukBS$RthPvDw}<w)mZiIu$Ps~=|>`-Smp-`(tdpKq(AZaHneUJ=W8vG74{o5NS#
zEn(I6j7Ea<**{mm6=h?Iognl3iFM+VTkc$rT1)@^F&5M=d7H3v&%<|j?pFQ1op=3~
ziqd1rf2mLS_hkD#{cv1Z;m*0E=a;Y7tIp@s|F?0c=P5(O^@0z(1fH)2T|E6fKVJR4
zqJp5x^xkXo^))|V+&TE%$>;dpz8lRoua%hN&iboWGJJfIeX+#1Su$;AOS-}Cm_x7L
z7#;erZnD(7jK48JemA4ZP5-zbQ&0W*!fNx**e&Jo@9$skeJyEk+XtJCJ-)pnyZm6s
zw`1nk*4Cz7C*4jRPMLmKc+W%~&mWe5CT#ifV~zFEB?~T1dHVOsd-0p$$)2-q*gL%|
zqfA%=^1IZl-f~6Xnje&9e_GH~Wkt@BD|eJaZh8H>dFXx4!?^|%eKq{Kd+O_+ZQK4`
zv*cwn|4%ddjayWkz9#K8IDV1m{==DFY=^myR3z8dX3xF%rSiG|J^v5pS-R0}8$~0_
zrrnLWzvM*Ii3UasA^XU}L%!y7Vp}gW_<v~IsG7s#V%1xgzH4GKTm7}z+dFR0?AaW9
zfd9_3l;E2$`D+)gUOUxYvgMcTu?_azotLIhSfH)MD7xvQP*l3;M-SWB^PIY$_!L>{
z65rfgcvzv}ow*M)L;GCeIyT3>Y(Ex>Ol5j0QKoch9>YhO1s!|5QuY=dtNa-Kru<iK
z&%ww0+8G10+8y60E!ZSopm65vhp8`_YnWfWQrq>X6KOW~KyB)x=mWM(u+PS-%zW5=
zm(Z0L;*o=NHul?`r!!l3TvXDRLd?c?8w|bKSlPoH&3A!kWAAvh5<MGRP&>7eVco8E
z;Mv%c=51JJW5p|>v#~D5M{4~G8kJcewZFcmz<v1JR^v}?->VlI^KExF|FG`6;LpE(
z8h+K`{|W^DGEI;DcIMX;ZaK+ht~VcRY;DCmOd4AHH}!N@%;}Wuy7}H`&wb6D@{e)u
z;T<18HgC^8)HQL{MY%}Vs5)MQb6?{OzFm*dO*MAz%dl4JekC{ic7hR$-W1l~Z;pvs
z#yGcaKCpK8fteHRH;J`(bx!@oY!-O#-9e>x8;fQgmrUzBuh+JhPUbb9De%5h{BZm8
z=Iq2qTaQ-xOtyT^H)oU>Cf<##IdEfPmRZKe?h|Udb_qElS*>apl0Nf)3rw1FIdP+5
zi9c^&6YKQLpHF@-;d=b7_QU4=dycd5zAcdce%$Iqhj4#x^~>YA2UR?6csrjbuk8@1
z{V1ZpuD<HsUA7Yi73Nzf?fq+d%uwZFbFJTd&B<&2*K~=OUK3=gc0aS?NVWAl;r++_
zXGVXie(>{`OzmMAF~gE?t!JkGvVC=`>%PLWNRu<hH)8+&5k9*2!1o(Ay|+tV=9h%c
z`})`LU5(2$X|cJcCf^o@JkGJX;W+Wsi#rx_ZdxDQS72UwQSxs&4X?Zq$ocfXAlW$d
z*{)7o&(z0ak=+$i+XFoQRo^%LFkkMEI79cI#2;rl+VZY@n4P)tcIs{aOUEv5Yn)`a
zp;l7H&)lXcrlGS}yo7_R^4ZP0H4TTNS!@oaJz0O#V%C)n8}@yCzOS2Ad#ZH&VomS+
z=LI<BS{1soZmT6e3~(s6QEw6W@c#PNMLdk+&SkSXPugwXIe-4tq#7>6>wgW;1eM#)
zTmAQ|)}(BMCWjd@&5^%;nz=^IFLJhh+E#Un_v;ktSDNNm4l93sQS5wiO27A-zR6RL
zYldxV=Q_V&*+Irl&v{OAep30M-uOI;>yGk<faZz9GfzL(47+}ZaV_uL)(GokyKkS^
zDgLd0`|IkGr%E$YJFH7C9N~4kGu?Rhy<d&&_Rex=8hC8JdY;VO6P}#0;3)@_82h1n
zp6vy8k6VK^qI#F#lb!tO>N(#BLeeu{O>2Lie<9oB)f2ulm%W_sH!W_txaZ&hTUGb#
z`+WV0sS;;%|ID8jwEV?~uh}kfdmNsti>p8XZ)16lt%2pip+78oD=tWQn#^hqUXcCZ
z(MhQ@3o>j3N-bFCw>@tQxMn?5G4Z%Vv0wF!iz(0C&K)>=M&=spVac$&kJm5U@H>Sm
zF^S!d>u<)o#7Ty)`%i3`BUy6!r*PT6AA1h9^&e<s>9&zKRjYaZ;@aE#LmG4YK1Tm9
zedBZ2_Ce>hZHf7_c~i{3ow+tI(EWUGTkeA1)3<Mm{S(}K@Ryy*ZI}P5Z+_kR`^J%h
ztx)h!_@7+<nQpspPT5n=XfE>D<ne#kciQh1rJT!aHr>r+F3IGXtN70I%kQj|i@PHk
zI(HiKwZD&35=!Z3<$X3eo897`?9T|f-VKV~E9Ju%i5uPb3XF{Vm5}%;!SB@ri}Lbm
zQ<a}<u_;cTHe)B-lz*3If929|et%8!QSXPtzdiT(EYLl*{cl9~wqM%yR!6fZzy2`S
zH>f>duY9vb;pf@r>^B$AIP;+9>vwiWDF(TF=Ywx>q?v3{XI?(Nsne{&^JBk)skq>R
z=LOxfJ$vo#P0iH<fAa@?RP&SO58Wi%<z29Qqw&hS+bb3vezi+s^=p&3SgQx0v!ec7
z$hyL(CQ(zqrjJ2C@h|^cwRajN?XT{B2>Sg0Le|5)l7`Hp>deP+CnA?sx$EY+%ia;Z
zlO6tk`PtX(MZx~>9%(6N$!_d?aDSe<?aUp^6)p$Q^S>9+`Mb^Q&gVTxp6+S9B$4;y
z^R3-8Swl*n?6s|5C=nx-5XKx?`n)2zUS`MtF!k1xdV9Bfw)@^n43Ti(sNL-!cE)h#
z9#tvZTYu!N1E!~eu7Ze|_P6?3TX3)4>pOOeg7z<kS3foRtZ3_W;l+-F?{D;29h>mY
z?Z&>V?{}Phf1}H4ndz=CyK_J8-nuw%b7ic_uiVeS*Dn8?q@7+h|NV{)MGhkOb+$xQ
zOm$F9)_<65^C!T0S=61W*E27k+j4Er(Yx=g-g4;e-S?xL&ugkfI&=M+^O9oqH)pmv
zTDNX~dtP<d)Acr&4`{P!Z{536`dF#$4j#eJ4mv@l5eFaTbxxT7Qo*-pX(Ly8z6tM{
zsK1F5P6+h!?W|T=a>cqqq*T@FN#3*@IjdxS{?3;6Fmit{l3j8#)^FKGPwiEi-!qHD
zMO9WU`dVb!Img86`8wmvN1BX-zx!@9@7^9fOKsY8<w?p4LPx*>lkDkfVSF-NW-9Yz
z@s-hSoW~=Z-v3GHV$=KAdMdT^*=D5<7B}~#pPgMI)df2p!{)D<bMeqgjl}XG<7E-u
zYcjg_AYBP@JWk5a=5=SY|J@Tef`702!D6{M;4qu_M)45YwG7pTv4?cNiDh4X`h0S?
z$V`tw)lh?X(^@9(_!TLpY;CF^`a?L`q>wqk=r!9pfr}BVl%m!yU8uUwdb;cCc{6rv
zu?8@%-O;hFVBIZm=dR`cA0}jNxVByByQ&B8o&&1sfv$V3v?^*1&e}d+tQKdpwXHpT
zav__@vhHs2EoFx{H26dZ^q98y#4<_F^E&Fh>}ZwB6tzwt&8G0KA2Vud{@k46xI)CP
z#@u6b?#4O+)gOv)1KIvewe}CH(##b+y;dz-x-j<W;`!&}+(T0m>%6QgEPSpRSnAEM
zeW;Q;OUa4b<?VJQMpo;fX%D?TE%$9+8TmeCkMCy_t|A7ZGisGQ&(=-IEw0{qId9YD
zd13<Fw&~jZe3|KDebfEO{7di5Jmg}&Z11#O>_1&1axX`mqwxJ?@7v1~xVLr6%$0w8
z>QS|+ROimAU)A1qzi{=95&3ofvbB1{=d@3LjWLT>J-E-c^T)keZK2}UUf+*CIkZ+V
zQ?BcYpL_1&>MdU$?XH(Di+%Hd>ILmbS}ge-nra(z_ltIY{ClgnD)z~Zd((A2Zbf-$
zH{SiT_CnYDHSJg4DCPg%*Alkl>j}<x<sYT<49b?dMzi1fdf#a8k9L9HWluz$Hc36c
z7S!wf@QRY^`%h=;-mPSJZ_b&uvv@+!y`xtZJcD<ByAf#gM_%`Sfq!Mik<CWW?LLQG
zTk%rnlIBivIsKO+e;4{%SD)KzKfmN*&8^zoyH-9BS+8huO!(!p!eEz+VuIZ=PijwJ
zd6fOh_p;a=|99LgU1y(LI(<@BlvfltpR4qPV<%+0-g$?09)Dx?!RuV>%E~#v5*{6A
zsckDddi3eTr=D5Pvn9D_$=uP)b1L?4tyEe)*Iq5HHSD7Dx6h}KtWnD^u*j<XZT~%I
zR(r_uiio}XZmaA|<}!TLvF9s0{rO)p|0&BGTYDaz+{t3SW8cb-+n@Ltccg!_x#M$B
z@!viU^IIaW?k_j`oj&OEQeuHjT9=jPoNGl%oGrg)bFJh}gWm=`*qB#wM}t%D=c`W}
zI{%vPTQa4#t4YB-XA2`2yIjI#=WkDC_Z25wSEyt@X|jD1#@CT2l_tOA;gR-g@dD@H
zZ|yBkXjY1xQasLUni=Kmx1#gLX7AZue8!$LI-7(to}QoT#lFp<G%qlL`+TIM)P$Bf
zAB38wPq_TvxV?^FhC_JL>*@X4a&6U8)8{`rus89?=0lqg=Wv*s2dz9}_&_p^xxhxn
zJmy8JwRqms#HHmXMa^FYdjBv^b9*rH`+_ANQ{G+Wy!iFP?3{T1znwWeJHBrJ_y6_5
zrJh2*E&q?5x>#kB#?b6^eg57At7hv)MTP?Zy2b6=pA<>d1sk!Ql&kVrXkXaTv~gb2
zR^?*t%+`tG_xxJE-nl$)=bBFk+A}V#U3E#|Yi(Y@r#qkLTe8%w(Q1oZ@mJ;+2Y>ax
z&_^%sOU`gs+;Lv|z%xb5=Rd<bm)7$q$!)Aqx4y4cTB2WkW})vx754n{b7#w)wBJf=
zeeN{<FY)}gV*fu^X}j7d?qNQ~JC0ZPF6>_!EXpfo$m@5$FK)lR-OJc{F)?l*-_3bB
z=kc2<{^^=~9Us5yYG4(<Ub7|Pr{44YDZ*d%6g@RWc0S(kE%h>P)vfa}Z1v?I^gY6k
zsUNalS~{_o`I01?UcIA%&R%`lz~0rY%=JISoxQw{$!tF(AJdxnrS1Hg!}}b#b|vSW
zJnGlc{@LlmDcSyuydQ6USMQj%i-G+dugZ%u539*X>SpbzeShn<a?tiwFXm-&>F-KV
zD`(#55?<h+n&%dy<}KLvrA6qKc+#`u*LGc4drjnsJo9zW?TV~BBG3MsE|IgMuF|1K
zz*dQi^+EiO%OVwLwEs1*?|JZG8P|i^H4k#D{FIsJUiH^=T(_5P+R6FRMiCr*Myn1i
zI(mE&YZb%E0w<Q|G4I3m(!FbDA6#oCbx-83_~}cFuH5C@eRgpx@5kc}e)?S!UfVZ|
zXf(dw$+f_$W`Pt>z~9%inOwY9ZxeATZRQU&Zt8ekk@P@lj&L~R^powYMGvx0n<`_b
zni$Au*3BP1d*;z6R?QtJS=hIRHl%+(`1(ljsn0VECup8rUNqtA&It#9rgKHUT35uq
zp>v&oD5G@w?@hjwxufeN5-cu;uFy(&{LarzCSlozrSr7;?y|Vg4Lxw|ZgGx9{gVU7
z7T^B#t--3E-{7@Q&PM-k=dDk3SxW!8C74-E_?WS65AVW*_XW<VaYsJ7{YW6Uvf8P6
zzxoVaxeS|Cy7}H2AGWh>p3AITR9Sdp+n&D*4&LWK!zXSgcX!%$Ws@J)O``8P@&uL$
zoc+uv^fr1?Zr8gHA&u<y-!~+2p0%*A;F|YhosZ~*kKg&Ur=3^Hid(RxW8KmaMzQ+a
z8zR2Otg-EUS0BPCQGb3zgsANlhixt=&)hd&qsA;*>Mwe<`-Pi3Yl7)d>9(t<nvYJ@
zS@c^XwBhJ|9i1@G{=JzpRl5E%=0BrbuWB+KTYTeFO5x=F{x{a>_<0<ieDpn2{u8;K
zhZk;QJ|J{-U3ep3efGxWi9VNGzU*;aKTmm6st!o6bZf5o0wb;fU4JR_pR-$H^&L{h
z7DUa{$our2V|QS~DJ_SsHimbe<O`H-W|$h=kkuJ9W54B%jUw|LVgu}=b^Y14|A=nB
zdyYBu$*QL(?~BzZZ?LXh(B-q$=H~53`CO&S{8Mzx?x}^Rorr8W6FPg#l7o#`&P{25
z;mGu|?$yJ$o0;}$Tywp+TlB|{=s&Sq=Por)eSL54mo?FrHzqi`XWpIW+`ix2k!fmA
zb+F*diN^Dm7DmhXOt}_n>GQ)n`mo-S7n+ZZ>@}NHHGeXnUU>MvkhE`I$Xq2qt%;>P
zRbEvdmS28UXD>e7-yH1fKkMm%P17{Qe(Wx~{KR#gX3}Djy~h%^yJ#M~e|PquKU}X~
ze0+3PqGg)8&aIlW41N`r7ZZyOx-J=?<=o=&VbgSV(_1x9na<U8{#?>@c8|kMk^ZNh
z?Pl@vnW^vpYWZ|K{qgNO|LKVH?DeKwqFN;kSm#VRR28&ln!4Dnnx_k|K4i%~`SDa{
z%cIwpORqRa`xb8Vj(L{#d28Pe7lswhkM*^-Gi`Z4?@43*i{0v)J70Ik2-J&coDOd|
zF}J%XZI#>oosuWl?3$(iaARA*wx3d=Le}SB?9UPjzEJ;~>E@?im$};_m+Ep_t(9(4
z$?Gb)e0k&Rta)wj-cIY%BFt|y*~U$5DYD(C7_eZU;I`KiG21p<#Y8*yCe7OB<h)>4
zt+t5CPLVa+e|+mO;(Yqe<MHi#3RW?5cg>q|r*gKtpQ-Qc<r{5uw;aB@_I1J>BeQ-P
z=~R%&>@A0{E_*G&cj}hS=jE=)pJlFc-C`Rx@7b#RrSoD<=jT<Gg$BQ!@a|$z-|D#Q
zx5dtvd1ox2w`qaX=d~-BrA{-vZ>9Urjp?K8%!n6SE(yU3R$4n6uRqk<)Enl;qBZBv
zoZWpouFO*B-NJXwtoKcykT*vr<Y;NC*uHs}PO5l&ty^w#@T}v(&+C&994Vfj>~L{P
zr_)Dm55Xj<7~Kt-+b11ayh*w-|G+Yj&3*Uo?t1)4%}tMgqKNIquicF7N1x`NS$6QN
zo0;QJmEDnM2Um&so+#YOFiC6oH|EYPRi~oR?P?lJI29kaEG){4?CJCR_`ZK;Urgvm
z&QqDECU7dszk9dHg>C<lO;t8+yPG1o`epd-Q}kB9EZNEvvSVsLtNBHpKwbvWl3AI<
zw)Igz&HtZ>J$&Y@{S{YfuDyjp%b%VST?|?Aw>)L(N}road*3~qs(<aZ@4_C#{mbO6
zmQ4TTvRzd-@WZ-qZ;C`iizFxSlv-)F{d2Z%{RX>5dEzr)hqp20AN@V;O!jJjo`Ywa
z6n1%4i|x3VS~Sz7eygzHr<s?ef8BKF2rLk|E&BGDM)k>>tL2`#feMSvmhPO$@?@3P
z^G6zsCzM_cGQXF$>7$&S{QU2I_hlyO9C@!_l$f<m<6Gctftc$?JLP8YUo-2f&vajo
z%?=%l!|U|}92bPY4r;7-oECHPY5as(QPDL#qJ4Vj<G;tr#m)J0FLs`IM&Lw&NAagr
zuQwc>UKH-gZSCBB`1<tX7m5b%TV5VC<vwvW`K9ZFrI#1SMJVo<nHRUu*4qB(eWitp
z7K^T{afTmOzdqM>dVl!l7^$02nbcp1@Bd=pc+Y*dnKy5sTUu^bLF}m~U0Z(~`mD9$
zqE67`zei7={{CEi`rhuzO13Q5O}4x|xLxGdAMOVizfKRmuvm5B@r$pU7zCI0U0cQ;
zzdbKqZ|-ybvh_`JZ<TBv%Jx|9`N2NjUTc%-kLf2*el7i&`YH6nV&#SG{q|ayTz`t+
zI61ZQBI~!Q9+#&DE;)Yk=EKw1)nneR@KAgjKTG}k7uV^}!ku}8J$U8vLzc|=r2lI2
z6^29IzqA*&g)TX^`*ZN3sUK%7R=PW7zD&asWdSwz2u{l!L(7UgffKV%`Fl77DRc-6
zt!a`e)w8@eZ+_grQ>p!3UxMm{SSFP@&S6Ou{qo?&QchcoKZ?6PF7oBymv-x&!Sq^V
zqY~G&T<zVL=gpbFJmf)Tm&qsl8;f3>+}iRud*j@Q?8hqA5u9&t-K>4_<;|xj@1M6%
zU!H%yf=_6*(%jzp2~A73JW!hvA*#N0bCdY&z3bz-d*UzdRmlzdaP>OhYpXMrOkvJl
zZU^NRzOh7zW@i6!ky0sb*O+)LtK*{9uRzr+E4-o~zg{P6ww7b|p5)ZkOM(|1`*_=U
zom774l9eBY+a`#p-f2->t>n7=MS}X02X7CFW@i3TQB~3HQt&+4<q=r2QC==~-oMG`
z#YI<U{5hhbBHFEBc&e)-v9sggL!OIwopO^te7(xIdj3<_qh1|>SI!Gfd+;*-mt|tk
z#jS3+LPeo5lZx7=Go+=enDpv6@3pqHul-*9{>zRD9c@cmSGI`!xpT(NP`qzrQjiJj
zk`v1{H@Z%D-s*Yq{FfXN;SV#k)m*(Dx@w9<CNV4*3i@!_Rr=@}`)ggE7sVzh&7X8s
zEOy;hHP-ORtvyMr6swOedBNc^(O=Ic=x>M<*Scj{s*(#g&uj_X{&|AYN*&EUzYUJZ
zMMXt3)Bk*NofddvWy-o)LTdAcTs;FPW*s{}Gexr1#qZiG&BTwIfdV35yS^CJEmAwJ
zk<z~@+?R8<KWE{g6{$z&pVBiw<LSMXr$CM``>jm$>4xsa|EpLSuj?rO+*fpSd%*ON
z!)w$uu9$q!h{?FQ!Zfdw_14>EaR=5_&73^tS8vxL^&ck>c~lwYZQ9U2i}~#$q1CfH
zyLhzfHW_R0EQ|Lk6FYzOmAdnOnIl2VlZF5OR98GY|MPE=E48^ZN*y1Dr!CXo#Pg%_
zfyXn;NVy#uyPki~FU)5UIK0E2XVN>*`St%+UQ(Q1+fm8+@z+kiP}Y`LZ#LNkORm1X
zYE9g-eH^k0#m0wiLUX6raNpkaB=Xyona^*}m}+#@dr@Sf`qId&dZ)I3UAs#sbiuEx
zcORz9KY8-WNouys`r~!ewFCA);>!PPs$KN$<7c%=KE0FnbiOLS`|P~wHKt|%&Yt~l
zdo`8oXu<PcO8Z6am#TOsX?kn^tUY-vs5GNu)3!yt6Xx?zPI;j7>~P3@uF1RKCAf38
zpGz0_J3ejylWQxI-CY-phh*e!k#6NW>zybc8tu54#U({q<<=kP8#AS@HYXKuu8|BA
z7Y)CXR=O`;z|YuHGk8Dm#>F;*zn=Cl;yiiACDfYnzGv$7){}8p%l{N{|D5Q*`O~{a
zk&PXjH+HP@&N^>+Uo_2Jb!Gniw8&iH3+v`gIrI7P$L*($CDwCjtTl<=wxVd!w@VL<
zXWrFZ;*#dS{9nL}8OPHK%JYlZpQz2ba4Wm!&Z=eFj~|EEv2pz6lH0bTWuaN_&wCCh
zcAW9;l9~G_)QSK09pm}>=G*!04}U3sz4L3JooMl9>)VTj+HV;jC|`NCTkc^A->&;p
zZrAdj{jGCc-#-7&e62^1+dch56Jqz2FI^P<>*nD@g+~qkGp-EZS9e$amsjFN-dJ^q
zdl^soY|>xxy-&S4|5=)_zRrn<bBpDV@&8X>{7AX|O+wv*eV<DGyj&KqSR>wS%_F14
z!2KO`4QTI6remkxt<{$`+Pv!2x-dVzwVz7n=sy>Gu_xwO^QXs}Y0Foo75VIoy&yP;
zRj*@Klg{0k)9dePd-#j@Z){hqY*PQ3a{beyr}FIAHA}Qs-#e!gw%aE&KUur;R`iL0
zTMM6+eR*84YyX`enteR$Sia=3*4mg~R7>A=W2K+&o2pst-n}cm#S(u6Feb?drc6?o
z7mZ(aEN$@`<*Ac@PQ9S8y!@}rr0r)fdi;=26;1c=JSTPg?RKy9#Zp$uRa2IKHh(A_
zrLjrLze04;hqpO9JWuDmcI|duS$xp!-Ub$>^;U(;h4wE_aSGii=he-hdacgF>2m6)
z|8`1Q`R5e3MYP!@S-pRK`c!niMS|ejS0?W&4s1`o>3-BtHEUf{=9*B0RdJzhVs%f|
zg8IF}c6y$i8xdBsit7T~{QGaL<jbnW{_F1UH!FR*cvXvz^U18%+szY-<Fy!;c25nT
zwT4T6THKv`Omf}o|1T;1TPh^^ai8e>pvl_Ylb9yW+;Qdj<7lmr)777JYM0MjYI3n%
z%6a;#%@Mu-;t#D|qW*urjokg+#~0VA{9gRI{Db*4x4G4iAL>7P8_~7@aU;jy7kgzx
ze_PA7o%_63R{LAINT@z5v)9U?LQ%G<*PhN;&itF*Xoc6(iT}cMR*BtTv}xz{{c`=D
zp*r*brUch6Hw)dnG&6YWsy+V_+@@ZW``~*kgez*g1COax=|Y)R8oQjLqi5dZ*<ZXn
zZ({c9{&O3u4USb^S$0>5XE(d@m&N99SDC(%>p1s&4sW&L<(|cdR^Ci|lD6%`hn=gA
zsL1|H4V`vw=IKxUFF))&`+VXuhHuLcKljr7Io+nFt-3f*;K)AVC+C+<z8SK^YqeMW
zrHAn;ZCAp4zOk&`x^kjrV{7eK)hU)fdtFMsLw}U)ICzP7Mb?ya9$Dun`iE{h9uaUk
zP?S5hU`>dY!~{jRKK0FUH`9w(#eA;Na$VWM*ZPuKP}1_yXEuSuOM~=hpPbm>@i+I?
zU0tu~VWF2=>s$9-Jg2tif}noZ=F|JVq}2HXL^p+|cE9+rHcVst-1A}w<7U^f%$kt;
z@%wwf<qTC!-^|x@=(-APIiGy*B&fBN^Wqc!Rj;?iUOf7quins6_Dj;S{*tA3ZKbEq
zC*5k9a+mdj@`m}>GDD~Q@m_aXRMp~SdhE_`ZIj==UT7a#xTv^siI!S?p#A-GHgdbo
z-#s{Xb;s&+Un7(Cj@CaaHJCQvG_7v_kA?Sc#0c}R`gHGG`}`9JxSmf4Tqe;MuX8bJ
zYM<;>j*D+EUD)FLEMd*!%HFM)A4TehZJwF3*Ylj(?iGFRhvnDZ=D*E<^YSy-3)fFf
zpFdA8q-RajlgG>Rv(33Bn?Jekd-l^Q*=*8JyXUDNE2CC_PGY-p#+iRxlJqX|^S=8o
z@v6?`W@S<e`*(QTwzF^BPc&}H&5bS$n)cM2_pTMc)uzQPH$_!A?2nr-x%=qZ(Mwa6
zBgMikJOx#kR0*kRF?wXit!fumU$)NT;cd3Jeu{<?+5ur}FRb@#dl9a2agtK%inR*v
zJ8s^6^Mo(NaQEzODknc~Z_<fWD7`k>K=aP2I*ZPvmtIqZUe4QBy)kH$Oy9H|P2X}>
z#$dhMfts3=(`#4*l}|c+P{|2t@qM@N&tXpK=<pjKj2RtN%L<hm-pAgUqBDPqYL3_C
zSjQU$!8KRTT58&Pan81Rtj#fd(n^teM||EryLy;&=B{-UF8UdMxZ6D==;(nhEIyvI
zv@04<-&wD(8nfw5+^b0sCr`OJ-RP#mqjq6q-dMxM_3z*9o^Je9>tZJ7tW6>D*Vb+h
zTBLUT^V8;M^IdutbtF3Pk@q`hQku$RU$IxYH}?OzR-c<f9Z^BcOzxh(=cPD3E@gYr
zsZ%p~9(%L!TK4j#O|I#=J-KD3a^j^Mui7VT>)y2xTGxCbYa92)_fu9U9uQrVv({=>
z)Iyb6Kc?;7>ZEs6B!BITb+K(rlU_YzdK+Hn?`l5jzh}-FLFqGZo7*Q#zipd$N8k#N
z3Gd`!<ASM^oY(8D?0a#+edn8{B1O+zi#1)tt2WFLU0v(5+VXn4jL^ou8GZpa-E+*j
z%IoCj&hg5-Q=t4~{*ft89XiE^Pae92x*O{+f3U6l#irBc`KB+Yb6=Y@DRo8cw_8#>
zMb&p~3sWnb{`CDNCgbaZBGP}wjc=ZGso(5mvP<BrireX~i)Z%EWfxxZL~7zRg{SNX
zXSONs>icr{^d+Ozom-b=dQO_YH{N5NKG%EkX@V;w<KjJ5r0t6GSYvmCcheK5n>%0g
z9C;hYa#p(ifYOf2`&+bDUC2!jX)@tv7qeGpax8h^#TxqZx5E=Y(PH_In7z*vYOOi{
zXo7A-)tmL}#i`bg>x{d0A7$&i{C>B@?vK3NUzxSLh=v~Dm}}RWWNy4uz=2`=@_mt}
z3*XpIp1(A~wdTi;u%jPmJAYG4eLAx#H*d!Dn{OJ<-j_eernhnX(^+T!%w2pinA>Nu
zU~C}cmOHG+FGStw+7;;YE~WG4*%0r*2S0pbn^k_!WX-x&VYaJ?`M*`vt;9V&VQc2*
z%>J!Yr7Qd8!?E*U<F_voJ*&Y~QUB*~U)fRJJT8T$f<NzMl}5SdiS~VR&n~oJ5%#{(
zY`#(cRrN7<Ll@~~t=pzse^om&@xspiJ8bsYc<Nox)$`+hdR2FsgXo@vvHxB2HP+N0
z)QCU*V#??92K{%l^WS8t8D(G7_A<|yWwYzZ_wL7YlD(vNWEE-EO<HI!5H25>W3fcb
z@8OQL7xyb_O^#UwZdt(YddfuWR92GIpUHd0mhl!EsUOgq?BVR7xje>f=hZ^1vo0rs
ze(ZRa>h$@*-|tEy>owj^&HUi+5|!KbNa9Kce-%ge-b<GMeuY*})6GkI>-Qw6Cqrre
z<AQ^p>rNap;@uZ4ere~D(^@m1?!Tf^ytiy_*_J7jBcJ(xez<$O#sM`>-)jc5c$eQx
zc~SS#w8->K|CA?H??YC_z6g8wV7gGw(WNZKuaYZQFF2>a@uHVkj>x*Z`UYa<)`roA
zRmB`@L*)D?FDPA?VEWKQN$~~f1Uti+u$66FV(J%jzEN7|9Vfc$&nf-fI^Qq<3LdU}
zI^8dG_M3{ArVFwPpU!^qK;~&rEaSSXQ-5ALIz@U#?zYO(`(np8pL%6ItHbQaq(x_S
zTLKuD)jYhA_q46M$!N9f)YUvQCVXl!E@R#CX=#x4G_Qn}XCz(4o%iXyI<l!T@Ytj`
z0o)IcPj{IcAtg}l;CSG*(n)bA*|Njya?&$Ds0J)Qm&Km7_~oLL(;eor85`O9#qW>`
zpR8YJb@ord)uQal`c+nI775JH)$LP`|4?%4=s~Sxlk`ii)`+YKJ7@ZH`Fb}URyEN6
zo$7lF!sDl``18i7EmY!UM2Sk>A<n~kJt<+Hp8H;=Ug2IG)&1!B{)Q|QF6EoueMj~;
zr5)+6y;Q#O$~^PbSuHsq*DsM+`)9$Wo57MD@7;}W{cIGQyFu)JZA!@}X3yu|lY69&
z%RDu_e2QoL0fQKQ;T3x%nKyd9n(CpknW0YA$Sb5}`M1!|tQ*#>*|tn?lB(W<sqVpl
zt9(pvygYJ6e-q1AKUpzJkHa_PrmnbB_*YNBe}VY*-3J_QDduxcWS!h_?7hmo?<T(c
zFFiD_Uw**H%es&MPHyC-EBhw5$c2ToU-I%Q346=9Z14M*ch&|k4tn`^{t>T~#yjC|
zaksVin*0&%b7EP=dD1e5p@jQyqFwyEN<Mqf55=!5&%BQ}Ra?|^`k(YH9v^|??3?U4
zQ~f+n7WX_obMo+&IRPTxr)KS8`+8dDWx%EUmHa`^-aK1xzP~1QOCsl{)GWV}nV)su
zcIp)ue7!z9W8X=yNfBK+VZEK#?9W`Dm-aV!_x^h-pZ7AWbSm7pU0`=K^_*ep^Brdz
zpT_4;`l_9geWqxpam?FHz2b=9*JnQ$+B(}*E$S~rb!A&e?z;O<Q<us8Nnd^HMgnj2
zf+GiiDKF|cFxz9&>?eCVtxPW3{Hu3i5wx)Lv?#y$aiz2H+Z!$W=bd=;yU8=5{GRw4
z$BMrez55lO?yT18+@`nVh^fbV$rX!MbG~p}{^#kl(9Jm;f1P>7{vzZ2+Om*y@%d$?
z-FLIjtgp(rq<m}7^o92`+kABUrNV3%9=lewKCx+?^UP0oPyT$ldw%uu<06)_n_eER
zujNl!y}didxa8zA@iX6IC#(%tnZ456Y;VS%_l-Hci#^P|r{`2HY`xEV^NiBXoY+m7
zM?LGrLpBSqlAXJ!F4k?+%cGTb;x4PjJC<o*|B@88pL>xhm&@g;Sydmm-)Frzi*?b{
zlqj_|T>D?0X}iqPrn(?6y64fkvzq2|1{-5%{nUAM!X)mP`=@s&<j=IN+rjQ+pAOn7
zAze7FpsI0K$g30GXMD~cI}>x2ukO$HGxOi2%U`_TP$e<<uIGcKf?s+eq81f~s-`zG
zj;HGf-j{E?D|TrA;mwRiZTHUZh+e!l`vvI6tKFuX|J^s`d4HnaCH9|e9)rQVmdn2v
z?k;}H&TRf-U3GHKp|$VTdDDgSjO)#MZ#`_Q^=e#rUtRC*yI*Ucv-w@vzgPXm!>|Ka
zkoMgO8gAmvX170npYg5u?#l-sJK@+kv#F1`jWfS5TvT?>BJK3iDN?%?zLlSx*YLmh
z8^@mVuN#+|x$f9JduH+Dvh4q-f4+&CAfJ8tH|M{^S9LSr{p+h=>TB3=e%toz>y)b&
z8`j;K{UF@j?4rEJtp{0KYrmN07Qb~=5#N6?UEN_v_kov{kF(`pGss`FyP}sBz4c9=
zbheHzx4qZAb8O1$CmGYqKfF&)f74#K|N8!~Y9EDH-#g%cBh)tYqWT2i9oJu{wy&za
zGpRX&+i`{TkMI9ZyqI`m>+eGQ%H?`Z4QhPX*cU0X9a3^=Y4+b6Sby!XhSQ6jPdo0O
zY)%TA_A{|*_AXV2%r3``!T}G~7QCn_t6qF_`Vz*Oes%^6t*@{zRb^W`k2SSS^j>>#
z`4piLpXo*}nca$+XBwAeawzWP-m`KwzmGeQPqAF&EvJNzz$M(?w*?Mgn&mDL>?0BI
z_G_bIYyX2=T+AB(4dtgTkkNT0de@+PQf`tf|G^dK9fOwlZ@T#8)(4ZLC$3uu-MYf<
z-Py>&7qTTWlUx4aT?S5_FNJJkv+YjaQNPf>LRs$86z3E!#ikdlKJY1trWKT};|@M9
zz@K$8anllmr%fBbG79S(bFfTfO!H<uJ>Bv;+Zmz$nCZ-6)0w8}PFTY`O;>KaBKvAZ
zR_$=#Q0aBMDjqD8S@+ClhtX5<t&GB}6?`ZEu3o)is)15h+ssU6#W1^BVVR6^ZYAYM
zPPt#!<MoW-66u`t#-m*DR|E@BbgP@V+K&5LcXs<kvx(H|Flj}fbd=ZWoN*?L{m*g9
z4Y$5<M&I(0SJ>!vDW&Ym?bUMGiCfkjx|Os&W|IC+7M)3|_XH0miC?eeIc?za-Ly92
zNcP^;j)j?K++N9BzHJcP!C~=;^}bQ-gDt&G#<K-Wm;F1-8<Vjxa-TPY$~KFrX)}tg
zoPIuT{nF+e+2FJB=EYUqjH|@eb=WvU{`}M7h}m=Cgj^fzrM2-%?|e48H%t6%+Ntez
zyk%;~)L6H(X1*IAF|It8+H_GXV3qUyluMJRGkC5kcJLI?^kB_PD(%ae%U^q7)<rkR
z|Hr59Rkh0Hm>((Y+@@PQC$)pE)@3f+jzZ3gs7Z`VtyODvrj$NiAgC=I7WVs*{j>ZD
znfsD!JE9)3CZFaF-kmUG(){9^ie3&Xar)a7LzP}68@l{`EfjoB$aqVxhbmX?8TNF;
z+jnz1W2Lt#K2`oTgFi%ZwiD-pBd5=rEje^fZ^gTtCr_t~YB0{e!JaG~<U7w!?97uU
zJO0h8(>S+jPMz^(Ba4oiXoFos?#79UvzN(i*mFsXiDybg?SUg{ZMj}^=Y848V(`tc
zmh-@odlJ!k({8eE_F;*z?DAZ)=g!S^@j11Y2QHlko%GmI6|DElcjJolu^IY|(_Eg+
zE}EF{<x=-<UODFum7x1mylaDXzJ4x0?0rC0@Yk}K7qgQV#_uqUWiseIV*XU<{v73x
zH>0nqGE6>E<E{5ucjKA<b#kwpl?(H4Pm5U)mDD(E_y1@nolc9bPaa(n>JI+KmB%?l
zWl~6;OQLw6#wM<FN~?O0tj~=ua?Cne`m8{4gGy6KUhi$zY#Z*dn(|F7K0=CFCtFvj
ziY<Cmds@iAlV!yn*97qxmdF{GW_PGAnB?K_t!Jyd@ynTeaXO4sT}o~hUCcb~nl7mn
zDKve1?rGQMx?*$BT-_z4;CW=3uK4V25jjTJuX#17Oq})UbMWqhx>L-a_kX8K3Qf#B
z?Yc}?Z04EL)gZM?b;YM|i-<7_p9xYsZCgy#t)$GEal%@R6J5e?6-8!tr>0i1FK2NP
zvdldFbcyb?$uC)_3ki6pq{QkezfO{zc~9<QyT>Dz?N2vaY%>vK|8i=#kb3hp&BQlt
zcXnQ!Fpp1d-{ztO&x)0b)9>~+?T!+d8q8(j{fH;)L~8Kjf(=UCXEoX9rku_`adWkV
zsb=?iP4>AhKW7)kX|wTkHJ6+^s20iosY9YV&xJ>NWiX$`$*hc1<@3`X?r;%X7tCc9
zy-8(O(Xwo@8G2SPy(XJZY4O}75LL8x*;1j#Kt2u5|J$EjzM<u_SfOQ^OoGs}{FCV$
zRBun+lxXtQVRFvH+?{)Jx%>Yt<}LoSv}IxN^n$Qxztu?x?8*=8uup5*ZdLSqbudSR
zSk8>648otoV(T_UiM#*#WOk<LLZ@nW?7K~C#bdTz;@vD#!n-kL?P**7uT9S#HziJM
z_T9txs&u8n;{H(cGerkF!<}Q-v0r^!6;O9rhkb5}=ZVtZs=(_Sc{83SOwwtYCbR6(
zRE=|Okz6a5wfui7ofcbpSciQ^%g?9ReP11Yt#*iavrLB2vsWk7HwDi)ai?u1f6tR$
z?Q>R3xvtYH+GS>=`*Dxy(|JqN4sI4{KiZqVSlj%=`o$f`i~>BB9zQv^H0|KdDcyDY
z?y4tS7q<N|3SC?=Q;W~#>=Hj+#wjzV&ib@k<m{u+E~bD~rANA+2_C`kxHH6R8C|VD
zCPw|<v0se!BHylK|8Bk0yLHd5K}PIJnEt=lV(XYM|2~+l;U!e~;gI!?Jzt$z%FDmU
zy{Y<QWccLn0{(uc>oa#Xe+m5Z`)E#2+|KY5TPCEwi{$-dpCUPJ?zZONC$dS}?^SQZ
z`{&^W-ZIa=$#18>->$g6W23BuaPsX9OywDG+qU~X;45qY*L%IZZTFNsf!5u>Z}Qsw
z`J7j$_sPO#`l?7SHS@E)kN0P@^BDg3{OwX(-?RJp6z5?1gDi_yS5I<ZdgW^VFaE@q
zTa54nIGwv)*Dd7bV4k}xS%Q<_Ww)H=y@FToFPcYf`)GfYF^k>ZF0Mk+s;KSUi_QN}
zDt~`%UVdX`XZ}t0duMfH`1f0R?23PK>6hsHM^;PUt>tzu&7R9s%DwjEm6)H+)j!0m
z>?3~PzU=<g`8nHa>%Se}XPTIV_A<WS5V`(w{p=r?74E-%5q~)2<_(5Fvm>`hi-ny6
z9m2WBe9g1_69PpUHl64BT!VMx*D`z?zfK>JY?otMnecFDbx|0zB}ez$qibLDILK86
z?-AL!;#^nosi2Cbla52TelhKg-rev=>fzege%T#1Z?7peiW&L4y*p4`@VM^5uE!Ap
zZbcj9+e|mT&}7*pBJMHmF;h^mh56-oH-5gkYY}XJV`gh!LB->~<<`Ofx7I&rbN73Z
zm-9~f(zV08wttpfsCVnef%k7K9yk7e`u6LwUnl<eo6A_eo_&7T?PqGgJ|5rt=5xWL
z-`Ddt?7R8Y{y0<dBOhCx%h${Uw|DR8{lgi?-4c6eXZYpw7lYaEP5iuDKA}O~Phi*b
z$1mNwRvXWJa98Vy@$94P?PfEy32w6g=kagJUzw7?xo__ldsZ3Tnbo?~jLUZWw$6Ei
zE;p`SD7|97N9(OL|Gf!LmkzA;eB3A=vt!9qS+;}wZ+Cv){3c=1J*SDMrugjtyG@R{
zt<LF#=-Y)~@0M<vpJvR7cmEgnrJEcxp55Yid&vIyai4X`L-tSQ9s9p*R4d>zP*}6<
zVVH#QnkAL`haR50AbZ~@|NGwO=M!b#S1HTXeXz@WR`tzo#%AX~3F<t*?w0Nn*tY)6
zT<P~!we`HW#Y?oV#BE-5ecz*x7uvXl{<Wyw|JiWui{ZV-tL!fE_v6@Qekv%b9O%9O
zXQyVyzo|mbl@i|hGp3ZpJ07pIXS*iVyr|t&z6HAf>qqOkbn#Z<AMeeie*IH_(wqF2
z7q<UvUq593*OKG2;rqWP#jb<y|MDzr<J%?x-~Uy7q!+sXD`n;FS$RuOR#v6VRC#0f
zuDo}xcFyrf^?TOd*VHl0nO!(d9&`VfSwG7DuN2?tjJ4nDm{P1{{nLV<eZQs6!?Ei_
zy5oJ-`<%*G?SeRhG`~Kd-x;wmoBi}t-ty<~uD!lrw)>izpyc@v`pWeWVw1Jn?dLH(
zEYqvAt1Z1*U0m_8|Lj@cJ7=XnO9`&yD7<G?Rb5v3?_237IVPb*m$MmvKOUdne@?bW
z??}m=w;i@8w(A)^xcVn$68nV7nYy#qWf~mTnf!q#ZMt{F+*r3C|67)ooP4J!@G9B7
zLGAZR?)^bC=kIGcUVE$~r{cfdtpmUReKno7eEL6@^#)pVSN>+qf2$|4^WKlN^z`L!
zhBrMbXS^w@XfmIq%4y#&KS@k}e(CZVA|bOj?V11QuhQ=<oy^J46$&-|yW1FE`F?a+
zADd|WBiQS0y5*uamZ`lnW<|GnMSI#u|Cp=0M_6qW=hMu_kLS<d`S#7ORj>Ag;{9jJ
z)3&*6h+8B6%wpC<Yn$MU2@#DF`D@nauf3d8{{GL&-<<#4d?QaAY*X5NdXx0)*&>kw
zk_HU!kJPpOcD!_|o1fXBUUB$_kQtNGT({lEcTX5L+rM6yd*`jsv734i*z<}vt$g#P
z-R|PmYo`|TIQ`{IzA?Ym<)ydB1<{EOTsJc~*KVFwxMbeC=PhED?E*~u4a(kMNEER6
zF1?Jg;qW<5`{o64%r${sUX3L@)`FS-4HbL=E_(8t;w&HU`Jr3J_1Em!gTniV8#J~a
zRwxq;xXEiF@T}^`sV|Ie*1LAS{OxT2;@XBEvv+O%W8v_e`J1>0yLSoqiKFG+Uu)Og
za&KPl6@6sF?B75CeYhRcYk5PgKJJZM?up$lJO1>wo_eou^?QHwfd^lw)wbtu^gei2
zd0X@W9lvL<_}U}lUnKXvmwF<t@=)o%M8k=9K408d7Id)4y?8LOOp?Fc+jHx|oEs7D
zN2EVh<!S9+@FYoQlh)ni{IAdNeg0bh`}OVD9PAIw-8@<PyPRjmmrF0}cNI4|MkKp+
zxTt-Z`(j#aqte~NY+2j*X!C7J4}^B^%FRoxi@WdDAkg^X6u%P3DprQGtPePr1m&(4
zTl*-&<7(IXHOKST+H4k(4}bDV>AXas3(K9fXX-`LHO%+U|C@Kp-8J@phe`RKLyza`
zP7N%!y6OJrmLc!1iWL{X{65~}ku<~L(GA~#fM5Tf$h|x9!}d?##=`I`!IH7^VJvLc
zbNC~AWJOOuS(*{Tqw2NvGy5}7wtIg~pPl^t+~sedj@7e++qS-!Js@=VURx`>{|ZA!
zk++xDf8pM|OmpLl4{>{HB2PK;PpK(X{=<91!RpDm=~9x$yKIzxC-_bGSku<A`664S
z1mDkz2F4F0_p&U~|90!xx<^t`$FnsiPZh0Gn5}HO?b`gwrW^fq*3F%0eDrj&d2;#N
zyk}?lT*TDg|9zL=c{1(r>iv#f;cQGE-*+wgc=pbZK(U)$Zp)1u<|SX8RU2j9AQ)G%
zSXxANv#9_>*y#hI)*eA8gklcd_y1FH_tsYXd3o{H%J~)h#jPF}SeG!ruacj5|9!`!
zE#*)7*)QrZ{4QU9evSXW2NMmK9gsVJJ$QNT5=NDpDXBh39{ZdLI8&GY=&xVm?(Xka
zyPSIZ<@e+YhxLT?emkLc=~H$?;kxfl8}}c}(wr?><Z@duGUWS>J8Y8`3)=Z){u~#x
zT=J;3c^8gtV24*lo9DJy@BO+VZ&RY0@FUyzNk2Z+6zJ+~U|;z``RoJT#<`I!3Y)CE
z`6aAF&a&y23Eo_Cl)b0dYwZP=sGNTX?Yw%5taQxU-mN?sxZy!jmEF&Ieu;PX@w-pc
zf4|Yu+4|10zZ>~%9vw-(9rvp++Q3uD-}%wc2yG>oc$=f$ujkLJ-p*(wbI*5eN`8HB
zA&=*eg!z}NPpQ1NpZ~~pZYj&bdxFMVAMf@3KC=E}u-fD=auxgR-0vH-yYkGfRh%4F
z)xT@gBlC_-G2YKSWz+5dyA<kwur>34Y!>@VdhXQp+WH=A`H4^4T+?}b|7uQ4+Wawr
z-BoLG@#6}Kl?UV(-um1tv1)!6%ZgiZybD(5+O40s`1Aa%*|ROJRG5zkFlGwvwW{kn
z{%>WQV!`2k#)ak@+aJo;x5%4cuubdlkX-O}eLm;%MO!#^4j*D+=;BV`XisifXf4Ok
z)DZ1*rXp+4yRt`LUVYlDlN~QuIj`M!Nf=LU`iDWb5$pp8%0@7uGsaC0GZN-SLN<cE
zT5NOGy>eCmrx5w4EA38!HiErgd|^`5POk)^{~P|PuTu`wFuyjxHMsuCL(2olRvOQG
zaQ4*+{ttOO{~l{#IHa*dP<FrNmYh$gx0V|(mP~G$E4S!=ZBFQ7Yx^H94-9T`Ka7#=
zZ`^)S`};M?IOYFRu|M2jY%LbeQ(R#pw%~9=3*YZ^2V^U2|G3}hb#76=eAH)yvXnOm
zGv}Ev8y3E1U-<3x@pI|<4RO5hk0)<wtbF+5>%*h2-!-JqTin=rduN;4f8k#@X5B0N
zWxd&dEAzYaDhoEU@J+53`q1&uo+HO}yU?VCyblguINrPdkgWX<!LofKW>pGld-s%T
zvO8^Qe$L~$<1lz@+oPvd{Rid>^~^c3-FRNoZ6;$`GXsZ=gkZkn@8G>{rKhXU%;#_s
za@k;&@rX_F-RYUW`F|VM2%TDG@ZrkwySpA-K6t_5v|!6VzLvd{`5qcv<X(R7hgwqZ
zkJCFjV;*f-*mmLJPw6kW4)5K`T)Xc+%BD8M>k_y(wY3x-{==eoqguk#<d75F3#lCy
zo7gtniL#t4;NY`3&+90mVyyB;BI8^pzwxXycR0NJ&zwm-tU4#r+W4Q=6xNq4hmP>o
zi2S-3b66$W(pKqkQQ8IH=l(Z-KKjgcOOvUceMkR|4{jU3>?r*`-@s~l@}Fb%vev=n
z{67|M?TtK?;dG*A@y7JX7dtN=m{j{%ynI9Jhxh-p&D74CU99KaZC7qzt#GkZ|MmVy
z`PC=3+@7Xe`JU<0rr_Jc``ssPd9NsCUJu>Sc4v>`yUeAR)-@d49cl3K<DTRjo{z-V
zaPS6N6#l+vdT*y2pIP}u1y1Wr_v)rK9g(_s?19am=*`ks?#~l^^q%kE)7a!0jh@xh
zm*@NG_3_2e|I+6lH+SC0)&sklTmG4Tb$gI-U`=M<;n?CsN57suxc|<_1H1K{E<JQ`
zk~}(hQmMPX!NEh_>kSn7r-(@1o5mwn9$~(Cam$+*DSD?wy?amJ`WN8uRV@Fv=G(8P
zJLL~*&xq{Zwbdp=M{L%;)0e&NT+$l1T>MaS_3OQPb0^5PNLx>nQz<q5XMR$oLoZh6
zeEi|mX^(hJrneUdx&Qd`=Ec|Fk0;-Idh%#$$TTy_{klmj56_PmQfbOw{$A`sThmwX
zCh1+v3X%n?rax~_7vFpN@pbi|oSUz$=TSboWTQ=--{~{U1?KLx-EHyne&h@T7d7sS
zpMLC2+$b=2zKq;w@fn?&M;KD{`4wifzL@^`^65i0M;Q#Y<+@hsb1$&szHs#A|Kdy4
zKegF4q<3^I4NR_7Fy&JC`{(rS&xfuEPKeOb^><sc^_cL43IV|h2HE0EkL+f6pW&_-
z=G(txSzeQKdZk6lq^g(d&zHZiYioMR*8cO>>+NR77tcQR+^{UL<-`-`FPD-OqUNz=
z&vNb1v2!`*&9(?6720w_%;CtnTc2DaF6%jkh&zO&D@4uX$yPIZbNAxO*VmPfsR_s$
z3+Vc{m`byDRP^u)>`h9~trS{wQ^(;*a*oqtHs-+WN`b9h0v{!2uc>o8W!^gLhIIK8
z_U|uxjb|o&{&HvU#|0JrH;mk0s=i(m@@$WE|GlVrZ!(wOy8Q8DC4XLHe2iS&zVq1+
zma%%zeK_mdrzQTUwGNbgdG-Ei<RSyZ)qA(v{Jgx$*g!URUb6Gk50937fA?ulYtNx8
zX$evDShB7f8_4e4_vEl^qE%8t)I6RnQ?BCgryst2dVBNd$^Xw5i8Xd!Jsy2}veVkM
zvUdkg?D@f}{p|nm+LU6$;`B{_w%Ax+$r4ShsxSQX>F>{@sqY^>F)}V!JMI7W>A@@0
z4wQVcI_<A^+W+)r`RKVyJ_o!C3RgR*cRyVI?UTugZHkSW{t(WSirYGeN{Y&UeEQ1i
zy;MT2ZT_v(lON}La|k;lc)K|+@BSRDWE1HmI3uEa$zB`Fd+WLrlQ>-ylYVAa7VWwF
z;Lw+Ef4+RWerVU`$hxR`GWo?%Dwu-n?%s5FjqR;DclQFXU2?4N2gUsByc?O8-}Btt
z<#&s<bi-zwi`PzeZJYf0^P8ZvO~;fA4{p^8%eFo(Y&&<&3rpMGHa~y=eE9U`?agbn
zI4kBfL`7FM`Snx@ZhU&O%P%Y}p_fbAP^Nco)3rE`jf<6%PDkIFo90+}W@Qgg#xp15
zw4$_}%Baxgv0FA&%m}<7Hp_6cMRLH->c|-r_Z6>@J*?>C_PC=ld8)C-oxL_Iy3}+V
zwe(MDgp`V{ddjJCshn@s;l-yf*FRh7x-e^VfUdu^Qtju3r-Hhjww{<)l@z{V>AV}F
zIV;u6c6a&pX}ws&W%_tYoJe}Wp6X1SWU<ngKTYWk(H;w~s=A2D<avDI)ws6TW>re~
zqzm4>6??7XQvO$!#vD|tfDmVH7Myu%>FaSnMoC&mY5oT3zMXq`=Y2Wbdg_Ve(L9T1
zpJddR<m-iq@oSYG-Z)LeM#q_9>e=R39j#fNTFp~KC0p37ShT*qIkIKi3Zn=y`Bi@w
z^0jt7)z0p0I=AU(z*GJ*jS$IwQS%~Qem!%XYJX>8K<W>zJ_YTrC)4kV)Rz4Ywog!g
z;IU|<Micj@QgPP>TU`>9RS!LT@%-@S&6BSuTqsIfrgKlM_>I#V^}Ff|kBG4>t$tiL
zq4&GbhYiy;IC7fXkAFO>%Hm?U!l30}LfN-7-`vyQy-_{IVm*=5e!jeXoLo_Y^8DKg
z4}9kGZ`+wJE&u#N4cAWl^|2mrzR4Hn7<3tJov84T@w3$)(Mt>|lg>F@a`t$<)45~g
z-cQREi=2KrUwH3meu6V2!y^6K^yi@}wV%^v4@C!EN=w_jG5wnH=6yE$EH8H(ypFta
zBXYY{b=Yk4*B^PbbT+ASanIJ)(L2|l(!FMDx|#8lxJ8qa%8Q=p9h#<Co_#*c>%`gk
zcuqC%o)xAyC*0CmX=+j3>9{RTD)sb)s6#h<ZCBg*&vTS`rSf5Up8d|HLO-1O9!}r!
z`TA?6iJ#v6(X|y+mq_Ete?K#=?SuD}%CBthOHvX~3*5W6*@v@V`*KZZS;St|q%zL4
zy?f8xi;Z7&XZ3c=J$i~e9lv%h>Sr_xo6K!hZYQc|Vi~|8o)ZwVZneiR)noCqdDq<w
zv00SpdH>dFkD01$$+LU+TsvZElcd2vn>YN_9My8wj&DwRdw0Iz+5DU5&^=H2+n)Mn
zjvEYky|*-7n(%7#y^FWMr%!Ln=Dstz>-s~{1+5vgWRm=Qs+IF?xU1FJdsR;@GkIm{
z_W14UaGCtLx$6A}FZM7M%J59n=#q*FEGhd`uQ&O|)FzEh#;X%Mi&jjW?(Dk5$c&|Y
ze{FHcukU{sYKwjK?wMvbJEpSu%WFZGLW4t7magBLzCk1|>BW|tXHL&nN|E%O-+ZR)
zu+`=HIe|;k{ZtOFQWX=8`6F#PL9}Oak)Gk5>pqWbAL@Kmnd&g-YSlppPe-?RJKj61
zh45YQj#;0{pf}_4nX?Oj{nC9Mk*!x4X?B~3=lOBX?FkY-Vr{BXc4z&>+PW<ggbyEx
zu{MbIj=8O?%zfC9x%up&4M$k#uqn8g99V79)>xXUXL#?14|AU(&;B{z`y?f#ba=c&
zG%hhDH$43CWm2TLuUMPvte{K>!==o-^`dlmyhXBf-Bw)uFs(yCg6-POJx3}Mjd>-G
z892OQFcy~;Yg0XSQcPR@e(ayWvdo7Sxep6HP0?0X_t*O;Ilm)8B5sp`PN3g5D^`g!
z5^UFc_aCW<-<&IwupvpJFH&NfhWhO^MmFoVhb^s%okg2+MH5yWH`o)E+!(QFg4g2I
z;_q(7;eBUS-Hy-7tjKw{OoQRzDgkevcGJrhH}2fMa3?f<^IjLrt9hvn3NeDghfFNn
zvvPLvuW43e7x)oB%j%Wp?FYfz4ld7W_P@zCe-p2rO;Eqx?FWZW7TuJ&wJ2rh%q=%}
zx-F@Qne<O?)t0rjKk~BNKWk606D_XOdiLi_qW#fd=arYU^F8Ovb~wNCf6Vr`RqOs0
zAKo_qmHqlBpOZAd&M*F7+;s8V!-o&IncuXnE8fAI^X=GccDs}P6I7<&SSra8zwf?U
z&A}9fEoFzJ)eG2nJA0J1u`gd^b$HJ#@h_a;?WWGI(=z`XlJ{%noiD*VUoJ1Y?EiGx
z{8PU6q)ALZk43Wx!!KmCck1lARS#x=`4)2U`?r-%`9h{)i@MhD%{3Ev;+*wX^6QSS
z_fOyEaR2YPmr%REL^OW!-JE|@SN+&GlNY>PNO7ief|CJzlE}s#rSjfi@4c}#=?_cQ
zEfsvLbSw4-$JY$^zaQ@#*Y7%Sw_v}^Nx8?j3nQQP-dV|a>dWgpabJI3PLTNe*ZJG^
zduuMRTjb7FyvJz2Xa14b%6WZ7XYH>o%Kdk0zTd}PPpqobCttZad*OY1J~x+0-xbF%
zeLL$|w!-9cv%}ZFjt!g*?cYC%m^I1pzCL;2<<f*jygPPINDoOkm7H*DagLer5`*_@
z#_yMVs@|=7t8gxh<8a>El_jZ#yR$B=Q^=0LB+B2YAu9f0A@lyTvRh)U7u@t*;=C#I
zddcy%#*g>ergJ|(CVW@Aex}ehr;OtIUgpC_PZ-!QPmlQer{$g{W8AD9zV}xdz7$mK
z|J<x8wd05QtfMtYJF?eYcF8+t`FGR%e~%9|CmdLEpa0pskA|~_R^PFD&i%-2NmfGm
z|GKgjhw|1>QaAEr+re_CBFViaQd_&{ioxz<|1bQt^Rm@?m^)F!oAY9rQcLUt7t25m
zC6{*536Vwx6Po^XG`{BPcxB9AJu$@BL*V(T(~}uypXK58n%JN})ptd}H1X5FlS+hD
z`TbNbq^DaH%XeCEcb<RAxO7&=CDtdW{0kr4Q}OpI+WG5PxB1=n*?Lmf|7tvct=h3k
zBhBDcJ^O#YMImo~oVVL{<Jg~F&k9o?|2cE7vT?TGTlU>83i$@czrBMN@SXOauy-#<
zkk!WG4Mrz?nas|9Z&2@;#S}T`@X|BOt~_~o$xu1QU`Cse(lRNfLZ{8D3YQ)!I=#Aj
zWX24y84+DGBD@bTIeYZTwqPF}Ri7MJAC_G)tTRe>%rJSSsrJqJwEaxmNB1fo8(Lid
zlWo%U_}e~vfj1JL)=g_Xb@;8sf|QB5SD4NJY`r}FLW-mU=TEzP%68U`?Cz{bbGGC*
zDjfZPRC>WK;jZ1x2l^)8XABVk8#pz8vDW!x;p-;OzdOClRfu)h2EC^{e*12odprL@
zmQQ)_>d#CwvU~Ej1wO3v-P))(&v=r54)-s0&%OI5?T*uyI(Ovo$HM<NCFAn%|2){B
z>ag&t{%5HpPxsz%`*}Ad(>U91*-X>kspoTS=G=M`#xrFmQ>xGcA082*jnSTNvsP<&
zd5h_tYK~FeF!eg)|4)~mUi`SAahe;m;A!s63D19ZJ=`c%;iG(Ysp^LhVmCh}7)8#w
zw(6#&Nchvs=RTYWdwQyztvgup^t!b42U1rPj-=<j+W+U=2i{k6yNrLU#L6u!sl3%P
z)%@Ykdv<;=WgFA|%UcWYR;=A4{$5|-TK+Cq^`%wvpPS+?uBy59UGC<pnkY5y_tiO1
z*lsfSntZy-?~?xO+=p{J`5(9c-yAs8-&kHwXoY@K>k5Z0kpiOO1xBL$o7&ZE%@!@V
z{z|g-<e%e?_c<p&-oq8R{IZDXgB!`O{Z!hd|At5!d|c={t=ja9>fE=+88fQ0`{gq>
zZ@iwi(5yF~G3#{OuS+^N?z3#n6@I07JR$x1)dPFWHoWPacCBb*=KA|}KR2C^yz{Q&
zz?%0>dk*whDn9zM&NHy$gwu*oldi{1dJ_6s($45)wprC%E|>L6?<_Cw7CEMz^lbLz
zEmxiP8U;q{-dH_(>(xV`i{IVSSuaiF;E^rN*7dxz$}&)X=8mmz=G|Q5a8FBVKUbx<
z_*--J0&TYHRH5xjJHpkAwAua~OwDUL&()$QDs2^XJ#NyK(Bg--Mk}*t+pdmlyb|hC
zCmJ+;(|>dIQjo47u&z>&uB9MdOY}sg3*EC@>yDV;ym@M4VE^g!Y79TkSbnlRa-Z45
z<o`8Wp4rO(<>`5srrR#nul9=nmb*m1ddk=AZ1JsYrM6E{z2k9fm8yT`O9_|rR@++V
zZ_KVviuw{*b9CkP*H1s4uemeH`SJwk%R=_qW~mnr*lN~h+$zej`Vsjex%Gk8o2&b`
zROQdfd{Apy_RveQL~MIb1nZ5cFPxz=TNw{`&3_>{=c19rXZdu8m6z2ekNSx(NDKb4
z;_kGA&hyd^bgK38YF%Jou3K}(F!jNN<xT|;8e*iUO;eo5b9ur!(Mp}>V^`Xb3Gt_&
zwmhy^;KwKBEkA2l#SXVvE?$t_Gl$Q6r+lmvX-%2Gs?9!>_kWyy>#zHpORU#t@nrtZ
z-+a};M>+ie?t2^FEdO<X^^cnLulqH>+g<%vx9acTkl(*oe)}H$_Wkl(_x-o-pPyB4
zPnyK!^H?;C*!)LEz1RNLY5n^f@@Mw-kHH_`$9&9}G74Mtp}hL`3x&;l(@Va+DO>iz
z{NLY#vfzCm$~R};y6^iif9k3GEEO(EOrCQOn`j6)zJ0dv_f1))s^i}ZAAFMFZe&(|
z-raz>1o}bT<JHV>&hL%X|6I3?!Q!^iM&0m$-_mWKmz_?(u1jxNzwX(0!IiIgjD(9i
z)h2m9RkPl%6Sg_dddFLS`-zhxo}R8Xmo5;MSCCS-75&t(<aNeFulo}$h4Wlk-tE7t
zxW2gh)rEOZYu8EbS*NgErlb^fO3s?A@sn@IPf20mzVa|&ufEy+yU}L<g}$&JSDA0x
zwR`){xkpP&|88^(m(2?=y){+3<Ma{ve}9U8o8F7ND6M|P+U(xXuGUY_iuWH>E$sfV
z)_6zw@xxE_mW0h-*U;(aerM^FwHMdin0$6|uJq@}x+~AGy%;?Aw(zqf(M1c^T?}r%
zE&S~8?HwialH7gs+-I=oPfn`Kk}V8(lU7kMTY6}voBy5Ei)@M(hitfvq81y!JCtEw
zm>#kITEi)$9kPtw_fvnY+;HIDUKep^j`O-(x9GfUdXeyM_Jg@cWwR3w#0m!J6bkK<
zQo8UcPfGSowXkl%4r@2|;(IQ|h7oso7dJ=dFWN4l^Um*LCWA+n(cwqy+W69Tdn(ly
zxX->b=i%vqM9Ut}uKD&cqPeAiwJ+ApZc<XbH)Cbt`QKA6-)DKXC3EK7koC9q`NAeJ
z<j2V^S{>O@fB1*!#w;CP?R#C~NvV>Orp581s~hHOyWahBbWhR4$S3w2`1|?)9lgPM
zs_pv56CZvZJk}vRdrSG3&o^IlGo;U+GC^;-eK%)L>X%oQENq(uSszQSPW>@=rgYIX
zm*=yW$>;M6Tt0s;O8EEZm+b2fEwrBBvnc8PeGbV==>;=-O8Zo|>Z>Z7s7~)x`gJg{
zx=?pJOX+lNfs`z@m^Q^HuRHeyA35+S`N8>RJY4<Lcz1ZU-!%Mu?d3kBnJ=tetvI!0
z>y%3#NlBy~KP7dK>yhe0;XT1iCOO2O3|e`m>Oqug+Tl|-errklc<2ZltgZcU%9-K(
z?fMgDpLhOi68U@W(-zZt`yDkt<TQVEej;in*Txz7!P<4tl#ppf6`3m+ZaZ1w%2l;O
zMBnPJ>y;~8IA^ah_Pw&DB=C09UlXrjw#ltGT4r;G<sN)CZ*myx60hHFXZ*TL`7|5n
zcL<g996#==!ZJIX^-#<EX-3w$*YuaRA34AsBcv5@#5uQH_h?eg@)<W@8pIiHO=Vhp
z*FcA9{kHd!sTQ5DJ2vw)e>}31asDfdA6u2Uyk-YkitPB+o;qU<e?VuyN4ASHU$+Fu
zo2Ob~OyR~Gc(k8aPtl&$z__L5_piTp&y=r-N9=#l9umous@A+(DWdIch27O3oKd^~
zs@S!3w<oM#pAh)@@49J$>9Xs+d|X{3)7meTTvvNhHf7DxAej@T-?_G*+;wzU<MUv~
z$8I$Ni+q=Dw&Cu3T`Q)XwmdFVlwaB{=MmezC)arAB!;Bz=$M=EdL@&!u6w}Vc|T5d
zpZK_O_Hwxr7VBWq9hsJyuXwLDu0Jw~E6UmZ<mcZ9b(9mf%u)ZUR=jF~g8lu@shxe3
z?r)!S;mJ?$BNkh4F!L?d)IN1dME9ueTArvHcJ?V+GcqK&-&-6zbXfNAg%(pq&bqpo
z<A(WnCd%JQcCI%neCYA)7;|?#lX#Nz&OU_~U((zr&iww(p6}g<TmDZ)()vN?6#Y}4
z{8j#I+`PCT`AJ)Ocj*VqUh_!l|FQVM?mMSq)0j`^p4fM1cahU}^O<Q+y&4ZpWO9oT
zKd7DYsCvP2k!cGvIgWVuUFg5+o?e*!&Y|v3^S`$hH@M$dO*EdhFk)id_Hz|H7hBF%
zv`wFW;%~kb)55R40;kP>9LaJyGOJb3aAnmOHO-|nCPeHo-Fm>u<#zE4)qo%SMXP4k
zRGBJQCEC4AtbRXPYVRXw!3t*|!^Z0$q8H9Mx;#RAkwmDs@s~+D?zf_Rv>T;AMK7Fs
zc6q4vqN^$&s?HhgmN>fQ&{}uDg8kk13z|0?>%RIoA>i-qW#M!E*ZX<t%fFueJ!`dL
z-rUD}^R_XG{p<B`Ogy2zL3+RFC$k+-a<5%}yzb7fr@D7{XfCSSQ}A{clk=Bo#jwf#
zYuKvWW~qx$kJ$1urihd0w$4tk%sFP;&9>h>GFv80vO0KA>Q^qm4koQPQjOt7d>r$*
zb>qAaEs(z)5+r{r@$B`@(Gsr(EjRXT)7m-DclNV_T90XJUHVU7cAq|cdh(Sx!_C*a
zZmv8O_4EJc^0#MmAA8jO|F+zrWb4L|<dZ62KPi7&cf7EyX!h}#H#u4Q#>*F~oO<M@
z6snTiU#|B1=6dM|+$xMsTXfQ2pPMWdt;F$1>V^0PhsDt^YNgxc&V{`&TykkG%Z^u4
zXCq!nSNa)D@d?+Js%rH!yxVFTTeZ>uOz=c=ZST`xJSK|AI`ky`ERjAUQnjYUdrCg*
zsv`+;{H{S$a^h@*xMDqb>1r0_=N;(g@vWRSLq>Cr#>_k$e*VU`^&$d`Qu<#B2EBML
z$##ot+QA(SllH7la23@EG!nhPCiSgoRb?CFvW9!-MK0Md`@`9HOsOaEttfy08+H97
zHTNf}Ss7h$SiNBS)G(%3AH5eUr%4#-FZgZ5_5H0z&f^nrZh2l@WahnI`1M=S-=2pv
z>^#=8@S2n{hl`&reDd(9di3O}XC(I>|GiAs=ER$G2fa54e(`yrcw%)GPml|v?=k%{
zkqau?+cxb^(%wC<;ML?g+j`FT&U$@PBJM--xmAlI?(KVO;vEvcBzBYThxwV+krEDt
z#^vH0E+sPUo&9ObrTqB4cCR<w{i~Fjf6dzez+CoR*(Gzf%~NX>$~~#?vY5g3sZZwX
z1v`X87d@;xFR-|O(dDDDE1TjT{t>=EJ(g2SDyZ(jhH3K`KHB(2CF024MIB4u$cXVT
z)o&C!mi?N4(xFH_xw8&UZLQ&~v5T9Q{jrhYPt$lUB^JKszA0DwsR|Q!O_Qlc+(*n;
zh-Y7C%-j1~rSVeK6^%LB!Y?OXDtL65smqi9Tj|G&G(NkOw$O#_SNN9~FTQ1-)xWAH
zpgQ5G)k@#{rfi{4-&pwje4iMxrGMi!KRvmqUe|8%h7HeRj@pFoJ-*0mdC1en(?VBh
z@wI3DJyf9KAO3&i3!|i6TueP#C7eprZ#l^9e9|dxBUX5K#*U_p1xkfS6Www(_>4at
z;g#>+5$6-5SFrrl#HNk~Whz}9pO)B8oBH~D@}*COW}%n5m@95=G-x<}x$IBG7T!x+
zQj?RqwurLdHfYgU6_Iiw^l^H#P_@jw``QH?MP3A2OP=UG?_d<)dH(sexw$J-t~|Wx
z@l5+<=5-|tu8b+0K7A;VJIf{KKF>?-QN+^XZs(c10wqp8d0C~SZE>I@eYt_f3cv7=
zS+nkmy2w_Zk~_=t$g|r|Ei58brmK0v3&B(^vCNsDG9Eqf&~bd35gOMP!V%Eh@-bN{
zGWt=oe`J7`(^|P3j~sYaSNqfmtmM=9${@<`l_az2p@Q5rt`%Af)#Rp~aZ72omeCW9
zn9AhN+T<9>(X5uEY2n&^h%HR?%2y_fn(ba;3xf<NRIO{ss%do(iLX9&mWgeW)lOaZ
zt0n#)L&VDcpJ+YnTxDOVq4-Lp$l)`i+|@v>ZKZ7%MOV0tRYjK`@OdQE%~@NjUD&x{
zollHXUgQ5W$5jvM%L`1mn4}~1-a@ZXMew?MulI={u9xnUzTUa}`@6f)`zM@#ek*sT
ze+ubdd|c@G6HT>_<G;4qyy{VsTyXow!^s;%mbx1<Yx)QLz4~0J=|e_|`drhcR{Ywj
zj-qTDQ!h_^aolLH)H3#!vd;ofHk{)3?97U_S7BN<!F4LTGUsvEOp90Ly-sRja%Zni
zvo*d`)pIUR-SbRfw^VD+1{>4p=$B^#ja{-HF=Xpzi5Ok_bR{P@*Lb0tWoOsJ9=|!O
z7t6h#o_@?%*hM(U=F*1+>t&w5TjB0gSr#{M#;>;3B?Vjbma5M?dVP_*qNjoXg>8qH
zxw3q{AW>XtyGnS;wAC|~udMqLk~m=niz}zyE5q2zQz`T2{n9=b#AvnXT+pN^i}`f5
zB4^L9+TXO$^O^R{38kge_ng|9To;kLdezMd#aBf)WG%0*jM=pG>Y)jREbHnlqRJ*r
zV_xo^W^`2XzSe_P^P`>~^qdye?X>OWf@}Qj-TWP&E~uPd+p2h7BKmK^x+gYj{k}pA
zwE1R+NnU=HE-x?9XIgUdjIy}vYONbr`J_Mn)tT8M;&L$P#4Gn3Ezf^dqzJK|b=_E0
zyyTbQrl#bot;#8FdKYKTociRI*s@cd*6X5sjZ$aEa;;PPa+P1>!wtD?&J2&eQg$T~
zS66HHd0tvv|7gaN#GL!n)6$#TrY!P#vQf(QsG@I`Re;zflb*M~FZHO2?DsP(h@7}A
zskryCes_n|vE-kZEk2$&8WJ3Gm2btR%T1pew0QIE*g~CS;!n1xXy<Bc_8q^pxOq~=
z8?nw8fn}3j125ao+~l@s{;h{GRi^?>=Xg7>?mx7uWW9j+mbHHI8`YZ<BkiPQT*c?V
z+9Fx`f4e!0UBo@%C4arPe|&sX|65Jk*^@u7UVYmB`s45NqY-sI`3@>?nw;!s^xnO#
zI!|P)?CJM9i>kSA`nBwR^IC%StWV$H1Dlr%{d(#B^ofXRtNDX<zWf$u3(S3l*e2f#
ze3cU>{NvJGcX#Jn9fOS>d!zJUeqD0%=@!;d_vu>>ZLiqzj%^iJ_MC`=b5ku{mQTF5
zPI2XvPlrW!X1so~b7$22NyR@(?!69s-}*>URWbb_%ky)4zMrf&sb?&cj<5Ui;oo7#
zzrt+4AKyOBd~wsU{)bzqyt(pz>9YA3_;g?FSYcdo>3(g^>2qAgHV3y~5K2^kxOVM{
zm=AZ;QhS4IC+pu;dC*>ynWVG3R6)<pqrGj$aX;f8)9F*v{C=#@UjNhk)feN+I^j7&
zy}UBgw*Ni~$sK+Y9Ao-oZoA>TBYZWp>Q8;Up}L2=-14zy^dZlW7iNCoe^vCs?!||r
zMc1yq`0-8kt8v`Bw;jg3jOm;FP8BUbR;cc~e4{C!XwaTyzNI07da|51O>~;qSgkm_
zQa(}P_Iw|Hem8CHg2>kQAM;*WU+2!Be%$AlPPbNE%G&@oeXHv^Rbn5_UvGWA^nJJ9
zivPcVA6Ue*!C?Alv-<+RH+kRQxp`W($mc<%T3jKoQxj|I)qTGl?6#W5_C8eZ`(N_!
z;oaBe^_`V+KI@gv*E{9<oHyBYnmcE{#k$M?mOtG&cadI?M)&RvZkc|TTA|5%xcmIS
z9>{R%`P+HS(0bmP+6jDpUrtQ<9GSs&F6~E-&D{H2BEll8aw{ti$gv$M%Uk$A)z784
z%KoS%+mHPn`@4T^6?=NFgEjF_Ouz?OKEEFUL7R7S-Vt3ecb4~q)&ec##ir+D+#IG<
zN9yVItna=1(e%Zqko6+`4(qnRcW|2cefzPiPEF+pub$r&&1J0_C#@f=@UJ{Fv}5BQ
zE-j_ht1ZtSwe#zrUw{6%c>Vs0V#|Fy{(We(@xCGYuUbkndWKPV^Ry(kTCRP(-ig!p
z$uyg!OPp%lA7x@H^uu4R<D|^fgPa^3?~WbPUnt}$yl?l%Wns&nIlcV5Wy6fOT1&z%
zvAksuP@Da=XV#*VwyV`R&6Z^@VOVr*<4WmQ(x;vorWwRu&~i@N&{fo`@a2dzXHkOH
zyIg145`PbqpcBRW%v0-=e~GTsE`GDoH1@-i&3(rOpRDE=f4uto|Ju&jQ}&gWrDx}D
z*%!HxPtvr6yHR+V+}!n()r#0_d^$~ppX_es_2CQJ;*<JVf6d*JOTH-~Zbxd?@>!O1
z-D*EMW9O9a*&9B2WSH;kvR!Akv8v<GS3i#%s}tju{#R{Z5LTwq=x?=JDca!p**!n@
z)|EG2a<9D>wu31opyyQ5i`%c(hTWa^qRKU*Gbnl2vI{e0)_r@sYQmPYIv12P3b!qC
z5BbAC(`e$>htswM_%8lZzAW(9nML+%-2^B7&R-RHA?Ll@Vi(=Nvoojk?`!35zW7i=
zBuRX_=Ob1@fxLo?J1=WRbQJRJ`tbbRUYD*HW<qCd<<<qN@;;nv*K{g9%zD-Q&ef0E
zCYd#yH9O64^hitOvDymJj#f=h<%{97&hnQ%-NWxUsjlP2;gSP!4wJsJJKop1yL+wY
z?g<a(di;KWw*KQ4!_3aAXN{Mir(B$^SGIgn_z8^@T}L(LIk&Tim@#j?HqE$OJf8cI
z{Yo?IC)F;DYz7OwHx;${HTQ<S{P@9<fk$xNiwB3qi<<W)eT{naZuW_|OB3d<X*For
z$aHYyLPPn+*(q=D8A|b7nseuHM5Ab(t$M7osKmz*=SD}9?awD14V<zg_tw4tFQVG_
z6xq(Wz+6^4;nmTE_-DZ>uPyBsT;Fs#tM5ltQELB-MJ?}zeg-vHKTl|Xb<#@tYx#k>
zT+WMcR{eguD{Y5%tg+2Q%UPYwT60XM|Ku*;JV*4y&1)sS6CT`MC+2c|`^!kVKgL`2
z;*y#p%MP8t>2a~#HYSao{qgoYlmF#gMLb_0A1x}CsQvv{r{nZ@#XCNJoFN?$wqqar
z2l3Mz3xpW2U1Eux!CtQM=pwJ(_HCNM)3~l#reA+!x&2Z5H@ld2eev0gV>{1Y<UE<P
zyFXU$%8xW5YmS#UW-Z|GyfZcMT)rQ_Zt*f_xr7DrQ5C!8^C~|!>K>2?z5O^S?YCiP
zSw+075U20%t#yZb5B`-}bN}`9e7(pYzyI!Defs|-LnYpa+j}>4Dn35)NMfIra@->)
zeQURqNi!Lnxy1Su?+V?X+x_w;>up0W`^^QaFMR$wu8W`g@VF}Dt3L~N7b{49Q_<n8
zjTigMSLu@L^szwhC1d}FtM$i}rcASWwD#kv$>*dcmX^%=yP?;GE9X#NY=7kwt~DoT
zpZ-*+U;HlRclD~CYWZVx9eLR2waNucFP3<;miNzOt3t(<C)*m_<^KFJ<w;!s=-Bj4
z7gTOX2A$JN<vY7AB9&oH6U)Ni{#!cYzlf}!k@+C{@eK8^X&OgwZ_rwK`}CoiLa9?Z
zH}zbN+fl(Taj(iTRM&5|7yG{GWy%}G?xffqyS4M-^KBuAmP_4XnC!Gml1snV^YXEE
zF@9>z8&7wi7CUFl`DW@?-D?8h59mcGyP6i~{hvB-U+mv$RvB!cx3_=b-K$g(9TU7v
zPi|^<pHa+VjoX^%ZB|-U9+SP-E%v?j^3oOEQCil5a=m{mwwjjOmbqWj;hJ(Zy6I(=
zrQ4i0D@!8vpB#BCE4l9RWD`l_>q*nJZ_W?)IdILw&*QnCh2BxNC*SXTMrAj8UXJ>Z
zda_FBf7=U*$xFOF{zle?{m$+ES#>LKhW~XxA*Hf&RY_X&9d0sy|9B=sOg1#2yGv(H
z#MBAfvp?rQ`MO?Q;=ls;j__wCjpvNq93=ZMu28;v;Y|Ds&4hd5xqB~3rPbcM>i=W5
zTkr+J&BAXFr}=L`vSs~|D{q@JXaD47`S>#b$;9|Yzmty3>#hIyt!T}Gx{v->cYSqV
zbGzcmuHF3+<?HtuTsrx3n(D?g?KdZ>NU8Ju)jRsZ^X@d8=zynxJd!ll|4u|9qC<Hu
z^WUHMH_6htTF&;d+`q3p^VZ(EsdjSuq&lDTCF+u^T)(!vuXrq_B|HDQ-}(GGS48*r
z2FUz$pSWbE$Ek<6HZz<PX?}R`W_LrZy^nTXyLg%Y--{CteE*?iV{4YR;Sz6A`uQf-
zxZv-{*&f91+_CY(-e#tbjgQ&Cd#^Sw+&lAW@3&lbmdyVqdOIS;#fr@xBlx)dBKdXh
zYTi9(aV!4DwDhXWM{QO4y%OVQANZ2DCgF+%`@3C&Wo+>q3copjkvv&fC~;<=Zqcpc
z)TTp=dN+rEyYy*)U{TnsCu^LF?gdHy3gi5AmGhHx)4CU*E^PM-Sl|~RAXJk3D}G;S
z(KA0*#v&!oTNXNJk8F1h5m@8T$N&D_JFCgP?5`>^tu~*#5-WR8s^fP-qVDy_4|l8%
zH2SBqcxO`R0`-U8OU(HK-^vHgX4vm6&A2W5)y>xp4yoqSpN~nI{=2-#bp4Czymvwv
zT%z~0wf}F(j|^n^vF7f*+3kOQWh!jq4zE5d_OrKzZQVr+)%eLq#nQprV&c0@ZJ9zV
zp4}*WrYAY^eD!?k@ZRPtu>vRO&iG*Zr`YHC*SnfN{claDr$yMGvtQcZ6DL1!$<r#^
z6#onLGX2LrlY8g$A7S{V%D}@r&oBJejAfJdlrJkZTRd+??XxMXoGrAP6Hd&_a*vd;
z{id<!se|nCLdm|oT$wsi1?ROq9_!5}R0OZLlA60v&|XBS*IaDH_GFQ|UUQixQu@1=
zIrJ!;nYw~!p>{)phhjz>3zM(%N}dJbJPXb<YwU;!=Q;4n=Igh1)j8K)ueGRq7eDH+
z-p_aZjb8KhiZlh!P1i-U*^0~7_bu}=Ecwba>+{hkYb7hbt$(~!Ho|i~pX#ctwSCKd
z97}p*-Yd+QF2*K&eC4cP#~eC3&IyDn%4Rb4$)2(h(-#*o@&6vb(tJJlEc;33`ZE06
zeuwX@oOsGY%;fyi_u>u<q${Tiie&TnT-ATuFsG|8>bS1&tF_{*xzDVPcd}1AA+C_%
zxp=DL7ghlmt;we|^&149E)I7$6j<<LT6xO^!GiuStEPnvj{e6u+$&#;dONAw7Q{R=
z`oi<-*w4-SkFS;(vxyt_GOv$1_29zR4^D;}Su3rJCvFvEetFE{Lf^(eZL80&H=L4q
zZq~7Y8t=PvJ94&3c=WSxn)%~<!s)P$+unEoUgFhWa=PG)cL9%yVqey)PdjopU6h_u
z>gkt#BtUEB*~gnA*|*-f<ad(O?~>+KmE{qoFKq9%q{gmOHk=-|`N1x=Pd|4VG1Tgs
z|9!Pd{f^`mE`u&n%X`HN%?r5`Kcow3F$nT_?AK>a@@P!ab6(M~EMom*Up6C?Sj|~y
z-m;5ckm0<*voxbB$RvhgKhv~iMzNI-zWff-`SX|URYFOl{2lvgO_Ea@J>xS17<&)s
z%brMm8DZAz9qS&z*pc95J>k?Phx5J<J{7+@6~K~}ry#y$@to?iBlDJ+?G0g2obYU+
z$PoqmXzMip9cwK_6GXcE5<R9{wN<7YuKko55GdOmsAHJ3(YIsa?D!9z21|<WhdTt?
zG^TjxCW$oPX?U^l^#s50ct*F42R5~uZT!CO=@S?J>gMwX@r)e_c9~z6&MDN1`SiH>
zP&k9qj3}u~t*vo&2}%l0z6qiNoX;xSO4dHqSRaxc))}-q{D8tG`Jms{21SP_n;HN4
zDko`BZ9o5=t9q3Ct(S7PWtDA>RZ_be_KQh;PH>!HE97?QeB6z66JAC(4Zk><TRKTi
zx65xF=ANcuRw+_fzqRm$cD7SVv&65?i|zF+&pzE<BEuH@ZNp64C~;10zWeo0cdm|E
zT0Qq%;<NcL*WP;m{CRG5?T=4yE2Ur7X8YTU+x1MYKFRm;TgSKW^0%e_ZL!T=yVdmY
z=4r<k?l-W_F56L(Z;<{X@ltyG_G#&dueZM}JoSiwvD?dg-Oib_z8yanxk~x}u~&zE
ztGDMc+p4W^dwBRx+mgJT?!Sw2E?6kH)T$iz3xEA$uHIg^gnpC7&i^k6nH*UaH}jiO
zf&UHZ!|T4K?`u4Evz2?>0d?_bmtyYjiq9$Y4p6t%36!|FIbTfT|ExJjuiC3<nQL~P
z*?2ED;>MK~g=fCztux^{dt~n2$N6ji=Dg?s|NnFSr*=c>9eXc(Ot>7~zU?xb)>Oy!
z?EBe2TwXqZ_rv@@d}lt&e~BySc((oe^#|2^*B?w?l)Jq0=Xtiz#sZ((Z{CfGf7!O-
zPR(9!6YKw#AKyIv-Tiw1|B90#Z~Nu<*MI)iWOA#$ef}=-_ICaC@ss4&-QTCUx6f^z
zVMbzdjGWHFhfjC2X_Z}((-)g&>CBqXz94$u6`s~R+*N%^H>)>pnXAw8O2Twq!SB}n
z8`dmvd~rEY*@V6B)yY${ZmNmQtD5%IB~5LMQt<u!fT<@>Onuv+ut`^7NAbZuoNj%U
z+4pBOzAim5{oA?x1DUT`-bwp7l_dTO+g$3E5qVqQInc>%$<3DUR%QV|U;nNwu7CRP
za-81Tzt=VgN?%@Ud;jtL-`UsaM&GN;4*4T<=Ikw=oDCemzwkIFDwgxgP2JFCoh@{y
z%|Eyz{F!|WKf`+8^V{RB9gP=Wjah&2+V2ByHnn@tN@?<R*8ZFG@8l~>>4|Z>%5E?E
zZMU#Q$~*b#?XbnIJ2M!3cA139Uh7@&^}6lY?;w?04PWl_Iqy#`Qhm?RRDHd3+xwCQ
z!QvH)L6>~(|89|IRIXS0F>%g>zlUp!X62MMdR|QtW?A>xx%b?gb*^>E3nGgD6}8+?
z(w@)xmwU@MHerd<XX~~f`XVUXooceE{`ZGOuDUDPM;s0uJh~^qSNcx$@7DcqbabDq
zMa;Q%zqbADjnB*W|H=7(=hT&)^$nYAD=vK8`!Zubr&IN!^1L@c|Gk{I^~=qG6?@ZK
z*4MUv^9XL`DEIxIR;yNhRrB3~FNw?FZ~s2=SW-s|M~1fEzqxuE|E89<6&bs2O`Ejt
zch~00{d}9m&c?Q8MmMzH37v78>rR@y{=pB|fBZL#-1ScUPPV+3^%JJaYizYS5>~n7
z&D3b)kv-S&CD_X0eA2<5h>3Z2a%X)Ph^Vx^Js35s&cMx-dyZ?Q;?HThie+Y}Rj2g*
zlrcAyXJJ2iZ>^!|<QaG8zVxu3VKH0u&nEtV2RFFfh`Oj|z}Dp1R%_g+lI~(R`IxuO
zC4b$}W|;}cq$iwKt$cZN`;O`F8{U}Ot=l;JMP1jG@4ev+Eio5u&U`UWU2^O^kK>}H
z9}FT^gw1%<5SJGvJ4-Cr#3(8x)uuT=?A@7p&icR4>u-E)6>h($uGF@!y6)@su<m#H
z{(Ie~YAdql$L^^w|NHRo>>svGu`DgG7XA_4uAjem!^fZ_YwnhvkozLM*ZrC0Nxrm-
z9dFGyiSva&$ZbeXn#WkS)9t0q(kcJvdmM22*0La|T!+7V&N2Nzb6@^>!kY0t(ku1x
z@9z<8_sgFbUs!(qos>#XX8N`%T+8kr`pS5F=gSf+UN=wUhlyEFUqoK^Q2Chszc}X6
z^Yq0GyP7gDo4h|>zyCpeuSxD78B@K-nSsJLsu_8{+&i-QjJ{{S{ppfb{+^j`dn+BP
zUn;D7&T!9?!CT_B+N8JK3+%0n-hR_`o^JDFj_&8r>C-;t{?D>EKlYI0{y~q{-bUt!
zCf~pFf4iCXLjLa8<EAx9+>C9@WLqYOExvs}-!LgKHG!E`%6^)~!iz@@(jFXSFyG3Y
zsQ6~d^@XKrZ88#nZf2~nydG&?Bl^QNu`nyd>he<W+O2zksVolK&&;)4dcIX{p?Hr=
z?13pc8cx46&238jzZ-jX?{l_hiYr)SUG%Q<S#9uj0gEWVKT@J!<t}*(1r^0kPf}m?
zR<q;1fa{J3x2Ibd%oVqHJ)LQ9$*}%|EyJP^K7~GxZ=0TqDxA6U!8DXzuX@7CvsYqw
z{XczgfBE)8<==-s{EMEy=&+^rq-muue;?g6<?)Sqvh#0jl=qZ;Z#hrLc8kkRAC*b7
zm%OQXfAaIqc!pYMbMCvL8750ldY@l&Luhud7DMQd(1m)RA2SBmpT4-jj&J^R;h*L<
z`+XC*<yPt5N|)i^bkO_4wA>SS7ytTwV|%bf@udrOA5SKJ>-n)RKySa%(oe4^KY0<p
z&S1gz(EZBxg)=5ar@tv^-E4C`y`=c?heN8jKOW!qqtjigW4=n$k(W9jk{1`95Rp6n
zKyufa_TN+duJ)BA826mud-C>HkX-SE(-kY6cE#Vzx0kZN_3vp$b$<6_=5Ixng`c;l
zOWpfbSMl@q^oM`43@5mq2vMsqZ`2KEJGJ5Qy=`AJvTxrz-KqWM)xOQgzkU7|=h)KK
zvfuByBx@SyhA7U8V_PpJ<WKM{T(^X6b^Oh9bDO@NRkCTB*&I-#wo+-~gEH;?LV-rs
ze|}%RKmC_r=hwG9JB>Nd`)><!-@50?iAkx)HwHiS>|GXLzjB32rf`~d*>vV9r(eF&
zzJ22KOV;0gdq1a&F87L<@6DoIebF!CT<of8N2hNJl$;v2a_)Wa`5`ZCZ%wkR{Ni!o
z{h39R?QWF!A5)KU`Tl+9gOC0}$xY{96#h#7)vR*)Wy;dS{ly=rruXevoV)Lj;y2;>
zY#*Hp_7+@@IQVIr1$%bHq771;=H|ZTI4IE--*xuP&oldugvP)7d`|W)bN1|$0jinp
z|D9y|R&Lz-*W<*IZ5wv*xm0$~J=}G-bVszYwT|M93*Y<y2hPZm`~S+mqOISB@jP49
z<sW{ze{@csxbWg7S497ethIGk77vweB=6U4*%YHb`+L{Py&00RnX@wrjTI{%ZdX0T
zUv9Hwp5L_J*AL(Rc=r17?uRKG_e-2Te%*cAkH6xKbL8r0+>1%w|8V1;e%bnO*3vTz
zPi;TG`0b}t%FYZ&?N;UaaNnAl<Lvo-?%{LRM+&FUFJ0MkWB(rc_tr5<Qi)$8JOod!
zKiFG*OZ?4ZUCE_y!j>sp_q7Dnram(>mwdK(wqn2CN!_A(E03<X_`dH<yYa{VRYw~Q
zH+t0{SQomvdd4Y1`9DXZJEouCxV=uwIA_yi5pJWpk~1%oUo%EU+>!H{I=`Z)-a9dU
zozR4vb63lIlxdt}i>-A{o4l@0;pU2!qEP{-&)C=XaV@ryohIoVAKaXLv}yIjnvcah
zTYi3?e&_VRzu{>YmgwI}e?M8a;!vl$eYM@$`A^k6A7*OU$Vac{SsGt+vgLLD<BQW}
z*B$;@?yX%}vqjaiP3qf0!4KbxCg=SBFp0DDs^F3HeKm`@-oJek^uu)DY85HFXY<yd
zzv-XTo+`cTSF6{xhmWsJom%faBkiWa{STL)&i}vV)AkSZi$9yxKePB7yG!eS$3N50
z(TaIKrF<@qOJBdd`{dPuQwoniJT9>DoPC=|?(LJ1T5|yxUO9dX)8@PG%z`B!?k1FP
zH{(Bgz%sNZiz{Ys{i$RB@(yT7=<2m^zUa5>_6`00Pxs&1xNp<jiMee5zTCgxF*j>!
ze}Q34B*VERc0SjoCC46S6djd(vL|)&O#QPzD)tvt$sUfIw$@(fW93{k(KQcZOaEnW
z+#KDs^YNj1KBbT6O>o`TQ+>_p&-d3G&;GM~_Wx;1>OF&RXM5TnC-1f}DBd3a)<#qQ
zTp#c13ii$V&;6%cCl|&ZP@B#9rHT2|sdRTshNt(1o^<A_{VO#;DOS2s>HeGZ*OQk;
z1n>RmzAfeHckRhX?4t@oO>UGQ5sTA!HfL?;432-_<)c?ywd|Hyb^MIe9OK>YUqd5#
zcMCrIRdOi&WrcP8>czRjKaWpR3V0^(y(qpuZR$1OpFPOvclxV?)6aWo>s{?~G5yj0
zvVMV3`1vlqSu)E$azFX_!R?O1`Dd4J*4QK&f4KTc?A4#Lh$(gQU5nl?%Dqu>@PeWB
z-MsersqfFPw)q_TOmV7nw%IKGit96WKVAN^=1l!r=F(?L57vliS+B0F_Wt%nxBuv#
zpnb7>Cfq;YBfcn;Kl<0j6vbQLYv%M{Qk%&XZD(7XyZ6!GgG-KCeci6<ezS60wr%z2
zZ||4u|9{+Ge0uBKg86^do%UX-`t@q6>b{D!x%(`t3x91FKYx;?V@J|HyUgt-$5Jj@
z<=7>4mzI{#-1=ze!(7Ak$6H*TH#(gX|7^)V@40r=nmcblWQ9apwy}zr^Xz(VuQz4A
zzF5GNYx6(7OL`gg*)=WtzghOyZJU}F7yX^0|9;=PKL@t&;617PDeKIPPuAz{diCm)
zdG^lP@cz&G=ZBxZFuX5#ao^jw){ReD`scpb_%^!#&4JBp=YIAtuYNQAT6WvFpUJzg
z{SVsrtK>`NnZx=m%@69I+S_iEvF1D6_I_^XrLwSB5kKOU)SqsgdhEPy{l@u6=Ik=6
zI~TU!^Xu=g8H=`;f4(_o?Vse=&pofTHNKty@r|%`THczYIVG0+<l;BIJ<-#-#lM;3
zRlvJ_TZ=ZU{#&ER`=0mCEdjwrU%sCFul;RN7~_HGQ<)lqc;3g?q!%b%4HH-Wf6Z`>
zHovyip|#l=>m`1j_18c0A#(2FUr~E~wDmUapT4+1QvGG|z1MF<`AuS<OSM`a)vvGm
z_Uid_eZ6z>bLK7&SwHFQ?CpEb?B15J!o)Q#;dzRYkls1}`Tt7F4*o9Os<+0FX-+89
zCAWmv$_J-<TGW30^7B{Qw<inl&)sJe|M<-BPdE1b{&e(vef;wu2T%R5-&0+@>)1*D
za1M=Q@uC;EfByLP#m$by&FMw+e{JQ;o+SL|+tHV&x7!<d?%i<REOy~ut6iJ-U7UOM
z;@z*k@7DFbTbo~!Us_UMyI8#H(c8`9>*Ll|US`#9USD{=6-1tP)o!lly86W`H}$tw
zZff<ct(!ulOTuO@3Jy&>d;e|s<rOUq=jYFl`yjJu^XKKy?YA%XP8QjrEn@Tgb^V(B
ziuFc+Hh&IoTQ`5+-W?Uyb-V18{%{HU$Irblu6XcN(w^#HpZ=WnU#|ae{?`1S4ZDo)
zytAx6Zt&>;=i<I+*PYz9cpW>RuD|d9&o6KOJbH6finCLiqw-r;?`)Mw)t2}C^R92W
zCfWIx&FPw@^2W_xC%Wg)tNZ`zXw~z>p_4XVyZIsPWJUF_pcPxU`n9iLmb~_}U_;5C
zM6u`huUjiNxao2<rm48<{5k)!!(1hMhljzJkoYy~p`jliec96ZP?Y`JUWd&~w9e|+
zTh)J*U+#ZCe&0_{7LV^X`$Hp>0~!yeu_o+D_c|=vahW0S-OOthqI2ydl4NhkE&OI#
zF1bGVsO7g+j>;Vo%MX>m37!4y<>t@R>!ZKNRA?E=wQc(USw?@)wB)}vjnifw>OS<c
z(!O1A{V5IO8&7zC8|!8-c~DgwXK}n!)MU+h$>ZJjhfLO-SBKJ)XT0shG9vZ|Pn%xL
z;u-NcufTRjOKBdPyxPIwyPxXp<D%xfPe1)KhObuOtMw<V$<wdPUtbk-$7#d-zaPFV
zpC7m9(GIzNxBRa@_$<i((bJzXZdc8g2f6n8&rcc5zvuBir{l}>^yhz$)z<Dlpnc?H
z`{n2U=jUr_M$EOpX#Aw=$mzL%wp;Bved^Wp4vY2LFJJ$O?lx)jQTb`QCvjri6Wxj#
zSK2=oCGv{D)PFWz{Ez9if_ZM=*Os#~U*-CA`i7}qB8QHmhm+OZpH+9>e`8nu{^rZg
zS=;M_W?PH0PF<OO_vhY=+Q<Dum*?)SUdOX+(zCUR=TBBOyK{fsw0-eur3K}7dn4bQ
z{L;EuTm4IIuVvKZ7`BE#t6r{nbEMs1`ot{nd&gsr9oUyM`}Fob2NrVJ{WJ1SwLYsF
z|KWkZ_Un|5*DQG*3O2ZX_YP=h)k;6^?;5hwVuq{FzZ1VY-yX4+6VP~bu2wrY|J%Kf
za=-VlDOcj2^Y`-6&F1$1OYX7o#p~J?=&do~jbgZc^61-&qU}2hu6dUREdO;j{{O17
zwhtWfEAF1G%4EBGz+eC0=RG@;Vjq87ySg#WYLoG+ufeZBy?%Q3MckDPj;=qO_uD@X
z@6W!vFfsO9whP0uL|^WLlY&3yJZHSaSNXK{>!Bq^@49~fj5p!<JJTh}YrW~L7{AJu
zE58QGOchyg-g1*OIrGKk=dbVOdX|3KT*~&^Vq&c9-=9_P<ym`-3!@*uSZDHU_vP;A
zuVwE}cCY_cG}rle=&|d&A1ZsAFWtT;TgH0Iv1ik(vSp&e3i8kYd;C_aeVxV*@$~xW
z)!Qw-!rbB)FSgtk?iRne-?A*sE&g$+^P6=&@75nv_&&w)>6DGZKc0vrC$mr8SlFp~
zjE!Hrd42ht6-L`4N?dPLn%<nYaNnWoGynWHKQw0zF+)P{=C5RrcUW5dSAVC@f>r;*
zmkK4kRlLZ*c*Tp8(*8Mn@0$pjTtAq3*{k5PR{^L93HrbP=oH0w{N3FDzrT3&aykF{
z_R~LqlneJVNdNxdy6!c5+1mf{60GNz{l9PZ@5|-?`r$9--Gwh|{WyI0QCQCMN0a%>
zeN+!c`)w68xBY8IZB$_UH)Q*LWBuMAH@5t#b~u<hyW^_wkymO-rNSG3try*Rt0bZ#
zx4rfGSHp?w{yTQ&rq27k|A^WD`wxyhjC*==Q*Pn!g`80_PhY;-_V)g?d_KRJBYJfV
zJyo}Q(iol{x&39yp8xZve7?P>eBseG?19m*X9?QN>A7=PnLEEc?{(NKeLj0rc3;NT
ze>qlB-)>#p)E-;-ZTtK+)0dukvDf8QP2``6Q3+NT_a$%s|5<E?<A)pFYu&dce-@ij
zzSy?=@4vH8gKVx{VA{O4CF`Pmu-by0DKB07o?HD|zh9D9T)A@5jo0&ipPxB%r#^RX
zZLE&__B}JitVPzyA3yzfr*ZMO+}Yo+)CkyWyiYCIDz<&zCxLFo=&z@$YU{Uq^ed~S
zt-Rus{@Z-<`Nh)SN3;rC?IdG2<?f%esrc>XjJ~VhKjr@g#aVQ{oVHqr<xS4X^-kZ`
zlstL9`1DKB{~yoZomA^pTmQ>wVdf=qgPDH~;?lnM+Hd&$dwbri-9|U=<{aCWU=@1(
z^6c3!#n*-CZJu>1#&gN{zJA}{jJL*hdX;yMJe|a=z%+O5+lR~f-+h~RY<Ep|;o-+3
z!Fpwzu0FLf;H|P2S-POSG)^Y<e%pN=wyV`2HJwu*?KszE!gc5P)m_iKgsfxlo%Al0
ztbF+1e)Ht%>~2QCchoHW_xp(0v*$A+asy9#W$&Dyy81)qo<FC=GR%@=w6`z&Wc%m*
z&F$u=m481t@cY~2PbY4P|F50<SMP~^sha-NufN_sOPj5;{;$TxsjoOrf7C7icCY7C
zN^SZki;^_%IF780j}aQIH_oq%Zx5U7T2OfSn$7w9;r4}v%cYv`GxF!p`1tYP^P9=u
zf7!U}4(m6cIrhsSR!{O9<NC?()1H<VrB>D1>=gaCZc$&OP3e071A?Eg>O5Qe&ZT+z
z!i1^9r}@@Q3OZOT<rcHBDn=;xZBFjTyW2PU&iBpF-#ly1N(J#9!8Z4zrXAEgZ8T?Z
z&c;71`SafL`_)x^d*$wT?Vebk$aFie18xtO9sH>x%aLa99I|uP+<v3dKz+t`<;#mF
zOY-~q#qX*6wXO4ni2VoUV^-CfpJ!`*`>fRZ>gLbn_m?!jo}6OEH~Ye7@%4Ib;l`&f
zv3{8tV>W4pr=N`068@(f7hYO-_Q*!1UlBF;yX8(^*_iYzqUL)ym&TEWLcanOrM2EJ
zaF;o~@ny4XjzQqLsa9gK{vVeK+V82WD*M;8M^JXxzDI8r>nhYw=?1Yc&X&E$?zG|C
ztFxQsPd>g_%KrZ62j=%a|H?lllze^2_4VLF%}Rq^Ob=^i>MFuzc@`d#4d}FXQGIt|
z>ICVus6VgDJZ4Gl;wxGl(;Iwzk+$MJcBRXYj~tBIB~&!oX<{(@;%voxYD!n1T-o@-
zs^fdpi4e<DgI#=|?!-(DKECL+{CVwA%TkkFOrQQZO$}yWtgUdbWl_k}D<5BQwV2O_
zDCYXO2rTzn;NC=~;HO6uI6~hwt-7PSs;GZmTg~#2r+TS*HoL?=#d=P^%(i&7;{C}}
zEpttF$$hGgoPF7Caki5Ege#W02D_9#IY-Wi2uu>O$~D*}_33e!+j3s_aF;rz)g`ww
zN_<6bn9lW+y0CopqyrPDTIHJTGUAMhTn*AQ`M~6>ySlHvmRoV%cGdjWbrYIo7R8@?
z=TYo@-OZ8l;>zTUQv(B>N?s+D#EMK2m}?~wE8fcLvb@hV+$E9o;>zZWUjrf>N*+Zp
z#<I2wxh(H<3wMNwn+8NQz5w}GMMu%9)L<7Er+0^+Y|lF9Lqdzhn-8wC*)1Zz>rd(3
z^m%b?!LiR6V|iU4#faYS>3uyRt$kg4g?)R;-TQxP{NyLB>#5*ouRH!}nw><f<i};a
z_H(+n>boD-*~hGFclD~+B~z*ViV6DvK1^dNcG~6k*p_d}(dB#|*R%Glb=>yj%E1>}
zy~i1zcgOd%Mb?N%)vPL%yL2__&B^Zf6PLBG6Hng1?Z+0zmtDFbUA%7BvkNu!_qE5@
z@JH2XHSxc!GW6>@8ebC&a+A1lbX@hL3c=X5s($;vT-o@-OSiClsy^Fcojv@zd;DX5
zbgUDe>@e-u3=`{;r88PgS1#xE2+#6V@wCk~*yZP)6!|Lo&m;B=kJzsqRe$YrzwF6T
ze~-(~VO{&)UK5*drVzRE=Qed+yIg}!L7#Ku<NmPh|Dm|$hhpK!<V|5;-U_|xty|7o
zKH=)3{O}EOr8b+QKEGvp6?j}p+w{KX#5ltlN+qu+{oNy@JMG%lyKmoKx2bvSA;Nru
zsnAvEY*9_J?vKMZidlN<@(Mc@vc2XX7oBTc{p&KQRXl%N(VgH;1?M6wZ1+k<>Z{o>
zc6rD|ZvJH>&?)@=({d#qf6qIc{rB`V74%H|xX_}zTB~lO2GhcmY~?zyADCNQdvvDU
z%hcm>hh5ktYyXqYN1q&YIpX)qR<(cH1@~gE@0z7sjx6hc_UvEqrv$!QgY^XqCb<{C
zT>Nt<`&645?(#a{jrT3cKY3(1zqpuP$fpd(+ASVsizcxzSuM2PA|?L+pZQ-HU;c7w
z5w%@wxnsiOi=tf}+EvS+`$b=T6Ote06z-|i;+|2qX#2^HFQq(PJ}g-^*G4K<wNqf8
z&-Tgfi(jh<9-ORM{;8m3tx8fw&|5#b-gQ%41pJrXJ9+rx)=ASveu0($+_vPw$;TH>
zCv_N9Eq{8jEN7ROkfYnuF7<woaIJme7e8JRl--pkc+t&2yD#TWLCIC6L%sK2{yZDL
z#pY`6JByO1PmV90rT%lOZ2P)de_Vn-AG!EqmF9+2Q-7Jhb+ee<!#*E*_+po4fvTy$
zOz*mxO#WbjS(+ap0#ln7EP9stcxTC6k(N!f)cM@6dpd>$e?B7k(o3}?J8PbWQtW1y
z&Na_E4_^%R&N!VlugrPdqGv0`Q~JEa{Sy10b(VYdd0+QQWPEnA`J!lWL{jCajFP<~
z(*ow%NX6>6vQApg_w3@-pa>?A_*@Y&i+MH@v9hj0J?i}K*IffUADvu$F*GoQ@#7Q5
zm#b7(B~*NBD5({iDge^H&_%Urd0gZAjIvj}J04#Q4N_sOxFovq@kP@h73PXt8FsO%
zM@1Px{+#@Xs{!P8uZ=tpIu~D@8Wh9$;mE@mQJT{jZ3<0xd3CL3m}emus|-~>>5)}~
zdY?zQR-x<xVfQ83({?aD$UMwia&=M&gN^QuRM)e?$+2@9*3A(*DeKS0R>-s~%PXZE
zWKx!w*1L*F1tnLfgxvWE4%mrzKOVXGVwUF09gjN?Uo;I?+Wok5@x-k`3E_7?9{G5}
zN^^tuyNX){ijnH9Wp`!$WhSl(VcPw!Prc9MnoeVE;c?-1<<-*;tlRN8Gci{?Yo65A
zXDumDMQ&KmQfI5PRE#ucEdvGZMA6^}QzGWsNJZ+i`f)xzx%lGONx=%0pAt%zKAGY$
z&nn90x~E^`<CD!7uTE4xSn;W#B=*S^4NxG8T8awz%S~A4HHWKBo!{fSx*zAmlc1y=
zt@LBsj;mFs_MRKF#Xc7+?eZ!*&7zt$bxp^*Nq4-Ogeo0&MHO|ksJ==tjMd(m+9b4*
z<HoC7ld~I+mK=RH?WgAxqlA*Z&q9T!oM65bIy*c?V<P+F)u!ux0+qseqhhOz8eDy@
zcf~2Jx7B56m75@2k(m3jQ~8qUY;n)kpp<xHPefc@Q0c_0U)AsLx#YZ?dH<OprDw0L
zzg&2CV10__MD``C&Gw%NQsQ^Jo>Mn->6M_qgxsB4e71Qu4_aqe*l|QJvQcz7={$=+
z=xwAz#68<vx1utyCVvfD5Th6wq~Eey@VCj^)&+TsFLCF7__Vq^$NnVuitbG}Ze9tG
z`|!BaBV%$|W9uER8%Gv+v3~PtNlUr?;KZbVYYL9uJozf!{xPpQ!#t+LHVccdXW1<M
zV64wp*YfCP$rcIS+1Ev*ZDVFll(1BOzxVhz{SHaT^cz>xR3^OYlQ&(vsp6EB|0|~Z
zYrQHhmG77*mGm#z{58vX((YYG9Q9WW)YA_!ma9oEV3yfw(RZ(!FR%BaW}RstSNkn4
z@72HUZXc3=$8hyXt<4VK?i7x>F|nx{T64=v`@&{dpKYIfwDg(}OTx)5+g#HNu19Fu
zHdjnrckJ`U)TNzaC&j}a?<+6#ZuJvc|1tE3!tL*I2d^jnxql(3wJp+V`C^drxof?@
z+P;rne5-2WLuH0|_x;BL9{S|QFW&z7rP1BuSDVio)^2;){q4F$H`~`!f8Di?#VuFA
z?6mZ>@ZnuD_oWsb3l6Agk1oHz+cLlW@NJv5Mo0cmNlRR&#?*P}U>1Lq@{EPy!56>2
z&-oHxzWAi7Lh!mwfyVrzfXAyo6a|0zS;F+OrB(38+~u6gi!SxwI~ByIyyRE{!@Pot
z6-;Mms?F>0o^R{7?3?RrlMc%{ySHzA-fUujLzsW>Y}1RK9bYExa($7UBwqRA;nx*v
z27(Jyio&^K1Kuq1x7Kl=wZo-lRcKXw#^NOL%3BM~<@W7%o4VXY&M$A{MP9M$8^QeD
ziXZ3NWc64!XIb;t#=J>9Z)4&=>w-&2=ISlH7nzUAeLCR$*u5rvl9cnk1-E7`Q8xH?
z;hXU^L*J4~EzMQ(BC!c?6nQhYI2|{STKRFyrCe8jiRxpuQ)jJEX|&q)f+_jD$&>@z
zdsY^TiXND;;G$!~o5YPQWzRF6I0f%Sz4W^*DpBp>)A-CsIH<$oR=LHwUCfWS@mW3n
z^JCdro0{8mPq7@`cE#=N+qRzC%lDFMs^?4j7wtFO&TaC|_jmV4-<B+$&|8Og&fTyv
z|5kF(`_Pc&RhR1cPKPjCeDnR?^Raf~syUWL>vwOHz0uTHdpRz-=KoTu;Hk^1bWdMp
z>94(9mt51oT*|%Z`MzzbhaM!~|FLw1oJZ%=j{8>mAq{V4f0KE9JM8L=Pbm#|HZjf?
zC`!0h+LPZK`uK!A!{3c1ibV;3n4*M3ET&%T$~elG^yI*X&l2~atv(jKv^kmE-(rG{
z#5cLe)m>L3R)6U}aw1fH%AITdKC=`qo5}C%j4W+)5!iO+q>sD``?9;of23uaPCMkd
zHF=hv8=uea{*Sshvt(SGqvFkSJ7i{*$v?K<f3>2EyQAm%N=C(YkOsYC(_@nyw_crN
z=fLN?yZ__eH>+$q|1@}cTie#i%mV3nc2%N??drBl*@uN0w`zOx&xa?Uk-t*?<>jKs
z7q<MCxX-fT*yQL1kFVXm&eG?6`CW3&;)7Do_Y$_=UZ7{j=j+T_V|`dE+_ABjQ%bhw
z*uuo`hWj#;dY2Xiyq<GIRI<J8?(rXdy{6|DF-bm7>Ei0~yeoV9XXgZWxww}Zk0x(X
zNL^a8ud2<@{jm1Jk^}|G#D3c?9a%|}6($zfuBusUFx4(2w%;vWzAfODL&~l8p7;5Y
zsoGmU_bi&aG%LW?Co28&Nu~gM!Ea9ve_GlZ<f8sC%l_;$+Z(<f(Yp$~J}2M0!fkqy
z@527zc#n<O<ib2Y$~tBHH0C;OZ57G>uuz!U#PNKV@ufT`DP>+ellWO1*k4rNT0UW0
ziTBiJ?5~@hxmT)ncvUNeWrb&RXXgBB<G+7$>#>j!;h^>16OO%jZTluFbJ4slix=N9
z*|vCsQm?Q{{Hz1+F5V%(FMrcqq8ppL^rvAhb8CKU^vnfEG_(0qOmnuTni$ryx4z#I
z{di^2jRl9qVqJu{==1Fi`mt}H>AJ2*oL^fnO}cR8gRaQF)`H%(o4lB_n9GDOOnZ0u
z(ia6&<0yxZy4|ZkE6Y@0-FNhtP}Z%~miIj|$yzJsE-F+PbajtUxbDUOQ6<t<bR}o8
zyQJwGlSA99)_oK`xm+WOzfAbjG`)*Q|8#6Sm)07>Z>QR*&YgM5)x-6B#%8Bg?Q<s`
zSkIYx$<f2LKWnqos?Lfg2cb(#Hc$9<<B>wfK9fLyfm2RhH=6IZY*{*cyNUg>xo$ti
z9$e)Vs(e4y?!hmktXt_V?@i(!pPZb!<<PXYj#*`r4}Z_RzT;D|;9C7D(^{<BY~6lb
zduh6@$;l~DdV<yhHmyj{$!%A!ztCOBxoXG%4Y$_+^)O6t`adz_%Dj(!8&YpgY{~x=
zm)gCXfA!pZp*bJVe||bk^6ghW-|nD=OXJs{<xYyy_{x!<XQk;UAhMS`Os}M)FmvB7
z8<(l7e|9=+R%mPtDf7tKza*>6`}5VWido$)VJTA<bqTpYTyXD0oVniF@bLBvcPpms
z>K5`3y!ndp{A4S=v*FV_R_KduGvQl$Wbu)R7?Y_AcP2K0jJ0Ud^Pi$MNyy*x=B`Dh
z8>JpystK=@x+3Y+mOoJ|bQ(`*_nR%2ZoicjK@u<bT}tf<+8va1X5z1cD-p`ami~No
zNqQES?ZPP{(<-!1|K0L_U)v6o_}B{P;P0waW*ruCzM7|W_M&1g$f_T0df`<8N?KXb
z-F>QOV@!`P{rT#V^wzcQcPnQFC}~75+VajOBxct7b^8{coGG_NAk^W$qNTCG^k)n^
zBswZSUVW-qV!m0-hSSyh%bMlk+n1!p$I3bd_gZZeGvai;{B=)h#B`9Dypynm^)@jB
zPS@pM7uiQH2Z_l!6~DIJCT79e>Kj(#_<G)zH><l{G7fnhzviUA(BSN+w(Pr;X4RI~
za^x=C^1xGruXEA**>ypi-z)OlIvM)t)(CM`8|TZWE3CZv{bHNREMwgsA+{jXGgkQ_
z6>IbkEL?kiYk-$TSk=Rq>ZZS6eUiQ<6~H~W<xtzS+iy!fv%Xzbwb*j=60>MxgyV^`
zIa?J{N;&y#WnNm$T5w3xBbM1$#q{?pDVbesUN&}bxYV(&f623{9hXIWcv$BAdL<;d
z>-WuzOj;A=rzqTf%{J+(s8Y$)m5W&emF%ZD6h$YbDSL!X@3_EvvQNyR^G^iZNnOL4
zx(bo83QpDUGZUwr@K2f0le&sgW%X*87mqyMxfi=M>Ncj7WEk*Fy82ad%gjrMGy)%-
zP}rHebCyF<!mZ{v7EuzaTrr#~+jWK6RM?lrp6FZ58ocPh>V}l{+#X@q?_aq3dYzbG
z=cV6jDMc>A9%0k(U%1+^PRyp0X+PVf*+$Ayj+=I|wVOp(El?`SR@m9OR&2r=y+aE-
zRbqVu1WzjLO#S@OVbd<2cD?MX2Tnh@?kPqZGfc8&P+{hj-?uBE<y+k~CasMbMkgFU
zd5JNKDzAR+lJPo7w?(MiuZ>B0d%By6Q%dPVj@XVjSqCRal<4~?7G(#ya65%f@4RrY
zB8ov(>{?{kgpW3+3@N2+IbwBQW<8u7F(ZRXL0G6bp=QlGp@pX>FK6{nDs)=%V@K)6
zSq};`?zF$jTsS#GVlI>1c6}i>S@&bHC+3OSb+$g7x$v=6c1XdRbq5!&zF@0cBgCE>
zdFI;P>n*)kznYhn&R^c@m6Yf#eq)EF@<vgq)u;0_ikGshHbt}@I~%iAA-VJ^ukVi+
znNFPR9geNF=4bCwzI-p)pFfD>{{d^6bhd(x{11{8&R+@-zklK0nWzscXA4iyIbLX<
zutsn1!nN*OCwM+OI_dKcUHOfIlB>J(UMMBUbI(xOr)%9G9V8gNpfKl7<(urr$w$gl
zo*PbE$(AD{T`u=K>V?Y3*prn#=Q>&sZrrt@(=0gZgUUzSo0WGq#rVF6h`s6}?(!?@
zhswv=la+V2`AAf((aTwMcBYt{=br_SZ2ERTNG=T&j@|n%d*Kw7y*W<TSTdMSY%F}f
zaeb?wko_9V{@GkiTa=#MuvqcotAp!Ir@5B>vu|WIo_ICMaF)ZR>nx(3Z*1~z)>!nc
zStqmjWYhvqy`-C!Jrh@-Yvl`bFba9DV3_xjRb|1WrNU2c%?odOvP9a$ucx}7S;$4R
z@{{U>J7N3_1XWgNAA8aCq=6;CYnqd!%JwNt8H^`i%`&`I-QN=EwM<D;C3$8R!^u~h
z40lx+DI`vrv^j$5<cls51COxjJr~ouK#GJURkrJd3w!wW?4H0Z<fduyDHoiinN--f
z70MSmG-;})`?0F1%Q_S-Sa)*q+UuScOH;HaI2N5|%V9X#xJ#jb9UG75hb2!=tZjU<
ztjQ)<!7@Pn$;C8p{t%WjUKR6=S9vBemm13Xsz_!vbvdw|)Sb=GI*IxA7G=vT%;Nj>
zn^SsXO7%>(FimQ-a&FwE)(=kCeY2mxS}U?%G3kjz>;(7l>1|OQM?ZFj?EThc<11hp
zF#XZR))NcGYzp@n1+U*K=5Or8C-XS(NdWf(i@2F9+Mj#!PGCO1L)`MpA@#oSCoctG
zIX3>V2$*hq>6s_@Jd3!Q%dYQ=;Qe3`AZ~Jrb>c)ZtHM1>-s@{88oan+_|B<s%ZJX#
zo}N{v*H%2ZVffAw%%5&qwRZP<PHF37vL_~rX%+7A>WV8?+!L0Ovqx&0@JmO|{gW16
zKNHGr<Tm}V(|a3VjX<>*Ti@Bp7#y2+^ic6KcFjLV_WbI>bF2Eow0EcKx;I|RW89V@
z?D#z6?#CT*k@dwDS6BW^Ygl)?MLb|Fx7_WrC%<NkZVRi(TD@QLLATk$aIe>0$G6?x
z^DnJ-q12VWP5;sw^zO8zYG2!RuW;|CwL)3UWt05bC;2Zp;?uBBw`JP-2yL#T#dDnO
z*5|d)eIgtk%Ar4hW7wb0x8YHaAvYGCUfyo{<%4vjHp9_x-C+WtHitid=JSU)FLgP6
zoU>^$#60my{tA0-4~U5?omd{G(fwk5(5dw0%hDTvK60vJjemP&C1=L;W$BFjHVIU%
z-Lj!??v6<<W%*TN39Gpu{=9U^dQpC$<|11Y+tnvlu%FbJ5Gy`oeeL3Kw`<e0&TQWn
zo+}vm`D*?btrJ#pPkD0RMcvU__~McIi@9sUoz1?!;^0)>k{!;y;^Qy#s;McieEw<+
zR`6ELH+{x@f5-QZkY!;$GZmV|lhSAJj_Q<s_V?!UhZU1z1E(&%5kBv(`OoDuc8Z!G
zs<7L%&h3r)XT|xCT0fnPd(pW4#O9Z8-<BlV{(boS*R-hE=lVU3x3rR{Nk$jh$EWn)
z=f3{xjdn}Z<l1jj=bCK4wt05u%0oUE`|>&iFU>PuQ(0)2xw}d`(_U8B?X*~+-+Y-g
zzimHXlv&K~RhNIQ_tWg$#((7{*Lx-vw^cy~&-dl5Ue#kCn*Hkni^07#Ka<O=yWbTC
zet7ZZ=MU|5Vs~;2xu5>1ds%X-d&}=KeZd0FJG<6yn5+M?rTXaI{MGUtdw!d4jlR&k
z)9cdTM_uCnzfOtfzrLdU-tMC84zFL$f7GTwh@6sN<U6r1Z&T<bIWh5VYlHV!C1!hd
zTD^D{uKF;r&hWO~^H<%G$vhYM^VRkA6S8$4=q32R^k}cEuufg&_j+CA-VD>F88W|a
zz77kzHap);M10k;70c(Z%6k~L=!NIYM<uK_8Sf=8<wj;r+7Wkrwo$UN|1Po99pA0v
zJ7+erZTY>v=g)xycf)T#b8NS}Y`!l#X8rcOxyxRc2FqNyIP=Dz_XRRrViwO%YAU%u
zBX@CuY<cfY$;UIMSO417I#YIYk?Phs>thR>gUnCy&iwXziyW_Hd!OgsO;hq-_eQRt
z*5lp2G%wOn+`l@18HgPhC^5Z&`*yqT<4cJv!>{eno%`oskK}Yd@4bu8<o;grJ^##(
zl9X4TS97v;)?A-a`0|0%k;MInT|2&{pV?93^N@9u;bj@NOPdWJU+Ta1iK%aqX0>6O
z$3j<0Aup>o(V4R<qj&<n_N4RgI>s;A%)TUHVNcC*hXnz*pB;Q9ZDsKJl-1F-(doR$
zdc4^);vxf?mK$DAI1|vcc~kC_b;<_X#%VE^i{4+{m>H;2X<C)O_gas8`_fd?6qgr)
z{m**b-IwlDpKWaQ_H)l$Nh_nTwKwNo%$t1O>aWM*1B;!5?I-X^tu3oK*0DS}*nWzx
zRMG9-VW&1uzf)51%6*dO;`{f`NwAkRygDvA+ih|0T*F#VcF7>at>1bt&kuck@u2J0
zRR!K}a?Ypq`rD^4yPIWS;My#|yG>})+{Q%<vMsi)+`0T{T>6#k!pbI(*7+*3MolPn
z+dqeCp=`q4ZS@m)ew0iR+p#J0@<RWGnqn_9bU&orUKVZd<Q#M1(5=mLMb@h>vE7_!
z^SEnzUr6(xRcWf9D)%1i^>1I{SQvU)ZtLB}xsNY@%nXRTx`i$6d)BQVB`s1@!c8k~
zRd3Fzv2x(;UM=Ocp<ceN*Z=tP#LCdiRzLsVG_{kR*LF127ZhjLSV|hCyuwXQ#ja&v
zWhto<oEC1ncK0&-#cB%{cWo#Ny*wxP%4T2T3;owNEj4ou{+4{{Lh}4SM$9q#)n~7q
zxg2!W=+Rxr>n5hb9~!1jo;LBl<O%oe+cpuk&g^L*>vol1OE||;(jYc1+|;7?=6+M>
zQ;cV}O}wA~FFtJc$K0sd7c2hp+@1We`$a+E<eIA2ca~c^e^2_MWM#9~cAwK9tGAN7
zZob(aq&&~+?Q7GF7wmK2d-0ZkIPyL1;st-}`?}Jvx4fTIXPkK=9VAf_wS2$*?6!4r
zwcB&1T(*1rSK9PTN&5Y%(vPlGM63^;Jb_uTMlfa0)h~H>E&k3l<@~wrK)LeGH7kYo
z=j~QoD8DIh>D6TJpMRyy81L4LPA&8Oz3t`I4V*9btzMCIeTz@+`8HpN@_5(QSZB)>
zRYo~NRxZU$%iPyir}Iwpb!yLwi<}{}(zMz<muZ)^p_Z=n9D#D<+@9xGR7z%OZI9k{
z-N5AdGUY2?@k^_FoQrd;97M~1yD~5R&Ery>W90$jEMHRH58`<F?*5pjJMo>V$k~lA
z4MJly#rO8V(-k|r@ufxRmfTabW$xA+%u2qzaaBJ5lRUTY61~rEl<ZLqP0PP;Z5zh3
z;iX0LQu~Xx#}-?f{oQdk=0mFTBDG(?O^cj<<)(^Eb@O|D?B&%HoG-6W4U91?nzeji
zy0ZF`_$W8e#3urMtM{#9vnbi1wvM-}F7&&6-!qGn3)9SMoIh=lGge=6U*UMFV9Fec
za^vEj^xGDEvKxLCW<Ia@p7q?KWW_7>Npm0HT|D>kg~qIe(`9|-^UM02kFRP}zHJ%t
z>i6bi8LKefn3Lx+Z`=I6WyvSInr&Xr^DR0K{Sa09H!X98_xG*JDA^&!B5Hknx4ZT6
zrOJH@Q{K**w)gVlxsNY3x(Qr;BlBMFt<3bgJ8Xq#&t)#!pKjeQmnl-cY3}7sg}=5I
zzi@Qh7{9rA*0O#1*6no@#n>m!ZMIwYYg2KIRRp)t&2yPIZC-CEj<L$%&b@i=V8*$B
zZ)JXMO_MoQ#^=<t`=;fw&v`P_`63Sgu}lA0TDU%~&)a=fV&UA)PJg1-%1q}AKK#jS
zx!><uy)x7JLJog2V)w79H|z60zA~|J`sIDazf22ltbBM+uby-5<@<|=KEBW})yXTm
zwY-*>t<U}V%84ZtgC8fJ{nqR5E)`hWe|cBoFP%R=$HfDmN-cN#b8D@1f87bUsnK)N
zK2@9Ly|@@u7^$<i^!k_V+ZUKiCV8#h@~rdy%`KfTuBUqjYV{U)eNDYtQBor|)!bsO
zb-HX@ulw=Lz{<wv;F)`Gn+pC_GuF&rx=>}u?8wKnukR@7kn+54{&DXuQ#skWZlAvT
z*7Uda`m--DeELgmpa1D&%bBn2D5`B<y3hXdvE|BFBKGYAN0OPH?4n~+U(cS#`r_h_
zk1r)mr>)PwrB=s#t=Iqf%EGU|)b_c5KDPXD?~bC{%bUupw&d4Xo#}Xe-Tb4il!e{j
z9lfuwoBMwGp8e3}OTfw{I<v3sE37gtRH`cQ3tBnrn$g$V+ZJC|Z(gD?%gu7#FQcLw
ztB7vx>*l(%(`Cc_9N2R`pZ;Q7Z28-~_=WgP&qz~V^<#J6%sH^*5$}rz(}|Y~Csl7P
zX0i(LeNr;#iQL;c4SXS!y{!C-=9l?79AD+BD$DL&TMuS;&gr|nt@0O0b(pW#OAB4@
z3ybFpU)Y$XwEXcF-#=1s<}}2`UtYKDvC8+1=PX|)MU<(^E>C^`CF6O^m!^m^TUqs;
z?$+u{!jEiv{nEns%lDk;6P%aU+@AP$&a~dk>*qT2o%@)(J?*)PZ|(guzMo=ex7(gP
z=O`aud(%>JZ`br#&*PalZL%{Td%m|#3BOcmFl%$Yb$iXqm$&!jJXbifWA<F(S>b!W
zl-ZZn%{Ts4Ted#U&tv_meDUj++DF!3J;nJ__2*n@s+%(*uK&KKe({GR-_swrl+1Z0
zQf~RydU?FC`jW#T%lDkhocm8scTPuN(A-CA%WH34Pk7)`GUt_txTUGwwVeAdB}*Po
z`EIdRdb#^&wMCD)mlyR0E7rZe=IdggGWV3OpYhMXQs#!15vR7Fj$&TBds+BxH8u7Z
zKgyO~ark`Xd(N#RPhK0}*VEz^@LRc0XLd*5`8l81mX|(Xb9h7N3yZV5`UM4Ao6C2r
zsohWc<rkU8pn8xu?d-Kv;@^D#oje|CYRe*f?P|y0Ji8|=5*F5M6YolBe)oI#(SMIl
zS5*EyDb;<>K0S42&bBF&AHIE2A@EUw#qRa7z6D;USIc#)6P_)*ePH9xsdoDkDvqp+
zteRk!VwSk=7lX55m!i##l_HU<1|mgmZ9b)I3bvdQFc-Nhqq;-&(DY*duNGaF?%wOp
zyw+J;r1HjH)%(x8n{U>2e~Iw2@Q&Y6l#}imF*R$N%oDA|wd=haeQmsB78*GweN#xf
zUuYbBc4GFd#V-BI?Zsajqr2aBtK|5bddp2xT{81o*sDOHh$2gG<1{xVu}<lwyo;X9
zPCI!q`Q&4ryIi|3<uSI*oVx0nron2tJ6<2XnEdO`UFJ2u^Tw@vmjUC|nAT-GKb7n#
zid}fTefsH-&v*4jwC;PPY3ki}u{rzoLU#8B?f#2rYZuyWT_aN6Gg~EVU4cN;fvI9G
z1+j%zXC+_#wb~nPW?VYUc4^uvgRX*HU6F@XWv8wrU0e6d&$v49Xh_cE0+xB|z7m3*
zox7sftgz#F?Rkt_@}Ttr8HMvEfAX#}%Qenb{89B;TB)f&_fBV<+lO^)+pU?@-9Ko{
zTokCuQ9f_{#jf;Ag8Ktej(uC51C5*db1%2gT+D9GwBO;wTOCuSA2;0O(jxY}wyIj8
z%u&SBf1})&!*1I|cFB3lx<?Y(6B{4g7GEiN@VMDGiNl9t-T4by0{b2ac3<gukj$RR
z^EmR-=LnX<&Ih-pQno1kxZxOexZ>-A=bJf%BoCUKOJ=!#*x0<K<6}(bLtg#E(oD0r
zmt|+WeAt*QWouFOLUD^W$G+61Q35q@6nc|v!lMKZdB>(%Hsz<S;yrl0FH_`U)<TZ+
zenl+z*ZqnT+|ztmuwtG`VoS8bk8i@OgqzA6Egj}%zPS796=T23_k-7~_XG&;={7li
zf#crQ!?K<ao8upLbUcV%Q!ajXqTCw~FZr5m<#}Q(?`PSaiLt#gaf;oKvT3sf_jH%O
zPx`oSb*q)k?hgl*zr`vym2bQkYvLZ&ad@M*e9dnqQ{@Wr>Yl`h>sGf~fYpetlsvfG
zBU$47B(XaMIVaigU;Dd|_u%ejvAgGq-70v~#lLT7r=N9Gx$o{WTird1tNNaC?Axjy
zY1~xqyO`ad+t#A&D*OFSLAf0FjBA|VR7D9K>Q<IKXl{J9>w)cMjYF561mk3$bL@-#
zx>c!yzg_u*P3EDFOYHaSoJyTO$QiIN)7P=Jeem$P-H)p8LRwAVC!|SA9jva}aah0R
zgSL#I;GXuc?-p5JYL=~g*_@wic)96;?c?^Da&JC(%hy<YpXIoBcvtzxitE>%W$PX`
zyT94(#_~RS@9vDgEduS2r`!Gb=9=a9!44eT@%)89TKVNRdYt9Bcl?;u!pKWa(tY|r
zAKd;WwMDVw{+8_P*PW#M;y)fV-`<|-{$XF{^>yo8&0QSd$sF8Xc00@M!@kTf4_+^9
zU+}6qKXRoR%lp~;6u)g%Xjx$&r}QIjS(M<Od@0u-Q5sHDRQv^NcE8GY{a|O5B6W7M
zT8~EUhqvle#G34@Gow$h{5tDzsJEPky0SrSv1Ep#!1c2W_w1ds&GqHnO}f_eYR+8x
zSrN4;YbEn#zxxi{y)64mnj@11mfL>JervL3Yvxhu3`WW8rKh&$?LM!%W@{#^Oh)1?
zgRK=^Tg$3qvbQI$_1%4vN!R4buDqSsa_8CqiE3YVH?>hrt834aP1o}Jv)`_~Ze`M2
z!@M^l{JQq_UA)Rd*KV0G@oj0CT2SSg{r2mQYjuaCX75|hu|;6!>t9c!em}c*YfHEK
zg+pnb&qJ==dSAGf`D>K>vW<}|I?py0tz}NmmYsPlO_6hUrDplMw_zJ2FFcNF=grQQ
zn%z3<hK|m4E0gWlmTipmIF$A?$~sSUc5CgLt(UWkT|p+apS=_yGVf5rrDt8f$(sYX
zXS42mvazUY)6O|zv$f57&pPSmJiA%8^V+kVbvI1RxVLVIoDp|YB>Qgn*{54>#VqUQ
z-my^3>~qfYnCxOR@lBT)8m)D6#FkFqcQopIQnBS)GjX&3vbNF_(@Hi)uiI)ln|n5Q
z|8u|7`D*W;F5UX>=(D1zT)oFXZ%zc6u^wc`^p7@gJx=FOtH?`TTfGtF3hvqFJ@a|@
z&QQIrfBn{svr`p>J2>x5+z^>r9J(=5-)#Ejv|`m`!JW#!Ibu_?bI&~UnoxO^<(<ck
zHCuMBy0J!l_UYWsJB4z#Y1f&3*$^r6+*6$`cOA>@pIy)Wz@FtVuimutj@fK&!+E`u
zuM;<GXo78#IDe{V>xRe|>{G$cyq&X-WwvU^d|ulevD;6hq&M#rO4+3V_UunTuuCCE
zSV&|an`{kLAg0)8t-F6_hs?BVyI}6flLouv%`~u6H&o_Tyxa08t@C*(T*>2|;Tz@5
zy7v~XJ$p0eSn-A=Av5jVby{Yxk3K7k&ehBD6R0v1vdt0u{WNO!=A9ExI<mam^3Ftd
zd)L{jjXU>*%|2Z*D_~LU**_aRgpD$b6^q+A?qnuzR+#YTVVu9&^y^v0iN=v1HZN>F
z`{#n@^;>h!ww}#8SiHRTtdsqkHKqDs6_V$-Tv&bKO?w_F-t`_!idP+-rF?%aOghn+
z;lt*I(-{S-AWm4xzyk7w($>JJ*Ks*|>#sgDn#=v*<<#zP&ilb}`Z9*We|=HOqo3fw
z{1la|cX=nnytuQO_B^Mynxz-dJjePWW9xG6*{4@0ZALa>?YF}lU?%j3?b`*4QlG=m
zCRG@%TfIdfY{I-<^Igmy9({ZFy}0=2m${u*;XkS@Bm189sIJb~`1RJVdFOV{<j|Ru
zDDm>;)XjXC7tIt^Yu~<(Z}RG=tAsD#<enF|^OeThP0`7hE+-akT@)`QW$*JPAtdTh
zR9ex;(uIc~XPup_Vp6;0h3HnlOCg7DIUTd|`Nc4~?czRn?c&%uv;VESH*q(E@C+UX
zHQwgB{;(grEDZLD?p5B-qWmGEM1SA*c?tLX?fTS(>*D;^uf6?nMy<tODNXtJtt)g3
z&Q<U(K3epnP~{odD^51OD@X6P{`tM7enrJ?S4Q(&<!vet*T*yecB;y~r|9?b;{%tE
zjS5Q}BeK)Ek4-qgZ2NYeP}{!`t4#|+RJG>pwXyv1@aAgy)tfe5wo`nvZK4vNo@`dd
zrrqj}DxtF)7rgy)^k(<xP8Yc*v!Y-R!R?_uswbM4TitD4bhYAI^v4g8x7^LMm$Cco
z)yj9+Q2y=F)yUL$f^UANd~?aqyw_h-VH!QRj&+^jmyf4HM41G?u$KI~v*)>m#{#Cw
z989hYR~p~?$MKS-$~C=kf)nc^0g<j<fi7IiR;_gx?PQh&FtT6r{qgDlz6E+kKFbYG
z+-`1W(dsL5T(IJm%bY_kehCp<7}zy)f)+0F5H94BExMiHza>X(?><GY(6gMZt(j+4
zJKcC%OLX;j8Kv*t<0vIM?_`r(ob$>BLe9!NOING^Ixp6{-cd_5th!9a@PgZ&UcT7O
z&$pyrMi_MZ9`DjHa#o$VZhP$Z7p^grR#;gYpQ(<@UaC`gWr1sO`kA8@Zc_}C*FIZS
ze1C!O=PF;(sK6;wueXLR-RijUlabF>OV>+TOIoGa($?loKYX*MWYgCtMMuo9oSgjh
z!{M_Uzu)=aH%@+<R`@3R&G$c>wX-V@C*1s~P+OHyD;ckAFUx=D!F~3gqqkq)O)4?{
zdr0m<j;zkK_<T2Z`DLG1U;I;1ea0;|PhOP&-q{1kZ!AeazmZ-4vghuZab0Dnj^EZT
zKD6%`Yl7vRdKuk*cJb3Ma~fu!J$TZ8@%`4bAD$FcZY_)RpBH0%=k)SwD|@*=s@s14
zXH!2n+4<k^-wQL(etv)N_LIpHU$;npHFDcK>7uh<Si94+8~11Om~kgxQS0g3zs~ZP
ziQL)t&!_$4Z!cT&OTqf_r}={3b^LGM#4naSB_})QPic*DlubZc-p4n0(%$Tu7kAe-
zrcJD(O-#~xruD-{qb)~_x15o%lGm%NUhyWzpM%Ndr0R=2rFF*g62YgRzWMm@;dK3Y
zKD#?-XIkx(^jpWLw|sm1{8+#550_s&`$lQkhn$1Q%6)Bw<Bxt(`R)2TapR6T{psG_
zd*3|1`$4&R#sBmll@)4rmJxMxH^%EoZnFF{^{-j&6u}>7|NXmGYIgrxOKpu|a{S$!
zTmKzD#gO&7vNq*!;J!yyHt`Ja1^8>_&gq&Rs;MxX7vsM+`SssxzYpF_Sbul#PV)fU
z(n907zEAFpFC?G$ZJVrF{q51G%N5h=AN^wd?GnbeS>tbuwV%G8-ht`-bvF+ON<7ef
zawg{9E%BOJV)5$JkE-wMI&h`>*34rP{>dAxx>H-6WUh0T&iS(WviSP>``&sjfBfKO
zPvQBW+p@BZ&*!GkinTe*S^e(i=k41Mb55RE`LFu^w-A$O_imqasmf4Nj&^)<>e6!;
zF}XYELLRl+7A0uOJ}nZD1MyhxibRVgHO*6>oqX$)(xHASSYTy{SF8DU<Eeu4yy6{G
zS1d9re^I6;wBBYh$I2-(q8FF;Z#TZlIq!{w;r7m;8T0II>$94?t{)4Q)LIcT@7*Tj
zUB(N4EY@5l?|Z;>o496a-NQNWe2o63bWLgtzW;H`s{J2=%9n}OI~*-jUi->6yC-Z<
zUhhV(g@Q|C?($h*?zz5&>G9dTnDhH2>V6dz?woT!<j&cwO5u#7EE_9&rPT#CKH97j
zB*&|nWay|FcT%m4d8wDpghgV^Q>rRlXIt=2(F$#J&{N|$s(tH7?wys}qVkt=9Anv9
zAv?Q5_lnk2F9k{ABaf!$2uV2^shv1Bo3(TOon0GOtC+ePt7#ma&E|PwkMu0{umw`W
zERXv)EvcLGa)Fev%47dcD%S2&3%WU*J}eKNWFqk8oQR`cRP!;jurs$mbl#qsu|=u3
z_3Ij@hP*W<(Zv;)=7w#N>utU6;=4NNsW`_{>x~(2C2#wNHArhe3}Fn~CEOjhVB_T!
zwjG6=+mCXr&A2Pcy?@!PYh^Po&5hV{t*6yF*mupPeWwDw%A+oFnTqYRa5h+KeK#Xn
zp{!vy*UEQ$ZgtL7o_g*GTSm2lSYD**MvVoR=EnV5`0NV5sqd0YbJPCJd}cB)^U#G%
zH^aM~N9D8p9xt4xk^XJ2Wzxr8*N?91aO)_x-2K|eIF9wXoSJEmp(B6X*=P3_v#m&K
zQrPpaWcGwwE_WUQkw>LVZnwN)ePZCqAIJXe-8{C4#3qG3O{ec#WxYsflH0>4?8hp6
z;vmb-ijH}|XG>jZ<ZSw2VDnwmRGC58<YDN(@bI5j3<p?FR`lx27_L$_-7A}E@!$7C
zmp$(uwKb1+dj0-AS2Id^kDN&Ro%WX{mh<mD+g~z8?aWF6g}6ftjXNvOYV_H@V_q}y
zrPkZrjgI&K)a11V?Kvm%T+u0=jdxM$w`)9CE2c`C&9zyc<S(_5L;uaAi>GfNy_$dM
z`|de$I?oOlRlDW>F0QyO>EK>bDBiENvh-@9<5M$JM*}&TE_cJ*TQpz2TPwIK*`}#y
zwm|eYU*CWh@$y3UE19#a=B_;2U3p0(<V5bRxd}E!UK0d+8ZUXy$-n$A<nhMP$D(c<
zeRl`9h<$hY!Em}Y{tl0Qf5pxTNsFtz-h1u}6pt5=J?VR)Xr4u)^iD5#myN-`0X@e8
zI-7ZtIHef4Z?916a9h0UNaiPjCBLt*IA#?3+w5O$)@vQyE%x~c_pBAJS(o3jEH(^%
zq?m8S{PbwRI^W&Fy~n~juRn><-jW&KRU@tchG}>Ct!19+Ss#PsOt?ggW|yf;^sb!5
z@UoXrO2dD9X8Ed%H?%ls{keG5?5&?*+?~a0_7S^8-S?OGe);mT(%3W4&HTNYu*t)T
zfh}JO*|HWsn|+qyBA=YRtK;i9V@H9wl!Z55gzR0TWU5}=3}0CO|CMXH)5jn#R=4z)
zbru^_o#OwcDDa;vpYp8djU3N{>|@4#jrZ^9s(#N|!1nf!)wzbl$I7SVHEA6@z{J4v
zyH6;hgWFnIWVhG<=&4Bz&l-c*n3!DBwpCWKwwT0tmfv^N?Me4iTT;Z`jS9>fRJ8Rc
z9ND@+u*+8F=z)`r@3>WuzC5~6aMD!w;MSBEY+`d#mL89c(Un>l(RpW;2y=k+l8Bcz
zXWohSURYz&waSD!OlOOsQz^@WmEFSkL#?D&sW6){?U+7Qdhw3gCQhdBK6KAYxbSLn
zmd?*#&;Oe^n}6atk~=|!+2l^}EQOngWt%R{wc6q+mGt(^#GXs%6-De<F!t_>7y9w)
zK?m2t0G@?>CPt2iUe@gaF7w1pj2w-;EZaQ}+~Mo>na~q-PEpKgyQ8wO$YPP=j*x=4
z7f!I8)R-%y6j-NiV&t%~Kj@^Q)RXN_%EBg#c_s^RKEJhaBIl&QHqQ<dpMVP|Sg!6k
zyxwq6_SchQ87WP9Pb52z{9X$(Vu!OpX2@1&Wnq=YUy50tvSvCiUMGHeU;m|Zf>UIc
zu=iR8%PiPZ%#wOH!)ft5mBmwvTUgFWWL%k>GNq_*!-So(Ql-l!md;RK(sbAXBwte0
z;_{Ot<I3EmDPDaS6yzCucU|r=@=;Qm1Ci&M%#k@mVPRnTs>1g8<Y`A=O<sFph4tMN
z#sZz+1uv{HKKbgx(^qVcadQ<G1eQ+<{AJm;>F>)6E2?#-$S;~w%%l1%TR~ZvWpPO{
zkLrcj44}|3DeiGOy>`b5mZKU+Ws)BjaqAd48hEK6_qcnltIH>#=h87lq5In#m6%!F
zHDYBJU#yi@GjcRKrO>(YAaCvjkhW?Sw_C~*E-6hJcP3t+v2)L_6k`P=N3%~)oSXib
z*`zcj-MQGlS1+^KSxv+3<x`ebd`q8dypkziea>l>P*2F|w|$Gwi5%D1JLgBl)Qj&l
zUile$>8pG6^c0Ges!J}NA*|z*S1tkyrK!S8st#Lp?V8+k=>(_HEoB+kyP9s9Pgr>0
z3id5}XR`RrL>B4m4Fw==sr@P*)hsVHUiq26`_OzRn%94uRoAY|y*A7fJ>(y1yz(h(
zvSFFHU6sQ<uzZsA*W!!Da;yHWV(qnhUa8W1Yp2SMfG1lyyQH@kdv08LB3oF+T<iIy
zl;DZi)jaY-&Z(YkQ(EsEaA(B~?=D~0xY-Ij1J%V<lmqRUq)L}sY>*Bu^4z%bM7FSr
zxs;mf*=0)WeJ9+>m@!2~x@V7>qv^X3**fJrf2C-fyz(>u#A6~_ncI|dN3mnCz9TpV
zeA&#rwQzy+;&+*yjlDtV_^zCBWR{dvxZ(IRjXi7f0_Gl2oSfkk(%t?@36z*OH@BYF
z-Ee~CpvK%c3Z>E7TA(Z-ZS7HWpRLPBpy$$2KB>Fg6P1Kj7V`+POP{~M*69<_v&mg%
ziEWdki(1Dq*~;Flufyl(u(_z6aGO`tc4#ecz@0h0v3~OxW@HPCESCAHR}!(j-&Q`>
zZ@t@|cB!T}!Opf!%rWaW@QUudsPX62>5>@=QcursUl?VsaPjO`E?<G3qG!7&Fsw3j
zf3d>*x@6Wd@dri`2hSZ6-LyWh{p!k$8<+1^e_`376DED>(yZ!REEiYY4wLTcy>#QU
z8i(86tyKY~Qcs_8Ov(6iC4hN3!}K#;VzO%{zYQ`gy`D3VVfv*k=dJ8t%S+2w1(r9N
zh13M(N0%>`D3#|ByBLx$aOBuK9}B(Lm)cjQhjZ+ob9bSj$M>ekjC!AiO!!T|Z{=JR
zn89x%Xu54HXH%fX`Sw-&SDU$OGZ{LTnKd?F-IQ81Rd?Gewo^H#B_it{c^%l!w070z
zO`?y#O#XN@sU*34nb^`5IntUIt5-(`Snt_2t6W{2RV{agj)Kd(tSPRJ?~3f^=vZCu
z<__Dia8l!gFY9)6b64#@bNqB*c~v2U(6MBOz1nVdJ1dX>&uxgAa%+3yZKfN1uU`Hw
zFpt;SeYyM6k8RB?MyuDoZMt`}CaWQ4PAvb_ES8h82lZKZZh!Rg9n0gKsud~99v@ES
z2DLtz{qkx4UC(2YUjvSpP7Qs(ep`di)(=mM{@iSM@Q}}vz5K+^&RGvYW5o-5c3<wX
zdKL3xRp85*&sSQ`yB}V?{<1Z5P>0p$m=~u4J<C_vEq}iF=o;;_g~cu&mG2Z6uHBp@
zHC_5w-o@C$BWE4CSoa1@V3OTZsv9n5-mW&~ic<exu?yGc#>@$8E81M*5M5qX=qIEx
zBb<Fp>2mSqJqv}Rq!z5T-f1zJ`P7$djJbDT9=$0Ou$7hf!nK)qo;CDOidoWmh3nQX
z;hxQw3m)y5wP3CFNsH~KHG2-`z1~ujE1dD#&-C4d=2iYLo3_0(S=?vEZ}vmfSk|<0
zzQ~r+<<jNO4ATF)x_P5@yJWVME|;u)r?~dA*@bI!<K`r_MKN4-j1E6v)w7y6-&wc8
z#38!8s4z-0Yw2R<Te~iI7qhCi*?=5m`9Ifq-nMs77Jb>!%=<BeIrr{M*O&3^(swU1
z-P$#|J7_Q8mE#`VTT0a>Qj0ADxRre`T$`KnWUkJNhSlyxh3dEaZta@fYxPv-Nv#mq
z*3xB?;x><ua@555nKErFRhKD!RcXkSH|_g3-5qPKFP>O@e!}Lp)_X1P@*GXQR2Y3-
zE8kErg{`OS+JW4=Cy#2Ttq^PB%X{so@1<=WaBdQq=_l)4*(|kVt?|wsr`{)Q*a;T&
zVzj=&aZK#awYf1dcLYOv9Jsfas!ODoIfy!%6h@a%DhzZ_yggILRd(zB31!Qr%1<cf
zPYKwt*81#<#d>SgJLY7b;ms`H6_`Gc-?TjF(%mBGTXWN%>`Xs#^V-a~n4{&_Rqr@0
zpR0alWA5q9=hd+>7r!$^>Rjo*@=A|;je(=FSMd%##q-K<r(QI<Ja_KK9kZS&Zeo+n
zTDJRgPxqPv&X-}C-TljEzRR&w)J|3Qp0yxtm-X2lN6f^xc!e0R4Xb?VQ+}=TMAOX^
zCYe`!%9l%)itW<N@L!o0)%)x6%x~7gy*hGT-g>TQOVVc*s<y|9Z(#{FzMH_;HIvUO
zxK~^0v6PMA?#n$kg12q9Pn{X|_)^KT!{<UCUwWxHce(ZDyP3!4c6`u{y81s-=$^&p
zKE@+0tGlHYyqTD8+JE)n5jI)u=fc15fAE=-HQ&mX7~hpNe0XYG+X*h`6*J%Y8NYJ*
z@?f?1RiD+erZ0WU-F$W&nZpsehr#sn+{|OC{S_aUuFhI^HA{c)%X1x^(_Ms=y-$NZ
zcjCh$Gn?3%FP|+)W$xgd{(6E!cHly=uRpPVaNVA@OnPnMa_c0o38In<*9hGO+4RXJ
z=kVpJGxN3_oBOUq^Wap@5`}8-a!?Rj3o4(|E$2Q{yxVyhi@1fH!s?mKKQDc~z{_m%
zxM}v~lg|F7#^;K6Cof|We;}i@dhw!Vpx`w&Tqg1~gRv^F{KAw6i}I9Hu9{v6DPJyG
zu5paRL)W)d`BL%j#miX4o1~SqKP?1n2{v>~$jV$b+j;Kp!^>F2^=Bz`S3nF)Hgs#q
z%3LMAab7lqx#@A!X%XiiY`ifuEoY7_Q>b_FU5;-t%m-FlURuXe&DMVulrvrB&;6RX
zEQ)V_#=ae2c^;_6T#0RX)A!u;NMG7VIkgP8xm|T08vU1x3SUb$`0n7?C~&iY-SqO^
zOgGssyDQTpZ7=uUI&9o9tDw<Ga8sQ<I4N<j<-C3F$SEK5xI0yB4#Ijn)ZDJIx`9&#
zqgkeK`WJ|dfw0~IHOFao?q^HNXH8U3n!R|X(dAz8?eiE<T#-o#{<helLaA)IWTn!!
z*gIiqyDpx8BI)3BmeEZ0lrdOB`~};~%!X$LTkYy3^Ry0`>F2$#+rMLmf4=qnr#mhz
z5b*l{-s$IuZJ%#;aPxO9*d={e<9*GwmJ{y|S<Dxn_UWB(+hl>87lfW4RP?F5F4y2$
z920hP_VEo3W%(B;n;cJ@+WP-2S4Ohw-?j05+twZHe%L<y;?<3{TS_Z3-oBroV`~``
zbME+N)!)~bTmC*j$-ZDys%_*s|9Lv={pR)fpR?~3zn1f(@XL>r4}Uy4srdWtwA562
zyX43E?%_|}Z@xeOPVHK}yS&cvtufCxN^kfdz3y$*)8ck-!+SA2Wu-}}`seoj4_~Gp
z9=EHspx{TPiTr&Zd$~FpU%j^Zb}=<OqVI5tb^F`h>CK<k{=nqGe%l{0%U>DHX3O+j
zqyKpI)8&sFlW+gGvzWN-dH%}{*PfOf(nu&y)LkwXFZ=p%xS6kWHqww(!baBJc5*dQ
zdg=ZA{QGNu7JYb_cP_5pcutILj9)&#{q8@zZ^kE0Wmlgz^<Rc7`@Gr*G8-ag=0!wb
z<2!#os!y#(#Vp|0tJ{jn^}j6sx;?r1f49|v2TyL6Y?RSklYV&i!?(|0=09ewzx}S!
z=H|5zX@3ffY-aS^*F_oS+0PMKpTG3a<risXg0TipKl|_V`qd@uf8cCm`A5OG$nN;f
zH+51U7xuAxrj~`zOY{DmSoL-4|Fie&Hhs;nzhwV1B`(HSKeXEH`rTj2H{STa`2FVn
zguk3e&c}V*E_=&SV(0&7KjNP3YLvh6<~!eQzi;~^w^^E9t$%kzZEp0n{js$>%kpHy
zf8P0;BYS1d-}966=k2d7`}cjjeo*MAZ_nSy@2yGW{l?FKzw$gE|NQy(+v_aq|DO89
zpYwW7`qaMZk6)%#6j%Isw45<KCdO)BO;S5^c*0}V$#eHjS#BY%Gre<#MB3|<XDdF<
zHkH3C!+#DmX4vh&_+n8)r++{DOtol_`FHx(9drKn;c1P@tS3@N!41>9k2-i%pYp7V
zi1c}0vnP469RI)bA3lHZ`7^2aL+P=)%`$)Y+5DOM*Q$0}=H&cu-?!UsK5O!4hs``5
z`+j@A>6d>p`hToErIu8=Va~o;b&_Z2^NKH?dso@p#yT!$gS+nQ8@FyI-nW+UU+1=e
z|IT|i_s#wH{l~Mk9eaPD{kU&)cJ1%CVP8KV&9T}mcXoSu|HJb$m(Agwp1kbLw(_-)
zleud$tdi6BeiDs$lb<$!v%hLpe*1pE=RFT@7VMMQJ4dJ7E3SRBr1dhfoc55PpWmm=
zIoxwIf4}H|pZmo{IX^$$KCayTKhgj67M?uu#}^Z>|8g@>vOgO?ckk@_tsn2^d{{7X
zQiH9o+&-!E=iMHi)bD9|IlX!I%cm3G|6w*;IbZGY?LbT4|38kG`OWw`_h|hVx#-*N
zx368i_Vw<QN%g0rdZx+0n|AtT%E5aUJAZA;{_F1*Vs+=yvl;)V^?$l2^goH~=eue7
zvtGaaQ}*%Rzo!W$#*g+3{7<{~<;5h&hUs(Ix)t@li9Bw3xc1}Zqh}AE&G=OK^JT`L
z7lQKXHG4PjsI>o=y8YX;kGi*Sa(_E`FsZI`&s?rU|Ja{Dc>JU4cSd%}W{>Gi-%ZVb
z-;&R<$!0%%q~zH0w2$|0Eh?@#u(aR**SCLW&jr;kZW7sZu;0E&r2qd!Kej4~>1IBb
zrS%0n{(Nr9U(4xU!Sg91hub$l|MGmvN6`j1@^sVw?Eii3Y{{?Lrt_X`=zZU`&~$eH
zG;g*?YtOILNRzf|esXSN#DaXTgJ-rsdSNX6_(#<Vi&UY{?LY3GE!eo{LDsalIvYh#
z-8T~58zJNWE-&xK<)e20*B?EXk-zh}Si0RF3IBD=#hrY*-rDW7+4kMe=Uv{-_{V$W
zgQJRWmCZDYzjszW%*#bf@^QcT&L=X_@7EsueDQ0A65qnct?9gRhCBCcoOk|sPvpPu
zwFl1|+xaT72LJl|V119k>zpd{{W6{NkGe_ynG_U|wX*)-<^b)LZw&VCF}C{gDYNG1
z%O5xHifTQU{x<ve%d0<To&EIaws_4WzH@aIKd*o8zV3g%?#|u2sq1e}+NU;Ubt>ci
zs&CJhf4*$KzUzHtO_#)CKehS~Kh7?0Zr&a=r*HTCT>g)jH>Q4Ge@#5N=78GqTc@UF
zTkcPeUUtJcXZM`qmp0R;{4c*|Bzp6>Soo{S7w6a)h15KJzw(^^{sYJUx&__*^E>{h
z@t@z9UuQ4#Kfl~qEpcU8nnYgZ_5}Ce9ntF^pFG~&-0XPjq~Ff=qngLXDwYd){(F7&
z_oL4EeU@>XR(fn*x#xR#z5U8M)9YJ~K9704tUAh+W&U2(=of4G&n)`8cFx=UtjW6s
z*1UPLd8c|>=K6~Ba=*{XS#xsVO}YBK>0^BS&cA;bPucaU`TN)Oy2M*y8rL?zooae6
z><4%B${YhW1vTs2x2tcbpXrmnw`cCTx_KMt2T5Ps`gZS`dqsN_s?AfUt>&>~Sn!d%
zGgxj{_ildfHa2zn@;A0moogn=r7bV6ny{Jo-`S7X&P{K=x#SnuKkg5Og)3xY?)k8W
z-M*AQQ~Rra&*9U%TN!GPipZ>9rVzSmCP(gR4(sOSw@sI-?o(E4s!cTdm1H~je0zMk
z%xvLv{(k?m*R9xYu|MqOsZ&=xZ+m7`J04N?bA7f~@Do?h=O^+z>z~UDyUG2qb>nzt
z>Go*j(ez3ac8xWAAM(GHy_2-vu4d1idp^&PGcWr$ZLwpmjNN(lPx(5pJ-c+*ynOOW
z`0#I@Tj|Zy7wF!eu-pCX_l^0>4W6aM|9yUv;BlvC9v52f+L>7KaMIf!$<cpIq~l^c
z2hoA2e<Q!1Rhkn$Gv6C=;OW<yWk0^J-mm{vS?Kj`$)a?jdGm9Y_GML`oTz%bFM0W)
z$x^=i{{;nlUQ#<#_C}9gWBTQr;oBxozs&tjw)**LEx)N7?51<LeOokl!<^kAy50Jz
zi;c9_23hZ)ZnyG6^%m9IPcJ4m+@I;HUc2GFT(AF*j(6{i4?dp1<QU8Ri;uq?|HAIM
z?D9#kcKPRzw9m`bJ6qNMbbh05$NQ-DLDj=$8=Ic$7V=%&;F4&XVtxCTV3VQ9ev#QT
zKhLb~T)pp3?Cjqi?AOdDFMRo=tZKW2Vc-lI{vY~B9?p=8zTMyAlf&Kp`a#)_lt+~j
z8+Y@SXQ#ERvIzhB_tBnf^4Z7ne~*6)Y;D?o^VYHQtjF>9di3j!&8l`WT~l5bwR%3E
z-wzJ|W83A|@?ZXWHRGJ0h~JF`PS+o(lpfx^RA^6u`~DAyW%<`FpZxUS*AHbipTB-g
zvWR@6@AmoQ*NLii|6LiDAD3Td9)2^wV(!-CefGcS_MWkLdi(LkvX^Vm3pi}-UnPCH
zsZ8y5z@^IP8$R<D-g%lHtEKo&|NZgbeA8#RN!W@7xqQklcs%DD>+cM2H_hEsU!Lew
zRt$-sx$~@V+s_wiCzz#+x@!*EJ*m68SO4=vpFfMU3KM+RT$10Aef5ppvZ5pG_J%LY
zV(gCJ`;~cS!^ys2ofAJU8ZPc%%bt-~SZxqm_sH;{ZtL8gUJhyHpd(KgT1c0C6`kq3
z>sMpS;$>kOj=IMGe^_eud@6}Z<Ei!K?Gxo**Y^47`KLn9&c~lyZf<_RK9$Y)*P+^P
zb~hW<=Tv;!{QUBt$h=7+^V$x5-njKtz^|jzeRljaldHY?&}vTo_AQf+yGKt-UXds-
z!<esce)1c?{>*@IS;s$bPMELyaL-S#HU6>n##;R!>&we-8l8Ez7;y^f>yI^xwax)^
z@EwC1<EQ@S>2{|(GhWF=Onx~jbK~xlR~x4~9(#EF;S595`S+rl-K{M{@AI+*HXmp9
zJDc$RqQjk%8uJ@>*PeAYEbtSZKZ_~+`TR{A_e&daxpkj@n6qW_JF{=6^MC4>uUVf{
zoie-8{_l75q~%dhm1B6q#Tqu>XmqYSdCXGAcb!G^ob5SApO;F?zZdsgpM2x=rmyX)
zcIz)MYZ5iT{P1eM;p*Ki#m8H1XTCaStJs|*`F&06kN4M;Xa6le^ZzvG={<>WW=rxO
zKVDXt@GNirt;!&~IkM7WANkVa&&}5>KlW%>gRhzJ3s&|gQ_uGmF`U}3dP4ZN&!5+M
zlXPDtx$e6;fBkWvjmxSY_vf5E^*&s!vwq8iRT&%Jcj)d3IAa+tY$*8Wz5TYZQjT)N
zkp7vi7U^aEuU2o8Vplrz^<~TYOCQVjg}L9>-Jb6|J^$z_@2&>J>4BFdyp13HnQFZ}
zguCN?dZXDR(bYL|Mc4n@^xJ!Eee8eVcumn}i@r5BY>NFY9`ofy0u}!4=U>BhAhu3Q
zpO0mh)d__g-zpBV%t&_RY-j5CeLwAHaTucn_tTBBEq^)UZUn2ZnlR~9bMs{RPxHAi
zd|z<m=6*NhDYjM?KeZ35b+ey3r#o-%?Vh>UFR$L+e)<B_`3p+P8ejL=g|tnpXqzVK
z{QU6IeEz9(UvoM(sO@A)o%N;B(6vW1`_WG4id$Y8w-U?TOytGtZYMrudp+yKu@zVN
zgVTEN#rdp1%6ZG6y=6O(-@Q%BvKwd09h1p0vb89D*L!rb`klu~sngZ>h^qX)|KP||
zaqh`a56}O`(~^0nhVQ=Lp0JN8J0|@t&-gf7LvYdSCHwUH_T5}Bx%YffmGOxahZTRs
z{+3Ih+?aYSNb7QXz8~YN1+OknG`Fz)@$k#h%g^iUKY#u?QzCbHt&Y1Kw{m{tYh&4|
z{fA#0b`{*+%e6c2|C?W$yVLW}f0}6UW>-lW^TBsFqdTwa9=wrcHYeqMRoS5rf4uko
z;K`5hU%&3z;-il~ND6bLF-A)AJWQBh`_yILiUr?0i+=2j=*iPNwmE50LGe@1!+Q^(
z2^Dc~p1kFo+6MJQ{~}X2S01q55K`&7;nn5HUdz=r1|8Q|)W<oW)9#mCYta3`bit=n
z){XO@#O`8DOU_N3xQ8v~n(JyQt@VnvvBKw8OYl50eOaG)^PcDXz?Em*QqqJsZb&j{
zh&=vo{>>TM%RkolpAeG1JhQZ=D5=?T&nx*0H+;`r4>h^5a9y@j`qigvx(+JD{kESQ
zyRDS3qFnCNE-SOS(f!4z-J558{gpoL?cC-q+xySxwMDj{TXTM<uY2>2ufNl;pS|&P
zZlhP5At+Fq=fv7c9ob;lbm-%0?$r4*BD_@@JeL(iloUb?V@?%vS(Nv0`(e*;=cMxt
zaqqhJqwgio#aU?w2+MqV^v>zvAJ>I^p2fd@ndbS4%Jch)$a4fqb!;sYnegZ4mv3cO
z8|VG|V9PHs-Lc~D$Ia8v%mE#i_A>d2)ae@^RnvMa7v7v)qO)<fW6+GFA0O2y1vV?H
zE|@$i(mZL6+wHdZ8@FHnx#{dK#+{bcA78C8+ANXhWMr<#e6&U<E_h95(R{o5x~PTh
z&VDZH?I$-$tnQun`SNo6xpM`@t(RRsd?Cy#Oxp3iU;MoN3xuXz;7nR&D!aOO!RG1z
zzq6JejhXE;A^kJ&kz-klpZ}ikfBsyj@Dr<&su^;A$Fr1QynQ*l_!G;{lBOFE^+77W
zUf%p!eA9%)7aw1IF{qf{+q&?@)!FIxVkU_ii?qx2PiQ<!-g;5xPR5m7m+PP6X6$|w
zW%~Gh`qWToL6`6=^Dgw%=yWa+TYu|ihT&{KvBk@p)pU<38%X&IX>8jZay+JC>zWni
zhqpY771C}=Jh3QZr%>b}^Qru|d~PI#&DNDk6qy~Oq~pmMeMUy-){6DJSpNR~XWKQ)
zuXO#{a}lM+-IJGpST)^A@$>Ed;enS|zq^<(c;uwoomUyG4dtuZvp>YV+<o<ASV2zp
z%=o*JcSRllhkO63EA7u=IKFMZ^)<z`-{r9{t*_aB(seq+e%j`>!1iDJR^PLIJ@1&Q
zQ@{?8{P&obyRX@Pa&^jSZ_Sr|RK_b_e`{Z9f6Zip<sKdVY=*1r1HQkD`F=v2vyf~3
zkqm*&f9GHNb+5F)X1c)g8NFZy->>g4zpEavdZaJ5>bhdt@BRNSe_!|e$?29Gg(>f?
z4iv25U-Ikwy5A)VPb);<?^^scw%oe<`rUff_q%p~T=$=I?`yle*PmH0Ex&8}HtzdN
z?zg)qRqvgsAp3upe|+Bk$$ww>ioCSAQM+sY+3%_B)yl3`a%J=D)E}`=Y6qzj-|fF&
z<YC;BOGoc{Ozi8wyZnAvfxZ93<a`y6<0s`V<h%aa@hBx<wewXf{|j;DJBNcmZZa2I
z`Z$gM#dPIH<=r=Dhc0QGZ@Xain*&q-zR5eSxP{HV+Tr6w58ow+E?vB5vVK?Jw}wY&
zC!FX?aj!N`tOD^WCUA5YyI0?yl`Ql2WOHvE|01!;%mp^>rtZ6UXMI!QH><Plc*)~F
zX}Ro5rVs1BJyCSuz+O_`J~?GwSw^(Y6M=6N-n}h&d*>>j;qM8_H=K8^KU~ZmZhhpf
zGhfp3-<C1U3${9+v3sKNZ9-k@lU=Q=Yo|sZuRD?WM)B{t6JLwMt&hB6?n~x>8Sb_&
ze#b4vH2EThYLER!Ma>WcnQuD(>YXS(ZCzQ%-FBH1a+mab?|77Lb>^{u;_z((-;z5^
z9%Yqpjd>fF9=`kg`X^c6&DMRhU%1+KQT3fBn+bo5%F=ILmdmWT-R1C2tg1xj?Zmdl
zYk5-g6+Mohm&^Qd^OVCkv8IwcZv<nF4l7OA+bSokU+p4(egj0wNx6&pZigV^^3^W;
z#W|Ncl(D#mh*!Jpm*CWHe4}gfvf_sFud5yrY@4=cy797C`-ERflspk9RMP+N>x@Sd
z6L)<-wzU54>x28{f@36vB0Jy2=d1ag-!B)uhgUUm;@scYZFO!1{Jt*x{vg|?<8|G0
zH@?af+y1Gwey<4E%=_%pC*;^m>h|8*+ZV==@qX81kf&$7d-$R0%<gw<-*Np{WZ!hW
zguPw-*}c+^o1oyid{??IrsBF{o_v8qwNH6&Mc~8O_8GM&8sBjKopz#|`@Iz?UQ+x`
z)^$$0vzyQGcLVcH;a|EF^TnYi%)5}^S)=}a9Vp5izO~eOKH0srTsG;uBKs!wFV#x-
zC+~gDa9Gxe>G$__>Lm(K*+t*)YX7iqdH#lVZqqNXzGzdt;dT_?w=M3)ztrNyE-vYx
zyZ>k9$Fv(4<7$_^%Uxf`wd2m~C)pKupRQFsed%z)5$`LZMiz2=^6iW#w5@DRIqSat
z@XZ{XpBb^smI)dBUAR1L!;gQg(Qlg0${w-veIaKvPps_Mqpz2@&yl((6MQl~?fufX
z`cJ&|J>(?Y6CVp*lFjdQdpW~si|DE!uUaO~a?6W3^|@b+MfZMB?sKzeSz8U%d#<L4
z{c4!mF0`|4b-P!I*tdlWU-mw?DSH!N_I-h@vR?c>_5Pddr1V{^r%t)0ow3{G#o{YY
ztMuC*I?WR5{^(`sJ9UxhquLqPCy%`R@+|M9>tmmeW7z>FO5ta-pE;$Tx#jZlf>xg3
zk03*VYD?C#_$w<`8J*8+jSD&G(&ZUGNqX7Jf}}g$w|C#y*PCG$<;z&2w7>Jk(KU7l
zJr=#3J|Xa7MzDaCi9nTU3}3j0tDx8ZxjilGYW{usv$E?FTdSQopR}&m%j?r7YCP4=
z(^v8O>RPh(okH?9N7<=LuLK-B)-EkRe8o>AMI>VO4o3ZxMz1cUglO+q;F%;UDSMA;
zqw~hgdW-pD-Ck~ARkP7pvXwLU!u8f3t0!~)*|P&fPHFgLPF{B|b&8*+Y~|51&Bdxq
ze;MtXwfD@7+yIZIJ-b3AuUfe;zQP=SLSu^=Z$j|2!09TBmz+ARy3>*2gvNu$4(SEy
zdW-cU-DH1RO0iGsacVKsc;n<2`|4czi{}|{P8x9q%rbfTD#q>QluPF?T1-jZ^3zK~
zdGYGR{+^p`ts$pYxK9ame=T$N-A69T)@#cI&88W>x|kC3TBetIx!&UL_1q25)L3SA
zu5cF*{AD;x<mkl&tJxot^%lxi-oNaB(Lz&2L~V;_;BzJ~^(l27YI%waR2TmG^m6^F
z<=N&Mi-YWHSJh<AUD)|N<jLjuNU7_2Ej>$XeyRK{*?R7Ris{_!^b8(>yDaj?j9*VO
ztqPoO-nqnBL}?4B?K7cQ!RGti_TE#Oa6X{plA7(@ZjHG?za&o?e>i1q@=j+lqsn65
zUn{0uY|vP&_mb!9rr%1p*Z%5eO30N`Ox9e?=<DX0p5eG||0{i|duj|9eLomZzSy9*
z_=)qC?Y5q7j81dazRWnC;c)Ngli(}cWh31by=Iq`>MbtuI(d9W{_jmaYI9RfSW>QJ
zf})@;L{fF`;-AaP@2uLd!E$Yxpz$;#sYxkUl;<vH-FdHTf5w;JuTpzon>;-3<Kn!j
zqv}cWmF?W+f<EcOHD^>!mb|O(uj%?#_ENWrGdJkU&W1~zs`88W1zUA{Ii-5VUS?eS
zp>*&2=YdOCs?Qd>^*H0oMPFW<y65b%dv>gQc_B#jdfmyb&QE8_eHCI+y}o)~&UI7S
z<W-NXG<KG)jJfO_-?ZdO)m6(EyOw=k5*pL4dR=a6c9luti>Wc|cSXlsFS)R?>-CB!
zx0V<A@@w-go|Ju{qtusu{;C~)-s_mPu7COQ$m3F4L*#>5e&T_JbEm|#yR0+Kdha&L
zjC<kY(<L3tnsVP=nKVI7HQ@5X>koQ`R&J3jDVf=KrDZ3dMah*+d0+iQ(yCLxsW6<s
zSLNV!z*xp~Qj1Ld;<fP?f3iF(xBZ|}5>&VO%n8L?6`x*4CgfErGac>Td9P}N=YjPd
zd_gb#l4s82csA{NsO4!X#+_AbrL_guhHpPSkE!V9>}ckqqc42tZ)1J3$=!<e$*#KQ
z-B0c@7sc*B*#7qdQ;{@NXk&o<_52U5cd}O-&pgI<zrAk3s<5if8No|3UO)cDyN~~`
zM`)0}TxY=YOOua>tXTEh{D<!r=TOhKEk_n_zclw)#+p^qCM#6mMuZ-}-gSnzM)To)
z##%MU$Fa8$^MsW)ALF>)F1+RyoA32Je$9xhyt8EP)Ne`%HO~m}_;qmAzOeF>7rtv7
zajo@*YM5;_NiJx^DrvLW-L^{-Ld|n7T?MPpfvR79Rl|3oUW!Q6>|>|5wM(vfWwx{!
zq;R|D!q<+ht9SWkM%Hgj2o;|`-IX`&>(-`+pPY1d_Aq5P`<|(CIJinrP5(6`%j#V#
zwya?nSo3PprcM7;4zAj<L?>%Q)&lXrGee)9e=5A=`C+wG+Z73+K0()-Il^33Q*ApE
zLPLVC%~y>Ooj%2tH;mVVRq1rX)m8gBc1%4+Q0;Zj)D2lz<5^f%Cr#cY7qmf3P4l%P
z%j!jwHpw|{(9+U;?Z~oP>U}Uvd@8s5g1ik`4*D+QPZ@h29PLiu6F;#jn{QQVbEs#o
zOz^to^-rp<PJLUN5##ds)<ym>)zZ#0JNmrVh0krC_mR&{YhCQ$gwP=FQ&V0a(cBqV
zy1n99wB*Vi-@Y`5GFNrv2~CMvFST*r$38c$b+vyJt~SUmn(c8b=c>*Jt1YIB3T0og
zufBBKMQz)XvkeKM=gnemMAL4UGrvs;oxbm|?9E{2HKqN6yNoUeE)ZS)>XP~P$EO#r
z5;*<3QG?N5&eSQ?Gc#ZEw4>Zgt_`o(u+L^`Tr9p)YFlVtEbr|vUisQ02G1;CGpZ>i
zg{cQ^y~HIdxiYHiQ1LWVrO@#AX{Ab`+zcspAy<zcS+(oz!Bu)nQCHuJtb4W7S2XIq
zb<EY`*-e@MOAm!MIxwBj{m_=tx|&UD?im@&7|{&^ci6tSm+jHw{4hmv66=B17dZv>
zFOIKniwZX>3z`yE>U(T;RbKOJm;GB-#eFCUx)%0UE}i+v>MFTa3wTZALi=wYnBH}0
z=YrcuoW-_OdVE|puU#YKv%sTJTmIk+&lEulmn}FuUnTD9=K$8+6(3hE5qlG~Co5oL
zU`Fl))?B%uJ*%E8a^13NsR%uPTx3fn$H!H1!EM*(>&9LE90=C1Fzn&66XjY)Tx)qZ
zEja7k75;VBrd=R?*QZ?jy5Ldh-eq^z*hlYK)qeWyqGPMusu&l<g-i@g$lb6rl3ye4
z>ft46wha}b{8MLsWq1^78<KQwzH;2v!%tHKABQ@xy>s%&XRS}1F<%ouZvvUwe)4n`
z$H!H2TKca+ZeOuyjlCzx=+hvhm)tpN6u0%2K9k<Ejg^u7nsHYTKS{N10U191E6B?s
zao0dTg&H38E=6*E)K~Gf$5vO}*t3RRWc{nePn+Z%_N;0@b-IcHVN2ltkNSB>g;z*#
zkji4Qe(Kos;jH(Se4d`@kJnzht#NzO)YAEQN)Ge6H#_b}NOZpCQ(P^$Qz7vYi|Xx$
zdV_c7a&AexozG;stn->-;d#>RK~d-L-YccreU^6@T<wtQnYSbEq*=nrV}ILTdF7OM
zMD?Dy_@YyLrO5${j^Djkr`~ucuuW>>;ftI18ED=PxRG@yIWuzRd%eQdQajm;z9}ua
z^o#eJ?#^pGF;`Dmf5@>c5PekX8{ukR6sr7M;qD!oWamHYIG1F!uX8gxeB#2@2)<a>
z8GhGT0=G1WFYY*3qQJg>*RG4JS8sQC^5W|0o3Z`}SHC&CcH`=#FU$OID}~=wzRMIo
zneF_^z3l6L`To5j7xm!P>61k!>6>#tPB?loDG{kbIB(w7m*1tUd!F83&!X~9;ajHD
z{uPfh<(KQn+1F|(>AsEEnadFSAne+9X`TAD40kmYjm4*ZO);LiDt9wm|C+LzyfvkU
zPk&U}-VFVHH2;<AGWq$^*`a17e-_PKlWt^pJ^z*MGTHgk*{t5yb&>wts?RV9%ztgI
z5wB-zXMSl_vp7qTtPTGsp`U!0rvIMssQB-)v=n|#yX*Nm&fh@XW6zT7H~omY?|Aj*
zqGQk9qNFsx9Pa92%Dz0M>r24n;=jvymbQz`f4zH#RW!e%-Su+A(ry1#KJKgwem1GD
zCU1@ShgZ8rC0nntMW(-2Jo@~X-lB8YoIB2cjrEzkwq0QUYxAY)e{X_p{i6K$$DJ7=
z-0OSJ_kxOj-c9GOF?XH+YU?t0ExW+{*VP~k6zs0&pE~<%^3mtNd{?^v`nYpr*t(2I
zKSh7W?7jL$`g6ZrM$NkWS1evB9(~?*Z~uQGkUO%j&DXWNp6_LQssDVh=gvj02UdrF
z6<-^7@OSS|cYYJQ@GU-n!#mD@W%gP30_3vUL7V^OfHZ!ZSXYzhb4pbAaq;SZi?05N
z*>A}DGV$2+UyMqjUl@-(|HY^l45oc|M)GUfUFWanX`is}4J*SX-t)btO}jod`2KjL
z`o=I}^P#Ql<>z|u`fz54pVvCZ@Uk1pd(v88JJ?%HFR7kY^tM{{dPA|n8^f5*he}t-
z&z7Ei+8|9W=#=S$JkIK#YikN*U$#G+ls7SW9rN-hQU*!dKg(*1WM8{KQ~R>ww*#nk
zA@EINVbnvbi~MJNUpRhmTynPIK#ctx!<gW-+16W49v6AuyJC_Q{H}oWWNE+QY@y4H
z_Fg83iag(~?0Fc#cbYY#?;3Mplfi|qQ>u}_B~J&+P37LWTP{b)sxdAgPf6cU&+e-J
zSr>x@ohW_-&Wbnd{XFs>U5wPr{W0h1vyMAwg#42K@5tnFwMcwaC~kiE{Nj}rw_O!2
z?=}~n|B)T6w9q2v<>M@lbzc|-YNHjm1;1E(|4Q_mf6n={rMhglT)4gc^3O|~KA#B5
zSQX8+!7tsccAM?mSF!76vsc_&u=M&3!yfkXYniSSR=KXo6=#i5G@31Q@layGV&Tbp
zi`>(qGCTV@FW!7`!(*}M%aSbCZ@0=KUyCl<eDLL;RJ*u7lNVRIUT@89OgcJ)VXp7o
zgJO^W$0-W4dTe=75@eZ_?37~m;u?SX=c7T%R$pJ~F6TUv<kNAEP1kz1fB1<bM>Adu
zYAu@fV}Zb2-s_Fq4<9XZy%%`>K~)LYdrvD3m(1qxbL(HGRsD=^4ZGsoEVs1IPg7oG
z(bk6%zm)DA{u292r9|X_a!h@N`iA=-xIXZiZ*~2>Xyu!^Eq&}29*_Cov*@(H%(0ka
z*PFMl<(sPhzA(jD>$3;+-L~Fl>{-la;25kF!j&Ln)u6c5R-3Wsj!s5tFnd|B<S~&0
z6O=1$_nLBaiA)WBUX)<IG%jWKEGfCw?3`~8=qm8IWHi4!tH?7mz;=!3l%ECy3wc+W
zA2&#G`g$Pjfw%&j(w37l9*#V<-LDp|JrjJ2t@TCDh2552ivBC)ZgCxAI_A(~rg4ww
z*ah_v{(ROzzGMX}={1c^#{`TmYixIj9#QRS)X3eyt|H;=_2|P_hVWO{&aty*luGd}
zmpL{;m{+Lkf@Z(unFO9ItXc(9e#`V{N!`DAVymd;|Myewu4-Dg#6j}d1+jSk!);}(
z$4t^AI3*sN9hk9<XS>L;9VHUZT5X{PYFxD|xszCZHS;8U6xFR;+^im6dEsJ_v_g_)
z;k-p2Uj95T8i$0P)viR`mYo^UqTS}RLaxErE1t(8BY0UnTk?zO5blFkWe<BAU$|H#
zpAcTfnjpLT%Q1(RZPm#ygja>L9njljC@@zdpU3cKZ`k7POM*WgbC~jIkKqy<^Qfhl
zCSB?>XImutuvhVUlIoWbe*1}uAPZ%k)u+UTDSt?jVHWKAa{R)y`1MnoW4|6ZS-y}<
z;jt;h%w<RRikzq@QE=vx*0K0}cu^7uN6M_KRjCebbA-~CrFiuEwb-}K%5>!lp8P`R
zuc5#~j(VP%0m)xIQ=A0<NoXxxl3>tz;gUSF;H`K4iur*-f2O%)JnV0L;qn9QheX-^
zUyeJpZ2JxJ18bt}{tw3;N|OE<9_e}D!hi7BBzv|+BG3C3RhiYRB(AOhk<1V^Tgb9l
z!TIj8yrmxeo8E-I>~CDOqG=h=IZ%{bU2$4?+CPaIeoO4zw*9Coa}4-;+$8-~cYs>A
zyH-@q&9x7ooSKz>(<l1Ukwc|7@BOLyH!HyH%vDX3C(l}M-bk3rW%udJ?6q&Wj<j-G
zed>rTwC&*A>U~1-VWGlQcE;oeru#Vy3{GrRFMcCnk><`n^J&B>k=A_P+RcfF6i)9u
zv&lPg=96@<=7YIAV+>CeC7Ah0q*zXf{HCEZIqO8~O`EGRho5P`4>7m(%}$j|+c}L_
zEPTOy(dOAYi48J;3cfwM`npEuNvAX4wy!(&r}VQ-59emuywiYTvt7Bge8;99)$JN-
zwN{(&%s=QJRG4kX&i2Gi?9M0Uf2NKccf76|%WPlwU|ZZozqD}spRBtlx?cJ5^X29F
z=Q8e0S{>e<RQ%FIE3evq4=XRb{T}Pu%70DA^mgWL)d-&6w<Kx%_sP*04qUl%`v31H
zjh%*bWBJbi@X*Tp%AfltOzceE|IaUPTIS{oTW!8GThlG5Alu@zL`-zwsk(~lU(e=j
z+va!s4%3^W$36W^9$m``<3FLxo?;KW7$k00s>pV}xzY1HC-g0O6mGwiefRXebMA)c
z&-**Ws3&Rqoc$`VxW$xLO1zT}XnmO{_U!KK`TvE_8myHo;IefV59PKnn3Kw*TRdy?
z*S;Q88LOTr?6uE!1Z=o%y@ku^qN!6wWyYIJjVk-UpZep;x;wQ`Dk0fszOnZaugzQ6
z=s$j{o;^qW<$s%5`o}JFCS**xIs4P^I-A7*smDCu2^=g~!6^6mj{G5(WeJz8+<4OW
zb(z_{&)=G5Wcq%+MUKbrFY`YAlj+@Kf8lJIy=NU)|NZ?AZt@lOOXlud{<OCI?w$qB
zvD0)KU+j7xV>@BlZ@)9m9lO5k*nIf)a9{Ad18eKf|11^o{XWl!U9j~1%wmB+eg$7Y
z*K2#9A8AyoxX)Rj5cqxWTQ<S3`ZI1VvpZS(>Bg3GKIhLpUM6$Jv##DV+t>Z)-_#YR
zbDw^n-gm8J#{Kwrk%u$u>O0eXkN^CeI@NT}^Y7E0u2sytAHOf+bY)%r$wc4hKli3K
zna+LwecHFHW%K@bKdD%GzPPt#orkxR%j;z}3%LvD-H-nkcDb^yer1&J^Phj8rh-&Y
zZ@F49?|%HTP>{sSP+pKkkm<bV-=|w#Et+>fep(1fLNm~p{ny{8_FLz^_^))*@0D<@
z`esk>0@tgbt13UV3IF|fX~rzSFTYPmW?5Z)ukX0>rOW>PIZHqiLH%F}<1CAd@AX%%
z_~^2KKhL6RARVo<{JvD5=FPIY@LpGN#ao;I|39yh?|n8QFy`d1iB(L~6D=0zZ{u#e
zxkmo@vK1XVZ{1JzZCF^QzVLo^LDcds@<od$TTF{$wlFxomwiR4*Kft}Q~olVJ5RSp
zn%(|$sN@#^-lLuIxy(1-*r_c0+amkvP?g{B!WS=@ZI~>4e>YlfYyYd>lDYh^#g`|H
z51aij*Cpir<~O+R`@8VPP3A?(M=n=QuAX`K-{aG!m+NAxJ~8Oun6Uisfji&os<M~=
z-SOoOqrT4Nx`eXd{x>fB{w{oZlX*{-%d~II#jEQxzR&sgIP1uT<Egj!&*Z*;zP0RD
zzjyz_=cPKEw#d)8ZTjSO=CZ##zEo84`F3rQpArAJW$!$Y9cF6Z8ND*?4Gz~bYyI6K
zUv=F_p^`CW*Z(WFZ@0)#=TqK!amw<)2i|<+Tf60QU5wQPk-01HJ-xg1Zr!E2Lz~nS
zk8hC=XSS)Dx@CTkXUeVqY2gMuVN$x!4?ntGcjsKD{k#1^xB7Q`{{Csa<Zni0LhN<j
z%XLzZE6g(OXK$JBd+WT~+w`YGMU%g6_WXTw$=?}1zb{(Nx3T8eDhg2lsrEJ<Cb4GD
zbC~+$DYyEsg?)Ks(|g@@E?g9(vS?oZr8=<5@?SgGP5!o6Rk?1)?_0K4I`@H1&jHJ7
ztN(%-{8Ihx@x|+H&$F#u@>k@~lthb(+uQ66WG~gdxLfC>Y3<Y{J0arR^$YCFoNw{(
z<oA*BUYjp7<LN!-D^^SYPMEw~$ldE*QR1|(kN;nv@J;x#_qyLfMblZX^e*}90*UvJ
zFJ3a&#Vq@~X4~uTU;Z4I{eFLZagw=CY3W~wJKy9J*3JI*_~K^vCKtcojW^!f?~5^h
zdwj7vKg+f`-<S(;|9-i4E?Az)-S0Q!jacVH^YU)>yPucih|zq@{wVDKg?E;3k1sxc
zfqfoCeI;0Z@(bp8uiuS3Vx9NROS{$Y-oKo`$?F#Xk@a<l;?8H<+u2GRcVuPS3xJ~g
z?H2i<FR9bMJ!U@1EpU0Svi938^7HwWouk1Hl8wq-{`W_Tf@Dk4t^Vu&xBNr4{e3m#
z+vDtp<2$B(d;IWn-It_ki%n#BCdt&?>c4LJ_W18`uiqcdGVSZzw#cuww!i-M)Ry_j
zqW43h861_7J6rB7`3s2%waax|`k2n2YwnV{;)xPN&*4#TIP=@$qiy2PGxzAdvbhh_
zIeW|esh?}W2HsrqcZGk++%58J&%S8ix&E&6+!wHf0!|W(U`b+r-KDykU%A}<6SOYZ
ziN%Yrj<nynz0J(vSEN1P-kbg!s_q^OnT<|oXE0w@eBD0p#T1XZ;K+V_*(&w#h131J
zgYu?xZ(bw+Z-3t!d9IR^o9dR_(c@e$eezeQ^^(@FbG|;lyqW#bo}2zFKc$5I=GVXO
z`|IP&mCT73U$due`~RZo?i~5~^Q;7>t_9`ze%<RnKR>?gWKO*Kl09wP_sP-LkB=``
z=W9t_49cosnlAeM;CxZZoOtm$ds^849q%mft6$)lr+@p;fivIg0<xF?X8CgC=Y|)b
zn2mS0nb@AqncpDiChzH6=TK(7<mJ~nZ-g%t8!Yzfm!ENeU*eRyb^UJL^QZQ(&Uk+B
z<CL;h{tn0c0&hNKf3~gMVd>nL!WS+khnW31xzlvs3*qU#`>fP{u}F1nymVjvvEa<-
zi=VRfT;Aa1ko6(cuI{;s{Qr2(v&Zi*`T0lkQq7iimt(H$U#|J%JL|mK+4RZJHhX@)
zx#VZgrJAUYTT6a^nf`3?(o$P%ekE{jMkoN~W|R3~O~+Ga^<O*q@@VC)b=_9y%`@$0
zLnYFm+S~^lWtM3ND)-O2ck|kxseLQ=$^|Yy+hqP!;aZrrUnV~jzHm`ydx!Sj+DBJy
z<{yc6zCWF>(oX7b?UE7>%`%6yO5WP|FQ03ePDRds`qN`=9w;*}zHIgMXTTEE)1N19
z+8Hw=_3w=TrB8kaBsiTaQb;ZKbhzs=&;OF5;F{+)^Bd+F3wYkGO-e}rA|J7C_6y-l
z!E8!9ck>^~{Xg;Pu9<d<wwVg+O1?ARcza>j+UFtjC(JVu2;cSF0bF`N|JCwkOXH49
zciEH5d1Vt!Cf7Pu-E+_>|K7Ocs{NMgbKf{$e*9dx6l5Bx?B3<?!M~vY={q}t?b#le
zE}!|%`SRkI!mYbO8F^ORc}{ypTV~^R<=-1YZJ5mTKRcxE);cY4=R8vK{)CtHQ}rc>
zPb>l1wY@xJ>D<r47aLPzUcM9lKKaY!DY^Ts)c(3iJ=l2fuKKa`zY~@$`=Ft^l3f&(
zjr}iJzE%Gb?)94!mW{i0uJfMSGCu*9+aP&&_Lli#i_9|Z|1SNTp=m)l50|=C7S22N
zdeOPh;KJa!|I}}vpA?wM&&{#jDO0Ha9eR*O^+*5v(bF%_KDse~<NeR)*R6TTEBx@W
z<F79Vei`kHs<V>Yad1Ds#KG;s+f3Iji@(7<=S1_-Pp{9ucyPF+&UBW1e!qJ6#iHLU
zDn8_~*_rK)P6MB0p_#D!NP*=%zrO8Lb*h?NznQ-Ci{pDP?|%C6!J|c1(p!A}enHQ(
z;QxN|;ip%QpI4pCIJLAmUuT}p&Ut>*YTSLFA8&?S+t`xp^6z)M{adzeGs6A;DT=Rf
zR?L0#-sjh>qXt>R&d1}g%hXEsKRf*M>GJit!9leX9B2MXKVr6rz3kiii#)0Qe189|
z_DSl>X;^QsD9bZ0i}PRqPEOC6+s3)OXCY6CT>#eQN_Tzres;?t9cHnkxq0Q|*$<z*
zdQenV{p04-5_zNB>1Bek726UX?^c`Fxjw0C(%(g2H$;FocPu>`_w8fekHQk0ANGgO
zA2$AY`rxP6J%5u<8k~K&{>}E6i+c`$*5R+){BxVyo5$Ufzh9kO_tid(%_O>iqw?$i
zPome8-~EoPY_E9nxgc+&;IqTsAD>iZ$wt55evkhgTlHDB{0F~y`#rwL^Hs0;_9Xk^
z%L>bts=9ANuN>0xve%sK(H6eByPLb<#6kUPi$%;b7xgA(#QT1^8O_Y%Uf7~+aX|3R
znlnXn>L$fimoGCr7AUQ>l6T6LuGb&>o*X-K&S|2w;z{1CPr7D*I(K>YgBQJpU)Z#F
zZ(m@(*X6xee$$-$ESCExPP+G{Zm;oPzOK0AZkME2xAw;GEmymKbYl0F1C3Qxm!p54
z`%-05HSyH-ty8~r{r+|C$s<0Cg+Yc-th|ag&;E0c<uRZ6ad)9NW<omeeppZLvA!pB
z=i@WA&Ph)`dF@s{`zNomb%qh&r#8(+O?xN2?>$*ylzKicrcUZSm)GB^i*?=k&d2?|
zG1DnwSBOYanqK}}?mm8T@ChBh7oHvcxkS5HuYpm-WR+pSSIc@=#V0DCOZKe3otQq0
zQDMQNnXmud?0tPx{II{gp5FA&v%OX<TpLqA(Ko#*f`N5Khp$4?(R9x(Oj$)vm#-KI
zPhon#zbU9uBV@|DIq{ZDGsC7cdf7gB5+3-<Bw!a4Pgn0L;Y~gQTyuVEIo&-rH>=t!
z>2iyf@D(QYeO*!OTcei7bk=AHA7OgFx9f($${k?~9Q{hBT}x@o`7=|Yz~!)v`Q+bS
z%T;G8NYp#5S-`=|-Yhuj<8$Xpndv_`PB3%slG?#{%IQM_^K|=fH6@mNr3!<(Y{a%7
z)bQ_iC|M@Oy2tj$na}{)l`F+w8eZO=TD~jr$L;2`u`}Ks2#e<3bH_V;7BhePqTe3<
zyob84*G99;o%8!Xv2M1Q{yav@Errwa8%lLdsy<r1PnJ&q!RE2wsat&g?i-r^H>+l>
z7SxaX{_^O|myDOzUwC%(wV!@b-Nd|BGyS;oszSR~hSx^<-yW5!i$6E!pCGm4Z1?rK
zadU*N9JKC>>Bp77ZLog8wB-DrtKHY<Cfs=_rZD#zhkji7q{8FT9oF{(;`XdFskXc2
zlo!z8@_#buppJ!evJTFAy|KjpsMm?fyXWt^+_i0Tu;_|qp_!M&<yO2qvZ!{~%74Ma
zt4pSf`hmE<KSO@6><q0sQ)C}f9(6ISX4Q`?Tej_9xJ$Tu+x_6vQNC}w*j86B+;zFD
z?7i8Ir6uMe>AMuA-CeieH#yFEiu>x^xIdN~lR7eXE!=gv$6jsDv1Fx4Mt*I*RqKu%
z)8qPIW!O=_I!;*p{gPKcX6FhY9p$(l<!N@v`|8{Rk$qp1TFTcd>^bXub?S=)hi@+E
z+?im^9BuufU|L3!+O0D!238i2^$dmbuEmx<$k~0wXGdiD$-_rqtF#?DyUSnyoRBY1
z>+I6y;+FeC0++juX3O3NsVNG~OJtY+aQoScSAP1Z&c8}Xu8o!ny?fGCwy-Z(>&_bM
zgDWndZ9KHpL^kxUr<-g(pV2I-rz>9ZJ^LuOrRsRFOz8B@yU&?C=6z|y=kvD5$dUhE
z#JS`>QZjyO98T>vNArT0IJ^omau9ejJ5+FriGYfXyV{F`v+q_0gf$nRU~#ONZN<MY
z$hyJjLUZ~0s#DFgU;H<8G`m+mlRe7xcZJV|mg^hhVh_LCQQ<S8Cw#-9lCa7On{dz9
zm-n~^U3b3j{?N@nr`W<Eh|B%ts^+cF?tioj?rlo0yCHT)IZ(DDYgO@gzw%vyE6(&g
zEOv4%zwu;R)R|qEWPWHIKHI3oWV+Y-?)K6LkJp%Ms0AF}ne4z9ULx+ZAzy`K<!8HN
zm49SjNQEEXemV9{KwJ*{t^-#;zAc#_H|HZ;?4wsd%647uo)hov=yCVu(a2dBLf5tB
zFaQ0`wK7OHM<Qc({&MTR8rPRJ_cG*ud|RR}UVgx_d{@-Ix$i*b&;1yIAW)i=HaaHu
z^!7_HV~IoS49>Bz1s|-aH?=xcc<DUknE2v0F}t}MtF*IZxmQ*{Y_V|YjA6*+aFxE8
z)_ge5Z+F@>HO0QP6JNr=ya>!o+^K%z%eG>Z*p}~ZEvFVQ+cmMN&Grz(M!{7d{nQ>h
z{xO)VcXP*2ec9A0=QD4eIL6ZX<G_{;C*PLLDieC;7bvr!p^`(<J@()$uVSG^eVYY7
zohlPt^DsC4eSJ&0h`ZN`NZ~bU-j_M9R(zjQ@#Rxl;n&$7W-)&HVm(bxM;4h$8aw3n
ze6Kz3yYJcMJ<;LMtF^ZFP5GYv<l#4MuVcF|&1umvk7rpLTQYg$ISrj-zn2Ivm5iEf
zn0ls2FZu4uWAZzd7?w@$DP1o1KG}cPyXjn#uXFSte9Pu}>ihasMEI=90;!LW1f0oY
zmyE87Es3quFyN2-cf>L5H^-ET-<*!{2*@rzf6rxyxHqS;?9(4lM2((lDrW{u8XF#e
zA${sd=B{8r*EQCTg&m)6ss^m(isk%l?JdD|SIuMd#DcD)bEnJq?iAXZzgI2k)Sn4|
zL|*%u{(9qUv;Vc`wYgDS_N#rI^~j?uc#XDe;guIgAB@tc@rLSMn!0hp<{r~~wjw6V
zx*knEs<N8j7e25)`iuQU#2Sa0*QcD0C|~uleSN{Ml1UriU0Gx+=XpWII_yM5c-Ny9
zAAL@IU;S9>OGV4v)HNU9=w`S@O^A?`{(J9g{%hx}fg-2n6(7%H`nv9^Qd(2SpPSM<
zeXGMfCNefH5L&9$)D))p$}b>m(w0YB*K@hOCF4X*MQZmOG97GiwhPn#sC6|#ps6eC
zYiOlcX*s{{t9Lg`4@R(vUVZhWbIPlCcKTELueEMjGb^i9!quy^T%Sp+?@;N%9Uuj_
zKTmnJF3e9xaj9UBUqIkpfkhL_uDtUx4U)QT<f<LAdVOW^s@?OB@VYXr4%yyne=1~q
zn|+!7neI(@V^@?c@5=J|kzBs3a2LPUla)($tNz)jeU?%0^YPX{Dq6D+U#-~wYGU4^
z=}dl!&PQ#h2G7+n4)*)ZcP@6TN6)Tk&IJ)N0%un{dW7*^WZ>%z-1kbLtM2mBoyJ@T
zzczI&C<u<7Wt}V#<N8;E%jMeAoyJTD=jwB+wCyq}|F+4@{GP_%Ft*eUo3F3hsg?AS
z)j*>;cB8wqhl8u@Vabb=x~6GOs#<Ng!0V%@@GZX54HX4(Tbf=)$UdAIbT{_?LLEka
zzy7emwR~TER=!*JvEZu11C>nCt6A*fUZv%8+t+Nlou(bOBJYcu#DywDzS&KGRj-7Y
zR|)sLuw7!Z?PizgD(StPY$ovytG7NpxV9!?RkOoP`O2&n3FQsm0pA}?v*X$n`_;Ab
zp6lMva*m068MwsR&%1qHc5aoqB*(U+SKas*^6<vavOaG3$V=8eAZUu-*}0Do6}VO<
zY54n1e|E0WY)6nf=M^re>Cev1*tN4Ss&ggpsf6d7mqvO|pK)sePuaf6!&9e!Q}X(|
zMJyoK<?h1<Ig$J|YP%&vr7u=kEMaf`U^d|{$7){<+ZfrcQv_^o_U^dVaqn>AUWr6r
zj}&vJY~@w_>XQPF<S^gtJ#nk!n{!x_%ME6so4prqH8AlMtlW|CWyz!*o^9{q`UIDI
z3w7xoT=4qbEtcur@(wF|9~j;YleubKaPNUpm$Sy=i0RMHwezkE@?=r{`1;bF%KQgh
z{7Zg*Zp(OAbLK&j@#O}8XOnWf<XM;RaaHif>b$yi$M%BI)3ovh+{Ll8tPf|;ne^>p
zoY166(^j*ZvUAP6P`0Cp-!9~;k8i0mgW;n00R`vVz2>i6nRi6q%|ve9A;BrCYnSaZ
z3^>to&biUnK8Lwlbd@x7YflC!Vl3;mL(JK@W?rb?!C)c3>i4o`yDmDJFZjunGS@^S
zGuE{<TcV@WDq=^ktl$)nY>AFWt}4ELFE?0xpJ!KJZ9Rv_zVF%5X&a^%9(~Wly1F7@
z%i^X}J62xp-YiuedLc_g?nLv0Sxwhk?77U{`@*|#hooP1nIBejbLz2_E9GtLYHeO5
zv8ZXh-MTdI#zK)f<;&It@@M(1P};U}WAG-X(_w1cj5l7WT%~X=yX#DSy4QP$RJ~9Z
z)30eCV^SsC%iBVBv%kz?UHj<7(@im}Cti9WcQV^hO2g}s^$u>2jMq%l{1%+M_LOx~
zuRu?e2IG|wVTBv<YtzFu7v?r4-ML!Qu;%@P^<i69i_J52GSa&uylMmAJFcZgzOS34
z6(w7jF|9aYWpa9T>)TaR5BE;!SslfCHG$nTY~KGx+ja<c1(xME=&(=OwwO)RZ*{-4
zqGYNJ%Y<l_IVn#sYQLH+y-*_6ifw{7%aVx7JE=!c_Fm{I(q)<8%yLKKRHWXi>9ZF|
zUGLIqSRmk1%G_qMd}g7!)P#6OCCiZVyC$KXXODkf$-UsvEnfds3opK&|NpWNtEJ5Y
zk$$bs`(t-2hT0x4y4xN9Q_jn}{Y1hhGoAFNgqSk6PgUzgPfIS4c%H>Iv9#sZ#yOpy
zZnEl%SAGR?pPs288LlaqIb}<-rLf9kz5@c;)3zj93X3ehQq*DMeQV<!&PjpOLOM*m
zqc+artZm$V#ywhfZNxd2vpasoEs1P8RHU}z*h)*4bNR=M)I8i~u2B?vu^nX8V+FV5
z<ONsNqc_ay^jcbxpLQuCT(tA)u6tF#cD$IvA(?W&@98e#o=ay1jdC~}pIQa??0(ZT
zLG-mj#5(JfJ3ehYA(F#0?X{ng*GX58#VpNFcTMiGVo+Wad8zN|uHc@a(}I_D4kqk;
zr=q-C?(rERmT9m347n0rGFG!RJ_Q}P<gK(Mvgt_C+?8%&ACJY^D{P4Q-g!)QhGL@~
z+v!quNp?f2-{tG<ZgxGj3O~|z=uD!{^ksid!^HE-REtcm@13{4fAs}X<<0!j2j*~A
z6^ibg`0!3{#5sn8ubSFIn<lQ>$$M(%jHDRHqLjp0VJhiONmJUoCyIG$PcU{geD$Gw
zqnamopRuEXo+@MJ#4U#`ghdwTtdPi@uw|iz@GPe3A-!hqw;bkhPAc3wb;2_aw!<?O
zq;3{4R=&Q#_RuGw$0#H@M<qnM$=K15FU+CuR-5{4#yOp3+%NjnGX1>6<72J|ef;N@
zZddS4C`GZYEIy{ZDKN^?aoIM-n!>r7eG^5LuNoZ^zdkqRisvMS(_a#63h#Qlt=z$q
z*`5Gm9!s@J@|_6M)&<gbOGzR=rhHOiX!L|*93X8;B6~b8K$vM$EGH?P6<ngf&iE>4
z&{@UxG6MT{yc6!tac${ocKY#X*W{jNi3#(!Jv<o}AH#e%dcRC=Y_IrXe)GkvlYeKt
z{&3;eefyhLMLWPJLw;NDU;J&pYW;(h(^Z@1%(sb*n`<LEe@?xW{+gQ~9>4fF`S8b+
zlbyfa);)d7uEtEBclzShpBBIQo?b5edi`SlX^*4UeZIka<G=3pvb~>n9$qSuugA9A
zYU3vH^!xu`*HrEPbZKpK^WpQ0fBs1O_3^{w3?+jn?YobzP1yM3$>F;{(keOpnE%{v
zK3}?uZ*%5^XGfspA{N{JzHb)Jtok>NFFV#xy@$z6{8~}g$E6$XYEmzoY?*fW=kbf5
zDh@n&my=LCtAAZT`}}FAZ$3VJSU-NBOwEqjo3G#JQ4eRIe);y{^LqdDzD<vKbg(mZ
zseRPN#&mfL_8hTx^=s3%eonQE({mTL6Oz`b{rYyoM*G@1b;_UK{EwAQDEO4KD}qn_
z+UAF6KYaWAW&6jb{kh*A=H+Bp82_`dlsj`=-d<O7yS!i5_3c6bGE0nicj!qh{B!(0
zo4Wmm_z#NnWa=iUS<Zi)Q)b`$Bj9-R5~JPP{+pNnG}!y=)c<Gs_BVf-E7u2I(qFf1
z`YPE;;hY!b52w{T-A}J?f8(!E_ifYu+~ePK?0=bm3x5JRD#7oG+q?ad+a$$i|G%?Q
z*Kqrq`rW^Z-rliV_i5+rn^r3#f6rIHZ&UyI&7b%A@k^S1f5UfFLXF)VonxmzmKg1^
zw5j=cxnVWuKJocAQoQST?2^#G>G#$<l+!oIkaq&#=C4oEY<`}d)t}eLo_>10`QoF?
zFJ@S7II{eBvroRx68}8+@W+bPKZ@+6e2Z$Qtek!NXp%yT_EQyGDIK+k^6zh~INto<
z_>YZ^@ctC#nz<YA>$vaN=dVxQ?>9en)9<tY{#{GoHnUBB`tivRpMO05u*k}OM|96K
z|C=s4{L?OnU)EpzbMwQbEt{)TI@6DLbAMZrDjRKW{id4z@yV+%zMEgSzP<hOf4Td2
zc(#}Cx4c(gwl;tN-Boq_X810@zWC?2cZPo~FMDr(Sac@j__uYXH93v^zUglwLias7
z{o?Sa;%_Tm-oO2D{pB1%8|ic6i>FV1>UZ*Wfmw3<p{BPJwCexe?J1sN`1|elNAq7+
z`}OI@*Zr<Y`Dp(pbLO;zZ<B1K-bCH!aC@@+=jzSnpVyo1o6Rd{5+t-?`O(ASkAL3u
zu=&|K(co`Uf$?6MPjl-JsC~VhQemyN{H6T=8|OGT@7w&N|5|eP?}FP_w|4ED9rGza
zvistv!*`1;=jz;$Ru7LaTl?R$)2luDj?Cx#p91eiKZ^HJynpwTZ?Wy%`+E0o@0aPx
zbNeIy=sx$i!>ZN=@kLTPZTUBXdxYEaj`@q3vzsqIdHm_}#UB^D*Ub6&_1vRpe}7EB
zdu#Ub?K$cCH`v*`e?I+Krp57Feok}$<JWH&uf2FyDVFQb^*e8}>o<H{Bg-RvS#tiY
zqt)5n=RPt{x3hbB`}gfR?lW9Y2Yq0(|92wL=AXNj<cq|ZTLw?B{5^Q^<$2+KTh(Oz
z4I2_S>YD7`>sz1pBkN$o-mNn}{(l#3e)(nowTem2D*L$GuI1Q8=}E?Ivs=DsM(zt9
z25a}E#(kPB#`n7xpU>%e{95tx6wfpAkIKytAN|y{I&$0QBVii#r$fFZ7253Fy))5Y
z{P&;zV%CfIK9!4}^YcTJ&CYpo9EO_Pen0ti<KAzBox4-(d%xHDW}eKvoqDRK(tLh|
zrr^qy9{ac_lZtcpZf861e*JN$MGM=td8QRdpL{x2WhZZ(_EUcwoBjD8CVS@?9CoM5
zX$jnE8~*Lsz58_BX4P6>jquY<`@X(8>;HUtew^t2%|Ap8-RAoId+>3#J3D*+QVZE~
z``dDlmM5Qn7Qa@1*^dU_zO7SruNT!F-{!M1{YIJP^GlUFn*ZOgN!8laue<Jw`eMua
zCo6s&x*t3@zOJ$Nckhx-Kfmw)l>X!U^6S@q=Fjs__c;{w_Kd-uPk9IXz6qKO9iQCK
z&d%OEW%Ar2{_fyD-4A|>lm1-q{(e+=e@*e8l;DY3!IkgD|JMcm&03e)eSYUL-|t(p
zIP9vuw_S*qpYiucwB_ylSJX-sBW|8dFZMrkDemJu+i!Di%Y?*som_RE_3{3FMZbT$
zYnDD`fB*XYpF>;L2CPZHt(`q*?FaE~K{pe49DK^QZU4UQ{EVw6dn&Ex{<TTAUn;gZ
z`*!ur(#KT?zvZ3M374#4aCj^(wA`jdyj)(4hu6>U-Hqx~?LSoZp7DGBMIl}K&+Nx*
z=jyX>_WUaPNBqI#M*)^Q_RQp3vu){lqwrVp67AE=xfy?TX<CH&I<87F7Q8i0u#C-r
zd$yN%jk^!a??WkHj#gRC=imR%!c2Y6{5gNF#{}jV)~%g1b?VB=+a_Q5*3{uXr|V3(
z(i2gM=O^up@=w{T_1Ju<?h&|B+;b$k`~0U2zJQ48!}6D`chu(8{;06rJM&yWyU$-;
z_vT*~HS_$R+>f|6StL5*^2w*_ZQmugoM+Q_jNYbL-v8=-@_oO=Gbi``IzRdF8_AEc
z3uEe1y`ElIKY4L|Ork^n>N@wjM+U0f&)s;)l|HlnVNpr(;SYyYZ+|?#?MJ5Bo?Sxr
zo-Cc0BOe@hdpbeWrthF}$xQz5nsZmlzC4g7F;Vu!?X62~o+(WK7|>d>f6x6ole#T`
zPhb3YPwY7Ro2Q>1J<C6DvghmH51+Q{AO3kYNuhVbN}qr4n4;J5Oi4VxH~00$Yuolt
z7Y=`MwKl!~?en*Ln>a){>*t;`<~k#kuvO?oPxjJ-_Y@{Sit*$P+rMdUb^oi`t~(|f
z`A_=c6Xfc2@NHP#(Y?8gW&izs_1^n$$B|!UZFgq2JXeoixi~7WDCOj)$2V4fSmJhh
z{r-@UNn1EK%kDnSc<O1%x2d^Lo_=YnJ$~=!rmkSsHRn~EChpBp*LkiNdis&~%@sXf
ztFN4Uztmsri(Ibfe48qj2jyuOJ>}o*c7H6ax9Iopm=8bHR~jBn|6=ji@UP>fmnEAn
zJv_ei$0_6E_b2$p{}cG#>EB$TxFc>y=9+{`?>Wt;I)M?qH_vS=Yf0cas(&=?Sxs8}
zqgDFleb3}>Hf}wel3}%T?mb;M9}%_V%>TFxEtVa-_Dxw)`1YYkRy$<%W>(0By;*no
z?yQ@MoCjO>)&J=~l=AsU`2UTyAqyYmZQJ&7?yVow%^#n>-_tv9UBlOomDgS^Zx*&Y
zH2LFO_t)V0o6W+l!e%Qjm|A$wy_d6+MgPuPy*~xVn_s_7*;#M9NA`YA?H&m~vESVn
zYiep!I`7vD9(eh&{pH!vZ?lj7*zeviTmQ{kdS>CN?Z+3ty<|R5u^~x5)O;E1Tc2$U
zmwY~#_+0kUj??FNg*d&5zt{g=R?o24ph{;+$CK+1j#<9t{&sO%Pf(fm<%zQHPAm2q
z70;f{^ZDZ03D;kq)&0czd&2L~@B7ZQ8-MIyb+plNqgVZbb)lQ9XPgq0|8r!)?ZTfj
z)vuQu9#*sV+o<r^{dkYvHn|0@N8cU{`Pq5=$99pjXIhLi@9zB7n9}|z=fc(S6tkDF
z*eCVQidx9J^~|5g&sP|nx|}%E@QbObMVQVGsdM7?)4gZd*IUlNcc<q6R7sPU+~05h
zPGO%{@aW|EdH$c%cX|d@NO7G%eof2yrFgv2!(X>6zNEIlF8Fu%l9!x(u4muEw%P)g
zJ$vt{+_vA7;uKrT@^Q2B{S}9*t#^vl^}avyZSRBq_im=1HkjRSmu|mNc3SR>SK{lA
ze{TK4>sa`YH*r?#;hMw#)9e3TK6U?4{kgN3|IB>+rTpcpnqtej8>ZjqDokEgoZ!36
zd)d)<YT@i*Y?AHr?a9Zk)Kq2j%DsIOQfn^Y!YjvbVcLAxow@Mx$GZvT+s*io9<U6p
z$>NHcTYu`<zq|t)61sZrn=kt9x_v``|I__<HtyT>c498uzc2Uicg)S2+FxK86UlHc
ziJkAKs`T>$lbw%vitcSXd1iWA&7OFRy?u%Lr?1IR`?1GwHdojkpZ4(oN7uX)IwLFo
zEoGJT_ZFQ^sdqMuJ=!1NpZo2+;eUN~ozHC>^V3XZ<ZmBsoVj~%)^pFF1!XxAN3Cbn
zTGsEnBia3$$?T@j0&$rM;da)i7&ZP+Q}E9*{<wa(=e8ByqCeB>_sJO_o%O2Mev_*9
z{`i?H|1LJIUUYDu^0p67hR<_+kGOo;|NlnRRmD3;18md89?iLFyK4QZtShYs*Ov?L
z^E!U}XOwL2_B;DbWA}+_>uWL{i*fUeUURZxb41>}AmfC%hf~)_JpD4M`u+2tt@W!E
z>VM5UICb{X!jz}e|5d(l{Pkr4$L<gRYZF2Z-hH}UQK-Oh)v@i+w&TKThh_M@0z@iu
zs<xk*x0&lq#Ebs7N+;Yt9GYhpc(foyPG-)Z3IAgr>|;NA?w{$bg>Nn%JQ*)(6N&vO
z{gt1;E;Pb+l)lF0CHy^_Ndn=*=Vc!q3`;u5x7m2n&kY}L^KqL;TzA>VnpZc&X!e(H
zNmaUh7uzzI?9C|nG;QwN4&BoK#ut^0eB-6(So{~#Ny}cce^;~c_j?kym4|A5!pdU5
zOuzB$zx14nKU%4qa>Rnz3@SAY_S?+jRi8O!-d>xBvl<>Ad)c$`sJ*4&ftq$-KIPYu
zR%<1vJy|I9N3O14c<1vsn`WMm`^={)*_UkHJo#g*MDUr%@8mqL<k-b7<aD00+I`CD
z&PT~+7fVim_?i*7n9FhUa`(x{Grf-IEbhwveP63YamA;vD?Syk`Z2?|q;{v2Uc1z7
ztqCuxIs<GL@gMEHqPeJ3P44Cj$6$|Tnjb8DU7b7FX5E-rUAl1&zxox{o-bks54a<E
zW(99^y0uw2O=REPbJM4#r=BSFp0(9Vy!#^W;`^&RwA(r(+BxG6JY4c(_Z5TfhgYxu
z$rZ`5N@(rMudP{+ldF79QmZd4UKJhPud(pfkp;dXANOv!u+Zzh$cNS<;byZyRlUN}
z6_>2pY8KuB%WBKbjeYt;mZfgj&6^8+U7jwts9g2s9HYHX-$%7oo08|)g*M8C2G;eN
z3x>{lEcaHX+{t#)qfZL?%G%Z^Y)@G}cp=O3=ZcR1CpXPAenp?Ib)7t(_CnnK=hHWQ
zg_9;{dc80?dNlB!&*Yj(lfy1t4Sw4gYk6w#vBfbe;ZdJ2emM2$wC1BN&lexfIh8YE
zS@Yf%&pueya~z)FJU4Z|^9Qe|9V+SVyvGl}nBkkcJFqHHpCfmv)4Z$Z%Naxyc1O4!
zcf2JrO?UC!{<g$fMK3xIKGLwAb2OujGc~2}@juINDSfhB$EPs+@=Uu?c5)+g@tiN`
zH|iI^39?u=XPV~myqKalO)}MG|7F;Xj?1+spYohjB-5gLT*x8+lDEHPhMcZg`}t*)
zpVm|bZ?|}I^3xV|Zu9UxE<C~2>H2Yd&mBML8*;-)Y{I?sy+_u(^I>|!z5jjf!PTb?
z;wn{VPKxANFE}^6ZqswsY=yMue=~boH~&$o_np`<<5W%pciQJ!Tmst@-|xQh>`d1u
zQ<XH~U#B)r)qefN;mo(Xtj}2%J<)+b+YYV0Znl|WyP|t@Wv6V%?R)+?aUSj2D?q0*
zcxKtQpUXXB8WJ{_Jt^$}hGXxN53bhO?i>|4{hapkpRTd;4Uzl57tacRpLpk!m+h9R
zUtioQTAmpv#F2FE<@`v#!<&@sEq6<#)$X!O(^d}^Zn{xgeg8z<IbD7JDWAF@nk^`P
zop$G0X@^4H@3z3iT~j|dnOD?l`b`tbZ#(q*bLZ`C@s*7)xkb<KeXJRm*g4-hq~qbl
zk0A&C{z$#4)^YnDqp1G5BRikIlM>o4)o@Dlj}z<mm5v*$kNl4_)OL~DYAX6AD*o7M
z|7$buHybTpbiy!xt8SCi!PD=5e{A_X{igEH|I7y!BwbklY+D~B>-8Z+HrY*ir|RVu
z`}Z%AVwfgnw)n!7W!?F@(`=k(x=+|wC%Mi?DJJ~Ox}X<cAx-|%pDj9YaEUJHn2mNV
zJGnU;b^=RG1hU_1thteX`S$IXN2-1u{%-Sk|JzM(+SAw9sobCPb5qA7o9Tym1d}yu
zr{$cVyVqj=1(}C-H}^j0ES=hawd`@m<9wOiUp85Hd3WZ`h_$?RI`c-|(~RJJo0_$!
z6>sx>wsw~;e4Zh^_vyZCPbcKMADx>l9Qt#v@=Ps|bYHjiakW*Stlf=5qqaM5n=4Y@
z=Npn*-uESUX{lw3by?l>8!jPr&pqa8t&Og~t?Ar8YsIN|GB1OdmcGunc6}2d9C&o@
zV&CAcjn}SDc<XV{IX5M>ywB|EF|7-`zHOiD^(A1jNLqQ{m9?Tfo-978dAPkT-1x{`
z<(X>zK9i%{_)RaX+_$_G7T~|t`sxS8-G2?rKeX?3wmZYTcJYDDpMNN_m(H*b2^D%V
zm(@|w;fVrYar-XbuYFAmcoec0Y1yAS8S-*2tD~gD6_?Pu8IxCDvgU3wYFN>^>WzVV
z{_24D1{_@si_{i<Iy}cJbm6@~fhmkGz9FgYmbI(41niR)VRZ3z5pCb;Y<<SrwnyHB
z(Iqz}wSA|vC709Q#R@A}1WdgW%Vtd8E@mrs<MY#qgd>T5%R1$_-yAK{G5BP#eC>jH
zS^TRRUHpD0zI()9JiTT{dz3q4zW!XfXL_#;)R&92RHZuxMLhGpc;ESK#}|+H8XjJ!
z_jIoMW1t?qv|LPOY3e<Rz4K+CrL6jLu4&1ZGqYEm;w%2Nt;^)H6W8fIohy9(&Z{j?
zpM3f9nrr5kwzf~dxJ2Ea@ZCapQkB5-A8ISpCtum@`Rb<1*DL&=e1pz|1%lPSPWh<Y
zr+xg(S~jK&pKFwiHhli6n=|vd@h{u`cWz92d4=Eawf$LjCH56ZCr%MiY~?>8^IdM%
zHN~^)i(V|!IeUEllAjJT-{t0kMJg5r_1S7pJ>6<~t^enH`?Knc7ChE@6Xf-DlEUtZ
zCi2Uj#Ul1++8J7=DhO!xFaJ5^mfxc-|KI4})tNtIj=sQ$jA<sP*`ICwzo6)>3Rt9L
zN2AF}(8|CGMSErD&zPet@S$RX&T;l<TfYlOn;%tQmd<VAH}Mg(@$LG!d1-C_KK^14
z9(rfC@t;}!&+u-3lfRGOcAkoWkZBK?Ki~SzxOVn^;me<yD^`Tgy3hQ1SKAz$y<g_d
zm?wLndD5pZax<d;&e>D9xjLz88H4?q({JQv+}(F@a$b?Y)5cEYDU#POi#SaCeg5p_
zvu{0LXmrV!&Man1+g2{IboQ;u83$Hu_`vt{jMVuzg7bWZXWDkMm2^ElGq1-rB#GZM
zs_TfH;@<^FKJ1yN^?UKjt7|nj&pGSxwb=0P@88FB>(_`+)?WQ}<>SYH|JJ15xW7my
zHTh}8`n5%Cp5HAu477W^_nP<Kda>&v`dj7Qc3<(n8*<=27=;^eS=q23jONRV&Aq+<
zMC`&-_jIrR)0^rR@Rm33NY^Lvj<A=mo6YY{u6h0ULC%KjMcGH+lz&y8`e6TF$G0c1
zKZ=VnG0|VVT<P0{HNt6yzdYqED+&u4`^<i%^1J6ZEWUp9;^`g((Y;D5HW=?z?2F;|
zT(?-oyxaVZPeF_F4aj03Cqe5;XBKmWXK1b#y3;d#ag%lX`Ohg9GdHE{>)H3FPkr+~
zCDqvFrF&3MQg{+`!qU(q$9j)cc_no}IC^fj;=$ZDhOLr!R08wbjMi*aKI_>KB(P_P
zg@bYZo1ZU=s!Sg-Dz{F)+&{G?{prcw=eD$87PbrGwQii0Ao%3Q)EGm>6&!9dI~UH1
z5&U<fvZ^rZtoy2m2f{DSW^*fBCT_XkL-)-J|EDG?n~e8bxITO=()!%wgf#!MH+yPx
zWp*x<yl{DL9J_md3d@%g_3K9`N=q}@-sSvOz{2d{Ec~TJb!K~XQen&V%!h0#hxvA&
zV_{sqQb{9=!ED~{MKP-nEVEv_vENvU>9)+em%AR=rCdDld3ML+m!K*B+ebfKW>1rd
z*LimMc2i8X>+Wa5F)Pp9E1k61O*bG!qnL5&(vGJgNiB=ERE2-YFqh*|J$oQ7+$GuU
z@*9Z-H*=40sh(~46m%rm?D89_1(q2tyIIf5DKvC-oJgC+>ri5!X`|vbi;-t#hfjz{
zVx0CK<Ac5H=1xj@pb~gQT#G}GtFC;B#fFI@%mzV%sw)=l&{%o1a*}laq)90ZURq6m
zMO3D5-EKX(N5pPU(zo!7DTQ(3tXr%n-^tiNRps%QP5ZkvxNn|bolw3^V)<0tIbqK}
z7ISr-j=DD2GtcDFsY#10mY!MsKtx5Hb*1%d?mLCNmA)bybGW*euDUcg^VmV96Qzqd
zJhK=442_fC^}12^5sN_40u80pQ#y8rt={&z=CO#$6R*G{?WR%cZXS6i-@PXl9#`o9
zlx6a-XF?CN`vljkAC}zmIQd$=d~4LgYMvXbx||-oQ&7DY-#FiL?Rm%ovZ<jW%gW~0
z9?TbjtRM3_I!)~L+niSm-(+5A{hK-Id~HRj&#L#Udta@w%XeS3SmJ5Q)1&3SKkmF;
zH~CJ@jgzUBy+7{kz9fBAWB!I*<-HBLcHhr^Q9JR|)r#?U&AYoVT`gNHC&mlgeSi04
z(VRnj{;U_AUtL}mXqOl#aiit@UhADJEck94ie_Axn{Z|3!EVmkpLUk3&b%&gOz!9-
zmzrOH-o7m``eQL`dfc6<!E3vY-r&43)k|D9QQ+t|ttFaw@6VfcZBJU^bKizt)3?et
zGqS~&J6_@`efsL~*@Wk>$|BZ8t~tgR`S;Pe7mUm0nT#3P{KAW5Lu^>|qjOl^lq}nR
z^VAe>DQQOQyDweOtzXE{{O-#m5!VE@0}HHoT3l8#5J|W&H%=yu{|t*n$#p)96>>AU
z3|{yd@U3Ql#>BI0(i_L?PFxa-8=k*8_BE&Qe$CD~_eJKcj(zLulbY^zaUy%*B;SJK
zJ1Nhv9-GOx@Zg80b*JZ6tdKo*+F<)4DRIv180HPfj%GF;>ET~q?69`oxJlUAZq7T#
z0~ULyN_=`)0$w6jV{!N8QPz1k(`qd4Ca(@OILLqd&z`9_Ub)$?zaH!UV?w*2o&2N|
z*%tCos><ftK3id3!M^EfY4hS;=aQSc&lSYn@s-lDSY>?nEZ6oWlI2s|xcXlC6nE^p
zTDIV}$lV7k)|s%MW%KtmHoLRX&|=l@Kdfij{3BBtC0}0<l1^<%VD~gIy0TE$<P^)%
z9l383nPsDt7W)MB>?$vxAXvAyF;Gq8*h=%9j(G2wDV$A#g-m=#ht`|wfK&(bOFp<R
zCYsum5OScqneTlzcbAc)k=Cvgj&0u)lNRj~p4+lRnP2i@J8!3v!R@nV#f}z6=hmAl
zojUUGz{1p&Iq}&JQ#iW{XEUEN$gbFADYt6k8^~$m+;Nv4yt-j`OUQM8Mdz|DL5#nz
ztH(W3SX;RvHMKP#c7nLrdiM`MPCm5Iop3<AY^l6ma&)ofE-m|0b@gTD8~<7TO0Zn_
z)T;k(!{7Twx!1MlKQ<NH_QN3hQEb?^M{j=D&-Kp_M?XKjW%I|wcOQjqh^YDWFt28_
z4a;)Ie{T;yw+fAX$zJK#RV9IaGHmKbyBg8f+grFomehBO%FT%g`?Xk9w&Gi3@q}qL
z_coR75Kgk3^<m--hnK7K+k5`LeEdavV*3C0uNayqr(Zr=v}40O-u$-h^Ox`Mbrqd(
zm$`D&=O~5GACLR*={VXx`O(){uk4zJQ`t*4|IR$pZY8HO^=544EZwv1FRzCGGq3-B
z^4k8~e}63hFWLR_QC1Zv_uHdaUsP3;Z{8D8z&ihB>>~-Y-@?D_ep{#1Gkx4V{qI@(
zk2b&W%iQmdG5^3k`|rKdACITq<vzaEzTC&_`LwV3;qmL{MjsEgE4PhiH_iV4`N{0(
z`Sa%f|NFK(Wct3pKYxeo&yQ^Wd-!nqz0HRYKYxCHt^B$8{hR(U-?n<b@3G<fdB)Jm
ztn9pXa`S4E4s>RJ_&7<kzs|4!ms`pzubyqlb6I<ME<L)Ou|+20(dEaE%PxvvQs2IK
z^~VXeHJ0+dYCk<E%Cb!FKI)LMcgn(LUM^w5no4o189xduZ6xdD>Sgqne`c=p|1jn3
z@lOeswWfcKX4y;YxmoXapH@+}XGcPR)U}OUHy_?tZZI#Vx30c;@8(+TzwbYuJzG%y
zefHzp^y|OA-Cq0ZdH2ndD%)B4@8u59-z=PL7SlH~=>EN}ef_#07QXCxDEm}<Uyq%R
zefoT_FZcNB=bn>1xcOm?VU=a%yD5A4(l_s4dewRLpP%K%=Ms;-*?zyPe%X6V%WXA3
z-#(tG@%+rZX_=CD^o}h)xbACjf=k`3{Z`fH|Fa(NzWKmWS(ULm%BIG2-u&Jplj9{g
zFYB{cO0ET+=UriYrD)c_kNt1w7`(Rb{-0sHZ5#jgwTm~sxRSKxPr>#WKXvYJ$4*|I
z9{ajJXwjvIV&=#HY_FN}ecBK4%csk?*IbVAf4;r@`!{{|#j^$fxBmFv^ta&Tf(zb$
z%||DwS9cX2DtP|m<fCT~(oBBt_)}t1_obuXc;CIqJA35+Z;Gz|{A1eNH>|%OBpB|u
zx#!24_`kXMLt)L{+AXHLBA0kK{+>0v_AS5JysgcNNmjz9m+nPJm-O-P`0~;7{=NIp
zY!0bJO=~j$@zK5S(MS7BCmr}7Uux4_{*FJ-?2paE=<Gui_1?Q2*>>T}H?zMp74NgY
zXV`>1IdwQ3HaRs@F<9i2uX#z@EDQMD)S{GkAHPm0Jf)(xw!F+ZMn`|gtW<07oYqg<
zr!SiF{K>m#ZMLy*isP!v^LK_{^V}_v6qNJ*<kO9Nzb6)zpZ+KH{_m_ylP+(YEuQS%
z>7knZ=cCf}Imxg0npW8DlJh?jX|mzlnuFSE)6FwYA6x!EdhNk;$@yx9`Rae`K7_k<
zl$!0G9p884e3CM6ou{V8)+_e^BUelfDVq^@Pg1t#r^&uQB{gr}aZUZm`}^$MFIhEb
z(<(o{<+dwiPq*Lm=k?E{ua~FWzkBy?)AbzBc;Qo5H#OwjR)4<y^X2UDqu+JxTzdl5
zC)-#2d3N#O!Dvmt<9E+*Yya``#-^X)ue&wv9xVO5ZPU}JbMJ3V)BMJBTkm;{Rln-f
z|8uwcxPIGsbn34Zljr?1qVYefSA9OMzoBsd#1OOp|HA+A{Qvjm*Q}S9Kfmnpj94{S
za!T|)-5VF}9$oug@#*7(2MH63HU+;+EIhT5^`557r2kbP_f<Tap5He;M=K~->;2zH
z_x)GJpEb?>XnB3d%XwkE2h;OUidDU4-u$LsJN@_UTTAp<w5@;Uyz7j-rG0Pn@qL?*
z`yFyJkNmnb;m`H(y!!tdOV|B*Q2Tdg{ETg)U0-vmQ+qdy{yP+=CEdf=aq`@^Z}-Zg
zrhIu@^6hia-zm2~t;>C%TDJT(>+Ri|n`2TxFf#PUd(8QCA@)vfgh7DC&mGC{HRT^o
z{$gZ3_j2=`+z<JE+spRJoKd?P{vp1hzuWoggHLH%8*WXrI~}vKK2av_o-WG^?PU)l
zOj%b>I_r`V&2~%D=I%O8-H)<{f^WDdUlf1+vc~SuuE#g#6x0=ciZ6EEd-Ug4uduLX
zez*LbZgVTi6>1sjPn!^)Fh~9WiN7)bXBd1s@ZQiV;Jl$wzpmZs#g-0<Z+YuI-anYf
z{rd3nHGZbS^`|c`u;ZKmT==K?o@sjzi0w&vMZqLg<=M9v&+;DTo}P1D{`RBgH$S}c
z`lBMK;+NhiFFn<H*#`@@^A}R>?kq1^RknnAcA`s}LjLt>pJp`29CH@E^!HQU?~6Y!
ze$#iqT^%hWzhV06?%DfoFMqi9{qX7g`*@y*cQ=|iEi?MLn>%NxQ9zsQ_ibz4qi=tU
z^NU#+{(Y|Pw)xw?b18+W{3*3MuVLWbaMkO8@w%yO)y+O##j2(ee@~UYyS_SK?BSEs
zH8qcnJw-WLw@3e+%5m)0!~5(1?Yq+Nu_izL#9Yscx=mB9Ry|d9pQdBoH<!yl%jEAb
zZ&y{%*#@^a?v_~)<Ch+P(=E<V|3>+nx%#UuLJ$3lQIfdXU3RGGUC>sYeN%c*t=QuA
z_D|feB~I@zPWy6lu{%>;y4c(=2lrK**gaI*wf{V8fBhsW;TpI8%kr1yRc89BYs=Qn
z>0WPB{D=4Dm#6$2=l?M25N~?jI{O&cwCzVMBMu9-UY+nZC)=IlSiqm4oV0W4-&EKA
zD%xK9PFp_WwojYZ(ak@JKB$|0{TAK81FMVHXVxq?s|$N``@)NtToL^<vewpFSv*v>
zk-T5GWz($3+m3QdhrIBbeWc?w>p|}Q9|Y=lJZ8+7*oc49Nm?%C=Z%l)`!`RNTwYUc
zb4xE@*N7$H&Ei+bwk()?(rik}J<B(HoMp;?Mo#zY_<Q>I$9;!YmkGM{w~9>sBX!4O
zdF?^FTayA$<)vC}dhEe*H9Re^cyglMF3C?bw%k#AE_(Ur-N*N)|141Z7r52JKrQSg
z|BbC#W&FXGkDBLKurK^%`R$s2a+`12oFvC%{e6<PIkpbm-M5=peiH8gn6LTfOemAl
z?&7b^C;5)vT(ElmiJVJU`BkJ%w>oiW&HQ=%d|={~<%f-uUu0($tcfTvougl;H{GEA
zUy<G3oj?C+8)sY+f4BMjNj{s0M<&m=o&W57(c~o`Oho4OuMKUxq`xoa(AVuBU!3N<
z{_xN4rBiL}ZcUPL=KcMEqoR7J=eGKalP$YmaXd<Q-xt{Wy{t&{kJSB8u7CE==B-B@
z&h7Q}|M8XD+W*@O&TdNF_i*`X`~R6w^B>wjf0p_0OyRHHC87Iv&hfi(I=^*?;Z@5G
zYL`_nCzVfL&8*$rbGZMoVRDw;-mPr?Wksv@Npmb>>t~-c>)^Y^jU8-1@;2;_p531G
zV2+lZDeJm(_NmGB<_RJ_V$%=b%uv6Z`)2z6Px0>};%|OCVa8nl>wW$azpba-cSx+$
zVMyP|-2P`>Z?VO!m_jzo{F^Dyyp8Sd>CcHfzF~UmYku#VxaGdA+Ih<kul^tP=FPN(
zcRMzy2jAVHo-$GQ@w}}9|NmCyY_9M7S#Oy*)4ZqFc=5v@H}v?<+<6;n?SHC$bMj%W
zdk5c~{(1T7xri9?4JXr>_C9FX^XX<FpTp1XER{*KJL~WIZgP!XbHe=h=dUv~uZ86Q
znW!82^Y1B@kNsjXqP*W^H@1p*S*B+zsWtuod;HoezK42kuM9T}JU{a;ur@U8abn9(
zySX1it?r$>{wm|Pi@boRpvLb8k45qIX;ZKHO0PynztdkG+`iFkcG0z{2D2aSFYCMR
zt@&!V`1yRdX$_fwm?~}d2%4YR{IkSNzW)YK&DI^QR{Leso_$I=`QX-zu6V`Ir3o))
z%+1?=c>SsGn;-vL{WUS=W9YNMiO$((v-EH5ZYw|SfBEN(|Fa$*ycol?XU?YUeLH5J
zS@F>S-lu|7+D~sE<^K8iOvT0&v1Lc6)tN+osOPmm=YELIZ{yR;Ki7WEI&<$>Tk?zS
zJuwl7v)%qw?2ysr3wa;jr~UV4<+g0w>d)WaFW3M7xV`xF*4*^@?N_t<GOqr!sr`CN
zDBo^#MdE?W`}bD(sfD$0f4(}m--01MIOXm=-Dx$U&y=@a2``^M$8DR6x%nMsBRSnQ
zFH3jsJ0<>ElzHCs-wPwY-+p*?#in;Wo_g;jKAf+Q(TI=NvA-`C9-M7>wv6k(l21Y2
z(G3TF^`E*LzHiU=*urny=dYQ*^vsLBPi`*1_%y#~#q`NV+BVz%T`zXKp1ke&oQ(S$
zZ~oU+uaIHs-+QAf#d=%r+d21pzv+DYZ9d)m<BfG+_kZEAkgb*b93W7sZ^ZN|-hSJj
z6CY#T|9>@KtQf7Hx#-60`M%G2mc8G<?c6@SX^W#@|LiF5+*T)}|NZ&7GdH)t{rTe9
zvc4T+wyRRgbr(nb|K$BTLANS(=e*^G6Q*@E`<NO`SGjm%_UV9Mzkg;J&MsOQx#S1e
z>RCnR7ncj#bG!NM<Y{f%xa`mJFHgC(zuRdoT{)d|mD!cL+E4%Wj&Hvspl6jAeJ-W&
z#Tl_Zrsen6$q4$)vRu_JcA<IaB!B&@zPVM;9`T*yi<F#deWBf)r+3f)%5OKas+P7^
zJ=JgKnN~YPZ@Q0g)489!XFi#e|2%S);)O3gne%RHzwb|9nG$o^cv)rI`aR+EVtFp-
z@yG18-57gO+<x92uG^N^MMYyj{bDh!Tlc!_<eJ&f>lga)q_;>as){GAyHs(6%l+{r
z#q9L#?$yslb^qm5RiE~|z1+SgKK#d{kBa6C=PgwWdG_d$;w+ng`Tfd!Y}2PlM!x)g
zE-vlPUsaBoOFzH4+F$czukM}hm=CUk)qzn=*0thiSeDO|R{s2w*Vwh<!7?#@ITxo4
zW1(|#dlr3o)U020quWKx=4mM753O*Y)0dyuA3t|0L?z;tueZj;56cu3Pk2^*{%qO0
zkfSDg#=6hZiZzdXce_VNYrB1z^&wd5&*`@_O$@K@lG^D1oN2}?#z6foflIeF=*O_N
zKDoZ{|KrXH0-5X)zb5rD+RT%ke(QlpQ`dvGvm5>y$0_AcU4FvAf5N4MAE$(fTo!Cw
ze)(e3mYlfjVXk35tl{2n%b9}eR;(<z6Xa;7xBkSJZRc88H=OEke*Apz=NtcA!`UDI
z_?Ti_yX2XB%GTIo_9NGCW=vJQ{(;F+ov}|b-cHwmC)QV8`Hx%c`DsN;Ojli&#IHHq
z@~rZR_lgkyCCaSRUpim=no;sKkwar<z)FkkFUz6>KOcE48gfe6f0FdqRZpf_=3HI(
zv7+YKiU>aS?^QZZr>nkQi@K(+eS6xqj6+Y7Y<}+8bZ6rHNUKo(gQEVzT8j0rm2N*(
zvS)8CUMjKR2IKPdeEoZWetdcVv#of${f%u&${(JGnK_<xFUYTH(UjNs^S?hQt*5|F
zW(M!a2xj?*dp`;;t(mjW!v1gd$@b*KH66#LessL+?YDUP_|4nZ)1M2;cYPJ;x0QMN
zNxx@rxPOoS<DV<)F3mPrwKZXj;U|M-zitU^G+Y<8w%%w*t}1W0g1|o(Ek9GUTn_f5
zyA+li&MT1PS2|#_P5PFt#{Z}SBi<)F!wqK2-|Abt<(A3zARXOnyP5tJOBdVxwAmvW
zFZz0`mA-P>kGmgzg0-u+HEh?;IK0vJaErRZLmu7qtM4jy6nNRBC=?jRM#xv@MODqW
z-n)(K<;f@F4-SPF8p_wkBr+9G^7`@e&6b42sk@BzZ=3H8-WYi4w3~eK0@i>vTk=eo
z-Y$I5$$#XCe%hry>x2HtzpUwBcV)+wjZ?qn=Js6_+5JIg_e~l7w55JQGjhNF+-n~D
z#a21R=%Lc_Z?ARxU7x?3QXTB>r+D@1)TIBZUc&jV2ckN(tv$Ivy09Cw@B8}pLs?l0
zQ}M$4Ee#&;=f?k7+hnqP-^`n>p{mzUn1-HAyRqcdrhS{&{6Bv|FvWJ8Oqz1k)SsMZ
z&h$Giy{WCmYie&%wr}-?KYyP5pZYH0q}ccPMGM|Ns>u2Fx9+NF$&vR5vL@GkPW@3j
z(f`-~dn@a#Bx_}2YgK-T8koi0{cG8tcc9*8rmy&xjnQXs-xcM4aC|a<jPdhin{8?0
zNzZlM{%_sNRZ?#w8UMWhoq`IBvE=S(fhFrMsh;f9zMEdcqAeqGRrUYv*-tNSoDdP2
z5F4Hx@Z-xf4M(fJM^9gJ{C)TP2bF%c@J+cpK7Bl!6!LdZ;nb>F;mIeeywyUt?)Uw)
zL7O+D;B!JcTYqigZ<n7B#Tr~(*RDTf6d3`U<vjByX~vY>%OX{`Ts^H@_%`KH&yk%n
zJj@)C<rQswzsugYM3{>xTO3{_rmiHmOK2l&lrYjXN3!G&`DH7mXXotq-F9E?cK+nI
z+fRPmUB67OW?TI8l+vATty+<LgSIXDHbLWF)Rg%TLxW~pWi*uD{m*3X6~@l8u4JqK
z?u;MWYcG6KlR9G*^7Y(`R!?(thQJB@-#&*N|M!*`w7J-BY4`fcrx#VP-6ZUv<@W6a
z!<|)OvK!m;1XjPvI`n(b*Ax6Vp2f*-Tz>i1mRs}IxW_fHW%(Ygdb?*$S=yQ}vtCXX
zPkpcTqjJM$$ye5AW$mh;1l&C3;i`Lqi}$PS)MXX7mCNru_y66*Y;xJTmOW?c)T)f?
z)PS1@{9M-@<0}oZ4*B%p%c&)sp3i;6t+&8G@P1}i#jy$D>wSVsdlxHquI4>@dg>V&
zzrCM4uA1o;%vi8*am<O<O`4H&5Bhc+IZdAFdw7%Y;Z63R=U@95A9TO$uA$WLdRD(9
zTgtcopDyg0xaH;lt$p_Yt^V%6)Vm||_g0Eg=%1Tg{@y}EDonXTjb@z=vt1VWDqUFi
z_BtBc#U7qr=z4$s`}bm*Do?bx9i6$tFj26NLCraHCX1Ta;iW%hf9IUzEl#?uuh@Om
z;Ar&nYwmGD&EoGwoIl@iQVZq%wBpC)GPTED&%#m;FKxA4*FIh9)6LUC5;+EC%IoH@
z-aCCkOytk<Q|G*Ho?gW}^+~?gZ}pG)_ndF5*sTc(?6{)4^3a>Z`IDZw^)1x%%zLuv
zmP#tu*OynX)@+F|_*!i}=c#HbZ;4lt>(njc>*w#wRZ{BRFxyZyf9~EbJC*&f+!j<X
zRJ;34uUBfrxB1c^w;B7-x3_=#bL-q_y`6!Rt_v;Mr_XX<{Igd3d+-$!`}CXcA1}Xr
z^Ynl3x>%n5efcZj*W1}zFW;x%c>nnBReNk}o$F$k&YJke?%un{cRw$G?tfChWvSt_
zt<&P{ZLRCSKD*ifr2J5k<mXN9{`F}cbN@I+97>9t{4VxuD~DmRgJE$;(z63a({AjX
z6ML7>)8<gqG!a+pllm>Hx`o`Hi}wkLZ9Q_@wfC1@#5JM)6HH%mCnkC~#oXw4U!0ie
zeaPv?3jLN=-OiN6#ruTCwyEf~^!{>+xG`yoz_v%N9Ert_iN&3Vo;4kM_HokQ)(tyV
z)EqNE=lD-EyCv;d_&FzD%>0(LW98?Hg*Tk;W$3f8o_qY2)4Or;Uco6A=lfJTmG@p?
zcGb(B72YB9ws*mqrMj<EW-i_<B4TxZW9mYXDy#E_DJzRFCOvOVdM<eMT=P-CEdjzw
z<(9jZ4LQAK*JsT1l>OSe;eutNV#yWpLq^YCcAg2m&)z*pSX{}yR#B(WZ<4pn$67m`
zf_1SRGGALa?D<$Vd+DCQ`<&ggUyD6*t5wv=T^H^V{n07n#-=<Ur(1E?dADD2bl!G5
zA+gwXW57nCH+T6uy(8}2@mRIkt6o#5C~wYHlcoCw#4N+Vh=^tf?i1WB!M8;sq~!hK
zqSrg0Ch_EZa@}iZz5ZFN+p#8-!8`xj---HcUt2ePS@u@)@==X@9g#fZQ9N3|xD!5p
zPpUMu5t_Z>Pqk;RVTOJy>y7P8k1p6NFfIQ6MDfFi_1oBW*+hj|HvIWrw^5>dJ-5*G
z4S#+YZB74Vo%r$V=R>ETd_Q>Twfj*o5&a`NE&RGI{xKZ_)BYZqwp2-N=d*-|{Bvf7
zT!`c1&VS$)<XEk!v%68<+qEaYhasw`VVA^)H|z`dNN{%gM*L`Au}xyj^h1ZFk6cQ+
z5XZrtKjB38#0TQaEn><`^w@O%CRSGT*De3KCh;S`cDnh;xq>?T5(`U$@3V8~N6fo(
zlw0(>;`BGqpJp7qz2@${y0h=g`dk`5JuNX3loY;pH^p+_MzKGMa-AmA^}kG<a!5)s
zW%h?RH!shR`}5_??{IyVrCvtoEoZJ@9<KcQXbU@^AZLTA$BZQ`d;YB4(H<o9;f*l=
zMKQJV%GaHnMLx~r+QZX2ZK1%)UCT1G4xC=l<rbL2AjkUQH<$MOKTaEJo5iQ5+5PNI
zkZ0A`dRy~JI{8O$>q7s!M5g^4wtQKc-;?{Jw{@j|-9qMl270-*pQK}d^ol0W{}aSt
zmw7Sd?bq}FJ?k}fOdct{%RGC^WuKtf>@Qk==ksC%c|$gvwyFBZOyRuhV8Wgp@$S(h
zqnUr4BHlduWHs}TTg1CbpPXj?I>s_>_mUk!YWoGI?Ow7cL~Xwyh#v;x?_9DcTy4Lg
z*p4Md8-40Db&5SB0(q}YKjfsG_jKO18o3kZhmw@vJ-PR?GB7NJ`D*8+hDpzF`>mAn
zIM>NC#d`mqNsISg*yy<P^HOWeU)qi*KQHwL(HB3Tj<)<I?RfL^(rgg_;pfxUApXhE
zOS?h*ou5~m7k}B_wCTBZnXjwBeJ=0*9rLQAijOA7b8=63e9Eio+1=<sp^)eE9v?8$
z$a}G4n!>NMGVEdwg^uc5Sbnx{_|eI|E5viceU9$=I~IADvi$7b@TJq*YN65z{gzh$
zm`h8gn*O*&d^@5$H$dQt_@N~AbuaF{+|eq_E@oNi9=?M8lXv36;@U{-fcRI3oF22a
z7Afo(6q7C#|KWG~{+>lrE8e9YZ&mfbb2*iv>B;fZn1~NH(M|$K%nvm^w=`-}*e4`r
zdw!}Q%g3o3-c-(OQRv8TX+8frmBq0}Ri`#iL6PH;bmGO&PLhrn;$9wXdhTk<;#i}t
zQ}eQPF-UFeQTG^2yS1^=2_VnzD5zOpF1%@x+6r;SKK9cK-cQYHDmnb1Vgt*seM{6j
z@>^Ih@TZu9Om3{xSk3uJJCXB?vZt@WeGcyh@~5+!zIn+{bFiOyh2>-KhA*t!)~I!?
zZ*kQx$jWN^5f<@_Y5Ov@j{Mf6>K`CxI5g_7=Da0)w`<mdxQmu{I?aynR;t{qv$WG`
zaD2E@Wxs&f{smt`Cf(=gj*qC)TA9z2@RFO`U-f6}h7YYvmrnwP>7hfxo^^^kWr;6W
zs_YjO+qvP<N|pU0V!NR9tPK$Tz7bVg(RsbEIddkZT{sh8%oOp-rRl-Su)bgh@3@c^
zS)ZhxBR(nV@87GwUtpR|A!qff$&a?|5_rP1Twq#kp?lS;$^Rd<Z1~{Dx@FmZL9u%p
zC&iooI7Jj3ReibA@7L*9P64ss{WwnV-Lc2!>Zz^*r-%>9@o}Kg+1bmSso9a=@-$3E
zXkM18>l!__o32s^7wNAv@Gn(*HkV`C-z5c+m+y0U=RJDj?O3O%v*QuhXAxn8{o7tB
zvGetR{CQNl|6S$h&y{lb7B4aGedigNFL>{8`+eJ6Q7b)Dz6LovZk$|swVkIozW2uR
z;y`tmSp8+<w;qUwO=qo`biG2r^WV)g;c*`xcXs@mEOyIjoteN%)~oFtM_C=Wy>p-T
zCB2pZoI{xOgPUi+d@^s~zHT5M;2?9xRcyt~sb&^Vg@sm8J=4x+x36qf_$aUNv;Mv9
zwtB}8{6`-j{G%S^+q!sJ=$hgq`$L{{v}Z_r8+l9?daU+z@AC(0tX&#x>PL0g-7)UC
zu|;>&&mRTsp6N}o;VRq#9L8syDv!rMPuyA}o<G0htan`P+}^O64;;>}C~#7|Y#^K(
z!Z@#U^~ai$NX@R$qNdPk?_=*2Ic&UTpzdnm{JT%f;$iADMzsyQgif=F+~ze7Jm$Ye
z@A&uf;x-=<=~KpQ-Y!Ten$fHjv$$6B-nr$cFQx`g6u5F*=8kk|V1lX8jHyO`OG*vz
zeYDfOcD2BgCE|dbZ3aW5n?Rnb-qJ%yxwzLaTNHBl=8OIB+$MWx1h<}8dSD%klv73O
z39r{)PnNURNAbR@C|Ma8ccI{bc5-UL?yULmwI;~U30}G}&&N`k^Apb@ZYe3Aiq^x{
z#lbI{8d++8B~&^rW?cVe<Mo*f7BwC*31MITsv+jb(s=pvuFNtX7oH1zQel1l^S~Mr
zajv(sSF!S|oG|7%&nhMG<EgIO>n0P%rXyQ^GGEheiqu%=drO?DnM3G}VM}O8!bz1G
zQ$HPAR%$v+z_H1u_JR<fSY}h?iaP?KI~FK6v1HpPg){YX{Q2~2MX72*hk~Qjq>Q)=
z9S8LF*A?tuC9IU8ofmqhV?{`6*o6xn3Ln_FDn-tk;1F`$h>P=pR*Zr0!3A+Myv2n(
zCdH(gvPlWEEbQUjkh8+EQG+e*iv??U-@!dD%~7&OxgiQ(6K19|_i{B=1gx)H#>(w-
z(RlF&2Ay?mpC|BSeZ98pAyZ)f*%iB(Uhit$)3U9HJL=kEMu`rte7B=AYgE`jKj3M2
zR5a^^L&#L)%2`cEUnkh@aojsE);&Xk>y~6H8!xX@d>h-0-m9F_TS6a9UUp<lG@s6G
z_H&*gM{cEG-@fa@0mu2y5powUC}=JI{n{sBVq>#y+XXG=UY<op3mMM4G8+_JST6X<
zg;iVm&>E3W9#9aATbw8c1+lnG>L-`iO(qAK*lSm|?bUHT+_b{uT1Gqvk5+;2ZqtL0
zCL3s{PV;!3WzxuWy@Y`&;+;_1!bwwu9yaxH#;mdJjO8>@>p0ai_1e?}j!fd2VT&pq
zott)?nR4*0mX?yjRL-esAlI(Z<?{1X5)D0bYWj-jPfASo2sN=aGhN@3&8L&WwK;I@
zlZb~Yt-W6yUssvz`enevROeC{ytyZ#&@pBDRpr;GFBZ%)S~=TSo!g^OqU>zr)#yaO
zC7Y(Mn0wXtM%1YT(~KX@EIZq{HTj@sq1IEzXrD=9iJv!|v-~1=^ij`=mDg2rjLM^1
z&l<m-$K3toP|t}{fs1;&TQ^jCtmcsQZ)KI97_51q<3{A&mbFXItT$0!ChMJ$n^53o
z6E9}Ae)fi$-*g*UI}^>CW^Jg9Z8>W$tIICt*e1!Tn)rDa_w4)|n_0r*+bla%5}n_y
z$vbo{=vd?|!OMNB8@?G^s5(Ywo30L7sGGg-<pli=4@}OuE<KRlD##mX{5FQEJLYhW
zh->QW?uF`^ZOr=)yt-weoN5|<W!o#Y4BgaSr#U%&tlbXWy7!>RW%bj2TUB)p-pVj?
zcOA}YFg;f4s%s$ol~v5JT{3cI_C4QgOoz`2Zm6<4b27{Et6l5br98V$l$Xs_PIy~Z
z;PuGsc;}MY8)laEHLyNTG<%h+H_7i%+AT{av6bwSo=>hxbuuOzzmZ{F{rK>lkg6($
zvM}?+Y|YK_=R7iQSu$OF*1k+-oA+~%ux5woYfhK<32sniIOBTMJSee6FKc1ub&eY?
z49^x9^j;Bn_P*qFc%I;f-;8HGUP?OVYOh)#=}|Im*~u+=tkwDrpO3tr5O&*8Ml;Q`
zz(%N6!YGf?&Bxm3fE=HJa@^jv&0T{3D)*_RNn1}57Ss$4{Pp#gkAfPLPkH~}JxQ-$
zZDrih)O2U_Mc&)98BThw4OW$`WjnyDp0r<st9!?*j2^c@b&cz4l567*Fv)C;51X62
z|58S$ZReB?VdcpUqIOC9*JOJy*r|9)C5Y+fuaxA=AqTCLHpWjmzw}Pa!9vwnDY>z;
z4tl8;286xHo&RQ;hEQo%+1!K_5zad?Dtui`2Rb~D9qCzdd86r6_B%&Z_)a+;ertSJ
zL~+r%UDu{K?{N3hsVUO74Jvu;cqQ}Nu8?Nd_(uzN)J~YaL1Ts9*5f5i7kg~DHhM|r
zeH7}R@q77+>hzc+T~-sLCKvs15E1<Le!>*#4*$$|4$2$*ul{&(mQ8-WQc`$c^y2=+
zq$P)ruU7m~BI?SlJ-4vL(5L6xkBF{^$)O=CYqs6Hc+B9{p7guDjPk1&JxJWT)8CwD
zv0vG>Bg_T-3nQ+CuK6Nx>A1nGD`~N_9!{P*J8!F*Yn6oC+yiSm6Cdb#Y}_HVvc&OK
zN8%OB)3Z)7zuP9#?LDFVM8N_zp2g<^K;D`eEE8H~xP|54mL!Q%qfL5OKWvl=on^Zv
z;BHgmm7B+_JQ&`&in^z2cYd4Oc-Y`oO|tK)hs=gr(P0YTOP+fyX$y;F{k`b@)SDm=
zZ4CK-?{!OJO)1~Tby7|K*CW=gxi2>3GDzgm2DP@pFC5*Ey<YyC#xW;N;PL9q&8FpT
zi?}0Y!e=ojbcQXKh@Z=|rjtYD?72q~?;IQW?lL9ztoQqSRZYq+_OaLO=4mhU4jAsU
zx)?5eT;tZ(qZ{wIF3g=J=x{82`PZy00oUjq7As4#GiJVKQ+d34a>dqGLAyj()!S3o
z70(Jd7QXyV)?{A!^_}5|jeJwglO^Nl&RX5hA>#Wv>0-ziO`{kg)-;#PHk+3mc3=D=
z?iZiuE=H5fcP{%sx^MCz+=R);rP_a`-~zi@fzNNfdZo1EdV<og_EUS=N-y?UEe#Vt
zd*CdO@WpvsE}aRGKC?nNW2-q^#V)l)|1+1yCYkFj_M3gRm9-%Jm`lsd6S0zC7xq}$
zhs{p=P~qzm;JNhUV!26y>4#q_N$yymqO{2U$-YUljXhR>L!&Djo@Xm9a=rKP(T&*!
zJyyp<qxlXVHZ9az>ORZ)T6AJh_8pO?-}!2OOEbfauj*<XbCqlTacb2E&lgj+21b>$
z@f}&Qxvo^Ro!@1-PD|76%X1gMke=1=^+vk=SHba1N2W&2JAT)pC;eAh^hFWV!l&C_
z<t9Gu)i~z-y2j+>hl8)eer?-+q<{MXiPFAx-|jW|hplY0ZhXNev)J$S)uSv0zi%vA
zbJNe$rlGONiZy(8#*d0pZQFOz%XV{~Tw$DBI+5oNgSlq*Cgo+4%&9hy%LMLZm{0WD
zu>E|g@U)LU@&C1d{ZLyZ{KZQ?KGtBdpY1g@X}fsa<<BN(D(z-HyF$3v)R6H`n}y)i
zEAy2m*A^7G&5c^)ZB=8^weRNp2}`687@v)ur24Pdxo*eSA|<Zg(`%=G{n%rb91$*g
z@a}Bkz`#A1_C|`IUvas)^drw5IV-`ZhgZK{xb<U?m3TyT{sHzi8WM524tIIauPClB
zUC4Onxs~A8gW9$0zJBb<x4IL4(aTye@cY%UTU8au%w^xNesN`P$AaHp%ir}?xXtBW
zyV~hN--Aw$ef8}=$8ruCzuJ->o7f`Vr(S2oAl3K!k!0zl&1N@0FiPJrwYlt4#yu}^
zxp8(A(~kHmA&cg!{a@Bqs2Rw7S^eVlJeGAm=?1@d73*a<TbFm%Ki(k!j&XiR*0mu1
zidu`se!kbPxqdK|7Aq~ey;)iMVviMbr1;qbwQnYGSTpPPEVi3WX-<!)-?gjR)t1^D
zV{?`_Ld`_>>uZ(|iqc}Dg`6ih8%zmQPszT_BfmZ|^8dEdO|vKTSbdKYKgsgprIgs!
zyxZ!M%qdq+UfXp_x#9fv4Qq05TV3|GaGM*vR=b_CW=EICH>Tqz&$nzpG~>b!O_2l7
zvu2zyST^&On24}c->*`pA1XelH$N`ATBzVQH(;H&WsSnJg>NiQ?Y@3%`@&=I9KLN`
z|IU7`?&Sv`rH=Xq?pd_eII;L6SNz@FsAz`+k4?L}y>Co=H!ZhRtLCxiJ3kJ&H528Z
zglcm1W=##%tSMP$T~^-m;HFe3$Lrvj`(AUUM80mDy7~~~lCM8+xa93AXes!yA@-V1
zcJ8ICYBI;>{!)~&%@OzeJIyWs?V-d!^Q>9=U!LeMdZ<v68^X<QHCcME^@AIUyVqE^
z-I9&9-m#X8eTsgQU)V8jcA1VjVeeeO*=J4U%b91CxcXq?iFLZ(?$bY=-?!`VX0x*&
z1mCJpswmO__GWdo)$3F2GR-<pj$A)qEZkDOxA)?z1_#9xH)>M%G`JM3>kk)un4Np;
zf|C5P&r|1e_<jAzb$jvBkM65078p<csM6eCB4V+#LSWaA6-$|CukD%E$6>ep@1_ZI
zS><=qEA{VJ%v;AC-t4u*@=$id-k(4BM6qx`dw+BJ!-`2eJG);-RF>R-GC!#(Y|Y`1
zH7T*ZH}ao3+jVn4oxJw~^ZO>m#+<LQn|Do#mtfx7dSs1Cz`Zy6>kL+}4m~4MJ$rK5
zx2c)0qhH@VyXA_?vKP&-P8j~$^lH2QIrZGQ50mzRC$c8)`f~El@j|OzvgcmS+iiC4
z!r!e4=Vq*!x3A*wm)zP{p<BAzv%h|rb?)}|ncB=J`SwY3p7EO#AF)OH+<{it*D=Z3
z^@oqB9=+?bx{~Lf?~Ged0u*oU-;sG;qmZ{zJ^!iHqEfDnQ;#P|&HZz%@qxs|d>NmK
z>{F{#pX@yP)akXzx;VWVlS)=}XfHl{`n}+-<$ksO30^g_E1a~IFX_MIiBd24dhWmt
zMb`O2O49px$Y*?0)q2MsX0r6#pM!i+_OD(oFg0u6V1BLNsw%nnBKz*Rzgui-+^=Wf
z)>`a5?_q63SY3AP<7KafgF_CTP|{ny=b=kv?xq<^B4yFPFGk(DCMi(VlN}_%sp|T|
zZTIvo?kZ0X1ZZd;Hi??MaIcdh`!Od^$w`gN*PH7+Igp^Cc}Sn5?}Oce3CxQZF5%gl
zG55&73lo?RFI>X0I%EExe-9^cA6~eGXJN+Nga00Y*_VE7|M_i2xdlu7$<E#T{lbf$
zec^d=U0A#}_TBw67ul<B99bLp{Ir?#^X=S+6))cUuK6x0m$%?V>%$2z?)>I+f4b{|
zKt-UYp3Cq3E6zNakR3C*so=!sSWdo7kqx=Fy&Il1R-D*uE6M*dWVPwCH;xWZZtmmh
z*y4S8o1d~!;SL3*Pj4KYT%t-ddIdS0l+N>|dbsFW-S(0d65gqx_UVnsA(vmGX}+DC
z*qfBj_oW87=&5IW1=t9PR+a@hyGm_M<~^ijAmQv%Tf%+Jz_h#T1h@S+_Pa{@X9PK{
zZ#_y#P&jkwLg2f`6DNvuBqd8V)@OJ52uM}-DLXID+gidKxQZi4@Ss69N6^Uw6VqcB
zA9`>?Q|s}z<1Sx1dTk`6EmH;WT)WU7w{Rl6v-0va<=xBIo2NWEc;bYn*KMIgalaVc
z<am1KZ0gE=t@5qC+eSj%()Hl2Zzo^Ni~TgvDLQ>?%Ua_b@>-t~L!N}4+HQKh>nmT^
z0|py=J>`(EOdovCE>ya8&i_<K$l46+;x7l!Z9C$UF?S*Jop!;A(bt+YV;`F`D9N+A
z<VF5sRX_Fjv7&`eV2k}X$!Rl|mh3+}D{$7mlLZkAGtzFZJh?<Ol(l?{$XxB+B~x;2
z^{lt{i{xtU-r8@nZQp{zm##tWO?-QmqL*(BPWHIiuqis(BblY?*n}5mHy3iJXqV27
zvg^7wi7m=*mQd=B{fouDWm!#rS<ey@*)el*hSbfiGZz~Q9TYy%t*u&CYGp3PJk2gA
zc6aLG@84A4iAMa|(D*j2YUg&J#Pc^Uwddw+&$#S&vDG%wdxzrk7r!%?C@$ADO8g)&
zJ#~_G`F#_YmHfYT?rd6W>sPRAp?6M-SX}bK4;pWct}Oh!e4{d_n|q<4^ZM(rH|PG^
zW%^Bo*JZcqH<NAq40OCsS^UzAwE=nIwBJRkEzzg_l35O&(9leNS^BGZThR5DlFKuG
zWiF6ht{K>7o!`YbU)Cxg<b$)zGM?YudUlzi(8I$)EDuUwt<2<$J=9km`0$6w&Le*p
zdEcmfS1DR@)27vS@o9##xz%-zdYrp9sF!eV_Y#$j?A_vJ>Z-;g=VCB#;l34Z8oUp*
zIrTLzs(OK)zd$-J`CuXEwkxbIs|{CgROa00xczCLyi{z&?PcqePlw)Lx8?hV%$-?T
zjiP@;Yj<Bd?Yw(`)@zrt>}9WR7d_@%o3`qiMvK1w8?WhnMbEE<ecH9v^K0%-)%LpC
zA;F*4yy$#&d+I;wC-YW3Tf)j$y7~3dm8Mb)W-S)vD=U6Ab;ZfMe!UCNFzhp*+I4x0
ze$jdj<A(J<r@c%hPvy)yv@cNY4g0rT&eTPsN%1R}76?aQ)Vb~<9GzTp$l%b*5aIXN
zHeM50$@nIAy4LpxF3Y9Q9XZDHXsXy9qwp`!-d-}geq$%g_v50y71m#l=g!{OcecRw
z`dz=X1!vdl_w>2A#63T^eeLBNYtOEIvHbSRvuiDx5-U^=ecDoeYg^FuwT)|EOu4<c
zajj)w+sBC=w=TU4%k~R+pd9RyU7GEi-RJUSOG&L{Le`gsrtSI<f5%=FeJQg2(BDJe
zKeUXrPs}-Z`WfdN>DWVc3HE0$syYgO3){}p#<OVp^2U3Ij-6<k*vxUm;IhXJfu)RZ
zqWrZLA9K9z)2V%Yiz_ch$4c%0g{2cWZv4#gE=uQ?a{0@sJ7$ft(IVY(C+<dx%#Kcy
z5UpJI=J1tw?su#v-krtYt#|zHEdJSx1=`%^*}u4yxnt^{yxdmT|4Gcbt!Ft+diwVS
zd`p~E%^^KmY)9gT7e05kCT_5ldgy$)JKN5us5~KA!nh^Bk~#WY;x?V4^$Nx<`6|rI
zpB>Jbb!c8-8prQO=I~F6pzt>k&ikb^%Ue40S5A+ggd0cuhJ}3R+dOy^-&Z|2Y3I}O
zqQrStW93p-X4U)BCE13#ZxWh*dv+hY8vDz0yKlnrXBQWFmu`P{@!2#9Hjg?DW#6}c
z7uO2kT&ug~h5g;Nx?3!{5__H;Z`QM25PkCXwGWXc)66b>xH-e&@ZGtt(l7b$&h7Q&
zzH=(_OV7Jor*6vhe%L6v!*q$~yW2T@nTO2xI%+7No#y&ZJo8ZbB*zfvS-!zH%rCXr
z9&*%C^xfk0hCB1n+a0dA^OfK3=)K5!xZ}X|iD}#K-3Gbdy?Vk44`D^CyA#qf;xZ39
zXr7o{XEM8fw)OOc86qN{_EB^9fwDn#{zdye!O{7}ueld5-r)1=<%Pq$OQm+3z7d;y
z(AxBknY#i{{~@E7?u)I<wM*|t6?V_Ne>b{NS~zvb`)wH?*4{6_J!8QE-)*ku@B4hW
zot?-re_EpIOZUZ#w^`P3-v8Q`dd~kf*LQCHht(%HO!{=$rqOosX^wBK?XJi89R<I!
z>OItZxk!3<r`}6Y;&F~h`%{wJnb&cNqilV9>LGrwEU5`kYfX7=giG!u-#(yT*?;^*
zpc&san_}&)efOTO7W??&=F^IjkC`<OyG?IT$_V(zcuhA)?2yR~OI~de4eQufK>`Ow
zc4)GiU)I-F(fIv2%jtuc<)TR}arcsHK6Yv!T;$v5)3)jKE<H(37q>H?j~5wz`t-#}
z^3<`Hvr<A<aZgS8aKN*Zr@WOf^>#w6mCOXbeWt}$pSW_Og=E)lTCb<F>_=^srbNgj
z;U%+G-Y$;`dpm(M$n4D3xf1+$)-`U4b+q#M)ooyCXJI%odgct9haqYlE6;ooX4VdQ
z$E~HtwupJ<r4z!;udZ1XW(hxDE07X(@aTp<-lkJW)?8}5T5zS4@oVm*8=sCm`B-aY
zdn{CTMWOP$v*(_(DlxBq*>QPNLznr(!=c~2W7JOsm)T#RGo2-5uVDF0&)=z2`{sq@
zGp)MUa{qj&np&jdi7l^uMOK-w^Esm>YrFCuOUPbNiIc*Uo$F`HU7lqgm~n5(oas$H
zzl~J)$=AyGt35vHo?VrD_tU-?pqss`)^cX@)-1iS>A%rx^?24=f%CnsLPs_y_UWeo
zZdT4`iPzj%qVz!bz*@DNvl3l?^l*Gz?$jO>@UrAUy6pC7m1?EgJhOA%XY!~DDNJt6
z-FAx8Fl*7C?e!}kB*s^ET&{E~^Ev#fWm|bzMbNwhCG$3%^_$=$xMsOkc%x&Y%Qfxe
zMy+N?L2@-I^F-46U$2{G+q3%rPx<HdJ(cqRekAh;^KnI={LCNumG#u-8FtPaxXKuR
zKd(#Ui0xfv<@{{Rrb7ZnheMrT%uC~l_FQP??A1Kc&Uu69lVjRy7j1n7j3hT$**`ny
z(3<(==IUh^|N016_3gEC_PRXF&UwSUZ+AkaU(QS8kggA%t5`h4IZ?OrU)R<Wd*PP7
zPJft<p6%Noy+=;(`Q!U*Kc;My@!EdlXpG*nH$VBix&MEE@#y7p{+Ex%%^yE~@rdt_
z&itQcmsC&1??0!(9$)$4=Yz|izCF|L`gkCoTPcBSt!(D%7Oo4$-#$Hg0NNS9=H8??
z3Sr_={N|4`{PyHkY}&2fzrH~vsb*V){yB9a&W?`{&5i^v3p(=pm5Ro>9KS;^yRZA-
z4|~So$aE)phWWh{aq1iyS%&7`(PwUc-R;|%(JCbJ`Iz&~mQL4L>nozsrJqDrxm{3n
zy7sC?;RQoutF&lf!OWi#iYh@rG*}cf3!-|3SQHZ))=5wOn5Ur1b=xCglH0<InvCZe
z&GndXJ9vq#>nfT2!Na)sD5JCU-5nfp%$%8*j51v$YrPywo*qk`Am!mXd7t3LWT{{#
zwp%+21t+ixU0P7OiNWyK6pII$FOH>Nko4$cn#3K{m0>VbibwN<qd>UQ8HX$ph8+u@
zxyCMEU?Q#8u+YnMa-VPX-b|f9hGQ$-Qdf&qgh_o}(=q$v0#-X6SNYJFb4`ODsrml)
zn=bO>g2-Emdn-LBhU&5whzhS~iZM1n8q;^Wx3O7g!TN%hr0Y`OZg85EteSHC#@o5t
zv%{6_G!8RxANx|iLEiNJgB#Jz;V+{?Yp!MRGVWeGx8P`QZ0hOw!(u+--eSxq(TXys
zb$4BvdyR#g(Noq`rFXW7dHa$>&iCw9dS_qRcA&r1$)M!G3=_?+vnlWXYpMErS+h<s
z4GMU~9vn1nYNLmz)YNSb6Qq_LSYe|1`gp?<lZVNSilx`s+m?C;DzhzF!YRL8A}Bd1
zA!gQ;tqBf6vjjFVOthNJ#C&<lir-8@ms%zS3wX{K5ocTG8F`CUWhtk!xI)k}HfJs#
zpUGa5;uB_>&G@ruUF0vOWuB9l`T8fwCbAiaCGFOzVLI=%c$+AD&#|(`#+5JP758rT
z^P0S?cDXkfkI&DDPu8oK9NBi)TI++%a+YOBbIr=uKJ*U1c=bz&YJZaU7v6_I-gdC~
zK!WI~uXRMsqwnWJLl}Z9R~ASy?R!?VXzGn-t?0jxbNkyJpB<R8hxOqfy@!{q)^dt5
z&DiCYAa&cf%bI!FJE;koIp#0l%DC>j5`3@qed6gjy-ET1sngW<#y;?vzDoDuB(|XY
zVl!sAot>-fX=M1}>C7vOSXGW?Hl4DZwq(7~oS=BKq{ht5L#J40srd8M80v0~Y3$5w
zI&C>`i9gSrWf5i(AlcKbi<bEHu-{kniVaCfnx(M0M>Ccy;OhgQomuBaX3R6Y^C!vm
z@)wrS<WQy%(N#g$PjVhCIeug7)5&r(X1KA=k+*sh%iM0*am?_O_v<4jnGecu9Xa6o
z$mR8fa^52<e;2nNS;r7IolX3KO-$j*qE%wP+v^qb)cs^P?P58@rT*?%-DkhD>kLPQ
z!`aq8Eqb^|A)#QU2jd#{>0y$u<$JsJjtb?d=DFPXt*htj_nN7VVck5b9ji9&<$9o{
z6#4u3+Eps+g|=VgJgA{1vCYag@TiW@b}!G#O#X~%y&^oS1{tNNK6NT+_P&Zf;LRJ9
zaN^aJQX$8nSr0ZdOt*T?%pA6SMJq?(BCq$8KCC*n<Uqky&1|`*B_@vPj5?)itZb|O
z0`ChfS;A?)e8VI=O*@{@yPH}RJ-mc-^c<G@@V1Fatk^ZRs8zu<cgIiH*v(&9gZHZW
z&Xzm;MYTxj!#iEQ+Yb+JzO*9uDCgphu?am|v%Y)0Uo-jAlDzvbCow69TwM8l?yM<0
z%3~DrHWW8RrOZvZF6FnVYckXPrkJn%yJgqE3e=UjeE(owlKH!Y{q+~#RxEW7jnk4b
zYh`{sH$~Nb#i_9WGooACo?Mu+hc)s0_8on;YdNPe%}isJNY7++EB%uh<7xjUU5{zr
zgsG42C`EGZJtjEg|8rMY-;Zy4ud?!8KQP7qgk$kkZJyu-r|)#1vU;Kreo<<Nkd@kM
zQ@zct54pCy+3T??j&IY||BV7HPA5}XPp!;pY}+gDse0aV+b?@Trg?UgB-y^$a<px!
z42)EgeWdl`zY7Ob;?;E53oE->rM||gObunf`Rcz5htoq-@9yQn;@WJEo#IoU-f&#^
ztNb8~%}XWox)t4`%?plnFMah^A^LB82iro6ea4qvpK-H#AGoDB@wG$h>{V;N%C|_g
zymQzl=>5z<o2^Z{qHya1+Y>jX3fxk}86rj2su!{)>8<a1Htl}I(;V3ZXOGA*=DAv_
z22EW{SG`h*&UTPqcp%{Ymm5unAv&Uo>^HN{uuho5cUGjWcEP$Uix^avoxC4j#y8>R
zK>_C7j(4-HnL6feIQd$As<48azEIck(36>;{>=5t_KDWMA^*zD^rLr@!L_MYQ>^%Y
zUw^)EzR0!ExD3XA?SvC@&r832HV>P=v_4dhtt>M(bjKkBR_1RzJgi%GzKZW{Z`6(q
zH;R^6m#{}}x@C_+^xxGV4Yt1T{^oD8E#bhtDV!4xqW?<wCT2Z+{&rDDwLv3ebx=z9
zp_s4v#%-EYG@^VaifMzymSr{NxPlbE+HoQ}SWukXZL8<R@0`U~_n(zmmgaHsWY@L`
zgGIilWP)a_{nvZUp!E2YYg3PibNM!~a=5O%dG*%%&}+ZUWe#6aRW|>A==cN`gCKvc
zmD>!`vkyonMr>W@G3Q`{?aD6=4VKaDHwsi<cY%V^>(n+T15i+|Jp6L5T(m)(*C{g=
zgXmsP-AR`gDwbK~9nh98IdEjlvfA|8n;sYE*vVKv2;Eh9;EPFgwX3Gls?yf=4zY^M
z4gdZQiAs)I%4^YfK>N0n$B~3JtJ`WCOjDG)Kh0?^eR^@tYL;_S;++wnq*tH5v|p?L
z(w#YX#6D#taPrO8-Yk-^?pOHZiSprVwEGvmmyzE0ZMu+L!oFYE9|vYV5I-g`QUAxI
z_)~Kme!jY&(-S0Zzr8JE_l1oQk8C&MWlmdNzuD01qDvy5;B@YNzor{mCG7iUF0=Sb
z<;2_0SDrSV{xR*OqC&Li|F+~QvAoX>ns&q#yqi5Go$2${{Vye!`pvv_OiRK!k;`Js
z4c-N2LZBd&Uwp+-Iod_;mQZ1i#s3AfdYLzGW7{FPt5muBkkp)}2RBT$xf60_7bvfa
zh;(smUO44M+sb{LPF<HuaDP=<wfv-b&oY_tZJQbPNp0S!a@6_oyMmmR;-|~R9DK4x
zo6o3x(kKgKaGyTSaQjp5*I!I-*Sb0;ubSJMpAoFO{NkI**Jf-B`=C1i{fV+LKb~Xf
zf|jpW$@W+yZa8!0+^N&6j;-%uPA;GLU2$(<+|(4_$gdmUi=~CNYKr(9<cV{te3D-6
z^L72P<oo(-b!KXd1RG?Cuhf`o9=7vUeCP3%Gv`aWq^wIgqjxDvD}PPV)%{N;mY3}_
zXn!Fs;Pytz*{v>l>dJp-k69cQTxsYMrzNqzJ7xAM>D4h`^G%Pf{OmNt>C4h4#kD7H
zPrM(Ix~hJ%;W@oF))EDMQJyr{Mcz+)Mc2*wr+due>+zInQ;&#oxg0pkd6y%@IXrbu
z{bWNwS)*3LkPU57dJ+q|Qx^P^Ufr{nF=om1qE=3qWFEH{>-42V6_Q^&NW^6Z2eO`N
z4HVw~adrNhqOEKl6RT$3ds)c(SWU3=yWiQ+<XZ_Vb29{F&oO@cduR@mXQu9!gS_&f
zHdDcw+43ijiFo*K&Yk|<ZsDw;7jiQ~lcace7Zql%X1V|TXJDeo)FlaTG~#pJ*Dk!~
zJZahG)a~Ae7bg@Y*62AYKMfBHOXY2q6Vjiiza~k_rYN!I-OWqAq6fnMzq0=L_Ec}E
z&*c&Whwm~!k8wR%UC%mi$+4Qky)I9<kG+_ueLsS+=4-yH+Dgay@%n+=6?-n(`tRDv
zbmP^1AD<wRz!-hO>D<R&&eMme(^OlzT4{gWB0X`QjJ*yJbs;{Rem}UQ=pCacajt4%
zO)~3;tNXXkSYkKh)3H?vJfVt`dciE_o7Qdk_CNW3R`s228%ynfhZ`_$n|JWcjjHK$
zC3l;j<(`#0i*4phv2GQElxR8aiK_9Qa^+>_|7$(HHmUHt%BmlC)GKIS)T!!K!*}xY
zoaX^bsWSGdGHJqwSC4x$SFj~@wC;NN#&)C7jBmUw?%xd7{i=8=aQR5qT?vSwZpiTs
z-;TU8a5p{@)n&hb#r;ir*SAlQZN4SEn)$8JYR!LJPuQ!LdG6;AQ=Hd)r21|5@u}xu
zt-Pup#$>Q|_mL<3)7jcpBDejxYVLizI!X0_^7)@-@&Ps_*DF4LlbH7T!|sWt7MGT+
zzjVC)>(n2O^HM|RM~EgU%$#<0PNr<(V<F|wO0lLrUdv2v3@#fTd34w0lu!1L1@V15
z@;x)BMxNc$)}E>6taI0Q^Q279Ggfj_r>EWA>XTg|@w9X5?#xhQ-NxACi$7h`TRtsQ
zHe-6kuGwX#mxXSW?%~<AB|G5k7Czawq?dVCQ+>P>u6-0bacNDW?q#bDyN_JDD-#0N
zds?BqY-W}zNYH2FKGSx%N}biyGG(vDE{nJwl?6A_dv$u0^<jrqPJ4E@E_|CB#dNuE
zy34d>FMrRxCNQsWM$*~5%<7rfoG<t7&_8$1#QW~~EqsQ)I=6Le^)Cy}_@*1u9(sBU
zUx~@aX`6bomZ@%dEq#LT@|x5r_FJl9!P6qoZeb}qxs9zhT5;atE4wS&xlgZ4i()eP
zblz#Y=fw{Te7ygBn*H=mY7~>rr!)EA6~8$fuWggnW8>d%AK$L*`$wy`CL+Fb{<p}(
zS<6Bj8dIXmikGFz&cAG0yZx~1$If5OM_MCxM<3-A|0$cjH%Wf}8Pmmg9xO@|Iia>O
zZ+n?^3`eh(U2nEqYJK;rP=&=u7TwkQzFi=yv_|N9&#7->?9r;%-jwa!+j?Qu<Mh5+
zf$#DPKQL@L(slRV+dM^+S3fcrr-hhpx7e~;XJg#<(`R*C!es5U&zS#vy7I!qSk-A;
zzUAd}FAO~HFKN1Y)7GO0V^zgAm+jmNHm&Dp-m%KGP(yANr6bbO5?gz9TiRspQ?K;=
z+9zgx+2O9L*o(5<c<zOX_Z?zpe9hJ6Gxk|?;q9$$VoHbmb}0MZOr9F6%U5QwF>BN5
zSlyPeTISBgFte=|H?%h9Z946%+Y)wi->(nbQf41k*;V1qz5C83Cl1$Hw?sSrMR{4e
zez02X-nOt+px0*m;+<FGb{~k?kZ9d~YTi31gG)!&y}8p|byCp&;^xz5b-XlqJFk50
z`RBJ+MfLO9tkQUupy?_-K}Ow&F3etfZ%)pkEBqdZxPB)-I=WK6m4CACO+KaT{`2?L
z{rh$D{Q7y<_p7jM3*Gah-_rf-wd%8aw_RFdzkT|u?;rp7S8K-+exAsH75A#-FJAQM
zFrIL9`uq*QRz{03@NM=MexI4Y>FBCzbGxO@uf9y`Tbp(JpVhZRKecA%GwJ6?RPEc}
zx3}<lmRt76M;}99`7!J3|NoV4b)hNci9pqyxwD1M7aT5FlCo5E)7R%Oi<V?OyD!pJ
zE1D~mFPEFi*tUK8lJAYzXS;p8)9oH>W^?)7({&HhbaljXFYS@hwKyH6+>xdyePi*v
zOW%{s=jpz$Tzn}gXTtKln%7H}QzyA)tL9Iwa(q>GH2<1a_}`L$wKI!1GDuGm4?U*;
z=YaRV;Nq}?;;@~T`#(1R+$%NZ0Iye3^E%^W|NMBp9<nXn>1dw!>1DNPx}e+xhs1}D
zvkQ*peVHpcb=m9VfB%*3e(P&)xb*P>-sgKGx4gRllBc}>CF|=>W5bZVWBx|7`S*xE
z^{iTu(`&c*uU$Xqm-jYq7iJiB|1I@;aW>EVoi6XZ`ttX8vg-mo-(UaY@apf>Z}yiK
zM+S0zxOmhxed2a=&X+Gw&Wful^7`ldDPg(B^e4rUX%CNk1~0TWSNkHi(fZ?IR~NS@
zvCrogt)0{D{6XbI@cNF!R=#HEM1RG<XcN@6o2mP^wD8ikIc>(fGA|m3s>fU3loTsc
zpX^zD_Eh_4<_j;4N|>wCwgsuLNuBh&AZ*UUu3d~WQ!k&-cXFwj#&iF}!<nB>yEPxQ
z^YA@=Zg1_s+mp>ZB-n*|tg;`dpTD=}&IG=-J1owby~)aOvNL{n?s^A9yHSH1^8xm=
z;S6Web_NOtRq8orbO~l<2_MQiCMCY`OmFGxg}igsT57&YiZ3`bxpX&U!eZrg<C8l$
zcqN^dGcLT_GT}VeV<wYS26kSC_TI%4&i6l1nsRZWU5>*I39qurvvw%ta(XyVE-;(D
zH#f=EuD7xK^2CQ%mRiiVmX&`V;MTY2=(WbY6~g6~bI)9|SfO-vw)OnuGk>0PWzl-<
zaW93x;Zw2m@{1=oM>KZ_xlLK7<#_YNv&cOMT{V@xgC{S@DN&RwE^s`>arw$p<>1_J
zUv<7cP?{>ZJadae?iWS5=7PpkCoY>v|E^t-{mG)GJIHOWP3c6F<u^M@#QO^lp8B$L
zX0#Hg)sBRes5>$q2mW;O9ScYe$(T8bV@9TGX3Ryw!c!+MY+7O=U0W_5Wzcwv<Km{J
z4${dF^mZjMP5rn~b;i^c3{%xjPgtauWbiJrxc!)0EkIH^YEvgy?F9|B?hj3!!ESBa
zv<_S5oZH^b(aag*Hf5Vm_lc5>>;}gpt4@mS%JtazYVARG;T1j$ZwDQcH}i}5TgkJ)
zNU1a=@=V&p^lkSPk|q|W8t&ERG~AJp(h_mznb#o>JqgK|mTfFN{GvM|QjR>EA*2&&
zae!4>d3}=K?wOwgH@+|`D$2Rp@o-BYx0{<opHKJu71HAUK8)6zHsroIYy4x5Kw;r2
zkq-`H+j#c|uKZugGRLUuQRfYlu1gkCqU>AUJ_gtIiwVx_*-(*n%;=hJN7Z7Z^|edI
z1edm)k_pXqxT$fvT>glwi^fB9_o=N%KAqlLk-^g`Y;BWpF6`tV;rYEDi#>&QKmAaA
z>)8C=PE$<Vj`YgP`AScGb(a50*8I;-EZP?n{Ql+a5X>pwEG94D%%UZj;V0OYx>!)W
z_e^!=?7FKNCIS;r?U`Zz>Uy7>%Z6nx$1K{eoMc=qD7?bukwu%&qbc{D9bA-)lf2iP
zMhopIzn8N0=3bXolD#)y<|RkCtS~a))?>D!ceC)--ekdxUQ_y#XX<A7-jp`UpD@wO
zr9b)Pq=|R;ZK_DnnJNAG$iLM$3L82?o*lP&`#-Ae2#fY)hdw>_+o$?wIHYoUSfvKM
z+uPdV_Us7r$|H?E#}t)<W(t3ne6n7)cSb_0P=-cn(SeL3ELy=1&JJ?TUB{+bd~}$4
z_R5=SNs3JqEnYcHJvHN0l8%dwkfL!wD!*U1YFtNzidX7_ZR#>R5>(EaU0_*nm|FKO
zKtJ>6l)#-mT!KrETx6T|fYX!j)4|Dev`*xtipqJ&)!jPH%e62{x9Y4)+%{>?z;jt)
z=WAZOT(K0eJIs49uX)4lsK+Hi+Z>hjD!4iBF`CsR>rKdS?&!Y9wn+ZKthoHj^^%f%
znO*Ez7UkFcn3bE^!Cl9|9G@b)mU+2g&AviKy<ds~d)ab+9a9&&`K@KegP+dq92K(H
zzLb6bt?ynTa3KD9`vUVu=H(k-p8orzfcHWp8%NUBbs1kRCq6x)9`Ivd^$s<L!)sZ2
zBX#xrl^3(K#c)e(R>{9E!)!a@Ywn95)4gS{aDHQ)@FjPKPxe%+9S<7k<R50M-F?N;
z)t+V2K3?fBZ-dyyZ6|!mT@jEy5hUM|f4C%S_mzXL{7<Ub)viP><<qNBxN2=M_nKa5
z!A0iDtCK#7I=^}##c*c5jN=+1FWKEYnO8;gB+p{t+0JK@vei>I=F5SG*9^&FtFIh%
z$zSDgP2S;n{p>3TtE;kCIb4!IkRs*qDxrzJ=pTa>$V`Ka%%1fOXZ#p~*oAE;d|?k*
zculL+;2<++J;UWpftAgjawonrzi5eCedQnv|B_#d1x~yQr3N5}C>Ho}sg(-wUTFAv
zH9%l>OVII+v+qAx=^^VQ-0-lBgE#Um$Vh_+e2s?OAT5U@>Q^`&-yiZSVV`(Pmccps
zRR&Y9Eh{P5cvzx-g_HW_s1`oG3W>-3p$S=+mK7HqJj_wQ!pU`3%(Dea*ArvxLl*Me
zMu&iuoaPUG5i%?0$%CZ!!ao75=ay{El!^JUVM*2s#^;L|gxJOHb=FE{H3_JOSTKA4
zE0Yek*dfNyyoRkeM3;$O+{WNc)`5Vl%km2jGT)4A@B6!Lrpz95Uti`E->iIQF{Tw6
zfW>($Px$buRVmzmeV~WMU~+S(oW~EVkojBBJxOR{-?W#n_SQ{1km!joRwY7fOV!wg
zZ6>@deV`(hpvEq2Yp~R4fqq$IT9E-S!?Mseg)q+2a~CG*NNS}Q8Tc}^MKeonx|Loe
zaB=p5hHQppF|eKqUwvQv$e(OgaazJh*yESlhporTRyK3Wo%pF%!nHQ`Rl*|nN&7g@
z_(EgKcSS(<RI3>e8e90|Y%b`5;$)}Xu9^k0uN0cLH-zxV+A&P9n(?CXr056Mngv%5
znlQ|W?~FUN-gE9N@gs~u?3Y;*cC_y6<OeHa6#u1V=K!)|(>_+&|3NF8cYZmyrD0A!
z^Zl%xK&u@$8hi4c!BM1DA${V9nSp8MWy>888e8(6K{50oiM`0S;;uvYse`QiDU~k{
zHHuAa?v_3A@j@wct`sQDS2FFZ;Gbx*<40rW)E9TF7aqEJ=9~G1LR|*7$QQrA=R)Ge
z>Hhxw%jPQ{$V%L{W@h}c=8kc`*jd|ezJd*``4{c2lC2ERm9sS^{FeSN_2cx0OMh+}
z{eHHwpGWT4&pr*^>7u#!GMU8fdcMhC<bL40`1rM1ybk}XdO2g`*Ky5Qo_4V2>APe5
zQ@s7Y^vBM);QDOUg=T*F|2rNe8r>H>+k2wRtiL|w$A!>mi>@<CyZ2w!u)4pfKKXFV
zx}s|=w-WC&{S{z$h;d?$eZ7Xe_D8o3gRrent<@q<v&g`e+zF4^_1XpYT3xbfV(@Fo
zWd3lr#(4tcm7E!C%@aghc5dFv8T%`T<L{3G`2(!{A`2J&^o_ijCVrrmzeYR$i_6B$
zFI!eA#BeuA7EEM)<Gebr`s;6b^A*42ETuw}54#^foL`e!`EK^FdnqsdeO!Jx^y*ZF
z>1k^<_p{4M%}IHGn5)aIiGPu<QdLAokxO=V>yjT2WT!ip9h<L{tRJ~}nHpcg-D3`0
zVxDzhNapfp-%*gPP$m7%`{H9wCiWdA$qJut={NPCe9l+!_wWHBo|=atn^^vKMR)IJ
zoWLBz^00$vg6Pz*44YUF968l!$IMj1`0N-9Ux8+e@~vi{u#j7<JH!~mXYx1ppG}Ny
z*q(5SQLnvV$?g@LUE4|+m$4q`tmU=X$p3=rjHzrNUw2YphOk9sU?l$oDTdf7OtJ6y
zKQZnJ_mzEcO2mE3#JOuSy7?2L7;2ljc1Z|cVXatyz~X?YR-dYYL)ez3+y=T0c2Vtm
zQ#0N(ompPOSFo^4xr);>EaV#VTecFrn6hVekNlYP?Sk~J|Jv=`AyK~W*GZjk*ERoM
zH(K`JJF>B`J!a|0A6j$!*Z=u=_LBdJTYJCC#ee<#F?7D%TY*XQYox04UY$K1{PW{$
zUyrzo;6*Q8uFJg^``iCwRo;}RzcknDKbv~?xXS**y1(37ALQ<Ax%~R;`#m@K7v281
zR{WFg|K+n&j=sG!cV^xng}2<dooY<-U)N^*-J`3;>%8rsO>CctZ|MJJJ=(cn`q$(c
zbvto2n{jw5AFAr`d7l}*Q>FBAw7#t7WRocEma<z(OLQ)m{M~W?e%|)IFV&W9=f6{M
zZ?@~|e{;{RJNy5U?b;sBlXXJN(^uH8b)S7nb~2yk&0}@5suWjuhE2I!_4JZihg^Di
zK-9naRjj9eWKLO<=QM9u<L+JEc0W0H-_Bfr>(LS3Ker2(9QpUwXz4Y-<GXKfSBkGX
zSoO$9BjDR-_0&Jywg*=2c;&C%8?&YG-Y)O{P}88ct=DP;W|f^anRS2j{+oA?&z1l8
z|NQ^0_BSnNo>?4uSN*Z(*P|Bd`_`{<URs}Xc}e~4Fa1aBrGMUEl{UlV`42~9-dX#j
zmMy*XcvkME%Py`PH#|Mx_AB1!1pnu^PSKfF$vcn!ieB*ZS^YXW+uwg*p0&Skb3WqJ
zS$X^YRX?X_i2waJ|Jdca|2NMXe>#0Oe|^Wz;FG>@+B)a|3Vgx#_uuF1T#r+p{RsCy
zKi4?#Td)`Rj)My&I;NETxN9BWC|{?vQM_l$>o0a6CM|uwl<Q%-yVtq1o=?x5n*Cc(
z*QVQ6U&q3J`IpE^8gup=F>jLa(dfRHm$5)r6VlU}aIIkfGWVeO>$m)$D0l8uP+d()
z;l-VclTYmRbzfNh{Qj;?k?&@m;`R%_E#GTWC7QeU$I96i>dU9MO#eEWQ`hT6$DBDA
zURTvweE;{Ww(wG{>;F&92j0%JlZwq){^Yp4_1DiQt-8eG?%2w9o)3N(zk8+s%bnF;
zZpunJB5PMRW$rn8ZT7PApEtSgP5o`yrTJj1wEDf%2DX~HrPs5iDuk^JUVWQ6+jO&m
z`M2ZpKkYaF?r}e|=HA`!9KW5t!#8TIKJtA^@TU&xAl<WhbMMcN)!J*m_Rb`wjTxD7
z74ME;m($<5RA5oAKBzDH!S>dQ(-&eZQ;ql5-`8!JIG^LUr`+Vc{oZ=k-M$vd;S-N|
zFQ0AFd#L4};hcQ`llzSWB1=6DlH4P8-*fyIfBNuj7w;@rk@b_xU$xH@uXw}ozuc+*
z%!(D2Ck+I&R5CTQIHykh7b^6HNq>*;^y&X@O0GU0KS$-D_5Z^!@6G)yDtnXD_M-Qr
zn=58p9y%KG`tGmpcd5s@C#}&=nEvu->io>wCoD-WThe?d?@^w6SofXb`{dqxdtVqy
z9~I!t+~6DY$0u9kpJg^rf$6Wrt5bZx&rD^kZ^_AM_1PRG=>9^WD{S=}^Q#*;&o1}a
zl=gqWf}=>SQe6Z`pcz-proO!<OILF4JRM^wf1z^O!q`uIRa=VBBxzKYZ|S>uXz8?|
z{-0<1Sxuy88_Zg&+|A$mNh9@{ie&3-g#}B?AOESJEd1WacKKZ4-NN=UF2e8Bc0ZIm
z=l1HS$(=PX;{W|T&g0$qcFLs6U7gO88c*09-al7lp0U#Vj!$Qze<=3ba#^aM(tb6a
zu~O{!m58zhi~np)J9}ild`O?RzJ@@NZ0@6($Ll{gE~z;oFh%F<{Qqw<R6om}I;|d;
zzxzx2>5CrrPp5qBkc)IJu6K;K{Q1!`d&j-6`ug#AeCn!;{=R<sQgg5G@*+v~a3_{<
z+rNLmp1plP{_Q&DHJvLKM!l<l^y}$XZtZ;6IajME^7H@8b_pqaS(pAvcuS#&`ulYz
z_bw=ImNqWgamV1jOz4UK>XXv+e$Oxn;@>+%bmyJe59fP6pXSck+pjg{?7IEwsW-k}
zOmh7BMJ+0r|MZQSUfWA1U%2pYW6d4@{OY~)CPfwn^(D$Z&0wGZCT5bX-@Uh9H5Dda
znZYSJQL?{x*T-Mg*PT&TKF=`EY}xEp32Ucc>U-ytx#-`@oVV`Py|W5}{kpE%JYQR~
zZ})l2z0c;j9g;Pl_;=faZ|}d~IeIj;ZJo`>y!~g`Pi>nMv3@uIFN^mNb>FVsW2B{U
zXmZ~7J=MO(!R8ghYyU@Fj*kpmxB6A(JjYjUS8dPsq)s`gC1CLH++(TcyiGIJLZsTZ
ztG}vDR=nn+|M|rn)*`C|^1W8-x9?f4x!)u!AokpGsX4dOx~o?4c}B`#b+;C5^W5>`
zw&}qYD>;oOosC@)EqZOI&D(bq#rC(Ev+Py)vh9hd%<k{%vraW^K5>%Ic+oq9YR}A5
z&C6EvsGs{Lb41d4qQ6&Rz37$Vulr_ftCA0@IP_XWAi$EV&?Q1Uc<X<GhxcUd!rvWy
zrf}j*nHX!JO_0XlrSmq$^JhOV{K}yiK69Hwpha}hUjL=Fah004J~38S?X0)2DpgB9
zCVsYl-LFc?I$ibY{Zm5h;&}D#jSdOiU0dh7)y2MfcYehG#?+rO=gx35trAZwInp2U
zFZ=De=YPUk1^Um$*n6E+RJU1nu(&ibWc!&}ua*dHSn0Neap&&qQ<c?<R`Qm5et#JI
z{fzzVx*c!kmCvwSV7|UAukibvhbPa!dvp0(@AJ-}m5R%K%HGf2Rud4oPWJrnCu=T;
zp64#Gj@x_T+{=o0^WHm{I93QAwPcE6SR#5L_?XwJos+5y9fM9C_TF`r=kC9RhnGu#
z=E&NIFI4g?SiaRc$L+Fp;`QtO)BkW>`IWWq&dPT2iEE#%m^M3R(yI3vS<h@DFMavw
z+&f9D*+72da-Rif7JapqJ&|d$@cIh%+wE3c7k!=S9&p3cdc&bzJ=1==R<0FM)x7yL
z_Nfo=`_$z{&))Q$es8mQ^_(3S^#2+bU+m_7R`JGXn$HF?*;M<@@}l$4NolXXr+;Vr
zt)e%4k)K6dU+7=s`O|jjUz2IF?`dH<_U~Jc=w+X9H?w@$_wZA5je)WC=WdCwqQV!B
zuG#Li>q`5g0?}Nd{#{NMK{puXWHzU)u0B?~=(O>=d#8L?R)5Q`4F6xE|5o9Sq3iYj
zd+&qHnqz<MtB!Qu5Lv(Z*Veti(i`o6w}e$+V}8;Tl>K*&QJQJY&(+aJy^nT^U+y^6
zplKR&%A$IM!|txzhvZ^ERPLC#spHU>q=)PNJos1msO_Zdqoe;GP5SUST5pb=|Kfys
z@}7U{EBj50|BA1j8Fi}dc;xn)e;?w%&HKAESNi3@HT#(Y*Kai4s2ao{y-n%4(D9wW
zCRzMV+CJA$@9|=l8;@L-LMLr{o&9-#{ceUIY%T%(xA(486TYpq<Hk`vvEM4KtO6$k
zqYOHIj2ssTJ)g_@eD1MA@p+{+?Gp3tZ|+umH={Le%h|HPl{?t1o<GeqsG7QDYLK^X
zyG7rPWxJTmrDNIp{T_(yTe#5u-2qo0)pvKQuJ!z#^v$9qW{rhhfU@L%_7J|^1#HWr
z?d8}5j+@<3yPbAK;CH0_2j)5tTb(cLJ3l2K{-D=7f2O;`kGVg&IqgHvv!87iu*>}C
zbjbZ_Tt<uTj{1r|qvdn_xzAmYEw?C=i#c{Kz5cik&vAa+a-+&pc0OMA9o!!#G1`b7
z@$TDOaCqa3NiGxHG(H8M6h4w~(|Y#nWZ(Slf$fj?Zk(R;U90oJ1t!ZEo(qmUZTk9G
zGv`%_0>}BjfPly^*CaRXIL58EZ~Bj~WxO{GKELSw!L8!MQSz%z`}Swya)X}3)-$rz
zmQ^+_KP_KBL4fO@?5^bxXW0GkD}H+NLMg+KDY@nWb3-5PV9eOK(|DC|qEXcKX}m6#
z@1}&z&ux#`yTWM6s`k($%c82oQcwOBzZ#{xneXBe#jqVF6JurLT6e~WFfza5Un_a{
z*(J7kyQBKsPs(<*3$V%jJ<YDRQbn%mw!v`*l|oi7!|iP%LFp|lO1Vjf&ev}Iy{qx!
z>U8%=t$5De^N#wahWW%~f6=bEyV3A^{~ynF(&abeSj^rD%>P?|-TXng^ndpwE+#zh
zL@d7ib}LC}OI&}ZQixydI9q2zL;cIWJlk@o=`|c}<9)l>ao(<L+`IvMx)&Zl((~7>
zoF(}0oquiTW93D(uS>_Xo__Q@xVvR~O^EB&*vXw6)<+aS;Ed+@^K<K@>xvRd9`eR^
z*6CS$b;3VA)jbniF8d^?Ui(RC{%VEa+cbWP71}N2Xs~GHT*K|@<-X_Z=HyR1_zeHO
zYfTl5IXZVQQ*-j8@83Nmqy)t>K3u%I!eZ&)*r`j_TuI3JU799zwN-X&s`Uo$iwnFZ
zCQnLyXCv^~Bju~BRD$*@kEEMb5~WL4m3Z>5k*k&eCmWg9-!<p1c5c&=3$HFp8yNg?
z_c|9cf6hvU=X<SZ*~c~2)Hc;P3h>Xj3u|JkZDMk~(E7B#a?O(%OI5Q8!tWFoYRO9m
zs(RlQyST^cYRtN%b&BUYP8D0!eh`=)*=M2I*Duw}`tji>d7D`be*(*diVT;v%*>qO
zux%~pX@&DP<<D-4ggxk6(EiF-_o1FO<BaT*7R{6=%n`>6cKNQgR;{sE_x?nK&=aF;
z=20nbw(<#)pA+6xnbq-rQ}}x0NF#TG=B|?synS<$5}$Z*&SgCEr{^vEgG8YO+tQjp
zXLo(m_}sWN_vfYAlgiB;nqMCHwTXFtM0mrVT-Gb=S3l5x?pw31Kl{m#!~FYeZ2lhq
zF1{pF;+bC9Nj*#DlQnVss@)}?6o2~o<j<4G{_5+!l~1p#pSWAjm04z5htKo6hM12U
z8>&p?mHG}$I?1A}WcIbQTJ&=`r-Y@NWdA3DkF{C78C~xaJbx7%{5fo2tNNqkuZEcN
z^dIXch=>T@un0C=+w$M!**>8k$Cf<$v)s5y>ix{84Kn>NKX5CQzB;m~z~kRHsSj2x
zlE&Z5eVP9WZZ5v@QfAw(Co>bJ*lzBdaaoq>e!T=+PDJmYTuT<aOVZNbj*~WVaJ0nB
zPrA16X4b6J&GQ4ee@uzcV5omnm9XsnKK1A2bq>p)n0|fuL?Qoe!gb^HXX_FxN|L6`
z{TTP<#a^Fv*B(7lUA98^K~-1$iaV9stch1A$i-*gSnebHc-x{K6CIWchy7W&dfFlW
z+ut74Z@wj2aC5z*=$%^&+!CJ0-!>O1IaT0M8?W(g(}UWALPmf2Xs2m6`qK4s9`ktY
z(`er5UlFM(8NFcZGoR0ve5{|J9^-rG<-bkPEIi2U;P1ut?B7K0{^S&8?s)lwxA<9j
z!V*`5+jrM{c_p}3+*LZ%rJ1okFlOJJ_+5X*PfIg+^t_A~Hke@d*TPz*YqrOyW#>Z^
zx%uuWFnrZM%W)>X&`rVh|Lw(^pEI0p1!sT$=iyX-Vs*!dHIu)rt=VXi+MzL{&Tv{!
zL>%k1LpS;a)oxGa@{05m>%aR_r0m}5_wk91Qo9TlC*LgK=DnVrx1;L-li0Dut5^Bv
zt+r0%&57oF|0g8i^V@rNH>Mwde{a*wa;>Tfvw}Qg8(P?owKg9p6AAeswNr9M<_4L%
zxxofX(-tjLJ^FA#6-$7=;GTmUFEn49=6KsYDI-lXLsrwoxb2z_bFM$vT1n?@)$6+j
z?(7qZ={Dq-7l~rqx=tiaI$`eoJ=&}<9k^C9Pq=Y-p7%i`Ud;`*49Dg%#_-K3x&7wx
zHcolo-*prBa8GsE!KJ-Bb+YwaXA{deCfO#R^m5xj?iaB<S^N26GK-K|-($B67P?#G
zmQE_xJn7b_**eSNy@L#sGFSM{j|<Jdn>R&A=E}$}UJ*Sr?(Cia-#R3%IXxrd8pY=v
zUR!2<?fu>pO((rICmqy%_V9>o-O0<BV)b=5DKD8Yt@#S)W$k507u)fE+9I=Ny4cOY
z5Et*`XXb?1S{m9vaLi2UJ0;^<5wv!)(#^sMk3i$%D7{4|be5cm(RbaXymP{$uxCf&
zTmm;wSoEw)bJ9%KR*|j7VTYBvqFP0^Uh|%K#z=EXhJNaf6(vmBa(kMRE1p=H_<L0E
zZ8>pfk(1Lm;jrK(D~nq;M0aY)&AVZgWL0&f#)!Z7ymwSu>yeV+wrIt0gZ;DAQ~W1S
zSSF_!w0XmXNzGHPu2}Ts>Ye6VCH3UHVF!%T4$PalHN4u$=-y796bX)fPcj3e81L-i
z?YuZucW3SGtg=sR>qO$0EiX_x)_$YtSzwslx6CP9r^n|xY(Eors)?_>fbXgCbnE?z
zp0RE_?PeUT<tZyou;kCmc)skRmC7XdZ3mAu3BKZqeWP)raF4cGjM@j&Lvs5pJ_Vn6
z(Xy>V_h#xOb+%b*CvF`*zWMa!>+k(q&X{gzYg;&}_437*Rp!y#e+QJ9@cJEJEq}h=
z^FrdP7Zs-8--}%+{E$#GV@}^@{`BYS|Bq`hTKTBjpNn}e<107sXoyfrf{lcuuU~)%
zZ+g$llrv0ODzkfKi&f2UJH9@6jfs!*z>iOVzPyo7+P$@4v*ylfz90Udo_}`yeNf}Z
zW05)YWa~xVq=;zTtbD~|J8jYwiO1}7*_D&$PyYD%_;mX%ma-mgRkOF2vtQwgn3_GW
zXD_?*V(DUK&$da@O*|=H^Lp5=n`f~bn(q>nTviobB3}6TVBdmif)EvVUGG$E5MGgb
z?2f^AC)Lzd-`jQ`fB7Tw7~g|O&4QPDeoj<zIoUs9f{L@;nH_&6Ux&$^+i>=`-1dfm
z%=3#i>cx+jd%ILzZ=UVv79e{iz%}Q3^X#}~0WUY`_8eHp?!5QS<0PI?!K+^rR!qMb
z)3Z>^X_p+&*G)^h4MSXQt~W3Adlb6YeTm?iuL@yvj{0VZ{q1;?^dyYaK27+r)aq$G
zXGImZd080FP7O<*)-SQ{<&+C&!nKwDcX2$Zs#rPyTv)<)Bgt3Eg(jv=a(ngUqpzOo
z(?79T%=Nq6iGL4s`S~*#kE-Pa&ouEe@`+wF$vyqZ`ZRN4hkZxPT+i*2*}J}cr%9r0
z!6PxwXQy;72F)l>nX%nx#*uwf^4L8s7|xVDSzYmL78~cOI~Rg>r~2>v@it?-%C*>y
zi9)OO-%U(d>%+2CY~RwIAATFHIcsYm8j<{-LG<&}3v;bs?Qv$xc2KPBW~om7m#+C{
z_a)QgM*Tc$Svw!P^GmCA=52B~A=UcCVc(s#SBm=Yp7iM5P_px*80V)`CFhM!nDhS3
zl2-}0Zrz==wJ_kD!2~}0jW%zp9$aHwy?UEV{Ku`fXD;6k3KP{?JZ09hDfjvgzFgXI
zTQzB_h@qzz=enOqX8N;7{3vt1Q7dSA<4E(9r`*fVO#4(2aqLcp+S%Uu%2`pdidD0o
zv|MV}y}l{5;>F>=qI<W=vPXv}tXzJBt3O|@=Eaq}Zp%(yJ{Kf*M!2H*(?ps2A0OX5
zdh*!zw%N=`v2Q1rmgH~hZmM<N&^__HXrjN%o@S@&JMlM|4&G08{Ik)TJ=b`#T-mV=
zN~dlcmP(u`Nb8R}Z20wL{mSFNpH^5ie~Vr@d*uW3zBNyG6!fdB>D&*SXu0aZJo%f>
zIWvMLy$zg_BT{tDY=v8q#dn))o6`TY?dW3PxnbuO-r~&IzL<?|2k*@C+3-B)NZc1q
z%U8eI4)7LyIgwne)srvAxB2grle6aXiCvg?&PM#svjg+gHf2p+b8WNQ_G@$HU+vvL
z`R&&qr*ArSY&e~$yRk{MA$#YQ)d!|a`JZu`Ea9*1qq1FkM&YFG(qS{*tKy6oJCw#<
zFG@RpdoklYg@<d}Q_5zVwmkg*a={{lhxd2fo3N?(^i=81Aps{Mb;M_zMn<cD?k?PX
z;qC?Nb;9=|thUVYI%RhHtl_pa<2#83EbQAkZhku0ZmYASTVV6KE$ae$oRohpIeGPP
zUXbmNlmy=WZ`j`H{kxM`ZM`sKO7MZ>?4l11_8u%zF8jG4Su7y%>-_Ez4@T4A9gn&S
zOCq&5u{`wnec^8Qg~=J=zHcwC<2$r{#f!k5zBeYXG5n|ZOXN!Ve%np!4|U)6zqU{_
zOEgkORkyD&SnBfyr^f-ee^0Qkei3+Tj_oD&+%V^aFO!6~Pn!|(?wiT(pzZAPjA@6C
z*dFZ)NEcapL8Qj_ovpNTirKW<4fiT?POI%<Q(O1$#<tg6{B9^u`jC_S;|f;_`|DXk
z>7OnzJ#NkY^JSWTLsO_Lr^aRut~p!w>`9y`@u?!LNyvVme&$0Rp_H1Az)PH``z4|-
zc9hEQ+UjKzUbXGI`~N=Kg`Z~L&fm?xQ)~HQSL-eTOSz>huUW0jUitHyx8>>f<(n^A
zXU~1`Kw<j6>v6YuwKRn7_NJ<7FP}2Q@09P7OFlniyB?KzB>kIU@3Ciw=+9Yer&izf
z;XOI4HQ7Eo^Rq<C;UC7Q+@`CfEUuPcv~jxTx2Vk-C7V<W`<+aB>=$NinY`%YKK_dt
zsjt1R>qx)#x%&LE0Po=)`WH|5Zt2M=c*k+^z|t!ddbYbOSEZg+4?KT7IpXL22gUK)
z^JlMkbE^BR_w8$30iMZ0TzSzEou-<vKZ#n&Esj$W{=_LHR{PuOCC}efvE#!2(@t97
zH|h~S_tx!^-j4^t*J=Wy6B_h|4piUjk)HH9FimM|{pt^sN{)QKzfoFc;>xXBh01q3
z7QQdYO(?xS*HmrynUfJmHU#ZnnsQ^S{5+4ebLD&bbpvFyZb%rt_VZZ3YpU7){td@<
zuV#L;-#W1>)$reDZk|nrmxVUZf4Q+HpmXA^bKe&%oA!uLFOso*n)$@{XKnVeU#@W7
z93gw;`i9QR0~Vs4*WJ?_=E`njxo7z7y^^rDSMG)=iFpktROZ#L3Dug|F=g7V4OMcf
zD|z=RJ1h5xtZU$j-+r)q9e=T3=(EMi&!=CU_hhB%+^^TBEoL{)*c{m;wI=kURPM60
z9-HKK0fyaXA)CThdi*)<vi{4N;*Xt+Kg#K>I^_{t_QF&)c6!F~%bD|n#5tGjo4>Pe
z=T7d~r?$Le{o(fE<@!l)Qf}_qcrI(oX&K|sYf6~5&$;}mMCeP($>e3)r_RN$t8qDV
z*0-hNQQyWRN4$@i{&?f_Tx|LJ&$s#Rb17SNYw@p)n9z3Z<lSkXd`o9-+OlNroNG~D
zyROCGjuU#l^hwcM)kmol<D!<Cha|2^%<w8%H|?hQ>xVb4o#xv&T`J<9f91JXd&F!G
z{+l-;(B`ns$8&n$yZzTR?A^=Yd~6Z#l&i&^uSC8o9}+f=TXW5<N^aMA`Hpk14l%sA
zu}>~J|K*v@vFG{T9g2LlhQp87{^H%{gf%Rzd)~1bd^yauQDT?9%w^3*d92;{COE9C
zbhQg>e)#zQ{)8VkQIdwsSC}8(zAo}!tnE*Mbms}n=P7u9_ghrkKjY!64yj##5~O&p
zPTjryhS`$~U!0!^8t8P0e-!lOTEvwRsBmW4arU#T4WGLnkKoC<zhS!QEyrbg`oV&#
z_iTmA|8HD=j(OTE%ZOZ+KZmd1GW?>WmoF1}QCQTjO}$3X?v9`BoCOa$f1liyCBS^#
zS8uO|u>6r9*M#MA8c)vNcIW!lmi3#8PM=$LJz)R3n_p%<zHT}@Zt?G3X}2@>es9aZ
zS{l7DeCDE<6`8G_OWrP8qi%X%Z&u2tY5&={8op=it@>Pdc5%#;W3$d^USGealC^tN
z@!4%}RD8-BpUv7EF+bzY0-f7=r>dehzg?#Cp0CteHGOiK*yeAknduwjek};Oynf9!
z^QZUL6!ZVtSeNPl!?(Wc>9ku<ge#A1(~&nhzu%r=hM(Kk9y5Wd>}`R<f~U4-)UvHo
zsN23S;Kk&QhFi;8wM38K=+VfKQlBlt`dL5lf-r0G=0yuKE%O3I&g|dPG*4rO^fj(o
zX@AvRAL_4Npvkp5qt(>>++Tf(u+$ZrubDZ*bOpVAf4g*k+r8hYJ^PHzvXl#pulE}@
zo{)PNZ`HWstIkG&xG9H?t4~(m_C6Es_4RXQeg40`f1j?em*QP<Yxd85lZsyZoYp<K
zId$r^KbDcHf^khZPtTL&p0{e-!6{*WjwhV2*f_PGf5`FKaC@17TG=zf%$*t`+I1?o
zvP1)Zoj1GVv1G-h=v!B2`z@_JP<OF?j)iiN#j5-McI+z-#=Gd>^Zq|)@A5dG>Tg{<
zcRTOjSN~ueC*2voB<$x4tq(aOJ-<UY|BV&Bmi{WK=HlK~#vN*<_B&=@*i|w8)wH)i
zOm4h#Wqxk_(qICcAs-vx&#uS8{04ik-tW5i?37$F@8SR>rqjEZIqt8L+_8C8#IG+7
z7hE3R-|_Ff^uZT}6E{~c^_?IQWm}c(zv92g$(gSv8;d^Klm6*{1m~x(oS#@7|0vGu
zpSr+d{sISqlEk0!a@v;Rex1BeTC6>moRyahbTqKeG0Dr%f8D&3{Z&Ph<zlM}Q{I1{
zULKp_mp1+Pblv8OACm;nsya5#YtesnHDkf8{0+v8bzR0xeajZ6pJ!q^u<rRa(>bU9
zZ^>Iz{4G^<{sbPE=A{>Z@YkGfXKM0)aG~>*NW`~9w(WV>PrP@LS#dS1zoz$i%*`2d
zCh+gtXv3sn!|iufTb%EO|5X30pI`O8@qO`7Tkycun=8}WH0~YP6<n%wytQ%q;f=Q3
z>rHOU?wEAv`R3X>R@)V)PkY~-eboMaM#8nLN8T{7@h(56sx7svxb5N8zuUMB-#M;r
zy4@(3CmY<(pxnJY^OJXASSoACcV6F+*;XrNxvrSCdO=p!qFa|7w??*P6^n+<p0#3I
zX+W;%!dp?SSEs41sy^EMZI)$Z?{|@3TUI}~dF@E?{)&LxcY+^wUOXPU;Y~);&8r7L
zIkc+wbFFWBK2L2PyHtf)akb`=$=~;_Z(9EB=jL<~{#PcuwQLq^HHHS9-DFZMJNJW(
z?j^&>)jw{BR3xzSY(8`5T%K1+V~J0eApei42B$XL)Jd$5w_s>CcIEhF*gbthWYFpd
zGed9hbe*K3{c^??r?Q_@OI{?a+E}}0hxVw;Z|-=gy*}+*%1OQ(ljkhEWEiBg+5cw@
z>*Y5$C&jMbc0^-pU!ctM>)D65I7lYmcl<a@YkSo$zARN2?vkL*x*L}+P3D?b66z8i
z$!yW>;-2K`eOyEEtXa^Smb{5txtSeV+Ul!3885hQ|Fkn)@}}Ld!;AM_T)km~4qM>P
z+1&ekFWNujD{k#r@$zEvZ;og-4y(=W=cUcQuQOCSr!QA6(*5hP_oLsRcRJs@z-Tyo
zNv52c^@o0w-ZX8wcD^ds<tq&$To}Z@@BerwlP_awT>hPa^YeCG@6CP{6ZM$!#8msO
zOy~dU?lPKjd-8&bQ7s=I*vc!%KG*S6%9;=}QDaJy#Qo5Iq3+MZ^QZ8{K5x5zl3ma7
zUBYbUNV9DR>pKGY7615eiqDrU-F$Afu~y3OYnz)JtSp3mjyU@3D%`VuQvPOp&;I4=
zE97K%*CqUXa${D+W$EwTXPG><Ru!#0Y%nQ3zTfblp+(n$^+Ho6PbeAJlpYsZe(1Wa
zdbqi{RD^MXd-)IHh4P{MF8(k0qv!t4K$YdEc)+xVnST?UpT+Iwwg3L$a$^1VBmRqT
znnb<bn}4P(d;iThTddh?^4~Sb|Kv3cn-Tom_&ECqp-*RDd^<H~mhaOYt8dmO6u+PU
z+&`|~V&9La?ZW%4>wkQ_y8Ci+(A`{<x;$BPsrCACli%y#+pqj~*TMLwX~`PrXPHQ;
zr-xo))hIZB{EE~<zYWX+$G2uJo}$onV6&vwdG&3dTPsQ~t)G`Hb4@;2Dui?Qt@T`c
zAE>YMd3j=6!iNisuW)|t4N!N!zkbu+!<`W#T&mqk3ndP1S=YQT`R<MDVGpXl?)2X~
zeFK}LZNdGW+pkz3WB0jI)zZ85ueU@O|Gazm+J3*<X1r*B?T%abX6^dFRb4oH^|vMa
zyG0ZIwO_veccygxitVAVPp@yjH#4%4cU9u*wyCL?9N+Qy`Kfk9TXEzaxyrIH__h5y
zc8>Ep=a(<{+aP;6>uj3+N1psy`@Yq*iEt&&w@ck$WZ_<W$<JxK=IQvuFI4oduFSuj
z#jAaWVdj$z7Ttu$Yq=8-KbhM)qa?vZ+Gf+<;!|$-n7H2M+V(uYo)~z1#^%21FXR8;
z;u2KW=lJKzcQP!w`^%#h+x?pl+Hk}iXYV-oVw+ptbB~WN|9HypKN@K#_)Yr7BTGB)
z-RI^_`G4|9%yQvx1-aj<Z)lcvSqN;1+we2_Hrwr^b?^LN{rULC_V-QWImh?i`lder
z&H1f7Db-w)-X3n<^`7^4bdB;GzB9kJ)^5GJI>C^0z3PQsYc=zJM;#0+l2y7R>3yk2
zY3e7D>xJJRF3NwKr`TI0!Wno$P5$4R5T5_1#GR{WrR~gowDk9{|8Mr@R^Q&XNn@AY
z>u`mr?C?v;kzy;$wTsGMZLzlWopt9%ZvOh&$7fH<nBD7=H8CXSz1j2a@jM60o31pp
zt$i}*Mda#@E&?+SCa@VdALLmv&;Is?EfI>0JN7zHpRhUZ^ZStcPZ2ZE^Zxlh;qHu9
zFP+8>$>9wrj+xfZUv(sK18e++#;Vo6l8y6RdL;E+#l9NsHqux&CHY6<nJ%t--U6FT
zQa3IY_<t&y^Ud2V*J$_GGK<u2)mhse*_o0fq+4EX_<Gy(Z)Lv!H{Pl*h;X_Q^)OR_
zy{Wj3^_k%FIg&dSzCI5~nf=zj^pe`w@HItD-4=xp+oS$I=k*cZFD3my?tdeb)44fo
zcN^R+-!|dZdrOv$Q-1w^@3E%f-om1tnPoRv&)@XPH=Ovf<=>{VY1c&OroNy3KJk%N
zx_;chg1Vo-Zr<!)8`fPG?7in$i?(9ZcE9_7O8&h&yZVLg4((kH6HYe#Kk|5bzn)Bu
z`jMJDhZ8C{<QrdV4c~kuh5x~ubz&1vmv1jQ>5|>1H@*15xk#rU_1-n-HXUba*_FHN
zLW<Ph57N_re&jB>qs}>z_x*iG>5BV1cP;w#<<89jzQ>nluFC&+ZE^H&&awrm@#R)?
zt&T5|T%Wk@bRd(t^0b!ud%IU0{jF|1-;Z_rvXfio|Nb@ko28Mt__;#i&slm>Oljwr
zx2!w6vh;`IytnEzJ-<q5oh>lCoipuLpndKyzuE6vCgv#J+_~UKx@LKW#nTH%`SmvC
z-V4q=&GI@@+5K_Dq3u(G4km;&ZkXNcw)@~>rF&Mh=bL|#-p=tgZ@X-SepUX3jKUPh
zlmiS*o$`e-50|~peJ&Tu|Mqp-_ShR7YA;haSby%FqxV65bJXW;n>SvLJ-~nHSx)dv
zoiM)3SF^4LvMsFhHjK%!UG~K_*g$(0lU@q5SeDAv*ABM1DJ^2v?Y=Cv2hH+N8ecbk
zH!Dh<p?$7!9h+k;bB$+@SKce3)198xY)2R!1S^~*_H!Mp{8jxz`{&(d4><2HZdh<D
zP#~Qp?Pdw9Kw8z0DKD7c#2f98v(P?1_v*?YpU+m6$;@~@`H8+j!HMoP>u-<RUi}W)
z%Fot6bz6etwq-Z}y|^9IYpLnk@$rjB#^HOZho16lh5W0qn)#2B$@xn3uemAR%6xfZ
z8yCx@C0>}nGb*q)(J}nbn$!Dod!A0J^=3FymcGn>8dtl+gGN5NjOh;x%xhN7>g1jM
zs-wg?FU7->S#|oO31Khq#hdW0X+HKlb8#&5--fbzDtR}m6&{`}KlbSG+J}03tCCtA
zQk?Ej%$q5#aY6PrZ&5&Y$!*1gi7~cUZk5=Y-x3sXRrvE@2O~=sqk=V~1?$R?{Oinm
ze61n2|GkvI@TH1#7mKpaQ~IW(*fpaedubh0{;ZoV-!Jb!{z-7<>vHC^bBii=Y(8p~
z<*pt)>51&x(=*$pee3u5cP=@i#1odoEi$Eb^UlTGH_P>2THk$^8|Ux);@1H|k(_+<
z1jVu#oz2sm0yU?oOgksusjgYEeCv_P&CJW{*u`QW9b9O))vv*opTF_r15R_b1h@1*
z+W#j#$h3>BsnAZj|KyA#f6cE$ZeOH*m|q8Y=-)9}R#JKB+rb_^!ARbNr__9pNwEE%
zsGD}cxPsFq{>2|2+jXUv7T8Sby4Ng!<JpPcwZ|AAcd~8XVU>M&`J2iqn|Aj_Np5a7
zI3}{!{<p2s&8iQt-V3~%-oS8(Nj|ei*SJm~cSS~tA7hb&Yxb|qzbtMQS!>sO3VgYt
z$`E18D&GGjT`#MRd&k+C@_AwVi*o*dI294SdUx{q4SSu>m#kf_nYjPH(b1O`@77E^
zs6X$k{j-hN?*H+0UpC{=CyR_D``$Y+cU%jsN))<yY6-X2#`~Ei`<-*jAI2TGT=M(h
zA*(A5$zE48x(g>xiD&L9-YLH8a#WCa=F(-#H~J)k?*<l2`><V)k(}VBx#h&eIXvgq
z-`c)zV`BXhUA~@9(cjEbD#_miCLWgi!?NAxQQ4O3(%rAre07yNN(~l&2(04J)!D$l
z^F#942Wy$EjrkoC%Ad)rya|}YJL|pD2G7s@LS|aqos=_H{$&5HVSMW6hAR@g9<#Zh
zYdZbn=bLJuLmU1cDh*rx{@n`4!`3!S{;JAWoavmNQ~j<b_n=Cr4e!L~i>JAF?Ef*z
z=(_&2%G)fGeD9BiZ8BY}D&wsBIzj7&ZJbK4xV~oaa#_a><t^M(EA!v7e$K9$-DP3N
zcK-VD2hy>L2b=u%PvEk*d$w-P2i~+<tcPtH?>>FM-}44{4gcB88_xFpKeqBy%EKF5
zKAR?+YgxV4nR-L?N!IHL4yh*V6#FGtPYANlXbY%~PItK4|C+&fZ)rff`l<WZqSv0W
zaba!`IC#aSs`ST{zQ4J1of4|JlatMUW-Yd_W41RtDH|(yFsb3%{=JFXQ;+yI@D{T$
zh`eu9)GqKeG<mD4z_EjMvgD*=vt-@;*3Z0gI_S5{jn6tcu31M<8BY8EZPwa|nX_HL
zsZ8(9J=Q&?C->3D|M$-B`r^<1kGp~Op24p)hQm46dd<#Ucsuo`|D$6Ew>d7dTT%Pc
z?(=LhYrO@NeI;)(x7vKok<wc5L5#Uy*ZAA@YkVEAp8l9!_bx4DL($HUnhKGB>ar$1
zn8?0pMcs;xs&7QkST5z9&GF-Vu&%!Ifuj@drP*vdzhznEswc@>Gj_ha;jlDPdCAo+
z3m+*tISGiwxp-`-+vY2GZT<Hb`|d6NUDf~Ywe7C;-(P&|zmi_x-xt64T+ElcJtC)l
ze52WB20UP?d~79s-RLFH9l;F&cee`8IK9pPs%bH&`w1P!ccK!h*^k$4sNWTP-*Hvc
zw8BZM+V^IxW1o6<`@i1Do2;IP$eYBP6-;QK{_d*IW&I_|-&Veix?%lV;9R=SJe?Vn
z?rpLCae7CYZ(Q`8m($MQF|AC!cyGZPtI$0P=Rb(D-fL3X-J03eE&S!!{AZcnbM{sK
zzP)?;|F4hcytuorjAP+UQFoP@=QoG1=Xm|I=YZ(G^8GdcW27R)iny+nD(Y|aU*551
z`vfs5kz}t|Ps;>FX2-8Rpqw;Q?)+()3)?p&FPO2wc1?T7yX@r5WiR|pJ@dUq|9{9X
zY<u1DXM@f(zK?SfmL3pll!!H3)9^3N=kK9&@;RY%{(cg!l>F?o)z2^g%u#l(E8f;|
zT*sfppVy2zUecSn*m<q@fA=j1KPD91k)GVV?%LZ)&wgIZ5&rdicI)|BTTkp?#rWae
zpNx%9o~p1q{P=A6vUkh8b)oO;Ql0j_IpT8hoxkk#RWIAupS(Hu`RwdZcUnT^p17a3
zFWK5#cH`}?XREZWA1yv{(Oq&+MAzi>0+-x?Rm)$n9-4c6>ztntZY<zA^~As>)OlfO
zf>-s)O>5X!Uf5WqStQiTd0sKuTGZgQL3g(}ABUQ~>Fzb6IaQZzzA9Xv?zigGuP6I!
zvw72srj)j3Y%5=qyC-VVlQ74M%m=&7JQgT&BnKb9&3>qT`t8$A`}7wI@$5L)D|*#g
zukN0Va3cSbCGFq8I{cqyz0cou-UaUccUAU$unxTW;_8Nr?|OT`NhU77FD?Do_|UTQ
z{G6&wH&TM+mwu94I>~BpU2Tv-)}l?bZt(m|H@sa`!kDn?!SM^5Bp+<7(>$?OqTte+
zr<;-t6)Rt@xn81P{q5221s|N17Ak0I&(Ns9711C3d29BLzLu3=j_nQ6+FQmbRC73?
zG-00Z^mQ*Q-Is^FFP|%Fxw>hJLGw2YkM2sf=BWmZ#wzC3AK(1^Tpkq5Dg2|a{leAr
zA!nz(@}9vcc53b?>$gF*oW?I4H{KQBzpuLT-`<e;Lp4hR{5~ALdHTQqI_*TG@D)qX
zu0QPkb!lnq+>3V~9=%<juku@{=!^^hrYGJ)LBgBPE}4E}r~dW%1uy-7CE6X?Tx7;$
z^kA>?-d^WkDbGNqlxdtPOevv-dTV<{w4B;z@+h9&xN*;7ulYIcPU~iFu*$lp_9|z2
z$0`eJ<-~m_PO7M!ojqSw{87XWMblF|&eV1<-YV2Md)2oIEv=g*RE|$o4p~(ev&r1{
z%mj_=bHgskJ~3^Z?Z4?S=VkM(*i$KImQ8%?H^(F7b<nXy!`w}OzjFUtJcoIs)~36>
zM{Wdddl-I5b+@#bgS+{h-q#-G>d&;+df&`CTcUrHk9&vL>rZ@&*H`3B7k<c-HN`yd
z%+*gqV!jtt)31e@c|KRZw*PSv-<=#s(LGB&=YNtaI$F1xy;0Y!#ZjJj^UJg%R`rli
zC!7O(U+bDKR-bU)Jfw5EXSqwBo`Wd=9?#_)qKYb0j@ur+(NWS-lymIvlsG%rMCb3e
z#__W?BWHPXnkn(7v77B}Nt>_YXZP3Yi7{7}FWbKx;`g5hN<9eJ^&<25-S47nJ7hJ!
zPF6d%g=J~Nf3?qR!<#M&bP5V7PRt7H69~>sc3z%yRCoHptGOR!oc3-I*l!c1{N&c*
zN2-?u$_26}813@<V8#Du?whPK&XvcyetM?de|sQvhS5I*3tipoJVohZN@fRzypIcd
zr{uhI$eFUm<@63MCmxe!NpsX<k6LuDxhHGU8?08yxp80e)X3A}@;8oHv{YHNv@HA1
z*Q4gSdryy7{>nocdW(va4C1>C55E$~IP+vG$FqGN6`adjXB6&N+_?R<<=^EJnpan~
zT#(<$tf~8Y%?vSxucs2#d-kxMI;5gnu`*1nrEa2Z#Y@fQoL*c`wGWe)OvqxD)2!Uf
zbVpq?-$%0Am6!Q?k(~09sK(<fnvx7pS+;cD)cUmL!=q!BEg{+>PV+DGwH(uI581i#
zpp0#1O48=cpdF7t318-^)%v}ms&Mbr3!R}VOcmNisk2V+-1vjx_#vgRL_Zyo7a2|+
zZ-3oeG5^c7g&|DlAO4Fn$M5J2n_IrIy7#J7*WK)uQ<Y{^Wht_{KV_Q0U4Go;M8@Rh
z2imV+X490v*LRgyEWq$g>+E>8G@TPk_KE(|%l@`36;s<@*p;Yv=Z4n0?2X1kK}pN!
zOnho!{ClayvqQD39~J3+sQ9)e@Ydr<J`>}Bu138(vo;C$UOB^kXO(U4oTAn5A}%D<
zh#ZdD@jIk7^2P4fC-*e(=l--YzP(7|nNzVTw{g%~y#j&nU-C{l?n$0^utuXza;JXL
zgw@pxt9MQN=rsMUeq&+)$JVyHLKkx)HmJU;I(Id8QDEz=dc!-b%AGgb$Fk?DzxLN}
zydAkw!{qv&Z8KILof=!T)#%Z##NS1S<_CQ}Wd7!_)qU<VPWz|F9<?zpd^U&qvgU%i
z1KBe_Y*$S=F=>Uu%nNGsj;m{IdH=cGK6YQtzgNEtS~uQWmo#aA%(^ok-KU*bmCN%5
zy^vP;`|kPX`;#VQC3)<>T~(esA&Z}5<uS#-FVFg?-~Vqf6Bc$Ug6F0G0uFao-(tnN
zh9`b8H?1k2pj`3uNfztm>M)-52^T-#^)I^E-pVA;5`D{@_0^|0PyPRk>iw3}`L#|W
znoA+}8xJqzg2U`AB_|kbe_npMdx9QMfbW^P-wvgI{9KZ@(>j>p-3!KpvV{fpwcp?5
z+Bb+FxO(LCE&DmM+s?0x<9;AxuQ2CvMO1J>*K*T_%ZoN^H+*JnHU1)d?zu%<uy(}q
z$D4k>v0aeSw(syypM#q7&KKUS`6d@&;C%mKP1fO#_gkC3uH^Mr|H63G@QbWp23Nqx
zmbM19^bm#ine(%kKX_}q;6dxY`*Zj1t@-?T^Zie^+~f>1#D8|NEU;VfqIDnRmG}4e
zRtulHCsf*Os?GeB@u=Px-Ua)9|NC<{-*AQNFShJ3wpYwvaWAADY^#62dRobJMah<V
z)>DVOvwc5m-#L1FvF$|j|9P4&pVnQ7{rKu?Q?ZC+J7?2+ft<x0yY41_yxN?8%5hKl
z5+AjD`?3tq@Nv8s{5h%j(f;s)(|l3))hDS|J1;2O(6#7m$Ii-v{SPL`POj|tn0#hy
z+pB{rT?t3-OkW`;vx)n_Z<nSNy~I1lH=IS6tk9MVZ8jG%<p1`}<7om<XhBlmk`TUi
zCzxN(x-R;NZ^LxsRdci7H+-6xeq*Mz{CCU4VWx9eyjJ-1{OZ#OcfaRYRquECms7=F
z^WD1r+}-er_U-pn<=>Y+o3ooix&GOjjGu}5S5C~=f1mW^_gvNV^)F7$SADPaVeh%#
z;_|vD=X=Y~-v4{9WApTmC+9mt54P`}s!}hvrpxui^*K+@*OjkvGU@qI9sJ$;c_@qi
zr+?W~JG?^$lGb1Gau0YXWb>VK`kA<kQ~NvaOh4ayf9YSHbr&)pANnvcYu}P3d|$Ig
zS_~Jgmc6tj&S>S9=;No0)c4GObe4swwNT}%z=al$25mtj5yO{FAJlIxbm;8s5O3q<
z>{zhv;i)gIcCQ}Y?wRURslT$<by5ubVJjyU|GquxwhD|}Ih$wYOn9a9%CW&M@kgp@
z)t4jOUfd<0`j4H8dUwSt?v{5p<H{=?f;*VZ%_n?4y>nG+`nETdUr+Ci6S^Nzle$65
z_qWq5zLjlzO=_I0j2<jKKCAPP!Z9zi{CtHuoO}7B51B^Kx|e6>tMl%_e@%ux29q{U
zns`&Xi&4JdKw_m5ONvmzGe+?Pu@Yw^j{bPldnAFMdBeefDFy1=rag)-xGMHPg6B|2
z^8p<T%SpxMMRl*b@^^<Cy{-~Ae2~m%5m7ctCH-A0<DDI{EZpV$wcDx>Jxo)Zf2T#9
z^@GU$@YN~lUriMs2wY-pXx7xQe0WA!w_&$I&VH#ok94J-Y#8$Ll-`NFSG;rjLWl_C
zy0Z9J-;XrBHhhp^`6#saM!0UnUW1nXm;5e?zgxNYpTdWzv!A_Fr{C{dzOCgJSC9Lo
z&TiHhEAC4CKGeH$`B6U$>4RIW*VXw1R4c_@;P`$-?#M^BI#rP~PtAq8^7n>54t>~m
zqrD?8&fa~?RB<_<&*48NH7-(_@UH4<Omw%5T-8U>9a$9|<yY;F+}Ba~x;{Wz^GNgF
zLl+WK;}kBM2^h>@<fy-oC)}5b^ZSjuH?vAse0>yk`ift)TH~esSf@rQMxj>eJk{uQ
z1(SKz3LjV=u*{gU;(N@mfUon;_)fl+`{k|kuV0tWbSv)taV<u*il-&IKwd|5+W}W6
z(d?Q{d|etrJCws0cjzths5jub;32d~qL;<h=~>zv#jemR-RrN09(KsE|IYqcfZ6!{
zxf96;nilc-&Yn7<b4kdP`8RjFzqRJ-$ZbB|v990rN@0}6=|?3W`I)ZlE8w4-s<_!^
zlfI$6S(Z-Tj>S`R6!eu&$Tz3{^s~NWdp^>k>bL67tu?>c{Poi&eEsJC$h!6J<ONSY
z-uaS$R^w^;4b70e1@<2<%opG~y#Hm(Q`LwDk2h~ll=H7==9qTencF6NZzB^^`N0D^
z?v}ZeojX(&mPcF=KNuSsq}`-E$G`HP8sFQSd$&Gdn8(N1d1c`mmA{XyZoigp^PFL2
z>y;39`V?n!Y4)AUg-d?;U-Gfvb~d}XQdjV6S7+RrxQE4y-v#f_m+{YgGq-TAt|QA!
znI(=E#|&@Aux;6u@@(7B{I%1>i|yw{gg?|i`+sd(P?YIJ2j9cuzrAOC*4nkQMdW>w
zy~O8jOaCNXxNWXoZ}oWN%gawTG;<y1GA(<i?OnCe!{$xA?O**~zP~Snv)&}OZfu=p
z{<(Z<Okn56R_A^#9^H^>GZ$+=ZR%=oEA-5|QP`T;dP=uASXI`e^X4=2{XviYo*Wmo
zZkRD!^C^Rt^!Dp(4b}xzro=5;@?UM|u3t=C-?wl%bH^H-xj4D(po{Z&$y1qgzH%{h
z$7-AjoLsta$@FOvM`kQYYQNq5;NvOd%jdn9Bwh`+FWWZ5=4<!U#FZ{8o#&lB99#o0
zZ7T5U_AyQTxGBNQJKXi)M-V^Bwek6;0<Y6~riITZC7kN6a$N}G=ks<cT}XX6<(~VL
zqw`NYY3==}!Q-TVN5JTJ_`}1q4nztbXANLB__C+LcB<{~<<F8NmR;N;`&;0WfsEs|
zj<6cBd9Q8veSZJJsaS6Jf0ku=_huS*giPq^eCDVieve1U-El)icZmo~2v2y?)9#w&
zHRi#t)lXZ$%}do6Z=Kie^YTPXnwzO?Pw1`UNKt*|Wetbd{`WZ&naA<0b;sU~VrR<I
zf{)(e3*ep*Y`>#OVZnU|!M_DuLer{l%#bh<4BT$m<ss2N?}<#4(VdxGZh>cK$$si-
zQD6&~nI*H;jGs5Bb*hH<ul>uiFPaL4I_$5CE31rqwDn_#-SipN?UL<YR~fX$j!os;
z;B_M*cui|5KQs5y`JCmGom?)?wzCV$KR#`r`u?x=tap6lW~_c%X|%1-{=<QD5=}zO
zc6dxV%hQ@3^26wcT=B%^t;}b9Z<LsaC<IB(3OxBZ<>nbPL){m%auSX&UR$h}*?vDo
zN5<uemVQy}=et%sy1u#mZTbgvxOYFD%8|cMJY`Wq=hnE{-WIJ9cS|`cPwx31(<N*%
z!F*lKy6Pz<GI<Xadl!8U<I8RT!^N^_@7CtajYm(J+;P}`^J00+%BQSPqIPZZpS>x`
zLAOrBvHI~3)0Yn(?rCfb-X`ciovY%!`IL3KWlci&qFTJCHW_N@T-Y`_eEK7SXVt5`
z4=Ln`y_(B)h^^K$(x+;HPNJF8lc{}S-8J0NEpC0mZjnC@a@5`NsBq=4zN*Zy*Soy%
z=*DMGvPM^V4*uL;uwqBVjM)wokKbU7S#)+~4zr-Zo+;DHHvF=6*VwYcVMpP%)u}tX
zI4=EMUDk1xFF53WbCbozC891H<JC)TRm3ztSv@-3u;9b3?mgCOm74koZ&ogQ_J(~o
zcP%r|H_;{Y7#JtqVDqjxzv*btY4frR2@VUMOqIFO;aK^JQGqMsrUaX|eqPXluxYt%
zdnMo9`SjCQ?~!ianbLn%{c^|Ur@igXdT%eZRr<;OuI)`i(*qplJFqea+pT#dr>Q)#
zN~!0F#=^u)(~nGx+Ofy#iLcf_r4FT)5~T}gP32bI$(0}f^_=0q{naJ?7LRthzn>vI
zf6=?kT5~4_&#q2rvdr1({(Xk=q~9g|R=0MXXE-6u8G7WHOy#}y#T%Dz>AG-GF77_F
z@|((cwrvh_NAEdDB>D%wH)Q$55F+^S<MSEc9XRWmX0phqCa&3DAE!6xYfNLI;^xTH
zuKzYR*=}NV-jU+9$9xLwhG5SbYKrRwR%`5=bwtl$={hw<#$&86RUFm{Jn!(~Y@L@9
za=?%23D?7kH%tN}CKMjD=A5B@Bs9s`I5F`U>nD|jbplg5eXg~{Nv&8gkL5(@Bg><^
zE$%$?zPs7ksi*sWr{gv4mL{cOtA**3;;$z+>~!MMv^py+mX>nIpXn7B;|igb^9usJ
zk27fYCFpi&hVI?mR9~-kb^jf^83$heJXwD{Z>emv!s;C-9M@G@A5l9zfjQ_STZez`
z#`C)Tb7h_RypGP6F%xZ*v0r)j+J#L0Cuu<+-P+C;DzYzmG?#n+1t&hAqtR1+esSH&
zQ!RC1`j<B^OR1z<{g6%5?LNERdtVsUo18!S_hLkD^MihcS&D^oBT9-G8AVHW-PN@=
ze!5hDTD$h;wgSFwt5VmA)amVe%U))moIicR9Kks!et&d7aw@T2q56fU-^4>g8;@uP
ziQIbQ#J0L5Y!zQo$)Sxw|ITlIDx>0ERyf78JNWp&j9qpMx$ZnPzy5E^>!LR=M4D1=
z<_l<?c4eNksqLu#p*ze1O;4=i5|=PZt69~VHk$~oVRH~^n{q<+qFUJTHz}%uhNt=-
zOq!(O(>h_I<Hsi1FIQbe6+Z_*KIgMksBgjHVuMU$1*7NdSB1IR30`RZw(o3`h+S&(
z6oZNOFG`%Zwy;R`hzN>I@Bj6XqwA&E<hU-I$^z&9ql;F`DhHp~c<Ix@w7Of-Aq8`8
zSak6FseQb~@9|ux=3s%M$3fGFb<9ttJ<dF`j4n^C(sAVGcqdUNH|v(>n@KWk8`nEl
zyj*R*Kkads@j{^&>*DtOSuegvzhjp*_hNH}ycz%GyWY!f+_f$7d|c-B^EF9p!fgE6
zKCU%Add;g(jJ5TG?a@**y_Ro6@7W&ZcJEfT*$}$+S2y2={q04+EVRt5(!SUwCm7W%
zo|3~h*+^E}+w~;#{=lis_Bn>LPH4`QSbwNccHJ7E7aIb0Zcg#ex_95TX8jYkRp)Ev
zC%lNYbU*dqQ{~?CGul%Y@_Ra%2K|_)w?RnQLUEV!#GUe@ud5Ho-ev9ER(v@&`dj+4
zABJbuuUs&?ct$LA!k*~U@pl@SFK*bmNhCc*`@FZ?Zzj>xJ9&lY>TX--9q#dhtzgmV
zVA)TTc;6q~s-?f<=xJHYqs|+CyV?Y6hkMy3&AxNh(%ds6`R0eaTlVS(7xBJp?=U&?
z=-x}Ns5>nU?3)j*t6%RsxtwWh$ll(a8`dfC&AnuD?boBXMt+7h_ROJkE=*p^tLyRN
zq|!FS-9o3{TUJ+Wp7cj|&#ftcYS!Ion96yhVSCSGp}4ABjh8kC39Vc@;ap+YiNi9Y
z)}Af5a+bWinAjFlc~x)8+%^e`r!yybY3O{pvh4QT6TKh4Rz=*K;_bg6{on78>pKja
zyys2pIKM-&%H@g2nj-f#y9||QdOTS8VePKcY0nO=TUGXK`ptP;&%Zx3c~-E;a=uq*
zR)^^QaBuWdxFFQ|_M=nIdGi{9#HkvQQx5FCv6Cfh1B>yZgl^YBv${#@w~xF{d-Pi=
z;Y`{p(G^_DX<ylsbQ=z?s$I9?TmM#`HMi2O*Ec8Ia=%WuUVr%Uz3OGst_QO2=FR@U
z`eXgp2fL^FP5KbI=<u|XdGDKN_5F9&O|Yn0zI&&g-JIxxsWWD+FL?DZ*F2&1Sh@gf
z^v_FsjJ9dpPqXe?zVQBx|DN`&v)cChoY4Piuxv+6$EmZ7{r3*vo9mJ*^if3Pw(^G!
zsqMS=>smfy-?M*T^|x*3m;I0^-F2|*xW|28f#d6&l#OHC+r*umHk#~m;eQ=$^g@I;
zzn?3IYdxP6-$UzKg($zIsJ`;cpAyrY>KRVG<oDe9T}A%k{}V0E5jQ6k+?o*l?x5JJ
zs!s*F9~!THY4AUL^Yr|G-PIp%@k>8kwCi`_o!bA5zuF@{Z214t`OEs_f9=m*>M44w
zePzDZfdwAzUFK&RSAAwn+^H2Nq8+=AYi5R6tPEex=h|gQvvs_4n6_?Ix^m>E>cd?=
zoBBkB40A3$az8m=d)?BnS8exPwmtJ=pZxX>HCd5`8TzYti?@EW+h#6tGNkBV0;kJr
zFOxvVeX@tPO{?BgHtqIQN$<yd!b`WkcHXzVXZPl-In#86%C{8y{yKlCMc~Ke<#yUD
zkGKDQX}zf+>|Tz`i}xRLJbOf^PTFjhAFICo+NJ$7uWtQUf92(owX!=@pWL~`W)LZR
zet-1LxjP^0`IcYXkh7}ObXnlxw{ADi-2CNeeXHQ0=f<KRH-D@tOrE*!p<doQEAxL<
zuF;K~9!S62`ttm%>H9XXWH<3NUs5An$NtF1_S5wF;#Te987)oAzD|~3GxcTdvKMPU
zzF5Ot61Vy5|D8%t9twV9YB^V7b27baLcjY7egP}<J^b^vt-`mlFyB;U&wa~U@@1yt
z)8DfnFJ656_U&^uuY(Hr7`;hNf4HXK?iIuLi@iH<#q{Y_$F?2Yo@(J;=K56Suj0I3
zWr5%BIsOa&vsJU)oh7zz>qpMFZ>q9mg8x3Qmz3`{{+2BJE;Vq;OS6hE?0=`4FJ-V>
zIQv|v!F`splc#xWx878$pO~<G?e*nPg6}*#)s!4ixVXQ~J41Y3A?MaJD<{<k?p`tf
z>h03=3!|^!+5P6f<*u5u>pt&mvDkdhy-of_$=j-BH#g7znSHo?t^HxQ$roG9HuBzH
zcver`{F++LqVMcqJSSZ?SN_K$a`g1+(@hUwzrXGAqe|k(vDjNF8{fqpVyP_urc`6}
zO1$y-RyR?BZ-D~ex@N_!)4AXC@U0jlkLSFQ25X1L+vkOA7JqJ^Wv4eMv`l0%(<w!^
zQ=aR2PIbm{sGja#!gNM3%ZPpH<j50_cP@o8K9gX5wn5}fqTmdh<jGtH>KX>_OB4FI
zezN<$5p}S9xoCmRbSF!_rb+W9S26@UH);yJ;WSWpP1qFTqqV>#*FNWz;h|vdCUcL&
zOPG?bv>i#?A7M20&`BZvl?@_W4Gp>8yx`1p7R_7yz$TbcH!FS?PqFR6&(GCDChw2Q
z*_L>^F7NH8`HLrnhzdOZwn9+ok)!_c+*!xuRr40CXpr8T>3b|<NBd4*ownI`Jp&m(
zv+VYIzkk-lTN9WjJnZ6U5@Vb!woN-I<^HP1aOVRH6`x0(KD$w@!+zcZU(N#(7ngEA
z@k-piXU_x6%TpX?Z)Io+;7IXG+-<YP@so+_gKvTfJQG%zPl(<d)o;)Bxk`hvvSFrW
z;}`9m>1>q;<XcbPpVBbr{&|)K99O;{DodL8c;<sC4j_RqZhoH>%ug~NNGuaj6?k60
z$wp<D!)pDU>GP7`Y5q!|pzOzaWX4@Tag86XZ-WH<e@xbhpTjl5^i0}v?k#^0mANXg
z?|eLkq4&neFP#UpbaT{iEu3r`AL3x^=3{#2r<0@Y3C;Y2A?@PFra1J>OrNN}X~WzZ
z%!^O|(@JpD5Z`s;gkH{e=Csh_-T>nTPt@~DQy%tBRhkyz%z2<AR+{VRA_lo<BE5F?
zLh8(cOvXvVEoX`~W_;aKBy!W=@t&2cf$}y-k2l@TJC8hjoY^?Fq2~s>;#qyZCv%vM
zS&f3{iXNErIg~T;;7j*Cv5IG61Vb5(-Rxdl=uX+L-7+(Ck(R@;j&#|brLR@zO;?z|
zL1>2IqMhx*E|t5TX3R8N#gx(_%5k%)P~my`L6#GZR;!pY&h%Y!UM0PE&#sA#vox1z
z9XNKQsdkCAa=qT{O*@`@F&vxGBz4Jk!P_Fi8(Cr|$0V*46g6+xHjEc-?76}E+vE4v
z_?-P}@6X?p&ys!ox5Xk=<jUSVb`ooPkJRdk8Yq7|SSQX|y#3C0!MlCojOND#wXD`@
z<g_=;c3rcAL2je=w~4>%?brWrKd?C>MD&4DnM+5VYooQsoYxv9VVq|=cm>}vK1ewC
zvRre<*`U|Eztu%WN6EGL>!#n$>~;O<bVj$oYf=4O2Mf{u^{XZ-ocQ)+Woc1eawSXB
z{J!~ekv0<CPG5f>4!&+uQ!HuERcC+u))V$(Ka;sHZf&$%@LzdKbXB2s$MaPO4NR|z
zb6WA;`+u<X+D^ahx#t8^nX;e8$j1hk^v<@tD!A9wTE2VUneEq3*?al9lpHGyu{avJ
zqsd|OlQk|E%kRFczv3?>{DoV7hEBz=!g(9HIhb3ocwQ~A_{XnY@V7<a-_#zfy?O4h
zzeFsl=ruVg^wC$^Z4vXwb=TSEGCZHL-|$uGe`8yRzfZ1wtU0W_{Mf08`VzYc8{c|$
z%e#qB7G}rZcQ|q9kIJimc8xW~fd=yP?@9}|&AO_-^5)sC%a+WvK5hL&yvly%-^Z_)
zKRA4{aA%3w%+mQ5erD4WT@tq%J~(%C!~Ny|`Cg_U*!R7ue)q2h_ENn67Y6D&EwAU_
z^`(5*>yoea6V^qA9G$Nl`%F*qf5g4G%xqu%obs)eJQ;F-KYuy-*?jr){d@n;<6gYo
zzW)2Gr<yC}<z)ZfvbMFVs{1!*k4638t}oWHMSQFFu^wD^?A41GzvsVF_|>p~-n|*e
zgj^Op4SpA_)3BL)qLHQavTr4+H|0CB*QI?m<_Q0m=W}_z@VAmM{*;B&D>j);pXMm7
zA9Hz&v!ry#h1Ta+XYP40V~Q)!<V_P2JHD8%`#UqYX3IL>`-RpIc2&8lAA0}eoc8l;
zCH}nUbG9vO*}8R)_pK>Qb#pF#x0<%s<bO@^)tohR|8ES_UVO32$ofjuliB%MFQ4B#
zR=Cb*`^8zE^PQ)89&X?BtXC{XU&O4)EF@6l&7*5`e#<v6=d8GXOuo;X@t(xG^nF|Y
zruD4ec=JN<xy9Nlz47(C8F`pf_Wx}Ad-AvC%!zfI%1@_!Uy|`!Md$0*^qF79RDLZ#
zpc3tT-SPg1tjzl*9~?DRm~YK8jf;9W^JLV$Ab~lz{UqMqYs~sq(5X9b+5P(bmWGM>
zoHeS)mlR%6xNKoD=T_e5wePLBxmRzQzFqf|IC~fW^R;Oow0nviZ^VZv<X_*Au}-G^
zZEVT?@-tI8?KkY-tHArmyP+{)EpO35bKO;&BmMV=vUdsnG!K6LfZ^E2b+hihI#hN4
z)R&yKFHe1Y(cJf3FOBycM|<(w;@nu%Wu`l{kH25DFz#~mb-RlnJ%pQEHYb)#>UsFe
zJ?1Nr_o;fkfzhJNQDq5(dEsZ~wF`c#+eyAiEZLd(XytDft?%c}babUlTuyxRf~-Ld
zxNz!6hEP89e_Ivp<3AmAtV8}Jh)Se9p0&?km*LaI%}E;;FmH{UZNy~TDPbJb_2$}x
zH>VcN2<m%SE*2K@cQ1>fceq$I*T?nTWlzuDTNk#abj!Ji-x6=<A1{~Hlbr2x`fl8r
zU2k{pjlEpI=9|3CG=Xhl6`4)U2Q3dXiR;4_B35+gI)N7=PSFp4Vi}@e09%R}d{cP;
z_4)-36O6+iHrA$dulzU9S-^Yc{{MYPxSq>uO`o0i{M)gpJ7?0Wx;uN+zf9k{dCR&N
zI@R}U_=T@qR)74|{`vIv^XKYvwnlB49regmErwHYPwB5`%RiUr$GN^2oS}4Lrr?M9
z6@NZmY;AtuGNZp*LWlobuG_8;S<_~`VT>tU$@=8eUENrti?bG<ek!x0c$&b!`$F?K
zzcFN7m^WL`WTu<`pJS<Yf0$&ydpe~Y{#|~7?cVc!8;aANEqlDvR~`Nt-JkbXZN}bd
zwRc~Zypoxmwx{i;o;&BAo(Q43Z+eTw-p@Z%V<j3hOYM5ym+zOqtX{aJcV6?6r`fwQ
zIA+++7usdEJnUn8#kTn=YFCq2m>j;DvpF)${qL5S*15Zc-8OZmJa2k5f9aiv52rYb
z+wVBBt<ry~uJD@lUYTBIuKPh=tj&R}hw{v%-m>kt`El*$pFIoj?+{&6zWeQgq|4RK
zZr#e<O3Z8m9)CI>bD78HTYq2Slo4;f`|Tk&15f?tyEF5jlr-AUygF<9+}^qGnCb+~
z(r0_6Z!DUzE^Kw55y#i)u7^pl4VUWAYKpulQlKckAwYR$BKxaMW#uh5taFrJaBr*h
zp0{&d;q@!K7%bk*`C!cPO6q}kQb<wo^awwnTgD1}3|$A9kNgNVICuHJv;4*PW~}}{
z<XBm*_BB~38=PLI-C%I}@NyUVgwK<IemxXv`EHHh(fRq;Ha|XKGhd~?(fj=#w<XE?
zc`Nq$hyG6Z5Ru6(mXbZ|ZU4TrS7%I~G-ZK*f0NmpShbjc3!I+zFQ5EUUcta+@6!98
z+bkYENE5U^l_++v*F0Q%mA=l4uKA@mxA$(0*_6-OaO2&XFUNx(3UJt5ILQ3gNakIe
zf2i@s#9-Npc_(^#G}9M636i;_b@zAovBuI1752GXvKPo-I5+tSZ#BP)&ChcYH9Ji2
zEDiVX5$N!FVSP!rn3;7~@@_}Itlm6p7QIQU+oNW$d+uh<w1}fcUdFt^L6;##ong7c
z)K_n-4jf%LVb$~a%oe$gZ;}$<Z9HIoY@Vu%pm4$3EB-pu7IMB{Uf=&zIq3R(wprFs
zKNO^Qr(WsvTc&c-I%>Kxzxk|x74wBWJ6$E#+z`{y;7%`Qe_nS^wRZXKJ!fC9<cyWK
zXli=<mQCkKUw7)aAOo$|Nk=aIRQjmG`hLr_ilTx8SKc33<ZWYdW%)JE4KE%l8pzo^
zJjQb7MNj?Hcp;m!>fQYLt#4+}v3$|!AAh5xt~oP7mg{Bf>|;~({BPLJxTvbMS~240
zl9LjL6YMt~<*8uPZ+yWmyKmw2oqkeN+JmOwdC0!avM70V;em=p2X)q+yY)e{T5jo^
zb&JD}y;0~fbbWumuHR>y+@4?7cRKtX7`8u$tV1l&jKBC|4%3r{u4`W||KjZVa3v~!
zvVyt8bcTelA~7~w`HN2*$2?fk@bh8XSMB59_}BMr-MY*A8_#X)FFx0I%@X?dTQ_)4
z-}7@>l7E;!dK{0c|Ew-MGl}c;;{}4he>3wcM7h6g^>opmtheGw-SUfn`8M8dt(JX0
z;oWcU*8$9ZnxTtzkGTfb@fw_a8u!94+f#Sx)LDHA)=564?q_oiBx8zG52)_Gpw#Z{
zW3fGZv(csx?zbKtm=Uqjeu1k|8NaCIn}hxnzG>#USMS}pBJa`_rKSjWV=non?H3L)
zRZrlyzs7S<YlHD;29~n)e~yRvj^14GQ;%u3$$y2!#YNgCP19!8Z|FB#Jcr-AccFD&
z!4sVwJ@d}*JFdcWTR$d!>#uixQYL#2JKu`G)OdVO#mQ~Y{cec)OgeE{pwcd@vgJp&
zzGm^?q?y}&Cp`R+m!leeIqHyM$R@sJP4^zVUaI&w$*A;}AWOCTj)0lpuf-YcKem14
z5t-u;e*TiES*)!Sap9$SP^4AgPHpX)=9y^+4g3?zfBw!F`o?tM`Ljum@#Fo4t85}I
z%-+_Vz0uos&gyhbE$i}kvO+6*j%`h3H8p$9epX;r{%f8UzY1j+tlZA`>W#|Z+f}Ql
z&TP+kAfPp4mdAR&`Ik2CUmMKflb@J#MlC+~%klgN$JKT&KCK+VbK%!^^PHuVc5rS;
z>|<znWNXmkY<A$nmgx-&55#=ZJfyPABrNx)CFy&=6;3?Ad4uRm(E`s$_v1E;Y8P)l
zG4IKyjb|$+PTJ^e^X>lb$m#zw57skoI3VqIpC@6)*<BagBzNsK`t5ng;)a>W751(A
zchl=GCmm-k*`(=Qy<o!fdA`o9BKMLWY)n1&@768Gz`Zi{m(Snr;R@3;w_{c5zVGiV
zWb?^E<SM`EwwAq3mdi~Ng&F_Xt$Lcuu|wk0?VjV`W?nP#o?4^BX?$H)dWA`L%a&PY
zAx~a=ax@*PvE{sWe%r~zzfAAmxn5EnfB9^!ulaY=yLbLg{PpJY*^fL+XV$FX4@&V0
zc{Ihql$URUZt_vT36-klm)j>rBrM#Ot!ywocmAsEXF`1w8u>!3m+iiNYlrrm`FYpN
z12RNb@O*4xyE$W>`){Ld|9T%seK5Yt?mM0LjrE!|jk~KgO)eDiHg+7H`XsWwz%IGc
zZpzz5OU!fm{~4`|oqY2^%=VgR>rQHSe{*YJd`o<_Xt8T!d(qdp<tzSg;`;V*dF3so
z<@xvieS7z`ey@dk)%Ml0P99lD1wEgAesfj(P?eqXgop3$>fg7Y&Ni*}7E@_up^TMl
z%HFRv3%as{g7mj@H(YGf+VVhfqffs@xM3}~HCq?wt;1CvFZP*DOY3?UGWpB4kdOTP
z#l)xgp5Q;7^itqFXBgLNUvK$MiL77DlV6FK{YzN==*{%`Cr-~uUsZbO)rG(XakoAO
zS*ZQ5@_T5tEZav~HY@g*{UY8z_U6a;X2_Im&6{p=etX*N3-|Bq)LdKR`Y)8Xq5PRU
zx0B<f?1@YQ|7v`yl-DlLzPdYpCfm~Bq(vFumj`TmdH(SACvVPuK5JT;=X9#-)8eP{
zyKcEzzbT6?zB*O*W8jk)aqP>JnEY1odVMk3>##%pv7+YoLPs8+)L(1PZS#z{;U2I@
zQhWL$e*H$@-=$~k^H;V+wi&u!so5@eThzr|Pi)!q(i5AXURqi|L-pwrZo4%~rc)Un
z*hNT7$ED8R<2hw^+o5=GZLTTn4VpNQUn%*|?G+`EpIT$0eWGE$jFz?0-eRva+vOfQ
zu6=TB!J?wmN7m-fo^a&Mr}s<Pt0x?t>UZYfuP6H>Ulv;#2kvA%`>k(FZ@72JTn+96
zymNlDah7N#a^x$`pZDSCQ?pXeR{zIFmTWSH656ZQ$Nt%4sdmWEqf-6->&8`9<u&u)
z@f~9Beye7;;lz?1{!h32ryi^S`)f%~n^0)tkz;r4%g^W^mvvaaD~rc`HlN(KX@?GW
z1uC44((AX6KEC{1m2a!j>U-zjuG`_qwoIdO!y^{$55m*tWLz(><<xfF5S7^(B>0xe
zB(A9~w>j!`E5B%PNJEZ8I78~S(y*co&eMGx4%r7DpI+iRwNYfo#u#SCorjhAXDUo(
zc8hQdeEl`ZHDJSK8-em`>*qVPZRb#rNk3GiAC(_q-+3eV<*70&p>nV3BKw2(B;VVA
zyQ=-(+NbW-vM*2hZr@O~=GttRsTVaFVkKKzma=WNi}rDB^SG(Eb=?ks-d|tLKK<?d
zxnuq1e-V6QFZqtXxwE|cTB@b>BfgC(S5#Cd&uIUBSVh)UbIy^T8}dszHLow9A^-dF
zj0r`5J0myQdkO@tb2hZ*+r{aWRn&4tl~XhAgrmNvM=Y1Rp*!ENOee3eE4wX=3_3V9
zug{;MywJhl#bYPmQ5j1KRgRUX1vja?d&HiZcsOs;1Y6BHM`SFoTxyx}I{3^)XIr%;
zG4)A(GT($+ro0X~GcmwYTPelAZ$ho7Q<r6tg_qDK{np7dl-nPhC@%f=rqi;>q7!0;
z`&|~rr&c1xPdvN@HtD;cXk0Q&``L*=d(RV%B7RAIGQ3b57AN|6?EH5`#!^a^L-YE=
z8OrXDSrpleT4cP0g3e4#*7ZEG5Ul<+$PYKgi&dsD^FVAk{ug3{%9Pdp9F{uDDVM^J
zGJlHL6DxXp*Ze1E%?mrfeY7yTy2RvD-TnppJ+I84l5|79<9D;vE64hvU!L_57v_t7
zRp08ntV>h<_vOX^mMke<m6p9}f83S%Q!c#l=la#{`|;A!GO;7o%dW|+`SoB=TczzP
z-Mx<68Ma(u(|=lefvZZU-H*rPzW&w4aTgx9SohpJ^;Ip+ENtD6qt;>N9;>Vk*E=rL
zx^?$+`t$P<<#RR#><tT1{meLLAJcwG9oYzjgIbG9VkPygS89H{Z_kml>EFo{nrHX)
zCZ4_Fb1}?8f8!U<OLih}n0DW}Im>Lu5x?`Ao%WV<7-l|r@mge)0GEN3<}r^g>)#&B
zxZ!IVzg(i{-pqL~r(YI%zos{xC1(8!$(=8pEI($+#U1JS!Xoz|^WYknicRKCU!(0z
zC6*T^1yyxT@ARm2_c>+ov{NrmO~?Pt)R&W%CU;+WsqN;TVy<vOa%s&&&#-fgS-$?|
zVD@h~&(M0_)!+JBKz3Nlc7+d;+;=}-W@=d=rtt9XU8ge}guXi+E?j(~!70J)<Qz^P
zZ;hjtotd6{T;#hHKTo^)dV1`^79SD)*on5=tDW4c-c49EL%LaZ{`@z=Ydrp>rDY}A
z{Ejf}IU1ajs`TLv=Q+QwBLz$1#nz@-m<H~e)w<l6W6iIbmuGK!dZy%#Q%{MEn?hBA
zL}+m5jN9s^btbxpIYb^iO_@+FJIn2Ah|;qXFWH2tNi5TxrIh!~xX3bjLCoc~%h-C=
zb~>AEnR79q$Zac=j?M1dy)SlXTijl)mvL+rtFI|<`kGWf@zvZ?PxiHon_MlKvvHp7
z{WUrnY$tU2d>3c!I=f@KZ9=Vq<6>?#$E~S~Hb-2~95N_B(Jf|T<#vH5<hIPA&8aMl
zln>r4PIWXs5GnV=RmbM8TY~AiId$P;Cd^OHwTqb?`drH5Hu=rZ>Qcw%JC84ztXg)_
zXV*=J26kbSy?<1ALZw9xDKH<=`BLP_k>PmxFvl##YbP9(qkI?7{KC3Xa4PFrfy|5t
z;)SNYX+|ep(nG{doY%~46f?PMGV7#)w0uzH1)ho3GPB%3d=2RZpAwpu>Ca$!s`u4P
ziq|^u6wAp4tiJN985`W#q%MMlUY|PpE=1fUf?c{ykb7~nK*Y<LFBYC^N^99_yrIcW
zVt&hk71Mj;SLtN9ov`KeUF;>rd!_0mOMvZ+1(F<Uj$2(7c`iAfIiw+eq*cs>xo3f7
zVlR)$qNyfQd#%NeObZn=QNHRfedvWLOW0(elIT*$=B>sTnwCv+TbzA2rzRE_1WPWy
zm^F>}L$!gU@frU^5g=2QT+TSzi>GvmnK<_>kW2=ddeuZKSD~YJjZVg~2yw7;wFM)1
zjW150%6e8JJ3WE5*I=J;<3$bW|B;awdZ3{ol{<&mAyg?N;Nq&zlNwWY#rUL3Y%J=?
z-hbb_eaAGn;EfzTXV!j`c;d8qq1K5<C-&9tpWnA=E#Idl7xY$eZL$d1eqVkGbLo4=
zqKAGVqA7(s1@h<YCvQCPondEz|4Ob+7I${smtT6g7o?yqP&B2`rFg%+pS#I@<|l__
zK_)JESyw-aZ`L%{$i$9Prr%CScPo8kExh^nql)zO*iE)`tX}U-bq>{=#-<gv|DMcV
z(FY5no{76O@mEdGQK<-Qkji#h=TmHHE+*e~T`ufP^7nU59iI;tOz5%DpZQbckKh&E
z<KI3hPB>%T!6?PMxuRV*t2rd5dgH!-n~y&*o%X~s_B&I<#6|LJKZ~}U<5#;I@}kD@
z$oowP-s$f67k=W%*QYF3o_kh!3!aDy_bO_da{P+e(c{|80#mb=v`p+ibhouvHF)xr
zhvoBce5>!;Jl&_epk~2?(o_={Ro8<Yk5hDZ8NCRI3=4{B;MBd(c<(RM$^Vg4wlBSK
z_@L6!RE9nAHb3k?TPAp2-NVlDBW#=91<N$Au!4opeI%y{b!Kxt^=Op$x#@K<?U3en
zj!$`OV;S!0mqbm8T7KvKwC_Q0TRzxLys#+5_9?@&xqg)lv7fEB^N7Z^y2V^QIHPvy
z!5gP$aL=EgvEIl*?d8RPEeuB8m;SXdnCV`=*TP_S_A*GM{vb0KW2|lY!s6(+;T#?+
zXKu|FIFR<>)@%WX<zH@17jRh4aeKaigPLrmgW`qY_k9k}U2m@znBci>o4sPgnR_78
zmwmgrVuP>#c94k3mj<T=>*wvhVEOf%Hj9eT*SEeL3C925`f@A?=6vVPu^?FZoj-@d
z<!ajn0uma}^=j;n?d4*esnY*jnCZltiNA%JZkSA|7G}D!Wg19iP7S{XOWUiR+;dMC
z?{{)ga(n@D`eP7j)%tQ@3xk#FE08xPF54q;Bm4n}y~qDIPVTGHWkMa(YJx6pni?VY
zcUy2!SgXw3KU-d`u;ne)F;QjQm%b!gZM#<8te@7CF5ELdqC0z6>8$9>I~m_gE}C}s
zUDPJ)%@U@^EI;QS(JY*)yVv59o%cmKp(jg>WE}4#xAzLXVw`Qdq1f|IYQQz!D>VyB
z?Vg3|^X*vA^)rCwCqv%a4Sxk0Em@ek4vKZ}e17s&LF>i6RfQ~-p@xP+iMQli*1gsK
ze<`|FCwzH=u=WnOrQ*l?!+DFmv{vnR>(;9E)nYB}{1?tqn#fV<I<>$+&{_6o>(0t`
zN_W34v#v>xi{8e2vGts2q_kM=3!U!l-F6%S{LznhNPIVWZdU2&wQBvHdo#););*iJ
zme+8?vrVB_&L4K@UcG3BW`l&d8_%oIIHNmG({Aj&CG2(i_4U;6XD>0A*i947JaeEa
z<H!Nmg<%VW5=}Pl%{#cS^4q5+hm-q*oz|^Xnzr-mI#mXZ8~-F25_1Z9n3)(t))cK?
z;lXg`+RMIbE!(vT>d6k5WnJs8eTa_C`nIJ>wu|wQlSS|X1qR1s6PGR2xKYR?b?L8{
z7+1)eBB{0~dxIs_?5mZ}Khe?KDV%%s;0_5RZc&D1866@GCT)k^j}{y-w5gWv>pT*$
zLg&Tgy12-UsUgJ`Gh~+rxZc0xaPh6qe)~&$(^<K^l-k4Prv+AKb?j0PvHX}XTjzM-
z^#`VJU+U)_)^_~;adxXld#qLW(Q989xQ9)YtGd5~@6G?*O*?&VS}fSRb>`_q?0Xs9
z9!{U%&HgZ$b3?2o_o{D!a}RBL+U@3i_Jzb&>CgVnPWfwv%bo3{R<C`z(dc@~%8j#L
z?zv>T{<n9Y?tiv8J+{)PcV_9$w2tnQzsg|z@y|ig#<BpOIZ7;BxA8W#>g4gP(3RVl
zyQ7@bT61lc^y=ux=eUnPsJ~=8TgARhUm=C9{LYe}YKAM0Y@M-4QCoV=8H00@Yradc
z?cA*Te1&R3<C%jo9PYN~Hl2Ff^vP>&SOVK#MnCRz&TF(Irs+M-z13xXtwTO$)5@h~
zXG~bGh5iV*Tjw|LOvk+$<-2tm-()VyzR0umw$2KUsSG|zxm%B%dVB1nPQh2X$>sO=
z*M0l8==Z*9fqOVEYWPj@QoXUnLdp8n`ER#=dK~qv5q>KrWLNV44cmO@U(ZGVKVjEb
zlu2rOV)1WwcD<M93iCXR1l>=)8}IoTPMIK+A<BD&c}w)#mcB_o+x1j4Q|{!Zxc%A?
zvO9KSbIb2L!E)cv)Gl$#n*XycU-#3IYe`Aj8A-EO&yfALiRV}URvx#5Mn7^o<IX*H
z4Y{7Y>UBKd)#LrHUw<wRiggZ--7SB$+VE<1Jl|FEe%G(7k1yHP_Pq3OUC8_6A@Vhb
zA=l-y7hjhPJ(OJ$_x^5n^!~0+zyEJ)C0*Xzimg8EFyH**>W#lFmi_wComl#JV?^wG
zTcy?6LZ@Q>*M-bK5;DKWGNfKdG_Kx<alNNTar5uMT8ZG=FGmAnt93-<s(n)ZCI>ug
z`+n<M?~E6x_1j+jN*3JveZ`u%))%d7<}C{H<^7>ku!f<g*IJtEVY_l?s!@Z|{xe1o
zZl9jRKXs?Z*6JM^_h;HzFh5<aa(XRiy7E!J%m1TmruA?9BYz-w;Wfp*`76KIYu(&$
zwG1m#?fiGu@b6W_zpWd7g&+R{Mq5m-Le=stsxS5VAOCuW-*!%`9_9H{lfQ-k*I#S+
z|MTVLnT{=ntj2;VI$fLm7EPKj_qxku@rvgzM~XeyZ0*=^N-(^Bd9=#p2Yu`d_p@-%
z_G^3lVMFoh{oZQ}|MZ+&c+104V9yUNm!i2<f!F$uwBDX;t}d`yRm|~al+gE`8x$Pl
zu81-*bf1ru@I0&a>*&NQ9n!@odfu1pboBXSVi^)&q>&Prc`<<b<iZIzvt6BeRok7O
zoe<$Qog~9Gv(w+?N<@)H%0B&z0m3I2PKaz}apv7s<lLEm`qjlhN6UE@A8eW3dc{|2
zN=T+?PVA)V$xl>y{<EkHuDBcNmy~h&j)7F3gl6VMc{k@IWmQd<!wMTGP7>OgXrhz5
zM5QG`Ld7iTlA=A&G_#;diq<`Cu@^Q4InGY|`6bS)B+k*ztwiJ575n9z?s^xlsQDf=
zNAvz(5%*K&`bRrI-SsY901{HayI1G<QZ@|}M{a2q^NTXK4;@a+D)x~q6U~_wp{>7r
z<@vSZ<~s!6f3*HFyZ3cY%;^tjYvKZb9c$}5FT{8APgLc{r(YB}#dm+;H*byod_S5y
z?{d7Qp0w5;gFBA5{WncNaB=GOkh@mLuU7_{DeYR(vr6!zsLqt$4!`N^b*dSx%(rh6
zyx7?g+N-g6#p!gh2L{HHDngz7Ss_QR-K?0j?}~16%7fwwi~c11(3-H-WQ#>@gy9w;
z*4LLFD1FVk`rwgwcItt<r{8#qFnTq1Z#@{&+^ruziLqRNvvy#FBJaDpYwKLNeyHrI
zxE;iH=ft)%Cv!BJKmU8KKgq%U)z5vV@1GnKpZhIkw!M$lI+*|+@ptLd<#kG5Ip<uC
zsVZ2XoHyxhn_YKM#U_!`!rH>qev!iF*S`8D2I(EzlrP&}yJq{m^S{2INu8~Fu<O(P
ztuNnmH`{R-NjVznrEfIQS#Kg}o!Qj1ao6Jon^@w{b=`C=NO|WNw>EonREYNRh*_t@
zgp^Oz?>2kKFmGycw9TO!=_biVr$5hdlrudsm(6>6gq_WnYX(!>-X8yXENF6!4F|K)
zjBk@}{xLl=Nq)cME7N`FZdV2#n6#_)<YUcPbG_v3U(dgO?K&5*{6UFtNzAmWoY~i(
zeX@G?^zQ9x0qfE>Ws1#Ty0q@T#k@NYI${<{*jl-|XI=YWeLeBO|1cAMPTi^nsX@x2
zwqJBlbRT2ZJoJEJqm206)Np(LgHK=Rl>As>U(J~mQue*=OlR4`z4<4tjy&;PX0~tX
zk%M6Zi#~mLy`hO|!t)!GGMaWMxxCPu+@mqU?AOyxJ63%%?KsW;b@$6pj#;sVLR-&F
z?bQslikw;OvnXiwCPP&&XRYE1o>vwIn=Ny>shyf<$vJUq>FKutY7%EQ`oF7_v*a|G
zyvs%Z>BPyOjxW@Hz2Hn9=R}crK0*I1wq7{pu~}qC#Qe6Tg4C=N%fYE2bhlqa_qXGk
zY~joF^11HpJ+m%^^`gp--;uk6w(=zxeEesz^}#9eXDi=a-@QNFpY7|7)!_%1Prub1
z<@(CRYoY&}Sx;x#h_F?u=*q>fbeNf?t+(#x^+%6pWnC@bc=wL{@yD8>cS{ZHnjLNC
zMQx4kxgXGfJb2Zn<kL&ErTHT#MqaJB@o0T~%PhZ#ch^s|lL@(YDe$REp_fX~laQeE
zqD`GsLZ)6RDosdYjZrO)QJmqiGs2TMoLwz!PFT=>ko2LcSMo{|7HOA<2X4RGs2S^9
zlwV~g_I&@BD|=llU1zVjy5(^1`jCrhuI2Kcm#-apUQufsxG8q+J?(uhJm#|&F<#Z$
zm&C(<_((&RX}n?E;kYD+t*h2c91b)$To83Pyys!Y6p4VfpR|t^-0|o6aWrH9n&!W&
z_D{}B{VE==C$l^vDb-(<H9~bk#LQ4n)-Vo@sB57?O`%L(QzuTnlF-_)C^cKv6)YX&
zDGHLF79P}gvEkp<<W-5&SGA?|cdgOcGrw0$`hC*UU2o2(-``(t5*sG-gY~7<owez^
zUX?}`ZV`%^+0PcT`gE6}Opg%rs;j9-CHQ`KGG2YPDT&8DD#>B%t~C;eFIpHbh>8vC
zc~~();zRevRLKL?S5w=gO2gOvc(?7|+olhxlepI_fm|CK26655P_Sz+r9xa=5(#lF
zL^{S3EIlp!QtHKqe_tb4Y?}0-&TLlBo_5an#vAjloh#aH)OtQLzrB5Pto*0FdsVEX
z&!(Mx?dmRleaU~F7b>&goeaJ|WBr+g8}s)mbEiK&>(=s*@BFkQ5s}xwtvMHc{p8xM
zU-HvR*Z!9;_1d+Sd3*Dm=vxdYu73Qpd+N=Z*6%Krr1PHs=Cj|hS1Ql^P+G~c=CUmh
zoAlYN`q`%ZnrE7)bJ_IH(X+A7kHxRgSS`FOtLE@tv%islFO{2pO$b~fed(!ST|4Wi
zFDK&b;$FzaEfnOMb<MwSL)fzKGZ$?>ws<q&h03$n{y*=U(C&VMTfpk^cUJr0mKqzU
zx`qooAJ+bexwvzas>BIC%ZzOO1&hz~Xx_gsBQJaR-o3JC(bKygPfgUfF8OZpYX$Qi
zck^di#g@C?luAn7pY~Aars&kkU)n3o`W)WKZ?tXvC;djSBs*%ywPWgAHosn5=&QTr
ze`<}%xf}hZ|MQ&dKb*DyyV(B4`aPPgA2{!ptZVwIW>#CXbK!ck=qLI@Z@zy0HKnHO
zc1+~D@GCDCKNPyvnjI7MZL0J4-`%%d|E{^WuA1-eu4ngB|DV73G#j);Zhm`ayZPLH
z9?!Do4YB7<>dK6tzs+3TD`#?rP59Osvz&Iby)kzp0_Cgf9p<Z4))_zYe~|U)>C;q6
zg|FXpH4EG$3fg0D<$zYsodK<!dy{-cziHb2un_Ko_1$bcrq93sBD3D+oYUIOKQm9S
zx)=G)G-H2P<NJk;^3Q&?M4#4wIH~kTZ2lGPd6hd<S4#Y_llmdZRH4hhN32BP&h8MN
zzYM&8C75gbTz~)ZR1@Brq;la<s)eJ1;fca^*B<vTI=!mv;rxV$@-Jtmr6+v)_~zxu
zU)PO4Y@RRtvg(S{efMs;V>7H5$iJ#&>re@J)HFFs#>9m0@1nHn+NaHxU)pOpDswP}
z_B8dmG0rG?XR+_~n#I@ETOYWkf9rba%KbO+z`djoO6F^lK3p(LoibH3v?3^&$2O{7
zvV7{tC0R1ZGGt6t{GYK_x2cCNZV-EuJa^^9d!G(3Ei_*K?a0#SQikPyWt*2LU0}~x
zY4<MiMzCo`#!JI<t9n9j1c&q3My1Q7mmYidW~CJSmS+~{vie-#%nX*>{AQ&T>y{pQ
z|97Y7t#Wkd{^2QpcwW~*=|xMAvn&*TmvVky(u<3?9;mG54NLdGYO&zz!IKOp=N*oP
zXq(Ry{O07jgL>C*+b45t?{4_Svr4LBOUL{k1D;h<Hf#PgH1GRuoDpyMCE}`p(z_7D
z6<IPHb}hVjR_d=SkJYWC3%UX&5|{3|_x5i2{}5iQup_VU+O^q+Hn&fes}f(R@Gj+i
zW73O_s}|lnyQ=N#&0tf$h`Ryr)8779`leI3mc3j`baBJ9k5S+Ey;&($vZdj=2~V{a
zTYk?pIVmT{J16HkAH9$q>KuC-q4)ZxZ}o!JV)~yx=&er@xnLBheN|xbZPBiS&fJB$
zJ&BH2A3W_}d_?!Rl6!IG<4upvkLEoq{O7QW!{}g<W`0atTT=NQm24FeXSIm1r@f~y
z1iaZcBV}!C(g~JVj+Kv%Ohly1C$Bjez%$dqRRgSC)#AC7R-4ZPy(#8;&dwV*P53M*
z>a1qKd0Kk<!i5nJ{61aeW}VQRdO;%n;)xe_T@w$ylVZL&v!?R#qYmK{e9I;H-)v*l
zocN)Fhg*3~#5dlh7EffoU3J@MvG5(P;qYo<?hXs@VJSN<;lpxn(x+odDmUH+ZuMAD
zx^mu`ZP!odR?pcQTzdNIqsC`kzD)f0A|$R%IW=>gi0B_NJ*ySE`7wJkKe#w_86JH1
z$X0On@nca1<*nA=laJS(oLFboy&`GNhS^pATdtHPZGEgF(i!;n@0M*_Y&cZo&h5G^
zwfiE|cmIkOgTJrYoVqL56!x-+`}xg_Qh#nf&0T@-$B&m2k1|hwcuS+c!fW|8^XVTK
zKlr|Rt#6&dbC=7V>ttUu|FU0H{x$9nU()Ps1E1cnu1$T--|GwJmae-TwY>Pt#gesC
zi)%}AZ=JC>y<e5xmh&ZL-`22y6AQZfPpzE7s@Ji{&(Bw+@7~*g?tfJbz4w2(c=FIj
zO$En?5(>gI?{C!JGxgEopY}a>z6v}22se85WtZ&Q!}+P#Jw9LCT62F(qKcKk`>Nav
zkp+D}r5DG2x4+DM#otf%ytz$L)|#HL?$4W#HhqYm`(#f0!XN8OYnct7e4f1G_ivYN
z=Up$pttrd*k;n?0za-84`m9N5?{wZjh=1{S$+!Oc4~hEI&n=p9qWi2_!s_~vUkA26
zPTcSRU-r`ZhT8Y6|I5BQ%FoOEd(Q*1h;Hxg%WnS_?q(f6S-Wk@9K4I@jPKr_zrXtH
zrzuzX`}^wN&Xtq3wXgS!o3p>p_19cI%k~Sg+<BG~s~0bRU%!gE`><72m9sflLh0${
ztKU3a!W-RDVz@am%RhYD-^Lx!vcl|}tF`X+X8tNYH1FIi#`D#k>e<Dal3P9=GWE5d
zqT0A3q9ShYN7my@-mK!#+^x+NZqt)ppC&E8Hv4e-9X^Zq^DcINu-^Ci)K1g8!6$<5
z&JwzI?UP<+uv6NSn@ir8>Qra``}u6u%?RuN$!o*h7Jp4CTe0<o`TZ-G&hPDg95XX-
zv8k~Aa--DbA7ZJ$-MY`Dx!gE$^TOYa8@i*5-_`TXQ+p6AU2mbsT9LeC-p@<lW*e?M
zmgdZAB@*EM`1<`khQkau^Y<mzf2#9KTQdL6U89>zqi<Ppde^><Oxx=^&%kBU+J&zd
z<X3Fnl5h26fygAr+_O^py5G;F=;mv3oXb_;^Zd%f$yLlhMIUAU`up9DL*nPO1K~wJ
zQtrG)z4@$_%k1y}+Lv6t#l5=nwo-lJf*%F<ve@<?(hzU?>&p76jJNyQslw~`T))>I
zkD2*_`M33&P2YqP6hd4Z58d+Z*3!5ZoPRZP=C`f&##{OL5@cSldbw6_&G)rF=daCL
zm(y?eqT*fBwFf-~7T2w=Ukgo+YQE(ChsorXscpquVcC8YLk|n-vd*_nSDqNYWB7h>
zi8-Hi!(s^+C$0ivbNdTiv+5sBZj^JIF0D3im;ZwJe>sOQZE_TET2)`dY5Cgpzh9{`
zKiAtz=^yVEBQ4LdYj8_&SVyq3O}YEIcGZtb{c}W{S!G{rxHU!ah3AnO4}(&~uce2x
z9i39dvwzJtBb)z1M|5H%b2N|a*Sis$UA;T%;<bxb?cMKl_shl??M}(TdYoUbB_GRk
zp4Y#Oo<NTCdp0$7v+oMOTTA|ReR|quQ@*yp;N?c&tgrLU4Se5Nc|H36i(f>b=vmI)
z)|2}-w}#Z8SL|4N<$k?;QtM~Fsi%E6ALhDup6qpWD;flFucNz@yN2|2bmi;Tt+25z
zH=A;JN69j)Is3o9xR%$nm3^t2HF+ocaZ=?(zx>|)rDpc|FU<4azPy`fy}{?py#*H^
zooG7Iz{nzG|7gb{-|M%}*{%|}b^UDK?hS%Imrf^?Ka;kMec+$A^;vFu^77pc@-1g?
zF1r-DMrPUStE(3CIQ^ZLwBtsV&&%#*31KFzF(=q`u6ShKXso(*f<yNk-)xRwO}Y0b
zrLW7rW4cw3fzMj~4^PuBwjYxurrx=tI!$=;H=YjW2Bm^>gF4Zk&tJY@Q2eyp_n`1T
zcSgspixtjsoZ0k}OX19y51JR*Z){7c+glLUXT3W3<MY{H-&h!&S3eoAV9e#u{P;$<
z^s4v4SM4Nh!frLO-kg>8dvSiT>9ZwEG(KHkynwfQI_Grz6#+jVzfAeX&cPFy|FV3N
zZlA@D$RmA4Gg>_Z&s^<##m&9zQF`pR++>~UZ=#tLwpknh-56rQ!o*+l!C^N~`|gLq
zSABABgt#w}E>d<rC8@Dfq<xFm_kW8D6J$;9`Aff*dcnTsvr6INd(52v`;5ip^LWc&
zUKLhmQ4;>uS91D}L*u&}c@vtW7T@M;?0)iU;k9M2cV6sk&|rGVew<e!fScha=K)QR
zrB%D-3JNury!sg~weY$6?uZ%E8XuT8rgH`!VTsZHDqL~ujM|?0|7@rAd&KUS&UiQF
z@Zq_-(*munW=>LhpAmb`=1#`1$F*K6s$z*7lA;$Z(3x{qHul86V$b_8&GJ82WjS4E
z?^}>iy_=DH<Kv{6dqsM@7OHG4+2>*7dC+>T>O2`4gRj;bUI_8?eO+0~q*GPF(ZlY)
z!;sO~>T&$f=`8-APd+*vt@v9lov-S_WpT4b_Y<Td+MTK%E;C$uT6i0OT1n@LERHa<
zOrv84H~Mo7ndcq!R`}&~Jne<=+R1EB7lxDx|7gtZyK^H;#$aBCLHFv-W;Lhgxohrz
zy<)1NHAk|~#owFnD^Fg_zWyKI$^an&hg(zJrQ%Qb$fqO+npiDouw1an^zW8BCS{wg
z*RHF0a9vgfAL)1A>g1jCJmLkN#`bsC)IGiN@8Q&q+rr9^&r7UspZ78<Jor%E{?x9^
zAMZr!Hpkn%u0NB!cK^@GeLjY*PYW+}{Jqu4Ca`w#mqRLxrh1BpB<;WaqOSeMyF+{X
ziaoynZ7p5FcznvLi(-$JH21SfJTKBOS-y42v`b#T?i*wcm+e~o%xnhFx}8P}dMaB^
zC@$rd3EG+;n|%16N3@KDu=Y3hEgr|-EmUf^{lRH8>Db$h_2yz%eP>0v2)s^kd${<E
zKvYBmf6>F^vkpeHmZixx9C&xe-s8qX3u%-4t_hQ$$*bgq<h8n82>Q(bEii4$=fstU
zCC7RD=CDq``1$7d87+ywTVJmUyMH&Zxvjjy<F~ifhZ(~9H^1HCyxrs}R4Ju&-d(p}
zp#Gz3>biKH&)YbSWbXB@P05b(wrKOZb}-~Z^&Sr?{kWiIe%4J1?>WS^KHs~={p|V=
zv#AqbO4!89H|LkMvT|Gfb<(oEY*?P!ns0DfN8%ah8@>AfzK7x-RA<a<%T4=Z?l)DP
z`}nfC>m_#wUW`=V_BdE`+t%sO)pUVNV$ywIVXUXS@q?D@>9mhW{JWjKEh#lm?B?Vc
zvu%?4K}Op;kN>MSe|^bb_lG`%SjFKNvl)3dN1ER<aNZuCX5T5zew(fH*Me_Lf1k;Z
zdb6X!&nz{AU*yx3&6z724n_0WY&&x!KH6Gg)%3^tzjn?JJb3EqvE>aZAAhg(Y;u?D
zSoCY*v1uE^4W3U?%Tao8-+${K9!7EJs@WfJ*j=8LwsI2xoP=k)l9{Kb^-c)8+}7oi
z%jp;}V}<U)UpLJvBlbU&{5vcCOZL2r>nq*%Ka;#`A2h#qUf{f0R+Bk)AF<c@&-ppw
z`KH|Y_h+=M%q(cgk<>10+EX~UH+yCY+dGbk74L3woJqaC{MD?TEy^hin6LJ|e7DW)
z9oO&Wx4+8HoXxU=r?437$~v9xR?wAojOC{f-Gi>I+iJk6x;L}>!}P+pv(B(R+x67A
z+&3<Ai@BA|)qOhmm5+(C-ZQGX{95E|yhYxl%Qm?aFPrDrSAYMsKW>ij-rHCC6#s2{
z)S>dZ^4lxXMBDj-ClY?WoBn>jH}mO7UX8ofadKJARoZl~$}ZrjspiV*w^<K(cy5Yn
zbU$Kb`zYq<7u`1!8fqE*uN4>lz7;V`b62qMrQ1PA?f<+IEt8)pKkeux#d*SOL?V=?
z6kf}TVElV_#;?}7_BU2p{C=wb$>`b4thsaU&FJPASuwqAk4WFi{qur%^u3h2?A9JN
z{a=4Z^W%dLc9^TNui<k0T$8<x^Y7oYhtkhRJ&C`{P?27@ML|Smr<f+g!}G_Nm|v>e
z6}I>HRL-O9Lc*@Q?Mq`;EtB7;mR>$Df8ELA%Zshqe_s5=ADg>awruyhov%*y{m>{X
zS>GIN$f$mWO|@!PoWh;SA16$?y+eVm&8V?;g@L-x8|4++ZBxB3w%>YreNFuJKi{W$
z%}A99b~#&~y)o9Y<Z)7BRb0DGv|jA5_Q*3IUFH8D`{2mb@H-)QLxJosrTs$w59Bxu
zSL8%T1v*r;3i?<qTlPDC)jD@p$q$pAQ{9)9`*r@jrfjof>K%!Yki3~Yw&n`IyBqm$
z?w17qO*<}$TE@-)vps+9!FGYEZxm*|mCcl1AJ(nyK9%(W+qv3i7ON}kcE5dOEq(jS
zR&KlA(@!J{jwGyEv9Ijo=VvoGtQDWm-Lsy3)vG%nYj;_5@at@w{o{aA@NJdQ8!Dly
zPrtsNyh)Plq_l6~wHd#k_x*gjgZV{Bc<;ls%Lfl%3$lnX<XRGWTC^|m^^Yr&>sJQU
zeS2ixv4VNGcI0EWKxyxYv+nXiy+6KO?Kddd-S*luM%+XG<EJP0=ilCAY$&DgczB!R
z+NX!wT_ms0G<t2NZMmh&DWNLhqxQ^IdwG@|=y@u|aY9zE@&wCD8G~9w16woW2_>;<
zv)CV<`}KA5gRIRy>5rIJ?RET{A{od0$ns>Wm1y{;R~J=9mvZRO{{DX3y@lo3KQG3)
z?<%@%E7otna=yx?n$rp<g4cH@cWX{8jb7%xR{Ndst4Xbz8<ze$d~K>*d57-1cJ;+-
znlq2s+>uv%xx(|IO4^Zs8onMo?T-GrA%DDO%4`1Ua_PH@+kPm{o3Kko@hFew3sugQ
z-Vartop7}G^;l_FYUs|#W~lh|*Wqib?&Tf2e4Xl`HF3LUD7W8LQLGNK=(H?a0a>G`
z++GD*-?pLj_C?vG?(|2TH>ayCnW5aiSVi$SSe=ERaL}sr^JXZwPX;aKOMHE6vGox#
z@uR{;3M-#=Sr%RK7b;Q!EwOWNHc@=~OQiTohJ<j?I(tL+J~vLMQ>7ic`?}Ph1WcNc
z)F+ee>BP6RK&bdhgg?m8eKVAg?*$p!X<2l~AGAU+r|_1NlUi-4jY9v?+o2oR{C@Ok
z!-P5dCK!w4W|u7fx8%#@e;XFq>%Q{On*FAq>lb8+Tz$-ic>P!YUKwB1S^pkgR`D{(
zn){J$a5i69Z9&}OJ#ts4-CGdN5S7(D{gYJ&t8JgNI@^<vlU@btzbHH;>z4nt>Tqb1
zTe<o((-Rq`LMbzo`dqKYW=9E6bFX7qzWzWyn>V|d&xS6I*zmT~epy|Azw<NAUQ=&W
z<Yk<%TwIi9_2c6arY}LJy9>W9Oc1{@bJf=4VQ~+>%$f9K@?p*ioPGQJ7B1Pwuy|rp
zkIU~{em%cxzPg{guF1Bzd|CRhrzS_OvmZ+`Uf0fY)7u3))X;WMhvZ96n**1dB0E2%
z<g>iqUXx|u_xQ+?FCzNF6F>FMn38x(IChUu#Jm~WmsP!wi!Hny-qUv?&tZYF*Uv+f
z*UWK$dGzM@^|)8Z&9kll*Z1LDo?===XZ6B|I|5T26b)vloMTz0I_1%vBU_e;KYu^(
zZ%JFyi9M;`ex-&RC<-6-4o^A%cAkLmdD$S5;^YmFKTodh679Ty#>clOU0%CwV@1~*
zAC`Hx2XA^#l<50%deK#$<!WBxn?IDWHHO+3R|RjIGqW$cV`AT74i|pD#a>#0@zN>h
z`<JCkG$zG#2o<e&zPw_V*Am{%>=8>P8lO%$#-X2Pa!^I%ddcdQj<;0GJKClhOL?7J
z5!TR}UcOuK>h7k^dtWuBt%<r2a=D;Hw|G}X>;;AIwtE(=T=w`y)wi0>n-)kaY_~A!
zUG>teO27KRuY@Kyai6BF(@qr~-7{Jf-%SwL%_!+vAh}|jWlQ>L4j1>P&CgFYr8R7}
z`OqCvv8(q$)*Q>f>p<)5=JM-iv^;;!(W7?r^Y>RxY&(xH%nb2e{IYa2BLlx$M%7PG
ziB)DAEsks*kuRP$30!De)-Gt`yk=sf+m=~wmtS)yDQj`hQoMBGfc~Q_Dc}4Fo#$5Q
zWVA(CGwWuo$~4)VXlA!$(*jAQ?;yu!n(PfUb9j1?#W&u7^Hl7st0uGR%*9oj#Y}3a
zEI247nc=cJ)1=l{V0Uorg#_808?HJ%d`<~V(-*aCanBOGcJ2U|RAP+~)8aU@x|N$2
zNGd`N{aa_&@aiDTSqB5oRk~b>6U36l+;%GHZCN0hz;c!&J7t03+GQ8N9B;a@=~PqN
zl3y9l5_{VYWKHVKTdkL|p^Oa_$Qf+NtK*hk<k^zbaKD*zR$`sdF_4)8ib-O>b}Be;
zSs<Cja#jLrCJ$TFjpL`9(t1iaCW>z~*d^3>)j+rwv=(k-8C%!|j>p!561|%~&Ic`*
zgNCbQ&t}FIUM##?QKp8HtwGbfSMn%_@fD_OWf~pXYBH<KH6bN$>v09~S-hc+V(#Az
z=Ne18M$10&To@Z5no_txPo%+*_0>J*Cx_;)&^qxbB0=NZoG#XV>?c~Qy+S7(eR#}=
z*S}2~v=)wcvDS%49cjw~)Rkv}*2?vP^j|Q!JZ-Y$<xL9OJRAKI;#X9JAK9m%C;iGM
z{m~}xZSBG7w%c=7oH}~R;pnUDvlnk?k_kEer^%y0<MW(O7JaUO<lYlgGxeSyd*uA_
z*5R(YH}_%%3i(>+3JX40HI{F+Z`$?rMw}hXq@%Nw8{7`-+)G?Iq1b5M-iY}BH<Ld|
zd4HO-uA1?H$Ho3@Ke?QqFU%@7D%mITs5~;^yI9PB?UYBqikMz~R@t+ZBW10&s-@$p
z<gD&TkEb$rc$o$rI^p{8-JxTXR(hWLu-iZ9xBbzZ-pgDq>;gXQGLl*}X;DH;p^;du
zWXTF0ZB4xcEz{mJysv9~@?YoF?VuMA6DB?~Vz{R-_h<f38H1%+_n28~w4>!;$QY|?
z@3>IBjK{0<h-qulk^}t9a+W3-Kb#WHQn~$_9>aTaD_yU(!SBjXSFbE{s+jMQ5x8nz
z5yNM{<u(oLD(6PGajkb!UiT{D%)UzrIjLt_&--r)msFViC8OSnVWw+ly%WRiX_@&>
z46~ns*faM(U~FwzH*fcaoom5s+0wvk*$TjG*{a@pb1VpMdF#)iFuBiWfxwHE<?ahU
zFM1owaY7{;v|=tT|Mq-=1IwCk&lWhaY&uwktI9#~LiqXE7jvq9i!upy{`#iIvSH@`
zZ)z+TR<e9oWx24D^Se6BgqM5e0yuc46pP!*KaOi{@R@Y{FDGNlwG)3i8FQpg?d4?5
zi8>7u@!Q8P!sPt*PV2d+JL44<CMuMGoL&eb=N>AFcVd_;R0{H#M{pd+8|{J?`6cyb
z3ze@L_pMSew$seK>7~<McUx0)wNsy8T~x`Hd2Lo=vnDazH@>7hIa<{I>>pXrjQ5g{
zrup8rI=lAeordo`fv3~Tb#Km%?2&pr=cn1DDLc+gi<8NmzchoNvnWWiPvPCh!)_d3
z8_r7I*s1c)NaM9wmfZy_`OmAw+3$q6)@U@<FjVfi@voynrirmNq5J5a&nc-p4!wxm
zYtgi4)eMPFgVgKKZkUxljjvkW|MZneP7>?&6<;3x__)f^&(rnm^^CwwO=E+BT^zSH
zC~?uxo2Mu9^_%#0ZdulK;%S&QyR5Wck942A3r~BObDpRuL&HpqqndYlTy~kCIL}cR
ztTjtgtZJr|grSbnzs)nGO2Q|~3X2B%xcB^+@wVjRJ(a^<>G@A0C%W>NFXA<p5O;QZ
zXm<7r<3+Q%#|nO|kl?duOV2-SI8lOYd&x4Zl<i-_JkPeaPyF55_2n6xS91E-)9$yr
zH#s;yeDtB|kdc-W@5YZUs|5b7J$(4bUOs(e|NqY|_rz_M-yhjgbYtn}h@4pds+7{l
z3%~ciKA?A3ZT9IYs!Ud4vn|DHZtP7IsdL>~Az(L^;kKyh8(EE@+?$`4&Rw{vxaU^y
z&*hE_w_od&mXYthdhJVuVb-oI5viXS)Yz^*hh-t$Wuw6FjtceG8aI6fo4RhW9dHse
zXA5EAzi)PDcZ=!dunE0a*A_l+P5NN}@|@Qs`J>lajGC?UE}fVp5%TDh*To4_&w8cp
zdv@kjHBa-M<CBW72w7-7TX3a)v0QrO(;~;prD56zVfPr8vo06ACaU8-{i9j#(Yx_S
z_}3k}5@ekw#q?UMW<}n2HUBi1{4=}nPGk6Ha%pQu+ofEwkQOfnwT;`Nl0-`$SBP1p
z^q<`QKHk2%`eJSTX^qg93=ws&r9wGDG81K=rdPkMS@K9_pMDu{rsS^rvgY%Oe?NEC
ze`=mCz-Q=KB=i65R{NzYSES8lHi-Q^7LmV9!pnniOBdTK##?K{oZLOtT&GVmG4eAs
zQm&0yb$8u~-h;M}HTPFMyB46h^?c3Y?P8Tl*@hcUO*WnlJ;PTW$@cen6x-qi$(n60
z`p-Wqt$J;E^{amStH;L|{rVHQa^1p}>+bfy+B@UbUj6o0-NzUGx|$pmd-(INI{Q`M
zlUMQYlUSAAzx85vzt%%joAuw{ZCx9G)Ma`7w|zW|zRPuAO<Zt(_KT|#wKBoAe~xb0
z^)F)0y6<umubOhEuB*3S<)5_5f1k`M`)OS3?UyxNSDCW&;NKN?JuB^gC9POzJB@3-
z?J}d~o*Ko6t8-tw`FwdQ?p*SBW5>Pfkg)YmU!21H16M9%s}Z{w%CPU)T;A3XhbJB}
zl6*EHK27q&+thRIr(&kuvW=PY-bc=<@l)WWr`K9GPfTim`Cr%W^zn#){13JTyq<7x
z`<37JQ{TkPUdD<hx%_`M<KL?p|C}QJu1@|1Mp3g~LDjNd+;6q)|N2s&<+oX6k4-#(
z%JBE<|I@F{`2X|e<t++_W;D&@FcNc(R1ZAq-(TuFEAUFO(xaU!*P>h^o_4I>U#UCE
zv*391h4`jcU-iRf6*qQ1y}$IDMV;I80O2JH9C0<GN<01bYHW9V6!qrZY~hZZLfs2W
zj<)}fiI||E|B8#T;plUno+W9e-yeBo9qF}9i7VT6M?tM_mdq-BOA({rn=@84J_$G>
zvw6|Nwn@&4#*tlZQl5ORXQr!5W$9Ro7->(>Skd_;;KUvKriE;=I~N`?PyCwk?~!%e
z#e_p=onEQ&dac^RwN3BjX~R!KZS_r)Ij+3ZQ8(O@nJ2+(-ZN#(3I4^38z)W@X-b@M
z!^5-lj)BxPvmhZS10Er1&6gA8*}SDSPfn0^JFJ%xxpIN;=9(&fRjc(1%F0$E#joZE
z-+Z^!B4l5+=D8{F<GPfe?w<b0<>$Ml76Blk$?xK(Jq}_PnYEymchc;PzTAh2##=3y
z@$BX@^IbD_`rRwfuXRh`>G=Lb_Rra4rDp3=f27&{R<BKVKAxW0m{YfQ&yS+230mE;
zKiX#>TKDt)TGs6^*UL=j6^)a4x8SY%P45RUer2r6oBMdRp{BH8>@U}=9Y3suPr13M
zZw;Sj%P`k5`ew(AlD(_krUYJjYRp|QV<wMK=Mi>Ot)$mEHlFdXrWqQ2nCTQ)XHc{D
zSd>)M9J@6VQJtHLG7BbFZOtn9$hyJk!MoHlRj;p04jjFeu<GDZanX|vyQklrs!>0I
zt=v94Tq&?xC}vNtCUag&^s|(0QyMG(e-`&#p!~Jw{;cw%$K8I_o6gFs$%gZ3OxyTv
z^J)HRR$mpjW$M}PxNc~EvdnqDYo}Rc*RCC0J5rag>6Cu`Yng$jc;e0NeTVI?MW0Xq
zTm5X)*+~hmKi}W_^1anjo<*`(L2~-$2#IOov-IYgI3A3+TNn`8q@RBDjgp1YcZK!W
zwtDKWnwqS0HdVV*FlA+|bUDNMQ#*C#68G^Q<hl5?@{B^i)DyqvrQSO7a#7hcybgbR
zT$8-gQ%|miQPQXSWX?aSq?7&k6~0QvKYzPNBf<0TA(8h})=5v_X!`f_uPWE{6~P6&
z)U5QpZNX=|%6|UzF4tQl+_=)P`~0OK@ae7vE_?w!a&s3co4)?P_qD-;dhJ=$Tf}TH
z7_FSRO754~6W7O$B8deJ5q;g~Hm#oD{-CHt%&O+f{JkuOTDz;ApSkS5aBq8xY|<x{
zVCnloj}o*w0xN%%MmRE_D9-UTag5onSTfzyO~ga`Z&74S=ufF5u64iemQ0l2y3V4r
z>+z{$Q#1<JoUv33^bfr`L+GjWRLc`8tBz_)2QRXiYP5Y$%ZXFFo|b6{^E|tuUT)t%
zhh>Im?4s$PPI&%&eBo<;K-%^e53X`G&H6b}8L3MmxnkD%I~(pWntCr7lnRz+1*so!
z{ry;^Sv%O)ob_E?TKKAS=|Xq@u8CdQ)nd4#qJB<P!PC>vL%zMfdw;chbJd%xs~=qU
ze(ShasZ?s|1@*GCMZR*UzS~R^>t7$Tz-O!I^aF3Q3pstZzS?~w?_K}nk5g8?+a<C8
zpn{zL+FN?Z@>hVC#@*a_^vu-W_BFHDWZC3&UekB-UH;)+xVJo?R`$yki~228g*1z_
zRzBxC=;F1?D{H5f!A7QaldRSW_$-N8v!rb`v#_?G_R9NQ2aklUU%#kqHM4MR{O+z@
zYx#U$&g!qeym_O=|E0^{>7LTQ<+65}Y+lXME;H@k-yXBJso5QW{krqetE{haA5~L!
zTomD55%y6u*+N2%EoAl2E<>4bLd>f|YmZ9w?E)<|+n2=SzW7K(*3@{zw#Riz2lU;3
zr^>zw|2wxtd-eVui|$z*71FNO(mbHWc=Xg7FRcwu4i`7An<TVGC}2&`nk8)7EF!wm
z+M0(z(oeirfu;9MGU{RbvR*EjcXx=XN_9v|>chV|AvY_;wXdeu+x`A`ck#<jj}GX2
zTz`;fdpUId>8{07ADpT&fvj>%0IkZ?(>_*k!=GnG*mTiki%Za@aec=??%kBcbG-RT
zLwt|kX@+~N^{lU~+Ff+CeEZit@fQ8bF%_bM+SOVwH-Vh9#%tFah->v$LtJ}W3+!5m
z^b@G`o=JM$Y+u%&cbYnt<@@G~DUWS^D&}{VZZ4a4d#Yy5xhiX$Id6YWc>h-Q=FKcK
z?>K#{TRYVLraP+NEb*WB>sU=H+u?s-WFsxK^UajLlviw1Id*E-w)E0_yZrLjF0D6S
zo&ER!ir`CYWp~IvxpRrlVO`(z`)kjfyHhxQnRRx=w)9`UnO6#S3z{u9mfNzJSG>mX
zLZ!)qE8o#hkDGfT^fA)$aotLHC+PKmu-2Kd-2LCD&rZ)jaP<aU*i!eYd8^Uh^CELi
z<>r<)oXg(!&py1x#>OeG;ezCT{U0-xo;()(#N2X@_x<7LUFW9i9&{)>;TT=bC|jH6
z@$=uaA1_{f`?k&a{;m+2^*q%#7w$fO(Ovd|-7drM*{3h2u0MU@$2Okylj~N@Sz>==
zb0JI8|BknuU+yRLFNnT;Xsems!nv{ez1dlcfAt?PE<9GZ=6AXDujc%JFXjI_)<5;t
zZ18`vtXTAn`No%z;RndAUk^P%u4wNfH+kOa7xZEtU)r=@X4n1rD|)Zezn0xCesRt8
zyWa2mKD~J9ec6A1&RH%Sm$MDqQn)w1YFlRJ-r&ov+PPz+St8E0a2^G}L-@0<i@$!S
zdS*^}y8a<Mx4%jmKXYBTGJM~a(NO*KXYc&J<B=;&d+m!OuUenp$M!bd@Pn<%hr==R
z3$lNz#%$u-{kpg6s4@R`6;bB<?#%X14C|jZTyNrQs-E7pP=3Ke`Q!!XH)hPYKbfKw
z-op~M<I8Sg7NKUD=UKM@G<L07CGn3_tj_nmi8b@&{&fHT>-Ez(-aL2NCAam$_lt|#
z*S?j#!2i{T*+odB@Svw5pOjR4UEt=^Q=iVB_(guo0zsBWEjLH^#SE{LF&4ws>L%nH
zR!o!*Gpxv%xhOT&OLX295$FDE@n6;%%?s&0EYaKC_T=QAg!3PkWQkm8ioHHl>ZPuI
zjFfqCmVZpuI>F-S8RpemY_$#3URCiQp110tvp2u(YNN13|5(E>8FK^Azv{UPT2hvA
zHt;;^TDa@#-&6gsE?CT3lOZ{6^YWw*Z5b~wI=^VKzPWk1MAa6v8>h3HAzDi(%xsYO
zCi5=I|Ek7<R2yT4<Zmg@6Q;j@JAY&A()TF=R}U<9t;ugm47mDW;Zt{c(2BMT`;uN<
zT$O0QS}H6(;Ht%f(!+JvUg#%XxTwb#+H;6Q_vy@y<?H_jo4&{py#GEKvWD-XyGDog
z&Ef?TRa>%doQE!F%ecE?{?`B9H#Q&HDt9L{q=zZ$82>J)!~ZxO-mpCB!?BE)h7Mq@
zD?nN;PQbMmOaN=GnAl!k30_3k9K>t5D|VrT%@zUq9z&fKQhWXsPT7$f|0F{%Kc?)@
zvKwb@&dGa-I;utJK~}!?%}(iUNjkxDdexpnNvW>8Vw2Zw1+9Fug{*vgoHxl-qDxVD
z1qWF98W#Ue>lT6*$~l1-%4u^?Uc(i@GxLCo4tSwlqxDI5eGvz<X^zQrT$LC9)^KCm
zoz3Ht{^@CNx3Zst^_(P|4Y%2rxEy+HsME6{>8AOVM+?d~Rv!zPd?0ZKzhh@X!o^ph
z<#Q6vod+U=?nU&l?6zGc#<@lB>g1c>s&?k~Z!TMvw=>G-Ld-(X2M49On`Z@CUY@$B
z>HZ;C_N`BQyUls$ad;T2-H6?zp7i-f1oyjj1<&i=+|akY<ex4W+9O&P{JwMAEx$Eo
zb6S)PSM8mDZQ3;Ug-1?DmPaL<M?Lt**)OoH{;orYVZZ6Ri4P8)JQ@7@$)97NIF2yN
z+uLrcNHB_#e#-Cv^2)DgMs*^8>b7k?$^UFlhSkNb$+Zsu-M_56*L~YDr<k{G<;Hy;
z7YaZ8<6pP=Txrznl0Lgx>$VoH>tE+P`{(j!(fMa5^g<4m6Y~2QXgPJ$0oIAvPp<4d
zbaD6H|10LJq`efkvx>AZV^z_RVNOx{Y+cs6J*dXwfBVGUbxs`rz1-%;ZC_maW9=KM
z%zL}0y`OE?<HG(Zc0I2Z_c_D*<SVcLrB^llI=S-k&o+0z-l-e^y{Op`AyBt^@|@2G
zBKNnh%U5WtsS_%#pMT=pPK{l2&%f*CbUyoP@|8EwqJl4-nfp}s5BJ{rSN?r$kng+j
z^irgV{`{x6I3%{+k|<bMdE@=%`t~oz3HPfH?w^v)ws+w_ehb+vUm2&~{!)I*`-|br
zRj#3bZeD7AB=o8O>D#H>u6;RF7C!rU!?TO_{_}0>i>v<KzWv_PdjH>_yTkSUJ^y}q
z@#6ZumlrR7{`~yO(Vwrwm)w6jshERn+k<~C8?CH<{abFu!5^{EKmUaoi_?)$FMriq
zSRNBoN)<NqdHeFzCVPSFF=t<;7cd{&ZRoq-@5bdw+X-rMk51l-iDJv$Q{a1<Z)u1^
zi`cyIbeZFZn!8(^PUS5;@Ko^et@$^Pxxc>kL3TTH-of+|r9XY|_Y~#%ei!)^za4g-
z+yu!?vzOJfr{iYT@7tMWcJ18%h}BasX4uY@&C>mJ)_m)i;{3-J;mdAkoIP@W<(69#
z`&?PQ7Q3byE9E@Nd2ufK#?iHw-|gA_g+Hw8wU?RBw8t>!d`;%>vl8LSn-@m2PD#VD
z6s|Omq@{3<S3yhRW=dmO3in=`^rdk3!As$OHcq<h+r7$;)TMBX{QhK_qArEAeMj6<
zxSf!taHpH9nxISJw(9YF{Xi^*vw$px6Z!JFc2&^ie(+MbjN^!<aN!SOOX1kIqb`Nh
z&4Vq4)BXxt3O66uQaD>1f=l7%Zh|d^TjWh}DO_=NvTk0Q@!q2@$Ao{Kz7-i2UNUWO
z{=W9k*K_t({5<^g>Fe}#`)yIWw|sR!N(rxP;kaj2`}y+E-RA2Tedq8Iyb{Lo!{4Uv
z=ZixJ%bm^~x8<3}{@YABw!+lg=Nm(w?=_~PpYNvW&CED^;b{@y9ZPSH|M{KgBfrgP
z2-xl`KFepZc-><o`?|)y-ztim9{#n?V192M9v(7pp0)I;#2Bk!*>m@+O0vxl_O&QY
zo9j0>`BKkygWFFv8fOc7A3A@}^~$5alV|!bZ}PtU<W~Q`x><FmQ?^_zp0K0FSDcq|
z^YdV*>(8$2_#<%s+vGD#s(7ZRS<KEg^M1QxzFF;Z-||BqW)t7U1pL`N#oA_0(Thjy
z;y2CSuiTQ_^mWa|#f1(JqrFxp7_4%*an^0|-3Q+<-iKaqtNb-@yX*~{kkk2FEH)_^
zB``D|>9<%{aQW-D;(o1`Z>5`W>*cUa{$g}v?oT&A@gI{T*H+%XdE=$t1NOw?Z7WN}
zwA){1ZGEND9I$_>gx)r};9rY0XNdYTif>}%Hk~9@wqTx_kyH2H!)i_Y5@v6IGV`@m
zx$j!;hQsGL?VA^@W8A0WrfOc=`Si#VTjoa$3pivnd*WFi+x)dH+4?6h_(RM4K!<?0
z8Xd+=n{#$CaTwdyczt0EGoBf*KWFOWbFV`F{7kd8<~#G*^ON|Aori?aSm3(eR&)EG
zF9ff*-6dMQb<wXwP3wL{POrT!aa#5FG=`41=X~mQMEM#IFw5Fp&^!Dv??;HKu(a7#
z!Iy1!PE06b^U^!2xc1WC{TVV5?7iPFyX|KC#rW37^Uj9v4u>Yc?>X8YeK@x2>k*E|
z6D|9c?;4p0EU?}t{ba$l7u%d4DDA9TvGrwD-WFwrE{7in3z<2tFgcVl6>tTuytj@$
zMuux;)xW83FM?0$i9Ji;`s4j3(n-XS@w(Sv7CVd0q#i5hF23n~%%$>OXK(MBH|xUJ
zMrDl~_wo)nz1b0wrq8-KNW)WSuD+0e&<DTlPIY#6pTB%MyN)zF*JjOS=$4aXdVEkg
z&*wnTxgX*GR1aRR+4SQ>*ol27XEw|I_|n?@!h8nXwS^Pnc4Ydz{M7QcSu$2>lT_1G
z-&s9|Jl~X~&orce5bD@>Ayw*E=IbSnl^RpcS?dyJE1PeVV((FxI`in&8s7Pvo(G<K
zXO)$DhVPI>@RxsYzMn{WeQ@=D=SfppSSCz(I`P<bqsQ!(aU#9vG#&U>Wcb>zoqvGC
zf9+RO&P!)YI2pqH4<7v-X>{D|FzcMRXZX!m$6IczuSi|9_Uhe@={N2zOy70w>XZ%l
z^JhLPu_+Hb{XqQuFZs_Auk-&cQ4aP=tducH>aSeD=<-@)uR&)<>Lu2xH{P4<y05rx
zcftC{GM8%W6J@gw7%t7)a&(8ssr8J<cHZH>o2k2U>6W0&f;sLzE8nfy$*b0!y^g2D
zf>XE1V;b}E__xv5Z)~u?B*uR1NY`IR-ANm(SDZ-XuWO1~UTA&mb+2pb<Yi)lN33Q9
z{?M>(5fi)79P?vi+J~^lxii@nHdue=7b?>@$9A?{@Wzs#?3~h5qZbNpx$>vEc8cWF
znusi(yM@il=?7E4)O@p5OT1C{&}#M7^71PS9?HsH`ZtNs=GhVNZMNlywk1q*nb&sW
zbKq&^Bk?t!Ghd6J-jmzJ(_WseeRI||p}vKaN)1H6$mvfy);)d7%FBHUH>?k}p4zkh
zThmX|eZEhttWfT^_4-qCCN}b+^cfTGwo0bmr|;KK-XQ)%Zr1X|*^>WzgP)!}v@!E}
z_OZN>l53rBe}r`9zD;ds(OO)X8zG{3J#z9dN8^@Px2>30)y1%9yjt6AWj*2FwtHEr
z&lIIBTDX>}U0Qv3dC8mn*CI@pqa~y_pA47&`%(JGM$dOIK5>XKZ~6C@H+rQ?9#hT?
zWrhV6{5%gQ@EQ!Q8*ZJAW+2^gtHc`PBp|Y^!FvPbhFeLW{b>e&XC3^K&31Xcq|f*M
zE9vtOPEp@`ZpjV3kNl_W5AodIX>;$nxmseDl#D|3v97ra`7!B_qtxa$S~H2Q+HJ;E
zeDmANU1@p`IV4{=Y)#&^du{LTL;qfu)w(}ZW7KkXndfM>?DfTcJ!|V9?-2Xr^VRWk
zD)Vo?)3^M-XL0dviE-ArziC7HHN`pSBj)+*`Z#&!-;(>28nat%bK}mupJ!qxhl{=K
z<#XSvfBJhzp=;xIp8H>{T>pyq&HiEHAN}OZ+1vN;?ftV}{JG2fvaQY?Z`N2SovfL+
zx5_o*d^$_f;(foL{(gSxz^0DS1?#e#nEaM^tl2(~Kcvvt>($dTMuVV9Yr+T~G*{Jn
z*ZoO*>c*0e=PcT+(>PM+m`aB^)Eh6WOMK41P3v6U&(1wPmCK^kmzzI(#LW6?sjPl$
z@~8FBMb;(nI=1EF!fQ+aE8luhVPNsD_ax)$^%rgK&&qYGuiyM3a<kaaa8rhRGv#$T
zSUuOda-m*$8`*rs1>?foFE7qH)@}LY9DX~a{qDN#b-Okx+jYs@ef=QB=K$wc$If}n
z#5umF*r+@;)9Ywl=#!wRb%vAsH;2}=#HT@D7MA@oeSO{Z|K6oSX_Ci80zco4$_W>^
zyCY)8yz7eRr+H8Rmnc?TbMg3o!<q@;qvmvC+V`E%zb(8Y(TPXv_OvjOthhuL;l7nG
z|4m;d5#-4B=SjfLi7)2{C++*n!JnmS&L%oFS}ia4c8hfFw0d>h8_hcFO4jyYSO5Pu
zI{Sm7%Tb4pv}*TT$5vl`G%F;PaYtkEeT7E8t*@```C)d#taM>Bk>|{X_<BzD@w^&e
z`4@D~oYN<_;3=lh{_RYzvwX*3bu~13$IX%t8@7t@h4nCHUMo_~ykTWmdM#UP%KW`Q
z_>^89c;^*%-ZA8^&^69W)gj7uwO^Ha?yh@SB@`}m>Gz%wKfgaWd+*cZmSFtpt=x<`
z?LQ4ys<sFC^Bn7FWZZc<wcu5^we)rWCh1c~b9s-<b(FN+=W*!DBcr)p-K)Rt`Z`(T
za{0|Y_1nMl?TtR&ZzgtW>g>Ei$2D@X_MJI*jW~Lb$~v9hl=3NOrk?sEy@g_7GfqS;
zvtFzHE`P>azTS5MXIl0KZgY{J*EMU2h=zvH4c|$DlMi{GX|L7wb>C@s^v#J=MeR5H
zm;MqiPT4<w?Y!Q18y3iv+eaS~@b`$FG$E<(P5-2pD@zN6j8p38s4a<^pVXI<dit=<
z&Y<Z28OrQ;b4m+K+F75T+M3hpZlhRT)S{zhbkkpGlR9Y48as5&nu_*oxwMd}ul&zU
zY!2M^%W9Xip*!EPn?f@xoW7}YMh3J5d&3TrtC}^TsJ6>;($u~D#`&kdTo*2WVi4&a
zyAGs-{ie{u3MW1lQEx+czT=)wd`m!!-3lf_oF!A5>~!j@`ZJHPS*EAvXj}!IC0Dhr
zMQh#!XHO?FkwRG&PRl8WJkLyAoCvX_$fS!?^J;wjnTcyka;Mb$uW~kY?^C-ewAr=A
z=T~dR2kGwI)k#N}ow|EWHBQk#C1a&$=9AjOlMyFwN_<maD)H?%>))@7!OP?pEZFaO
zW&RbjoAP2`%zJ)Ko^<VRpkw{w75177FUpI55s!Yf)cdVY$6BAYmJweM-t2h0``oHW
zmu7c3&R$|xp=s~9eSy2}mqZ6My_IrXo8+qRSbh#$x1A|%_LtzVQ!d^W{ctOV;qJzm
zz%!l4cV+u#A5uEb{~+OP@1fYB4GB%5E-!Z(#gu6Uz0s~0xRFxZIFWfq<+mBmhL;ca
ztBWm|zG_eJ=BF&X51eaRZS{lEiT&}EBlBha8hi@QlyJ3fWR>_Tnyhl^vw*})P50*_
z%@?gN8~-hul_aycbEkynJno5YT{F5JPu-5P5!d;60(wH6q_&&;5*g(SlFR<=J^6JO
z(keI>$Qg0F-fQogBKV`HMelhgqtp3$_Vw-+)!R9Y3oI6ElrEHAY#<!T$#LeG<o@ql
zT7u?Go}u;O(Vx4U=bvL*8F_9(<>$v=Pp?aG3OOA)@#3axC$^|_g7Ig14{kfw-=!I*
zQfF*z%4rko9Y0aC^+2%r9Dbkf2$PUST;ZP`K4yvCEaF&FHB-22)73Lyb~v@PS+qEO
zS|A`auTjC^Rr-04WvLR4pTawYidG+<<Wa%Vd>~_j?GnwS99tfnxK(H_eyYB(UvziG
zJ7GB%#k9mZ)*4RTlDx`k4)Gz~8K!5`3<T%IhfXtIV5~LO_>l0XyAiy*X9{mQ)wHbt
z&bJRu%Vu>MU)hviF_qO<e&^wZnIXPgC12fiKEf_+vMWI-L|W`nv)2(Fo+9>{8IFq=
zv-D<7cCM)FawyTTh+nIhQP9?YL}}f!i#+Z#h3|pZ$KCmPp~<bHt>-|-9NT2@`Z!xY
zZ{>%IW=xAczfJgkkj2;Efb-N|%c~|*7X7DWwk&4#<yX#Ni;!mS%`ojvyCOX2Kj_@K
zB?}wlk6bmG6=*Nq7!Z3Q;VsXW1uK_bJn%8aifz%Z1&;3uGo(T<XWaOhp~dm|Ad9cP
zJ*V?ku~vf%%!b^PV-z@|E_^X;O6xE+y3i4JIpbKYV~tm;qw$en*DrMMnB``C%}CG)
zbS@p_2sSqM#)<QKFRs+dXgdLNZK8kxXo;N13&fH*1)(Idww(^DTNX$zVBv)xZztK$
z@-cWS>sgPlC)*61xErrp2p<fMywI}&x+Lz{<Q$&JR7YbcsB6{k<_O$w=A5-KK`10z
z<dB0U=*+yvk_<=VBOJ2?p@z=<!uqlHDl6}`qiu1Z5ICtIoEQNPfi(*Rj~OT#NTnsq
zfX@4qYhOCiphF0BdR)p%mkSG&j2@qq5ci7JTV~V~VcD~pee*n?$2z?dNsJORqc0hr
zXiaktopAJGw(W+pNfQ@+XV?ijE>2=A`!XLRiLY`B;_qBS9mS6C{wDNsZ=`;|4s=PJ
z;?}(`9EI27rm*fTIJ|;ulSS6{=^a7mvgU145P!!J>L|v}_Fbs)!cAKq)=h^D9!dQ6
zT=*zfw7T$3VZ3}wazA`k+@~X#xR6)HWjz0vF`>6iuggCfzAEnFt=S2#_GRz&I#$V*
zY)uI%J$c6cV*i3X%Wdi%4RaJ)?WNK_@>xq{ti16ysrGMr|G{jXlf}E<u`(#T+DARt
z=HQoqaX6%+0(xLv!=LaIZ@xTb=|vnE=QE}KirCQxZDxU~yB4)fyxLx(?aVusk6C%~
zB*9y!7C1k>?xD-)bKooAhj-#}u`@O<zVIRa<7Lq5H?Lpwf4-4ldh0xMiz8_D+Z!d&
z>bHeUc)U8Ns9sjm;J)L0DvZmB-D~H(IpyEpG`+85Jo;ZmB~<gf+tXTeYsEeOH6QF*
zJ)=%Bp4pxBiDB2X(mYYEJuKZj_BR=}c{xv+`ccfz_-veOgU_zndrvat{F?(>VdgXs
zw8E@u{$EbUCuhI1i!kk~dgqjGdTYJF1dpj(Ku5go-D0lT;P-5czG8zP-&T9Y1|Rc}
z4NeP|-}7)!KXPlezy#0DTg??4&fW&e`Lb*S9S)}hIw<ap;AiOJa5t}j7Ssi80WF^^
z-UnJxH~9o;LEYp_AQ53}*x_($`#^`oeW?Q-2v^hiTbStvOACnI(gr#lE++?eINZ@f
z(BW{VPe4b(U4L?~g~6)wDd=!G$!8#u)<vMh;Vf9~-T%K~(pvR=R)|wtiPfo1QzOKL
zL5IV&$jtw?>BSOT*x_)0!qrx*)j<!3`=C90OEL6txE)i^zK+~vz4?SL^l&&s<+8;g
zGTGB$OW>M4A5NL$T6G|e_f3pYuY|~XE>ro8x&17u+ug1@*$Ft_Yu}QQQ}5!yr&#2)
z;b_vk%1!^m63?uTli3>=>ci7&(#3NN`E0nDCE~}|g<oM{2d#hOc#!vMS`ybQp}*?|
zULE@IwM*+^f=-*&uGSf|pKD#p&EIvn{Mpvj+W}pdb}D6S<nn)v>0e`)(jI8#W%w@h
zT<)h$^&#;)_Zq%6h&rnrU7ed_20t7wbh@Uo`1JYQtC--2!>v00`g-d24VOTN!%aPO
z8g@9`R=F7H`nUbQp!IJR_n_<Fmi2<yzn#k!U0T<Ux&EyZvi|K4eEnMh#`?F`*fNau
zZ-20^f7|xA9lHLFOCTM#{;e`XnIT7V>Z{fZ6=9iwuRRR>6W1>OdD;KZGI65U`|s<x
zSiZRwsk3bzyX~e|cP{)sR+=z9Z}QpHQ$mcgtIv9GI{c1z@rUl+N1H#aWVx|!MdJG%
zYrOW<FvhN!FTJ=d`Cn$hi?yaZxSKeCWvtn@?6}vzOG}Tva%Xov6v-P>l>O8ELy_SM
z&{ZiX@7xUfvtr&f&RzVEe%y9UOz9H1B5TGVwrPjqf^$VbwmrP3x@P8<rkpi-z1I37
z&Hp{i!zTUF*rz%{@=oF5#?`kf&P+RVvjTMf+e(%6m8u`4&Nv?CbGJRW?)GWc*d1G=
z8lQe(n^s%UlHho>>T+t2TXbQ($j9bv&8=6yO>H}{i%WjhZLgD)B`->U&fBiqVB1@w
zJ8PlSO*h|!9SQgU2EYCUS;Uqlsk=nLyywaEsD<}qeg}6gy|?4#H^vo^b!;ni-SQTM
znq1%r$lEGZon^#sJxf^ik9msQFNYI(;VFg1>UpPHXYaVL<ajgB=cZoQre~*wuPv)H
znN=>|{cLZ;Gk(8BUf;yEJ!VNvuMHc&>Ng*Fd|c_nA7ix*EZpCdxW4b>;nJ7uJ`~>X
zlE|yS<SUoRyW=8qHG(47<h(ty7aw0_Ft5E@RKuoE)8?O&#u|IE*01ij+DtiJSI0LV
znmpssWc}tt{YztB_a8Yt>xiAr3WtY@J`XR7J0`x}XrlXe;<rTKBzd`0t1r3vJa{VZ
znDBQa$DL{&v2{)firmXP7Bl3Cy$NL4cC7b@(~g6VJALG;(iF}g$klhv?kdfQotXB7
z-|I({*PehynE`g3ub5pv6~B~z(53cedIIN#lN)5;P1yWr_mw%1(o6U_Yq{<;C-vt}
z+7u_kG{a)={g)3yr%Zolw=RbB)1o=68N}vqKG8VMC$y_e#${Rmg44c>SJ%yw(30$E
zmEx-Oj5V2}W-0PXYfXkmY>~#3R_luawkH=(xL)Pr{8hExDNas+*K~pmm*gTHsVoii
zDL)Rx^@q9Eh)D6O-O*WcP9h*^Y3PQzdOZ=>4`xVR5^Aewnr|VhwMw<k>@4r%hiwxl
ziTzA8Q85de1X&8EIZ@i}@Fh1dCyqA9BxP0EPlppSl~pA-9nQGHs;e!!C3Bj8U{*R$
z%&eo$$3E_hE85{9B!6|zuje7#sx|qhzK`oN1}zTr04)v++*hs12U;)odCBhSPj_5l
za1C>t=$NHH8FP&ot4QJNqr6PzHgZ~9ZtggDY%9<GGx0%7@^fDN(5brl?4tfrLleJE
z2ijQgO{>q><@mL;D8?*A!s{aFpfpCK7dm~eVpHEV{8&<W%FQKxMUbhIoowGG!HYZ1
zLwY;*zgVB+@?~vOsPZX|SDy^SWzy7|U6ejL_I91HO8)s`@<y8=H@06+%BT3-&TB+_
zJ9l4czv`qt@vjlDUfB9D9z8q%cs9_9ST1fGMRsIJ`xx%{amQV<;JeXop~$F958kD}
z^?EYdqp5qF?$QIjIj85GnPy~AK6Co1#=a|`YqRg2>|Ot1-NVCoqy*yE{C%^|aEV`S
zNA4_dey7jR)o$j!*!;pSAs|+DO=!YR&Fn|VcJ0&LW9@K5wej(W{;$_QNB*C;GiP(e
z-xss|X8+q~@S<7an)Ev!i|*FM%B7LA9>O9$S7q6!-gPbrJEPZRoXUUb|9ao7z_l{T
znR?NlJr9iD-rB)j5q2*3Bgf}lj<gQF{dtVnZ69>8>%=Dg{BR-aaER14`S@-R-=dES
zJSP%vd8d88F5q4Fht1sOhgJS_SH|7dLTQT@l-%9Xv-aiu>({ldoaZ)OHoaIF`D$Zs
z-0ah@XH35ub6?xe+xzdnLYtij1;a%Rt4g~1uB`e0ecj=P|7%}GB|CM?y~xy!`q(Qd
zmn$H*y!+{n7dpFtRdT%3N?dr@{qIe0ffEbgY&+5VZJ+9EfywGKAMFu4%4e47a6Ea<
zVJ<F*dCA_3I3Im6TDaTCXpzIM7t?p=tU7gFA#jDu%w(TM22Gm`RX=UeF7ESOQX6Kr
z%w<|+DxXp3l4+-oO*ye}`59ex#Z8;?cFLY&X}0`!^6q(Mb;h)y=@LtAij4kQ)XdVG
za#J_hdgZhhvFDcqc-Dr@oUXFNV}4s!K`K|!67a!jOV9Z?bbmd*k}X{AWH}co8H89p
zf*g$28Jt}3aid(;!Kvpzh2C6Wp1*#c$g7Rv>zn-bx3X{Tx{^7?Y5on<)25XtjJ|n9
z+1M@Y(%Q-rdCY&NTJIW(WjQt}g-WSXCY$)WHhr9+Dn2Fi+=(~uP91YroAgg<O9|Ke
zxTz&!9(xu|>htpLzI9_mtMh7&=dTvHOgCGzXo@zAaCFVuE~9mPJ|&eaw7hmW8Ej<D
zS*3CR)d833H&!ev0V!Zv(6tG)2<*s~>dTupTKr%7pVjNza{th)Ig7&1^L^hNWIFrl
z`#Kd{=~(HgnNnSAomczlAGx+C#7tq^zIjGx1)@)T-)y+C%W)N(%XN*PLQ~?e9jx0L
zUmFqm`)H`#fy|s2yS{{qBus5sl${<P*eJ@>wf=pyD`yy|#xAx@QPT*;1wX7hLq!rn
z3U-DDwt^Ixhq_9-G5-qhU)dJBN@|j=)}~D#>daQ<?CGBRYSWruXOmxUdepJyo<^XC
z&ssh0zR*|Sg+Yg%ZG3uhDsPAG(KS9>k4&o#HB;DjWQkF%SoFDf-WO6O5B$EG%6`>$
z=Z;;m7C0AmmF)bb1zP0wQFZI;7n`&gU8nzDy9l((D}L6NF3e?Jv*F9S<U|Z-Bd_Yx
zBe1IL$x{0?ENi-?pAfmGD}^;Fy;u5l32%8}@$s&g7s3Ku&YR!KzC8b`er<X%znJST
z#aOwA<q-=0{ePZ5Z$0-=RBGXZ%)d|Avs0_)Yg%R7SiNSLdp+lG{W^}yik3YLig6Eq
z6uX`{uKa|ZW3KeQ_Vc21wWFIF-%M!U_N_^D-oHH)KK(uW@#4j|Z*$Z4m9Dgill->H
zxx9aIztw@-lH_$}(-)tPo4)X4uH?B%v4NJJ^&RPtIgb1jye<4<|3Nv&?aNxTb8DQe
zci)q`e#Plm{4w{(J%1y<zc>5Be*e#9`(MrfPR$Ntn18|dxz>#Qq|3*rOaIE+?D|jX
zU|jrq|C7sioSpi#%C*-{N^fE8j$=zx<1I_}?_Uvn<@~F+msU*<WHsCC9-SuT9(p@t
zb+4S+n`~U`wvrwp&M^C(QBZmd;|R0R5S|YlydM;<tH=DV<=j5y@VlzTafTlX&ITBM
zNH+Q4%<>_MuR`~Q!j2s)Bz|#9{SsvRbw}&{XZ4vi*Rv+RD81;>Bj~|X)E)o&qx;2N
z|DzukKRxYm+Qgc9b*K6(y}18xp1bUmK6+vC(X$TsdH)8SH*Pp4zci0S^H^fTv4!DR
z-V~+&47_^o;sTalg}xv|E@u-ihYdR)|5&%VFK)g_leBELcAL2F7k0+NBM)5X`D}gg
z^`cSggsG52%J#Ok)h+5#4}H8Kxlp2PqRmY4H<I&0dYPg&@S85{tUS#>{n*(#tDa1s
zmwn`p<*l>xRyn$Re_hy@=zsOW!llOz5bLrEXIzzBy?J?-%!OHx4OUx<ZA|y8JhN$e
zk_cOdq`l1j>9(QGePSODbApcvn<l5+;<sb6ZFSc|_w44yYs@0%+J-)E2xFhQwm<Rw
zL%nYx7aZ$n)BKj=?g?I&wQ1#h$g-?I86AlMM<4KB{FK}hAW&`uI;1S)YQdaP-qpq{
zvScpodT5dTMcnX3hIsQTH%8s3$A8s+2Q3P7{j;MT>S_tldM?ljWfxaHv;eK=@;_?P
z1J?LoeB<*9@oJF9$HyoC-n2aH!bPUKOGh^>&-!rTQgTy(K>4QU0ft{Pt`<xR<%M{6
z*F%-;|Kc0dKPvIBKdj}(sQXxbsZ>&lqoZL(hN7KhVnl#p#p5-1Bd%;xcUrQi@aD(a
zN#>s|wB@-JrMb<Pd^(nzp;30ccXQJs38RC{LhkM0;XRtyUHGqJCx_8NwoowtSgfDA
zPMc3c%M|c&WI}U-`MMQ_C6pjbv~-?)Ih=HYCCe4OLW}#3=QS?fEY7F#7cxE^Q{B~{
zq_SbRTl|toQ_c1IEE>OLb$vXLCp{sAqnABDM&#S)FjKx8w#f=bWz)^Y9v@)ZC#u|d
z*YH7|wH&AI^X%RU3E~D*l_r)?66KN&oa0jY*d}{9SN-av%({!%gl?PX>+ocGsmg|T
zbHy#36cN6s@Z++B#V<9Ev8)X)J)N`b^n+jQ<?oL7{hg%zw?xYCXvD(MHF+~<hPPbp
zn;f9xw)OkvTbDj5NR?Z@_RD?~#1ZrGf#bF>>!mx+J$<;#ROrr4i^{CIbM8mTH3r;z
zyxd)^|848+>3<$-&W*YsbF9DV{`qZYKM&3k_Eq0iwub-3|BicCs|&3;_}5|H@_Ety
z^473(UoURWH2#03=Ji_1O&2HsycYG-{g9@e*76{+9SRkemZpI&<=cPDf1P|p=kFnR
z(CHctEK|c9d{XL;=N$~=+W73hLD6-8j)(ClS6qHwwuNv1jTq&#(bqrKUT&NC!eP(r
zt&ZsjEuZE0RNejW!yjO8S!#3t!-<s}jjqYh<rnKt&M%!*Ea$d)_qDIQEs5v-7rlEg
zEMq6m+VT13Uc<x{k+qX%-HplinzeKDp62?6-zVR)-&ZFj@7HvC>1K`C4^;}uTD^?h
zXSDyd`&;f|&-`t#_#f||H3nDO{$KdDcj7w!U(I@dW8Z&cyJhbYZn*By`DuE&(<jvH
z<geedb(#3K-M4JmO#1&-{(ACr_T|s_@70}Wy>J`v;baDB+<Lyy!^xU=FwX-WPUb66
zJ<Z?poule{zD3jfgR6IKdc%LjG<@?f$vf2_;TL?eESQdb!RJA#6K6ped`@_<VoI#7
zVrsengHs)aZ_npEUR;{{qwhAO|1)DN;kx7HahBVcRdZRcj}AU`E9#zVuGfhkli6SP
z_ND5dwZ9)@DxLkje$CZW8C&L^;oB<q^V#gEUpu!K&e6V{yCv<>^N<61JogtFZMdkk
zSyB*m#b+e`D?ab?p4zzd<Li9$hQx+9=Jz+)SK6x^U-JK!H}j2<e(v0srTf0=Y`&-D
zFQIhu+J({!=6j-UnakD$aGh+}mexCcT6Nl{Y1>6uo^KPrH~ZBE&%KQ`ydO>e{;O7I
z>8bI4plzwvyO?d}vF$xJm*?l#-rs0@Yw_MaxfAzW1k_mMn>NQMPT@ZEZ;?>t?l#xr
zr#rIWFZ#VNd7aOX#=o-Ha;iBE1XitgocV5<>sHg(E4RN|<MaF0{+Uti>;`?MSHFab
zU;7=lEIr#de4D#`iA}j-c7dD4ob0*TuU8qabyQTZTPXE)mfW6ioqg`JBvj_`?iML`
z%=#oz-tar&l5{)ofj}N5Mb;giv*j~b&)R=H>A=7EG_SD#UG;!%_1h9NZ!VB<;&t5B
zGUw~8`sH1V*i(P+;r;V{!Wx<9%p#IJEwXEvn7e-bwA;#b!u?#=!6rVDs@zi?UsRIL
z6liYZ{;*lQImyeiExs;Va$Y@W(zJCt+e9A4i@$ldZEx(_jMo`+54--_cE3;mY^;%4
z=d|5>XO!M9uHL=uf5cmR3mwIrwI9C8vNsjCmDWlYo$HC2@T>UqsZBTaLez7E>Ro>p
zxz5{t&3%W<O|`AR&P&fwD>GOBSpAosi^H;b+q*+4_is9_+W%bONYJbI`;|8ys%$^?
zblJ_FdpC-iZ=QKCN$D}?-_*A{YqhOT-!s2|_(<uwxIKR!{`vHE^Je+zwPJ6VO{?hT
z40mG5pS$np%RhH#hhMB_S;p~7ljV=P-2R%9hYze3pFNgiJKbD6d!pW+S*mK)4CSiX
zj5}+}y{G$ZNqbRb$^LGRYRmuaN1p3c`#7w)y^Py;*+uUCg)`;%I~=c_ByjV?KiMsf
z-{-E@*783;m-nfG-rSW!&+~0}ZJnL)%jw}Mzvbr)GmmA@cw02(z}XJfhw1N?vOfMh
zd1iU=!KIl+Z{6$defLXw-Fji^5wmYucU!~F&zcLfi?jIaJJNr9rUluyc^S_+Yc_jn
z*%klU`z|lDPE?ugQKqNyFY=VEoS$XM$L8*w+22EM86B*;cH*MNf)Bb&LkuKB72c#R
zzL@tR`bGZSv*)FM_0HZ`wf#2V8Ix7d%%fx?1tbj`93HvLgztD+b$h3~snhRWH*>|!
znmnr{-<+#aUe5jJ<eF=H-sZe15&zJ<!SZ&9Rrl1xC0nCPr#P;-AH*Xb-LF}DQRGb5
zvIg#(4Xsk1qSgWa(vl00-b)mAjNfoJ`qP=x-rdWtu^vc#-ZI}Y;5tLR(Bet6cO5B8
zx-^fmkRgC&pZu})O@;IR$yK%2ZP%<g^j$+?MVZJE$;L>tSjLu_a(1e}7@X&ySucL>
zRAG9l*1wv~^JLkd{Z#qMof7phGgYR#(D`fas$1;M$GxIAC`4b*ssEC@?%13uQzGiB
zM7AWpH+uMqT~w>yX0FeFhDOC#x_|vP9Tj9Z@4gYpx7pxi*UqTG+C<0jKWk3!%k6nO
zsn(m}NLl(a`)OS54i6gn<T9o|EHJNGHLH_%_N$H(=e!gTOJ>#Sk0yk@ycci6x2E~n
z@65%q%zqoo=Beb}s8)D*vi#Vi!)qVv?X5~`aY%8xKQV8nw8jP5+q^{q*(J9X3ns?c
zUb$6bYko^mz*XVTgB^@4S&RzSj25gbL-MaP>+!XQ*#7rYE@@5`=l<Nus%Q93N3m;0
zL-x`-rtJ%FwtT<5|M(}tm9NX0&(1BX*s=MjQI@-U@T4cQYfsN?m-emS<KMaDh!Rg&
z4!6jZ*3CN?bKfl2due_5S#F%a?~7jt1VwW4%@Y*MVsti7Zwl0$qB8BAc&EB%#qzC3
zCO0!Lt78|7eROc4-B!N_SAPD+j}JJ_)e_v&|7ic8^dQqNvZg{i<^Gd1j{G&h4!M1i
z_F;Y<;GuuVWLZh&p>GF!^aLY$51vx<Jto2Sd!laI0pkizm-rV?d1FtPURq!?<<vAL
z`weF&N=NrH9~0(HD=fX%=700EMryh2R--ib#2(G6`ft@Ko4!7{dS7v?7Za1m;ZGiq
zvuA#6exujr_FP1PJ!H$W`PcjtT9#k?HH*bFZ5Io}>g5j}Me5AdpZAdIIWt)cvefIT
zu^@|M5@<ozL}v9eTnn;zmJgK$S*aCh3$ngbc|n%*e@Yf)P2n{dS_`rkd!Q`H`WWpb
zAfi?WTaZ=hz5ki+-&xzgWZ%2AzS0}KAZz=S<-5+QT!Spg+H-5?o4e#M$P!qHeL>b$
zKj?z2FAu4=AdACoE%JgaqeZX<SqjmEWkJ>|q8DTtlD{C!0ewN%t109!$okAIutUTd
zvLH(~9=;$;7;QmTKk|Ys?+*BatX9N=EL8{if-J9)rGh&e%kL{R3T=J8Z2u3o)1Zq#
z&p$RY<&ZIw&|b9>a`9)}iN3gd*O_xm-~F(=tI(1zcH6fmZKCG%Nvoz#(%SRs*H_P%
zDy=GgX`0y={uW=CDgMG(v1-Gy37aJ!Zp_xyStG%DY0cAB7dITOd9~(xh>?BuN7<IE
zjUT7#%xTuxp{gUe#Chqb%i;EiF1(dmryhGJc>Z;p|Nrhho7;JjgU5Z}bLQorBka|7
zJrQ`-c~HX8K;ijr9>3bc^vAzE3pPhBGcM!|sSUE{oK`+VD0W$Jq3)`<?R7$_8c1i4
zy>kMcJtoxef8Af{^bQ`U<ihp<2ECbIqL-cS+~KXEBc}FX+DpDz38}k^+pHkVump_r
z_s>>Ytkybt2LJD<S$##dT{kzbhnzfSA$?bITNU)=u|GHDAt#Teo%m+~KA}wJ=KLcq
zQ(p1MM#$V%+_p=3-UM4qr&mdRGG8XQyzzXf^6bPx1&BgRiDTfS%qnE>DsKCwIuCkf
z=L%KMo6|w7pqy=?>fRg$8#qG_<Uoyi6PP`Z2A!FBxNy=0X7F90bCz&|ZW~p0zY9G}
zYzgS5PQ`6ikd;+kmPIBWLPZ*&^<M6WVP}+y2nVg&zYlVo=ToaAVbgV$QZ88@QGO87
z5G|^`Ek59G=^FQGv!=M+doTLsdiSr%K|H_zHvRh*2)>##;KF?c@Udh3+`pvV{(5@8
z{<mVm{y^}>oc-Ltx^+K-F6Ly3fLzSkaO7KTdT8NG-y;irgQWLNnZF?V!eY5!1`6FX
zLi(c|`)%LNsnotMy>5!puH8&=vw0R+PkY?8^J7H$+DzYw`#%`>tl1g3!<!3!?pU8&
zm+UisrrB%s4L&g$pO-7vNQ0g`=DNLb+nfaP8#6VwEiX?-ETy_u!exrIlqwVVQmQ)0
zQmVfgOR1LNUrNQ(igziM8*xjis_xEF-Zw+KIk$JdIP~I8p^8=0_9+E(H7-}Pke?y8
zF=K^`=(=Z(kFM%$dMe=Y630@iR4hxWR?Nq}lxm7KbSc$?J07}=uA0og7g10b8hP$Z
z>Cqy$3a7RMS(7XsSL<Z_I+4q-pRsDC#oxSdJnJ_tc&S_tI<0G^S*>n$$BzWa(PD?4
zDgruZwAQ^-5Z28onX(`-w}|7szhDO+%k$M&S$WTWm=FP4@AJ=~_)v7@1)d4k@=+H!
z&QAaxfR%n`D(hK>oyQY1Rcwy9C77I(E3%)l;3cP;<4*JCv)qg?6tTaB+`P$n?HKsx
zP01HcpZ}j~N^3AN`2b$=^dePBU=_C%?BY#FduirC(2-~$cV?P2JDOoEqk4?7jEYSd
zZ5h>@G^G?R?pcbEgT;9Gn3Q#;7Y9S`^PJ{(NI`+ct;!6285P@3^kr0htf<SVG*FjO
zwLL~%M%6YMbs5#pyPFw~oM5@MkoBy9a)w)kGHfZ?k?*16CK2M&Rf6G{Gu;0Av?P{-
zZu10P5_-7fK*ogL!Zmss6RKrEPW57OJDf9NsgPrH*NGnW<QR?8oik1uBt13o(>OYZ
z3$~7GHPSk&fHF%_%_{y0+;5v!DRegnE<94CMT=!rh9N=cj>t{V;a`5PD(_~%tInrl
zU02teyXUi7teEzb_2Rhz4@=><F(UJiNlnzg9CNPsX#1h9<_96Ci-qzooh%%9Rn=JD
z6@0qbJO!qrCXs&`Gmcv8O!4wNmM8xDwS6^DT(al9%cc4Z5}Lm*TE#n7SX^=SYik#G
z{-ekJ<{s0D`qnRg@qQO7=Cy1WX<SpfROPr!rAKZc&kiGoz?Irw5|OnY+l{USyfiQ{
z(vn=bmd7fjuJ_8L11vG1W5ga_ZI!g<;;k36*JXb2chQpnGtd7ET=mz+L1N3MuZ`#Q
zf;KgA%X*z!FvTO%NVjRz0ox@xOBIS2OnH5>GX1>Xk9Xn$fBYSTrWWOg+$-NKeCYQP
z_W!{XmMoPyut!^se?fNK^RR`7yf<|G)|N<KVd4@gng7uE@|#eW6H9jAoXvCK+4-CE
z1rDe^xj9?lfZC6n^93C4#nd|}E?E6suOw{oUoOVZ5KqwRr90l$!b~qx{C*2Dy?7D;
z5-Abp*I=o7)mu{Hwq`FE<4lui&|0TGv7mKNE(sv^ktC2h8AE;zmS3PtF@1AE>z-V1
zgH|~`zYSXV)OlxL3xk#BU69De%gkJjjYaPcr9T4S+4+7uXjzu{4tvE0Uxyu_Wmy>@
z_L*bf8k`bV%-ek-Qs%ohi%O95JAV#^V&8YZ91A9gzw_o;FgXz<60C8GyRo)4_(SoR
z^Lh&wRju<>O>tYkSSPwO)iBXoHP!XR$4vchzgw3BjynYlJ*YlbpSmgQ(ej!5l{w$q
zGVkByX}x@>>0Id#^BSXX?wO~$+qnBq(j4RaZgYgfO)ed84d1*;<gKEkpVr|*1I;;;
zHhb{jSkpMydy!x>SJc91%xgbST<~j$fzTGMC(MFRYIoc@|IMA{iGY$iOSI0jdFtH-
zqQ~~UI(qSS=+Pqq9*a*b*!xL;@73c)rCeqkn@+n{6~3u*<t>;H5>nsG@UCx?R08@!
zsw$aPEvVOQe$|+(y{YZjH-YnCPrPz2lUTY~<ng>`chuJZb^ki`w)ADb#aC@MZM}Xh
zEm<$x^{)-jmJ>~-Goy+Nd3P-^d!Xv9_oVagY1@U>d+K7#c(rXEo+n4z?%~ntaN~&)
z$qMB@q&jQ<UYnO68178*$zH|rB6n-?g^dpn72K+DIa09V!=13ecjYrWgXdg3>#$^Y
z^Pipv<x3aMOk6m9WuxF>rN{Q&D;>9s-ZTspJX&(3W8%#)@mxQnH5K37=7~n$NmajP
z*j#9+BJ%FCkG#O!%b7gK`@0@CBv*VhlM(J*Sm2+&%el-yf9jIk^%4i;S9s><E#N5(
zJ6N;itOmD;NT(^&foXvU<2riNzh29il{@ynw8At0m;L#NTMPgGIO{a!u-@FGNw2Fe
zD6hWAyEi|EecMa3n=#9L1OqnR+GAjybKih#|ITO|j`>~<Z@Z$t^_|W-dV2cBR;^uz
zS?15?v$fufYTmCfV?qD1tn8{aAM|6h)^wEwXw4CIRNX$Uo>^bKc~?=M@ANZsb&vLI
zWzAgiTVcX}*(vVJI2^wwGAAf@OEa(1ZO@l}7kg-qXZDF>udeO*>}2?3eo4CO$^J*#
zOfwJ4n#=51HSu`Q$vG3t`x7V3_9~hd#kBpPOvsypE05po+8cABHF~w^48Ht?o9yWv
zVprCh#~#brB3kYyXuo56kauo;CdZo99~SOfJH=+E;9kS`WzkGGE_+;GB&jte_X=B^
z^tZeATlN0ST(V#PWBIg;PF#hDJ?d79{sNr`7V)ZgcAk7g*2MgtuW4PklAf?dxia@M
zJPp&{xLj@WhQ*eFhZ>#JmhiW{DRWgb|NdxM&5llPJ)tRYk4<^INF#flO=9IM_r;ap
zH)h=9&iMC0<k|(1Yo{`l)i%fpNBlS9u&L8wI&YuM<h`Lle_6r%(+fU4+Ne?U)kEak
z2dAj@4iD>m9v&12t%PdXVpgTY^|*3Jc;lhRGY&o0Z#wiVIWVGrNp8gCfGxj7HEcRH
zZGIYQ{E0ZV^`D2$8qYU}o4G{fj)}<C3W645UA`ojDSu7n+rx!>v~rKI#MKG1T$ArU
zu=jY<LoF7uO$A*RTnExF%CRP7-|5hAk(QZq`pL?4wog2Fz6EVr7SVo9G}G<hf)@Q1
zN4QmIu|1u<z|Kj<e)>Mfbs0|eoYNTQ^4xyNXL)+R_gT$4x91ZsE<a$a@$H71=4)5O
zhR(;o=kmq5c4oeNd}^wK{;8c@2_G%HWin32EM0NIG36h}t~(~XUM=rjIB8<UiiH!l
zUvYKLoaC(d{!mxjCDnGPdpm@AuTGZXs$B1G5)xme@#HNd<SI(TQ;Qb16*+hEzxkRG
zdc=L<MezArJ&dZMQLMLL9_lES?OCR%oA^WhLuc^9MN#D6H7T;R?AU>&kv17J?_aC7
zcdL91JiD^qFLn3yM**PqQ^EVHHTyv8r-VUEsvJN<{=2Fp`@DGrQc^`EmwYqY+4<~-
zn4DSg?Br7$RwrCO5>*-LAh<p5jzYol#|xccw@&`ibp_u#d1!jB+}|J>=f^7AIS~(X
ze}2E#v|zsW@l@y5g(9+B{;EhTH2Xb{NC`a2*KuBId5%j-msY6qqt6dDqy^{JIA87f
zG5g;sH<x(rFw;dni}d7+k0z!Wd8i1<Us=(y#(3HUJIT|^sVNKcO&0x0_%UVER+B9r
zwGp~ogkI`jevtGv>*#|=!e3Lti)xmLcsF)$J1ElJ?O!(qeCOoEWvY-nC!IP~c4XWR
z;)2~dSv<XRrOXQt+xy#}&As!3OJCaV%v#2eXK$T<C*}O=O8bpvJHIHH)I;u@)MH_L
z8hR*+b=urbYI$p3&px!9xg}P}g70@kzU}<4?`NJi>%Q8*?&TK9eUnLhAD(M~9J6(;
z5qiwlO<R`qqi>Wfg1;&J`G0GP*ws^p)1GabdW0kI^15E@hV-X*#QF{Hw<WZ_`1D$=
z;4bsJiUXHar}6WzHT7AV`1|A5jw>qS{D&HNmhDY3tLNSL<amC8bIbbAWpN@KcB?09
zad}<uJ$+-=zslOZi;S;mTEq&=PG2f_``Ol=d-^IP&wkzeX!DjU@1>7VmX;|D6<qAT
z{DsHaU-j>;cz)bpwa!#+%ZtW&*A|K1mw0%Q?P1|A`0-lngrLW3HOidI>yF8IAH9js
zuyT^7Urykg1Yx!kn`2gM7BD=q+@>;1;hetkuG1>YTuXZEcAj3gs)ko+s@D|DV=7w8
z8q&c^g1e2L&v3byo|^2nWM=3yg~=zfR_6G0s#Kl2QzWFM{d(H%g+2x|lIP#~Yf~hY
zpjO%$cuHCQasT1xFP&!IH99&u%QK_Uj`!#Vud9`wP2FEISFnXIQ*wnYn|k+$Wk*E)
zoUDS>O*N29C!Z?&HSM0iReP$XDVw<b>xE)5KTYDN{;m4{?Um<3x$3W4KfVN22dws(
z>!$goGj?;#<aU$f{v}5r3$I!c<UOJE&y>tdCnhDHI_4av9<<C+nR}szG=F5V<IHD0
zKJVA%*rcev)OYe;{^4DyXZqA5+FCDH+}X0Cmp9sSOIOi4KChD8!&+WDoeVZ!y}nB0
z@v8$a*V|VuY5^^rI=HOs(^@{ClHOh|ukB6-8$%gZY21EwV9Gh4-R8Q|-Jj!s#V<&y
z{}mE?RxRu6n}Yk=p_?O_-n(DgeDUbQsVf)WaN2U}i&M@;?^Na_?l+p3c{U#1GljQ9
zS7u3;L&?NR`i?(SW#5GVzS=%@YkbU0#yQ8@^nBu789@uDD#}DfK?|pt_J>YMnA)(Y
zdqP-XvnW%S{*(w;L6CwO(W0Rs1x>-BQxZ)U)PJ3kbz|u&#hZ(jw7K7>FFti_cf?A)
z)2Hs+Ow-fu^LX7WH1*JxSDPM1EUmLQTo4s27A+rpv*AY6nNuO&Id{WTnUk`8v@WM^
z{Q71eOYAhpJ@K(+0e2^NYu{-N7TmaL`6TdhSZ7u(0WFl$eGNV>%k}!|^^k>A!MnRa
z@+EigLsnL8^<4d8Q-;I;UpgU?o(1;OzGn9hw``voVV<47Gj`^o=Z>PAZ?5D2c`t6#
z+_h<&pFCZ(xHtP!y;#X4-|tUW=AQ{qGkD{Fe`4$APie|d_3i22alewop09oV<XY4(
z^Ub@i{qMI@y?d*1x8ph8T!tsFD*oL)_2!IhdFHOoZK>7E?$2=J-7cMIZ1vdD`c}a~
zapt-1VTxtfc5L*yULbB>zGenrE^Fu)itdPfB-&>m-cp10ipYqkFVAxi&O0LY^sObQ
zCS0!GlDVujWLxjHTQ3sVn(g(TeY5TDg=N#brL%><E&R^@#dFe2bLD?5d1`TSanqcF
z>hDiu-qFt%vG}am>vyU?^U9&;Use1pb$zPPe?j4U@!Ugq?@uoXwS2SA{FP`ke>v~e
zW_!10dxwVgPY-|&x%%CG>f!ta59N~{oL~FRu6~kd&04A6IPu<N9F4~mj<ZDd+jr^J
zX&q<K&6ZeqGA%v9>EoKahVm(f3HIuf?rXHm>sD3W%KOn?HBZpwpGIk-hou;^iC7i*
zh%5J08~0`*m!<<=Pd#`pdN33eAO9GeF1y!Glf}Y{Gn~(`N|<B%Oo;<0_O6sVU>CLT
z%cf6DxyrLnJ-mM5L;uvm<yAT*CSt-W<<D4a+pMoDH;R49xu|;$df(%(UrV1$8P4x3
zGhS8o;9`(nOySd>RdNnnR9>cEJ*m~RO1oWtt^c>pzfwxwLi<^xR=-K#dP>Rdtmd>x
zx6r;L47#6hF4`@=con;x?uWyo;pbMoVs!DI#OM@%=j008rymxZ9(4>0UUP26tBnq;
zyL|eO8oVkHU%bkl38b%Ea_U^$*mc|Mk9DosH#zibbHCWnhqJWPL!UD6UEGw?5Fl5+
zDJ$OcPsY~538B)fH?OMFxlr}k;I)EA($$N4VWIsjQLp&7{(iUeRik_NpMs-PjaOAM
zT%45B5g=D?^vVIOaYm^0YU5Q!I&K+z3uk;46)}8O0k<F1-GWY)cTTQwe)?hY)nkES
zxe#~1?p?fQ{eq6bZt?1h?O~Qe88hv*uF5U`&3B5?h5Ktk=v3pyMGVIy#k6y72|wJl
zxb$Y?ydv|j7N>KM9_VG=eWmYO>I#kWC%vDS?`=K6`E8Z#+S37n?_Nnf_pjq_6n+z9
z9W{O7qB|lo&-oj<8-;IZgZVL$a?kmjxEqBdbRqn?66t5(2|Zw$bsTJ-__4`rHm~21
z89&{zb-UihiBpuD?uGtR$}Mnz{fI;S#LHze;$OBgo$UFr<HI%AgKqg(A2;3$W>fnA
zv+r7xO~jU+MJ^YtPdSLMcx4^cEtqKTAga8mfAhLkNs%gCXK!4zI{$9vtH-Mf4|cC>
zJY#k~n!9;b(9QFqi<K8PoLpmgZ&yX|!_L|%$<5af?n+I2m|7s)I$!q4b2imNmX})=
zoDw{oopRSGcq7L~+2`vbmSnwOzIEwS$CeL8*XCZk;VQZ#>=1MP%Xo7E!!ynu*(y8S
zi#}bkvfRJXhUwwn<Np0Ra``;l9e*AUw%WUIXOBGV{`tANpPDVzXZe-9jgY_aUvTg0
z?~lp^HpMh2X06c|Dv{aqzxnl=;<?wX<}U7Emc4e)>&4lZ)84K7c`e#FXR-R{wOc>+
zw-ncGY4(eJ(bVzk$sL!(XLsM#U-1{Z{DoV7o{r3HC!s0Lj7}4O%I=;Ot@&>D|HB+{
z_KGd_s*C;B-@a(|XIp8nNq+3<@4nJ*i<m#IyUsS3?fH!ThObKh8{0bkeRAbv&0*!`
z$4*7mm)J$<?AUkJ)2~V*>3!67a{*~P`_5ha{g3>L5!re!{rj<&g=t?sv&xFsYGyt=
z_lfUc>plOh{}o^O-9Hz-)CpRx^*(O*afyOjlq0V0#%;fUnH_memGsxPz4a5;8R>Z2
zMenMKar(D$&)!SdX2sojm-SiVg3YhzFDF0G_d8!-{o6ME({}s%@2{R}u9TOP{d>#W
z)~c%R-<&-b^?$p*SjQIeIi41~GtD5(-TnUm5cY{oufM(Iy*t-oON3qQRj;GbS&BjX
z5|yvaTc`7zx$x}OHFa#^v3sO1e|g<vJNGK{$49F3)|_3Mdf^!Nb(6ONIjljM4=YQL
zHOX{tx~;b4%`VP6LWb-9&djaZvX1wDq4k688n@>M-v2lU+6&~bc(yd#D<b;z?j^pQ
zGbg4^-gkZDo25UW&t9FD{Ps`()+ou|Ym;v-yry)&CfM8lyIEgx>aN~vK7ZzPt?zvp
z9dgJdD#c9sklVSoyko7gcV-p;PyS%S`2N<9!-bj$qz`{RGkx3ro<dVI>0RXxtlLcL
z{=Q{1;F<9Ene;dH_s>(@ex1ChJNfSIrE4c|xN?17>b2-6oX#pYrFQZCY76)Ny{wtv
zOHuN|wKX3v6`l9F_GwzvgF9u1RtL#itu&voNO9h>`}O%P4HNS@YgCUfDZHX^`A5>k
z^k1LXzPH}yUcF`dcHK|n>|OlN*QR~Y?kRG-5g#I!e|<y7I+^mfu_gD*&rIdC-?0C%
zQLa8Co6}Xr6=&{lSz(l7`!#It)Xezb=E1KYFdW;sZq~h5hpO(M`jWHu<*9Ekn){yX
zrSYEQXfIw{oEvMp%yh-wBkuzi$6ao|Zg=schj4St=EUz0^gMj!9`hB*`&2#Nz-ZCs
zsIr8?yzn#g+66z=?Id3$mh4P?wDLF0t~ck+babV!=xIoMOrNkh?(_Q)-p>ny=5KHO
zFE?rG<C=zDO^q9xLlYeC+TC9sW%lz#q+!H`#(isiB^&3t^hoNtmOZa6OAYYRJpSQ#
zp7!C-`i^HVO+7lz>Cfw?*z4Q2uNKXfU0b}v`u?}uA8mJfA5*(nv|W62UUgpn^)K?P
z|FXBMwyYJ6+ws_;;M|6F`p)NOPUH@%&x?yRyIuckiSMiR8u9B+6kq?v@m=lqlCb}k
z%$JY6d!SOc{=WmGV*0sju`}LSM|*tzF4Gj@_4jYNN|?p_fSq?tthbwAdz5B&Ioc=1
zX5s!dbC;I7rr-Sita`?db2q!E+s}#LS6B8edG*yrcdrPoH+<;T@nG#`bNjjbt3PX1
z^&b#%<ZNyDf8_D>em$8Q^&>TR4kuJ@$Tz;!8ov2R3jc$u6kUbs@AF<x>b%AitM~lC
z+|4Z?{!jZcC$*oGqx5#k!jmRd56$&HKNf$n!(T{A`riI#vk&`<OI@G7+_`z7%(11$
zq4)o+b>Chl?Bl&6^ybSemTG4!csIxP3GI;FsPgActc&hF`<XvWw04;IuKWAq{qmRL
z&Yse??475tms}JusJ2rr$@M#Xmj7dp{Yjry#{)9kHs4I!e5LPK=H>ERCF(sX!Y9wM
z9<}%0dHAqqyIx(v#N5yGyrR`2&P!QJv5V|mI)#gEF;~mo9FtqTbszt%-TbrCd4J*I
zp!a3B8wHnqXX_Pn7jt3bQJC;U@VIE+u6t$g0>56^msfVXwKri>9NTW=`zKy9)f=rg
z&9|1ezRUVYA?KXg)N@Hs4Pw`Z$)*at+AebV=(S|8coWvmi!>iNnI$ZA3);zd<+7Vw
z#>Vm+E*HdeK2NhLj(xmtWhrC94a<k=0#{5AOh2;X$uhl-b7pKwcaUKaY0Pf@xH@6Z
z^8M}Srr*!yn)kt$i({26YoS}hG~aNB#AWUNopuL$)IPs%-CT4ha&DLX{Wa;w8!PQR
z|1q5mtx%IZ9(O08cK)hw2On&_B&KuXn#pbX+S#iO)m1~M&X;4&y|LS8#~;VmQ}X`m
zm+c)AI;y<)PtGYka`3ED*_6XNXI3Yz3k!*lxFBl(dQ-l1^3Ig|LJS-4&V1Rw^pK)J
z#e!z`Td5Xzc;~N5OFF#FO6l$dY002-4kwpdED7E9UA&k1^@5Lew=%9f*e{r?-YNY}
z&ZFYf+>Jj9vUhl|pC_RxF!MtBlIUk_TqVcLnq{s?-7VvYQ3>bYY8HFGw~WO_ki*_0
zkD)P&;e;Q9pQF~*+g}^HofSjR@4v(`*XQQZLpFYmhdXV(JCxKOM6H~EKr`L!;omRs
zH`chk`gPZ#c)5(+yPS<Zw=SNXqEhMpy6D+Mx6AVHgOxNlax{zHW@1f!nDg$1)3>?a
zzx=jW&b}TjyvweDh4uDr-iQua@zZaXCWLUQb}s$w`pA>(UZ(EHCl4A{-fwiBUQw{Z
zf30xB#ly}CHWi0@IcHpy{C{e{O2sUHG5LF3H_a`JFEG#Fw?XhP+vNjRBA2+$do^R{
zZKyR^?ClcfykV2)WW%<Dbt&DFA9&)JE{gvOa6X<p*F=MVsnC)G{5i!>j)gsL_~_Cc
z88dh5!{Bc=UN>Xi*Y@0Wlt}KnH~+8P%pBW_ujMC}O=@5;T5ogdM^xG$g@xUVE?Tml
zU=&^Za`{(biH9q<?o)G&o2kcm;Fac%ibr10UZ(A6_&)dN!?ds3$G`Ef@7cO_m-RQE
z+ty!vuJ4*9^zFB9@SMKq=dvXKJc|6EESLTF?EI3HE=`^OX16y^{3Z<<vP;F)1lRiP
zS|Id$uG@F(BW2?6O6NH5dau96nb%@jNbfcYanGNo2P~#nFSK5(x^+remQ~Z+4#TUm
zrrQsu6r7#Pn5ebTl`pdJfy0{G*HY5o+;2TPFe754{Q_5`GJa9ZHwXPETrtUWuim?H
zMc$<=N=*^$#$57C+b<kqs-D1Ye~ss!)&}Fx3@l~o{~QnT9lg2WrykR6lm7~di;J{P
znx@UF-_UQgcn-gJ??UUmf+spVdgh(qcU*<%wth_d)?e@Xq)hf4cD@yVsqy%nij&)(
z``r-pnRMc^K&4$)Wy_Clea+&(Ni(<mPI&ksFGn@{a?~NikWGBcn(jSzy;SjWl2Pd`
zL6&Ow9RV}HUyC!?e{B28C4R>r{QM<Rvshav;=)VuAjx@sJGHfInrEgRH1JO-|M@##
z=o{00=g%fN#*g<GuCj@=Fne2b_C{~lIjfDb^Sw5%-TP*OL#oL--fpF*R@p)J8EpZz
z(diCX`(HEo?kx>ScfWG~TJ+j8HZIKV0SB+RRF(di()Txau2Vu4cXG1X&#cAvb<Fl=
zCuL*h4kk5R+rKwad+HJ22Hs*829fuTigVU8wk_Ms!os*c!N~bi#OA{%UYZJ5M`q3E
zsGirl)?;mi<*`rq<2H+G7jHf>@5!c(XDcR7+URTZ?f&k_>Hjhh)-!H6AnkUaCt=3f
zT^HLVckMO$?Rm%IhMC6|_O1GN)9WrL9cL}sr0HC}V8ZfwzRs*7_mUoLOg;AR)-A@s
zy)yNe&)@Cg3ez*UV^!(C@9!&Q^T|QvD!=Krmc31u%S{r68UNR<dYa0yL*mlyp5xzU
zUNiBYS~G#o_`0n03X|-XEwju*o>X~rG#!e`=e%})+sVVfOhaE@4_O)?Jhjd@6vX*A
z@z<N+sh{3ln;COU^<Uyo{~2D^(>MJ7b4<m@x0yNRbi_vCC%vz8VoonHE^t5KRC?Vl
zLGQL*==C$IGK$QyE6RMzw{I;BzhQrO-TM=FR2)({E*hUWR$_Z=`o^#MGS{2tue8h9
zm6LEk@#W2zalQ*1r)77%jTZZM&Z_0J<mt~VTRk;i`rdBd-;;ek#mwNk?);tEpH3~>
zd-36lZ>c}!4A*IVnD%gX-0~Iw4;2c}f0o%jXJ6&-+q<X#|N3aoi@WQ}I5y4`byt~r
zeslPGj@LhX9N4au@2~kEBNZWbnCnWZZ@__<A``z}``oCt&eL=69X$p&uSr+AY?P+G
z6nw6=EI;wMgP~(}1i#?j>&GtnT%4OV>E1N0e-FdgZ}{EuXM@f(zK?SfmL3pV*t0q9
zFxQLxV^{Rw{5cqQ^rpW3#Oa3TLta1maxA81fy3S{kCzts{QElRP^r)L8D>^jc73UL
zk(S|SJHFS@GNILE*7NAizAxVAi`ivgQ~JM(?SS>?#jFbzPHy#J<fyk(+bg)_<Jx<F
zPqqAF?d)81cfOTg=w<%+$(yaun_qvj^X0|4&3`g}wy)cEk#BeG^_bFB_Zkt)UDpq;
zoY5eh)huM|syE@S4acN8KOfv!z;o(}!Bh3=?`En!Rsmh~*u^&C<rdX2gI4+eQkfIE
z{j-*AQ5HKQf5mF`0ats=DZh;l7o<Fk?*GscP?Q{yxH*;S^fuoe9_c^Jb0c5O<Y->U
zb8EYI>Y|6|R+<!aZr`!+le5$hcE$2tXO6v|{Quip(}=HuvV4nf-kZ4XW7gIkG9iv8
zIS(?;Jr-PevrAlm-`b77u{#o;JiD^*%_YVIH}lu5cvb?w*0EYa)ppN%cB#jAKGte2
zX?@Oi+xO9(2M0G?eAnCiO)_!ueQD{x#)p=b=jT+-7c~1@oqYL!&j!gm(z6dbCtP0L
zcJ{-)8$3%lo(zfeni}hMwV>+nuO$vw+M`2E^drSD+H=SCTwrZj`BB>WbXvplgUb}Q
zCmrzIJWV_8XxW3{^u5cX?rj#o@7SSdQ8cM^yTI39M@m^2uDJGcwS3}>GT!Tx_1<-c
z&Pokct4L2Wxfdimwd7=^s7TeL#^YawcT~U1*<}>*<>*}BSL%P}ZH&ohZQc8_EN{aV
z^GSC_uY@i6t*M`=aPzLm9of4VBIZoYDSv!O>zRO^!tL8jHuR|kYo_kj)?mB8{Pg5o
zuRh)F{JG4(_13Jb^Cr9tIAix$@V&sQlb+?8X+3tSJ<)ZiV>a0v=6})5zY`XDmNoVL
z!dZWMcSgk>n$`DPXQFhJ>CV7_RV5d=S=-fGduPmM`|DA3qE!9avV#g@vPFM8e`Xr=
zq_&6D@0u~6ZE-}!iLc=SeWfy<{5#(rd1Er;$Rp=<_J;bryC?pb@Y?T;m$R;--4iR3
z&zA!HJNb9&9erc?<|tT6GtcjhKPJ5PKcg6sXQpYlW$q*A^=ft{hVHz|d!45rT&DhP
zdE%Oi6Q$t+mSzhpPkdE>wmi`3D@cR?;+A)c*XPez=(h2b;`O;R=DKmdbzZl>sq65@
zZy^3uH_x}u>zobsdoSH;kC~qIO+s}G|H^;AlGr3wxA5=$cSOeMT!#EFzmFGJtJ(cZ
z>XUN6<?hcVZD`+{{MLD$wV`#d@U8Zk`lLE3b+Gb3CVm<6MSnXbvt+X6i|%&b%$#$<
z?#VCV&zDrL*)7>6-4U5N=?cV?Dr;*`lxn8+dpi9Fxm00t%Quiqoz*1YE)G|-n^D~1
zV5G^Uu`yWq#DOO_=4q<?uqFMQ)idLBYq~(qT$a@GeosE{Y0>PhE$R_dzP9$X*uJ`(
zx5!<Sx4=N}MWFW=jjftIYOJ=eI^_gSYTZ)Ty{vR!-Um83>lUA(&!(5NCB#0gm|Oe*
z)z&G`J+vKqydH>y&Y4obK0EG$^qTGI6J!I|?VcwQs8t(3XMgp#%QIv0|1v#zajN#?
z>)q3z-#=YyE>OO_w2?>uzx~O3ZB8MkyOQE-zJK1mxp?P2t_ZKir@tP(U7oK}t(~CW
zd+Lt(`uTI`o}N^ybZo19$@f=hU-k#d_8s9_$m^u}{nzvV;p+}Ft-H{mT{kuE_+qAQ
z7aDZyT4QFfvDUMUx*Vk|KF3Y&$r5XGF8@=Ew|xbUZ!mcoJe{>igq_cpBWKfcsf(UA
z){7I|m1pwR*(3^za|U`(&@(zHx6AloZT*^~?y8py*67&r2+GxNX2|tuIO||&ru3Jy
zv3H);x|#0|wY@7^7Vmc&dJ}55v>cc7E~YofyEckvR&%^zUunG9sfcZP=mu`~*TD^!
zSXwW+`dh!-x4z1#)gg0+-OgF>95_oFo#s4vz||})raJLjmqX?hOS{?c95`7j4gI9@
zUM`#{G;<lpl4CQS_sDt}?p-0F8Ea_Y`6ihqX!4oBM|?|Wl!f(#@Ox^?dTLIbx=&hj
z!>-Bfvvyl>l^jW$Ghw!bl={Tw42_egS%%$p)L6DkOu6;WX}v0sB`xjSIo5pn^6;IW
zSL3mmo+|;SL07-<erQ<IKjY}^k`9sZJKYzhR$g1QN>lDZ$4R*o|MCT_Y%YdL7E_t_
z|L5wzEZD(obo}k^6ong{M<W!sa+w5O-O_c^p!nH-?v<BxD;k2eRjwtN9%Z_dy7NTy
zCRdN!PEz-Hk~~Z!gnd|w+7J7?sHUbc=<RgjaM>xhX6oyM%y;<I54KM&naEhorN(6F
zWzL-2u4HrIZ9#?Enk8L4Gop<u%i@l;-O}@|Xt?|ELPThg8{6GDHMLasu&1j&IDBPO
z@2PQ2xO(2@*qZ~ZV#MVXc+<Ar)9Bgnm|*I0{P~+ltAbK18gAcFnXqa}H_rjhd0j%c
z99I?PR&?CCd!cKwff#4wRSntITe?G*-ufVrZMt~kswEvf4|)`24MP|4W?OH4xG-yX
zq{Q@AhwMrHx3xlCOj^urj%14ch>eht-6m~lVe0AH|8`OnNcYO<1rt{-i#qV~?Ajw{
zG3$8wr&c$u))X)3n8Lk8JG$ljrMA+8E-T8oxRt*N2pf91ewmtmxN4`FO~_kOv17bS
z1yai%b9tLH*S4G41icXxW7AhEkV<WmK7AwL{!-rlkl(GXic>h&9GfX{S~g;8_F?6#
z(sK+Z2sd6;5q`0gd38~4#gbdbIy~xkd#B#>ZJ+(_(W)Sjkf{z&maD?j)TX%d39DkH
z<yL;<<#x^%jClF-!tK~4T36fLSJfUq#1PLCv^R&Lpwn#4`zvkkt9;WFXBaZAt+V6V
z86bF3@YV;9t@#lWZ+aYZCUCahQ)Ttu`fy^>{S5|>q#Can2v6M0z4B6S#hP2@Iz7ML
z5=@1Tv`*JORGoR)_Mpp(Z@k>h7s~xz*3ae&(7)bR{q)v{2#{fH{Rcd~+fPo<W7{ix
z>qErG{0NEe{sW%pkGz_`F)@F-nN8SRX|a184hdIJ-;ub{7`oHUCT#CP&iASc8(yWq
z(*;GhwA|`%yxjTj3LB)B<okmn8{&vPiyIxXX6!t?u{q@Ftq(3+^CK#PSsJfu)J{$j
zU+J~=VQ1F;4IlP#F|928X6M~$cIWm=UjLBU=MF_1b8J!j8Ex9y<-xy@*FWTUTWfiF
znew&wY45(h0Y|dS#{7tiMvlfQ({?6o0egDUEpwec$65|}iN_RcMYpitDqu3c8olv@
z*OhfLZoAm-^?jMTGE+|bUPH{xXGM8OF5dAh;o7dPKGW5MN%mvyntLAS?;Y3TWv@Oq
zOKh!vnYg#^jYra2wjXXR)vuj8@Ag}!-37;2a&7ye<-=c7^m2CUQod=i3F7ZGLJx|?
z$G>j8tXo^VwnSZ|skZ-h9%m2t({R_GqvcO#d=$PrQ9CHj;*I0QgHuyyGgWY(ooBM=
z;JuE9@S4Xf&adNe{r-XLTSvky)&w!G^E@*mG>(eT{8b<}amRi2I2ZfNXZ2V_gSxp6
z=$Zr=t!Cg||A9%dI8;SXpzC03?#bOvUyhecU*rnVJ;A+B{oBJg3Wc_X>>IpKn~JY=
zIU#sNDy*$In3Hki54M!~xl=Flo@g?acI271fFWYd6E|k<JqagmY&yB8J-Yd~@98Sh
z^~}85t9OPrGlc9h{&uik{{CH^OJXb6rs*wu@-gHYmx5l%>(x#=_e6eI+1J{aXf^#X
zH9m6U^m8T$Zqu);bkz1#oT_nu*}a_U>bt3jjaq&m+$8F-x{6!)ewOT}(h0k+YBiWm
zWADrOeQCpO@t|{Jcc#nw>{|JIlj?7#)5QvRL`>euwcX9)&U?()cKAwejNyj;P3C=$
z+J54HJEoV`w=yyR-o0S<^5eR!9#vD{pEK5~tqc=PS+Qp+f3;wkpxO$T6{31ur!}{y
zdBkL0<q{7mKhVy?KXdigL#dZ#pSWi4Ok&u4GhRDJCUncc2|rV`W0>xmHhVl3n7(k^
zp;kZF4~oV2!gkEr$?dR&tK-a~=!c7zYB6lAtkjN~6|z<Mk@4TK9Skcy!jg;G!*`rn
z;TDxVSulLZj1^tygkJVO)t7wMSaS9?S6oraEd9#uo8H)ZgnsVxdL8r7Z?V?3L#kct
z3hV;~(-n>V!*^t_@DM!oY}2}e{D6y6N79b3D_{?pxT^8Y_SlDZ^R*ZzO779Vb2fNM
zwnA}J_>T1DTn;(YK5~^m3o+!f%dc$xo!_NmW+q(Kx;rP!#msDLRcm$TsuwyF*Tnwo
zo2iw`F?V6ezYS5}q~@%ubXQ%uzF?`ZV7B7rd*M6gEo<Anq4JA%jA`%^o<!r%;XBNh
zW$-2y{|(>4w9MnWLm2;xg1O$J4JWEtMAxNhUNW5^%BK~xIfzwZTbfg=cJL|**7(+i
zhrX(Z3Q0#^Uw9}~%~VM`T4T|nttzf1(==@r>yLU&HEQu&rzg*(Ud`=wb<bk2ypSCi
zmvn5M;A*3F$1mte<cU=ZqIpu9L2VmK-L&pV1#M-UIMrM04nxqAY=!KFAv?}4=5k0W
zoyuiiEb>z7M3t^+-c1cAfmp_6hk7Mldz1o$mmPX5?kXf5y>!_jUonvV-<BO(D-v2V
zO=F32{b84>MlI{OKd)%~+U3!pX`(Fa5^wkUJMWD1BI^#ao_WvkvhLu=n~%(k4u0(V
zA|InF+v!l@`lor#NoDCT`<QoCv+YRt`g4M1hxVnCf~!p%4!+r)_PVa|^~^=iml|KM
zTHq{Zc!+i7YM~7`ygYt1l(<e<=&hC5eE#Z*h?GRNPKRRG+k%^p2%D{lnabCy`(M3q
zdTIQ_cQHqACLgFSQC%2bGkKNNdR6o1@rzH-6i9qC>;Jwx0kVREo7`sS`D)$d)|>jR
zD?cQZd6zz0RClABjP84uT_4IqO&72yE%+*t(ZXG!exX%-%_>G)5$3zyjczltk``oh
zuHb&JA9~5cU0Lypz=4A`)25wO(7#jU96O`BX5q?&McnHRmxi+FobVJ?+$YW=E;!@t
zKJF*aH*B49D7s?m%3FtKbS$5t$8+1WQ7cBm-je6c0k_4gTpm{G?U@$s`CPu-^|B4i
zx{n7k_AFtTy5{+m#7K^!hi~s>DP$j-da$YM=A|2VB<4l#Fj(=(QPkAxuHNg(Ik~rE
zX3Tqd?_&J=^(#wjbQ3)G1|)<Zb`*caaJ@VK!4zhhbk)mzbs}X)3f-nfPj~VOi(&lg
zu;E7cAKk<A)`eB{x87FqcF&z%|7*IW4vSh_rAPWXrqFqZWKG2x)`d0nw?;p8Se{dQ
z_|DWeYyH_jPlWC)`&a*M-#*(ynVaSR&n*wwoNoQ0#3_flGS_IfpV8$x=WcU;*>lH7
z{u<-t3aOlHW|cSR?!5oJ?)2(ODbd?fCpb2qv74J-F12CJuazOIw5Bczx-WM_;`dwQ
z*j%X{a)<P9GnRI^I89l7^||n(Hjj>13p#QyF)m)Iwft$qy=HOuL+(t+R)@aWeLHDO
zHH+>{%id)Mc5dFzDolHJa@DS@IQ*_pK)*-1XZo7N6AzafGBDnY@wJ<u@V<+sS~`U5
z829(-_Wf%9icd5v7E3N=*p%eEPd%-$*?~`7Kt;j*^5?1kJ$4CmpII!Jc$ZOXrkP8?
zuWLom-BxE=7v|kQBL1K_PG{xWi4%@}pReXB@?YFqW8su@w!&8~8#`VJsX527*VO$n
zbE<o1<+T@G5z6!OU%mXfOeDMOjn%ZY-X}km=9#xC-RoGswW=yg`{-<?*%OvjD(}2I
z<GHV|VE&QK>9)4j(;oRwH1*89=kd<2>Gs3Tn^Ow@>F}So`g`DrpT$Rxk9%&)+BG;P
zOs<nxlXu|0I7N~}eBWuSH#I^wMyD4|KTxh7`%CJ_%E0Aka>UF}Tic5-y}9_pYJQW$
z^BxH1)qit$n&;kfDtph3ClwZNuO&`ZoASW6ZBy4Dk*U1%>iTv&y=c!=R^kx)vUF2G
z0*6eS+qolx1_fy<E{cp!W==B`T$R&*9Y1`b`{0BgOSQx&KF=y7+zcfq1s+l9nUmsX
z(-UPVF{$w2l!7Nd8)q~$$;bIPaQiS#;yF3fT2P^+oY6cawZY@8?_`N(ncW4kdjyPC
z(&u=JTrP3jF(;a%^@)v9qtbgTr>3Upo+S<`0Um9(lRnMdk-5HOVrQ7<atTQxzLm=!
zpATyGl{we8pmNtPmGJCh^XE~EY#$s8*_p8ZO~gq~S?7jXtJiLF`=$`O;k{ys-H%xB
zic6New#ph8*v{6wTsZkckFa@-$^5?`9^Mx%cj%h&TJ(dM>d#5NZg&pp*r;sjKNh>~
zFZYd2(}ek~H?loTkyyZ9Y_aiFovQTT2kW0siuy3s?{>rA*xJ8gk7M)xZPU?Ax^!I0
z^~fvMPEUDj0l{n$6}7!<^_8aGKW-p!qlz^rzjDuZnH0-sZ!f%BubLARwBU{7lI;KM
zqYj?E^lIW&?##1sE|P8{f<^|5O>E4rbZ@MiptSh(L`{tYnMS)(vbnnQ+Imv5xwvwh
ze1hbDg%}=vr4xU>uyjvLQ<as5*MfxkV(I}K%)5m(ZuI;A{F`C<x5PY^>qD~r;=K<N
zXUbom`bXBwaAS_`_6Hx9u1ylL5MOaNquuy6uY{W(*Dq1dYpc2P^&Z5ZSZWp1(2$~c
zz%@q2u(iZ!zYUjbwTqtVeWte)&#c|fz<TmY#VQN6nd^f@Enl9g>MjVdGo807&C~U>
zc;@7oUF%&nJeD1fYG}!^(+=IMG;?m&L^020)1z8iV(K(fC+W=G?i(q8GHrTPOY5hX
z3#XWRXK`jXnt3kU6WP*~;x)t7!{b>=;8pEOl2Kxr6H~gTx_X>=>JfO%_~aeeQ!h@Y
zMMSo=e$osIG4;;7TQ>1zQ_QV)kcF-hEiEZ=%&B{orY}tZStuFN(h@U|A=PH`nfnWK
z+LUIeCNPSLc?d696}djMv+20r_83ME_sQxjw|2cT)h+#}bL@|GXLgQq+Kwo1t<y(7
zzy9OMwX%3xQ2SBA#oyk~`k24q$8mYiS-V*?Psy_LXL5PI6MeF>;OopctNhm333sVT
zoewtN(!@K(diUJRt$$v!X=VkbZ#=BG#_{o_FI?-EbY8!3vhV#7sVcdhP1%`6?aP%p
z*K#j8s<C5{TD8)wNoyvnsojn!2=(3beb$=~e((4G+qOz=@2Y8c`R%@1DgHV>?a?G{
z;i7DtQ&V?u@;&YvD7KkvRnza{2RbR9Q&>B?nRQd@r>spqbMS)GH1C^}PRKZLOWKBZ
zYZjN(2qv%0@l4~Z6Wg@uR9M+FhNu%}+A&LJE`Hw~QM%OImOc2)^({v;Hk|%_Wntv$
zs2w-Ig^1q{{_CIYpX$F#WLnfww$N{GbEZazyj)!vmK(G*|3u_Y->LgF)1SJ9emgcN
zG&=NUcX3!=SgQVo$eoc>_j{yYP1|~+){1*}XszDnERM6Q{ym?$?37%Qj?UJuv#Z|R
z)zUU!eQEldHMiDy-QT*YXtP%B^HZll656ZHR$mI=u;$L1Q*lQ@67{O5SDnq8I6G3z
zboH;A%~xmLSo5zkZS|(-kGZ|qzWT8KiLNZjtm~y<vu<q!nN@upWR|WR$gJs=V6$F<
zB<gn_2bpDUCuX*KbK2^gj|<ixDoE>}w)ckL4D}ls0W&Vi{EmO76jE~i^kthI?OoSX
z<)mE8ci5c0JZaJIsAoz>=kuohY+3U{ZrbvnGr|g<d;L0-?zr~I7vEcj@n0{VEoe_z
zbI+)C@sd>>v-h#@&i{F0evjv@#1lTHUp_J~T6WC+;9g0E$*GlP&DH<7ntk@F7#cLa
zS-Xzea^c6@Vp2E%{=3k$rajF{QdjGC=xVRYOK$y}()IhA+P|F23IAt2-P*b;_-g1X
zj@q)e29tBgthUB^upbM35iMbo_wB^1+i3|4?-lc3-{zQcQ778{p6;jW@7GQ^^?xg{
zSo&&VclO~dUSmn~*aoqge)5}tO3pmI@OQ_4!FQKlKA2MFsn4osRBfA~5pss_?j-g8
z?`HFYe|>+)vi*&j%B-6lw=RgPZWUhsTh+65^UJ!A55lG?dRP_C&e=3y`fqp5+)qC}
zwO?2l_1Hh{SNWGRL&;yz^yNMqH%r->`fEZ{jf1%TJK{HooV)3AZu91|DstA>=3d>u
z`H5<<mTL4rzV}DoC)>>67My;<U48Ri>$F)Xwu#(U)ttUa@1Dgik9Q{X;zK;TzATZe
zu;$@Abat`RYRev<v~%lx*S!_m(Q@*<$GoRLpEhqjdfY9q`FZH_%A1#2m5w}}B*1%I
zexq-D?~WTPN7W|X;<?Sfm|v{x&84HyG<FpyF#E2EG+i#WXG!I5^TMBsiF#%(<-#A>
zY|4wu{flF`-p6GeS-D=^#QTv<%ZB^b6R-N@*~c;7_15j^@$p&}`sMeX;7dM1dztlG
zqZcpJklu7>Y3Y@%;puDne@xTxiqk2NpIzdea{0(--M}YPPsVV1md*+BezH#Z!R>__
zx*NWn&0ckU<Bge(tCKsX%f<zKJUe~j_tYP!D|gLkTwRcvRqYxp^)c7^iQnQcxz1-!
zOitZxzdbs5&qbk9u^pMKcEmfosoi<^IXB~+p~=qM6T?i6Ubnh0`>{>EXnDx1ZOi}9
zdFgghZU3``(`y3tq@KO$JEyvI=H;W&tO}L26}EdWrG&LrR94O2-4~a+ZqBR<&yx1+
z`IkaucsGXKczkR5w<YzA#%BLL>wh{%{@7w)8T)NZeVNhT*bf`_KY6=j<>v2|52Bc*
zeB@^cyjJ5>Rqg+?>dDR@SJr<h`ShiA&Z6TjPgC>vJ=wi!u4?%Mm!QjMrymH{42e{=
zj2B8+8j$++bxmi>RHvz-XI&==uD)*GdGxvEwaA|nx4*E;UNU?6n$4SbpPT-4U57c(
zq}TrON=sKL-dnsaw*RGOY51#0y@A#-zpw1lPFlL-_}2HccTbw(CbaI%`}J=`eR4NX
z-t5g~ajY$F1>^s}XX7Kc?pL}W`6}e@oPS+jD>g+H`PI9shD5SjFW<jNXw{m$u-EHF
zu9~ku8Q(eevq<|>)_3uuJ6$ij9(r-EXw8$gH?*Cv?%Xc1>BBme>3IpC-}~<9oRgQg
z`LBR+j_YRIHC^rJGal?*tQnfVdSQ#6efg~u%XS}L^y;x|`6k6T7rzz9xJ7N1T`=)&
z<vRE8O-rL3UYi|HJ}+CH;xBERcVzv(`tAwm%W^&5mn6p4nST73yLVbo|LKaVSvQs(
zmYlS~vVPHr9jC;!`TEaqOgQ@Tz=v(u&-}d+_*}YcTb9U!Jx{`X6%TiAP?O+`7F6xo
z^+Vz2Jw8d%koX|(-RJY%g!EXe3hv4#zgjGNCwRNum50uIes`{jS){`HCaiSj#tQMa
zdmOi!@9OWbcKpZYzk}02xmS6+y`<aYh!WA7;%o9&rN1)LR;EqfUt62~Ci2Jpd8~5_
ze%LkK>F;@Sl>JI^dtEX6!}|{-<!3sdd6?EYP4D5m*X-ZVPKx^<%~_oOBuReRd%H(W
z2PUqPx8Yy=YVGT<y6bo5S??2FBk#hho}6f?Be6zC@5bUk$LxeYI?j6i-OTK5-1~ns
z@7(F|Zj4}AR-Vp!Hpsl-xazSVDUNp*J}iIm|M%Jj|98#WY&juMKs(Cn&po-Qf7-d{
zJoZ^CUz<~`^nd+U$9*-;HP;rH1;(%6>eyJ*%yex*-^=>iwPz(QSlK2B_bupj*7>EK
z9U{>4efu^!dHL1bh51)MUik9MYTNQHUlSPKt*y?sc=xU(TPpKd`Q=+N8?@G_f8;kb
z-{$Z(UvPHA|5P)k*~{jo_cOO>@18xQ{D#W^?LQN?o$O!wpt7f)W6kn}*XDn;b-Nh%
z9dt`S@T2!c+)Kl{tuc=O-OkLJ=EeS^f5({vZJ$p*a^hdsULY!WW*@tr*?IG9^QC2(
z%7v%%rEO%YbTsz76ju|IUK+A<@$cKk#vk6O$7JPfX!;r}D_-n#{HW{hz17t+*AlNt
z|KPO0bKLq1=b4CIck}q#E=}i+oWPqoflcq4bY^VA)c<e39I`5VRVnfEi!0}u*vuKd
zA%;<HY(Bfw>>uUs-8cQ%+RafBeMzbZzAtIaPj5JUZ|k(fq3kP{nj5|PzdmtOl4!&0
zStbu;B@f(oI*^zU#+ei=^>H1`BR97>U!`hAo*INT-J0OGSN-twxje7fYDH8{!kTue
zbyxXMcHBGLnkBL<S#`lu(U0@=loceyHh*6na@@<oTl<-<Gt-uZsTRI(Kg1v2a@@-y
z-@AF;$%bo}7kqy)*@AhK&=u=TD_$F|=+#_tIOl{{fw%NgTY+VZC$FCPGC}@$x6guU
zri}})acuvk!KjtX@_pOpc>!OhNCg|lOl4cDn9KBC#b?3B>5garC|eZXV_m$6XUCed
zyo|`VXDU7aPL%ZgoOg`bx5{&u(1T4<yB40zc(F2WlGK4sw{|W(neqH(+$5<Zn^x^y
zcyh(Fn{kt*uAs2Hb}md!*DkK`%yKxb^|DRPIC$nuRZYgdx~o@7&pMNnx@`Iqwk>a3
zmM%Q$6OmT!nH6x_FG6b8nHJY$-a*aLw=`Z|`2Bcc;N@M<{^o8MuQ<G6+FhN=m*-8A
z+Hk2YAl=F2s%%iR=dEimg|_*flMP~yiQ;`7-0XHk)@aFJMQ6^U%-A*hGNwUH74A{|
zue;rQuP96lJG5)oiiuKJE_p?S3!4TtM@6wpdo6Oya`0ZA<m`FHgEu2HHdmulY9*tt
zt*PM^m)<K2rp=orv1*Z9R)Kf4>taJyiR3q_smf0US2k+ra`k3zRBmRGS#IU+_28YC
zw3Bn>8xP)sOxf7kQr53})h}u1n5rIF`n4qY;f;w>2QFFd+E($#gEuLYH8xn-8f3fU
z^(#mEt}K`qcHUHVqq6COrBh3MJ>Ph6zOc;<jSUvE4q}d~x)lUb3}T2{gTtlmw%Rf)
zmn;L%+q-uqL<fG^l9sZy;FMwzbNH=WSEsu6UtyS^YB%GoQHfDUmGb`oQ;+bz%=>=v
ziRP+R(*k)v@@a0H8q4|U%MC%1Rh>#4JD+aKW3}X7ow4`Qi8W4KjU2}k@^;o7&{FDh
zOZytg;bP!WeEKPK*u$&RGq1WU3LF$Tt2>=P;^+!vBkrUorz`r?bk$|bC;SNFytBnx
zStH~+>nxS+a|HBuK6B>0w?$p~h+=_b@#)TwlbAPnF)ZIJk!a6tv-3`o(*YC9wL%Ak
zymsWBU|g48drH7y??D&Vgjgre>%5J(XGZ(kJbGXyqFSL^VlemB>1o1`mU`ArWtev1
zV5#%DQx}Vz4m_D8rdn~ixI&T7QaSv5)l9{>vg_SKM_&Hiy<zoJ3!l?ZmF${z4tp7R
zOYF+^TzTW%^sW~<3x&=IU0bI(EA06+;n!xV*OWKk&|uo6+mZKlnlQ84&y^w!>rQGs
zo|VyEm$&l?kN@(1o7eMICbn?t?^9bmA$yVUuboeqC51gaaXqD^$ajmY{q{Q{XS8a5
z&gzL<*J<|R`Lx+xk*(J8lP?yTK0K%N{u<w-xu;B(?RDgz35GL<yB+N8`|@O(_l6yQ
z^Hny@U+ti~@M+ee+yG6r*OChp3QdoPvWFd7c>kK}+c>cTk-KV+5)o-Zjgg0z=XaRx
zd_HZqklK=!+eH_g%kdUiIB`y=Nm07eMOIZW1@9H9yH5LTn-efgc>8mWgSrc6J+zay
z414aodhzY7DGt*voGFbxXSyo=n!@qjUpT#c7O`vyS>c)|aH+_$Av3K=bwcVQ-L^Rv
z*Ee^|8KzV<_XwRZdKDRznUg-%jmOd}Xc5cSkPEJQXClw<kdk@zB56kEitGDi)_l#C
z_uKS+_N{|bo-3GM`oCZ-{qs`JZ`<X?@3K3dT3goS%a@(Vjd(V9>;Jmb%bq_{T+3Tq
z(Gw{a@%M+|@4dE#7rtN9y~LaH;<p>~e}2hXf!(JMUi@XMu-WaE)0(7j|Gv+&J{7Vn
zY;B%x#5~)Q_uJm-wCm*D@%tkf`L|=<9ltk;8>SX$9ul3jHpXmu;YQ>CHsOn0IA(p@
zeo6880(s5EE5&o!t5`E0D7}y=`R%jG>Fm^*4gZ|2c9wJq{Ou}RWx94%cxK#n(~!2*
ze+P;hgw$MC%gvm@_|C32dHJ%xww?=0D&G8Re7QKeIHOPQ&U!P?{{bsMz2TeeQ1R`q
zZHoR5+n!bND$5V8)mYE;^xa<8C9{_9WhpmaT6q1=uD|I&#Ix*UexKfMf7AY!{oQ@H
zZ*%4C&JmopQX<sE<j?ll^^fbfe~fRgS--K~)H(agt6TA3s&bDTNPTT<t8Xu^KNde>
z8P|a=`#Gmo^Do^0MV|eahk4Oy-ead7Hh<awJ>O5S-+F({+@QB5Uw<Bsd@V86Z2Pvl
zRkHcHb4&a#96$F{a#gtL6~^|%Z7wR$3bJ2+S;VqSfbGuj>KqkE^;?W`eRJHNxpMV~
zeX4l-_d?k|rSno|-nkx(kMBo^1vov)+<auptn;>t;nI%}*`D7tCm_-&_QvPGLXtm3
z4sOxW$%v8?J25Zm9;@&1nho#I9Qe9w!_EgBv!^VO+L8Wl@l#pns>`Psl~Qx%x4&V$
zv~1exAA485{jzrXX~)XiC;v{%@tys8YWA~bagO=-*Qw6`oqSz3;$GEK&APs+&u;MK
zths(oyFh#0h6&ck!tA$qxxY56NbtAZqx{+Y`r(G-%brK;s%sq2H9ekOb~<fS?bnkM
zQ75E+f7AWx@!B$HkyZTe+=(siJ52hQntaM#9paep;r!!Lfaz-KxVcg0YWHSzEot<g
ze5m$zcJz`b%54wq!VZf#g`T-mePXKk=9kywuRABaux5$BXcu)q%ALLNknDY~JatEg
z@aF0AbN?l?{+->l=*gc%;W}0=^NyNBT_r|L3nh2lJF)-bzL2#GS?wpBPn>r}EWzQ%
z-=@{4Pn(tPd-MI@2CFS|c0c%cpzb^0iyO_G?DuTk9};AGTUqC(U0uM}y>Z2J`C86K
z@2yJbzs7$};j^l*o#xkB2jhM-Uv^HN>9!+zlKd;SwW9fjqHgjAwY9~vw=~*10{m_t
zIeP!4<<b8O&P-5C7Eu=7{Eq*_TzhMUC_ano0$(dJ#d4EH_cwlio_t>DXY!BtYErx2
zh409or)fQbNx0Wmn`48u{IZ%9rn7&F|2C9dn4OW(w#eg>t{J;po~E3k3I7#=-Tz|)
zHb-pg&^WUHn}?Khx{=JIOB3ff-#XTtpnOjLs_J1Cq4MR|ubAb{J<0JuIscE_#+Dme
ziAq{rO?^DS*Gc!yQQPIXR5&}q`bfo;3v60*9~N3Jsnoaqk+}9tB~Omh?iD-kd*4r1
zSn<|x&pg+C!j4+C3ptW>zy5wdF=}Bl`|GEhLRGJ`n9p`=UD0FyWBSC~+u3KF{&zb#
zA!h5}jbCe*SJz$n7qT*>z%=_#w#!Z>m5SFtJ}oM)trXka-r%}pp_O!f(yz-axjWCh
z_`J+B`lxV!mPd2=<++}64!1U#UW;usKd2;pl1FShU(Y$U<$v}&Gs<rI%`s(Ha%I31
zg{p_*t3E##H@Is)=TzJG`3rgWyys(!m|u3sP%bgVI{Ci#j2}0)L>shkox3}0Yt$lL
z&ErNsYh>O%C^AubnEqc)>*G^j;{$6J+?q1|?~BjBpR8WEtao1Xv86_H-I;cXKj@3w
zef09}^@iK;FPZUb^0Fz;d3geQxh`LG9+aDHQ0*xZ_WI1U-TrRz?Ah!hv40+@#XjS{
zw#{YZw(G{VXR3Y(eiu=0ljT^xXWzb!e!@m^J0G7<{?qH1&g*+SAy|L$wTSf>jy0WP
zU}EZ(@7)oz__cptt<CMScc*T-<tZivbw{RWo!Hp0KXctw`PIqlk*t3dbo_d}wwjl8
zuHR->KiP4m{Ufn&YIcRcl*CLvM>tH?k#>5$C;iNw%U`ElQhG1o_CQ?bwV-U}yq_`G
zOd0s53D>c??qz%HS{Q7!=JAovjB2JwvI`Ox${5A5mfZU<#a3NcYGCuQTB0Mwl4oOQ
z!|7@24l`Cg<X^`(W6$E-yXRS#>`mibz5jsL(w7YL`G3YMTr~Wss}TFd_S^T3+2=cs
z`$-F*IOVv@?vGh%GT(BQd-eN|o|;hJS@e@vd+Pmr?`8k6aXE)Xf0EsIM67jo-i@$j
zsfqg%vn`JNbK>`|30A&;EN#F4zQTr%Qni1NL!KTGk^AxB%x<2OcZ0*GS~mCAy5vl_
z9vpj<MO}Qm;>%05J0t7U_ecLP+OTgU+dsy2bKc+CP`2#hMfT0#zh3<EtFCkLfe^JT
zvOlLuI-M!M6XE{;+O@5{0x?U%&A;;MoPRAX*kQwQf47|T0x^bJoDU?n1Z6Hh;#Rm~
ziPz2WYlkm{MMZeb>2BS5!q`t#kTu-%kBi@*DG&cXdB3r4%9pRE&vrf*l#ALH;eK|-
z6NZn;?$=*DSU7pv{e3DSLh3C(N!kw<e7W<{SnSDx)>ebHe`b6Qwv3l|V`+PPo=t39
z->TG4LW{cs7e!d#FYp(t;J>y*{rx?`@3YUo*ug&gSYs`Rb4jr<o1D$U$(#=|Cf6;E
z-(l!G)Ai)-haa9=vYQ5cYi<2tp1`~^;6{8=j?a%z9XAe6(HA@`H6vxQk)(v$&xsty
zTPE*iS*71|r|sb*p{V1@8WSxf>J*Mm^xJmr{zSu#erYjRCrUnexO3`^^4!p%%X}_u
z%U=9_w*KOjwQTGEaYeRSvP_s*;rZpONbR&25rU<+m|w_-tv$JXsq=yl_vG#>PRoyU
zW>_=jfNQ>h!pG7}VjVvxTf}TODVUp3oY42?;pct%R{xgeSAKiIF!8>8=i@E)ulatz
z5x3a9ef{<0{xgj7G&_#({%TQh-loB$Z&FjI%cM@$uFd6E+scKW>1`=3X~~Gsd*dtX
zb|%F9mfGSK0Wr*K&yU7k;Ja3#zjRUpyRmypfbHX#W<HWO*%^m^widYYRWm0r<~_b>
zeEf-X(J@8iqg{^~MW@XAo-ox}F6O{np+d`;*L!<wCvTD~?fAQ{^W(#R0_Qd)*m+Eq
z*JR6odd7G&!;L-0zZ+(^pE~QfIdp?%<~K%j_obUJaOlqa*C?wxxyVb*zir;j7G>jR
z@1H-PRNrY${5kJAU%ULgk1cIsJ33!KX0A}_I6nRDj>O0rlUydYX?)r^Emxp+V=Mdh
z{%v0)*kt+MAKRSrJE51G$9G~gv*X*16V}w{JanAP!_xScgLSG){#?1v?3(EwW&8Li
zu4n(o>n$Pt;t6->ndiSvrikuyT$a{zMtXzZ{{MZ4q8?OR*z%q>d6~Z@{N9%s_Ha9;
z!@R4{2^HO8$llm_dA-szqgmz4-cI1&9Pl#M(&cMxXM@(;=?uOrKdp0_c4WVHsFtRk
zON(>JfmtWk^UY7Xb$_Y>)9Lp!lUMsJ<^BIdtWIZfx{jQW#DXvS(_MlBV_4b}moYEs
z<lZ76c6>qWw9D;mPPZkD53k!edv@T3)tY^q*8FWe@!4dX&Gw`hv;Nlqdg}G&jOpT^
zDpz}@Q*<8X-Epw{`Mx;#uzc<heTL+V27lBJU&zUtc#!9CoMyF<cv>2>Yw3fZOUp&3
z<Zg;-nAyv|g`cnT(M`t}4Tqvx<OGdBWj@;A_tp5Z^nY9PjY&(Z9`j#I{rH<x?Vz%J
zNML5Ly3(8HA7s9BCbInbeLO0x-JwG<Gp!~mU5ou?+{rvH#mlAF8{@LpwbzzzSoesJ
z#ZU0by~YE)e@kZST+0vtQM3Ed^V_0!_t$;+S=M^~mGswF>pv{qzHjNf8Nn43vulpV
ze0z1LQ+|iC^moR2b7n0zGz&Yvu6^y(XFJ(ub1-kXGp&6ur~QttGH*6cjArUzZ<p-M
zJH5WyxcIK6vz`xc^TN06JGb;*$k&^fv)KLm@2-U2Ti+6QN=`m@?d!E&=IzWoayPt{
zTWtLK+I@!`fk&3~?-8_mHM2H5<@<;Bc~5_HeBaobx_Fkmw)kN~lat3j$6x=<y}u^O
z?ndpGzaMTEo@nhqp6>p(?6bwrs~h8M*YGVkalcmFf79x;^;SQltVI5u(bLnt)ArH$
zCU@sQ`8UZ|&9kKiF9%4rOwQF^yX#(T-dBC4c<o6^JNjn$m?cQJ<no=g<EZLg-+KI`
zag#;2xl!bW<D4IsFn7=8Ef>3OH}7%cM){fNcYaM?{#nvngDIBvcC@d_HXHftseVn>
z*Od>qb7>3k#S|s0eX}r>(y(l*-T3#;Ezi~sr#jgC-`+8N*yjIiZu&$IzPXAAJuEgC
z<{G4Y_@ek>qUC`H57#B_{}J)v->KuGB{h{_PnW)K@0ZmH*|n|nfAH+dN?w0u=gw6O
zDwaOj8-Cq>-aHXD@3K1Q_f=v(%7)z+I9}_$5Iuh=_U`;IE0he|ojYFNoaVn?FZJ*2
zXu~fv7TBC{zVcpqO|8)1zUR*WShNp+$X=({xm*6oqW4PoQztPgHC_GRF+udpe$nrB
zc~AA#MBmEm2WZO~e-16G$^W`9DL_|UthM$_yt>47yAwCgsfiiKI#(s{zj$N)+ePIO
z?@U78`K;k>so(#Gbx8#4-|ICD>(;W*zLVH3#BgZ-_rP5D^^(8-T;<ml{w{o6Bc?XP
zF7WqF{xyPD8y_ged^yQyW?Q=^KWkPx@76^k(-*l<cVdw}SjM%PUGbXVlh6ifMrEZk
zJE!s^>Nzo*DHq>AZ~xEnM$jdEQFYVAcR!+k-H7jAuf(6X+vNS#73PVnWja^434iBN
z&kL}#w|^4f_dfRA%nyG}UAd;kta#r0_j<+0qcTa;r{$%3>m0f9(drCi`~JL+{PMaZ
zSr#t3wU2k`?V22EF17UVd~5e~tA)KR(?h=7=rG+_(Z6x;HDmLD>&1Et=5a4lY~m1M
zSg6=~;e^r}ZI=jP<HFq~6@_=-wQy_}$Q08uDUsi}_sHg@H<G&(^3JzaHkWSw=E{^7
zd&0x#p;xy7S3umuhy7c0*vmznvO5+?^71BMPEWebT5~)2#@^db`x3eA=grxo_wqxJ
zhI!GtUGuv?^>r8p{MdN+T+lVqAhCN_`9un4UoHuKwb)iMwt35pORgEZ+8pZF-ahH`
z>CoMDSE4CMvNP8tM9a_jj`<8%KXsX}GLu!<HreDZyw+yDfzMiftx0NUp_YH-ik?Q7
z-|9AER?pv>e2txYrL{{ePy6tb{_}RFefCRFuD-&&E1;37^W4eQTVDCAWqNl7*dHoY
zXb<0UcTSr~*2!dxzutFto_D`4d&T(pjJDQaH=e(XoSC>u*Kl5bN8EHry^whhi};<l
zaVx6Z++M7Ef<e8wddA{|f(%!lvsH?1^_uQ1t`)Z<bLzowYJJViTP-)_F3<n|p{L8a
zXZhley;EA(T@t_8I!pRpbm|4&^W9Hfxqj{KO#eCWc~zwK?zJInIj8R5c$s4%^Q?7G
zU#xW8w>Idoq|@HKE0+{{OgN@?ofFXdF}I4#x$j45Op0YnuW(xapB0T3vy(3_4YpZx
zuHSyK{JN;=FSLr@U)W+_$j~t>THu3*nJ-h(K5Gs+-}AR-tbcdDLhS#y`NHNFKXR%L
zUR8N9_4I~)agMhp|6AxJKk;zLw9D?x-#%WvI+$g<<%IhQs}I$bFbi#0iOOUa39#d^
z<yA`iTC*f_{mDS{kl=Ln9ZsJ@OLBP?)SfBX^v+FSh)uIt#cv|T&bBn4b(!s%6<g-Y
zOl|w$y;OBp^m$8xgf*#bOj)bK3}2K#{iSsJ>wD{6f%jd{m`OjB=nBc*wwSBkkEQnP
zqlBFE#bN8;ze!bAe%}87#o?W{-ur%A+?(SP#S>mzS9LEpc1y=(p5srHcJ0pj#-iPN
zc;m~Ni<3gu^*I>@Ty76u!Tl}#7|R#&Y>ANClG=N=cKP#b4xP2O`(0CX%hvMmho9|v
z&qY49U3&JcWznw5@7hnFKKJ#hrE>(!k)M{%7mvL!@1K`-@oxP^{u}Om_D)|THvEfP
z=hXLXew6y${uO(oZ$>ch4QSoS`ypUvdeH9)t7b=E=S`U3|1|XdTJ>MjkE0_RpZC4f
zVgJ^8sQlCX6}c<Ue06;?M_qNxU8^-h>!)3b3KKe#bmLOWg1?G$?|!Y;T^{lKi;m9H
z_4nPDc6|x>ZM43f<H9S`C68H_q#oMHHTOjt+qz3PwAL%LXwTAlwOh2ds{P#CdC!k|
zU-+57U*z1KjfdkUFUroYwKsAo?p^FtnwZb|BBd_rF*j#G<DcR^yR81S+a5T@9vl0w
zr0VY8tk^BCjc>K@^l5dP1>TNTo3AbXGgZ+}WLoR_%ctheX|ZFxV!ij;j+EWHdYxM}
zzq!3>ywQ-T(H?51WhtL}&yjCqL0%8Hy2)ctg>5Z@Vv9AV-Bip}6q~Lxc@|S!TX*Gs
zU#1=d4W^H84Sw)MJZV196d@q*XEjA=Lz>I%PQJ52m!2<B;puaz_@x!{_mJZBtyllw
zwfv<R{=+k*KT&DEr+7D4^0T-dj72)D`K6`UIL;lPaoBeTmyy1#|1^bd6TR0IU+R)*
zu%9ef<CrvEX5(pbWwnKpk2I1rSdC^mYH4VS?Xbv;Xjx#vw{td+vyt(>AZ5Se)Cn`A
z`dJtg(_M>p=<~+Td%A3X_2Km_*OSt$Bf~Q`Uly5kpL4GX&pBV!e>Y_oDE0gEaD}m~
z(y3T|hT+qS?eQ$8a-ml*Y*?|;@1cR<ns>f!hdEEOJoZ19%x@<7Z;vO>F8ys`^ZAZH
z5&gOHFpqX=^A`OhqV<Vdzk*gscrOf!=9>B|Xobl%r_^fAkg{n`spXm>-=;ab#-F-z
zeY(-NuS<JsYc-SOLEMu!;%A)cIoYYiY&^M3NO88OYv+WsOBT7DNDB&7N-<ukVQ7Gj
z*t}u|NJ1y|&1z)YfO+$w4-7Z?TozAyxNd>y5!Pkw&u^tqx8J(n&)<L7hO3@7@0BO6
zyvE?jnYWzRi1`V>Vyy9}<I}F*SLps-vsnJ^LxGvj_gjTkw`9c4IHTfyeTs{5mv~Rr
zWUc>_a`I1D_qWyUICA3b<?<r4u9>XUPaUm3vTdhsQjzu(A?ZWcFY!KJT%|3VVR8TI
z!90;mC!d5Vxjc$%>^>DQ`~Bj|1<}Qq+~-L~e4G`uOX~h6w~RyIF6>B=XY)9BKsHH`
z@u1ds^(QA~pVT(L4chjYec9#B3&IN<-xu}&a1;_hucR>VOK!({pNVSkil@)pdBA?=
z<J)?3d>-we{8rNK>*0&fC;Pp&n06rNGS8%p_}fNXVtp#|qw@pWrrggAt^J+<bH~G0
z-6i?yhbn)q`<RsdYDr$k)vI5h@|XPFv#gN&#jm^_7ga1PY+mc#TD3!YJL}yCi%(oP
zY}k8A(O^Zs{gSepm%Dit-(Km{=REc3Gjo7#z%eDEw*?a;XHUvvf5Lk+cK_8I^D~wu
z^U0r0x6e6w|Mbb_eWmGN-*c6`KjV<lwdZxGo2A*|b@4qPa*jrv)cI9!)gvOMwLehk
z>60gIx4$c>%3In-`G0$HJF$SFI(Ad;L*Db=0#k*&Jr&#k_;ChWTmErhQy8*Bz(Zm0
z`T`Zl+DF13?~ZT^s01}UUZU9Y#*eMmKk5A@mY77B=8$ud(wXiK>%N*>$8VZ_>zLdd
znLEdIDulnjZCr6zh}}q~q09WZ^V0{ce`*fRTJu2SlJ8^ge1>mDW%k9_+}Zwbn{ctZ
zTJc}reW|we_<zQsTlT!riwu1)8hX{TcIVu8-pec!&1V|*#!lF_Xrk(k%Uv%gH2)F{
ztcv~MVg4{7FN{@Umef^soAr)b>AuT9X{`R0;;!=RzW5U*hqk|0!~6>ju3RW8QGfsQ
znu_iH*udhA`{S)-_}l;gSymOcu!`e1_sV&5;&P7c^<Zu4`)5`9kG1Id*;yxRr>A^B
z@&C@1eG@p>cfWhPyZT?tL7%fzj~h;XylazKUSgG?-^*Pc!T&a2W?t6w#%|Zv=9WI;
zt+uCUi#M!J*>jo8e4<{4>GNwz>KEQc&)$B1c416|aAIt4y}I4zg_~zO8!iu9_A>rQ
z@tn4O%3eYTS4MUguIF4S6?LcSe~tY6t-gmje|Kx#m=nkH)8l*6o4YSp?b-e4%GBO9
zqWVD&Nsr(6-<tdR^yJ`4onmJ5CjD5K->>F8>v1{@`~L@WN$2-|K6A0-cB54Jjw6Yo
zoqYmsCp@1jdM)c)QGEX5bc^L$j`2HgPYv<of9d)vAgz2}OtON8@p}&cIYI8fxsDns
zYd!s7Se4y(jNRmyKwpoSOydb#7bpAA>9V0Y?!NQpKH0uRO*6HA@s|Hl>*mG&`%wG(
z&6h_n{)AL$amN|0a{jJYsnDGj61aQE-?eUMPuRD!?tEzFcWAlhCe!+|v^jHx!$1Di
zpYn6^LTz&oEon(fCeNpQ+m86G@=p{x^Y9tFwyC3t!&0vc3a5h~EZ*MyFSTY*OY^-4
z3-mXLN2naPlK7xie_~_z(l3W^uKcns?IUB9#pU_7_PZ|}-2KN*V#1l_xANxJ+gZQb
zqNnet@0WC(!Mtf+$Be>%vS&o*alhE`!Y9brs+QyTF|$>(W|*ve$9`jHnC-7Wp9`P=
z>S32RdnhX7_CwBZ>lVH6?Ux<49G{cs(s^0wi_P`#6MrXE79JA$=Tlo|dp$*(xnxJl
zM$Z3_Bw3si?@Aqd#rWTE-wO`@^qH%8!ls@JU-~&TvnF(o+4}cg&$L-<c^2MN3+3<l
z^k&y&hpJ1a#;ewS4lG@)XHgxugYnRcKE}%Q0%o^u{N{g_Tr2K1D7~Ka+aN9Xx1!Uh
zAYFkudHQE|&3Si;Gx2`;m2b9lbJN|JcFpB^)7W+@MJGq$Qrh+Hg{yz+|L@vs)yG}R
z8YA#b*JzvcLk<H6?(`q`0~{h{J~#PT&)D?+ig@t7Fo(z)Rwo#Odo<ZOPwmwEqR>zy
z7Q5MgTde3g<F)TSmz%2Heg0(gg+{-Bvp6#Yek$$cU#B#G)~>U6^f&6quKZADebeDy
z_q}VMWL=h-<W8Kf@%ZeiRmuMtW(cM$2s1TJv@utRl%2?uvf`ujQKf~icQCJ7m{)Sy
zZi3J1BU<8b0)w7%J=dAuV-XsZH)}JOS&vk_LE^mmU4MSb)Lm<s|6p_J$0;Wm<~KiI
z#bbZeO5{qhSG(HLl;5edL%C;{R!+^F8nXEa*RG2vG+v}^E{oe1`E^6&TFcq0*Z%ds
z?fJ(4T<BAv$X|aUx5Qm{WyLv{zDP}ENtT>AIbv5?*3VOQ7bCj1XipJ79cf^r^j<*K
z^3$rta*te6E-cHD+ms*J@48s-)2vfJiZiu#PgrIYwtVG3;jfdvl)P+Z`=F!SvQM+m
zRrL6+tl|x&Hk-eTo|}E(Zrqbe>-%2zo{`)AoO@H!j(c1|JJ&4rXPD?5tt6q|eti1%
zxtHhfejX*VYD(SL;@?|tTkf*6w>r1(&Q%k~Eq)hQ3J00nHZI$0SGvB>O1`s)<I~R2
z$@@RXAAj<P@8sO;vY7=-ca}a6yvSECpBbDZtbMU{-#@J=OFR4YGrg7GOT?3;kK0cv
zwc%UsE^oi(e4S4Aho6Tve}BImx;!TR6yyI;f4dEr#OI%nzWzUWo#cn7zh2Dxck3AQ
z-Zh0!Z|~n?{pF(n+Q%;rN4|cvCHC0lj2~T^5>qpR!*-cwfAr|KPdoa3lFX&g*Nvif
z{Sp*1Pup4+qTO|I(j$30_mjI*y5`GowN9UYe7;I|d~E!)@OirT^8U`h%yiWHy1RJp
z&qwx-N++3)u8*EuW8!pf&a)!BSefp7UqvhyJzDOrzF$Q1-o8n!%}Zs(kN;XyT%{EF
z=kdjvI~MGyc>esdd@*-=cXLVYxz>5Puk>>tEsdT3uixk6<I|HbcW>K~<M*+DZTGp(
z2mzynb$<QJJyN&L_VZsKC2sH0q<GZ-!+&m({}q*GMJ0bu&Wx3Ly>jxl9T|RwIv?jp
z<!(IjTx7pRzNlv1TxF}KN9ohucPeRW)YX(#O)-xMK5Bew`_m^c?wQSLIQKueszUp?
zkTB26hrhT2YR@dNs$^Z^w`oO(+L7XYp^LZ-m+UH(+K^hhSmH*>?p-no4G)(sd!HR|
zlyiFf?9<88$0oczSEIds&$~URD)=tToOrszpv&>f>>n3R<O?G|FdXg`xN9=KB=Q9Z
zo8g{Jy$_on{GDPR^6;j}{OZgf49@eK_gJMEwyA6ju9)!rydJ0Y(FsSUK7XYvEPiYP
z%hg$jR;D%{l5n{+|M_b@VW|X<-jnA(UW|Nw*elSG$J|YMwUO10R_nbHrZxvA2yWTD
z_}t5*8*hA#n6|)>N9D4&SFTKa-28tPAAi=g&gnL|^P-w5`@pjG6>0jj_URp$Dv)5g
zoNBmb>A`M;B^KtYZQD%F%?%Se-MuyUAe%#|W9AC$V-0uZXQkOm$DHlfU{86QkY%%z
zed>fH#fZ+W9>1EV?H4*JoE96g?$YUVyUc#`r9Vxm4!*JXd&=QEr@y4}sRw`l{>s+!
zpNwJ*U&|GhRaN=le#af@P;C_O^;z{j`8@BmUKXd<PYjIsk8J;+sw>SglSfihp?{ui
zgtyp)DUaj!9zT5Q<8&S;lb=l=A4NAFUZ9h^M<v;m<!HstOA~nv6L@Nk4W_TPbTRhR
zS*+clH0Mv4;?g52dtx+7=Bh6AZ*ROBZ)ATWNQj+jo#x){a~JqeIbP&&q}wLblr2N%
z{x9{^Q=cvz;0itT<U4z;e#=G`nH!dciC6E{e_Opb;YO;2+BEqBnM1Lyb7!m<yPA92
z{o3}byAsW_o!l~Y{U^DckZ3d6vhnGc>6&3SCeIVE@ER6u;8007s^Z<iaNM_OU;NhN
z`?lvCpMKo^#N+=hJCqWx1&fD^ugR&HRN3e1rrCU``0SDWk*B}f79B9ukg+(w>$RO*
z-5;-mwpFnVlgd_d9y&2I*7Oj|=Xnka@$To1G-P%(UVZv3U7Oil&Sw|TDPLdjm%?kZ
zJ)HJkEz@=ASy1rd&&I2p&pyn4u)zAAk%^35InTR`MSqXR)G$1C%jY<j_vFcXK1Dg{
z^5lM}&YJ%mOC@(G@7`Wy_o%)}k@@h)2@8woHC^2i$W+46=6u6EKUTj&^^fu;H-<tE
z=l=~xg-1Co4Kk-+*}UfB4^f9F2R<;TzDYJsSsSD1mtfGIaOqh^>$^-QxrURgq#iZw
zW$TE@6gG&Q&BHNsQ>7>eqYs;^aqa5xE|#ZnQ!XscFcO=v%UnhOX;ynFOUa9SFSh>8
zl}jneW?z4xf2o3`MBSAyY|fwcn09#8>=SP^ye#}U{GbERgvN&-E&o5V+>ulxC?WUo
zaQ3T5?Hmae9>zP<PQ`1fc-$6|<(;%6)8=<oiH4>h@76=faq3T=l~{bruB_2prMZ5O
z$PO3%16#x2*sbeGRA2t~8ozi-yV!Pfo1bDk)#lx0KX1zZDN}ax(pP7TdCjH#n6@!r
z7Jhb(=~kkh&ho>4?@a_{G)3>NKRUhLCb?tUa?ObJDg5g@r|bLYSNcysZ_uA+cq#Cw
z*WtWV%l7?EZQiu>be;zH{!NeXO|7|9<0}<E`Dx|OttpHbz25{_HYRc1OsVwgUTw3r
zTA}h_<g>(2bMD7@rG@jC^2G35-(>+FK6uK1py`xgoNC>b_nWu<I8pK<-6QdBvP90G
ztui)$*wW5FlCpTq<)Bi2A%4a^fk~|bE7guS^Ir)NdREl>N4COd#S&$o$(L_1TTRz`
z$x&Q!i1o|Ein(q)R^}?|&OQ}gdpB|)d6AHQ<l3bt4tr)yYGytgE_JbZ;V0={hg%Q+
z*CntC%lGE0yXQN(rrC@6uF#F<{o5Mqc0TBLu$GGD@3-tbJdzUp+8C=0+J(6@*)89v
z%uqjU{m`-I#5b3%Y|Z{f5*vT#P50Wok7?Fc(F-PF4#Dw^zP+($_F4ocrp<gC<uPTZ
zyQitLbHEIvq}_5tN4}Yc7&mRa^YP99`}a0}+m_4x{pS9r;Aj<Aq3B8XJ>RaaER~(c
z{%DJIfJj@8@iwu@Pb!xDJip&Ro;XQ2a*2xGw^ylFEWXM?$9F%Lt+WYp-%!0{c5)8i
zOM}l3xjwDbi_uvaX#CzW&1TA`mwRP|tFG0)u9{tGdUHm}JD2MjYoDAGEWPcP8W`QL
z6Q%DccJ=FtML&g77Or;}>z%H^ool;k#eSB^6|X0{<{EE`Xg1j7!9V?I_T07G1GSA<
z7d{hnvC~gtel=mDNA6F)vg;Gwb-VQEx$E8w`XrhA`)c0LU!V5W*H!V&*MIZu#bOT4
z@b}_@?4d8^F3yRX+vk?=)T!b0gO??D&epr~4?eNjAG2$1sP;Fyw`o%TMShKnL%OV;
z#ghtst8%5+2(N#rQ>J8Iwsxz}Iw@rhW!c+YPb67>Mm}8h{e=5v(`!+_iizRVGbLZ8
zaGsvJu226?g5*375#5~`tDW@x`s`%pcMG38*%f}wK7Dtppw{%63+GRc=uMyZcGtQM
z>nrSIV`}#Nm~dvT+UXTXq;!uh-sdRyy65=i*RM~%F5&z9aYk{Z#)Z?;vv~9tPL+{u
z$(?z*ri@QMh1GKZj)(^>^=7l~-a6;fu=M-u=XVbKI&e>~cKlGbkh3&2XR=Ac&V7pd
z#s*S>7k2G(RL*f~I_6qa$vfvMN7C_%+Y3ILDi$Z3X#9@3_sO*``Aw+#3ArWe{7m1n
z15cfaW$Y`BYic<x@!Lx6?wpM^3tE28T)lh3hOHqv!v9X+Zke>Z#nPNpS^Bf&()%UB
z|L%NgyItsdb>?F~-ucI>AGRevNjmY%t189v^6~4-mgW9hmgwqZo_5dt?)8S}(-!eI
zU;q8qcFDWKaLp6nl1>W+O+3nGA-AbEyYIQqX-z4=4<F8*_Iz^cl~lj)?Dcak`Bawd
zSGbbY64&pOpC;+Q`;L|m$Ca1PyDzd9{QReDlsjulxtrDT(zY2r4BsSreZ-kQf1k1D
zf1gbKp{29*u8XmrC@@rU*ITU3ec1I*!S4CV(f&{5WBR^2&)FsNS*53PpRsUAg4y)P
z5@&Z=KYBIYfA8COJPSVTzodBn#GyS$V?V$Bt?c}4w#kIG=8L~iWA(gUDf2EjSbo{f
zE891kZ?vDizgl%d%IdgP&3hwtcPY%>CujO;1MBgEZPA@xtLF){S;Pi;XB@mDd3Np5
zg;q`TIwpolCv}vU-2XYjS$#!)VM|-z)6!WTHtm}PjdV8gDW3L?igx6Gc4B^s$l7mi
zibk`nj=XyC$H~3XH0tK(`8qLj7VkKA&y~Hb)^yi0CS=a}9arb<l)s`Z+MdIjVd?ye
zp{z_zt&F$aqH<ApbP)F;qkRwiHr@|>kg!2WhxM`O)OY?5@0-jFIx3$lZvA`vPD!p+
zT6c{vAG$YflkwT}=S&iw&(V6e&FIO~^b_0?uQqNji9R)9{(MFIgcrv?yxTT)Zglja
zhBp_Qo|)M`-ID6_^WU2VL6sF18vM`nB>QxY{HL~`+fuZi`R-KCZE1hg_OA*utMhmq
zDI_YXezJL~iI%~e@E3C&>e!1}W(K#dv-~XRXf{te`A%S+*}Go3+7&<ijc=Si+F$py
z{L_?BRhGK_`{Q@<KIzQ~x-)-bc=`QB_JINqf~PotxxVS#+Lu*}yuP<}b8uaMG5g!v
zW~&$8FS{=Ve@hUz+@Yu1Q-7`GUGfc!JHaRTKkKwzlRaxHDt29ZiAL5X<FyC9UZf@O
zzu#}Adg{7u;qTCEe7^-3T}chN#-d{y6q&Vd+x;|Ffm>5D_bR4!th~5dJCrSc@^6WC
zCChX>x_;<-m-<GZ@thm_v!>|N#~`Luj}oa<asGTur?q=Ywp7VUr3zeQ-E?8mFO6H_
zkF-^J_ny9RLEu8b*<}l72{=y`J@|CFkc!FCqN|Zp4Ibz>Z&gk3IiIFu*`fO)L7LO3
zWQoLSrx>HEyBB^ejtCaMX{-I{w(UdrWw{$UuSE3TSjaAUCiGyy<XrA6dPldg%vLkn
z^5HqB#mNbt-nLW4-t00e`H(BD7t(t{an}Tc-o6h(!IDWVmwiiPkDNI3gm+(|dA5@9
z0@ax+9svusvYc~St!r{PEa?JY+tfxw`Q9_tE1&%=X0M(Xq>?qS!nWwo_MdF0=PeiM
z<fynJ^`OdgqQV5nXr1OVC$^{s90kGO^Nrp$TzfWq`8Ba@2kV85+GqPWs5&;S`(*7H
z-a7X{*Cmewiw&nOYP`?A>z2^v3qohzjZgn_URLOPVTW1>W0=Y%Cr{BUrUzH7=$>0(
z`><vGHvN?>yAoz`OgCM$NP_p^q*rfh-#`2F=}E|{+KD`~9(@zeUKPN3lSSz|r|G|(
z1M`-Pd}KMGr}NIbIKHdN?0=>5Gs6w57s+qkXE<x-xuk##LR=e{q-Is|MXo-5A?W$<
z_Nv$y@|%<xS?8sn_F8;yzSKjf7de?B!Ak_=RCQf@5?V4$J_$^g(3yUu<@;T4L1lxh
zZpQqEobqX&J^D(^zI@$aVr1Ll(rfi9v2)&xmxtbQ@ET0~@2g;R)G1U|<V|?V{h4=X
zcfM5QP?p`ZdWOzAR%x|0A8s6N>vuoB=s{(E-eO}Lhgp3kZynZ8mS3{Esx*?{DOojR
znM>h9hQbg3X1?|j_V9jM^i*#5vZp=Tfe+Uz@iOHFP7@3C2(4XQqI{<|?Z<=3zD=_>
zFx^jYHo5qqQ%>!Vd!pmF?r&X}Ts!`D&U(5k>e{K$s!1DK$`to6@6XNXG&vIB&wKgP
zT;^|Xn^*ml$ai=tXFV^!;>C>(Jumkbr(e49`gT!BSR%_c)8oP%vV6O^zntgH;Hz--
xRlCdCw#>@QTJ5e&?j=*^^e-&?8LPK{iDhIJ32?we{ONy?e@ph(Z-yJm3;-2KyFUN`

literal 0
HcmV?d00001

diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/ahb_bootrom.v b/Cortex-M0/nanosoc/systems/mcu/verilog/ahb_bootrom.v
new file mode 100644
index 0000000..5031a98
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/ahb_bootrom.v
@@ -0,0 +1,29 @@
+module ahb_bootrom #(
+  // Parameters
+  parameter AW       = 10 // Address width
+ )
+ (
+ input  wire          HCLK,    // Clock
+ input  wire          HRESETn, // Reset
+ input  wire          HSEL,    // Device select
+ input  wire [AW-1:0] HADDR,   // Address
+ input  wire    [1:0] HTRANS,  // Transfer control
+ input  wire    [2:0] HSIZE,   // Transfer size
+ input  wire          HWRITE,  // Write control
+ input  wire   [31:0] HWDATA,  // Write data - not used
+ input  wire          HREADY,  // Transfer phase done
+ output wire          HREADYOUT, // Device ready
+ output wire   [31:0] HRDATA,  // Read data output
+ output wire          HRESP   // Device response (always OKAY)
+);
+
+ bootrom u_bootrom (
+ .CLK   (HCLK),
+ .EN    (HSEL & HTRANS[1] & HREADY & !HWRITE),
+ .ADDR  (HADDR[AW-1:2]),
+ .RDATA (HRDATA)
+ );
+ assign HREADYOUT = 1'b1;
+ assign HRESP = 1'b0;
+
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/bootrom.v b/Cortex-M0/nanosoc/systems/mcu/verilog/bootrom.v
new file mode 100644
index 0000000..95919b7
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/bootrom.v
@@ -0,0 +1,277 @@
+//------------------------------------------------------------------------------------
+// customised auto-generated synthesizable ROM module abstraction
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//    Date:    2302101100
+// Copyright (c) 2021-2, SoC Labs (www.soclabs.org)
+//------------------------------------------------------------------------------------
+module bootrom (
+  input  wire CLK,
+  input  wire EN,
+  input  wire [9:2] ADDR,
+  output reg [31:0] RDATA );
+reg [9:2] addr_r;
+always @(posedge CLK) if (EN) addr_r <= ADDR;
+always @(addr_r)  case(addr_r[9:2]) 
+     8'h00 : RDATA <= 32'h30000368; // 0x0000
+     8'h01 : RDATA <= 32'h10000335; // 0x0004
+     8'h02 : RDATA <= 32'h1000033d; // 0x0008
+     8'h03 : RDATA <= 32'h1000033f; // 0x000c
+     8'h04 : RDATA <= 32'h00000000; // 0x0010
+     8'h05 : RDATA <= 32'h00000000; // 0x0014
+     8'h06 : RDATA <= 32'h00000000; // 0x0018
+     8'h07 : RDATA <= 32'h00000000; // 0x001c
+     8'h08 : RDATA <= 32'h00000000; // 0x0020
+     8'h09 : RDATA <= 32'h00000000; // 0x0024
+     8'h0a : RDATA <= 32'h00000000; // 0x0028
+     8'h0b : RDATA <= 32'h10000341; // 0x002c
+     8'h0c : RDATA <= 32'h00000000; // 0x0030
+     8'h0d : RDATA <= 32'h00000000; // 0x0034
+     8'h0e : RDATA <= 32'h10000343; // 0x0038
+     8'h0f : RDATA <= 32'h10000345; // 0x003c
+     8'h10 : RDATA <= 32'h10000347; // 0x0040
+     8'h11 : RDATA <= 32'h10000347; // 0x0044
+     8'h12 : RDATA <= 32'h10000347; // 0x0048
+     8'h13 : RDATA <= 32'h10000347; // 0x004c
+     8'h14 : RDATA <= 32'h10000347; // 0x0050
+     8'h15 : RDATA <= 32'h10000347; // 0x0054
+     8'h16 : RDATA <= 32'h10000347; // 0x0058
+     8'h17 : RDATA <= 32'h10000347; // 0x005c
+     8'h18 : RDATA <= 32'h10000347; // 0x0060
+     8'h19 : RDATA <= 32'h10000347; // 0x0064
+     8'h1a : RDATA <= 32'h10000347; // 0x0068
+     8'h1b : RDATA <= 32'h00000000; // 0x006c
+     8'h1c : RDATA <= 32'h10000347; // 0x0070
+     8'h1d : RDATA <= 32'h10000347; // 0x0074
+     8'h1e : RDATA <= 32'h10000347; // 0x0078
+     8'h1f : RDATA <= 32'h10000347; // 0x007c
+     8'h20 : RDATA <= 32'h10000347; // 0x0080
+     8'h21 : RDATA <= 32'h10000347; // 0x0084
+     8'h22 : RDATA <= 32'h10000347; // 0x0088
+     8'h23 : RDATA <= 32'h10000347; // 0x008c
+     8'h24 : RDATA <= 32'h10000347; // 0x0090
+     8'h25 : RDATA <= 32'h10000347; // 0x0094
+     8'h26 : RDATA <= 32'h10000347; // 0x0098
+     8'h27 : RDATA <= 32'h10000347; // 0x009c
+     8'h28 : RDATA <= 32'h10000347; // 0x00a0
+     8'h29 : RDATA <= 32'h10000347; // 0x00a4
+     8'h2a : RDATA <= 32'h10000347; // 0x00a8
+     8'h2b : RDATA <= 32'h10000347; // 0x00ac
+     8'h2c : RDATA <= 32'h10000347; // 0x00b0
+     8'h2d : RDATA <= 32'h10000347; // 0x00b4
+     8'h2e : RDATA <= 32'h10000347; // 0x00b8
+     8'h2f : RDATA <= 32'h10000347; // 0x00bc
+     8'h30 : RDATA <= 32'hf802f000; // 0x00c0
+     8'h31 : RDATA <= 32'hf83ef000; // 0x00c4
+     8'h32 : RDATA <= 32'hc830a00c; // 0x00c8
+     8'h33 : RDATA <= 32'h18243808; // 0x00cc
+     8'h34 : RDATA <= 32'h46a2182d; // 0x00d0
+     8'h35 : RDATA <= 32'h46ab1e67; // 0x00d4
+     8'h36 : RDATA <= 32'h465d4654; // 0x00d8
+     8'h37 : RDATA <= 32'hd10142ac; // 0x00dc
+     8'h38 : RDATA <= 32'hf830f000; // 0x00e0
+     8'h39 : RDATA <= 32'h3e0f467e; // 0x00e4
+     8'h3a : RDATA <= 32'h46b6cc0f; // 0x00e8
+     8'h3b : RDATA <= 32'h42332601; // 0x00ec
+     8'h3c : RDATA <= 32'h1afbd000; // 0x00f0
+     8'h3d : RDATA <= 32'h46ab46a2; // 0x00f4
+     8'h3e : RDATA <= 32'h47184333; // 0x00f8
+     8'h3f : RDATA <= 32'h000002dc; // 0x00fc
+     8'h40 : RDATA <= 32'h000002fc; // 0x0100
+     8'h41 : RDATA <= 32'hd3023a10; // 0x0104
+     8'h42 : RDATA <= 32'hc178c878; // 0x0108
+     8'h43 : RDATA <= 32'h0752d8fa; // 0x010c
+     8'h44 : RDATA <= 32'hc830d301; // 0x0110
+     8'h45 : RDATA <= 32'hd501c130; // 0x0114
+     8'h46 : RDATA <= 32'h600c6804; // 0x0118
+     8'h47 : RDATA <= 32'h00004770; // 0x011c
+     8'h48 : RDATA <= 32'h24002300; // 0x0120
+     8'h49 : RDATA <= 32'h26002500; // 0x0124
+     8'h4a : RDATA <= 32'hd3013a10; // 0x0128
+     8'h4b : RDATA <= 32'hd8fbc178; // 0x012c
+     8'h4c : RDATA <= 32'hd3000752; // 0x0130
+     8'h4d : RDATA <= 32'hd500c130; // 0x0134
+     8'h4e : RDATA <= 32'h4770600b; // 0x0138
+     8'h4f : RDATA <= 32'hbd1fb51f; // 0x013c
+     8'h50 : RDATA <= 32'hbd10b510; // 0x0140
+     8'h51 : RDATA <= 32'hf915f000; // 0x0144
+     8'h52 : RDATA <= 32'hf7ff4611; // 0x0148
+     8'h53 : RDATA <= 32'hf000fff7; // 0x014c
+     8'h54 : RDATA <= 32'hf000f868; // 0x0150
+     8'h55 : RDATA <= 32'hb403f92d; // 0x0154
+     8'h56 : RDATA <= 32'hfff2f7ff; // 0x0158
+     8'h57 : RDATA <= 32'hf000bc03; // 0x015c
+     8'h58 : RDATA <= 32'h0000f933; // 0x0160
+     8'h59 : RDATA <= 32'h68012000; // 0x0164
+     8'h5a : RDATA <= 32'h6841468d; // 0x0168
+     8'h5b : RDATA <= 32'h00004708; // 0x016c
+     8'h5c : RDATA <= 32'h48532141; // 0x0170
+     8'h5d : RDATA <= 32'h61010149; // 0x0174
+     8'h5e : RDATA <= 32'h60812101; // 0x0178
+     8'h5f : RDATA <= 32'h60814851; // 0x017c
+     8'h60 : RDATA <= 32'h20204951; // 0x0180
+     8'h61 : RDATA <= 32'h47706188; // 0x0184
+     8'h62 : RDATA <= 32'h684a494e; // 0x0188
+     8'h63 : RDATA <= 32'hd1fc07d2; // 0x018c
+     8'h64 : RDATA <= 32'h07d2684a; // 0x0190
+     8'h65 : RDATA <= 32'h6008d100; // 0x0194
+     8'h66 : RDATA <= 32'h494a4770; // 0x0198
+     8'h67 : RDATA <= 32'h2b007803; // 0x019c
+     8'h68 : RDATA <= 32'h684ad009; // 0x01a0
+     8'h69 : RDATA <= 32'hd1fc07d2; // 0x01a4
+     8'h6a : RDATA <= 32'h07d2684a; // 0x01a8
+     8'h6b : RDATA <= 32'h600bd100; // 0x01ac
+     8'h6c : RDATA <= 32'h2b001c40; // 0x01b0
+     8'h6d : RDATA <= 32'h4770d1f2; // 0x01b4
+     8'h6e : RDATA <= 32'h4c44b510; // 0x01b8
+     8'h6f : RDATA <= 32'h48416821; // 0x01bc
+     8'h70 : RDATA <= 32'hd00a2900; // 0x01c0
+     8'h71 : RDATA <= 32'h781aa342; // 0x01c4
+     8'h72 : RDATA <= 32'hd0212a00; // 0x01c8
+     8'h73 : RDATA <= 32'h07c96841; // 0x01cc
+     8'h74 : RDATA <= 32'h6841d1fc; // 0x01d0
+     8'h75 : RDATA <= 32'hd01707c9; // 0x01d4
+     8'h76 : RDATA <= 32'ha341e017; // 0x01d8
+     8'h77 : RDATA <= 32'h2a00781a; // 0x01dc
+     8'h78 : RDATA <= 32'h6841d009; // 0x01e0
+     8'h79 : RDATA <= 32'hd1fc07c9; // 0x01e4
+     8'h7a : RDATA <= 32'h07c96841; // 0x01e8
+     8'h7b : RDATA <= 32'h6002d100; // 0x01ec
+     8'h7c : RDATA <= 32'h2a001c5b; // 0x01f0
+     8'h7d : RDATA <= 32'h2204d1f2; // 0x01f4
+     8'h7e : RDATA <= 32'h07c96841; // 0x01f8
+     8'h7f : RDATA <= 32'h6841d1fc; // 0x01fc
+     8'h80 : RDATA <= 32'hd10007c9; // 0x0200
+     8'h81 : RDATA <= 32'he7fe6002; // 0x0204
+     8'h82 : RDATA <= 32'h1c5b6002; // 0x0208
+     8'h83 : RDATA <= 32'hd1da2a00; // 0x020c
+     8'h84 : RDATA <= 32'h60202000; // 0x0210
+     8'h85 : RDATA <= 32'h8f4ff3bf; // 0x0214
+     8'h86 : RDATA <= 32'h8f6ff3bf; // 0x0218
+     8'h87 : RDATA <= 32'hffa2f7ff; // 0x021c
+     8'h88 : RDATA <= 32'hb510bd10; // 0x0220
+     8'h89 : RDATA <= 32'h48262141; // 0x0224
+     8'h8a : RDATA <= 32'h61010149; // 0x0228
+     8'h8b : RDATA <= 32'h60812101; // 0x022c
+     8'h8c : RDATA <= 32'h60814824; // 0x0230
+     8'h8d : RDATA <= 32'h21204a24; // 0x0234
+     8'h8e : RDATA <= 32'ha32f6191; // 0x0238
+     8'h8f : RDATA <= 32'h2a00781a; // 0x023c
+     8'h90 : RDATA <= 32'h6841d009; // 0x0240
+     8'h91 : RDATA <= 32'hd1fc07c9; // 0x0244
+     8'h92 : RDATA <= 32'h07c96841; // 0x0248
+     8'h93 : RDATA <= 32'h6002d100; // 0x024c
+     8'h94 : RDATA <= 32'h2a001c5b; // 0x0250
+     8'h95 : RDATA <= 32'h4c1dd1f2; // 0x0254
+     8'h96 : RDATA <= 32'h29006821; // 0x0258
+     8'h97 : RDATA <= 32'ha31cd00a; // 0x025c
+     8'h98 : RDATA <= 32'h2a00781a; // 0x0260
+     8'h99 : RDATA <= 32'h6841d021; // 0x0264
+     8'h9a : RDATA <= 32'hd1fc07c9; // 0x0268
+     8'h9b : RDATA <= 32'h07c96841; // 0x026c
+     8'h9c : RDATA <= 32'he017d017; // 0x0270
+     8'h9d : RDATA <= 32'h781aa31a; // 0x0274
+     8'h9e : RDATA <= 32'hd0092a00; // 0x0278
+     8'h9f : RDATA <= 32'h07c96841; // 0x027c
+     8'ha0 : RDATA <= 32'h6841d1fc; // 0x0280
+     8'ha1 : RDATA <= 32'hd10007c9; // 0x0284
+     8'ha2 : RDATA <= 32'h1c5b6002; // 0x0288
+     8'ha3 : RDATA <= 32'hd1f22a00; // 0x028c
+     8'ha4 : RDATA <= 32'h68412204; // 0x0290
+     8'ha5 : RDATA <= 32'hd1fc07c9; // 0x0294
+     8'ha6 : RDATA <= 32'h07c96841; // 0x0298
+     8'ha7 : RDATA <= 32'h6002d100; // 0x029c
+     8'ha8 : RDATA <= 32'h6002e7fe; // 0x02a0
+     8'ha9 : RDATA <= 32'h2a001c5b; // 0x02a4
+     8'haa : RDATA <= 32'h2000d1da; // 0x02a8
+     8'hab : RDATA <= 32'hf3bf6020; // 0x02ac
+     8'hac : RDATA <= 32'hf3bf8f4f; // 0x02b0
+     8'had : RDATA <= 32'hf7ff8f6f; // 0x02b4
+     8'hae : RDATA <= 32'h2000ff55; // 0x02b8
+     8'haf : RDATA <= 32'h0000bd10; // 0x02bc
+     8'hb0 : RDATA <= 32'h40006000; // 0x02c0
+     8'hb1 : RDATA <= 32'h4000e000; // 0x02c4
+     8'hb2 : RDATA <= 32'h40011000; // 0x02c8
+     8'hb3 : RDATA <= 32'h4001f000; // 0x02cc
+     8'hb4 : RDATA <= 32'h52202a2a; // 0x02d0
+     8'hb5 : RDATA <= 32'h70616d65; // 0x02d4
+     8'hb6 : RDATA <= 32'h41523e2d; // 0x02d8
+     8'hb7 : RDATA <= 32'h000a324d; // 0x02dc
+     8'hb8 : RDATA <= 32'h72724540; // 0x02e0
+     8'hb9 : RDATA <= 32'h203a726f; // 0x02e4
+     8'hba : RDATA <= 32'h414d4552; // 0x02e8
+     8'hbb : RDATA <= 32'h6c632050; // 0x02ec
+     8'hbc : RDATA <= 32'h65726165; // 0x02f0
+     8'hbd : RDATA <= 32'h00000a64; // 0x02f4
+     8'hbe : RDATA <= 32'h530a0a0a; // 0x02f8
+     8'hbf : RDATA <= 32'h414c434f; // 0x02fc
+     8'hc0 : RDATA <= 32'h203a5342; // 0x0300
+     8'hc1 : RDATA <= 32'h204d5241; // 0x0304
+     8'hc2 : RDATA <= 32'h74726f43; // 0x0308
+     8'hc3 : RDATA <= 32'h4d2d7865; // 0x030c
+     8'hc4 : RDATA <= 32'h616e2030; // 0x0310
+     8'hc5 : RDATA <= 32'h6f736f6e; // 0x0314
+     8'hc6 : RDATA <= 32'h00000a63; // 0x0318
+     8'hc7 : RDATA <= 32'h48034904; // 0x031c
+     8'hc8 : RDATA <= 32'h47706008; // 0x0320
+     8'hc9 : RDATA <= 32'h48014902; // 0x0324
+     8'hca : RDATA <= 32'h47706008; // 0x0328
+     8'hcb : RDATA <= 32'h05f5e100; // 0x032c
+     8'hcc : RDATA <= 32'h30000000; // 0x0330
+     8'hcd : RDATA <= 32'h47804807; // 0x0334
+     8'hce : RDATA <= 32'h47004807; // 0x0338
+     8'hcf : RDATA <= 32'he7fee7fe; // 0x033c
+     8'hd0 : RDATA <= 32'he7fee7fe; // 0x0340
+     8'hd1 : RDATA <= 32'he7fee7fe; // 0x0344
+     8'hd2 : RDATA <= 32'h49054804; // 0x0348
+     8'hd3 : RDATA <= 32'h4b064a05; // 0x034c
+     8'hd4 : RDATA <= 32'h00004770; // 0x0350
+     8'hd5 : RDATA <= 32'h10000325; // 0x0354
+     8'hd6 : RDATA <= 32'h100000c1; // 0x0358
+     8'hd7 : RDATA <= 32'h30000068; // 0x035c
+     8'hd8 : RDATA <= 32'h30000368; // 0x0360
+     8'hd9 : RDATA <= 32'h30000168; // 0x0364
+     8'hda : RDATA <= 32'h30000168; // 0x0368
+     8'hdb : RDATA <= 32'h47704770; // 0x036c
+     8'hdc : RDATA <= 32'h46754770; // 0x0370
+     8'hdd : RDATA <= 32'hf824f000; // 0x0374
+     8'hde : RDATA <= 32'h000546ae; // 0x0378
+     8'hdf : RDATA <= 32'h46534669; // 0x037c
+     8'he0 : RDATA <= 32'h00c008c0; // 0x0380
+     8'he1 : RDATA <= 32'hb0184685; // 0x0384
+     8'he2 : RDATA <= 32'hf7ffb520; // 0x0388
+     8'he3 : RDATA <= 32'hbc60ffdd; // 0x038c
+     8'he4 : RDATA <= 32'h08492700; // 0x0390
+     8'he5 : RDATA <= 32'h260046b6; // 0x0394
+     8'he6 : RDATA <= 32'hc5c0c5c0; // 0x0398
+     8'he7 : RDATA <= 32'hc5c0c5c0; // 0x039c
+     8'he8 : RDATA <= 32'hc5c0c5c0; // 0x03a0
+     8'he9 : RDATA <= 32'hc5c0c5c0; // 0x03a4
+     8'hea : RDATA <= 32'h00493d40; // 0x03a8
+     8'heb : RDATA <= 32'h4770468d; // 0x03ac
+     8'hec : RDATA <= 32'h4604b510; // 0x03b0
+     8'hed : RDATA <= 32'h46c046c0; // 0x03b4
+     8'hee : RDATA <= 32'hf7ff4620; // 0x03b8
+     8'hef : RDATA <= 32'hbd10fecc; // 0x03bc
+     8'hf0 : RDATA <= 32'h47704800; // 0x03c0
+     8'hf1 : RDATA <= 32'h30000004; // 0x03c4
+     8'hf2 : RDATA <= 32'h20184901; // 0x03c8
+     8'hf3 : RDATA <= 32'he7febeab; // 0x03cc
+     8'hf4 : RDATA <= 32'h00020026; // 0x03d0
+     8'hf5 : RDATA <= 32'h00004770; // 0x03d4
+     8'hf6 : RDATA <= 32'h100003f8; // 0x03d8
+     8'hf7 : RDATA <= 32'h30000000; // 0x03dc
+     8'hf8 : RDATA <= 32'h00000004; // 0x03e0
+     8'hf9 : RDATA <= 32'h10000104; // 0x03e4
+     8'hfa : RDATA <= 32'h100003fc; // 0x03e8
+     8'hfb : RDATA <= 32'h30000004; // 0x03ec
+     8'hfc : RDATA <= 32'h00000364; // 0x03f0
+     8'hfd : RDATA <= 32'h10000120; // 0x03f4
+     8'hfe : RDATA <= 32'h05f5e100; // 0x03f8
+     8'hff : RDATA <= 32'h00000000; // 0x03fc
+    default : RDATA <=32'h0;
+  endcase
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ahb_cs_rom_table.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ahb_cs_rom_table.v
new file mode 100644
index 0000000..505b097
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ahb_cs_rom_table.v
@@ -0,0 +1,272 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2011-11-03 16:07:17 +0000 (Thu, 03 Nov 2011) $
+//
+//      Revision            : $Revision: 190657 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+//     This block implements a Generic 4-entry AHB CoreSight ROM Table
+//-----------------------------------------------------------------------------
+//
+// This example block occupies an 4kB space on the AHB bus at the address
+// specified by the BASE[31:0] parameter.
+//
+//  BASE[31:0] + 0x1000 +--------------------------------------+
+//                      | CID: CoreSight ROM Table             |
+//                      |--------------------------------------|
+//                      | PID: Manufacturer and Partnumber     |
+//                      |--------------------------------------|
+//                      .                                      .
+//                      .                                      .
+//                      .                                      .
+//                      |--------------------------------------|
+//                      | Fourth Entry                         |
+//  BASE[31:0] + 0xC    |--------------------------------------|
+//                      | Third Entry                          |
+//  BASE[31:0] + 0x8    |--------------------------------------|
+//                      | Second Entry                         |
+//  BASE[31:0] + 0x4    |--------------------------------------|
+//                      | First Entry                          |
+//  BASE[31:0]          +--------------------------------------+
+//
+//
+// The ROM table allows debug tools to identify the CoreSight components in
+// a SoC or subsystem, and to identify the manufacturer and part and revision
+// information for the SoC or subsystem.
+// The PID fields include the manufacturer's JEDEC JEP106 identity code and
+// manufacturer-defined partnumber and revision values.
+//
+// Considerations:
+//
+// To allow debug tools to discover the ROM table, it must be pointed to by
+// another ROM table in the system, or by the BASEADDR pointer in the DAP.
+//
+// The ROM table contents must contain correct ID values. To allow for late
+// changes (e.g. metal fixes) to be identified from the ID values, the
+// ECOREVNUM bus should be easily identifiable and modifiable.
+//-----------------------------------------------------------------------------
+
+module cmsdk_ahb_cs_rom_table
+  #(
+    // ------------------------------------------------------------
+    // ROM Table BASE Address
+    // ------------------------------------------------------------
+    parameter [31:0]   BASE = 32'h00000000,
+
+    // ------------------------------------------------------------
+    // ROM Table Manufacturer, Part Number and Revision
+    // ------------------------------------------------------------
+    parameter [6:0]    JEPID           = 7'b0000000, // JEP106 identity code
+    parameter [3:0]    JEPCONTINUATION = 4'h0,       // number of JEP106
+                                                     // continuation codes
+    parameter [11:0]   PARTNUMBER      = 12'h000,    // part number
+    parameter [3:0]    REVISION        = 4'h0,       // part revision
+
+    // ------------------------------------------------------------
+    // ROM Table entries: (Base Address | Present)
+    // ------------------------------------------------------------
+    parameter [31:0]   ENTRY0BASEADDR = 32'h00000000,
+    parameter          ENTRY0PRESENT  = 1'b0,
+
+    parameter [31:0]   ENTRY1BASEADDR = 32'h00000000,
+    parameter          ENTRY1PRESENT  = 1'b0,
+
+    parameter [31:0]   ENTRY2BASEADDR = 32'h00000000,
+    parameter          ENTRY2PRESENT  = 1'b0,
+
+    parameter [31:0]   ENTRY3BASEADDR = 32'h00000000,
+    parameter          ENTRY3PRESENT  = 1'b0
+    )
+   (
+    input wire         HCLK,                 // AHB clock
+    input wire         HSEL,                 // AHB select
+    input wire  [31:0] HADDR,                // AHB address
+    input wire  [ 2:0] HBURST,               // AHB burst
+    input wire         HMASTLOCK,            // AHB lock
+    input wire  [ 3:0] HPROT,                // AHB prot
+    input wire  [ 2:0] HSIZE,                // AHB size
+    input wire  [ 1:0] HTRANS,               // AHB transfer
+    input wire  [31:0] HWDATA,               // AHB write data
+    input wire         HWRITE,               // AHB write
+    input wire         HREADY,               // AHB ready
+    input wire  [ 3:0] ECOREVNUM,            // part minor revision (metal fix)
+    output wire [31:0] HRDATA,               // AHB read-data
+    output wire        HRESP,                // AHB response
+    output wire        HREADYOUT);           // AHB ready out
+
+   // ------------------------------------------------------------
+   // Local wires
+   // ------------------------------------------------------------
+   reg  [ 9:0] haddr_reg;
+   wire [31:0] rdata;
+
+
+   // ------------------------------------------------------------
+   // ROM Tables
+   // ------------------------------------------------------------
+
+   //
+   // ROM Table Entry Calculation:
+   //
+   // Ref: ARM IHI0029B CoreSight Architecture Specification
+   //
+   // ROM table entry format:
+   // [31:12] Address Offset. Base address of highest 4KB block relative to ROM
+   //         table address.
+   // [11: 2] RESERVED, RAZ
+   //     [1] Format. 1=32-bit format
+   //     [0] Entry Present.
+   //
+   // ComponentAddress = ROMAddress + (AddressOffset SHL 12)
+   //
+
+   // Calculate address offset values
+   localparam [19:0] ENTRY0OFFSET = ENTRY0BASEADDR[31:12] - BASE[31:12];
+   localparam [19:0] ENTRY1OFFSET = ENTRY1BASEADDR[31:12] - BASE[31:12];
+   localparam [19:0] ENTRY2OFFSET = ENTRY2BASEADDR[31:12] - BASE[31:12];
+   localparam [19:0] ENTRY3OFFSET = ENTRY3BASEADDR[31:12] - BASE[31:12];
+
+   // Construct entries
+   localparam [31:0] ENTRY0 = { ENTRY0OFFSET, 10'b0, 1'b1, ENTRY0PRESENT!=0 };
+   localparam [31:0] ENTRY1 = { ENTRY1OFFSET, 10'b0, 1'b1, ENTRY1PRESENT!=0 };
+   localparam [31:0] ENTRY2 = { ENTRY2OFFSET, 10'b0, 1'b1, ENTRY2PRESENT!=0 };
+   localparam [31:0] ENTRY3 = { ENTRY3OFFSET, 10'b0, 1'b1, ENTRY3PRESENT!=0 };
+
+
+   // ------------------------------------------------------------
+   // AHB Interface
+   // ------------------------------------------------------------
+   wire       trans_valid = HSEL & HTRANS[1] & HREADY;
+
+   always @(posedge HCLK)
+     if (trans_valid)
+       haddr_reg[9:0] <= HADDR[11:2];
+
+   assign     HREADYOUT = 1'b1;
+   assign     HRDATA    = rdata;
+   assign     HRESP     = 1'b0;
+
+   wire [11:0] word_addr = {haddr_reg, 2'b00};
+
+   // Make unused AHB-Lite signals obvious for Lint purposes
+   wire [66:0] unused = { HADDR[31:12], HADDR[1:0], HBURST[2:0], HMASTLOCK,
+                          HPROT[3:0], HSIZE[2:0], HTRANS[0], HWDATA[31:0],
+                          HWRITE };
+
+
+   // ------------------------------------------------------------
+   // ROM Table Content
+   // ------------------------------------------------------------
+
+   wire       cid3_en         = (word_addr[11:0] == 12'hFFC);
+   wire       cid2_en         = (word_addr[11:0] == 12'hFF8);
+   wire       cid1_en         = (word_addr[11:0] == 12'hFF4);
+   wire       cid0_en         = (word_addr[11:0] == 12'hFF0);
+
+   wire       pid7_en         = (word_addr[11:0] == 12'hFDC);
+   wire       pid6_en         = (word_addr[11:0] == 12'hFD8);
+   wire       pid5_en         = (word_addr[11:0] == 12'hFD4);
+   wire       pid4_en         = (word_addr[11:0] == 12'hFD0);
+   wire       pid3_en         = (word_addr[11:0] == 12'hFEC);
+   wire       pid2_en         = (word_addr[11:0] == 12'hFE8);
+   wire       pid1_en         = (word_addr[11:0] == 12'hFE4);
+   wire       pid0_en         = (word_addr[11:0] == 12'hFE0);
+
+   wire       systemaccess_en = (word_addr[11:0] == 12'hFCC);
+
+   wire       entry0_en       = (word_addr[11:0] == 12'h000);
+   wire       entry1_en       = (word_addr[11:0] == 12'h004);
+   wire       entry2_en       = (word_addr[11:0] == 12'h008);
+   wire       entry3_en       = (word_addr[11:0] == 12'h00C);
+
+   wire [7:0] ids =
+              ( ( {8{cid3_en}} & 8'hB1 ) | // CID3 : Rom Table
+                ( {8{cid2_en}} & 8'h05 ) | // CID2 : Rom Table
+                ( {8{cid1_en}} & 8'h10 ) | // CID1 : Rom Table
+                ( {8{cid0_en}} & 8'h0D ) | // CID0 : Rom Table
+
+                ( {8{pid7_en}} & 8'h00 ) | // PID7 : RESERVED
+                ( {8{pid6_en}} & 8'h00 ) | // PID6 : RESERVED
+                ( {8{pid5_en}} & 8'h00 ) | // PID5 : RESERVED
+                ( {8{pid4_en}} & { {4{1'b0}}, JEPCONTINUATION[3:0] } ) |
+                ( {8{pid3_en}} & { ECOREVNUM[3:0], {4{1'b0}} } ) |
+                ( {8{pid2_en}} & { REVISION[3:0], 1'b1, JEPID[6:4] } ) |
+                ( {8{pid1_en}} & { JEPID[3:0], PARTNUMBER[11:8] } ) |
+                ( {8{pid0_en}} &   PARTNUMBER[7:0] )
+                );
+
+   //
+   // Assign Read Data. Default value of 32'h00000000
+   // corresponds to the End Of Table marker.
+   //
+   assign     rdata[31:0] =
+              ( ( {{24{1'b0}}, ids[7:0] } )              |
+                ( {32{systemaccess_en}} & 32'h00000001 ) |
+                // Pointers to CoreSight Components
+                ( {32{entry0_en}} & ENTRY0[31:0] )       |
+                ( {32{entry1_en}} & ENTRY1[31:0] )       |
+                ( {32{entry2_en}} & ENTRY2[31:0] )       |
+                ( {32{entry3_en}} & ENTRY3[31:0] )
+                );
+
+   // -------------------------------------------------------------------------
+
+`ifdef ARM_ASSERT_ON
+
+   // -------------------------------------------------------------------------
+   // Assertions
+   // -------------------------------------------------------------------------
+
+   `include "std_ovl_defines.h"
+
+
+   // Addresses must always be 4KB aligned
+   assert_never
+     #(`OVL_FATAL,`OVL_ASSERT,"Rom Table BASE must be 4K aligned")
+   u_asrt_rom_table_base_alignment
+     (.clk(HCLK), .reset_n(1'b1), .test_expr(|BASE[11:0]));
+
+   // Addresses must always be 4KB aligned
+   assert_never
+     #(`OVL_FATAL,`OVL_ASSERT,"Rom Table ENTRY0BASEADDR must be 4K aligned")
+   u_asrt_rom_table_entry0_alignment
+     (.clk(HCLK), .reset_n(1'b1), .test_expr(|ENTRY0BASEADDR[11:0]));
+
+   // Addresses must always be 4KB aligned
+   assert_never
+     #(`OVL_FATAL,`OVL_ASSERT,"Rom Table ENTRY1BASEADDR must be 4K aligned")
+   u_asrt_rom_table_entry1_alignment
+     (.clk(HCLK), .reset_n(1'b1), .test_expr(|ENTRY1BASEADDR[11:0]));
+
+   // Addresses must always be 4KB aligned
+   assert_never
+     #(`OVL_FATAL,`OVL_ASSERT,"Rom Table ENTRY2BASEADDR must be 4K aligned")
+   u_asrt_rom_table_entry2_alignment
+     (.clk(HCLK), .reset_n(1'b1), .test_expr(|ENTRY2BASEADDR[11:0]));
+
+   // Addresses must always be 4KB aligned
+   assert_never
+     #(`OVL_FATAL,`OVL_ASSERT,"Rom Table ENTRY3BASEADDR must be 4K aligned")
+   u_asrt_rom_table_entry3_alignment
+     (.clk(HCLK), .reset_n(1'b1), .test_expr(|ENTRY3BASEADDR[11:0]));
+
+`endif
+
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_apb_usrt.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_apb_usrt.v
new file mode 100644
index 0000000..f695ecc
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_apb_usrt.v
@@ -0,0 +1,1159 @@
+//-----------------------------------------------------------------------------
+// customised top-level example Cortex-M0 controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-2, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2011 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Simple APB UART
+//-----------------------------------------------------------------------------
+//-------------------------------------
+// Programmer's model
+// 0x00 R     RXD[7:0]    Received Data
+//      W     TXD[7:0]    Transmit data
+// 0x04 RW    STAT[3:0]
+//              [3] RX buffer overrun (write 1 to clear)
+//              [2] TX buffer overrun (write 1 to clear)
+//              [1] RX buffer full (Read only)
+//              [0] TX buffer full (Read only)
+// 0x08 RW    CTRL[3:0]   TxIntEn, RxIntEn, TxEn, RxEn
+//              [6] High speed test mode Enable
+//              [5] RX overrun interrupt enable
+//              [4] TX overrun interrupt enable
+//              [3] RX Interrupt Enable
+//              [2] TX Interrupt Enable
+//              [1] RX Enable
+//              [0] TX Enable
+// 0x0C R/Wc  intr_status/INTCLEAR
+//              [3] RX overrun interrupt
+//              [2] TX overrun interrupt
+//              [1] RX interrupt
+//              [0] TX interrupt
+// 0x10 RW    BAUDDIV[19:0] Baud divider
+//            (minimum value is 16)
+// 0x3E0 - 0x3FC  ID registers
+//-------------------------------------
+
+module cmsdk_apb_usrt (
+// --------------------------------------------------------------------------
+// Port Definitions
+// --------------------------------------------------------------------------
+  input  wire        PCLK,     // Clock
+  input  wire        PCLKG,    // Gated Clock
+  input  wire        PRESETn,  // Reset
+
+  input  wire        PSEL,     // Device select
+  input  wire [11:2] PADDR,    // Address
+  input  wire        PENABLE,  // Transfer control
+  input  wire        PWRITE,   // Write control
+  input  wire [31:0] PWDATA,   // Write data
+
+  input  wire [3:0]  ECOREVNUM,// Engineering-change-order revision bits
+
+  output wire [31:0] PRDATA,   // Read data
+  output wire        PREADY,   // Device ready
+  output wire        PSLVERR,  // Device error response
+
+  output wire        TX_VALID_o,
+  output wire [7:0]  TX_DATA8_o,
+  input  wire        TX_READY_i,
+
+  input  wire        RX_VALID_i,
+  input  wire [7:0]  RX_DATA8_i,
+  output wire        RX_READY_o,
+
+  output wire        TXINT,    // Transmit Interrupt
+  output wire        RXINT,    // Receive Interrupt
+  output wire        TXOVRINT, // Transmit overrun Interrupt
+  output wire        RXOVRINT, // Receive overrun Interrupt
+  output wire        UARTINT); // Combined interrupt
+
+// Local ID parameters, APB UART part number is 0x821
+localparam  ARM_CMSDK_APB_UART_PID4 = 8'h04;
+localparam  ARM_CMSDK_APB_UART_PID5 = 8'h00;
+localparam  ARM_CMSDK_APB_UART_PID6 = 8'h00;
+localparam  ARM_CMSDK_APB_UART_PID7 = 8'h00;
+localparam  ARM_CMSDK_APB_UART_PID0 = 8'h21;
+localparam  ARM_CMSDK_APB_UART_PID1 = 8'hB8;
+localparam  ARM_CMSDK_APB_UART_PID2 = 8'h1B;
+localparam  ARM_CMSDK_APB_UART_PID3 = 4'h0;
+localparam  ARM_CMSDK_APB_UART_CID0 = 8'h0D;
+localparam  ARM_CMSDK_APB_UART_CID1 = 8'hF0;
+localparam  ARM_CMSDK_APB_UART_CID2 = 8'h05;
+localparam  ARM_CMSDK_APB_UART_CID3 = 8'hB1;
+
+// original external IOs
+wire        RXD = 1'b1; // Serial input
+wire        TXD;      // Transmit data output
+wire        TXEN;     // Transmit enabled
+wire        BAUDTICK; // Baud rate (x16) Tick
+  
+
+  // --------------------------------------------------------------------------
+  // Internal wires
+  // --------------------------------------------------------------------------
+// Signals for read/write controls
+wire          read_enable;
+wire          write_enable;
+wire          write_enable00; // Write enable for data register
+wire          write_enable04; // Write enable for Status register
+wire          write_enable08; // Write enable for control register
+wire          write_enable0c; // Write enable for interrupt status register
+wire          write_enable10; // Write enable for Baud rate divider
+reg     [7:0] read_mux_byte0; // Read data multiplexer for lower 8-bit
+reg     [7:0] read_mux_byte0_reg; // Register read data for lower 8-bit
+wire   [31:0] read_mux_word;  // Read data multiplexer for whole 32-bit
+wire    [3:0] pid3_value;     // constant value for lower 4-bit in perpherial ID3
+
+// Signals for Control registers
+reg     [6:0] reg_ctrl;       // Control register
+reg     [7:0] reg_tx_buf;     // Transmit data buffer
+reg     [7:0] reg_rx_buf;     // Receive data buffer
+reg    [19:0] reg_baud_div;   // Baud rate setting
+
+// Internal signals
+  // Baud rate divider
+reg    [15:0] reg_baud_cntr_i; // baud rate divider counter i (integer)
+wire   [15:0] nxt_baud_cntr_i;
+reg     [3:0] reg_baud_cntr_f; // baud rate divider counter f (fraction)
+wire    [3:0] nxt_baud_cntr_f;
+wire    [3:0] mapped_cntr_f;   // remapped counter f value
+reg           reg_baud_tick;   // Register baud rate tick (16 times of baud rate)
+reg           baud_updated;    // baud rate value has bee updated from APB
+wire          reload_i;        // baud rate divider counter i reload
+wire          reload_f;        // baud rate divider counter f reload
+wire          baud_div_en;     // enable baud rate counter
+
+  // Status
+wire    [3:0] uart_status;     // UART status
+reg           reg_rx_overrun;  // Receive overrun status register
+wire          rx_overrun;      // Receive overrun detection
+reg           reg_tx_overrun;  // Transmit overrun status register
+wire          tx_overrun;      // Transmit overrun detection
+wire          nxt_rx_overrun;  // next state for reg_rx_overrun
+wire          nxt_tx_overrun;  // next state for reg_tx_overrun
+  // Interrupts
+reg           reg_txintr;      // Transmit interrupt register
+reg           reg_rxintr;      // Receive interrupt register
+wire          tx_overflow_intr;// Transmit overrun/overflow interrupt
+wire          rx_overflow_intr;// Receive overrun/overflow interrupt
+wire    [3:0] intr_state;      // UART interrupt status
+wire    [1:0] intr_stat_set;   // Set TX/RX interrupt
+wire    [1:0] intr_stat_clear; // Clear TX/RX interrupt
+
+  // transmit
+reg     [3:0] tx_state;    // Transmit FSM state
+reg     [4:0] nxt_tx_state;
+wire          tx_state_update;
+wire          tx_state_inc; // Bit pulse
+reg     [3:0] tx_tick_cnt;  // Transmit Tick counter
+wire    [4:0] nxt_tx_tick_cnt;
+reg     [7:0] tx_shift_buf;      // Transmit shift register
+wire    [7:0] nxt_tx_shift_buf;  // next state    for tx_shift_buf
+wire          tx_buf_ctrl_shift; // shift control for tx_shift_buf
+wire          tx_buf_ctrl_load;  // load  control for tx_shift_buf
+reg           tx_buf_full;  // TX Buffer full
+reg           reg_txd;      // Tx Data
+wire          nxt_txd;      // next state of reg_txd
+wire          update_reg_txd; // update reg_txd
+wire          tx_buf_clear; // Clear buffer full status when data is load into TX shift register
+
+  // Receive data sync and filter
+reg           rxd_sync_1;  // Double flip-flop syncrhoniser
+reg           rxd_sync_2;  // Double flip-flop syncrhoniser
+reg     [2:0] rxd_lpf;     // Averaging Low Pass Filter
+wire    [2:0] nxt_rxd_lpf;
+wire          rx_shift_in; // Shift Register Input
+
+  // Receiver
+reg     [3:0] rx_state;   // Receiver FSM state
+reg     [4:0] nxt_rx_state;
+wire          rx_state_update;
+reg     [3:0] rx_tick_cnt; // Receiver Tick counter
+wire    [4:0] nxt_rx_tick_cnt;
+wire          update_rx_tick_cnt;
+wire          rx_state_inc;// Bit pulse
+reg     [6:0] rx_shift_buf;// Receiver shift data register
+wire    [6:0] nxt_rx_shift_buf;
+reg           rx_buf_full;  // Receive buffer full status
+wire          nxt_rx_buf_full;
+wire          rxbuf_sample; // Sample received data into receive data buffer
+wire          rx_data_read; // Receive data buffer read by APB interface
+wire    [7:0] nxt_rx_buf;
+
+// Start of main code
+// Read and write control signals
+assign  read_enable  = PSEL & (~PWRITE); // assert for whole APB read transfer
+assign  write_enable = PSEL & (~PENABLE) & PWRITE; // assert for 1st cycle of write transfer
+assign  write_enable00 = write_enable & (PADDR[11:2] == 10'h000);
+assign  write_enable04 = write_enable & (PADDR[11:2] == 10'h001);
+assign  write_enable08 = write_enable & (PADDR[11:2] == 10'h002);
+assign  write_enable0c = write_enable & (PADDR[11:2] == 10'h003);
+assign  write_enable10 = write_enable & (PADDR[11:2] == 10'h004);
+
+// Write operations
+  // Transmit data register
+  always @(posedge PCLKG or negedge PRESETn)
+  begin
+    if (~PRESETn)
+        reg_tx_buf <= {8{1'b0}};
+    else if (write_enable00)
+      reg_tx_buf <= PWDATA[7:0];
+  end
+
+  assign TX_DATA8_o = reg_tx_buf[7:0];
+  
+  // Status register overrun registers
+  assign nxt_rx_overrun = (reg_rx_overrun & (~((write_enable04|write_enable0c) & PWDATA[3]))) | rx_overrun;
+  assign nxt_tx_overrun = (reg_tx_overrun & (~((write_enable04|write_enable0c) & PWDATA[2]))) | tx_overrun;
+
+  // RX OverRun status
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      reg_rx_overrun <= 1'b0;
+    else if (rx_overrun | write_enable04 | write_enable0c)
+      reg_rx_overrun <= nxt_rx_overrun;
+  end
+
+  // TX OverRun status
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      reg_tx_overrun <= 1'b0;
+    else if (tx_overrun | write_enable04 | write_enable0c)
+      reg_tx_overrun <= nxt_tx_overrun;
+  end
+
+  // Control register
+  always @(posedge PCLKG or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      reg_ctrl <= {7{1'b0}};
+    else if (write_enable08)
+      reg_ctrl <= PWDATA[6:0];
+  end
+
+  // Baud rate divider - integer
+  always @(posedge PCLKG or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      reg_baud_div <= {20{1'b0}};
+    else if (write_enable10)
+      reg_baud_div <= PWDATA[19:0];
+  end
+
+// Read operation
+  assign uart_status = {reg_rx_overrun, reg_tx_overrun, rx_buf_full, tx_buf_full};
+
+  assign pid3_value  = ARM_CMSDK_APB_UART_PID3;
+
+  // First level of read mux
+ always @(PADDR or reg_rx_buf or uart_status or reg_ctrl or intr_state or reg_baud_div
+   or ECOREVNUM or pid3_value)
+  begin
+   if (PADDR[11:5] == 7'h00) begin
+     case (PADDR[4:2])
+     3'h0: read_mux_byte0 =  reg_rx_buf;
+     3'h1: read_mux_byte0 =  {{4{1'b0}},uart_status};
+     3'h2: read_mux_byte0 =  {{1{1'b0}},reg_ctrl};
+     3'h3: read_mux_byte0 =  {{4{1'b0}},intr_state};
+     3'h4: read_mux_byte0 =  reg_baud_div[7:0];
+     3'h5, 3'h6, 3'h7: read_mux_byte0 =   {8{1'b0}};     //default read out value
+     default:  read_mux_byte0 =   {8{1'bx}};// x propogation
+     endcase
+   end
+   else if (PADDR[11:6] == 6'h3F) begin
+     case  (PADDR[5:2])
+       4'h0, 4'h1,4'h2,4'h3: read_mux_byte0 =   {8{1'b0}}; //default read out value
+   // ID register - constant values
+       4'h4: read_mux_byte0 = ARM_CMSDK_APB_UART_PID4; // 0xFD0 : PID 4
+       4'h5: read_mux_byte0 = ARM_CMSDK_APB_UART_PID5; // 0xFD4 : PID 5
+       4'h6: read_mux_byte0 = ARM_CMSDK_APB_UART_PID6; // 0xFD8 : PID 6
+       4'h7: read_mux_byte0 = ARM_CMSDK_APB_UART_PID7; // 0xFDC : PID 7
+       4'h8: read_mux_byte0 = ARM_CMSDK_APB_UART_PID0; // 0xFE0 : PID 0  APB UART part number[7:0]
+       4'h9: read_mux_byte0 = ARM_CMSDK_APB_UART_PID1; // 0xFE0 : PID 1 [7:4] jep106_id_3_0. [3:0] part number [11:8]
+       4'hA: read_mux_byte0 = ARM_CMSDK_APB_UART_PID2; // 0xFE0 : PID 2 [7:4] revision, [3] jedec_used. [2:0] jep106_id_6_4
+       4'hB: read_mux_byte0 = {ECOREVNUM[3:0],pid3_value[3:0]};
+                                                       // 0xFE0 : PID 3 [7:4] ECO revision, [3:0] modification number
+       4'hC: read_mux_byte0 = ARM_CMSDK_APB_UART_CID0; // 0xFF0 : CID 0
+       4'hD: read_mux_byte0 = ARM_CMSDK_APB_UART_CID1; // 0xFF4 : CID 1 PrimeCell class
+       4'hE: read_mux_byte0 = ARM_CMSDK_APB_UART_CID2; // 0xFF8 : CID 2
+       4'hF: read_mux_byte0 = ARM_CMSDK_APB_UART_CID3; // 0xFFC : CID 3
+       default : read_mux_byte0 = {8{1'bx}}; // x propogation
+      endcase
+    end
+    else begin
+       read_mux_byte0 =   {8{1'b0}};     //default read out value
+    end
+  end
+
+
+
+  // Register read data
+  always @(posedge PCLKG or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      read_mux_byte0_reg      <= {8{1'b0}};
+    else if (read_enable)
+      read_mux_byte0_reg      <= read_mux_byte0;
+  end
+
+  // Second level of read mux
+  assign read_mux_word[ 7: 0] = read_mux_byte0_reg;
+  assign read_mux_word[19: 8] = (PADDR[11:2]==10'h004) ? reg_baud_div[19:8] : {12{1'b0}};
+  assign read_mux_word[31:20] = {12{1'b0}};
+
+
+  // Output read data to APB
+  assign PRDATA[31: 0] = (read_enable) ? read_mux_word : {32{1'b0}};
+  assign PREADY  = 1'b1; // Always ready
+  assign PSLVERR = 1'b0; // Always okay
+
+// --------------------------------------------
+// Baud rate generator
+  // Baud rate generator enable
+  assign baud_div_en    = (reg_ctrl[1:0] != 2'b00);
+  assign mapped_cntr_f  = {reg_baud_cntr_f[0],reg_baud_cntr_f[1],
+                           reg_baud_cntr_f[2],reg_baud_cntr_f[3]};
+  // Reload Integer divider
+  // when UART enabled and (reg_baud_cntr_f < reg_baud_div[3:0])
+  // then count to 1, or
+  // when UART enabled then count to 0
+  assign reload_i      = (baud_div_en &
+         (((mapped_cntr_f >= reg_baud_div[3:0]) &
+         (reg_baud_cntr_i[15:1] == {15{1'b0}})) |
+         (reg_baud_cntr_i[15:0] == {16{1'b0}})));
+
+  // Next state for Baud rate divider
+  assign nxt_baud_cntr_i = (baud_updated | reload_i) ? reg_baud_div[19:4] :
+                           (reg_baud_cntr_i - 16'h0001);
+  // Update at reload or decrement
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      reg_baud_cntr_i   <= {16{1'b0}};
+    else if (baud_updated | baud_div_en)
+      reg_baud_cntr_i   <= nxt_baud_cntr_i;
+  end
+
+  // Reload fraction divider
+  assign reload_f      = baud_div_en & (reg_baud_cntr_f==4'h0) &
+                        reload_i;
+  // Next state for fraction part of Baud rate divider
+  assign nxt_baud_cntr_f =
+                        (reload_f|baud_updated) ? 4'hF :
+                        (reg_baud_cntr_f - 4'h1);
+
+  // Update at reload or decrement
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      reg_baud_cntr_f   <= {4{1'b0}};
+    else if (baud_updated | reload_f | reload_i)
+      reg_baud_cntr_f   <= nxt_baud_cntr_f;
+  end
+
+  // Generate control signal to update baud rate counters
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      baud_updated    <= 1'b0;
+    else if (write_enable10 | baud_updated)
+      // Baud rate updated - to load new value to counters
+      baud_updated    <= write_enable10;
+  end
+
+  // Generate Tick signal for external logic
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      reg_baud_tick    <= 1'b0;
+    else if (reload_i | reg_baud_tick)
+      reg_baud_tick    <= reload_i;
+  end
+
+  // Connect to external
+  assign BAUDTICK = reg_baud_tick;
+
+// --------------------------------------------
+// Transmit
+
+  // Buffer full status
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      tx_buf_full     <= 1'b0;
+    else if (write_enable00) // | tx_buf_clear)
+      tx_buf_full     <= write_enable00;
+    else if (tx_buf_full & TX_READY_i) // AXI stream ack
+      tx_buf_full <= 0;
+  end
+
+  assign TX_VALID_o = tx_buf_full;
+
+  // Increment TickCounter
+  assign nxt_tx_tick_cnt = ((tx_state==4'h1) & reg_baud_tick) ? {5{1'b0}} :
+                        tx_tick_cnt + {{3{1'b0}},reg_baud_tick};
+
+  // Registering TickCounter
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      tx_tick_cnt     <= {4{1'b0}};
+    else if (reg_baud_tick)
+      tx_tick_cnt     <= nxt_tx_tick_cnt[3:0];
+  end
+
+  // Increment state (except Idle(0) and Wait for Tick(1))
+  assign tx_state_inc   = (((&tx_tick_cnt)|(tx_state==4'h1)) & reg_baud_tick)|reg_ctrl[6];
+          // state increment every cycle of high speed test mode is enabled
+  // Clear buffer full status when data is load into shift register
+  assign tx_buf_clear   = ((tx_state==4'h0) & tx_buf_full) |
+                        ((tx_state==4'hB) & tx_buf_full & tx_state_inc);
+
+  // tx_state machine
+  // 0 = Idle, 1 =  Wait for Tick,
+  // 2 = Start bit, 3 = D0 .... 10 = D7
+  // 11 = Stop bit
+  always @(tx_state or tx_buf_full or tx_state_inc or reg_ctrl)
+  begin
+  case (tx_state)
+    0: begin
+       nxt_tx_state = (tx_buf_full & reg_ctrl[0]) ? 5'h01 : 5'h00;  // New data is written to buffer
+       end
+    1,                         // State 1   : Wait for next Tick
+    2,3,4,5,6,7,8,9,10: begin  // State 2-10: Start bit, D0 - D7
+       nxt_tx_state = tx_state + {3'b000,tx_state_inc};
+       end
+    11: begin // Stop bit , goto next start bit or Idle
+       nxt_tx_state = (tx_state_inc) ? ( tx_buf_full ? 5'h02:5'h00) : {1'b0, tx_state};
+       end
+    default:
+       nxt_tx_state = {5{1'bx}};
+  endcase
+  end
+
+  assign tx_state_update = tx_state_inc | ((tx_state==4'h0) & tx_buf_full & reg_ctrl[0]) | (tx_state>4'd11);
+
+  // Registering outputs
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      tx_state        <= {4{1'b0}};
+    else if (tx_state_update)
+      tx_state        <= nxt_tx_state[3:0];
+  end
+
+  // Load/shift TX register
+  assign tx_buf_ctrl_load  = (((tx_state==4'h0) & tx_buf_full) |
+                              ((tx_state==4'hB) & tx_buf_full & tx_state_inc));
+  assign tx_buf_ctrl_shift =  ((tx_state>4'h2) & tx_state_inc);
+
+  assign nxt_tx_shift_buf = tx_buf_ctrl_load ? reg_tx_buf[7:0] : {1'b1,tx_shift_buf[7:1]};
+
+  // Registering TX shift register
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      tx_shift_buf    <= {8{1'b0}};
+    else if (tx_buf_ctrl_shift | tx_buf_ctrl_load)
+      tx_shift_buf    <= nxt_tx_shift_buf;
+  end
+
+  // Data output
+  assign nxt_txd = (tx_state==4'h2) ? 1'b0 :
+                   (tx_state>4'h2) ? tx_shift_buf[0] : 1'b1;
+
+  assign update_reg_txd = (nxt_txd != reg_txd);
+
+  // Registering outputs
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      reg_txd         <= 1'b1;
+    else if (update_reg_txd)
+      reg_txd         <= nxt_txd;
+  end
+
+  // Generate TX overrun error status
+  assign tx_overrun = tx_buf_full & (~tx_buf_clear) & write_enable00;
+
+  // Connect to external
+  assign TXD  = reg_txd;
+  assign TXEN = reg_ctrl[0];
+
+// --------------------------------------------
+// Receive synchronizer and low pass filter
+
+  // Doubling Flip-flop synxt_rx_tick_cntnchroniser
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      begin
+      rxd_sync_1 <= 1'b1;
+      rxd_sync_2 <= 1'b1;
+      end
+    else if (reg_ctrl[1]) // Turn off synchronizer if receive is not enabled
+      begin
+      rxd_sync_1 <= RXD;
+      rxd_sync_2 <= rxd_sync_1;
+      end
+  end
+
+  // Averaging low pass filter
+  assign nxt_rxd_lpf = {rxd_lpf[1:0], rxd_sync_2};
+  // Registering stage for low pass filter
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      rxd_lpf <= 3'b111;
+    else if (reg_baud_tick)
+      rxd_lpf <= nxt_rxd_lpf;
+  end
+
+  // Averaging values
+  assign rx_shift_in = (rxd_lpf[1] & rxd_lpf[0]) |
+                       (rxd_lpf[1] & rxd_lpf[2]) |
+                       (rxd_lpf[0] & rxd_lpf[2]);
+
+// --------------------------------------------
+// Receive
+
+  // Increment TickCounter
+  assign nxt_rx_tick_cnt = ((rx_state==4'h0) & (~rx_shift_in)) ? 5'h08 :
+                        rx_tick_cnt + {{3{1'b0}},reg_baud_tick};
+
+  assign update_rx_tick_cnt = ((rx_state==4'h0) & (~rx_shift_in)) | reg_baud_tick;
+
+  // Registering other register
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      rx_tick_cnt    <= {4{1'b0}};
+    else if (update_rx_tick_cnt)
+      rx_tick_cnt    <= nxt_rx_tick_cnt[3:0];
+  end
+
+  // Increment state
+  assign rx_state_inc   = ((&rx_tick_cnt) & reg_baud_tick);
+  // Buffer full status
+  assign nxt_rx_buf_full = rxbuf_sample | (rx_buf_full & (~rx_data_read));
+
+  // Sample shift register when D7 is sampled
+///  assign rxbuf_sample  = ((rx_state==4'h9) & rx_state_inc);
+  assign rxbuf_sample  = RX_VALID_i & !rx_buf_full;
+
+  // Reading receive buffer (Set at 1st cycle of APB transfer
+  // because read mux is registered before output)
+  assign rx_data_read   = (PSEL & (~PENABLE) & (PADDR[11:2]==10'h000) & (~PWRITE));
+  // Generate RX overrun error status
+  assign rx_overrun = rx_buf_full & rxbuf_sample & (~rx_data_read);
+
+  // rx_state machine
+  // 0 = Idle, 1 =  Start of Start bit detected
+  // 2 = Sample Start bit, 3 = D0 .... 10 = D7
+  // 11 = Stop bit
+  // 11, 12, 13, 14, 15: illegal/unused states
+  always @(rx_state or rx_shift_in or rx_state_inc or reg_ctrl)
+  begin
+  case (rx_state)
+    0: begin
+       nxt_rx_state = ((~rx_shift_in) & reg_ctrl[1]) ? 5'h01 : 5'h00;  // Wait for Start bit
+       end
+    1,                      // State 1  : Wait for middle of start bit
+    2,3,4,5,6,7,8,9: begin  // State 2-9: D0 - D7
+       nxt_rx_state = rx_state + {3'b000,rx_state_inc};
+       end
+    10: begin // Stop bit , goto back to Idle
+       nxt_rx_state = (rx_state_inc) ? 5'h00 : 5'h0A;
+       end
+    default:
+       nxt_rx_state = {5{1'bx}};
+  endcase
+  end
+
+  assign rx_state_update = rx_state_inc |  ((~rx_shift_in) & reg_ctrl[1]);
+
+  // Registering rx_state
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      rx_state       <= {4{1'b0}};
+    else if (rx_state_update)
+      rx_state       <= nxt_rx_state[3:0];
+  end
+
+  // Buffer full status
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      rx_buf_full     <= 1'b0;
+    else if (rxbuf_sample | rx_data_read)
+      rx_buf_full     <= nxt_rx_buf_full;
+  end
+
+  // Sample receive buffer
+///  assign nxt_rx_buf     = {rx_shift_in, rx_shift_buf};
+  assign nxt_rx_buf     = RX_DATA8_i[7:0];
+  
+  // Registering receive data buffer
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      reg_rx_buf      <= {8{1'b0}};
+    else if  (rxbuf_sample)
+      reg_rx_buf      <= nxt_rx_buf;
+  end
+
+  // Shift register
+  assign nxt_rx_shift_buf= {rx_shift_in, rx_shift_buf[6:1]};
+  // Registering shift buffer
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      rx_shift_buf    <= {7{1'b0}};
+    else if (rx_state_inc)
+      rx_shift_buf    <= nxt_rx_shift_buf;
+  end
+
+
+
+// --------------------------------------------
+// Interrupts
+  // Set by event
+  assign intr_stat_set[1] = reg_ctrl[3] & rxbuf_sample; // A new receive data is sampled
+  assign intr_stat_set[0] = reg_ctrl[2] & reg_ctrl[0] & tx_buf_full & tx_buf_clear;
+                            // Falling edge of buffer full
+  // Clear by write to IntClear register
+  assign intr_stat_clear[1:0] = {2{write_enable0c}} & PWDATA[1:0];
+
+  // Registering outputs
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      reg_txintr    <= 1'b0;
+    else if (intr_stat_set[0] | intr_stat_clear[0])
+      reg_txintr    <= intr_stat_set[0];
+  end
+
+  always @(posedge PCLK or negedge PRESETn)
+  begin
+    if (~PRESETn)
+      reg_rxintr    <= 1'b0;
+    else if (intr_stat_set[1] | intr_stat_clear[1])
+      reg_rxintr    <= intr_stat_set[1];
+  end
+
+  assign rx_overflow_intr = reg_rx_overrun & reg_ctrl[5];
+  assign tx_overflow_intr = reg_tx_overrun & reg_ctrl[4];
+
+  // Interrupt status for read back
+  assign intr_state = {rx_overflow_intr, tx_overflow_intr, reg_rxintr, reg_txintr};
+
+  // Connect to external
+  assign TXINT    = reg_txintr;
+  assign RXINT    = reg_rxintr;
+  assign TXOVRINT = tx_overflow_intr;
+  assign RXOVRINT = rx_overflow_intr;
+  assign UARTINT  = reg_txintr | reg_rxintr | tx_overflow_intr | rx_overflow_intr;
+
+
+`ifdef ARM_APB_ASSERT_ON
+   // ------------------------------------------------------------
+   // Assertions
+   // ------------------------------------------------------------
+`include "std_ovl_defines.h"
+
+   // Prepare signals for OVL checking
+   reg [15:0] ovl_last_reg_baud_cntr_i;
+   reg  [3:0] ovl_last_reg_baud_cntr_f;
+   reg        ovl_last_baud_div_en;
+   reg        ovl_last_baud_updated;
+   always @(posedge PCLK or negedge PRESETn)
+   begin
+     if (~PRESETn)
+       begin
+       ovl_last_reg_baud_cntr_i <= {16{1'b0}};
+       ovl_last_reg_baud_cntr_f <= {4{1'b0}};
+       ovl_last_baud_div_en     <= 1'b0;
+       ovl_last_baud_updated    <= 1'b0;
+       end
+     else
+       begin
+       ovl_last_reg_baud_cntr_i <= reg_baud_cntr_i;
+       ovl_last_reg_baud_cntr_f <= reg_baud_cntr_f;
+       ovl_last_baud_div_en     <= baud_div_en;
+       ovl_last_baud_updated    <= baud_updated;
+       end
+   end
+
+   reg        ovl_reg_hs_test_mode_triggered; // Indicate if HighSpeed testmode has been activated
+   wire       ovl_nxt_hs_test_mode_triggered;
+   reg  [7:0] ovl_reg_tx_tick_count;  // For measuring width of TX state
+   wire [7:0] ovl_nxt_tx_tick_count;
+   reg  [7:0] ovl_reg_rx_tick_count;  // For measuring width of RX state
+   wire [7:0] ovl_nxt_rx_tick_count;
+   reg  [3:0] ovl_reg_last_tx_state;  // last state
+   reg  [3:0] ovl_reg_last_rx_state;
+   reg  [6:0] ovl_last_reg_ctrl;
+
+   // Clear test mode indicator each time state is changed, set to 1 if high speed test mode is
+   // enabled
+   assign ovl_nxt_hs_test_mode_triggered =
+     (tx_state!=ovl_reg_last_tx_state) ? reg_ctrl[6]: (reg_ctrl[6] | ovl_reg_hs_test_mode_triggered);
+
+   // Counter clear at each state change, increasement at each reg_baud_tick
+   assign ovl_nxt_tx_tick_count = (tx_state!=ovl_reg_last_tx_state) ? (8'h00) :
+     (ovl_reg_tx_tick_count + {{7{1'b0}}, reg_baud_tick});
+
+   // Counter clear at each state change, increasement at each reg_baud_tick
+   assign ovl_nxt_rx_tick_count = (rx_state!=ovl_reg_last_rx_state) ? (8'h00) :
+     (ovl_reg_rx_tick_count + {{7{1'b0}}, reg_baud_tick});
+
+   always@(posedge PCLK or negedge PRESETn)
+     begin
+     if (~PRESETn)
+       begin
+       ovl_reg_hs_test_mode_triggered <= 1'b0;
+       ovl_reg_last_tx_state          <= 4'h0;
+       ovl_reg_last_rx_state          <= 4'h0;
+       ovl_reg_tx_tick_count          <= 8'h00;
+       ovl_reg_rx_tick_count          <= 8'h00;
+       ovl_last_reg_ctrl              <= 7'h00;
+       end
+     else
+       begin
+       ovl_reg_hs_test_mode_triggered <= ovl_nxt_hs_test_mode_triggered;
+       ovl_reg_last_tx_state          <= tx_state;
+       ovl_reg_last_rx_state          <= rx_state;
+       ovl_reg_tx_tick_count          <= ovl_nxt_tx_tick_count;
+       ovl_reg_rx_tick_count          <= ovl_nxt_rx_tick_count;
+       ovl_last_reg_ctrl              <= reg_ctrl;
+       end
+     end
+
+   // Signals for checking clearing of interrupts
+   reg          ovl_last_txint;
+   reg          ovl_last_rxint;
+   reg          ovl_last_psel;
+   reg          ovl_last_penable;
+   reg          ovl_last_pwrite;
+   reg  [31:0]  ovl_last_pwdata;
+   reg  [11:2]  ovl_last_paddr;
+   reg          ovl_last_rx_buf_full;
+   reg          ovl_last_tx_shift_buf_0;
+
+
+   always@(posedge PCLK or negedge PRESETn)
+     begin
+     if (~PRESETn)
+       begin
+       ovl_last_txint   <= 1'b0;
+       ovl_last_rxint   <= 1'b0;
+       ovl_last_psel    <= 1'b0;
+       ovl_last_penable <= 1'b0;
+       ovl_last_pwrite  <= 1'b0;
+       ovl_last_paddr   <= {10{1'b0}};
+       ovl_last_pwdata  <= {32{1'b0}};
+       ovl_last_rx_buf_full  <= 1'b0;
+       ovl_last_tx_shift_buf_0 <= 1'b0;
+       end
+     else
+       begin
+       ovl_last_txint   <= TXINT;
+       ovl_last_rxint   <= RXINT;
+       ovl_last_psel    <= PSEL;
+       ovl_last_penable <= PENABLE;
+       ovl_last_pwrite  <= PWRITE;
+       ovl_last_paddr   <= PADDR;
+       ovl_last_pwdata  <= PWDATA;
+       ovl_last_rx_buf_full  <= rx_buf_full;
+       ovl_last_tx_shift_buf_0 <= tx_shift_buf[0];
+       end
+     end
+
+   // Ensure rx_state must not be 11, 12, 13, 14, 15
+   assert_never
+     #(`OVL_ERROR,`OVL_ASSERT,
+       "rx_state in illegal state")
+   u_ovl_rx_state_illegal
+     (.clk(PCLK), .reset_n(PRESETn),
+      .test_expr((rx_state==4'hB)|(rx_state==4'hC)|(rx_state==4'hD)|
+      (rx_state==4'hE)|(rx_state==4'hF)));
+
+   // Ensure tx_state must not be 12, 13, 14, 15
+   assert_never
+     #(`OVL_ERROR,`OVL_ASSERT,
+       "tx_state in illegal state")
+   u_ovl_tx_state_illegal
+     (.clk(PCLK), .reset_n(PRESETn),
+      .test_expr((tx_state==4'hC)|(tx_state==4'hD)|
+      (tx_state==4'hE)|(tx_state==4'hF)));
+
+   // Ensure reg_baud_cntr_i change only if UART is enabled
+   // or if write to baud rate divider
+   assert_implication
+     #(`OVL_ERROR,`OVL_ASSERT,
+       "Unexpected baud rate divider change")
+   u_ovl_reg_baud_cntr_i_change
+     (.clk(PCLK), .reset_n(PRESETn),
+      .antecedent_expr(ovl_last_reg_baud_cntr_i!=reg_baud_cntr_i),
+      .consequent_expr(ovl_last_baud_div_en | ovl_last_baud_updated )
+      );
+
+   // Ensure reg_baud_div[19:4] >= reg_baud_cntr_i unless reg_baud_div just been programmed
+   assert_implication
+     #(`OVL_ERROR,`OVL_ASSERT,
+       "Unexpected baud rate divided change")
+   u_ovl_reg_baud_cntr_i_range
+     (.clk(PCLK), .reset_n(PRESETn),
+      .antecedent_expr(reg_baud_cntr_i>reg_baud_div[19:4]),
+      .consequent_expr(baud_updated)
+      );
+
+   // Ensure reg_baud_cntr_f change only if UART is enabled
+   // or if write to baud rate divider
+   assert_implication
+     #(`OVL_ERROR,`OVL_ASSERT,
+       "Unexpected baud rate divider change")
+   u_ovl_reg_baud_cntr_f_change
+     (.clk(PCLK), .reset_n(PRESETn),
+      .antecedent_expr(ovl_last_reg_baud_cntr_f!=reg_baud_cntr_f),
+      .consequent_expr(ovl_last_baud_div_en | ovl_last_baud_updated )
+      );
+
+   // Ensure tx_buf_full is set to 1 after write to TX buffer (PADDR[11:2]==0)
+   assert_next
+     #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+      "tx_buf_full should be asserted after write to TX buffer")
+   u_ovl_tx_buf_full
+    (.clk(PCLK),  .reset_n(PRESETn),
+     .start_event (PSEL & (~PENABLE) & PWRITE & (PADDR[11:2] == 10'h000)),
+     .test_expr   (tx_buf_full)
+     );
+
+   // If last tx_state=0 (idle) or 1 (wait for tick), TXD = 1.
+   assert_next
+     #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+      "TXD should be 1 when idle or just before data transmission")
+   u_ovl_txd_state_0_1
+    (.clk(PCLK),  .reset_n(PRESETn),
+     .start_event ((tx_state==4'd0)|(tx_state==4'd1)),
+     .test_expr   (TXD==1'b1)
+     );
+
+   // If last tx_state=2 (start bit), TXD = 0.
+   assert_next
+     #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+      "TXD should be 0 when output start bit")
+   u_ovl_txd_state_2
+    (.clk(PCLK),  .reset_n(PRESETn),
+     .start_event (tx_state==4'd2),
+     .test_expr   (TXD==1'b0)
+     );
+
+   // If last tx_state=3-10 (D0 to D7), TXD = anything (tx_shift_buf[0]).
+   assert_next
+     #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+      "TXD should be same as first bit of shift register during transfer")
+   u_ovl_txd_state_3_to_10
+    (.clk(PCLK),  .reset_n(PRESETn),
+     .start_event ((tx_state>4'd2) & (tx_state<4'd11)),
+     .test_expr   (TXD==ovl_last_tx_shift_buf_0)
+     );
+
+   // If last tx_state=11 (stop bit), TXD = 1.
+   assert_next
+     #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+      "TXD should be 1 when output stop bit")
+   u_ovl_txd_state_11
+    (.clk(PCLK),  .reset_n(PRESETn),
+     .start_event (tx_state==4'd11),
+     .test_expr   (TXD==1'b1)
+     );
+
+   // Duration of tx_state in 2 to 11 must have 16 reg_baud_tick
+   // (unless high speed test mode has been active)
+   assert_implication
+     #(`OVL_ERROR,`OVL_ASSERT,
+     "Duration of tx_state when in state 2 to state 11 should have 16 ticks")
+   u_ovl_width_of_tx_state
+     (.clk(PCLK), .reset_n(PRESETn),
+      .antecedent_expr((tx_state!=ovl_reg_last_tx_state) &      // at state change
+       (ovl_reg_last_tx_state>4'd1)&(ovl_reg_last_tx_state<4'd12) & // from state 2 to 11
+       (ovl_reg_hs_test_mode_triggered==1'b0)), // high speed test mode not triggered
+      .consequent_expr((ovl_reg_tx_tick_count==8'd15) | (ovl_reg_tx_tick_count==8'd16))
+        // count from 0 to 15 (16 ticks)
+     );
+
+
+   // In high speed test mode, tx_state must change if it is in range of 2 to 11
+   assert_next
+     #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+       "Duration of tx_state should be 1 cycle if high speed test mode is enabled")
+   u_ovl_width_of_tx_state_in_high_speed_test_mode
+     (.clk(PCLK), .reset_n(PRESETn),
+      .start_event((tx_state>4'd1)&(tx_state<4'd12) & reg_ctrl[6]),
+      .test_expr  (tx_state != ovl_reg_last_tx_state)
+      );
+
+   // Duration of rx_state in 1 must have 8 reg_baud_tick
+   assert_implication
+     #(`OVL_ERROR,`OVL_ASSERT,
+     "Duration of rx_state when state 1 should have 8 ticks")
+   u_ovl_width_of_rx_state_1
+     (.clk(PCLK), .reset_n(PRESETn),
+      .antecedent_expr((rx_state!=ovl_reg_last_rx_state) & // at state change
+       (ovl_reg_last_rx_state==4'd1)), // last state was state 1
+      .consequent_expr((ovl_reg_rx_tick_count==8'd7)|(ovl_reg_rx_tick_count==8'd8))
+        // count from 0 to 7 (8 ticks)
+     );
+
+   // Duration of rx_state in 2 to 10 must have 16 reg_baud_tick
+   assert_implication
+     #(`OVL_ERROR,`OVL_ASSERT,
+     "Duration of rx_state when in state 2 to state 10 should have 16 ticks")
+   u_ovl_width_of_rx_state_data
+     (.clk(PCLK), .reset_n(PRESETn),
+      .antecedent_expr((rx_state!=ovl_reg_last_rx_state) &    // at state change
+       (ovl_reg_last_rx_state>4'd1)&(ovl_reg_last_rx_state<4'd11)),  // from state 2 to 9
+      .consequent_expr((ovl_reg_rx_tick_count==8'd15)|(ovl_reg_rx_tick_count==8'd16))
+         // count from 0 to 15 (16 ticks)
+     );
+
+   // UARTINT must be 0 if TXINT, RXINT, TXOVRINT and RXOVRINT are all 0
+   assert_implication
+     #(`OVL_ERROR,`OVL_ASSERT,
+     "UARTINT must be 0 if TXINT, RXINT, TXOVRINT and RXOVRINT are all 0")
+   u_ovl_uartint_mismatch
+     (.clk(PCLK), .reset_n(PRESETn),
+      .antecedent_expr((TXINT | RXINT | TXOVRINT | RXOVRINT) == 1'b0), // No interrupt
+      .consequent_expr(UARTINT==1'b0) // Combined interrupt = 0
+     );
+
+    // TXINT should be asserted when TX interrupt enabled and transmit buffer is available
+    assert_next
+    #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+    "TXINT should be triggered when enabled")
+    u_ovl_txint_enable
+      (.clk(PCLK ), .reset_n (PRESETn),
+     .start_event (reg_ctrl[0] & reg_ctrl[2] & tx_buf_full & tx_buf_clear),
+     .test_expr   (TXINT == 1'b1)
+     );
+
+   // There should be no rising edge of TXINT if transmit is disabled or transmit interrupt is disabled
+    assert_next
+    #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+    "TXINT should not be triggered when disabled")
+    u_ovl_txint_disable
+      (.clk(PCLK ), .reset_n (PRESETn),
+     .start_event (((reg_ctrl[0]==1'b0) | (reg_ctrl[2]==1'b0)) & (TXINT == 1'b0)),
+     .test_expr   (TXINT == 1'b0)
+     );
+
+   // if TXINT falling edge, there must has been a write to INTCLEAR register with bit[0]=1
+   assert_implication
+     #(`OVL_ERROR,`OVL_ASSERT,
+     "When there is a falling edge of TXINT, there must has been a write to INTCLEAR")
+   u_ovl_txint_clear
+     (.clk(PCLK), .reset_n(PRESETn),
+      .antecedent_expr(ovl_last_txint & (~TXINT)), // Falling edge of TXINT
+      .consequent_expr(ovl_last_psel & ovl_last_pwrite &
+      (ovl_last_paddr==10'h003) & (ovl_last_pwdata[0]) ) // There must has been a write to INTCLEAR
+     );
+
+    // RXINT should be asserted when RX interrupt enabled and a new data is received
+    assert_next
+    #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+    "RXINT should be triggered when enabled")
+    u_ovl_rxint_enable
+      (.clk(PCLK ), .reset_n (PRESETn),
+     .start_event (reg_ctrl[3] & (rx_state==9) & (nxt_rx_state==10)),
+     .test_expr   (RXINT == 1'b1)
+     );
+
+   // There should be no rising edge of RXINT if receive interrupt is disabled
+    assert_next
+    #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+    "RXINT should not be triggered when disabled")
+    u_ovl_rxint_disable
+      (.clk(PCLK ), .reset_n (PRESETn),
+     .start_event ((reg_ctrl[3]==1'b0) & (RXINT == 1'b0)),
+     .test_expr   (RXINT == 1'b0)
+     );
+
+   // if RXINT falling edge, there must has been a write to INTCLEAR register with bit[1]=1
+   assert_implication
+     #(`OVL_ERROR,`OVL_ASSERT,
+     "When there is a falling edge of RXINT, there must has been a write to INTCLEAR")
+   u_ovl_rxint_clear
+     (.clk(PCLK), .reset_n(PRESETn),
+      .antecedent_expr(ovl_last_rxint & (~RXINT)), // Falling edge of TXINT
+      .consequent_expr(ovl_last_psel & ovl_last_pwrite &
+      (ovl_last_paddr==10'h003) & (ovl_last_pwdata[1]) ) // There must has been a write to INTCLEAR
+     );
+
+   // rx_buf_full should rise if rx_state change from 9 to 10
+    assert_next
+    #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+    "rx_buf_full should be asserted when a new character is received")
+    u_ovl_rx_buf_full
+      (.clk(PCLK ), .reset_n (PRESETn),
+     .start_event ((rx_state==9) & (nxt_rx_state==10)),
+     .test_expr   (rx_buf_full == 1'b1)
+     );
+
+   // if rx_buf_full falling edge, there must has been a read to the receive buffer
+   assert_implication
+     #(`OVL_ERROR,`OVL_ASSERT,
+     "When there is a falling edge of RXINT, there must has been a read to receive buffer")
+   u_ovl_rx_buf_full_clear
+     (.clk(PCLK), .reset_n(PRESETn),
+      .antecedent_expr((~rx_buf_full) & ovl_last_rx_buf_full), // Falling edge of rx_buf_full
+      .consequent_expr(ovl_last_psel & (~ovl_last_pwrite) &
+      (ovl_last_paddr==10'h000)  ) // There must has been a read to rx data
+     );
+
+   // TXOVRINT must be 0 if reg_ctrl[4]=0
+   assert_implication
+     #(`OVL_ERROR,`OVL_ASSERT,
+     "When there is a falling edge of RXINT, there must has been a write to INTCLEAR")
+   u_ovl_txovrint_disable
+     (.clk(PCLK), .reset_n(PRESETn),
+      .antecedent_expr(~reg_ctrl[4]),
+      .consequent_expr(~TXOVRINT)
+     );
+
+   // RXOVRINT must be 0 if reg_ctrl[5]=0
+   assert_implication
+     #(`OVL_ERROR,`OVL_ASSERT,
+     "When there is a falling edge of RXINT, there must has been a write to INTCLEAR")
+   u_ovl_rxovrint_disable
+     (.clk(PCLK), .reset_n(PRESETn),
+      .antecedent_expr(~reg_ctrl[5]),
+      .consequent_expr(~RXOVRINT)
+     );
+
+   // if a write take place to TX data buffer and tx_buf_full was 1, reg_tx_overrun will be set
+    assert_next
+    #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+    "tx buffer overrun should be asserted when a new character is write to buffer and buffer is already full")
+    u_ovl_tx_buffer_overrun
+      (.clk(PCLK ), .reset_n (PRESETn),
+     .start_event (write_enable00 & tx_buf_full & (~tx_buf_clear)),
+     .test_expr   (reg_tx_overrun == 1'b1)
+     );
+
+   // if rx_buf_full is high and rx_state change from 9 to 10, reg_rx_overrun will be set
+    assert_next
+    #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+    "rx buffer overrun should be asserted when a new character is received and rx buffer is already full")
+    u_ovl_rx_buffer_overrun
+      (.clk(PCLK ), .reset_n (PRESETn),
+     .start_event (rx_buf_full & (~rx_data_read) & (rx_state==9) & (nxt_rx_state==10)),
+     .test_expr   (reg_rx_overrun == 1'b1)
+     );
+
+   // if write to INTCLEAR  with bit[2]=1, reg_tx_overrun will be cleared,
+    // Cannot have new overrun at the same time because the APB can only do onething at a time
+    assert_next
+    #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+    "tx buffer overrun should be clear when write to INTCLEAR")
+    u_ovl_tx_buffer_overrun_clear_a
+      (.clk(PCLK ), .reset_n (PRESETn),
+     .start_event (write_enable0c & (PWDATA[2])),
+     .test_expr   (reg_tx_overrun==1'b0)
+     );
+
+   // if write to STATUS  with bit[2]=1, reg_tx_overrun will be cleared,
+    // Cannot have new overrun at the same time because the APB can only do onething at a time
+    assert_next
+    #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+    "tx buffer overrun should be clear when write to INTCLEAR")
+    u_ovl_tx_buffer_overrun_clear_b
+      (.clk(PCLK ), .reset_n (PRESETn),
+     .start_event (write_enable04 & (PWDATA[2])),
+     .test_expr   (reg_tx_overrun==1'b0)
+     );
+
+   // if write to INTCLEAR  with bit[3]=1, reg_rx_overrun will be cleared, unless a new overrun take place
+    assert_next
+    #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+    "rx buffer overrun should be clear when write to INTCLEAR, unless new overrun")
+    u_ovl_rx_buffer_overrun_clear_a
+      (.clk(PCLK ), .reset_n (PRESETn),
+     .start_event (write_enable0c & (PWDATA[3]) & (~(rx_buf_full & (rx_state==9) & (nxt_rx_state==10)))),
+     .test_expr   (reg_rx_overrun==1'b0)
+     );
+
+   // If rx buffer is not full, it cannot have new overrun
+    assert_next
+    #(`OVL_ERROR, 1,1,0, `OVL_ASSERT,
+    "rx buffer overrun should be clear when write to INTCLEAR, unless new overrun")
+    u_ovl_rx_buffer_overrun_when_empty
+      (.clk(PCLK ), .reset_n (PRESETn),
+     .start_event ((~rx_buf_full) & (reg_rx_overrun==1'b0)),
+     .test_expr   (reg_rx_overrun==1'b0)
+     );
+
+
+   // Reading of reg_baud_div (worth checking due to two stage read mux)
+    assert_next
+    #(`OVL_ERROR, 1, 1, 0, `OVL_ASSERT,
+    "Reading of baud rate divider value")
+    u_ovl_read_baud_rate_divide_cfg
+      (.clk(PCLK ), .reset_n (PRESETn),
+     .start_event   (PSEL & (~PENABLE) & (~PWRITE) & (PADDR[11:2]==10'h004)),
+     .test_expr     (PRDATA=={{12{1'b0}}, reg_baud_div})
+     );
+
+   // Recommended Baud Rate divider value is at least 16
+   assert_never
+     #(`OVL_ERROR,`OVL_ASSERT,
+       "UART enabled with baud rate less than 16")
+   u_ovl_baud_rate_divider_illegal
+     (.clk(PCLK), .reset_n(PRESETn),
+      .test_expr(((reg_ctrl[0]) & (reg_ctrl[6]==1'b0) & (reg_baud_div[19:4]=={16{1'b0}}) ) |
+                 ((reg_ctrl[1]) &                       (reg_baud_div[19:4]=={16{1'b0}}) ) )
+      );
+
+   // Test mode never changes from hi-speed to normal speed unless TX is idle
+   assert_never
+     #(`OVL_ERROR,`OVL_ASSERT,
+       "High speed test mode has been changed when TX was not idle")
+   u_ovl_change_speed_tx_illegal
+     (.clk(PCLK), .reset_n(PRESETn),
+      .test_expr((tx_state != 4'd00) & (reg_ctrl[6] != ovl_last_reg_ctrl[6]))
+      );
+
+`endif
+
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_clkreset.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_clkreset.v
new file mode 100644
index 0000000..d30c3c8
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_clkreset.v
@@ -0,0 +1,62 @@
+//-----------------------------------------------------------------------------
+// customised Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Simple clock and power on reset generator
+//-----------------------------------------------------------------------------
+`timescale 1ns/1ps
+
+module cmsdk_clkreset(
+  output wire CLK,
+  output wire NRST);
+
+  reg clock_q = 1'b0;
+  reg reset_n_q = 1'b0;
+
+  initial
+    begin
+      #40 clock_q <= 1'b1;
+      #100 reset_n_q <= 1'b1;
+    end
+
+  always @(clock_q)
+ //     #25 clock_q <= ~clock_q; // 50ns period 20MHz - 9600 baud 
+      #5 clock_q <= ~clock_q;  // 10ns period, 100MHz - 48000 baud
+
+  assign CLK = clock_q;
+  assign NRST = reset_n_q;
+
+endmodule
+
+
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ft1248x1_adpio.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ft1248x1_adpio.v
new file mode 100644
index 0000000..89ecfe6
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_ft1248x1_adpio.v
@@ -0,0 +1,157 @@
+//-----------------------------------------------------------------------------
+// customised example Cortex-M0 controller UART with file logging
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// Abstract : FT1248 1-bit data off-chip interface (emulate FT232H device)
+// and allows cmsdk_uart_capture testbench models to log ADP ip, op streams
+//-----------------------------------------------------------------------------
+
+
+module cmsdk_ft1248x1_adpio
+  #(parameter ADPFILENAME = "adp.cmd",
+    parameter VERBOSE = 0)
+  (
+  input  wire  ft_clk_i,         // SCLK
+  input  wire  ft_ssn_i,         // SS_N
+  output wire  ft_miso_o,        // MISO
+  inout  wire  ft_miosio_io,     // MIOSIO tristate output when enabled
+
+  output wire       FTDI_CLK2UART_o, // Clock (baud rate)
+  output wire       FTDI_OP2UART_o, // Received data to UART capture
+  output wire       FTDI_IP2UART_o  // Transmitted data to UART capture
+  );
+
+
+ //----------------------------------------------
+ //-- File I/O
+ //----------------------------------------------
+
+
+   integer        fdcmd;       // channel descriptor for cmd file input
+   integer        ch;
+`define EOF -1
+
+   reg       ft_rxreq;
+   wire      ft_rxack;
+   reg [7:0] ft_adpbyte;
+   
+   initial
+     begin
+       ft_rxreq <= 0;
+       $timeformat(-9, 0, " ns", 14);
+       fdcmd= $fopen(ADPFILENAME,"r");
+       if (fdcmd == 0)
+          $write("** FT1248x1 : no command file **\n");
+       else begin
+         ch =  $fgetc(fdcmd);
+         while (ch != `EOF) begin
+           ft_adpbyte <= (ch & 8'hff);
+           ft_rxreq <= 1'b1;
+           while (ft_ssn_i == 1'b0)
+             @(posedge ft_ssn_i);
+           @(posedge ft_rxack);
+           ft_rxreq <=0;
+           @(negedge ft_rxack);
+           ch =  $fgetc(fdcmd);
+         end
+       end
+       $fclose(fdcmd);
+       ft_rxreq <= 0;
+     end
+     
+
+//----------------------------------------------
+//-- State Machine
+//----------------------------------------------
+
+wire ft_miosio_i;
+wire ft_miosio_o;
+wire ft_miosio_z;
+
+// tri-state pad control for MIOSIO
+assign ft_miosio_io = (ft_miosio_z) ? 1'bz : ft_miosio_o;
+// add notinal delay on inout to ensure last "half-bit" on FT1248TXD is sampled before tri-stated
+assign #1 ft_miosio_i  = ft_miosio_io;
+
+reg [4:0] ft_state; // 17-state for bit-serial
+wire [5:0] ft_nextstate = ft_state + 5'b00001;
+
+always @(posedge ft_clk_i or posedge ft_ssn_i)
+  if (ft_ssn_i)
+    ft_state <= 5'b11111;
+  else // loop if multi-data
+//    ft_state <= (ft_state == 5'b01111) ? 5'b01000 : ft_nextstate;
+    ft_state <= ft_nextstate;
+
+// 16: bus turnaround (or bit[5])
+// 0 for CMD3
+// 3 for CMD2
+// 5 for CMD1
+// 6 for CMD0
+// 7 for cmd turnaround
+// 8 for data bit0
+// 9 for data bit1
+// 10 for data bit2
+// 11 for data bit3
+// 12 for data bit4
+// 13 for data bit5
+// 14 for data bit6
+// 15 for data bit7
+
+// ft_miso_o reflects RXE when deselected
+assign ft_miso_o = (ft_ssn_i) ? !ft_rxreq : (ft_state == 5'b00111);
+
+// capture CMD on falling edge of clock (mid-data)
+// - valid sample ready after 7th edge (ready RX or TX data phase functionality)
+reg [7:0] ft_cmd;
+always @(negedge ft_clk_i or posedge ft_ssn_i)
+  if (ft_ssn_i)
+    ft_cmd <= 8'b00000001;
+  else // shift in data
+    ft_cmd <= (!ft_state[3] & !ft_nextstate[3]) ? {ft_cmd[6:0],ft_miosio_i} : ft_cmd;
+
+wire ft_cmd_valid = ft_cmd[7];
+wire ft_cmd_rxd =  ft_cmd[7] & !ft_cmd[6] & !ft_cmd[3] & !ft_cmd[1] &  ft_cmd[0];
+wire ft_cmd_txd =  ft_cmd[7] & !ft_cmd[6] & !ft_cmd[3] & !ft_cmd[1] & !ft_cmd[0];
+
+// tristate enable for miosio (deselected status or serialized data for read command)
+wire ft_miosio_e = ft_ssn_i | (ft_cmd_rxd & !ft_state[4] & ft_state[3]);
+assign ft_miosio_z = !ft_miosio_e;
+
+// serial data formatted with start bit for UART capture (on rising uart-clock)
+assign   FTDI_CLK2UART_o = !ft_clk_i;
+// suitable for CMSDK UART capture IO
+// inject a start bit low else mark high
+assign FTDI_OP2UART_o = (ft_cmd_txd & (ft_state[4:3]) == 2'b01) ? ft_miosio_i : !(ft_cmd_txd & (ft_state == 5'b00111)); 
+assign FTDI_IP2UART_o = (ft_cmd_rxd & (ft_state[4:3]) == 2'b01) ? ft_miosio_io : !(ft_cmd_rxd & (ft_state == 5'b00111));
+
+// capture RXD on falling edge of clock
+reg [8:0] ft_rxd;
+always @(negedge ft_clk_i or posedge ft_ssn_i)
+  if (ft_ssn_i)
+    ft_rxd <= 9'b111111111;
+  else if (ft_cmd_txd & !(ft_miosio_i & (&ft_rxd[8:0])))  //only on valid start-bit
+    ft_rxd <= {ft_miosio_i, ft_rxd[8:1]};
+
+// shift TXD on rising edge of clock
+reg [8:0] ft_txd;
+always @(posedge ft_clk_i or posedge ft_ssn_i)
+  if (ft_ssn_i)
+    ft_txd <= {1'b1,ft_adpbyte};
+  else if (ft_rxreq & ft_cmd_rxd & (ft_state[4:3] == 2'b01))  //valid TX shift
+    ft_txd <= {1'b0,ft_txd[8:1]};
+
+assign ft_rxack = (ft_cmd_rxd & (ft_state==5'b01111));
+  
+// ft_miso_o reflects TXF when deselected (never full for simulation output)
+assign ft_miosio_o =  (ft_ssn_i) ? 1'b0 : ft_txd[0];
+
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_clkctrl.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_clkctrl.v
new file mode 100644
index 0000000..a994d01
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_clkctrl.v
@@ -0,0 +1,191 @@
+//-----------------------------------------------------------------------------
+// customised Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Simple clock controller for Cortex-M0 example system
+//-----------------------------------------------------------------------------
+// Note : Most of the clock gating are handled by the example PMU provided
+//        in the Cortex-M0/Cortex-M0+ deliverable.
+
+module cmsdk_mcu_clkctrl #(
+  parameter CLKGATE_PRESENT = 0)
+ (
+  input  wire       XTAL1,       // Clock source
+  input  wire       NRST,        // active low external reset
+
+  input  wire       APBACTIVE,   // APB active status
+  input  wire       SLEEPING,    // Sleep status
+  input  wire       SLEEPDEEP,   // Deep Sleep status
+  input  wire       SYSRESETREQ, // System reset request
+  input  wire       DBGRESETREQ, // Debug reset request
+  input  wire       LOCKUP,      // LOCKUP status
+  input  wire       LOCKUPRESET, // Config - generation reset if locked up
+
+  input  wire       CGBYPASS,    // Clock gating bypass
+  input  wire       RSTBYPASS,   // Reset by pass
+
+  output wire       XTAL2,       // Feedback for Crystal oscillator
+  output wire       FCLK,        // Free running clock
+  output wire       PCLK,        // Peripheral clock
+  output wire       PCLKG,       // Gated PCLK for APB transfers
+  output wire       PCLKEN,      // Clock divide control for AHB to APB bridge
+`ifdef CORTEX_M0DESIGNSTART
+  output wire       PORESETn,    // Power on reset
+  output wire       HRESETn,     // System and AHB reset
+`endif
+  output wire       PRESETn);     // Peripheral reset
+
+  wire         clk;
+  wire         reset_n;
+  reg  [2:0]   reset_sync_reg;
+  wire [2:0]   nxt_reset_sync;
+`ifdef CORTEX_M0DESIGNSTART
+  reg          hrst_reg;
+  wire         nxt_hrst;
+  reg          dbgrst_reg;
+`endif
+  reg          prst_reg;
+  wire         nxt_prst;
+  wire         i_pclken;
+  wire         i_pclkgen;
+
+  // Crystal oscillator inverter
+  assign  XTAL2 =  (~(XTAL1 | SLEEPDEEP));
+
+  // Clock source
+  assign clk   = XTAL1;
+
+  // Reset synchronizer
+  assign nxt_reset_sync = {reset_sync_reg[1:0], 1'b1};
+
+  always @(posedge clk or negedge NRST)
+  begin
+  if (~NRST)
+    reset_sync_reg <= 3'b000;
+  else
+    reset_sync_reg <= nxt_reset_sync;
+  end
+
+  assign reset_n = reset_sync_reg[2];
+
+`ifdef CORTEX_M0DESIGNSTART
+  // AHB HRESETn
+  assign nxt_hrst = ~(SYSRESETREQ | (LOCKUP & LOCKUPRESET));
+
+  always @(posedge clk or negedge reset_n)
+  begin
+  if (~reset_n)
+    hrst_reg <= 1'b0;
+  else
+    hrst_reg <= nxt_hrst;
+  end
+
+  // Debug Reset
+  always @(posedge clk or negedge reset_n)
+  begin
+  if (~reset_n)
+    dbgrst_reg <= 1'b0;
+  else
+    dbgrst_reg <= ~DBGRESETREQ;
+  end
+`endif
+
+  // APB PRESETn
+  assign nxt_prst = ~(SYSRESETREQ | (LOCKUP & LOCKUPRESET));
+
+  always @(posedge clk or negedge reset_n)
+  begin
+  if (~reset_n)
+    prst_reg <= 1'b0;
+  else
+    prst_reg <= nxt_prst;
+  end
+
+  generate if (CLKGATE_PRESENT == 0) begin : gen_no_clock_gating
+
+  // No clock gating for PCLK
+  assign i_pclken   = 1'b1;  // Currently PCLK = HCLK (for AHB to APB bridge)
+  assign i_pclkgen  = 1'b1;  // Not used
+  assign PCLK       = clk;   // Peripheral clock
+  assign PCLKG      = clk;   // Peripheral clock for APB interface
+
+  end else
+  begin : gen_clock_gating
+  // Clock gate is present.
+  // Testing of divided PCLK is only possible when clock gating is available
+`ifdef ARM_CMSDK_SLOWSPEED_PCLK
+  reg    reg_pclk_divide;
+
+  always @(posedge clk or negedge reset_n)
+  if (~reset_n)
+    reg_pclk_divide <= 1'b1;
+  else
+    reg_pclk_divide <= ~reg_pclk_divide;
+
+  assign i_pclken   =  reg_pclk_divide; // PCLKEN toggle every cycle (PCLK at half speed)
+
+`else
+  assign i_pclken   = 1'b1;  // PCLK = HCLK
+`endif
+  assign i_pclkgen  = i_pclken & APBACTIVE;
+
+  // PCLK generation
+  cmsdk_clock_gate
+    #(.CLKGATE_PRESENT(CLKGATE_PRESENT))
+    u_cmsdk_clock_gate_pclk(
+    .CLK       (clk),
+    .CLKENABLE (i_pclken),
+    .DISABLEG  (CGBYPASS),
+    .GATEDCLK  (PCLK));
+
+  // Gated PCLK (PCLKG) generation
+  cmsdk_clock_gate
+    #(.CLKGATE_PRESENT(CLKGATE_PRESENT))
+    u_cmsdk_clock_gate_pclkg(
+    .CLK       (clk),
+    .CLKENABLE (i_pclkgen),
+    .DISABLEG  (CGBYPASS),
+    .GATEDCLK  (PCLKG));
+
+  end endgenerate
+
+  // Connect to top level
+`ifdef CORTEX_M0DESIGNSTART
+  assign PORESETn = (RSTBYPASS) ? NRST : reset_n;
+  assign HRESETn  = (RSTBYPASS) ? NRST : hrst_reg;
+`endif
+  assign PRESETn  = (RSTBYPASS) ? NRST : prst_reg;
+  assign FCLK     = clk;  // Free running clock
+  assign PCLKEN   = i_pclken;
+
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_pin_mux.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_pin_mux.v
new file mode 100644
index 0000000..82d0ae5
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_pin_mux.v
@@ -0,0 +1,233 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Pin multiplexing control for example Cortex-M0/Cortex-M0+
+//            microcontroller
+//-----------------------------------------------------------------------------
+//
+module cmsdk_mcu_pin_mux (
+  //-------------------------------------------
+  // I/O ports
+  //-------------------------------------------
+
+    // UART
+    output wire             uart0_rxd,
+    input  wire             uart0_txd,
+    input  wire             uart0_txen,
+    output wire             uart1_rxd,
+    input  wire             uart1_txd,
+    input  wire             uart1_txen,
+    output wire             uart2_rxd,
+    input  wire             uart2_txd,
+    input  wire             uart2_txen,
+
+    // Timer
+    output wire             timer0_extin,
+    output wire             timer1_extin,
+
+`ifdef CORTEX_M0PLUS
+`ifdef ARM_CMSDK_INCLUDE_MTB
+    // CoreSight MTB M0+
+    output wire             TSTART,
+    output wire             TSTOP,
+`endif
+`endif
+
+    // IO Ports
+    output wire  [15:0]     p0_in,
+    input  wire  [15:0]     p0_out,
+    input  wire  [15:0]     p0_outen,
+    input  wire  [15:0]     p0_altfunc,
+
+    output wire  [15:0]     p1_in,
+    input  wire  [15:0]     p1_out,
+    input  wire  [15:0]     p1_outen,
+    input  wire  [15:0]     p1_altfunc,
+
+    // Processor debug interface
+    output wire             i_trst_n,
+    output wire             i_swditms,
+    output wire             i_swclktck,
+    output wire             i_tdi,
+    input  wire             i_tdo,
+    input  wire             i_tdoen_n,
+    input  wire             i_swdo,
+    input  wire             i_swdoen,
+
+    // IO pads
+    inout  wire  [15:0]     P0, // legacy
+    inout  wire  [15:0]     P1, // legacy
+
+    output wire  [15:0]     p1_out_mux,    //alt-function mux
+    output wire  [15:0]     p1_out_en_mux,  //alt-function mux
+
+    input  wire             nTRST, // Not needed if serial-wire debug is used
+    input  wire             TDI,   // Not needed if serial-wire debug is used
+    inout  wire             SWDIOTMS,
+    input  wire             SWCLKTCK,
+    output wire             TDO);   // Not needed if serial-wire debug is used
+
+  //-------------------------------------------
+  // Internal wires
+  //-------------------------------------------
+  wire      [15:0]     p0_out_mux;
+  wire      [15:0]     p0_out_en_mux;
+// wire      [15:0]     p1_out_mux;    // promoted to block output
+// wire      [15:0]     p1_out_en_mux; // promoted to block output
+
+  //-------------------------------------------
+  // Beginning of main code
+  //-------------------------------------------
+  // inputs
+  assign    uart0_rxd    = p1_in[0];
+  assign    uart1_rxd    = p1_in[2];
+  assign    uart2_rxd    = p1_in[4];
+  assign    timer0_extin = p1_in[8];
+  assign    timer1_extin = p1_in[9];
+
+  assign    p0_in        = P0;
+  assign    p1_in        = P1;
+
+  // Output function mux
+  assign    p0_out_mux    = p0_out; // No function muxing for Port 0
+
+  assign    p1_out_mux[0] =                               p1_out[0];
+  assign    p1_out_mux[1] = (p1_altfunc[1]) ? uart0_txd : p1_out[1];
+  assign    p1_out_mux[2] =                               p1_out[2];
+  assign    p1_out_mux[3] = (p1_altfunc[3]) ? uart1_txd : p1_out[3];
+  assign    p1_out_mux[4] =                               p1_out[4];
+  assign    p1_out_mux[5] = (p1_altfunc[5]) ? uart2_txd : p1_out[5];
+  assign    p1_out_mux[15:6] = p1_out[15:6];
+
+`ifdef CORTEX_M0PLUS
+`ifdef ARM_CMSDK_INCLUDE_MTB
+  // MTB control
+  // The TSTART/TSTOP synchronising logic is instantiated within the
+  // cmsdk_mcu_system module.
+  assign    TSTART       = p1_in[7];
+  assign    TSTOP        = p1_in[6];
+  // This allows TSTART and TSTOP to be controlled from external sources.
+`endif
+`endif
+
+  // Output enable mux
+  assign    p0_out_en_mux   = p0_outen; // No function muxing for Port 0
+
+  assign    p1_out_en_mux[0] =                                p1_outen[0];
+  assign    p1_out_en_mux[1] = (p1_altfunc[1]) ? uart0_txen : p1_outen[1];
+  assign    p1_out_en_mux[2] =                                p1_outen[2];
+  assign    p1_out_en_mux[3] = (p1_altfunc[3]) ? uart1_txen : p1_outen[3];
+  assign    p1_out_en_mux[4] =                                p1_outen[4];
+  assign    p1_out_en_mux[5] = (p1_altfunc[5]) ? uart2_txen : p1_outen[5];
+  assign    p1_out_en_mux[15:6] = p1_outen[15:6];
+
+
+  // Output tristate
+  assign    P0[ 0] = p0_out_en_mux[ 0] ? p0_out_mux[ 0] : 1'bz;
+  assign    P0[ 1] = p0_out_en_mux[ 1] ? p0_out_mux[ 1] : 1'bz;
+  assign    P0[ 2] = p0_out_en_mux[ 2] ? p0_out_mux[ 2] : 1'bz;
+  assign    P0[ 3] = p0_out_en_mux[ 3] ? p0_out_mux[ 3] : 1'bz;
+  assign    P0[ 4] = p0_out_en_mux[ 4] ? p0_out_mux[ 4] : 1'bz;
+  assign    P0[ 5] = p0_out_en_mux[ 5] ? p0_out_mux[ 5] : 1'bz;
+  assign    P0[ 6] = p0_out_en_mux[ 6] ? p0_out_mux[ 6] : 1'bz;
+  assign    P0[ 7] = p0_out_en_mux[ 7] ? p0_out_mux[ 7] : 1'bz;
+  assign    P0[ 8] = p0_out_en_mux[ 8] ? p0_out_mux[ 8] : 1'bz;
+  assign    P0[ 9] = p0_out_en_mux[ 9] ? p0_out_mux[ 9] : 1'bz;
+  assign    P0[10] = p0_out_en_mux[10] ? p0_out_mux[10] : 1'bz;
+  assign    P0[11] = p0_out_en_mux[11] ? p0_out_mux[11] : 1'bz;
+  assign    P0[12] = p0_out_en_mux[12] ? p0_out_mux[12] : 1'bz;
+  assign    P0[13] = p0_out_en_mux[13] ? p0_out_mux[13] : 1'bz;
+  assign    P0[14] = p0_out_en_mux[14] ? p0_out_mux[14] : 1'bz;
+  assign    P0[15] = p0_out_en_mux[15] ? p0_out_mux[15] : 1'bz;
+
+  assign    P1[ 0] = p1_out_en_mux[ 0] ? p1_out_mux[ 0] : 1'bz;
+  assign    P1[ 1] = p1_out_en_mux[ 1] ? p1_out_mux[ 1] : 1'bz;
+  assign    P1[ 2] = p1_out_en_mux[ 2] ? p1_out_mux[ 2] : 1'bz;
+  assign    P1[ 3] = p1_out_en_mux[ 3] ? p1_out_mux[ 3] : 1'bz;
+  assign    P1[ 4] = p1_out_en_mux[ 4] ? p1_out_mux[ 4] : 1'bz;
+  assign    P1[ 5] = p1_out_en_mux[ 5] ? p1_out_mux[ 5] : 1'bz;
+  assign    P1[ 6] = p1_out_en_mux[ 6] ? p1_out_mux[ 6] : 1'bz;
+  assign    P1[ 7] = p1_out_en_mux[ 7] ? p1_out_mux[ 7] : 1'bz;
+  assign    P1[ 8] = p1_out_en_mux[ 8] ? p1_out_mux[ 8] : 1'bz;
+  assign    P1[ 9] = p1_out_en_mux[ 9] ? p1_out_mux[ 9] : 1'bz;
+  assign    P1[10] = p1_out_en_mux[10] ? p1_out_mux[10] : 1'bz;
+  assign    P1[11] = p1_out_en_mux[11] ? p1_out_mux[11] : 1'bz;
+  assign    P1[12] = p1_out_en_mux[12] ? p1_out_mux[12] : 1'bz;
+  assign    P1[13] = p1_out_en_mux[13] ? p1_out_mux[13] : 1'bz;
+  assign    P1[14] = p1_out_en_mux[14] ? p1_out_mux[14] : 1'bz;
+  assign    P1[15] = p1_out_en_mux[15] ? p1_out_mux[15] : 1'bz;
+
+/*
+// synopsys translate_off
+
+  // Pullup
+  pullup(P0[ 0]);
+  pullup(P0[ 1]);
+  pullup(P0[ 2]);
+  pullup(P0[ 3]);
+  pullup(P0[ 4]);
+  pullup(P0[ 5]);
+  pullup(P0[ 6]);
+  pullup(P0[ 7]);
+  pullup(P0[ 8]);
+  pullup(P0[ 9]);
+  pullup(P0[10]);
+  pullup(P0[11]);
+  pullup(P0[12]);
+  pullup(P0[13]);
+  pullup(P0[14]);
+  pullup(P0[15]);
+
+  pullup(P1[ 0]);
+  pullup(P1[ 1]);
+  pullup(P1[ 2]);
+  pullup(P1[ 3]);
+  pullup(P1[ 4]);
+  pullup(P1[ 5]);
+  pullup(P1[ 6]);
+  pullup(P1[ 7]);
+  pullup(P1[ 8]);
+  pullup(P1[ 9]);
+  pullup(P1[10]);
+  pullup(P1[11]);
+  pullup(P1[12]);
+  pullup(P1[13]);
+  pullup(P1[14]);
+  pullup(P1[15]);
+
+// synopsys translate_on
+*/
+  //-------------------------------------------
+  // Debug connections
+  //-------------------------------------------
+
+  assign    i_trst_n     = nTRST;
+  assign    i_tdi        = TDI;
+  assign    i_swclktck   = SWCLKTCK;
+  assign    i_swditms    = SWDIOTMS;
+
+  // Tristate buffers for debug output signals
+  bufif1 (SWDIOTMS, i_swdo, i_swdoen);
+  bufif0 (TDO,      i_tdo,  i_tdoen_n);
+
+  endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_stclkctrl.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_stclkctrl.v
new file mode 100644
index 0000000..30221aa
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_stclkctrl.v
@@ -0,0 +1,80 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Simple control for SysTick signals for Cortex-M processor
+//-----------------------------------------------------------------------------
+
+module cmsdk_mcu_stclkctrl #(
+  // Ratio between FCLK and SysTck reference clock
+  parameter DIV_RATIO = 18'd01000,
+
+  // Divide by half for each phase
+  parameter DIVIDER_RELOAD = (DIV_RATIO>>1)-1
+ )
+ (
+  input  wire        FCLK,      // Free running clock
+  input  wire        SYSRESETn, // System reset
+
+  output wire        STCLKEN,   // SysTick clock
+  output wire [25:0] STCALIB    // SysTick calibration
+  );
+
+  reg     [17:0] reg_clk_divider;
+  reg            reg_stclken;
+
+  assign STCALIB[25] = 1'b0; // NoRef - reference clock provided
+  assign STCALIB[24] = 1'b1; // Skew - reference info not available
+  assign STCALIB[23:0] = {24{1'b0}}; // 10 ms value  set to 0, indicate this value is not used
+
+  // Divider
+  wire [17:0] reg_clk_div_min1 = reg_clk_divider -1;
+  always @(posedge FCLK or negedge SYSRESETn)
+  begin
+  if (~SYSRESETn)
+    reg_clk_divider <= {18{1'b0}};
+  else
+    begin
+    if (|reg_clk_divider)
+      reg_clk_divider <= reg_clk_div_min1[17:0];
+    else
+      reg_clk_divider <= DIVIDER_RELOAD[17:0];
+    end
+  end
+
+  // Toggle register
+  always @(posedge FCLK or negedge SYSRESETn)
+  begin
+  if (~SYSRESETn)
+    reg_stclken <= 1'b0;
+  else
+    begin
+    if (reg_clk_divider==18'h00000)
+      reg_stclken <= ~reg_stclken;
+    end
+  end
+
+  // Connect to top level
+  assign STCLKEN = reg_stclken;
+
+endmodule
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_sysctrl.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_sysctrl.v
new file mode 100644
index 0000000..383b4af
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_mcu_sysctrl.v
@@ -0,0 +1,351 @@
+//-----------------------------------------------------------------------------
+// customised Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : System controller for simple Cortex-M Microcontroller system
+//-----------------------------------------------------------------------------
+//-------------------------------------
+// Programmer's model
+// -------------------------------
+// 0x000 RW    MEM_CTRL
+//      bit [  0]  REMAP - default value 1
+// 0x004 RW    PMU_CTRL
+//      bit [  0]  PMUENABLE - default value 0
+// 0x008 R/W   SYS_CTRL
+//      bit [  0]  LOCKUPRESETEN - default value 0
+// 0x00C --    Not used
+//
+// 0x010 R/Wc  Reset Information
+//      bit [  2]  LOCKUPRESET
+//      bit [  1]  WDOGRESETREQ
+//      bit [  0]  SYSRESETREQ
+//
+//-------------------------------------
+
+module cmsdk_mcu_sysctrl #(
+  parameter  BE = 0            // By default use little endian
+
+  )
+  (
+   // AHB Inputs
+  input  wire         HCLK,      // system bus clock
+  input  wire         HRESETn,   // system bus reset
+  input  wire         FCLK,      // Free running clock
+  input  wire         PORESETn,  // power on reset
+  input  wire         HSEL,      // AHB peripheral select
+  input  wire         HREADY,    // AHB ready input
+  input  wire   [1:0] HTRANS,    // AHB transfer type
+  input  wire   [2:0] HSIZE,     // AHB hsize
+  input  wire         HWRITE,    // AHB hwrite
+  input  wire  [11:0] HADDR,     // AHB address bus
+  input  wire  [31:0] HWDATA,    // AHB write data bus
+
+   // AHB Outputs
+  output wire         HREADYOUT, // AHB ready output to S->M mux
+  output wire         HRESP,     // AHB response
+  output wire  [31:0] HRDATA,    // AHB read data bus
+
+   // Reset information
+  input  wire         SYSRESETREQ,// System reset request
+  input  wire         WDOGRESETREQ,// Watchdog reset request
+  input  wire         LOCKUP,     // CPU locked up
+
+   //ECO revision number
+  input  wire  [3:0]  ECOREVNUM, // ECO revision number
+
+   // System control signals
+  output wire         REMAP,     // memory remap
+  output wire         PMUENABLE, // Power Management Unit enable, will be disabled in design
+                                 // start version
+  output wire         LOCKUPRESET // Enable reset if lockup
+  );
+
+// --------------------------------------------------------------------------
+// Port Definitions
+// --------------------------------------------------------------------------
+
+//Local parameter for IDs,
+localparam  ARM_CMSDK_CM0_SYSCTRL_PID4        = {32'h00000004}; // 0xFD0 : PID 4
+localparam  ARM_CMSDK_CM0_SYSCTRL_PID5        = {32'h00000000}; // 0xFD4 : PID 5
+localparam  ARM_CMSDK_CM0_SYSCTRL_PID6        = {32'h00000000}; // 0xFD8 : PID 6
+localparam  ARM_CMSDK_CM0_SYSCTRL_PID7        = {32'h00000000}; // 0xFDC : PID 7
+localparam  ARM_CMSDK_CM0_SYSCTRL_PID0        = {32'h00000026}; // 0xFE0 : PID 0 part number[7:0]
+localparam  ARM_CMSDK_CM0_SYSCTRL_PID1        = {32'h000000B8}; // 0xFE4 : PID 1 [7:4] jep106_id_3_0. [3:0] part number [11:8]
+localparam  ARM_CMSDK_CM0_SYSCTRL_PID2        = {32'h0000001B}; // 0xFE8 : PID 2 [7:4] revision, [3] jedec_used. [2:0] jep106_id_6_4
+localparam  ARM_CMSDK_CM0_SYSCTRL_PID3        = {32'h00000000}; // 0xFEC : PID 3
+localparam  ARM_CMSDK_CM0_SYSCTRL_CID0        = {32'h0000000D}; // 0xFF0 : CID 0
+localparam  ARM_CMSDK_CM0_SYSCTRL_CID1        = {32'h000000F0}; // 0xFF4 : CID 1 PrimeCell class
+localparam  ARM_CMSDK_CM0_SYSCTRL_CID2        = {32'h00000005}; // 0xFF8 : CID 2
+localparam  ARM_CMSDK_CM0_SYSCTRL_CID3        = {32'h000000B1}; // 0xFFC : CID 3
+         // Note : Customer changing the design should modify
+         // - jep106 value (www.jedec.org)
+         // - part number (customer define)
+         // - Optional revision and modification number (e.g. rXpY)
+
+  // --------------------------------------------------------------------------
+  // Internal wires
+  // --------------------------------------------------------------------------
+
+  reg    [31:0]          read_mux;
+  reg    [31:0]          read_mux_le; // little endian of read mux
+  reg                    reg_remap;
+`ifdef  CORTEX_M0DESIGNSTART
+  wire                   reg_pmuenable;
+`else
+  reg                    reg_pmuenable;
+`endif
+  reg                    reg_lockupreset;
+  reg     [2:0]          reg_resetinfo;
+
+  // ----------------------------------------------------------
+  // Read/write control logic
+  // ----------------------------------------------------------
+
+  wire        bigendian    = (BE!=0) ? 1'b1 : 1'b0;
+  wire        ahb_access   = HTRANS[1] & HSEL & HREADY;
+  wire        ahb_write    = ahb_access &   HWRITE;
+  wire        ahb_read     = ahb_access & (~HWRITE);
+  wire  [3:0] nxt_byte_strobe;
+  reg   [3:0] reg_byte_strobe;
+  reg         reg_read_enable;
+  reg         reg_write_enable;
+  reg  [11:2] reg_addr;
+  reg   [1:0] reg_hsize;
+  reg  [31:0] HWDATALE; // Little endian version of HWDATA
+
+  // Generate byte strobes to allow the GPIO registers to handle different transfer sizes
+  assign nxt_byte_strobe[0] = (HSIZE[1] | ((HADDR[1]==1'b0) & HSIZE[0]) | (HADDR[1:0]==2'b00)) & ahb_access;
+  assign nxt_byte_strobe[1] = (HSIZE[1] | ((HADDR[1]==1'b0) & HSIZE[0]) | (HADDR[1:0]==2'b01)) & ahb_access;
+  assign nxt_byte_strobe[2] = (HSIZE[1] | ((HADDR[1]==1'b1) & HSIZE[0]) | (HADDR[1:0]==2'b10)) & ahb_access;
+  assign nxt_byte_strobe[3] = (HSIZE[1] | ((HADDR[1]==1'b1) & HSIZE[0]) | (HADDR[1:0]==2'b11)) & ahb_access;
+
+  // Data phase read write and byte lane strobe
+  always @(posedge HCLK or negedge HRESETn)
+  begin
+    if (~HRESETn)
+      begin
+      reg_byte_strobe <= 4'b0000;
+      reg_read_enable <= 1'b0;
+      reg_write_enable <= 1'b0;
+      end
+    else if (HREADY)
+      begin
+      reg_byte_strobe   <= nxt_byte_strobe;
+      reg_read_enable  <= ahb_read;
+      reg_write_enable <= ahb_write;
+      end
+  end
+
+  // registered address, undate only if selected to reduce toggling
+  always @(posedge HCLK or negedge HRESETn)
+  begin
+    if (~HRESETn)
+      reg_addr <= {10{1'b0}};
+    else if (ahb_access)
+      reg_addr <= HADDR[11:2];
+  end
+
+  // registered hsize, update only if selected to reduce toggling
+  always @(posedge HCLK or negedge HRESETn)
+  begin
+    if (~HRESETn)
+      reg_hsize <= {2{1'b0}};
+    else if (ahb_access)
+      reg_hsize <= HSIZE[1:0];
+  end
+
+
+  // Read operation
+  always @(reg_addr or reg_remap or reg_pmuenable or ECOREVNUM or
+  reg_lockupreset or reg_resetinfo or reg_read_enable)
+  begin
+   case (reg_read_enable)
+  1'b1:
+    begin
+      if (reg_addr[11:5] == 7'h00) begin
+         case(reg_addr[4:2])
+          3'b000: read_mux_le ={{31{1'b0}}, reg_remap} ;
+          3'b001: read_mux_le ={{31{1'b0}}, reg_pmuenable} ;
+          3'b010: read_mux_le ={{31{1'b0}}, reg_lockupreset} ;
+          3'b100: read_mux_le ={{29{1'b0}}, reg_resetinfo} ;
+          3'b011,3'b101,3'b110,3'b111: read_mux_le = {32{1'b0}};
+          default: read_mux_le = {32{1'bx}};
+         endcase
+      end
+      else if (reg_addr[11:6] == 6'h3F)begin
+         case (reg_addr[5:2])
+          4'h4:  read_mux_le =   ARM_CMSDK_CM0_SYSCTRL_PID4;  //0xFD0 Peripheral ID 4
+          4'h5:  read_mux_le =   ARM_CMSDK_CM0_SYSCTRL_PID5;  //0xFD4 Peripheral ID 5
+          4'h6:  read_mux_le =   ARM_CMSDK_CM0_SYSCTRL_PID6;  //0xFD8 Peripheral ID 6
+          4'h7:  read_mux_le =   ARM_CMSDK_CM0_SYSCTRL_PID7;  //0xFDC Peripheral ID 7
+          4'h8:  read_mux_le =   ARM_CMSDK_CM0_SYSCTRL_PID0;  //0xFE0 Peripheral ID 0
+          4'h9:  read_mux_le =   ARM_CMSDK_CM0_SYSCTRL_PID1;  //0xFE4 Peripheral ID 1
+          4'hA:  read_mux_le =   ARM_CMSDK_CM0_SYSCTRL_PID2;  //0xFE8 Peripheral ID 2
+          4'hB:  read_mux_le =   {ARM_CMSDK_CM0_SYSCTRL_PID3[31:8], ECOREVNUM[3:0], 4'h0}; //0xFEC Peripheral ID 3
+          4'hC:  read_mux_le =   ARM_CMSDK_CM0_SYSCTRL_CID0;  //0xFF0 Component ID 0
+          4'hD:  read_mux_le =   ARM_CMSDK_CM0_SYSCTRL_CID1;  //0xFF4 Component ID 1
+          4'hE:  read_mux_le =   ARM_CMSDK_CM0_SYSCTRL_CID2;  //0xFF8 Component ID 2
+          4'hF:  read_mux_le =   ARM_CMSDK_CM0_SYSCTRL_CID3;  //0xFFC Component ID 3
+          4'h0, 4'h1, 4'h2,4'h3: read_mux_le = {32{1'b0}};
+          default: read_mux_le = {32{1'bx}};
+         endcase
+     end
+     else begin
+        read_mux_le = {32{1'b0}};
+     end
+    end
+  1'b0:// read_enable is not active
+    begin
+    read_mux_le = {32{1'b0}};
+    end
+  default:
+    read_mux_le = {32{1'bx}};
+  endcase
+  end
+
+  // endian conversion
+  always @(bigendian or reg_hsize or read_mux_le or HWDATA)
+  begin
+    if ((bigendian)&(reg_hsize==2'b10))
+      begin
+      read_mux = {read_mux_le[ 7: 0],read_mux_le[15: 8],
+                  read_mux_le[23:16],read_mux_le[31:24]};
+      HWDATALE = {HWDATA[ 7: 0],HWDATA[15: 8],HWDATA[23:16],HWDATA[ 31:24]};
+      end
+    else if ((bigendian)&(reg_hsize==2'b01))
+      begin
+      read_mux = {read_mux_le[23:16],read_mux_le[31:24],
+                  read_mux_le[ 7: 0],read_mux_le[15: 8]};
+      HWDATALE = {HWDATA[23:16],HWDATA[ 31:24],HWDATA[ 7: 0],HWDATA[15: 8]};
+      end
+    else
+      begin
+      read_mux = read_mux_le;
+      HWDATALE = HWDATA;
+      end
+  end
+  // ----------------------------------------------------------
+  // Remap register
+  // ----------------------------------------------------------
+  wire      reg_remap_write;
+  assign    reg_remap_write = reg_write_enable &
+       (reg_addr[11:2]  == 10'h000) & reg_byte_strobe[0];
+
+  //  registering stage
+  always @(posedge HCLK or negedge HRESETn)
+  begin
+    if (~HRESETn)
+      reg_remap <= 1'b1;
+    else if (reg_remap_write)
+      reg_remap <= HWDATALE[0];
+  end
+
+  // ----------------------------------------------------------
+  // PMUENABLE register
+  // ----------------------------------------------------------
+
+`ifdef  CORTEX_M0DESIGNSTART
+  // Power management unit not available with Cortex-M0 DesignStart.
+  // PMU control is disabled
+  assign    reg_pmuenable = 1'b0;
+`else
+  // Normal Cortex-M0 can have a programmable PMU
+  wire      reg_pmuenable_write;
+  assign    reg_pmuenable_write = reg_write_enable &
+       (reg_addr[11:2]  == 10'h001) & reg_byte_strobe[0];
+
+  //  registering stage
+  always @(posedge HCLK or negedge HRESETn)
+  begin
+    if (~HRESETn)
+      reg_pmuenable <= 1'b0;
+    else if (reg_pmuenable_write)
+      reg_pmuenable <= HWDATALE[0];
+  end
+`endif
+
+  // ----------------------------------------------------------
+  // LOCKUPRESETEN register
+  // ----------------------------------------------------------
+  wire      reg_lockupreset_write;
+  assign    reg_lockupreset_write = reg_write_enable &
+       (reg_addr[11:2]  == 10'h002) & reg_byte_strobe[0];
+
+  //  registering stage
+  always @(posedge HCLK or negedge HRESETn)
+  begin
+    if (~HRESETn)
+      reg_lockupreset <= 1'b0;
+    else if (reg_lockupreset_write)
+      reg_lockupreset <= HWDATALE[0];
+  end
+
+  // ----------------------------------------------------------
+  // Reset information register
+  // ----------------------------------------------------------
+
+  wire      reg_resetinfo_write;
+  assign    reg_resetinfo_write = reg_write_enable &
+       (reg_addr[11:2]  == 10'h004) & reg_byte_strobe[0];
+
+  // capture reset information
+  wire [2:0] nxt_resetinfo;
+  // Write 1 to clear
+  assign    nxt_resetinfo[0] = ((~(reg_resetinfo_write & HWDATALE[0])) & reg_resetinfo[0]) | SYSRESETREQ;
+  assign    nxt_resetinfo[1] = ((~(reg_resetinfo_write & HWDATALE[1])) & reg_resetinfo[1]) | WDOGRESETREQ;
+  assign    nxt_resetinfo[2] = ((~(reg_resetinfo_write & HWDATALE[2])) & reg_resetinfo[2]) | (reg_lockupreset & LOCKUP);
+
+  // Enable flip-flop only if it should be updated to reduce power
+  wire      reg_resetinfo_en;
+  assign    reg_resetinfo_en = reg_resetinfo_write | SYSRESETREQ | WDOGRESETREQ | (reg_lockupreset & LOCKUP);
+
+  //  registering stage
+  always @(posedge FCLK or negedge PORESETn)
+  begin
+    if (~PORESETn)
+      reg_resetinfo <= 3'b000;
+    else if (reg_resetinfo_en)
+      reg_resetinfo <= nxt_resetinfo;
+  end
+
+  // Connect to higher level
+  assign REMAP     = reg_remap;
+  assign PMUENABLE = reg_pmuenable;
+  assign LOCKUPRESET = reg_lockupreset;
+
+  assign HREADYOUT = 1'b1;
+  assign HRDATA    = read_mux;
+  assign HRESP     = 1'b0;
+
+endmodule
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_uart_capture.v b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_uart_capture.v
new file mode 100644
index 0000000..cbc46f7
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/cmsdk_uart_capture.v
@@ -0,0 +1,251 @@
+//-----------------------------------------------------------------------------
+// updated UART RXD capture with file logging
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : A device to capture serial data
+//-----------------------------------------------------------------------------
+// This module assume CLK is same frequency as baud rate.
+// In the example UART a test mode is used to enable data output as maximum
+// speed (PCLK).  In such case we can connect CLK signal directly to PCLK.
+// Otherwise, if the UART baud rate is reduced, the CLK rate has to be reduced
+// accordingly as well.
+//
+// This module stop the simulation when character 0x04 is received.
+// An output called SIMULATION_END is set for 1 cycle before simulation is
+// terminated to allow other testbench component like profiler (if any)
+// to output reports before the simulation stop.
+//
+// This model also support ESCAPE (0x1B, decimal 27) code sequence
+// ESC - 0x10 - XY    Capture XY to AUXCTRL output
+// ESC - 0x11         Set DEBUG_TESTER_ENABLE to 1
+// ESC - 0x12         Clear DEBUG_TESTER_ENABLE to 0
+
+
+module cmsdk_uart_capture
+  #(parameter LOGFILENAME = "uart.log",
+    parameter VERBOSE = 0)
+  (
+  input  wire       RESETn,              // Power on reset
+  input  wire       CLK,                 // Clock (baud rate)
+  input  wire       RXD,                 // Received data
+  output wire       SIMULATIONEND,       // Simulation end indicator
+  output wire       DEBUG_TESTER_ENABLE, // Enable debug tester
+  output wire [7:0] AUXCTRL);            // Auxiliary control
+
+  reg [8:0]        rx_shift_reg;
+  wire [8:0]       nxt_rx_shift;
+  reg [6:0]        string_length;
+  reg [7:0]        tube_string [127:0];
+  reg [7:0]        text_char;
+  integer          i;
+  reg              nxt_end_simulation;
+  reg              reg_end_simulation;
+  wire             char_received;
+  reg              reg_esc_code_mode;  // Escape code mode
+  reg              reg_aux_ctrl_mode;  // Auxiliary control capture mode
+  reg [7:0]        reg_aux_ctrl;       // Registered Auxiliary control
+  reg              reg_dbgtester_enable;
+
+   integer        mcd;       // channel descriptor for log file output
+   reg [40*8-1:0] log_file;  // File name can't be > *40* characters
+
+`define UartSTDOUT 32'h00000001
+   initial
+     begin
+       $timeformat(-9, 0, " ns", 14);
+       log_file = LOGFILENAME;
+       mcd = $fopen(log_file);
+       mcd = mcd | `UartSTDOUT; // always echo to console
+       if(mcd == 0) begin
+         $fwrite(mcd,"tarmac: Error, zero returned in response to $fopen\n");
+         $finish(2);
+       end
+       $fwrite(mcd,"uartcapture: Generating output file %0s using MCD %x @ %m\n",
+              log_file, mcd);
+     end
+
+  // Receive shift register
+  assign nxt_rx_shift  = {RXD,rx_shift_reg[8:1]};
+  assign char_received = (rx_shift_reg[0]==1'b0);
+
+  always @(posedge CLK or negedge RESETn)
+  begin
+    if (~RESETn)
+      rx_shift_reg <= {9{1'b1}};
+    else
+      if (rx_shift_reg[0]==1'b0) // Start bit reach bit[0]
+        rx_shift_reg <= {9{1'b1}};
+      else
+        rx_shift_reg <= nxt_rx_shift;
+  end
+
+  // Escape code mode register
+  always @(posedge CLK or negedge RESETn)
+  begin
+    if (~RESETn)
+      reg_esc_code_mode <= 1'b0;
+    else // Set to escape mode if ESC code is detected
+      if (char_received & (reg_esc_code_mode==1'b0) & (rx_shift_reg[8:1]==8'h1B))
+        reg_esc_code_mode <= 1'b1;
+      else if (char_received)
+        reg_esc_code_mode <= 1'b0;
+  end
+
+  // Aux Ctrl capture mode register
+  always @(posedge CLK or negedge RESETn)
+  begin
+    if (~RESETn)
+      reg_aux_ctrl_mode <= 1'b0;
+    else // Set to Aux control capture mode if ESC-0x10 sequence is detected
+      if (char_received & (reg_esc_code_mode==1'b1) & (rx_shift_reg[8:1]==8'h10))
+        reg_aux_ctrl_mode <= 1'b1;
+      else if (char_received)
+        reg_aux_ctrl_mode <= 1'b0;
+  end
+
+  // Aux Ctrl capture data register
+  always @(posedge CLK or negedge RESETn)
+  begin
+    if (~RESETn)
+      reg_aux_ctrl <= {8{1'b0}};
+    else // Capture received data to Aux control output if reg_aux_ctrl_mode is set
+      if (char_received & (reg_aux_ctrl_mode==1'b1))
+        reg_aux_ctrl <= rx_shift_reg[8:1];
+  end
+
+  assign AUXCTRL = reg_aux_ctrl;
+
+  // Debug tester enable
+  always @(posedge CLK or negedge RESETn)
+  begin
+    if (~RESETn)
+      reg_dbgtester_enable <= 1'b0;
+    else // Enable debug tester if ESC-0x11 sequence is detected
+      if (char_received & (reg_esc_code_mode==1'b1) & (rx_shift_reg[8:1]==8'h11))
+        reg_dbgtester_enable <= 1'b1;
+      else if (char_received & (reg_esc_code_mode==1'b1) & (rx_shift_reg[8:1]==8'h12))
+        // Disable debug tester if ESC-0x12 sequence is detected
+        reg_dbgtester_enable <= 1'b0;
+  end
+
+  assign DEBUG_TESTER_ENABLE = reg_dbgtester_enable;
+
+  // Message display
+  always @ (posedge CLK or negedge RESETn)
+  begin: p_tube
+  if (~RESETn)
+    begin
+    string_length = 7'b0;
+    nxt_end_simulation <= 1'b0;
+    for (i=0; i<= 127; i=i+1) begin
+       tube_string [i] = 8'h00;
+    end
+    end
+  else
+    if (char_received)
+        begin
+        if ((rx_shift_reg[8:1]==8'h1B) | reg_esc_code_mode | reg_aux_ctrl_mode )
+          begin
+          // Escape code, or in escape code mode
+          // Data receive can be command, aux ctrl data
+          // Ignore this data
+          end
+        else if  (rx_shift_reg[8:1]==8'h04) // Stop simulation if 0x04 is received
+          nxt_end_simulation <= 1'b1;
+        else if ((rx_shift_reg[8:1]==8'h0d)|(rx_shift_reg[8:1]==8'h0A))
+          // New line
+          begin
+          tube_string[string_length] = 8'h00;
+          if (VERBOSE != 0)
+            $fwrite(mcd,"%t UART<%m>: ",$time);
+
+          for (i=0; i<= string_length; i=i+1)
+            begin
+            text_char = tube_string[i];
+            $fwrite(mcd,"%s",text_char);
+            end
+
+          $fwrite(mcd,"\n");
+          string_length = 7'b0;
+          end
+        else
+          begin
+          tube_string[string_length] = rx_shift_reg[8:1];
+          string_length = string_length + 1;
+          if (string_length >79) // line too long, display and clear buffer
+            begin
+            tube_string[string_length] = 8'h00;
+            if (VERBOSE != 0)
+              $fwrite(mcd,"%t UART<%m>: ",$time);
+
+            for (i=0; i<= string_length; i=i+1)
+              begin
+              text_char = tube_string[i];
+              $fwrite(mcd,"%s",text_char);
+              end
+
+            $fwrite(mcd,"\n");
+            string_length = 7'b0;
+
+            end
+
+          end
+
+        end
+
+  end // p_TUBE
+
+  // Delay for simulation end
+  always @ (posedge CLK or negedge RESETn)
+  begin: p_sim_end
+  if (~RESETn)
+    begin
+    reg_end_simulation <= 1'b0;
+    end
+  else
+    begin
+    reg_end_simulation  <= nxt_end_simulation;
+    if (reg_end_simulation==1'b1)
+      begin
+        if (VERBOSE != 0)
+          $fwrite(mcd,"%t UART<%m>: Test Ended\n",$time);
+        else
+          $fwrite(mcd,"Test Ended\n");
+      $stop;
+      end
+    end
+  end
+
+  assign SIMULATIONEND = nxt_end_simulation & (~reg_end_simulation);
+
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/README.txt b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/README.txt
new file mode 100755
index 0000000..8155176
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/README.txt
@@ -0,0 +1,66 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------
+//  Abstract            : AHB BusMatrix top level README file
+//------------------------------------------------------------------------------
+
+Introduction
+------------
+
+This directory contains the AHB BusMatrix component.
+
+cmsdk_ahb_busmatrix/bin/BuildBusMatrix.pl
+  The AHB BusMatrix is a configurable component. The configuration
+  process is handled by a Perl script, located in bin/BuildBusMatrix.pl
+
+cmsdk_ahb_busmatrix/verilog/src
+  The source code of the configurable AHB Bus matrix is located in
+  verilog/src directory. Do not use the Verilog files in this directory
+  directly.
+
+cmsdk_ahb_busmatrix/verilog/built
+  After configuration process, the Verilog files generated will be stored
+  in verilog/built directory.
+
+cmsdk_ahb_busmatrix/xml/
+  During the configuration process, the configuration of the AHB BusMatrix
+  can be controlled by command line options or by an XML file.
+  Example XML files can be found in the xml directory.
+
+cmsdk_mtx4x2/verilog/
+  A preconfigured version of AHB Bus matrix for the example Cortex-M3/M4
+  system is prepared in the cmsdk_mcu_mtx4x2 directory. The configuration
+  of this bus matrix can be found in cmsdk_mcu_mtx4x2/xml/
+
+Several example AHB Bus Matrix configuration XML files are provided.
+You can generate the AHB bus matrix RTL by running the following command:
+
+> cd logical/cmsdk_ahb_busmatrix
+> bin/BuildBusMatrix.pl -xmldir xml -cfg example2x3_full.xml -over -verbose
+
+
+Please refer to the Cortex-M System Design Kit Technical Reference Manual for
+further details on the use of this component.
+
+======================== End of README.txt ===========================
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/BuildBusMatrix.pl b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/BuildBusMatrix.pl
new file mode 100755
index 0000000..73aa34e
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/BuildBusMatrix.pl
@@ -0,0 +1,2975 @@
+eval "exec perl -w -S $0 $@" # -*- Perl -*-
+  if ($running_under_some_sh);
+  undef ($running_under_some_sh);
+
+################################################################################
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#   (C) COPYRIGHT 2001-2013,2017 Arm Limited or its affiliates.
+#       ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+################################################################################
+# Version and Release Control Information:
+#
+#      File Name           : $RCSfile: BuildBusMatrix.pl,v $
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+#
+#      Revision            : $Revision: 371321 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#
+################################################################################
+
+################################################################################
+# Purpose             : Builds particular configurations of the AHB BusMatrix
+#
+################################################################################
+# Usage:
+#    Builds an AHB Bus Matrix component with a given number of input ports,
+#    a given number of output ports, a particular arbitration scheme and ARM
+#    processor interface.
+#
+# Notes: This version of the script uses an interface information hash with
+#         the following structure:
+#
+#         my %InterfaceInfo = (
+#                               SLAVES  => {
+#                                 SI<n> => {
+#                                   NAME => '@name',
+#                                   CONNECTIONS => [ @MI<n> ... ],
+#                                   ADDRESS_MAP => {
+#                                     NORMAL => [ <address_info> ... ],
+#                                     REMAP => [ <remap_info> ... ]
+#                                   }
+#                                 }
+#                               },
+#
+#                               MASTERS => {
+#                                 MI<n> => {
+#                                   NAME        => '@name',
+#                                   CONNECTIONS => [ @SI<n> ... ]
+#                                 }
+#                               }
+#                             );
+#
+# Options: See the ShowHelp() function.
+#
+################################################################################
+
+# ------------------------------------------------------------------------------
+#   Load PERL libraries
+# ------------------------------------------------------------------------------
+
+use strict;
+use warnings;
+use Getopt::Long;
+
+use lib 'bin/lib';                     # Collapse namespace 'lib::'
+use xmlparser;                         # Load the XML parser module
+
+use Data::Dumper;
+use Storable 'dclone';
+use File::Spec;
+
+# ------------------------------------------------------------------------------
+#   Declare global variables
+# ------------------------------------------------------------------------------
+
+# General script variables
+my $Debug         = 0;
+my $RenderDebug   = 0;
+my $Errors        = 0;
+my $HdlType       = 'verilog';
+my $HdlExt        = '.v';
+my $Connections   = '';
+my $Sparse        = 0;
+my $DefaultSlave  = 'cmsdk_ahb_bm_default_slave';
+
+# Parameter legal ranges
+my $MinSlaveIF    = 1;
+my $MaxSlaveIF    = 16;
+my $MinMasterIF   = 1;
+my $MaxMasterIF   = 16;
+my $DataWidths    = '32|64';
+my $MinNameLength = 1;
+my $MaxNameLength = 128;
+my $MinUserWidth  = 0;
+my $MaxUserWidth  = 32;
+my $MinAddrWidth  = 32;
+my $MaxAddrWidth  = 64;
+
+# Interface ID tags (updated later)
+my $IdWidthMI = 4;
+my $IdWidthSI = 4;
+
+# Interface information hash
+my %InterfaceInfo = ();
+
+# A processed version needed for the differences in IPXact
+my %InterfaceInfoIPXact = ();
+
+# Remap state information hash
+my %RemapStates = ();
+
+# Address space information hash
+my %AddressSpace = ();
+
+# Get the run date and correct offset
+my ( $Sec, $Min, $Hour, $Mday, $Mon, $Year ) = localtime(time); $Year+=1900; $Mon++;
+
+# Filename variables
+my %FileList = ();
+my ($Scriptname) = $0 =~ /([\w\.]+)$/;
+
+# Hash for search and replacement of macros
+my %Macro = ();
+
+# Hash for processing text sections
+my %Section = ();
+
+# Arrays of instance names
+my @MatrixDecodeNames = ();
+my @OutputArbNames    = ();
+my @OutputStageNames  = ();
+
+# Hash for remapping information
+my %RemapInfo = ();
+
+# Hash array of name aliases
+my %NameAliases = ();
+
+# IP-XACT component name - default value is set later
+my $ComponentName = '';
+
+
+# ------------------------------------------------------------------------------
+#   Check for pre-requisites
+# ------------------------------------------------------------------------------
+
+# Check for the supported OS platform(s)
+unless ( $^O =~ /(solaris|linux)\b/ ) {
+  die "Error: This script does not support the '$^0' OS!\n\n";
+}
+
+# Check for the required version of PERL
+unless ( $] >= 5.005 ) {
+  die "Error: This script requires PERL version >= 5.005!\n\n";
+}
+
+# Check system clock for inappropriate roll-back - the date is used
+#  in the copyright field of file headers
+unless ( $Year >= 2013 ) {
+  warn "Warning: The system clock is incorrectly set to '$Year'!\n";
+  $Year = 2013;
+}
+
+
+# ------------------------------------------------------------------------------
+#   Parse the command line
+# ------------------------------------------------------------------------------
+
+# Default values for command-line options
+my $SlaveInterfaces      = 1;
+my $MasterInterfaces     = 1;
+my $Connectivity         = 'full';
+my $ArbiterType          = 'fixed';
+my $ArchitectureType     = 'ahb2';
+my $XmlConfigFile        = '';
+my $RoutingDataWidth     = 32;
+my $RoutingAddressWidth  = 32;
+my $UserSignalWidth      = 0;
+my $OutputArbName        = 'cmsdk_ahb_bm_output_arb';
+my $OutputStageName      = 'cmsdk_ahb_bm_output_stage';
+my $MatrixDecodeName     = 'cmsdk_ahb_bm_decode';
+my $InputStageName       = 'cmsdk_ahb_bm_input_stage';
+my $BusMatrixName        = '';                  # Default value is set later
+my $Help                 = 0;
+my $Verbose              = 0;
+my $SourceDir            = "./$HdlType/src";
+my $TargetDir            = "./$HdlType/built";
+my $IPXactSourceDir      = "./ipxact/src";
+my $IPXactTargetDir      = "./ipxact/built";
+my $XmlDir               = './xml';
+my $Overwrite            = 0;
+my $Timescales           = 0;
+my $NoTimescales         = 0;
+my $XmlTimescales        = 0;
+my $CheckMode            = 0;
+my $IPXact               = 0;
+
+
+# Display usage message if requested
+if ( grep(/^-?-help$/, @ARGV) ) { ShowHelp(); }
+
+# Get command line arguments
+GetOptions( 'inports=i'      => \$SlaveInterfaces,
+            'outports=i'     => \$MasterInterfaces,
+            'connectivity=s' => \$Connectivity,
+            'arb=s'          => \$ArbiterType,
+            'arch=s'         => \$ArchitectureType,
+            'cfg=s'          => \$XmlConfigFile,
+            'datawidth=i'    => \$RoutingDataWidth,
+            'addrwidth=i'    => \$RoutingAddressWidth,
+            'userwidth=i'    => \$UserSignalWidth,
+            'outputarb=s'    => \$OutputArbName,
+            'outputstage=s'  => \$OutputStageName,
+            'matrixdecode=s' => \$MatrixDecodeName,
+            'inputstage=s'   => \$InputStageName,
+            'busmatrix=s'    => \$BusMatrixName,
+            'verbose'        => \$Verbose,
+            'srcdir=s'       => \$SourceDir,
+            'tgtdir=s'       => \$TargetDir,
+            'ipxactsrcdir=s' => \$IPXactSourceDir,
+            'ipxacttgtdir=s' => \$IPXactTargetDir,
+            'xmldir=s'       => \$XmlDir,
+            'overwrite'      => \$Overwrite,
+            'timescales'     => \$Timescales, 'notimescales'   => \$NoTimescales,
+            'check'          => \$CheckMode,
+            'ipxact'         => \$IPXact,
+            'debug'          => \$Debug,
+            'renderdebug'    => \$RenderDebug,
+          );
+
+if ( $Timescales and $NoTimescales ) {
+  die "Error: Can't use --timescales and --notimescales at the same time\n";
+}
+
+# Display script header when in verbose mode
+if ( $Verbose ) {
+  printf "\n==============================================================\n" .
+         "=  The confidential and proprietary information contained in this file may\n" .
+         "=  only be used by a person authorised under and to the extent permitted\n" .
+         "=  by a subsisting licensing agreement from Arm Limited or its affiliates.\n" .
+         "= \n" .
+         "=    (C) COPYRIGHT 2001-2013,2017 Arm Limited or its affiliates.\n" .
+         "=        ALL RIGHTS RESERVED\n" .
+         "= \n" .
+         "=  This entire notice must be reproduced on all copies of this file\n" .
+         "=  and copies of this file may only be made by a person if such person is\n" .
+         "=  permitted to do so under the terms of a subsisting license agreement\n" .
+         "=  from Arm Limited or its affiliates.\n" .
+         "=\n" .
+         "= $Scriptname\n" .
+         "=\n" .
+         "= Run Date : %02d/%02d/%04d %02d:%02d:%02d" .
+         "\n==============================================================\n\n",
+         $Mday, $Mon, $Year, $Hour, $Min, $Sec;
+}
+
+
+# ------------------------------------------------------------------------------
+#   Parse the configuration file if specified, or initialise by elaborating
+#    the '-connectivity' command-line argument and calculating an address map
+# ------------------------------------------------------------------------------
+
+if ( $XmlConfigFile ne '' ) {
+  # Conditionally prepend the XML directory path to the filename
+  if ( $XmlConfigFile !~ /^$XmlDir/ ) { $XmlConfigFile = "$XmlDir/$XmlConfigFile"; }
+  $XmlConfigFile = TidyPath($XmlConfigFile);
+
+  # Configure and run the XML parser
+  ProcessXmlConfigFile();
+} else {
+  # Translate into internal form, the design specified on the command line
+  InitialiseInterfaceInfo();
+}
+
+  # Do some preprocessing for IPXact generation
+  if ($IPXact) {
+     ProcessDataForIPXact();
+  }
+
+# Set the default top-level name if required
+if ( $BusMatrixName eq '' ) {
+  $BusMatrixName = sprintf( "cmsdk_ahb_busmatrix%dx%d%s%dd%da%du", $SlaveInterfaces,
+                     $MasterInterfaces, substr($ArbiterType, 0, 1),
+                     $RoutingDataWidth, $RoutingAddressWidth, $UserSignalWidth );
+}
+
+# Set the default IP-XACT component name if required
+if ( $ComponentName eq '' ) { $ComponentName = $BusMatrixName . "_lite"; }
+
+
+# ------------------------------------------------------------------------------
+#   Validate the parameters and abort if necessary
+# ------------------------------------------------------------------------------
+
+ValidateParameters();
+if ( $Errors ) { die "\nBuild not started because of parameter errors!\n\n"; }
+
+
+# ------------------------------------------------------------------------------
+#   Determine calculated parameters
+# ------------------------------------------------------------------------------
+
+SelectParameters();
+
+
+# ------------------------------------------------------------------------------
+#   Display settings when in verbose mode
+# ------------------------------------------------------------------------------
+
+my $XmlTimescales_interpreted = ($XmlTimescales eq 'yes' || $XmlTimescales eq 'no') ? $XmlTimescales
+                                                                                   : "no ($XmlTimescales)";
+
+if ( $Verbose ) {
+  printf "Script accepted the following parameters:\n\n" .
+         "%s - Top-level name          : '$BusMatrixName'\n" .
+         " - Slave interfaces        : $SlaveInterfaces\n" .
+         " - Master interfaces       : $MasterInterfaces\n" .
+         " - Architecture type       : '$ArchitectureType'\n" .
+         " - Arbitration scheme      : '$ArbiterType'\n" .
+         " - Address map             : %s\n" .
+         " - Connectivity mapping    : %s\n" .
+         " - Connectivity type       : %s\n" .
+         " - Routing data width      : $RoutingDataWidth\n" .
+         " - Routing address width   : $RoutingAddressWidth\n" .
+         " - User signal width       : $UserSignalWidth\n" .
+         " - Timescales              : ". ($Timescales ? "yes" :
+                                                         $NoTimescales ? "no" :
+                                                                         '') .
+                                       ( $XmlTimescales ? $Timescales || $NoTimescales ? " - overriding $XmlTimescales_interpreted setting from XML"
+                                                                                       : "$XmlTimescales_interpreted (from XML)"
+                                                         : '' ) .
+                                       ( ! ($XmlTimescales || $Timescales || $NoTimescales) ? 'yes (default)' : '') . "\n" .
+         " - Configuration directory : '$TargetDir'\n" .
+         " - Source directory        : '$SourceDir'\n" .
+         ($IPXact ?
+         " - IPXact target directory : '$IPXactTargetDir'\n" .
+         " - IPXact source directory : '$IPXactSourceDir'\n" : "") .
+         " - Overwrite mode          : %s\n\n",
+         ( $XmlConfigFile ne '' ) ? " - Configuration file      : '$XmlConfigFile'\n" : '',
+         ( $XmlConfigFile ne '' ) ? 'user defined' : 'calculated',
+         ( $Connectivity ne 'full' ) ? $Connections : 'automatic',
+         ( $Sparse ) ? 'sparse' : 'full',
+         ( $Overwrite ) ? 'enabled' : 'disabled';
+}
+
+
+# ------------------------------------------------------------------------------
+#   Expand template macros if not in check mode
+# ------------------------------------------------------------------------------
+
+unless ( $CheckMode ) { CreateBusMatrix(); }
+
+
+################################################################################
+### Subroutines and Functions ##################################################
+################################################################################
+
+# ------------------------------------------------------------------------------
+#   SelectParameters - Selects the corresponding parameter set according to
+#                       the fundamental specification
+# ------------------------------------------------------------------------------
+sub SelectParameters {
+
+  # Local variable(s)
+  my $Instance     = '';
+  my $Index        = 0;
+  my $Interface    = '';
+  my %Arbiter      = ( fixed => 'cmsdk_ahb_bm_fixed_arb', round => 'cmsdk_ahb_bm_round_arb', burst => 'cmsdk_ahb_bm_burst_arb' );
+  my $ArbType      = '';
+  my $OutType      = '';
+  my $BstrbWidth   = $RoutingDataWidth / 8;
+  my $MakefileName = 'makefile';
+  my $MkfileName   = 'cmsdk_ahb_busmatrix.mk';
+  my $IPXactFile_AHB2      = 'cmsdk_ahb_busmatrix_ipxact.xml';
+  my $IPXactFile_AHBLite   = 'cmsdk_ahb_busmatrix_lite_ipxact.xml';
+  my $Mappings     = $Connections;
+  my $Packing      = ' ' x 14;
+  my $Unmapping    = '';
+  my $RemapBit     = 0;
+  my $OpenBr       = '';
+  my $CloseBr      = '';
+  my @RemapBits    = ();
+
+  # Determine the connectivity type
+  $Sparse = IsSparse();
+
+  # Determine the slave interface ID width
+  $IdWidthSI = NumberOfDigits($SlaveInterfaces - 1, 2);
+
+  # Determine the master interface ID width, including an MSbit for
+  #  selecting the default slave
+  $IdWidthMI = NumberOfDigits($MasterInterfaces - 1, 2) + 1;
+
+  # Format the mappings
+  $Mappings =~ s/\n/\n\/\//g;
+
+  # Determine single entity filenames
+  #$FileList{$MkfileName} = $MkfileName;     # Note:Generation of ADK makefile is not required in BP210
+  #$FileList{$MakefileName} = $MakefileName; # Note:Generation of ADK makefile is not required in BP210
+  if ( $IPXact ) { $FileList{$ComponentName . '.xml'}      = $IPXactFile_AHBLite;  # Component already contains the -lite suffix or other name
+                   $FileList{$BusMatrixName . '.xml'}      = $IPXactFile_AHB2; }
+  $DefaultSlave = $BusMatrixName . '_default_slave';
+  $FileList{$BusMatrixName . $HdlExt} = 'cmsdk_ahb_busmatrix' . $HdlExt;
+  $FileList{$ComponentName . $HdlExt} = 'cmsdk_ahb_busmatrix_lite' . $HdlExt;
+  $FileList{$InputStageName . $HdlExt} = 'cmsdk_ahb_bm_input_stage' . $HdlExt;
+  $FileList{$DefaultSlave . $HdlExt} = 'cmsdk_ahb_bm_default_slave' . $HdlExt;
+
+  # Generate filenames and macro names for each instance of bm_decode
+  #  and process any REMAP declarations accordingly
+  $Section{'remap_used'} = '0';
+  $Section{'no_remap_used'} = '1';
+  for ( $Index = 0; $Index < $SlaveInterfaces; $Index++ ) {
+    $Interface = 'SI' . $Index;
+
+    $Instance = $MatrixDecodeName . $InterfaceInfo{SLAVES}{$Interface}{NAME};
+    $FileList{$Instance . $HdlExt} = 'cmsdk_ahb_bm_decode' . $HdlExt;
+    push @MatrixDecodeNames, $Instance;
+
+    $RemapInfo{$Interface}{REMAP_BITS} = [];
+    $RemapInfo{$Interface}{REMAP_WIDTH} = 0;
+    $RemapInfo{$Interface}{REMAP_MAPPING} = {};
+    @RemapBits = ();
+    for ( $RemapBit = 0; $RemapBit < 4; $RemapBit++ ) {
+      if ( ( grep /:remap$RemapBit:/,
+             @{ $InterfaceInfo{SLAVES}{$Interface}{ADDRESS_MAP}{REMAP} } ) ||
+           ( grep /:.*(del|_|,|\s)$RemapBit(_|,|\s|:|$)/,
+             @{ $InterfaceInfoIPXact{SLAVES}{$Interface}{ADDRESS_MAP}{NORMAL} } ) ) {
+        push @RemapBits, "REMAP[$RemapBit]";
+        push @{ $RemapInfo{$Interface}{REMAP_BITS} }, $RemapBit;
+        $RemapInfo{$Interface}{REMAP_MAPPING}{$RemapBit} = $RemapInfo{$Interface}{REMAP_WIDTH};
+        $RemapInfo{$Interface}{REMAP_WIDTH}++;
+        $Section{'remap_used'} = '1';
+        $Section{'no_remap_used'} = '0';
+      }
+    }
+    $OpenBr = ( $RemapInfo{$Interface}{REMAP_WIDTH} > 1 ) ? '{ ' : '';
+    $CloseBr = ( $RemapInfo{$Interface}{REMAP_WIDTH} > 1 ) ? ' }' : '';
+    $RemapInfo{$Interface}{REMAP_PORT} = $OpenBr . join( ', ', reverse @RemapBits ) . $CloseBr;
+  }
+
+  print "RemapInfo:\n" if $Debug;
+  print Dumper(\%RemapInfo) if $Debug;
+
+
+  # Determine names for the output_arb and output_stage instances
+  if ( $Sparse ) {
+
+    # Generate filenames and macro names for each instance of output_stage and
+    #  output_arb modules
+    for ( $Index = 0; $Index < $MasterInterfaces; $Index++ ) {
+      $Interface = 'MI' . $Index;
+
+      # If the current output stage has only one connection, then override
+      #  the template selection for the arbiter type and output stage
+      $ArbType = $Arbiter{$ArbiterType}; $OutType = 'cmsdk_ahb_bm_output_stage';
+      unless ( @{ $InterfaceInfo{MASTERS}{$Interface}{CONNECTIONS} } > 1 ) {
+        $ArbType = 'cmsdk_ahb_bm_single_arb'; $OutType = 'cmsdk_ahb_bm_single_output_stage';
+      }
+
+      $Instance = $OutputArbName . $InterfaceInfo{MASTERS}{$Interface}{NAME};
+      $FileList{$Instance . $HdlExt} = $ArbType . $HdlExt;
+      push @OutputArbNames, $Instance;
+      $Instance = $OutputStageName . $InterfaceInfo{MASTERS}{$Interface}{NAME};
+      $FileList{$Instance . $HdlExt} = $OutType . $HdlExt;
+      push @OutputStageNames, $Instance;
+
+    }
+
+  } else {
+
+    # The same output_stage and output_arb modules are used in a fully connected
+    #  bus matrix
+    $FileList{$OutputArbName . $HdlExt} = $Arbiter{$ArbiterType} . ${HdlExt};
+    push @OutputArbNames, $OutputArbName;
+    $FileList{$OutputStageName . $HdlExt} = 'cmsdk_ahb_bm_output_stage' . ${HdlExt};
+    push @OutputStageNames, $OutputStageName;
+
+    # Initialise particular static instance names
+    $Macro{'output_arb_name'} = $OutputArbName;
+    $Macro{'output_stage_name'} = $OutputStageName;
+    $Macro{'output_stage_name_lc'} = lc($Macro{'output_stage_name'});
+
+  }
+
+  # Conditionally initialise the macro and section control hashes
+
+  # Determine architecture options
+  if ( $ArchitectureType =~ /^(v6|excl)$/ ){
+    $Section{'excl'}         = 1;
+    $Macro{'prot'}           = 5;
+    $Macro{'prot_v'}         = 6;
+    $Macro{'resp'}           = 2;
+    $Macro{'resp_v'}         = 3;
+    $Macro{'bin_resp_xfail'} = '100';
+  } else {
+    $Section{'excl'}         = 0;
+    $Macro{'prot'}           = 3;
+    $Macro{'prot_v'}         = 4;
+    $Macro{'resp'}           = 1;
+    $Macro{'resp_v'}         = 2;
+    $Macro{'bin_resp_xfail'} = 'xx';
+  }
+
+  # Determine response encoding
+  $Macro{'bin_resp_okay'}  = substr( '000', -$Macro{'resp_v'}, $Macro{'resp_v'} );
+  $Macro{'bin_resp_error'} = substr( '001', -$Macro{'resp_v'}, $Macro{'resp_v'} );
+  $Macro{'bin_resp_retry'} = substr( '010', -$Macro{'resp_v'}, $Macro{'resp_v'} );
+  $Macro{'bin_resp_split'} = substr( '011', -$Macro{'resp_v'}, $Macro{'resp_v'} );
+
+  # Determine HUNALIGN support and xUSER width
+  $Section{'unalign'} = ( $ArchitectureType =~ /^(v6|unalign)$/ ) ? 1 : 0;
+  $Section{'user'}    = ( $UserSignalWidth > 0 ) ? 1 : 0;
+
+  # Bus width fields
+  $Macro{'data'}    = $RoutingDataWidth - 1;
+  $Macro{'data_v'}  = $RoutingDataWidth;
+  $Macro{'addr'}    = $RoutingAddressWidth - 1;
+  $Macro{'addr_v'}  = $RoutingAddressWidth;
+  $Macro{'user'}    = $UserSignalWidth - 1;
+  $Macro{'user_v'}  = $UserSignalWidth;
+  $Macro{'bstrb'}   = $BstrbWidth - 1;
+  $Macro{'bstrb_v'} = $BstrbWidth;
+
+  $Macro{'address_space_range'} = $RoutingAddressWidth >= 40 ? (2**($RoutingAddressWidth-40) )."T" :
+                                  $RoutingAddressWidth >= 30 ? (2**($RoutingAddressWidth-30) )."G" :
+                                  $RoutingAddressWidth >= 20 ? (2**($RoutingAddressWidth-20) )."M" :
+                                  $RoutingAddressWidth >= 10 ? (2**($RoutingAddressWidth-10) )."K" :
+                                                                2**$RoutingAddressWidth ;    # P and E not supported by IP-XACT standard
+
+  $Macro{'verilog_to_ipxact_path'} = File::Spec->abs2rel("$TargetDir/$BusMatrixName","$IPXactTargetDir/$BusMatrixName");
+
+  # Interface ID-width fields
+  $Macro{'idw_si'}   = $IdWidthSI - 1;
+  $Macro{'idw_si_v'} = $IdWidthSI;
+  $Macro{'idw_mi'}   = $IdWidthMI - 1;
+  $Macro{'idw_mi_v'} = $IdWidthMI;
+
+  # Determine default slave selection encoding (can be up to 5 bits)
+  $Macro{'dsid_bin'} = substr('10000', 0, $IdWidthMI);
+
+  # Determine a list of sub-module names
+  $Macro{'other_module_names'} = $DefaultSlave . " \\\n$Packing" .
+                                 $InputStageName . " \\\n$Packing" .
+                                 join( " \\\n$Packing", @MatrixDecodeNames ) .
+                                 " \\\n$Packing" .
+                                 join( " \\\n$Packing", @OutputArbNames ) .
+                                 " \\\n$Packing" .
+                                 join( " \\\n$Packing", @OutputStageNames );
+
+  # Initialise the static instance names
+  $Macro{'bus_matrix_name'} = $BusMatrixName;
+  $Macro{'input_stage_name'} = $InputStageName;
+  $Macro{'output_arb_stemname'} = $OutputArbName;
+  $Macro{'output_stage_stemname'} = $OutputStageName;
+  $Macro{'matrix_decode_stemname'} = $MatrixDecodeName;
+  $Macro{'component_name'} = $ComponentName;
+
+  # Miscellaneous fields
+  $Macro{'copyright_year'} = $Year;
+  $Macro{'timescale_directive'} = ( $NoTimescales || ( ($XmlTimescales eq 'no') && !$Timescales )) ? '' : "\n`timescale 1ns/1ps\n"; # On by default on CMSDK
+  $Macro{'arbiter_type'} = $ArbiterType;
+  $Macro{'architecture_type'} = $ArchitectureType;
+  $Macro{'total_si'} = $SlaveInterfaces;
+  $Macro{'total_mi'} = $MasterInterfaces;
+  $Macro{'connectivity'} = ( $Sparse ) ? 'sparse' : 'full';
+  $Macro{'mappings'} = ( $Sparse ) ? $Mappings :
+    sprintf("S<0..%d> -> M<0..%d>", $SlaveInterfaces - 1, $MasterInterfaces - 1);
+
+}
+
+
+# ------------------------------------------------------------------------------
+#   CreateBusMatrix - Creates a version of the Bus Matrix using the currently
+#                      selected parameter set
+# ------------------------------------------------------------------------------
+sub CreateBusMatrix {
+
+  # Local variable(s)
+  my $VariantDir          = "$TargetDir/$BusMatrixName";
+  my $IPXactVariantDir    = "$IPXactTargetDir/$BusMatrixName";
+  my @ExistingFiles       = glob( "$VariantDir/*" );
+  my @NewFiles            = keys( %FileList );
+  my $File                = '';
+
+  # Determine target preparation
+  if ( -e $VariantDir ) {
+    # Delete files when in overwrite mode, otherwise display an error
+    if ( $Overwrite ) {
+      foreach $File ( @ExistingFiles ) {
+        print "Deleting the '$File' file...\n" if ( $Verbose );
+        unlink $File or die "Error: Could not delete the file!\n\n";
+      }
+      print "\n" if ( @ExistingFiles and $Verbose );
+    } else {
+      die "Error: This variant of the bus matrix already exists!\n\n";
+    }
+  } else {
+    # Create the output directory for this Bus Matrix variant
+    mkdir $VariantDir or
+     die "Error: Could not create the output directory '$VariantDir'!\n\n";
+  }
+
+  if ($IPXact) {
+    @ExistingFiles       = glob( "$IPXactVariantDir/*" );
+    # Determine ipxact target preparation
+    if ( -e $IPXactVariantDir ) {
+      # Delete files when in overwrite mode, otherwise display an error
+      if ( $Overwrite ) {
+        foreach $File ( @ExistingFiles ) {
+          print "Deleting the '$File' file...\n" if ( $Verbose );
+          unlink $File or die "Error: Could not delete the file!\n\n";
+        }
+        print "\n" if ( @ExistingFiles and $Verbose );
+      } else {
+        die "Error: IPXact directory for this variant of the bus matrix already exists!\n\n";
+      }
+    } else {
+      # Create the output directory for this Bus Matrix variant
+      mkdir $IPXactVariantDir or
+       die "Error: Could not create the output directory '$IPXactVariantDir'!\n\n";
+    }
+  }
+
+  # Process all required files
+  print "Creating the bus matrix variant...\n\n" if ( $Verbose );
+  foreach $File ( @NewFiles ) {
+    print " - Rendering '$File'\n" if ( $Verbose );
+    if ($FileList{$File} =~ /.*ipxact\.xml$/) {
+       RenderFile( "$IPXactSourceDir/$FileList{$File}", "$IPXactVariantDir/$File" );
+    } else{
+       RenderFile( "$SourceDir/$FileList{$File}", "$VariantDir/$File" );
+    }
+  }
+
+  print "\nDone!\n\n" if ( $Verbose );
+
+}
+
+
+# ------------------------------------------------------------------------------
+#   RenderFile - Processes nested sections embedded hierarchically within the
+#                 specified template file, and expands macros accordingly. The
+#                 variables '$SlaveIF' and '$MasterIF' have a reserved use
+#                 depending upon the template being rendered. The variables may
+#                 be assigned values from 'in' or 'out' sections, or assigned
+#                 to a value extracted from a port-specific target filename. In
+#                 all other cases, these variables just retain their values
+# ------------------------------------------------------------------------------
+sub RenderFile {
+
+  # Passed parameter 1 is the template filename
+  my $TemplateFile = shift;
+  # Passed parameter 2 is the rendered output filename
+  my $RenderedFile = shift;
+
+  # Local variable(s)
+  my $TextLine     = '';
+  my $Field        = '';
+  my $Type         = '';
+  my $Level        = 0;
+  my $LineNum      = 0;
+  my $StartName    = '';
+  my $EndName      = '';
+  my @Section      = ( { LINE => 0, PTR => 0, NAME => '', COPIES => 0, COUNT => 0, EN => 1 } );
+  my ($SourceFile) = $TemplateFile =~ /([\w\.]+)$/;
+  my $RefId        = 0;
+  my $Interface    = '';
+  my $SlaveIF      = '';
+  my $MasterIF     = '';
+  my @MIRegions    = ();
+  my @FoundRegions = ();
+  my $Decodings    = 0;
+  my $Region       = 0;
+  my $AddrLo       = '';
+  my $AddrHi       = '';
+  my $Remapping    = '';
+  my $Unmapping    = '';
+  my $RemapBit     = 0;
+  my $Bit          = 0;
+  my $RemapState   = 0;
+  my @ActiveRemap  = ();
+  my $GotFirst     = 0;
+  my $Arbiters     = 'cmsdk_ahb_bm_burst_arb|cmsdk_ahb_bm_fixed_arb|cmsdk_ahb_bm_round_arb|cmsdk_ahb_bm_single_arb';
+  my @PortIds      = ();
+  my $TotalIds     = 0;
+  my @IPXactFiles  = ( $ComponentName, $BusMatrixName, $DefaultSlave, $InputStageName,
+                       @MatrixDecodeNames, @OutputArbNames, @OutputStageNames );
+  my %RemapTypes   = ( none => 'Static', alias => 'Alias', move => 'Unmoved' );
+  my $Debug        = $RenderDebug;
+  my @i_remapstate = ();
+
+
+  # Open the template file for reading
+  open( IN, "<$TemplateFile")
+    or die "Cannot open input file '$TemplateFile'!\n\n";
+
+  # Open the output file for writing the rendered text
+  open( OUT, ">$RenderedFile" )
+    or die "Cannot open output file '$RenderedFile'!\n\n";
+
+  # For the bm_decode template only, initialise specific macros and variables
+  if ( $TemplateFile =~ /cmsdk_ahb_bm_decode$HdlExt$/ ) {
+
+    # Set the current instance name for search and replacement, and also extract
+    #  the slave interface number for reference use
+    if ( ($SlaveIF) = $RenderedFile =~ /$MatrixDecodeName(\w+)$HdlExt$/ ) {
+      $Macro{'matrix_decode_name'} = $MatrixDecodeName . $SlaveIF;
+      $Macro{'matrix_decode_name_lc'} = lc($Macro{'matrix_decode_name'});
+      $SlaveIF = $NameAliases{$SlaveIF} if ( $XmlConfigFile ne '' );
+    }
+
+    # Initialise macros for search and replace, then determine if the map or
+    #  remap section is to be processed
+    $Section{'remap'} = 0;
+    $Macro{'idw_remap'} = '';
+    $Macro{'idw_remap_v'} = '';
+    $Macro{'bin_remapstate'} = '';
+    $Macro{'remapping_vector'} = '';
+    $Macro{'region_type'} = '';
+    if ( $RemapInfo{$SlaveIF}{REMAP_WIDTH} > 0 ) {
+      $Section{'remap'} = 1;
+      $Macro{'idw_remap'} = $RemapInfo{$SlaveIF}{REMAP_WIDTH} - 1;
+      $Macro{'address_map'} = '';
+      $Macro{'mdelse'} = '';
+      $Macro{'mem_lo'} = '';
+      $Macro{'mem_hi'} = '';
+      $Macro{'remapping_vector'} = $RemapInfo{$SlaveIF}{REMAP_PORT};
+    }
+    $Section{'map'} = ( $Section{'remap'} ) ? 0 : 1;
+
+  }
+
+  $Macro{'remap_name'} = '';
+  $Macro{'top_remap_bit'} = '';
+  $Macro{'top_remap_bitvalue'} = '';
+
+  # For a sparse bus matrix only, and concerning the output_arb or output_stage
+  #  only, set the current instance names for search and replacement. Also
+  #  extract the master interface number for reference use
+  if ( $Sparse ) {
+    if ( $TemplateFile =~ /($Arbiters)$HdlExt$/ ) {
+      if ( ($MasterIF) = $RenderedFile =~ /$OutputArbName(\w+)$HdlExt$/ ) {
+        $Macro{'output_arb_name'} = $OutputArbName . $MasterIF;
+        $MasterIF = $NameAliases{$MasterIF} if ( $XmlConfigFile ne '' );
+      }
+    } elsif ( $TemplateFile =~ /cmsdk_ahb_bm(_single)?_output_stage$HdlExt$/ ) {
+      if ( ($MasterIF) = $RenderedFile =~ /$OutputStageName(\w+)$HdlExt$/ ) {
+        $Macro{'output_stage_name'} = $OutputStageName . $MasterIF;
+        $Macro{'output_stage_name_lc'} = lc($Macro{'output_stage_name'});
+        $MasterIF = $NameAliases{$MasterIF} if ( $XmlConfigFile ne '' );
+        $MasterIF =~ /([0-9]+)$/;
+        $Macro{'output_arb_name'} = $OutputArbNames[$1];
+      }
+    }
+  }
+
+  # Convert default slave name
+  $Macro{'default_slave_name'} = $DefaultSlave;
+
+  # Process each line of the template file
+  while ( $TextLine = <IN> ) {
+
+    # Increment the source file line number
+    $LineNum++;
+
+    # Display each line of the template when in debug mode
+    print "$LineNum:" . $TextLine if ( $Debug );
+
+    # Expand any macro found in the line
+    unless ( $TextLine !~ /<<[^<>]+>>/ ) {
+
+      # Search for all replaceable macros within the line
+      while ( ($Field, $Type) = $TextLine =~ /(<<(\w+)>>)/gc ) {
+        if ( exists $Macro{$Type} ) {
+          $TextLine =~ s/$Field/$Macro{$Type}/;
+          # Display replacement token name when in debug mode
+          print "Replaced '$Field' on line $LineNum of '$SourceFile' with '$Macro{$Type}'...\n" if ( $Debug );
+        } else {
+          warn "Warning: Unidentified field '$Field' on line $LineNum of '$SourceFile'...\n";
+        }
+      }
+
+      # Extract sections and store the current file pointer position
+      if ( ($StartName) = $TextLine =~ /<<\s+start\s+(.+)\s+>>/ ) {
+
+        # Store the information onto the section stack
+        $Section[++$Level] = {
+                               LINE   => $LineNum,
+                               PTR    => tell(IN),
+                               NAME   => $StartName,
+                               COPIES => 0,
+                               COUNT  => 0,
+                               EN     => 1
+                             };
+
+        # Display section start name when in debug mode
+        print "Found start section $Level '$StartName'\n" if ( $Debug );
+
+        # Exclude child sections if the parent section was excluded, otherwise
+        #  conditionally process specificaly named sections of the template
+        if ( $Section[$Level - 1]{EN} == 0 ) {
+
+          $Section[$Level]{EN} = 0;
+
+        } elsif ( $StartName eq 'unalign' ) {  # Optional section
+
+          $Section[$Level]{EN} = ( $Section{'unalign'} ) ? -1 : 0;
+
+        } elsif ( $StartName eq 'excl' ) {  # Optional section
+
+          $Section[$Level]{EN} = ( $Section{'excl'} ) ? -1 : 0;
+
+        } elsif ( $StartName eq 'user' ) {  # Optional section
+
+          $Section[$Level]{EN} = ( $Section{'user'} ) ? -1 : 0;
+
+        } elsif ( $StartName eq 'map' ) {  # Optional section
+
+          $Section[$Level]{EN} = ( $Section{'map'} ) ? -1 : 0;
+
+        } elsif ( $StartName eq 'remap' ) {  # Optional section
+
+          $Section[$Level]{EN} = ( $Section{'remap'} ) ? -1 : 0;
+
+        } elsif ( $StartName eq 'vendor_extension' ) {  # Optional section
+
+          # This is a dummy section to reset NoMoreIPXactInSections
+          $Section[$Level]{EN} = 0;
+
+        } elsif ( $StartName eq 'topfile' ) {
+
+            if ($TemplateFile =~ /.*lite_ipxact\.xml$/) { # Lite has the component/wrapper as top, the other has the AHB2 main top
+               $Section[$Level]{EN} = ( $Macro{'filename'} eq $ComponentName ) ? -1 : 0;
+            } else {
+               $Section[$Level]{EN} = ( $Macro{'filename'} eq $BusMatrixName ) ? -1 : 0;
+            }
+
+        } elsif ( $StartName eq 'connection' ) {  # Optional section
+
+          # Determine template specific settings
+          if ( ($TemplateFile =~ /(cmsdk_ahb_busmatrix|$Arbiters|cmsdk_ahb_bm(_single)?_output_stage)$HdlExt$/) or
+               ($TemplateFile =~ /.*ipxact\.xml$/) ){
+            $SlaveIF = 'SI' . $Macro{'in'};
+          }
+          $Interface = ( $TemplateFile =~ /($Arbiters|cmsdk_ahb_bm(_single)?_output_stage)$HdlExt$/ ) ?
+            $MasterIF : 'MI' . $Macro{'out'};
+
+          # For sparse bus matrix only, check for at least one connection
+          $Section[$Level]{EN} = ( grep /^$Interface$/,
+            @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} } or !$Sparse ) ? -1 : 0;
+
+          # Indicate the first connection for the round_arb template
+          if ( $TemplateFile =~ /cmsdk_ahb_bm_round_arb$HdlExt$/ and $Section[$Level]{EN} ) {
+            $GotFirst = 1;
+          }
+
+        } elsif ( $StartName eq 'in' ) {  # Common macro
+
+          # Set the number of times this section will be repeated
+          $Section[$Level]{COPIES} = $SlaveInterfaces - 1;
+          $Section[$Level]{EN} = -1;
+
+          # Set the current slave interface number and macros
+          $Macro{'in'} = $Section[$Level]{COUNT};
+          $Interface = 'SI' . $Section[$Level]{COUNT};
+          $Macro{'si_name'} = $InterfaceInfo{SLAVES}{$Interface}{NAME};
+          $SlaveIF = $Interface;
+
+          # Determine template specific settings
+          if ( $TemplateFile =~ /($Arbiters|cmsdk_ahb_bm(_single)?_output_stage)$HdlExt$/ ) {
+            $Macro{'bin_in'} = ToBinary($Section[$Level]{COUNT}, $IdWidthSI);
+            $Macro{'rrelse'} = '';  # Used in round_arb only
+            $GotFirst = 0;
+          } elsif ( $TemplateFile =~ /cmsdk_ahb_busmatrix$HdlExt$/ ) {
+            # Determine if the remap section should be processed
+            $Section{'remap'} = 0;
+            $Macro{'remapping_vector'} = '';
+            if ( $RemapInfo{$Interface}{REMAP_WIDTH} > 0 ) {
+              $Section{'remap'} = 1;
+              $Macro{'remapping_vector'} = $RemapInfo{$Interface}{REMAP_PORT};
+            }
+            $Macro{'matrix_decode_name'} = $MatrixDecodeNames[$Section[$Level]{COUNT}];
+            $Macro{'matrix_decode_name_lc'} = lc($Macro{'matrix_decode_name'});
+          }
+
+        } elsif ( $StartName eq 'out' ) {  # Common macro
+
+          # Set the number of times this section will be repeated
+          $Section[$Level]{COPIES} = $MasterInterfaces - 1;
+          $Section[$Level]{EN} = -1;
+
+          # Set the current master interface number and macros
+          $Macro{'out'} = $Section[$Level]{COUNT};
+          $Interface = 'MI' . $Section[$Level]{COUNT};
+          $Macro{'mi_name'} = $InterfaceInfo{MASTERS}{$Interface}{NAME};
+          $Macro{'mi_name_lc'} = lc($Macro{'mi_name'});
+
+          # Determine template specific settings
+          if ( $TemplateFile =~ /cmsdk_ahb_bm_decode$HdlExt$/ ) {
+            $Macro{'bin_out'} = ToBinary($Section[$Level]{COUNT}, $IdWidthMI - 1);
+          } elsif ( $TemplateFile =~ /cmsdk_ahb_busmatrix$HdlExt$/ and $Sparse ) {
+            $Macro{'output_stage_name'} = $OutputStageNames[$Section[$Level]{COUNT}];
+            $Macro{'output_stage_name_lc'} = lc($Macro{'output_stage_name'});
+          }
+
+        } elsif ( $StartName eq 'rrin' ) {  # Used in round_arb and output_stage
+
+          # Determine the port ID enumeration and the total number
+          if ( $Sparse ) {
+            @PortIds = @{ $InterfaceInfo{MASTERS}{$MasterIF}{CONNECTIONS} };
+            @PortIds = grep s/^SI//, @PortIds; # Remove all 'SI' prefixes
+          } else {
+            @PortIds = ( 0..$SlaveInterfaces-1 );
+          }
+          $TotalIds = scalar @PortIds;
+
+          # Set the number of times this section will be repeated, and determine
+          #  the slave interface ID macros for the round_arb template
+          $Section[$Level]{COPIES} = $TotalIds - 1;
+          $Section[$Level]{EN} = -1;
+          $Macro{'rrin'} = $PortIds[$Section[$Level]{COUNT}];
+          $Macro{'bin_rrin'} = ToBinary($PortIds[$Section[$Level]{COUNT}], $IdWidthSI);
+
+        } elsif ( $StartName eq 'rridx' ) {  # Used in round_arb only
+
+          # Set the number of times this section will be repeated, and determine
+          #  the slave interface ID macros for the round_arb template
+          $Section[$Level]{COPIES} = $TotalIds - 2;
+          $Section[$Level]{EN} = -1;
+          $Macro{'rrelse'} = '';
+          $RefId = ($Section[$Level - 1]{COUNT} + 1) % $TotalIds;
+          $Macro{'rridx'} = $PortIds[$RefId];
+          $Macro{'bin_rridx'} = ToBinary($PortIds[$RefId], $IdWidthSI);
+
+        } elsif ( $StartName eq 'addr_map' ) {  # Used in bm_decode only
+
+          # For the current remapping state and master interface, determine which
+          #  address regions are visible
+          @MIRegions = grep /^$Interface:/,
+            @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} };
+
+          if ( $RemapState > 0 ) {  # Only when remapping is asserted non-zero
+
+            # Translate the active remapping bits into a regexp filter
+            @ActiveRemap = ();
+            for ($Bit = 0; $Bit < $RemapInfo{$SlaveIF}{REMAP_WIDTH}; $Bit++) {
+              if ( ($RemapState >> $Bit) & 0x01 ) {
+                push @ActiveRemap, @{ $RemapInfo{$SlaveIF}{REMAP_BITS} }[$Bit];
+              }
+            }
+            $RemapBit = join( '|', @ActiveRemap );
+
+            # Determine if there are activated remap regions, and if so, delete
+            #  normal but movable address map regions
+            if ( grep /^$Interface:remap($RemapBit):/,
+                   @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} } ) {
+              @MIRegions = grep !/^.*:move:/,
+                @MIRegions;
+
+            }
+
+          }
+          $Region = 0;
+
+          # Initialise macros in preparation for search and replace
+          $Macro{'mdelse'} = '';
+          $Macro{'address_map'} = '';
+          $Macro{'mem_lo'} = '';
+          $Macro{'mem_hi'} = '';
+
+          # Include this section if a mapping exists
+          $Section[$Level]{EN} = ( @MIRegions > 0 ) ? -1 : 0;
+
+        } elsif ( $StartName eq 'addr_map_ipxact' ) {
+
+          # All normal (non-remap) regions
+          @MIRegions = @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} };
+
+          # Initialise macros in preparation for search and replace
+          $Macro{'address_map'} = '';
+          $Macro{'mem_lo'} = '';
+          $Macro{'mem_hi'} = '';
+
+          # Include this section if a mapping exists
+          $Section[$Level]{EN} = ( @MIRegions > 0 ) ? -1 : 0;
+
+        } elsif ( $StartName eq 'segments' ) {
+
+          $Section[$Level]{COPIES} = scalar @{$AddressSpace{$Interface}} - 1;
+          $Section[$Level]{EN} = -1;
+
+          $Macro{'segment_name'} = '0x'.$AddressSpace{$Interface}[$Section[$Level]{COUNT}][0]."_".'0x'.$AddressSpace{$Interface}[$Section[$Level]{COUNT}][1];
+          $Macro{'segment_offset'} = '0x'.$AddressSpace{$Interface}[$Section[$Level]{COUNT}][0];
+          $Macro{'segment_range'} = '0x' . HexAdd(  '0'. HexSubstract($AddressSpace{$Interface}[$Section[$Level]{COUNT}][1],
+                                                                      $AddressSpace{$Interface}[$Section[$Level]{COUNT}][0]) , 1 );
+
+        } elsif ( $StartName eq 'addr_remap_and_normal_all_this_remap' ) {
+
+          @MIRegions = ();
+
+          # All remap regions
+          my @allRegions = @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} };
+          push (@allRegions, @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} });
+          foreach my $address_region ( @allRegions ) {
+
+            ($MasterIF, $Remapping, $AddrLo, $AddrHi, $Unmapping) = split(/:/,$address_region);
+
+            # get canonical name for remap state
+            my @bits = GetRemapBits ($Remapping, $Unmapping);
+            my $i_remap_name = join( '_' , @bits );
+            # Change ! to n
+            $i_remap_name =~ s/!/n/g ;
+
+            if ($Macro{'remap_name'} eq "remap_".$i_remap_name) {
+               push (@MIRegions,$address_region);
+            }
+          }
+
+          # Initialise macros in preparation for search and replace
+          $Macro{'address_map'} = '';
+          $Macro{'mem_lo'} = '';
+          $Macro{'mem_hi'} = '';
+
+          # Include this section if a mapping exists
+          $Section[$Level]{EN} = ( @MIRegions > 0 ) ? -1 : 0;
+
+        } elsif ( $StartName =~ /^(addr|remap)_region$/ ) {  # Used bm_decode and Spirit file only
+          #  Do not add an else if it is the first address/remap region
+          $Macro{'mdelse'} = ( $Decodings > 0 ) ? 'else ' : '';
+
+          # Conditionally reference the first address/remap region and extract its info
+          if ( @MIRegions > 0 ) {
+            # Set the number of copies
+            $Section[$Level]{COPIES} = scalar @MIRegions - 1;
+
+            ($MasterIF, $Remapping, $AddrLo, $AddrHi) = split(/:/, $MIRegions[$Region]);
+            $Macro{'address_block_name'} = 'Default';
+            $Macro{'address_block_remap'} = ($Remapping eq "move") ? 'TRUE' : 'FALSE';
+            $Macro{'base_address'} = "0x$AddrLo";
+            $Macro{'address_range'} = '0x' . HexSubstract($AddrHi, $AddrLo);
+            $Macro{'address_map'} = "0x$AddrLo-0x$AddrHi";
+            $Macro{'mem_lo'} = ToDecodeAddr($AddrLo);
+            $Macro{'mem_hi'} = ToDecodeAddr($AddrHi);
+
+            # Determine template specific settings
+            if ( $TemplateFile =~ /cmsdk_ahb_bm_decode$HdlExt$/ ) {
+              $Macro{'remapping_bit'} = '';
+              if ( $StartName eq 'remap_region' ) {
+                $Macro{'remapping_bit'} = substr($Remapping, 5, 1);
+                $Macro{'out'} = substr($MasterIF, 2);
+                $Macro{'bin_out'} = ToBinary( substr($MasterIF, 2), $IdWidthMI - 1);
+              } else {
+                $Macro{'region_type'} = $RemapTypes{$Remapping};
+              }
+            }
+            $Decodings++;
+          }
+          $Section[$Level]{EN} = -1;
+
+        } elsif ( $StartName =~ /^(addr|remap)_region_ipxact$/ ) {  # Used bm_decode and IPXACT file only
+
+          # Conditionally reference the first address/remap region and extract its info
+          if ( @MIRegions > 0 ) {
+
+            # Set the number of copies
+            $Section[$Level]{COPIES} = scalar @MIRegions - 1;
+            $Section[$Level]{EN} = -1;
+
+
+            ($MasterIF, $Remapping, $AddrLo, $AddrHi, $Unmapping) = split(/:/, $MIRegions[$Section[$Level]{COUNT}]);
+            $Macro{'address_block_name'} = 'Default';
+            $Macro{'address_block_remap'} = ($Remapping eq "move") ? 'TRUE' : 'FALSE';
+            $Macro{'base_address'} = "0x$AddrLo";
+            $Macro{'end_address'} = "0x$AddrHi";
+            $Macro{'address_range'} = '0x' . HexSubstract($AddrHi, HexSubstract($AddrLo,1));
+            $Macro{'address_map'} = "0x$AddrLo-0x$AddrHi";
+            $Macro{'mem_lo'} = ToDecodeAddr($AddrLo);
+            $Macro{'mem_hi'} = ToDecodeAddr($AddrHi);
+            $Macro{'out'} = substr($MasterIF, 2);
+            $Macro{'bin_out'} = ToBinary( substr($MasterIF, 2), $IdWidthMI - 1);
+            $Macro{'mi_name'} = $InterfaceInfo{MASTERS}{$MasterIF}{NAME};
+            $Macro{'mi_name_lc'} = lc($Macro{'mi_name'});
+
+            my @bits = GetRemapBits ($Remapping, $Unmapping);
+
+            my $remap_name = join( '_' , @bits );
+            # Change ! to n
+            $remap_name =~ s/!/n/g ;
+            $Macro{'remap_name'} = "remap_".$remap_name;
+
+            my $bit;
+            $Macro{'active_cond'} = '';
+
+            foreach $bit (@bits) {
+              if (substr($bit,0,1) eq '!') {
+                $Macro{'active_cond'} .= "\n" . ' 'x25 . ' & !remapping_dec['.$RemapInfo{$SlaveIF}{REMAP_MAPPING}{substr($bit,1)} .']';
+              } else {
+                $Macro{'active_cond'} .= "\n" . ' 'x25 . ' &  remapping_dec['.$RemapInfo{$SlaveIF}{REMAP_MAPPING}{$bit} .']';
+              }
+            }
+            $Macro{'remapping_bit'} = $remap_name;
+
+            $Section{'remap_static'} = @bits ? 0 : 1;
+            $Section{'remap_conditional'} = @bits ? 1 : 0;
+
+            if (@bits) {
+              if ( substr($Remapping,0,5) eq 'remap' ) {
+                $Macro{'region_type'} = "Remapped region, active when REMAP bitcombination is " . $remap_name;
+                $Macro{'region_type_sanitized'} = "Remapped_" . $remap_name;
+              } else {
+                $Macro{'region_type'} = "Removable region, active only when REMAP bitcombination is " . $remap_name;
+                $Macro{'region_type_sanitized'} = "Removable_" . $remap_name;
+              }
+            } else {
+              $Macro{'region_type'} = "Static";
+              $Macro{'region_type_sanitized'} = $Macro{'region_type'};
+            }
+
+          }
+
+        } elsif ( $StartName eq 'ipxact_remap_region' ) {  # Used in IPXact file only
+
+          # Get the remap regions for the current master interface
+          @MIRegions = grep /^$MasterIF:/,
+            @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} };
+
+          if ( @MIRegions > 0 ) {
+            $Section[$Level]{COPIES} = scalar @MIRegions - 1;
+            ($MasterIF, $Remapping, $AddrLo, $AddrHi) = split(/:/, $MIRegions[$Region]);
+            $Remapping =~ /([0-9])$/; $Remapping = $1;
+            $Macro{'address_block_name'} = 'Remap-Pin' . $Remapping;
+            $Macro{'base_address'} = "0x$AddrLo";
+            $Macro{'address_range'} = '0x' . HexSubstract($AddrHi, $AddrLo);
+            $Macro{'mem_lo'} = ToDecodeAddr($AddrLo);
+            $Macro{'mem_hi'} = ToDecodeAddr($AddrHi);
+          }
+          $Section[$Level]{EN} = ( $Macro{'base_address'} eq '' ) ? 0 : -1;
+
+        } elsif ( $StartName eq 'remap_state' ) {  # Used in bm_decode only
+
+          # Initialise macros in preparation for search and replace
+          $Macro{'address_map'} = '';
+          $Macro{'mem_lo'} = '';
+          $Macro{'mem_hi'} = '';
+          $Macro{'remapping_bit'} = '';
+          $Macro{'idw_remap_v'} = $RemapInfo{$SlaveIF}{REMAP_WIDTH};
+          $Macro{'bin_remapstate'} = ToBinary(0, $RemapInfo{$SlaveIF}{REMAP_WIDTH});
+
+          # Initialise variables used in remap processing and calculate the required
+          #  number of section copies
+          $RemapState = 0;
+          $Decodings = 0;
+          $Section[$Level]{COPIES} = (2 ** $RemapInfo{$SlaveIF}{REMAP_WIDTH}) - 1;
+          $Section[$Level]{EN} = -1;
+
+        } elsif ( $StartName eq 'remap_state_ipxact' ) {  # Used in ipxact only
+
+          @i_remapstate = keys( %RemapStates );
+          #$Macro{'remapping_bit'} = '';
+          #$Macro{'idw_remap_v'} = $RemapInfo{$SlaveIF}{REMAP_WIDTH};
+
+          # Initialise variables used in remap processing and calculate the required
+          #  number of section copies
+
+          $Section[$Level]{COPIES} = scalar @i_remapstate -1;
+          $Section[$Level]{EN} = ($Section{'remap_used'} > 0) ? -1 : 0;
+
+          $RemapState = $Section[$Level]{COUNT};
+
+          $Macro{'remap_name'} = $i_remapstate[$RemapState];
+          print "Processing remap state: $Macro{'remap_name'}\n" if ( $Debug );
+
+        } elsif ( $StartName eq 'remap_bit' ) {  # Used in bm_decode only
+
+          # Set the number of copies
+          $Section[$Level]{COPIES} = $RemapInfo{$SlaveIF}{REMAP_WIDTH} - 1;
+          $Section[$Level]{EN} = -1;
+          $Bit = 0;
+
+        } elsif ( $StartName eq 'remap_bit_ipxact' ) {  # Used in bm_decode only
+
+          # Set the number of copies
+          $Section[$Level]{COPIES} = scalar @{$RemapStates{$i_remapstate[$RemapState]}} -1;
+          $Section[$Level]{EN} = -1;
+          $Bit = 0;
+
+          my $r_bit = @{$RemapStates{$i_remapstate[$RemapState]}}[$Section[$Level]{COUNT}];
+
+          if (substr($r_bit,0,1) eq '!') {
+            $Macro{'top_remap_bit'} = substr($r_bit,1);
+            $Macro{'top_remap_bitvalue'} = 0;
+          } else {
+            $Macro{'top_remap_bit'} = $r_bit;
+            $Macro{'top_remap_bitvalue'} = 1;
+          }
+
+        } elsif ( $StartName eq 'addr_remap' ) {  # Used in bm_decode only
+
+          # For the current remapping state, determine which remap regions are
+          #  active per master interface
+          @MIRegions = ();
+          $Region = 0;
+          if ( ($RemapState >> $Bit) & 0x01 ) {
+            $RemapBit = @{ $RemapInfo{$SlaveIF}{REMAP_BITS} }[$Bit];
+            @MIRegions = grep /:remap$RemapBit:/,
+              @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} };
+          }
+
+          # Initialise macros in preparation for search and replace
+          $Macro{'mdelse'} = '';
+          $Macro{'address_map'} = '';
+          $Macro{'mem_lo'} = '';
+          $Macro{'mem_hi'} = '';
+
+          # Include this section if a mapping exists
+          $Section[$Level]{EN} = ( @MIRegions > 0 ) ? -1 : 0;
+
+        } elsif ( $StartName eq 'file' ) {  # Used in ipxact file only
+
+          $Macro{'filename'} = $IPXactFiles[0];
+          $Section[$Level]{COPIES} = scalar @IPXactFiles - 1;
+          $Section[$Level]{EN} = -1;
+
+          if ($TemplateFile =~ /.*lite_ipxact\.xml$/) {# Remove the wrapper from non-lite
+             #
+          } else {
+             # Don't include the lite wrapper in the AHB2 ipxact
+             if ( $Macro{'filename'} eq $ComponentName ) {
+                $Macro{'filename'} = $IPXactFiles[1];
+                ++$Section[$Level]{COUNT};
+             }
+          }
+
+        } elsif ( exists $Section{$StartName} ) {  # Optional section
+
+           $Section[$Level]{EN} = ( $Section{$StartName} ) ? -1 : 0;
+
+
+        }
+
+        # Display the number of section copies when in debug mode
+        print "Section copies: $Section[$Level]{COPIES}\n" if ( $Debug );
+
+      } elsif ( ($EndName) = $TextLine =~ /<<\s+end\s+(.+)\s+>>/ ) {
+
+        # Display section end name when in debug mode
+        print "Found end section $Level '$EndName'\n" if ( $Debug );
+
+        # Check for matching section markers
+        unless ( $EndName eq $Section[$Level]{NAME} ) {
+          die "Error: Unexpected section end on line $LineNum of '$SourceFile'...\n\n";
+        }
+
+        # Determine if the section is to be repeated
+        if ( $Section[$Level]{COUNT} < $Section[$Level]{COPIES} ) {
+
+          # Adjust input file pointer and line number
+          seek( IN, $Section[$Level]{PTR}, 0 );
+          $LineNum = $Section[$Level]{LINE};
+
+          # Update macro settings as necessary
+          if ( $EndName eq 'in' ) {
+
+            $Macro{'in'} = ++$Section[$Level]{COUNT};
+            $Interface = 'SI' . $Section[$Level]{COUNT};
+            $Macro{'si_name'} = $InterfaceInfo{SLAVES}{$Interface}{NAME};
+            $SlaveIF = $Interface;
+
+            # Determine template specific settings
+            if ( $TemplateFile =~ /($Arbiters|cmsdk_ahb_bm(_single)?_output_stage)$HdlExt$/ ) {
+              $Macro{'bin_in'} = ToBinary($Section[$Level]{COUNT}, $IdWidthSI);
+              if ( $GotFirst ) { $Macro{'rrelse'} = 'else '; }
+            } elsif ( $TemplateFile =~ /cmsdk_ahb_busmatrix$HdlExt$/ ) {
+              # Determine if the remap section should be processed
+              $Section{'remap'} = 0;
+              $Macro{'remapping_vector'} = '';
+              if ( $RemapInfo{$Interface}{REMAP_WIDTH} > 0 ) {
+                $Section{'remap'} = 1;
+                $Macro{'remapping_vector'} = $RemapInfo{$Interface}{REMAP_PORT};
+              }
+              $Macro{'matrix_decode_name'} = $MatrixDecodeNames[$Section[$Level]{COUNT}];
+              $Macro{'matrix_decode_name_lc'} = lc($Macro{'matrix_decode_name'});
+            }
+
+          } elsif ( $EndName eq 'out' ) {
+
+            $Macro{'out'} = ++$Section[$Level]{COUNT};
+            $Interface = 'MI' . $Section[$Level]{COUNT};
+            $Macro{'mi_name'} = $InterfaceInfo{MASTERS}{$Interface}{NAME};
+            $Macro{'mi_name_lc'} = lc($Macro{'mi_name'});
+
+            # Determine template specific settings
+            if ( $TemplateFile =~ /cmsdk_ahb_bm_decode$HdlExt$/ ) {
+              $Macro{'bin_out'} = ToBinary($Section[$Level]{COUNT}, $IdWidthMI - 1);
+            } elsif ( $TemplateFile =~ /cmsdk_ahb_busmatrix$HdlExt$/ and $Sparse ) {
+              $Macro{'output_stage_name'} = $OutputStageNames[$Section[$Level]{COUNT}];
+              $Macro{'output_stage_name_lc'} = lc($Macro{'output_stage_name'});
+            }
+
+          } elsif ( $EndName eq 'rrin' ) {
+
+            $Macro{'rrin'} = $PortIds[ ++$Section[$Level]{COUNT} ];
+            $Macro{'bin_rrin'} = ToBinary($PortIds[$Section[$Level]{COUNT}], $IdWidthSI);
+
+          } elsif ( $EndName eq 'rridx' ) {
+
+            $Section[$Level]{COUNT}++;
+            $Macro{'rrelse'} = 'else ';
+
+            # Determine next round robin port
+            $RefId = ++$RefId % $TotalIds;
+            $Macro{'rridx'} = $PortIds[$RefId];
+            $Macro{'bin_rridx'} = ToBinary($PortIds[$RefId], $IdWidthSI);
+
+          } elsif ( $EndName eq 'remap_state' ) {
+
+            $Macro{'bin_remapstate'} = ToBinary(++$Section[$Level]{COUNT},
+                                                 $RemapInfo{$SlaveIF}{REMAP_WIDTH});
+            $Decodings = 0;
+            $RemapState++;
+
+          } elsif ( $EndName eq 'remap_state_ipxact' ) {
+
+            $Section[$Level]{COUNT}++;
+
+            $RemapState = $Section[$Level]{COUNT};
+
+            $Macro{'remap_name'} = $i_remapstate[$RemapState];
+            print "Processing remap state: $Macro{'remap_name'}\n" if ( $Debug );
+
+          } elsif ( $EndName eq 'remap_bit' ) {
+
+            $Section[$Level]{COUNT}++;
+            $Bit++;
+
+          } elsif ( $EndName eq 'remap_bit_ipxact' ) {
+
+            $Bit++;
+
+            $Section[$Level]{COUNT}++;
+
+            my $r_bit = @{$RemapStates{$i_remapstate[$RemapState]}}[$Section[$Level]{COUNT}];
+
+            if (substr($r_bit,0,1) eq '!') {
+              $Macro{'top_remap_bit'} = substr($r_bit,1);
+              $Macro{'top_remap_bitvalue'} = 0;
+            } else {
+              $Macro{'top_remap_bit'} = $r_bit;
+              $Macro{'top_remap_bitvalue'} = 1;
+            }
+
+          } elsif ( $EndName eq 'segments' ) {
+
+            $Section[$Level]{COUNT}++;
+
+            $Macro{'segment_name'} = '0x'.$AddressSpace{$Interface}[$Section[$Level]{COUNT}][0]."_".'0x'.$AddressSpace{$Interface}[$Section[$Level]{COUNT}][1];
+            $Macro{'segment_offset'} = '0x'.$AddressSpace{$Interface}[$Section[$Level]{COUNT}][0];
+            $Macro{'segment_range'} = '0x' . HexAdd(  '0'. HexSubstract($AddressSpace{$Interface}[$Section[$Level]{COUNT}][1],
+                                                                        $AddressSpace{$Interface}[$Section[$Level]{COUNT}][0]) , 1 );
+
+          } elsif ( $EndName eq 'addr_remap_and_normal_all_this_remap' ) {
+
+            # Empty
+
+          } elsif ( $EndName =~ /^(addr|remap)_region$/ ) {
+
+            $Section[$Level]{COUNT}++;
+
+            # Conditionally reference the subsequent address/remap region
+            if ( @MIRegions > 0 ) {
+              $Macro{'mdelse'} = ( $Decodings > 0 ) ? 'else ' : '';
+
+              ($MasterIF, $Remapping, $AddrLo, $AddrHi) = split(/:/, $MIRegions[++$Region]);
+              $Macro{'address_block_name'} = 'Default';
+              $Macro{'address_block_remap'} = ($Remapping eq "move") ? 'TRUE' : 'FALSE';
+              $Macro{'base_address'} = "0x$AddrLo";
+              $Macro{'address_range'} = '0x' . HexSubstract($AddrHi, $AddrLo);
+              $Macro{'address_map'} = "0x$AddrLo-0x$AddrHi";
+              $Macro{'mem_lo'} = ToDecodeAddr($AddrLo);
+              $Macro{'mem_hi'} = ToDecodeAddr($AddrHi);
+
+              # Determine template specific settings
+              if ( $TemplateFile =~ /cmsdk_ahb_bm_decode$HdlExt$/ ) {
+                $Macro{'remapping_bit'} = '';
+                if ( $EndName eq 'remap_region' ) {
+                  $Macro{'remapping_bit'} = substr($Remapping, 5, 1);
+                  $Macro{'out'} = substr($MasterIF, 2);
+                  $Macro{'bin_out'} = ToBinary( substr($MasterIF, 2), $IdWidthMI - 1);
+                } else {
+                  $Macro{'region_type'} = $RemapTypes{$Remapping};
+                }
+              }
+              $Decodings++;
+            }
+
+        } elsif ( $EndName =~ /^(addr|remap)_region_ipxact$/ ) {  # Used bm_decode and IPXACT file only
+
+          $Section[$Level]{COUNT}++;
+
+          # Conditionally reference the first address/remap region and extract its info
+          if ( @MIRegions > 0 ) {
+
+            ($MasterIF, $Remapping, $AddrLo, $AddrHi, $Unmapping) = split(/:/, $MIRegions[$Section[$Level]{COUNT}]);
+            $Macro{'address_block_name'} = 'Default';
+            $Macro{'address_block_remap'} = ($Remapping eq "move") ? 'TRUE' : 'FALSE';
+            $Macro{'base_address'} = "0x$AddrLo";
+            $Macro{'end_address'} = "0x$AddrHi";
+            $Macro{'address_range'} = '0x' . HexSubstract($AddrHi, HexSubstract($AddrLo,1));
+            $Macro{'address_map'} = "0x$AddrLo-0x$AddrHi";
+            $Macro{'mem_lo'} = ToDecodeAddr($AddrLo);
+            $Macro{'mem_hi'} = ToDecodeAddr($AddrHi);
+            $Macro{'out'} = substr($MasterIF, 2);
+            $Macro{'bin_out'} = ToBinary( substr($MasterIF, 2), $IdWidthMI - 1);
+            $Macro{'mi_name'} = $InterfaceInfo{MASTERS}{$MasterIF}{NAME};
+            $Macro{'mi_name_lc'} = lc($Macro{'mi_name'});
+
+            $Section{'remapped'} = ($Remapping =~ /^(move|remap).*/) ? 1 : 0;
+            $Section{'not_remapped'} = !$Section{'remapped'};
+
+            my @bits = GetRemapBits ($Remapping, $Unmapping);
+
+            my $remap_name = join( '_' , @bits );
+            # Change ! to n
+            $remap_name =~ s/!/n/g ;
+            $Macro{'remap_name'} = "remap_".$remap_name;
+
+            my $bit;
+            $Macro{'active_cond'} = '';
+
+            foreach $bit (@bits) {
+              if (substr($bit,0,1) eq '!') {
+                $Macro{'active_cond'} .= "\n" . ' 'x25 . ' & !remapping_dec['.$RemapInfo{$SlaveIF}{REMAP_MAPPING}{substr($bit,1)} .']';
+              } else {
+                $Macro{'active_cond'} .= "\n" . ' 'x25 . ' &  remapping_dec['.$RemapInfo{$SlaveIF}{REMAP_MAPPING}{$bit} .']';
+              }
+            }
+            $Macro{'remapping_bit'} = $remap_name;
+
+            $Section{'remap_static'} = @bits ? 0 : 1;
+            $Section{'remap_conditional'} = @bits ? 1 : 0;
+
+            if (@bits) {
+              if ( substr($Remapping,0,5) eq 'remap' ) {
+                $Macro{'region_type'} = "Remapped region, active when REMAP bitcombination is " . $remap_name;
+                $Macro{'region_type_sanitized'} = "Remapped_" . $remap_name;
+              } else {
+                $Macro{'region_type'} = "Removable region, active only when REMAP bitcombination is " . $remap_name;
+                $Macro{'region_type_sanitized'} = "Removable_" . $remap_name;
+              }
+            } else {
+              $Macro{'region_type'} = "Static";
+              $Macro{'region_type_sanitized'} = $Macro{'region_type'};
+            }
+
+          }
+
+          } elsif ( $EndName eq 'ipxact_remap_region' ) {
+
+             $Section[$Level]{COUNT}++;
+
+             if ( @MIRegions > 0 ) {
+               ($MasterIF, $Remapping, $AddrLo, $AddrHi) = split(/:/, $MIRegions[++$Region]);
+               $Remapping =~ /([0-9])$/; $Remapping = $1;
+               $Macro{'address_block_name'} = 'Remap-Pin' . $Remapping;
+               $Macro{'base_address'} = "0x$AddrLo";
+               $Macro{'address_range'} = '0x' . HexSubstract($AddrHi, $AddrLo);
+               $Macro{'mem_lo'} = ToDecodeAddr($AddrLo);
+               $Macro{'mem_hi'} = ToDecodeAddr($AddrHi);
+             }
+
+          } elsif ( $EndName eq 'file' ) {  # Used in ipxact file only
+
+
+            if ($TemplateFile =~ /.*lite_ipxact\.xml$/) { # Remove the wrapper from non-lite
+               #
+            } else {
+               if ( $Macro{'filename'} eq $ComponentName ) {
+                  ++$Section[$Level]{COUNT};
+               }
+            }
+
+            $Macro{'filename'} = $IPXactFiles[++$Section[$Level]{COUNT}];
+
+          }
+
+          # Display pointer adjustment when in debug mode
+          printf ("Reversing back to line %d...\n", $LineNum + 1) if ( $Debug );
+
+        } elsif ( $Level > 0 )  {
+          $Level--;
+        }
+
+        # Do not include this line in the output
+        unless ($Section[$Level]{EN} == 0) { $Section[$Level]{EN} = -1; }
+
+      }
+
+    }
+
+    # Write the line(s) to the rendered output file when (delay) enabled
+    if ( $Section[$Level]{EN} ) {
+      print OUT $TextLine if ( $Section[$Level]{EN} > 0 );
+      $Section[$Level]{EN} = 1;
+    }
+
+  }
+
+  # Close the template file and rendered output file
+  close(IN);
+  close(OUT);
+
+  # If still inside a nested section, there were too few end macros
+  unless ( $Level == 0 ) {
+    die "Error: Section '$Section[$Level]{NAME}' expected in '$SourceFile'!\n\n";
+  }
+
+}
+
+
+# ------------------------------------------------------------------------------
+#   IsSparse - Determines the connectivity completeness
+# ------------------------------------------------------------------------------
+sub IsSparse {
+
+  # Local variable(s)
+  my $SlaveIF   = '';
+  my @SlaveIFs  = keys( %{ $InterfaceInfo{SLAVES} } );
+  my @MasterIFs = keys( %{ $InterfaceInfo{MASTERS} } );
+  my $Mappings  = '';
+  my $Result    = 0;
+
+  # Check each mapping
+  foreach $SlaveIF ( @SlaveIFs ) {
+    $Mappings = join( '|', @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} } );
+    if ( grep $_ !~ /^($Mappings)$/, @MasterIFs ) { $Result = 1; last; }
+  }
+
+  return ($Result);
+}
+
+
+# ------------------------------------------------------------------------------
+#   HexSubstract - Does argument1 - argument2 substraction in hex.
+#                  Assumes argument1 >= argument2
+# ------------------------------------------------------------------------------
+sub HexSubstract {
+
+  # Passed parameter 1 is the LHS hexadecimal operand value
+  my $Value1 = shift;
+  # Passed parameter 2 is the RHS hexadecimal operand value
+  my $Value2 = shift;
+
+  # Local variable(s)
+  my $Len1   = length($Value1);
+  my $Len2   = length($Value2);
+  my $Index  = 0;
+  my $Char1  = '';
+  my $Char2  = '';
+  my $Borrow = 0;
+  my $Result = '';
+
+  # Append zeros to the 2nd operand
+  if ( $Len1 > $Len2 ) { $Value2 = '0' x ($Len1 - $Len2) . $Value2; }
+
+   # Substract using strings instead of conversion to decimal to support 64 bit numbers
+   for ( $Index = 1; $Index <= $Len1; $Index++ ) {
+     $Char1 = hex substr($Value1, $Len1 - $Index, 1);
+     $Char2 = hex substr($Value2, $Len1 - $Index, 1);
+     if ( $Char1 < ($Char2 + $Borrow) ) {
+       $Char1 = $Char1 + 16;
+       $Result = sprintf("%1x", $Char1 - $Char2 - $Borrow) . $Result;
+       $Borrow = 1;
+     } else {
+       $Result = sprintf("%1x", $Char1 - $Char2 - $Borrow) . $Result;
+       $Borrow = 0;
+     }
+   }
+
+   return ($Result);
+}
+
+
+# ------------------------------------------------------------------------------
+#   HexAdd - Does argument1 + argument2 substraction in hex.
+# ------------------------------------------------------------------------------
+sub HexAdd {
+
+  # Passed parameter 1 is the LHS hexadecimal operand value
+  my $Value1 = shift;
+  # Passed parameter 2 is the RHS hexadecimal operand value
+  my $Value2 = shift;
+
+  # Local variable(s)
+  my $Len1   = length($Value1);
+  my $Len2   = length($Value2);
+  my $Index  = 0;
+  my $Char1  = '';
+  my $Char2  = '';
+  my $Carry  = 0;
+  my $Result = '';
+
+  # Append zeros to the 2nd operand
+  if ( $Len1 > $Len2 ) { $Value2 = '0' x ($Len1 - $Len2) . $Value2; }
+
+   # Substract using strings instead of conversion to decimal to support 64 bit numbers
+   for ( $Index = 1; $Index <= $Len1; $Index++ ) {
+     $Char1 = hex substr($Value1, $Len1 - $Index, 1);
+     $Char2 = hex substr($Value2, $Len1 - $Index, 1);
+     if ( $Char1 +$Char2 + $Carry > 15) {
+       $Result = sprintf("%1x", $Char1 + $Char2 + $Carry - 16) . $Result;
+       $Carry = 1;
+     } else {
+       $Result = sprintf("%1x", $Char1 + $Char2 + $Carry) . $Result;
+       $Carry = 0;
+     }
+   }
+
+   return ($Result);
+}
+
+
+# ------------------------------------------------------------------------------
+#   RoundPowerOfTwo - Finds the minimum binary quantum for the specified
+#                      integer value
+# ------------------------------------------------------------------------------
+sub RoundPowerOfTwo {
+
+  # Passed parameter 1 is the integer value
+  my $Value = shift;
+
+  # Local variable(s)
+  my $Result     = 0;
+  my $ShiftCount = 0;
+
+  # Determine the number of available regions
+  while ( $Value > $Result ) { $Result = 1 << $ShiftCount++; }
+
+  return ($Result);
+}
+
+
+# ------------------------------------------------------------------------------
+#   NumberOfDigits - Calculates the number of digits required to describe
+#                     the specified integer value in the specified base
+# ------------------------------------------------------------------------------
+sub NumberOfDigits {
+
+  # Passed parameter 1 is the integer value
+  my $Value = shift;
+  # Passed parameter 2 is the base
+  my $Base = shift;
+
+  # Local variable(s)
+  my $Result  = 1;
+  my $XToTheY = 0;
+
+  # Determine the number of digits for values greater than the radix
+  unless ( $Base < 2 or $Value < $Base ) {
+    while ( $Value > $XToTheY ) { $XToTheY = $Base ** $Result++; }
+    if ( $Value != $XToTheY ) { $Result--; }
+  }
+
+  return ( $Result );
+}
+
+
+# ------------------------------------------------------------------------------
+#   NumberOfHexChars - Calculates the number of hexadecimal characters
+#                       required to describe the specified number of bits
+# ------------------------------------------------------------------------------
+sub NumberOfHexChars {
+
+  # Passed parameter 1 is the integer value
+  my $Value = shift;
+
+  # Local variable(s)
+  my $Result   = $Value / 4.0;
+  my $Integer  = int($Result);
+  my $Fraction = $Result - $Integer;
+
+  # Determine the number of digits
+  $Result = ($Fraction > 0) ? $Integer + 1 : $Integer;
+
+  return ( $Result );
+}
+
+
+# ------------------------------------------------------------------------------
+#   ToBinary - Converts the specified integer into an n-bit binary string
+# ------------------------------------------------------------------------------
+sub ToBinary {
+
+  # Passed parameter 1 is the integer value
+  my $Value = shift;
+  # Passed parameter 2 is the binary string length
+  my $Length = shift;
+
+  # Local variable(s)
+  my $Format = "%0${Length}b";
+  my $Result = ( $Value =~ /^\d+$/ ) ? sprintf($Format, $Value) : '';
+
+  return ( substr($Result, -$Length, $Length) );
+}
+
+
+# ------------------------------------------------------------------------------
+#   ToDecodeAddr - Shifts the specified n-bit address to the correct alignment
+#                   for the Matrix Decoder because HADDR[9:0] is not decoded
+# ------------------------------------------------------------------------------
+sub ToDecodeAddr {
+
+  # Passed parameter 1 is the address value
+  my $FullAddr = shift;
+
+  # Local variable(s)
+  my $AddrBits = $RoutingAddressWidth - 10;
+  my $HexChars = NumberOfHexChars($AddrBits);
+  my $Length   = length($FullAddr);
+  my $BinAddr  = sprintf( "%032b%032b", hex substr($FullAddr, 0, $Length - 8),
+                                        hex substr($FullAddr, $Length - 8) );
+  my $Result    = '';
+
+  # Right-shift the binary string to remove the non-decoded bits, and repack
+  #  it into 32-bit chunks for reformatting into a hexadecimal representation
+  $BinAddr = '0' x 10 . substr($BinAddr, 0, -10);
+  $Result  = sprintf( "%08lx%08lx",
+               unpack( 'N', pack('B32', substr($BinAddr, 0, 32)) ),
+               unpack( 'N', pack('B32', substr($BinAddr, 32)) ) );
+
+  return ( sprintf("%d'h%s", $AddrBits, substr($Result, 16 - $HexChars)) );
+}
+
+
+# ------------------------------------------------------------------------------
+#   UnsignedFloatToHex - Converts the specified float value into a hex string
+# ------------------------------------------------------------------------------
+sub UnsignedFloatToHex {
+
+  # Passed parameter 1 is the float value
+  my $Value = shift;
+
+  # Local variable(s)
+  my $HexDigits = NumberOfDigits($Value, 16);
+  my $Divisor   = 16 ** ($HexDigits - 1);
+  my $Dividend  = 0;
+  my $Result    = '';
+
+  # Determine number sequence
+  while ( length($Result) < $HexDigits ) {
+    $Dividend = int( $Value / $Divisor );
+    if ( $Dividend > 0 ) {
+      $Result = $Result . substr('0123456789abcdef', $Dividend, 1);
+      $Value -= ($Divisor * $Dividend);
+    } else {
+      $Result = $Result . '0';
+    }
+    $Divisor /= 16;
+  }
+
+  return ($Result);
+}
+
+
+# ------------------------------------------------------------------------------
+#   IsGtOrEq - Operator '>=' test for up to 64-bit hexadecimal numbers
+# ------------------------------------------------------------------------------
+sub IsGtOrEq {
+
+  # Passed parameter 1 is the LHS value
+  my $OperandLHS = shift;
+  # Passed parameter 2 is the RHS value
+  my $OperandRHS = shift;
+
+  # Local variable(s)
+  my $LengthLHS = length($OperandLHS);
+  my @LHS       = ( hex substr($OperandLHS, 0, $LengthLHS - 8),
+                    hex substr($OperandLHS, $LengthLHS - 8) );
+  my $LengthRHS = length($OperandRHS);
+  my @RHS       = ( hex substr($OperandRHS, 0, $LengthRHS - 8),
+                    hex substr($OperandRHS, $LengthRHS - 8) );
+  my $Result = ( $LHS[0] > $RHS[0] or
+                 ($LHS[0] == $RHS[0] and $LHS[1] >= $RHS[1]) ) ? 1 : 0;
+
+  return ($Result);
+}
+
+
+# ------------------------------------------------------------------------------
+#   IsLtOrEq - Operator '<=' test for up to 64-bit hexadecimal numbers
+# ------------------------------------------------------------------------------
+sub IsLtOrEq {
+
+  # Passed parameter 1 is the LHS value
+  my $OperandLHS = shift;
+  # Passed parameter 2 is the RHS value
+  my $OperandRHS = shift;
+
+  # Local variable(s)
+  my $LengthLHS = length($OperandLHS);
+  my @LHS       = ( hex substr($OperandLHS, 0, $LengthLHS - 8),
+                    hex substr($OperandLHS, $LengthLHS - 8) );
+  my $LengthRHS = length($OperandRHS);
+  my @RHS       = ( hex substr($OperandRHS, 0, $LengthRHS - 8),
+                    hex substr($OperandRHS, $LengthRHS - 8) );
+  my $Result = ( $LHS[0] < $RHS[0] or
+                 ($LHS[0] == $RHS[0] and $LHS[1] <= $RHS[1]) ) ? 1 : 0;
+
+  return ($Result);
+}
+
+
+# ------------------------------------------------------------------------------
+#   IsGt - Operator '>' test for up to 64-bit hexadecimal numbers
+# ------------------------------------------------------------------------------
+sub IsGt {
+
+  # Passed parameter 1 is the LHS value
+  my $OperandLHS = shift;
+  # Passed parameter 2 is the RHS value
+  my $OperandRHS = shift;
+
+  # Local variable(s)
+  my $LengthLHS = length($OperandLHS);
+  my @LHS       = ( hex substr($OperandLHS, 0, $LengthLHS - 8),
+                    hex substr($OperandLHS, $LengthLHS - 8) );
+  my $LengthRHS = length($OperandRHS);
+  my @RHS       = ( hex substr($OperandRHS, 0, $LengthRHS - 8),
+                    hex substr($OperandRHS, $LengthRHS - 8) );
+  my $Result = ( $LHS[0] > $RHS[0] or
+                 ($LHS[0] == $RHS[0] and $LHS[1] > $RHS[1]) ) ? 1 : 0;
+
+  return ($Result);
+}
+
+
+# ------------------------------------------------------------------------------
+#   IsLt - Operator '<' test for up to 64-bit hexadecimal numbers
+# ------------------------------------------------------------------------------
+sub IsLt {
+
+  # Passed parameter 1 is the LHS value
+  my $OperandLHS = shift;
+  # Passed parameter 2 is the RHS value
+  my $OperandRHS = shift;
+
+  # Local variable(s)
+  my $LengthLHS = length($OperandLHS);
+  my @LHS       = ( hex substr($OperandLHS, 0, $LengthLHS - 8),
+                    hex substr($OperandLHS, $LengthLHS - 8) );
+  my $LengthRHS = length($OperandRHS);
+  my @RHS       = ( hex substr($OperandRHS, 0, $LengthRHS - 8),
+                    hex substr($OperandRHS, $LengthRHS - 8) );
+  my $Result = ( $LHS[0] < $RHS[0] or
+                 ($LHS[0] == $RHS[0] and $LHS[1] < $RHS[1]) ) ? 1 : 0;
+
+  return ($Result);
+}
+
+# ------------------------------------------------------------------------------
+#   IsEq - Operator '=' test for up to 64-bit hexadecimal numbers
+# ------------------------------------------------------------------------------
+sub IsEq {
+
+  # Passed parameter 1 is the LHS value
+  my $OperandLHS = shift;
+  # Passed parameter 2 is the RHS value
+  my $OperandRHS = shift;
+
+  # Local variable(s)
+  my $LengthLHS = length($OperandLHS);
+  my @LHS       = ( hex substr($OperandLHS, 0, $LengthLHS - 8),
+                    hex substr($OperandLHS, $LengthLHS - 8) );
+  my $LengthRHS = length($OperandRHS);
+  my @RHS       = ( hex substr($OperandRHS, 0, $LengthRHS - 8),
+                    hex substr($OperandRHS, $LengthRHS - 8) );
+  my $Result = ($LHS[0] == $RHS[0] and $LHS[1] == $RHS[1]) ? 1 : 0;
+
+  return ($Result);
+}
+
+
+# ------------------------------------------------------------------------------
+#   TidyPath - Removes double and trailing slash characters from filename paths
+# ------------------------------------------------------------------------------
+sub TidyPath {
+
+  # Passed parameter 1 is the filepath string
+  my $Filepath = shift;
+
+  $Filepath =~ s/(\/\/|\\)/\//g; $Filepath =~ s/\/$//;
+
+  return ($Filepath);
+}
+
+
+# ------------------------------------------------------------------------------
+#   GetRemapBits - Takes the Remapping and Unmapping (if exists) of an
+#     address_region or remap_region and returns a sorted list of the bits
+#     when the region is enabled. Returns an empty list if the region is always
+#     enabled. Negative bits are marked with an exclamation mark
+#   example:
+#      a remap region that is activated by bit 3
+#      but is eclipsed when bit 1 is active will return:
+#     [
+#       '!1',
+#       '3'
+#     ],
+# ------------------------------------------------------------------------------
+sub GetRemapBits {
+  my $Remapping = shift;
+  my $Unmapping = shift;
+  my @bits = ();
+  my @c_bits = ();
+  my $r_bit;
+  if (substr($Remapping,0,3) eq "del") {
+     @c_bits = split ( /,| |_/,substr($Remapping,3)) ;
+     foreach $r_bit (@c_bits) {
+        if (!($r_bit eq '')) { # need to ignore leading empty characters generated by a leading separator
+          push @bits, '!'.$r_bit;
+        }
+     }
+  }
+  if (substr($Remapping,0,5) eq "remap") {
+     @c_bits = split ( /,| |_/,substr($Remapping,5)) ;
+     foreach $r_bit (@c_bits) {
+        if (!($r_bit eq '')) { # need to ignore leading empty characters generated by a leading separator
+          push @bits, $r_bit;
+        }
+     }
+  }
+  if ($Unmapping) {
+     @c_bits = split ( /,| |_/,substr($Unmapping,5)) ;
+     foreach $r_bit (@c_bits) {
+        if (!($r_bit eq '')) { # need to ignore leading empty characters generated by a leading separator
+          push @bits, '!'.$r_bit;
+        }
+     }
+  }
+
+  # Sort bits in order, so they are easier to match
+  @bits = sort {
+        my $c = $a;
+        my $d = $b;
+        if ( substr($a,0,1) eq '!') {
+          $c = substr($a,1)
+        }
+        if ( substr($b,0,1) eq '!') {
+          $d = substr($b,1)
+        }
+
+        $c <=> $d
+      } @bits;
+  return (@bits);
+}
+
+# ------------------------------------------------------------------------------
+#   ValidateParameters - Checks the value of user configurable script parameters
+# ------------------------------------------------------------------------------
+sub ValidateParameters {
+
+  # Local variable(s)
+  my %Names         = (
+                        bus_matrix_name     => \$BusMatrixName,
+                        input_stage_name    => \$InputStageName,
+                        matrix_decode_name  => \$MatrixDecodeName,
+                        output_arbiter_name => \$OutputArbName,
+                        output_stage_name   => \$OutputStageName
+                      );
+  my @NameKeys      = keys( %Names );
+  my $Name          = '';
+  my $NameLength    = 0;
+  my $ShowName      = '';
+  my @OtherNameKeys = ();
+  my $OtherName     = '';
+  my $Type          = '';
+  my @Interfaces    = ();
+  my $Interface     = '';
+
+  # Validate permitted values for the total slave interfaces
+  unless ( $SlaveInterfaces >= $MinSlaveIF and $SlaveInterfaces <= $MaxSlaveIF ) {
+    warn "Error: The number of slave ports must be in the range from $MinSlaveIF to $MaxSlaveIF \n";
+    $Errors++;
+  }
+
+  # Validate permitted values for the total master interfaces
+  unless ( $MasterInterfaces >= $MinMasterIF and $MasterInterfaces <= $MaxMasterIF ) {
+    warn "Error: The number of master ports must be in the range from $MinMasterIF to $MaxMasterIF \n";
+    $Errors++;
+  }
+
+  # Raise a warning about the '1 x n' bus matrix configuration
+  if ( $SlaveInterfaces == 1 ) {
+    warn "Warning: This configuration has one slave port and will use 'single' output\n" .
+         " and arbiter stage(s) only.\n";
+  }
+
+  # Validate permitted values of arbitration scheme
+  unless ( $ArbiterType =~ /^(fixed|round|burst)$/ ) {
+    warn "Error: Invalid type of arbitration-scheme '$ArbiterType'!\n";
+    $Errors++;
+  }
+
+  # Validate permitted values of architecture version
+  unless ( $ArchitectureType =~ /^(ahb2|v6|excl|unalign)$/ ) {
+    warn "Error: Invalid type of architecture '$ArchitectureType'!\n";
+    $Errors++;
+  }
+
+  # Validate permitted values of routing-data width
+  unless ( $RoutingDataWidth =~ /^($DataWidths)$/ ) {
+    warn "Error: Invalid routing-data width '$RoutingDataWidth'!\n";
+    $Errors++;
+  }
+
+  # Validate permitted values of user-signal width
+  if ( $RoutingAddressWidth =~ /[^0-9]/ ) {
+    warn "Error: Invalid routing-address width '$RoutingAddressWidth'!\n";
+    $Errors++;
+  } elsif ( $RoutingAddressWidth < $MinAddrWidth or $RoutingAddressWidth > $MaxAddrWidth ) {
+    warn "Error: Routing-address width must be in the range $MinAddrWidth..$MaxAddrWidth!\n";
+    $Errors++;
+  }
+
+  # Validate permitted values of user-signal width
+  if ( $UserSignalWidth =~ /[^0-9]/ ) {
+    warn "Error: Invalid user-signal width '$UserSignalWidth'!\n";
+    $Errors++;
+  } elsif ( $UserSignalWidth < $MinUserWidth or $UserSignalWidth > $MaxUserWidth ) {
+    warn "Error: User-signal width must be in the range $MinUserWidth..$MaxUserWidth!\n";
+    $Errors++;
+  }
+
+  # Validate permitted values of module names
+  foreach $Name ( @NameKeys ) {
+    $ShowName = $Name; $ShowName =~ s/_/ /g;
+    $NameLength = length( ${ $Names{$Name} } );
+
+    # Check for illegal characters and then check the string length
+    if ( ${ $Names{$Name} } =~ /[^\w]/ ) {
+      warn "Error: The $ShowName contains illegal characters!\n";
+      $Errors++;
+    } elsif ( $NameLength < $MinNameLength or $NameLength > $MaxNameLength ) {
+      warn "Error: The $ShowName is incorrect length ($MinNameLength..$MaxNameLength characters)!\n";
+      $Errors++;
+    }
+
+    # Check for unique name
+    @OtherNameKeys = grep $_ ne $Name , @NameKeys;
+    foreach $OtherName ( @OtherNameKeys ) {
+      if ( ${ $Names{$OtherName} } eq ${ $Names{$Name} } ) {
+        warn "Error: The $ShowName is not assigned a unique value!\n";
+        $Errors++;
+      }
+    }
+  }
+
+  # Check interface information
+  foreach $Type ( ('SLAVES', 'MASTERS') ) {
+
+    @Interfaces = keys( %{ $InterfaceInfo{$Type} } );
+    foreach $Interface ( @Interfaces ) {
+      # Inspect interface names
+      $Name = $InterfaceInfo{$Type}{$Interface}{NAME};
+      if ( $Name =~ /[^\w]/ ) {
+        warn "Error: Interface $Interface name '$Name' contains illegal characters!\n";
+        $Errors++;
+      }
+      if ( length($Name) > $MaxNameLength ) {
+        warn "Error: Interface $Interface name '$Name' is too long ($MaxNameLength" .
+             " characters max)!\n";
+        $Errors++;
+      }
+
+      # Inspect connectivity for isolated nodes resulting from an
+      #  incomplete sparse mapping
+      if ( @{ $InterfaceInfo{$Type}{$Interface}{CONNECTIONS} } == 0 ) {
+        warn "Error: Interface $Interface has no connectivity mapping and is isolated!\n";
+        $Errors++;
+      }
+
+      # If this is a slave, then check its address map
+      if ( $Type eq 'SLAVES' ) { CheckAddressMap($Interface); }
+    }
+
+  }
+
+}
+
+
+# ------------------------------------------------------------------------------
+#   CheckAddressMap - Checks the address map of the specified slave interface
+#                      for tags and overlapping regions
+# ------------------------------------------------------------------------------
+sub CheckAddressMap {
+
+  # Passed parameter 1 is the integer value
+  my $SlaveIF = shift;
+
+  # Local variable(s)
+  my $Class       = '';
+  my $Index       = 0;
+  my $MasterIF    = '';
+  my @MIRegions   = ();
+  my $Region      = '';
+  my $MI          = '';
+  my $Tag         = '';
+  my $RegionHi    = '';
+  my $RegionLo    = '';
+  my $RegionHiLSW = 0;
+  my $RegionLoLSW = 0;
+  my $CheckBound  = '';
+  my $OtherRegion = '';
+  my $OtherMI     = '';
+  my $OtherHi     = '';
+  my $OtherLo     = '';
+  my $OtherTag    = 0;
+  my $Exclusions  = '';
+  my $HexChars    = NumberOfHexChars($RoutingAddressWidth);
+  my %Tags        = ( NORMAL => 'none|move|alias',  REMAP => 'remap[0-3]' );
+  my %TagMessages = ( NORMAL => 'remapping action', REMAP => 'REMAP bit' );
+  my %WarnType    = ( NORMAL => 'address', REMAP => 'remap' );
+
+  # Process each mapping type
+  foreach $Class ( ('REMAP', 'NORMAL') ) {
+
+    # Check the address map for each master interface
+    for ( $Index = 0; $Index < $MasterInterfaces; $Index++ ) {
+      $MasterIF = 'MI' . $Index;
+
+      # Find regions matching the master interface under inspection
+      @MIRegions = grep /^$MasterIF:/, @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{$Class} };
+
+      # Determine if this slave interface has connectivity with the master interface
+      if ( grep $_ eq $MasterIF, @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} } ) {
+
+        # Check for expected address regions
+        unless ( $Class eq 'REMAP' or @MIRegions > 0 ) {
+          warn "Error: Interface $SlaveIF has no address regions defined for the $MasterIF interface!\n";
+          $Errors++;
+        }
+
+        # Inspect each region mapped to the master interface
+        foreach $Region ( @MIRegions ) {
+
+          # Split the region into its constituent parts
+          ($MI, $Tag, $RegionLo, $RegionHi) = split(/:/, $Region);
+
+          # Extract and remove the expected prefix, then check its type
+          unless ( $Tag =~ /^($Tags{$Class})$/ ) {
+            warn "Error: Interface $SlaveIF address region '$MI: $RegionLo-$RegionHi'" .
+                 " declares\n unsupported $TagMessages{$Class}!\n";
+            $Errors++;
+          }
+
+          # Check that each bound only consists of hexadecimal characters
+          #  and is the expected number of hexadecimal digits
+          foreach $CheckBound ( $RegionLo, $RegionHi ) {
+            if ( length($CheckBound) != $HexChars ) {
+              warn "Error: Interface $SlaveIF address bound '$MI: $CheckBound' is incorrect length should be $HexChars characters!\n";
+              $Errors++;
+            }
+            if ( $CheckBound =~ /[^a-f0-9]+/i ) {
+              warn "Error: Interface $SlaveIF address bound '$MI: $CheckBound' contains illegal characters!\n";
+              $Errors++;
+            }
+          }
+
+          # Check the region syntax
+          if ( IsGtOrEq($RegionLo, $RegionHi) ) {
+            warn "Error: Interface $SlaveIF address region '$MI: $RegionLo-$RegionHi' is invalid!\n";
+            $Errors++;
+          }
+
+          # Check the region size - minimum is 1kBytes
+          $RegionHiLSW = hex substr($RegionHi, length($RegionHi) - 8);
+          $RegionLoLSW = hex substr($RegionLo, length($RegionLo) - 8);
+          if ( abs( $RegionHiLSW - $RegionLoLSW ) < 1023 ) {
+            warn "Error: Interface $SlaveIF address region '$MI: $RegionLo-$RegionHi' is < 1kBytes!\n";
+            $Errors++;
+          }
+
+          # Check alignment of lower address bound
+          if ( ( hex(substr($RegionLo, -3, 3)) & 0x3ff ) != 0x000 ) {
+            warn "Warning: Interface $SlaveIF address bound '$MI: $RegionLo' is misaligned!\n";
+          }
+
+          # Check alignment of upper address bound
+          if ( ( hex(substr($RegionHi, -3, 3)) & 0x3ff ) != 0x3ff ) {
+            warn "Warning: Interface $SlaveIF address bound '$MI: $RegionHi' is misaligned!\n";
+          }
+
+          # Check the current region against all others for illegal overlap
+          foreach $OtherRegion ( @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{$Class} } ) {
+
+            # Split the other region into its constituent parts
+            ($OtherMI, $OtherTag, $OtherLo, $OtherHi) = split(/:/, $OtherRegion);
+
+            # Exclude remap regions with different remap bits
+            if ( $Class eq 'REMAP' and $Tag ne $OtherTag ) { next; }
+
+            # Filter out the current region and any previously reported ones
+            unless ( $OtherRegion =~ /^($Region$Exclusions)$/ ) {
+
+              # Check bounds for overlap
+              if ( (IsGtOrEq($OtherLo, $RegionLo) and IsLtOrEq($OtherLo, $RegionHi)) or
+                   (IsGtOrEq($OtherHi, $RegionLo) and IsLtOrEq($OtherHi, $RegionHi)) ) {
+
+                warn "Error: Interface $SlaveIF $WarnType{$Class} region '$OtherMI: $OtherLo-$OtherHi'" .
+                  " overlaps\n with another $WarnType{$Class} region '$MI: $RegionLo-$RegionHi'!\n";
+                $Errors++;
+
+                # Suppress multiple messages that show the same error
+                $Exclusions = $Exclusions . "|$MI:[^:]+:$RegionLo:$RegionHi";
+              }
+
+            }
+          }
+
+        }
+
+      } elsif ( @MIRegions > 0 ) {
+        # This slave interface is not connected to the master interface and
+        #  therefore should not have any address map information
+        warn "Error: Interface $SlaveIF has an address map for $MasterIF interface,\n" .
+             " while not connected!\n";
+        $Errors++;
+      }
+    }
+
+    # Clear the exclusions for checking the next class
+    $Exclusions = '';
+
+  }
+
+}
+
+
+# ------------------------------------------------------------------------------
+#   InitialiseInterfaceInfo - Determines the connectivity mapping and address
+#                              map, assigning values to the global interface
+#                              information hash
+# ------------------------------------------------------------------------------
+sub InitialiseInterfaceInfo {
+
+  # Local variable(s)
+  my $SlaveIF   = '';
+  my $MasterIF  = '';
+  my $Index1      = 0;
+  my $Index2      = 0;
+  my $Regions     = RoundPowerOfTwo($MasterInterfaces);
+  my $RegionSize  = (2 ** $RoutingAddressWidth) / $Regions;
+  my $BaseAddress = 0;
+  my $TopAddress  = 0;
+  my @Mappings    = split(/:\s*/, $Connectivity);
+  my $Mapping     = '';
+  my @Interfaces  = ();
+  my $HexChars    = NumberOfHexChars($RoutingAddressWidth);
+  my $Format      = "%0${HexChars}s";
+
+  # Initialise master interface parameter(s) first to simplify the sequence
+  for ( $Index1 = 0; $Index1 < $MasterInterfaces; $Index1++ ) {
+    $MasterIF = 'MI' . $Index1;
+    $InterfaceInfo{MASTERS}{$MasterIF}{NAME} = $MasterIF;
+    $InterfaceInfo{MASTERS}{$MasterIF}{CONNECTIONS} = [];
+  }
+
+  # Initialise slave interface parameter(s)
+  for ( $Index1 = 0; $Index1 < $SlaveInterfaces; $Index1++ ) {
+    # Initialise slave information container
+    $SlaveIF = 'SI' . $Index1;
+    $InterfaceInfo{SLAVES}{$SlaveIF}{NAME} = $SlaveIF;
+    $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} = [];
+    $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} = [];
+    $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} = [];
+
+    # Establish the connectivity
+    if ( $Connectivity ne 'full' ) {
+
+      # Initialise or concatenate the connection description string
+      $Connectivity = 'sparse';
+      $Connections = $Connections . sprintf("%s%s -> ", ($Connections eq '') ?
+        '' : "\n" . ' ' x 29, $InterfaceInfo{SLAVES}{$SlaveIF}{NAME});
+
+      # Search the connectivity string for a mapping from this slave interface
+      foreach $Mapping ( @Mappings ) {
+        if ( $Mapping =~ /^$SlaveIF=MI\{([0-9,]+)\}/) {
+          # Process each master interface in turn, checking for its existence
+          @Interfaces = split(/,\s*/, $1);
+          foreach $MasterIF ( @Interfaces ) {
+            $MasterIF = 'MI' . $MasterIF;
+            if ( exists( $InterfaceInfo{MASTERS}{$MasterIF} ) ) {
+              # Append the details of this sparse connection
+              push @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} }, $MasterIF;
+              $Connections = $Connections . "$MasterIF, ";
+            } else {
+              warn "Error: Interface $SlaveIF has an unresolved sparse connection '$MasterIF'!\n";
+              $Errors++;
+            }
+          }
+        }
+      }
+
+    } else {
+      # Full connectivity is default
+      for ( $Index2 = 0; $Index2 < $MasterInterfaces; $Index2++ ) {
+        push @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} }, 'MI' . $Index2;
+      }
+    }
+
+    # Determine address map (assume no remap regions)
+    for ( $Index2 = 0; $Index2 < $MasterInterfaces; $Index2++ ) {
+      $MasterIF = 'MI' . $Index2;
+      $BaseAddress = $RegionSize * $Index2;
+      $TopAddress = $BaseAddress + $RegionSize - 1;
+      if ( grep $_ eq $MasterIF, @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} } ) {
+        push @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} },
+          sprintf("%s:none:$Format:$Format", $MasterIF, UnsignedFloatToHex($BaseAddress),
+            UnsignedFloatToHex($TopAddress));
+      }
+    }
+  }
+
+  # Remove leading whitespace from the connections detail
+  $Connections =~ s/,\s+$//;
+
+  # Determine connectivity information from master interface perspective
+  for ( $Index1 = 0; $Index1 < $MasterInterfaces; $Index1++ ) {
+    $MasterIF = 'MI' . $Index1;
+    for ( $Index2 = 0; $Index2 < $SlaveInterfaces; $Index2++ ) {
+      $SlaveIF = 'SI' . $Index2;
+      if ( grep $_ eq $MasterIF, @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} } ) {
+        push @{ $InterfaceInfo{MASTERS}{$MasterIF}{CONNECTIONS} }, $SlaveIF;
+      }
+    }
+  }
+
+}
+
+
+# ------------------------------------------------------------------------------
+#   ProcessXmlConfigFile - Reads the specified XML configuration file and
+#                           assigns values to the global variables including
+#                           the interface information hash
+# ------------------------------------------------------------------------------
+sub ProcessXmlConfigFile {
+
+  # Local variable(s)
+  my @Elements    = ();
+  my $XmlItem     = '';
+  my $XmlElement  = '';
+  my @SlavePorts  = ();
+  my @MasterPorts = ();
+  my $Index1      = 1;
+  my $Index2      = 0;
+  my $SlaveIF     = '';
+  my $MasterIF    = '';
+  my $Name        = '';
+  my $Region      = '';
+
+  # Configure the XML parser
+  ConfigureXmlParser( show_ids => 0, verbose => 0, show_warnings => 0 );
+
+  # Read the specified configuration file
+  RunXmlParser($XmlConfigFile);
+
+  # Display the XML structure when in debug mode
+  if ( $Debug ) { ListXmlHash('ROOT'); }
+
+  # Access mandatory items of information (bus matrix dimensions)
+  @SlavePorts = GetXmlNodeList('//cfgfile/slave_interface');
+  $SlaveInterfaces = scalar @SlavePorts;
+  @MasterPorts = GetXmlNodeList('//cfgfile/master_interface');
+  $MasterInterfaces = scalar @MasterPorts;
+
+  # Access optional items of information
+  @Elements = GetXmlNodeList('/cfgfile');
+  foreach $XmlElement ( @Elements ) {
+    # Assign the extracted value to the appropriate parameter name
+    $XmlItem = GetXmlValue("/cfgfile/$XmlElement");
+    if ( $XmlElement =~ /arbitration_scheme\[1\]$/ ) {
+      $ArbiterType = $XmlItem;
+    } elsif ( $XmlElement =~ /architecture_version\[1\]$/ ) {
+      $ArchitectureType = $XmlItem;
+    } elsif ( $XmlElement =~ /routing_data_width\[1\]$/ ) {
+      $RoutingDataWidth = $XmlItem;
+    } elsif ( $XmlElement =~ /routing_address_width\[1\]$/ ) {
+      $RoutingAddressWidth = $XmlItem;
+    } elsif ( $XmlElement =~ /user_signal_width\[1\]$/ ) {
+      $UserSignalWidth = $XmlItem;
+    } elsif ( $XmlElement =~ /timescales\[1\]$/ ) {
+      $XmlTimescales = $XmlItem;
+    } elsif ( $XmlElement =~ /bus_matrix_name\[1\]$/ ) {
+      $BusMatrixName = $XmlItem;
+    } elsif ( $XmlElement =~ /input_stage_name\[1\]$/ ) {
+      $InputStageName = $XmlItem;
+    } elsif ( $XmlElement =~ /matrix_decode_name\[1\]$/ ) {
+      $MatrixDecodeName = $XmlItem;
+    } elsif ( $XmlElement =~ /output_arbiter_name\[1\]$/ ) {
+      $OutputArbName = $XmlItem;
+    } elsif ( $XmlElement =~ /output_stage_name\[1\]$/ ) {
+      $OutputStageName = $XmlItem;
+    } elsif ( $XmlElement =~ /product_version_info\[1\]$/ ) {
+      $ComponentName = GetXmlValue("/cfgfile/$XmlElement" . '@component_name');
+    } elsif ( $XmlElement !~ /(slave|master)_interface\[\d+\]/ ) {
+      warn "Error: Unknown XML option '$XmlElement'!\n";
+      $Errors++;
+    }
+  }
+
+  # Extract master interface parameter(s) first to simplify the sequence
+  foreach $XmlElement ( @MasterPorts ) {
+
+    # Initialise information container and increment the count
+    $MasterIF = sprintf("MI%d", $Index2++);
+    $Name = GetXmlValue($XmlElement . '@name');
+    $InterfaceInfo{MASTERS}{$MasterIF}{NAME} = $Name;
+    $InterfaceInfo{MASTERS}{$MasterIF}{CONNECTIONS} = [];
+
+    # Add the name to the master alias lookup hash
+    if ( ! exists( $NameAliases{$Name} ) ) {
+      $NameAliases{$Name} = $MasterIF;
+    } else {
+      warn "Error: Interface $MasterIF name '$Name' is not unique!\n";
+      $Errors++;
+    }
+
+  }
+
+  # Extract slave interface parameter(s)
+  foreach $XmlElement ( @SlavePorts ) {
+
+    # Initialise information container
+    $SlaveIF = sprintf("SI%d", $Index1 - 1);
+    $Name = GetXmlValue($XmlElement . '@name');
+    $InterfaceInfo{SLAVES}{$SlaveIF}{NAME} = $Name;
+    $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} = [];
+    $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} = [];
+    $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} = [];
+
+    # Add the name to the slave alias lookup hash
+    if ( ! exists( $NameAliases{$Name} ) ) {
+      $NameAliases{$Name} = $SlaveIF;
+    } else {
+      warn "Error: Interface $SlaveIF name '$Name' is not unique!\n";
+      $Errors++;
+    }
+
+    # Extract connectivity information or assign full connectivity as default
+    @Elements = GetXmlNodeList("//cfgfile/slave_interface[$Index1]/sparse_connect");
+    if ( @Elements > 0 ) {
+      # Initialise or concatenate the connection description string
+      $Connectivity = 'sparse';
+      $Connections = $Connections . sprintf("%s%s -> ", ($Connections eq '') ?
+        '' : "\n" . ' ' x 29, $InterfaceInfo{SLAVES}{$SlaveIF}{NAME});
+
+      # Convert the symbolic interface names to the MI<n> notation
+      foreach $XmlItem ( @Elements ) {
+        # Extract sparse connection attribute and check for existence of the
+        #  named interface
+        $MasterIF = GetXmlValue($XmlItem . '@interface');
+        if ( exists( $NameAliases{$MasterIF} ) ) {
+          push @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} }, $NameAliases{$MasterIF};
+        } else {
+          warn "Error: Interface '$Name' has an unresolved sparse connection '$MasterIF'!\n";
+          $Errors++;
+        }
+        # Append this sparse connection detail
+        $Connections = $Connections . "$MasterIF, ";
+      }
+
+    } else {
+      # Full connectivity is default
+      for ( $Index2 = 0; $Index2 < $MasterInterfaces; $Index2++ ) {
+        push @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} }, 'MI' . $Index2;
+      }
+    }
+
+    # Extract address mapping information
+    @Elements = GetXmlNodeList("//cfgfile/slave_interface[$Index1]/address_region");
+    if ( @Elements > 0 ) {
+      foreach $XmlItem ( @Elements ) {
+        # Determine which master interface this address region is for, and
+        #  check that it exists
+        $MasterIF = GetXmlValue($XmlItem . '@interface');
+        if ( exists( $NameAliases{$MasterIF} ) ) {
+          $Region = sprintf("%s:%s:%s:%s", $NameAliases{$MasterIF},
+                                           GetXmlValue($XmlItem . '@remapping'),
+                                           GetXmlValue($XmlItem . '@mem_lo'),
+                                           GetXmlValue($XmlItem . '@mem_hi'));
+          # Check for duplicated definitions
+          if ( grep $_ eq $Region, @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} } ) {
+            warn "Error: Interface '$Name' has duplicated address region for master interface '$MasterIF'\n";
+            $Errors++;
+          } else {
+            push @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} }, $Region;
+          }
+
+        } else {
+          warn "Error: Address region maps to unknown master interface '$MasterIF'\n";
+          $Errors++;
+        }
+      }
+    } else {
+      warn "Error: Expecting an address region for interface '$SlaveIF'\n";
+      $Errors++;
+    }
+
+    # Extract the optional remapped address information
+    @Elements = GetXmlNodeList("//cfgfile/slave_interface[$Index1]/remap_region");
+    foreach $XmlItem ( @Elements ) {
+      # Determine which master interface this remap region is for, and
+      #  check that it exists
+      $MasterIF = GetXmlValue($XmlItem . '@interface');
+      if ( exists( $NameAliases{$MasterIF} ) ) {
+        $Region = sprintf("%s:remap%s:%s:%s", $NameAliases{$MasterIF},
+                                              GetXmlValue($XmlItem . '@bit'),
+                                              GetXmlValue($XmlItem . '@mem_lo'),
+                                              GetXmlValue($XmlItem . '@mem_hi'));
+        # Check for duplicated definitions
+        if ( grep $_ eq $Region, @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} } ) {
+          warn "Error: Interface '$Name' has duplicated remap region for master interface '$MasterIF'\n";
+          $Errors++;
+        } else {
+          push @{ $InterfaceInfo{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }, $Region;
+        }
+
+      } else {
+        warn "Error: Remap region maps to unknown master interface '$MasterIF'\n";
+        $Errors++;
+      }
+    }
+
+    # Increment index
+    $Index1++;
+  }
+
+  # Remove leading whitespace from the connections detail
+  $Connections =~ s/,\s+$//;
+
+  # Determine connectivity information from master interface perspective
+  for ( $Index1 = 0; $Index1 < $MasterInterfaces; $Index1++ ) {
+    $MasterIF = 'MI' . $Index1;
+    for ( $Index2 = 0; $Index2 < $SlaveInterfaces; $Index2++ ) {
+      $SlaveIF = 'SI' . $Index2;
+      if ( grep $_ eq $MasterIF, @{ $InterfaceInfo{SLAVES}{$SlaveIF}{CONNECTIONS} } ) {
+        push @{ $InterfaceInfo{MASTERS}{$MasterIF}{CONNECTIONS} }, $SlaveIF;
+      }
+    }
+  }
+
+
+}
+
+sub ProcessDataForIPXact {
+
+  # Work on a copy for IPXact
+  %InterfaceInfoIPXact = %{ dclone \%InterfaceInfo };
+
+  my $SlaveIF     = '';
+  my $MasterIF    = '';
+
+  my @address_regions = ();
+  my $address_region;
+  my $remap_region;
+  my $AddrLo       = '';
+  my $AddrHi       = '';
+  my $Remapping    = '';
+  my $r_MasterIF   = '';
+  my $r_AddrLo     = '';
+  my $r_AddrHi     = '';
+  my $r_Remapping  = '';
+  my $new_Remapping= '';
+  my $split_done   = '';
+  my $r_bit        = '';
+  my $r2_bit       = '';
+  my $Unmapping    = '';
+  my $new_Unmapping= '';
+
+  # Convert move to del
+  foreach $SlaveIF (keys %{$InterfaceInfoIPXact{SLAVES}} ) {
+    @address_regions = @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} };
+    foreach $address_region (@address_regions) {
+      ($MasterIF, $Remapping, $AddrLo, $AddrHi) = split(/:/, $address_region);
+      $new_Remapping = $Remapping;
+      if ($Remapping eq 'move') {
+        foreach $remap_region (@{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }) {
+          ($r_MasterIF, $r_Remapping, $r_AddrLo, $r_AddrHi) = split(/:/, $remap_region);
+          $r_bit = substr($r_Remapping, 5);
+          if ($r_MasterIF eq $MasterIF) {
+            if (substr($new_Remapping,0,3) eq "del") {
+              # Check if it's already in the _del_
+              if ($new_Remapping =~ m/.*(del|_|,|\s)$r_bit(_|,|\s|$)/ ) {
+                $new_Remapping = $new_Remapping;
+              } else {
+                $new_Remapping = $new_Remapping . "," . $r_bit;
+              }
+            } else {
+              $new_Remapping = "del" . $r_bit;
+            }
+          }
+        }
+        if ( !($new_Remapping eq $Remapping) ) {
+          $address_region = $MasterIF .":". $new_Remapping .":". $AddrLo .":". $AddrHi;
+          print "Converted " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi . " to " . $new_Remapping . "\n" if $Debug;
+        }
+      }
+    }
+    @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} } = @address_regions;
+  }
+
+  ############################ ADDRESS REGION ############################
+  # Cut address_regions if remap_regions overlap
+  foreach $SlaveIF (keys %{$InterfaceInfoIPXact{SLAVES}} ) {
+
+     # Cut address_regions
+     @address_regions = @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} };
+     foreach $remap_region (@{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }) {
+       ($r_MasterIF, $r_Remapping, $r_AddrLo, $r_AddrHi) = split(/:/, $remap_region);
+       $r_bit = substr($r_Remapping, 5);
+       foreach $address_region (@address_regions) {
+         ($MasterIF, $Remapping, $AddrLo, $AddrHi) = split(/:/, $address_region);
+         # Make new address region remapping type
+         if (substr($Remapping,0,3) eq "del") {
+           # Check if it's already in the _del_
+           if ($Remapping =~ m/.*(del|_|,|\s)$r_bit(_|,|\s|$)/ ) {
+             $new_Remapping = $Remapping;
+           } else {
+             $new_Remapping = $Remapping . "," . $r_bit;
+           }
+         } else {
+           $new_Remapping = "del" . $r_bit;
+         }
+         # Split the address region that is covered by a remap region
+         if ( IsLt( $AddrLo , $r_AddrLo) && IsLt( $r_AddrHi, $AddrHi) ) {
+           $address_region = $MasterIF .":". $new_Remapping .":". $r_AddrLo .":". $r_AddrHi;
+           push (@address_regions, $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1));
+           push (@address_regions, $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi);
+
+           if ($Debug) {
+             print "Splitting for encapsulated  " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi . "\n";
+             print "  Into                      " . $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1) . "\n";
+             print "  Add                       " . $MasterIF .":". $new_Remapping .":". $r_AddrLo .":". $r_AddrHi . "\n";
+             print "  And                       " . $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi . "\n";
+             if (substr($Remapping,0,3) eq "del") {
+               print "^ (Double Del)\n";
+             }
+             print "---------------------------------------------------------------------\n";
+           }
+           redo;
+         } elsif ( IsLt( $AddrLo , $r_AddrLo) && IsLt( $r_AddrLo , $AddrHi) ) {
+           $address_region = $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1);
+           push (@address_regions, $MasterIF .":". $new_Remapping .":". $r_AddrLo .":". $AddrHi);
+
+           if ($Debug) {
+             print "Splitting low region        " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi . "\n";
+             print "  Into                      " . $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1) . "\n";
+             print "  And                       " . $MasterIF .":". $new_Remapping .":". $r_AddrLo .":". $AddrHi . "\n";
+             if (substr($Remapping,0,3) eq "del") {
+               print "^ (Double Del)\n";
+             }
+             print "---------------------------------------------------------------------\n";
+           }
+           redo;
+         } elsif ( IsLt( $AddrLo , $r_AddrHi) && IsLt( $r_AddrHi , $AddrHi) ) {
+           $address_region = $MasterIF .":". $new_Remapping .":". $AddrLo .":". $r_AddrHi;
+           push (@address_regions, $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi);
+           if ($Debug) {
+             print "Splitting high region       " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi . "\n";
+             print "  Into                      " . $MasterIF .":". $new_Remapping .":". $AddrLo .":". $r_AddrHi . "\n";
+             print "  And                       " . $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi . "\n";
+             if (substr($Remapping,0,3) eq "del") {
+               print "^ (Double Del)\n";
+             }
+             print "---------------------------------------------------------------------\n";
+           }
+           redo;
+         } elsif ( IsGtOrEq( $AddrLo , $r_AddrLo) && IsGtOrEq( $r_AddrHi , $AddrHi) && !($new_Remapping eq $Remapping) ) {
+           $address_region = $MasterIF .":". $new_Remapping .":". $AddrLo .":". $AddrHi;
+           if ($Debug) {
+             print "Changed region to deletable " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi . "\n";
+             print "  Into                      " . $MasterIF .":". $new_Remapping .":". $AddrLo .":". $AddrHi . "\n";
+             if (substr($Remapping,0,3) eq "del") {
+               print "^ (Double Del)\n";
+             }
+             print "---------------------------------------------------------------------\n";
+           }
+
+         }
+       }
+     }
+     @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} } =
+       sort {
+              my @split_a = split /:/, $a;
+              my @split_b = split /:/, $b;
+              my $c;
+              my $d;
+              if ( IsLt($split_a[2],$split_b[2]) ) {
+                $c = 1;
+                $d = 2;
+              } else {
+                $c = 2;
+                $d = 1;
+              }
+              $c <=> $d
+#              (hex $split_a[2]) <=> (hex $split_b[2] )
+            } @address_regions;
+
+     ############################ REMAP ############################
+     # Cut remap_regions
+     @address_regions = @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} };  # reusing address_region for remaps
+     foreach $remap_region (@{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} }) {
+       ($r_MasterIF, $r_Remapping, $r_AddrLo, $r_AddrHi) = split(/:/, $remap_region);
+       $r_bit = substr($r_Remapping, 5);
+       foreach $address_region (@address_regions) {
+         ($MasterIF, $Remapping, $AddrLo, $AddrHi, $Unmapping) = split(/:/, $address_region);
+         $r2_bit = substr($Remapping, 5);
+
+         if ($r_bit<$r2_bit) {
+
+           # If there is already an Unmapping defined
+           if ($Unmapping) {
+             # Check if it's already in the _del_
+             if ($Unmapping =~ m/.*(unmap|_|,|\s)$r_bit(_|,|\s|$)/ ) {
+               $new_Unmapping = $Unmapping;
+             } else {
+               $new_Unmapping = $r_bit < $r2_bit ? $Unmapping . "," . $r_bit : $Unmapping;
+             }
+           } else {
+             $new_Unmapping = "unmap " . $r_bit;
+             $Unmapping = '';
+           }
+           # Lower remap bit has higher priority
+
+           # Split the remap region that is covered by another remap region of higher priority
+           if ( IsLt( $AddrLo , $r_AddrLo) && IsLt( $r_AddrHi, $AddrHi) ) {
+             $address_region = $MasterIF .":". $Remapping .":". $r_AddrLo .":". $r_AddrHi.":".$new_Unmapping;
+             push (@address_regions, $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1).":".$Unmapping);
+             push (@address_regions, $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi.":".$Unmapping);
+             if ($Debug) {
+               print "Splitting remap for encapsulated   " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi .":".$Unmapping. "\n";
+               print "  Into                             " . $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1) .":".$Unmapping. "\n";
+               print "  Add                              " . $MasterIF .":". $Remapping .":". $r_AddrLo .":". $r_AddrHi . ":".$new_Unmapping . "\n";
+               print "  And                              " . $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi .":".$Unmapping. "\n";
+               print "---------------------------------------------------------------------\n";
+             }
+             redo;
+           } elsif ( IsLt( $AddrLo , $r_AddrLo) && IsLt( $r_AddrLo , $AddrHi) ) {
+             $address_region = $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1).":".$Unmapping;
+             push (@address_regions, $MasterIF .":". $Remapping .":". $r_AddrLo .":". $AddrHi.":".$new_Unmapping);
+             if ($Debug) {
+               print "Splitting low remap region         " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi .":".$Unmapping. "\n";
+               print "  Into                             " . $MasterIF .":". $Remapping .":". $AddrLo .":". HexSubstract($r_AddrLo,1) .":".$Unmapping. "\n";
+               print "  And                              " . $MasterIF .":". $Remapping .":". $r_AddrLo .":". $AddrHi .":".$new_Unmapping. "\n";
+               print "---------------------------------------------------------------------\n";
+             }
+             redo;
+           } elsif ( IsLt( $AddrLo , $r_AddrHi) && IsLt( $r_AddrHi , $AddrHi) ) {
+             $address_region = $MasterIF .":". $Remapping .":". $AddrLo .":". $r_AddrHi.":".$new_Unmapping;
+             push (@address_regions, $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi.":".$Unmapping);
+             if ($Debug) {
+               print "Splitting high remap region        " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi .":".$Unmapping. "\n";
+               print "  Into                             " . $MasterIF .":". $Remapping .":". $AddrLo .":". $r_AddrHi .":".$new_Unmapping. "\n";
+               print "  And                              " . $MasterIF .":". $Remapping .":". HexAdd($r_AddrHi,1) .":". $AddrHi .":".$Unmapping. "\n";
+               print "---------------------------------------------------------------------\n";
+             }
+             redo;
+           } elsif ( IsGtOrEq( $AddrLo , $r_AddrLo) && IsGtOrEq( $r_AddrHi , $AddrHi) && !($new_Unmapping eq $Unmapping) ) {
+             $address_region = $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi.":".$new_Unmapping;
+             if ($Debug) {
+               print "Changed remap region to unmappable " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi .":".$Unmapping. "\n";
+               print "  Into                             " . $MasterIF .":". $Remapping .":". $AddrLo .":". $AddrHi .":".$new_Unmapping. "\n";
+               print "---------------------------------------------------------------------\n";
+             }
+
+           }
+         }
+       }
+     }
+     @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} } =
+       sort {
+              my @split_a = split /:/, $a;
+              my @split_b = split /:/, $b;
+              my $c;
+              my $d;
+              if ( IsLt($split_a[2],$split_b[2]) ) {
+                $c = 1;
+                $d = 2;
+              } else {
+                $c = 2;
+                $d = 1;
+              }
+              $c <=> $d
+#              (hex $split_a[2]) <=> (hex $split_b[2] )
+            } @address_regions;
+
+
+
+
+    # Sort remap in order of priority
+    @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} } =
+      sort {
+             my @split_a = split /:/, $a;
+             my @split_b = split /:/, $b;
+             substr($split_a[1],5) <=> substr($split_b[1],5)
+           } @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} };
+
+  }
+
+  # Generate Remapstates
+  my @bits;
+  my @c_bits;
+  my $remap_name;
+  foreach $SlaveIF (keys %{$InterfaceInfoIPXact{SLAVES}} ) {
+     @address_regions = @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} };
+     push (@address_regions, @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} });
+     foreach $address_region (@address_regions) {
+        $Unmapping = '';
+        ($MasterIF, $Remapping, $AddrLo, $AddrHi,$Unmapping) = split(/:/, $address_region);
+        @bits = GetRemapBits ($Remapping, $Unmapping);
+        $remap_name = "remap_".join( '_' , @bits );
+        # Change ! to n
+        $remap_name =~ s/!/n/g ;
+
+        # don't put in duplicates
+        if ( @bits && !$RemapStates{$remap_name}) {
+           @{ $RemapStates{$remap_name}} = @bits;
+        }
+     }
+  }
+
+  print "RemapStates:\n" if $Debug;
+  print Dumper(\%RemapStates) if $Debug;
+
+  # Generate AddressSpace regions
+  foreach $SlaveIF (keys %{$InterfaceInfoIPXact{SLAVES}} ) {
+     @address_regions = @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{NORMAL} };
+     push (@address_regions, @{ $InterfaceInfoIPXact{SLAVES}{$SlaveIF}{ADDRESS_MAP}{REMAP} });
+     foreach $address_region (@address_regions) {
+        ($MasterIF, $Remapping, $AddrLo, $AddrHi) = split(/:/, $address_region);
+        if ( !( grep {(@{$_}[0] eq $AddrLo) && (@{$_}[1] eq $AddrHi)} @{ $AddressSpace{$MasterIF} } ) ) {
+           push @{ $AddressSpace{$MasterIF}}, [$AddrLo,$AddrHi];
+        }
+     }
+  }
+
+  # Sort the AddressSpace
+  foreach $MasterIF (keys %AddressSpace) {
+    @{ $AddressSpace{$MasterIF}} = sort {
+              my $c;
+              my $d;
+              if ( IsLt(@{$a}[0],@{$b}[0]) ) {
+                $c = 1;
+                $d = 2;
+              } else {
+                $c = 2;
+                $d = 1;
+              }
+              $c <=> $d
+            } @{ $AddressSpace{$MasterIF}};
+  }
+
+  print "AddressSpace:\n" if $Debug;
+  print Dumper(\%AddressSpace) if $Debug;
+
+  print "InterfaceInfo:\n" if $Debug;
+  print Dumper(\%InterfaceInfo) if $Debug;
+
+  print "InterfaceInfoIPXact:\n" if $Debug;
+  print Dumper(\%InterfaceInfoIPXact) if $Debug;
+
+}
+
+
+# ------------------------------------------------------------------------------
+#   ShowHelp - Displays help dialogue (developer's options are not advertised)
+# ------------------------------------------------------------------------------
+sub ShowHelp {
+
+  # Local variable(s)
+  my $ShowArchitectureOptions = 0;
+
+  printf "%sPurpose:\n" .
+         "   Builds particular configurations of the AHB BusMatrix component.\n\n" .
+         "Usage:\n" .
+         "   Builds an AHB BusMatrix component with a given  number of input\n" .
+         "   ports, a given number of output ports, a particular arbitration\n" .
+         "   scheme and ARM processor interface.\n\n" .
+         "Options:\n" .
+         "   --cfg=FILENAME          Name of an XML configuration file that\n" .
+         "                            defines the bus matrix specification\n" .
+         "                            in place of most command line arguments.\n" .
+         "                            Note that this is the only method to\n" .
+         "                            specify customised address maps.\n".
+         "\n" .
+         "   use these if not using the config file method:\n" .
+         "             --inports=NUM           Number of input (slave) ports ($MinSlaveIF..$MaxSlaveIF).\n" .
+         "             --outports=NUM          Number of output (master) ports ($MinMasterIF..$MaxMasterIF).\n\n" .
+         "             --connectivity='SI0=MI\\{0,1,2}:SI1=MI{3,4,5}'\n\n" .
+
+         "                                     Sparse interconnect declarations. The\n" .
+         "                                      example above means inport 0 connects\n" .
+         "                                      to outports 0, 1 and 2, and inport 1\n" .
+         "                                      connects to outports 3, 4 and 5.\n\n" .
+
+         "             --arb=SCHEME            Arbitration scheme:\n" .
+         "                                      burst - Fixed priority; Master 0 has\n" .
+         "                                               highest priority, does not\n" .
+         "                                               break defined length bursts.\n" .
+         "                                      fixed - Fixed priority; Master 0 has\n" .
+         "                                               highest priority.\n" .
+         "                                      round - Round robin priority; priority\n" .
+         "                                               goes to next available master.\n\n",
+         ( $Verbose ) ? '' : "\n--- $Scriptname ---\n\n";
+
+  # Display option
+  if ( $ShowArchitectureOptions ) {
+    print "          --arch=VER              ARM Processor interface:\n" .
+          "                                   ahb2    - AMBA2.0 interface.\n" .
+          "                                   v6      - All ARM V6 extensions.\n" .
+          "                                   excl    - ARM V6 exclusive access\n" .
+          "                                              extensions only.\n" .
+          "                                   unalign - ARM V6 unaligned and byte-\n" .
+          "                                              strobed access extensions\n" .
+          "                                              only.\n";
+  }
+
+  print "             --datawidth=WIDTH       Width of data bus ($DataWidths).\n" .
+        "             --addrwidth=WIDTH       Width of address bus ($MinAddrWidth..$MaxAddrWidth).\n" .
+        "             --userwidth=WIDTH       Width of user signals ($MinUserWidth..$MaxUserWidth).\n\n" .
+
+        "             --OutputArb=NAME        Name of arbitration component\n" .
+        "                                     (max $MaxNameLength characters).\n" .
+        "             --OutputStage=NAME      Name of output stage component\n" .
+        "                                     (max $MaxNameLength characters).\n" .
+        "             --MatrixDecode=NAME     Name of address decoder component(s)\n" .
+        "                                     (max $MaxNameLength characters).\n" .
+        "             --InputStage=NAME       Name of input stage component\n" .
+        "                                     (max $MaxNameLength characters).\n" .
+        "             --BusMatrix=NAME        Name of top level entity\n" .
+        "                                     (max $MaxNameLength characters).\n\n" .
+
+        "   --ipxact                Alos generates SPIRIT-2009 compatible IPXACT file.\n" .
+        "   --verbose               Prints run information.\n" .
+        "   --help                  Prints this help.\n" .
+        "   --srcdir=DIRNAME        Directory name where source files are\n" .
+        "                            located (defaults to $SourceDir).\n" .
+        "   --tgtdir=DIRNAME        Directory name where RTL files will be\n" .
+        "                            generated (defaults to $TargetDir).\n" .
+        "   --xmldir=DIRNAME        Directory name where XML configuration\n" .
+        "                            files are located (defaults to $XmlDir).\n" .
+        "   --ipxactsrcdir=DIRNAME  Directory name where IPXact source files are\n" .
+        "                            located (defaults to $IPXactSourceDir).\n" .
+        "   --ipxacttgtdir=DIRNAME  Directory name where IPXact files will be\n" .
+        "                            generated (defaults to $IPXactTargetDir).\n" .
+        "   --overwrite             Overwrites existing bus matrix of the\n" .
+        "                            same name.\n" .
+        "   --(no)timescales        Adds or suppressed the '`timescale' directive in the rendered Verilog files.\n" .
+        "   --check                 Disables file generation and just checks the\n" .
+        "                            XML configuration file.\n\n";
+
+  # Abort session with exit code = 0
+  exit (0);
+}
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/lib/xmlparser.pm b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/lib/xmlparser.pm
new file mode 100755
index 0000000..c8b144c
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/bin/lib/xmlparser.pm
@@ -0,0 +1,1393 @@
+# ------------------------------------------------------------------------------
+# The confidential and proprietary information contained in this file may
+# only be used by a person authorised under and to the extent permitted
+# by a subsisting licensing agreement from Arm Limited or its affiliates.
+#
+#   (C) COPYRIGHT 2006-2011,2017 Arm Limited or its affiliates.
+#       ALL RIGHTS RESERVED
+#
+# This entire notice must be reproduced on all copies of this file
+# and copies of this file may only be made by a person if such person is
+# permitted to do so under the terms of a subsisting license agreement
+# from Arm Limited or its affiliates.
+#
+# ------------------------------------------------------------------------------
+# Version and Release Control Information:
+#
+#      File Name           : $RCSfile: xmlparser.pm,v $
+#
+#      SVN Information
+#
+#      Checked In          : $Date: 2011-02-21 17:53:53 +0000 (Mon, 21 Feb 2011) $
+#
+#      Revision            : $Revision: 162121 $
+#
+#      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+#
+# ------------------------------------------------------------------------------
+# Purpose        : Parse XML file input and produce equivalent structure
+#                   hash array, which can be accessed via public methods.
+#
+# Requirements   : Perl version 5.005 or later for thread safety
+#
+# Limitations    : See the POD after the __END__ marker in this file. Try:
+#
+#                    pod2text xmlparser.pm | more
+#
+# ------------------------------------------------------------------------------
+
+eval "exec perl -w -S $0 $@" # -*- Perl -*-
+  if ($running_under_some_sh);
+  undef ($running_under_some_sh);
+
+# Declare module name
+package xmlparser;
+
+# Declare import modules and libraries
+require Exporter;
+use strict;
+use vars qw( $VERSION @ISA @EXPORT @EXPORT_OK %XmlNodeTree %XmlNodeTotals );
+
+# Declare public and private entities
+@ISA     = qw( Exporter );
+
+@EXPORT  = qw( ConfigureXmlParser
+               RunXmlParser
+               ListXmlHash
+               ChangeRelativePath
+               GetXmlNodeList
+               GetXmlValue
+               GetXmlName
+               %XmlNodeTotals
+               %XmlNodeTree );
+
+@EXPORT_OK = qw( %XmlNodeTree );
+
+$VERSION = 1.00;
+
+# Dummy 'lock' routine for non-threaded versions of Perl
+BEGIN {
+  if ( $] < 5.005 ) { eval "sub lock {}"; }
+}
+
+# ------------------------------------------------------------------------------
+
+# Script variables
+my $DebugMode      = 0;
+my $RecursionDepth = 0;
+my $RecursionLimit = 25;
+my $ShowIds        = 0;
+my $ShowWarnings   = 1;
+my $Verbose        = 1;
+my $Warnings       = 0;
+
+# Relative access path, serviced by ChangeRelativePath() function
+my $RelativePath = '';
+
+# Node stack
+my @PathStack = ( 'ROOT' );
+my $PathLevel = 0;
+
+# Exportable global data structure and node counters (note that values and
+#  attributes will be added dynamically when the XML file is parsed)
+%XmlNodeTree = ( ROOT => { ITEMS => {ELEMENTS => [], ATTRIBUTES => []} } );
+%XmlNodeTotals = ( TOTAL => 0, ELEMENTS => 0, ATTRIBUTES => 0 );
+
+
+# ------------------------------------------------------------------------------
+#   PUBLIC: RunXmlParser - Extracts the multi-line value and fields
+# ------------------------------------------------------------------------------
+sub RunXmlParser {
+
+  # Passed parameter 1 is the XML filename
+  my $XmlFilename = shift;
+
+  # Local variable(s)
+  my $TextLine         = '';
+  my $LineCount        = 0;
+  my $LeadingSpace     = 0;
+  my $Delimeter        = '';
+  my $Before           = '';
+  my $After            = '';
+  my $Field            = '';
+  my $Residue          = '';
+  my $InContainer      = 0;
+  my $GotHeader        = 0;
+  my $HeaderMisaligned = 0;
+  my $ContainerType    = '';
+  my $Element          = '';
+  my $EmptyElement     = 0;
+  my $InstanceId       = 1;
+  my $Increment        = 1;
+  my $CurrentPath      = 'ROOT';
+  my $ParentPath       = 'ROOT';
+  my $AttributeCount   = 0;
+  my $ParseEnable      = 1;
+  my ($JustFilename)   = $XmlFilename =~ /([^\/]+)$/;
+
+  # Open the input file
+  open (INPUT_FILE, "<$XmlFilename") or
+    ReportError('Cannot open the specified file for reading');
+
+  print "Parsing the '$JustFilename' file...\n" if ( $Verbose );
+
+  # Process each line of the file
+  while ( $TextLine = <INPUT_FILE> ) {
+
+    # Increment line count
+    $LineCount++;
+
+    # Parse the line(s), when enabled
+    while ( $ParseEnable ) {
+
+      # Remove single line comments, leading or end-of-line whitespace,
+      #  carriage returns, newlines and tab characters. Leading whitespace
+      #  is tracked for checking the <?xml ...?> processing instruction
+      $TextLine =~ s/<!--.*-->//g;
+      $LeadingSpace = ( $TextLine =~ s/^\s+// ) ? 1 : 0;
+      $TextLine =~ s/\s*(\r|\n|\t)$//g;
+
+      # Only process lines that are not blank
+      unless ( $TextLine eq '' ) {
+
+        # Display line when in debug mode
+        if ( $DebugMode ) { printf "Line %-03d: '$TextLine'\n", $LineCount; }
+
+        # Reconstruct fields of text (from multiple lines), which are delimited
+        #  by the reserved characters '<' and '>'. Store the extracted tokens
+        #  in the same order as they are processed. A path stack is used to
+        #  determine the name of the current container. All nodes found within
+        #  the scope of the current container are stored in a keyed list (the
+        #  node structure hash array)
+        if ( ($Delimeter) = $TextLine =~ /([<>])/ ) {
+
+          # Store the patterns before and after the delimeter
+          $Before = $`;
+          $After = $';
+
+          # Determine appropriate action for the '<' delimeter
+          if ( $Delimeter eq '<' ) {
+
+            # Terminate reconstruction of a value field?
+            if ( ! $InContainer ) {
+
+              # Terminate the reconstructed value by concatenating the string
+              #  preceding the '<' delimeter and extracting any residual text
+              $Field = $Field . $Before;
+
+              unless ( $Field eq '' ) {
+                # Display the value when in debug mode
+                if ( $DebugMode ) { print "Value of '$Element' = '$Field'\n"; }
+
+                # Check and store the extracted value
+                CheckValue($Field, $LineCount);
+                $XmlNodeTree{$CurrentPath}{VALUE} = $Field;
+
+                # Clear the field ready for a new reconstruction
+                $Field = '';
+              }
+
+              # Change to the 'in-container' state
+              $InContainer = 1;
+            }
+
+            # Initiate reconstruction of a container field?
+            if ( $InContainer ) {
+
+              # Initiate reconstruction of a new container by storing it and
+              #  testing for the closing delimeter. If found, then trim the
+              #  field accordingly and extract any residual text, else pad
+              #  the field to support multi-line reconstruction
+              $Field = $After;
+              if ( $Field =~ s/>(.*)$// ) {
+                $After = $1;
+                $Before = '';
+                $Delimeter = '>';
+              } else {
+                $Field = $Field . ' ';
+              }
+
+              # If '<?xml' is found then check the alignment of the field
+              unless ( $GotHeader ) {
+                if ( $TextLine =~ /<\?xml/ ) {
+                  $HeaderMisaligned = ($LineCount > 1 or $LeadingSpace);
+                }
+              }
+
+            }
+          }
+
+          # Determine appropriate action for the '>' delimeter
+          if ( $Delimeter eq '>' ) {
+
+            # Determine action for this delimeter
+            if ( ! $InContainer ) {
+
+              # Initiate reconstruction of a new value by storing it and
+              #  testing for the opening delimeter. If found, then trim the
+              #  field accordingly and extract any residual text
+              $Field = $After;
+              if ( $Field =~ s/<(.*)$// ) { $Residue = '<' . $1; }
+
+            } else {
+
+              # Terminate the reconstructed container by concatenating the
+              #  remaining portion and smartly formatting the field to simplify
+              #  pattern-matching. Selectively extract and residual text
+              $Field = TidyXmlContainer($Field . $Before, $LineCount);
+              $Residue = ( $After ne '' ) ? '>' . $After : '';
+
+              # Display the container name when in debug mode
+              if ( $DebugMode ) { print "Container: '$Field'\n"; }
+
+              # Ignore blank fields when produced by the removal of
+              #  multi-line comments
+              unless ( $Field eq '' ) {
+
+                # Check the 'wellformedness' of the reconstructed container
+                CheckWellformedXml($Field, $LineCount);
+
+                # Re-initialise the node reference increment
+                $Increment = 1;
+
+                # Determine container type from beginning of the field, and
+                #  apply appropriate syntax checks
+                $ContainerType = substr($Field, 0, 1);
+                if ( $ContainerType eq '?' ) {
+
+                  # Check processing instructions
+                  if ( $Field =~ /^\?xml/ ) {
+                    unless ( $GotHeader ) {
+                      CheckXmlHeader($Field, $HeaderMisaligned);
+                      $GotHeader = 1;
+                    }
+                  } else {
+                    # Anything else is not supported
+                    ReportError("Unsupported XML processing instruction starting on line $LineCount");
+                  }
+
+                } elsif ( $ContainerType eq '!' ) {
+
+                  # Check declarations
+                  CheckDeclaration($Field, $LineCount);
+
+                } elsif ( $ContainerType =~ /[a-z_.\-\/]/i ) {
+
+                  # Check elements
+                  CheckElement($Field, $LineCount);
+
+                  # Determine element sub-type
+                  if ( $ContainerType ne '/' ) {
+
+                    # Extract and remove the element name
+                    $Field =~ s/([a-z0-9_:\.\-]+)\s?//i;
+                    $Element = $1;
+
+                    # Check if this is an empty element
+                    $EmptyElement = ( $Field =~ /\/$/ ) ? 1 : 0;
+
+                    # Determine the parent path and then post-increment the path stack pointer
+                    $ParentPath = DetermineStructPath($PathLevel++);
+
+                    # For this new element, determine its unique current path. If the key is
+                    #  unique, then initialise the item lists in the current node record
+                    $InstanceId = 1;
+                    while ( 1 ) {
+                      $PathStack[$PathLevel] = sprintf("%s[%d]", $Element, $InstanceId++);
+                      $CurrentPath = DetermineStructPath($PathLevel);
+                      unless ( exists($XmlNodeTree{$CurrentPath}) ) {
+                        $XmlNodeTree{$CurrentPath}{ITEMS}{ELEMENTS} = [];
+                        $XmlNodeTree{$CurrentPath}{ITEMS}{ATTRIBUTES} = [];
+                        last;
+                      }
+                    }
+
+                    # Display element name and path information when in debug mode
+                    if ( $DebugMode ) {
+                      printf "Element (%s): '%s'\nPUSH: Appending path: '%s', Parent path: '%s'\n",
+                        $EmptyElement ? 'empty' : 'open', $PathStack[$PathLevel], $CurrentPath, $ParentPath;
+                    }
+
+                    # Update the item list of the parent node record
+                    push ( @{ $XmlNodeTree{$ParentPath}{ITEMS}{ELEMENTS} }, $PathStack[$PathLevel] );
+
+                    # Extract attributes and add the count to the node total
+                    $AttributeCount = ExtractAttributes($Field, $CurrentPath);
+                    $XmlNodeTotals{ATTRIBUTES} += $AttributeCount;
+
+                    # Display number of extracted attributes when in debug mode
+                    if ( $DebugMode ) {
+                      unless ( $AttributeCount == 0 ) {
+                        print "Extracted $AttributeCount attribute(s) from element '$PathStack[$PathLevel]'\n";
+                      }
+                    }
+
+                    # Selectively decrement the path stack pointer and determine paths
+                    if ( $EmptyElement ) {
+                      $CurrentPath = DetermineStructPath(--$PathLevel);
+                      $ParentPath = DetermineStructPath($PathLevel - 1);
+
+                      # Display current and parent paths when in debug mode
+                      if ( $DebugMode ) {
+                        print "POP: Current path: '$CurrentPath', Parent path: '$ParentPath'\n";
+                      }
+                    }
+
+                  } else {
+
+                    # Decrement the node stack pointer and determine the paths
+                    $CurrentPath = DetermineStructPath(--$PathLevel);
+                    $ParentPath  = DetermineStructPath($PathLevel - 1);
+
+                    # Display paths when in debug mode
+                    if ( $DebugMode ) {
+                      print "POP: Current path: '$CurrentPath', Parent path: '$ParentPath'\n";
+                    }
+
+                    # Disable the node reference increment for closed elements
+                    $Increment = 0;
+
+                  }
+
+                } else {
+                  # Any other type of field is not supported
+                  ReportError("Unrecognised or illegal XML field starting on line $LineCount");
+                }
+
+                # Increment the node counts
+                $XmlNodeTotals{ELEMENTS} += $Increment;
+                $XmlNodeTotals{TOTAL}++;
+
+                # Clear the field ready for a new reconstruction and change to
+                #  the 'in-value' state
+                $Field = '';
+                $InContainer = 0;
+              }
+
+            }
+          }
+
+        } else {
+          # Continue to build the field from multiple lines
+          $Field = $Field . $TextLine;
+        }
+
+      }
+
+      # If a second pass is required to process any residual text from the
+      #  first attempt then remain in this loop, else exit the parsing loop
+      if ( $Residue ne '' ) {
+        # Display residual text when in debug mode
+        if ( $DebugMode ) { print "Residue: '$Residue'\n"; }
+        $TextLine = $Residue;
+        $Residue  = '';
+      } else {
+        $ParseEnable = 0;
+      }
+    }
+
+    # Re-enable parsing for a fresh line of text
+    $ParseEnable = 1;
+  }
+
+  # Check that the root node is properly terminated upon the EOF
+  if ( $PathLevel != 0 ) {
+    ReportError('Unexpected end-of-file due to a syntax error');
+  }
+
+  # Close the XML file
+  close (INPUT_FILE);
+
+  # Display node totals when in verbose mode
+  if ( $Verbose ) {
+    printf "Processed %d line(s) with %d warning(s) - extracted %d XML node(s) [%d, @%d]...\n",
+      $LineCount, $Warnings, $XmlNodeTotals{TOTAL},
+      $XmlNodeTotals{ELEMENTS}, $XmlNodeTotals{ATTRIBUTES};
+  }
+}
+
+
+# ------------------------------------------------------------------------------
+#   TidyXmlContainer - Apply intelligent text formatting to the container
+# ------------------------------------------------------------------------------
+sub TidyXmlContainer {
+
+  # Passed parameter 1 is the container
+  my $Container = shift;
+  # Passed parameter 2 is the line number
+  my $LineNumber = shift;
+
+  # Local variable(s)
+  my $Field = '';
+  my $Quote = '';
+  my $Token = '';
+  my $InQuotes = 0;
+
+  # Check for illegal empty container
+  if ( $Container eq '' ) {
+    ReportError("Empty XML field starting on line $LineNumber");
+  }
+
+  # Remove multi-line comments and end-of-field or leading whitespace
+  $Container =~ s/^!--.*--$//;
+  $Container =~ s/^\s*//;
+  $Container =~ s/\s*$//g;
+
+  # If the container is an element with attributes, then process it with
+  #  respect for embedded whitespace within quoted strings
+  $Field = $Container;
+  while ( ($Quote) = $Field =~ /[^=]+=\s*(['"]).*['"]/ ) {
+
+    # Selectively clear the container string for recomposition
+    if ( $InQuotes == 0 ) { $Container = ''; }
+
+    # Extract portions of the container between matching quote characters
+    #  and process whitespace on alternate iterations
+    while ( $Field =~ s/([^$Quote]+)($Quote*)// ) {
+      $Token = $1 . $2;
+      unless ( $InQuotes % 1 ) {
+        $Token =~ s/\s+/ /g;
+        $Token =~ s/\s?=\s?/=/g;
+      }
+      $Container = $Container . $Token;
+      $InQuotes++;
+    }
+
+  }
+
+  return ($Container);
+}
+
+
+# ------------------------------------------------------------------------------
+#   CheckWellformedXml - Check the 'wellformedness' of the container
+# ------------------------------------------------------------------------------
+sub CheckWellformedXml {
+
+  # Passed parameter 1 is the container
+  my $Container = shift;
+  # Passed parameter 2 is the line number
+  my $LineNumber = shift;
+
+  # Local variable(s)
+  my $BadProcInstr    = ( $Container =~ /^\?/ and
+                          $Container !~ /\?$/ ) ? 1 : 0;
+  my $BadDecl         = ( $Container =~ /^\!/ and
+                          $Container =~ /[\!\?\/]$/ ) ? 1 : 0;
+  my $BadOpenElement  = ( $Container =~ /^[a-z_.\-]/i and
+                          $Container !~ /\/?$/ ) ? 1 : 0;
+  my $BadCloseElement = ( $Container =~ /^\// and
+                          $Container =~ /(=|\/$)/ ) ? 1 : 0;
+
+  # Check and display an error if invalid
+  if ( $BadProcInstr or $BadDecl or $BadOpenElement or $BadCloseElement ) {
+    ReportError("XML field starting on line $LineNumber is not well-formed");
+  }
+}
+
+
+# ------------------------------------------------------------------------------
+#   CheckXmlHeader - Validate the <?xml ...?> header container
+# ------------------------------------------------------------------------------
+sub CheckXmlHeader {
+
+  # Passed parameter 1 is the header
+  my $Header = shift;
+  # Passed parameter 2 is the alignment error flag
+  my $Misaligned = shift;
+
+  # Local variable(s)
+  my $XMLVersion  = '1.0 (default)';
+  my $XMLEncoding = 'iso-8859-1 (default)';
+  my $XMLMode     = 'yes (default)';
+
+  # Announce the header check
+  print "Validating XML header...\n" if ( $Verbose );
+
+  # Check the mis-alignment flag
+  if ( $Misaligned ) {
+    ReportError("The '?xml' declaration must start on line 1, column 1");
+  }
+
+  # Check syntax of supported attributes
+  if ( ($Header !~ /^\?xml[\s\?]/) or
+       ($Header !~ /((version|encoding|standalone)=("[^"]+"|'[^']+'))*/) ) {
+    ReportError("Invalid '<?xml ...?>' processing instruction");
+  }
+
+  # Check version, encoding and standalone (mode) attributes
+  if ( $Header =~ /version=("[^"]+"|'[^']+')/ ) {
+    $XMLVersion = $1; $XMLVersion =~ s/["']//g;
+    if ($XMLVersion ne '1.0') {
+      ReportError('Unsupported XML version');
+    }
+  }
+  if ( $Header =~ /encoding=("[^"]+"|'[^']+')/ ) {
+    $XMLEncoding = $1; $XMLEncoding =~ s/["']//g;
+    if ( $XMLEncoding !~ /^(iso\-8859\-1|UTF\-8)$/ ) {
+      ReportError('Unsupported XML encoding');
+    }
+  }
+  if ( $Header =~ /standalone=("[^"]+"|'[^']+')/ ) {
+    $XMLMode = $1; $XMLMode =~ s/["']//g;
+    if ( $XMLMode !~ /(yes|no)\b/ ) {
+      ReportError('Unsupported standalone declaration');
+    }
+  }
+
+  # Display header settings
+  print "XML version '$XMLVersion', encoding '$XMLEncoding', standalone" .
+        " '$XMLMode'...\n" if ( $Verbose );
+}
+
+
+# ------------------------------------------------------------------------------
+#   CheckDeclaration - Validate the <!... > declaration container
+#                      NOTE: This procedure needs further work if required
+# ------------------------------------------------------------------------------
+sub CheckDeclaration {
+
+  # Passed parameter 1 is the container
+  my $Container = shift;
+  # Passed parameter 2 is the line number
+  my $LineNumber = shift;
+
+  # Local variable(s)
+  my $DeclarationType = '';
+
+  # Check and display an error if invalid
+  if ( ($DeclarationType) = $Container !~ /^\!(DOCTYPE|ENTITY)\b/ ) {
+    ReportError("Unrecognised XML declaration starting on line $LineNumber");
+  }
+}
+
+
+# ------------------------------------------------------------------------------
+#   CheckElement - Validate the element container
+# ------------------------------------------------------------------------------
+sub CheckElement {
+
+  # Passed parameter 1 is the container
+  my $Container = shift;
+  # Passed parameter 2 is the line number
+  my $LineNumber = shift;
+
+  # Local variable(s)
+  my $ElementName    = '';
+  my $AttributeName  = '';
+  my $AttributeValue = '';
+  my $StartQuote     = '';
+  my $EndQuote       = '';
+  my $ForbiddenQuote = '';
+  my %Names          = ();
+
+  # Extract and remove the element name, then check it for illegal
+  #  chacters
+  $Container =~ s/^\/?([^\s]+)\s?//;
+  $ElementName = $1;
+  if ( $ElementName =~ /[^a-z0-9_:\.\-]/i ) {
+    ReportError("XML element starting on line $LineNumber has an illegal name");
+  }
+
+  # If defined, check attributes of element fields. Extract, remove
+  #  and test the LHS and RHS fields of '=' assignments in turn
+  while ( $Container =~ s/([^=]+)=(['"])// ) {
+
+    $AttributeName = $1; $StartQuote = $2;
+    $ForbiddenQuote = ($StartQuote eq '"') ? '"' : "'";
+
+    # Check the attribute name for illegal characters
+    if ( $AttributeName =~ /[^a-z0-9_:\.\-]/i ) {
+      ReportError("XML element starting on line $LineNumber has an illegal attribute name");
+    }
+    # Check the attribute name for duplicates and note unique ones
+    if ( exists($Names{$AttributeName}) ) {
+      ReportError("XML element starting on line $LineNumber has a duplicate attribute name");
+    }
+    $Names{$AttributeName} = ''; # Value unimportant for purpose
+
+    # Extract and remove the attribute value, restoring the container
+    #  field appropriately for the next iteration
+    if ( $Container =~ s/([^=]+)// ) {
+      $AttributeValue = $1;
+      $AttributeValue =~ s/(['"])\s?([^'"]*)$//;
+      $EndQuote = $1; $Container = $2 . $Container;
+
+      # Check the attribute value for illegal characters
+      if ( $AttributeValue =~ /[<>$ForbiddenQuote]/ or
+           ($AttributeValue =~ /&/ and
+            $AttributeValue !~ /&(amp|lt|gt|apos|quot|\#[0-9]{3}|\#x[A-Fa-f0-9]{2});/) ) {
+        ReportError("XML element starting on line $LineNumber has an illegal attribute value");
+      }
+      # Check for misquoted attribute value
+      unless ( $StartQuote eq $EndQuote ) {
+        ReportError("XML element starting on line $LineNumber has a misquoted attribute value");
+      }
+    }
+
+  }
+}
+
+
+# ------------------------------------------------------------------------------
+#   CheckValue - Check the XML value field for illegal characters
+# ------------------------------------------------------------------------------
+sub CheckValue {
+
+  # Passed parameter 1 is the value
+  my $Field = shift;
+  # Passed parameter 2 is the line number
+  my $LineNumber = shift;
+
+  # Local variable(s)
+  my $BadLTGT      = ( $Field =~ /[<>]/ ) ? 1 : 0;
+  my $BadAmpersand = ( $Field =~ /&/ and
+                       $Field !~ /&(amp|lt|gt|apos|quot|\#[0-9]{3}|\#x[A-Fa-f0-9]{2});/ ) ? 1 : 0;
+
+  # Check and display an error if invalid
+  if ( $BadLTGT or $BadAmpersand ) {
+    ReportError("XML value field starting on line $LineNumber contains illegal characters");
+  }
+}
+
+
+# ------------------------------------------------------------------------------
+#   ExtractAttributes - Inspect and extract the attributes from elements
+# ------------------------------------------------------------------------------
+sub ExtractAttributes {
+
+  # Passed parameter 1 is the container
+  my $Container = shift;
+  # Passed parameter 2 is the current path
+  my $Path = shift;
+
+  # Local variable(s)
+  my $Attributes = 0;
+  my $AttributeName = '';
+  my $AttributeValue = '';
+
+  # If defined, check attributes of element fields. Extract, remove
+  #  and test the LHS and RHS fields of '=' assignments in turn
+  while ( $Container =~ s/([^=]+)=['"]// ) {
+    # Store the attribute name
+    $AttributeName = $1;
+
+    # Extract and remove the attribute value, restoring the container
+    #  field appropriately for the next iteration
+    if ( $Container =~ s/([^=]+)// ) {
+      $AttributeValue = $1;
+      $AttributeValue =~ s/['"]\s?([^'"]*)$//;
+      $Container = $1 . $Container;
+
+      # Update the item list in the current node record and then save
+      #  both the attribute name and its value
+      push ( @{ $XmlNodeTree{$Path}{ITEMS}{ATTRIBUTES} },  $AttributeName );
+      $XmlNodeTree{$Path}{ATTRIBUTES}{$AttributeName} = $AttributeValue;
+      $Attributes++;
+    }
+  }
+
+  return ($Attributes);
+}
+
+
+# ------------------------------------------------------------------------------
+#   PUBLIC: ListXmlHash - List contents of the structure, using safe recursion
+# ------------------------------------------------------------------------------
+sub ListXmlHash {
+
+  # Passed parameter 1 is the requested node start point
+  my $NodeKey = shift;
+
+  # Local variable(s)
+  my ($NodeName) = $NodeKey =~ /([^{]+)$/;;
+  my @NodeKeys   = @{ $XmlNodeTree{$NodeKey}{ITEMS}{ELEMENTS} };
+  my $NodeValue  = $XmlNodeTree{$NodeKey}{VALUE};
+  my $NodeItem   = '';
+  my @Markup     = ('', '@');
+
+  # Initially display the 'listing structure' message
+  if ( $RecursionDepth == 0 ) { print "Listing the data structure:\n\n"; }
+
+  # Remove the reference number from the node name
+  unless ( $ShowIds ) { $NodeName = GetXmlName($NodeName); }
+
+  # Display the element name and optional value
+  if ( not defined $NodeValue ) {
+    printf " %s- $NodeName\n", ' ' x ($RecursionDepth * 2);
+  } else {
+    printf " %s- $NodeName = '$NodeValue'\n", ' ' x ($RecursionDepth * 2);
+  }
+
+  # Selectively display attributes
+  foreach $NodeItem ( @{ $XmlNodeTree{$NodeKey}{ITEMS}{ATTRIBUTES} } ) {
+    printf "   %s%s$NodeItem %s= '$XmlNodeTree{$NodeKey}{ATTRIBUTES}{$NodeItem}'\n",
+             ' ' x ($RecursionDepth * 2), $Markup[1 - $ShowIds], $Markup[$ShowIds];
+  }
+
+  # List content of the current node by recursion within limits
+  foreach $NodeItem ( @NodeKeys ) {
+    if ( ++$RecursionDepth > $RecursionLimit ) {
+      ReportError("Recursion depth of $RecursionLimit exceeded");
+    } else {
+      # Interrogate the next level of the hierarchy
+      ListXmlHash("$NodeKey}{$NodeItem");
+    }
+    $RecursionDepth--;
+  }
+}
+
+
+# ------------------------------------------------------------------------------
+#   DetermineStructPath - Determine the structure path key
+# ------------------------------------------------------------------------------
+sub DetermineStructPath {
+
+  # Passed parameter 1 is the level
+  my $RequestedLevel = shift;
+
+  # Local variable(s)
+  my $LevelPointer = 0;
+  my $Result       = 'ROOT';
+
+  # Build the path and remove the outermost pair of braces, else return
+  #  the root node
+  if ( $RequestedLevel > 0 ) {
+    $Result = '';
+    while ( $LevelPointer <= $RequestedLevel ) {
+      $Result = $Result . '{' . $PathStack[$LevelPointer++] . '}';
+    }
+    $Result =~ s/(^{|}$)//g;
+  }
+
+  return ($Result);
+}
+
+
+# ------------------------------------------------------------------------------
+#   'TranslateXPath' - Translates the specified XPath into the nearest match
+#                       access key
+# ------------------------------------------------------------------------------
+sub TranslateXPath {
+
+  # Passed parameter 1 is the specified XPath
+  my $Path = shift;
+
+  # Local variable(s)
+  my @XPathTokens  = [];
+  my $Token        = '';
+  my $Key          = '';
+  my $ResolvedPath = 'ROOT';
+
+  if ( $Path =~ s/^\/// ) {
+    # Determine the key lookup for absolute paths
+    @XPathTokens = split('/', $Path);
+    foreach $Token ( @XPathTokens ) {
+      foreach $Key ( @{ $XmlNodeTree{$ResolvedPath}{ITEMS}{ELEMENTS} } ) {
+        if ( $Key eq $Token or $Key =~ /$Token/ ) {
+          $ResolvedPath = $ResolvedPath . '}{' . $Key;
+          last;
+        }
+      }
+    }
+    $Path = $ResolvedPath;
+  } else {
+    ReportError('Unsupported or badly formed XPath');
+  }
+
+  # Display the translated access key when in debug mode
+  if ( $DebugMode ) { print "Key: '$Path'\n"; }
+
+  return ($Path);
+}
+
+
+# ------------------------------------------------------------------------------
+#   PUBLIC: 'GetXmlName' - Returns the XML node name without uniquifier(s)
+# ------------------------------------------------------------------------------
+sub GetXmlName {
+
+  # Passed parameter 1 is the specified XML node
+  my $XmlNode = shift;
+
+  $XmlNode =~ s/\[\d+\]//g;
+
+  return ($XmlNode);
+}
+
+
+# ------------------------------------------------------------------------------
+#   PUBLIC: 'ChangeRelativePath' - Sets and returns the relative path
+# ------------------------------------------------------------------------------
+sub ChangeRelativePath {
+
+  # Passed parameter 1 is the specified path stem
+  $RelativePath = shift;
+
+  return ($RelativePath);
+}
+
+
+# ------------------------------------------------------------------------------
+#   PUBLIC: 'GetXmlNodeList' - Return child node list for the specified parent
+#                               node. Append '@' character to get attributes
+# ------------------------------------------------------------------------------
+sub GetXmlNodeList {
+
+  # Passed parameter 1 is the requested node
+  my $NodeKey = shift;
+
+  # Local variable(s)
+  my $NodeType  = ( $NodeKey =~ s/@// ) ? 'ATTRIBUTES' : 'ELEMENTS';
+  my $ParentKey = '';
+  my $Key       = '';
+  my $MatchNode = '';
+  my @Nodes     = ();
+
+  # Determine nodename search or specific lookup
+  if ( $NodeKey =~ s/^\/\//\// ) {
+
+    # Translate the XPath, then split it into the parent key and search element
+    $ParentKey = TranslateXPath($NodeKey);
+    if ( $ParentKey =~ s/\}\{([a-z0-9\.\-\_]+)\[1\]$// ) { $MatchNode = $1; }
+
+    # Conditionally search for matching keys and store full paths of matches
+    unless ( $MatchNode eq '' or $NodeKey !~ /$MatchNode$/ ) {
+      foreach $Key ( @{ $XmlNodeTree{$ParentKey}{ITEMS}{$NodeType} } ) {
+        if ( $Key =~ /$MatchNode\[\d+\]/ ) { push @Nodes, "$ParentKey}{$Key"; }
+      }
+    }
+
+  } else {  # Specific look-up
+
+    # Conditionally prepend the current relative path
+    unless ( $NodeKey =~ /^ROOT/ ) { $NodeKey = $RelativePath . $NodeKey; }
+
+    # Translate XPaths when specified
+    if ( $NodeKey =~ /\// ) { $NodeKey = TranslateXPath($NodeKey); }
+
+    # Lookup listing node if it exists
+    if ( exists($XmlNodeTree{$NodeKey}{ITEMS}{$NodeType}) ) {
+      @Nodes = @{ $XmlNodeTree{$NodeKey}{ITEMS}{$NodeType} };
+    } elsif ( $ShowWarnings ) {
+      ReportWarning('Unable to get node list due to non-existent access path');
+    }
+
+  }
+
+  # Display a list of nodes when in debug mode
+  if ( $DebugMode ) { foreach $Key ( @Nodes) { print "List node: '$Key'\n"; } }
+
+  return ( @Nodes );
+}
+
+
+# ------------------------------------------------------------------------------
+#   PUBLIC: 'GetXmlValue' - Extract the value of the specified element.
+#                           Prepend '@' character before name to get attributes
+# ------------------------------------------------------------------------------
+sub GetXmlValue {
+
+  # Passed parameter 1 is the requested node start point
+  my $NodeKey = shift;
+
+  # Local variable(s)
+  my $Attribute = ( $NodeKey =~ s/@(.+)$// ) ? $1 : '';
+  my $Value     = '';
+  my $NoValue   = '';
+
+  # Conditionally prepend the current relative path
+  unless ( $NodeKey =~ /^ROOT/ ) { $NodeKey = $RelativePath . $NodeKey; }
+
+  # Translate XPaths when specified
+  if ( $NodeKey =~ /\// ) { $NodeKey = TranslateXPath($NodeKey); }
+
+  # Lookup the value or attribute node if it exists. It must be coded like this
+  #  to avoid non-existent keys from being incorrectly added to the hash as a
+  #  side effect of the 'exists()' function
+  if ( exists($XmlNodeTree{$NodeKey}) ) {
+    # Now check and extract the element or attribute value
+    if ( $Attribute ne '' ) {
+      if ( exists($XmlNodeTree{$NodeKey}{ATTRIBUTES}{$Attribute}) ) {
+        $Value = $XmlNodeTree{$NodeKey}{ATTRIBUTES}{$Attribute};
+        unless ( defined($Value) ) { $Value = $NoValue; }
+      } elsif ( $ShowWarnings ) {
+        ReportWarning('Access attempted to a non-existent attribute name');
+      }
+    } else {
+      $Value = exists( $XmlNodeTree{$NodeKey}{VALUE} ) ?
+                 $XmlNodeTree{$NodeKey}{VALUE} : $NoValue;
+    }
+  } elsif ( $ShowWarnings ) {
+    ReportWarning("Access attempted to a non-existent element '$NodeKey'");
+  }
+
+  # Perform substitution of ampersand fields
+  if ( $Value =~ /&(quot|apos|lt|gt|amp|#x?[A-Fa-f0-9]+);/ ) {
+    $Value =~ s/&quot;/"/g;
+    $Value =~ s/&apos;/'/g;
+    $Value =~ s/&lt;/</g;
+    $Value =~ s/&gt;/>/g;
+    $Value =~ s/&amp;/&/g;
+    $Value =~ s/&#([A-Fa-f0-9]{3});/chr( scalar $1 )/ge;          # Only UTF-8!
+    $Value =~ s/&#x([A-Fa-f0-9]{2});/chr( hex( scalar $1 ) )/ge;  # Only UTF-8!
+  }
+
+  return ( $Value );
+}
+
+
+# ------------------------------------------------------------------------------
+#   PUBLIC: 'ConfigureXmlParser' - Configure aspects of module behaviour
+# ------------------------------------------------------------------------------
+sub ConfigureXmlParser {
+
+  # Passed parameter 1 is the hash array of options
+  my %XmlParserOptions = @_;
+
+  # Local variable(s)
+  my @Keys   = keys( %XmlParserOptions );
+  my $Item   = '';
+  my $Result = 0;
+
+  # Extract values and execute requested actions
+  foreach $Item ( @Keys ) {
+    if ($Item eq 'debug_mode' and $XmlParserOptions{$Item} ) {
+      $DebugMode = 1;
+    } elsif ( $Item eq 'recursion_limit' and $XmlParserOptions{$Item} > 0 ) {
+      $RecursionLimit = $XmlParserOptions{$Item};
+    } elsif ( $Item eq 'reset' and $XmlParserOptions{$Item} ) {
+      %XmlNodeTree = ( ROOT => { ITEMS => {ELEMENTS => [], ATTRIBUTES => []} } );
+      %XmlNodeTotals = ( TOTAL => 0, ELEMENTS => 0, ATTRIBUTES => 0 );
+      @PathStack = ( 'ROOT' );
+      $PathLevel = 0;
+      $RelativePath = '';
+    } elsif ( $Item eq 'show_ids' ) {
+      $ShowIds = ( $XmlParserOptions{$Item} ) ? 1 : 0;
+    } elsif ( $Item eq 'show_warnings' ) {
+      $ShowWarnings = ( ! $XmlParserOptions{$Item} ) ? 0 : 1;
+    } elsif ( $Item eq 'verbose' ) {
+      $Verbose = ( $XmlParserOptions{$Item} ) ? 1 : 0;
+    } else {
+      $Result = 1; # Flag a return code error
+    }
+  }
+  return ( $Result );
+}
+
+
+# ------------------------------------------------------------------------------
+#   ReportError - Reports an error message on STDOUT and forces exit(1)
+# ------------------------------------------------------------------------------
+sub ReportError {
+
+  # Passed parameter 1 is the error message
+  my $ErrorMessage = shift;
+
+  print "ERROR (xmlparser): $ErrorMessage - aborting!\n\n";
+  exit 1;
+}
+
+
+# ------------------------------------------------------------------------------
+#   ReportWarning - Reports a warning message on STDOUT
+# ------------------------------------------------------------------------------
+sub ReportWarning {
+
+  # Passed parameter 1 is the warning message
+  my $WarningMessage = shift;
+
+  print "WARNING (xmlparser): $WarningMessage!\n\n";
+  $Warnings++;
+}
+
+1;
+
+__END__
+
+
+# ------------------------------------------------------------------------------
+#   POD section (formatting is sensitive to blankline whitespace!)
+# ------------------------------------------------------------------------------
+
+=pod
+
+=head1 NAME
+
+xmlparser - Standalone XML parser with hash array output
+
+=head1 SYNOPSIS
+
+Example usage:
+
+  # Reference the module
+  use xmlparser;
+
+  # Configure parser options, parse the file and list its structure
+  ConfigureXmlParser( verbose => 0, reset => 1 );
+  RunXmlParser('my.xml');
+  ListXmlHash('ROOT');
+
+  # Access specific groups of elements
+  my @MyElements = GetXmlNodeList('/myxml/mynames');
+  my $Element    = '';
+  my $Attribute  = '';
+
+  foreach $Element ( @MyElements ) {
+    ChangeRelativePath('/myxml/mynames/');
+    printf "Element '%s'='%s'\n", GetXmlName($Element), GetXmlValue($Element);
+
+    foreach $Attribute ( GetXmlNodeList("\@$Element") ) {
+      ChangeRelativePath("/myxml/mynames/$Element/");
+      printf "Attribute '$Attribute'='%s'\n", GetXmlValue("\@$Attribute");
+    }
+  }
+
+=head1 DESCRIPTION
+
+In the absence of complete documentation, this section contains the
+best source of information.
+
+=head2 DOCUMENTATION
+
+Documentation about this module does not yet exist for developers
+within ARM Limited, but this section will provide essential clues
+to the usage.
+
+=head2 PRINCIPLES
+
+This multi-line parser will extract elements and value text separated
+by <tagged_delimeters>. XML directives and declarations are treated as
+exceptions and these values will not be added to the hash array.
+
+The parsing algorithm alternates between these two states:
+
+=over 3
+
+=item 1.
+
+  Accumulate value fields until detection of '<' character and
+  then change to the 'in-container' state.
+
+=item 2.
+
+  Accumulate element fields until detection of '>' character and
+  then change to the 'in-value' state if an end of element is detected.
+
+=back
+
+Upon successfully identifying the closing brace of an element field,
+a new item is added to the child element list at the current level of
+hierarchy. A new hash key, bearing the element name, is added and
+the new hierarchical path is pushed onto the stack. For hierarchical
+reference, the current path and parent path are updated. Attributes
+are extracted and placed into a separate key-value node, using the
+same principles. The parser changes state to accumulate text fields.
+Upon closure of the element container, i.e. the next opening brace,
+the accumulated text is assigned as the value of the current element.
+Also upon this event, the path stack is popped and hierarchical paths
+are re-evaluated. Every extracted field is checked for legal composition.
+Elements and attributes are checked for wellformedness.
+
+The following example will show the relationship:
+
+B<XML source:>
+
+  <cfgfile>
+    <my_element animal="dog"/>
+    <my_element>
+      cat
+    </my_element>
+  </cfgfile>
+
+B<Storage structure:>
+
+  my %XmlNodeTree = (
+                      ROOT => {
+                        ITEMS => {
+                          ELEMENTS => [ cfgfile[1] ],
+                          ATTRIBUTES => []
+                        }
+                      }
+                      ROOT}{cfgfile[1] => {
+                        ITEMS => {
+                          ELEMENTS => [ my_element[1], my_element[2] ],
+                          ATTRIBUTES => []
+                        }
+                      }
+                      ROOT}{cfgfile[1]}{my_element[1] => {
+                        ITEMS => {
+                          ELEMENTS => [],
+                          ATTRIBUTES => [ animal ]
+                        }
+                        ATTRIBUTES => {
+                          animal => 'dog'
+                        }
+                      }
+                      ROOT}{cfgfile[1]}{my_element[2] => {
+                        ITEMS => {
+                          ELEMENTS => [],
+                          ATTRIBUTES => []
+                        }
+                        VALUE => 'cat'
+                      }
+                    );
+
+B<Extracted structure:>
+
+  - ROOT
+    - cfgfile
+      - my_element
+        @value = 'dog'
+      - my_element = 'cat'
+
+
+Note that data is stored in the hash array using a pseudo hierarchical
+method. This makes it very simple to use grep when needing to find
+specifically named elements.
+
+To interrogate the hash array, it is recommended to use the public
+access functions GetXmlNodes() and GetXmlValue(). These functions will
+translate a basic XPath notation into keys for hash access and perform
+substitution of escaped character sequences.
+
+=head1 FUNCTIONS
+
+Currently, there are only a few public methods available. This section
+describes each one.
+
+=head2 ConfigureXmlParser(<key-value pairs>)
+
+Use this procedure to modify the behaviour of the parser, e.g. to reset
+the hash array. It accepts the following key-value pairs, also shown in
+the above example:
+
+=over 3
+
+=item *
+
+debug_mode => <integer: 0|1> - show debugging information.
+
+=item *
+
+recursion_limit => <integer: 1..n> - for the B<ListXmlHash()> fn.
+
+=item *
+
+reset => <integer: 0|1> - resets the hash and stack.
+
+=item *
+
+verbose => <integer: 0|1> - modifies verbosity, e.g. quiet mode.
+
+=item *
+
+show_ids => <integer: 0|1> - shows actual hash keynames.
+
+=item *
+
+show_warnings => <integer: 0|1> - control reports of warnings.
+
+=back
+
+Further options may be added over time.
+
+=head2 RunXmlParser(<xml_filename>)
+
+Use this procedure to read in the specified XML file. Ensure that
+you reset the hash array before attempting to read another file - see
+B<ConifigureXmlParser()>.
+
+=head2 ListXmlHash(<starting_key>)
+
+Use this procedure to verify the extraction process. All data is
+contained under the B<'ROOT'> node, so this is often the only key
+that you should specify.
+
+=head2 ChangeRelativePath(<xpath or key>)
+
+This function sets the relative path to be prepended to the specified
+argument when calling the B<GetXmlNodeList()> and B<GetXmlValue()>
+public access functions. Building XPaths and keys is more managable
+this way.
+
+=head2 GetXmlNodeList(<xpath or key>)
+
+Use this function to obtain the list of child elements or a list of
+attributes under the specified hierarchical level. By specifying the
+'@' character in the XPath or at the end of the key, you can request
+attributes instead of elements. Access to a non-existent xpath or key
+will return a zero-item list.
+
+=head2 GetXmlValue(<xpath or key>)
+
+Use this function to obtain the value of the element or attribute
+under the specified hierarchical level. By specifying the '@' character
+at the start of the attribute name (i.e. the rightmost item in the
+XPath or key), you can request attributes instead of elements. Access
+to a non-existent xpath or key will return a zero-length string. Access
+to elements or attributes without value will return a zero-length string.
+
+The following 'escaped' characters will be substituted to their
+true ASCII character:
+
+=over 3
+
+=item *
+
+&quot; -> "
+
+=item *
+
+&apos; -> '
+
+=item *
+
+&lt; -> <
+
+=item *
+
+&gt; -> >
+
+=item *
+
+&amp; -> &
+
+=item *
+
+&#x<2_hex_chars>; -> equivalent hexadecimal character
+
+=item *
+
+&#<3_dec_chars>; -> equivalent decimal character
+
+=back
+
+=head2 GetXmlName(<item string>)
+
+Removes the uniquifying index from the hash key item and returns the
+originally named item.
+
+=head2 Direct hash access
+
+Knowing the format of key structure will allow you to perform access
+to the hash array directly. You always need to know something about the
+information structure in order to specify an XPath or key. This is
+true even when letting XSLT do the work!
+
+With reference to the example shown above, to access the 2nd element,
+you would need to recreate this key:
+
+  # Direct access of an element
+  my $Value = $XmlNodeTree{'ROOT}{cfgfile[1]}{my_element[2]'}{VALUE};
+
+  # Direct access of an attribute
+  my $Attribute = $XmlNodeTree{'ROOT}{cfgfile[1]}{my_element[1]'}{ATTRIBUTES}{animal};
+
+
+To access the desired positional element without hardcoding the node
+keys, you could try resolving this through the appropriate ITEMS array
+which records the ordering of all child items at the access level.
+Examples of this are shown below:
+
+  # Set-up
+  use xmlparser;                       # Load the XML parser module
+  use xmlparser qw ( %XmlNodeTree );   # Request direct hash access
+
+  # Indirectly access the 2nd 'my_element' element
+  my $EI = $XmlNodeTree{'ROOT}{cfgfile[1]'}{ITEMS}{ELEMENTS}[1];
+  my $Value = $XmlNodeTree{"ROOT}{cfgfile[1]}{$EI"}{VALUE};
+
+  # Indirectly access the 1st attribute of the 1st element
+  my $EI = $XmlNodeTree{'ROOT}{cfgfile[1]'}{ITEMS}{ELEMENTS}[0];
+  my $AI = $XmlNodeTree{"ROOT}{cfgfile[1]}{$EI"}{ITEMS}{ATTRIBUTES}[0];
+  my $Value = $XmlNodeTree{"ROOT}{cfgfile[1]}{$EI"}{ATTRIBUTES}{$AI};
+
+As will be appreciated, this is quite complicated! Therefore it is
+better to use the public access functions for ease of use. Your choice.
+
+=head1 SUPPORT
+
+The following support issues are noted under this section.
+
+=head2 Regarding XML
+
+This is a lightweight parser, compliant to only a subset of the
+XML 1.0 standard. Namespaces are supported at a basic level, that
+is, the ':' character is permitted in element names. The following
+support issues are defined below:
+
+=over 3
+
+=item 1.
+
+The ENTITY declaration is not fully implemented and there is no
+preprocessor for expanding macros instantiated by the '&MyFile;'
+notation.
+
+=item 2.
+
+The DOCTYPE declaration is not fully implemented and there is no
+support for DTD or XML-Schema. Checks can be performed efficiently
+by writing a customised checking procedure within the PERL domain.
+
+=item 4.
+
+Only the '<?xml ?>' processing instruction is supported as far as
+basic validation.
+
+=item 5.
+
+Only character sets 'iso-8859-1' and 'UTF-8' are accepted in the
+header check.
+
+=item 6.
+
+Elements embedded in the <emphasis>middle</emphasis> of value fields,
+like the 'emphasis' tag you have just read, are not supported. It will
+truncate the text value and prepend the remainder to the value of the
+next element.
+
+=back
+
+=head2 Regarding XPath and XPointer
+
+The XPath facility of the public access functions is only a basic
+provision. It only translates very simple XPaths into access-key
+notation, and it does not support any of the XPath functions. The
+XPointer notation allows indexed dereferencing of specific elements.
+This is sufficient to get the values of elements and attributes.
+Some examples of XPath and XPointer interpretations are shown below:
+
+  '/myxml'    = 'ROOT}{myxml[1]'                         # Absolute
+  '/myxml[1]' = 'ROOT}{myxml[1]'
+
+  'myxml'     = 'myxml[1]'                               # Relative
+  'myxml[2]   = 'myxml[2]'
+
+  '//myxml' = [ 'ROOT}{myxml[1]' 'ROOT}{myxml[2]' ... ]  # Search
+
+Generally speaking, the relationship is to convert '/' characters into
+'}{' brace-pairs, and to assume the first item when resolving non-indexed
+references.
+
+=head1 STATUS
+
+This version (1.00) is the current initial version, dated 11th January 2007.
+
+=head1 SEE ALSO
+
+This is a customised standalone module. There are no references to other
+modules from the developers community. Information for developers may be
+obtained through internal ARM documentation.
+
+=head1 COPYRIGHT
+
+Copyright 2006 ARM Limited. All rights reserved <support@arm.com>
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself. However, because this file is supplied
+to support licenced IP from ARM Limited, please carefully check the terms
+and conditions defined in your legal agreement with ARM Limited.
+
+=cut
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/gen_soclabs_4x7_AhbMatrix.scr b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/gen_soclabs_4x7_AhbMatrix.scr
new file mode 100644
index 0000000..3be03d7
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/gen_soclabs_4x7_AhbMatrix.scr
@@ -0,0 +1,2 @@
+bin/BuildBusMatrix.pl -xmldir xml -cfg soclabs_ahb32_4x7.xml -ipxact -ipxactsrcdir=ipxact/src -ipxacttgtdir=ipxact/built -over -verbose >& soclabs_ahb32_4x7.log
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.xml b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.xml
new file mode 100644
index 0000000..ccf604e
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.xml
@@ -0,0 +1,4257 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--    The confidential and proprietary information contained in this file may     -->
+<!--    only be used by a person authorised under and to the extent permitted       -->
+<!--    by a subsisting licensing agreement from ARM Limited or its affiliates.     -->
+<!--                                                                                -->
+<!--           (C) COPYRIGHT 2001-2017 ARM Limited or its affiliates.               -->
+<!--               ALL RIGHTS RESERVED                                              -->
+<!--                                                                                -->
+<!--    This entire notice must be reproduced on all copies of this file            -->
+<!--    and copies of this file may only be made by a person if such person is      -->
+<!--    permitted to do so under the terms of a subsisting license agreement        -->
+<!--    from ARM Limited or its affiliates.                                         -->
+<!--                                                                                -->
+<!--      SVN Information                                                           -->
+<!--                                                                                -->
+<!--      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $  -->
+<!--                                                                                -->
+<!--      Revision            : $Revision: 371321 $                                 -->
+<!--                                                                                -->
+<!--      Release Information : Cortex-M System Design Kit-r1p1-00rel0  -->
+<!--                                                                                -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--  Purpose  : IP-XACT description for the main top of soclabs_4x7_AhbMatrix     -->
+<!--                                                                                -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -    -->
+
+<spirit:component xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009"
+                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                  xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009/index.xsd">
+   <spirit:vendor>arm.com</spirit:vendor>
+   <spirit:library>CoreLink</spirit:library>
+   <spirit:name>soclabs_4x7_AhbMatrix</spirit:name>
+   <spirit:version>r0p0_0</spirit:version>
+
+   <spirit:busInterfaces>
+
+      <!--Slave interfaces -->
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Slave__adp</spirit:name>
+         <spirit:description>Slave port _adp</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:slave>
+            <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteTarget_Slave__adp_MM"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/>
+         </spirit:slave>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!-- HMASTER_adp unmapped -->
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADY_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_adp</spirit:name>
+                 <spirit:vector>
+                    <spirit:left>0</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Slave__dma</spirit:name>
+         <spirit:description>Slave port _dma</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:slave>
+            <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteTarget_Slave__dma_MM"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/>
+         </spirit:slave>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!-- HMASTER_dma unmapped -->
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADY_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_dma</spirit:name>
+                 <spirit:vector>
+                    <spirit:left>0</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Slave__dma2</spirit:name>
+         <spirit:description>Slave port _dma2</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:slave>
+            <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteTarget_Slave__dma2_MM"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/>
+         </spirit:slave>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!-- HMASTER_dma2 unmapped -->
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADY_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_dma2</spirit:name>
+                 <spirit:vector>
+                    <spirit:left>0</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Slave__cpu</spirit:name>
+         <spirit:description>Slave port _cpu</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:slave>
+            <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteTarget_Slave__cpu_MM"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/>
+         </spirit:slave>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!-- HMASTER_cpu unmapped -->
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADY_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_cpu</spirit:name>
+                 <spirit:vector>
+                    <spirit:left>0</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+        <!--Master interfaces -->
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master__rom1</spirit:name>
+         <spirit:description>Master port _rom1</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__rom1_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!-- HMASTER_rom1 unmapped -->
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_rom1</spirit:name>
+                 <spirit:vector>
+                    <spirit:left>0</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master__ram2</spirit:name>
+         <spirit:description>Master port _ram2</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram2_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!-- HMASTER_ram2 unmapped -->
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_ram2</spirit:name>
+                 <spirit:vector>
+                    <spirit:left>0</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master__ram3</spirit:name>
+         <spirit:description>Master port _ram3</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram3_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!-- HMASTER_ram3 unmapped -->
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_ram3</spirit:name>
+                 <spirit:vector>
+                    <spirit:left>0</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master__sys</spirit:name>
+         <spirit:description>Master port _sys</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__sys_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!-- HMASTER_sys unmapped -->
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_sys</spirit:name>
+                 <spirit:vector>
+                    <spirit:left>0</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master__ram8</spirit:name>
+         <spirit:description>Master port _ram8</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram8_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!-- HMASTER_ram8 unmapped -->
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_ram8</spirit:name>
+                 <spirit:vector>
+                    <spirit:left>0</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master__ram9</spirit:name>
+         <spirit:description>Master port _ram9</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram9_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!-- HMASTER_ram9 unmapped -->
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_ram9</spirit:name>
+                 <spirit:vector>
+                    <spirit:left>0</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master__exp</spirit:name>
+         <spirit:description>Master port _exp</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__exp_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!-- HMASTER_exp unmapped -->
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_exp</spirit:name>
+                 <spirit:vector>
+                    <spirit:left>0</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <!--Scan test dummy signals -->
+      <spirit:busInterface>
+         <spirit:name>DFTInterface_Slave</spirit:name>
+         <spirit:description>Scan test dummy signals, not connected until scan insertion</spirit:description>
+         <spirit:busType spirit:library="generic" spirit:name="DFTInterface" spirit:vendor="arm.com" spirit:version="r0p0_1"/>
+         <spirit:abstractionType spirit:library="generic" spirit:name="DFTInterface_rtl" spirit:vendor="arm.com" spirit:version="r0p0_1"/>
+         <spirit:slave/>
+         <spirit:portMaps>
+
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>CLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>RESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>DFTSCANMODE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>SCANENABLE</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>DFTSI</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>SCANINHCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>DFTSO</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>SCANOUTHCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+   </spirit:busInterfaces>
+
+   <spirit:remapStates>
+
+      <spirit:remapState>
+          <spirit:name>remap_0</spirit:name>
+          <spirit:description>Remap state remap_0</spirit:description>
+          <spirit:remapPorts>
+             <spirit:remapPort spirit:portNameRef="REMAP" spirit:portIndex="0">1</spirit:remapPort>
+          </spirit:remapPorts>
+      </spirit:remapState>
+      <spirit:remapState>
+          <spirit:name>remap_n0</spirit:name>
+          <spirit:description>Remap state remap_n0</spirit:description>
+          <spirit:remapPorts>
+             <spirit:remapPort spirit:portNameRef="REMAP" spirit:portIndex="0">0</spirit:remapPort>
+          </spirit:remapPorts>
+      </spirit:remapState>
+
+   </spirit:remapStates>
+
+   <spirit:addressSpaces>
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master__rom1_AS</spirit:name>
+          <spirit:description>_rom1 address space</spirit:description>
+          <spirit:range>4G</spirit:range>
+          <spirit:width>32</spirit:width>
+          <spirit:segments>
+             <spirit:segment>
+                <spirit:name>_rom1_0x00000000_0x0fffffff</spirit:name>
+                <spirit:addressOffset>0x00000000</spirit:addressOffset>
+                <spirit:range>0x010000000</spirit:range>
+             </spirit:segment>
+             <spirit:segment>
+                <spirit:name>_rom1_0x10000000_0x1fffffff</spirit:name>
+                <spirit:addressOffset>0x10000000</spirit:addressOffset>
+                <spirit:range>0x010000000</spirit:range>
+             </spirit:segment>
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master__ram2_AS</spirit:name>
+          <spirit:description>_ram2 address space</spirit:description>
+          <spirit:range>4G</spirit:range>
+          <spirit:width>32</spirit:width>
+          <spirit:segments>
+             <spirit:segment>
+                <spirit:name>_ram2_0x00000000_0x0fffffff</spirit:name>
+                <spirit:addressOffset>0x00000000</spirit:addressOffset>
+                <spirit:range>0x010000000</spirit:range>
+             </spirit:segment>
+             <spirit:segment>
+                <spirit:name>_ram2_0x20000000_0x2fffffff</spirit:name>
+                <spirit:addressOffset>0x20000000</spirit:addressOffset>
+                <spirit:range>0x010000000</spirit:range>
+             </spirit:segment>
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master__ram3_AS</spirit:name>
+          <spirit:description>_ram3 address space</spirit:description>
+          <spirit:range>4G</spirit:range>
+          <spirit:width>32</spirit:width>
+          <spirit:segments>
+             <spirit:segment>
+                <spirit:name>_ram3_0x30000000_0x3fffffff</spirit:name>
+                <spirit:addressOffset>0x30000000</spirit:addressOffset>
+                <spirit:range>0x010000000</spirit:range>
+             </spirit:segment>
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master__sys_AS</spirit:name>
+          <spirit:description>_sys address space</spirit:description>
+          <spirit:range>4G</spirit:range>
+          <spirit:width>32</spirit:width>
+          <spirit:segments>
+             <spirit:segment>
+                <spirit:name>_sys_0x40000000_0x5fffffff</spirit:name>
+                <spirit:addressOffset>0x40000000</spirit:addressOffset>
+                <spirit:range>0x020000000</spirit:range>
+             </spirit:segment>
+             <spirit:segment>
+                <spirit:name>_sys_0xf0000000_0xf003ffff</spirit:name>
+                <spirit:addressOffset>0xf0000000</spirit:addressOffset>
+                <spirit:range>0x000040000</spirit:range>
+             </spirit:segment>
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master__ram8_AS</spirit:name>
+          <spirit:description>_ram8 address space</spirit:description>
+          <spirit:range>4G</spirit:range>
+          <spirit:width>32</spirit:width>
+          <spirit:segments>
+             <spirit:segment>
+                <spirit:name>_ram8_0x80000000_0x8fffffff</spirit:name>
+                <spirit:addressOffset>0x80000000</spirit:addressOffset>
+                <spirit:range>0x010000000</spirit:range>
+             </spirit:segment>
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master__ram9_AS</spirit:name>
+          <spirit:description>_ram9 address space</spirit:description>
+          <spirit:range>4G</spirit:range>
+          <spirit:width>32</spirit:width>
+          <spirit:segments>
+             <spirit:segment>
+                <spirit:name>_ram9_0x90000000_0x9fffffff</spirit:name>
+                <spirit:addressOffset>0x90000000</spirit:addressOffset>
+                <spirit:range>0x010000000</spirit:range>
+             </spirit:segment>
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master__exp_AS</spirit:name>
+          <spirit:description>_exp address space</spirit:description>
+          <spirit:range>4G</spirit:range>
+          <spirit:width>32</spirit:width>
+          <spirit:segments>
+             <spirit:segment>
+                <spirit:name>_exp_0x60000000_0x7fffffff</spirit:name>
+                <spirit:addressOffset>0x60000000</spirit:addressOffset>
+                <spirit:range>0x020000000</spirit:range>
+             </spirit:segment>
+             <spirit:segment>
+                <spirit:name>_exp_0xa0000000_0xdfffffff</spirit:name>
+                <spirit:addressOffset>0xa0000000</spirit:addressOffset>
+                <spirit:range>0x040000000</spirit:range>
+             </spirit:segment>
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+
+   </spirit:addressSpaces>
+
+   <spirit:memoryMaps>
+
+      <spirit:memoryMap>
+         <spirit:name>AHBLiteTarget_Slave__adp_MM</spirit:name>
+         <spirit:description>_adp memory map</spirit:description>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1"
+                             spirit:segmentRef="_rom1_0x10000000_0x1fffffff">
+            <!-- Address_region 0x10000000-0x1fffffff -->
+            <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x10000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                             spirit:segmentRef="_ram2_0x20000000_0x2fffffff">
+            <!-- Address_region 0x20000000-0x2fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x20000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3"
+                             spirit:segmentRef="_ram3_0x30000000_0x3fffffff">
+            <!-- Address_region 0x30000000-0x3fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x30000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys"
+                             spirit:segmentRef="_sys_0x40000000_0x5fffffff">
+            <!-- Address_region 0x40000000-0x5fffffff -->
+            <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x40000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0x60000000_0x7fffffff">
+            <!-- Address_region 0x60000000-0x7fffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x60000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8"
+                             spirit:segmentRef="_ram8_0x80000000_0x8fffffff">
+            <!-- Address_region 0x80000000-0x8fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x80000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9"
+                             spirit:segmentRef="_ram9_0x90000000_0x9fffffff">
+            <!-- Address_region 0x90000000-0x9fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x90000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0xa0000000_0xdfffffff">
+            <!-- Address_region 0xa0000000-0xdfffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0xa0000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys"
+                             spirit:segmentRef="_sys_0xf0000000_0xf003ffff">
+            <!-- Address_region 0xf0000000-0xf003ffff -->
+            <spirit:name>AHBLiteTarget_Master__sys_0xf0000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0xf0000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:memoryRemap spirit:state="remap_0">
+            <spirit:name>AHBLiteTarget_Slave__adp_remap_0_remap_MM</spirit:name>
+            <spirit:description>_adp remap_0 remap</spirit:description>
+            <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                                spirit:segmentRef="_ram2_0x00000000_0x0fffffff">
+               <!-- Remapped region, active when REMAP bitcombination is 0 address_region 0x00000000-0x0fffffff -->
+               <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_remap_0_SM</spirit:name>
+               <spirit:baseAddress>0x00000000</spirit:baseAddress>
+            </spirit:subspaceMap>
+         </spirit:memoryRemap>
+
+         <spirit:memoryRemap spirit:state="remap_n0">
+            <spirit:name>AHBLiteTarget_Slave__adp_remap_n0_remap_MM</spirit:name>
+            <spirit:description>_adp remap_n0 remap</spirit:description>
+            <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1"
+                                spirit:segmentRef="_rom1_0x00000000_0x0fffffff">
+               <!-- Removable region, active only when REMAP bitcombination is n0 address_region 0x00000000-0x0fffffff -->
+               <spirit:name>AHBLiteTarget_Master__rom1_0x00000000_0_state_remap_n0_SM</spirit:name>
+               <spirit:baseAddress>0x00000000</spirit:baseAddress>
+            </spirit:subspaceMap>
+         </spirit:memoryRemap>
+
+      </spirit:memoryMap>
+
+      <spirit:memoryMap>
+         <spirit:name>AHBLiteTarget_Slave__dma_MM</spirit:name>
+         <spirit:description>_dma memory map</spirit:description>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                             spirit:segmentRef="_ram2_0x00000000_0x0fffffff">
+            <!-- Address_region 0x00000000-0x0fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x00000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1"
+                             spirit:segmentRef="_rom1_0x10000000_0x1fffffff">
+            <!-- Address_region 0x10000000-0x1fffffff -->
+            <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x10000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                             spirit:segmentRef="_ram2_0x20000000_0x2fffffff">
+            <!-- Address_region 0x20000000-0x2fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x20000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3"
+                             spirit:segmentRef="_ram3_0x30000000_0x3fffffff">
+            <!-- Address_region 0x30000000-0x3fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x30000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys"
+                             spirit:segmentRef="_sys_0x40000000_0x5fffffff">
+            <!-- Address_region 0x40000000-0x5fffffff -->
+            <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x40000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0x60000000_0x7fffffff">
+            <!-- Address_region 0x60000000-0x7fffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x60000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8"
+                             spirit:segmentRef="_ram8_0x80000000_0x8fffffff">
+            <!-- Address_region 0x80000000-0x8fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x80000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9"
+                             spirit:segmentRef="_ram9_0x90000000_0x9fffffff">
+            <!-- Address_region 0x90000000-0x9fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x90000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0xa0000000_0xdfffffff">
+            <!-- Address_region 0xa0000000-0xdfffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0xa0000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+      </spirit:memoryMap>
+
+      <spirit:memoryMap>
+         <spirit:name>AHBLiteTarget_Slave__dma2_MM</spirit:name>
+         <spirit:description>_dma2 memory map</spirit:description>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                             spirit:segmentRef="_ram2_0x00000000_0x0fffffff">
+            <!-- Address_region 0x00000000-0x0fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x00000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1"
+                             spirit:segmentRef="_rom1_0x10000000_0x1fffffff">
+            <!-- Address_region 0x10000000-0x1fffffff -->
+            <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x10000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                             spirit:segmentRef="_ram2_0x20000000_0x2fffffff">
+            <!-- Address_region 0x20000000-0x2fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x20000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3"
+                             spirit:segmentRef="_ram3_0x30000000_0x3fffffff">
+            <!-- Address_region 0x30000000-0x3fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x30000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys"
+                             spirit:segmentRef="_sys_0x40000000_0x5fffffff">
+            <!-- Address_region 0x40000000-0x5fffffff -->
+            <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x40000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0x60000000_0x7fffffff">
+            <!-- Address_region 0x60000000-0x7fffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x60000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8"
+                             spirit:segmentRef="_ram8_0x80000000_0x8fffffff">
+            <!-- Address_region 0x80000000-0x8fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x80000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9"
+                             spirit:segmentRef="_ram9_0x90000000_0x9fffffff">
+            <!-- Address_region 0x90000000-0x9fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x90000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0xa0000000_0xdfffffff">
+            <!-- Address_region 0xa0000000-0xdfffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0xa0000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+      </spirit:memoryMap>
+
+      <spirit:memoryMap>
+         <spirit:name>AHBLiteTarget_Slave__cpu_MM</spirit:name>
+         <spirit:description>_cpu memory map</spirit:description>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1"
+                             spirit:segmentRef="_rom1_0x10000000_0x1fffffff">
+            <!-- Address_region 0x10000000-0x1fffffff -->
+            <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x10000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                             spirit:segmentRef="_ram2_0x20000000_0x2fffffff">
+            <!-- Address_region 0x20000000-0x2fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x20000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3"
+                             spirit:segmentRef="_ram3_0x30000000_0x3fffffff">
+            <!-- Address_region 0x30000000-0x3fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x30000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys"
+                             spirit:segmentRef="_sys_0x40000000_0x5fffffff">
+            <!-- Address_region 0x40000000-0x5fffffff -->
+            <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x40000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0x60000000_0x7fffffff">
+            <!-- Address_region 0x60000000-0x7fffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x60000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8"
+                             spirit:segmentRef="_ram8_0x80000000_0x8fffffff">
+            <!-- Address_region 0x80000000-0x8fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x80000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9"
+                             spirit:segmentRef="_ram9_0x90000000_0x9fffffff">
+            <!-- Address_region 0x90000000-0x9fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x90000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0xa0000000_0xdfffffff">
+            <!-- Address_region 0xa0000000-0xdfffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0xa0000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys"
+                             spirit:segmentRef="_sys_0xf0000000_0xf003ffff">
+            <!-- Address_region 0xf0000000-0xf003ffff -->
+            <spirit:name>AHBLiteTarget_Master__sys_0xf0000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0xf0000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:memoryRemap spirit:state="remap_0">
+            <spirit:name>AHBLiteTarget_Slave__cpu_remap_0_remap_MM</spirit:name>
+            <spirit:description>_cpu remap_0 remap</spirit:description>
+            <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                                spirit:segmentRef="_ram2_0x00000000_0x0fffffff">
+               <!-- Remapped region, active when REMAP bitcombination is 0 address_region 0x00000000-0x0fffffff -->
+               <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_remap_0_SM</spirit:name>
+               <spirit:baseAddress>0x00000000</spirit:baseAddress>
+            </spirit:subspaceMap>
+         </spirit:memoryRemap>
+
+         <spirit:memoryRemap spirit:state="remap_n0">
+            <spirit:name>AHBLiteTarget_Slave__cpu_remap_n0_remap_MM</spirit:name>
+            <spirit:description>_cpu remap_n0 remap</spirit:description>
+            <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1"
+                                spirit:segmentRef="_rom1_0x00000000_0x0fffffff">
+               <!-- Removable region, active only when REMAP bitcombination is n0 address_region 0x00000000-0x0fffffff -->
+               <spirit:name>AHBLiteTarget_Master__rom1_0x00000000_0_state_remap_n0_SM</spirit:name>
+               <spirit:baseAddress>0x00000000</spirit:baseAddress>
+            </spirit:subspaceMap>
+         </spirit:memoryRemap>
+
+      </spirit:memoryMap>
+
+   </spirit:memoryMaps>
+
+
+   <spirit:model>
+      <spirit:views>
+         <spirit:view>
+            <spirit:name>verilogsource</spirit:name>
+            <spirit:description>soclabs_4x7_AhbMatrix bus matrix</spirit:description>
+            <spirit:envIdentifier>:*Simulation:</spirit:envIdentifier>
+            <spirit:envIdentifier>:*Synthesis:</spirit:envIdentifier>
+            <spirit:language>verilog</spirit:language>
+            <spirit:modelName>soclabs_4x7_AhbMatrix</spirit:modelName>
+            <spirit:fileSetRef>
+               <spirit:localName>fs-verilogsource</spirit:localName>
+            </spirit:fileSetRef>
+         </spirit:view>
+      </spirit:views>
+
+      <spirit:ports>
+
+         <!-- Common clock and reset -->
+
+         <spirit:port>
+            <spirit:name>HCLK</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESETn</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Remap port -->
+         <spirit:port>
+            <spirit:name>REMAP</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+
+          <!-- Input signals of Slave interfaces -->
+
+         <spirit:port>
+            <spirit:name>HSEL_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTER_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADY_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+
+         <spirit:port>
+            <spirit:name>HAUSER_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTER_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>1</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADY_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+
+         <spirit:port>
+            <spirit:name>HAUSER_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTER_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>2</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADY_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+
+         <spirit:port>
+            <spirit:name>HAUSER_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTER_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>3</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADY_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+
+         <spirit:port>
+            <spirit:name>HAUSER_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Input signals of Master interfaces -->
+
+         <spirit:port>
+            <spirit:name>HRDATA_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Scan test dummy signals; not connected until scan insertion -->
+
+         <spirit:port>
+            <spirit:name>SCANENABLE</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>SCANINHCLK</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Output signals of Master interfaces -->
+
+         <spirit:port>
+            <spirit:name>HSEL_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTER_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTER_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTER_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTER_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTER_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTER_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTER_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Output signals of Slave interfaces -->
+
+         <spirit:port>
+            <spirit:name>HRDATA_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Scan test dummy signals; not connected until scan insertion -->
+
+         <spirit:port>
+            <spirit:name>SCANOUTHCLK</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+     </spirit:ports>
+   </spirit:model>
+
+   <spirit:fileSets>
+      <spirit:fileSet>
+         <spirit:name>fs-verilogsource</spirit:name>
+         <spirit:displayName/>
+         <spirit:description>File list for soclabs_4x7_AhbMatrix</spirit:description>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+            <spirit:isIncludeFile spirit:externalDeclarations="true">false</spirit:isIncludeFile>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+      </spirit:fileSet>
+   </spirit:fileSets>
+
+   <spirit:description>soclabs_4x7_AhbMatrix</spirit:description>
+
+</spirit:component>
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.xml b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.xml
new file mode 100644
index 0000000..787baeb
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.xml
@@ -0,0 +1,3902 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--    The confidential and proprietary information contained in this file may     -->
+<!--    only be used by a person authorised under and to the extent permitted       -->
+<!--    by a subsisting licensing agreement from ARM Limited or its affiliates.     -->
+<!--                                                                                -->
+<!--           (C) COPYRIGHT 2001-2017 ARM Limited or its affiliates.               -->
+<!--               ALL RIGHTS RESERVED                                              -->
+<!--                                                                                -->
+<!--    This entire notice must be reproduced on all copies of this file            -->
+<!--    and copies of this file may only be made by a person if such person is      -->
+<!--    permitted to do so under the terms of a subsisting license agreement        -->
+<!--    from ARM Limited or its affiliates.                                         -->
+<!--                                                                                -->
+<!--      SVN Information                                                           -->
+<!--                                                                                -->
+<!--      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $  -->
+<!--                                                                                -->
+<!--      Revision            : $Revision: 371321 $                                 -->
+<!--                                                                                -->
+<!--      Release Information : Cortex-M System Design Kit-r1p1-00rel0  -->
+<!--                                                                                -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--  Purpose  : IP-XACT description for the AHB-Lite wrapper of soclabs_4x7_AhbMatrix_lite     -->
+<!--                                                                                -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -    -->
+
+<spirit:component xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009"
+                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                  xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009/index.xsd">
+   <spirit:vendor>arm.com</spirit:vendor>
+   <spirit:library>CoreLink</spirit:library>
+   <spirit:name>soclabs_4x7_AhbMatrix_lite</spirit:name>
+   <spirit:version>r0p0_0</spirit:version>
+
+   <spirit:busInterfaces>
+
+      <!--Slave interfaces -->
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteInitiator_Slave__adp</spirit:name>
+         <spirit:description>Slave port _adp</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteInitiator" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteInitiator_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:slave>
+            <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteInitiator_Slave__adp_MM"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/>
+         </spirit:slave>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADY_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_adp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteInitiator_Slave__dma</spirit:name>
+         <spirit:description>Slave port _dma</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteInitiator" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteInitiator_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:slave>
+            <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteInitiator_Slave__dma_MM"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/>
+         </spirit:slave>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADY_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_dma</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteInitiator_Slave__dma2</spirit:name>
+         <spirit:description>Slave port _dma2</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteInitiator" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteInitiator_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:slave>
+            <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteInitiator_Slave__dma2_MM"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/>
+         </spirit:slave>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADY_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_dma2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteInitiator_Slave__cpu</spirit:name>
+         <spirit:description>Slave port _cpu</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteInitiator" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteInitiator_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:slave>
+            <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteInitiator_Slave__cpu_MM"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__rom1" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram2" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram3" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__sys" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram8" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__ram9" spirit:opaque="true"/>
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master__exp" spirit:opaque="true"/>
+         </spirit:slave>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADY_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_cpu</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+        <!--Master interfaces -->
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master__rom1</spirit:name>
+         <spirit:description>Master port _rom1</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__rom1_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_rom1</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master__ram2</spirit:name>
+         <spirit:description>Master port _ram2</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram2_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_ram2</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master__ram3</spirit:name>
+         <spirit:description>Master port _ram3</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram3_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_ram3</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master__sys</spirit:name>
+         <spirit:description>Master port _sys</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__sys_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_sys</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master__ram8</spirit:name>
+         <spirit:description>Master port _ram8</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram8_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_ram8</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master__ram9</spirit:name>
+         <spirit:description>Master port _ram9</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__ram9_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_ram9</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master__exp</spirit:name>
+         <spirit:description>Master port _exp</spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master__exp_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER_exp</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+      <!--Scan test dummy signals -->
+      <spirit:busInterface>
+         <spirit:name>DFTInterface_Slave</spirit:name>
+         <spirit:description>Scan test dummy signals, not connected until scan insertion</spirit:description>
+         <spirit:busType spirit:library="generic" spirit:name="DFTInterface" spirit:vendor="arm.com" spirit:version="r0p0_1"/>
+         <spirit:abstractionType spirit:library="generic" spirit:name="DFTInterface_rtl" spirit:vendor="arm.com" spirit:version="r0p0_1"/>
+         <spirit:slave/>
+         <spirit:portMaps>
+
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>CLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>RESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>DFTSCANMODE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>SCANENABLE</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>DFTSI</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>SCANINHCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>DFTSO</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>SCANOUTHCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+   </spirit:busInterfaces>
+
+   <spirit:remapStates>
+
+      <spirit:remapState>
+          <spirit:name>remap_0</spirit:name>
+          <spirit:description>Remap state remap_0</spirit:description>
+          <spirit:remapPorts>
+             <spirit:remapPort spirit:portNameRef="REMAP" spirit:portIndex="0">1</spirit:remapPort>
+          </spirit:remapPorts>
+      </spirit:remapState>
+      <spirit:remapState>
+          <spirit:name>remap_n0</spirit:name>
+          <spirit:description>Remap state remap_n0</spirit:description>
+          <spirit:remapPorts>
+             <spirit:remapPort spirit:portNameRef="REMAP" spirit:portIndex="0">0</spirit:remapPort>
+          </spirit:remapPorts>
+      </spirit:remapState>
+
+   </spirit:remapStates>
+
+   <spirit:addressSpaces>
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master__rom1_AS</spirit:name>
+          <spirit:description>_rom1 address space</spirit:description>
+          <spirit:range>4G</spirit:range>
+          <spirit:width>32</spirit:width>
+          <spirit:segments>
+             <spirit:segment>
+                <spirit:name>_rom1_0x00000000_0x0fffffff</spirit:name>
+                <spirit:addressOffset>0x00000000</spirit:addressOffset>
+                <spirit:range>0x010000000</spirit:range>
+             </spirit:segment>
+             <spirit:segment>
+                <spirit:name>_rom1_0x10000000_0x1fffffff</spirit:name>
+                <spirit:addressOffset>0x10000000</spirit:addressOffset>
+                <spirit:range>0x010000000</spirit:range>
+             </spirit:segment>
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master__ram2_AS</spirit:name>
+          <spirit:description>_ram2 address space</spirit:description>
+          <spirit:range>4G</spirit:range>
+          <spirit:width>32</spirit:width>
+          <spirit:segments>
+             <spirit:segment>
+                <spirit:name>_ram2_0x00000000_0x0fffffff</spirit:name>
+                <spirit:addressOffset>0x00000000</spirit:addressOffset>
+                <spirit:range>0x010000000</spirit:range>
+             </spirit:segment>
+             <spirit:segment>
+                <spirit:name>_ram2_0x20000000_0x2fffffff</spirit:name>
+                <spirit:addressOffset>0x20000000</spirit:addressOffset>
+                <spirit:range>0x010000000</spirit:range>
+             </spirit:segment>
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master__ram3_AS</spirit:name>
+          <spirit:description>_ram3 address space</spirit:description>
+          <spirit:range>4G</spirit:range>
+          <spirit:width>32</spirit:width>
+          <spirit:segments>
+             <spirit:segment>
+                <spirit:name>_ram3_0x30000000_0x3fffffff</spirit:name>
+                <spirit:addressOffset>0x30000000</spirit:addressOffset>
+                <spirit:range>0x010000000</spirit:range>
+             </spirit:segment>
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master__sys_AS</spirit:name>
+          <spirit:description>_sys address space</spirit:description>
+          <spirit:range>4G</spirit:range>
+          <spirit:width>32</spirit:width>
+          <spirit:segments>
+             <spirit:segment>
+                <spirit:name>_sys_0x40000000_0x5fffffff</spirit:name>
+                <spirit:addressOffset>0x40000000</spirit:addressOffset>
+                <spirit:range>0x020000000</spirit:range>
+             </spirit:segment>
+             <spirit:segment>
+                <spirit:name>_sys_0xf0000000_0xf003ffff</spirit:name>
+                <spirit:addressOffset>0xf0000000</spirit:addressOffset>
+                <spirit:range>0x000040000</spirit:range>
+             </spirit:segment>
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master__ram8_AS</spirit:name>
+          <spirit:description>_ram8 address space</spirit:description>
+          <spirit:range>4G</spirit:range>
+          <spirit:width>32</spirit:width>
+          <spirit:segments>
+             <spirit:segment>
+                <spirit:name>_ram8_0x80000000_0x8fffffff</spirit:name>
+                <spirit:addressOffset>0x80000000</spirit:addressOffset>
+                <spirit:range>0x010000000</spirit:range>
+             </spirit:segment>
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master__ram9_AS</spirit:name>
+          <spirit:description>_ram9 address space</spirit:description>
+          <spirit:range>4G</spirit:range>
+          <spirit:width>32</spirit:width>
+          <spirit:segments>
+             <spirit:segment>
+                <spirit:name>_ram9_0x90000000_0x9fffffff</spirit:name>
+                <spirit:addressOffset>0x90000000</spirit:addressOffset>
+                <spirit:range>0x010000000</spirit:range>
+             </spirit:segment>
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master__exp_AS</spirit:name>
+          <spirit:description>_exp address space</spirit:description>
+          <spirit:range>4G</spirit:range>
+          <spirit:width>32</spirit:width>
+          <spirit:segments>
+             <spirit:segment>
+                <spirit:name>_exp_0x60000000_0x7fffffff</spirit:name>
+                <spirit:addressOffset>0x60000000</spirit:addressOffset>
+                <spirit:range>0x020000000</spirit:range>
+             </spirit:segment>
+             <spirit:segment>
+                <spirit:name>_exp_0xa0000000_0xdfffffff</spirit:name>
+                <spirit:addressOffset>0xa0000000</spirit:addressOffset>
+                <spirit:range>0x040000000</spirit:range>
+             </spirit:segment>
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+
+   </spirit:addressSpaces>
+
+   <spirit:memoryMaps>
+
+      <spirit:memoryMap>
+         <spirit:name>AHBLiteInitiator_Slave__adp_MM</spirit:name>
+         <spirit:description>_adp memory map</spirit:description>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1"
+                             spirit:segmentRef="_rom1_0x10000000_0x1fffffff">
+            <!-- Address_region 0x10000000-0x1fffffff -->
+            <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x10000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                             spirit:segmentRef="_ram2_0x20000000_0x2fffffff">
+            <!-- Address_region 0x20000000-0x2fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x20000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3"
+                             spirit:segmentRef="_ram3_0x30000000_0x3fffffff">
+            <!-- Address_region 0x30000000-0x3fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x30000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys"
+                             spirit:segmentRef="_sys_0x40000000_0x5fffffff">
+            <!-- Address_region 0x40000000-0x5fffffff -->
+            <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x40000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0x60000000_0x7fffffff">
+            <!-- Address_region 0x60000000-0x7fffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x60000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8"
+                             spirit:segmentRef="_ram8_0x80000000_0x8fffffff">
+            <!-- Address_region 0x80000000-0x8fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x80000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9"
+                             spirit:segmentRef="_ram9_0x90000000_0x9fffffff">
+            <!-- Address_region 0x90000000-0x9fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x90000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0xa0000000_0xdfffffff">
+            <!-- Address_region 0xa0000000-0xdfffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0xa0000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys"
+                             spirit:segmentRef="_sys_0xf0000000_0xf003ffff">
+            <!-- Address_region 0xf0000000-0xf003ffff -->
+            <spirit:name>AHBLiteTarget_Master__sys_0xf0000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0xf0000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:memoryRemap spirit:state="remap_0">
+            <spirit:name>AHBLiteInitiator_Slave__adp_remap_0_remap_MM</spirit:name>
+            <spirit:description>_adp remap_0 remap</spirit:description>
+            <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                                spirit:segmentRef="_ram2_0x00000000_0x0fffffff">
+               <!-- Remapped region, active when REMAP bitcombination is 0 address_region 0x00000000-0x0fffffff -->
+               <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_remap_0_SM</spirit:name>
+               <spirit:baseAddress>0x00000000</spirit:baseAddress>
+            </spirit:subspaceMap>
+         </spirit:memoryRemap>
+
+         <spirit:memoryRemap spirit:state="remap_n0">
+            <spirit:name>AHBLiteInitiator_Slave__adp_remap_n0_remap_MM</spirit:name>
+            <spirit:description>_adp remap_n0 remap</spirit:description>
+            <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1"
+                                spirit:segmentRef="_rom1_0x00000000_0x0fffffff">
+               <!-- Removable region, active only when REMAP bitcombination is n0 address_region 0x00000000-0x0fffffff -->
+               <spirit:name>AHBLiteTarget_Master__rom1_0x00000000_0_state_remap_n0_SM</spirit:name>
+               <spirit:baseAddress>0x00000000</spirit:baseAddress>
+            </spirit:subspaceMap>
+         </spirit:memoryRemap>
+
+      </spirit:memoryMap>
+
+      <spirit:memoryMap>
+         <spirit:name>AHBLiteInitiator_Slave__dma_MM</spirit:name>
+         <spirit:description>_dma memory map</spirit:description>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                             spirit:segmentRef="_ram2_0x00000000_0x0fffffff">
+            <!-- Address_region 0x00000000-0x0fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x00000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1"
+                             spirit:segmentRef="_rom1_0x10000000_0x1fffffff">
+            <!-- Address_region 0x10000000-0x1fffffff -->
+            <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x10000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                             spirit:segmentRef="_ram2_0x20000000_0x2fffffff">
+            <!-- Address_region 0x20000000-0x2fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x20000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3"
+                             spirit:segmentRef="_ram3_0x30000000_0x3fffffff">
+            <!-- Address_region 0x30000000-0x3fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x30000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys"
+                             spirit:segmentRef="_sys_0x40000000_0x5fffffff">
+            <!-- Address_region 0x40000000-0x5fffffff -->
+            <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x40000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0x60000000_0x7fffffff">
+            <!-- Address_region 0x60000000-0x7fffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x60000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8"
+                             spirit:segmentRef="_ram8_0x80000000_0x8fffffff">
+            <!-- Address_region 0x80000000-0x8fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x80000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9"
+                             spirit:segmentRef="_ram9_0x90000000_0x9fffffff">
+            <!-- Address_region 0x90000000-0x9fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x90000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0xa0000000_0xdfffffff">
+            <!-- Address_region 0xa0000000-0xdfffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0xa0000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+      </spirit:memoryMap>
+
+      <spirit:memoryMap>
+         <spirit:name>AHBLiteInitiator_Slave__dma2_MM</spirit:name>
+         <spirit:description>_dma2 memory map</spirit:description>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                             spirit:segmentRef="_ram2_0x00000000_0x0fffffff">
+            <!-- Address_region 0x00000000-0x0fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x00000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1"
+                             spirit:segmentRef="_rom1_0x10000000_0x1fffffff">
+            <!-- Address_region 0x10000000-0x1fffffff -->
+            <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x10000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                             spirit:segmentRef="_ram2_0x20000000_0x2fffffff">
+            <!-- Address_region 0x20000000-0x2fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x20000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3"
+                             spirit:segmentRef="_ram3_0x30000000_0x3fffffff">
+            <!-- Address_region 0x30000000-0x3fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x30000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys"
+                             spirit:segmentRef="_sys_0x40000000_0x5fffffff">
+            <!-- Address_region 0x40000000-0x5fffffff -->
+            <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x40000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0x60000000_0x7fffffff">
+            <!-- Address_region 0x60000000-0x7fffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x60000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8"
+                             spirit:segmentRef="_ram8_0x80000000_0x8fffffff">
+            <!-- Address_region 0x80000000-0x8fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x80000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9"
+                             spirit:segmentRef="_ram9_0x90000000_0x9fffffff">
+            <!-- Address_region 0x90000000-0x9fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x90000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0xa0000000_0xdfffffff">
+            <!-- Address_region 0xa0000000-0xdfffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0xa0000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+      </spirit:memoryMap>
+
+      <spirit:memoryMap>
+         <spirit:name>AHBLiteInitiator_Slave__cpu_MM</spirit:name>
+         <spirit:description>_cpu memory map</spirit:description>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1"
+                             spirit:segmentRef="_rom1_0x10000000_0x1fffffff">
+            <!-- Address_region 0x10000000-0x1fffffff -->
+            <spirit:name>AHBLiteTarget_Master__rom1_0x10000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x10000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                             spirit:segmentRef="_ram2_0x20000000_0x2fffffff">
+            <!-- Address_region 0x20000000-0x2fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram2_0x20000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x20000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram3"
+                             spirit:segmentRef="_ram3_0x30000000_0x3fffffff">
+            <!-- Address_region 0x30000000-0x3fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram3_0x30000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x30000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys"
+                             spirit:segmentRef="_sys_0x40000000_0x5fffffff">
+            <!-- Address_region 0x40000000-0x5fffffff -->
+            <spirit:name>AHBLiteTarget_Master__sys_0x40000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x40000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0x60000000_0x7fffffff">
+            <!-- Address_region 0x60000000-0x7fffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0x60000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x60000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram8"
+                             spirit:segmentRef="_ram8_0x80000000_0x8fffffff">
+            <!-- Address_region 0x80000000-0x8fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram8_0x80000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x80000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram9"
+                             spirit:segmentRef="_ram9_0x90000000_0x9fffffff">
+            <!-- Address_region 0x90000000-0x9fffffff -->
+            <spirit:name>AHBLiteTarget_Master__ram9_0x90000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0x90000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__exp"
+                             spirit:segmentRef="_exp_0xa0000000_0xdfffffff">
+            <!-- Address_region 0xa0000000-0xdfffffff -->
+            <spirit:name>AHBLiteTarget_Master__exp_0xa0000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0xa0000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__sys"
+                             spirit:segmentRef="_sys_0xf0000000_0xf003ffff">
+            <!-- Address_region 0xf0000000-0xf003ffff -->
+            <spirit:name>AHBLiteTarget_Master__sys_0xf0000000_0_state_always_SM</spirit:name>
+            <spirit:baseAddress>0xf0000000</spirit:baseAddress>
+         </spirit:subspaceMap>
+
+         <spirit:memoryRemap spirit:state="remap_0">
+            <spirit:name>AHBLiteInitiator_Slave__cpu_remap_0_remap_MM</spirit:name>
+            <spirit:description>_cpu remap_0 remap</spirit:description>
+            <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__ram2"
+                                spirit:segmentRef="_ram2_0x00000000_0x0fffffff">
+               <!-- Remapped region, active when REMAP bitcombination is 0 address_region 0x00000000-0x0fffffff -->
+               <spirit:name>AHBLiteTarget_Master__ram2_0x00000000_0_state_remap_0_SM</spirit:name>
+               <spirit:baseAddress>0x00000000</spirit:baseAddress>
+            </spirit:subspaceMap>
+         </spirit:memoryRemap>
+
+         <spirit:memoryRemap spirit:state="remap_n0">
+            <spirit:name>AHBLiteInitiator_Slave__cpu_remap_n0_remap_MM</spirit:name>
+            <spirit:description>_cpu remap_n0 remap</spirit:description>
+            <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master__rom1"
+                                spirit:segmentRef="_rom1_0x00000000_0x0fffffff">
+               <!-- Removable region, active only when REMAP bitcombination is n0 address_region 0x00000000-0x0fffffff -->
+               <spirit:name>AHBLiteTarget_Master__rom1_0x00000000_0_state_remap_n0_SM</spirit:name>
+               <spirit:baseAddress>0x00000000</spirit:baseAddress>
+            </spirit:subspaceMap>
+         </spirit:memoryRemap>
+
+      </spirit:memoryMap>
+
+   </spirit:memoryMaps>
+
+
+   <spirit:model>
+      <spirit:views>
+         <spirit:view>
+            <spirit:name>verilogsource</spirit:name>
+            <spirit:description>soclabs_4x7_AhbMatrix_lite bus matrix</spirit:description>
+            <spirit:envIdentifier>:*Simulation:</spirit:envIdentifier>
+            <spirit:envIdentifier>:*Synthesis:</spirit:envIdentifier>
+            <spirit:language>verilog</spirit:language>
+            <spirit:modelName>soclabs_4x7_AhbMatrix_lite</spirit:modelName>
+            <spirit:fileSetRef>
+               <spirit:localName>fs-verilogsource</spirit:localName>
+            </spirit:fileSetRef>
+         </spirit:view>
+      </spirit:views>
+
+      <spirit:ports>
+
+         <!-- Common clock and reset -->
+
+         <spirit:port>
+            <spirit:name>HCLK</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESETn</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Remap port -->
+         <spirit:port>
+            <spirit:name>REMAP</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+
+          <!-- Input signals of Slave interfaces -->
+
+         <spirit:port>
+            <spirit:name>HADDR_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Input signals of Master interfaces -->
+
+         <spirit:port>
+            <spirit:name>HRDATA_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Scan test dummy signals; not connected until scan insertion -->
+
+         <spirit:port>
+            <spirit:name>SCANENABLE</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>SCANINHCLK</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Output signals of Master interfaces -->
+
+         <spirit:port>
+            <spirit:name>HSEL_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_rom1</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_ram2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_ram3</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_sys</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_ram8</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_ram9</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSEL_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HAUSER_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER_exp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Output signals of Slave interfaces -->
+
+         <spirit:port>
+            <spirit:name>HRDATA_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADY_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_adp</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADY_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_dma</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADY_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_dma2</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRDATA_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>31</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADY_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRUSER_cpu</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Scan test dummy signals; not connected until scan insertion -->
+
+         <spirit:port>
+            <spirit:name>SCANOUTHCLK</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+     </spirit:ports>
+   </spirit:model>
+
+   <spirit:fileSets>
+      <spirit:fileSet>
+         <spirit:name>fs-verilogsource</spirit:name>
+         <spirit:displayName/>
+         <spirit:description>File list for soclabs_4x7_AhbMatrix_lite</spirit:description>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+            <spirit:isIncludeFile spirit:externalDeclarations="true">false</spirit:isIncludeFile>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+         <spirit:file>
+            <spirit:name>../../../verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+         </spirit:file>
+      </spirit:fileSet>
+   </spirit:fileSets>
+
+   <spirit:description>soclabs_4x7_AhbMatrix_lite</spirit:description>
+
+</spirit:component>
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_ipxact.xml b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_ipxact.xml
new file mode 100755
index 0000000..f7280ff
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_ipxact.xml
@@ -0,0 +1,1050 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--    The confidential and proprietary information contained in this file may     -->
+<!--    only be used by a person authorised under and to the extent permitted       -->
+<!--    by a subsisting licensing agreement from ARM Limited or its affiliates.     -->
+<!--                                                                                -->
+<!--           (C) COPYRIGHT 2001-2017 ARM Limited or its affiliates.               -->
+<!--               ALL RIGHTS RESERVED                                              -->
+<!--                                                                                -->
+<!--    This entire notice must be reproduced on all copies of this file            -->
+<!--    and copies of this file may only be made by a person if such person is      -->
+<!--    permitted to do so under the terms of a subsisting license agreement        -->
+<!--    from ARM Limited or its affiliates.                                         -->
+<!--                                                                                -->
+<!--      SVN Information                                                           -->
+<!--                                                                                -->
+<!--      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $  -->
+<!--                                                                                -->
+<!--      Revision            : $Revision: 371321 $                                 -->
+<!--                                                                                -->
+<!--      Release Information : Cortex-M System Design Kit-r1p1-00rel0  -->
+<!--                                                                                -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--  Purpose  : IP-XACT description for the main top of <<bus_matrix_name>>     -->
+<!--                                                                                -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -    -->
+
+<spirit:component xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009"
+                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                  xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009/index.xsd">
+   <spirit:vendor>arm.com</spirit:vendor>
+   <spirit:library>CoreLink</spirit:library>
+   <spirit:name><<bus_matrix_name>></spirit:name>
+   <spirit:version>r0p0_0</spirit:version>
+
+   <spirit:busInterfaces>
+
+      <!--Slave interfaces -->
+//---------------------------------------- << start in >> ---------------------------------------
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Slave_<<si_name>></spirit:name>
+         <spirit:description>Slave port <<si_name>></spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:slave>
+            <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteTarget_Slave_<<si_name>>_MM"/>
+//---------------------------------------- << start out >> --------------------------------------
+//------------------------------------- << start connection >> ------------------------------------
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master_<<mi_name>>" spirit:opaque="true"/>
+//------------------------------------- << end connection >> --------------------------------------
+//---------------------------------------- << end out >> ----------------------------------------
+         </spirit:slave>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+//---------------------------------------- << start excl >> -------------------------------------
+                 <spirit:vector>
+                    <spirit:left>3</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+//---------------------------------------- << end excl >> -------------------------------------
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT<<si_name>></spirit:name>
+//---------------------------------------- << start excl >> -------------------------------------
+                 <spirit:vector>
+                    <spirit:left>3</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+//---------------------------------------- << end excl >> -------------------------------------
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------- << start unalign >> -----------------------------
+
+            <!-- HUNALIGN<<si_name>> unmapped -->
+            <!-- HBSTRB<<si_name>> unmapped -->
+
+//----------------------------- << end unalign >> ------------------------------
+
+            <!-- HMASTER<<si_name>> unmapped -->
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADY<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << start user >> -------------------------------------
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << end user >> ---------------------------------------
+
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP<<si_name>></spirit:name>
+                 <spirit:vector>
+                    <spirit:left>0</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << start user >> -------------------------------------
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << end user >> ---------------------------------------
+         </spirit:portMaps>
+      </spirit:busInterface>
+//----------------------------------------- << end in >> ----------------------------------------
+
+        <!--Master interfaces -->
+//---------------------------------------- << start out >> --------------------------------------
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master_<<mi_name>></spirit:name>
+         <spirit:description>Master port <<mi_name>></spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master_<<mi_name>>_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+//---------------------------------------- << start excl >> -------------------------------------
+                 <spirit:vector>
+                    <spirit:left>3</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+//---------------------------------------- << end excl >> -------------------------------------
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT<<mi_name>></spirit:name>
+//---------------------------------------- << start excl >> -------------------------------------
+                 <spirit:vector>
+                    <spirit:left>3</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+//---------------------------------------- << end excl >> -------------------------------------
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------- << start unalign >> -----------------------------
+
+            <!-- HUNALIGN<<mi_name>> unmapped -->
+
+            <!-- HBSTRB<<mi_name>> unmapped -->
+
+//----------------------------- << end unalign >> ------------------------------
+
+            <!-- HMASTER<<mi_name>> unmapped -->
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << start user >> -------------------------------------
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << end user >> ---------------------------------------
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP<<mi_name>></spirit:name>
+                 <spirit:vector>
+                    <spirit:left>0</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << start user >> -------------------------------------
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << end user >> ---------------------------------------
+         </spirit:portMaps>
+      </spirit:busInterface>
+//---------------------------------------- << end out >> ----------------------------------------
+
+      <!--Scan test dummy signals -->
+      <spirit:busInterface>
+         <spirit:name>DFTInterface_Slave</spirit:name>
+         <spirit:description>Scan test dummy signals, not connected until scan insertion</spirit:description>
+         <spirit:busType spirit:library="generic" spirit:name="DFTInterface" spirit:vendor="arm.com" spirit:version="r0p0_1"/>
+         <spirit:abstractionType spirit:library="generic" spirit:name="DFTInterface_rtl" spirit:vendor="arm.com" spirit:version="r0p0_1"/>
+         <spirit:slave/>
+         <spirit:portMaps>
+
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>CLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>RESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>DFTSCANMODE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>SCANENABLE</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>DFTSI</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>SCANINHCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>DFTSO</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>SCANOUTHCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+   </spirit:busInterfaces>
+//--------------------------------- << start vendor_extension >> ---------------------------------
+//---------------------------------- << end vendor_extension >> ----------------------------------
+
+//---------------------------- << start remap_used >> -------------------------------
+   <spirit:remapStates>
+
+//---------------------------- << start remap_state_ipxact >> -------------------------------
+      <spirit:remapState>
+          <spirit:name><<remap_name>></spirit:name>
+          <spirit:description>Remap state <<remap_name>></spirit:description>
+          <spirit:remapPorts>
+//---------------------------- << start remap_bit_ipxact >> -------------------------------
+             <spirit:remapPort spirit:portNameRef="REMAP" spirit:portIndex="<<top_remap_bit>>"><<top_remap_bitvalue>></spirit:remapPort>
+//---------------------------- << end remap_bit_ipxact >> -------------------------------
+          </spirit:remapPorts>
+      </spirit:remapState>
+//------------------------------ << end remap_state_ipxact >> -------------------------
+
+   </spirit:remapStates>
+
+//----------------------------- << end remap_used >> --------------------------------
+   <spirit:addressSpaces>
+//---------------------------------------- << start out >> ----------------------------------------
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master_<<mi_name>>_AS</spirit:name>
+          <spirit:description><<mi_name>> address space</spirit:description>
+          <spirit:range><<address_space_range>></spirit:range>
+          <spirit:width><<data_v>></spirit:width>
+          <spirit:segments>
+//---------------------------------------- << start segments >> ----------------------------------------
+             <spirit:segment>
+                <spirit:name><<mi_name>>_<<segment_name>></spirit:name>
+                <spirit:addressOffset><<segment_offset>></spirit:addressOffset>
+                <spirit:range><<segment_range>></spirit:range>
+             </spirit:segment>
+//---------------------------------------- << end segments >> ----------------------------------------
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+//---------------------------------------- << end out >> ----------------------------------------
+
+   </spirit:addressSpaces>
+
+   <spirit:memoryMaps>
+
+//---------------------------------------- << start in >> ----------------------------------------
+      <spirit:memoryMap>
+         <spirit:name>AHBLiteTarget_Slave_<<si_name>>_MM</spirit:name>
+         <spirit:description><<si_name>> memory map</spirit:description>
+
+//----------------------------- << start addr_map_ipxact >> ---------------------------
+//----------------------------- << start addr_region_ipxact >> ------------------------
+//----------------------------- << start remap_static >> ------------------------
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master_<<mi_name>>"
+                             spirit:segmentRef="<<mi_name>>_<<base_address>>_<<end_address>>">
+            <!-- Address_region <<address_map>> -->
+//---------------------------- << start remap_used >> -------------------------------
+            <spirit:name>AHBLiteTarget_Master_<<mi_name>>_<<base_address>>_0_state_always_SM</spirit:name>
+//---------------------------- << end remap_used >> -------------------------------
+//---------------------------- << start no_remap_used >> -------------------------------
+            <spirit:name>AHBLiteTarget_Master_<<mi_name>>_<<base_address>>_0_state_default_SM</spirit:name>
+//---------------------------- << end no_remap_used >> -------------------------------
+            <spirit:baseAddress><<base_address>></spirit:baseAddress>
+         </spirit:subspaceMap>
+
+//----------------------------- << end remap_static >> ------------------------
+//------------------------------ << end addr_region_ipxact >> -------------------------
+//----------------------------- << end addr_map_ipxact >> -----------------------------
+//---------------------------- << start remap_used >> -------------------------------
+//----------------------------- << start remap_state_ipxact >> -------------------------
+//----------------------------- << start addr_remap_and_normal_all_this_remap >> -------------------------
+         <spirit:memoryRemap spirit:state="<<remap_name>>">
+            <spirit:name>AHBLiteTarget_Slave_<<si_name>>_<<remap_name>>_remap_MM</spirit:name>
+            <spirit:description><<si_name>> <<remap_name>> remap</spirit:description>
+//----------------------------- << start remap_region_ipxact >> -----------------------
+            <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master_<<mi_name>>"
+                                spirit:segmentRef="<<mi_name>>_<<base_address>>_<<end_address>>">
+               <!-- <<region_type>> address_region <<address_map>> -->
+               <spirit:name>AHBLiteTarget_Master_<<mi_name>>_<<base_address>>_0_state_<<remap_name>>_SM</spirit:name>
+               <spirit:baseAddress><<base_address>></spirit:baseAddress>
+            </spirit:subspaceMap>
+//------------------------------ << end remap_region_ipxact >> -------------------------
+         </spirit:memoryRemap>
+
+//----------------------------- << end addr_remap_and_normal_all_this_remap >> ---------------------------
+//----------------------------- << end remap_state_ipxact >> -------------------------
+//---------------------------- << end remap_used >> -------------------------------
+      </spirit:memoryMap>
+
+//----------------------------------------- << end in >> ------------------------------------------
+   </spirit:memoryMaps>
+
+
+   <spirit:model>
+      <spirit:views>
+         <spirit:view>
+            <spirit:name>verilogsource</spirit:name>
+            <spirit:description><<bus_matrix_name>> bus matrix</spirit:description>
+            <spirit:envIdentifier>:*Simulation:</spirit:envIdentifier>
+            <spirit:envIdentifier>:*Synthesis:</spirit:envIdentifier>
+            <spirit:language>verilog</spirit:language>
+            <spirit:modelName><<bus_matrix_name>></spirit:modelName>
+            <spirit:fileSetRef>
+               <spirit:localName>fs-verilogsource</spirit:localName>
+            </spirit:fileSetRef>
+         </spirit:view>
+      </spirit:views>
+
+      <spirit:ports>
+
+         <!-- Common clock and reset -->
+
+         <spirit:port>
+            <spirit:name>HCLK</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESETn</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Remap port -->
+         <spirit:port>
+            <spirit:name>REMAP</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+
+          <!-- Input signals of Slave interfaces -->
+
+//----------------------------------------- << start in >> ------------------------------------------
+         <spirit:port>
+            <spirit:name>HSEL<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<addr>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<prot>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------- << start unalign >> -----------------------------
+         <spirit:port>
+            <spirit:name>HUNALIGN<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBSTRB<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<bstrb>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+//----------------------------- << end unalign >> ------------------------------
+         <spirit:port>
+            <spirit:name>HMASTER<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue><<in>></spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<data>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADY<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+
+//---------------------------------------- << start user >> -------------------------------------
+         <spirit:port>
+            <spirit:name>HAUSER<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<user>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<user>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << end user >> ---------------------------------------
+//----------------------------------------- << end in >> ----------------------------------------
+
+         <!-- Input signals of Master interfaces -->
+
+//----------------------------------------- << start out >> ----------------------------------------
+         <spirit:port>
+            <spirit:name>HRDATA<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<data>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<resp>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << start user >> -------------------------------------
+         <spirit:port>
+            <spirit:name>HRUSER<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<user>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << end user >> ---------------------------------------
+//----------------------------------------- << end out >> ----------------------------------------
+
+         <!-- Scan test dummy signals; not connected until scan insertion -->
+
+         <spirit:port>
+            <spirit:name>SCANENABLE</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>SCANINHCLK</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Output signals of Master interfaces -->
+
+//---------------------------------------- << start out >> --------------------------------------
+         <spirit:port>
+            <spirit:name>HSEL<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<addr>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<prot>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------- << start unalign >> -----------------------------
+         <spirit:port>
+            <spirit:name>HUNALIGN<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBSTRB<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<bstrb>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+//----------------------------- << end unalign >> ------------------------------
+         <spirit:port>
+            <spirit:name>HMASTER<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<data>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << start user >> -------------------------------------
+         <spirit:port>
+            <spirit:name>HAUSER<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<user>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<user>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << end user >> ---------------------------------------
+//---------------------------------------- << end out >> ----------------------------------------
+
+         <!-- Output signals of Slave interfaces -->
+
+//---------------------------------------- << start in >> ----------------------------------------
+         <spirit:port>
+            <spirit:name>HRDATA<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<data>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<resp>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << start user >> -------------------------------------
+         <spirit:port>
+            <spirit:name>HRUSER<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<user>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << end user >> ---------------------------------------
+//---------------------------------------- << end in >> ----------------------------------------
+
+         <!-- Scan test dummy signals; not connected until scan insertion -->
+
+         <spirit:port>
+            <spirit:name>SCANOUTHCLK</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+     </spirit:ports>
+   </spirit:model>
+
+   <spirit:fileSets>
+      <spirit:fileSet>
+         <spirit:name>fs-verilogsource</spirit:name>
+         <spirit:displayName/>
+         <spirit:description>File list for <<bus_matrix_name>></spirit:description>
+//-------------------------------------- << start file >> ---------------------------------------
+         <spirit:file>
+            <spirit:name><<verilog_to_ipxact_path>>/<<filename>>.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+//-------------------------------------- << start topfile >> ---------------------------------------
+            <spirit:isIncludeFile spirit:externalDeclarations="true">false</spirit:isIncludeFile>
+//-------------------------------------- << end topfile >> ---------------------------------------
+         </spirit:file>
+//--------------------------------------- << end file >> ----------------------------------------
+      </spirit:fileSet>
+   </spirit:fileSets>
+
+   <spirit:description><<bus_matrix_name>></spirit:description>
+
+</spirit:component>
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_lite_ipxact.xml b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_lite_ipxact.xml
new file mode 100755
index 0000000..7fe69e4
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/ipxact/src/cmsdk_ahb_busmatrix_lite_ipxact.xml
@@ -0,0 +1,921 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--    The confidential and proprietary information contained in this file may     -->
+<!--    only be used by a person authorised under and to the extent permitted       -->
+<!--    by a subsisting licensing agreement from ARM Limited or its affiliates.     -->
+<!--                                                                                -->
+<!--           (C) COPYRIGHT 2001-2017 ARM Limited or its affiliates.               -->
+<!--               ALL RIGHTS RESERVED                                              -->
+<!--                                                                                -->
+<!--    This entire notice must be reproduced on all copies of this file            -->
+<!--    and copies of this file may only be made by a person if such person is      -->
+<!--    permitted to do so under the terms of a subsisting license agreement        -->
+<!--    from ARM Limited or its affiliates.                                         -->
+<!--                                                                                -->
+<!--      SVN Information                                                           -->
+<!--                                                                                -->
+<!--      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $  -->
+<!--                                                                                -->
+<!--      Revision            : $Revision: 371321 $                                 -->
+<!--                                                                                -->
+<!--      Release Information : Cortex-M System Design Kit-r1p1-00rel0  -->
+<!--                                                                                -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--  Purpose  : IP-XACT description for the AHB-Lite wrapper of <<component_name>>     -->
+<!--                                                                                -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -    -->
+
+<spirit:component xmlns:spirit="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009"
+                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+                  xsi:schemaLocation="http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009 http://www.spiritconsortium.org/XMLSchema/SPIRIT/1685-2009/index.xsd">
+   <spirit:vendor>arm.com</spirit:vendor>
+   <spirit:library>CoreLink</spirit:library>
+   <spirit:name><<component_name>></spirit:name>
+   <spirit:version>r0p0_0</spirit:version>
+
+   <spirit:busInterfaces>
+
+      <!--Slave interfaces -->
+//---------------------------------------- << start in >> ---------------------------------------
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteInitiator_Slave_<<si_name>></spirit:name>
+         <spirit:description>Slave port <<si_name>></spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteInitiator" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteInitiator_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:slave>
+            <spirit:memoryMapRef spirit:memoryMapRef="AHBLiteInitiator_Slave_<<si_name>>_MM"/>
+//---------------------------------------- << start out >> --------------------------------------
+//------------------------------------- << start connection >> ------------------------------------
+            <spirit:bridge spirit:masterRef="AHBLiteTarget_Master_<<mi_name>>" spirit:opaque="true"/>
+//------------------------------------- << end connection >> --------------------------------------
+//---------------------------------------- << end out >> ----------------------------------------
+         </spirit:slave>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+//---------------------------------------- << start excl >> -------------------------------------
+                 <spirit:vector>
+                    <spirit:left>3</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+//---------------------------------------- << end excl >> -------------------------------------
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT<<si_name>></spirit:name>
+//---------------------------------------- << start excl >> -------------------------------------
+                 <spirit:vector>
+                    <spirit:left>3</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+//---------------------------------------- << end excl >> -------------------------------------
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << start user >> -------------------------------------
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << end user >> ---------------------------------------
+
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADY<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << start user >> -------------------------------------
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER<<si_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << end user >> ---------------------------------------
+         </spirit:portMaps>
+      </spirit:busInterface>
+//----------------------------------------- << end in >> ----------------------------------------
+
+        <!--Master interfaces -->
+//---------------------------------------- << start out >> --------------------------------------
+
+      <spirit:busInterface>
+         <spirit:name>AHBLiteTarget_Master_<<mi_name>></spirit:name>
+         <spirit:description>Master port <<mi_name>></spirit:description>
+         <spirit:busType spirit:library="AMBA3" spirit:name="AHBLiteTarget" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:abstractionType spirit:library="AMBA3" spirit:name="AHBLiteTarget_rtl" spirit:vendor="amba.com" spirit:version="r2p0_0"/>
+         <spirit:master>
+            <spirit:addressSpaceRef spirit:addressSpaceRef="AHBLiteTarget_Master_<<mi_name>>_AS"/>
+         </spirit:master>
+
+         <spirit:portMaps>
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <!--  Outputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSELx</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSEL<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HADDR</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HADDR<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HTRANS</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HTRANS<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWRITE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWRITE<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HSIZE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HSIZE<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HBURST</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HBURST<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HPROT</spirit:name>
+//---------------------------------------- << start excl >> -------------------------------------
+                 <spirit:vector>
+                    <spirit:left>3</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+//---------------------------------------- << end excl >> -------------------------------------
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HPROT<<mi_name>></spirit:name>
+//---------------------------------------- << start excl >> -------------------------------------
+                 <spirit:vector>
+                    <spirit:left>3</spirit:left>
+                    <spirit:right>0</spirit:right>
+                 </spirit:vector>
+//---------------------------------------- << end excl >> -------------------------------------
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWDATA<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HMASTLOCK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HMASTLOCK<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADY</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYMUX<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << start user >> -------------------------------------
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HAUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HAUSER<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HWUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HWUSER<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << end user >> ---------------------------------------
+
+            <!--  Inputs -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRDATA</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRDATA<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HREADYOUT</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HREADYOUT<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRESP</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESP<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << start user >> -------------------------------------
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>HRUSER</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRUSER<<mi_name>></spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+//---------------------------------------- << end user >> ---------------------------------------
+         </spirit:portMaps>
+      </spirit:busInterface>
+//---------------------------------------- << end out >> ----------------------------------------
+
+      <!--Scan test dummy signals -->
+      <spirit:busInterface>
+         <spirit:name>DFTInterface_Slave</spirit:name>
+         <spirit:description>Scan test dummy signals, not connected until scan insertion</spirit:description>
+         <spirit:busType spirit:library="generic" spirit:name="DFTInterface" spirit:vendor="arm.com" spirit:version="r0p0_1"/>
+         <spirit:abstractionType spirit:library="generic" spirit:name="DFTInterface_rtl" spirit:vendor="arm.com" spirit:version="r0p0_1"/>
+         <spirit:slave/>
+         <spirit:portMaps>
+
+            <!--  Clock/reset -->
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>CLK</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>RESETn</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>HRESETn</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>DFTSCANMODE</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>SCANENABLE</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>DFTSI</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>SCANINHCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+            <spirit:portMap>
+               <spirit:logicalPort>
+                 <spirit:name>DFTSO</spirit:name>
+               </spirit:logicalPort>
+               <spirit:physicalPort>
+                 <spirit:name>SCANOUTHCLK</spirit:name>
+               </spirit:physicalPort>
+            </spirit:portMap>
+         </spirit:portMaps>
+      </spirit:busInterface>
+
+   </spirit:busInterfaces>
+//--------------------------------- << start vendor_extension >> ---------------------------------
+//---------------------------------- << end vendor_extension >> ----------------------------------
+
+//---------------------------- << start remap_used >> -------------------------------
+   <spirit:remapStates>
+
+//---------------------------- << start remap_state_ipxact >> -------------------------------
+      <spirit:remapState>
+          <spirit:name><<remap_name>></spirit:name>
+          <spirit:description>Remap state <<remap_name>></spirit:description>
+          <spirit:remapPorts>
+//---------------------------- << start remap_bit_ipxact >> -------------------------------
+             <spirit:remapPort spirit:portNameRef="REMAP" spirit:portIndex="<<top_remap_bit>>"><<top_remap_bitvalue>></spirit:remapPort>
+//---------------------------- << end remap_bit_ipxact >> -------------------------------
+          </spirit:remapPorts>
+      </spirit:remapState>
+//------------------------------ << end remap_state_ipxact >> -------------------------
+
+   </spirit:remapStates>
+
+//----------------------------- << end remap_used >> --------------------------------
+   <spirit:addressSpaces>
+//---------------------------------------- << start out >> ----------------------------------------
+
+     <spirit:addressSpace>
+          <spirit:name>AHBLiteTarget_Master_<<mi_name>>_AS</spirit:name>
+          <spirit:description><<mi_name>> address space</spirit:description>
+          <spirit:range><<address_space_range>></spirit:range>
+          <spirit:width><<data_v>></spirit:width>
+          <spirit:segments>
+//---------------------------------------- << start segments >> ----------------------------------------
+             <spirit:segment>
+                <spirit:name><<mi_name>>_<<segment_name>></spirit:name>
+                <spirit:addressOffset><<segment_offset>></spirit:addressOffset>
+                <spirit:range><<segment_range>></spirit:range>
+             </spirit:segment>
+//---------------------------------------- << end segments >> ----------------------------------------
+          </spirit:segments>
+          <spirit:addressUnitBits>8</spirit:addressUnitBits>
+     </spirit:addressSpace>
+//---------------------------------------- << end out >> ----------------------------------------
+
+   </spirit:addressSpaces>
+
+   <spirit:memoryMaps>
+
+//---------------------------------------- << start in >> ----------------------------------------
+      <spirit:memoryMap>
+         <spirit:name>AHBLiteInitiator_Slave_<<si_name>>_MM</spirit:name>
+         <spirit:description><<si_name>> memory map</spirit:description>
+
+//----------------------------- << start addr_map_ipxact >> ---------------------------
+//----------------------------- << start addr_region_ipxact >> ------------------------
+//----------------------------- << start remap_static >> ------------------------
+         <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master_<<mi_name>>"
+                             spirit:segmentRef="<<mi_name>>_<<base_address>>_<<end_address>>">
+            <!-- Address_region <<address_map>> -->
+//---------------------------- << start remap_used >> -------------------------------
+            <spirit:name>AHBLiteTarget_Master_<<mi_name>>_<<base_address>>_0_state_always_SM</spirit:name>
+//---------------------------- << end remap_used >> -------------------------------
+//---------------------------- << start no_remap_used >> -------------------------------
+            <spirit:name>AHBLiteTarget_Master_<<mi_name>>_<<base_address>>_0_state_default_SM</spirit:name>
+//---------------------------- << end no_remap_used >> -------------------------------
+            <spirit:baseAddress><<base_address>></spirit:baseAddress>
+         </spirit:subspaceMap>
+
+//----------------------------- << end remap_static >> ------------------------
+//------------------------------ << end addr_region_ipxact >> -------------------------
+//----------------------------- << end addr_map_ipxact >> -----------------------------
+//---------------------------- << start remap_used >> -------------------------------
+//----------------------------- << start remap_state_ipxact >> -------------------------
+//----------------------------- << start addr_remap_and_normal_all_this_remap >> -------------------------
+         <spirit:memoryRemap spirit:state="<<remap_name>>">
+            <spirit:name>AHBLiteInitiator_Slave_<<si_name>>_<<remap_name>>_remap_MM</spirit:name>
+            <spirit:description><<si_name>> <<remap_name>> remap</spirit:description>
+//----------------------------- << start remap_region_ipxact >> -----------------------
+            <spirit:subspaceMap spirit:masterRef="AHBLiteTarget_Master_<<mi_name>>"
+                                spirit:segmentRef="<<mi_name>>_<<base_address>>_<<end_address>>">
+               <!-- <<region_type>> address_region <<address_map>> -->
+               <spirit:name>AHBLiteTarget_Master_<<mi_name>>_<<base_address>>_0_state_<<remap_name>>_SM</spirit:name>
+               <spirit:baseAddress><<base_address>></spirit:baseAddress>
+            </spirit:subspaceMap>
+//------------------------------ << end remap_region_ipxact >> -------------------------
+         </spirit:memoryRemap>
+
+//----------------------------- << end addr_remap_and_normal_all_this_remap >> ---------------------------
+//----------------------------- << end remap_state_ipxact >> -------------------------
+//---------------------------- << end remap_used >> -------------------------------
+      </spirit:memoryMap>
+
+//----------------------------------------- << end in >> ------------------------------------------
+   </spirit:memoryMaps>
+
+
+   <spirit:model>
+      <spirit:views>
+         <spirit:view>
+            <spirit:name>verilogsource</spirit:name>
+            <spirit:description><<component_name>> bus matrix</spirit:description>
+            <spirit:envIdentifier>:*Simulation:</spirit:envIdentifier>
+            <spirit:envIdentifier>:*Synthesis:</spirit:envIdentifier>
+            <spirit:language>verilog</spirit:language>
+            <spirit:modelName><<component_name>></spirit:modelName>
+            <spirit:fileSetRef>
+               <spirit:localName>fs-verilogsource</spirit:localName>
+            </spirit:fileSetRef>
+         </spirit:view>
+      </spirit:views>
+
+      <spirit:ports>
+
+         <!-- Common clock and reset -->
+
+         <spirit:port>
+            <spirit:name>HCLK</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESETn</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Remap port -->
+         <spirit:port>
+            <spirit:name>REMAP</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>3</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+
+          <!-- Input signals of Slave interfaces -->
+
+//----------------------------------------- << start in >> ------------------------------------------
+         <spirit:port>
+            <spirit:name>HADDR<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<addr>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+               <spirit:driver>
+                  <spirit:defaultValue>0</spirit:defaultValue>
+               </spirit:driver>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<prot>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<data>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << start user >> -------------------------------------
+         <spirit:port>
+            <spirit:name>HAUSER<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<user>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<user>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << end user >> ---------------------------------------
+//----------------------------------------- << end in >> ----------------------------------------
+
+         <!-- Input signals of Master interfaces -->
+
+//----------------------------------------- << start out >> ----------------------------------------
+         <spirit:port>
+            <spirit:name>HRDATA<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<data>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYOUT<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << start user >> -------------------------------------
+         <spirit:port>
+            <spirit:name>HRUSER<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<user>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << end user >> ---------------------------------------
+//----------------------------------------- << end out >> ----------------------------------------
+
+         <!-- Scan test dummy signals; not connected until scan insertion -->
+
+         <spirit:port>
+            <spirit:name>SCANENABLE</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>SCANINHCLK</spirit:name>
+            <spirit:wire>
+               <spirit:direction>in</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+
+         <!-- Output signals of Master interfaces -->
+
+//---------------------------------------- << start out >> --------------------------------------
+         <spirit:port>
+            <spirit:name>HSEL<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HADDR<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<addr>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HTRANS<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>1</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWRITE<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HSIZE<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HBURST<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left>2</spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HPROT<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<prot>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWDATA<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<data>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+          </spirit:port>
+         <spirit:port>
+            <spirit:name>HMASTLOCK<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADYMUX<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << start user >> -------------------------------------
+         <spirit:port>
+            <spirit:name>HAUSER<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<user>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HWUSER<<mi_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<user>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << end user >> ---------------------------------------
+//---------------------------------------- << end out >> ----------------------------------------
+
+         <!-- Output signals of Slave interfaces -->
+
+//---------------------------------------- << start in >> ----------------------------------------
+         <spirit:port>
+            <spirit:name>HRDATA<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<data>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HREADY<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+         <spirit:port>
+            <spirit:name>HRESP<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << start user >> -------------------------------------
+         <spirit:port>
+            <spirit:name>HRUSER<<si_name>></spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+               <spirit:vector>
+                  <spirit:left><<user>></spirit:left>
+                  <spirit:right>0</spirit:right>
+               </spirit:vector>
+            </spirit:wire>
+         </spirit:port>
+//---------------------------------------- << end user >> ---------------------------------------
+//---------------------------------------- << end in >> ----------------------------------------
+
+         <!-- Scan test dummy signals; not connected until scan insertion -->
+
+         <spirit:port>
+            <spirit:name>SCANOUTHCLK</spirit:name>
+            <spirit:wire>
+               <spirit:direction>out</spirit:direction>
+            </spirit:wire>
+         </spirit:port>
+     </spirit:ports>
+   </spirit:model>
+
+   <spirit:fileSets>
+      <spirit:fileSet>
+         <spirit:name>fs-verilogsource</spirit:name>
+         <spirit:displayName/>
+         <spirit:description>File list for <<component_name>></spirit:description>
+//-------------------------------------- << start file >> ---------------------------------------
+         <spirit:file>
+            <spirit:name><<verilog_to_ipxact_path>>/<<filename>>.v</spirit:name>
+            <spirit:fileType>verilogSource-2001</spirit:fileType>
+//-------------------------------------- << start topfile >> ---------------------------------------
+            <spirit:isIncludeFile spirit:externalDeclarations="true">false</spirit:isIncludeFile>
+//-------------------------------------- << end topfile >> ---------------------------------------
+         </spirit:file>
+//--------------------------------------- << end file >> ----------------------------------------
+      </spirit:fileSet>
+   </spirit:fileSets>
+
+   <spirit:description><<component_name>></spirit:description>
+
+</spirit:component>
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/soclabs_ahb32_4x7.log b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/soclabs_ahb32_4x7.log
new file mode 100644
index 0000000..234a620
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/soclabs_ahb32_4x7.log
@@ -0,0 +1,74 @@
+
+==============================================================
+=  The confidential and proprietary information contained in this file may
+=  only be used by a person authorised under and to the extent permitted
+=  by a subsisting licensing agreement from Arm Limited or its affiliates.
+= 
+=    (C) COPYRIGHT 2001-2013,2017 Arm Limited or its affiliates.
+=        ALL RIGHTS RESERVED
+= 
+=  This entire notice must be reproduced on all copies of this file
+=  and copies of this file may only be made by a person if such person is
+=  permitted to do so under the terms of a subsisting license agreement
+=  from Arm Limited or its affiliates.
+=
+= BuildBusMatrix.pl
+=
+= Run Date : 10/02/2023 10:12:02
+==============================================================
+
+Script accepted the following parameters:
+
+ - Configuration file      : 'xml/soclabs_ahb32_4x7.xml'
+ - Top-level name          : 'soclabs_4x7_AhbMatrix'
+ - Slave interfaces        : 4
+ - Master interfaces       : 7
+ - Architecture type       : 'ahb2'
+ - Arbitration scheme      : 'burst'
+ - Address map             : user defined
+ - Connectivity mapping    : _adp -> _rom1, _ram2, _ram3, _sys, _exp, _ram8, _ram9, 
+                             _dma -> _rom1, _ram2, _ram3, _sys, _exp, _ram8, _ram9, 
+                             _dma2 -> _rom1, _ram2, _ram3, _sys, _exp, _ram8, _ram9, 
+                             _cpu -> _rom1, _ram2, _ram3, _sys, _exp, _ram8, _ram9
+ - Connectivity type       : full
+ - Routing data width      : 32
+ - Routing address width   : 32
+ - User signal width       : 2
+ - Timescales              : yes (default)
+ - Configuration directory : './verilog/built'
+ - Source directory        : './verilog/src'
+ - IPXact target directory : 'ipxact/built'
+ - IPXact source directory : 'ipxact/src'
+ - Overwrite mode          : enabled
+
+Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v' file...
+Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v' file...
+Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v' file...
+Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v' file...
+Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v' file...
+Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v' file...
+Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v' file...
+Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v' file...
+Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v' file...
+Deleting the './verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v' file...
+
+Deleting the 'ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.xml' file...
+Deleting the 'ipxact/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.xml' file...
+
+Creating the bus matrix variant...
+
+ - Rendering 'soclabs_4x7_AhbMatrix_lite.xml'
+ - Rendering 'soclabs_4x7_MatrixDecode_adp.v'
+ - Rendering 'soclabs_4x7_AhbMatrix.v'
+ - Rendering 'soclabs_4x7_MatrixDecode_dma2.v'
+ - Rendering 'soclabs_4x7_MasterInput.v'
+ - Rendering 'soclabs_4x7_AhbMatrix_lite.v'
+ - Rendering 'soclabs_4x7_MatrixDecode_dma.v'
+ - Rendering 'soclabs_4x7_SlaveOutput.v'
+ - Rendering 'soclabs_4x7_AhbMatrix_default_slave.v'
+ - Rendering 'soclabs_4x7_AhbMatrix.xml'
+ - Rendering 'soclabs_4x7_Arbiter.v'
+ - Rendering 'soclabs_4x7_MatrixDecode_cpu.v'
+
+Done!
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v
new file mode 100644
index 0000000..f086832
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix.v
@@ -0,0 +1,2151 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------
+//  Abstract            : BusMatrix is the top-level which connects together
+//                        the required Input Stages, MatrixDecodes, Output
+//                        Stages and Output Arbitration blocks.
+//
+//                        Supports the following configured options:
+//
+//                         - Architecture type 'ahb2',
+//                         - 4 slave ports (connecting to masters),
+//                         - 7 master ports (connecting to slaves),
+//                         - Routing address width of 32 bits,
+//                         - Routing data width of 32 bits,
+//                         - xUSER signal width of 2 bits,
+//                         - Arbiter type 'burst',
+//                         - Connectivity mapping:
+//                             S<0..3> -> M<0..6>,
+//                         - Connectivity type 'full'.
+//
+//------------------------------------------------------------------------------
+
+
+`timescale 1ns/1ps
+
+
+module soclabs_4x7_AhbMatrix (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+    // System address remapping control
+    REMAP,
+
+    // Input port SI0 (inputs from master 0)
+    HSEL_adp,
+    HADDR_adp,
+    HTRANS_adp,
+    HWRITE_adp,
+    HSIZE_adp,
+    HBURST_adp,
+    HPROT_adp,
+    HMASTER_adp,
+    HWDATA_adp,
+    HMASTLOCK_adp,
+    HREADY_adp,
+    HAUSER_adp,
+    HWUSER_adp,
+
+    // Input port SI1 (inputs from master 1)
+    HSEL_dma,
+    HADDR_dma,
+    HTRANS_dma,
+    HWRITE_dma,
+    HSIZE_dma,
+    HBURST_dma,
+    HPROT_dma,
+    HMASTER_dma,
+    HWDATA_dma,
+    HMASTLOCK_dma,
+    HREADY_dma,
+    HAUSER_dma,
+    HWUSER_dma,
+
+    // Input port SI2 (inputs from master 2)
+    HSEL_dma2,
+    HADDR_dma2,
+    HTRANS_dma2,
+    HWRITE_dma2,
+    HSIZE_dma2,
+    HBURST_dma2,
+    HPROT_dma2,
+    HMASTER_dma2,
+    HWDATA_dma2,
+    HMASTLOCK_dma2,
+    HREADY_dma2,
+    HAUSER_dma2,
+    HWUSER_dma2,
+
+    // Input port SI3 (inputs from master 3)
+    HSEL_cpu,
+    HADDR_cpu,
+    HTRANS_cpu,
+    HWRITE_cpu,
+    HSIZE_cpu,
+    HBURST_cpu,
+    HPROT_cpu,
+    HMASTER_cpu,
+    HWDATA_cpu,
+    HMASTLOCK_cpu,
+    HREADY_cpu,
+    HAUSER_cpu,
+    HWUSER_cpu,
+
+    // Output port MI0 (inputs from slave 0)
+    HRDATA_rom1,
+    HREADYOUT_rom1,
+    HRESP_rom1,
+    HRUSER_rom1,
+
+    // Output port MI1 (inputs from slave 1)
+    HRDATA_ram2,
+    HREADYOUT_ram2,
+    HRESP_ram2,
+    HRUSER_ram2,
+
+    // Output port MI2 (inputs from slave 2)
+    HRDATA_ram3,
+    HREADYOUT_ram3,
+    HRESP_ram3,
+    HRUSER_ram3,
+
+    // Output port MI3 (inputs from slave 3)
+    HRDATA_sys,
+    HREADYOUT_sys,
+    HRESP_sys,
+    HRUSER_sys,
+
+    // Output port MI4 (inputs from slave 4)
+    HRDATA_ram8,
+    HREADYOUT_ram8,
+    HRESP_ram8,
+    HRUSER_ram8,
+
+    // Output port MI5 (inputs from slave 5)
+    HRDATA_ram9,
+    HREADYOUT_ram9,
+    HRESP_ram9,
+    HRUSER_ram9,
+
+    // Output port MI6 (inputs from slave 6)
+    HRDATA_exp,
+    HREADYOUT_exp,
+    HRESP_exp,
+    HRUSER_exp,
+
+    // Scan test dummy signals; not connected until scan insertion
+    SCANENABLE,   // Scan Test Mode Enable
+    SCANINHCLK,   // Scan Chain Input
+
+
+    // Output port MI0 (outputs to slave 0)
+    HSEL_rom1,
+    HADDR_rom1,
+    HTRANS_rom1,
+    HWRITE_rom1,
+    HSIZE_rom1,
+    HBURST_rom1,
+    HPROT_rom1,
+    HMASTER_rom1,
+    HWDATA_rom1,
+    HMASTLOCK_rom1,
+    HREADYMUX_rom1,
+    HAUSER_rom1,
+    HWUSER_rom1,
+
+    // Output port MI1 (outputs to slave 1)
+    HSEL_ram2,
+    HADDR_ram2,
+    HTRANS_ram2,
+    HWRITE_ram2,
+    HSIZE_ram2,
+    HBURST_ram2,
+    HPROT_ram2,
+    HMASTER_ram2,
+    HWDATA_ram2,
+    HMASTLOCK_ram2,
+    HREADYMUX_ram2,
+    HAUSER_ram2,
+    HWUSER_ram2,
+
+    // Output port MI2 (outputs to slave 2)
+    HSEL_ram3,
+    HADDR_ram3,
+    HTRANS_ram3,
+    HWRITE_ram3,
+    HSIZE_ram3,
+    HBURST_ram3,
+    HPROT_ram3,
+    HMASTER_ram3,
+    HWDATA_ram3,
+    HMASTLOCK_ram3,
+    HREADYMUX_ram3,
+    HAUSER_ram3,
+    HWUSER_ram3,
+
+    // Output port MI3 (outputs to slave 3)
+    HSEL_sys,
+    HADDR_sys,
+    HTRANS_sys,
+    HWRITE_sys,
+    HSIZE_sys,
+    HBURST_sys,
+    HPROT_sys,
+    HMASTER_sys,
+    HWDATA_sys,
+    HMASTLOCK_sys,
+    HREADYMUX_sys,
+    HAUSER_sys,
+    HWUSER_sys,
+
+    // Output port MI4 (outputs to slave 4)
+    HSEL_ram8,
+    HADDR_ram8,
+    HTRANS_ram8,
+    HWRITE_ram8,
+    HSIZE_ram8,
+    HBURST_ram8,
+    HPROT_ram8,
+    HMASTER_ram8,
+    HWDATA_ram8,
+    HMASTLOCK_ram8,
+    HREADYMUX_ram8,
+    HAUSER_ram8,
+    HWUSER_ram8,
+
+    // Output port MI5 (outputs to slave 5)
+    HSEL_ram9,
+    HADDR_ram9,
+    HTRANS_ram9,
+    HWRITE_ram9,
+    HSIZE_ram9,
+    HBURST_ram9,
+    HPROT_ram9,
+    HMASTER_ram9,
+    HWDATA_ram9,
+    HMASTLOCK_ram9,
+    HREADYMUX_ram9,
+    HAUSER_ram9,
+    HWUSER_ram9,
+
+    // Output port MI6 (outputs to slave 6)
+    HSEL_exp,
+    HADDR_exp,
+    HTRANS_exp,
+    HWRITE_exp,
+    HSIZE_exp,
+    HBURST_exp,
+    HPROT_exp,
+    HMASTER_exp,
+    HWDATA_exp,
+    HMASTLOCK_exp,
+    HREADYMUX_exp,
+    HAUSER_exp,
+    HWUSER_exp,
+
+    // Input port SI0 (outputs to master 0)
+    HRDATA_adp,
+    HREADYOUT_adp,
+    HRESP_adp,
+    HRUSER_adp,
+
+    // Input port SI1 (outputs to master 1)
+    HRDATA_dma,
+    HREADYOUT_dma,
+    HRESP_dma,
+    HRUSER_dma,
+
+    // Input port SI2 (outputs to master 2)
+    HRDATA_dma2,
+    HREADYOUT_dma2,
+    HRESP_dma2,
+    HRUSER_dma2,
+
+    // Input port SI3 (outputs to master 3)
+    HRDATA_cpu,
+    HREADYOUT_cpu,
+    HRESP_cpu,
+    HRUSER_cpu,
+
+    // Scan test dummy signals; not connected until scan insertion
+    SCANOUTHCLK   // Scan Chain Output
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input         HCLK;            // AHB System Clock
+    input         HRESETn;         // AHB System Reset
+
+    // System address remapping control
+    input   [3:0] REMAP;           // REMAP input
+
+    // Input port SI0 (inputs from master 0)
+    input         HSEL_adp;          // Slave Select
+    input  [31:0] HADDR_adp;         // Address bus
+    input   [1:0] HTRANS_adp;        // Transfer type
+    input         HWRITE_adp;        // Transfer direction
+    input   [2:0] HSIZE_adp;         // Transfer size
+    input   [2:0] HBURST_adp;        // Burst type
+    input   [3:0] HPROT_adp;         // Protection control
+    input   [3:0] HMASTER_adp;       // Master select
+    input  [31:0] HWDATA_adp;        // Write data
+    input         HMASTLOCK_adp;     // Locked Sequence
+    input         HREADY_adp;        // Transfer done
+    input  [1:0] HAUSER_adp;        // Address USER signals
+    input  [1:0] HWUSER_adp;        // Write-data USER signals
+
+    // Input port SI1 (inputs from master 1)
+    input         HSEL_dma;          // Slave Select
+    input  [31:0] HADDR_dma;         // Address bus
+    input   [1:0] HTRANS_dma;        // Transfer type
+    input         HWRITE_dma;        // Transfer direction
+    input   [2:0] HSIZE_dma;         // Transfer size
+    input   [2:0] HBURST_dma;        // Burst type
+    input   [3:0] HPROT_dma;         // Protection control
+    input   [3:0] HMASTER_dma;       // Master select
+    input  [31:0] HWDATA_dma;        // Write data
+    input         HMASTLOCK_dma;     // Locked Sequence
+    input         HREADY_dma;        // Transfer done
+    input  [1:0] HAUSER_dma;        // Address USER signals
+    input  [1:0] HWUSER_dma;        // Write-data USER signals
+
+    // Input port SI2 (inputs from master 2)
+    input         HSEL_dma2;          // Slave Select
+    input  [31:0] HADDR_dma2;         // Address bus
+    input   [1:0] HTRANS_dma2;        // Transfer type
+    input         HWRITE_dma2;        // Transfer direction
+    input   [2:0] HSIZE_dma2;         // Transfer size
+    input   [2:0] HBURST_dma2;        // Burst type
+    input   [3:0] HPROT_dma2;         // Protection control
+    input   [3:0] HMASTER_dma2;       // Master select
+    input  [31:0] HWDATA_dma2;        // Write data
+    input         HMASTLOCK_dma2;     // Locked Sequence
+    input         HREADY_dma2;        // Transfer done
+    input  [1:0] HAUSER_dma2;        // Address USER signals
+    input  [1:0] HWUSER_dma2;        // Write-data USER signals
+
+    // Input port SI3 (inputs from master 3)
+    input         HSEL_cpu;          // Slave Select
+    input  [31:0] HADDR_cpu;         // Address bus
+    input   [1:0] HTRANS_cpu;        // Transfer type
+    input         HWRITE_cpu;        // Transfer direction
+    input   [2:0] HSIZE_cpu;         // Transfer size
+    input   [2:0] HBURST_cpu;        // Burst type
+    input   [3:0] HPROT_cpu;         // Protection control
+    input   [3:0] HMASTER_cpu;       // Master select
+    input  [31:0] HWDATA_cpu;        // Write data
+    input         HMASTLOCK_cpu;     // Locked Sequence
+    input         HREADY_cpu;        // Transfer done
+    input  [1:0] HAUSER_cpu;        // Address USER signals
+    input  [1:0] HWUSER_cpu;        // Write-data USER signals
+
+    // Output port MI0 (inputs from slave 0)
+    input  [31:0] HRDATA_rom1;        // Read data bus
+    input         HREADYOUT_rom1;     // HREADY feedback
+    input   [1:0] HRESP_rom1;         // Transfer response
+    input  [1:0] HRUSER_rom1;        // Read-data USER signals
+
+    // Output port MI1 (inputs from slave 1)
+    input  [31:0] HRDATA_ram2;        // Read data bus
+    input         HREADYOUT_ram2;     // HREADY feedback
+    input   [1:0] HRESP_ram2;         // Transfer response
+    input  [1:0] HRUSER_ram2;        // Read-data USER signals
+
+    // Output port MI2 (inputs from slave 2)
+    input  [31:0] HRDATA_ram3;        // Read data bus
+    input         HREADYOUT_ram3;     // HREADY feedback
+    input   [1:0] HRESP_ram3;         // Transfer response
+    input  [1:0] HRUSER_ram3;        // Read-data USER signals
+
+    // Output port MI3 (inputs from slave 3)
+    input  [31:0] HRDATA_sys;        // Read data bus
+    input         HREADYOUT_sys;     // HREADY feedback
+    input   [1:0] HRESP_sys;         // Transfer response
+    input  [1:0] HRUSER_sys;        // Read-data USER signals
+
+    // Output port MI4 (inputs from slave 4)
+    input  [31:0] HRDATA_ram8;        // Read data bus
+    input         HREADYOUT_ram8;     // HREADY feedback
+    input   [1:0] HRESP_ram8;         // Transfer response
+    input  [1:0] HRUSER_ram8;        // Read-data USER signals
+
+    // Output port MI5 (inputs from slave 5)
+    input  [31:0] HRDATA_ram9;        // Read data bus
+    input         HREADYOUT_ram9;     // HREADY feedback
+    input   [1:0] HRESP_ram9;         // Transfer response
+    input  [1:0] HRUSER_ram9;        // Read-data USER signals
+
+    // Output port MI6 (inputs from slave 6)
+    input  [31:0] HRDATA_exp;        // Read data bus
+    input         HREADYOUT_exp;     // HREADY feedback
+    input   [1:0] HRESP_exp;         // Transfer response
+    input  [1:0] HRUSER_exp;        // Read-data USER signals
+
+    // Scan test dummy signals; not connected until scan insertion
+    input         SCANENABLE;      // Scan enable signal
+    input         SCANINHCLK;      // HCLK scan input
+
+
+    // Output port MI0 (outputs to slave 0)
+    output        HSEL_rom1;          // Slave Select
+    output [31:0] HADDR_rom1;         // Address bus
+    output  [1:0] HTRANS_rom1;        // Transfer type
+    output        HWRITE_rom1;        // Transfer direction
+    output  [2:0] HSIZE_rom1;         // Transfer size
+    output  [2:0] HBURST_rom1;        // Burst type
+    output  [3:0] HPROT_rom1;         // Protection control
+    output  [3:0] HMASTER_rom1;       // Master select
+    output [31:0] HWDATA_rom1;        // Write data
+    output        HMASTLOCK_rom1;     // Locked Sequence
+    output        HREADYMUX_rom1;     // Transfer done
+    output [1:0] HAUSER_rom1;        // Address USER signals
+    output [1:0] HWUSER_rom1;        // Write-data USER signals
+
+    // Output port MI1 (outputs to slave 1)
+    output        HSEL_ram2;          // Slave Select
+    output [31:0] HADDR_ram2;         // Address bus
+    output  [1:0] HTRANS_ram2;        // Transfer type
+    output        HWRITE_ram2;        // Transfer direction
+    output  [2:0] HSIZE_ram2;         // Transfer size
+    output  [2:0] HBURST_ram2;        // Burst type
+    output  [3:0] HPROT_ram2;         // Protection control
+    output  [3:0] HMASTER_ram2;       // Master select
+    output [31:0] HWDATA_ram2;        // Write data
+    output        HMASTLOCK_ram2;     // Locked Sequence
+    output        HREADYMUX_ram2;     // Transfer done
+    output [1:0] HAUSER_ram2;        // Address USER signals
+    output [1:0] HWUSER_ram2;        // Write-data USER signals
+
+    // Output port MI2 (outputs to slave 2)
+    output        HSEL_ram3;          // Slave Select
+    output [31:0] HADDR_ram3;         // Address bus
+    output  [1:0] HTRANS_ram3;        // Transfer type
+    output        HWRITE_ram3;        // Transfer direction
+    output  [2:0] HSIZE_ram3;         // Transfer size
+    output  [2:0] HBURST_ram3;        // Burst type
+    output  [3:0] HPROT_ram3;         // Protection control
+    output  [3:0] HMASTER_ram3;       // Master select
+    output [31:0] HWDATA_ram3;        // Write data
+    output        HMASTLOCK_ram3;     // Locked Sequence
+    output        HREADYMUX_ram3;     // Transfer done
+    output [1:0] HAUSER_ram3;        // Address USER signals
+    output [1:0] HWUSER_ram3;        // Write-data USER signals
+
+    // Output port MI3 (outputs to slave 3)
+    output        HSEL_sys;          // Slave Select
+    output [31:0] HADDR_sys;         // Address bus
+    output  [1:0] HTRANS_sys;        // Transfer type
+    output        HWRITE_sys;        // Transfer direction
+    output  [2:0] HSIZE_sys;         // Transfer size
+    output  [2:0] HBURST_sys;        // Burst type
+    output  [3:0] HPROT_sys;         // Protection control
+    output  [3:0] HMASTER_sys;       // Master select
+    output [31:0] HWDATA_sys;        // Write data
+    output        HMASTLOCK_sys;     // Locked Sequence
+    output        HREADYMUX_sys;     // Transfer done
+    output [1:0] HAUSER_sys;        // Address USER signals
+    output [1:0] HWUSER_sys;        // Write-data USER signals
+
+    // Output port MI4 (outputs to slave 4)
+    output        HSEL_ram8;          // Slave Select
+    output [31:0] HADDR_ram8;         // Address bus
+    output  [1:0] HTRANS_ram8;        // Transfer type
+    output        HWRITE_ram8;        // Transfer direction
+    output  [2:0] HSIZE_ram8;         // Transfer size
+    output  [2:0] HBURST_ram8;        // Burst type
+    output  [3:0] HPROT_ram8;         // Protection control
+    output  [3:0] HMASTER_ram8;       // Master select
+    output [31:0] HWDATA_ram8;        // Write data
+    output        HMASTLOCK_ram8;     // Locked Sequence
+    output        HREADYMUX_ram8;     // Transfer done
+    output [1:0] HAUSER_ram8;        // Address USER signals
+    output [1:0] HWUSER_ram8;        // Write-data USER signals
+
+    // Output port MI5 (outputs to slave 5)
+    output        HSEL_ram9;          // Slave Select
+    output [31:0] HADDR_ram9;         // Address bus
+    output  [1:0] HTRANS_ram9;        // Transfer type
+    output        HWRITE_ram9;        // Transfer direction
+    output  [2:0] HSIZE_ram9;         // Transfer size
+    output  [2:0] HBURST_ram9;        // Burst type
+    output  [3:0] HPROT_ram9;         // Protection control
+    output  [3:0] HMASTER_ram9;       // Master select
+    output [31:0] HWDATA_ram9;        // Write data
+    output        HMASTLOCK_ram9;     // Locked Sequence
+    output        HREADYMUX_ram9;     // Transfer done
+    output [1:0] HAUSER_ram9;        // Address USER signals
+    output [1:0] HWUSER_ram9;        // Write-data USER signals
+
+    // Output port MI6 (outputs to slave 6)
+    output        HSEL_exp;          // Slave Select
+    output [31:0] HADDR_exp;         // Address bus
+    output  [1:0] HTRANS_exp;        // Transfer type
+    output        HWRITE_exp;        // Transfer direction
+    output  [2:0] HSIZE_exp;         // Transfer size
+    output  [2:0] HBURST_exp;        // Burst type
+    output  [3:0] HPROT_exp;         // Protection control
+    output  [3:0] HMASTER_exp;       // Master select
+    output [31:0] HWDATA_exp;        // Write data
+    output        HMASTLOCK_exp;     // Locked Sequence
+    output        HREADYMUX_exp;     // Transfer done
+    output [1:0] HAUSER_exp;        // Address USER signals
+    output [1:0] HWUSER_exp;        // Write-data USER signals
+
+    // Input port SI0 (outputs to master 0)
+    output [31:0] HRDATA_adp;        // Read data bus
+    output        HREADYOUT_adp;     // HREADY feedback
+    output  [1:0] HRESP_adp;         // Transfer response
+    output [1:0] HRUSER_adp;        // Read-data USER signals
+
+    // Input port SI1 (outputs to master 1)
+    output [31:0] HRDATA_dma;        // Read data bus
+    output        HREADYOUT_dma;     // HREADY feedback
+    output  [1:0] HRESP_dma;         // Transfer response
+    output [1:0] HRUSER_dma;        // Read-data USER signals
+
+    // Input port SI2 (outputs to master 2)
+    output [31:0] HRDATA_dma2;        // Read data bus
+    output        HREADYOUT_dma2;     // HREADY feedback
+    output  [1:0] HRESP_dma2;         // Transfer response
+    output [1:0] HRUSER_dma2;        // Read-data USER signals
+
+    // Input port SI3 (outputs to master 3)
+    output [31:0] HRDATA_cpu;        // Read data bus
+    output        HREADYOUT_cpu;     // HREADY feedback
+    output  [1:0] HRESP_cpu;         // Transfer response
+    output [1:0] HRUSER_cpu;        // Read-data USER signals
+
+    // Scan test dummy signals; not connected until scan insertion
+    output        SCANOUTHCLK;     // Scan Chain Output
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    wire         HCLK;            // AHB System Clock
+    wire         HRESETn;         // AHB System Reset
+
+    // System address remapping control
+    wire   [3:0] REMAP;           // REMAP signal
+
+    // Input Port SI0
+    wire         HSEL_adp;          // Slave Select
+    wire  [31:0] HADDR_adp;         // Address bus
+    wire   [1:0] HTRANS_adp;        // Transfer type
+    wire         HWRITE_adp;        // Transfer direction
+    wire   [2:0] HSIZE_adp;         // Transfer size
+    wire   [2:0] HBURST_adp;        // Burst type
+    wire   [3:0] HPROT_adp;         // Protection control
+    wire   [3:0] HMASTER_adp;       // Master select
+    wire  [31:0] HWDATA_adp;        // Write data
+    wire         HMASTLOCK_adp;     // Locked Sequence
+    wire         HREADY_adp;        // Transfer done
+
+    wire  [31:0] HRDATA_adp;        // Read data bus
+    wire         HREADYOUT_adp;     // HREADY feedback
+    wire   [1:0] HRESP_adp;         // Transfer response
+    wire  [1:0] HAUSER_adp;        // Address USER signals
+    wire  [1:0] HWUSER_adp;        // Write-data USER signals
+    wire  [1:0] HRUSER_adp;        // Read-data USER signals
+
+    // Input Port SI1
+    wire         HSEL_dma;          // Slave Select
+    wire  [31:0] HADDR_dma;         // Address bus
+    wire   [1:0] HTRANS_dma;        // Transfer type
+    wire         HWRITE_dma;        // Transfer direction
+    wire   [2:0] HSIZE_dma;         // Transfer size
+    wire   [2:0] HBURST_dma;        // Burst type
+    wire   [3:0] HPROT_dma;         // Protection control
+    wire   [3:0] HMASTER_dma;       // Master select
+    wire  [31:0] HWDATA_dma;        // Write data
+    wire         HMASTLOCK_dma;     // Locked Sequence
+    wire         HREADY_dma;        // Transfer done
+
+    wire  [31:0] HRDATA_dma;        // Read data bus
+    wire         HREADYOUT_dma;     // HREADY feedback
+    wire   [1:0] HRESP_dma;         // Transfer response
+    wire  [1:0] HAUSER_dma;        // Address USER signals
+    wire  [1:0] HWUSER_dma;        // Write-data USER signals
+    wire  [1:0] HRUSER_dma;        // Read-data USER signals
+
+    // Input Port SI2
+    wire         HSEL_dma2;          // Slave Select
+    wire  [31:0] HADDR_dma2;         // Address bus
+    wire   [1:0] HTRANS_dma2;        // Transfer type
+    wire         HWRITE_dma2;        // Transfer direction
+    wire   [2:0] HSIZE_dma2;         // Transfer size
+    wire   [2:0] HBURST_dma2;        // Burst type
+    wire   [3:0] HPROT_dma2;         // Protection control
+    wire   [3:0] HMASTER_dma2;       // Master select
+    wire  [31:0] HWDATA_dma2;        // Write data
+    wire         HMASTLOCK_dma2;     // Locked Sequence
+    wire         HREADY_dma2;        // Transfer done
+
+    wire  [31:0] HRDATA_dma2;        // Read data bus
+    wire         HREADYOUT_dma2;     // HREADY feedback
+    wire   [1:0] HRESP_dma2;         // Transfer response
+    wire  [1:0] HAUSER_dma2;        // Address USER signals
+    wire  [1:0] HWUSER_dma2;        // Write-data USER signals
+    wire  [1:0] HRUSER_dma2;        // Read-data USER signals
+
+    // Input Port SI3
+    wire         HSEL_cpu;          // Slave Select
+    wire  [31:0] HADDR_cpu;         // Address bus
+    wire   [1:0] HTRANS_cpu;        // Transfer type
+    wire         HWRITE_cpu;        // Transfer direction
+    wire   [2:0] HSIZE_cpu;         // Transfer size
+    wire   [2:0] HBURST_cpu;        // Burst type
+    wire   [3:0] HPROT_cpu;         // Protection control
+    wire   [3:0] HMASTER_cpu;       // Master select
+    wire  [31:0] HWDATA_cpu;        // Write data
+    wire         HMASTLOCK_cpu;     // Locked Sequence
+    wire         HREADY_cpu;        // Transfer done
+
+    wire  [31:0] HRDATA_cpu;        // Read data bus
+    wire         HREADYOUT_cpu;     // HREADY feedback
+    wire   [1:0] HRESP_cpu;         // Transfer response
+    wire  [1:0] HAUSER_cpu;        // Address USER signals
+    wire  [1:0] HWUSER_cpu;        // Write-data USER signals
+    wire  [1:0] HRUSER_cpu;        // Read-data USER signals
+
+    // Output Port MI0
+    wire         HSEL_rom1;          // Slave Select
+    wire  [31:0] HADDR_rom1;         // Address bus
+    wire   [1:0] HTRANS_rom1;        // Transfer type
+    wire         HWRITE_rom1;        // Transfer direction
+    wire   [2:0] HSIZE_rom1;         // Transfer size
+    wire   [2:0] HBURST_rom1;        // Burst type
+    wire   [3:0] HPROT_rom1;         // Protection control
+    wire   [3:0] HMASTER_rom1;       // Master select
+    wire  [31:0] HWDATA_rom1;        // Write data
+    wire         HMASTLOCK_rom1;     // Locked Sequence
+    wire         HREADYMUX_rom1;     // Transfer done
+
+    wire  [31:0] HRDATA_rom1;        // Read data bus
+    wire         HREADYOUT_rom1;     // HREADY feedback
+    wire   [1:0] HRESP_rom1;         // Transfer response
+    wire  [1:0] HAUSER_rom1;        // Address USER signals
+    wire  [1:0] HWUSER_rom1;        // Write-data USER signals
+    wire  [1:0] HRUSER_rom1;        // Read-data USER signals
+
+    // Output Port MI1
+    wire         HSEL_ram2;          // Slave Select
+    wire  [31:0] HADDR_ram2;         // Address bus
+    wire   [1:0] HTRANS_ram2;        // Transfer type
+    wire         HWRITE_ram2;        // Transfer direction
+    wire   [2:0] HSIZE_ram2;         // Transfer size
+    wire   [2:0] HBURST_ram2;        // Burst type
+    wire   [3:0] HPROT_ram2;         // Protection control
+    wire   [3:0] HMASTER_ram2;       // Master select
+    wire  [31:0] HWDATA_ram2;        // Write data
+    wire         HMASTLOCK_ram2;     // Locked Sequence
+    wire         HREADYMUX_ram2;     // Transfer done
+
+    wire  [31:0] HRDATA_ram2;        // Read data bus
+    wire         HREADYOUT_ram2;     // HREADY feedback
+    wire   [1:0] HRESP_ram2;         // Transfer response
+    wire  [1:0] HAUSER_ram2;        // Address USER signals
+    wire  [1:0] HWUSER_ram2;        // Write-data USER signals
+    wire  [1:0] HRUSER_ram2;        // Read-data USER signals
+
+    // Output Port MI2
+    wire         HSEL_ram3;          // Slave Select
+    wire  [31:0] HADDR_ram3;         // Address bus
+    wire   [1:0] HTRANS_ram3;        // Transfer type
+    wire         HWRITE_ram3;        // Transfer direction
+    wire   [2:0] HSIZE_ram3;         // Transfer size
+    wire   [2:0] HBURST_ram3;        // Burst type
+    wire   [3:0] HPROT_ram3;         // Protection control
+    wire   [3:0] HMASTER_ram3;       // Master select
+    wire  [31:0] HWDATA_ram3;        // Write data
+    wire         HMASTLOCK_ram3;     // Locked Sequence
+    wire         HREADYMUX_ram3;     // Transfer done
+
+    wire  [31:0] HRDATA_ram3;        // Read data bus
+    wire         HREADYOUT_ram3;     // HREADY feedback
+    wire   [1:0] HRESP_ram3;         // Transfer response
+    wire  [1:0] HAUSER_ram3;        // Address USER signals
+    wire  [1:0] HWUSER_ram3;        // Write-data USER signals
+    wire  [1:0] HRUSER_ram3;        // Read-data USER signals
+
+    // Output Port MI3
+    wire         HSEL_sys;          // Slave Select
+    wire  [31:0] HADDR_sys;         // Address bus
+    wire   [1:0] HTRANS_sys;        // Transfer type
+    wire         HWRITE_sys;        // Transfer direction
+    wire   [2:0] HSIZE_sys;         // Transfer size
+    wire   [2:0] HBURST_sys;        // Burst type
+    wire   [3:0] HPROT_sys;         // Protection control
+    wire   [3:0] HMASTER_sys;       // Master select
+    wire  [31:0] HWDATA_sys;        // Write data
+    wire         HMASTLOCK_sys;     // Locked Sequence
+    wire         HREADYMUX_sys;     // Transfer done
+
+    wire  [31:0] HRDATA_sys;        // Read data bus
+    wire         HREADYOUT_sys;     // HREADY feedback
+    wire   [1:0] HRESP_sys;         // Transfer response
+    wire  [1:0] HAUSER_sys;        // Address USER signals
+    wire  [1:0] HWUSER_sys;        // Write-data USER signals
+    wire  [1:0] HRUSER_sys;        // Read-data USER signals
+
+    // Output Port MI4
+    wire         HSEL_ram8;          // Slave Select
+    wire  [31:0] HADDR_ram8;         // Address bus
+    wire   [1:0] HTRANS_ram8;        // Transfer type
+    wire         HWRITE_ram8;        // Transfer direction
+    wire   [2:0] HSIZE_ram8;         // Transfer size
+    wire   [2:0] HBURST_ram8;        // Burst type
+    wire   [3:0] HPROT_ram8;         // Protection control
+    wire   [3:0] HMASTER_ram8;       // Master select
+    wire  [31:0] HWDATA_ram8;        // Write data
+    wire         HMASTLOCK_ram8;     // Locked Sequence
+    wire         HREADYMUX_ram8;     // Transfer done
+
+    wire  [31:0] HRDATA_ram8;        // Read data bus
+    wire         HREADYOUT_ram8;     // HREADY feedback
+    wire   [1:0] HRESP_ram8;         // Transfer response
+    wire  [1:0] HAUSER_ram8;        // Address USER signals
+    wire  [1:0] HWUSER_ram8;        // Write-data USER signals
+    wire  [1:0] HRUSER_ram8;        // Read-data USER signals
+
+    // Output Port MI5
+    wire         HSEL_ram9;          // Slave Select
+    wire  [31:0] HADDR_ram9;         // Address bus
+    wire   [1:0] HTRANS_ram9;        // Transfer type
+    wire         HWRITE_ram9;        // Transfer direction
+    wire   [2:0] HSIZE_ram9;         // Transfer size
+    wire   [2:0] HBURST_ram9;        // Burst type
+    wire   [3:0] HPROT_ram9;         // Protection control
+    wire   [3:0] HMASTER_ram9;       // Master select
+    wire  [31:0] HWDATA_ram9;        // Write data
+    wire         HMASTLOCK_ram9;     // Locked Sequence
+    wire         HREADYMUX_ram9;     // Transfer done
+
+    wire  [31:0] HRDATA_ram9;        // Read data bus
+    wire         HREADYOUT_ram9;     // HREADY feedback
+    wire   [1:0] HRESP_ram9;         // Transfer response
+    wire  [1:0] HAUSER_ram9;        // Address USER signals
+    wire  [1:0] HWUSER_ram9;        // Write-data USER signals
+    wire  [1:0] HRUSER_ram9;        // Read-data USER signals
+
+    // Output Port MI6
+    wire         HSEL_exp;          // Slave Select
+    wire  [31:0] HADDR_exp;         // Address bus
+    wire   [1:0] HTRANS_exp;        // Transfer type
+    wire         HWRITE_exp;        // Transfer direction
+    wire   [2:0] HSIZE_exp;         // Transfer size
+    wire   [2:0] HBURST_exp;        // Burst type
+    wire   [3:0] HPROT_exp;         // Protection control
+    wire   [3:0] HMASTER_exp;       // Master select
+    wire  [31:0] HWDATA_exp;        // Write data
+    wire         HMASTLOCK_exp;     // Locked Sequence
+    wire         HREADYMUX_exp;     // Transfer done
+
+    wire  [31:0] HRDATA_exp;        // Read data bus
+    wire         HREADYOUT_exp;     // HREADY feedback
+    wire   [1:0] HRESP_exp;         // Transfer response
+    wire  [1:0] HAUSER_exp;        // Address USER signals
+    wire  [1:0] HWUSER_exp;        // Write-data USER signals
+    wire  [1:0] HRUSER_exp;        // Read-data USER signals
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+
+    // Bus-switch input SI0
+    wire         i_sel0;            // HSEL signal
+    wire  [31:0] i_addr0;           // HADDR signal
+    wire   [1:0] i_trans0;          // HTRANS signal
+    wire         i_write0;          // HWRITE signal
+    wire   [2:0] i_size0;           // HSIZE signal
+    wire   [2:0] i_burst0;          // HBURST signal
+    wire   [3:0] i_prot0;           // HPROTS signal
+    wire   [3:0] i_master0;         // HMASTER signal
+    wire         i_mastlock0;       // HMASTLOCK signal
+    wire         i_active0;         // Active signal
+    wire         i_held_tran0;       // HeldTran signal
+    wire         i_readyout0;       // Readyout signal
+    wire   [1:0] i_resp0;           // Response signal
+    wire  [1:0] i_auser0;          // HAUSER signal
+
+    // Bus-switch input SI1
+    wire         i_sel1;            // HSEL signal
+    wire  [31:0] i_addr1;           // HADDR signal
+    wire   [1:0] i_trans1;          // HTRANS signal
+    wire         i_write1;          // HWRITE signal
+    wire   [2:0] i_size1;           // HSIZE signal
+    wire   [2:0] i_burst1;          // HBURST signal
+    wire   [3:0] i_prot1;           // HPROTS signal
+    wire   [3:0] i_master1;         // HMASTER signal
+    wire         i_mastlock1;       // HMASTLOCK signal
+    wire         i_active1;         // Active signal
+    wire         i_held_tran1;       // HeldTran signal
+    wire         i_readyout1;       // Readyout signal
+    wire   [1:0] i_resp1;           // Response signal
+    wire  [1:0] i_auser1;          // HAUSER signal
+
+    // Bus-switch input SI2
+    wire         i_sel2;            // HSEL signal
+    wire  [31:0] i_addr2;           // HADDR signal
+    wire   [1:0] i_trans2;          // HTRANS signal
+    wire         i_write2;          // HWRITE signal
+    wire   [2:0] i_size2;           // HSIZE signal
+    wire   [2:0] i_burst2;          // HBURST signal
+    wire   [3:0] i_prot2;           // HPROTS signal
+    wire   [3:0] i_master2;         // HMASTER signal
+    wire         i_mastlock2;       // HMASTLOCK signal
+    wire         i_active2;         // Active signal
+    wire         i_held_tran2;       // HeldTran signal
+    wire         i_readyout2;       // Readyout signal
+    wire   [1:0] i_resp2;           // Response signal
+    wire  [1:0] i_auser2;          // HAUSER signal
+
+    // Bus-switch input SI3
+    wire         i_sel3;            // HSEL signal
+    wire  [31:0] i_addr3;           // HADDR signal
+    wire   [1:0] i_trans3;          // HTRANS signal
+    wire         i_write3;          // HWRITE signal
+    wire   [2:0] i_size3;           // HSIZE signal
+    wire   [2:0] i_burst3;          // HBURST signal
+    wire   [3:0] i_prot3;           // HPROTS signal
+    wire   [3:0] i_master3;         // HMASTER signal
+    wire         i_mastlock3;       // HMASTLOCK signal
+    wire         i_active3;         // Active signal
+    wire         i_held_tran3;       // HeldTran signal
+    wire         i_readyout3;       // Readyout signal
+    wire   [1:0] i_resp3;           // Response signal
+    wire  [1:0] i_auser3;          // HAUSER signal
+
+    // Bus-switch SI0 to MI0 signals
+    wire         i_sel0to0;         // Routing selection signal
+    wire         i_active0to0;      // Active signal
+
+    // Bus-switch SI0 to MI1 signals
+    wire         i_sel0to1;         // Routing selection signal
+    wire         i_active0to1;      // Active signal
+
+    // Bus-switch SI0 to MI2 signals
+    wire         i_sel0to2;         // Routing selection signal
+    wire         i_active0to2;      // Active signal
+
+    // Bus-switch SI0 to MI3 signals
+    wire         i_sel0to3;         // Routing selection signal
+    wire         i_active0to3;      // Active signal
+
+    // Bus-switch SI0 to MI4 signals
+    wire         i_sel0to4;         // Routing selection signal
+    wire         i_active0to4;      // Active signal
+
+    // Bus-switch SI0 to MI5 signals
+    wire         i_sel0to5;         // Routing selection signal
+    wire         i_active0to5;      // Active signal
+
+    // Bus-switch SI0 to MI6 signals
+    wire         i_sel0to6;         // Routing selection signal
+    wire         i_active0to6;      // Active signal
+
+    // Bus-switch SI1 to MI0 signals
+    wire         i_sel1to0;         // Routing selection signal
+    wire         i_active1to0;      // Active signal
+
+    // Bus-switch SI1 to MI1 signals
+    wire         i_sel1to1;         // Routing selection signal
+    wire         i_active1to1;      // Active signal
+
+    // Bus-switch SI1 to MI2 signals
+    wire         i_sel1to2;         // Routing selection signal
+    wire         i_active1to2;      // Active signal
+
+    // Bus-switch SI1 to MI3 signals
+    wire         i_sel1to3;         // Routing selection signal
+    wire         i_active1to3;      // Active signal
+
+    // Bus-switch SI1 to MI4 signals
+    wire         i_sel1to4;         // Routing selection signal
+    wire         i_active1to4;      // Active signal
+
+    // Bus-switch SI1 to MI5 signals
+    wire         i_sel1to5;         // Routing selection signal
+    wire         i_active1to5;      // Active signal
+
+    // Bus-switch SI1 to MI6 signals
+    wire         i_sel1to6;         // Routing selection signal
+    wire         i_active1to6;      // Active signal
+
+    // Bus-switch SI2 to MI0 signals
+    wire         i_sel2to0;         // Routing selection signal
+    wire         i_active2to0;      // Active signal
+
+    // Bus-switch SI2 to MI1 signals
+    wire         i_sel2to1;         // Routing selection signal
+    wire         i_active2to1;      // Active signal
+
+    // Bus-switch SI2 to MI2 signals
+    wire         i_sel2to2;         // Routing selection signal
+    wire         i_active2to2;      // Active signal
+
+    // Bus-switch SI2 to MI3 signals
+    wire         i_sel2to3;         // Routing selection signal
+    wire         i_active2to3;      // Active signal
+
+    // Bus-switch SI2 to MI4 signals
+    wire         i_sel2to4;         // Routing selection signal
+    wire         i_active2to4;      // Active signal
+
+    // Bus-switch SI2 to MI5 signals
+    wire         i_sel2to5;         // Routing selection signal
+    wire         i_active2to5;      // Active signal
+
+    // Bus-switch SI2 to MI6 signals
+    wire         i_sel2to6;         // Routing selection signal
+    wire         i_active2to6;      // Active signal
+
+    // Bus-switch SI3 to MI0 signals
+    wire         i_sel3to0;         // Routing selection signal
+    wire         i_active3to0;      // Active signal
+
+    // Bus-switch SI3 to MI1 signals
+    wire         i_sel3to1;         // Routing selection signal
+    wire         i_active3to1;      // Active signal
+
+    // Bus-switch SI3 to MI2 signals
+    wire         i_sel3to2;         // Routing selection signal
+    wire         i_active3to2;      // Active signal
+
+    // Bus-switch SI3 to MI3 signals
+    wire         i_sel3to3;         // Routing selection signal
+    wire         i_active3to3;      // Active signal
+
+    // Bus-switch SI3 to MI4 signals
+    wire         i_sel3to4;         // Routing selection signal
+    wire         i_active3to4;      // Active signal
+
+    // Bus-switch SI3 to MI5 signals
+    wire         i_sel3to5;         // Routing selection signal
+    wire         i_active3to5;      // Active signal
+
+    // Bus-switch SI3 to MI6 signals
+    wire         i_sel3to6;         // Routing selection signal
+    wire         i_active3to6;      // Active signal
+
+    wire         i_hready_mux__rom1;    // Internal HREADYMUXM for MI0
+    wire         i_hready_mux__ram2;    // Internal HREADYMUXM for MI1
+    wire         i_hready_mux__ram3;    // Internal HREADYMUXM for MI2
+    wire         i_hready_mux__sys;    // Internal HREADYMUXM for MI3
+    wire         i_hready_mux__ram8;    // Internal HREADYMUXM for MI4
+    wire         i_hready_mux__ram9;    // Internal HREADYMUXM for MI5
+    wire         i_hready_mux__exp;    // Internal HREADYMUXM for MI6
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+  // Input stage for SI0
+  soclabs_4x7_MasterInput u_soclabs_4x7_MasterInput_0 (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Input Port Address/Control Signals
+    .HSELS      (HSEL_adp),
+    .HADDRS     (HADDR_adp),
+    .HTRANSS    (HTRANS_adp),
+    .HWRITES    (HWRITE_adp),
+    .HSIZES     (HSIZE_adp),
+    .HBURSTS    (HBURST_adp),
+    .HPROTS     (HPROT_adp),
+    .HMASTERS   (HMASTER_adp),
+    .HMASTLOCKS (HMASTLOCK_adp),
+    .HREADYS    (HREADY_adp),
+    .HAUSERS    (HAUSER_adp),
+
+    // Internal Response
+    .active_ip     (i_active0),
+    .readyout_ip   (i_readyout0),
+    .resp_ip       (i_resp0),
+
+    // Input Port Response
+    .HREADYOUTS (HREADYOUT_adp),
+    .HRESPS     (HRESP_adp),
+
+    // Internal Address/Control Signals
+    .sel_ip        (i_sel0),
+    .addr_ip       (i_addr0),
+    .auser_ip      (i_auser0),
+    .trans_ip      (i_trans0),
+    .write_ip      (i_write0),
+    .size_ip       (i_size0),
+    .burst_ip      (i_burst0),
+    .prot_ip       (i_prot0),
+    .master_ip     (i_master0),
+    .mastlock_ip   (i_mastlock0),
+    .held_tran_ip   (i_held_tran0)
+
+    );
+
+
+  // Input stage for SI1
+  soclabs_4x7_MasterInput u_soclabs_4x7_MasterInput_1 (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Input Port Address/Control Signals
+    .HSELS      (HSEL_dma),
+    .HADDRS     (HADDR_dma),
+    .HTRANSS    (HTRANS_dma),
+    .HWRITES    (HWRITE_dma),
+    .HSIZES     (HSIZE_dma),
+    .HBURSTS    (HBURST_dma),
+    .HPROTS     (HPROT_dma),
+    .HMASTERS   (HMASTER_dma),
+    .HMASTLOCKS (HMASTLOCK_dma),
+    .HREADYS    (HREADY_dma),
+    .HAUSERS    (HAUSER_dma),
+
+    // Internal Response
+    .active_ip     (i_active1),
+    .readyout_ip   (i_readyout1),
+    .resp_ip       (i_resp1),
+
+    // Input Port Response
+    .HREADYOUTS (HREADYOUT_dma),
+    .HRESPS     (HRESP_dma),
+
+    // Internal Address/Control Signals
+    .sel_ip        (i_sel1),
+    .addr_ip       (i_addr1),
+    .auser_ip      (i_auser1),
+    .trans_ip      (i_trans1),
+    .write_ip      (i_write1),
+    .size_ip       (i_size1),
+    .burst_ip      (i_burst1),
+    .prot_ip       (i_prot1),
+    .master_ip     (i_master1),
+    .mastlock_ip   (i_mastlock1),
+    .held_tran_ip   (i_held_tran1)
+
+    );
+
+
+  // Input stage for SI2
+  soclabs_4x7_MasterInput u_soclabs_4x7_MasterInput_2 (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Input Port Address/Control Signals
+    .HSELS      (HSEL_dma2),
+    .HADDRS     (HADDR_dma2),
+    .HTRANSS    (HTRANS_dma2),
+    .HWRITES    (HWRITE_dma2),
+    .HSIZES     (HSIZE_dma2),
+    .HBURSTS    (HBURST_dma2),
+    .HPROTS     (HPROT_dma2),
+    .HMASTERS   (HMASTER_dma2),
+    .HMASTLOCKS (HMASTLOCK_dma2),
+    .HREADYS    (HREADY_dma2),
+    .HAUSERS    (HAUSER_dma2),
+
+    // Internal Response
+    .active_ip     (i_active2),
+    .readyout_ip   (i_readyout2),
+    .resp_ip       (i_resp2),
+
+    // Input Port Response
+    .HREADYOUTS (HREADYOUT_dma2),
+    .HRESPS     (HRESP_dma2),
+
+    // Internal Address/Control Signals
+    .sel_ip        (i_sel2),
+    .addr_ip       (i_addr2),
+    .auser_ip      (i_auser2),
+    .trans_ip      (i_trans2),
+    .write_ip      (i_write2),
+    .size_ip       (i_size2),
+    .burst_ip      (i_burst2),
+    .prot_ip       (i_prot2),
+    .master_ip     (i_master2),
+    .mastlock_ip   (i_mastlock2),
+    .held_tran_ip   (i_held_tran2)
+
+    );
+
+
+  // Input stage for SI3
+  soclabs_4x7_MasterInput u_soclabs_4x7_MasterInput_3 (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Input Port Address/Control Signals
+    .HSELS      (HSEL_cpu),
+    .HADDRS     (HADDR_cpu),
+    .HTRANSS    (HTRANS_cpu),
+    .HWRITES    (HWRITE_cpu),
+    .HSIZES     (HSIZE_cpu),
+    .HBURSTS    (HBURST_cpu),
+    .HPROTS     (HPROT_cpu),
+    .HMASTERS   (HMASTER_cpu),
+    .HMASTLOCKS (HMASTLOCK_cpu),
+    .HREADYS    (HREADY_cpu),
+    .HAUSERS    (HAUSER_cpu),
+
+    // Internal Response
+    .active_ip     (i_active3),
+    .readyout_ip   (i_readyout3),
+    .resp_ip       (i_resp3),
+
+    // Input Port Response
+    .HREADYOUTS (HREADYOUT_cpu),
+    .HRESPS     (HRESP_cpu),
+
+    // Internal Address/Control Signals
+    .sel_ip        (i_sel3),
+    .addr_ip       (i_addr3),
+    .auser_ip      (i_auser3),
+    .trans_ip      (i_trans3),
+    .write_ip      (i_write3),
+    .size_ip       (i_size3),
+    .burst_ip      (i_burst3),
+    .prot_ip       (i_prot3),
+    .master_ip     (i_master3),
+    .mastlock_ip   (i_mastlock3),
+    .held_tran_ip   (i_held_tran3)
+
+    );
+
+
+  // Matrix decoder for SI0
+  soclabs_4x7_MatrixDecode_adp u_soclabs_4x7_matrixdecode_adp (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Internal address remapping control
+    .remapping_dec  ( REMAP[0] ),
+
+    // Signals from Input stage SI0
+    .HREADYS    (HREADY_adp),
+    .sel_dec        (i_sel0),
+    .decode_addr_dec (i_addr0[31:10]),   // HADDR[9:0] is not decoded
+    .trans_dec      (i_trans0),
+
+    // Control/Response for Output Stage MI0
+    .active_dec0    (i_active0to0),
+    .readyout_dec0  (i_hready_mux__rom1),
+    .resp_dec0      (HRESP_rom1),
+    .rdata_dec0     (HRDATA_rom1),
+    .ruser_dec0     (HRUSER_rom1),
+
+    // Control/Response for Output Stage MI1
+    .active_dec1    (i_active0to1),
+    .readyout_dec1  (i_hready_mux__ram2),
+    .resp_dec1      (HRESP_ram2),
+    .rdata_dec1     (HRDATA_ram2),
+    .ruser_dec1     (HRUSER_ram2),
+
+    // Control/Response for Output Stage MI2
+    .active_dec2    (i_active0to2),
+    .readyout_dec2  (i_hready_mux__ram3),
+    .resp_dec2      (HRESP_ram3),
+    .rdata_dec2     (HRDATA_ram3),
+    .ruser_dec2     (HRUSER_ram3),
+
+    // Control/Response for Output Stage MI3
+    .active_dec3    (i_active0to3),
+    .readyout_dec3  (i_hready_mux__sys),
+    .resp_dec3      (HRESP_sys),
+    .rdata_dec3     (HRDATA_sys),
+    .ruser_dec3     (HRUSER_sys),
+
+    // Control/Response for Output Stage MI4
+    .active_dec4    (i_active0to4),
+    .readyout_dec4  (i_hready_mux__ram8),
+    .resp_dec4      (HRESP_ram8),
+    .rdata_dec4     (HRDATA_ram8),
+    .ruser_dec4     (HRUSER_ram8),
+
+    // Control/Response for Output Stage MI5
+    .active_dec5    (i_active0to5),
+    .readyout_dec5  (i_hready_mux__ram9),
+    .resp_dec5      (HRESP_ram9),
+    .rdata_dec5     (HRDATA_ram9),
+    .ruser_dec5     (HRUSER_ram9),
+
+    // Control/Response for Output Stage MI6
+    .active_dec6    (i_active0to6),
+    .readyout_dec6  (i_hready_mux__exp),
+    .resp_dec6      (HRESP_exp),
+    .rdata_dec6     (HRDATA_exp),
+    .ruser_dec6     (HRUSER_exp),
+
+    .sel_dec0       (i_sel0to0),
+    .sel_dec1       (i_sel0to1),
+    .sel_dec2       (i_sel0to2),
+    .sel_dec3       (i_sel0to3),
+    .sel_dec4       (i_sel0to4),
+    .sel_dec5       (i_sel0to5),
+    .sel_dec6       (i_sel0to6),
+
+    .active_dec     (i_active0),
+    .HREADYOUTS (i_readyout0),
+    .HRESPS     (i_resp0),
+    .HRUSERS    (HRUSER_adp),
+    .HRDATAS    (HRDATA_adp)
+
+    );
+
+
+  // Matrix decoder for SI1
+  soclabs_4x7_MatrixDecode_dma u_soclabs_4x7_matrixdecode_dma (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Signals from Input stage SI1
+    .HREADYS    (HREADY_dma),
+    .sel_dec        (i_sel1),
+    .decode_addr_dec (i_addr1[31:10]),   // HADDR[9:0] is not decoded
+    .trans_dec      (i_trans1),
+
+    // Control/Response for Output Stage MI0
+    .active_dec0    (i_active1to0),
+    .readyout_dec0  (i_hready_mux__rom1),
+    .resp_dec0      (HRESP_rom1),
+    .rdata_dec0     (HRDATA_rom1),
+    .ruser_dec0     (HRUSER_rom1),
+
+    // Control/Response for Output Stage MI1
+    .active_dec1    (i_active1to1),
+    .readyout_dec1  (i_hready_mux__ram2),
+    .resp_dec1      (HRESP_ram2),
+    .rdata_dec1     (HRDATA_ram2),
+    .ruser_dec1     (HRUSER_ram2),
+
+    // Control/Response for Output Stage MI2
+    .active_dec2    (i_active1to2),
+    .readyout_dec2  (i_hready_mux__ram3),
+    .resp_dec2      (HRESP_ram3),
+    .rdata_dec2     (HRDATA_ram3),
+    .ruser_dec2     (HRUSER_ram3),
+
+    // Control/Response for Output Stage MI3
+    .active_dec3    (i_active1to3),
+    .readyout_dec3  (i_hready_mux__sys),
+    .resp_dec3      (HRESP_sys),
+    .rdata_dec3     (HRDATA_sys),
+    .ruser_dec3     (HRUSER_sys),
+
+    // Control/Response for Output Stage MI4
+    .active_dec4    (i_active1to4),
+    .readyout_dec4  (i_hready_mux__ram8),
+    .resp_dec4      (HRESP_ram8),
+    .rdata_dec4     (HRDATA_ram8),
+    .ruser_dec4     (HRUSER_ram8),
+
+    // Control/Response for Output Stage MI5
+    .active_dec5    (i_active1to5),
+    .readyout_dec5  (i_hready_mux__ram9),
+    .resp_dec5      (HRESP_ram9),
+    .rdata_dec5     (HRDATA_ram9),
+    .ruser_dec5     (HRUSER_ram9),
+
+    // Control/Response for Output Stage MI6
+    .active_dec6    (i_active1to6),
+    .readyout_dec6  (i_hready_mux__exp),
+    .resp_dec6      (HRESP_exp),
+    .rdata_dec6     (HRDATA_exp),
+    .ruser_dec6     (HRUSER_exp),
+
+    .sel_dec0       (i_sel1to0),
+    .sel_dec1       (i_sel1to1),
+    .sel_dec2       (i_sel1to2),
+    .sel_dec3       (i_sel1to3),
+    .sel_dec4       (i_sel1to4),
+    .sel_dec5       (i_sel1to5),
+    .sel_dec6       (i_sel1to6),
+
+    .active_dec     (i_active1),
+    .HREADYOUTS (i_readyout1),
+    .HRESPS     (i_resp1),
+    .HRUSERS    (HRUSER_dma),
+    .HRDATAS    (HRDATA_dma)
+
+    );
+
+
+  // Matrix decoder for SI2
+  soclabs_4x7_MatrixDecode_dma2 u_soclabs_4x7_matrixdecode_dma2 (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Signals from Input stage SI2
+    .HREADYS    (HREADY_dma2),
+    .sel_dec        (i_sel2),
+    .decode_addr_dec (i_addr2[31:10]),   // HADDR[9:0] is not decoded
+    .trans_dec      (i_trans2),
+
+    // Control/Response for Output Stage MI0
+    .active_dec0    (i_active2to0),
+    .readyout_dec0  (i_hready_mux__rom1),
+    .resp_dec0      (HRESP_rom1),
+    .rdata_dec0     (HRDATA_rom1),
+    .ruser_dec0     (HRUSER_rom1),
+
+    // Control/Response for Output Stage MI1
+    .active_dec1    (i_active2to1),
+    .readyout_dec1  (i_hready_mux__ram2),
+    .resp_dec1      (HRESP_ram2),
+    .rdata_dec1     (HRDATA_ram2),
+    .ruser_dec1     (HRUSER_ram2),
+
+    // Control/Response for Output Stage MI2
+    .active_dec2    (i_active2to2),
+    .readyout_dec2  (i_hready_mux__ram3),
+    .resp_dec2      (HRESP_ram3),
+    .rdata_dec2     (HRDATA_ram3),
+    .ruser_dec2     (HRUSER_ram3),
+
+    // Control/Response for Output Stage MI3
+    .active_dec3    (i_active2to3),
+    .readyout_dec3  (i_hready_mux__sys),
+    .resp_dec3      (HRESP_sys),
+    .rdata_dec3     (HRDATA_sys),
+    .ruser_dec3     (HRUSER_sys),
+
+    // Control/Response for Output Stage MI4
+    .active_dec4    (i_active2to4),
+    .readyout_dec4  (i_hready_mux__ram8),
+    .resp_dec4      (HRESP_ram8),
+    .rdata_dec4     (HRDATA_ram8),
+    .ruser_dec4     (HRUSER_ram8),
+
+    // Control/Response for Output Stage MI5
+    .active_dec5    (i_active2to5),
+    .readyout_dec5  (i_hready_mux__ram9),
+    .resp_dec5      (HRESP_ram9),
+    .rdata_dec5     (HRDATA_ram9),
+    .ruser_dec5     (HRUSER_ram9),
+
+    // Control/Response for Output Stage MI6
+    .active_dec6    (i_active2to6),
+    .readyout_dec6  (i_hready_mux__exp),
+    .resp_dec6      (HRESP_exp),
+    .rdata_dec6     (HRDATA_exp),
+    .ruser_dec6     (HRUSER_exp),
+
+    .sel_dec0       (i_sel2to0),
+    .sel_dec1       (i_sel2to1),
+    .sel_dec2       (i_sel2to2),
+    .sel_dec3       (i_sel2to3),
+    .sel_dec4       (i_sel2to4),
+    .sel_dec5       (i_sel2to5),
+    .sel_dec6       (i_sel2to6),
+
+    .active_dec     (i_active2),
+    .HREADYOUTS (i_readyout2),
+    .HRESPS     (i_resp2),
+    .HRUSERS    (HRUSER_dma2),
+    .HRDATAS    (HRDATA_dma2)
+
+    );
+
+
+  // Matrix decoder for SI3
+  soclabs_4x7_MatrixDecode_cpu u_soclabs_4x7_matrixdecode_cpu (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Internal address remapping control
+    .remapping_dec  ( REMAP[0] ),
+
+    // Signals from Input stage SI3
+    .HREADYS    (HREADY_cpu),
+    .sel_dec        (i_sel3),
+    .decode_addr_dec (i_addr3[31:10]),   // HADDR[9:0] is not decoded
+    .trans_dec      (i_trans3),
+
+    // Control/Response for Output Stage MI0
+    .active_dec0    (i_active3to0),
+    .readyout_dec0  (i_hready_mux__rom1),
+    .resp_dec0      (HRESP_rom1),
+    .rdata_dec0     (HRDATA_rom1),
+    .ruser_dec0     (HRUSER_rom1),
+
+    // Control/Response for Output Stage MI1
+    .active_dec1    (i_active3to1),
+    .readyout_dec1  (i_hready_mux__ram2),
+    .resp_dec1      (HRESP_ram2),
+    .rdata_dec1     (HRDATA_ram2),
+    .ruser_dec1     (HRUSER_ram2),
+
+    // Control/Response for Output Stage MI2
+    .active_dec2    (i_active3to2),
+    .readyout_dec2  (i_hready_mux__ram3),
+    .resp_dec2      (HRESP_ram3),
+    .rdata_dec2     (HRDATA_ram3),
+    .ruser_dec2     (HRUSER_ram3),
+
+    // Control/Response for Output Stage MI3
+    .active_dec3    (i_active3to3),
+    .readyout_dec3  (i_hready_mux__sys),
+    .resp_dec3      (HRESP_sys),
+    .rdata_dec3     (HRDATA_sys),
+    .ruser_dec3     (HRUSER_sys),
+
+    // Control/Response for Output Stage MI4
+    .active_dec4    (i_active3to4),
+    .readyout_dec4  (i_hready_mux__ram8),
+    .resp_dec4      (HRESP_ram8),
+    .rdata_dec4     (HRDATA_ram8),
+    .ruser_dec4     (HRUSER_ram8),
+
+    // Control/Response for Output Stage MI5
+    .active_dec5    (i_active3to5),
+    .readyout_dec5  (i_hready_mux__ram9),
+    .resp_dec5      (HRESP_ram9),
+    .rdata_dec5     (HRDATA_ram9),
+    .ruser_dec5     (HRUSER_ram9),
+
+    // Control/Response for Output Stage MI6
+    .active_dec6    (i_active3to6),
+    .readyout_dec6  (i_hready_mux__exp),
+    .resp_dec6      (HRESP_exp),
+    .rdata_dec6     (HRDATA_exp),
+    .ruser_dec6     (HRUSER_exp),
+
+    .sel_dec0       (i_sel3to0),
+    .sel_dec1       (i_sel3to1),
+    .sel_dec2       (i_sel3to2),
+    .sel_dec3       (i_sel3to3),
+    .sel_dec4       (i_sel3to4),
+    .sel_dec5       (i_sel3to5),
+    .sel_dec6       (i_sel3to6),
+
+    .active_dec     (i_active3),
+    .HREADYOUTS (i_readyout3),
+    .HRESPS     (i_resp3),
+    .HRUSERS    (HRUSER_cpu),
+    .HRDATAS    (HRDATA_cpu)
+
+    );
+
+
+  // Output stage for MI0
+  soclabs_4x7_SlaveOutput u_soclabs_4x7_slaveoutput_0 (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Port 0 Signals
+    .sel_op0       (i_sel0to0),
+    .addr_op0      (i_addr0),
+    .auser_op0     (i_auser0),
+    .trans_op0     (i_trans0),
+    .write_op0     (i_write0),
+    .size_op0      (i_size0),
+    .burst_op0     (i_burst0),
+    .prot_op0      (i_prot0),
+    .master_op0    (i_master0),
+    .mastlock_op0  (i_mastlock0),
+    .wdata_op0     (HWDATA_adp),
+    .wuser_op0     (HWUSER_adp),
+    .held_tran_op0  (i_held_tran0),
+
+    // Port 1 Signals
+    .sel_op1       (i_sel1to0),
+    .addr_op1      (i_addr1),
+    .auser_op1     (i_auser1),
+    .trans_op1     (i_trans1),
+    .write_op1     (i_write1),
+    .size_op1      (i_size1),
+    .burst_op1     (i_burst1),
+    .prot_op1      (i_prot1),
+    .master_op1    (i_master1),
+    .mastlock_op1  (i_mastlock1),
+    .wdata_op1     (HWDATA_dma),
+    .wuser_op1     (HWUSER_dma),
+    .held_tran_op1  (i_held_tran1),
+
+    // Port 2 Signals
+    .sel_op2       (i_sel2to0),
+    .addr_op2      (i_addr2),
+    .auser_op2     (i_auser2),
+    .trans_op2     (i_trans2),
+    .write_op2     (i_write2),
+    .size_op2      (i_size2),
+    .burst_op2     (i_burst2),
+    .prot_op2      (i_prot2),
+    .master_op2    (i_master2),
+    .mastlock_op2  (i_mastlock2),
+    .wdata_op2     (HWDATA_dma2),
+    .wuser_op2     (HWUSER_dma2),
+    .held_tran_op2  (i_held_tran2),
+
+    // Port 3 Signals
+    .sel_op3       (i_sel3to0),
+    .addr_op3      (i_addr3),
+    .auser_op3     (i_auser3),
+    .trans_op3     (i_trans3),
+    .write_op3     (i_write3),
+    .size_op3      (i_size3),
+    .burst_op3     (i_burst3),
+    .prot_op3      (i_prot3),
+    .master_op3    (i_master3),
+    .mastlock_op3  (i_mastlock3),
+    .wdata_op3     (HWDATA_cpu),
+    .wuser_op3     (HWUSER_cpu),
+    .held_tran_op3  (i_held_tran3),
+
+    // Slave read data and response
+    .HREADYOUTM (HREADYOUT_rom1),
+
+    .active_op0    (i_active0to0),
+    .active_op1    (i_active1to0),
+    .active_op2    (i_active2to0),
+    .active_op3    (i_active3to0),
+
+    // Slave Address/Control Signals
+    .HSELM      (HSEL_rom1),
+    .HADDRM     (HADDR_rom1),
+    .HAUSERM    (HAUSER_rom1),
+    .HTRANSM    (HTRANS_rom1),
+    .HWRITEM    (HWRITE_rom1),
+    .HSIZEM     (HSIZE_rom1),
+    .HBURSTM    (HBURST_rom1),
+    .HPROTM     (HPROT_rom1),
+    .HMASTERM   (HMASTER_rom1),
+    .HMASTLOCKM (HMASTLOCK_rom1),
+    .HREADYMUXM (i_hready_mux__rom1),
+    .HWUSERM    (HWUSER_rom1),
+    .HWDATAM    (HWDATA_rom1)
+
+    );
+
+  // Drive output with internal version
+  assign HREADYMUX_rom1 = i_hready_mux__rom1;
+
+
+  // Output stage for MI1
+  soclabs_4x7_SlaveOutput u_soclabs_4x7_slaveoutput_1 (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Port 0 Signals
+    .sel_op0       (i_sel0to1),
+    .addr_op0      (i_addr0),
+    .auser_op0     (i_auser0),
+    .trans_op0     (i_trans0),
+    .write_op0     (i_write0),
+    .size_op0      (i_size0),
+    .burst_op0     (i_burst0),
+    .prot_op0      (i_prot0),
+    .master_op0    (i_master0),
+    .mastlock_op0  (i_mastlock0),
+    .wdata_op0     (HWDATA_adp),
+    .wuser_op0     (HWUSER_adp),
+    .held_tran_op0  (i_held_tran0),
+
+    // Port 1 Signals
+    .sel_op1       (i_sel1to1),
+    .addr_op1      (i_addr1),
+    .auser_op1     (i_auser1),
+    .trans_op1     (i_trans1),
+    .write_op1     (i_write1),
+    .size_op1      (i_size1),
+    .burst_op1     (i_burst1),
+    .prot_op1      (i_prot1),
+    .master_op1    (i_master1),
+    .mastlock_op1  (i_mastlock1),
+    .wdata_op1     (HWDATA_dma),
+    .wuser_op1     (HWUSER_dma),
+    .held_tran_op1  (i_held_tran1),
+
+    // Port 2 Signals
+    .sel_op2       (i_sel2to1),
+    .addr_op2      (i_addr2),
+    .auser_op2     (i_auser2),
+    .trans_op2     (i_trans2),
+    .write_op2     (i_write2),
+    .size_op2      (i_size2),
+    .burst_op2     (i_burst2),
+    .prot_op2      (i_prot2),
+    .master_op2    (i_master2),
+    .mastlock_op2  (i_mastlock2),
+    .wdata_op2     (HWDATA_dma2),
+    .wuser_op2     (HWUSER_dma2),
+    .held_tran_op2  (i_held_tran2),
+
+    // Port 3 Signals
+    .sel_op3       (i_sel3to1),
+    .addr_op3      (i_addr3),
+    .auser_op3     (i_auser3),
+    .trans_op3     (i_trans3),
+    .write_op3     (i_write3),
+    .size_op3      (i_size3),
+    .burst_op3     (i_burst3),
+    .prot_op3      (i_prot3),
+    .master_op3    (i_master3),
+    .mastlock_op3  (i_mastlock3),
+    .wdata_op3     (HWDATA_cpu),
+    .wuser_op3     (HWUSER_cpu),
+    .held_tran_op3  (i_held_tran3),
+
+    // Slave read data and response
+    .HREADYOUTM (HREADYOUT_ram2),
+
+    .active_op0    (i_active0to1),
+    .active_op1    (i_active1to1),
+    .active_op2    (i_active2to1),
+    .active_op3    (i_active3to1),
+
+    // Slave Address/Control Signals
+    .HSELM      (HSEL_ram2),
+    .HADDRM     (HADDR_ram2),
+    .HAUSERM    (HAUSER_ram2),
+    .HTRANSM    (HTRANS_ram2),
+    .HWRITEM    (HWRITE_ram2),
+    .HSIZEM     (HSIZE_ram2),
+    .HBURSTM    (HBURST_ram2),
+    .HPROTM     (HPROT_ram2),
+    .HMASTERM   (HMASTER_ram2),
+    .HMASTLOCKM (HMASTLOCK_ram2),
+    .HREADYMUXM (i_hready_mux__ram2),
+    .HWUSERM    (HWUSER_ram2),
+    .HWDATAM    (HWDATA_ram2)
+
+    );
+
+  // Drive output with internal version
+  assign HREADYMUX_ram2 = i_hready_mux__ram2;
+
+
+  // Output stage for MI2
+  soclabs_4x7_SlaveOutput u_soclabs_4x7_slaveoutput_2 (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Port 0 Signals
+    .sel_op0       (i_sel0to2),
+    .addr_op0      (i_addr0),
+    .auser_op0     (i_auser0),
+    .trans_op0     (i_trans0),
+    .write_op0     (i_write0),
+    .size_op0      (i_size0),
+    .burst_op0     (i_burst0),
+    .prot_op0      (i_prot0),
+    .master_op0    (i_master0),
+    .mastlock_op0  (i_mastlock0),
+    .wdata_op0     (HWDATA_adp),
+    .wuser_op0     (HWUSER_adp),
+    .held_tran_op0  (i_held_tran0),
+
+    // Port 1 Signals
+    .sel_op1       (i_sel1to2),
+    .addr_op1      (i_addr1),
+    .auser_op1     (i_auser1),
+    .trans_op1     (i_trans1),
+    .write_op1     (i_write1),
+    .size_op1      (i_size1),
+    .burst_op1     (i_burst1),
+    .prot_op1      (i_prot1),
+    .master_op1    (i_master1),
+    .mastlock_op1  (i_mastlock1),
+    .wdata_op1     (HWDATA_dma),
+    .wuser_op1     (HWUSER_dma),
+    .held_tran_op1  (i_held_tran1),
+
+    // Port 2 Signals
+    .sel_op2       (i_sel2to2),
+    .addr_op2      (i_addr2),
+    .auser_op2     (i_auser2),
+    .trans_op2     (i_trans2),
+    .write_op2     (i_write2),
+    .size_op2      (i_size2),
+    .burst_op2     (i_burst2),
+    .prot_op2      (i_prot2),
+    .master_op2    (i_master2),
+    .mastlock_op2  (i_mastlock2),
+    .wdata_op2     (HWDATA_dma2),
+    .wuser_op2     (HWUSER_dma2),
+    .held_tran_op2  (i_held_tran2),
+
+    // Port 3 Signals
+    .sel_op3       (i_sel3to2),
+    .addr_op3      (i_addr3),
+    .auser_op3     (i_auser3),
+    .trans_op3     (i_trans3),
+    .write_op3     (i_write3),
+    .size_op3      (i_size3),
+    .burst_op3     (i_burst3),
+    .prot_op3      (i_prot3),
+    .master_op3    (i_master3),
+    .mastlock_op3  (i_mastlock3),
+    .wdata_op3     (HWDATA_cpu),
+    .wuser_op3     (HWUSER_cpu),
+    .held_tran_op3  (i_held_tran3),
+
+    // Slave read data and response
+    .HREADYOUTM (HREADYOUT_ram3),
+
+    .active_op0    (i_active0to2),
+    .active_op1    (i_active1to2),
+    .active_op2    (i_active2to2),
+    .active_op3    (i_active3to2),
+
+    // Slave Address/Control Signals
+    .HSELM      (HSEL_ram3),
+    .HADDRM     (HADDR_ram3),
+    .HAUSERM    (HAUSER_ram3),
+    .HTRANSM    (HTRANS_ram3),
+    .HWRITEM    (HWRITE_ram3),
+    .HSIZEM     (HSIZE_ram3),
+    .HBURSTM    (HBURST_ram3),
+    .HPROTM     (HPROT_ram3),
+    .HMASTERM   (HMASTER_ram3),
+    .HMASTLOCKM (HMASTLOCK_ram3),
+    .HREADYMUXM (i_hready_mux__ram3),
+    .HWUSERM    (HWUSER_ram3),
+    .HWDATAM    (HWDATA_ram3)
+
+    );
+
+  // Drive output with internal version
+  assign HREADYMUX_ram3 = i_hready_mux__ram3;
+
+
+  // Output stage for MI3
+  soclabs_4x7_SlaveOutput u_soclabs_4x7_slaveoutput_3 (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Port 0 Signals
+    .sel_op0       (i_sel0to3),
+    .addr_op0      (i_addr0),
+    .auser_op0     (i_auser0),
+    .trans_op0     (i_trans0),
+    .write_op0     (i_write0),
+    .size_op0      (i_size0),
+    .burst_op0     (i_burst0),
+    .prot_op0      (i_prot0),
+    .master_op0    (i_master0),
+    .mastlock_op0  (i_mastlock0),
+    .wdata_op0     (HWDATA_adp),
+    .wuser_op0     (HWUSER_adp),
+    .held_tran_op0  (i_held_tran0),
+
+    // Port 1 Signals
+    .sel_op1       (i_sel1to3),
+    .addr_op1      (i_addr1),
+    .auser_op1     (i_auser1),
+    .trans_op1     (i_trans1),
+    .write_op1     (i_write1),
+    .size_op1      (i_size1),
+    .burst_op1     (i_burst1),
+    .prot_op1      (i_prot1),
+    .master_op1    (i_master1),
+    .mastlock_op1  (i_mastlock1),
+    .wdata_op1     (HWDATA_dma),
+    .wuser_op1     (HWUSER_dma),
+    .held_tran_op1  (i_held_tran1),
+
+    // Port 2 Signals
+    .sel_op2       (i_sel2to3),
+    .addr_op2      (i_addr2),
+    .auser_op2     (i_auser2),
+    .trans_op2     (i_trans2),
+    .write_op2     (i_write2),
+    .size_op2      (i_size2),
+    .burst_op2     (i_burst2),
+    .prot_op2      (i_prot2),
+    .master_op2    (i_master2),
+    .mastlock_op2  (i_mastlock2),
+    .wdata_op2     (HWDATA_dma2),
+    .wuser_op2     (HWUSER_dma2),
+    .held_tran_op2  (i_held_tran2),
+
+    // Port 3 Signals
+    .sel_op3       (i_sel3to3),
+    .addr_op3      (i_addr3),
+    .auser_op3     (i_auser3),
+    .trans_op3     (i_trans3),
+    .write_op3     (i_write3),
+    .size_op3      (i_size3),
+    .burst_op3     (i_burst3),
+    .prot_op3      (i_prot3),
+    .master_op3    (i_master3),
+    .mastlock_op3  (i_mastlock3),
+    .wdata_op3     (HWDATA_cpu),
+    .wuser_op3     (HWUSER_cpu),
+    .held_tran_op3  (i_held_tran3),
+
+    // Slave read data and response
+    .HREADYOUTM (HREADYOUT_sys),
+
+    .active_op0    (i_active0to3),
+    .active_op1    (i_active1to3),
+    .active_op2    (i_active2to3),
+    .active_op3    (i_active3to3),
+
+    // Slave Address/Control Signals
+    .HSELM      (HSEL_sys),
+    .HADDRM     (HADDR_sys),
+    .HAUSERM    (HAUSER_sys),
+    .HTRANSM    (HTRANS_sys),
+    .HWRITEM    (HWRITE_sys),
+    .HSIZEM     (HSIZE_sys),
+    .HBURSTM    (HBURST_sys),
+    .HPROTM     (HPROT_sys),
+    .HMASTERM   (HMASTER_sys),
+    .HMASTLOCKM (HMASTLOCK_sys),
+    .HREADYMUXM (i_hready_mux__sys),
+    .HWUSERM    (HWUSER_sys),
+    .HWDATAM    (HWDATA_sys)
+
+    );
+
+  // Drive output with internal version
+  assign HREADYMUX_sys = i_hready_mux__sys;
+
+
+  // Output stage for MI4
+  soclabs_4x7_SlaveOutput u_soclabs_4x7_slaveoutput_4 (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Port 0 Signals
+    .sel_op0       (i_sel0to4),
+    .addr_op0      (i_addr0),
+    .auser_op0     (i_auser0),
+    .trans_op0     (i_trans0),
+    .write_op0     (i_write0),
+    .size_op0      (i_size0),
+    .burst_op0     (i_burst0),
+    .prot_op0      (i_prot0),
+    .master_op0    (i_master0),
+    .mastlock_op0  (i_mastlock0),
+    .wdata_op0     (HWDATA_adp),
+    .wuser_op0     (HWUSER_adp),
+    .held_tran_op0  (i_held_tran0),
+
+    // Port 1 Signals
+    .sel_op1       (i_sel1to4),
+    .addr_op1      (i_addr1),
+    .auser_op1     (i_auser1),
+    .trans_op1     (i_trans1),
+    .write_op1     (i_write1),
+    .size_op1      (i_size1),
+    .burst_op1     (i_burst1),
+    .prot_op1      (i_prot1),
+    .master_op1    (i_master1),
+    .mastlock_op1  (i_mastlock1),
+    .wdata_op1     (HWDATA_dma),
+    .wuser_op1     (HWUSER_dma),
+    .held_tran_op1  (i_held_tran1),
+
+    // Port 2 Signals
+    .sel_op2       (i_sel2to4),
+    .addr_op2      (i_addr2),
+    .auser_op2     (i_auser2),
+    .trans_op2     (i_trans2),
+    .write_op2     (i_write2),
+    .size_op2      (i_size2),
+    .burst_op2     (i_burst2),
+    .prot_op2      (i_prot2),
+    .master_op2    (i_master2),
+    .mastlock_op2  (i_mastlock2),
+    .wdata_op2     (HWDATA_dma2),
+    .wuser_op2     (HWUSER_dma2),
+    .held_tran_op2  (i_held_tran2),
+
+    // Port 3 Signals
+    .sel_op3       (i_sel3to4),
+    .addr_op3      (i_addr3),
+    .auser_op3     (i_auser3),
+    .trans_op3     (i_trans3),
+    .write_op3     (i_write3),
+    .size_op3      (i_size3),
+    .burst_op3     (i_burst3),
+    .prot_op3      (i_prot3),
+    .master_op3    (i_master3),
+    .mastlock_op3  (i_mastlock3),
+    .wdata_op3     (HWDATA_cpu),
+    .wuser_op3     (HWUSER_cpu),
+    .held_tran_op3  (i_held_tran3),
+
+    // Slave read data and response
+    .HREADYOUTM (HREADYOUT_ram8),
+
+    .active_op0    (i_active0to4),
+    .active_op1    (i_active1to4),
+    .active_op2    (i_active2to4),
+    .active_op3    (i_active3to4),
+
+    // Slave Address/Control Signals
+    .HSELM      (HSEL_ram8),
+    .HADDRM     (HADDR_ram8),
+    .HAUSERM    (HAUSER_ram8),
+    .HTRANSM    (HTRANS_ram8),
+    .HWRITEM    (HWRITE_ram8),
+    .HSIZEM     (HSIZE_ram8),
+    .HBURSTM    (HBURST_ram8),
+    .HPROTM     (HPROT_ram8),
+    .HMASTERM   (HMASTER_ram8),
+    .HMASTLOCKM (HMASTLOCK_ram8),
+    .HREADYMUXM (i_hready_mux__ram8),
+    .HWUSERM    (HWUSER_ram8),
+    .HWDATAM    (HWDATA_ram8)
+
+    );
+
+  // Drive output with internal version
+  assign HREADYMUX_ram8 = i_hready_mux__ram8;
+
+
+  // Output stage for MI5
+  soclabs_4x7_SlaveOutput u_soclabs_4x7_slaveoutput_5 (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Port 0 Signals
+    .sel_op0       (i_sel0to5),
+    .addr_op0      (i_addr0),
+    .auser_op0     (i_auser0),
+    .trans_op0     (i_trans0),
+    .write_op0     (i_write0),
+    .size_op0      (i_size0),
+    .burst_op0     (i_burst0),
+    .prot_op0      (i_prot0),
+    .master_op0    (i_master0),
+    .mastlock_op0  (i_mastlock0),
+    .wdata_op0     (HWDATA_adp),
+    .wuser_op0     (HWUSER_adp),
+    .held_tran_op0  (i_held_tran0),
+
+    // Port 1 Signals
+    .sel_op1       (i_sel1to5),
+    .addr_op1      (i_addr1),
+    .auser_op1     (i_auser1),
+    .trans_op1     (i_trans1),
+    .write_op1     (i_write1),
+    .size_op1      (i_size1),
+    .burst_op1     (i_burst1),
+    .prot_op1      (i_prot1),
+    .master_op1    (i_master1),
+    .mastlock_op1  (i_mastlock1),
+    .wdata_op1     (HWDATA_dma),
+    .wuser_op1     (HWUSER_dma),
+    .held_tran_op1  (i_held_tran1),
+
+    // Port 2 Signals
+    .sel_op2       (i_sel2to5),
+    .addr_op2      (i_addr2),
+    .auser_op2     (i_auser2),
+    .trans_op2     (i_trans2),
+    .write_op2     (i_write2),
+    .size_op2      (i_size2),
+    .burst_op2     (i_burst2),
+    .prot_op2      (i_prot2),
+    .master_op2    (i_master2),
+    .mastlock_op2  (i_mastlock2),
+    .wdata_op2     (HWDATA_dma2),
+    .wuser_op2     (HWUSER_dma2),
+    .held_tran_op2  (i_held_tran2),
+
+    // Port 3 Signals
+    .sel_op3       (i_sel3to5),
+    .addr_op3      (i_addr3),
+    .auser_op3     (i_auser3),
+    .trans_op3     (i_trans3),
+    .write_op3     (i_write3),
+    .size_op3      (i_size3),
+    .burst_op3     (i_burst3),
+    .prot_op3      (i_prot3),
+    .master_op3    (i_master3),
+    .mastlock_op3  (i_mastlock3),
+    .wdata_op3     (HWDATA_cpu),
+    .wuser_op3     (HWUSER_cpu),
+    .held_tran_op3  (i_held_tran3),
+
+    // Slave read data and response
+    .HREADYOUTM (HREADYOUT_ram9),
+
+    .active_op0    (i_active0to5),
+    .active_op1    (i_active1to5),
+    .active_op2    (i_active2to5),
+    .active_op3    (i_active3to5),
+
+    // Slave Address/Control Signals
+    .HSELM      (HSEL_ram9),
+    .HADDRM     (HADDR_ram9),
+    .HAUSERM    (HAUSER_ram9),
+    .HTRANSM    (HTRANS_ram9),
+    .HWRITEM    (HWRITE_ram9),
+    .HSIZEM     (HSIZE_ram9),
+    .HBURSTM    (HBURST_ram9),
+    .HPROTM     (HPROT_ram9),
+    .HMASTERM   (HMASTER_ram9),
+    .HMASTLOCKM (HMASTLOCK_ram9),
+    .HREADYMUXM (i_hready_mux__ram9),
+    .HWUSERM    (HWUSER_ram9),
+    .HWDATAM    (HWDATA_ram9)
+
+    );
+
+  // Drive output with internal version
+  assign HREADYMUX_ram9 = i_hready_mux__ram9;
+
+
+  // Output stage for MI6
+  soclabs_4x7_SlaveOutput u_soclabs_4x7_slaveoutput_6 (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Port 0 Signals
+    .sel_op0       (i_sel0to6),
+    .addr_op0      (i_addr0),
+    .auser_op0     (i_auser0),
+    .trans_op0     (i_trans0),
+    .write_op0     (i_write0),
+    .size_op0      (i_size0),
+    .burst_op0     (i_burst0),
+    .prot_op0      (i_prot0),
+    .master_op0    (i_master0),
+    .mastlock_op0  (i_mastlock0),
+    .wdata_op0     (HWDATA_adp),
+    .wuser_op0     (HWUSER_adp),
+    .held_tran_op0  (i_held_tran0),
+
+    // Port 1 Signals
+    .sel_op1       (i_sel1to6),
+    .addr_op1      (i_addr1),
+    .auser_op1     (i_auser1),
+    .trans_op1     (i_trans1),
+    .write_op1     (i_write1),
+    .size_op1      (i_size1),
+    .burst_op1     (i_burst1),
+    .prot_op1      (i_prot1),
+    .master_op1    (i_master1),
+    .mastlock_op1  (i_mastlock1),
+    .wdata_op1     (HWDATA_dma),
+    .wuser_op1     (HWUSER_dma),
+    .held_tran_op1  (i_held_tran1),
+
+    // Port 2 Signals
+    .sel_op2       (i_sel2to6),
+    .addr_op2      (i_addr2),
+    .auser_op2     (i_auser2),
+    .trans_op2     (i_trans2),
+    .write_op2     (i_write2),
+    .size_op2      (i_size2),
+    .burst_op2     (i_burst2),
+    .prot_op2      (i_prot2),
+    .master_op2    (i_master2),
+    .mastlock_op2  (i_mastlock2),
+    .wdata_op2     (HWDATA_dma2),
+    .wuser_op2     (HWUSER_dma2),
+    .held_tran_op2  (i_held_tran2),
+
+    // Port 3 Signals
+    .sel_op3       (i_sel3to6),
+    .addr_op3      (i_addr3),
+    .auser_op3     (i_auser3),
+    .trans_op3     (i_trans3),
+    .write_op3     (i_write3),
+    .size_op3      (i_size3),
+    .burst_op3     (i_burst3),
+    .prot_op3      (i_prot3),
+    .master_op3    (i_master3),
+    .mastlock_op3  (i_mastlock3),
+    .wdata_op3     (HWDATA_cpu),
+    .wuser_op3     (HWUSER_cpu),
+    .held_tran_op3  (i_held_tran3),
+
+    // Slave read data and response
+    .HREADYOUTM (HREADYOUT_exp),
+
+    .active_op0    (i_active0to6),
+    .active_op1    (i_active1to6),
+    .active_op2    (i_active2to6),
+    .active_op3    (i_active3to6),
+
+    // Slave Address/Control Signals
+    .HSELM      (HSEL_exp),
+    .HADDRM     (HADDR_exp),
+    .HAUSERM    (HAUSER_exp),
+    .HTRANSM    (HTRANS_exp),
+    .HWRITEM    (HWRITE_exp),
+    .HSIZEM     (HSIZE_exp),
+    .HBURSTM    (HBURST_exp),
+    .HPROTM     (HPROT_exp),
+    .HMASTERM   (HMASTER_exp),
+    .HMASTLOCKM (HMASTLOCK_exp),
+    .HREADYMUXM (i_hready_mux__exp),
+    .HWUSERM    (HWUSER_exp),
+    .HWDATAM    (HWDATA_exp)
+
+    );
+
+  // Drive output with internal version
+  assign HREADYMUX_exp = i_hready_mux__exp;
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v
new file mode 100644
index 0000000..8f24185
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_default_slave.v
@@ -0,0 +1,140 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+// Abstract            : Default slave used to drive the slave response signals
+//                       when there are no other slaves selected.
+//-----------------------------------------------------------------------------
+
+
+`timescale 1ns/1ps
+
+
+module soclabs_4x7_AhbMatrix_default_slave (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+    // AHB control input signals
+    HSEL,
+    HTRANS,
+    HREADY,
+
+    // AHB control output signals
+    HREADYOUT,
+    HRESP
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input         HCLK;           // AHB System Clock
+    input         HRESETn;        // AHB System Reset
+
+    // AHB control input signals
+    input         HSEL;           // Slave Select
+    input  [1:0]  HTRANS;         // Transfer type
+    input         HREADY;         // Transfer done
+
+    // AHB control output signals
+    output        HREADYOUT;      // HREADY feedback
+    output  [1:0] HRESP;          // Transfer response
+
+
+// -----------------------------------------------------------------------------
+// Constant declarations
+// -----------------------------------------------------------------------------
+
+// HRESP transfer response signal encoding
+`define RSP_OKAY    2'b00      // OKAY response
+`define RSP_ERROR   2'b01     // ERROR response
+`define RSP_RETRY   2'b10     // RETRY response
+`define RSP_SPLIT   2'b11     // SPLIT response
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    wire          HCLK;           // AHB System Clock
+    wire          HRESETn;        // AHB System Reset
+
+    // AHB control input signals
+    wire          HSEL;           // Slave Select
+    wire    [1:0] HTRANS;         // Transfer type
+    wire          HREADY;         // Transfer done
+
+    // AHB control output signals
+    wire          HREADYOUT;      // HREADY feedback
+    wire    [1:0] HRESP;          // Transfer response
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+
+    wire          invalid;    // Set during invalid transfer
+    wire          hready_next; // Controls generation of HREADYOUT output
+    reg           i_hreadyout; // HREADYOUT register
+    wire    [1:0] hresp_next;  // Generated response
+    reg     [1:0] i_hresp;     // HRESP register
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+  assign invalid = ( HREADY & HSEL & HTRANS[1] );
+  assign hready_next = i_hreadyout ?  ~invalid : 1'b1 ;
+  assign hresp_next = invalid ? `RSP_ERROR : `RSP_OKAY;
+
+  always @(negedge HRESETn or posedge HCLK)
+    begin : p_resp_seq
+      if (~HRESETn)
+        begin
+          i_hreadyout <= 1'b1;
+          i_hresp     <= `RSP_OKAY;
+        end
+      else
+        begin
+          i_hreadyout <= hready_next;
+
+          if (i_hreadyout)
+            i_hresp <= hresp_next;
+        end
+    end
+
+  // Drive outputs with internal versions
+  assign HREADYOUT = i_hreadyout;
+  assign HRESP     = i_hresp;
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v
new file mode 100644
index 0000000..bd81ad5
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_AhbMatrix_lite.v
@@ -0,0 +1,985 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------
+//  Abstract            : BusMatrixLite is a wrapper module that wraps around
+//                        the BusMatrix module to give AHB Lite compliant
+//                        slave and master interfaces.
+//
+//-----------------------------------------------------------------------------
+
+
+`timescale 1ns/1ps
+
+
+module soclabs_4x7_AhbMatrix_lite (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+    // System Address Remap control
+    REMAP,
+
+    // Input port SI0 (inputs from master 0)
+    HADDR_adp,
+    HTRANS_adp,
+    HWRITE_adp,
+    HSIZE_adp,
+    HBURST_adp,
+    HPROT_adp,
+    HWDATA_adp,
+    HMASTLOCK_adp,
+    HAUSER_adp,
+    HWUSER_adp,
+
+    // Input port SI1 (inputs from master 1)
+    HADDR_dma,
+    HTRANS_dma,
+    HWRITE_dma,
+    HSIZE_dma,
+    HBURST_dma,
+    HPROT_dma,
+    HWDATA_dma,
+    HMASTLOCK_dma,
+    HAUSER_dma,
+    HWUSER_dma,
+
+    // Input port SI2 (inputs from master 2)
+    HADDR_dma2,
+    HTRANS_dma2,
+    HWRITE_dma2,
+    HSIZE_dma2,
+    HBURST_dma2,
+    HPROT_dma2,
+    HWDATA_dma2,
+    HMASTLOCK_dma2,
+    HAUSER_dma2,
+    HWUSER_dma2,
+
+    // Input port SI3 (inputs from master 3)
+    HADDR_cpu,
+    HTRANS_cpu,
+    HWRITE_cpu,
+    HSIZE_cpu,
+    HBURST_cpu,
+    HPROT_cpu,
+    HWDATA_cpu,
+    HMASTLOCK_cpu,
+    HAUSER_cpu,
+    HWUSER_cpu,
+
+    // Output port MI0 (inputs from slave 0)
+    HRDATA_rom1,
+    HREADYOUT_rom1,
+    HRESP_rom1,
+    HRUSER_rom1,
+
+    // Output port MI1 (inputs from slave 1)
+    HRDATA_ram2,
+    HREADYOUT_ram2,
+    HRESP_ram2,
+    HRUSER_ram2,
+
+    // Output port MI2 (inputs from slave 2)
+    HRDATA_ram3,
+    HREADYOUT_ram3,
+    HRESP_ram3,
+    HRUSER_ram3,
+
+    // Output port MI3 (inputs from slave 3)
+    HRDATA_sys,
+    HREADYOUT_sys,
+    HRESP_sys,
+    HRUSER_sys,
+
+    // Output port MI4 (inputs from slave 4)
+    HRDATA_ram8,
+    HREADYOUT_ram8,
+    HRESP_ram8,
+    HRUSER_ram8,
+
+    // Output port MI5 (inputs from slave 5)
+    HRDATA_ram9,
+    HREADYOUT_ram9,
+    HRESP_ram9,
+    HRUSER_ram9,
+
+    // Output port MI6 (inputs from slave 6)
+    HRDATA_exp,
+    HREADYOUT_exp,
+    HRESP_exp,
+    HRUSER_exp,
+
+    // Scan test dummy signals; not connected until scan insertion
+    SCANENABLE,   // Scan Test Mode Enable
+    SCANINHCLK,   // Scan Chain Input
+
+
+    // Output port MI0 (outputs to slave 0)
+    HSEL_rom1,
+    HADDR_rom1,
+    HTRANS_rom1,
+    HWRITE_rom1,
+    HSIZE_rom1,
+    HBURST_rom1,
+    HPROT_rom1,
+    HWDATA_rom1,
+    HMASTLOCK_rom1,
+    HREADYMUX_rom1,
+    HAUSER_rom1,
+    HWUSER_rom1,
+
+    // Output port MI1 (outputs to slave 1)
+    HSEL_ram2,
+    HADDR_ram2,
+    HTRANS_ram2,
+    HWRITE_ram2,
+    HSIZE_ram2,
+    HBURST_ram2,
+    HPROT_ram2,
+    HWDATA_ram2,
+    HMASTLOCK_ram2,
+    HREADYMUX_ram2,
+    HAUSER_ram2,
+    HWUSER_ram2,
+
+    // Output port MI2 (outputs to slave 2)
+    HSEL_ram3,
+    HADDR_ram3,
+    HTRANS_ram3,
+    HWRITE_ram3,
+    HSIZE_ram3,
+    HBURST_ram3,
+    HPROT_ram3,
+    HWDATA_ram3,
+    HMASTLOCK_ram3,
+    HREADYMUX_ram3,
+    HAUSER_ram3,
+    HWUSER_ram3,
+
+    // Output port MI3 (outputs to slave 3)
+    HSEL_sys,
+    HADDR_sys,
+    HTRANS_sys,
+    HWRITE_sys,
+    HSIZE_sys,
+    HBURST_sys,
+    HPROT_sys,
+    HWDATA_sys,
+    HMASTLOCK_sys,
+    HREADYMUX_sys,
+    HAUSER_sys,
+    HWUSER_sys,
+
+    // Output port MI4 (outputs to slave 4)
+    HSEL_ram8,
+    HADDR_ram8,
+    HTRANS_ram8,
+    HWRITE_ram8,
+    HSIZE_ram8,
+    HBURST_ram8,
+    HPROT_ram8,
+    HWDATA_ram8,
+    HMASTLOCK_ram8,
+    HREADYMUX_ram8,
+    HAUSER_ram8,
+    HWUSER_ram8,
+
+    // Output port MI5 (outputs to slave 5)
+    HSEL_ram9,
+    HADDR_ram9,
+    HTRANS_ram9,
+    HWRITE_ram9,
+    HSIZE_ram9,
+    HBURST_ram9,
+    HPROT_ram9,
+    HWDATA_ram9,
+    HMASTLOCK_ram9,
+    HREADYMUX_ram9,
+    HAUSER_ram9,
+    HWUSER_ram9,
+
+    // Output port MI6 (outputs to slave 6)
+    HSEL_exp,
+    HADDR_exp,
+    HTRANS_exp,
+    HWRITE_exp,
+    HSIZE_exp,
+    HBURST_exp,
+    HPROT_exp,
+    HWDATA_exp,
+    HMASTLOCK_exp,
+    HREADYMUX_exp,
+    HAUSER_exp,
+    HWUSER_exp,
+
+    // Input port SI0 (outputs to master 0)
+    HRDATA_adp,
+    HREADY_adp,
+    HRESP_adp,
+    HRUSER_adp,
+
+    // Input port SI1 (outputs to master 1)
+    HRDATA_dma,
+    HREADY_dma,
+    HRESP_dma,
+    HRUSER_dma,
+
+    // Input port SI2 (outputs to master 2)
+    HRDATA_dma2,
+    HREADY_dma2,
+    HRESP_dma2,
+    HRUSER_dma2,
+
+    // Input port SI3 (outputs to master 3)
+    HRDATA_cpu,
+    HREADY_cpu,
+    HRESP_cpu,
+    HRUSER_cpu,
+
+    // Scan test dummy signals; not connected until scan insertion
+    SCANOUTHCLK   // Scan Chain Output
+
+    );
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input         HCLK;            // AHB System Clock
+    input         HRESETn;         // AHB System Reset
+
+    // System Address Remap control
+    input   [3:0] REMAP;           // System Address REMAP control
+
+    // Input port SI0 (inputs from master 0)
+    input  [31:0] HADDR_adp;         // Address bus
+    input   [1:0] HTRANS_adp;        // Transfer type
+    input         HWRITE_adp;        // Transfer direction
+    input   [2:0] HSIZE_adp;         // Transfer size
+    input   [2:0] HBURST_adp;        // Burst type
+    input   [3:0] HPROT_adp;         // Protection control
+    input  [31:0] HWDATA_adp;        // Write data
+    input         HMASTLOCK_adp;     // Locked Sequence
+    input  [1:0] HAUSER_adp;        // Address USER signals
+    input  [1:0] HWUSER_adp;        // Write-data USER signals
+
+    // Input port SI1 (inputs from master 1)
+    input  [31:0] HADDR_dma;         // Address bus
+    input   [1:0] HTRANS_dma;        // Transfer type
+    input         HWRITE_dma;        // Transfer direction
+    input   [2:0] HSIZE_dma;         // Transfer size
+    input   [2:0] HBURST_dma;        // Burst type
+    input   [3:0] HPROT_dma;         // Protection control
+    input  [31:0] HWDATA_dma;        // Write data
+    input         HMASTLOCK_dma;     // Locked Sequence
+    input  [1:0] HAUSER_dma;        // Address USER signals
+    input  [1:0] HWUSER_dma;        // Write-data USER signals
+
+    // Input port SI2 (inputs from master 2)
+    input  [31:0] HADDR_dma2;         // Address bus
+    input   [1:0] HTRANS_dma2;        // Transfer type
+    input         HWRITE_dma2;        // Transfer direction
+    input   [2:0] HSIZE_dma2;         // Transfer size
+    input   [2:0] HBURST_dma2;        // Burst type
+    input   [3:0] HPROT_dma2;         // Protection control
+    input  [31:0] HWDATA_dma2;        // Write data
+    input         HMASTLOCK_dma2;     // Locked Sequence
+    input  [1:0] HAUSER_dma2;        // Address USER signals
+    input  [1:0] HWUSER_dma2;        // Write-data USER signals
+
+    // Input port SI3 (inputs from master 3)
+    input  [31:0] HADDR_cpu;         // Address bus
+    input   [1:0] HTRANS_cpu;        // Transfer type
+    input         HWRITE_cpu;        // Transfer direction
+    input   [2:0] HSIZE_cpu;         // Transfer size
+    input   [2:0] HBURST_cpu;        // Burst type
+    input   [3:0] HPROT_cpu;         // Protection control
+    input  [31:0] HWDATA_cpu;        // Write data
+    input         HMASTLOCK_cpu;     // Locked Sequence
+    input  [1:0] HAUSER_cpu;        // Address USER signals
+    input  [1:0] HWUSER_cpu;        // Write-data USER signals
+
+    // Output port MI0 (inputs from slave 0)
+    input  [31:0] HRDATA_rom1;        // Read data bus
+    input         HREADYOUT_rom1;     // HREADY feedback
+    input         HRESP_rom1;         // Transfer response
+    input  [1:0] HRUSER_rom1;        // Read-data USER signals
+
+    // Output port MI1 (inputs from slave 1)
+    input  [31:0] HRDATA_ram2;        // Read data bus
+    input         HREADYOUT_ram2;     // HREADY feedback
+    input         HRESP_ram2;         // Transfer response
+    input  [1:0] HRUSER_ram2;        // Read-data USER signals
+
+    // Output port MI2 (inputs from slave 2)
+    input  [31:0] HRDATA_ram3;        // Read data bus
+    input         HREADYOUT_ram3;     // HREADY feedback
+    input         HRESP_ram3;         // Transfer response
+    input  [1:0] HRUSER_ram3;        // Read-data USER signals
+
+    // Output port MI3 (inputs from slave 3)
+    input  [31:0] HRDATA_sys;        // Read data bus
+    input         HREADYOUT_sys;     // HREADY feedback
+    input         HRESP_sys;         // Transfer response
+    input  [1:0] HRUSER_sys;        // Read-data USER signals
+
+    // Output port MI4 (inputs from slave 4)
+    input  [31:0] HRDATA_ram8;        // Read data bus
+    input         HREADYOUT_ram8;     // HREADY feedback
+    input         HRESP_ram8;         // Transfer response
+    input  [1:0] HRUSER_ram8;        // Read-data USER signals
+
+    // Output port MI5 (inputs from slave 5)
+    input  [31:0] HRDATA_ram9;        // Read data bus
+    input         HREADYOUT_ram9;     // HREADY feedback
+    input         HRESP_ram9;         // Transfer response
+    input  [1:0] HRUSER_ram9;        // Read-data USER signals
+
+    // Output port MI6 (inputs from slave 6)
+    input  [31:0] HRDATA_exp;        // Read data bus
+    input         HREADYOUT_exp;     // HREADY feedback
+    input         HRESP_exp;         // Transfer response
+    input  [1:0] HRUSER_exp;        // Read-data USER signals
+
+    // Scan test dummy signals; not connected until scan insertion
+    input         SCANENABLE;      // Scan enable signal
+    input         SCANINHCLK;      // HCLK scan input
+
+
+    // Output port MI0 (outputs to slave 0)
+    output        HSEL_rom1;          // Slave Select
+    output [31:0] HADDR_rom1;         // Address bus
+    output  [1:0] HTRANS_rom1;        // Transfer type
+    output        HWRITE_rom1;        // Transfer direction
+    output  [2:0] HSIZE_rom1;         // Transfer size
+    output  [2:0] HBURST_rom1;        // Burst type
+    output  [3:0] HPROT_rom1;         // Protection control
+    output [31:0] HWDATA_rom1;        // Write data
+    output        HMASTLOCK_rom1;     // Locked Sequence
+    output        HREADYMUX_rom1;     // Transfer done
+    output [1:0] HAUSER_rom1;        // Address USER signals
+    output [1:0] HWUSER_rom1;        // Write-data USER signals
+
+    // Output port MI1 (outputs to slave 1)
+    output        HSEL_ram2;          // Slave Select
+    output [31:0] HADDR_ram2;         // Address bus
+    output  [1:0] HTRANS_ram2;        // Transfer type
+    output        HWRITE_ram2;        // Transfer direction
+    output  [2:0] HSIZE_ram2;         // Transfer size
+    output  [2:0] HBURST_ram2;        // Burst type
+    output  [3:0] HPROT_ram2;         // Protection control
+    output [31:0] HWDATA_ram2;        // Write data
+    output        HMASTLOCK_ram2;     // Locked Sequence
+    output        HREADYMUX_ram2;     // Transfer done
+    output [1:0] HAUSER_ram2;        // Address USER signals
+    output [1:0] HWUSER_ram2;        // Write-data USER signals
+
+    // Output port MI2 (outputs to slave 2)
+    output        HSEL_ram3;          // Slave Select
+    output [31:0] HADDR_ram3;         // Address bus
+    output  [1:0] HTRANS_ram3;        // Transfer type
+    output        HWRITE_ram3;        // Transfer direction
+    output  [2:0] HSIZE_ram3;         // Transfer size
+    output  [2:0] HBURST_ram3;        // Burst type
+    output  [3:0] HPROT_ram3;         // Protection control
+    output [31:0] HWDATA_ram3;        // Write data
+    output        HMASTLOCK_ram3;     // Locked Sequence
+    output        HREADYMUX_ram3;     // Transfer done
+    output [1:0] HAUSER_ram3;        // Address USER signals
+    output [1:0] HWUSER_ram3;        // Write-data USER signals
+
+    // Output port MI3 (outputs to slave 3)
+    output        HSEL_sys;          // Slave Select
+    output [31:0] HADDR_sys;         // Address bus
+    output  [1:0] HTRANS_sys;        // Transfer type
+    output        HWRITE_sys;        // Transfer direction
+    output  [2:0] HSIZE_sys;         // Transfer size
+    output  [2:0] HBURST_sys;        // Burst type
+    output  [3:0] HPROT_sys;         // Protection control
+    output [31:0] HWDATA_sys;        // Write data
+    output        HMASTLOCK_sys;     // Locked Sequence
+    output        HREADYMUX_sys;     // Transfer done
+    output [1:0] HAUSER_sys;        // Address USER signals
+    output [1:0] HWUSER_sys;        // Write-data USER signals
+
+    // Output port MI4 (outputs to slave 4)
+    output        HSEL_ram8;          // Slave Select
+    output [31:0] HADDR_ram8;         // Address bus
+    output  [1:0] HTRANS_ram8;        // Transfer type
+    output        HWRITE_ram8;        // Transfer direction
+    output  [2:0] HSIZE_ram8;         // Transfer size
+    output  [2:0] HBURST_ram8;        // Burst type
+    output  [3:0] HPROT_ram8;         // Protection control
+    output [31:0] HWDATA_ram8;        // Write data
+    output        HMASTLOCK_ram8;     // Locked Sequence
+    output        HREADYMUX_ram8;     // Transfer done
+    output [1:0] HAUSER_ram8;        // Address USER signals
+    output [1:0] HWUSER_ram8;        // Write-data USER signals
+
+    // Output port MI5 (outputs to slave 5)
+    output        HSEL_ram9;          // Slave Select
+    output [31:0] HADDR_ram9;         // Address bus
+    output  [1:0] HTRANS_ram9;        // Transfer type
+    output        HWRITE_ram9;        // Transfer direction
+    output  [2:0] HSIZE_ram9;         // Transfer size
+    output  [2:0] HBURST_ram9;        // Burst type
+    output  [3:0] HPROT_ram9;         // Protection control
+    output [31:0] HWDATA_ram9;        // Write data
+    output        HMASTLOCK_ram9;     // Locked Sequence
+    output        HREADYMUX_ram9;     // Transfer done
+    output [1:0] HAUSER_ram9;        // Address USER signals
+    output [1:0] HWUSER_ram9;        // Write-data USER signals
+
+    // Output port MI6 (outputs to slave 6)
+    output        HSEL_exp;          // Slave Select
+    output [31:0] HADDR_exp;         // Address bus
+    output  [1:0] HTRANS_exp;        // Transfer type
+    output        HWRITE_exp;        // Transfer direction
+    output  [2:0] HSIZE_exp;         // Transfer size
+    output  [2:0] HBURST_exp;        // Burst type
+    output  [3:0] HPROT_exp;         // Protection control
+    output [31:0] HWDATA_exp;        // Write data
+    output        HMASTLOCK_exp;     // Locked Sequence
+    output        HREADYMUX_exp;     // Transfer done
+    output [1:0] HAUSER_exp;        // Address USER signals
+    output [1:0] HWUSER_exp;        // Write-data USER signals
+
+    // Input port SI0 (outputs to master 0)
+    output [31:0] HRDATA_adp;        // Read data bus
+    output        HREADY_adp;     // HREADY feedback
+    output        HRESP_adp;         // Transfer response
+    output [1:0] HRUSER_adp;        // Read-data USER signals
+
+    // Input port SI1 (outputs to master 1)
+    output [31:0] HRDATA_dma;        // Read data bus
+    output        HREADY_dma;     // HREADY feedback
+    output        HRESP_dma;         // Transfer response
+    output [1:0] HRUSER_dma;        // Read-data USER signals
+
+    // Input port SI2 (outputs to master 2)
+    output [31:0] HRDATA_dma2;        // Read data bus
+    output        HREADY_dma2;     // HREADY feedback
+    output        HRESP_dma2;         // Transfer response
+    output [1:0] HRUSER_dma2;        // Read-data USER signals
+
+    // Input port SI3 (outputs to master 3)
+    output [31:0] HRDATA_cpu;        // Read data bus
+    output        HREADY_cpu;     // HREADY feedback
+    output        HRESP_cpu;         // Transfer response
+    output [1:0] HRUSER_cpu;        // Read-data USER signals
+
+    // Scan test dummy signals; not connected until scan insertion
+    output        SCANOUTHCLK;     // Scan Chain Output
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    wire         HCLK;            // AHB System Clock
+    wire         HRESETn;         // AHB System Reset
+
+    // System Address Remap control
+    wire   [3:0] REMAP;           // System REMAP signal
+
+    // Input Port SI0
+    wire  [31:0] HADDR_adp;         // Address bus
+    wire   [1:0] HTRANS_adp;        // Transfer type
+    wire         HWRITE_adp;        // Transfer direction
+    wire   [2:0] HSIZE_adp;         // Transfer size
+    wire   [2:0] HBURST_adp;        // Burst type
+    wire   [3:0] HPROT_adp;         // Protection control
+    wire  [31:0] HWDATA_adp;        // Write data
+    wire         HMASTLOCK_adp;     // Locked Sequence
+
+    wire  [31:0] HRDATA_adp;        // Read data bus
+    wire         HREADY_adp;     // HREADY feedback
+    wire         HRESP_adp;         // Transfer response
+    wire  [1:0] HAUSER_adp;        // Address USER signals
+    wire  [1:0] HWUSER_adp;        // Write-data USER signals
+    wire  [1:0] HRUSER_adp;        // Read-data USER signals
+
+    // Input Port SI1
+    wire  [31:0] HADDR_dma;         // Address bus
+    wire   [1:0] HTRANS_dma;        // Transfer type
+    wire         HWRITE_dma;        // Transfer direction
+    wire   [2:0] HSIZE_dma;         // Transfer size
+    wire   [2:0] HBURST_dma;        // Burst type
+    wire   [3:0] HPROT_dma;         // Protection control
+    wire  [31:0] HWDATA_dma;        // Write data
+    wire         HMASTLOCK_dma;     // Locked Sequence
+
+    wire  [31:0] HRDATA_dma;        // Read data bus
+    wire         HREADY_dma;     // HREADY feedback
+    wire         HRESP_dma;         // Transfer response
+    wire  [1:0] HAUSER_dma;        // Address USER signals
+    wire  [1:0] HWUSER_dma;        // Write-data USER signals
+    wire  [1:0] HRUSER_dma;        // Read-data USER signals
+
+    // Input Port SI2
+    wire  [31:0] HADDR_dma2;         // Address bus
+    wire   [1:0] HTRANS_dma2;        // Transfer type
+    wire         HWRITE_dma2;        // Transfer direction
+    wire   [2:0] HSIZE_dma2;         // Transfer size
+    wire   [2:0] HBURST_dma2;        // Burst type
+    wire   [3:0] HPROT_dma2;         // Protection control
+    wire  [31:0] HWDATA_dma2;        // Write data
+    wire         HMASTLOCK_dma2;     // Locked Sequence
+
+    wire  [31:0] HRDATA_dma2;        // Read data bus
+    wire         HREADY_dma2;     // HREADY feedback
+    wire         HRESP_dma2;         // Transfer response
+    wire  [1:0] HAUSER_dma2;        // Address USER signals
+    wire  [1:0] HWUSER_dma2;        // Write-data USER signals
+    wire  [1:0] HRUSER_dma2;        // Read-data USER signals
+
+    // Input Port SI3
+    wire  [31:0] HADDR_cpu;         // Address bus
+    wire   [1:0] HTRANS_cpu;        // Transfer type
+    wire         HWRITE_cpu;        // Transfer direction
+    wire   [2:0] HSIZE_cpu;         // Transfer size
+    wire   [2:0] HBURST_cpu;        // Burst type
+    wire   [3:0] HPROT_cpu;         // Protection control
+    wire  [31:0] HWDATA_cpu;        // Write data
+    wire         HMASTLOCK_cpu;     // Locked Sequence
+
+    wire  [31:0] HRDATA_cpu;        // Read data bus
+    wire         HREADY_cpu;     // HREADY feedback
+    wire         HRESP_cpu;         // Transfer response
+    wire  [1:0] HAUSER_cpu;        // Address USER signals
+    wire  [1:0] HWUSER_cpu;        // Write-data USER signals
+    wire  [1:0] HRUSER_cpu;        // Read-data USER signals
+
+    // Output Port MI0
+    wire         HSEL_rom1;          // Slave Select
+    wire  [31:0] HADDR_rom1;         // Address bus
+    wire   [1:0] HTRANS_rom1;        // Transfer type
+    wire         HWRITE_rom1;        // Transfer direction
+    wire   [2:0] HSIZE_rom1;         // Transfer size
+    wire   [2:0] HBURST_rom1;        // Burst type
+    wire   [3:0] HPROT_rom1;         // Protection control
+    wire  [31:0] HWDATA_rom1;        // Write data
+    wire         HMASTLOCK_rom1;     // Locked Sequence
+    wire         HREADYMUX_rom1;     // Transfer done
+
+    wire  [31:0] HRDATA_rom1;        // Read data bus
+    wire         HREADYOUT_rom1;     // HREADY feedback
+    wire         HRESP_rom1;         // Transfer response
+    wire  [1:0] HAUSER_rom1;        // Address USER signals
+    wire  [1:0] HWUSER_rom1;        // Write-data USER signals
+    wire  [1:0] HRUSER_rom1;        // Read-data USER signals
+
+    // Output Port MI1
+    wire         HSEL_ram2;          // Slave Select
+    wire  [31:0] HADDR_ram2;         // Address bus
+    wire   [1:0] HTRANS_ram2;        // Transfer type
+    wire         HWRITE_ram2;        // Transfer direction
+    wire   [2:0] HSIZE_ram2;         // Transfer size
+    wire   [2:0] HBURST_ram2;        // Burst type
+    wire   [3:0] HPROT_ram2;         // Protection control
+    wire  [31:0] HWDATA_ram2;        // Write data
+    wire         HMASTLOCK_ram2;     // Locked Sequence
+    wire         HREADYMUX_ram2;     // Transfer done
+
+    wire  [31:0] HRDATA_ram2;        // Read data bus
+    wire         HREADYOUT_ram2;     // HREADY feedback
+    wire         HRESP_ram2;         // Transfer response
+    wire  [1:0] HAUSER_ram2;        // Address USER signals
+    wire  [1:0] HWUSER_ram2;        // Write-data USER signals
+    wire  [1:0] HRUSER_ram2;        // Read-data USER signals
+
+    // Output Port MI2
+    wire         HSEL_ram3;          // Slave Select
+    wire  [31:0] HADDR_ram3;         // Address bus
+    wire   [1:0] HTRANS_ram3;        // Transfer type
+    wire         HWRITE_ram3;        // Transfer direction
+    wire   [2:0] HSIZE_ram3;         // Transfer size
+    wire   [2:0] HBURST_ram3;        // Burst type
+    wire   [3:0] HPROT_ram3;         // Protection control
+    wire  [31:0] HWDATA_ram3;        // Write data
+    wire         HMASTLOCK_ram3;     // Locked Sequence
+    wire         HREADYMUX_ram3;     // Transfer done
+
+    wire  [31:0] HRDATA_ram3;        // Read data bus
+    wire         HREADYOUT_ram3;     // HREADY feedback
+    wire         HRESP_ram3;         // Transfer response
+    wire  [1:0] HAUSER_ram3;        // Address USER signals
+    wire  [1:0] HWUSER_ram3;        // Write-data USER signals
+    wire  [1:0] HRUSER_ram3;        // Read-data USER signals
+
+    // Output Port MI3
+    wire         HSEL_sys;          // Slave Select
+    wire  [31:0] HADDR_sys;         // Address bus
+    wire   [1:0] HTRANS_sys;        // Transfer type
+    wire         HWRITE_sys;        // Transfer direction
+    wire   [2:0] HSIZE_sys;         // Transfer size
+    wire   [2:0] HBURST_sys;        // Burst type
+    wire   [3:0] HPROT_sys;         // Protection control
+    wire  [31:0] HWDATA_sys;        // Write data
+    wire         HMASTLOCK_sys;     // Locked Sequence
+    wire         HREADYMUX_sys;     // Transfer done
+
+    wire  [31:0] HRDATA_sys;        // Read data bus
+    wire         HREADYOUT_sys;     // HREADY feedback
+    wire         HRESP_sys;         // Transfer response
+    wire  [1:0] HAUSER_sys;        // Address USER signals
+    wire  [1:0] HWUSER_sys;        // Write-data USER signals
+    wire  [1:0] HRUSER_sys;        // Read-data USER signals
+
+    // Output Port MI4
+    wire         HSEL_ram8;          // Slave Select
+    wire  [31:0] HADDR_ram8;         // Address bus
+    wire   [1:0] HTRANS_ram8;        // Transfer type
+    wire         HWRITE_ram8;        // Transfer direction
+    wire   [2:0] HSIZE_ram8;         // Transfer size
+    wire   [2:0] HBURST_ram8;        // Burst type
+    wire   [3:0] HPROT_ram8;         // Protection control
+    wire  [31:0] HWDATA_ram8;        // Write data
+    wire         HMASTLOCK_ram8;     // Locked Sequence
+    wire         HREADYMUX_ram8;     // Transfer done
+
+    wire  [31:0] HRDATA_ram8;        // Read data bus
+    wire         HREADYOUT_ram8;     // HREADY feedback
+    wire         HRESP_ram8;         // Transfer response
+    wire  [1:0] HAUSER_ram8;        // Address USER signals
+    wire  [1:0] HWUSER_ram8;        // Write-data USER signals
+    wire  [1:0] HRUSER_ram8;        // Read-data USER signals
+
+    // Output Port MI5
+    wire         HSEL_ram9;          // Slave Select
+    wire  [31:0] HADDR_ram9;         // Address bus
+    wire   [1:0] HTRANS_ram9;        // Transfer type
+    wire         HWRITE_ram9;        // Transfer direction
+    wire   [2:0] HSIZE_ram9;         // Transfer size
+    wire   [2:0] HBURST_ram9;        // Burst type
+    wire   [3:0] HPROT_ram9;         // Protection control
+    wire  [31:0] HWDATA_ram9;        // Write data
+    wire         HMASTLOCK_ram9;     // Locked Sequence
+    wire         HREADYMUX_ram9;     // Transfer done
+
+    wire  [31:0] HRDATA_ram9;        // Read data bus
+    wire         HREADYOUT_ram9;     // HREADY feedback
+    wire         HRESP_ram9;         // Transfer response
+    wire  [1:0] HAUSER_ram9;        // Address USER signals
+    wire  [1:0] HWUSER_ram9;        // Write-data USER signals
+    wire  [1:0] HRUSER_ram9;        // Read-data USER signals
+
+    // Output Port MI6
+    wire         HSEL_exp;          // Slave Select
+    wire  [31:0] HADDR_exp;         // Address bus
+    wire   [1:0] HTRANS_exp;        // Transfer type
+    wire         HWRITE_exp;        // Transfer direction
+    wire   [2:0] HSIZE_exp;         // Transfer size
+    wire   [2:0] HBURST_exp;        // Burst type
+    wire   [3:0] HPROT_exp;         // Protection control
+    wire  [31:0] HWDATA_exp;        // Write data
+    wire         HMASTLOCK_exp;     // Locked Sequence
+    wire         HREADYMUX_exp;     // Transfer done
+
+    wire  [31:0] HRDATA_exp;        // Read data bus
+    wire         HREADYOUT_exp;     // HREADY feedback
+    wire         HRESP_exp;         // Transfer response
+    wire  [1:0] HAUSER_exp;        // Address USER signals
+    wire  [1:0] HWUSER_exp;        // Write-data USER signals
+    wire  [1:0] HRUSER_exp;        // Read-data USER signals
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+    wire   [3:0] tie_hi_4;
+    wire         tie_hi;
+    wire         tie_low;
+    wire   [1:0] i_hresp_adp;
+    wire   [1:0] i_hresp_dma;
+    wire   [1:0] i_hresp_dma2;
+    wire   [1:0] i_hresp_cpu;
+
+    wire   [3:0]        i_hmaster_rom1;
+    wire   [1:0] i_hresp_rom1;
+    wire   [3:0]        i_hmaster_ram2;
+    wire   [1:0] i_hresp_ram2;
+    wire   [3:0]        i_hmaster_ram3;
+    wire   [1:0] i_hresp_ram3;
+    wire   [3:0]        i_hmaster_sys;
+    wire   [1:0] i_hresp_sys;
+    wire   [3:0]        i_hmaster_ram8;
+    wire   [1:0] i_hresp_ram8;
+    wire   [3:0]        i_hmaster_ram9;
+    wire   [1:0] i_hresp_ram9;
+    wire   [3:0]        i_hmaster_exp;
+    wire   [1:0] i_hresp_exp;
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+    assign tie_hi   = 1'b1;
+    assign tie_hi_4 = 4'b1111;
+    assign tie_low  = 1'b0;
+
+
+    assign HRESP_adp  = i_hresp_adp[0];
+
+    assign HRESP_dma  = i_hresp_dma[0];
+
+    assign HRESP_dma2  = i_hresp_dma2[0];
+
+    assign HRESP_cpu  = i_hresp_cpu[0];
+
+    assign i_hresp_rom1 = {{1{tie_low}}, HRESP_rom1};
+    assign i_hresp_ram2 = {{1{tie_low}}, HRESP_ram2};
+    assign i_hresp_ram3 = {{1{tie_low}}, HRESP_ram3};
+    assign i_hresp_sys = {{1{tie_low}}, HRESP_sys};
+    assign i_hresp_ram8 = {{1{tie_low}}, HRESP_ram8};
+    assign i_hresp_ram9 = {{1{tie_low}}, HRESP_ram9};
+    assign i_hresp_exp = {{1{tie_low}}, HRESP_exp};
+
+// BusMatrix instance
+  soclabs_4x7_AhbMatrix usoclabs_4x7_AhbMatrix (
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+    .REMAP      (REMAP),
+
+    // Input port SI0 signals
+    .HSEL_adp       (tie_hi),
+    .HADDR_adp      (HADDR_adp),
+    .HTRANS_adp     (HTRANS_adp),
+    .HWRITE_adp     (HWRITE_adp),
+    .HSIZE_adp      (HSIZE_adp),
+    .HBURST_adp     (HBURST_adp),
+    .HPROT_adp      (HPROT_adp),
+    .HWDATA_adp     (HWDATA_adp),
+    .HMASTLOCK_adp  (HMASTLOCK_adp),
+    .HMASTER_adp    (tie_hi_4),
+    .HREADY_adp     (HREADY_adp),
+    .HAUSER_adp     (HAUSER_adp),
+    .HWUSER_adp     (HWUSER_adp),
+    .HRDATA_adp     (HRDATA_adp),
+    .HREADYOUT_adp  (HREADY_adp),
+    .HRESP_adp      (i_hresp_adp),
+    .HRUSER_adp     (HRUSER_adp),
+
+    // Input port SI1 signals
+    .HSEL_dma       (tie_hi),
+    .HADDR_dma      (HADDR_dma),
+    .HTRANS_dma     (HTRANS_dma),
+    .HWRITE_dma     (HWRITE_dma),
+    .HSIZE_dma      (HSIZE_dma),
+    .HBURST_dma     (HBURST_dma),
+    .HPROT_dma      (HPROT_dma),
+    .HWDATA_dma     (HWDATA_dma),
+    .HMASTLOCK_dma  (HMASTLOCK_dma),
+    .HMASTER_dma    (tie_hi_4),
+    .HREADY_dma     (HREADY_dma),
+    .HAUSER_dma     (HAUSER_dma),
+    .HWUSER_dma     (HWUSER_dma),
+    .HRDATA_dma     (HRDATA_dma),
+    .HREADYOUT_dma  (HREADY_dma),
+    .HRESP_dma      (i_hresp_dma),
+    .HRUSER_dma     (HRUSER_dma),
+
+    // Input port SI2 signals
+    .HSEL_dma2       (tie_hi),
+    .HADDR_dma2      (HADDR_dma2),
+    .HTRANS_dma2     (HTRANS_dma2),
+    .HWRITE_dma2     (HWRITE_dma2),
+    .HSIZE_dma2      (HSIZE_dma2),
+    .HBURST_dma2     (HBURST_dma2),
+    .HPROT_dma2      (HPROT_dma2),
+    .HWDATA_dma2     (HWDATA_dma2),
+    .HMASTLOCK_dma2  (HMASTLOCK_dma2),
+    .HMASTER_dma2    (tie_hi_4),
+    .HREADY_dma2     (HREADY_dma2),
+    .HAUSER_dma2     (HAUSER_dma2),
+    .HWUSER_dma2     (HWUSER_dma2),
+    .HRDATA_dma2     (HRDATA_dma2),
+    .HREADYOUT_dma2  (HREADY_dma2),
+    .HRESP_dma2      (i_hresp_dma2),
+    .HRUSER_dma2     (HRUSER_dma2),
+
+    // Input port SI3 signals
+    .HSEL_cpu       (tie_hi),
+    .HADDR_cpu      (HADDR_cpu),
+    .HTRANS_cpu     (HTRANS_cpu),
+    .HWRITE_cpu     (HWRITE_cpu),
+    .HSIZE_cpu      (HSIZE_cpu),
+    .HBURST_cpu     (HBURST_cpu),
+    .HPROT_cpu      (HPROT_cpu),
+    .HWDATA_cpu     (HWDATA_cpu),
+    .HMASTLOCK_cpu  (HMASTLOCK_cpu),
+    .HMASTER_cpu    (tie_hi_4),
+    .HREADY_cpu     (HREADY_cpu),
+    .HAUSER_cpu     (HAUSER_cpu),
+    .HWUSER_cpu     (HWUSER_cpu),
+    .HRDATA_cpu     (HRDATA_cpu),
+    .HREADYOUT_cpu  (HREADY_cpu),
+    .HRESP_cpu      (i_hresp_cpu),
+    .HRUSER_cpu     (HRUSER_cpu),
+
+
+    // Output port MI0 signals
+    .HSEL_rom1       (HSEL_rom1),
+    .HADDR_rom1      (HADDR_rom1),
+    .HTRANS_rom1     (HTRANS_rom1),
+    .HWRITE_rom1     (HWRITE_rom1),
+    .HSIZE_rom1      (HSIZE_rom1),
+    .HBURST_rom1     (HBURST_rom1),
+    .HPROT_rom1      (HPROT_rom1),
+    .HWDATA_rom1     (HWDATA_rom1),
+    .HMASTER_rom1    (i_hmaster_rom1),
+    .HMASTLOCK_rom1  (HMASTLOCK_rom1),
+    .HREADYMUX_rom1  (HREADYMUX_rom1),
+    .HAUSER_rom1     (HAUSER_rom1),
+    .HWUSER_rom1     (HWUSER_rom1),
+    .HRDATA_rom1     (HRDATA_rom1),
+    .HREADYOUT_rom1  (HREADYOUT_rom1),
+    .HRESP_rom1      (i_hresp_rom1),
+    .HRUSER_rom1     (HRUSER_rom1),
+
+    // Output port MI1 signals
+    .HSEL_ram2       (HSEL_ram2),
+    .HADDR_ram2      (HADDR_ram2),
+    .HTRANS_ram2     (HTRANS_ram2),
+    .HWRITE_ram2     (HWRITE_ram2),
+    .HSIZE_ram2      (HSIZE_ram2),
+    .HBURST_ram2     (HBURST_ram2),
+    .HPROT_ram2      (HPROT_ram2),
+    .HWDATA_ram2     (HWDATA_ram2),
+    .HMASTER_ram2    (i_hmaster_ram2),
+    .HMASTLOCK_ram2  (HMASTLOCK_ram2),
+    .HREADYMUX_ram2  (HREADYMUX_ram2),
+    .HAUSER_ram2     (HAUSER_ram2),
+    .HWUSER_ram2     (HWUSER_ram2),
+    .HRDATA_ram2     (HRDATA_ram2),
+    .HREADYOUT_ram2  (HREADYOUT_ram2),
+    .HRESP_ram2      (i_hresp_ram2),
+    .HRUSER_ram2     (HRUSER_ram2),
+
+    // Output port MI2 signals
+    .HSEL_ram3       (HSEL_ram3),
+    .HADDR_ram3      (HADDR_ram3),
+    .HTRANS_ram3     (HTRANS_ram3),
+    .HWRITE_ram3     (HWRITE_ram3),
+    .HSIZE_ram3      (HSIZE_ram3),
+    .HBURST_ram3     (HBURST_ram3),
+    .HPROT_ram3      (HPROT_ram3),
+    .HWDATA_ram3     (HWDATA_ram3),
+    .HMASTER_ram3    (i_hmaster_ram3),
+    .HMASTLOCK_ram3  (HMASTLOCK_ram3),
+    .HREADYMUX_ram3  (HREADYMUX_ram3),
+    .HAUSER_ram3     (HAUSER_ram3),
+    .HWUSER_ram3     (HWUSER_ram3),
+    .HRDATA_ram3     (HRDATA_ram3),
+    .HREADYOUT_ram3  (HREADYOUT_ram3),
+    .HRESP_ram3      (i_hresp_ram3),
+    .HRUSER_ram3     (HRUSER_ram3),
+
+    // Output port MI3 signals
+    .HSEL_sys       (HSEL_sys),
+    .HADDR_sys      (HADDR_sys),
+    .HTRANS_sys     (HTRANS_sys),
+    .HWRITE_sys     (HWRITE_sys),
+    .HSIZE_sys      (HSIZE_sys),
+    .HBURST_sys     (HBURST_sys),
+    .HPROT_sys      (HPROT_sys),
+    .HWDATA_sys     (HWDATA_sys),
+    .HMASTER_sys    (i_hmaster_sys),
+    .HMASTLOCK_sys  (HMASTLOCK_sys),
+    .HREADYMUX_sys  (HREADYMUX_sys),
+    .HAUSER_sys     (HAUSER_sys),
+    .HWUSER_sys     (HWUSER_sys),
+    .HRDATA_sys     (HRDATA_sys),
+    .HREADYOUT_sys  (HREADYOUT_sys),
+    .HRESP_sys      (i_hresp_sys),
+    .HRUSER_sys     (HRUSER_sys),
+
+    // Output port MI4 signals
+    .HSEL_ram8       (HSEL_ram8),
+    .HADDR_ram8      (HADDR_ram8),
+    .HTRANS_ram8     (HTRANS_ram8),
+    .HWRITE_ram8     (HWRITE_ram8),
+    .HSIZE_ram8      (HSIZE_ram8),
+    .HBURST_ram8     (HBURST_ram8),
+    .HPROT_ram8      (HPROT_ram8),
+    .HWDATA_ram8     (HWDATA_ram8),
+    .HMASTER_ram8    (i_hmaster_ram8),
+    .HMASTLOCK_ram8  (HMASTLOCK_ram8),
+    .HREADYMUX_ram8  (HREADYMUX_ram8),
+    .HAUSER_ram8     (HAUSER_ram8),
+    .HWUSER_ram8     (HWUSER_ram8),
+    .HRDATA_ram8     (HRDATA_ram8),
+    .HREADYOUT_ram8  (HREADYOUT_ram8),
+    .HRESP_ram8      (i_hresp_ram8),
+    .HRUSER_ram8     (HRUSER_ram8),
+
+    // Output port MI5 signals
+    .HSEL_ram9       (HSEL_ram9),
+    .HADDR_ram9      (HADDR_ram9),
+    .HTRANS_ram9     (HTRANS_ram9),
+    .HWRITE_ram9     (HWRITE_ram9),
+    .HSIZE_ram9      (HSIZE_ram9),
+    .HBURST_ram9     (HBURST_ram9),
+    .HPROT_ram9      (HPROT_ram9),
+    .HWDATA_ram9     (HWDATA_ram9),
+    .HMASTER_ram9    (i_hmaster_ram9),
+    .HMASTLOCK_ram9  (HMASTLOCK_ram9),
+    .HREADYMUX_ram9  (HREADYMUX_ram9),
+    .HAUSER_ram9     (HAUSER_ram9),
+    .HWUSER_ram9     (HWUSER_ram9),
+    .HRDATA_ram9     (HRDATA_ram9),
+    .HREADYOUT_ram9  (HREADYOUT_ram9),
+    .HRESP_ram9      (i_hresp_ram9),
+    .HRUSER_ram9     (HRUSER_ram9),
+
+    // Output port MI6 signals
+    .HSEL_exp       (HSEL_exp),
+    .HADDR_exp      (HADDR_exp),
+    .HTRANS_exp     (HTRANS_exp),
+    .HWRITE_exp     (HWRITE_exp),
+    .HSIZE_exp      (HSIZE_exp),
+    .HBURST_exp     (HBURST_exp),
+    .HPROT_exp      (HPROT_exp),
+    .HWDATA_exp     (HWDATA_exp),
+    .HMASTER_exp    (i_hmaster_exp),
+    .HMASTLOCK_exp  (HMASTLOCK_exp),
+    .HREADYMUX_exp  (HREADYMUX_exp),
+    .HAUSER_exp     (HAUSER_exp),
+    .HWUSER_exp     (HWUSER_exp),
+    .HRDATA_exp     (HRDATA_exp),
+    .HREADYOUT_exp  (HREADYOUT_exp),
+    .HRESP_exp      (i_hresp_exp),
+    .HRUSER_exp     (HRUSER_exp),
+
+
+    // Scan test dummy signals; not connected until scan insertion
+    .SCANENABLE            (SCANENABLE),
+    .SCANINHCLK            (SCANINHCLK),
+    .SCANOUTHCLK           (SCANOUTHCLK)
+  );
+
+
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v
new file mode 100644
index 0000000..f5eb286
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_Arbiter.v
@@ -0,0 +1,330 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------
+//  Abstract            : The Output Arbitration is used to determine which
+//                        of the input stages will be given access to the
+//                        shared slave.
+//
+//  Notes               : The bus matrix has full connectivity.
+//
+//-----------------------------------------------------------------------------
+
+
+`timescale 1ns/1ps
+
+
+module soclabs_4x7_Arbiter (
+
+    // Common AHB signals
+    HCLK ,
+    HRESETn,
+
+    // Input port request signals
+    req_port0,
+    req_port1,
+    req_port2,
+    req_port3,
+
+    HREADYM,
+    HSELM,
+    HTRANSM,
+    HBURSTM,
+    HMASTLOCKM,
+
+    // Arbiter outputs
+    addr_in_port,
+    no_port
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input        HCLK;         // AHB system clock
+    input        HRESETn;      // AHB system reset
+    input        req_port0;     // Port 0 request signal
+    input        req_port1;     // Port 1 request signal
+    input        req_port2;     // Port 2 request signal
+    input        req_port3;     // Port 3 request signal
+    input        HREADYM;      // Transfer done
+    input        HSELM;        // Slave select line
+    input  [1:0] HTRANSM;      // Transfer type
+    input  [2:0] HBURSTM;      // Burst type
+    input        HMASTLOCKM;   // Locked transfer
+    output [1:0] addr_in_port;   // Port address input
+    output       no_port;       // No port selected signal
+
+
+// -----------------------------------------------------------------------------
+// Constant declarations
+// -----------------------------------------------------------------------------
+
+// HTRANS transfer type signal encoding
+`define TRN_IDLE   2'b00       // Idle transfer
+`define TRN_BUSY   2'b01       // Busy transfer
+`define TRN_NONSEQ 2'b10       // NonSequential transfer
+`define TRN_SEQ    2'b11       // Sequential transfer
+
+// HBURST transfer type signal encoding
+`define BUR_SINGLE 3'b000       // Single
+`define BUR_INCR   3'b001       // Incremental
+`define BUR_WRAP4  3'b010       // 4-beat wrap
+`define BUR_INCR4  3'b011       // 4-beat Incr
+`define BUR_WRAP8  3'b100       // 8-beat wrap
+`define BUR_INCR8  3'b101       // 8-beat Incr
+`define BUR_WRAP16 3'b110       // 16-beat Wrap
+`define BUR_INCR16 3'b111       // 16-beat Incr
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+    wire       HCLK;           // AHB system clock
+    wire       HRESETn;        // AHB system reset
+    wire       req_port0;       // Port 0 request signal
+    wire       req_port1;       // Port 1 request signal
+    wire       req_port2;       // Port 2 request signal
+    wire       req_port3;       // Port 3 request signal
+    wire       HREADYM;        // Transfer done
+    wire       HSELM;          // Slave select line
+    wire [1:0] HTRANSM;        // Transfer type
+    wire [2:0] HBURSTM;        // Burst type
+    wire       HMASTLOCKM;     // Locked transfer
+    wire [1:0] addr_in_port;     // Address input port
+    reg        no_port;         // No port selected signal
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+    reg  [1:0] addr_in_port_next; // D-input of addr_in_port
+    reg  [1:0] i_addr_in_port;    // Internal version of addr_in_port
+    reg        no_port_next;       // D-input of no_port
+    reg  [3:0] next_burst_count;   // D-input of reg_burst_count
+    reg  [3:0] reg_burst_count;    // Burst counter
+    reg        next_burst_hold;    // D-input of reg_burst_hold
+    reg        reg_burst_hold;     // Burst hold signal
+
+    // Early burst termination logic
+    reg  [1:0] reg_early_term_count; // Counts number of early terminated bursts
+    wire [1:0] next_early_term_count; // D-input for reg_early_term_count
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// BURST TRANSFER COUNTER
+// -----------------------------------------------------------------------------
+//
+// The Burst counter is used to count down from the number of transfers the
+// master should perform and when the counter reaches zero the bus may be
+// passed to another master.
+//
+// reg_burst_count indicates the number of transfers remaining in the
+// current fixed length burst.
+// reg_burst_hold is actually a decode of reg_burst_count=0 but is driven from a register
+// to improve timing
+
+  always @ (HTRANSM or HSELM or HBURSTM or reg_burst_count or reg_burst_hold or reg_early_term_count)
+    begin : p_next_burst_count_comb
+      // Force the Burst logic to reset if this port is de-selected.  This can
+      // happen for two reasons:
+      //   1. The master performs 2 fixed-length bursts back-to-back, but the
+      //      second is to an alternate output port
+      //   2. The master is performing a fixed-length burst but is de-granted mid-
+      //      way by a local AHB Arbiter
+      if (!HSELM)
+        begin
+          next_burst_count = 4'b0000;
+          next_burst_hold  = 1'b0;
+        end
+
+      // Burst logic is initialised on a NONSEQ transfer (i.e. start of burst)
+      // IDLE transfers cause the logic to reset
+      // BUSY transfers pause the decrementer
+      // SEQ transfers decrement the counter
+      else
+        case (HTRANSM)
+
+          `TRN_NONSEQ : begin
+            case (HBURSTM)
+              `BUR_INCR16, `BUR_WRAP16 : begin
+                next_burst_count = 4'b1111;
+                next_burst_hold = 1'b1;
+              end // case: BUR_INCR16 | BUR_WRAP16
+
+              `BUR_INCR8, `BUR_WRAP8 : begin
+                next_burst_count = 4'b0111;
+                next_burst_hold = 1'b1;
+              end // case: BUR_INCR8  | BUR_WRAP8
+
+              `BUR_INCR4, `BUR_WRAP4 : begin
+                next_burst_count = 4'b0011;
+                next_burst_hold = 1'b1;
+              end // case: BUR_INCR4  | BUR_WRAP4
+
+              `BUR_SINGLE, `BUR_INCR : begin
+                next_burst_count = 4'b0000;
+                next_burst_hold = 1'b0;
+              end // case: BUR_SINGLE | BUR_INCR
+
+              default : begin
+                next_burst_count = 4'bxxxx;
+                next_burst_hold = 1'bx;
+              end // case: default
+            endcase // case(HBURSTM)
+
+            // Prevent early burst termination from keeping hold of the port
+            if (reg_early_term_count == 2'b10)
+            begin
+               next_burst_hold = 1'b0;
+               next_burst_count = 4'd0;
+            end
+
+
+          end // case: `TRN_NONSEQ
+
+          `TRN_SEQ : begin
+            next_burst_count = reg_burst_count - 4'b1;
+            if (reg_burst_count == 4'b0001)
+              next_burst_hold = 1'b0;
+            else
+              next_burst_hold = reg_burst_hold;
+          end // case: `TRN_SEQ
+
+          `TRN_BUSY : begin
+            next_burst_count = reg_burst_count;
+            next_burst_hold = reg_burst_hold;
+          end // case: `TRN_BUSY
+
+          `TRN_IDLE : begin
+            next_burst_count = 4'b0000;
+            next_burst_hold = 1'b0;
+          end // case: `TRN_IDLE
+
+          default : begin
+            next_burst_count = 4'bxxxx;
+            next_burst_hold = 1'bx;
+          end // case: default
+
+        endcase // case(HTRANSM)
+    end // block: p_next_burst_countComb
+
+
+  assign next_early_term_count = (!next_burst_hold) ? 2'b00 :
+                               (reg_burst_hold & (HTRANSM == `TRN_NONSEQ)) ?
+                                reg_early_term_count + 2'b1 :
+                                reg_early_term_count;
+
+  // Sequential process
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_burst_seq
+      if (!HRESETn)
+        begin
+          reg_burst_count <= 4'b0000;
+          reg_burst_hold  <= 1'b0;
+          reg_early_term_count <= 2'b00;
+        end // if (HRESETn == 1'b0)
+      else
+        if (HREADYM)
+        begin
+            reg_burst_count <= next_burst_count;
+            reg_burst_hold  <= next_burst_hold;
+            reg_early_term_count <= next_early_term_count;
+          end
+    end // block: p_burst_seq
+
+
+// -----------------------------------------------------------------------------
+// Port Selection
+// -----------------------------------------------------------------------------
+// The Output Arbitration function looks at all the requests to use the
+//  output port and determines which is the highest priority request. This
+//  version of the arbitration logic uses a fixed priority scheme that is
+//  gated by a tracking function of the burst boundary. Input port 0 is the
+//  highest priority, input port 1 is the second highest priority, etc.
+// If none of the input ports are requesting then the current port will
+//  remain active if it is performing IDLE transfers to the selected slave. If
+//  this is not the case then the no_port signal will be asserted which
+//  indicates that no input port should be selected.
+
+  always @ (
+             req_port0 or
+             req_port1 or
+             req_port2 or
+             req_port3 or
+             HSELM or HTRANSM or HMASTLOCKM or next_burst_hold or i_addr_in_port
+           )
+    begin : p_sel_port_comb
+      // Default values are used for addr_in_port_next and no_port_next
+      no_port_next = 1'b0;
+      addr_in_port_next = i_addr_in_port;
+
+      if ( HMASTLOCKM | next_burst_hold )
+        addr_in_port_next = i_addr_in_port;
+      else if ( req_port0 | ( (i_addr_in_port == 2'b00) & HSELM &
+                              (HTRANSM != 2'b00) ) )
+        addr_in_port_next = 2'b00;
+      else if ( req_port1 | ( (i_addr_in_port == 2'b01) & HSELM &
+                              (HTRANSM != 2'b00) ) )
+        addr_in_port_next = 2'b01;
+      else if ( req_port2 | ( (i_addr_in_port == 2'b10) & HSELM &
+                              (HTRANSM != 2'b00) ) )
+        addr_in_port_next = 2'b10;
+      else if ( req_port3 | ( (i_addr_in_port == 2'b11) & HSELM &
+                              (HTRANSM != 2'b00) ) )
+        addr_in_port_next = 2'b11;
+      else if (HSELM)
+        addr_in_port_next = i_addr_in_port;
+      else
+        no_port_next = 1'b1;
+    end // block: p_sel_port_comb
+
+
+  // Sequential process
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_addr_in_port_reg
+      if (!HRESETn)
+        begin
+          no_port        <= 1'b1;
+          i_addr_in_port <= {2{1'b0}};
+        end
+      else
+        if (HREADYM)
+          begin
+            no_port        <= no_port_next;
+            i_addr_in_port <= addr_in_port_next;
+          end
+    end // block: p_addr_in_port_reg
+
+  // Drive output with internal version
+  assign addr_in_port = i_addr_in_port;
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v
new file mode 100644
index 0000000..c7ff01a
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MasterInput.v
@@ -0,0 +1,473 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------
+//  Abstract            : The Input Stage is used to hold a pending transfer
+//                        when the required output stage is not available.
+//
+//-----------------------------------------------------------------------------
+
+
+`timescale 1ns/1ps
+
+
+module soclabs_4x7_MasterInput (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+    // Input Port Address/Control Signals
+    HSELS,
+    HADDRS,
+    HAUSERS,
+    HTRANSS,
+    HWRITES,
+    HSIZES,
+    HBURSTS,
+    HPROTS,
+    HMASTERS,
+    HMASTLOCKS,
+    HREADYS,
+
+    // Internal Response
+    active_ip,
+    readyout_ip,
+    resp_ip,
+
+    // Input Port Response
+    HREADYOUTS,
+    HRESPS,
+
+    // Internal Address/Control Signals
+    sel_ip,
+    addr_ip,
+    auser_ip,
+    trans_ip,
+    write_ip,
+    size_ip,
+    burst_ip,
+    prot_ip,
+    master_ip,
+    mastlock_ip,
+    held_tran_ip
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    input         HCLK;            // AHB System Clock
+    input         HRESETn;         // AHB System Reset
+    input         HSELS;           // Slave Select from AHB
+    input  [31:0] HADDRS;          // Address bus from AHB
+    input  [1:0] HAUSERS;         // Additional user adress bus
+    input   [1:0] HTRANSS;         // Transfer type from AHB
+    input         HWRITES;         // Transfer direction from AHB
+    input   [2:0] HSIZES;          // Transfer size from AHB
+    input   [2:0] HBURSTS;         // Burst type from AHB
+    input   [3:0] HPROTS;          // Protection control from AHB
+    input   [3:0] HMASTERS;        // Master number from AHB
+    input         HMASTLOCKS;      // Locked Sequence  from AHB
+    input         HREADYS;         // Transfer done from AHB
+    input         active_ip;          // active_ip signal
+    input         readyout_ip;        // HREADYOUT input
+    input   [1:0] resp_ip;            // HRESP input
+
+    output        HREADYOUTS;      // HREADY feedback to AHB
+    output  [1:0] HRESPS;          // Transfer response to AHB
+    output        sel_ip;             // HSEL output
+    output [31:0] addr_ip;            // HADDR output
+    output [1:0] auser_ip;           // HAUSER output
+    output  [1:0] trans_ip;           // HTRANS output
+    output        write_ip;           // HWRITE output
+    output  [2:0] size_ip;            // HSIZE output
+    output  [2:0] burst_ip;           // HBURST output
+    output  [3:0] prot_ip;            // HPROT output
+    output [3:0]  master_ip;          // HMASTER output
+    output        mastlock_ip;        // HMASTLOCK output
+    output        held_tran_ip;        // Holding register active flag
+
+
+// -----------------------------------------------------------------------------
+// Constant declarations
+// -----------------------------------------------------------------------------
+
+// HTRANS transfer type signal encoding
+`define TRN_IDLE    2'b00     // Idle Transfer
+`define TRN_BUSY    2'b01     // Busy Transfer
+`define TRN_NONSEQ  2'b10     // Nonsequential transfer
+`define TRN_SEQ     2'b11     // Sequential transfer
+
+// HBURST transfer type signal encoding
+`define BUR_SINGLE  3'b000    // Single BURST
+`define BUR_INCR    3'b001    // Incremental BURSTS
+`define BUR_WRAP4   3'b010    // 4-beat wrap
+`define BUR_INCR4   3'b011    // 4-beat incr
+`define BUR_WRAP8   3'b100    // 8-beat wrap
+`define BUR_INCR8   3'b101    // 8-beat incr
+`define BUR_WRAP16  3'b110    // 16-beat wrap
+`define BUR_INCR16  3'b111    // 16-beat incr
+
+// HRESP signal encoding
+`define RSP_OKAY    2'b00      // OKAY response
+`define RSP_ERROR   2'b01     // ERROR response
+`define RSP_RETRY   2'b10     // RETRY response
+`define RSP_SPLIT   2'b11     // SPLIT response
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+
+    wire        HCLK;            // AHB System Clock
+    wire        HRESETn;         // AHB System Reset
+    wire        HSELS;           // Slave Select from AHB
+    wire [31:0] HADDRS;          // Address bus from AHB
+    wire [1:0] HAUSERS;         // Additional user adress bus
+    wire  [1:0] HTRANSS;         // Transfer type from AHB
+    wire        HWRITES;         // Transfer direction from AHB
+    wire  [2:0] HSIZES;          // Transfer size from AHB
+    wire  [2:0] HBURSTS;         // Burst type from AHB
+    wire  [3:0] HPROTS;          // Protection control from AHB
+    wire  [3:0] HMASTERS;        // Master number from AHB
+    wire        HMASTLOCKS;      // Locked Sequence  from AHB
+    wire        HREADYS;         // Transfer done from AHB
+    reg         HREADYOUTS;      // HREADY feedback to AHB
+    reg   [1:0] HRESPS;          // Transfer response to AHB
+    reg         sel_ip;             // HSEL output
+    reg  [31:0] addr_ip;            // HADDR output
+    reg  [1:0] auser_ip;           // HAUSER output
+    wire  [1:0] trans_ip;           // HTRANS output
+    reg         write_ip;           // HWRITE output
+    reg   [2:0] size_ip;            // HSIZE output
+    wire  [2:0] burst_ip;           // HBURST output
+    reg   [3:0] prot_ip;            // HPROT output
+    reg   [3:0] master_ip;          // HMASTER output
+    reg         mastlock_ip;        // HMASTLOCK output
+    wire        held_tran_ip;        // Holding register active flag
+    wire        active_ip;          // active_ip signal
+    wire        readyout_ip;        // HREADYOUT input
+    wire  [1:0] resp_ip;            // HRESP input
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+
+    wire        load_reg;             // Holding register load flag
+    wire        pend_tran;            // An active transfer cannot complete
+    reg         pend_tran_reg;         // Registered version of pend_tran
+    wire        addr_valid;           // Indicates address phase of
+                                     // valid transfer
+    reg         data_valid;           // Indicates data phase of
+                                     // valid transfer
+    reg   [1:0] reg_trans;            // Registered HTRANSS
+    reg  [31:0] reg_addr;             // Registered HADDRS
+    reg  [1:0] reg_auser;
+    reg         reg_write;            // Registered HWRITES
+    reg   [2:0] reg_size;             // Registered HSIZES
+    reg   [2:0] reg_burst;            // Registered HBURSTS
+    reg   [3:0] reg_prot;             // Registered HPROTS
+    reg   [3:0] reg_master;           // Registerd HMASTERS
+    reg         reg_mastlock;         // Registered HMASTLOCKS
+    reg   [1:0] transb;               // HTRANS output used for burst information
+    reg   [1:0] trans_int;            // HTRANS output
+    reg   [2:0] burst_int;            // HBURST output
+    reg   [3:0] offset_addr;          // Address offset for boundary logic
+    reg   [3:0] check_addr;           // Address check for wrapped bursts
+    reg         burst_override;       // Registered burst_override_next
+    wire        burst_override_next;  // Indicates burst has been over-ridden
+    reg         bound;                // Registered version of bound_next
+    wire        bound_next;           // Indicates boundary wrapping
+    wire        bound_en;             // Clock-enable for bound register
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// Holding Registers
+// -----------------------------------------------------------------------------
+// Each input port has a holding register associated with it and a mux to
+//  select between the register and the direct input path. The control of
+//  the mux is done simply by selecting the holding register when it is loaded
+//  with a pending transfer, otherwise the straight through path is used.
+
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_holding_reg_seq1
+      if (~HRESETn)
+        begin
+          reg_trans    <= 2'b00;
+          reg_addr     <= {32{1'b0}};
+          reg_auser    <= {2{1'b0}};
+          reg_write    <= 1'b0 ;
+          reg_size     <= 3'b000;
+          reg_burst    <= 3'b000;
+          reg_prot     <= {4{1'b0}};
+          reg_master   <= 4'b0000;
+          reg_mastlock <= 1'b0 ;
+        end
+      else
+        if (load_reg)
+          begin
+            reg_trans    <= HTRANSS;
+            reg_addr     <= HADDRS;
+            reg_auser    <= HAUSERS;
+            reg_write    <= HWRITES;
+            reg_size     <= HSIZES;
+            reg_burst    <= HBURSTS;
+            reg_prot     <= HPROTS;
+            reg_master   <= HMASTERS;
+            reg_mastlock <= HMASTLOCKS;
+          end
+    end
+
+  // addr_valid indicates the address phase of an active (non-BUSY/IDLE)
+  // transfer to this slave port
+  assign addr_valid = ( HSELS & HTRANSS[1] );
+
+  // The holding register is loaded whenever there is a transfer on the input
+  // port which is validated by active HREADYS
+  assign load_reg = ( addr_valid & HREADYS );
+
+  // data_valid register
+  // addr_valid indicates the data phase of an active (non-BUSY/IDLE)
+  // transfer to this slave port. A valid response (HREADY, HRESP) must be
+  // generated
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_data_valid
+      if (~HRESETn)
+        data_valid <= 1'b0;
+      else
+       if (HREADYS)
+        data_valid  <= addr_valid;
+    end
+
+// -----------------------------------------------------------------------------
+// Generate HeldTran
+// -----------------------------------------------------------------------------
+// The HeldTran signal is used to indicate when there is an active transfer
+// being presented to the output stage, either passing straight through or from
+// the holding register.
+
+  // pend_tran indicates that an active transfer presented to this
+  // slave cannot complete immediately.  It is always set after the
+  // load_reg signal has been active. When set, it is cleared when the
+  // transfer is being driven onto the selected slave (as indicated by
+  // active_ip being high) and HREADY from the selected slave is high.
+  assign pend_tran = (load_reg & (~active_ip)) ? 1'b1 :
+                    (active_ip & readyout_ip) ? 1'b0 : pend_tran_reg;
+
+  // pend_tran_reg indicates that an active transfer was accepted by the input
+  // stage,but not by the output stage, and so the holding registers should be
+  // used
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_pend_tran_reg
+      if (~HRESETn)
+        pend_tran_reg <= 1'b0;
+      else
+        pend_tran_reg <= pend_tran;
+    end
+
+  // held_tran_ip indicates an active transfer, and is held whilst that transfer is
+  // in the holding registers.  It passes to the output stage where it acts as
+  // a request line to the arbitration scheme
+  assign  held_tran_ip  = (load_reg | pend_tran_reg);
+
+  // The output from this stage is selected from the holding register when
+  //  there is a held transfer. Otherwise the direct path is used.
+
+  always @ ( pend_tran_reg or HSELS or HTRANSS or HADDRS or HWRITES or
+             HSIZES or HBURSTS or HPROTS or HMASTERS or HMASTLOCKS or
+             HAUSERS or reg_auser or
+             reg_addr or reg_write or reg_size or reg_burst or reg_prot or
+             reg_master or reg_mastlock
+           )
+    begin : p_mux_comb
+      if (~pend_tran_reg)
+        begin
+          sel_ip      = HSELS;
+          trans_int   = HTRANSS;
+          addr_ip     = HADDRS;
+          auser_ip    = HAUSERS;
+          write_ip    = HWRITES;
+          size_ip     = HSIZES;
+          burst_int   = HBURSTS;
+          prot_ip     = HPROTS;
+          master_ip   = HMASTERS;
+          mastlock_ip = HMASTLOCKS;
+        end
+      else
+        begin
+          sel_ip      = 1'b1;
+          trans_int   = `TRN_NONSEQ;
+          addr_ip     = reg_addr;
+          auser_ip    = reg_auser;
+          write_ip    = reg_write;
+          size_ip     = reg_size;
+          burst_int   = reg_burst;
+          prot_ip     = reg_prot;
+          master_ip   = reg_master;
+          mastlock_ip = reg_mastlock;
+        end
+    end
+
+  // The transb output is used to select the correct Burst value when completing
+  // an interrupted defined-lenght burst.
+
+  always @ (pend_tran_reg or HTRANSS or reg_trans)
+    begin : p_transb_comb
+      if (~pend_tran_reg)
+        transb = HTRANSS;
+      else
+        transb = reg_trans;
+    end // block: p_transb_comb
+
+
+  // Convert SEQ->NONSEQ and BUSY->IDLE when an address boundary is crossed
+  // whilst the burst type is being over-ridden, i.e. when completing an
+  // interrupted wrapping burst.
+  assign trans_ip = (burst_override & bound) ? {trans_int[1], 1'b0}
+               : trans_int;
+
+  assign burst_ip = (burst_override & (transb != `TRN_NONSEQ)) ? `BUR_INCR
+               : burst_int;
+
+// -----------------------------------------------------------------------------
+// HREADYOUT Generation
+// -----------------------------------------------------------------------------
+// There are three possible sources for the HREADYOUT signal.
+//  - It is driven LOW when there is a held transfer.
+//  - It is driven HIGH when not Selected or for Idle/Busy transfers.
+//  - At all other times it is driven from the appropriate shared
+//    slave.
+
+  always @ (data_valid or pend_tran_reg or readyout_ip or resp_ip)
+    begin : p_ready_comb
+      if (~data_valid)
+        begin
+          HREADYOUTS = 1'b1;
+          HRESPS     = `RSP_OKAY;
+        end
+      else if (pend_tran_reg)
+        begin
+          HREADYOUTS = 1'b0;
+          HRESPS     = `RSP_OKAY;
+        end
+      else
+        begin
+          HREADYOUTS = readyout_ip;
+          HRESPS     = resp_ip;
+        end
+    end // block: p_ready_comb
+
+// -----------------------------------------------------------------------------
+// Early Burst Termination
+// -----------------------------------------------------------------------------
+// There are times when the output stage will switch to another input port
+//  without allowing the current burst to complete. In these cases the HTRANS
+//  and HBURST signals need to be overriden to ensure that the transfers
+//  reaching the output port meet the AHB specification.
+
+  assign burst_override_next  = ( (HTRANSS == `TRN_NONSEQ) |
+                                (HTRANSS == `TRN_IDLE) ) ? 1'b0
+                              : ( (HTRANSS ==`TRN_SEQ) &
+                                   load_reg &
+                                   (~active_ip) ) ? 1'b1
+                                  : burst_override;
+
+  // burst_override register
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_burst_overrideseq
+      if (~HRESETn)
+        burst_override <= 1'b0;
+      else
+        if (HREADYS)
+          burst_override <= burst_override_next;
+    end // block: p_burst_overrideseq
+
+// -----------------------------------------------------------------------------
+// Boundary Checking Logic
+// -----------------------------------------------------------------------------
+  // offset_addr
+  always @ (HADDRS or HSIZES)
+    begin : p_offset_addr_comb
+      case (HSIZES)
+        3'b000 : offset_addr = HADDRS[3:0];
+        3'b001 : offset_addr = HADDRS[4:1];
+        3'b010 : offset_addr = HADDRS[5:2];
+        3'b011 : offset_addr = HADDRS[6:3];
+
+        3'b100, 3'b101, 3'b110, 3'b111 :
+          offset_addr = HADDRS[3:0];      // Sizes >= 128-bits are not supported
+
+        default : offset_addr = 4'bxxxx;
+      endcase
+    end
+
+  // check_addr
+  always @ (offset_addr or HBURSTS)
+    begin : p_check_addr_comb
+      case (HBURSTS)
+        `BUR_WRAP4 : begin
+          check_addr[1:0] = offset_addr[1:0];
+          check_addr[3:2] = 2'b11;
+        end
+
+        `BUR_WRAP8 : begin
+          check_addr[2:0] = offset_addr[2:0];
+          check_addr[3]   = 1'b1;
+        end
+
+        `BUR_WRAP16 :
+          check_addr[3:0] = offset_addr[3:0];
+
+        `BUR_SINGLE, `BUR_INCR, `BUR_INCR4, `BUR_INCR8, `BUR_INCR16 :
+          check_addr[3:0] = 4'b0000;
+
+        default : check_addr[3:0] = 4'bxxxx;
+      endcase
+    end
+
+  assign bound_next = ( check_addr == 4'b1111 );
+
+  assign bound_en = ( HTRANSS[1] & HREADYS );
+
+  // bound register
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_bound_seq
+      if (~HRESETn)
+        bound <= 1'b0;
+      else
+        if (bound_en)
+          bound <= bound_next;
+    end
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v
new file mode 100644
index 0000000..dad3668
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_adp.v
@@ -0,0 +1,630 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+//  Abstract             : The MatrixDecode is used to determine which output
+//                         stage is required for a particular access. Addresses
+//                         that do not map to an Output port are diverted to
+//                         the local default slave.
+//
+//  Notes               : The bus matrix has full connectivity.
+//
+//-----------------------------------------------------------------------------
+
+
+`timescale 1ns/1ps
+
+
+module soclabs_4x7_MatrixDecode_adp (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+    // Internal address remapping control
+    remapping_dec,
+
+    // Signals from the Input stage
+    HREADYS,
+    sel_dec,
+    decode_addr_dec,
+    trans_dec,
+
+    // Bus-switch output 0
+    active_dec0,
+    readyout_dec0,
+    resp_dec0,
+    rdata_dec0,
+    ruser_dec0,
+
+    // Bus-switch output 1
+    active_dec1,
+    readyout_dec1,
+    resp_dec1,
+    rdata_dec1,
+    ruser_dec1,
+
+    // Bus-switch output 2
+    active_dec2,
+    readyout_dec2,
+    resp_dec2,
+    rdata_dec2,
+    ruser_dec2,
+
+    // Bus-switch output 3
+    active_dec3,
+    readyout_dec3,
+    resp_dec3,
+    rdata_dec3,
+    ruser_dec3,
+
+    // Bus-switch output 4
+    active_dec4,
+    readyout_dec4,
+    resp_dec4,
+    rdata_dec4,
+    ruser_dec4,
+
+    // Bus-switch output 5
+    active_dec5,
+    readyout_dec5,
+    resp_dec5,
+    rdata_dec5,
+    ruser_dec5,
+
+    // Bus-switch output 6
+    active_dec6,
+    readyout_dec6,
+    resp_dec6,
+    rdata_dec6,
+    ruser_dec6,
+
+    // Output port selection signals
+    sel_dec0,
+    sel_dec1,
+    sel_dec2,
+    sel_dec3,
+    sel_dec4,
+    sel_dec5,
+    sel_dec6,
+
+    // Selected Output port data and control signals
+    active_dec,
+    HREADYOUTS,
+    HRESPS,
+    HRUSERS,
+    HRDATAS
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input         HCLK;           // AHB System Clock
+    input         HRESETn;        // AHB System Reset
+
+    // Internal address remapping control
+    input   [0:0] remapping_dec;      // Internal remap signal
+
+    // Signals from the Input stage
+    input         HREADYS;        // Transfer done
+    input         sel_dec;            // HSEL input
+    input [31:10] decode_addr_dec;     // HADDR decoder input
+    input   [1:0] trans_dec;          // Input port HTRANS signal
+
+    // Bus-switch output MI0
+    input         active_dec0;        // Output stage MI0 active_dec signal
+    input         readyout_dec0;      // HREADYOUT input
+    input   [1:0] resp_dec0;          // HRESP input
+    input  [31:0] rdata_dec0;         // HRDATA input
+    input  [1:0] ruser_dec0;         // HRUSER input
+
+    // Bus-switch output MI1
+    input         active_dec1;        // Output stage MI1 active_dec signal
+    input         readyout_dec1;      // HREADYOUT input
+    input   [1:0] resp_dec1;          // HRESP input
+    input  [31:0] rdata_dec1;         // HRDATA input
+    input  [1:0] ruser_dec1;         // HRUSER input
+
+    // Bus-switch output MI2
+    input         active_dec2;        // Output stage MI2 active_dec signal
+    input         readyout_dec2;      // HREADYOUT input
+    input   [1:0] resp_dec2;          // HRESP input
+    input  [31:0] rdata_dec2;         // HRDATA input
+    input  [1:0] ruser_dec2;         // HRUSER input
+
+    // Bus-switch output MI3
+    input         active_dec3;        // Output stage MI3 active_dec signal
+    input         readyout_dec3;      // HREADYOUT input
+    input   [1:0] resp_dec3;          // HRESP input
+    input  [31:0] rdata_dec3;         // HRDATA input
+    input  [1:0] ruser_dec3;         // HRUSER input
+
+    // Bus-switch output MI4
+    input         active_dec4;        // Output stage MI4 active_dec signal
+    input         readyout_dec4;      // HREADYOUT input
+    input   [1:0] resp_dec4;          // HRESP input
+    input  [31:0] rdata_dec4;         // HRDATA input
+    input  [1:0] ruser_dec4;         // HRUSER input
+
+    // Bus-switch output MI5
+    input         active_dec5;        // Output stage MI5 active_dec signal
+    input         readyout_dec5;      // HREADYOUT input
+    input   [1:0] resp_dec5;          // HRESP input
+    input  [31:0] rdata_dec5;         // HRDATA input
+    input  [1:0] ruser_dec5;         // HRUSER input
+
+    // Bus-switch output MI6
+    input         active_dec6;        // Output stage MI6 active_dec signal
+    input         readyout_dec6;      // HREADYOUT input
+    input   [1:0] resp_dec6;          // HRESP input
+    input  [31:0] rdata_dec6;         // HRDATA input
+    input  [1:0] ruser_dec6;         // HRUSER input
+
+    // Output port selection signals
+    output        sel_dec0;           // HSEL output
+    output        sel_dec1;           // HSEL output
+    output        sel_dec2;           // HSEL output
+    output        sel_dec3;           // HSEL output
+    output        sel_dec4;           // HSEL output
+    output        sel_dec5;           // HSEL output
+    output        sel_dec6;           // HSEL output
+
+    // Selected Output port data and control signals
+    output        active_dec;         // Combinatorial active_dec O/P
+    output        HREADYOUTS;     // HREADY feedback output
+    output  [1:0] HRESPS;         // Transfer response
+    output [1:0] HRUSERS;        // User read Data
+    output [31:0] HRDATAS;        // Read Data
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    wire          HCLK;            // AHB System Clock
+    wire          HRESETn;         // AHB System Reset
+    // Internal address remapping control
+    wire    [0:0] remapping_dec;       // Internal remap signal
+
+    // Signals from the Input stage
+    wire          HREADYS;         // Transfer done
+    wire          sel_dec;             // HSEL input
+    wire  [31:10] decode_addr_dec;      // HADDR input
+    wire    [1:0] trans_dec;           // Input port HTRANS signal
+
+    // Bus-switch output MI0
+    wire          active_dec0;         // active_dec signal
+    wire          readyout_dec0;       // HREADYOUT input
+    wire    [1:0] resp_dec0;           // HRESP input
+    wire   [31:0] rdata_dec0;          // HRDATA input
+    wire   [1:0] ruser_dec0;          // HRUSER input
+    reg           sel_dec0;            // HSEL output
+
+    // Bus-switch output MI1
+    wire          active_dec1;         // active_dec signal
+    wire          readyout_dec1;       // HREADYOUT input
+    wire    [1:0] resp_dec1;           // HRESP input
+    wire   [31:0] rdata_dec1;          // HRDATA input
+    wire   [1:0] ruser_dec1;          // HRUSER input
+    reg           sel_dec1;            // HSEL output
+
+    // Bus-switch output MI2
+    wire          active_dec2;         // active_dec signal
+    wire          readyout_dec2;       // HREADYOUT input
+    wire    [1:0] resp_dec2;           // HRESP input
+    wire   [31:0] rdata_dec2;          // HRDATA input
+    wire   [1:0] ruser_dec2;          // HRUSER input
+    reg           sel_dec2;            // HSEL output
+
+    // Bus-switch output MI3
+    wire          active_dec3;         // active_dec signal
+    wire          readyout_dec3;       // HREADYOUT input
+    wire    [1:0] resp_dec3;           // HRESP input
+    wire   [31:0] rdata_dec3;          // HRDATA input
+    wire   [1:0] ruser_dec3;          // HRUSER input
+    reg           sel_dec3;            // HSEL output
+
+    // Bus-switch output MI4
+    wire          active_dec4;         // active_dec signal
+    wire          readyout_dec4;       // HREADYOUT input
+    wire    [1:0] resp_dec4;           // HRESP input
+    wire   [31:0] rdata_dec4;          // HRDATA input
+    wire   [1:0] ruser_dec4;          // HRUSER input
+    reg           sel_dec4;            // HSEL output
+
+    // Bus-switch output MI5
+    wire          active_dec5;         // active_dec signal
+    wire          readyout_dec5;       // HREADYOUT input
+    wire    [1:0] resp_dec5;           // HRESP input
+    wire   [31:0] rdata_dec5;          // HRDATA input
+    wire   [1:0] ruser_dec5;          // HRUSER input
+    reg           sel_dec5;            // HSEL output
+
+    // Bus-switch output MI6
+    wire          active_dec6;         // active_dec signal
+    wire          readyout_dec6;       // HREADYOUT input
+    wire    [1:0] resp_dec6;           // HRESP input
+    wire   [31:0] rdata_dec6;          // HRDATA input
+    wire   [1:0] ruser_dec6;          // HRUSER input
+    reg           sel_dec6;            // HSEL output
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+
+    // Selected Output port data and control signals
+    reg           active_dec;          // Combinatorial active_dec O/P signal
+    reg           HREADYOUTS;      // Combinatorial HREADYOUT signal
+    reg     [1:0] HRESPS;          // Combinatorial HRESPS signal
+    reg    [1:0] HRUSERS;
+    reg    [31:0] HRDATAS;         // Read data bus
+
+    reg     [3:0] addr_out_port;     // Address output ports
+    reg     [3:0] data_out_port;     // Data output ports
+
+    // Default slave signals
+    reg           sel_dft_slv;       // HSEL signal
+    wire          readyout_dft_slv;  // HREADYOUT signal
+    wire    [1:0] resp_dft_slv;      // Combinatorial HRESPS signal
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+// Default slave (accessed when HADDR is unmapped)
+//------------------------------------------------------------------------------
+
+  soclabs_4x7_AhbMatrix_default_slave u_soclabs_4x7_AhbMatrix_default_slave (
+
+    // Common AHB signals
+    .HCLK        (HCLK),
+    .HRESETn     (HRESETn),
+
+    // AHB Control signals
+    .HSEL        (sel_dft_slv),
+    .HTRANS      (trans_dec),
+    .HREADY      (HREADYS),
+    .HREADYOUT   (readyout_dft_slv),
+    .HRESP       (resp_dft_slv)
+
+    );
+
+
+//------------------------------------------------------------------------------
+// Address phase signals
+//------------------------------------------------------------------------------
+
+// The address decode is done in two stages. This is so that the address
+//  decode occurs in only one process, p_addr_out_portComb, and then the select
+//  signal is factored in.
+//
+// Note that the hexadecimal address values are reformatted to align with the
+//  lower bound of decode_addr_dec[31:10], which is not a hex character boundary
+
+  always @ (
+             decode_addr_dec or
+             remapping_dec or data_out_port or trans_dec
+           )
+    begin : p_addr_out_port_comb
+
+      // Only switch if there is an active transfer
+      if (trans_dec != 2'b00)
+      begin
+
+        case (remapping_dec)  // Composition: REMAP[0]
+          1'b0 : begin
+            // Unmoved address region 0x00000000-0x0fffffff
+            if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff))
+               addr_out_port = 4'b0000;  // Select Output port MI0
+            // Static address region 0x10000000-0x1fffffff
+            else if ((decode_addr_dec >= 22'h040000) & (decode_addr_dec <= 22'h07ffff))
+               addr_out_port = 4'b0000;  // Select Output port MI0
+
+            // Static address region 0x20000000-0x2fffffff
+            else if ((decode_addr_dec >= 22'h080000) & (decode_addr_dec <= 22'h0bffff))
+               addr_out_port = 4'b0001;  // Select Output port MI1
+
+            // Static address region 0x30000000-0x3fffffff
+            else if ((decode_addr_dec >= 22'h0c0000) & (decode_addr_dec <= 22'h0fffff))
+               addr_out_port = 4'b0010;  // Select Output port MI2
+
+            // Static address region 0x40000000-0x5fffffff
+            else if ((decode_addr_dec >= 22'h100000) & (decode_addr_dec <= 22'h17ffff))
+               addr_out_port = 4'b0011;  // Select Output port MI3
+            // Static address region 0xf0000000-0xf003ffff
+            else if ((decode_addr_dec >= 22'h3c0000) & (decode_addr_dec <= 22'h3c00ff))
+               addr_out_port = 4'b0011;  // Select Output port MI3
+
+            // Static address region 0x80000000-0x8fffffff
+            else if ((decode_addr_dec >= 22'h200000) & (decode_addr_dec <= 22'h23ffff))
+               addr_out_port = 4'b0100;  // Select Output port MI4
+
+            // Static address region 0x90000000-0x9fffffff
+            else if ((decode_addr_dec >= 22'h240000) & (decode_addr_dec <= 22'h27ffff))
+               addr_out_port = 4'b0101;  // Select Output port MI5
+
+            // Static address region 0x60000000-0x7fffffff
+            else if ((decode_addr_dec >= 22'h180000) & (decode_addr_dec <= 22'h1fffff))
+               addr_out_port = 4'b0110;  // Select Output port MI6
+            // Static address region 0xa0000000-0xdfffffff
+            else if ((decode_addr_dec >= 22'h280000) & (decode_addr_dec <= 22'h37ffff))
+               addr_out_port = 4'b0110;  // Select Output port MI6
+
+            else
+              addr_out_port = 4'b1000;   // Select the default slave
+          end
+
+          1'b1 : begin
+            // Remapped address region 0x00000000-0x0fffffff due to REMAP[0]
+            if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff))
+               addr_out_port = 4'b0001;  // Select Output port MI1
+
+            // Unmoved address region 0x00000000-0x0fffffff
+            else if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff))
+               addr_out_port = 4'b0000;  // Select Output port MI0
+            // Static address region 0x10000000-0x1fffffff
+            else if ((decode_addr_dec >= 22'h040000) & (decode_addr_dec <= 22'h07ffff))
+               addr_out_port = 4'b0000;  // Select Output port MI0
+
+            // Static address region 0x20000000-0x2fffffff
+            else if ((decode_addr_dec >= 22'h080000) & (decode_addr_dec <= 22'h0bffff))
+               addr_out_port = 4'b0001;  // Select Output port MI1
+
+            // Static address region 0x30000000-0x3fffffff
+            else if ((decode_addr_dec >= 22'h0c0000) & (decode_addr_dec <= 22'h0fffff))
+               addr_out_port = 4'b0010;  // Select Output port MI2
+
+            // Static address region 0x40000000-0x5fffffff
+            else if ((decode_addr_dec >= 22'h100000) & (decode_addr_dec <= 22'h17ffff))
+               addr_out_port = 4'b0011;  // Select Output port MI3
+            // Static address region 0xf0000000-0xf003ffff
+            else if ((decode_addr_dec >= 22'h3c0000) & (decode_addr_dec <= 22'h3c00ff))
+               addr_out_port = 4'b0011;  // Select Output port MI3
+
+            // Static address region 0x80000000-0x8fffffff
+            else if ((decode_addr_dec >= 22'h200000) & (decode_addr_dec <= 22'h23ffff))
+               addr_out_port = 4'b0100;  // Select Output port MI4
+
+            // Static address region 0x90000000-0x9fffffff
+            else if ((decode_addr_dec >= 22'h240000) & (decode_addr_dec <= 22'h27ffff))
+               addr_out_port = 4'b0101;  // Select Output port MI5
+
+            // Static address region 0x60000000-0x7fffffff
+            else if ((decode_addr_dec >= 22'h180000) & (decode_addr_dec <= 22'h1fffff))
+               addr_out_port = 4'b0110;  // Select Output port MI6
+            // Static address region 0xa0000000-0xdfffffff
+            else if ((decode_addr_dec >= 22'h280000) & (decode_addr_dec <= 22'h37ffff))
+               addr_out_port = 4'b0110;  // Select Output port MI6
+
+            else
+              addr_out_port = 4'b1000;   // Select the default slave
+          end
+
+          default : addr_out_port = {4{1'bx}};
+        endcase
+
+      end // if (trans_dec != 2'b00)
+      else
+        addr_out_port = data_out_port;   // Stay on last port if no activity
+
+    end // block: p_addr_out_port_comb
+
+  // Select signal decode
+  always @ (sel_dec or addr_out_port)
+    begin : p_sel_comb
+      sel_dec0 = 1'b0;
+      sel_dec1 = 1'b0;
+      sel_dec2 = 1'b0;
+      sel_dec3 = 1'b0;
+      sel_dec4 = 1'b0;
+      sel_dec5 = 1'b0;
+      sel_dec6 = 1'b0;
+      sel_dft_slv = 1'b0;
+
+      if (sel_dec)
+        case (addr_out_port)
+          4'b0000 : sel_dec0 = 1'b1;
+          4'b0001 : sel_dec1 = 1'b1;
+          4'b0010 : sel_dec2 = 1'b1;
+          4'b0011 : sel_dec3 = 1'b1;
+          4'b0100 : sel_dec4 = 1'b1;
+          4'b0101 : sel_dec5 = 1'b1;
+          4'b0110 : sel_dec6 = 1'b1;
+          4'b1000 : sel_dft_slv = 1'b1;    // Select the default slave
+          default : begin
+            sel_dec0 = 1'bx;
+            sel_dec1 = 1'bx;
+            sel_dec2 = 1'bx;
+            sel_dec3 = 1'bx;
+            sel_dec4 = 1'bx;
+            sel_dec5 = 1'bx;
+            sel_dec6 = 1'bx;
+            sel_dft_slv = 1'bx;
+          end
+        endcase // case(addr_out_port)
+    end // block: p_sel_comb
+
+// The decoder selects the appropriate active_dec signal depending on which
+//  output stage is required for the transfer.
+  always @ (
+             active_dec0 or
+             active_dec1 or
+             active_dec2 or
+             active_dec3 or
+             active_dec4 or
+             active_dec5 or
+             active_dec6 or
+             addr_out_port
+           )
+    begin : p_active_comb
+      case (addr_out_port)
+        4'b0000 : active_dec = active_dec0;
+        4'b0001 : active_dec = active_dec1;
+        4'b0010 : active_dec = active_dec2;
+        4'b0011 : active_dec = active_dec3;
+        4'b0100 : active_dec = active_dec4;
+        4'b0101 : active_dec = active_dec5;
+        4'b0110 : active_dec = active_dec6;
+        4'b1000 : active_dec = 1'b1;         // Select the default slave
+        default : active_dec = 1'bx;
+      endcase // case(addr_out_port)
+    end // block: p_active_comb
+
+
+//------------------------------------------------------------------------------
+// Data phase signals
+//------------------------------------------------------------------------------
+
+// The data_out_port needs to be updated when HREADY from the input stage is high.
+//  Note: HREADY must be used, not HREADYOUT, because there are occaisions
+//  (namely when the holding register gets loaded) when HREADYOUT may be low
+//  but HREADY is high, and in this case it is important that the data_out_port
+//  gets updated.
+//  When the port is inactive, the default slave is selected to prevent toggling.
+
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_data_out_port_seq
+      if (~HRESETn)
+        data_out_port <= 4'b1000;
+      else
+        if (HREADYS)
+          if (sel_dec & trans_dec[1])
+            data_out_port <= addr_out_port;
+          else
+            data_out_port <= 4'b1000;
+    end // block: p_data_out_port_seq
+
+  // HREADYOUTS output decode
+  always @ (
+             readyout_dft_slv or
+             readyout_dec0 or
+             readyout_dec1 or
+             readyout_dec2 or
+             readyout_dec3 or
+             readyout_dec4 or
+             readyout_dec5 or
+             readyout_dec6 or
+             data_out_port
+           )
+  begin : p_ready_comb
+    case (data_out_port)
+      4'b0000 : HREADYOUTS = readyout_dec0;
+      4'b0001 : HREADYOUTS = readyout_dec1;
+      4'b0010 : HREADYOUTS = readyout_dec2;
+      4'b0011 : HREADYOUTS = readyout_dec3;
+      4'b0100 : HREADYOUTS = readyout_dec4;
+      4'b0101 : HREADYOUTS = readyout_dec5;
+      4'b0110 : HREADYOUTS = readyout_dec6;
+      4'b1000 : HREADYOUTS = readyout_dft_slv;    // Select the default slave
+      default : HREADYOUTS = 1'bx;
+    endcase // case(data_out_port)
+  end // block: p_ready_comb
+
+  // HRESPS output decode
+  always @ (
+             resp_dft_slv or
+             resp_dec0 or
+             resp_dec1 or
+             resp_dec2 or
+             resp_dec3 or
+             resp_dec4 or
+             resp_dec5 or
+             resp_dec6 or
+             data_out_port
+           )
+  begin : p_resp_comb
+    case (data_out_port)
+      4'b0000 : HRESPS = resp_dec0;
+      4'b0001 : HRESPS = resp_dec1;
+      4'b0010 : HRESPS = resp_dec2;
+      4'b0011 : HRESPS = resp_dec3;
+      4'b0100 : HRESPS = resp_dec4;
+      4'b0101 : HRESPS = resp_dec5;
+      4'b0110 : HRESPS = resp_dec6;
+      4'b1000 : HRESPS = resp_dft_slv;     // Select the default slave
+      default : HRESPS = {2{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_resp_comb
+
+  // HRDATAS output decode
+  always @ (
+             rdata_dec0 or
+             rdata_dec1 or
+             rdata_dec2 or
+             rdata_dec3 or
+             rdata_dec4 or
+             rdata_dec5 or
+             rdata_dec6 or
+             data_out_port
+           )
+  begin : p_rdata_comb
+    case (data_out_port)
+      4'b0000 : HRDATAS = rdata_dec0;
+      4'b0001 : HRDATAS = rdata_dec1;
+      4'b0010 : HRDATAS = rdata_dec2;
+      4'b0011 : HRDATAS = rdata_dec3;
+      4'b0100 : HRDATAS = rdata_dec4;
+      4'b0101 : HRDATAS = rdata_dec5;
+      4'b0110 : HRDATAS = rdata_dec6;
+      4'b1000 : HRDATAS = {32{1'b0}};   // Select the default slave
+      default : HRDATAS = {32{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_rdata_comb
+
+  // HRUSERS output decode
+  always @ (
+             ruser_dec0 or
+             ruser_dec1 or
+             ruser_dec2 or
+             ruser_dec3 or
+             ruser_dec4 or
+             ruser_dec5 or
+             ruser_dec6 or
+             data_out_port
+           )
+  begin : p_ruser_comb
+    case (data_out_port)
+      4'b0000 : HRUSERS = ruser_dec0;
+      4'b0001 : HRUSERS = ruser_dec1;
+      4'b0010 : HRUSERS = ruser_dec2;
+      4'b0011 : HRUSERS = ruser_dec3;
+      4'b0100 : HRUSERS = ruser_dec4;
+      4'b0101 : HRUSERS = ruser_dec5;
+      4'b0110 : HRUSERS = ruser_dec6;
+      4'b1000 : HRUSERS = {2{1'b0}};   // Select the default slave
+      default : HRUSERS = {2{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_ruser_comb
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v
new file mode 100644
index 0000000..9e2b72d
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_cpu.v
@@ -0,0 +1,630 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+//  Abstract             : The MatrixDecode is used to determine which output
+//                         stage is required for a particular access. Addresses
+//                         that do not map to an Output port are diverted to
+//                         the local default slave.
+//
+//  Notes               : The bus matrix has full connectivity.
+//
+//-----------------------------------------------------------------------------
+
+
+`timescale 1ns/1ps
+
+
+module soclabs_4x7_MatrixDecode_cpu (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+    // Internal address remapping control
+    remapping_dec,
+
+    // Signals from the Input stage
+    HREADYS,
+    sel_dec,
+    decode_addr_dec,
+    trans_dec,
+
+    // Bus-switch output 0
+    active_dec0,
+    readyout_dec0,
+    resp_dec0,
+    rdata_dec0,
+    ruser_dec0,
+
+    // Bus-switch output 1
+    active_dec1,
+    readyout_dec1,
+    resp_dec1,
+    rdata_dec1,
+    ruser_dec1,
+
+    // Bus-switch output 2
+    active_dec2,
+    readyout_dec2,
+    resp_dec2,
+    rdata_dec2,
+    ruser_dec2,
+
+    // Bus-switch output 3
+    active_dec3,
+    readyout_dec3,
+    resp_dec3,
+    rdata_dec3,
+    ruser_dec3,
+
+    // Bus-switch output 4
+    active_dec4,
+    readyout_dec4,
+    resp_dec4,
+    rdata_dec4,
+    ruser_dec4,
+
+    // Bus-switch output 5
+    active_dec5,
+    readyout_dec5,
+    resp_dec5,
+    rdata_dec5,
+    ruser_dec5,
+
+    // Bus-switch output 6
+    active_dec6,
+    readyout_dec6,
+    resp_dec6,
+    rdata_dec6,
+    ruser_dec6,
+
+    // Output port selection signals
+    sel_dec0,
+    sel_dec1,
+    sel_dec2,
+    sel_dec3,
+    sel_dec4,
+    sel_dec5,
+    sel_dec6,
+
+    // Selected Output port data and control signals
+    active_dec,
+    HREADYOUTS,
+    HRESPS,
+    HRUSERS,
+    HRDATAS
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input         HCLK;           // AHB System Clock
+    input         HRESETn;        // AHB System Reset
+
+    // Internal address remapping control
+    input   [0:0] remapping_dec;      // Internal remap signal
+
+    // Signals from the Input stage
+    input         HREADYS;        // Transfer done
+    input         sel_dec;            // HSEL input
+    input [31:10] decode_addr_dec;     // HADDR decoder input
+    input   [1:0] trans_dec;          // Input port HTRANS signal
+
+    // Bus-switch output MI0
+    input         active_dec0;        // Output stage MI0 active_dec signal
+    input         readyout_dec0;      // HREADYOUT input
+    input   [1:0] resp_dec0;          // HRESP input
+    input  [31:0] rdata_dec0;         // HRDATA input
+    input  [1:0] ruser_dec0;         // HRUSER input
+
+    // Bus-switch output MI1
+    input         active_dec1;        // Output stage MI1 active_dec signal
+    input         readyout_dec1;      // HREADYOUT input
+    input   [1:0] resp_dec1;          // HRESP input
+    input  [31:0] rdata_dec1;         // HRDATA input
+    input  [1:0] ruser_dec1;         // HRUSER input
+
+    // Bus-switch output MI2
+    input         active_dec2;        // Output stage MI2 active_dec signal
+    input         readyout_dec2;      // HREADYOUT input
+    input   [1:0] resp_dec2;          // HRESP input
+    input  [31:0] rdata_dec2;         // HRDATA input
+    input  [1:0] ruser_dec2;         // HRUSER input
+
+    // Bus-switch output MI3
+    input         active_dec3;        // Output stage MI3 active_dec signal
+    input         readyout_dec3;      // HREADYOUT input
+    input   [1:0] resp_dec3;          // HRESP input
+    input  [31:0] rdata_dec3;         // HRDATA input
+    input  [1:0] ruser_dec3;         // HRUSER input
+
+    // Bus-switch output MI4
+    input         active_dec4;        // Output stage MI4 active_dec signal
+    input         readyout_dec4;      // HREADYOUT input
+    input   [1:0] resp_dec4;          // HRESP input
+    input  [31:0] rdata_dec4;         // HRDATA input
+    input  [1:0] ruser_dec4;         // HRUSER input
+
+    // Bus-switch output MI5
+    input         active_dec5;        // Output stage MI5 active_dec signal
+    input         readyout_dec5;      // HREADYOUT input
+    input   [1:0] resp_dec5;          // HRESP input
+    input  [31:0] rdata_dec5;         // HRDATA input
+    input  [1:0] ruser_dec5;         // HRUSER input
+
+    // Bus-switch output MI6
+    input         active_dec6;        // Output stage MI6 active_dec signal
+    input         readyout_dec6;      // HREADYOUT input
+    input   [1:0] resp_dec6;          // HRESP input
+    input  [31:0] rdata_dec6;         // HRDATA input
+    input  [1:0] ruser_dec6;         // HRUSER input
+
+    // Output port selection signals
+    output        sel_dec0;           // HSEL output
+    output        sel_dec1;           // HSEL output
+    output        sel_dec2;           // HSEL output
+    output        sel_dec3;           // HSEL output
+    output        sel_dec4;           // HSEL output
+    output        sel_dec5;           // HSEL output
+    output        sel_dec6;           // HSEL output
+
+    // Selected Output port data and control signals
+    output        active_dec;         // Combinatorial active_dec O/P
+    output        HREADYOUTS;     // HREADY feedback output
+    output  [1:0] HRESPS;         // Transfer response
+    output [1:0] HRUSERS;        // User read Data
+    output [31:0] HRDATAS;        // Read Data
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    wire          HCLK;            // AHB System Clock
+    wire          HRESETn;         // AHB System Reset
+    // Internal address remapping control
+    wire    [0:0] remapping_dec;       // Internal remap signal
+
+    // Signals from the Input stage
+    wire          HREADYS;         // Transfer done
+    wire          sel_dec;             // HSEL input
+    wire  [31:10] decode_addr_dec;      // HADDR input
+    wire    [1:0] trans_dec;           // Input port HTRANS signal
+
+    // Bus-switch output MI0
+    wire          active_dec0;         // active_dec signal
+    wire          readyout_dec0;       // HREADYOUT input
+    wire    [1:0] resp_dec0;           // HRESP input
+    wire   [31:0] rdata_dec0;          // HRDATA input
+    wire   [1:0] ruser_dec0;          // HRUSER input
+    reg           sel_dec0;            // HSEL output
+
+    // Bus-switch output MI1
+    wire          active_dec1;         // active_dec signal
+    wire          readyout_dec1;       // HREADYOUT input
+    wire    [1:0] resp_dec1;           // HRESP input
+    wire   [31:0] rdata_dec1;          // HRDATA input
+    wire   [1:0] ruser_dec1;          // HRUSER input
+    reg           sel_dec1;            // HSEL output
+
+    // Bus-switch output MI2
+    wire          active_dec2;         // active_dec signal
+    wire          readyout_dec2;       // HREADYOUT input
+    wire    [1:0] resp_dec2;           // HRESP input
+    wire   [31:0] rdata_dec2;          // HRDATA input
+    wire   [1:0] ruser_dec2;          // HRUSER input
+    reg           sel_dec2;            // HSEL output
+
+    // Bus-switch output MI3
+    wire          active_dec3;         // active_dec signal
+    wire          readyout_dec3;       // HREADYOUT input
+    wire    [1:0] resp_dec3;           // HRESP input
+    wire   [31:0] rdata_dec3;          // HRDATA input
+    wire   [1:0] ruser_dec3;          // HRUSER input
+    reg           sel_dec3;            // HSEL output
+
+    // Bus-switch output MI4
+    wire          active_dec4;         // active_dec signal
+    wire          readyout_dec4;       // HREADYOUT input
+    wire    [1:0] resp_dec4;           // HRESP input
+    wire   [31:0] rdata_dec4;          // HRDATA input
+    wire   [1:0] ruser_dec4;          // HRUSER input
+    reg           sel_dec4;            // HSEL output
+
+    // Bus-switch output MI5
+    wire          active_dec5;         // active_dec signal
+    wire          readyout_dec5;       // HREADYOUT input
+    wire    [1:0] resp_dec5;           // HRESP input
+    wire   [31:0] rdata_dec5;          // HRDATA input
+    wire   [1:0] ruser_dec5;          // HRUSER input
+    reg           sel_dec5;            // HSEL output
+
+    // Bus-switch output MI6
+    wire          active_dec6;         // active_dec signal
+    wire          readyout_dec6;       // HREADYOUT input
+    wire    [1:0] resp_dec6;           // HRESP input
+    wire   [31:0] rdata_dec6;          // HRDATA input
+    wire   [1:0] ruser_dec6;          // HRUSER input
+    reg           sel_dec6;            // HSEL output
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+
+    // Selected Output port data and control signals
+    reg           active_dec;          // Combinatorial active_dec O/P signal
+    reg           HREADYOUTS;      // Combinatorial HREADYOUT signal
+    reg     [1:0] HRESPS;          // Combinatorial HRESPS signal
+    reg    [1:0] HRUSERS;
+    reg    [31:0] HRDATAS;         // Read data bus
+
+    reg     [3:0] addr_out_port;     // Address output ports
+    reg     [3:0] data_out_port;     // Data output ports
+
+    // Default slave signals
+    reg           sel_dft_slv;       // HSEL signal
+    wire          readyout_dft_slv;  // HREADYOUT signal
+    wire    [1:0] resp_dft_slv;      // Combinatorial HRESPS signal
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+// Default slave (accessed when HADDR is unmapped)
+//------------------------------------------------------------------------------
+
+  soclabs_4x7_AhbMatrix_default_slave u_soclabs_4x7_AhbMatrix_default_slave (
+
+    // Common AHB signals
+    .HCLK        (HCLK),
+    .HRESETn     (HRESETn),
+
+    // AHB Control signals
+    .HSEL        (sel_dft_slv),
+    .HTRANS      (trans_dec),
+    .HREADY      (HREADYS),
+    .HREADYOUT   (readyout_dft_slv),
+    .HRESP       (resp_dft_slv)
+
+    );
+
+
+//------------------------------------------------------------------------------
+// Address phase signals
+//------------------------------------------------------------------------------
+
+// The address decode is done in two stages. This is so that the address
+//  decode occurs in only one process, p_addr_out_portComb, and then the select
+//  signal is factored in.
+//
+// Note that the hexadecimal address values are reformatted to align with the
+//  lower bound of decode_addr_dec[31:10], which is not a hex character boundary
+
+  always @ (
+             decode_addr_dec or
+             remapping_dec or data_out_port or trans_dec
+           )
+    begin : p_addr_out_port_comb
+
+      // Only switch if there is an active transfer
+      if (trans_dec != 2'b00)
+      begin
+
+        case (remapping_dec)  // Composition: REMAP[0]
+          1'b0 : begin
+            // Unmoved address region 0x00000000-0x0fffffff
+            if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff))
+               addr_out_port = 4'b0000;  // Select Output port MI0
+            // Static address region 0x10000000-0x1fffffff
+            else if ((decode_addr_dec >= 22'h040000) & (decode_addr_dec <= 22'h07ffff))
+               addr_out_port = 4'b0000;  // Select Output port MI0
+
+            // Static address region 0x20000000-0x2fffffff
+            else if ((decode_addr_dec >= 22'h080000) & (decode_addr_dec <= 22'h0bffff))
+               addr_out_port = 4'b0001;  // Select Output port MI1
+
+            // Static address region 0x30000000-0x3fffffff
+            else if ((decode_addr_dec >= 22'h0c0000) & (decode_addr_dec <= 22'h0fffff))
+               addr_out_port = 4'b0010;  // Select Output port MI2
+
+            // Static address region 0x40000000-0x5fffffff
+            else if ((decode_addr_dec >= 22'h100000) & (decode_addr_dec <= 22'h17ffff))
+               addr_out_port = 4'b0011;  // Select Output port MI3
+            // Static address region 0xf0000000-0xf003ffff
+            else if ((decode_addr_dec >= 22'h3c0000) & (decode_addr_dec <= 22'h3c00ff))
+               addr_out_port = 4'b0011;  // Select Output port MI3
+
+            // Static address region 0x80000000-0x8fffffff
+            else if ((decode_addr_dec >= 22'h200000) & (decode_addr_dec <= 22'h23ffff))
+               addr_out_port = 4'b0100;  // Select Output port MI4
+
+            // Static address region 0x90000000-0x9fffffff
+            else if ((decode_addr_dec >= 22'h240000) & (decode_addr_dec <= 22'h27ffff))
+               addr_out_port = 4'b0101;  // Select Output port MI5
+
+            // Static address region 0x60000000-0x7fffffff
+            else if ((decode_addr_dec >= 22'h180000) & (decode_addr_dec <= 22'h1fffff))
+               addr_out_port = 4'b0110;  // Select Output port MI6
+            // Static address region 0xa0000000-0xdfffffff
+            else if ((decode_addr_dec >= 22'h280000) & (decode_addr_dec <= 22'h37ffff))
+               addr_out_port = 4'b0110;  // Select Output port MI6
+
+            else
+              addr_out_port = 4'b1000;   // Select the default slave
+          end
+
+          1'b1 : begin
+            // Remapped address region 0x00000000-0x0fffffff due to REMAP[0]
+            if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff))
+               addr_out_port = 4'b0001;  // Select Output port MI1
+
+            // Unmoved address region 0x00000000-0x0fffffff
+            else if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff))
+               addr_out_port = 4'b0000;  // Select Output port MI0
+            // Static address region 0x10000000-0x1fffffff
+            else if ((decode_addr_dec >= 22'h040000) & (decode_addr_dec <= 22'h07ffff))
+               addr_out_port = 4'b0000;  // Select Output port MI0
+
+            // Static address region 0x20000000-0x2fffffff
+            else if ((decode_addr_dec >= 22'h080000) & (decode_addr_dec <= 22'h0bffff))
+               addr_out_port = 4'b0001;  // Select Output port MI1
+
+            // Static address region 0x30000000-0x3fffffff
+            else if ((decode_addr_dec >= 22'h0c0000) & (decode_addr_dec <= 22'h0fffff))
+               addr_out_port = 4'b0010;  // Select Output port MI2
+
+            // Static address region 0x40000000-0x5fffffff
+            else if ((decode_addr_dec >= 22'h100000) & (decode_addr_dec <= 22'h17ffff))
+               addr_out_port = 4'b0011;  // Select Output port MI3
+            // Static address region 0xf0000000-0xf003ffff
+            else if ((decode_addr_dec >= 22'h3c0000) & (decode_addr_dec <= 22'h3c00ff))
+               addr_out_port = 4'b0011;  // Select Output port MI3
+
+            // Static address region 0x80000000-0x8fffffff
+            else if ((decode_addr_dec >= 22'h200000) & (decode_addr_dec <= 22'h23ffff))
+               addr_out_port = 4'b0100;  // Select Output port MI4
+
+            // Static address region 0x90000000-0x9fffffff
+            else if ((decode_addr_dec >= 22'h240000) & (decode_addr_dec <= 22'h27ffff))
+               addr_out_port = 4'b0101;  // Select Output port MI5
+
+            // Static address region 0x60000000-0x7fffffff
+            else if ((decode_addr_dec >= 22'h180000) & (decode_addr_dec <= 22'h1fffff))
+               addr_out_port = 4'b0110;  // Select Output port MI6
+            // Static address region 0xa0000000-0xdfffffff
+            else if ((decode_addr_dec >= 22'h280000) & (decode_addr_dec <= 22'h37ffff))
+               addr_out_port = 4'b0110;  // Select Output port MI6
+
+            else
+              addr_out_port = 4'b1000;   // Select the default slave
+          end
+
+          default : addr_out_port = {4{1'bx}};
+        endcase
+
+      end // if (trans_dec != 2'b00)
+      else
+        addr_out_port = data_out_port;   // Stay on last port if no activity
+
+    end // block: p_addr_out_port_comb
+
+  // Select signal decode
+  always @ (sel_dec or addr_out_port)
+    begin : p_sel_comb
+      sel_dec0 = 1'b0;
+      sel_dec1 = 1'b0;
+      sel_dec2 = 1'b0;
+      sel_dec3 = 1'b0;
+      sel_dec4 = 1'b0;
+      sel_dec5 = 1'b0;
+      sel_dec6 = 1'b0;
+      sel_dft_slv = 1'b0;
+
+      if (sel_dec)
+        case (addr_out_port)
+          4'b0000 : sel_dec0 = 1'b1;
+          4'b0001 : sel_dec1 = 1'b1;
+          4'b0010 : sel_dec2 = 1'b1;
+          4'b0011 : sel_dec3 = 1'b1;
+          4'b0100 : sel_dec4 = 1'b1;
+          4'b0101 : sel_dec5 = 1'b1;
+          4'b0110 : sel_dec6 = 1'b1;
+          4'b1000 : sel_dft_slv = 1'b1;    // Select the default slave
+          default : begin
+            sel_dec0 = 1'bx;
+            sel_dec1 = 1'bx;
+            sel_dec2 = 1'bx;
+            sel_dec3 = 1'bx;
+            sel_dec4 = 1'bx;
+            sel_dec5 = 1'bx;
+            sel_dec6 = 1'bx;
+            sel_dft_slv = 1'bx;
+          end
+        endcase // case(addr_out_port)
+    end // block: p_sel_comb
+
+// The decoder selects the appropriate active_dec signal depending on which
+//  output stage is required for the transfer.
+  always @ (
+             active_dec0 or
+             active_dec1 or
+             active_dec2 or
+             active_dec3 or
+             active_dec4 or
+             active_dec5 or
+             active_dec6 or
+             addr_out_port
+           )
+    begin : p_active_comb
+      case (addr_out_port)
+        4'b0000 : active_dec = active_dec0;
+        4'b0001 : active_dec = active_dec1;
+        4'b0010 : active_dec = active_dec2;
+        4'b0011 : active_dec = active_dec3;
+        4'b0100 : active_dec = active_dec4;
+        4'b0101 : active_dec = active_dec5;
+        4'b0110 : active_dec = active_dec6;
+        4'b1000 : active_dec = 1'b1;         // Select the default slave
+        default : active_dec = 1'bx;
+      endcase // case(addr_out_port)
+    end // block: p_active_comb
+
+
+//------------------------------------------------------------------------------
+// Data phase signals
+//------------------------------------------------------------------------------
+
+// The data_out_port needs to be updated when HREADY from the input stage is high.
+//  Note: HREADY must be used, not HREADYOUT, because there are occaisions
+//  (namely when the holding register gets loaded) when HREADYOUT may be low
+//  but HREADY is high, and in this case it is important that the data_out_port
+//  gets updated.
+//  When the port is inactive, the default slave is selected to prevent toggling.
+
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_data_out_port_seq
+      if (~HRESETn)
+        data_out_port <= 4'b1000;
+      else
+        if (HREADYS)
+          if (sel_dec & trans_dec[1])
+            data_out_port <= addr_out_port;
+          else
+            data_out_port <= 4'b1000;
+    end // block: p_data_out_port_seq
+
+  // HREADYOUTS output decode
+  always @ (
+             readyout_dft_slv or
+             readyout_dec0 or
+             readyout_dec1 or
+             readyout_dec2 or
+             readyout_dec3 or
+             readyout_dec4 or
+             readyout_dec5 or
+             readyout_dec6 or
+             data_out_port
+           )
+  begin : p_ready_comb
+    case (data_out_port)
+      4'b0000 : HREADYOUTS = readyout_dec0;
+      4'b0001 : HREADYOUTS = readyout_dec1;
+      4'b0010 : HREADYOUTS = readyout_dec2;
+      4'b0011 : HREADYOUTS = readyout_dec3;
+      4'b0100 : HREADYOUTS = readyout_dec4;
+      4'b0101 : HREADYOUTS = readyout_dec5;
+      4'b0110 : HREADYOUTS = readyout_dec6;
+      4'b1000 : HREADYOUTS = readyout_dft_slv;    // Select the default slave
+      default : HREADYOUTS = 1'bx;
+    endcase // case(data_out_port)
+  end // block: p_ready_comb
+
+  // HRESPS output decode
+  always @ (
+             resp_dft_slv or
+             resp_dec0 or
+             resp_dec1 or
+             resp_dec2 or
+             resp_dec3 or
+             resp_dec4 or
+             resp_dec5 or
+             resp_dec6 or
+             data_out_port
+           )
+  begin : p_resp_comb
+    case (data_out_port)
+      4'b0000 : HRESPS = resp_dec0;
+      4'b0001 : HRESPS = resp_dec1;
+      4'b0010 : HRESPS = resp_dec2;
+      4'b0011 : HRESPS = resp_dec3;
+      4'b0100 : HRESPS = resp_dec4;
+      4'b0101 : HRESPS = resp_dec5;
+      4'b0110 : HRESPS = resp_dec6;
+      4'b1000 : HRESPS = resp_dft_slv;     // Select the default slave
+      default : HRESPS = {2{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_resp_comb
+
+  // HRDATAS output decode
+  always @ (
+             rdata_dec0 or
+             rdata_dec1 or
+             rdata_dec2 or
+             rdata_dec3 or
+             rdata_dec4 or
+             rdata_dec5 or
+             rdata_dec6 or
+             data_out_port
+           )
+  begin : p_rdata_comb
+    case (data_out_port)
+      4'b0000 : HRDATAS = rdata_dec0;
+      4'b0001 : HRDATAS = rdata_dec1;
+      4'b0010 : HRDATAS = rdata_dec2;
+      4'b0011 : HRDATAS = rdata_dec3;
+      4'b0100 : HRDATAS = rdata_dec4;
+      4'b0101 : HRDATAS = rdata_dec5;
+      4'b0110 : HRDATAS = rdata_dec6;
+      4'b1000 : HRDATAS = {32{1'b0}};   // Select the default slave
+      default : HRDATAS = {32{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_rdata_comb
+
+  // HRUSERS output decode
+  always @ (
+             ruser_dec0 or
+             ruser_dec1 or
+             ruser_dec2 or
+             ruser_dec3 or
+             ruser_dec4 or
+             ruser_dec5 or
+             ruser_dec6 or
+             data_out_port
+           )
+  begin : p_ruser_comb
+    case (data_out_port)
+      4'b0000 : HRUSERS = ruser_dec0;
+      4'b0001 : HRUSERS = ruser_dec1;
+      4'b0010 : HRUSERS = ruser_dec2;
+      4'b0011 : HRUSERS = ruser_dec3;
+      4'b0100 : HRUSERS = ruser_dec4;
+      4'b0101 : HRUSERS = ruser_dec5;
+      4'b0110 : HRUSERS = ruser_dec6;
+      4'b1000 : HRUSERS = {2{1'b0}};   // Select the default slave
+      default : HRUSERS = {2{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_ruser_comb
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v
new file mode 100644
index 0000000..30b9ada
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma.v
@@ -0,0 +1,566 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+//  Abstract             : The MatrixDecode is used to determine which output
+//                         stage is required for a particular access. Addresses
+//                         that do not map to an Output port are diverted to
+//                         the local default slave.
+//
+//  Notes               : The bus matrix has full connectivity.
+//
+//-----------------------------------------------------------------------------
+
+
+`timescale 1ns/1ps
+
+
+module soclabs_4x7_MatrixDecode_dma (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+    // Signals from the Input stage
+    HREADYS,
+    sel_dec,
+    decode_addr_dec,
+    trans_dec,
+
+    // Bus-switch output 0
+    active_dec0,
+    readyout_dec0,
+    resp_dec0,
+    rdata_dec0,
+    ruser_dec0,
+
+    // Bus-switch output 1
+    active_dec1,
+    readyout_dec1,
+    resp_dec1,
+    rdata_dec1,
+    ruser_dec1,
+
+    // Bus-switch output 2
+    active_dec2,
+    readyout_dec2,
+    resp_dec2,
+    rdata_dec2,
+    ruser_dec2,
+
+    // Bus-switch output 3
+    active_dec3,
+    readyout_dec3,
+    resp_dec3,
+    rdata_dec3,
+    ruser_dec3,
+
+    // Bus-switch output 4
+    active_dec4,
+    readyout_dec4,
+    resp_dec4,
+    rdata_dec4,
+    ruser_dec4,
+
+    // Bus-switch output 5
+    active_dec5,
+    readyout_dec5,
+    resp_dec5,
+    rdata_dec5,
+    ruser_dec5,
+
+    // Bus-switch output 6
+    active_dec6,
+    readyout_dec6,
+    resp_dec6,
+    rdata_dec6,
+    ruser_dec6,
+
+    // Output port selection signals
+    sel_dec0,
+    sel_dec1,
+    sel_dec2,
+    sel_dec3,
+    sel_dec4,
+    sel_dec5,
+    sel_dec6,
+
+    // Selected Output port data and control signals
+    active_dec,
+    HREADYOUTS,
+    HRESPS,
+    HRUSERS,
+    HRDATAS
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input         HCLK;           // AHB System Clock
+    input         HRESETn;        // AHB System Reset
+
+    // Signals from the Input stage
+    input         HREADYS;        // Transfer done
+    input         sel_dec;            // HSEL input
+    input [31:10] decode_addr_dec;     // HADDR decoder input
+    input   [1:0] trans_dec;          // Input port HTRANS signal
+
+    // Bus-switch output MI0
+    input         active_dec0;        // Output stage MI0 active_dec signal
+    input         readyout_dec0;      // HREADYOUT input
+    input   [1:0] resp_dec0;          // HRESP input
+    input  [31:0] rdata_dec0;         // HRDATA input
+    input  [1:0] ruser_dec0;         // HRUSER input
+
+    // Bus-switch output MI1
+    input         active_dec1;        // Output stage MI1 active_dec signal
+    input         readyout_dec1;      // HREADYOUT input
+    input   [1:0] resp_dec1;          // HRESP input
+    input  [31:0] rdata_dec1;         // HRDATA input
+    input  [1:0] ruser_dec1;         // HRUSER input
+
+    // Bus-switch output MI2
+    input         active_dec2;        // Output stage MI2 active_dec signal
+    input         readyout_dec2;      // HREADYOUT input
+    input   [1:0] resp_dec2;          // HRESP input
+    input  [31:0] rdata_dec2;         // HRDATA input
+    input  [1:0] ruser_dec2;         // HRUSER input
+
+    // Bus-switch output MI3
+    input         active_dec3;        // Output stage MI3 active_dec signal
+    input         readyout_dec3;      // HREADYOUT input
+    input   [1:0] resp_dec3;          // HRESP input
+    input  [31:0] rdata_dec3;         // HRDATA input
+    input  [1:0] ruser_dec3;         // HRUSER input
+
+    // Bus-switch output MI4
+    input         active_dec4;        // Output stage MI4 active_dec signal
+    input         readyout_dec4;      // HREADYOUT input
+    input   [1:0] resp_dec4;          // HRESP input
+    input  [31:0] rdata_dec4;         // HRDATA input
+    input  [1:0] ruser_dec4;         // HRUSER input
+
+    // Bus-switch output MI5
+    input         active_dec5;        // Output stage MI5 active_dec signal
+    input         readyout_dec5;      // HREADYOUT input
+    input   [1:0] resp_dec5;          // HRESP input
+    input  [31:0] rdata_dec5;         // HRDATA input
+    input  [1:0] ruser_dec5;         // HRUSER input
+
+    // Bus-switch output MI6
+    input         active_dec6;        // Output stage MI6 active_dec signal
+    input         readyout_dec6;      // HREADYOUT input
+    input   [1:0] resp_dec6;          // HRESP input
+    input  [31:0] rdata_dec6;         // HRDATA input
+    input  [1:0] ruser_dec6;         // HRUSER input
+
+    // Output port selection signals
+    output        sel_dec0;           // HSEL output
+    output        sel_dec1;           // HSEL output
+    output        sel_dec2;           // HSEL output
+    output        sel_dec3;           // HSEL output
+    output        sel_dec4;           // HSEL output
+    output        sel_dec5;           // HSEL output
+    output        sel_dec6;           // HSEL output
+
+    // Selected Output port data and control signals
+    output        active_dec;         // Combinatorial active_dec O/P
+    output        HREADYOUTS;     // HREADY feedback output
+    output  [1:0] HRESPS;         // Transfer response
+    output [1:0] HRUSERS;        // User read Data
+    output [31:0] HRDATAS;        // Read Data
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    wire          HCLK;            // AHB System Clock
+    wire          HRESETn;         // AHB System Reset
+
+    // Signals from the Input stage
+    wire          HREADYS;         // Transfer done
+    wire          sel_dec;             // HSEL input
+    wire  [31:10] decode_addr_dec;      // HADDR input
+    wire    [1:0] trans_dec;           // Input port HTRANS signal
+
+    // Bus-switch output MI0
+    wire          active_dec0;         // active_dec signal
+    wire          readyout_dec0;       // HREADYOUT input
+    wire    [1:0] resp_dec0;           // HRESP input
+    wire   [31:0] rdata_dec0;          // HRDATA input
+    wire   [1:0] ruser_dec0;          // HRUSER input
+    reg           sel_dec0;            // HSEL output
+
+    // Bus-switch output MI1
+    wire          active_dec1;         // active_dec signal
+    wire          readyout_dec1;       // HREADYOUT input
+    wire    [1:0] resp_dec1;           // HRESP input
+    wire   [31:0] rdata_dec1;          // HRDATA input
+    wire   [1:0] ruser_dec1;          // HRUSER input
+    reg           sel_dec1;            // HSEL output
+
+    // Bus-switch output MI2
+    wire          active_dec2;         // active_dec signal
+    wire          readyout_dec2;       // HREADYOUT input
+    wire    [1:0] resp_dec2;           // HRESP input
+    wire   [31:0] rdata_dec2;          // HRDATA input
+    wire   [1:0] ruser_dec2;          // HRUSER input
+    reg           sel_dec2;            // HSEL output
+
+    // Bus-switch output MI3
+    wire          active_dec3;         // active_dec signal
+    wire          readyout_dec3;       // HREADYOUT input
+    wire    [1:0] resp_dec3;           // HRESP input
+    wire   [31:0] rdata_dec3;          // HRDATA input
+    wire   [1:0] ruser_dec3;          // HRUSER input
+    reg           sel_dec3;            // HSEL output
+
+    // Bus-switch output MI4
+    wire          active_dec4;         // active_dec signal
+    wire          readyout_dec4;       // HREADYOUT input
+    wire    [1:0] resp_dec4;           // HRESP input
+    wire   [31:0] rdata_dec4;          // HRDATA input
+    wire   [1:0] ruser_dec4;          // HRUSER input
+    reg           sel_dec4;            // HSEL output
+
+    // Bus-switch output MI5
+    wire          active_dec5;         // active_dec signal
+    wire          readyout_dec5;       // HREADYOUT input
+    wire    [1:0] resp_dec5;           // HRESP input
+    wire   [31:0] rdata_dec5;          // HRDATA input
+    wire   [1:0] ruser_dec5;          // HRUSER input
+    reg           sel_dec5;            // HSEL output
+
+    // Bus-switch output MI6
+    wire          active_dec6;         // active_dec signal
+    wire          readyout_dec6;       // HREADYOUT input
+    wire    [1:0] resp_dec6;           // HRESP input
+    wire   [31:0] rdata_dec6;          // HRDATA input
+    wire   [1:0] ruser_dec6;          // HRUSER input
+    reg           sel_dec6;            // HSEL output
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+
+    // Selected Output port data and control signals
+    reg           active_dec;          // Combinatorial active_dec O/P signal
+    reg           HREADYOUTS;      // Combinatorial HREADYOUT signal
+    reg     [1:0] HRESPS;          // Combinatorial HRESPS signal
+    reg    [1:0] HRUSERS;
+    reg    [31:0] HRDATAS;         // Read data bus
+
+    reg     [3:0] addr_out_port;     // Address output ports
+    reg     [3:0] data_out_port;     // Data output ports
+
+    // Default slave signals
+    reg           sel_dft_slv;       // HSEL signal
+    wire          readyout_dft_slv;  // HREADYOUT signal
+    wire    [1:0] resp_dft_slv;      // Combinatorial HRESPS signal
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+// Default slave (accessed when HADDR is unmapped)
+//------------------------------------------------------------------------------
+
+  soclabs_4x7_AhbMatrix_default_slave u_soclabs_4x7_AhbMatrix_default_slave (
+
+    // Common AHB signals
+    .HCLK        (HCLK),
+    .HRESETn     (HRESETn),
+
+    // AHB Control signals
+    .HSEL        (sel_dft_slv),
+    .HTRANS      (trans_dec),
+    .HREADY      (HREADYS),
+    .HREADYOUT   (readyout_dft_slv),
+    .HRESP       (resp_dft_slv)
+
+    );
+
+
+//------------------------------------------------------------------------------
+// Address phase signals
+//------------------------------------------------------------------------------
+
+// The address decode is done in two stages. This is so that the address
+//  decode occurs in only one process, p_addr_out_portComb, and then the select
+//  signal is factored in.
+//
+// Note that the hexadecimal address values are reformatted to align with the
+//  lower bound of decode_addr_dec[31:10], which is not a hex character boundary
+
+  always @ (
+             decode_addr_dec or data_out_port or trans_dec
+           )
+    begin : p_addr_out_port_comb
+
+      // Only switch if there is an active transfer
+      if (trans_dec != 2'b00)
+      begin
+
+        // Address region 0x10000000-0x1fffffff
+        if ((decode_addr_dec >= 22'h040000) & (decode_addr_dec <= 22'h07ffff))
+          addr_out_port = 4'b0000;  // Select Output port MI0
+
+        // Address region 0x00000000-0x0fffffff
+        else if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff))
+          addr_out_port = 4'b0001;  // Select Output port MI1
+        // Address region 0x20000000-0x2fffffff
+        else if ((decode_addr_dec >= 22'h080000) & (decode_addr_dec <= 22'h0bffff))
+          addr_out_port = 4'b0001;  // Select Output port MI1
+
+        // Address region 0x30000000-0x3fffffff
+        else if ((decode_addr_dec >= 22'h0c0000) & (decode_addr_dec <= 22'h0fffff))
+          addr_out_port = 4'b0010;  // Select Output port MI2
+
+        // Address region 0x40000000-0x5fffffff
+        else if ((decode_addr_dec >= 22'h100000) & (decode_addr_dec <= 22'h17ffff))
+          addr_out_port = 4'b0011;  // Select Output port MI3
+
+        // Address region 0x80000000-0x8fffffff
+        else if ((decode_addr_dec >= 22'h200000) & (decode_addr_dec <= 22'h23ffff))
+          addr_out_port = 4'b0100;  // Select Output port MI4
+
+        // Address region 0x90000000-0x9fffffff
+        else if ((decode_addr_dec >= 22'h240000) & (decode_addr_dec <= 22'h27ffff))
+          addr_out_port = 4'b0101;  // Select Output port MI5
+
+        // Address region 0x60000000-0x7fffffff
+        else if ((decode_addr_dec >= 22'h180000) & (decode_addr_dec <= 22'h1fffff))
+          addr_out_port = 4'b0110;  // Select Output port MI6
+        // Address region 0xa0000000-0xdfffffff
+        else if ((decode_addr_dec >= 22'h280000) & (decode_addr_dec <= 22'h37ffff))
+          addr_out_port = 4'b0110;  // Select Output port MI6
+
+        else
+          addr_out_port = 4'b1000;   // Select the default slave
+
+      end // if (trans_dec != 2'b00)
+      else
+        addr_out_port = data_out_port;   // Stay on last port if no activity
+
+    end // block: p_addr_out_port_comb
+
+  // Select signal decode
+  always @ (sel_dec or addr_out_port)
+    begin : p_sel_comb
+      sel_dec0 = 1'b0;
+      sel_dec1 = 1'b0;
+      sel_dec2 = 1'b0;
+      sel_dec3 = 1'b0;
+      sel_dec4 = 1'b0;
+      sel_dec5 = 1'b0;
+      sel_dec6 = 1'b0;
+      sel_dft_slv = 1'b0;
+
+      if (sel_dec)
+        case (addr_out_port)
+          4'b0000 : sel_dec0 = 1'b1;
+          4'b0001 : sel_dec1 = 1'b1;
+          4'b0010 : sel_dec2 = 1'b1;
+          4'b0011 : sel_dec3 = 1'b1;
+          4'b0100 : sel_dec4 = 1'b1;
+          4'b0101 : sel_dec5 = 1'b1;
+          4'b0110 : sel_dec6 = 1'b1;
+          4'b1000 : sel_dft_slv = 1'b1;    // Select the default slave
+          default : begin
+            sel_dec0 = 1'bx;
+            sel_dec1 = 1'bx;
+            sel_dec2 = 1'bx;
+            sel_dec3 = 1'bx;
+            sel_dec4 = 1'bx;
+            sel_dec5 = 1'bx;
+            sel_dec6 = 1'bx;
+            sel_dft_slv = 1'bx;
+          end
+        endcase // case(addr_out_port)
+    end // block: p_sel_comb
+
+// The decoder selects the appropriate active_dec signal depending on which
+//  output stage is required for the transfer.
+  always @ (
+             active_dec0 or
+             active_dec1 or
+             active_dec2 or
+             active_dec3 or
+             active_dec4 or
+             active_dec5 or
+             active_dec6 or
+             addr_out_port
+           )
+    begin : p_active_comb
+      case (addr_out_port)
+        4'b0000 : active_dec = active_dec0;
+        4'b0001 : active_dec = active_dec1;
+        4'b0010 : active_dec = active_dec2;
+        4'b0011 : active_dec = active_dec3;
+        4'b0100 : active_dec = active_dec4;
+        4'b0101 : active_dec = active_dec5;
+        4'b0110 : active_dec = active_dec6;
+        4'b1000 : active_dec = 1'b1;         // Select the default slave
+        default : active_dec = 1'bx;
+      endcase // case(addr_out_port)
+    end // block: p_active_comb
+
+
+//------------------------------------------------------------------------------
+// Data phase signals
+//------------------------------------------------------------------------------
+
+// The data_out_port needs to be updated when HREADY from the input stage is high.
+//  Note: HREADY must be used, not HREADYOUT, because there are occaisions
+//  (namely when the holding register gets loaded) when HREADYOUT may be low
+//  but HREADY is high, and in this case it is important that the data_out_port
+//  gets updated.
+//  When the port is inactive, the default slave is selected to prevent toggling.
+
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_data_out_port_seq
+      if (~HRESETn)
+        data_out_port <= 4'b1000;
+      else
+        if (HREADYS)
+          if (sel_dec & trans_dec[1])
+            data_out_port <= addr_out_port;
+          else
+            data_out_port <= 4'b1000;
+    end // block: p_data_out_port_seq
+
+  // HREADYOUTS output decode
+  always @ (
+             readyout_dft_slv or
+             readyout_dec0 or
+             readyout_dec1 or
+             readyout_dec2 or
+             readyout_dec3 or
+             readyout_dec4 or
+             readyout_dec5 or
+             readyout_dec6 or
+             data_out_port
+           )
+  begin : p_ready_comb
+    case (data_out_port)
+      4'b0000 : HREADYOUTS = readyout_dec0;
+      4'b0001 : HREADYOUTS = readyout_dec1;
+      4'b0010 : HREADYOUTS = readyout_dec2;
+      4'b0011 : HREADYOUTS = readyout_dec3;
+      4'b0100 : HREADYOUTS = readyout_dec4;
+      4'b0101 : HREADYOUTS = readyout_dec5;
+      4'b0110 : HREADYOUTS = readyout_dec6;
+      4'b1000 : HREADYOUTS = readyout_dft_slv;    // Select the default slave
+      default : HREADYOUTS = 1'bx;
+    endcase // case(data_out_port)
+  end // block: p_ready_comb
+
+  // HRESPS output decode
+  always @ (
+             resp_dft_slv or
+             resp_dec0 or
+             resp_dec1 or
+             resp_dec2 or
+             resp_dec3 or
+             resp_dec4 or
+             resp_dec5 or
+             resp_dec6 or
+             data_out_port
+           )
+  begin : p_resp_comb
+    case (data_out_port)
+      4'b0000 : HRESPS = resp_dec0;
+      4'b0001 : HRESPS = resp_dec1;
+      4'b0010 : HRESPS = resp_dec2;
+      4'b0011 : HRESPS = resp_dec3;
+      4'b0100 : HRESPS = resp_dec4;
+      4'b0101 : HRESPS = resp_dec5;
+      4'b0110 : HRESPS = resp_dec6;
+      4'b1000 : HRESPS = resp_dft_slv;     // Select the default slave
+      default : HRESPS = {2{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_resp_comb
+
+  // HRDATAS output decode
+  always @ (
+             rdata_dec0 or
+             rdata_dec1 or
+             rdata_dec2 or
+             rdata_dec3 or
+             rdata_dec4 or
+             rdata_dec5 or
+             rdata_dec6 or
+             data_out_port
+           )
+  begin : p_rdata_comb
+    case (data_out_port)
+      4'b0000 : HRDATAS = rdata_dec0;
+      4'b0001 : HRDATAS = rdata_dec1;
+      4'b0010 : HRDATAS = rdata_dec2;
+      4'b0011 : HRDATAS = rdata_dec3;
+      4'b0100 : HRDATAS = rdata_dec4;
+      4'b0101 : HRDATAS = rdata_dec5;
+      4'b0110 : HRDATAS = rdata_dec6;
+      4'b1000 : HRDATAS = {32{1'b0}};   // Select the default slave
+      default : HRDATAS = {32{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_rdata_comb
+
+  // HRUSERS output decode
+  always @ (
+             ruser_dec0 or
+             ruser_dec1 or
+             ruser_dec2 or
+             ruser_dec3 or
+             ruser_dec4 or
+             ruser_dec5 or
+             ruser_dec6 or
+             data_out_port
+           )
+  begin : p_ruser_comb
+    case (data_out_port)
+      4'b0000 : HRUSERS = ruser_dec0;
+      4'b0001 : HRUSERS = ruser_dec1;
+      4'b0010 : HRUSERS = ruser_dec2;
+      4'b0011 : HRUSERS = ruser_dec3;
+      4'b0100 : HRUSERS = ruser_dec4;
+      4'b0101 : HRUSERS = ruser_dec5;
+      4'b0110 : HRUSERS = ruser_dec6;
+      4'b1000 : HRUSERS = {2{1'b0}};   // Select the default slave
+      default : HRUSERS = {2{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_ruser_comb
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v
new file mode 100644
index 0000000..d80c280
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_MatrixDecode_dma2.v
@@ -0,0 +1,566 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+//  Abstract             : The MatrixDecode is used to determine which output
+//                         stage is required for a particular access. Addresses
+//                         that do not map to an Output port are diverted to
+//                         the local default slave.
+//
+//  Notes               : The bus matrix has full connectivity.
+//
+//-----------------------------------------------------------------------------
+
+
+`timescale 1ns/1ps
+
+
+module soclabs_4x7_MatrixDecode_dma2 (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+    // Signals from the Input stage
+    HREADYS,
+    sel_dec,
+    decode_addr_dec,
+    trans_dec,
+
+    // Bus-switch output 0
+    active_dec0,
+    readyout_dec0,
+    resp_dec0,
+    rdata_dec0,
+    ruser_dec0,
+
+    // Bus-switch output 1
+    active_dec1,
+    readyout_dec1,
+    resp_dec1,
+    rdata_dec1,
+    ruser_dec1,
+
+    // Bus-switch output 2
+    active_dec2,
+    readyout_dec2,
+    resp_dec2,
+    rdata_dec2,
+    ruser_dec2,
+
+    // Bus-switch output 3
+    active_dec3,
+    readyout_dec3,
+    resp_dec3,
+    rdata_dec3,
+    ruser_dec3,
+
+    // Bus-switch output 4
+    active_dec4,
+    readyout_dec4,
+    resp_dec4,
+    rdata_dec4,
+    ruser_dec4,
+
+    // Bus-switch output 5
+    active_dec5,
+    readyout_dec5,
+    resp_dec5,
+    rdata_dec5,
+    ruser_dec5,
+
+    // Bus-switch output 6
+    active_dec6,
+    readyout_dec6,
+    resp_dec6,
+    rdata_dec6,
+    ruser_dec6,
+
+    // Output port selection signals
+    sel_dec0,
+    sel_dec1,
+    sel_dec2,
+    sel_dec3,
+    sel_dec4,
+    sel_dec5,
+    sel_dec6,
+
+    // Selected Output port data and control signals
+    active_dec,
+    HREADYOUTS,
+    HRESPS,
+    HRUSERS,
+    HRDATAS
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input         HCLK;           // AHB System Clock
+    input         HRESETn;        // AHB System Reset
+
+    // Signals from the Input stage
+    input         HREADYS;        // Transfer done
+    input         sel_dec;            // HSEL input
+    input [31:10] decode_addr_dec;     // HADDR decoder input
+    input   [1:0] trans_dec;          // Input port HTRANS signal
+
+    // Bus-switch output MI0
+    input         active_dec0;        // Output stage MI0 active_dec signal
+    input         readyout_dec0;      // HREADYOUT input
+    input   [1:0] resp_dec0;          // HRESP input
+    input  [31:0] rdata_dec0;         // HRDATA input
+    input  [1:0] ruser_dec0;         // HRUSER input
+
+    // Bus-switch output MI1
+    input         active_dec1;        // Output stage MI1 active_dec signal
+    input         readyout_dec1;      // HREADYOUT input
+    input   [1:0] resp_dec1;          // HRESP input
+    input  [31:0] rdata_dec1;         // HRDATA input
+    input  [1:0] ruser_dec1;         // HRUSER input
+
+    // Bus-switch output MI2
+    input         active_dec2;        // Output stage MI2 active_dec signal
+    input         readyout_dec2;      // HREADYOUT input
+    input   [1:0] resp_dec2;          // HRESP input
+    input  [31:0] rdata_dec2;         // HRDATA input
+    input  [1:0] ruser_dec2;         // HRUSER input
+
+    // Bus-switch output MI3
+    input         active_dec3;        // Output stage MI3 active_dec signal
+    input         readyout_dec3;      // HREADYOUT input
+    input   [1:0] resp_dec3;          // HRESP input
+    input  [31:0] rdata_dec3;         // HRDATA input
+    input  [1:0] ruser_dec3;         // HRUSER input
+
+    // Bus-switch output MI4
+    input         active_dec4;        // Output stage MI4 active_dec signal
+    input         readyout_dec4;      // HREADYOUT input
+    input   [1:0] resp_dec4;          // HRESP input
+    input  [31:0] rdata_dec4;         // HRDATA input
+    input  [1:0] ruser_dec4;         // HRUSER input
+
+    // Bus-switch output MI5
+    input         active_dec5;        // Output stage MI5 active_dec signal
+    input         readyout_dec5;      // HREADYOUT input
+    input   [1:0] resp_dec5;          // HRESP input
+    input  [31:0] rdata_dec5;         // HRDATA input
+    input  [1:0] ruser_dec5;         // HRUSER input
+
+    // Bus-switch output MI6
+    input         active_dec6;        // Output stage MI6 active_dec signal
+    input         readyout_dec6;      // HREADYOUT input
+    input   [1:0] resp_dec6;          // HRESP input
+    input  [31:0] rdata_dec6;         // HRDATA input
+    input  [1:0] ruser_dec6;         // HRUSER input
+
+    // Output port selection signals
+    output        sel_dec0;           // HSEL output
+    output        sel_dec1;           // HSEL output
+    output        sel_dec2;           // HSEL output
+    output        sel_dec3;           // HSEL output
+    output        sel_dec4;           // HSEL output
+    output        sel_dec5;           // HSEL output
+    output        sel_dec6;           // HSEL output
+
+    // Selected Output port data and control signals
+    output        active_dec;         // Combinatorial active_dec O/P
+    output        HREADYOUTS;     // HREADY feedback output
+    output  [1:0] HRESPS;         // Transfer response
+    output [1:0] HRUSERS;        // User read Data
+    output [31:0] HRDATAS;        // Read Data
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    wire          HCLK;            // AHB System Clock
+    wire          HRESETn;         // AHB System Reset
+
+    // Signals from the Input stage
+    wire          HREADYS;         // Transfer done
+    wire          sel_dec;             // HSEL input
+    wire  [31:10] decode_addr_dec;      // HADDR input
+    wire    [1:0] trans_dec;           // Input port HTRANS signal
+
+    // Bus-switch output MI0
+    wire          active_dec0;         // active_dec signal
+    wire          readyout_dec0;       // HREADYOUT input
+    wire    [1:0] resp_dec0;           // HRESP input
+    wire   [31:0] rdata_dec0;          // HRDATA input
+    wire   [1:0] ruser_dec0;          // HRUSER input
+    reg           sel_dec0;            // HSEL output
+
+    // Bus-switch output MI1
+    wire          active_dec1;         // active_dec signal
+    wire          readyout_dec1;       // HREADYOUT input
+    wire    [1:0] resp_dec1;           // HRESP input
+    wire   [31:0] rdata_dec1;          // HRDATA input
+    wire   [1:0] ruser_dec1;          // HRUSER input
+    reg           sel_dec1;            // HSEL output
+
+    // Bus-switch output MI2
+    wire          active_dec2;         // active_dec signal
+    wire          readyout_dec2;       // HREADYOUT input
+    wire    [1:0] resp_dec2;           // HRESP input
+    wire   [31:0] rdata_dec2;          // HRDATA input
+    wire   [1:0] ruser_dec2;          // HRUSER input
+    reg           sel_dec2;            // HSEL output
+
+    // Bus-switch output MI3
+    wire          active_dec3;         // active_dec signal
+    wire          readyout_dec3;       // HREADYOUT input
+    wire    [1:0] resp_dec3;           // HRESP input
+    wire   [31:0] rdata_dec3;          // HRDATA input
+    wire   [1:0] ruser_dec3;          // HRUSER input
+    reg           sel_dec3;            // HSEL output
+
+    // Bus-switch output MI4
+    wire          active_dec4;         // active_dec signal
+    wire          readyout_dec4;       // HREADYOUT input
+    wire    [1:0] resp_dec4;           // HRESP input
+    wire   [31:0] rdata_dec4;          // HRDATA input
+    wire   [1:0] ruser_dec4;          // HRUSER input
+    reg           sel_dec4;            // HSEL output
+
+    // Bus-switch output MI5
+    wire          active_dec5;         // active_dec signal
+    wire          readyout_dec5;       // HREADYOUT input
+    wire    [1:0] resp_dec5;           // HRESP input
+    wire   [31:0] rdata_dec5;          // HRDATA input
+    wire   [1:0] ruser_dec5;          // HRUSER input
+    reg           sel_dec5;            // HSEL output
+
+    // Bus-switch output MI6
+    wire          active_dec6;         // active_dec signal
+    wire          readyout_dec6;       // HREADYOUT input
+    wire    [1:0] resp_dec6;           // HRESP input
+    wire   [31:0] rdata_dec6;          // HRDATA input
+    wire   [1:0] ruser_dec6;          // HRUSER input
+    reg           sel_dec6;            // HSEL output
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+
+    // Selected Output port data and control signals
+    reg           active_dec;          // Combinatorial active_dec O/P signal
+    reg           HREADYOUTS;      // Combinatorial HREADYOUT signal
+    reg     [1:0] HRESPS;          // Combinatorial HRESPS signal
+    reg    [1:0] HRUSERS;
+    reg    [31:0] HRDATAS;         // Read data bus
+
+    reg     [3:0] addr_out_port;     // Address output ports
+    reg     [3:0] data_out_port;     // Data output ports
+
+    // Default slave signals
+    reg           sel_dft_slv;       // HSEL signal
+    wire          readyout_dft_slv;  // HREADYOUT signal
+    wire    [1:0] resp_dft_slv;      // Combinatorial HRESPS signal
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+// Default slave (accessed when HADDR is unmapped)
+//------------------------------------------------------------------------------
+
+  soclabs_4x7_AhbMatrix_default_slave u_soclabs_4x7_AhbMatrix_default_slave (
+
+    // Common AHB signals
+    .HCLK        (HCLK),
+    .HRESETn     (HRESETn),
+
+    // AHB Control signals
+    .HSEL        (sel_dft_slv),
+    .HTRANS      (trans_dec),
+    .HREADY      (HREADYS),
+    .HREADYOUT   (readyout_dft_slv),
+    .HRESP       (resp_dft_slv)
+
+    );
+
+
+//------------------------------------------------------------------------------
+// Address phase signals
+//------------------------------------------------------------------------------
+
+// The address decode is done in two stages. This is so that the address
+//  decode occurs in only one process, p_addr_out_portComb, and then the select
+//  signal is factored in.
+//
+// Note that the hexadecimal address values are reformatted to align with the
+//  lower bound of decode_addr_dec[31:10], which is not a hex character boundary
+
+  always @ (
+             decode_addr_dec or data_out_port or trans_dec
+           )
+    begin : p_addr_out_port_comb
+
+      // Only switch if there is an active transfer
+      if (trans_dec != 2'b00)
+      begin
+
+        // Address region 0x10000000-0x1fffffff
+        if ((decode_addr_dec >= 22'h040000) & (decode_addr_dec <= 22'h07ffff))
+          addr_out_port = 4'b0000;  // Select Output port MI0
+
+        // Address region 0x00000000-0x0fffffff
+        else if ((decode_addr_dec >= 22'h000000) & (decode_addr_dec <= 22'h03ffff))
+          addr_out_port = 4'b0001;  // Select Output port MI1
+        // Address region 0x20000000-0x2fffffff
+        else if ((decode_addr_dec >= 22'h080000) & (decode_addr_dec <= 22'h0bffff))
+          addr_out_port = 4'b0001;  // Select Output port MI1
+
+        // Address region 0x30000000-0x3fffffff
+        else if ((decode_addr_dec >= 22'h0c0000) & (decode_addr_dec <= 22'h0fffff))
+          addr_out_port = 4'b0010;  // Select Output port MI2
+
+        // Address region 0x40000000-0x5fffffff
+        else if ((decode_addr_dec >= 22'h100000) & (decode_addr_dec <= 22'h17ffff))
+          addr_out_port = 4'b0011;  // Select Output port MI3
+
+        // Address region 0x80000000-0x8fffffff
+        else if ((decode_addr_dec >= 22'h200000) & (decode_addr_dec <= 22'h23ffff))
+          addr_out_port = 4'b0100;  // Select Output port MI4
+
+        // Address region 0x90000000-0x9fffffff
+        else if ((decode_addr_dec >= 22'h240000) & (decode_addr_dec <= 22'h27ffff))
+          addr_out_port = 4'b0101;  // Select Output port MI5
+
+        // Address region 0x60000000-0x7fffffff
+        else if ((decode_addr_dec >= 22'h180000) & (decode_addr_dec <= 22'h1fffff))
+          addr_out_port = 4'b0110;  // Select Output port MI6
+        // Address region 0xa0000000-0xdfffffff
+        else if ((decode_addr_dec >= 22'h280000) & (decode_addr_dec <= 22'h37ffff))
+          addr_out_port = 4'b0110;  // Select Output port MI6
+
+        else
+          addr_out_port = 4'b1000;   // Select the default slave
+
+      end // if (trans_dec != 2'b00)
+      else
+        addr_out_port = data_out_port;   // Stay on last port if no activity
+
+    end // block: p_addr_out_port_comb
+
+  // Select signal decode
+  always @ (sel_dec or addr_out_port)
+    begin : p_sel_comb
+      sel_dec0 = 1'b0;
+      sel_dec1 = 1'b0;
+      sel_dec2 = 1'b0;
+      sel_dec3 = 1'b0;
+      sel_dec4 = 1'b0;
+      sel_dec5 = 1'b0;
+      sel_dec6 = 1'b0;
+      sel_dft_slv = 1'b0;
+
+      if (sel_dec)
+        case (addr_out_port)
+          4'b0000 : sel_dec0 = 1'b1;
+          4'b0001 : sel_dec1 = 1'b1;
+          4'b0010 : sel_dec2 = 1'b1;
+          4'b0011 : sel_dec3 = 1'b1;
+          4'b0100 : sel_dec4 = 1'b1;
+          4'b0101 : sel_dec5 = 1'b1;
+          4'b0110 : sel_dec6 = 1'b1;
+          4'b1000 : sel_dft_slv = 1'b1;    // Select the default slave
+          default : begin
+            sel_dec0 = 1'bx;
+            sel_dec1 = 1'bx;
+            sel_dec2 = 1'bx;
+            sel_dec3 = 1'bx;
+            sel_dec4 = 1'bx;
+            sel_dec5 = 1'bx;
+            sel_dec6 = 1'bx;
+            sel_dft_slv = 1'bx;
+          end
+        endcase // case(addr_out_port)
+    end // block: p_sel_comb
+
+// The decoder selects the appropriate active_dec signal depending on which
+//  output stage is required for the transfer.
+  always @ (
+             active_dec0 or
+             active_dec1 or
+             active_dec2 or
+             active_dec3 or
+             active_dec4 or
+             active_dec5 or
+             active_dec6 or
+             addr_out_port
+           )
+    begin : p_active_comb
+      case (addr_out_port)
+        4'b0000 : active_dec = active_dec0;
+        4'b0001 : active_dec = active_dec1;
+        4'b0010 : active_dec = active_dec2;
+        4'b0011 : active_dec = active_dec3;
+        4'b0100 : active_dec = active_dec4;
+        4'b0101 : active_dec = active_dec5;
+        4'b0110 : active_dec = active_dec6;
+        4'b1000 : active_dec = 1'b1;         // Select the default slave
+        default : active_dec = 1'bx;
+      endcase // case(addr_out_port)
+    end // block: p_active_comb
+
+
+//------------------------------------------------------------------------------
+// Data phase signals
+//------------------------------------------------------------------------------
+
+// The data_out_port needs to be updated when HREADY from the input stage is high.
+//  Note: HREADY must be used, not HREADYOUT, because there are occaisions
+//  (namely when the holding register gets loaded) when HREADYOUT may be low
+//  but HREADY is high, and in this case it is important that the data_out_port
+//  gets updated.
+//  When the port is inactive, the default slave is selected to prevent toggling.
+
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_data_out_port_seq
+      if (~HRESETn)
+        data_out_port <= 4'b1000;
+      else
+        if (HREADYS)
+          if (sel_dec & trans_dec[1])
+            data_out_port <= addr_out_port;
+          else
+            data_out_port <= 4'b1000;
+    end // block: p_data_out_port_seq
+
+  // HREADYOUTS output decode
+  always @ (
+             readyout_dft_slv or
+             readyout_dec0 or
+             readyout_dec1 or
+             readyout_dec2 or
+             readyout_dec3 or
+             readyout_dec4 or
+             readyout_dec5 or
+             readyout_dec6 or
+             data_out_port
+           )
+  begin : p_ready_comb
+    case (data_out_port)
+      4'b0000 : HREADYOUTS = readyout_dec0;
+      4'b0001 : HREADYOUTS = readyout_dec1;
+      4'b0010 : HREADYOUTS = readyout_dec2;
+      4'b0011 : HREADYOUTS = readyout_dec3;
+      4'b0100 : HREADYOUTS = readyout_dec4;
+      4'b0101 : HREADYOUTS = readyout_dec5;
+      4'b0110 : HREADYOUTS = readyout_dec6;
+      4'b1000 : HREADYOUTS = readyout_dft_slv;    // Select the default slave
+      default : HREADYOUTS = 1'bx;
+    endcase // case(data_out_port)
+  end // block: p_ready_comb
+
+  // HRESPS output decode
+  always @ (
+             resp_dft_slv or
+             resp_dec0 or
+             resp_dec1 or
+             resp_dec2 or
+             resp_dec3 or
+             resp_dec4 or
+             resp_dec5 or
+             resp_dec6 or
+             data_out_port
+           )
+  begin : p_resp_comb
+    case (data_out_port)
+      4'b0000 : HRESPS = resp_dec0;
+      4'b0001 : HRESPS = resp_dec1;
+      4'b0010 : HRESPS = resp_dec2;
+      4'b0011 : HRESPS = resp_dec3;
+      4'b0100 : HRESPS = resp_dec4;
+      4'b0101 : HRESPS = resp_dec5;
+      4'b0110 : HRESPS = resp_dec6;
+      4'b1000 : HRESPS = resp_dft_slv;     // Select the default slave
+      default : HRESPS = {2{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_resp_comb
+
+  // HRDATAS output decode
+  always @ (
+             rdata_dec0 or
+             rdata_dec1 or
+             rdata_dec2 or
+             rdata_dec3 or
+             rdata_dec4 or
+             rdata_dec5 or
+             rdata_dec6 or
+             data_out_port
+           )
+  begin : p_rdata_comb
+    case (data_out_port)
+      4'b0000 : HRDATAS = rdata_dec0;
+      4'b0001 : HRDATAS = rdata_dec1;
+      4'b0010 : HRDATAS = rdata_dec2;
+      4'b0011 : HRDATAS = rdata_dec3;
+      4'b0100 : HRDATAS = rdata_dec4;
+      4'b0101 : HRDATAS = rdata_dec5;
+      4'b0110 : HRDATAS = rdata_dec6;
+      4'b1000 : HRDATAS = {32{1'b0}};   // Select the default slave
+      default : HRDATAS = {32{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_rdata_comb
+
+  // HRUSERS output decode
+  always @ (
+             ruser_dec0 or
+             ruser_dec1 or
+             ruser_dec2 or
+             ruser_dec3 or
+             ruser_dec4 or
+             ruser_dec5 or
+             ruser_dec6 or
+             data_out_port
+           )
+  begin : p_ruser_comb
+    case (data_out_port)
+      4'b0000 : HRUSERS = ruser_dec0;
+      4'b0001 : HRUSERS = ruser_dec1;
+      4'b0010 : HRUSERS = ruser_dec2;
+      4'b0011 : HRUSERS = ruser_dec3;
+      4'b0100 : HRUSERS = ruser_dec4;
+      4'b0101 : HRUSERS = ruser_dec5;
+      4'b0110 : HRUSERS = ruser_dec6;
+      4'b1000 : HRUSERS = {2{1'b0}};   // Select the default slave
+      default : HRUSERS = {2{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_ruser_comb
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v
new file mode 100644
index 0000000..98779fd
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix/soclabs_4x7_SlaveOutput.v
@@ -0,0 +1,628 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-2023 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+//  Abstract            : The Output Stage is used to route the required input
+//                        stage to the shared slave output.
+//
+//  Notes               : The bus matrix has full connectivity,
+//                         and has a burst arbiter scheme.
+//
+//-----------------------------------------------------------------------------
+
+
+`timescale 1ns/1ps
+
+
+module soclabs_4x7_SlaveOutput (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+    // Port 0 Signals
+    sel_op0,
+    addr_op0,
+    auser_op0,
+    trans_op0,
+    write_op0,
+    size_op0,
+    burst_op0,
+    prot_op0,
+    master_op0,
+    mastlock_op0,
+    wdata_op0,
+    wuser_op0,
+    held_tran_op0,
+
+    // Port 1 Signals
+    sel_op1,
+    addr_op1,
+    auser_op1,
+    trans_op1,
+    write_op1,
+    size_op1,
+    burst_op1,
+    prot_op1,
+    master_op1,
+    mastlock_op1,
+    wdata_op1,
+    wuser_op1,
+    held_tran_op1,
+
+    // Port 2 Signals
+    sel_op2,
+    addr_op2,
+    auser_op2,
+    trans_op2,
+    write_op2,
+    size_op2,
+    burst_op2,
+    prot_op2,
+    master_op2,
+    mastlock_op2,
+    wdata_op2,
+    wuser_op2,
+    held_tran_op2,
+
+    // Port 3 Signals
+    sel_op3,
+    addr_op3,
+    auser_op3,
+    trans_op3,
+    write_op3,
+    size_op3,
+    burst_op3,
+    prot_op3,
+    master_op3,
+    mastlock_op3,
+    wdata_op3,
+    wuser_op3,
+    held_tran_op3,
+
+    // Slave read data and response
+    HREADYOUTM,
+
+    active_op0,
+    active_op1,
+    active_op2,
+    active_op3,
+
+    // Slave Address/Control Signals
+    HSELM,
+    HADDRM,
+    HAUSERM,
+    HTRANSM,
+    HWRITEM,
+    HSIZEM,
+    HBURSTM,
+    HPROTM,
+    HMASTERM,
+    HMASTLOCKM,
+    HREADYMUXM,
+    HWUSERM,
+    HWDATAM
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input         HCLK;       // AHB system clock
+    input         HRESETn;    // AHB system reset
+
+    // Bus-switch input 0
+    input         sel_op0;       // Port 0 HSEL signal
+    input [31:0]  addr_op0;      // Port 0 HADDR signal
+    input [1:0]  auser_op0;     // Port 0 HAUSER signal
+    input  [1:0]  trans_op0;     // Port 0 HTRANS signal
+    input         write_op0;     // Port 0 HWRITE signal
+    input  [2:0]  size_op0;      // Port 0 HSIZE signal
+    input  [2:0]  burst_op0;     // Port 0 HBURST signal
+    input  [3:0]  prot_op0;      // Port 0 HPROT signal
+    input  [3:0]  master_op0;    // Port 0 HMASTER signal
+    input         mastlock_op0;  // Port 0 HMASTLOCK signal
+    input [31:0]  wdata_op0;     // Port 0 HWDATA signal
+    input [1:0]  wuser_op0;     // Port 0 HWUSER signal
+    input         held_tran_op0;  // Port 0 HeldTran signal
+
+    // Bus-switch input 1
+    input         sel_op1;       // Port 1 HSEL signal
+    input [31:0]  addr_op1;      // Port 1 HADDR signal
+    input [1:0]  auser_op1;     // Port 1 HAUSER signal
+    input  [1:0]  trans_op1;     // Port 1 HTRANS signal
+    input         write_op1;     // Port 1 HWRITE signal
+    input  [2:0]  size_op1;      // Port 1 HSIZE signal
+    input  [2:0]  burst_op1;     // Port 1 HBURST signal
+    input  [3:0]  prot_op1;      // Port 1 HPROT signal
+    input  [3:0]  master_op1;    // Port 1 HMASTER signal
+    input         mastlock_op1;  // Port 1 HMASTLOCK signal
+    input [31:0]  wdata_op1;     // Port 1 HWDATA signal
+    input [1:0]  wuser_op1;     // Port 1 HWUSER signal
+    input         held_tran_op1;  // Port 1 HeldTran signal
+
+    // Bus-switch input 2
+    input         sel_op2;       // Port 2 HSEL signal
+    input [31:0]  addr_op2;      // Port 2 HADDR signal
+    input [1:0]  auser_op2;     // Port 2 HAUSER signal
+    input  [1:0]  trans_op2;     // Port 2 HTRANS signal
+    input         write_op2;     // Port 2 HWRITE signal
+    input  [2:0]  size_op2;      // Port 2 HSIZE signal
+    input  [2:0]  burst_op2;     // Port 2 HBURST signal
+    input  [3:0]  prot_op2;      // Port 2 HPROT signal
+    input  [3:0]  master_op2;    // Port 2 HMASTER signal
+    input         mastlock_op2;  // Port 2 HMASTLOCK signal
+    input [31:0]  wdata_op2;     // Port 2 HWDATA signal
+    input [1:0]  wuser_op2;     // Port 2 HWUSER signal
+    input         held_tran_op2;  // Port 2 HeldTran signal
+
+    // Bus-switch input 3
+    input         sel_op3;       // Port 3 HSEL signal
+    input [31:0]  addr_op3;      // Port 3 HADDR signal
+    input [1:0]  auser_op3;     // Port 3 HAUSER signal
+    input  [1:0]  trans_op3;     // Port 3 HTRANS signal
+    input         write_op3;     // Port 3 HWRITE signal
+    input  [2:0]  size_op3;      // Port 3 HSIZE signal
+    input  [2:0]  burst_op3;     // Port 3 HBURST signal
+    input  [3:0]  prot_op3;      // Port 3 HPROT signal
+    input  [3:0]  master_op3;    // Port 3 HMASTER signal
+    input         mastlock_op3;  // Port 3 HMASTLOCK signal
+    input [31:0]  wdata_op3;     // Port 3 HWDATA signal
+    input [1:0]  wuser_op3;     // Port 3 HWUSER signal
+    input         held_tran_op3;  // Port 3 HeldTran signal
+
+    input         HREADYOUTM; // HREADY feedback
+
+    output        active_op0;    // Port 0 Active signal
+    output        active_op1;    // Port 1 Active signal
+    output        active_op2;    // Port 2 Active signal
+    output        active_op3;    // Port 3 Active signal
+
+    // Slave Address/Control Signals
+    output        HSELM;      // Slave select line
+    output [31:0] HADDRM;     // Address
+    output [1:0] HAUSERM;    // User Address bus
+    output  [1:0] HTRANSM;    // Transfer type
+    output        HWRITEM;    // Transfer direction
+    output  [2:0] HSIZEM;     // Transfer size
+    output  [2:0] HBURSTM;    // Burst type
+    output  [3:0] HPROTM;     // Protection control
+    output  [3:0] HMASTERM;   // Master ID
+    output        HMASTLOCKM; // Locked transfer
+    output        HREADYMUXM; // Transfer done
+    output [1:0] HWUSERM;    // User data bus
+    output [31:0] HWDATAM;    // Write data
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+    wire        HCLK;       // AHB system clock
+    wire        HRESETn;    // AHB system reset
+
+    // Bus-switch input 0
+    wire        sel_op0;       // Port 0 HSEL signal
+    wire [31:0] addr_op0;      // Port 0 HADDR signal
+    wire [1:0] auser_op0;     // Port 0 HAUSER signal
+    wire  [1:0] trans_op0;     // Port 0 HTRANS signal
+    wire        write_op0;     // Port 0 HWRITE signal
+    wire  [2:0] size_op0;      // Port 0 HSIZE signal
+    wire  [2:0] burst_op0;     // Port 0 HBURST signal
+    wire  [3:0] prot_op0;      // Port 0 HPROT signal
+    wire  [3:0] master_op0;    // Port 0 HMASTER signal
+    wire        mastlock_op0;  // Port 0 HMASTLOCK signal
+    wire [31:0] wdata_op0;     // Port 0 HWDATA signal
+    wire [1:0] wuser_op0;     // Port 0 HWUSER signal
+    wire        held_tran_op0;  // Port 0 HeldTran signal
+    reg         active_op0;    // Port 0 Active signal
+
+    // Bus-switch input 1
+    wire        sel_op1;       // Port 1 HSEL signal
+    wire [31:0] addr_op1;      // Port 1 HADDR signal
+    wire [1:0] auser_op1;     // Port 1 HAUSER signal
+    wire  [1:0] trans_op1;     // Port 1 HTRANS signal
+    wire        write_op1;     // Port 1 HWRITE signal
+    wire  [2:0] size_op1;      // Port 1 HSIZE signal
+    wire  [2:0] burst_op1;     // Port 1 HBURST signal
+    wire  [3:0] prot_op1;      // Port 1 HPROT signal
+    wire  [3:0] master_op1;    // Port 1 HMASTER signal
+    wire        mastlock_op1;  // Port 1 HMASTLOCK signal
+    wire [31:0] wdata_op1;     // Port 1 HWDATA signal
+    wire [1:0] wuser_op1;     // Port 1 HWUSER signal
+    wire        held_tran_op1;  // Port 1 HeldTran signal
+    reg         active_op1;    // Port 1 Active signal
+
+    // Bus-switch input 2
+    wire        sel_op2;       // Port 2 HSEL signal
+    wire [31:0] addr_op2;      // Port 2 HADDR signal
+    wire [1:0] auser_op2;     // Port 2 HAUSER signal
+    wire  [1:0] trans_op2;     // Port 2 HTRANS signal
+    wire        write_op2;     // Port 2 HWRITE signal
+    wire  [2:0] size_op2;      // Port 2 HSIZE signal
+    wire  [2:0] burst_op2;     // Port 2 HBURST signal
+    wire  [3:0] prot_op2;      // Port 2 HPROT signal
+    wire  [3:0] master_op2;    // Port 2 HMASTER signal
+    wire        mastlock_op2;  // Port 2 HMASTLOCK signal
+    wire [31:0] wdata_op2;     // Port 2 HWDATA signal
+    wire [1:0] wuser_op2;     // Port 2 HWUSER signal
+    wire        held_tran_op2;  // Port 2 HeldTran signal
+    reg         active_op2;    // Port 2 Active signal
+
+    // Bus-switch input 3
+    wire        sel_op3;       // Port 3 HSEL signal
+    wire [31:0] addr_op3;      // Port 3 HADDR signal
+    wire [1:0] auser_op3;     // Port 3 HAUSER signal
+    wire  [1:0] trans_op3;     // Port 3 HTRANS signal
+    wire        write_op3;     // Port 3 HWRITE signal
+    wire  [2:0] size_op3;      // Port 3 HSIZE signal
+    wire  [2:0] burst_op3;     // Port 3 HBURST signal
+    wire  [3:0] prot_op3;      // Port 3 HPROT signal
+    wire  [3:0] master_op3;    // Port 3 HMASTER signal
+    wire        mastlock_op3;  // Port 3 HMASTLOCK signal
+    wire [31:0] wdata_op3;     // Port 3 HWDATA signal
+    wire [1:0] wuser_op3;     // Port 3 HWUSER signal
+    wire        held_tran_op3;  // Port 3 HeldTran signal
+    reg         active_op3;    // Port 3 Active signal
+
+    // Slave Address/Control Signals
+    wire        HSELM;      // Slave select line
+    reg  [31:0] HADDRM;     // Address
+    reg  [1:0] HAUSERM;    // User Address bus
+    wire  [1:0] HTRANSM;    // Transfer type
+    reg         HWRITEM;    // Transfer direction
+    reg   [2:0] HSIZEM;     // Transfer size
+    wire  [2:0] HBURSTM;    // Burst type
+    reg   [3:0] HPROTM;     // Protection control
+    reg   [3:0] HMASTERM;   // Master ID
+    wire        HMASTLOCKM; // Locked transfer
+    wire        HREADYMUXM; // Transfer done
+    reg  [1:0] HWUSERM;    // User data bus
+    reg  [31:0] HWDATAM;    // Write data
+    wire        HREADYOUTM; // HREADY feedback
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+    wire        req_port0;     // Port 0 request signal
+    wire        req_port1;     // Port 1 request signal
+    wire        req_port2;     // Port 2 request signal
+    wire        req_port3;     // Port 3 request signal
+
+    wire  [1:0] addr_in_port;   // Address input port
+    reg   [1:0] data_in_port;   // Data input port
+    wire        no_port;       // No port selected signal
+    reg         slave_sel;     // Slave select signal
+    reg         wdata_phase;   // Used to prevent unnecesary toggling
+
+    reg         hsel_lock;     // Held HSELS during locked sequence
+    wire        next_hsel_lock; // Pre-registered hsel_lock
+    wire        hlock_arb;     // HMASTLOCK modified by HSEL for arbitration
+
+    reg         i_hselm;       // Internal HSELM
+    reg   [1:0] i_htransm;     // Internal HTRANSM
+    reg   [2:0] i_hburstm;     // Internal HBURSTM
+    wire        i_hreadymuxm;  // Internal HREADYMUXM
+    reg         i_hmastlockm;  // Internal HMASTLOCKM
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// Port Selection
+// -----------------------------------------------------------------------------
+
+  assign req_port0 = held_tran_op0 & sel_op0;
+  assign req_port1 = held_tran_op1 & sel_op1;
+  assign req_port2 = held_tran_op2 & sel_op2;
+  assign req_port3 = held_tran_op3 & sel_op3;
+
+  // Arbiter instance for resolving requests to this output stage
+  soclabs_4x7_Arbiter u_output_arb (
+
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    .req_port0   (req_port0),
+    .req_port1   (req_port1),
+    .req_port2   (req_port2),
+    .req_port3   (req_port3),
+
+    .HREADYM    (i_hreadymuxm),
+    .HSELM      (i_hselm),
+    .HTRANSM    (i_htransm),
+    .HBURSTM    (i_hburstm),
+    .HMASTLOCKM (hlock_arb),
+
+    .addr_in_port (addr_in_port),
+    .no_port     (no_port)
+
+    );
+
+
+  // Active signal combinatorial decode
+  always @ (addr_in_port or no_port)
+    begin : p_active_comb
+      // Default value(s)
+      active_op0 = 1'b0;
+      active_op1 = 1'b0;
+      active_op2 = 1'b0;
+      active_op3 = 1'b0;
+
+      // Decode selection when enabled
+      if (~no_port)
+        case (addr_in_port)
+          2'b00 : active_op0 = 1'b1;
+          2'b01 : active_op1 = 1'b1;
+          2'b10 : active_op2 = 1'b1;
+          2'b11 : active_op3 = 1'b1;
+          default : begin
+            active_op0 = 1'bx;
+            active_op1 = 1'bx;
+            active_op2 = 1'bx;
+            active_op3 = 1'bx;
+          end
+        endcase // case(addr_in_port)
+    end // block: p_active_comb
+
+
+  //  Address/control output decode
+  always @ (
+             sel_op0 or addr_op0 or trans_op0 or write_op0 or
+             size_op0 or burst_op0 or prot_op0 or
+             auser_op0 or
+             master_op0 or mastlock_op0 or
+             sel_op1 or addr_op1 or trans_op1 or write_op1 or
+             size_op1 or burst_op1 or prot_op1 or
+             auser_op1 or
+             master_op1 or mastlock_op1 or
+             sel_op2 or addr_op2 or trans_op2 or write_op2 or
+             size_op2 or burst_op2 or prot_op2 or
+             auser_op2 or
+             master_op2 or mastlock_op2 or
+             sel_op3 or addr_op3 or trans_op3 or write_op3 or
+             size_op3 or burst_op3 or prot_op3 or
+             auser_op3 or
+             master_op3 or mastlock_op3 or
+             addr_in_port or no_port
+           )
+    begin : p_addr_mux
+      // Default values
+      i_hselm     = 1'b0;
+      HADDRM      = {32{1'b0}};
+      HAUSERM     = {2{1'b0}};
+      i_htransm   = 2'b00;
+      HWRITEM     = 1'b0;
+      HSIZEM      = 3'b000;
+      i_hburstm   = 3'b000;
+      HPROTM      = {4{1'b0}};
+      HMASTERM    = 4'b0000;
+      i_hmastlockm= 1'b0;
+
+      // Decode selection when enabled
+      if (~no_port)
+        case (addr_in_port)
+          // Bus-switch input 0
+          2'b00 :
+            begin
+              i_hselm     = sel_op0;
+              HADDRM      = addr_op0;
+              HAUSERM     = auser_op0;
+              i_htransm   = trans_op0;
+              HWRITEM     = write_op0;
+              HSIZEM      = size_op0;
+              i_hburstm   = burst_op0;
+              HPROTM      = prot_op0;
+              HMASTERM    = master_op0;
+              i_hmastlockm= mastlock_op0;
+            end // case: 4'b00
+
+          // Bus-switch input 1
+          2'b01 :
+            begin
+              i_hselm     = sel_op1;
+              HADDRM      = addr_op1;
+              HAUSERM     = auser_op1;
+              i_htransm   = trans_op1;
+              HWRITEM     = write_op1;
+              HSIZEM      = size_op1;
+              i_hburstm   = burst_op1;
+              HPROTM      = prot_op1;
+              HMASTERM    = master_op1;
+              i_hmastlockm= mastlock_op1;
+            end // case: 4'b01
+
+          // Bus-switch input 2
+          2'b10 :
+            begin
+              i_hselm     = sel_op2;
+              HADDRM      = addr_op2;
+              HAUSERM     = auser_op2;
+              i_htransm   = trans_op2;
+              HWRITEM     = write_op2;
+              HSIZEM      = size_op2;
+              i_hburstm   = burst_op2;
+              HPROTM      = prot_op2;
+              HMASTERM    = master_op2;
+              i_hmastlockm= mastlock_op2;
+            end // case: 4'b10
+
+          // Bus-switch input 3
+          2'b11 :
+            begin
+              i_hselm     = sel_op3;
+              HADDRM      = addr_op3;
+              HAUSERM     = auser_op3;
+              i_htransm   = trans_op3;
+              HWRITEM     = write_op3;
+              HSIZEM      = size_op3;
+              i_hburstm   = burst_op3;
+              HPROTM      = prot_op3;
+              HMASTERM    = master_op3;
+              i_hmastlockm= mastlock_op3;
+            end // case: 4'b11
+
+          default :
+            begin
+              i_hselm     = 1'bx;
+              HADDRM      = {32{1'bx}};
+              HAUSERM     = {2{1'bx}};
+              i_htransm   = 2'bxx;
+              HWRITEM     = 1'bx;
+              HSIZEM      = 3'bxxx;
+              i_hburstm   = 3'bxxx;
+              HPROTM      = {4{1'bx}};
+              HMASTERM    = 4'bxxxx;
+              i_hmastlockm= 1'bx;
+            end // case: default
+        endcase // case(addr_in_port)
+    end // block: p_addr_mux
+
+  // hsel_lock provides support for AHB masters that address other
+  // slave regions in the middle of a locked sequence (i.e. HSEL is
+  // de-asserted during the locked sequence).  Unless HMASTLOCK is
+  // held during these intermediate cycles, the OutputArb scheme will
+  // lose track of the locked sequence and may allow another input
+  // port to access the output port which should be locked
+  assign next_hsel_lock = (i_hselm & i_htransm[1] & i_hmastlockm) ? 1'b1 :
+                         (i_hmastlockm == 1'b0) ? 1'b0 :
+                          hsel_lock;
+
+  // Register hsel_lock
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_hsel_lock
+      if (~HRESETn)
+        hsel_lock <= 1'b0;
+      else
+        if (i_hreadymuxm)
+          hsel_lock <= next_hsel_lock;
+    end
+
+  // Version of HMASTLOCK which is masked when not selected, unless a
+  // locked sequence has already begun through this port
+  assign hlock_arb = i_hmastlockm & (hsel_lock | i_hselm);
+
+  assign HTRANSM    = i_htransm;
+  assign HBURSTM    = i_hburstm;
+  assign HSELM      = i_hselm;
+  assign HMASTLOCKM = i_hmastlockm;
+
+  // Dataport register
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_data_in_port_reg
+      if (~HRESETn)
+        data_in_port <= 2'b11;
+      else
+        if (i_hreadymuxm)
+          data_in_port <= addr_in_port;
+    end
+
+  // Dataphase register
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_wdata_phase_reg
+      if (~HRESETn)
+        wdata_phase <= 1'b0;
+      else
+        if (i_hreadymuxm)
+          wdata_phase <= i_hselm & i_htransm[1];
+    end
+
+
+  // HWDATAM output decode
+  always @ (
+             wdata_op0 or
+             wdata_op1 or
+             wdata_op2 or
+             wdata_op3 or
+             data_in_port or wdata_phase
+           )
+    begin : p_data_mux
+      // Default value
+      HWDATAM = {32{1'b0}};
+
+      // If interface active
+      if (wdata_phase)
+        // Decode selection
+        case (data_in_port)
+          2'b00 : HWDATAM  = wdata_op0;
+          2'b01 : HWDATAM  = wdata_op1;
+          2'b10 : HWDATAM  = wdata_op2;
+          2'b11 : HWDATAM  = wdata_op3;
+          default : HWDATAM = {32{1'bx}};
+        endcase // case(data_in_port)
+    end // block: p_data_mux
+
+  // HWUSERM output decode
+  always @ (
+             wuser_op0 or
+             wuser_op1 or
+             wuser_op2 or
+             wuser_op3 or
+             data_in_port or wdata_phase
+           )
+    begin : p_wuser_mux
+      // Default value
+      HWUSERM  = {2{1'b0}};
+
+      // If interface active
+      if (wdata_phase)
+        // Decode selection
+        case (data_in_port)
+          2'b00 : HWUSERM  = wuser_op0;
+          2'b01 : HWUSERM  = wuser_op1;
+          2'b10 : HWUSERM  = wuser_op2;
+          2'b11 : HWUSERM  = wuser_op3;
+          default : HWUSERM  = {2{1'bx}};
+        endcase // case(data_in_port)
+    end // block: p_wuser_mux
+
+  // ---------------------------------------------------------------------------
+  // HREADYMUXM generation
+  // ---------------------------------------------------------------------------
+  // The HREADY signal on the shared slave is generated directly from
+  //  the shared slave HREADYOUTS if the slave is selected, otherwise
+  //  it mirrors the HREADY signal of the appropriate input port
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_slave_sel_reg
+      if (~HRESETn)
+         slave_sel <= 1'b0;
+      else
+        if (i_hreadymuxm)
+           slave_sel  <= i_hselm;
+    end
+
+  // HREADYMUXM output selection
+  assign i_hreadymuxm = (slave_sel) ? HREADYOUTM : 1'b1;
+
+  // Drive output with internal version of the signal
+  assign HREADYMUXM = i_hreadymuxm;
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_burst_arb.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_burst_arb.v
new file mode 100755
index 0000000..013fe59
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_burst_arb.v
@@ -0,0 +1,327 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------
+//  Abstract            : The Output Arbitration is used to determine which
+//                        of the input stages will be given access to the
+//                        shared slave.
+//
+//  Notes               : The bus matrix has <<connectivity>> connectivity.
+//
+//-----------------------------------------------------------------------------
+
+<<timescale_directive>>
+
+module <<output_arb_name>> (
+
+    // Common AHB signals
+    HCLK ,
+    HRESETn,
+
+    // Input port request signals
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    req_port<<in>>,
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+    HREADYM,
+    HSELM,
+    HTRANSM,
+    HBURSTM,
+    HMASTLOCKM,
+
+    // Arbiter outputs
+    addr_in_port,
+    no_port
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input        HCLK;         // AHB system clock
+    input        HRESETn;      // AHB system reset
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    input        req_port<<in>>;     // Port <<in>> request signal
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+    input        HREADYM;      // Transfer done
+    input        HSELM;        // Slave select line
+    input  [1:0] HTRANSM;      // Transfer type
+    input  [2:0] HBURSTM;      // Burst type
+    input        HMASTLOCKM;   // Locked transfer
+    output [<<idw_si>>:0] addr_in_port;   // Port address input
+    output       no_port;       // No port selected signal
+
+
+// -----------------------------------------------------------------------------
+// Constant declarations
+// -----------------------------------------------------------------------------
+
+// HTRANS transfer type signal encoding
+`define TRN_IDLE   2'b00       // Idle transfer
+`define TRN_BUSY   2'b01       // Busy transfer
+`define TRN_NONSEQ 2'b10       // NonSequential transfer
+`define TRN_SEQ    2'b11       // Sequential transfer
+
+// HBURST transfer type signal encoding
+`define BUR_SINGLE 3'b000       // Single
+`define BUR_INCR   3'b001       // Incremental
+`define BUR_WRAP4  3'b010       // 4-beat wrap
+`define BUR_INCR4  3'b011       // 4-beat Incr
+`define BUR_WRAP8  3'b100       // 8-beat wrap
+`define BUR_INCR8  3'b101       // 8-beat Incr
+`define BUR_WRAP16 3'b110       // 16-beat Wrap
+`define BUR_INCR16 3'b111       // 16-beat Incr
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+    wire       HCLK;           // AHB system clock
+    wire       HRESETn;        // AHB system reset
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    wire       req_port<<in>>;       // Port <<in>> request signal
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+    wire       HREADYM;        // Transfer done
+    wire       HSELM;          // Slave select line
+    wire [1:0] HTRANSM;        // Transfer type
+    wire [2:0] HBURSTM;        // Burst type
+    wire       HMASTLOCKM;     // Locked transfer
+    wire [<<idw_si>>:0] addr_in_port;     // Address input port
+    reg        no_port;         // No port selected signal
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+    reg  [<<idw_si>>:0] addr_in_port_next; // D-input of addr_in_port
+    reg  [<<idw_si>>:0] i_addr_in_port;    // Internal version of addr_in_port
+    reg        no_port_next;       // D-input of no_port
+    reg  [3:0] next_burst_count;   // D-input of reg_burst_count
+    reg  [3:0] reg_burst_count;    // Burst counter
+    reg        next_burst_hold;    // D-input of reg_burst_hold
+    reg        reg_burst_hold;     // Burst hold signal
+
+    // Early burst termination logic
+    reg  [1:0] reg_early_term_count; // Counts number of early terminated bursts
+    wire [1:0] next_early_term_count; // D-input for reg_early_term_count
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// BURST TRANSFER COUNTER
+// -----------------------------------------------------------------------------
+//
+// The Burst counter is used to count down from the number of transfers the
+// master should perform and when the counter reaches zero the bus may be
+// passed to another master.
+//
+// reg_burst_count indicates the number of transfers remaining in the
+// current fixed length burst.
+// reg_burst_hold is actually a decode of reg_burst_count=0 but is driven from a register
+// to improve timing
+
+  always @ (HTRANSM or HSELM or HBURSTM or reg_burst_count or reg_burst_hold or reg_early_term_count)
+    begin : p_next_burst_count_comb
+      // Force the Burst logic to reset if this port is de-selected.  This can
+      // happen for two reasons:
+      //   1. The master performs 2 fixed-length bursts back-to-back, but the
+      //      second is to an alternate output port
+      //   2. The master is performing a fixed-length burst but is de-granted mid-
+      //      way by a local AHB Arbiter
+      if (!HSELM)
+        begin
+          next_burst_count = 4'b0000;
+          next_burst_hold  = 1'b0;
+        end
+
+      // Burst logic is initialised on a NONSEQ transfer (i.e. start of burst)
+      // IDLE transfers cause the logic to reset
+      // BUSY transfers pause the decrementer
+      // SEQ transfers decrement the counter
+      else
+        case (HTRANSM)
+
+          `TRN_NONSEQ : begin
+            case (HBURSTM)
+              `BUR_INCR16, `BUR_WRAP16 : begin
+                next_burst_count = 4'b1111;
+                next_burst_hold = 1'b1;
+              end // case: BUR_INCR16 | BUR_WRAP16
+
+              `BUR_INCR8, `BUR_WRAP8 : begin
+                next_burst_count = 4'b0111;
+                next_burst_hold = 1'b1;
+              end // case: BUR_INCR8  | BUR_WRAP8
+
+              `BUR_INCR4, `BUR_WRAP4 : begin
+                next_burst_count = 4'b0011;
+                next_burst_hold = 1'b1;
+              end // case: BUR_INCR4  | BUR_WRAP4
+
+              `BUR_SINGLE, `BUR_INCR : begin
+                next_burst_count = 4'b0000;
+                next_burst_hold = 1'b0;
+              end // case: BUR_SINGLE | BUR_INCR
+
+              default : begin
+                next_burst_count = 4'bxxxx;
+                next_burst_hold = 1'bx;
+              end // case: default
+            endcase // case(HBURSTM)
+
+            // Prevent early burst termination from keeping hold of the port
+            if (reg_early_term_count == 2'b10)
+            begin
+               next_burst_hold = 1'b0;
+               next_burst_count = 4'd0;
+            end
+
+
+          end // case: `TRN_NONSEQ
+
+          `TRN_SEQ : begin
+            next_burst_count = reg_burst_count - 4'b1;
+            if (reg_burst_count == 4'b0001)
+              next_burst_hold = 1'b0;
+            else
+              next_burst_hold = reg_burst_hold;
+          end // case: `TRN_SEQ
+
+          `TRN_BUSY : begin
+            next_burst_count = reg_burst_count;
+            next_burst_hold = reg_burst_hold;
+          end // case: `TRN_BUSY
+
+          `TRN_IDLE : begin
+            next_burst_count = 4'b0000;
+            next_burst_hold = 1'b0;
+          end // case: `TRN_IDLE
+
+          default : begin
+            next_burst_count = 4'bxxxx;
+            next_burst_hold = 1'bx;
+          end // case: default
+
+        endcase // case(HTRANSM)
+    end // block: p_next_burst_countComb
+
+
+  assign next_early_term_count = (!next_burst_hold) ? 2'b00 :
+                               (reg_burst_hold & (HTRANSM == `TRN_NONSEQ)) ?
+                                reg_early_term_count + 2'b1 :
+                                reg_early_term_count;
+
+  // Sequential process
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_burst_seq
+      if (!HRESETn)
+        begin
+          reg_burst_count <= 4'b0000;
+          reg_burst_hold  <= 1'b0;
+          reg_early_term_count <= 2'b00;
+        end // if (HRESETn == 1'b0)
+      else
+        if (HREADYM)
+        begin
+            reg_burst_count <= next_burst_count;
+            reg_burst_hold  <= next_burst_hold;
+            reg_early_term_count <= next_early_term_count;
+          end
+    end // block: p_burst_seq
+
+
+// -----------------------------------------------------------------------------
+// Port Selection
+// -----------------------------------------------------------------------------
+// The Output Arbitration function looks at all the requests to use the
+//  output port and determines which is the highest priority request. This
+//  version of the arbitration logic uses a fixed priority scheme that is
+//  gated by a tracking function of the burst boundary. Input port 0 is the
+//  highest priority, input port 1 is the second highest priority, etc.
+// If none of the input ports are requesting then the current port will
+//  remain active if it is performing IDLE transfers to the selected slave. If
+//  this is not the case then the no_port signal will be asserted which
+//  indicates that no input port should be selected.
+
+  always @ (
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+             req_port<<in>> or
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+             HSELM or HTRANSM or HMASTLOCKM or next_burst_hold or i_addr_in_port
+           )
+    begin : p_sel_port_comb
+      // Default values are used for addr_in_port_next and no_port_next
+      no_port_next = 1'b0;
+      addr_in_port_next = i_addr_in_port;
+
+      if ( HMASTLOCKM | next_burst_hold )
+        addr_in_port_next = i_addr_in_port;
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+      else if ( req_port<<in>> | ( (i_addr_in_port == <<idw_si_v>>'b<<bin_in>>) & HSELM &
+                              (HTRANSM != 2'b00) ) )
+        addr_in_port_next = <<idw_si_v>>'b<<bin_in>>;
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+      else if (HSELM)
+        addr_in_port_next = i_addr_in_port;
+      else
+        no_port_next = 1'b1;
+    end // block: p_sel_port_comb
+
+
+  // Sequential process
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_addr_in_port_reg
+      if (!HRESETn)
+        begin
+          no_port        <= 1'b1;
+          i_addr_in_port <= {<<idw_si_v>>{1'b0}};
+        end
+      else
+        if (HREADYM)
+          begin
+            no_port        <= no_port_next;
+            i_addr_in_port <= addr_in_port_next;
+          end
+    end // block: p_addr_in_port_reg
+
+  // Drive output with internal version
+  assign addr_in_port = i_addr_in_port;
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_decode.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_decode.v
new file mode 100755
index 0000000..bd24a8d
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_decode.v
@@ -0,0 +1,458 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+//  Abstract             : The MatrixDecode is used to determine which output
+//                         stage is required for a particular access. Addresses
+//                         that do not map to an Output port are diverted to
+//                         the local default slave.
+//
+//  Notes               : The bus matrix has <<connectivity>> connectivity.
+//
+//-----------------------------------------------------------------------------
+
+<<timescale_directive>>
+
+module <<matrix_decode_name>> (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+//---------------------------- << start remap >> -------------------------------
+    // Internal address remapping control
+    remapping_dec,
+
+//----------------------------- << end remap >> --------------------------------
+    // Signals from the Input stage
+    HREADYS,
+    sel_dec,
+    decode_addr_dec,
+    trans_dec,
+
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    // Bus-switch output <<out>>
+    active_dec<<out>>,
+    readyout_dec<<out>>,
+    resp_dec<<out>>,
+    rdata_dec<<out>>,
+//---------------------------- << start user >> --------------------------------
+    ruser_dec<<out>>,
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+    // Output port selection signals
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    sel_dec<<out>>,
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+
+    // Selected Output port data and control signals
+    active_dec,
+    HREADYOUTS,
+    HRESPS,
+//---------------------------- << start user >> --------------------------------
+    HRUSERS,
+//----------------------------- << end user >> ---------------------------------
+    HRDATAS
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input         HCLK;           // AHB System Clock
+    input         HRESETn;        // AHB System Reset
+
+//---------------------------- << start remap >> -------------------------------
+    // Internal address remapping control
+    input   [<<idw_remap>>:0] remapping_dec;      // Internal remap signal
+
+//----------------------------- << end remap >> --------------------------------
+    // Signals from the Input stage
+    input         HREADYS;        // Transfer done
+    input         sel_dec;            // HSEL input
+    input [<<addr>>:10] decode_addr_dec;     // HADDR decoder input
+    input   [1:0] trans_dec;          // Input port HTRANS signal
+
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    // Bus-switch output MI<<out>>
+    input         active_dec<<out>>;        // Output stage MI<<out>> active_dec signal
+    input         readyout_dec<<out>>;      // HREADYOUT input
+    input   [<<resp>>:0] resp_dec<<out>>;          // HRESP input
+    input  [<<data>>:0] rdata_dec<<out>>;         // HRDATA input
+//---------------------------- << start user >> --------------------------------
+    input  [<<user>>:0] ruser_dec<<out>>;         // HRUSER input
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+    // Output port selection signals
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    output        sel_dec<<out>>;           // HSEL output
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+
+    // Selected Output port data and control signals
+    output        active_dec;         // Combinatorial active_dec O/P
+    output        HREADYOUTS;     // HREADY feedback output
+    output  [<<resp>>:0] HRESPS;         // Transfer response
+//---------------------------- << start user >> --------------------------------
+    output [<<user>>:0] HRUSERS;        // User read Data
+//----------------------------- << end user >> ---------------------------------
+    output [<<data>>:0] HRDATAS;        // Read Data
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    wire          HCLK;            // AHB System Clock
+    wire          HRESETn;         // AHB System Reset
+//---------------------------- << start remap >> -------------------------------
+    // Internal address remapping control
+    wire    [<<idw_remap>>:0] remapping_dec;       // Internal remap signal
+//----------------------------- << end remap >> --------------------------------
+
+    // Signals from the Input stage
+    wire          HREADYS;         // Transfer done
+    wire          sel_dec;             // HSEL input
+    wire  [<<addr>>:10] decode_addr_dec;      // HADDR input
+    wire    [1:0] trans_dec;           // Input port HTRANS signal
+
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    // Bus-switch output MI<<out>>
+    wire          active_dec<<out>>;         // active_dec signal
+    wire          readyout_dec<<out>>;       // HREADYOUT input
+    wire    [<<resp>>:0] resp_dec<<out>>;           // HRESP input
+    wire   [<<data>>:0] rdata_dec<<out>>;          // HRDATA input
+//---------------------------- << start user >> --------------------------------
+    wire   [<<user>>:0] ruser_dec<<out>>;          // HRUSER input
+//----------------------------- << end user >> ---------------------------------
+    reg           sel_dec<<out>>;            // HSEL output
+
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+
+    // Selected Output port data and control signals
+    reg           active_dec;          // Combinatorial active_dec O/P signal
+    reg           HREADYOUTS;      // Combinatorial HREADYOUT signal
+    reg     [<<resp>>:0] HRESPS;          // Combinatorial HRESPS signal
+//---------------------------- << start user >> --------------------------------
+    reg    [<<user>>:0] HRUSERS;
+//----------------------------- << end user >> ---------------------------------
+    reg    [<<data>>:0] HRDATAS;         // Read data bus
+
+    reg     [<<idw_mi>>:0] addr_out_port;     // Address output ports
+    reg     [<<idw_mi>>:0] data_out_port;     // Data output ports
+
+    // Default slave signals
+    reg           sel_dft_slv;       // HSEL signal
+    wire          readyout_dft_slv;  // HREADYOUT signal
+    wire    [<<resp>>:0] resp_dft_slv;      // Combinatorial HRESPS signal
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+// Default slave (accessed when HADDR is unmapped)
+//------------------------------------------------------------------------------
+
+  <<default_slave_name>> u_<<default_slave_name>> (
+
+    // Common AHB signals
+    .HCLK        (HCLK),
+    .HRESETn     (HRESETn),
+
+    // AHB Control signals
+    .HSEL        (sel_dft_slv),
+    .HTRANS      (trans_dec),
+    .HREADY      (HREADYS),
+    .HREADYOUT   (readyout_dft_slv),
+    .HRESP       (resp_dft_slv)
+
+    );
+
+
+//------------------------------------------------------------------------------
+// Address phase signals
+//------------------------------------------------------------------------------
+
+// The address decode is done in two stages. This is so that the address
+//  decode occurs in only one process, p_addr_out_portComb, and then the select
+//  signal is factored in.
+//
+// Note that the hexadecimal address values are reformatted to align with the
+//  lower bound of decode_addr_dec[<<addr>>:10], which is not a hex character boundary
+
+  always @ (
+//----------------------------- << start map >> --------------------------------
+             decode_addr_dec or data_out_port or trans_dec
+//----------------------------- << end map >> ----------------------------------
+//---------------------------- << start remap >> -------------------------------
+             decode_addr_dec or
+             remapping_dec or data_out_port or trans_dec
+//----------------------------- << end remap >> --------------------------------
+           )
+    begin : p_addr_out_port_comb
+
+      // Only switch if there is an active transfer
+      if (trans_dec != 2'b00)
+      begin
+
+//----------------------------- << start map >> --------------------------------
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start addr_map >> ---------------------------
+//----------------------------- << start addr_region >> ------------------------
+        // Address region <<address_map>>
+        <<mdelse>>if ((decode_addr_dec >= <<mem_lo>>) & (decode_addr_dec <= <<mem_hi>>))
+          addr_out_port = <<idw_mi_v>>'b0<<bin_out>>;  // Select Output port MI<<out>>
+//------------------------------ << end addr_region >> -------------------------
+
+//----------------------------- << end addr_map >> -----------------------------
+//------------------------------ << end out >> ---------------------------------
+        else
+          addr_out_port = <<idw_mi_v>>'b<<dsid_bin>>;   // Select the default slave
+//----------------------------- << end map >> ----------------------------------
+//---------------------------- << start remap >> -------------------------------
+        case (remapping_dec)  // Composition: <<remapping_vector>>
+//----------------------------- << start remap_state >> ------------------------
+          <<idw_remap_v>>'b<<bin_remapstate>> : begin
+//----------------------------- << start remap_bit >> --------------------------
+//----------------------------- << start addr_remap >> -------------------------
+//----------------------------- << start remap_region >> -----------------------
+            // Remapped address region <<address_map>> due to REMAP[<<remapping_bit>>]
+            <<mdelse>>if ((decode_addr_dec >= <<mem_lo>>) & (decode_addr_dec <= <<mem_hi>>))
+               addr_out_port = <<idw_mi_v>>'b0<<bin_out>>;  // Select Output port MI<<out>>
+
+//------------------------------ << end remap_region >> -------------------------
+//----------------------------- << end addr_remap >> ---------------------------
+//------------------------------ << end remap_bit >> ---------------------------
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start addr_map >> ---------------------------
+//----------------------------- << start addr_region >> ------------------------
+            // <<region_type>> address region <<address_map>>
+            <<mdelse>>if ((decode_addr_dec >= <<mem_lo>>) & (decode_addr_dec <= <<mem_hi>>))
+               addr_out_port = <<idw_mi_v>>'b0<<bin_out>>;  // Select Output port MI<<out>>
+//------------------------------ << end addr_region >> -------------------------
+
+//----------------------------- << end addr_map >> -----------------------------
+//------------------------------ << end out >> ---------------------------------
+            else
+              addr_out_port = <<idw_mi_v>>'b<<dsid_bin>>;   // Select the default slave
+          end
+
+//------------------------------ << end remap_state >> -------------------------
+          default : addr_out_port = {<<idw_mi_v>>{1'bx}};
+        endcase
+//----------------------------- << end remap >> --------------------------------
+
+      end // if (trans_dec != 2'b00)
+      else
+        addr_out_port = data_out_port;   // Stay on last port if no activity
+
+    end // block: p_addr_out_port_comb
+
+  // Select signal decode
+  always @ (sel_dec or addr_out_port)
+    begin : p_sel_comb
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+      sel_dec<<out>> = 1'b0;
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+      sel_dft_slv = 1'b0;
+
+      if (sel_dec)
+        case (addr_out_port)
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+          <<idw_mi_v>>'b0<<bin_out>> : sel_dec<<out>> = 1'b1;
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+          <<idw_mi_v>>'b<<dsid_bin>> : sel_dft_slv = 1'b1;    // Select the default slave
+          default : begin
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+            sel_dec<<out>> = 1'bx;
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+            sel_dft_slv = 1'bx;
+          end
+        endcase // case(addr_out_port)
+    end // block: p_sel_comb
+
+// The decoder selects the appropriate active_dec signal depending on which
+//  output stage is required for the transfer.
+  always @ (
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+             active_dec<<out>> or
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+             addr_out_port
+           )
+    begin : p_active_comb
+      case (addr_out_port)
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+        <<idw_mi_v>>'b0<<bin_out>> : active_dec = active_dec<<out>>;
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+        <<idw_mi_v>>'b<<dsid_bin>> : active_dec = 1'b1;         // Select the default slave
+        default : active_dec = 1'bx;
+      endcase // case(addr_out_port)
+    end // block: p_active_comb
+
+
+//------------------------------------------------------------------------------
+// Data phase signals
+//------------------------------------------------------------------------------
+
+// The data_out_port needs to be updated when HREADY from the input stage is high.
+//  Note: HREADY must be used, not HREADYOUT, because there are occaisions
+//  (namely when the holding register gets loaded) when HREADYOUT may be low
+//  but HREADY is high, and in this case it is important that the data_out_port
+//  gets updated.
+//  When the port is inactive, the default slave is selected to prevent toggling.
+
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_data_out_port_seq
+      if (~HRESETn)
+        data_out_port <= <<idw_mi_v>>'b<<dsid_bin>>;
+      else
+        if (HREADYS)
+          if (sel_dec & trans_dec[1])
+            data_out_port <= addr_out_port;
+          else
+            data_out_port <= <<idw_mi_v>>'b<<dsid_bin>>;
+    end // block: p_data_out_port_seq
+
+  // HREADYOUTS output decode
+  always @ (
+             readyout_dft_slv or
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+             readyout_dec<<out>> or
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+             data_out_port
+           )
+  begin : p_ready_comb
+    case (data_out_port)
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+      <<idw_mi_v>>'b0<<bin_out>> : HREADYOUTS = readyout_dec<<out>>;
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+      <<idw_mi_v>>'b<<dsid_bin>> : HREADYOUTS = readyout_dft_slv;    // Select the default slave
+      default : HREADYOUTS = 1'bx;
+    endcase // case(data_out_port)
+  end // block: p_ready_comb
+
+  // HRESPS output decode
+  always @ (
+             resp_dft_slv or
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+             resp_dec<<out>> or
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+             data_out_port
+           )
+  begin : p_resp_comb
+    case (data_out_port)
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+      <<idw_mi_v>>'b0<<bin_out>> : HRESPS = resp_dec<<out>>;
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+      <<idw_mi_v>>'b<<dsid_bin>> : HRESPS = resp_dft_slv;     // Select the default slave
+      default : HRESPS = {<<resp_v>>{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_resp_comb
+
+  // HRDATAS output decode
+  always @ (
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+             rdata_dec<<out>> or
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+             data_out_port
+           )
+  begin : p_rdata_comb
+    case (data_out_port)
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+      <<idw_mi_v>>'b0<<bin_out>> : HRDATAS = rdata_dec<<out>>;
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+      <<idw_mi_v>>'b<<dsid_bin>> : HRDATAS = {<<data_v>>{1'b0}};   // Select the default slave
+      default : HRDATAS = {<<data_v>>{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_rdata_comb
+//---------------------------- << start user >> --------------------------------
+
+  // HRUSERS output decode
+  always @ (
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+             ruser_dec<<out>> or
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+             data_out_port
+           )
+  begin : p_ruser_comb
+    case (data_out_port)
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+      <<idw_mi_v>>'b0<<bin_out>> : HRUSERS = ruser_dec<<out>>;
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+      <<idw_mi_v>>'b<<dsid_bin>> : HRUSERS = {<<user_v>>{1'b0}};   // Select the default slave
+      default : HRUSERS = {<<user_v>>{1'bx}};
+    endcase // case (data_out_port)
+  end // block: p_ruser_comb
+//----------------------------- << end user >> ---------------------------------
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_default_slave.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_default_slave.v
new file mode 100755
index 0000000..a965f5d
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_default_slave.v
@@ -0,0 +1,141 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+// Abstract            : Default slave used to drive the slave response signals
+//                       when there are no other slaves selected.
+//-----------------------------------------------------------------------------
+
+<<timescale_directive>>
+
+module <<default_slave_name>> (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+    // AHB control input signals
+    HSEL,
+    HTRANS,
+    HREADY,
+
+    // AHB control output signals
+    HREADYOUT,
+    HRESP
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input         HCLK;           // AHB System Clock
+    input         HRESETn;        // AHB System Reset
+
+    // AHB control input signals
+    input         HSEL;           // Slave Select
+    input  [1:0]  HTRANS;         // Transfer type
+    input         HREADY;         // Transfer done
+
+    // AHB control output signals
+    output        HREADYOUT;      // HREADY feedback
+    output  [<<resp>>:0] HRESP;          // Transfer response
+
+
+// -----------------------------------------------------------------------------
+// Constant declarations
+// -----------------------------------------------------------------------------
+
+// HRESP transfer response signal encoding
+`define RSP_OKAY    <<resp_v>>'b<<bin_resp_okay>>      // OKAY response
+`define RSP_ERROR   <<resp_v>>'b<<bin_resp_error>>     // ERROR response
+`define RSP_RETRY   <<resp_v>>'b<<bin_resp_retry>>     // RETRY response
+`define RSP_SPLIT   <<resp_v>>'b<<bin_resp_split>>     // SPLIT response
+//----------------------------- << start excl >> -------------------------------
+`define RSP_XFAIL   <<resp_v>>'b<<bin_resp_xfail>>;    // XFAIL response
+//------------------------------ << end excl >> --------------------------------
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    wire          HCLK;           // AHB System Clock
+    wire          HRESETn;        // AHB System Reset
+
+    // AHB control input signals
+    wire          HSEL;           // Slave Select
+    wire    [1:0] HTRANS;         // Transfer type
+    wire          HREADY;         // Transfer done
+
+    // AHB control output signals
+    wire          HREADYOUT;      // HREADY feedback
+    wire    [<<resp>>:0] HRESP;          // Transfer response
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+
+    wire          invalid;    // Set during invalid transfer
+    wire          hready_next; // Controls generation of HREADYOUT output
+    reg           i_hreadyout; // HREADYOUT register
+    wire    [<<resp>>:0] hresp_next;  // Generated response
+    reg     [<<resp>>:0] i_hresp;     // HRESP register
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+  assign invalid = ( HREADY & HSEL & HTRANS[1] );
+  assign hready_next = i_hreadyout ?  ~invalid : 1'b1 ;
+  assign hresp_next = invalid ? `RSP_ERROR : `RSP_OKAY;
+
+  always @(negedge HRESETn or posedge HCLK)
+    begin : p_resp_seq
+      if (~HRESETn)
+        begin
+          i_hreadyout <= 1'b1;
+          i_hresp     <= `RSP_OKAY;
+        end
+      else
+        begin
+          i_hreadyout <= hready_next;
+
+          if (i_hreadyout)
+            i_hresp <= hresp_next;
+        end
+    end
+
+  // Drive outputs with internal versions
+  assign HREADYOUT = i_hreadyout;
+  assign HRESP     = i_hresp;
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_fixed_arb.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_fixed_arb.v
new file mode 100755
index 0000000..b10b090
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_fixed_arb.v
@@ -0,0 +1,179 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------
+//  Abstract            : The Output Arbitration is used to determine which
+//                        of the input stages will be given access to the
+//                        shared slave.
+//
+//  Notes               : The bus matrix has <<connectivity>> connectivity.
+//
+//-----------------------------------------------------------------------------
+
+<<timescale_directive>>
+
+module <<output_arb_name>> (
+
+    // Common AHB signals
+    HCLK ,
+    HRESETn,
+
+    // Input port request signals
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    req_port<<in>>,
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+    HREADYM,
+    HSELM,
+    HTRANSM,
+    HBURSTM,
+    HMASTLOCKM,
+
+    // Arbiter outputs
+    addr_in_port,
+    no_port
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input        HCLK;         // AHB system clock
+    input        HRESETn;      // AHB system reset
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    input        req_port<<in>>;     // Port <<in>> request signal
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+    input        HREADYM;      // Transfer done
+    input        HSELM;        // Slave select line
+    input  [1:0] HTRANSM;      // Transfer type
+    input  [2:0] HBURSTM;      // Burst type
+    input        HMASTLOCKM;   // Locked transfer
+
+    output [<<idw_si>>:0] addr_in_port;   // Port address input
+    output       no_port;       // No port selected signal
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+    wire       HCLK;           // AHB system clock
+    wire       HRESETn;        // AHB system reset
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    wire       req_port<<in>>;       // Port <<in>> request signal
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+    wire       HREADYM;        // Transfer done
+    wire       HSELM;          // Slave select line
+    wire [1:0] HTRANSM;        // Transfer type
+    wire       HMASTLOCKM;     // Locked transfer
+    wire [<<idw_si>>:0] addr_in_port;     // Port address input
+    reg        no_port;         // No port selected signal
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+    reg  [<<idw_si>>:0] addr_in_port_next; // D-input of addr_in_port
+    reg  [<<idw_si>>:0] iaddr_in_port;    // Internal version of addr_in_port
+    reg        no_port_next;     // D-input of no_port
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+// Port Selection
+//------------------------------------------------------------------------------
+// The Output Arbitration function looks at all the requests to use the
+//  output port and determines which is the highest priority request. This
+//  version of the arbitration logic uses a fixed priority scheme where input
+//  port 0 is the highest priority, input port 1 is the second highest
+//  priority, etc.
+// If none of the input ports are requesting then the current port will
+//  remain active if it is performing IDLE transfers to the selected slave. If
+//  this is not the case then the no_port signal will be asserted which
+//  indicates that no input port should be selected.
+
+  always @ (
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+             req_port<<in>> or
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+             HSELM or HTRANSM or HMASTLOCKM or iaddr_in_port
+           )
+
+  begin : p_sel_port_comb
+    // Default values are used for addr_in_port_next and no_port_next
+    no_port_next     = 1'b0;
+    addr_in_port_next = iaddr_in_port;
+
+    if (HMASTLOCKM)
+      addr_in_port_next = iaddr_in_port;
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    else if ( req_port<<in>> | ( (iaddr_in_port == <<idw_si_v>>'b<<bin_in>>) & HSELM &
+                            (HTRANSM != 2'b00) ) )
+      addr_in_port_next = <<idw_si_v>>'b<<bin_in>>;
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+    else if (HSELM)
+      addr_in_port_next = iaddr_in_port;
+    else
+      no_port_next = 1'b1;
+  end // block: p_sel_port_comb
+
+
+  // Sequential process
+  always @ (negedge HRESETn or posedge HCLK)
+  begin : p_addr_in_port_reg
+    if (~HRESETn)
+      begin
+        no_port      <= 1'b1;
+        iaddr_in_port <= {<<idw_si_v>>{1'b0}};
+      end
+    else
+      if (HREADYM)
+        begin
+          no_port      <= no_port_next;
+          iaddr_in_port <= addr_in_port_next;
+        end
+  end // block: p_addr_in_port_reg
+
+  // Drive output with internal version
+  assign addr_in_port = iaddr_in_port;
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_input_stage.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_input_stage.v
new file mode 100755
index 0000000..747c171
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_input_stage.v
@@ -0,0 +1,544 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------
+//  Abstract            : The Input Stage is used to hold a pending transfer
+//                        when the required output stage is not available.
+//---------------------------- << start unalign >> -----------------------------
+//                        Supports ARMv6 AMBA extensions for unaligned access.
+//----------------------------- << end unalign >> ------------------------------
+//----------------------------- << start excl >> -------------------------------
+//                        Supports ARMv6 AMBA extensions for exclusive access.
+//------------------------------ << end excl >> --------------------------------
+//
+//-----------------------------------------------------------------------------
+
+<<timescale_directive>>
+
+module <<input_stage_name>> (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+    // Input Port Address/Control Signals
+    HSELS,
+    HADDRS,
+//---------------------------- << start user >> --------------------------------
+    HAUSERS,
+//----------------------------- << end user >> ---------------------------------
+    HTRANSS,
+    HWRITES,
+    HSIZES,
+    HBURSTS,
+    HPROTS,
+//---------------------------- << start unalign >> -----------------------------
+    HUNALIGNS,
+    HBSTRBS,
+//----------------------------- << end unalign >> ------------------------------
+    HMASTERS,
+    HMASTLOCKS,
+    HREADYS,
+
+    // Internal Response
+    active_ip,
+    readyout_ip,
+    resp_ip,
+
+    // Input Port Response
+    HREADYOUTS,
+    HRESPS,
+
+    // Internal Address/Control Signals
+    sel_ip,
+    addr_ip,
+//---------------------------- << start user >> --------------------------------
+    auser_ip,
+//----------------------------- << end user >> ---------------------------------
+    trans_ip,
+    write_ip,
+    size_ip,
+    burst_ip,
+    prot_ip,
+//---------------------------- << start unalign >> -----------------------------
+    unalign_ip,
+    bstrb_ip,
+//----------------------------- << end unalign >> ------------------------------
+    master_ip,
+    mastlock_ip,
+    held_tran_ip
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    input         HCLK;            // AHB System Clock
+    input         HRESETn;         // AHB System Reset
+    input         HSELS;           // Slave Select from AHB
+    input  [<<addr>>:0] HADDRS;          // Address bus from AHB
+//---------------------------- << start user >> --------------------------------
+    input  [<<user>>:0] HAUSERS;         // Additional user adress bus
+//----------------------------- << end user >> ---------------------------------
+    input   [1:0] HTRANSS;         // Transfer type from AHB
+    input         HWRITES;         // Transfer direction from AHB
+    input   [2:0] HSIZES;          // Transfer size from AHB
+    input   [2:0] HBURSTS;         // Burst type from AHB
+    input   [<<prot>>:0] HPROTS;          // Protection control from AHB
+//---------------------------- << start unalign >> -----------------------------
+    input         HUNALIGNS;       // Unalign signal from AHB
+    input   [<<bstrb>>:0] HBSTRBS;         // Active Byte Lane strobes
+//----------------------------- << end unalign >> ------------------------------
+    input   [3:0] HMASTERS;        // Master number from AHB
+    input         HMASTLOCKS;      // Locked Sequence  from AHB
+    input         HREADYS;         // Transfer done from AHB
+    input         active_ip;          // active_ip signal
+    input         readyout_ip;        // HREADYOUT input
+    input   [<<resp>>:0] resp_ip;            // HRESP input
+
+    output        HREADYOUTS;      // HREADY feedback to AHB
+    output  [<<resp>>:0] HRESPS;          // Transfer response to AHB
+    output        sel_ip;             // HSEL output
+    output [<<addr>>:0] addr_ip;            // HADDR output
+//---------------------------- << start user >> --------------------------------
+    output [<<user>>:0] auser_ip;           // HAUSER output
+//----------------------------- << end user >> ---------------------------------
+    output  [1:0] trans_ip;           // HTRANS output
+    output        write_ip;           // HWRITE output
+    output  [2:0] size_ip;            // HSIZE output
+    output  [2:0] burst_ip;           // HBURST output
+    output  [<<prot>>:0] prot_ip;            // HPROT output
+//---------------------------- << start unalign >> -----------------------------
+    output        unalign_ip;         // HUNALIGN output
+    output  [<<bstrb>>:0] bstrb_ip;           // HBSTRB output
+//----------------------------- << end unalign >> ------------------------------
+    output [3:0]  master_ip;          // HMASTER output
+    output        mastlock_ip;        // HMASTLOCK output
+    output        held_tran_ip;        // Holding register active flag
+
+
+// -----------------------------------------------------------------------------
+// Constant declarations
+// -----------------------------------------------------------------------------
+
+// HTRANS transfer type signal encoding
+`define TRN_IDLE    2'b00     // Idle Transfer
+`define TRN_BUSY    2'b01     // Busy Transfer
+`define TRN_NONSEQ  2'b10     // Nonsequential transfer
+`define TRN_SEQ     2'b11     // Sequential transfer
+
+// HBURST transfer type signal encoding
+`define BUR_SINGLE  3'b000    // Single BURST
+`define BUR_INCR    3'b001    // Incremental BURSTS
+`define BUR_WRAP4   3'b010    // 4-beat wrap
+`define BUR_INCR4   3'b011    // 4-beat incr
+`define BUR_WRAP8   3'b100    // 8-beat wrap
+`define BUR_INCR8   3'b101    // 8-beat incr
+`define BUR_WRAP16  3'b110    // 16-beat wrap
+`define BUR_INCR16  3'b111    // 16-beat incr
+
+// HRESP signal encoding
+`define RSP_OKAY    <<resp_v>>'b<<bin_resp_okay>>      // OKAY response
+`define RSP_ERROR   <<resp_v>>'b<<bin_resp_error>>     // ERROR response
+`define RSP_RETRY   <<resp_v>>'b<<bin_resp_retry>>     // RETRY response
+`define RSP_SPLIT   <<resp_v>>'b<<bin_resp_split>>     // SPLIT response
+//----------------------------- << start excl >> -------------------------------
+`define RSP_XFAIL   <<resp_v>>'b<<bin_resp_xfail>>;    // XFAIL response
+//------------------------------ << end excl >> --------------------------------
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+
+    wire        HCLK;            // AHB System Clock
+    wire        HRESETn;         // AHB System Reset
+    wire        HSELS;           // Slave Select from AHB
+    wire [<<addr>>:0] HADDRS;          // Address bus from AHB
+//---------------------------- << start user >> --------------------------------
+    wire [<<user>>:0] HAUSERS;         // Additional user adress bus
+//----------------------------- << end user >> ---------------------------------
+    wire  [1:0] HTRANSS;         // Transfer type from AHB
+    wire        HWRITES;         // Transfer direction from AHB
+    wire  [2:0] HSIZES;          // Transfer size from AHB
+    wire  [2:0] HBURSTS;         // Burst type from AHB
+    wire  [<<prot>>:0] HPROTS;          // Protection control from AHB
+//---------------------------- << start unalign >> -----------------------------
+    wire        HUNALIGNS;       // Unalign signal from AHB
+    wire  [<<bstrb>>:0] HBSTRBS;         // Active Byte Lane strobes
+//----------------------------- << end unalign >> ------------------------------
+    wire  [3:0] HMASTERS;        // Master number from AHB
+    wire        HMASTLOCKS;      // Locked Sequence  from AHB
+    wire        HREADYS;         // Transfer done from AHB
+    reg         HREADYOUTS;      // HREADY feedback to AHB
+    reg   [<<resp>>:0] HRESPS;          // Transfer response to AHB
+    reg         sel_ip;             // HSEL output
+    reg  [<<addr>>:0] addr_ip;            // HADDR output
+//---------------------------- << start user >> --------------------------------
+    reg  [<<user>>:0] auser_ip;           // HAUSER output
+//----------------------------- << end user >> ---------------------------------
+    wire  [1:0] trans_ip;           // HTRANS output
+    reg         write_ip;           // HWRITE output
+    reg   [2:0] size_ip;            // HSIZE output
+    wire  [2:0] burst_ip;           // HBURST output
+    reg   [<<prot>>:0] prot_ip;            // HPROT output
+//---------------------------- << start unalign >> -----------------------------
+    wire        unalign_ip;         // HUNALIGN output
+    wire  [<<bstrb>>:0] bstrb_ip;           // HBSTRB output
+//----------------------------- << end unalign >> ------------------------------
+    reg   [3:0] master_ip;          // HMASTER output
+    reg         mastlock_ip;        // HMASTLOCK output
+    wire        held_tran_ip;        // Holding register active flag
+    wire        active_ip;          // active_ip signal
+    wire        readyout_ip;        // HREADYOUT input
+    wire  [<<resp>>:0] resp_ip;            // HRESP input
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+
+    wire        load_reg;             // Holding register load flag
+    wire        pend_tran;            // An active transfer cannot complete
+    reg         pend_tran_reg;         // Registered version of pend_tran
+    wire        addr_valid;           // Indicates address phase of
+                                     // valid transfer
+    reg         data_valid;           // Indicates data phase of
+                                     // valid transfer
+    reg   [1:0] reg_trans;            // Registered HTRANSS
+    reg  [<<addr>>:0] reg_addr;             // Registered HADDRS
+//---------------------------- << start user >> --------------------------------
+    reg  [<<user>>:0] reg_auser;
+//----------------------------- << end user >> ---------------------------------
+    reg         reg_write;            // Registered HWRITES
+    reg   [2:0] reg_size;             // Registered HSIZES
+    reg   [2:0] reg_burst;            // Registered HBURSTS
+    reg   [<<prot>>:0] reg_prot;             // Registered HPROTS
+//---------------------------- << start unalign >> -----------------------------
+    reg         reg_unalign;          // Registered HUNALIGNS
+    reg   [<<bstrb>>:0] reg_bstrb;            // Registered HBSTRBS
+//----------------------------- << end unalign >> ------------------------------
+    reg   [3:0] reg_master;           // Registerd HMASTERS
+    reg         reg_mastlock;         // Registered HMASTLOCKS
+    reg   [1:0] transb;               // HTRANS output used for burst information
+    reg   [1:0] trans_int;            // HTRANS output
+    reg   [2:0] burst_int;            // HBURST output
+    reg   [3:0] offset_addr;          // Address offset for boundary logic
+    reg   [3:0] check_addr;           // Address check for wrapped bursts
+    reg         burst_override;       // Registered burst_override_next
+    wire        burst_override_next;  // Indicates burst has been over-ridden
+    reg         bound;                // Registered version of bound_next
+    wire        bound_next;           // Indicates boundary wrapping
+    wire        bound_en;             // Clock-enable for bound register
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// Holding Registers
+// -----------------------------------------------------------------------------
+// Each input port has a holding register associated with it and a mux to
+//  select between the register and the direct input path. The control of
+//  the mux is done simply by selecting the holding register when it is loaded
+//  with a pending transfer, otherwise the straight through path is used.
+
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_holding_reg_seq1
+      if (~HRESETn)
+        begin
+          reg_trans    <= 2'b00;
+          reg_addr     <= {<<addr_v>>{1'b0}};
+//---------------------------- << start user >> --------------------------------
+          reg_auser    <= {<<user_v>>{1'b0}};
+//----------------------------- << end user >> ---------------------------------
+          reg_write    <= 1'b0 ;
+          reg_size     <= 3'b000;
+          reg_burst    <= 3'b000;
+          reg_prot     <= {<<prot_v>>{1'b0}};
+//---------------------------- << start unalign >> -----------------------------
+          reg_unalign  <= 1'b0;
+          reg_bstrb    <= {<<bstrb_v>>{1'b0}};
+//----------------------------- << end unalign >> ------------------------------
+          reg_master   <= 4'b0000;
+          reg_mastlock <= 1'b0 ;
+        end
+      else
+        if (load_reg)
+          begin
+            reg_trans    <= HTRANSS;
+            reg_addr     <= HADDRS;
+//---------------------------- << start user >> --------------------------------
+            reg_auser    <= HAUSERS;
+//----------------------------- << end user >> ---------------------------------
+            reg_write    <= HWRITES;
+            reg_size     <= HSIZES;
+            reg_burst    <= HBURSTS;
+            reg_prot     <= HPROTS;
+//---------------------------- << start unalign >> -----------------------------
+            reg_unalign  <= HUNALIGNS;
+            reg_bstrb    <= HBSTRBS;
+//----------------------------- << end unalign >> ------------------------------
+            reg_master   <= HMASTERS;
+            reg_mastlock <= HMASTLOCKS;
+          end
+    end
+
+  // addr_valid indicates the address phase of an active (non-BUSY/IDLE)
+  // transfer to this slave port
+  assign addr_valid = ( HSELS & HTRANSS[1] );
+
+  // The holding register is loaded whenever there is a transfer on the input
+  // port which is validated by active HREADYS
+  assign load_reg = ( addr_valid & HREADYS );
+
+  // data_valid register
+  // addr_valid indicates the data phase of an active (non-BUSY/IDLE)
+  // transfer to this slave port. A valid response (HREADY, HRESP) must be
+  // generated
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_data_valid
+      if (~HRESETn)
+        data_valid <= 1'b0;
+      else
+       if (HREADYS)
+        data_valid  <= addr_valid;
+    end
+
+// -----------------------------------------------------------------------------
+// Generate HeldTran
+// -----------------------------------------------------------------------------
+// The HeldTran signal is used to indicate when there is an active transfer
+// being presented to the output stage, either passing straight through or from
+// the holding register.
+
+  // pend_tran indicates that an active transfer presented to this
+  // slave cannot complete immediately.  It is always set after the
+  // load_reg signal has been active. When set, it is cleared when the
+  // transfer is being driven onto the selected slave (as indicated by
+  // active_ip being high) and HREADY from the selected slave is high.
+  assign pend_tran = (load_reg & (~active_ip)) ? 1'b1 :
+                    (active_ip & readyout_ip) ? 1'b0 : pend_tran_reg;
+
+  // pend_tran_reg indicates that an active transfer was accepted by the input
+  // stage,but not by the output stage, and so the holding registers should be
+  // used
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_pend_tran_reg
+      if (~HRESETn)
+        pend_tran_reg <= 1'b0;
+      else
+        pend_tran_reg <= pend_tran;
+    end
+
+  // held_tran_ip indicates an active transfer, and is held whilst that transfer is
+  // in the holding registers.  It passes to the output stage where it acts as
+  // a request line to the arbitration scheme
+  assign  held_tran_ip  = (load_reg | pend_tran_reg);
+
+  // The output from this stage is selected from the holding register when
+  //  there is a held transfer. Otherwise the direct path is used.
+
+  always @ ( pend_tran_reg or HSELS or HTRANSS or HADDRS or HWRITES or
+             HSIZES or HBURSTS or HPROTS or HMASTERS or HMASTLOCKS or
+//---------------------------- << start user >> --------------------------------
+             HAUSERS or reg_auser or
+//----------------------------- << end user >> ---------------------------------
+             reg_addr or reg_write or reg_size or reg_burst or reg_prot or
+             reg_master or reg_mastlock
+           )
+    begin : p_mux_comb
+      if (~pend_tran_reg)
+        begin
+          sel_ip      = HSELS;
+          trans_int   = HTRANSS;
+          addr_ip     = HADDRS;
+//---------------------------- << start user >> --------------------------------
+          auser_ip    = HAUSERS;
+//----------------------------- << end user >> ---------------------------------
+          write_ip    = HWRITES;
+          size_ip     = HSIZES;
+          burst_int   = HBURSTS;
+          prot_ip     = HPROTS;
+          master_ip   = HMASTERS;
+          mastlock_ip = HMASTLOCKS;
+        end
+      else
+        begin
+          sel_ip      = 1'b1;
+          trans_int   = `TRN_NONSEQ;
+          addr_ip     = reg_addr;
+//---------------------------- << start user >> --------------------------------
+          auser_ip    = reg_auser;
+//----------------------------- << end user >> ---------------------------------
+          write_ip    = reg_write;
+          size_ip     = reg_size;
+          burst_int   = reg_burst;
+          prot_ip     = reg_prot;
+          master_ip   = reg_master;
+          mastlock_ip = reg_mastlock;
+        end
+    end
+
+  // The transb output is used to select the correct Burst value when completing
+  // an interrupted defined-lenght burst.
+
+  always @ (pend_tran_reg or HTRANSS or reg_trans)
+    begin : p_transb_comb
+      if (~pend_tran_reg)
+        transb = HTRANSS;
+      else
+        transb = reg_trans;
+    end // block: p_transb_comb
+
+//---------------------------- << start unalign >> -----------------------------
+  assign unalign_ip = (pend_tran_reg) ? reg_unalign : HUNALIGNS ;
+  assign bstrb_ip   = (pend_tran_reg) ? reg_bstrb : HBSTRBS ;
+//----------------------------- << end unalign >> ------------------------------
+
+  // Convert SEQ->NONSEQ and BUSY->IDLE when an address boundary is crossed
+  // whilst the burst type is being over-ridden, i.e. when completing an
+  // interrupted wrapping burst.
+  assign trans_ip = (burst_override & bound) ? {trans_int[1], 1'b0}
+               : trans_int;
+
+  assign burst_ip = (burst_override & (transb != `TRN_NONSEQ)) ? `BUR_INCR
+               : burst_int;
+
+// -----------------------------------------------------------------------------
+// HREADYOUT Generation
+// -----------------------------------------------------------------------------
+// There are three possible sources for the HREADYOUT signal.
+//  - It is driven LOW when there is a held transfer.
+//  - It is driven HIGH when not Selected or for Idle/Busy transfers.
+//  - At all other times it is driven from the appropriate shared
+//    slave.
+
+  always @ (data_valid or pend_tran_reg or readyout_ip or resp_ip)
+    begin : p_ready_comb
+      if (~data_valid)
+        begin
+          HREADYOUTS = 1'b1;
+          HRESPS     = `RSP_OKAY;
+        end
+      else if (pend_tran_reg)
+        begin
+          HREADYOUTS = 1'b0;
+          HRESPS     = `RSP_OKAY;
+        end
+      else
+        begin
+          HREADYOUTS = readyout_ip;
+          HRESPS     = resp_ip;
+        end
+    end // block: p_ready_comb
+
+// -----------------------------------------------------------------------------
+// Early Burst Termination
+// -----------------------------------------------------------------------------
+// There are times when the output stage will switch to another input port
+//  without allowing the current burst to complete. In these cases the HTRANS
+//  and HBURST signals need to be overriden to ensure that the transfers
+//  reaching the output port meet the AHB specification.
+
+  assign burst_override_next  = ( (HTRANSS == `TRN_NONSEQ) |
+                                (HTRANSS == `TRN_IDLE) ) ? 1'b0
+                              : ( (HTRANSS ==`TRN_SEQ) &
+                                   load_reg &
+                                   (~active_ip) ) ? 1'b1
+                                  : burst_override;
+
+  // burst_override register
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_burst_overrideseq
+      if (~HRESETn)
+        burst_override <= 1'b0;
+      else
+        if (HREADYS)
+          burst_override <= burst_override_next;
+    end // block: p_burst_overrideseq
+
+// -----------------------------------------------------------------------------
+// Boundary Checking Logic
+// -----------------------------------------------------------------------------
+  // offset_addr
+  always @ (HADDRS or HSIZES)
+    begin : p_offset_addr_comb
+      case (HSIZES)
+        3'b000 : offset_addr = HADDRS[3:0];
+        3'b001 : offset_addr = HADDRS[4:1];
+        3'b010 : offset_addr = HADDRS[5:2];
+        3'b011 : offset_addr = HADDRS[6:3];
+
+        3'b100, 3'b101, 3'b110, 3'b111 :
+          offset_addr = HADDRS[3:0];      // Sizes >= 128-bits are not supported
+
+        default : offset_addr = 4'bxxxx;
+      endcase
+    end
+
+  // check_addr
+  always @ (offset_addr or HBURSTS)
+    begin : p_check_addr_comb
+      case (HBURSTS)
+        `BUR_WRAP4 : begin
+          check_addr[1:0] = offset_addr[1:0];
+          check_addr[3:2] = 2'b11;
+        end
+
+        `BUR_WRAP8 : begin
+          check_addr[2:0] = offset_addr[2:0];
+          check_addr[3]   = 1'b1;
+        end
+
+        `BUR_WRAP16 :
+          check_addr[3:0] = offset_addr[3:0];
+
+        `BUR_SINGLE, `BUR_INCR, `BUR_INCR4, `BUR_INCR8, `BUR_INCR16 :
+          check_addr[3:0] = 4'b0000;
+
+        default : check_addr[3:0] = 4'bxxxx;
+      endcase
+    end
+
+  assign bound_next = ( check_addr == 4'b1111 );
+
+  assign bound_en = ( HTRANSS[1] & HREADYS );
+
+  // bound register
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_bound_seq
+      if (~HRESETn)
+        bound <= 1'b0;
+      else
+        if (bound_en)
+          bound <= bound_next;
+    end
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_output_stage.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_output_stage.v
new file mode 100755
index 0000000..27920fe
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_output_stage.v
@@ -0,0 +1,538 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+//  Abstract            : The Output Stage is used to route the required input
+//                        stage to the shared slave output.
+//
+//  Notes               : The bus matrix has <<connectivity>> connectivity,
+//                         and has a <<arbiter_type>> arbiter scheme.
+//
+//-----------------------------------------------------------------------------
+
+<<timescale_directive>>
+
+module <<output_stage_name>> (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    // Port <<in>> Signals
+    sel_op<<in>>,
+    addr_op<<in>>,
+//---------------------------- << start user >> --------------------------------
+    auser_op<<in>>,
+//----------------------------- << end user >> ---------------------------------
+    trans_op<<in>>,
+    write_op<<in>>,
+    size_op<<in>>,
+    burst_op<<in>>,
+    prot_op<<in>>,
+//---------------------------- << start unalign >> -----------------------------
+    unalign_op<<in>>,
+    bstrb_op<<in>>,
+//----------------------------- << end unalign >> ------------------------------
+    master_op<<in>>,
+    mastlock_op<<in>>,
+    wdata_op<<in>>,
+//---------------------------- << start user >> --------------------------------
+    wuser_op<<in>>,
+//----------------------------- << end user >> ---------------------------------
+    held_tran_op<<in>>,
+
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+    // Slave read data and response
+    HREADYOUTM,
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    active_op<<in>>,
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+    // Slave Address/Control Signals
+    HSELM,
+    HADDRM,
+//---------------------------- << start user >> --------------------------------
+    HAUSERM,
+//----------------------------- << end user >> ---------------------------------
+    HTRANSM,
+    HWRITEM,
+    HSIZEM,
+    HBURSTM,
+    HPROTM,
+//---------------------------- << start unalign >> -----------------------------
+    HUNALIGNM,
+    HBSTRBM,
+//----------------------------- << end unalign >> ------------------------------
+    HMASTERM,
+    HMASTLOCKM,
+    HREADYMUXM,
+//---------------------------- << start user >> --------------------------------
+    HWUSERM,
+//----------------------------- << end user >> ---------------------------------
+    HWDATAM
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input         HCLK;       // AHB system clock
+    input         HRESETn;    // AHB system reset
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    // Bus-switch input <<in>>
+    input         sel_op<<in>>;       // Port <<in>> HSEL signal
+    input [<<addr>>:0]  addr_op<<in>>;      // Port <<in>> HADDR signal
+//---------------------------- << start user >> --------------------------------
+    input [<<user>>:0]  auser_op<<in>>;     // Port <<in>> HAUSER signal
+//----------------------------- << end user >> ---------------------------------
+    input  [1:0]  trans_op<<in>>;     // Port <<in>> HTRANS signal
+    input         write_op<<in>>;     // Port <<in>> HWRITE signal
+    input  [2:0]  size_op<<in>>;      // Port <<in>> HSIZE signal
+    input  [2:0]  burst_op<<in>>;     // Port <<in>> HBURST signal
+    input  [<<prot>>:0]  prot_op<<in>>;      // Port <<in>> HPROT signal
+//---------------------------- << start unalign >> -----------------------------
+    input         unalign_op<<in>>;   // Port <<in>> HUNALIGN signal
+    input  [<<bstrb>>:0]  bstrb_op<<in>>;     // Port <<in>> HBSTRB signal
+//----------------------------- << end unalign >> ------------------------------
+    input  [3:0]  master_op<<in>>;    // Port <<in>> HMASTER signal
+    input         mastlock_op<<in>>;  // Port <<in>> HMASTLOCK signal
+    input [<<data>>:0]  wdata_op<<in>>;     // Port <<in>> HWDATA signal
+//---------------------------- << start user >> --------------------------------
+    input [<<user>>:0]  wuser_op<<in>>;     // Port <<in>> HWUSER signal
+//----------------------------- << end user >> ---------------------------------
+    input         held_tran_op<<in>>;  // Port <<in>> HeldTran signal
+
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+    input         HREADYOUTM; // HREADY feedback
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    output        active_op<<in>>;    // Port <<in>> Active signal
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+    // Slave Address/Control Signals
+    output        HSELM;      // Slave select line
+    output [<<addr>>:0] HADDRM;     // Address
+//---------------------------- << start user >> --------------------------------
+    output [<<user>>:0] HAUSERM;    // User Address bus
+//----------------------------- << end user >> ---------------------------------
+    output  [1:0] HTRANSM;    // Transfer type
+    output        HWRITEM;    // Transfer direction
+    output  [2:0] HSIZEM;     // Transfer size
+    output  [2:0] HBURSTM;    // Burst type
+    output  [<<prot>>:0] HPROTM;     // Protection control
+//---------------------------- << start unalign >> -----------------------------
+    output        HUNALIGNM;  // Unaligned transfer
+    output [<<bstrb>>:0]  HBSTRBM;    // Byte Lane strobe signal
+//----------------------------- << end unalign >> ------------------------------
+    output  [3:0] HMASTERM;   // Master ID
+    output        HMASTLOCKM; // Locked transfer
+    output        HREADYMUXM; // Transfer done
+//---------------------------- << start user >> --------------------------------
+    output [<<user>>:0] HWUSERM;    // User data bus
+//----------------------------- << end user >> ---------------------------------
+    output [<<data>>:0] HWDATAM;    // Write data
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+    wire        HCLK;       // AHB system clock
+    wire        HRESETn;    // AHB system reset
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    // Bus-switch input <<in>>
+    wire        sel_op<<in>>;       // Port <<in>> HSEL signal
+    wire [<<addr>>:0] addr_op<<in>>;      // Port <<in>> HADDR signal
+//---------------------------- << start user >> --------------------------------
+    wire [<<user>>:0] auser_op<<in>>;     // Port <<in>> HAUSER signal
+//----------------------------- << end user >> ---------------------------------
+    wire  [1:0] trans_op<<in>>;     // Port <<in>> HTRANS signal
+    wire        write_op<<in>>;     // Port <<in>> HWRITE signal
+    wire  [2:0] size_op<<in>>;      // Port <<in>> HSIZE signal
+    wire  [2:0] burst_op<<in>>;     // Port <<in>> HBURST signal
+    wire  [<<prot>>:0] prot_op<<in>>;      // Port <<in>> HPROT signal
+//---------------------------- << start unalign >> -----------------------------
+    wire        unalign_op<<in>>;   // Port <<in>> HUNALIGN signal
+    wire  [<<bstrb>>:0] bstrb_op<<in>>;     // Port <<in>> HBSTRB signal
+//----------------------------- << end unalign >> ------------------------------
+    wire  [3:0] master_op<<in>>;    // Port <<in>> HMASTER signal
+    wire        mastlock_op<<in>>;  // Port <<in>> HMASTLOCK signal
+    wire [<<data>>:0] wdata_op<<in>>;     // Port <<in>> HWDATA signal
+//---------------------------- << start user >> --------------------------------
+    wire [<<user>>:0] wuser_op<<in>>;     // Port <<in>> HWUSER signal
+//----------------------------- << end user >> ---------------------------------
+    wire        held_tran_op<<in>>;  // Port <<in>> HeldTran signal
+    reg         active_op<<in>>;    // Port <<in>> Active signal
+
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+    // Slave Address/Control Signals
+    wire        HSELM;      // Slave select line
+    reg  [<<addr>>:0] HADDRM;     // Address
+//---------------------------- << start user >> --------------------------------
+    reg  [<<user>>:0] HAUSERM;    // User Address bus
+//----------------------------- << end user >> ---------------------------------
+    wire  [1:0] HTRANSM;    // Transfer type
+    reg         HWRITEM;    // Transfer direction
+    reg   [2:0] HSIZEM;     // Transfer size
+    wire  [2:0] HBURSTM;    // Burst type
+    reg   [<<prot>>:0] HPROTM;     // Protection control
+//---------------------------- << start unalign >> -----------------------------
+    reg         HUNALIGNM;  // Unaligned transfer
+    reg  [<<bstrb>>:0]  HBSTRBM;    // Byte Lane strobe signal
+//----------------------------- << end unalign >> ------------------------------
+    reg   [3:0] HMASTERM;   // Master ID
+    wire        HMASTLOCKM; // Locked transfer
+    wire        HREADYMUXM; // Transfer done
+//---------------------------- << start user >> --------------------------------
+    reg  [<<user>>:0] HWUSERM;    // User data bus
+//----------------------------- << end user >> ---------------------------------
+    reg  [<<data>>:0] HWDATAM;    // Write data
+    wire        HREADYOUTM; // HREADY feedback
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    wire        req_port<<in>>;     // Port <<in>> request signal
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+    wire  [<<idw_si>>:0] addr_in_port;   // Address input port
+    reg   [<<idw_si>>:0] data_in_port;   // Data input port
+    wire        no_port;       // No port selected signal
+    reg         slave_sel;     // Slave select signal
+    reg         wdata_phase;   // Used to prevent unnecesary toggling
+
+    reg         hsel_lock;     // Held HSELS during locked sequence
+    wire        next_hsel_lock; // Pre-registered hsel_lock
+    wire        hlock_arb;     // HMASTLOCK modified by HSEL for arbitration
+
+    reg         i_hselm;       // Internal HSELM
+    reg   [1:0] i_htransm;     // Internal HTRANSM
+    reg   [2:0] i_hburstm;     // Internal HBURSTM
+    wire        i_hreadymuxm;  // Internal HREADYMUXM
+    reg         i_hmastlockm;  // Internal HMASTLOCKM
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// Port Selection
+// -----------------------------------------------------------------------------
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+  assign req_port<<in>> = held_tran_op<<in>> & sel_op<<in>>;
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+  // Arbiter instance for resolving requests to this output stage
+  <<output_arb_name>> u_output_arb (
+
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    .req_port<<in>>   (req_port<<in>>),
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+    .HREADYM    (i_hreadymuxm),
+    .HSELM      (i_hselm),
+    .HTRANSM    (i_htransm),
+    .HBURSTM    (i_hburstm),
+    .HMASTLOCKM (hlock_arb),
+
+    .addr_in_port (addr_in_port),
+    .no_port     (no_port)
+
+    );
+
+
+  // Active signal combinatorial decode
+  always @ (addr_in_port or no_port)
+    begin : p_active_comb
+      // Default value(s)
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+      active_op<<in>> = 1'b0;
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+      // Decode selection when enabled
+      if (~no_port)
+        case (addr_in_port)
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+          <<idw_si_v>>'b<<bin_in>> : active_op<<in>> = 1'b1;
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+          default : begin
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+            active_op<<in>> = 1'bx;
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+          end
+        endcase // case(addr_in_port)
+    end // block: p_active_comb
+
+
+  //  Address/control output decode
+  always @ (
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+             sel_op<<in>> or addr_op<<in>> or trans_op<<in>> or write_op<<in>> or
+             size_op<<in>> or burst_op<<in>> or prot_op<<in>> or
+//---------------------------- << start unalign >> -----------------------------
+             unalign_op<<in>> or bstrb_op<<in>> or
+//----------------------------- << end unalign >> ------------------------------
+//---------------------------- << start user >> --------------------------------
+             auser_op<<in>> or
+//----------------------------- << end user >> ---------------------------------
+             master_op<<in>> or mastlock_op<<in>> or
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+             addr_in_port or no_port
+           )
+    begin : p_addr_mux
+      // Default values
+      i_hselm     = 1'b0;
+      HADDRM      = {<<addr_v>>{1'b0}};
+//---------------------------- << start user >> --------------------------------
+      HAUSERM     = {<<user_v>>{1'b0}};
+//----------------------------- << end user >> ---------------------------------
+      i_htransm   = 2'b00;
+      HWRITEM     = 1'b0;
+      HSIZEM      = 3'b000;
+      i_hburstm   = 3'b000;
+      HPROTM      = {<<prot_v>>{1'b0}};
+//---------------------------- << start unalign >> -----------------------------
+      HUNALIGNM   = 1'b0;
+      HBSTRBM     = {<<bstrb_v>>{1'b0}};
+//----------------------------- << end unalign >> ------------------------------
+      HMASTERM    = 4'b0000;
+      i_hmastlockm= 1'b0;
+
+      // Decode selection when enabled
+      if (~no_port)
+        case (addr_in_port)
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+          // Bus-switch input <<in>>
+          <<idw_si_v>>'b<<bin_in>> :
+            begin
+              i_hselm     = sel_op<<in>>;
+              HADDRM      = addr_op<<in>>;
+//---------------------------- << start user >> --------------------------------
+              HAUSERM     = auser_op<<in>>;
+//----------------------------- << end user >> ---------------------------------
+              i_htransm   = trans_op<<in>>;
+              HWRITEM     = write_op<<in>>;
+              HSIZEM      = size_op<<in>>;
+              i_hburstm   = burst_op<<in>>;
+              HPROTM      = prot_op<<in>>;
+//---------------------------- << start unalign >> -----------------------------
+              HUNALIGNM   = unalign_op<<in>>;
+              HBSTRBM     = bstrb_op<<in>>;
+//----------------------------- << end unalign >> ------------------------------
+              HMASTERM    = master_op<<in>>;
+              i_hmastlockm= mastlock_op<<in>>;
+            end // case: 4'b<<bin_in>>
+
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+          default :
+            begin
+              i_hselm     = 1'bx;
+              HADDRM      = {<<addr_v>>{1'bx}};
+//---------------------------- << start user >> --------------------------------
+              HAUSERM     = {<<user_v>>{1'bx}};
+//----------------------------- << end user >> ---------------------------------
+              i_htransm   = 2'bxx;
+              HWRITEM     = 1'bx;
+              HSIZEM      = 3'bxxx;
+              i_hburstm   = 3'bxxx;
+              HPROTM      = {<<prot_v>>{1'bx}};
+//---------------------------- << start unalign >> -----------------------------
+              HUNALIGNM   = 1'bx;
+              HBSTRBM     = {<<bstrb_v>>{1'bx}};
+//----------------------------- << end unalign >> ------------------------------
+              HMASTERM    = 4'bxxxx;
+              i_hmastlockm= 1'bx;
+            end // case: default
+        endcase // case(addr_in_port)
+    end // block: p_addr_mux
+
+  // hsel_lock provides support for AHB masters that address other
+  // slave regions in the middle of a locked sequence (i.e. HSEL is
+  // de-asserted during the locked sequence).  Unless HMASTLOCK is
+  // held during these intermediate cycles, the OutputArb scheme will
+  // lose track of the locked sequence and may allow another input
+  // port to access the output port which should be locked
+  assign next_hsel_lock = (i_hselm & i_htransm[1] & i_hmastlockm) ? 1'b1 :
+                         (i_hmastlockm == 1'b0) ? 1'b0 :
+                          hsel_lock;
+
+  // Register hsel_lock
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_hsel_lock
+      if (~HRESETn)
+        hsel_lock <= 1'b0;
+      else
+        if (i_hreadymuxm)
+          hsel_lock <= next_hsel_lock;
+    end
+
+  // Version of HMASTLOCK which is masked when not selected, unless a
+  // locked sequence has already begun through this port
+  assign hlock_arb = i_hmastlockm & (hsel_lock | i_hselm);
+
+  assign HTRANSM    = i_htransm;
+  assign HBURSTM    = i_hburstm;
+  assign HSELM      = i_hselm;
+  assign HMASTLOCKM = i_hmastlockm;
+
+  // Dataport register
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_data_in_port_reg
+      if (~HRESETn)
+//------------------------------ << start rrin >> ------------------------------
+//------------------------------ << end rrin >> ------------------------------       used to get a valid port number for the reset of data_port
+        data_in_port <= <<idw_si_v>>'b<<bin_rrin>>;
+      else
+        if (i_hreadymuxm)
+          data_in_port <= addr_in_port;
+    end
+
+  // Dataphase register
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_wdata_phase_reg
+      if (~HRESETn)
+        wdata_phase <= 1'b0;
+      else
+        if (i_hreadymuxm)
+          wdata_phase <= i_hselm & i_htransm[1];
+    end
+
+
+  // HWDATAM output decode
+  always @ (
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+             wdata_op<<in>> or
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+             data_in_port or wdata_phase
+           )
+    begin : p_data_mux
+      // Default value
+      HWDATAM = {<<data_v>>{1'b0}};
+
+      // If interface active
+      if (wdata_phase)
+        // Decode selection
+        case (data_in_port)
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+          <<idw_si_v>>'b<<bin_in>> : HWDATAM  = wdata_op<<in>>;
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+          default : HWDATAM = {<<data_v>>{1'bx}};
+        endcase // case(data_in_port)
+    end // block: p_data_mux
+
+//---------------------------- << start user >> --------------------------------
+  // HWUSERM output decode
+  always @ (
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+             wuser_op<<in>> or
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+             data_in_port or wdata_phase
+           )
+    begin : p_wuser_mux
+      // Default value
+      HWUSERM  = {<<user_v>>{1'b0}};
+
+      // If interface active
+      if (wdata_phase)
+        // Decode selection
+        case (data_in_port)
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+          <<idw_si_v>>'b<<bin_in>> : HWUSERM  = wuser_op<<in>>;
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+          default : HWUSERM  = {<<user_v>>{1'bx}};
+        endcase // case(data_in_port)
+    end // block: p_wuser_mux
+//----------------------------- << end user >> ---------------------------------
+
+  // ---------------------------------------------------------------------------
+  // HREADYMUXM generation
+  // ---------------------------------------------------------------------------
+  // The HREADY signal on the shared slave is generated directly from
+  //  the shared slave HREADYOUTS if the slave is selected, otherwise
+  //  it mirrors the HREADY signal of the appropriate input port
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_slave_sel_reg
+      if (~HRESETn)
+         slave_sel <= 1'b0;
+      else
+        if (i_hreadymuxm)
+           slave_sel  <= i_hselm;
+    end
+
+  // HREADYMUXM output selection
+  assign i_hreadymuxm = (slave_sel) ? HREADYOUTM : 1'b1;
+
+  // Drive output with internal version of the signal
+  assign HREADYMUXM = i_hreadymuxm;
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_round_arb.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_round_arb.v
new file mode 100755
index 0000000..5108798
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_round_arb.v
@@ -0,0 +1,375 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+//  Abstract            : The Output Arbitration is used to determine which
+//                        of the input stages will be given access to the
+//                        shared slave.
+//
+//  Notes               : The bus matrix has <<connectivity>> connectivity.
+//
+//-----------------------------------------------------------------------------
+
+<<timescale_directive>>
+
+module <<output_arb_name>> (
+
+    // Common AHB signals
+    HCLK ,
+    HRESETn,
+
+    // Input port request signals
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    req_port<<in>>,
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+    HREADYM,
+    HSELM,
+    HTRANSM,
+    HBURSTM,
+    HMASTLOCKM,
+
+    // Arbiter outputs
+    addr_in_port,
+    no_port
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input        HCLK;         // AHB system clock
+    input        HRESETn;      // AHB system reset
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    input        req_port<<in>>;     // Port <<in>> request signal
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+    input        HREADYM;      // Transfer done
+    input        HSELM;        // Slave select line
+    input  [1:0] HTRANSM;      // Transfer type
+    input  [2:0] HBURSTM;      // Burst type
+    input        HMASTLOCKM;   // Locked transfer
+    output [<<idw_si>>:0] addr_in_port;   // Port address input
+    output       no_port;      // No port selected signal
+
+
+// -----------------------------------------------------------------------------
+// Constant declarations
+// -----------------------------------------------------------------------------
+// HTRANS transfer type signal encoding
+`define TRN_IDLE   2'b00       // Idle transfer
+`define TRN_BUSY   2'b01       // Busy transfer
+`define TRN_NONSEQ 2'b10       // NonSequential transfer
+`define TRN_SEQ    2'b11       // Sequential transfer
+
+// HBURST transfer type signal encoding
+`define BUR_SINGLE 3'b000       // Single
+`define BUR_INCR   3'b001       // Incremental
+`define BUR_WRAP4  3'b010       // 4-beat wrap
+`define BUR_INCR4  3'b011       // 4-beat Incr
+`define BUR_WRAP8  3'b100       // 8-beat wrap
+`define BUR_INCR8  3'b101       // 8-beat Incr
+`define BUR_WRAP16 3'b110       // 16-beat Wrap
+`define BUR_INCR16 3'b111       // 16-beat Incr
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+    wire       HCLK;           // AHB system clock
+    wire       HRESETn;        // AHB system reset
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    wire       req_port<<in>>;       // Port <<in>> request signal
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+    wire       HREADYM;        // Transfer done
+    wire       HSELM;          // Slave select line
+    wire [1:0] HTRANSM;        // Transfer type
+    wire [2:0] HBURSTM;        // Burst type
+    wire       HMASTLOCKM;     // Locked transfer
+    wire [<<idw_si>>:0] addr_in_port;     // Address input port
+    wire       no_port;        // No port selected signal
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+    reg  [<<idw_si>>:0] next_addr_in_port; // D-input of addr_in_port
+    reg                 next_no_port;      // D-input of no_port
+    reg  [<<idw_si>>:0] i_addr_in_port;    // Internal version of addr_in_port
+    reg                 i_no_port;         // Internal version of no_port
+
+    // Burst counter logic
+    reg  [3:0] next_burst_remain;    // D-input of reg_burst_remain
+    reg  [3:0] reg_burst_remain;     // Burst counter
+    reg        next_burst_hold;      // D-input of reg_burst_hold
+    reg        reg_burst_hold;       // Burst hold signal
+
+    // INCR burst logic
+    reg  [1:0] reg_early_term_count; // Counts number of INCR bursts terminated
+                                     //  earlier than 4-beats or early terminated bursts
+    wire [1:0] next_early_term_count; // D-input for reg_early_term_count
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// BURST TRANSFER COUNTER
+// -----------------------------------------------------------------------------
+//
+// The Burst counter is used to count down from the number of transfers the
+// master should perform and when the counter reaches zero the bus may be
+// passed to another master.
+//
+// reg_burst_remain indicates the number of transfers remaining in the
+// current fixed length burst after the current transfer.
+// reg_burst_hold is set when transfers remain in a burst and causes the arbitration
+// to be held in the current cycle
+
+  always @ (HTRANSM or HSELM or HBURSTM or reg_burst_remain or reg_burst_hold or reg_early_term_count)
+    begin : p_next_burst_remain_comb
+      // Force the Burst logic to reset if this port is de-selected.  This would
+      // otherwise cause problems in several situations, e.g.:
+      //   1. The master performs 2 fixed-length bursts back-to-back, but the
+      //      second is to an alternate output port
+      //   2. The master is performing a fixed-length burst but is de-granted mid-
+      //      way by a local AHB Arbiter
+      if (~HSELM)
+        begin
+          next_burst_remain = 4'b0000;
+          next_burst_hold  = 1'b0;
+        end
+
+      // Burst logic is initialised on a NONSEQ transfer (i.e. start of burst)
+      // IDLE transfers cause the logic to reset
+      // BUSY transfers pause the decrementer
+      // SEQ transfers decrement the counter
+      else
+        case (HTRANSM)
+
+          `TRN_NONSEQ : begin
+            case (HBURSTM)
+              `BUR_INCR16, `BUR_WRAP16 : begin
+                next_burst_remain = 4'd15;
+                next_burst_hold = 1'b1;
+              end // case: BUR_INCR16 | BUR_WRAP16
+
+              `BUR_INCR8, `BUR_WRAP8 : begin
+                next_burst_remain = 4'd7;
+                next_burst_hold = 1'b1;
+              end // case: BUR_INCR8 | BUR_WRAP8
+
+              `BUR_INCR4, `BUR_WRAP4 : begin
+                next_burst_remain = 4'd3;
+                next_burst_hold = 1'b1;
+              end // case: BUR_INCR4 | BUR_WRAP4
+
+              `BUR_INCR : begin
+                    next_burst_remain = 4'd3;
+                    next_burst_hold = 1'b1;
+              end // case: BUR_INCR
+
+              `BUR_SINGLE : begin
+                next_burst_remain = 4'd0;
+                next_burst_hold  = 1'b0;
+              end // case: BUR_SINGLE | BUR_INCR
+
+              default : begin
+                next_burst_remain = 4'bxxxx;
+                next_burst_hold = 1'bx;
+              end // case: default
+
+            endcase // case(HBURSTM)
+
+            // Prevent early burst termination from keeping hold of the port
+            if (reg_early_term_count == 2'b10)
+            begin
+               next_burst_hold = 1'b0;
+               next_burst_remain = 4'd0;
+            end
+
+          end // case: `TRN_NONSEQ
+
+          `TRN_SEQ : begin
+            if (reg_burst_remain == 4'd1) // this was last one remaining
+              begin
+                next_burst_hold = 1'b0;
+                next_burst_remain = 4'd0;
+              end
+            else
+              begin
+                next_burst_hold = reg_burst_hold;
+                if (reg_burst_remain != 4'd0)
+                  next_burst_remain = reg_burst_remain - 4'b1;
+                else
+                  next_burst_remain = 4'd0;
+              end
+          end // case: `TRN_SEQ
+
+          `TRN_BUSY : begin
+            next_burst_remain = reg_burst_remain;
+            next_burst_hold = reg_burst_hold;
+          end // case: `TRN_BUSY
+
+          `TRN_IDLE : begin
+            next_burst_remain = 4'd0;
+            next_burst_hold = 1'b0;
+          end // case: `TRN_IDLE
+
+          default : begin
+            next_burst_remain = 4'bxxxx;
+            next_burst_hold = 1'bx;
+          end // case: default
+
+        endcase // case(HTRANSM)
+    end // block: p_next_burst_remain_comb
+
+
+  // reg_early_term_count counts the number of bursts which have terminated
+  // earlier than the defined arbitration point: this is primarily
+  // intended to detect back-to-back INCR bursts which are less than 4
+  // beats long or early terminated bursts by another interconnect.
+  // If such bursts are not counted then theoretically a
+  // sequence of e.g. 3-beat INCR bursts from a master would lock the
+  // arbitration scheme indefinitely.
+
+  assign next_early_term_count = (!next_burst_hold) ? 2'b00 :
+                               (reg_burst_hold & (HTRANSM == `TRN_NONSEQ)) ?
+                                reg_early_term_count + 2'b1 :
+                                reg_early_term_count;
+
+  // Sequential process
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_burst_seq
+      if (~HRESETn)
+        begin
+          reg_burst_remain     <= 4'b0000;
+          reg_burst_hold       <= 1'b0;
+          reg_early_term_count <= 2'b00;
+        end // if (HRESETn == 1'b0)
+      else
+        if (HREADYM)
+          begin
+            reg_burst_remain     <= next_burst_remain;
+            reg_burst_hold       <= next_burst_hold;
+            reg_early_term_count <= next_early_term_count;
+          end
+    end // block: p_burst_seq
+
+
+// -----------------------------------------------------------------------------
+// Port Selection
+// -----------------------------------------------------------------------------
+// The Output Arbitration function looks at all the requests to use the
+//  output port and determines which is the highest priority request. This
+//  version of the arbitration logic uses a round-robin scheme.
+// For example if port 1 is currently in use then the arbiter will first check
+//  if port 2 requires access, then it checks port 3, then port 4 etc. When
+//  port 2 is currently in use it will check port 3 first then port 4 and
+//  all  remaining ports, before finally checking port 1.
+// If none of the input ports are requesting then the current port will
+//  remain active if it is performing IDLE transfers to the selected slave. If
+//  this is not the case then the no_port signal will be asserted which
+//  indicates that no input port should be selected.
+
+  always @ (
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+             req_port<<in>> or
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+             HMASTLOCKM or next_burst_hold or HSELM or i_no_port or i_addr_in_port
+           )
+    begin : p_sel_port_comb
+      // Default values are used for next_no_port and next_addr_in_port
+      next_no_port = 1'b0;
+      next_addr_in_port = i_addr_in_port;
+
+      if ( HMASTLOCKM | next_burst_hold )
+        next_addr_in_port = i_addr_in_port;
+      else if (i_no_port)
+        begin
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+          <<rrelse>>if (req_port<<in>>)
+            next_addr_in_port = <<idw_si_v>>'b<<bin_in>>;
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end in >> ----------------------------------
+          else
+            next_no_port = 1'b1;
+        end
+      else
+        case (i_addr_in_port)
+//------------------------------ << start rrin >> ------------------------------
+          <<idw_si_v>>'b<<bin_rrin>> : begin
+//------------------------------ << start rridx >> -----------------------------
+            <<rrelse>>if (req_port<<rridx>>)
+              next_addr_in_port = <<idw_si_v>>'b<<bin_rridx>>;
+//------------------------------ << end rridx >> -------------------------------
+            else if (HSELM)
+              next_addr_in_port = <<idw_si_v>>'b<<bin_rrin>>;
+            else
+              next_no_port = 1'b1;
+          end
+
+//------------------------------ << end rrin >> --------------------------------
+          default : begin
+            next_addr_in_port = {<<idw_si_v>>{1'bx}};
+            next_no_port = 1'bx;
+          end
+      endcase
+    end
+
+  // Sequential process
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_addr_in_port_reg
+      if (~HRESETn)
+        begin
+          i_no_port      <= 1'b1;
+          i_addr_in_port <= {<<idw_si_v>>{1'b0}};
+        end
+      else
+        if (HREADYM)
+          begin
+            i_no_port      <= next_no_port;
+            i_addr_in_port <= next_addr_in_port;
+          end
+    end
+
+  // Drive outputs with internal versions
+  assign addr_in_port = i_addr_in_port;
+  assign no_port      = i_no_port;
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_arb.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_arb.v
new file mode 100755
index 0000000..5719c83
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_arb.v
@@ -0,0 +1,160 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------
+//  Abstract             : The Output Arbitration is normally used to determine
+//                         which of the input stages will be given access to
+//                         the shared slave. However, for this output port, only
+//                         one sparse connection is declared and arbitration
+//                         is simplified to a 'grant when requested' function.
+//
+//  Notes               : The bus matrix has <<connectivity>> connectivity and the
+//                         <<arbiter_type>> arbiter scheme has been overridden for this
+//                         instance only.
+//
+//-----------------------------------------------------------------------------
+
+<<timescale_directive>>
+
+module <<output_arb_name>> (
+
+    // Common AHB signals
+    HCLK ,
+    HRESETn,
+
+    // Input port request signals
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    req_port<<in>>,
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+    HREADYM,
+    HSELM,
+    HTRANSM,
+    HBURSTM,
+    HMASTLOCKM,
+
+    // Arbiter outputs
+    addr_in_port,
+    no_port
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input        HCLK;         // AHB system clock
+    input        HRESETn;      // AHB system reset
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    input        req_port<<in>>;     // Port <<in>> request signal
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+    input        HREADYM;      // Transfer done
+    input        HSELM;        // Slave select line
+    input  [1:0] HTRANSM;      // Transfer type
+    input  [2:0] HBURSTM;      // Burst type
+    input        HMASTLOCKM;   // Locked transfer
+
+    output [<<idw_si>>:0] addr_in_port;   // Port address input
+    output       no_port;       // No port selected signal
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+    wire       HCLK;           // AHB system clock
+    wire       HRESETn;        // AHB system reset
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    wire       req_port<<in>>;       // Port <<in>> request signal
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+    wire       HREADYM;        // Transfer done
+    wire       HSELM;          // Slave select line
+    wire [1:0] HTRANSM;        // Transfer type
+    wire       HMASTLOCKM;     // Locked transfer
+    wire [<<idw_si>>:0] addr_in_port;     // Port address input
+    reg        no_port;         // No port selected signal
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+    wire [<<idw_si>>:0] addr_in_port_next; // D-input of addr_in_port
+    reg  [<<idw_si>>:0] iaddr_in_port;    // Internal version of addr_in_port
+    wire       no_port_next;     // D-input of no_port
+    wire       request;        // Slave port request
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+// Port Selection
+//------------------------------------------------------------------------------
+// The single output 'arbitration' function looks at the request to use the
+//  output port and grants it appropriately. The input port will remain granted
+//  if it is performing IDLE transfers to the selected slave. If this is not
+//  the case then the no_port signal will be asserted which indicates that the
+//  input port should be deselected.
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+  assign request = req_port<<in>> | ( (iaddr_in_port == <<idw_si_v>>'b<<bin_in>>) & HSELM &
+                                (HTRANSM != 2'b00) );
+
+  assign no_port_next     = ! ( HMASTLOCKM | request | HSELM );
+  assign addr_in_port_next = ( request & !HMASTLOCKM ) ? <<idw_si_v>>'b<<bin_in>> : iaddr_in_port;
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+  // Sequential process
+  always @ (negedge HRESETn or posedge HCLK)
+  begin : p_addr_in_port_reg
+    if (~HRESETn)
+      begin
+        no_port      <= 1'b1;
+        iaddr_in_port <= {<<idw_si_v>>{1'b0}};
+      end
+    else
+      if (HREADYM)
+        begin
+          no_port      <= no_port_next;
+          iaddr_in_port <= addr_in_port_next;
+        end
+  end // block: p_addr_in_port_reg
+
+  // Drive output with internal version
+  assign addr_in_port = iaddr_in_port;
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_output_stage.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_output_stage.v
new file mode 100755
index 0000000..3aa5064
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_bm_single_output_stage.v
@@ -0,0 +1,416 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//-----------------------------------------------------------------------------
+//  Abstract             : The Output Stage is used to route the required input
+//                         stage to the shared slave output. However, for this
+//                         output port, only one sparse connection is declared
+//                         and muxing is simplified.
+//
+//  Notes               : The bus matrix has <<connectivity>> connectivity and the
+//                         standard output stage has been overridden for this
+//                         instance only.
+//
+//-----------------------------------------------------------------------------
+
+<<timescale_directive>>
+
+module <<output_stage_name>> (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    // Port <<in>> Signals
+    sel_op<<in>>,
+    addr_op<<in>>,
+//---------------------------- << start user >> --------------------------------
+    auser_op<<in>>,
+//----------------------------- << end user >> ---------------------------------
+    trans_op<<in>>,
+    write_op<<in>>,
+    size_op<<in>>,
+    burst_op<<in>>,
+    prot_op<<in>>,
+//---------------------------- << start unalign >> -----------------------------
+    unalign_op<<in>>,
+    bstrb_op<<in>>,
+//----------------------------- << end unalign >> ------------------------------
+    master_op<<in>>,
+    mastlock_op<<in>>,
+    wdata_op<<in>>,
+//---------------------------- << start user >> --------------------------------
+    wuser_op<<in>>,
+//----------------------------- << end user >> ---------------------------------
+    held_tran_op<<in>>,
+
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+    // Slave read data and response
+    HREADYOUTM,
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    active_op<<in>>,
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+    // Slave addr_opess/Control Signals
+    HSELM,
+    HADDRM,
+//---------------------------- << start user >> --------------------------------
+    HAUSERM,
+//----------------------------- << end user >> ---------------------------------
+    HTRANSM,
+    HWRITEM,
+    HSIZEM,
+    HBURSTM,
+    HPROTM,
+//---------------------------- << start unalign >> -----------------------------
+    HUNALIGNM,
+    HBSTRBM,
+//----------------------------- << end unalign >> ------------------------------
+    HMASTERM,
+    HMASTLOCKM,
+    HREADYMUXM,
+//---------------------------- << start user >> --------------------------------
+    HWUSERM,
+//----------------------------- << end user >> ---------------------------------
+    HWDATAM
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input         HCLK;       // AHB system clock
+    input         HRESETn;    // AHB system reset
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    // Bus-switch input <<in>>
+    input         sel_op<<in>>;       // Port <<in>> HSEL signal
+    input [<<addr>>:0]  addr_op<<in>>;      // Port <<in>> HADDR signal
+//---------------------------- << start user >> --------------------------------
+    input [<<user>>:0]  auser_op<<in>>;     // Port <<in>> HAUSER signal
+//----------------------------- << end user >> ---------------------------------
+    input  [1:0]  trans_op<<in>>;     // Port <<in>> HTRANS signal
+    input         write_op<<in>>;     // Port <<in>> HWRITE signal
+    input  [2:0]  size_op<<in>>;      // Port <<in>> HSIZE signal
+    input  [2:0]  burst_op<<in>>;     // Port <<in>> HBURST signal
+    input  [<<prot>>:0]  prot_op<<in>>;      // Port <<in>> HPROT signal
+//---------------------------- << start unalign >> -----------------------------
+    input         unalign_op<<in>>;   // Port <<in>> HUNALIGN signal
+    input  [<<bstrb>>:0]  bstrb_op<<in>>;     // Port <<in>> HBSTRB signal
+//----------------------------- << end unalign >> ------------------------------
+    input  [3:0]  master_op<<in>>;    // Port <<in>> HMASTER signal
+    input         mastlock_op<<in>>;  // Port <<in>> HMASTLOCK signal
+    input [<<data>>:0]  wdata_op<<in>>;     // Port <<in>> HWDATA signal
+//---------------------------- << start user >> --------------------------------
+    input [<<user>>:0]  wuser_op<<in>>;     // Port <<in>> HWUSER signal
+//----------------------------- << end user >> ---------------------------------
+    input         held_tran_op<<in>>;  // Port <<in>> held_tran_op signal
+
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+    input         HREADYOUTM; // HREADY feedback
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    output        active_op<<in>>;    // Port <<in>> active_op signal
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+    // Slave addr_opess/Control Signals
+    output        HSELM;      // Slave select line
+    output [<<addr>>:0] HADDRM;     // addr_opess
+//---------------------------- << start user >> --------------------------------
+    output [<<user>>:0] HAUSERM;    // User addr_opess bus
+//----------------------------- << end user >> ---------------------------------
+    output  [1:0] HTRANSM;    // trans_opfer type
+    output        HWRITEM;    // trans_opfer direction
+    output  [2:0] HSIZEM;     // trans_opfer size
+    output  [2:0] HBURSTM;    // burst_op type
+    output  [<<prot>>:0] HPROTM;     // prot_opection control
+//---------------------------- << start unalign >> -----------------------------
+    output        HUNALIGNM;  // unalign_oped transfer
+    output [<<bstrb>>:0]  HBSTRBM;    // Byte Lane strobe signal
+//----------------------------- << end unalign >> ------------------------------
+    output  [3:0] HMASTERM;   // master_op ID
+    output        HMASTLOCKM; // Locked transfer
+    output        HREADYMUXM; // trans_opfer done
+//---------------------------- << start user >> --------------------------------
+    output [<<user>>:0] HWUSERM;    // User data bus
+//----------------------------- << end user >> ---------------------------------
+    output [<<data>>:0] HWDATAM;    // write_op data
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+    wire        HCLK;       // AHB system clock
+    wire        HRESETn;    // AHB system reset
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    // Bus-switch input <<in>>
+    wire        sel_op<<in>>;       // Port <<in>> HSEL signal
+    wire [<<addr>>:0] addr_op<<in>>;      // Port <<in>> HADDR signal
+//---------------------------- << start user >> --------------------------------
+    wire [<<user>>:0] auser_op<<in>>;     // Port <<in>> HAUSER signal
+//----------------------------- << end user >> ---------------------------------
+    wire  [1:0] trans_op<<in>>;     // Port <<in>> HTRANS signal
+    wire        write_op<<in>>;     // Port <<in>> HWRITE signal
+    wire  [2:0] size_op<<in>>;      // Port <<in>> HSIZE signal
+    wire  [2:0] burst_op<<in>>;     // Port <<in>> HBURST signal
+    wire  [<<prot>>:0] prot_op<<in>>;      // Port <<in>> HPROT signal
+//---------------------------- << start unalign >> -----------------------------
+    wire        unalign_op<<in>>;   // Port <<in>> HUNALIGN signal
+    wire  [<<bstrb>>:0] bstrb_op<<in>>;     // Port <<in>> HBSTRB signal
+//----------------------------- << end unalign >> ------------------------------
+    wire  [3:0] master_op<<in>>;    // Port <<in>> HMASTER signal
+    wire        mastlock_op<<in>>;  // Port <<in>> HMASTLOCK signal
+    wire [<<data>>:0] wdata_op<<in>>;     // Port <<in>> HWDATA signal
+//---------------------------- << start user >> --------------------------------
+    wire [<<user>>:0] wuser_op<<in>>;     // Port <<in>> HWUSER signal
+//----------------------------- << end user >> ---------------------------------
+    wire        held_tran_op<<in>>;  // Port <<in>> held_tran_op signal
+    wire        active_op<<in>>;    // Port <<in>> active_op signal
+
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+    // Slave addr_opess/Control Signals
+    wire        HSELM;      // Slave select line
+    wire [<<addr>>:0] HADDRM;     // addr_opess
+//---------------------------- << start user >> --------------------------------
+    wire [<<user>>:0] HAUSERM;    // User addr_opess bus
+//----------------------------- << end user >> ---------------------------------
+    wire  [1:0] HTRANSM;    // trans_opfer type
+    wire        HWRITEM;    // trans_opfer direction
+    wire  [2:0] HSIZEM;     // trans_opfer size
+    wire  [2:0] HBURSTM;    // burst_op type
+    wire  [<<prot>>:0] HPROTM;     // prot_opection control
+//---------------------------- << start unalign >> -----------------------------
+    wire        HUNALIGNM;  // unalign_oped transfer
+    wire [<<bstrb>>:0]  HBSTRBM;    // Byte Lane strobe signal
+//----------------------------- << end unalign >> ------------------------------
+    wire  [3:0] HMASTERM;   // master_op ID
+    wire        HMASTLOCKM; // Locked transfer
+    wire        HREADYMUXM; // trans_opfer done
+//---------------------------- << start user >> --------------------------------
+    wire [<<user>>:0] HWUSERM;    // User data bus
+//----------------------------- << end user >> ---------------------------------
+    wire [<<data>>:0] HWDATAM;    // write_op data
+    wire        HREADYOUTM; // HREADY feedback
+
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    wire        req_port<<in>>;     // Port <<in>> request signal
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+    wire  [<<idw_si>>:0] addr_in_port;   // addr_opess input port
+    reg   [<<idw_si>>:0] data_in_port;   // Data input port
+    wire        no_port;       // No port selected signal
+    reg         slave_sel;     // Slave select signal
+
+    reg         wdata_phase;   // Used to prevent unnecesary toggling
+
+    reg         hsel_lock;     // Held HSELS during locked sequence
+    wire        next_hsel_lock; // Pre-registered hsel_lock
+    wire        hlock_arb;     // HMASTLOCK modified by HSEL for arbitration
+
+    wire        i_hselm;       // Internal HSELM
+    wire  [1:0] i_htransm;     // Internal HTRANSM
+    wire  [2:0] i_hburstm;     // Internal HBURSTM
+    wire        i_hreadymuxm;  // Internal HREADYMUXM
+    wire        i_hmastlockm;  // Internal HMASTLOCKM
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// Port sel_opection
+// -----------------------------------------------------------------------------
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+  assign req_port<<in>> = held_tran_op<<in>> & sel_op<<in>>;
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+  // Dummy arbiter instance for granting requests to this output stage
+  <<output_arb_name>> u_output_arb (
+
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    .req_port<<in>>   (req_port<<in>>),
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+    .HREADYM    (i_hreadymuxm),
+    .HSELM      (i_hselm),
+    .HTRANSM    (i_htransm),
+    .HBURSTM    (i_hburstm),
+    .HMASTLOCKM (hlock_arb),
+
+    .addr_in_port (addr_in_port),
+    .no_port     (no_port)
+
+    );
+
+
+  // active_op signal combinatorial decode
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+  assign active_op<<in>> = (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port;
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+  // addr_opess/control output decode
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+  assign i_hselm     = (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & sel_op<<in>> & !no_port;
+  assign HADDRM      = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? addr_op<<in>> : {<<addr_v>>{1'b0}};
+//---------------------------- << start user >> --------------------------------
+  assign HAUSERM     = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? auser_op<<in>> : {<<user_v>>{1'b0}};
+//----------------------------- << end user >> ---------------------------------
+  assign i_htransm   = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? trans_op<<in>> : 2'b00;
+  assign HWRITEM     = (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & write_op<<in>> & !no_port;
+  assign HSIZEM      = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? size_op<<in>> : 3'b000;
+  assign i_hburstm    = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? burst_op<<in>> : 3'b000;
+  assign HPROTM      = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? prot_op<<in>>  : {<<prot_v>>{1'b0}};
+//---------------------------- << start unalign >> -----------------------------
+  assign HUNALIGNM   = (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & unalign_op<<in>> & !no_port;
+  assign HBSTRBM     = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? bstrb_op<<in>> : {<<bstrb_v>>{1'b0}};
+//----------------------------- << end unalign >> ------------------------------
+  assign HMASTERM    = ( (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & !no_port ) ? master_op<<in>> : 4'b0000;
+  assign i_hmastlockm = (addr_in_port == <<idw_si_v>>'b<<bin_in>>) & mastlock_op<<in>> & !no_port;
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+  // hsel_lock provides support for AHB masters that address other
+  // slave regions in the middle of a locked sequence (i.e. HSEL is
+  // de-asserted during the locked sequence).  Unless HMASTLOCK is
+  // held during these intermediate cycles, the OutputArb scheme will
+  // lose track of the locked sequence and may allow another input
+  // port to access the output port which should be locked
+  assign next_hsel_lock = (i_hselm & i_htransm[1] & i_hmastlockm) ? 1'b1 :
+                         (i_hmastlockm == 1'b0) ? 1'b0 :
+                          hsel_lock;
+
+  // Register hsel_lock
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_hsel_lock
+      if (!HRESETn)
+        hsel_lock <= 1'b0;
+      else
+        if (i_hreadymuxm)
+          hsel_lock <= next_hsel_lock;
+    end
+
+  // Version of HMASTLOCK which is masked when not selected, unless a
+  // locked sequence has already begun through this port
+  assign hlock_arb = i_hmastlockm & (hsel_lock | i_hselm);
+
+  assign HTRANSM    = i_htransm;
+  assign HBURSTM    = i_hburstm;
+  assign HSELM      = i_hselm;
+  assign HMASTLOCKM = i_hmastlockm;
+
+  // Dataport register
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_data_in_port_reg
+      if (!HRESETn)
+        data_in_port <= {<<idw_si_v>>{1'b0}};
+      else
+        if (i_hreadymuxm)
+          data_in_port <= addr_in_port;
+    end
+
+  // Dataphase register
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_wdata_phase_reg
+      if (~HRESETn)
+        wdata_phase <= 1'b0;
+      else
+        if (i_hreadymuxm)
+          wdata_phase <= i_hselm & i_htransm[1];
+    end
+
+
+  // HWDATAM output decode
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+  assign HWDATAM = wdata_phase ? wdata_op<<in>> : {<<data_v>>{1'b0}};
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+
+//---------------------------- << start user >> --------------------------------
+  // HWUSERM output decode
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+  assign HWUSERM = wdata_phase ? wuser_op<<in>> : {<<user_v>>{1'b0}};
+//------------------------------ << end connection >> --------------------------
+//------------------------------- << end in >> ---------------------------------
+//----------------------------- << end user >> ---------------------------------
+
+  // ---------------------------------------------------------------------------
+  // HREADYMUXM generation
+  // ---------------------------------------------------------------------------
+  // The HREADY signal on the shared slave is generated directly from
+  //  the shared slave HREADYOUTS if the slave is selected, otherwise
+  //  it mirrors the HREADY signal of the appropriate input port
+  always @ (negedge HRESETn or posedge HCLK)
+    begin : p_slave_sel_reg
+      if (!HRESETn)
+        slave_sel <= 1'b0;
+      else
+        if (i_hreadymuxm)
+          slave_sel <= i_hselm;
+    end
+
+  // HREADYMUXM output selection
+  assign i_hreadymuxm = (slave_sel) ? HREADYOUTM : 1'b1;
+
+  // Drive output with internal version of the signal
+  assign HREADYMUXM = i_hreadymuxm;
+
+
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix.v
new file mode 100755
index 0000000..669eb9a
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix.v
@@ -0,0 +1,526 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------
+//  Abstract            : BusMatrix is the top-level which connects together
+//                        the required Input Stages, MatrixDecodes, Output
+//                        Stages and Output Arbitration blocks.
+//
+//                        Supports the following configured options:
+//
+//                         - Architecture type '<<architecture_type>>',
+//                         - <<total_si>> slave ports (connecting to masters),
+//                         - <<total_mi>> master ports (connecting to slaves),
+//                         - Routing address width of <<addr_v>> bits,
+//                         - Routing data width of <<data_v>> bits,
+//----------------------------- << start user >> -------------------------------
+//                         - xUSER signal width of <<user_v>> bits,
+//------------------------------ << end user >> --------------------------------
+//---------------------------- << start unalign >> -----------------------------
+//                         - ARMv6 AMBA extensions for unaligned access,
+//----------------------------- << end unalign >> ------------------------------
+//----------------------------- << start excl >> -------------------------------
+//                         - ARMv6 AMBA extensions for exclusive access,
+//------------------------------ << end excl >> --------------------------------
+//                         - Arbiter type '<<arbiter_type>>',
+//                         - Connectivity mapping:
+//                             <<mappings>>,
+//                         - Connectivity type '<<connectivity>>'.
+//
+//------------------------------------------------------------------------------
+
+<<timescale_directive>>
+
+module <<bus_matrix_name>> (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+    // System address remapping control
+    REMAP,
+
+//------------------------------ << start in >> --------------------------------
+    // Input port SI<<in>> (inputs from master <<in>>)
+    HSEL<<si_name>>,
+    HADDR<<si_name>>,
+    HTRANS<<si_name>>,
+    HWRITE<<si_name>>,
+    HSIZE<<si_name>>,
+    HBURST<<si_name>>,
+    HPROT<<si_name>>,
+//---------------------------- << start unalign >> -----------------------------
+    HUNALIGN<<si_name>>,
+    HBSTRB<<si_name>>,
+//----------------------------- << end unalign >> ------------------------------
+    HMASTER<<si_name>>,
+    HWDATA<<si_name>>,
+    HMASTLOCK<<si_name>>,
+    HREADY<<si_name>>,
+//---------------------------- << start user >> --------------------------------
+    HAUSER<<si_name>>,
+    HWUSER<<si_name>>,
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------- << end in >> ---------------------------------
+//----------------------------- << start out >> --------------------------------
+    // Output port MI<<out>> (inputs from slave <<out>>)
+    HRDATA<<mi_name>>,
+    HREADYOUT<<mi_name>>,
+    HRESP<<mi_name>>,
+//---------------------------- << start user >> ------------------------------
+    HRUSER<<mi_name>>,
+//----------------------------- << end user >> -------------------------------
+
+//------------------------------ << end out >> ---------------------------------
+    // Scan test dummy signals; not connected until scan insertion
+    SCANENABLE,   // Scan Test Mode Enable
+    SCANINHCLK,   // Scan Chain Input
+
+
+//----------------------------- << start out >> --------------------------------
+    // Output port MI<<out>> (outputs to slave <<out>>)
+    HSEL<<mi_name>>,
+    HADDR<<mi_name>>,
+    HTRANS<<mi_name>>,
+    HWRITE<<mi_name>>,
+    HSIZE<<mi_name>>,
+    HBURST<<mi_name>>,
+    HPROT<<mi_name>>,
+//---------------------------- << start unalign >> -----------------------------
+    HUNALIGN<<mi_name>>,
+    HBSTRB<<mi_name>>,
+//----------------------------- << end unalign >> ------------------------------
+    HMASTER<<mi_name>>,
+    HWDATA<<mi_name>>,
+    HMASTLOCK<<mi_name>>,
+    HREADYMUX<<mi_name>>,
+//---------------------------- << start user >> --------------------------------
+    HAUSER<<mi_name>>,
+    HWUSER<<mi_name>>,
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------ << end out >> ---------------------------------
+//------------------------------ << start in >> --------------------------------
+    // Input port SI<<in>> (outputs to master <<in>>)
+    HRDATA<<si_name>>,
+    HREADYOUT<<si_name>>,
+    HRESP<<si_name>>,
+//---------------------------- << start user >> ------------------------------
+    HRUSER<<si_name>>,
+//----------------------------- << end user >> -------------------------------
+
+//------------------------------- << end in >> ---------------------------------
+    // Scan test dummy signals; not connected until scan insertion
+    SCANOUTHCLK   // Scan Chain Output
+
+    );
+
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input         HCLK;            // AHB System Clock
+    input         HRESETn;         // AHB System Reset
+
+    // System address remapping control
+    input   [3:0] REMAP;           // REMAP input
+
+//------------------------------ << start in >> --------------------------------
+    // Input port SI<<in>> (inputs from master <<in>>)
+    input         HSEL<<si_name>>;          // Slave Select
+    input  [<<addr>>:0] HADDR<<si_name>>;         // Address bus
+    input   [1:0] HTRANS<<si_name>>;        // Transfer type
+    input         HWRITE<<si_name>>;        // Transfer direction
+    input   [2:0] HSIZE<<si_name>>;         // Transfer size
+    input   [2:0] HBURST<<si_name>>;        // Burst type
+    input   [<<prot>>:0] HPROT<<si_name>>;         // Protection control
+//---------------------------- << start unalign >> -----------------------------
+    input         HUNALIGN<<si_name>>;      // Unalign signal
+    input   [<<bstrb>>:0] HBSTRB<<si_name>>;        // Byte strobes
+//----------------------------- << end unalign >> ------------------------------
+    input   [3:0] HMASTER<<si_name>>;       // Master select
+    input  [<<data>>:0] HWDATA<<si_name>>;        // Write data
+    input         HMASTLOCK<<si_name>>;     // Locked Sequence
+    input         HREADY<<si_name>>;        // Transfer done
+//---------------------------- << start user >> --------------------------------
+    input  [<<user>>:0] HAUSER<<si_name>>;        // Address USER signals
+    input  [<<user>>:0] HWUSER<<si_name>>;        // Write-data USER signals
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------- << end in >> ---------------------------------
+//----------------------------- << start out >> --------------------------------
+    // Output port MI<<out>> (inputs from slave <<out>>)
+    input  [<<data>>:0] HRDATA<<mi_name>>;        // Read data bus
+    input         HREADYOUT<<mi_name>>;     // HREADY feedback
+    input   [<<resp>>:0] HRESP<<mi_name>>;         // Transfer response
+//---------------------------- << start user >> --------------------------------
+    input  [<<user>>:0] HRUSER<<mi_name>>;        // Read-data USER signals
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------ << end out >> ---------------------------------
+    // Scan test dummy signals; not connected until scan insertion
+    input         SCANENABLE;      // Scan enable signal
+    input         SCANINHCLK;      // HCLK scan input
+
+
+//----------------------------- << start out >> --------------------------------
+    // Output port MI<<out>> (outputs to slave <<out>>)
+    output        HSEL<<mi_name>>;          // Slave Select
+    output [<<addr>>:0] HADDR<<mi_name>>;         // Address bus
+    output  [1:0] HTRANS<<mi_name>>;        // Transfer type
+    output        HWRITE<<mi_name>>;        // Transfer direction
+    output  [2:0] HSIZE<<mi_name>>;         // Transfer size
+    output  [2:0] HBURST<<mi_name>>;        // Burst type
+    output  [<<prot>>:0] HPROT<<mi_name>>;         // Protection control
+//---------------------------- << start unalign >> -----------------------------
+    output        HUNALIGN<<mi_name>>;      // Unalign signal
+    output  [<<bstrb>>:0] HBSTRB<<mi_name>>;        // Byte strobes
+//----------------------------- << end unalign >> ------------------------------
+    output  [3:0] HMASTER<<mi_name>>;       // Master select
+    output [<<data>>:0] HWDATA<<mi_name>>;        // Write data
+    output        HMASTLOCK<<mi_name>>;     // Locked Sequence
+    output        HREADYMUX<<mi_name>>;     // Transfer done
+//---------------------------- << start user >> --------------------------------
+    output [<<user>>:0] HAUSER<<mi_name>>;        // Address USER signals
+    output [<<user>>:0] HWUSER<<mi_name>>;        // Write-data USER signals
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------ << end out >> ---------------------------------
+//------------------------------ << start in >> --------------------------------
+    // Input port SI<<in>> (outputs to master <<in>>)
+    output [<<data>>:0] HRDATA<<si_name>>;        // Read data bus
+    output        HREADYOUT<<si_name>>;     // HREADY feedback
+    output  [<<resp>>:0] HRESP<<si_name>>;         // Transfer response
+//---------------------------- << start user >> --------------------------------
+    output [<<user>>:0] HRUSER<<si_name>>;        // Read-data USER signals
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------- << end in >> ---------------------------------
+    // Scan test dummy signals; not connected until scan insertion
+    output        SCANOUTHCLK;     // Scan Chain Output
+
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    wire         HCLK;            // AHB System Clock
+    wire         HRESETn;         // AHB System Reset
+
+    // System address remapping control
+    wire   [3:0] REMAP;           // REMAP signal
+
+//------------------------------ << start in >> --------------------------------
+    // Input Port SI<<in>>
+    wire         HSEL<<si_name>>;          // Slave Select
+    wire  [<<addr>>:0] HADDR<<si_name>>;         // Address bus
+    wire   [1:0] HTRANS<<si_name>>;        // Transfer type
+    wire         HWRITE<<si_name>>;        // Transfer direction
+    wire   [2:0] HSIZE<<si_name>>;         // Transfer size
+    wire   [2:0] HBURST<<si_name>>;        // Burst type
+    wire   [<<prot>>:0] HPROT<<si_name>>;         // Protection control
+//---------------------------- << start unalign >> -----------------------------
+    wire         HUNALIGN<<si_name>>;      // Unalign signal
+    wire   [<<bstrb>>:0] HBSTRB<<si_name>>;        // Byte strobes
+//----------------------------- << end unalign >> ------------------------------
+    wire   [3:0] HMASTER<<si_name>>;       // Master select
+    wire  [<<data>>:0] HWDATA<<si_name>>;        // Write data
+    wire         HMASTLOCK<<si_name>>;     // Locked Sequence
+    wire         HREADY<<si_name>>;        // Transfer done
+
+    wire  [<<data>>:0] HRDATA<<si_name>>;        // Read data bus
+    wire         HREADYOUT<<si_name>>;     // HREADY feedback
+    wire   [<<resp>>:0] HRESP<<si_name>>;         // Transfer response
+//---------------------------- << start user >> --------------------------------
+    wire  [<<user>>:0] HAUSER<<si_name>>;        // Address USER signals
+    wire  [<<user>>:0] HWUSER<<si_name>>;        // Write-data USER signals
+    wire  [<<user>>:0] HRUSER<<si_name>>;        // Read-data USER signals
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------- << end in >> ---------------------------------
+//----------------------------- << start out >> --------------------------------
+    // Output Port MI<<out>>
+    wire         HSEL<<mi_name>>;          // Slave Select
+    wire  [<<addr>>:0] HADDR<<mi_name>>;         // Address bus
+    wire   [1:0] HTRANS<<mi_name>>;        // Transfer type
+    wire         HWRITE<<mi_name>>;        // Transfer direction
+    wire   [2:0] HSIZE<<mi_name>>;         // Transfer size
+    wire   [2:0] HBURST<<mi_name>>;        // Burst type
+    wire   [<<prot>>:0] HPROT<<mi_name>>;         // Protection control
+//---------------------------- << start unalign >> -----------------------------
+    wire         HUNALIGN<<mi_name>>;      // Unalign signal
+    wire   [<<bstrb>>:0] HBSTRB<<mi_name>>;        // Byte strobes
+//----------------------------- << end unalign >> ------------------------------
+    wire   [3:0] HMASTER<<mi_name>>;       // Master select
+    wire  [<<data>>:0] HWDATA<<mi_name>>;        // Write data
+    wire         HMASTLOCK<<mi_name>>;     // Locked Sequence
+    wire         HREADYMUX<<mi_name>>;     // Transfer done
+
+    wire  [<<data>>:0] HRDATA<<mi_name>>;        // Read data bus
+    wire         HREADYOUT<<mi_name>>;     // HREADY feedback
+    wire   [<<resp>>:0] HRESP<<mi_name>>;         // Transfer response
+//---------------------------- << start user >> --------------------------------
+    wire  [<<user>>:0] HAUSER<<mi_name>>;        // Address USER signals
+    wire  [<<user>>:0] HWUSER<<mi_name>>;        // Write-data USER signals
+    wire  [<<user>>:0] HRUSER<<mi_name>>;        // Read-data USER signals
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------ << end out >> ---------------------------------
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+//----------------------------- << start in >> ---------------------------------
+
+    // Bus-switch input SI<<in>>
+    wire         i_sel<<in>>;            // HSEL signal
+    wire  [<<addr>>:0] i_addr<<in>>;           // HADDR signal
+    wire   [1:0] i_trans<<in>>;          // HTRANS signal
+    wire         i_write<<in>>;          // HWRITE signal
+    wire   [2:0] i_size<<in>>;           // HSIZE signal
+    wire   [2:0] i_burst<<in>>;          // HBURST signal
+    wire   [<<prot>>:0] i_prot<<in>>;           // HPROTS signal
+//---------------------------- << start unalign >> -----------------------------
+    wire         i_unalign<<in>>;        // HUNALIGN signal
+    wire   [<<bstrb>>:0] i_bstrb<<in>>;          // HBSTRB signal
+//----------------------------- << end unalign >> ------------------------------
+    wire   [3:0] i_master<<in>>;         // HMASTER signal
+    wire         i_mastlock<<in>>;       // HMASTLOCK signal
+    wire         i_active<<in>>;         // Active signal
+    wire         i_held_tran<<in>>;       // HeldTran signal
+    wire         i_readyout<<in>>;       // Readyout signal
+    wire   [<<resp>>:0] i_resp<<in>>;           // Response signal
+//---------------------------- << start user >> --------------------------------
+    wire  [<<user>>:0] i_auser<<in>>;          // HAUSER signal
+//----------------------------- << end user >> ---------------------------------
+//------------------------------ << end in >> ----------------------------------
+
+//----------------------------- << start in >> ---------------------------------
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    // Bus-switch SI<<in>> to MI<<out>> signals
+    wire         i_sel<<in>>to<<out>>;         // Routing selection signal
+    wire         i_active<<in>>to<<out>>;      // Active signal
+
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+//------------------------------ << end in >> ----------------------------------
+//----------------------------- << start out >> --------------------------------
+    wire         i_hready_mux_<<mi_name_lc>>;    // Internal HREADYMUXM for MI<<out>>
+//------------------------------ << end out >> ---------------------------------
+
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+//----------------------------- << start in >> ---------------------------------
+  // Input stage for SI<<in>>
+  <<input_stage_name>> u_<<input_stage_name>>_<<in>> (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+    // Input Port Address/Control Signals
+    .HSELS      (HSEL<<si_name>>),
+    .HADDRS     (HADDR<<si_name>>),
+    .HTRANSS    (HTRANS<<si_name>>),
+    .HWRITES    (HWRITE<<si_name>>),
+    .HSIZES     (HSIZE<<si_name>>),
+    .HBURSTS    (HBURST<<si_name>>),
+    .HPROTS     (HPROT<<si_name>>),
+//---------------------------- << start unalign >> -----------------------------
+    .HUNALIGNS  (HUNALIGN<<si_name>>),
+    .HBSTRBS    (HBSTRB<<si_name>>),
+//----------------------------- << end unalign >> ------------------------------
+    .HMASTERS   (HMASTER<<si_name>>),
+    .HMASTLOCKS (HMASTLOCK<<si_name>>),
+    .HREADYS    (HREADY<<si_name>>),
+//---------------------------- << start user >> --------------------------------
+    .HAUSERS    (HAUSER<<si_name>>),
+//----------------------------- << end user >> ---------------------------------
+
+    // Internal Response
+    .active_ip     (i_active<<in>>),
+    .readyout_ip   (i_readyout<<in>>),
+    .resp_ip       (i_resp<<in>>),
+
+    // Input Port Response
+    .HREADYOUTS (HREADYOUT<<si_name>>),
+    .HRESPS     (HRESP<<si_name>>),
+
+    // Internal Address/Control Signals
+    .sel_ip        (i_sel<<in>>),
+    .addr_ip       (i_addr<<in>>),
+//---------------------------- << start user >> --------------------------------
+    .auser_ip      (i_auser<<in>>),
+//----------------------------- << end user >> ---------------------------------
+    .trans_ip      (i_trans<<in>>),
+    .write_ip      (i_write<<in>>),
+    .size_ip       (i_size<<in>>),
+    .burst_ip      (i_burst<<in>>),
+    .prot_ip       (i_prot<<in>>),
+//---------------------------- << start unalign >> -----------------------------
+    .unalign_ip    (i_unalign<<in>>),
+    .bstrb_ip      (i_bstrb<<in>>),
+//----------------------------- << end unalign >> ------------------------------
+    .master_ip     (i_master<<in>>),
+    .mastlock_ip   (i_mastlock<<in>>),
+    .held_tran_ip   (i_held_tran<<in>>)
+
+    );
+
+
+//------------------------------ << end in >> ----------------------------------
+//------------------------------ << start in >> --------------------------------
+  // Matrix decoder for SI<<in>>
+  <<matrix_decode_name>> u_<<matrix_decode_name_lc>> (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+//---------------------------- << start remap >> -------------------------------
+    // Internal address remapping control
+    .remapping_dec  ( <<remapping_vector>> ),
+
+//----------------------------- << end remap >> --------------------------------
+    // Signals from Input stage SI<<in>>
+    .HREADYS    (HREADY<<si_name>>),
+    .sel_dec        (i_sel<<in>>),
+    .decode_addr_dec (i_addr<<in>>[<<addr>>:10]),   // HADDR[9:0] is not decoded
+    .trans_dec      (i_trans<<in>>),
+
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    // Control/Response for Output Stage MI<<out>>
+    .active_dec<<out>>    (i_active<<in>>to<<out>>),
+    .readyout_dec<<out>>  (i_hready_mux_<<mi_name_lc>>),
+    .resp_dec<<out>>      (HRESP<<mi_name>>),
+    .rdata_dec<<out>>     (HRDATA<<mi_name>>),
+//---------------------------- << start user >> --------------------------------
+    .ruser_dec<<out>>     (HRUSER<<mi_name>>),
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+//----------------------------- << start out >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    .sel_dec<<out>>       (i_sel<<in>>to<<out>>),
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end out >> ---------------------------------
+
+    .active_dec     (i_active<<in>>),
+    .HREADYOUTS (i_readyout<<in>>),
+    .HRESPS     (i_resp<<in>>),
+//---------------------------- << start user >> --------------------------------
+    .HRUSERS    (HRUSER<<si_name>>),
+//----------------------------- << end user >> ---------------------------------
+    .HRDATAS    (HRDATA<<si_name>>)
+
+    );
+
+
+//------------------------------ << end in >> ----------------------------------
+//----------------------------- << start out >> --------------------------------
+  // Output stage for MI<<out>>
+  <<output_stage_name>> u_<<output_stage_name_lc>>_<<out>> (
+
+    // Common AHB signals
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    // Port <<in>> Signals
+    .sel_op<<in>>       (i_sel<<in>>to<<out>>),
+    .addr_op<<in>>      (i_addr<<in>>),
+//---------------------------- << start user >> --------------------------------
+    .auser_op<<in>>     (i_auser<<in>>),
+//----------------------------- << end user >> ---------------------------------
+    .trans_op<<in>>     (i_trans<<in>>),
+    .write_op<<in>>     (i_write<<in>>),
+    .size_op<<in>>      (i_size<<in>>),
+    .burst_op<<in>>     (i_burst<<in>>),
+    .prot_op<<in>>      (i_prot<<in>>),
+//---------------------------- << start unalign >> -----------------------------
+    .unalign_op<<in>>   (i_unalign<<in>>),
+    .bstrb_op<<in>>     (i_bstrb<<in>>),
+//----------------------------- << end unalign >> ------------------------------
+    .master_op<<in>>    (i_master<<in>>),
+    .mastlock_op<<in>>  (i_mastlock<<in>>),
+    .wdata_op<<in>>     (HWDATA<<si_name>>),
+//---------------------------- << start user >> --------------------------------
+    .wuser_op<<in>>     (HWUSER<<si_name>>),
+//----------------------------- << end user >> ---------------------------------
+    .held_tran_op<<in>>  (i_held_tran<<in>>),
+
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end in >> ----------------------------------
+    // Slave read data and response
+    .HREADYOUTM (HREADYOUT<<mi_name>>),
+
+//------------------------------ << start in >> --------------------------------
+//----------------------------- << start connection >> -------------------------
+    .active_op<<in>>    (i_active<<in>>to<<out>>),
+//------------------------------ << end connection >> --------------------------
+//------------------------------ << end in >> ----------------------------------
+
+    // Slave Address/Control Signals
+    .HSELM      (HSEL<<mi_name>>),
+    .HADDRM     (HADDR<<mi_name>>),
+//---------------------------- << start user >> --------------------------------
+    .HAUSERM    (HAUSER<<mi_name>>),
+//----------------------------- << end user >> ---------------------------------
+    .HTRANSM    (HTRANS<<mi_name>>),
+    .HWRITEM    (HWRITE<<mi_name>>),
+    .HSIZEM     (HSIZE<<mi_name>>),
+    .HBURSTM    (HBURST<<mi_name>>),
+    .HPROTM     (HPROT<<mi_name>>),
+//---------------------------- << start unalign >> -----------------------------
+    .HUNALIGNM  (HUNALIGN<<mi_name>>),
+    .HBSTRBM    (HBSTRB<<mi_name>>),
+//----------------------------- << end unalign >> ------------------------------
+    .HMASTERM   (HMASTER<<mi_name>>),
+    .HMASTLOCKM (HMASTLOCK<<mi_name>>),
+    .HREADYMUXM (i_hready_mux_<<mi_name_lc>>),
+//---------------------------- << start user >> --------------------------------
+    .HWUSERM    (HWUSER<<mi_name>>),
+//----------------------------- << end user >> ---------------------------------
+    .HWDATAM    (HWDATA<<mi_name>>)
+
+    );
+
+  // Drive output with internal version
+  assign HREADYMUX<<mi_name>> = i_hready_mux_<<mi_name_lc>>;
+
+
+//------------------------------ << end out >> ---------------------------------
+endmodule
+
+// --================================= End ===================================--
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix_lite.v b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix_lite.v
new file mode 100755
index 0000000..44f8be4
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/verilog/src/cmsdk_ahb_busmatrix_lite.v
@@ -0,0 +1,340 @@
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2001-<<copyright_year>> Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//
+//------------------------------------------------------------------------------
+//  Abstract            : BusMatrixLite is a wrapper module that wraps around
+//                        the BusMatrix module to give AHB Lite compliant
+//                        slave and master interfaces.
+//
+//-----------------------------------------------------------------------------
+
+<<timescale_directive>>
+
+module <<component_name>> (
+
+    // Common AHB signals
+    HCLK,
+    HRESETn,
+
+    // System Address Remap control
+    REMAP,
+
+//------------------------------ << start in >> --------------------------------
+    // Input port SI<<in>> (inputs from master <<in>>)
+    HADDR<<si_name>>,
+    HTRANS<<si_name>>,
+    HWRITE<<si_name>>,
+    HSIZE<<si_name>>,
+    HBURST<<si_name>>,
+    HPROT<<si_name>>,
+    HWDATA<<si_name>>,
+    HMASTLOCK<<si_name>>,
+//---------------------------- << start user >> --------------------------------
+    HAUSER<<si_name>>,
+    HWUSER<<si_name>>,
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------- << end in >> ---------------------------------
+//----------------------------- << start out >> --------------------------------
+    // Output port MI<<out>> (inputs from slave <<out>>)
+    HRDATA<<mi_name>>,
+    HREADYOUT<<mi_name>>,
+    HRESP<<mi_name>>,
+//---------------------------- << start user >> ------------------------------
+    HRUSER<<mi_name>>,
+//----------------------------- << end user >> -------------------------------
+
+//------------------------------ << end out >> ---------------------------------
+    // Scan test dummy signals; not connected until scan insertion
+    SCANENABLE,   // Scan Test Mode Enable
+    SCANINHCLK,   // Scan Chain Input
+
+
+//----------------------------- << start out >> --------------------------------
+    // Output port MI<<out>> (outputs to slave <<out>>)
+    HSEL<<mi_name>>,
+    HADDR<<mi_name>>,
+    HTRANS<<mi_name>>,
+    HWRITE<<mi_name>>,
+    HSIZE<<mi_name>>,
+    HBURST<<mi_name>>,
+    HPROT<<mi_name>>,
+    HWDATA<<mi_name>>,
+    HMASTLOCK<<mi_name>>,
+    HREADYMUX<<mi_name>>,
+//---------------------------- << start user >> --------------------------------
+    HAUSER<<mi_name>>,
+    HWUSER<<mi_name>>,
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------ << end out >> ---------------------------------
+//------------------------------ << start in >> --------------------------------
+    // Input port SI<<in>> (outputs to master <<in>>)
+    HRDATA<<si_name>>,
+    HREADY<<si_name>>,
+    HRESP<<si_name>>,
+//---------------------------- << start user >> ------------------------------
+    HRUSER<<si_name>>,
+//----------------------------- << end user >> -------------------------------
+
+//------------------------------- << end in >> ---------------------------------
+    // Scan test dummy signals; not connected until scan insertion
+    SCANOUTHCLK   // Scan Chain Output
+
+    );
+
+// -----------------------------------------------------------------------------
+// Input and Output declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    input         HCLK;            // AHB System Clock
+    input         HRESETn;         // AHB System Reset
+
+    // System Address Remap control
+    input   [3:0] REMAP;           // System Address REMAP control
+
+//------------------------------ << start in >> --------------------------------
+    // Input port SI<<in>> (inputs from master <<in>>)
+    input  [<<addr>>:0] HADDR<<si_name>>;         // Address bus
+    input   [1:0] HTRANS<<si_name>>;        // Transfer type
+    input         HWRITE<<si_name>>;        // Transfer direction
+    input   [2:0] HSIZE<<si_name>>;         // Transfer size
+    input   [2:0] HBURST<<si_name>>;        // Burst type
+    input   [<<prot>>:0] HPROT<<si_name>>;         // Protection control
+    input  [<<data>>:0] HWDATA<<si_name>>;        // Write data
+    input         HMASTLOCK<<si_name>>;     // Locked Sequence
+//---------------------------- << start user >> --------------------------------
+    input  [<<user>>:0] HAUSER<<si_name>>;        // Address USER signals
+    input  [<<user>>:0] HWUSER<<si_name>>;        // Write-data USER signals
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------- << end in >> ---------------------------------
+//----------------------------- << start out >> --------------------------------
+    // Output port MI<<out>> (inputs from slave <<out>>)
+    input  [<<data>>:0] HRDATA<<mi_name>>;        // Read data bus
+    input         HREADYOUT<<mi_name>>;     // HREADY feedback
+    input         HRESP<<mi_name>>;         // Transfer response
+//---------------------------- << start user >> --------------------------------
+    input  [<<user>>:0] HRUSER<<mi_name>>;        // Read-data USER signals
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------ << end out >> ---------------------------------
+    // Scan test dummy signals; not connected until scan insertion
+    input         SCANENABLE;      // Scan enable signal
+    input         SCANINHCLK;      // HCLK scan input
+
+
+//----------------------------- << start out >> --------------------------------
+    // Output port MI<<out>> (outputs to slave <<out>>)
+    output        HSEL<<mi_name>>;          // Slave Select
+    output [<<addr>>:0] HADDR<<mi_name>>;         // Address bus
+    output  [1:0] HTRANS<<mi_name>>;        // Transfer type
+    output        HWRITE<<mi_name>>;        // Transfer direction
+    output  [2:0] HSIZE<<mi_name>>;         // Transfer size
+    output  [2:0] HBURST<<mi_name>>;        // Burst type
+    output  [<<prot>>:0] HPROT<<mi_name>>;         // Protection control
+    output [<<data>>:0] HWDATA<<mi_name>>;        // Write data
+    output        HMASTLOCK<<mi_name>>;     // Locked Sequence
+    output        HREADYMUX<<mi_name>>;     // Transfer done
+//---------------------------- << start user >> --------------------------------
+    output [<<user>>:0] HAUSER<<mi_name>>;        // Address USER signals
+    output [<<user>>:0] HWUSER<<mi_name>>;        // Write-data USER signals
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------ << end out >> ---------------------------------
+//------------------------------ << start in >> --------------------------------
+    // Input port SI<<in>> (outputs to master <<in>>)
+    output [<<data>>:0] HRDATA<<si_name>>;        // Read data bus
+    output        HREADY<<si_name>>;     // HREADY feedback
+    output        HRESP<<si_name>>;         // Transfer response
+//---------------------------- << start user >> --------------------------------
+    output [<<user>>:0] HRUSER<<si_name>>;        // Read-data USER signals
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------- << end in >> ---------------------------------
+    // Scan test dummy signals; not connected until scan insertion
+    output        SCANOUTHCLK;     // Scan Chain Output
+
+// -----------------------------------------------------------------------------
+// Wire declarations
+// -----------------------------------------------------------------------------
+
+    // Common AHB signals
+    wire         HCLK;            // AHB System Clock
+    wire         HRESETn;         // AHB System Reset
+
+    // System Address Remap control
+    wire   [3:0] REMAP;           // System REMAP signal
+
+//------------------------------ << start in >> --------------------------------
+    // Input Port SI<<in>>
+    wire  [<<addr>>:0] HADDR<<si_name>>;         // Address bus
+    wire   [1:0] HTRANS<<si_name>>;        // Transfer type
+    wire         HWRITE<<si_name>>;        // Transfer direction
+    wire   [2:0] HSIZE<<si_name>>;         // Transfer size
+    wire   [2:0] HBURST<<si_name>>;        // Burst type
+    wire   [<<prot>>:0] HPROT<<si_name>>;         // Protection control
+    wire  [<<data>>:0] HWDATA<<si_name>>;        // Write data
+    wire         HMASTLOCK<<si_name>>;     // Locked Sequence
+
+    wire  [<<data>>:0] HRDATA<<si_name>>;        // Read data bus
+    wire         HREADY<<si_name>>;     // HREADY feedback
+    wire         HRESP<<si_name>>;         // Transfer response
+//---------------------------- << start user >> --------------------------------
+    wire  [<<user>>:0] HAUSER<<si_name>>;        // Address USER signals
+    wire  [<<user>>:0] HWUSER<<si_name>>;        // Write-data USER signals
+    wire  [<<user>>:0] HRUSER<<si_name>>;        // Read-data USER signals
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------- << end in >> ---------------------------------
+//----------------------------- << start out >> --------------------------------
+    // Output Port MI<<out>>
+    wire         HSEL<<mi_name>>;          // Slave Select
+    wire  [<<addr>>:0] HADDR<<mi_name>>;         // Address bus
+    wire   [1:0] HTRANS<<mi_name>>;        // Transfer type
+    wire         HWRITE<<mi_name>>;        // Transfer direction
+    wire   [2:0] HSIZE<<mi_name>>;         // Transfer size
+    wire   [2:0] HBURST<<mi_name>>;        // Burst type
+    wire   [<<prot>>:0] HPROT<<mi_name>>;         // Protection control
+    wire  [<<data>>:0] HWDATA<<mi_name>>;        // Write data
+    wire         HMASTLOCK<<mi_name>>;     // Locked Sequence
+    wire         HREADYMUX<<mi_name>>;     // Transfer done
+
+    wire  [<<data>>:0] HRDATA<<mi_name>>;        // Read data bus
+    wire         HREADYOUT<<mi_name>>;     // HREADY feedback
+    wire         HRESP<<mi_name>>;         // Transfer response
+//---------------------------- << start user >> --------------------------------
+    wire  [<<user>>:0] HAUSER<<mi_name>>;        // Address USER signals
+    wire  [<<user>>:0] HWUSER<<mi_name>>;        // Write-data USER signals
+    wire  [<<user>>:0] HRUSER<<mi_name>>;        // Read-data USER signals
+//----------------------------- << end user >> ---------------------------------
+
+//------------------------------ << end out >> ---------------------------------
+
+// -----------------------------------------------------------------------------
+// Signal declarations
+// -----------------------------------------------------------------------------
+    wire   [3:0] tie_hi_4;
+    wire         tie_hi;
+    wire         tie_low;
+//------------------------------ << start in >> --------------------------------
+    wire   [<<resp>>:0] i_hresp<<si_name>>;
+//------------------------------- << end in >> ---------------------------------
+
+//----------------------------- << start out >> --------------------------------
+    wire   [3:0]        i_hmaster<<mi_name>>;
+    wire   [<<resp>>:0] i_hresp<<mi_name>>;
+//------------------------------ << end out >> ---------------------------------
+
+// -----------------------------------------------------------------------------
+// Beginning of main code
+// -----------------------------------------------------------------------------
+
+    assign tie_hi   = 1'b1;
+    assign tie_hi_4 = 4'b1111;
+    assign tie_low  = 1'b0;
+
+//------------------------------ << start in >> --------------------------------
+
+    assign HRESP<<si_name>>  = i_hresp<<si_name>>[0];
+//------------------------------- << end in >> ---------------------------------
+
+//----------------------------- << start out >> --------------------------------
+    assign i_hresp<<mi_name>> = {{<<resp>>{tie_low}}, HRESP<<mi_name>>};
+//------------------------------ << end out >> ---------------------------------
+
+// BusMatrix instance
+  <<bus_matrix_name>> u<<bus_matrix_name>> (
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+    .REMAP      (REMAP),
+
+//------------------------------ << start in >> --------------------------------
+    // Input port SI<<in>> signals
+    .HSEL<<si_name>>       (tie_hi),
+    .HADDR<<si_name>>      (HADDR<<si_name>>),
+    .HTRANS<<si_name>>     (HTRANS<<si_name>>),
+    .HWRITE<<si_name>>     (HWRITE<<si_name>>),
+    .HSIZE<<si_name>>      (HSIZE<<si_name>>),
+    .HBURST<<si_name>>     (HBURST<<si_name>>),
+    .HPROT<<si_name>>      (HPROT<<si_name>>),
+//---------------------------- << start unalign >> -----------------------------
+    .HUNALIGN<<si_name>>   (tie_low),
+    .HBSTRB<<si_name>>     ({(<<bstrb>>+1){tie_low}}),
+//----------------------------- << end unalign >> ------------------------------
+    .HWDATA<<si_name>>     (HWDATA<<si_name>>),
+    .HMASTLOCK<<si_name>>  (HMASTLOCK<<si_name>>),
+    .HMASTER<<si_name>>    (tie_hi_4),
+    .HREADY<<si_name>>     (HREADY<<si_name>>),
+//---------------------------- << start user >> --------------------------------
+    .HAUSER<<si_name>>     (HAUSER<<si_name>>),
+    .HWUSER<<si_name>>     (HWUSER<<si_name>>),
+//----------------------------- << end user >> ---------------------------------
+    .HRDATA<<si_name>>     (HRDATA<<si_name>>),
+    .HREADYOUT<<si_name>>  (HREADY<<si_name>>),
+    .HRESP<<si_name>>      (i_hresp<<si_name>>),
+//---------------------------- << start user >> ------------------------------
+    .HRUSER<<si_name>>     (HRUSER<<si_name>>),
+//----------------------------- << end user >> -------------------------------
+
+//------------------------------- << end in >> ---------------------------------
+
+//----------------------------- << start out >> --------------------------------
+    // Output port MI<<out>> signals
+    .HSEL<<mi_name>>       (HSEL<<mi_name>>),
+    .HADDR<<mi_name>>      (HADDR<<mi_name>>),
+    .HTRANS<<mi_name>>     (HTRANS<<mi_name>>),
+    .HWRITE<<mi_name>>     (HWRITE<<mi_name>>),
+    .HSIZE<<mi_name>>      (HSIZE<<mi_name>>),
+    .HBURST<<mi_name>>     (HBURST<<mi_name>>),
+    .HPROT<<mi_name>>      (HPROT<<mi_name>>),
+//---------------------------- << start unalign >> -----------------------------
+    .HUNALIGN<<mi_name>>   ( /* open */ ),
+    .HBSTRB<<mi_name>>     ( /* open */ ),
+//----------------------------- << end unalign >> ------------------------------
+    .HWDATA<<mi_name>>     (HWDATA<<mi_name>>),
+    .HMASTER<<mi_name>>    (i_hmaster<<mi_name>>),
+    .HMASTLOCK<<mi_name>>  (HMASTLOCK<<mi_name>>),
+    .HREADYMUX<<mi_name>>  (HREADYMUX<<mi_name>>),
+//---------------------------- << start user >> --------------------------------
+    .HAUSER<<mi_name>>     (HAUSER<<mi_name>>),
+    .HWUSER<<mi_name>>     (HWUSER<<mi_name>>),
+//----------------------------- << end user >> ---------------------------------
+    .HRDATA<<mi_name>>     (HRDATA<<mi_name>>),
+    .HREADYOUT<<mi_name>>  (HREADYOUT<<mi_name>>),
+    .HRESP<<mi_name>>      (i_hresp<<mi_name>>),
+//---------------------------- << start user >> ------------------------------
+    .HRUSER<<mi_name>>     (HRUSER<<mi_name>>),
+//----------------------------- << end user >> -------------------------------
+
+//------------------------------ << end out >> ---------------------------------
+
+    // Scan test dummy signals; not connected until scan insertion
+    .SCANENABLE            (SCANENABLE),
+    .SCANINHCLK            (SCANINHCLK),
+    .SCANOUTHCLK           (SCANOUTHCLK)
+  );
+
+
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_full.xml b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_full.xml
new file mode 100755
index 0000000..63fec5d
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_full.xml
@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="iso-8859-1" ?>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--  The confidential and proprietary information contained in this file               -->
+<!--  may only be used by a person authorised under and to the extent                   -->
+<!--  permitted by a subsisting licensing agreement from Arm Limited or its affiliates. -->
+<!--                                                                                    -->
+<!--             (C) COPYRIGHT 2001-2013 Arm Limited or its affiliates.                 -->
+<!--                 ALL RIGHTS RESERVED                                                -->
+<!--                                                                                    -->
+<!--  This entire notice must be reproduced on all copies of this file                  -->
+<!--  and copies of this file may only be made by a person if such person               -->
+<!--  is permitted to do so under the terms of a subsisting license                     -->
+<!--  agreement from Arm Limited or its affiliates.                                     -->
+<!--                                                                                    -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -              -->
+<!--  Version and Release Control Information:                                          -->
+<!--                                                                                    -->
+<!--  Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $       -->
+<!--                                                                                    -->
+<!--  Revision            : $Revision: 371321 $                                         -->
+<!--                                                                                    -->
+<!--  Release Information : Cortex-M System Design Kit-r1p1-00rel0  -->
+<!--                                                                                    -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--  Purpose             : Example XML file, defining an interconnect for              -->
+<!--                        2 AHB Masters and 3 AHB Slaves.                             -->
+<!--                                                                                    -->
+<!--  Note                : This information will overwrite parameters                  -->
+<!--                         specified on the command line                              -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+
+<cfgfile>
+
+  <!-- - - - - *** DO NOT MODIFY ABOVE THIS LINE *** - - - - - - - - - - -  -->
+
+  <!-- Global definitions -->
+
+  <architecture_version>ahb2</architecture_version>
+  <arbitration_scheme>round</arbitration_scheme>
+  <routing_data_width>32</routing_data_width>
+  <routing_address_width>32</routing_address_width>
+  <user_signal_width>32</user_signal_width>
+  <bus_matrix_name>cmsdk_MyBusMatrixName</bus_matrix_name>
+  <input_stage_name>cmsdk_MyInputName</input_stage_name>
+  <matrix_decode_name>cmsdk_MyDecoderName</matrix_decode_name>
+  <output_arbiter_name>cmsdk_MyArbiterName</output_arbiter_name>
+  <output_stage_name>cmsdk_MyOutputName</output_stage_name>
+
+
+  <!-- Slave interface definitions -->
+
+  <slave_interface name="S0">
+    <sparse_connect interface="M0"/>
+    <sparse_connect interface= "M1"/>
+    <sparse_connect interface= "M2"/>
+    <address_region interface="M0" mem_lo="00000000" mem_hi='1fffffff' remapping='none'/>
+    <address_region interface="M0" mem_lo="20000000" mem_hi="2fffffff" remapping='none'/>
+    <address_region interface="M1" mem_lo="30000000" mem_hi="4fffffff" remapping='none'/>
+    <address_region interface="M2" mem_lo="50000000" mem_hi="5fffffff" remapping='none'/>
+    <remap_region interface="M0" mem_lo="00000000" mem_hi="0000ffff" bit="0"/>
+  </slave_interface>
+
+
+  <slave_interface name="S1">
+    <sparse_connect interface="M0"/>
+    <sparse_connect interface="M1"/>
+    <sparse_connect interface="M2"/>
+    <address_region interface="M0" mem_lo="00000000" mem_hi="2fffffff" remapping='none'/>
+    <address_region interface="M1" mem_lo="30000000" mem_hi="4fffffff" remapping='none'/>
+    <address_region interface="M1" mem_lo="50000000" mem_hi="7fffffff" remapping='none'/>
+    <remap_region interface="M1" mem_lo="00000000" mem_hi="0001ffff" bit="0"/>
+    <address_region interface="M2" mem_lo="80000000" mem_hi="9fffffff" remapping='none'/>
+  </slave_interface>
+
+
+  <!-- Master interface definitions -->
+
+  <master_interface name="M0"/>
+  <master_interface name="M1"/>
+  <master_interface name="M2"/>
+
+  <!-- - - - - *** DO NOT MODIFY BELOW THIS LINE *** - - - - - - - - - - - -->
+
+</cfgfile>
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_sparse.xml b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_sparse.xml
new file mode 100755
index 0000000..ae3bf3c
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/example2x3_sparse.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="iso-8859-1" ?>
+
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--  The confidential and proprietary information contained in this file               -->
+<!--  may only be used by a person authorised under and to the extent                   -->
+<!--  permitted by a subsisting licensing agreement from Arm Limited or its affiliates. -->
+<!--                                                                                    -->
+<!--             (C) COPYRIGHT 2001-2013,2017 Arm Limited or its affiliates.            -->
+<!--                 ALL RIGHTS RESERVED                                                -->
+<!--                                                                                    -->
+<!--  This entire notice must be reproduced on all copies of this file                  -->
+<!--  and copies of this file may only be made by a person if such person               -->
+<!--  is permitted to do so under the terms of a subsisting license                     -->
+<!--  agreement from Arm Limited or its affiliates.                                     -->
+<!--                                                                                    -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--  Version and Release Control Information:                                          -->
+<!--                                                                                    -->
+<!--  Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $       -->
+<!--                                                                                    -->
+<!--  Revision            : $Revision: 371321 $                                         -->
+<!--                                                                                    -->
+<!--  Release Information : Cortex-M System Design Kit-r1p1-00rel0  -->
+<!--                                                                                    -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--  Purpose             : Example XML file, defining an interconnect for              -->
+<!--                        2 AHB Masters and 3 AHB Slaves.                             -->
+<!--                                                                                    -->
+<!--  Note                : This information will overwrite parameters                  -->
+<!--                         specified on the command line                              -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+
+<cfgfile>
+
+  <!-- - - - - *** DO NOT MODIFY ABOVE THIS LINE *** - - - - - - - - - - -  -->
+
+  <!-- Global definitions -->
+
+  <architecture_version>v6</architecture_version>
+  <arbitration_scheme>fixed</arbitration_scheme>
+  <routing_data_width>32</routing_data_width>
+  <routing_address_width>32</routing_address_width>
+  <user_signal_width>32</user_signal_width>
+  <bus_matrix_name>cmsdk_MyBusMatrixName</bus_matrix_name>
+  <input_stage_name>cmsdk_MyInputName</input_stage_name>
+  <matrix_decode_name>cmsdk_MyDecoderName</matrix_decode_name>
+  <output_arbiter_name>cmsdk_MyArbiterName</output_arbiter_name>
+  <output_stage_name>cmsdk_MyOutputName</output_stage_name>
+
+
+  <!-- Slave interface definitions -->
+
+  <slave_interface name="S0">
+    <sparse_connect interface="M0"/>
+    <sparse_connect interface= "M1"/>
+    <address_region interface="M0" mem_lo="00000000" mem_hi='1fffffff' remapping='none'/>
+    <address_region interface="M0" mem_lo="20000000" mem_hi="2fffffff" remapping='none'/>
+    <address_region interface="M1" mem_lo="30000000" mem_hi="4fffffff" remapping='none'/>
+    <remap_region interface="M0" mem_lo="00000000" mem_hi="0000ffff" bit="0"/>
+  </slave_interface>
+
+
+  <slave_interface name="S1">
+    <sparse_connect interface="M1"/>
+    <sparse_connect interface="M2"/>
+    <address_region interface="M1" mem_lo="30000000" mem_hi="4fffffff" remapping='none'/>
+    <address_region interface="M1" mem_lo="50000000" mem_hi="7fffffff" remapping='none'/>
+    <remap_region interface="M1" mem_lo="00000000" mem_hi="0001ffff" bit="0"/>
+    <address_region interface="M2" mem_lo="80000000" mem_hi="9fffffff" remapping='none'/>
+  </slave_interface>
+
+
+  <!-- Master interface definitions -->
+
+  <master_interface name="M0"/>
+  <master_interface name="M1"/>
+  <master_interface name="M2"/>
+
+  <!-- - - - - *** DO NOT MODIFY BELOW THIS LINE *** - - - - - - - - - - - -->
+
+</cfgfile>
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/soclabs_ahb32_4x7.xml b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/soclabs_ahb32_4x7.xml
new file mode 100644
index 0000000..b1ddc80
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/gen_ahb_busmatrix/xml/soclabs_ahb32_4x7.xml
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="iso-8859-1" ?>
+
+<!--//----------------------------------------------------------------------------- -->
+<!--// customised interconnect specification for ADP/DMA/ Cortex-M0 controller      -->
+<!--//                                                                              -->
+<!--// Contributors                                                                 -->
+<!--//                                                                              -->
+<!--// David Flynn (d.w.flynn@soton.ac.uk)                                          -->
+<!--//                                                                              -->
+<!--// Copyright (C) 2023, SoC Labs (www.soclabs.org)                               -->
+<!--//----------------------------------------------------------------------------- -->
+
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--  The confidential and proprietary information contained in this file               -->
+<!--  may only be used by a person authorised under and to the extent                   -->
+<!--  permitted by a subsisting licensing agreement from Arm Limited or its affiliates. -->
+<!--                                                                                    -->
+<!--             (C) COPYRIGHT 2001-2013 Arm Limited or its affiliates.                 -->
+<!--                 ALL RIGHTS RESERVED                                                -->
+<!--                                                                                    -->
+<!--  This entire notice must be reproduced on all copies of this file                  -->
+<!--  and copies of this file may only be made by a person if such person               -->
+<!--  is permitted to do so under the terms of a subsisting license                     -->
+<!--  agreement from Arm Limited or its affiliates.                                     -->
+<!--                                                                                    -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -              -->
+<!--  Version and Release Control Information:                                          -->
+<!--                                                                                    -->
+<!--  Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $       -->
+<!--                                                                                    -->
+<!--  Revision            : $Revision: 371321 $                                         -->
+<!--                                                                                    -->
+<!--  Release Information : Cortex-M System Design Kit-r1p1-00rel0  -->
+<!--                                                                                    -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+<!--  Purpose             : based on Example XML file, defining an interconnect for     -->
+<!--                        (was 2 AHB Masters and 3 AHB Slaves.)                       -->
+<!--                         5 AHB subordinates and 3 AHB controllers                   -->
+<!--                                                                                    -->
+<!--  Note                : This information will overwrite parameters                  -->
+<!--                         specified on the command line                              -->
+<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
+
+<cfgfile>
+
+  <!-- - - - - *** DO NOT MODIFY ABOVE THIS LINE *** - - - - - - - - - - -  -->
+
+  <!-- Global definitions -->
+
+  <architecture_version>ahb2</architecture_version>
+  <arbitration_scheme>burst</arbitration_scheme>
+  <routing_data_width>32</routing_data_width>
+  <routing_address_width>32</routing_address_width>
+  <user_signal_width>2</user_signal_width>
+  <bus_matrix_name>soclabs_4x7_AhbMatrix</bus_matrix_name>
+  <input_stage_name>soclabs_4x7_MasterInput</input_stage_name>
+  <matrix_decode_name>soclabs_4x7_MatrixDecode</matrix_decode_name>
+  <output_arbiter_name>soclabs_4x7_Arbiter</output_arbiter_name>
+  <output_stage_name>soclabs_4x7_SlaveOutput</output_stage_name>
+
+
+  <!-- Slave interface definitions -->
+
+  <slave_interface name="_adp">
+    <sparse_connect interface="_rom1"/>
+    <sparse_connect interface="_ram2"/>
+    <sparse_connect interface="_ram3"/>
+    <sparse_connect interface="_sys"/>
+    <sparse_connect interface="_exp"/>
+    <sparse_connect interface="_ram8"/>
+    <sparse_connect interface="_ram9"/>
+    <address_region interface="_rom1" mem_lo='00000000' mem_hi='0fffffff' remapping='move'/>
+    <address_region interface="_rom1" mem_lo='10000000' mem_hi='1fffffff' remapping='none'/>
+    <address_region interface="_ram2" mem_lo='20000000' mem_hi='2fffffff' remapping='none'/>
+    <address_region interface="_ram3" mem_lo='30000000' mem_hi='3fffffff' remapping='none'/>
+    <address_region interface="_sys"  mem_lo='40000000' mem_hi='5fffffff' remapping='none'/>
+    <address_region interface="_exp"  mem_lo='60000000' mem_hi='7fffffff' remapping='none'/>
+    <address_region interface="_ram8" mem_lo='80000000' mem_hi='8fffffff' remapping='none'/>
+    <address_region interface="_ram9" mem_lo='90000000' mem_hi='9fffffff' remapping='none'/>
+    <address_region interface="_exp"  mem_lo='a0000000' mem_hi='dfffffff' remapping='none'/>
+    <address_region interface="_sys"  mem_lo='f0000000' mem_hi='f003ffff' remapping='none'/>
+    <remap_region   interface="_ram2" mem_lo='00000000' mem_hi='0fffffff' bit='0'/>
+  </slave_interface>
+
+  <slave_interface name="_dma">
+    <sparse_connect interface="_rom1"/>
+    <sparse_connect interface="_ram2"/>
+    <sparse_connect interface="_ram3"/>
+    <sparse_connect interface="_sys"/>
+    <sparse_connect interface="_exp"/>
+    <sparse_connect interface="_ram8"/>
+    <sparse_connect interface="_ram9"/>
+    <address_region interface="_ram2" mem_lo='00000000' mem_hi='0fffffff' remapping='none'/>
+    <address_region interface="_rom1" mem_lo='10000000' mem_hi='1fffffff' remapping='none'/>
+    <address_region interface="_ram2" mem_lo='20000000' mem_hi='2fffffff' remapping='none'/>
+    <address_region interface="_ram3" mem_lo='30000000' mem_hi='3fffffff' remapping='none'/>
+    <address_region interface="_sys"  mem_lo='40000000' mem_hi='5fffffff' remapping='none'/>
+    <address_region interface="_exp"  mem_lo='60000000' mem_hi='7fffffff' remapping='none'/>
+    <address_region interface="_ram8" mem_lo='80000000' mem_hi='8fffffff' remapping='none'/>
+    <address_region interface="_ram9" mem_lo='90000000' mem_hi='9fffffff' remapping='none'/>
+    <address_region interface="_exp"  mem_lo='a0000000' mem_hi='dfffffff' remapping='none'/>
+  </slave_interface>
+
+  <slave_interface name="_dma2">
+    <sparse_connect interface="_rom1"/>
+    <sparse_connect interface="_ram2"/>
+    <sparse_connect interface="_ram3"/>
+    <sparse_connect interface="_sys"/>
+    <sparse_connect interface="_exp"/>
+    <sparse_connect interface="_ram8"/>
+    <sparse_connect interface="_ram9"/>
+    <address_region interface="_ram2" mem_lo='00000000' mem_hi='0fffffff' remapping='none'/>
+    <address_region interface="_rom1" mem_lo='10000000' mem_hi='1fffffff' remapping='none'/>
+    <address_region interface="_ram2" mem_lo='20000000' mem_hi='2fffffff' remapping='none'/>
+    <address_region interface="_ram3" mem_lo='30000000' mem_hi='3fffffff' remapping='none'/>
+    <address_region interface="_sys"  mem_lo='40000000' mem_hi='5fffffff' remapping='none'/>
+    <address_region interface="_exp"  mem_lo='60000000' mem_hi='7fffffff' remapping='none'/>
+    <address_region interface="_ram8" mem_lo='80000000' mem_hi='8fffffff' remapping='none'/>
+    <address_region interface="_ram9" mem_lo='90000000' mem_hi='9fffffff' remapping='none'/>
+    <address_region interface="_exp"  mem_lo='a0000000' mem_hi='dfffffff' remapping='none'/>
+  </slave_interface>
+
+  <slave_interface name="_cpu">
+    <sparse_connect interface="_rom1"/>
+    <sparse_connect interface="_ram2"/>
+    <sparse_connect interface="_ram3"/>
+    <sparse_connect interface="_sys"/>
+    <sparse_connect interface="_exp"/>
+    <sparse_connect interface="_ram8"/>
+    <sparse_connect interface="_ram9"/>
+    <address_region interface="_rom1" mem_lo='00000000' mem_hi='0fffffff' remapping='move'/>
+    <address_region interface="_rom1" mem_lo='10000000' mem_hi='1fffffff' remapping='none'/>
+    <address_region interface="_ram2" mem_lo='20000000' mem_hi='2fffffff' remapping='none'/>
+    <address_region interface="_ram3" mem_lo='30000000' mem_hi='3fffffff' remapping='none'/>
+    <address_region interface="_sys"  mem_lo='40000000' mem_hi='5fffffff' remapping='none'/>
+    <address_region interface="_exp"  mem_lo='60000000' mem_hi='7fffffff' remapping='none'/>
+    <address_region interface="_ram8" mem_lo='80000000' mem_hi='8fffffff' remapping='none'/>
+    <address_region interface="_ram9" mem_lo='90000000' mem_hi='9fffffff' remapping='none'/>
+    <address_region interface="_exp"  mem_lo='a0000000' mem_hi='dfffffff' remapping='none'/>
+    <address_region interface="_sys"  mem_lo='f0000000' mem_hi='f003ffff' remapping='none'/>
+    <remap_region   interface="_ram2" mem_lo='00000000' mem_hi='0fffffff' bit='0'/>
+  </slave_interface>
+
+  <!-- Master interface definitions -->
+
+  <master_interface name="_rom1"/>
+  <master_interface name="_ram2"/>
+  <master_interface name="_ram3"/>
+  <master_interface name="_sys"/>
+  <master_interface name="_ram8"/>
+  <master_interface name="_ram9"/>
+  <master_interface name="_exp"/>
+
+  <!-- - - - - *** DO NOT MODIFY BELOW THIS LINE *** - - - - - - - - - - - -->
+
+</cfgfile>
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip.v b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip.v
new file mode 100644
index 0000000..fe5fd48
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip.v
@@ -0,0 +1,1583 @@
+//-----------------------------------------------------------------------------
+// customised top-level Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Top level for example Cortex-M0/Cortex-M0+ microcontroller
+//-----------------------------------------------------------------------------
+//
+
+module nanosoc_chip
+ (
+`ifdef POWER_PINS
+  inout  wire          VDDIO,
+  inout  wire          VSSIO,
+  inout  wire          VDD,
+  inout  wire          VSS,
+`endif
+  input  wire          xtal_clk_i,
+  output wire          xtal_clk_o,
+  input  wire          nrst_i,
+  input  wire  [15:0]  p0_i, // level-shifted input from pad
+  output wire  [15:0]  p0_o, // output port drive
+  output wire  [15:0]  p0_e, // active high output drive enable (pad tech dependent)
+  output wire  [15:0]  p0_z, // active low output drive enable (pad tech dependent)
+  input  wire  [15:0]  p1_i, // level-shifted input from pad
+  output wire  [15:0]  p1_o, // output port drive
+  output wire  [15:0]  p1_e, // active high output drive enable (pad tech dependent)
+  output wire  [15:0]  p1_z, // active low output drive enable (pad tech dependent)
+
+`ifdef ARM_CMSDK_INCLUDE_JTAG
+  input  wire          ntrst_i,
+  input  wire          tdi_i,
+  output wire          tdo_o,
+`endif
+  input  wire          swdio_i,
+  output wire          swdio_o,
+  output wire          swdio_e,
+  output wire          swdio_z,
+  input  wire          swdclk_i
+  );
+
+localparam    CLKGATE_PRESENT = 0;
+localparam    DMA_CHANNEL_NUM = 1;
+localparam    INCLUDE_DMA = 1;
+localparam    CORTEX_M0 = 1;
+
+//------------------------------------
+// CMSDK internal wire naming preserved
+
+  wire          xtal_clk_in = xtal_clk_i;
+  wire          xtal_clk_out;
+  wire          pll_clk;
+  wire          CLK;
+  
+  assign        xtal_clk_o = xtal_clk_out;
+  wire          nrst_in = nrst_i;
+  wire  [15:0]  p0_in;             // level-shifted input from pad
+  wire  [15:0]  p0_out;            // output port drive
+  wire  [15:0]  p0_out_en;         // active high output drive enable (pad tech dependent)
+  wire  [15:0]  p0_out_nen;        // active low output drive enable (pad tech dependent)
+
+  wire  [15:0]  p1_in;            // level-shifted input from pad
+  wire  [15:0]  p1_out;           // output port drive
+  wire  [15:0]  p1_out_en;        // active high output drive enable (pad tech dependent)
+  wire  [15:0]  p1_out_nen;       // active low output drive enable (pad tech dependent)
+  wire  [15:0]  p1_in_mux;        // level-shifted input from pad
+  wire  [15:0]  p1_out_mux;       // output port drive
+  wire  [15:0]  p1_out_en_mux;    // active high output drive enable (pad tech dependent)
+  wire  [15:0]  p1_out_nen_mux;   // active low output drive enable (pad tech dependent)
+
+  wire          swdio_in;
+  wire          swdio_out;
+  wire          swdio_out_en;
+  wire          swdio_out_nen;
+  wire          swdclk_in;
+
+  wire          ft_clk_o;
+  wire          ft_ssn_o;
+  wire          ft_miso_i;
+  wire          ft_miosio_o;
+  wire          ft_miosio_e;
+  wire          ft_miosio_z;
+  wire          ft_miosio_i;
+
+ // --------------------------------------------------------------------------------
+ // Port-0 IO pad driver mapping
+ // --------------------------------------------------------------------------------
+
+  assign        p0_in = p0_i;      // level-shifted input from pad
+  assign        p0_o = p0_out;     // output port drive
+  assign        p0_e = p0_out_en;  // active high output drive enable (pad tech dependent)
+  assign        p0_z = p0_out_nen; // active low output drive enable (pad tech dependent)
+
+
+ // --------------------------------------------------------------------------------
+ // Port-1 IO pad driver mapping
+ // --------------------------------------------------------------------------------
+
+// modify p1_mux [3:0] for ft1248 interface
+//  assign        p1_in_mux[3:0] = p1_i[3:0]; // IO MUX controlled bidirectionals
+//  assign        p1_o[3:0] = p1_out_mux[3:0];    
+//  assign        p1_e[3:0] = p1_out_en_mux[3:0];
+//  assign        p1_z[3:0] = p1_out_nen_mux[3:0];
+
+  assign        ft_miso_i = p1_i[0]; // FT_MISO INPUT pad configuration
+  assign        p1_in_mux[0] = p1_i[0];
+  assign        p1_o[0] = 1'b0;    
+  assign        p1_e[0] = 1'b0;
+  assign        p1_z[0] = 1'b1;
+  
+  assign        p1_in_mux[1] = p1_i[1]; // FT_CLK OUTPUT pad configuration
+  assign        p1_o[1] = ft_clk_o;    
+  assign        p1_e[1] = 1'b1; 
+  assign        p1_z[1] = 1'b0;
+
+  assign        ft_miosio_i = p1_i[2]; // FT_MIOSIO INOUT pad configuration
+  assign        p1_in_mux[2] = p1_i[2];
+  assign        p1_o[2] = ft_miosio_o;    
+  assign        p1_e[2] = ft_miosio_e;
+  assign        p1_z[2] = ft_miosio_z;
+
+  assign        p1_in_mux[3] = p1_i[3]; // FT_SSN OUTPUT pad configuration
+  assign        p1_o[3] = ft_ssn_o;    
+  assign        p1_e[3] = 1'b1; 
+  assign        p1_z[3] = 1'b0;
+
+  assign        p1_in_mux[15:4] = p1_i[15:4]; // IO MUX controlled bidirectionals
+  assign        p1_o[15:4] = p1_out_mux[15:4];    
+  assign        p1_e[15:4] = p1_out_en_mux[15:4];
+  assign        p1_z[15:4] = p1_out_nen_mux[15:4];
+
+
+//TIE_HI uTIEHI (.tiehi(tiehi));
+ wire tiehi = 1'b1;
+//TIE_LO uTIELO (.tielo(tielo));
+ wire tielo = 1'b0;
+
+
+
+//----------------------------------------
+// SOC clock and reset management
+//----------------------------------------
+//
+
+    wire         PORESETn;// Power on reset
+    wire         HRESETn; // AHB reset
+    wire         PRESETn; // APB and peripheral reset
+    wire         DBGRESETn; // Debug system reset
+    wire         FCLK;    // Free running system clock
+    wire         HCLK;    // System clock from PMU
+    wire         DCLK;
+    wire         SCLK;
+    wire         PCLK;    // Peripheral clock
+    wire         PCLKG;   // Gated PCLK for APB
+    wire         PCLKEN;  // Clock divider for AHB to APB bridge
+    wire         APBACTIVE;
+  // event signals
+    wire              TXEV;
+    wire              RXEV;
+    wire               nTRST;            // JTAG - Test reset (active low)
+    wire               SWDI;          // JTAG/SWD - TMS / SWD data input
+    wire               SWCLK;         // JTAG/SWD - TCK / SWCLK
+    wire               SWDO;             // SWD - SWD data output
+    wire               SWDOEN;           // SWD - SWD data output enable
+    wire         SYSRESETREQ;    // processor system reset request
+    wire         WDOGRESETREQ;   // watchdog system reset request
+    wire         HRESETREQ;      // Combined system reset request
+    wire         cmsdk_SYSRESETREQ; // Combined system reset request
+    wire         clk_ctrl_sys_reset_req;
+    wire         PMUHRESETREQ;
+    wire         PMUDBGRESETREQ;
+    wire         LOCKUP;
+    wire         LOCKUPRESET;
+    wire         SLEEPING;
+    wire         GATEHCLK;         // Processor status - safe to gate HCLK
+    wire         WAKEUP;           // Wake up request from WIC
+    wire         WICENREQ;         // WIC enable request from PMU
+    wire         WICENACK;         // WIC enable ack to PMU
+    wire         PMUENABLE;
+    wire         CDBGPWRUPREQ;     // Debug Power Up request to PMU
+    wire         CDBGPWRUPACK;     // Debug Power Up ACK from PMU
+    wire         SLEEPHOLDREQn;    // Sleep extension request from PMU
+    wire         SLEEPHOLDACKn;    // Sleep extension request to PMU    wire         SLEEPING;
+    wire         SYSPWRDOWNACK;
+    wire         DBGPWRDOWNACK;
+    wire         SYSPWRDOWN;
+    wire         DBGPWRDOWN;
+    wire         SYSISOLATEn;
+    wire         SYSRETAINn;
+    wire         DBGISOLATEn;
+    wire         SLEEPDEEP;
+    wire         ADPRESETREQ;
+    // Scan test dummy signals; not connected until scan insertion
+    wire          TESTMODE;        // Test mode enable signal (override synchronizers etc)
+    wire          SCANENABLE;      // Scan enable signal
+    wire          SCANINHCLK;      // HCLK scan input
+    wire          SCANOUTHCLK;     // Scan Chain wire  
+
+// not required for FPGA
+    assign        TESTMODE = 1'b0; 
+    assign        SCANENABLE = 1'b0; 
+    assign        SCANINHCLK = 1'b0; 
+    assign        SCANOUTHCLK = 1'b0;
+
+// Technology-specific PLL/Frequecy synthesizer would generate
+//   CLK, FCLK (Free running system clock)
+// from
+//    xtal_clk_in
+
+    assign  pll_clk = xtal_clk_in; // default to no PLL
+    
+    assign  CLK = (TESTMODE) ? xtal_clk_in : pll_clk;
+  
+
+//?    assign   HCLKSYS  = (INCLUDE_DMA!=0) ? SCLK : HCLK;
+    assign   HCLK  = FCLK;
+  
+   // System Reset request can be from processor or watchdog
+   // or when lockup happens and the control flag is set.
+   assign  cmsdk_SYSRESETREQ = SYSRESETREQ | WDOGRESETREQ |
+                               ADPRESETREQ |
+                               (LOCKUP & LOCKUPRESET);
+   assign clk_ctrl_sys_reset_req = PMUHRESETREQ | HRESETREQ;
+
+  // Clock controller to generate reset and clock signals
+  cmsdk_mcu_clkctrl
+   #(.CLKGATE_PRESENT(CLKGATE_PRESENT))
+   u_cmsdk_mcu_clkctrl(
+     // inputs
+    .XTAL1            (CLK),
+    .NRST             (nrst_in),
+
+    .APBACTIVE        (APBACTIVE),
+    .SLEEPING         (SLEEPING),
+    .SLEEPDEEP        (SLEEPDEEP),
+    .LOCKUP           (LOCKUP),
+    .LOCKUPRESET      (LOCKUPRESET),
+    .SYSRESETREQ      (clk_ctrl_sys_reset_req),
+    .DBGRESETREQ      (PMUDBGRESETREQ),
+    .CGBYPASS         (TESTMODE),
+    .RSTBYPASS        (TESTMODE),
+
+     // outputs
+    .XTAL2            (xtal_clk_out),
+
+    .FCLK             (FCLK),
+
+    .PCLK             (PCLK),
+    .PCLKG            (PCLKG),
+    .PCLKEN           (PCLKEN),
+//?`ifdef CORTEX_M0DESIGNSTART
+//?    .PORESETn         (PORESETn),  // for cm0 designstart
+//?    .HRESETn          (HRESETn),   // for cm0 designstart
+//?`endif
+    .PRESETn          (PRESETn)
+    );
+
+    wire   gated_hclk;
+    wire   gated_dclk;
+    wire   gated_sclk;
+
+  cortexm0_rst_ctl u_rst_ctl
+  (// Inputs
+   .GLOBALRESETn      (nrst_in),
+   .FCLK              (FCLK),
+   .HCLK              (HCLK), //gated_hclk),
+   .DCLK              (DCLK), //gated_dclk),
+   .SYSRESETREQ       (cmsdk_SYSRESETREQ),
+   .PMUHRESETREQ      (PMUHRESETREQ),
+   .PMUDBGRESETREQ    (PMUDBGRESETREQ),
+   .RSTBYPASS         (1'b0),
+   .SE                (1'b0),
+
+   // Outputs
+   .PORESETn          (PORESETn),
+   .HRESETn           (HRESETn),
+   .DBGRESETn         (DBGRESETn),
+   .HRESETREQ         (HRESETREQ));
+
+
+  // Cortex-M0 Power management unit
+  cortexm0_pmu u_cortexm0_pmu
+  ( // Inputs
+    .FCLK             (FCLK),
+    .PORESETn         (PORESETn),
+    .HRESETREQ        (cmsdk_SYSRESETREQ), // from processor / watchdog
+    .PMUENABLE        (PMUENABLE),       // from System Controller
+    .WICENACK         (WICENACK),        // from WIC in integration
+
+    .WAKEUP           (WAKEUP),          // from WIC in integration
+    .CDBGPWRUPREQ     (CDBGPWRUPREQ),
+
+    .SLEEPDEEP        (SLEEPDEEP),
+    .SLEEPHOLDACKn    (SLEEPHOLDACKn),
+    .GATEHCLK         (GATEHCLK),
+    .SYSPWRDOWNACK    (SYSPWRDOWNACK),
+    .DBGPWRDOWNACK    (DBGPWRDOWNACK),
+    .CGBYPASS         (TESTMODE),
+
+   // Outputs
+    .HCLK             (gated_hclk),
+    .DCLK             (gated_dclk),
+    .SCLK             (gated_sclk),
+    .WICENREQ         (WICENREQ),
+    .CDBGPWRUPACK     (CDBGPWRUPACK),
+    .SYSISOLATEn      (SYSISOLATEn),
+    .SYSRETAINn       (SYSRETAINn),
+    .SYSPWRDOWN       (SYSPWRDOWN),
+    .DBGISOLATEn      (DBGISOLATEn),
+    .DBGPWRDOWN       (DBGPWRDOWN),
+    .SLEEPHOLDREQn    (SLEEPHOLDREQn),
+    .PMUDBGRESETREQ   (PMUDBGRESETREQ),
+    .PMUHRESETREQ     (PMUHRESETREQ)
+   );
+
+  // Bypass clock gating cell in PMU if CLKGATE_PRESENT is 0
+  assign  HCLK = (CLKGATE_PRESENT==0) ? FCLK : gated_hclk;
+  assign  DCLK = (CLKGATE_PRESENT==0) ? FCLK : gated_dclk;
+  assign  SCLK = (CLKGATE_PRESENT==0) ? FCLK : gated_sclk;
+
+
+  // In this example system, power control takes place immediately.
+  // In a real circuit you might need to add delays in the next two
+  // signal assignments for correct operation.
+  assign   SYSPWRDOWNACK = SYSPWRDOWN;
+  assign   DBGPWRDOWNACK = DBGPWRDOWN;
+
+  wire              exp_penable;
+  wire              exp_pwrite;
+  wire  [11:0]      exp_paddr;
+  wire  [31:0]      exp_pwdata;
+  wire              exp12_psel;
+  wire              exp12_pready;
+  wire              exp12_pslverr;
+  wire     [31:0]   exp12_prdata;
+  wire              exp13_psel;
+  wire              exp13_pready;
+  wire              exp13_pslverr;
+  wire     [31:0]   exp13_prdata;
+  wire              exp14_psel;
+  wire              exp14_pready;
+  wire              exp14_pslverr;
+  wire     [31:0]   exp14_prdata;
+  wire              exp15_psel;
+  wire              exp15_pready;
+  wire              exp15_pslverr;
+  wire     [31:0]   exp15_prdata;
+
+
+  // internal peripheral signals
+  wire               uart0_rxd;
+  wire               uart0_txd;
+  wire               uart0_txen;
+  wire               uart1_rxd;
+  wire               uart1_txd;
+  wire               uart1_txen;
+  wire               uart2_rxd;
+  wire               uart2_txd;
+  wire               uart2_txen;
+  wire               timer0_extin;
+  wire               timer1_extin;
+
+  wire  [15:0]       p0_altfunc;
+
+  wire  [15:0]       p1_altfunc;
+
+
+// -----------------------------------------------------------------------------
+// AHB Interconnect declarations
+// Upper-case AMBA naming convention maintained
+// -----------------------------------------------------------------------------
+
+    // System Address Remap control
+    wire    [3:0] REMAP;           // System Address REMAP control, bit-0 set on POR
+    wire          ROM_MAP;
+    
+    // Manager port SI0 (inputs from master 0)
+    wire   [31:0] HADDR_adp;         // Address bus
+    wire    [1:0] HTRANS_adp;        // Transfer type
+    wire          HWRITE_adp;        // Transfer direction
+    wire    [2:0] HSIZE_adp;         // Transfer size
+    wire    [2:0] HBURST_adp;        // Burst type
+    wire    [3:0] HPROT_adp;         // Protection control
+    wire   [31:0] HWDATA_adp;        // Write data
+    wire          HMASTLOCK_adp;     // Locked Sequence
+    wire    [1:0] HAUSER_adp;        // Address USER signals
+    wire    [1:0] HWUSER_adp;        // Write-data USER signals
+    // Manager port SI0 (outputs to master 0)
+    wire   [31:0] HRDATA_adp;        // Read data bus
+    wire          HREADY_adp;        // HREADY feedback
+    wire          HRESP_adp;         // Transfer response
+    wire    [1:0] HRUSER_adp;        // Read-data USER signals
+
+    // Manager port SI1 (inputs from master 1)
+    wire   [31:0] HADDR_dma;         // Address bus
+    wire    [1:0] HTRANS_dma;        // Transfer type
+    wire          HWRITE_dma;        // Transfer direction
+    wire    [2:0] HSIZE_dma;         // Transfer size
+    wire    [2:0] HBURST_dma;        // Burst type
+    wire    [3:0] HPROT_dma;         // Protection control
+    wire   [31:0] HWDATA_dma;        // Write data
+    wire          HMASTLOCK_dma;     // Locked Sequence
+    wire    [1:0] HAUSER_dma;        // Address USER signals
+    wire    [1:0] HWUSER_dma;        // Write-data USER signals
+    // Manager port SI1 (outputs to master 1)
+    wire   [31:0] HRDATA_dma;        // Read data bus
+    wire          HREADY_dma;        // HREADY feedback
+    wire          HRESP_dma;         // Transfer response
+    wire    [1:0] HRUSER_dma;        // Read-data USER signals
+
+    // Manager port SI2 (inputs from master 2)
+    wire   [31:0] HADDR_dma2;         // Address bus
+    wire    [1:0] HTRANS_dma2;        // Transfer type
+    wire          HWRITE_dma2;        // Transfer direction
+    wire    [2:0] HSIZE_dma2;         // Transfer size
+    wire    [2:0] HBURST_dma2;        // Burst type
+    wire    [3:0] HPROT_dma2;         // Protection control
+    wire   [31:0] HWDATA_dma2;        // Write data
+    wire          HMASTLOCK_dma2;     // Locked Sequence
+    wire    [1:0] HAUSER_dma2;        // Address USER signals
+    wire    [1:0] HWUSER_dma2;        // Write-data USER signals
+    // Manager port SI2 (outputs to master 2)
+    wire   [31:0] HRDATA_dma2;        // Read data bus
+    wire          HREADY_dma2;        // HREADY feedback
+    wire          HRESP_dma2;         // Transfer response
+    wire    [1:0] HRUSER_dma2;        // Read-data USER signals
+
+    // Manager port SI3 (inputs from master 3)
+    wire   [31:0] HADDR_cpu;         // Address bus
+    wire    [1:0] HTRANS_cpu;        // Transfer type
+    wire          HWRITE_cpu;        // Transfer direction
+    wire    [2:0] HSIZE_cpu;         // Transfer size
+    wire    [2:0] HBURST_cpu;        // Burst type
+    wire    [3:0] HPROT_cpu;         // Protection control
+    wire   [31:0] HWDATA_cpu;        // Write data
+    wire          HMASTLOCK_cpu;     // Locked Sequence
+    wire    [1:0] HAUSER_cpu;        // Address USER signals
+    wire    [1:0] HWUSER_cpu;        // Write-data USER signals
+    // Manager port SI3 (outputs to master 3)
+    wire   [31:0] HRDATA_cpu;        // Read data bus
+    wire          HREADY_cpu;        // HREADY feedback
+    wire          HRESP_cpu;         // Transfer response
+    wire    [1:0] HRUSER_cpu;        // Read-data USER signals
+
+    // Subordinate port MI0 (outputs to slave 0)
+    wire          HSEL_rom1;          // Slave Select
+    wire   [31:0] HADDR_rom1;         // Address bus
+    wire    [1:0] HTRANS_rom1;        // Transfer type
+    wire          HWRITE_rom1;        // Transfer direction
+    wire    [2:0] HSIZE_rom1;         // Transfer size
+    wire    [2:0] HBURST_rom1;        // Burst type
+    wire    [3:0] HPROT_rom1;         // Protection control
+    wire   [31:0] HWDATA_rom1;        // Write data
+    wire          HMASTLOCK_rom1;     // Locked Sequence
+    wire          HREADYMUX_rom1;     // Transfer done
+    wire    [1:0] HAUSER_rom1;        // Address USER signals
+    wire    [1:0] HWUSER_rom1;        // Write-data USER signals
+    // Subordinate port MI0 (inputs from slave 0)
+    wire   [31:0] HRDATA_rom1;        // Read data bus
+    wire          HREADYOUT_rom1;     // HREADY feedback
+    wire          HRESP_rom1;         // Transfer response
+    wire    [1:0] HRUSER_rom1;        // Read-data USER signals
+
+    // Subordinate port MI1 (outputs to slave 1)
+    wire          HSEL_ram2;          // Slave Select
+    wire   [31:0] HADDR_ram2;         // Address bus
+    wire    [1:0] HTRANS_ram2;        // Transfer type
+    wire          HWRITE_ram2;        // Transfer direction
+    wire    [2:0] HSIZE_ram2;         // Transfer size
+    wire    [2:0] HBURST_ram2;        // Burst type
+    wire    [3:0] HPROT_ram2;         // Protection control
+    wire   [31:0] HWDATA_ram2;        // Write data
+    wire          HMASTLOCK_ram2;     // Locked Sequence
+    wire          HREADYMUX_ram2;     // Transfer done
+    wire    [1:0] HAUSER_ram2;        // Address USER signals
+    wire    [1:0] HWUSER_ram2;        // Write-data USER signals
+    // Subordinate port MI1 (inputs from slave 1)
+    wire   [31:0] HRDATA_ram2;        // Read data bus
+    wire          HREADYOUT_ram2;     // HREADY feedback
+    wire          HRESP_ram2;         // Transfer response
+    wire    [1:0] HRUSER_ram2;        // Read-data USER signals
+
+    // Subordinate port MI2 (outputs to slave 2)
+    wire          HSEL_ram3;          // Slave Select
+    wire   [31:0] HADDR_ram3;         // Address bus
+    wire    [1:0] HTRANS_ram3;        // Transfer type
+    wire          HWRITE_ram3;        // Transfer direction
+    wire    [2:0] HSIZE_ram3;         // Transfer size
+    wire    [2:0] HBURST_ram3;        // Burst type
+    wire    [3:0] HPROT_ram3;         // Protection control
+    wire   [31:0] HWDATA_ram3;        // Write data
+    wire          HMASTLOCK_ram3;     // Locked Sequence
+    wire          HREADYMUX_ram3;     // Transfer done
+    wire    [1:0] HAUSER_ram3;        // Address USER signals
+    wire    [1:0] HWUSER_ram3;        // Write-data USER signals
+    // Subordinate port MI2 (inputs from slave 2)
+    wire   [31:0] HRDATA_ram3;        // Read data bus
+    wire          HREADYOUT_ram3;     // HREADY feedback
+    wire          HRESP_ram3;         // Transfer response
+    wire    [1:0] HRUSER_ram3;        // Read-data USER signals
+
+    // Subordinate port MI3 (outputs to slave 3)
+    wire          HSEL_sys;          // Slave Select
+    wire   [31:0] HADDR_sys;         // Address bus
+    wire    [1:0] HTRANS_sys;        // Transfer type
+    wire          HWRITE_sys;        // Transfer direction
+    wire    [2:0] HSIZE_sys;         // Transfer size
+    wire    [2:0] HBURST_sys;        // Burst type
+    wire    [3:0] HPROT_sys;         // Protection control
+    wire   [31:0] HWDATA_sys;        // Write data
+    wire          HMASTLOCK_sys;     // Locked Sequence
+    wire          HREADYMUX_sys;     // Transfer done
+    wire    [1:0] HAUSER_sys;        // Address USER signals
+    wire    [1:0] HWUSER_sys;        // Write-data USER signals
+    // Subordinate port MI3 (inputs from slave 3)
+    wire   [31:0] HRDATA_sys;        // Read data bus
+    wire          HREADYOUT_sys;     // HREADY feedback
+    wire          HRESP_sys;         // Transfer response
+    wire    [1:0] HRUSER_sys;        // Read-data USER signals
+
+    // Subordinate port MI4 (outputs to slave 4)
+    wire          HSEL_ram8;          // Slave Select
+    wire   [31:0] HADDR_ram8;         // Address bus
+    wire    [1:0] HTRANS_ram8;        // Transfer type
+    wire          HWRITE_ram8;        // Transfer direction
+    wire    [2:0] HSIZE_ram8;         // Transfer size
+    wire    [2:0] HBURST_ram8;        // Burst type
+    wire    [3:0] HPROT_ram8;         // Protection control
+    wire   [31:0] HWDATA_ram8;        // Write data
+    wire          HMASTLOCK_ram8;     // Locked Sequence
+    wire          HREADYMUX_ram8;     // Transfer done
+    wire    [1:0] HAUSER_ram8;        // Address USER signals
+    wire    [1:0] HWUSER_ram8;        // Write-data USER signals
+    // Subordinate port MI4 (inputs from slave 4)
+    wire   [31:0] HRDATA_ram8;        // Read data bus
+    wire          HREADYOUT_ram8;     // HREADY feedback
+    wire          HRESP_ram8;         // Transfer response
+    wire    [1:0] HRUSER_ram8;        // Read-data USER signals
+
+    // Subordinate   port MI5 (outputs to slave 5)
+    wire          HSEL_ram9;          // Slave Select
+    wire   [31:0] HADDR_ram9;         // Address bus
+    wire    [1:0] HTRANS_ram9;        // Transfer type
+    wire          HWRITE_ram9;        // Transfer direction
+    wire    [2:0] HSIZE_ram9;         // Transfer size
+    wire    [2:0] HBURST_ram9;        // Burst type
+    wire    [3:0] HPROT_ram9;         // Protection control
+    wire   [31:0] HWDATA_ram9;        // Write data
+    wire          HMASTLOCK_ram9;     // Locked Sequence
+    wire          HREADYMUX_ram9;     // Transfer done
+    wire    [1:0] HAUSER_ram9;        // Address USER signals
+    wire    [1:0] HWUSER_ram9;        // Write-data USER signals
+    // Subordinate port MI5 (inputs from slave 5)
+    wire   [31:0] HRDATA_ram9;        // Read data bus
+    wire          HREADYOUT_ram9;     // HREADY feedback
+    wire          HRESP_ram9;         // Transfer response
+    wire    [1:0] HRUSER_ram9;        // Read-data USER signals
+
+     // Subordinate   port MI6 (outputs to slave 6)
+    wire          HSEL_exp;           // Slave Select
+    wire   [31:0] HADDR_exp;          // Address bus
+    wire    [1:0] HTRANS_exp;         // Transfer type
+    wire          HWRITE_exp;         // Transfer direction
+    wire    [2:0] HSIZE_exp;          // Transfer size
+    wire    [2:0] HBURST_exp;         // Burst type
+    wire    [3:0] HPROT_exp;          // Protection control
+    wire   [31:0] HWDATA_exp;         // Write data
+    wire          HMASTLOCK_exp;      // Locked Sequence
+    wire          HREADYMUX_exp;      // Transfer done
+    wire    [1:0] HAUSER_exp;         // Address USER signals
+    wire    [1:0] HWUSER_exp;         // Write-data USER signals
+    // Subordinate port MI5 (inputs from slave 5)
+    wire   [31:0] HRDATA_exp;         // Read data bus
+    wire          HREADYOUT_exp;      // HREADY feedback
+    wire          HRESP_exp;          // Transfer response
+    wire    [1:0] HRUSER_exp;         // Read-data USER signals
+
+
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+// Interconnect matrix
+// 4 AHB-lite managers, 7 AHB-lite layer interfaces
+//------------------------------------------------------------------------------
+
+// BusMatrix instance
+  soclabs_4x7_AhbMatrix_lite
+   u_soclabs_4x7_AhbMatrix_lite (
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+    .REMAP      (REMAP),
+
+    // Input port SI0 signals
+    .HADDR_adp       (HADDR_adp),
+    .HTRANS_adp      (HTRANS_adp),
+    .HWRITE_adp      (HWRITE_adp),
+    .HSIZE_adp       (HSIZE_adp),
+    .HBURST_adp      (HBURST_adp),
+    .HPROT_adp       (HPROT_adp),
+    .HWDATA_adp      (HWDATA_adp),
+    .HMASTLOCK_adp   (HMASTLOCK_adp),
+    .HREADY_adp      (HREADY_adp),
+    .HAUSER_adp      (HAUSER_adp),
+    .HWUSER_adp      (HWUSER_adp),
+    .HRDATA_adp      (HRDATA_adp),
+    .HRESP_adp       (HRESP_adp),
+    .HRUSER_adp      (HRUSER_adp),
+
+    // Input port SI1 signals
+    .HADDR_dma       (HADDR_dma),
+    .HTRANS_dma      (HTRANS_dma),
+    .HWRITE_dma      (HWRITE_dma),
+    .HSIZE_dma       (HSIZE_dma),
+    .HBURST_dma      (HBURST_dma),
+    .HPROT_dma       (HPROT_dma),
+    .HWDATA_dma      (HWDATA_dma),
+    .HMASTLOCK_dma   (HMASTLOCK_dma),
+    .HREADY_dma      (HREADY_dma),
+    .HAUSER_dma      (HAUSER_dma),
+    .HWUSER_dma      (HWUSER_dma),
+    .HRDATA_dma      (HRDATA_dma),
+    .HRESP_dma       (HRESP_dma),
+    .HRUSER_dma      (HRUSER_dma),
+
+    // Input port SI2 signals
+    .HADDR_dma2      (HADDR_dma2),
+    .HTRANS_dma2     (HTRANS_dma2),
+    .HWRITE_dma2     (HWRITE_dma2),
+    .HSIZE_dma2      (HSIZE_dma2),
+    .HBURST_dma2     (HBURST_dma2),
+    .HPROT_dma2      (HPROT_dma2),
+    .HWDATA_dma2     (HWDATA_dma2),
+    .HMASTLOCK_dma2  (HMASTLOCK_dma2),
+    .HREADY_dma2     (HREADY_dma2),
+    .HAUSER_dma2     (HAUSER_dma2),
+    .HWUSER_dma2     (HWUSER_dma2),
+    .HRDATA_dma2     (HRDATA_dma2),
+    .HRESP_dma2      (HRESP_dma2),
+    .HRUSER_dma2     (HRUSER_dma2),
+
+    // Input port SI3 signals
+    .HADDR_cpu       (HADDR_cpu),
+    .HTRANS_cpu      (HTRANS_cpu),
+    .HWRITE_cpu      (HWRITE_cpu),
+    .HSIZE_cpu       (HSIZE_cpu),
+    .HBURST_cpu      (HBURST_cpu),
+    .HPROT_cpu       (HPROT_cpu),
+    .HWDATA_cpu      (HWDATA_cpu),
+    .HMASTLOCK_cpu   (HMASTLOCK_cpu),
+    .HREADY_cpu      (HREADY_cpu),
+    .HAUSER_cpu      (HAUSER_cpu),
+    .HWUSER_cpu      (HWUSER_cpu),
+    .HRDATA_cpu      (HRDATA_cpu),
+    .HRESP_cpu       (HRESP_cpu),
+    .HRUSER_cpu      (HRUSER_cpu),
+
+    // Output port MI0 signals
+    .HSEL_rom1       (HSEL_rom1),
+    .HADDR_rom1      (HADDR_rom1),
+    .HTRANS_rom1     (HTRANS_rom1),
+    .HWRITE_rom1     (HWRITE_rom1),
+    .HSIZE_rom1      (HSIZE_rom1),
+    .HBURST_rom1     (HBURST_rom1),
+    .HPROT_rom1      (HPROT_rom1),
+    .HWDATA_rom1     (HWDATA_rom1),
+    .HMASTLOCK_rom1  (HMASTLOCK_rom1),
+    .HREADYMUX_rom1  (HREADYMUX_rom1),
+    .HAUSER_rom1     (HAUSER_rom1),
+    .HWUSER_rom1     (HWUSER_rom1),
+    .HRDATA_rom1     (HRDATA_rom1),
+    .HREADYOUT_rom1  (HREADYOUT_rom1),
+    .HRESP_rom1      (HRESP_rom1),
+    .HRUSER_rom1     (HRUSER_rom1),
+
+    // Output port MI1 signals
+    .HSEL_ram2       (HSEL_ram2),
+    .HADDR_ram2      (HADDR_ram2),
+    .HTRANS_ram2     (HTRANS_ram2),
+    .HWRITE_ram2     (HWRITE_ram2),
+    .HSIZE_ram2      (HSIZE_ram2),
+    .HBURST_ram2     (HBURST_ram2),
+    .HPROT_ram2      (HPROT_ram2),
+    .HWDATA_ram2     (HWDATA_ram2),
+    .HMASTLOCK_ram2  (HMASTLOCK_ram2),
+    .HREADYMUX_ram2  (HREADYMUX_ram2),
+    .HAUSER_ram2     (HAUSER_ram2),
+    .HWUSER_ram2     (HWUSER_ram2),
+    .HRDATA_ram2     (HRDATA_ram2),
+    .HREADYOUT_ram2  (HREADYOUT_ram2),
+    .HRESP_ram2      (HRESP_ram2),
+    .HRUSER_ram2     (HRUSER_ram2),
+
+    // Output port MI2 signals
+    .HSEL_ram3       (HSEL_ram3),
+    .HADDR_ram3      (HADDR_ram3),
+    .HTRANS_ram3     (HTRANS_ram3),
+    .HWRITE_ram3     (HWRITE_ram3),
+    .HSIZE_ram3      (HSIZE_ram3),
+    .HBURST_ram3     (HBURST_ram3),
+    .HPROT_ram3      (HPROT_ram3),
+    .HWDATA_ram3     (HWDATA_ram3),
+    .HMASTLOCK_ram3  (HMASTLOCK_ram3),
+    .HREADYMUX_ram3  (HREADYMUX_ram3),
+    .HAUSER_ram3     (HAUSER_ram3),
+    .HWUSER_ram3     (HWUSER_ram3),
+    .HRDATA_ram3     (HRDATA_ram3),
+    .HREADYOUT_ram3  (HREADYOUT_ram3),
+    .HRESP_ram3      (HRESP_ram3),
+    .HRUSER_ram3     (HRUSER_ram3),
+
+    // Output port MI3 signals
+    .HSEL_sys        (HSEL_sys),
+    .HADDR_sys       (HADDR_sys),
+    .HTRANS_sys      (HTRANS_sys),
+    .HWRITE_sys      (HWRITE_sys),
+    .HSIZE_sys       (HSIZE_sys),
+    .HBURST_sys      (HBURST_sys),
+    .HPROT_sys       (HPROT_sys),
+    .HWDATA_sys      (HWDATA_sys),
+    .HMASTLOCK_sys   (HMASTLOCK_sys),
+    .HREADYMUX_sys   (HREADYMUX_sys),
+    .HAUSER_sys      (HAUSER_sys),
+    .HWUSER_sys      (HWUSER_sys),
+    .HRDATA_sys      (HRDATA_sys),
+    .HREADYOUT_sys   (HREADYOUT_sys),
+    .HRESP_sys       (HRESP_sys),
+    .HRUSER_sys      (HRUSER_sys),
+
+    // Output port MI4 signals
+    .HSEL_ram8       (HSEL_ram8),
+    .HADDR_ram8      (HADDR_ram8),
+    .HTRANS_ram8     (HTRANS_ram8),
+    .HWRITE_ram8     (HWRITE_ram8),
+    .HSIZE_ram8      (HSIZE_ram8),
+    .HBURST_ram8     (HBURST_ram8),
+    .HPROT_ram8      (HPROT_ram8),
+    .HWDATA_ram8     (HWDATA_ram8),
+    .HMASTLOCK_ram8  (HMASTLOCK_ram8),
+    .HREADYMUX_ram8  (HREADYMUX_ram8),
+    .HAUSER_ram8     (HAUSER_ram8),
+    .HWUSER_ram8     (HWUSER_ram8),
+    .HRDATA_ram8     (HRDATA_ram8),
+    .HREADYOUT_ram8  (HREADYOUT_ram8),
+    .HRESP_ram8      (HRESP_ram8),
+    .HRUSER_ram8     (HRUSER_ram8),
+
+    // Output port MI5 signals
+    .HSEL_ram9       (HSEL_ram9),
+    .HADDR_ram9      (HADDR_ram9),
+    .HTRANS_ram9     (HTRANS_ram9),
+    .HWRITE_ram9     (HWRITE_ram9),
+    .HSIZE_ram9      (HSIZE_ram9),
+    .HBURST_ram9     (HBURST_ram9),
+    .HPROT_ram9      (HPROT_ram9),
+    .HWDATA_ram9     (HWDATA_ram9),
+    .HMASTLOCK_ram9  (HMASTLOCK_ram9),
+    .HREADYMUX_ram9  (HREADYMUX_ram9),
+    .HAUSER_ram9     (HAUSER_ram9),
+    .HWUSER_ram9     (HWUSER_ram9),
+    .HRDATA_ram9     (HRDATA_ram9),
+    .HREADYOUT_ram9  (HREADYOUT_ram9),
+    .HRESP_ram9      (HRESP_ram9),
+    .HRUSER_ram9     (HRUSER_ram9),
+
+    // Output port MI6 signals
+    .HSEL_exp        (HSEL_exp),
+    .HADDR_exp       (HADDR_exp),
+    .HTRANS_exp      (HTRANS_exp),
+    .HWRITE_exp      (HWRITE_exp),
+    .HSIZE_exp       (HSIZE_exp),
+    .HBURST_exp      (HBURST_exp),
+    .HPROT_exp       (HPROT_exp),
+    .HWDATA_exp      (HWDATA_exp),
+    .HMASTLOCK_exp   (HMASTLOCK_exp),
+    .HREADYMUX_exp   (HREADYMUX_exp),
+    .HAUSER_exp      (HAUSER_exp),
+    .HWUSER_exp      (HWUSER_exp),
+    .HRDATA_exp      (HRDATA_exp),
+    .HREADYOUT_exp   (HREADYOUT_exp),
+    .HRESP_exp       (HRESP_exp),
+    .HRUSER_exp      (HRUSER_exp),
+
+    // Scan test dummy signals; not connected until scan insertion
+    .SCANENABLE      (SCANENABLE),
+    .SCANINHCLK      (SCANINHCLK),
+    .SCANOUTHCLK     (SCANOUTHCLK)
+  );
+
+
+//----------------------------------------
+// Boot ROM "rom1" firmware
+// mapped 0x10000000-0x1fffffff
+// and on REMAP[0]
+// mapped 0x00000000-0x0000ffff
+//----------------------------------------
+
+ahb_bootrom
+//  #(.AW(10)  ) // 1K bytes ROM
+   u_ahb_bootloader (
+    .HCLK             (HCLK),
+    .HRESETn          (HRESETn),
+    .HSEL             (HSEL_rom1),
+    .HADDR            (HADDR_rom1[ 9:0]),
+    .HTRANS           (HTRANS_rom1),
+    .HSIZE            (HSIZE_rom1),
+    .HWRITE           (HWRITE_rom1),
+    .HWDATA           (HWDATA_rom1),
+    .HREADY           (HREADYMUX_rom1),
+    .HREADYOUT        (HREADYOUT_rom1),
+    .HRDATA           (HRDATA_rom1),
+    .HRESP            (HRESP_rom1)
+  );
+
+//----------------------------------------
+// CODE/DATA "ram2"
+// mapped 0x20000000-0x2fffffff
+//----------------------------------------
+
+//localparam AWRAM2 = 9; // 512B
+//localparam AWRAM2 = 10; // 1024B
+localparam AWRAM2 = 14; // 16KB
+//localparam AWRAM2 = 16; // 64KB
+  wire  [AWRAM2-3:0] addr_ram2;
+  wire    [31:0] wdata_ram2;
+  wire    [31:0] rdata_ram2;
+  wire     [3:0] wen_ram2;
+  wire           cs_ram2;
+
+  // AHB to SRAM bridge
+  cmsdk_ahb_to_sram #(.AW(AWRAM2)) u_ahb_to_sram2
+  (
+    // AHB Inputs
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+    .HSEL       (HSEL_ram2),  // AHB inputs
+    .HADDR      (HADDR_ram2[AWRAM2-1:0]),
+    .HTRANS     (HTRANS_ram2),
+    .HSIZE      (HSIZE_ram2),
+    .HWRITE     (HWRITE_ram2),
+    .HWDATA     (HWDATA_ram2),
+    .HREADY     (HREADYMUX_ram2),
+
+    // AHB Outputs
+    .HREADYOUT  (HREADYOUT_ram2), // Outputs
+    .HRDATA     (HRDATA_ram2),
+    .HRESP      (HRESP_ram2),
+
+   // SRAM input
+    .SRAMRDATA  (rdata_ram2),
+   // SRAM Outputs
+    .SRAMADDR   (addr_ram2),
+    .SRAMWDATA  (wdata_ram2),
+    .SRAMWEN    (wen_ram2),
+    .SRAMCS     (cs_ram2)
+   );
+
+  // SRAM model
+//  cmsdk_fpga_sram #(.AW(AWRAM2)) u_fpga_ram2
+  cmsdk_fpga_rom #(.AW(AWRAM2), .filename("../rtl_sim/image.hex") ) u_fpga_ram2
+   (
+   // SRAM Inputs
+    .CLK        (HCLK),
+    .ADDR       (addr_ram2),
+    .WDATA      (wdata_ram2),
+    .WREN       (wen_ram2),
+    .CS         (cs_ram2),
+   // SRAM Output
+    .RDATA      (rdata_ram2)
+   );
+
+
+//----------------------------------------
+// DATA "ram3" 
+// mapped 0x30000000-0x3fffffff
+//----------------------------------------
+
+//localparam AWRAM3 = 9; // 512B
+//localparam AWRAM3 = 10; // 1024B
+localparam AWRAM3 = 14; // 16KB
+//localparam AWRAM3 = 16; // 64KB
+  wire  [AWRAM3-3:0] addr_ram3;
+  wire    [31:0] wdata_ram3;
+  wire    [31:0] rdata_ram3;
+  wire     [3:0] wen_ram3;
+  wire           cs_ram3;
+
+  // AHB to SRAM bridge
+  cmsdk_ahb_to_sram #(.AW(AWRAM3)) u_ahb_to_sram3
+  (
+    // AHB Inputs
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+    .HSEL       (HSEL_ram3),  // AHB inputs
+    .HADDR      (HADDR_ram3[AWRAM3-1:0]),
+    .HTRANS     (HTRANS_ram3),
+    .HSIZE      (HSIZE_ram3),
+    .HWRITE     (HWRITE_ram3),
+    .HWDATA     (HWDATA_ram3),
+    .HREADY     (HREADYMUX_ram3),
+
+    // AHB Outputs
+    .HREADYOUT  (HREADYOUT_ram3), // Outputs
+    .HRDATA     (HRDATA_ram3),
+    .HRESP      (HRESP_ram3),
+
+   // SRAM input
+    .SRAMRDATA  (rdata_ram3),
+   // SRAM Outputs
+    .SRAMADDR   (addr_ram3),
+    .SRAMWDATA  (wdata_ram3),
+    .SRAMWEN    (wen_ram3),
+    .SRAMCS     (cs_ram3)
+   );
+
+  // SRAM model
+  cmsdk_fpga_sram #(.AW(AWRAM3)) u_fpga_ram3
+   (
+   // SRAM Inputs
+    .CLK        (HCLK),
+    .ADDR       (addr_ram3),
+    .WDATA      (wdata_ram3),
+    .WREN       (wen_ram3),
+    .CS         (cs_ram3),
+   // SRAM Output
+    .RDATA      (rdata_ram3)
+   );
+
+//----------------------------------------
+// Expansion/DMA "ram8,ram9" RAM instances
+//----------------------------------------
+
+//localparam AWRAM8 = 9; // 512B
+//localparam AWRAM8 = 10; // 1024B
+localparam AWRAM8 = 14; // 16KB
+//localparam AWRAM8 = 16; // 64KB
+  wire  [AWRAM8-3:0] addr_ram8;
+  wire    [31:0] wdata_ram8;
+  wire    [31:0] rdata_ram8;
+  wire     [3:0] wen_ram8;
+  wire           cs_ram8;
+
+  // AHB to SRAM bridge
+  cmsdk_ahb_to_sram #(.AW(AWRAM8)) u_ahb_to_sram8
+  (
+    // AHB Inputs
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+    .HSEL       (HSEL_ram8),  // AHB inputs
+    .HADDR      (HADDR_ram8[AWRAM8-1:0]),
+    .HTRANS     (HTRANS_ram8),
+    .HSIZE      (HSIZE_ram8),
+    .HWRITE     (HWRITE_ram8),
+    .HWDATA     (HWDATA_ram8),
+    .HREADY     (HREADYMUX_ram8),
+
+    // AHB Outputs
+    .HREADYOUT  (HREADYOUT_ram8), // Outputs
+    .HRDATA     (HRDATA_ram8),
+    .HRESP      (HRESP_ram8),
+
+   // SRAM input
+    .SRAMRDATA  (rdata_ram8),
+   // SRAM Outputs
+    .SRAMADDR   (addr_ram8),
+    .SRAMWDATA  (wdata_ram8),
+    .SRAMWEN    (wen_ram8),
+    .SRAMCS     (cs_ram8)
+   );
+
+  // SRAM model
+  cmsdk_fpga_sram #(.AW(AWRAM8)) u_fpga_ram8
+   (
+   // SRAM Inputs
+    .CLK        (HCLK),
+    .ADDR       (addr_ram8),
+    .WDATA      (wdata_ram8),
+    .WREN       (wen_ram8),
+    .CS         (cs_ram8),
+   // SRAM Output
+    .RDATA      (rdata_ram8)
+   );
+
+// instandiate expansion RAM instance to appear at 0x90000000
+//localparam AWRAM9 = 9; // 512B
+//localparam AWRAM9 = 10; // 1024B
+localparam AWRAM9 = 14; // 16KB
+//localparam AWRAM9 = 16; // 64KB
+  wire  [AWRAM9-3:0] addr_ram9;
+  wire    [31:0] wdata_ram9;
+  wire    [31:0] rdata_ram9;
+  wire     [3:0] wen_ram9;
+  wire           cs_ram9;
+
+  // AHB to SRAM bridge
+  cmsdk_ahb_to_sram #(.AW(AWRAM9)) u_ahb_to_sram9
+  (
+    // AHB Inputs
+    .HCLK       (HCLK),
+    .HRESETn    (HRESETn),
+    .HSEL       (HSEL_ram9),  // AHB inputs
+    .HADDR      (HADDR_ram9[AWRAM9-1:0]),
+    .HTRANS     (HTRANS_ram9),
+    .HSIZE      (HSIZE_ram9),
+    .HWRITE     (HWRITE_ram9),
+    .HWDATA     (HWDATA_ram9),
+    .HREADY     (HREADYMUX_ram9),
+
+    // AHB Outputs
+    .HREADYOUT  (HREADYOUT_ram9), // Outputs
+    .HRDATA     (HRDATA_ram9),
+    .HRESP      (HRESP_ram9),
+
+   // SRAM input
+    .SRAMRDATA  (rdata_ram9),
+   // SRAM Outputs
+    .SRAMADDR   (addr_ram9),
+    .SRAMWDATA  (wdata_ram9),
+    .SRAMWEN    (wen_ram9),
+    .SRAMCS     (cs_ram9)
+   );
+
+  // SRAM model
+  cmsdk_fpga_sram #(.AW(AWRAM9)) u_fpga_ram9
+   (
+   // SRAM Inputs
+    .CLK        (HCLK),
+    .ADDR       (addr_ram9),
+    .WDATA      (wdata_ram9),
+    .WREN       (wen_ram9),
+    .CS         (cs_ram9),
+   // SRAM Output
+    .RDATA      (rdata_ram9)
+   );
+
+//    assign   [31:0] HRDATA_ram8 = 32'hdead8888; // Read data bus
+//    assign          HREADYOUT_ram8 = 1'b1;      // HREADY feedback
+//    assign          HRESP_ram8 = 1'b0;          // Transfer response
+//    assign    [1:0] HRUSER_ram8 = 00;            // Read-data USER signals
+//
+//    assign   [31:0] HRDATA_ram9 = 32'hdead9999; // Read data bus
+//    assign          HREADYOUT_ram9 = 1'b1;      // HREADY feedback
+//    assign          HRESP_ram9 = 1'b0;          // Transfer response
+//    assign    [1:0] HRUSER_ram9 = 00;            // Read-data USER signals
+
+
+//----------------------------------------
+// ADP ASCII DEBUG PROTOCOL controller
+// AHB MANAGER 0
+//----------------------------------------
+
+  // -------------------------------
+  // ADP engine stream and control interfaces
+  // -------------------------------
+
+  wire        comio_tx_ready;
+  wire [7:0]  comio_tx_data8;
+  wire        comio_tx_valid;
+
+  wire        comio_rx_ready;
+  wire [7:0]  comio_rx_data8;
+  wire        comio_rx_valid;
+  
+  wire        stdio_tx_ready;
+  wire [7:0]  stdio_tx_data8;
+  wire        stdio_tx_valid;
+
+  wire        stdio_rx_ready;
+  wire [7:0]  stdio_rx_data8;
+  wire        stdio_rx_valid;
+
+  wire [7:0]  adp_gpo8;
+  wire [7:0]  adp_gpi8;
+
+  assign adp_gpi8 = adp_gpo8;
+  assign ADPRESETREQ = adp_gpo8[0];
+
+  // DMA controller present
+  ADPcontrol_v1_0 u_ADP (
+  // Clock and Reset
+    .ahb_hclk          (HCLK),
+    .ahb_hresetn       (HRESETn),
+  // DMA Control
+    .com_rx_tready     (comio_rx_ready),
+    .com_rx_tdata      (comio_rx_data8),
+    .com_rx_tvalid     (comio_rx_valid),
+    .com_tx_tready     (comio_tx_ready),
+    .com_tx_tdata      (comio_tx_data8),
+    .com_tx_tvalid     (comio_tx_valid),
+    .stdio_rx_tready   (stdio_rx_ready),
+    .stdio_rx_tdata    (stdio_rx_data8),
+    .stdio_rx_tvalid   (stdio_rx_valid),
+    .stdio_tx_tready   (stdio_tx_ready),
+    .stdio_tx_tdata    (stdio_tx_data8),
+    .stdio_tx_tvalid   (stdio_tx_valid),
+    .gpo8              (adp_gpo8),
+    .gpi8              (adp_gpi8),
+  // AHB-Lite Master Interface
+    .ahb_hready        (HREADY_adp),
+    .ahb_hresp         (HRESP_adp),
+    .ahb_hrdata        (HRDATA_adp),
+    .ahb_htrans        (HTRANS_adp),
+    .ahb_hwrite        (HWRITE_adp),
+    .ahb_haddr         (HADDR_adp),
+    .ahb_hsize         (HSIZE_adp),
+    .ahb_hburst        (HBURST_adp),
+    .ahb_hmastlock     (HMASTLOCK_adp),
+    .ahb_hprot         (HPROT_adp),
+    .ahb_hwdata        (HWDATA_adp)
+  );
+    assign HAUSER_adp [1:0] = 2'b00;        // Address USER signals
+    assign HWUSER_adp [1:0] = 2'b00;        // Write-data USER signals
+
+   cmsdk_apb_usrt u_apb_usrt_com (
+    .PCLK              (PCLK),     // Peripheral clock
+    .PCLKG             (PCLKG),    // Gated PCLK for bus
+    .PRESETn           (PRESETn),  // Reset
+
+    .PSEL              (exp14_psel),     // APB interface inputs
+    .PADDR             (exp_paddr[11:2]),
+    .PENABLE           (exp_penable),
+    .PWRITE            (exp_pwrite),
+    .PWDATA            (exp_pwdata),
+
+    .PRDATA            (exp14_prdata),   // APB interface outputs
+    .PREADY            (exp14_pready),
+    .PSLVERR           (exp14_pslverr),
+
+    .ECOREVNUM         (4'h0),// Engineering-change-order revision bits
+
+    .TX_VALID_o        (stdio_rx_valid),
+    .TX_DATA8_o        (stdio_rx_data8),
+    .TX_READY_i        (stdio_rx_ready),
+
+    .RX_VALID_i        (stdio_tx_valid),
+    .RX_DATA8_i        (stdio_tx_data8),
+    .RX_READY_o        (stdio_tx_ready),
+
+    .TXINT             ( ),       // Transmit Interrupt
+    .RXINT             ( ),       // Receive  Interrupt
+    .TXOVRINT          ( ),    // Transmit Overrun Interrupt
+    .RXOVRINT          ( ),    // Receive  Overrun Interrupt
+    .UARTINT           ( ) // Combined Interrupt
+  );
+
+  wire        [7:0]  ft_clkdiv = 8'd03;
+
+  ft1248_streamio_v1_0 #
+   (.FT1248_WIDTH (1),
+    .FT1248_CLKON(0) )
+    u_ftdio_com    (
+    .clk              (HCLK),
+    .resetn           (HRESETn),
+    .ft_clkdiv        (ft_clkdiv    ),
+    .ft_clk_o         (ft_clk_o     ),
+    .ft_ssn_o         (ft_ssn_o     ),
+    .ft_miso_i        (ft_miso_i    ),
+    .ft_miosio_o      (ft_miosio_o  ),
+    .ft_miosio_e      (ft_miosio_e  ),
+    .ft_miosio_z      (ft_miosio_z  ),
+    .ft_miosio_i      (ft_miosio_i  ),
+    .rxd_tready       (comio_tx_ready),
+    .rxd_tdata        (comio_tx_data8),
+    .rxd_tvalid       (comio_tx_valid),
+    .rxd_tlast        (1'b0),
+    .txd_tready       (comio_rx_ready),
+    .txd_tdata        (comio_rx_data8),
+    .txd_tvalid       (comio_rx_valid),
+    .txd_tlast        ( )
+  );
+ 
+ 
+//----------------------------------------
+// DIRECT MEMORY ACCESS controller
+// AHB MANAGER 1
+//----------------------------------------
+
+  // DMA interface not used in this example system
+  wire  [DMA_CHANNEL_NUM-1:0] dma230_tie0;  // tie off signal.
+
+  assign dma230_tie0 = {DMA_CHANNEL_NUM{1'b0}};
+
+  // DMA done per channel
+  wire  [DMA_CHANNEL_NUM-1:0] dma230_done_ch;
+  wire dmac_done;
+  wire dmac_err;
+  
+  ///generate if (INCLUDE_DMA != 0) begin : gen_dma
+  // DMA controller present
+  pl230_udma u_pl230_udma (
+  // Clock and Reset
+    .hclk          (HCLK),
+    .hresetn       (HRESETn),
+  // DMA Control
+    .dma_req       (dma230_tie0),
+    .dma_sreq      (dma230_tie0),
+    .dma_waitonreq (dma230_tie0),
+    .dma_stall     (1'b0),
+    .dma_active    (),
+    .dma_done      (dma230_done_ch),
+    .dma_err       (dmac_err),
+  // AHB-Lite Master Interface
+    .hready        (HREADY_dma),
+    .hresp         (HRESP_dma),
+    .hrdata        (HRDATA_dma),
+    .htrans        (HTRANS_dma),
+    .hwrite        (HWRITE_dma),
+    .haddr         (HADDR_dma),
+    .hsize         (HSIZE_dma),
+    .hburst        (HBURST_dma),
+    .hmastlock     (HMASTLOCK_dma),
+    .hprot         (HPROT_dma),
+    .hwdata        (HWDATA_dma),
+  // APB Slave Interface
+    .pclken        (PCLKEN),
+    .psel          (exp15_psel),
+    .pen           (exp_penable),
+    .pwrite        (exp_pwrite),
+    .paddr         (exp_paddr[11:0]),
+    .pwdata        (exp_pwdata[31:0]),
+    .prdata        (exp15_prdata)
+  );
+
+    assign exp15_pready  = 1'b1;
+    assign exp15_pslverr = 1'b0;
+    assign dmac_done    = |dma230_done_ch; // OR all the DMA done together
+
+/*  end else begin : gen_no_pl230_udma
+    // DMA controller not present
+    assign HADDR_dma      [31:0] = 32'ha2a2a2a2; // Address bus
+    assign HTRANS_dma      [1:0] = 2'b00;        // Transfer type
+    assign HWRITE_dma            = 1'b0;         // Transfer direction
+    assign HSIZE_dma       [2:0] = 3'b010;       // Transfer size
+    assign HBURST_dma      [2:0] = 3'b001;       // Burst type
+    assign HPROT_dma       [3:0] = 4'b0010;      // Protection control
+    assign HWDATA_dma     [31:0] = 32'hd2d2d2d2; // Write data
+    assign HMASTLOCK_dma         = 1'b0;         // Locked Sequence
+    assign HAUSER_dma      [1:0] = 2'b00;        // Address USER signals
+    assign HWUSER_dma      [1:0] = 2'b00;        // Write-data USER signals
+
+    assign dmac_done = 1'b0;
+    assign dmac_err  = 1'b0;
+    assign exp15_pready  = 1'b1;
+    assign exp15_pslverr = 1'b0;
+    assign exp15_prdata  = 32'h00000000;
+    assign dma230_done_ch = {DMA_CHANNEL_NUM{1'b0}};
+
+  end endgenerate
+*/
+
+//----------------------------------------
+// DIRECT MEMORY ACCESS controller 2
+// AHB MANAGER 2
+//----------------------------------------
+
+    // Manager port SI2 (inputs from master 2)
+    assign HADDR_dma2     [31:0] = 32'ha2a2a2a2; // Address bus
+    assign HTRANS_dma2     [1:0] = 2'b00;        // Transfer type
+    assign HWRITE_dma2           = 1'b0;         // Transfer direction
+    assign HSIZE_dma2      [2:0] = 3'b010;       // Transfer size
+    assign HBURST_dma2     [2:0] = 3'b000;       // Burst type
+    assign HPROT_dma2      [3:0] = 4'b0010;      // Protection control
+    assign HWDATA_dma2    [31:0] = 32'hd2d2d2d2; // Write data
+    assign HMASTLOCK_dma2        = 1'b0;         // Locked Sequence
+    assign HAUSER_dma2     [1:0] = 2'b00;        // Address USER signals
+    assign HWUSER_dma2     [1:0] = 2'b00;        // Write-data USER signals
+
+//----------------------------------------
+// CORTEX-M0 CPU controller
+// AHB MANAGER 3
+//----------------------------------------
+
+    wire         SYS_NMI;                   // Watchdog nin-maskable interrupt
+    wire  [31:0] SYS_APB_IRQ;               // APB subsystem IRQs
+    wire  [15:0] SYS_GPIO0_IRQ;             // GPIO-0 IRQs
+    wire  [15:0] SYS_GPIO1_IRQ;             // GPIO-1 IRQs
+
+    wire         gpio0_combintr;
+    wire         gpio1_combintr;
+    assign       gpio0_combintr = |SYS_GPIO0_IRQ[15:0];
+    assign       gpio1_combintr = |SYS_GPIO1_IRQ[15:0];
+
+    wire         intnmi_cm0;
+    wire  [31:0] intisr_cm0;
+
+// match interrupts to CMSDK for validation code reuse
+
+  assign intnmi_cm0        = SYS_NMI;
+  assign intisr_cm0[ 5: 0] = SYS_APB_IRQ[ 5: 0];
+  assign intisr_cm0[ 6]    = SYS_APB_IRQ[ 6]   | gpio0_combintr;
+  assign intisr_cm0[ 7]    = SYS_APB_IRQ[ 7]   | gpio1_combintr;
+  assign intisr_cm0[14: 8] = SYS_APB_IRQ[14: 8];
+  assign intisr_cm0[15]    = SYS_APB_IRQ[15]   | dmac_done | dmac_err;
+  assign intisr_cm0[31:16] = SYS_APB_IRQ[31:16]| SYS_GPIO0_IRQ[15:0];
+    
+    assign HAUSER_cpu [1:0] = 2'b00;        // Address USER signals
+    assign HWUSER_cpu [1:0] = 2'b00;        // Write-data USER signals
+
+
+  // Cortex-M0 integration level
+  nanosoc_cpu
+  u_nanosoc_cpu (
+    .HCLK             (HCLK),
+    .FCLK              (FCLK),
+    .DCLK             (DCLK),
+    .SCLK             (SCLK),
+    .HRESETn          (HRESETn),
+    .PORESETn         (PORESETn),
+    .DBGRESETn        (DBGRESETn),
+    .RSTBYPASS        (TESTMODE),
+    .DFTSE            (SCANENABLE),
+    // AHB port
+    .HADDR           (HADDR_cpu),
+    .HTRANS          (HTRANS_cpu),
+    .HWRITE          (HWRITE_cpu),
+    .HSIZE           (HSIZE_cpu),
+    .HBURST          (HBURST_cpu),
+    .HPROT           (HPROT_cpu),
+    .HWDATA          (HWDATA_cpu),
+    .HMASTLOCK       (HMASTLOCK_cpu),
+    .HREADY          (HREADY_cpu),
+//    .HAUSER          (HAUSER_cpu),
+//    .HWUSER          (HWUSER_cpu),
+    .HRDATA          (HRDATA_cpu),
+    .HRESP           (HRESP_cpu),
+//    .HRUSER          (HRUSER_cpu),
+  // sideband signals
+     .NMI            (intnmi_cm0),        // Non-maskable interrupt input
+     .IRQ            (intisr_cm0[31:0]),  // Interrupt request inputs
+     .TXEV           (TXEV),              // Event output (SEV executed)
+     .RXEV           (RXEV),              // Event input
+  // MISCELLANEOUS ---------------------
+     .SLEEPING       (SLEEPING),
+     .SLEEPDEEP      (SLEEPDEEP),
+     .WAKEUP         (WAKEUP       ), // Wake up request from WIC
+     .WICENREQ       (WICENREQ     ), // WIC enable request from PMU
+     .WICENACK       (WICENACK     ), // WIC enable ack to PMU
+     .LOCKUP         (LOCKUP),            // Core is locked-up
+     .GATEHCLK       (GATEHCLK),
+     .SYSRESETREQ    (SYSRESETREQ),       // System reset request
+     .WDOGRESETREQ   (WDOGRESETREQ),      // Watchdog HW reset request
+     .ADPRESETREQ    (ADPRESETREQ),       // ADP debugger reset request
+     
+  // Debug - JTAG or Serial wire
+     // inputs
+    .SWDI            (SWDI),
+    .SWCLK           (SWCLK),
+     // outputs
+    .SWDO            (SWDO),
+    .SWDOEN          (SWDOEN)
+  );
+
+  assign   RXEV = dmac_done;  // Generate event when a DMA operation completed.
+
+
+//------------------------------------
+// internal wires
+
+  assign p0_out_nen     = ~p0_out_en;     //active low pad drive option
+  assign p1_out_nen_mux = ~p1_out_en_mux; //active low pad drive option
+  
+
+  // Common AHB signals
+  wire  [31:0]       HADDR;
+  wire  [1:0]        HTRANS;
+  wire  [2:0]        HSIZE;
+  wire               HWRITE;
+  wire  [31:0]       HWDATA;
+  wire               HREADY;
+
+  localparam BASEADDR_GPIO0       = 32'h4001_0000;
+  localparam BASEADDR_GPIO1       = 32'h4001_1000;
+  localparam BASEADDR_SYSROMTABLE = 32'hf000_0000;
+
+   nanosoc_sysio
+    u_nanosoc_sysio (
+    .FCLK             (FCLK         ), // free-running clock
+    .PORESETn         (PORESETn     ), // Power-On-Reset (active-low)
+    .TESTMODE         (TESTMODE     ), // Test-mode override for testability
+    .HCLK             (HCLK         ), // AHB interconnect clock
+    .HRESETn          (HRESETn      ), // AHB interconnect reset (active-low)
+    // Common AHB signals
+    .HSEL             (HSEL_sys     ),
+    .HADDR            (HADDR_sys    ),
+    .HBURST           (HBURST_sys   ),
+    .HMASTLOCK        (HMASTLOCK_sys),
+    .HPROT            (HPROT_sys    ),
+    .HSIZE            (HSIZE_sys    ),
+    .HTRANS           (HTRANS_sys   ),
+    .HWDATA           (HWDATA_sys   ),
+    .HWRITE           (HWRITE_sys   ),
+    .HREADY           (HREADYMUX_sys),
+    .HRDATA           (HRDATA_sys   ),
+    .HRESP            (HRESP_sys    ),
+    .HREADYOUT        (HREADYOUT_sys),
+    // APB clocking
+    .PCLK             (PCLK         ),
+    .PCLKG            (PCLKG        ),
+    .PRESETn          (PRESETn      ),
+    .PCLKEN           (PCLKEN       ),
+  // APB expansion select outputs
+    .exp12_psel       (exp12_psel   ),
+    .exp13_psel       (exp13_psel   ),
+    .exp14_psel       (exp14_psel   ),
+    .exp15_psel       (exp15_psel   ),
+    .exp_pwdata       (exp_pwdata   ),
+    .exp_paddr        (exp_paddr    ),
+    .exp_pwrite       (exp_pwrite   ),
+    .exp_penable      (exp_penable  ),
+  // APB expansion interface inputs
+    .exp12_prdata     (exp12_prdata ),
+    .exp12_pready     (exp12_pready ),
+    .exp12_pslverr    (exp12_pslverr),
+    .exp13_prdata     (exp13_prdata ),
+    .exp13_pready     (exp13_pready ),
+    .exp13_pslverr    (exp13_pslverr),
+    .exp14_prdata     (exp14_prdata ),
+    .exp14_pready     (exp14_pready ),
+    .exp14_pslverr    (exp14_pslverr),
+    .exp15_prdata     (exp15_prdata ),
+    .exp15_pready     (exp15_pready ),
+    .exp15_pslverr    (exp15_pslverr),
+    // CPU sideband signalling
+    .SYS_NMI          (SYS_NMI      ),
+    .SYS_APB_IRQ      (SYS_APB_IRQ  ),
+    // CPU specific power/reset control
+    .REMAP_CTRL       (ROM_MAP      ),
+    .APBACTIVE        (APBACTIVE    ),
+    .SYSRESETREQ      (SYSRESETREQ  ),
+    .WDOGRESETREQ     (WDOGRESETREQ ),
+    .LOCKUP           (LOCKUP       ),
+    .LOCKUPRESET      (LOCKUPRESET  ),
+    .PMUENABLE        (PMUENABLE    ),
+    // chip IO
+    .SYS_GPIO0_IRQ    (SYS_GPIO0_IRQ ),
+    .SYS_GPIO1_IRQ    (SYS_GPIO1_IRQ ),
+    // IO signalling
+    .uart0_rxd        (uart0_rxd    ),
+    .uart0_txd        (uart0_txd    ),
+    .uart0_txen       (uart0_txen   ),
+    .uart1_rxd        (uart1_rxd    ),
+    .uart1_txd        (uart1_txd    ),
+    .uart1_txen       (uart1_txen   ),
+    .uart2_rxd        (uart2_rxd    ),
+    .uart2_txd        (uart2_txd    ),
+    .uart2_txen       (uart2_txen   ),
+    .timer0_extin     (timer0_extin ),  
+    .timer1_extin     (timer1_extin ),
+    // GPIO port signalling
+    .p0_in            (p0_in        ),
+    .p0_out           (p0_out       ),
+    .p0_outen         (p0_out_en    ),
+    .p0_altfunc       (p0_altfunc   ),
+
+    .p1_in            (p1_in        ),
+    .p1_out           (p1_out       ),
+    .p1_outen         (p1_out_en    ),
+    .p1_altfunc       (p1_altfunc   )
+    );
+
+ assign REMAP[3] = 1'b0;
+ assign REMAP[2] = 1'b0;
+ assign REMAP[1] = 1'b0;
+ assign REMAP[0] =!ROM_MAP;
+ 
+ assign exp12_pready = 1'b1;
+ assign exp13_pready = 1'b1;
+ 
+  // Internal Debug signals
+  wire               i_trst_n;
+  wire               i_swditms;
+  wire               i_swclktck;
+  wire               i_tdi;
+  wire               i_tdo;
+  wire               i_tdoen_n;
+  wire               i_swdo;
+  wire               i_swdoen;
+
+  // Serial wire debug is used.  nTRST, TDI and TDO are not needed
+
+
+//----------------------------------------
+// I/O port pin muxing and tristate
+//----------------------------------------
+
+
+  assign        i_swclktck    =  swdclk_in;
+  assign        i_swditms     =  swdio_in;
+  assign        swdio_out     =  i_swdo;
+  assign        swdio_out_en  =  i_swdoen;
+  assign        swdio_out_nen = !i_swdoen;
+
+  assign        swdclk_in     =  swdclk_i;
+  assign        swdio_in      =  swdio_i;
+
+  assign        swdio_o       =  swdio_out;
+  assign        swdio_e       =  swdio_out_en;
+  assign        swdio_z       =  swdio_out_nen;
+
+  cmsdk_mcu_pin_mux
+    u_pin_mux (
+    // UART
+    .uart0_rxd        (uart0_rxd),
+    .uart0_txd        (uart0_txd),
+    .uart0_txen       (uart0_txen),
+    .uart1_rxd        (uart1_rxd),
+    .uart1_txd        (uart1_txd),
+    .uart1_txen       (uart1_txen),
+    .uart2_rxd        (uart2_rxd),
+    .uart2_txd        (uart2_txd),
+    .uart2_txen       (uart2_txen),
+
+    // Timer
+    .timer0_extin     (timer0_extin),
+    .timer1_extin     (timer1_extin),
+
+
+    // IO Ports
+    .p0_in            ( ), // was (p0_in) now from pad inputs),
+    .p0_out           (p0_out),
+    .p0_outen         (p0_out_en),
+    .p0_altfunc       (p0_altfunc),
+
+    .p1_in            ( ), // was(p1_in) now from pad inputs),
+    .p1_out           (p1_out),
+    .p1_outen         (p1_out_en),
+    .p1_altfunc       (p1_altfunc),
+
+    // Debug
+    .i_trst_n         (i_trst_n),
+    .i_swditms        ( ), //i_swditms),
+    .i_swclktck       ( ), //i_swclktck),
+    .i_tdi            (i_tdi),
+    .i_tdo            (i_tdo),
+    .i_tdoen_n        (i_tdoen_n),
+    .i_swdo           (i_swdo),
+    .i_swdoen         (i_swdoen),
+
+    // IO pads
+    .p1_out_mux       (p1_out_mux),
+    .p1_out_en_mux    (p1_out_en_mux),
+    .P0               ( ), //P0),
+    .P1               ( ), //P1),
+
+    .nTRST            (nTRST),  // Not needed if serial-wire debug is used
+    .TDI              (1'b0),    // Not needed if serial-wire debug is used
+    .SWDIOTMS         ( ), //SWDIOTMS),
+    .SWCLKTCK         ( ), //SWCLKTCK),
+    .TDO              ( )     // Not needed if serial-wire debug is used
+
+  );
+
+endmodule
+
+
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip_pads.v b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip_pads.v
new file mode 100644
index 0000000..e994acb
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_chip_pads.v
@@ -0,0 +1,406 @@
+//-----------------------------------------------------------------------------
+// customised top-level Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Top level for example Cortex-M0/Cortex-M0+ microcontroller
+//-----------------------------------------------------------------------------
+//
+
+module nanosoc_chip_pads (
+`ifdef POWER_PINS
+  inout  wire          VDDIO,
+  inout  wire          VSSIO,
+  inout  wire          VDD,
+  inout  wire          VSS,
+`endif
+  inout  wire          XTAL1, // input
+  inout  wire          XTAL2, // output
+  inout  wire          NRST,  // active low reset
+  inout  wire  [15:0]  P0,
+  inout  wire  [15:0]  P1,
+  inout  wire          SWDIOTMS,
+  inout  wire          SWCLKTCK);
+
+
+//------------------------------------
+// internal wires
+
+  wire          xtal_clk_i;
+  wire          xtal_clk_o;
+  wire          nrst_i;
+  wire  [15:0]  p0_i; // level-shifted input from pad
+  wire  [15:0]  p0_o; // output port drive
+  wire  [15:0]  p0_e; // active high output drive enable (pad tech dependent)
+  wire  [15:0]  p0_z; // active low output drive enable (pad tech dependent)
+  wire  [15:0]  p1_i; // level-shifted input from pad
+  wire  [15:0]  p1_o; // output port drive
+  wire  [15:0]  p1_e; // active high output drive enable (pad tech dependent)
+  wire  [15:0]  p1_z; // active low output drive enable (pad tech dependent)
+
+  wire          swdio_i;
+  wire          swdio_o;
+  wire          swdio_e;
+  wire          swdio_z;
+  wire          swdclk_i;
+
+ // --------------------------------------------------------------------------------
+ // Cortex-M0 nanosoc Microcontroller
+ // --------------------------------------------------------------------------------
+
+  nanosoc_chip
+   u_nanosoc_chip (
+`ifdef POWER_PINS
+  .VDDIO      (VDDIO),
+  .VSSIO      (VSSIO),
+  .VDD        (VDD),
+  .VSS        (VSS),
+`endif
+  .xtal_clk_i(xtal_clk_i),
+  .xtal_clk_o(xtal_clk_o),
+  .nrst_i(nrst_i),
+  .p0_i(p0_i), // level-shifted input from pad
+  .p0_o(p0_o), // output port drive
+  .p0_e(p0_e), // active high output drive enable (pad tech dependent)
+  .p0_z(p0_z), // active low output drive enable (pad tech dependent)
+  .p1_i(p1_i), // level-shifted input from pad
+  .p1_o(p1_o), // output port drive
+  .p1_e(p1_e), // active high output drive enable (pad tech dependent)
+  .p1_z(p1_z), // active low output drive enable (pad tech dependent)
+  .swdio_i(swdio_i),
+  .swdio_o(swdio_o),
+  .swdio_e(swdio_e),
+  .swdio_z(swdio_z),
+  .swdclk_i(swdclk_i)
+  );
+
+
+//TIE_HI uTIEHI (.tiehi(tiehi));
+ wire tiehi = 1'b1;
+//TIE_LO uTIELO (.tielo(tielo));
+ wire tielo = 1'b0;
+
+ // --------------------------------------------------------------------------------
+ // IO pad (GLIB Generic Library napping)
+ // --------------------------------------------------------------------------------
+
+`ifdef POWER_PINS
+// Pad IO power supplies
+
+PAD_VDDIO uPAD_VDDIO_1(
+   .PAD(VDDIO)
+   );
+
+PAD_VSSIO uPAD_VSSIO_1(
+   .PAD(VSSIO)
+   );
+
+// Core power supplies
+
+PAD_VDDSOC uPAD_VDD_1(
+   .PAD(VDD)
+   );
+
+PAD_VSS uPAD_VSS_1(
+   .PAD(VSS)
+   );
+`endif
+
+// Clock, Reset and Serial Wire Debug ports
+
+PAD_INOUT8MA_NOE uPAD_XTAL_I (
+   .PAD (XTAL1), 
+   .O   (tielo),
+   .I   (xtal_clk_i), 
+   .NOE (tiehi)
+   );
+
+PAD_INOUT8MA_NOE uPAD_XTAL_O (
+   .PAD (XTAL2), 
+   .O   (xtal_clk_o),
+   .I   ( ), 
+   .NOE (tielo)
+   );
+
+PAD_INOUT8MA_NOE uPAD_NRST_I (
+   .PAD (NRST), 
+   .O   (tielo),
+   .I   (nrst_i), 
+   .NOE (tiehi)
+   );
+
+PAD_INOUT8MA_NOE uPAD_SWDIO_I (
+   .PAD (SWDIOTMS), 
+   .O   (swdio_o), 
+   .I   (swdio_i),
+   .NOE (swdio_z)
+   );
+
+PAD_INOUT8MA_NOE uPAD_SWDCLK_I (
+   .PAD (SWCLKTCK), 
+   .O   (tielo), 
+   .I   (swdclk_i),
+   .NOE (tiehi)
+   );
+
+// GPI.I Port 0 x 16
+
+PAD_INOUT8MA_NOE uPAD_P0_00 (
+   .PAD (P0[00]), 
+   .O   (p0_o[00]), 
+   .I   (p0_i[00]),
+   .NOE (p0_z[00])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P0_01 (
+   .PAD (P0[01]), 
+   .O   (p0_o[01]), 
+   .I   (p0_i[01]),
+   .NOE (p0_z[01])
+   );
+  
+PAD_INOUT8MA_NOE uPAD_P0_02 (
+   .PAD (P0[02]), 
+   .O   (p0_o[02]), 
+   .I   (p0_i[02]),
+   .NOE (p0_z[02])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P0_03 (
+   .PAD (P0[03]), 
+   .O   (p0_o[03]), 
+   .I   (p0_i[03]),
+   .NOE (p0_z[03])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P0_04 (
+   .PAD (P0[04]), 
+   .O   (p0_o[04]), 
+   .I   (p0_i[04]),
+   .NOE (p0_z[04])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P0_05 (
+   .PAD (P0[05]), 
+   .O   (p0_o[05]), 
+   .I   (p0_i[05]),
+   .NOE (p0_z[05])
+   );
+  
+PAD_INOUT8MA_NOE uPAD_P0_06 (
+   .PAD (P0[06]), 
+   .O   (p0_o[06]), 
+   .I   (p0_i[06]),
+   .NOE (p0_z[06])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P0_07 (
+   .PAD (P0[07]), 
+   .O   (p0_o[07]), 
+   .I   (p0_i[07]),
+   .NOE (p0_z[07])
+   );
+  
+PAD_INOUT8MA_NOE uPAD_P0_08 (
+   .PAD (P0[08]), 
+   .O   (p0_o[08]), 
+   .I   (p0_i[08]),
+   .NOE (p0_z[08])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P0_09 (
+   .PAD (P0[09]), 
+   .O   (p0_o[09]), 
+   .I   (p0_i[09]),
+   .NOE (p0_z[09])
+   );
+  
+PAD_INOUT8MA_NOE uPAD_P0_10 (
+   .PAD (P0[10]), 
+   .O   (p0_o[10]), 
+   .I   (p0_i[10]),
+   .NOE (p0_z[10])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P0_11 (
+   .PAD (P0[11]), 
+   .O   (p0_o[11]), 
+   .I   (p0_i[11]),
+   .NOE (p0_z[11])
+   );
+  
+PAD_INOUT8MA_NOE uPAD_P0_12 (
+   .PAD (P0[12]), 
+   .O   (p0_o[12]), 
+   .I   (p0_i[12]),
+   .NOE (p0_z[12])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P0_13 (
+   .PAD (P0[13]), 
+   .O   (p0_o[13]), 
+   .I   (p0_i[13]),
+   .NOE (p0_z[13])
+   );
+  
+PAD_INOUT8MA_NOE uPAD_P0_14 (
+   .PAD (P0[14]), 
+   .O   (p0_o[14]), 
+   .I   (p0_i[14]),
+   .NOE (p0_z[14])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P0_15 (
+   .PAD (P0[15]), 
+   .O   (p0_o[15]), 
+   .I   (p0_i[15]),
+   .NOE (p0_z[15])
+   );
+  
+// GPI.I Port 1 x 16
+
+PAD_INOUT8MA_NOE uPAD_P1_00 (
+   .PAD (P1[00]), 
+   .O   (p1_o[00]), 
+   .I   (p1_i[00]),
+   .NOE (p1_z[00])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P1_01 (
+   .PAD (P1[01]), 
+   .O   (p1_o[01]), 
+   .I   (p1_i[01]),
+   .NOE (p1_z[01])
+   );
+  
+PAD_INOUT8MA_NOE uPAD_P1_02 (
+   .PAD (P1[02]), 
+   .O   (p1_o[02]), 
+   .I   (p1_i[02]),
+   .NOE (p1_z[02])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P1_03 (
+   .PAD (P1[03]), 
+   .O   (p1_o[03]), 
+   .I   (p1_i[03]),
+   .NOE (p1_z[03])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P1_04 (
+   .PAD (P1[04]), 
+   .O   (p1_o[04]), 
+   .I   (p1_i[04]),
+   .NOE (p1_z[04])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P1_05 (
+   .PAD (P1[05]), 
+   .O   (p1_o[05]), 
+   .I   (p1_i[05]),
+   .NOE (p1_z[05])
+   );
+  
+PAD_INOUT8MA_NOE uPAD_P1_06 (
+   .PAD (P1[06]), 
+   .O   (p1_o[06]), 
+   .I   (p1_i[06]),
+   .NOE (p1_z[06])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P1_07 (
+   .PAD (P1[07]), 
+   .O   (p1_o[07]), 
+   .I   (p1_i[07]),
+   .NOE (p1_z[07])
+   );
+  
+PAD_INOUT8MA_NOE uPAD_P1_08 (
+   .PAD (P1[08]), 
+   .O   (p1_o[08]), 
+   .I   (p1_i[08]),
+   .NOE (p1_z[08])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P1_09 (
+   .PAD (P1[09]), 
+   .O   (p1_o[09]), 
+   .I   (p1_i[09]),
+   .NOE (p1_z[09])
+   );
+  
+PAD_INOUT8MA_NOE uPAD_P1_10 (
+   .PAD (P1[10]), 
+   .O   (p1_o[10]), 
+   .I   (p1_i[10]),
+   .NOE (p1_z[10])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P1_11 (
+   .PAD (P1[11]), 
+   .O   (p1_o[11]), 
+   .I   (p1_i[11]),
+   .NOE (p1_z[11])
+   );
+  
+PAD_INOUT8MA_NOE uPAD_P1_12 (
+   .PAD (P1[12]), 
+   .O   (p1_o[12]), 
+   .I   (p1_i[12]),
+   .NOE (p1_z[12])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P1_13 (
+   .PAD (P1[13]), 
+   .O   (p1_o[13]), 
+   .I   (p1_i[13]),
+   .NOE (p1_z[13])
+   );
+  
+PAD_INOUT8MA_NOE uPAD_P1_14 (
+   .PAD (P1[14]), 
+   .O   (p1_o[14]), 
+   .I   (p1_i[14]),
+   .NOE (p1_z[14])
+   );
+
+PAD_INOUT8MA_NOE uPAD_P1_15 (
+   .PAD (P1[15]), 
+   .O   (p1_o[15]), 
+   .I   (p1_i[15]),
+   .NOE (p1_z[15])
+   );
+
+endmodule
+
+
+
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_cpu.v b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_cpu.v
new file mode 100644
index 0000000..c6185ea
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_cpu.v
@@ -0,0 +1,250 @@
+//-----------------------------------------------------------------------------
+// customised Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : System level design for the example Cortex-M0 system
+//-----------------------------------------------------------------------------
+
+module nanosoc_cpu #(
+  parameter CLKGATE_PRESENT = 0,
+  parameter BE              = 0,   // 1: Big endian 0: little endian
+  parameter BKPT            = 4,   // Number of breakpoint comparators
+  parameter DBG             = 1,   // Debug configuration
+  parameter NUMIRQ          = 32,  // NUM of IRQ
+  parameter SMUL            = 0,   // Multiplier configuration
+  parameter SYST            = 1,   // SysTick
+  parameter WIC             = 1,   // Wake-up interrupt controller support
+  parameter WICLINES        = 34,  // Supported WIC lines
+  parameter WPT             = 2,   // Number of DWT comparators
+  parameter RESET_ALL_REGS  = 0,   // Do not reset all registers
+  parameter INCLUDE_JTAG    = 0    // Do not Include JTAG feature
+ )
+ (
+  input  wire          HCLK,             // (HCLK master)
+  input  wire               FCLK,             // Free running clock
+  input  wire               SCLK,             // System clock
+  input  wire               HRESETn,          // AHB and System reset
+  input  wire               PORESETn,         // Power on reset
+  input  wire               DCLK,             // Debug clock
+  input  wire               DBGRESETn,        // Debug reset
+  input  wire               RSTBYPASS,        // Reset by pass (for testing)
+  input  wire          DFTSE,        // Reset by pass (for testing)
+
+  // AHB Lite port
+  output wire   [31:0] HADDR,            // Address bus
+  output wire    [1:0] HTRANS,           // Transfer type
+  output wire          HWRITE,           // Transfer direction
+  output wire    [2:0] HSIZE,            // Transfer size
+  output wire    [2:0] HBURST,           // Burst type
+  output wire    [3:0] HPROT,            // Protection control
+  output wire   [31:0] HWDATA,           // Write data
+  output wire          HMASTLOCK,        // Locked Sequence
+//  output wire    [1:0] HAUSER,           // Address USER signals
+//  output wire    [1:0] HWUSER,           // Write-data USER signals
+  input  wire   [31:0] HRDATA,           // Read data bus
+  input  wire          HREADY,           // HREADY feedback
+  input  wire          HRESP,            // Transfer response
+//  input  wire    [1:0] HRUSER,           // Read-data USER signals
+
+  // Sideband CPU signalling
+  input  wire          NMI,              // Non-Maskable Interrupt request
+  input  wire   [31:0] IRQ,              // Maskable Interrupt requests
+  output wire          TXEV,             // Send Event (SEV) output
+  input  wire          RXEV,             // Receive Event input
+  output wire          SLEEPING,         // Processor status - sleeping
+  output wire          SLEEPDEEP,        // Processor status - deep sleep
+  output wire          GATEHCLK,           // Wake up request from WIC
+  output wire          LOCKUP,           // Wake up request from WIC
+  output wire          WAKEUP,           // Wake up request from WIC
+  input  wire          WICENREQ,         // WIC enable request from PMU
+  output wire          WICENACK,         // WIC enable ack to PMU
+  input  wire          SYSRESETREQ,      // System reset request
+  input  wire          WDOGRESETREQ,     // Watchdog reset request
+  input  wire          ADPRESETREQ,      // ADP Debug reset request
+  
+  // Serial-Wire Debug
+  input  wire          SWDI,             // SWD data input
+  input  wire          SWCLK,            // SWD clock
+  output wire          SWDO,             // SWD data output
+  output wire          SWDOEN);          // SWD data output enable
+
+
+  // -------------------------------
+  // Internal signals
+  // -------------------------------
+
+  // clock, reset, and power control
+
+  wire     [33:0]   WICSENSE;
+
+  wire               APBACTIVE;        // APB bus active (for clock gating of PCLKG)
+  wire               LOCKUPRESET;      // System Controller cfg - reset if lockup
+  wire               PMUENABLE;        // System Controller cfg - Enable PMU
+
+  wire               CDBGPWRUPREQ;     // Debug Power Up request to PMU
+  wire               CDBGPWRUPACK;     // Debug Power Up ACK from PMU
+  wire               SLEEPHOLDREQn;    // Sleep extension request from PMU
+  wire               SLEEPHOLDACKn;    // Sleep extension request to PMU
+
+
+  // SysTick timer signals
+  wire              STCLKEN;
+  wire     [25:0]   STCALIB;
+
+  // Processor debug signals
+  wire              DBGRESTART;
+  wire              DBGRESTARTED;
+  wire              EDBGRQ;
+
+  // Processor status
+  wire              HALTED;
+  wire      [2:0]   CODEHINTDE;
+  wire              SPECHTRANS;
+  wire              CODENSEQ;
+  wire              SHAREABLE;
+
+  // Cortex-M0 integration level
+  CORTEXM0INTEGRATION
+            #(.ACG       (CLKGATE_PRESENT), // Architectural clock gating
+              .BE        (BE),              // Big-endian
+              .BKPT      (BKPT),            // Number of breakpoint comparators
+              .DBG       (DBG),             // Debug configuration
+              .JTAGnSW   (INCLUDE_JTAG),    // Debug port interface: JTAGnSW
+              .NUMIRQ    (NUMIRQ),          // Number of Interrupts
+              .RAR       (RESET_ALL_REGS),  // Reset All Registers
+              .SMUL      (SMUL),            // Multiplier configuration
+              .SYST      (SYST),            // SysTick
+              .WIC       (WIC),             // Wake-up interrupt controller support
+              .WICLINES  (WICLINES),        // Supported WIC lines
+              .WPT       (WPT))             // Number of DWT comparators
+
+  u_cortex_m0_integration (
+  // System inputs
+  .FCLK          (FCLK),  // FCLK
+  .SCLK          (SCLK),  // SCLK generated from PMU
+  .HCLK          (HCLK),  // HCLK generated from PMU
+  .DCLK          (DCLK),  // DCLK generated from PMU
+  .PORESETn      (PORESETn),
+  .HRESETn       (HRESETn),
+  .DBGRESETn     (DBGRESETn),
+  .RSTBYPASS     (RSTBYPASS),
+  .SE            (DFTSE),
+
+  // Power management inputs
+  .SLEEPHOLDREQn (SLEEPHOLDREQn),
+  .WICENREQ      (WICENREQ),
+  .CDBGPWRUPACK  (CDBGPWRUPACK),
+
+  // Power management outputs
+  .SLEEPHOLDACKn (SLEEPHOLDACKn),
+  .WICENACK      (WICENACK),
+  .CDBGPWRUPREQ  (CDBGPWRUPREQ),
+
+  .WAKEUP        (WAKEUP),
+  .WICSENSE      (WICSENSE),
+  .GATEHCLK      (GATEHCLK),
+  .SYSRESETREQ   (SYSRESETREQ),
+
+  // System bus
+  .HADDR         (HADDR     ),
+  .HTRANS        (HTRANS    ),
+  .HSIZE         (HSIZE     ),
+  .HBURST        (HBURST    ),
+  .HPROT         (HPROT     ),
+  .HMASTLOCK     (HMASTLOCK ),
+  .HWRITE        (HWRITE    ),
+  .HWDATA        (HWDATA    ),
+  .HRDATA        (HRDATA    ),
+  .HREADY        (HREADY    ),
+  .HRESP         (HRESP     ),
+  .HMASTER       ( ),
+
+  .CODEHINTDE    (CODEHINTDE),
+  .SPECHTRANS    (SPECHTRANS),
+  .CODENSEQ      (CODENSEQ),
+
+  // Interrupts
+  .IRQ           (IRQ[31:0]),
+  .NMI           (NMI),
+  .IRQLATENCY    (8'h00),
+
+  .ECOREVNUM     (28'h0),
+  // Systick
+  .STCLKEN       (STCLKEN),
+  .STCALIB       (STCALIB),
+
+  // Debug - JTAG or Serial wire
+     // inputs
+  .nTRST         (1'b1),
+  .SWDITMS       (SWDI),
+  .SWCLKTCK      (SWCLK),
+  .TDI           (1'b0),
+     // outputs
+  .TDO           ( ),
+  .nTDOEN        ( ),
+  .SWDO          (SWDO),
+  .SWDOEN        (SWDOEN),
+
+  .DBGRESTART    (DBGRESTART),
+  .DBGRESTARTED  (DBGRESTARTED),
+
+  // Event communication
+  .TXEV          (TXEV),
+  .RXEV          (RXEV),
+  .EDBGRQ        (EDBGRQ),
+  // Status output
+  .HALTED        (HALTED),
+  .LOCKUP        (LOCKUP),
+  .SLEEPING      (SLEEPING),
+  .SLEEPDEEP     (SLEEPDEEP)
+  );
+
+  // Unused debug feature
+  assign   DBGRESTART = 1'b0; // multi-core synchronous restart from halt
+  assign   EDBGRQ     = 1'b0; // multi-core synchronous halt request
+
+  // -------------------------------
+  // SysTick signals
+  // -------------------------------
+  cmsdk_mcu_stclkctrl
+   #(.DIV_RATIO (18'd01000))
+   u_cmsdk_mcu_stclkctrl (
+    .FCLK      (FCLK),
+    .SYSRESETn (HRESETn),
+
+    .STCLKEN   (STCLKEN),
+    .STCALIB   (STCALIB)
+    );
+
+
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sys_ahb_decode.v b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sys_ahb_decode.v
new file mode 100644
index 0000000..9bea4ac
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sys_ahb_decode.v
@@ -0,0 +1,100 @@
+//-----------------------------------------------------------------------------
+// customised Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2012-07-31 11:15:58 +0100 (Tue, 31 Jul 2012) $
+//
+//      Revision            : $Revision: 217031 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : This module performs the address decode of the HADDR from the
+//            CPU and generates the HSELs' for each of the target peripherals.
+//            Also performs address decode for MTB
+//-----------------------------------------------------------------------------
+//
+
+module nanosoc_sys_ahb_decode #(
+  // GPIO0 peripheral base address
+  parameter BASEADDR_GPIO0       = 32'h4001_0000,
+  // GPIO1 peripheral base address
+  parameter BASEADDR_GPIO1       = 32'h4001_1000,
+  // GPIO1 peripheral base address
+  parameter BASEADDR_SYSCTRL     = 32'h4001_f000,
+
+  // Location of the System ROM Table.
+  parameter BASEADDR_SYSROMTABLE = 32'hf000_0000
+ )
+ (
+    // System Address
+    input wire              hsel,
+    input wire [31:0]       haddr,
+
+    // Peripheral Selection
+    output wire             apbsys_hsel,
+    output wire             gpio0_hsel,
+    output wire             gpio1_hsel,
+    output wire             sysctrl_hsel,
+    output wire             sysrom_hsel,
+
+    // Default slave
+    output wire             defslv_hsel
+    );
+
+
+
+  // AHB address decode
+  // 0x40000000 - 0x4000FFFF : APB subsystem
+  // 0x40010000 - 0x40010FFF : AHB peripherals (GPIO0)
+  // 0x40011000 - 0x40011FFF : AHB peripherals (GPIO1)
+  // 0x4001F000 - 0x4001FFFF : AHB peripherals (SYS control)
+  // 0xF0000000 - 0xF0000FFF : System ROM Table
+
+  // ----------------------------------------------------------
+  // Peripheral Selection decode logic
+  // ----------------------------------------------------------
+
+  assign apbsys_hsel  = hsel & (haddr[31:16]==16'h4000); // 0x40000000
+  assign gpio0_hsel   = hsel & (haddr[31:12]==
+                         BASEADDR_GPIO0[31:12]);       // 0x40010000
+  assign gpio1_hsel   = hsel & (haddr[31:12]==
+                         BASEADDR_GPIO1[31:12]);       // 0x40011000
+  assign sysctrl_hsel = hsel & (haddr[31:12]==
+                         BASEADDR_SYSCTRL[31:12]);     // 0x4001F000
+  assign sysrom_hsel  = hsel & (haddr[31:12]==
+                         BASEADDR_SYSROMTABLE[31:12]); // 0xF0000000
+
+  // ----------------------------------------------------------
+  // Default slave decode logic
+  // ----------------------------------------------------------
+
+  assign defslv_hsel  = ~(apbsys_hsel |
+                          gpio0_hsel   | gpio1_hsel  |
+                          sysctrl_hsel | sysrom_hsel
+                         );
+
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sysio.v b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sysio.v
new file mode 100644
index 0000000..456a2b6
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/nanosoc_sysio.v
@@ -0,0 +1,493 @@
+//-----------------------------------------------------------------------------
+// customised Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : System level design for the example Cortex-M0 system
+//-----------------------------------------------------------------------------
+
+module nanosoc_sysio
+(
+  input  wire         FCLK,             // Free-running system clock
+  input  wire         PORESETn,         // Power-On-Reset reset (active-low)
+  input  wire         TESTMODE,         // Reset bypass in scan test
+// AHB interface
+  input  wire         HCLK,             // AHB clock
+  input  wire         HRESETn,          // AHB reset (active-low)
+  input  wire         HSEL,             // AHB region select
+  input  wire  [31:0] HADDR,            // AHB address
+  input  wire  [ 2:0] HBURST,           // AHB burst
+  input  wire         HMASTLOCK,        // AHB lock
+  input  wire  [ 3:0] HPROT,            // AHB prot
+  input  wire  [ 2:0] HSIZE,            // AHB size
+  input  wire  [ 1:0] HTRANS,           // AHB transfer
+  input  wire  [31:0] HWDATA,           // AHB write data
+  input  wire         HWRITE,           // AHB write
+  input  wire         HREADY,           // AHB ready
+  output  wire [31:0] HRDATA,           // AHB read-data
+  output  wire        HRESP,            // AHB response
+  output  wire        HREADYOUT,        // AHB ready out
+  // APB clocking control
+  input  wire         PCLK,             // Peripheral clock
+  input  wire         PCLKG,            // Gated Peripheral bus clock
+  input  wire         PRESETn,          // Peripheral system and APB reset
+  input  wire         PCLKEN,           // Clock divide control for AHB to APB bridge
+  // APB external Slave Interface
+  output wire         exp12_psel,
+  output wire         exp13_psel,
+  output wire         exp14_psel,
+  output wire         exp15_psel,
+  output wire         exp_penable,
+  output wire         exp_pwrite,
+  output wire  [11:0] exp_paddr,
+  output wire  [31:0] exp_pwdata,
+  input  wire  [31:0] exp12_prdata,
+  input  wire         exp12_pready,
+  input  wire         exp12_pslverr,
+  input  wire  [31:0] exp13_prdata,
+  input  wire         exp13_pready,
+  input  wire         exp13_pslverr,
+  input  wire  [31:0] exp14_prdata,
+  input  wire         exp14_pready,
+  input  wire         exp14_pslverr,
+  input  wire  [31:0] exp15_prdata,
+  input  wire         exp15_pready,
+  input  wire         exp15_pslverr,
+
+  // CPU sideband signalling
+  output wire         SYS_NMI,          // watchdog_interrupt;
+  output wire [31:0]  SYS_APB_IRQ,      // apbsubsys_interrupt;
+  output wire [15:0]  SYS_GPIO0_IRQ,    // GPIO 0 irqs
+  output wire [15:0]  SYS_GPIO1_IRQ,    // GPIO 0 irqs
+  
+  // CPU power/reset control
+  output wire         REMAP_CTRL,       // REMAP control bit
+  output wire         APBACTIVE,        // APB bus active (for clock gating of PCLKG)
+  output wire         SYSRESETREQ,      // Processor control - system reset request
+  output wire         WDOGRESETREQ,     // Watchdog reset request
+  input  wire         LOCKUP,           // Processor status - Locked up
+  output wire         LOCKUPRESET,      // System Controller cfg - reset if lockup
+  output wire         PMUENABLE,        // System Controller cfg - Enable PMU
+
+  // IO signalling
+  input  wire         uart0_rxd,        // Uart 0 receive data
+  output wire         uart0_txd,        // Uart 0 transmit data
+  output wire         uart0_txen,       // Uart 0 transmit data enable
+  input  wire         uart1_rxd,        // Uart 1 receive data
+  output wire         uart1_txd,        // Uart 1 transmit data
+  output wire         uart1_txen,       // Uart 1 transmit data enable
+  input  wire         uart2_rxd,        // Uart 2 receive data
+  output wire         uart2_txd,        // Uart 2 transmit data
+  output wire         uart2_txen,       // Uart 2 transmit data enable
+  input  wire         timer0_extin,     // Timer 0 external input
+  input  wire         timer1_extin,     // Timer 1 external input
+
+  // GPIO
+  input  wire  [15:0] p0_in,            // GPIO 0 inputs
+  output wire  [15:0] p0_out,           // GPIO 0 outputs
+  output wire  [15:0] p0_outen,         // GPIO 0 output enables
+  output wire  [15:0] p0_altfunc,       // GPIO 0 alternate function (pin mux)
+  input  wire  [15:0] p1_in,            // GPIO 1 inputs
+  output wire  [15:0] p1_out,           // GPIO 1 outputs
+  output wire  [15:0] p1_outen,         // GPIO 1 output enables
+  output wire  [15:0] p1_altfunc       // GPIO 1 alternate function (pin mux)
+);
+
+
+  localparam BASEADDR_GPIO0  = 32'h4001_0000; // GPIO0 peripheral base address
+  localparam BASEADDR_GPIO1  = 32'h4001_1000; // GPIO1 peripheral base address
+  localparam BASEADDR_SYSROMTABLE = 32'hf000_0000;
+  localparam BE              = 0;
+  
+   // ------------------------------------------------------------
+   // Local wires
+   // ------------------------------------------------------------
+
+  wire              defslv_hsel;   // AHB default slave signals
+  wire              defslv_hreadyout;
+  wire     [31:0]   defslv_hrdata;
+  wire              defslv_hresp;
+
+  wire              apbsys_hsel;  // APB subsystem AHB interface signals
+  wire              apbsys_hreadyout;
+  wire     [31:0]   apbsys_hrdata;
+  wire              apbsys_hresp;
+
+  wire              gpio0_hsel;   // AHB GPIO bus interface signals
+  wire              gpio0_hreadyout;
+  wire     [31:0]   gpio0_hrdata;
+  wire              gpio0_hresp;
+
+  wire              gpio1_hsel;   // AHB GPIO bus interface signals
+  wire              gpio1_hreadyout;
+  wire     [31:0]   gpio1_hrdata;
+  wire              gpio1_hresp;
+
+  wire              sysctrl_hsel;  // System control bus interface signals
+  wire              sysctrl_hreadyout;
+  wire     [31:0]   sysctrl_hrdata;
+  wire              sysctrl_hresp;
+
+  // System ROM Table
+  wire              sysrom_hsel;      // AHB to System ROM Table - select
+  wire              sysrom_hreadyout; 
+  wire     [31:0]   sysrom_hrdata;
+  wire              sysrom_hresp;
+
+
+  // AHB address decode
+  nanosoc_sys_ahb_decode #(
+     .BASEADDR_GPIO0       (BASEADDR_GPIO0),
+     .BASEADDR_GPIO1       (BASEADDR_GPIO1),
+     .BASEADDR_SYSROMTABLE (BASEADDR_SYSROMTABLE)
+    )
+    u_addr_decode (
+    // System Address
+    .hsel         (HSEL),
+    .haddr        (HADDR),
+    .apbsys_hsel  (apbsys_hsel),
+    .gpio0_hsel   (gpio0_hsel),
+    .gpio1_hsel   (gpio1_hsel),
+    .sysctrl_hsel (sysctrl_hsel),
+    .sysrom_hsel  (sysrom_hsel),
+    .defslv_hsel  (defslv_hsel)
+  );
+
+  // AHB slave multiplexer
+  cmsdk_ahb_slave_mux #(
+    .PORT0_ENABLE  (1), // APB subsystem bridge
+    .PORT1_ENABLE  (1), // GPIO Port 0
+    .PORT2_ENABLE  (1), // GPIO Port 1
+    .PORT3_ENABLE  (1), // SYS control
+    .PORT4_ENABLE  (1), // SYS ROM table
+    .PORT5_ENABLE  (1), // default
+    .PORT6_ENABLE  (0),
+    .PORT7_ENABLE  (0),
+    .PORT8_ENABLE  (0),
+    .PORT9_ENABLE  (0),
+    .DW            (32)
+    )
+    u_ahb_slave_mux_sys_bus (
+    .HCLK         (HCLK),
+    .HRESETn      (HRESETn),
+    .HREADY       (HREADY),
+    .HSEL0        (apbsys_hsel),     // Input Port 0
+    .HREADYOUT0   (apbsys_hreadyout),
+    .HRESP0       (apbsys_hresp),
+    .HRDATA0      (apbsys_hrdata),
+    .HSEL1        (gpio0_hsel),      // Input Port 1
+    .HREADYOUT1   (gpio0_hreadyout),
+    .HRESP1       (gpio0_hresp),
+    .HRDATA1      (gpio0_hrdata),
+    .HSEL2        (gpio1_hsel),      // Input Port 2
+    .HREADYOUT2   (gpio1_hreadyout),
+    .HRESP2       (gpio1_hresp),
+    .HRDATA2      (gpio1_hrdata),
+    .HSEL3        (sysctrl_hsel),    // Input Port 3
+    .HREADYOUT3   (sysctrl_hreadyout),
+    .HRESP3       (sysctrl_hresp),
+    .HRDATA3      (sysctrl_hrdata),
+    .HSEL4        (sysrom_hsel),     // Input Port 4
+    .HREADYOUT4   (sysrom_hreadyout),
+    .HRESP4       (sysrom_hresp),
+    .HRDATA4      (sysrom_hrdata),
+    .HSEL5        (defslv_hsel),     // Input Port 5
+    .HREADYOUT5   (defslv_hreadyout),
+    .HRESP5       (defslv_hresp),
+    .HRDATA5      (defslv_hrdata),
+    .HSEL6        (1'b0),     // Input Port 6
+    .HREADYOUT6   (defslv_hreadyout),
+    .HRESP6       (defslv_hresp),
+    .HRDATA6      (defslv_hrdata),
+    .HSEL7        (1'b0),     // Input Port 7
+    .HREADYOUT7   (defslv_hreadyout),
+    .HRESP7       (defslv_hresp),
+    .HRDATA7      (defslv_hrdata),
+    .HSEL8        (1'b0),     // Input Port 8
+    .HREADYOUT8   (defslv_hreadyout),
+    .HRESP8       (defslv_hresp),
+    .HRDATA8      (defslv_hrdata),
+    .HSEL9        (1'b0),     // Input Port 9
+    .HREADYOUT9   (defslv_hreadyout),
+    .HRESP9       (defslv_hresp),
+    .HRDATA9      (defslv_hrdata),
+
+    .HREADYOUT    (HREADYOUT),   // Outputs
+    .HRESP        (HRESP),
+    .HRDATA       (HRDATA)
+  );
+
+  // Default slave
+  cmsdk_ahb_default_slave u_ahb_default_slave_1 (
+    .HCLK         (HCLK),
+    .HRESETn      (HRESETn),
+    .HSEL         (defslv_hsel),
+    .HTRANS       (HTRANS),
+    .HREADY       (HREADY),
+    .HREADYOUT    (defslv_hreadyout),
+    .HRESP        (defslv_hresp)
+  );
+
+  assign   defslv_hrdata = 32'h00000000; // Default slave do not have read data
+
+  // -------------------------------
+  // System ROM Table
+  // -------------------------------
+  cmsdk_ahb_cs_rom_table
+   #(//.JEPID                             (),
+     //.JEPCONTINUATION                   (),
+     //.PARTNUMBER                        (),
+     //.REVISION                          (),
+     .BASE              (BASEADDR_SYSROMTABLE),
+     // Entry 0 = Cortex-M0+ Processor
+     .ENTRY0BASEADDR    (32'hE00FF000),
+     .ENTRY0PRESENT     (1'b1),
+     // Entry 1 = CoreSight MTB-M0+
+     .ENTRY1BASEADDR    (32'hF0200000),
+     .ENTRY1PRESENT     (0))
+    u_system_rom_table
+    (//Outputs
+     .HRDATA                            (sysrom_hrdata[31:0]),
+     .HREADYOUT                         (sysrom_hreadyout),
+     .HRESP                             (sysrom_hresp),
+     //Inputs
+     .HCLK                              (HCLK),
+     .HSEL                              (sysrom_hsel),
+     .HADDR                             (HADDR[31:0]),
+     .HBURST                            (HBURST[2:0]),
+     .HMASTLOCK                         (HMASTLOCK),
+     .HPROT                             (HPROT[3:0]),
+     .HSIZE                             (HSIZE[2:0]),
+     .HTRANS                            (HTRANS[1:0]),
+     .HWDATA                            (HWDATA[31:0]),
+     .HWRITE                            (HWRITE),
+     .HREADY                            (HREADY),
+     .ECOREVNUM                         (4'h0));
+
+  // -------------------------------
+  // Peripherals
+  // -------------------------------
+
+  cmsdk_mcu_sysctrl #(.BE (BE))
+    u_cmsdk_mcu_sysctrl
+  (
+   // AHB Inputs
+    .HCLK         (HCLK),
+    .HRESETn      (HRESETn),
+    .FCLK         (FCLK),
+    .PORESETn     (PORESETn),
+    .HSEL         (sysctrl_hsel),
+    .HREADY       (HREADY),
+    .HTRANS       (HTRANS),
+    .HSIZE        (HSIZE),
+    .HWRITE       (HWRITE),
+    .HADDR        (HADDR[11:0]),
+    .HWDATA       (HWDATA),
+   // AHB Outputs
+    .HREADYOUT    (sysctrl_hreadyout),
+    .HRESP        (sysctrl_hresp),
+    .HRDATA       (sysctrl_hrdata),
+   // Reset information
+    .SYSRESETREQ  (SYSRESETREQ),
+    .WDOGRESETREQ (WDOGRESETREQ),
+    .LOCKUP       (LOCKUP),
+    // Engineering-change-order revision bits
+    .ECOREVNUM    (4'h0),
+   // System control signals
+    .REMAP        (REMAP_CTRL),
+    .PMUENABLE    (PMUENABLE),
+    .LOCKUPRESET  (LOCKUPRESET)
+   );
+
+  // GPIO is driven from the AHB
+  cmsdk_ahb_gpio #(
+    .ALTERNATE_FUNC_MASK     (16'h0000), // No pin muxing for Port #0
+    .ALTERNATE_FUNC_DEFAULT  (16'h0000), // All pins default to GPIO
+    .BE                      (BE)
+    )
+    u_ahb_gpio_0  (
+   // AHB Inputs
+    .HCLK         (HCLK),
+    .HRESETn      (HRESETn),
+    .FCLK         (FCLK),
+    .HSEL         (gpio0_hsel),
+    .HREADY       (HREADY),
+    .HTRANS       (HTRANS),
+    .HSIZE        (HSIZE),
+    .HWRITE       (HWRITE),
+    .HADDR        (HADDR[11:0]),
+    .HWDATA       (HWDATA),
+   // AHB Outputs
+    .HREADYOUT    (gpio0_hreadyout),
+    .HRESP        (gpio0_hresp),
+    .HRDATA       (gpio0_hrdata),
+
+    .ECOREVNUM    (4'h0),// Engineering-change-order revision bits
+
+    .PORTIN       (p0_in),   // GPIO Interface inputs
+    .PORTOUT      (p0_out),  // GPIO Interface outputs
+    .PORTEN       (p0_outen),
+    .PORTFUNC     (p0_altfunc), // Alternate function control
+
+    .GPIOINT      (SYS_GPIO0_IRQ[15:0]),  // Interrupt outputs
+    .COMBINT      ( )
+  );
+
+
+  cmsdk_ahb_gpio #(
+    .ALTERNATE_FUNC_MASK     (16'h002A), // pin muxing for Port #1
+    .ALTERNATE_FUNC_DEFAULT  (16'h0000), // All pins default to GPIO
+    .BE                      (BE)
+    )
+    u_ahb_gpio_1  (
+   // AHB Inputs
+    .HCLK         (HCLK),
+    .HRESETn      (HRESETn),
+    .FCLK         (FCLK),
+    .HSEL         (gpio1_hsel),
+    .HREADY       (HREADY),
+    .HTRANS       (HTRANS),
+    .HSIZE        (HSIZE),
+    .HWRITE       (HWRITE),
+    .HADDR        (HADDR[11:0]),
+    .HWDATA       (HWDATA),
+   // AHB Outputs
+    .HREADYOUT    (gpio1_hreadyout),
+    .HRESP        (gpio1_hresp),
+    .HRDATA       (gpio1_hrdata),
+
+    .ECOREVNUM    (4'h0),// Engineering-change-order revision bits
+
+    .PORTIN       (p1_in),   // GPIO Interface inputs
+    .PORTOUT      (p1_out),  // GPIO Interface outputs
+    .PORTEN       (p1_outen),
+    .PORTFUNC     (p1_altfunc), // Alternate function control
+
+    .GPIOINT      (SYS_GPIO1_IRQ[15:0]),  // Interrupt outputs
+    .COMBINT      ( )
+  );
+
+  // APB subsystem for timers, UARTs
+  cmsdk_apb_subsystem #(
+    .APB_EXT_PORT12_ENABLE   (1),
+    .APB_EXT_PORT13_ENABLE   (1),
+    .APB_EXT_PORT14_ENABLE   (1),
+    .APB_EXT_PORT15_ENABLE   (1),
+    .INCLUDE_IRQ_SYNCHRONIZER(0),
+    .INCLUDE_APB_TEST_SLAVE  (1),
+    .INCLUDE_APB_TIMER0      (1),  // Include simple timer #0
+    .INCLUDE_APB_TIMER1      (1),  // Include simple timer #1
+    .INCLUDE_APB_DUALTIMER0  (1),  // Include dual timer module
+    .INCLUDE_APB_UART0       (1),  // Include simple UART #0
+    .INCLUDE_APB_UART1       (1),  // Include simple UART #1
+    .INCLUDE_APB_UART2       (1),  // Include simple UART #2.
+    .INCLUDE_APB_WATCHDOG    (1),  // Include APB watchdog module
+    .BE                      (BE)
+     )
+  u_apb_subsystem(
+
+  // AHB interface for AHB to APB bridge
+    .HCLK          (HCLK),
+    .HRESETn       (HRESETn),
+
+    .HSEL          (apbsys_hsel),
+    .HADDR         (HADDR[15:0]),
+    .HTRANS        (HTRANS[1:0]),
+    .HWRITE        (HWRITE),
+    .HSIZE         (HSIZE),
+    .HPROT         (HPROT),
+    .HREADY        (HREADY),
+    .HWDATA        (HWDATA[31:0]),
+
+    .HREADYOUT     (apbsys_hreadyout),
+    .HRDATA        (apbsys_hrdata),
+    .HRESP         (apbsys_hresp),
+
+  // APB clock and reset
+    .PCLK          (PCLK),
+    .PCLKG         (PCLKG),
+    .PCLKEN        (PCLKEN),
+    .PRESETn       (PRESETn),
+
+  // APB extension ports
+    .PADDR         (exp_paddr[11:0]),
+    .PWRITE        (exp_pwrite),
+    .PWDATA        (exp_pwdata[31:0]),
+    .PENABLE       (exp_penable),
+
+    .ext12_psel    (exp12_psel),
+    .ext13_psel    (exp13_psel),
+    .ext14_psel    (exp14_psel),
+    .ext15_psel    (exp15_psel),
+
+  // Input from APB devices on APB expansion ports
+    .ext12_prdata  (exp12_prdata),
+    .ext12_pready  (exp12_pready),
+    .ext12_pslverr (exp12_pslverr),
+    .ext13_prdata  (exp13_prdata),
+    .ext13_pready  (exp13_pready),
+    .ext13_pslverr (exp13_pslverr),
+    .ext14_prdata  (exp14_prdata),
+    .ext14_pready  (exp14_pready),
+    .ext14_pslverr (exp14_pslverr),
+    .ext15_prdata  (exp15_prdata),
+    .ext15_pready  (exp15_pready),
+    .ext15_pslverr (exp15_pslverr),
+
+    .APBACTIVE     (APBACTIVE),  // Status Output for clock gating
+
+  // Peripherals
+    // UART
+    .uart0_rxd     (uart0_rxd),
+    .uart0_txd     (uart0_txd),
+    .uart0_txen    (uart0_txen),
+
+    .uart1_rxd     (uart1_rxd),
+    .uart1_txd     (uart1_txd),
+    .uart1_txen    (uart1_txen),
+
+    .uart2_rxd     (uart2_rxd),
+    .uart2_txd     (uart2_txd),
+    .uart2_txen    (uart2_txen),
+
+    // Timer
+    .timer0_extin  (timer0_extin),
+    .timer1_extin  (timer1_extin),
+
+  // Interrupt outputs
+    .apbsubsys_interrupt (SYS_APB_IRQ),
+    .watchdog_interrupt  (SYS_NMI),
+   // reset output
+    .watchdog_reset      (WDOGRESETREQ)
+  );
+
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/pl230_defs.v b/Cortex-M0/nanosoc/systems/mcu/verilog/pl230_defs.v
new file mode 100644
index 0000000..c061b99
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/pl230_defs.v
@@ -0,0 +1,189 @@
+//-----------------------------------------------------------------------------
+// customised example Cortex-M0 controller DMA230 configuration
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from ARM Limited.
+//
+// (C) COPYRIGHT 2006-2007 ARM Limited.
+// ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from ARM Limited.
+//
+// File Name  : pl230_defs.v
+// Checked In : $Date: 2007-06-06 21:55:22 +0530 (Wed, 06 Jun 2007) $
+// Revision   : $Revision: 13823 $
+// State      : $state: PL230-DE-98007-r0p0-02rel0 $
+//
+//-----------------------------------------------------------------------------
+// Purpose : Peripheral specific macro definitions
+//
+//-----------------------------------------------------------------------------
+
+
+`ifdef ARM_TIMESCALE_DEFINED
+  `timescale 1ns/1ps
+`endif
+
+// Set the number of channels implemented
+`define PL230_CHNLS                     1
+`define PL230_CHNL_BITS                 1
+//`define PL230_ONE_CHNL
+
+// Include Integration Test Logic
+`define PL230_INCLUDE_TEST
+
+
+// AHB Interface
+`define PL230_AHB_TRANS_IDLE            2'b00
+`define PL230_AHB_TRANS_NONSEQ          2'b10
+`define PL230_AHB_READ                  1'b0
+`define PL230_AHB_WRITE                 1'b1
+`define PL230_AHB_SIZE_BYTE             3'b000
+`define PL230_AHB_SIZE_HWORD            3'b001
+`define PL230_AHB_SIZE_WORD             3'b010
+
+// PrimeCell Configuration
+`define PL230_PERIPH_ID_0               8'h30
+`define PL230_PERIPH_ID_1               8'hB2
+`define PL230_PERIPH_ID_2               8'h0B
+`define PL230_PERIPH_ID_3               8'h00
+`define PL230_PERIPH_ID_4               8'h04
+`define PL230_PCELL_ID_0                8'h0D
+`define PL230_PCELL_ID_1                8'hF0
+`define PL230_PCELL_ID_2                8'h05
+`define PL230_PCELL_ID_3                8'hB1
+
+// Memory Mapped Registers
+//  Controller Configuration Registers
+`define PL230_ADDR_DMA_STATUS           12'h000
+`define PL230_ADDR_DMA_CFG              12'h004
+`define PL230_ADDR_CTRL_BASE_PTR        12'h008
+`define PL230_ADDR_ALT_CTRL_BASE_PTR    12'h00C
+`define PL230_ADDR_DMA_WAITONREQ_STATUS 12'h010
+`define PL230_ADDR_CHNL_SW_REQUEST      12'h014
+`define PL230_ADDR_CHNL_USEBURST_SET    12'h018
+`define PL230_ADDR_CHNL_USEBURST_CLR    12'h01C
+`define PL230_ADDR_CHNL_REQ_MASK_SET    12'h020
+`define PL230_ADDR_CHNL_REQ_MASK_CLR    12'h024
+`define PL230_ADDR_CHNL_ENABLE_SET      12'h028
+`define PL230_ADDR_CHNL_ENABLE_CLR      12'h02C
+`define PL230_ADDR_CHNL_PRI_ALT_SET     12'h030
+`define PL230_ADDR_CHNL_PRI_ALT_CLR     12'h034
+`define PL230_ADDR_CHNL_PRIORITY_SET    12'h038
+`define PL230_ADDR_CHNL_PRIORITY_CLR    12'h03C
+//      Reserved                        12'h040
+//      Reserved                        12'h044
+//      Reserved                        12'h048
+`define PL230_ADDR_ERR_CLR              12'h04C
+//  Integration Test Registers
+`define PL230_ADDR_INTEGRATION_CFG      12'hE00
+//      Reserved                        12'hE04
+`define PL230_ADDR_STALL_STATUS         12'hE08
+//      Reserved                        12'hE0C
+`define PL230_ADDR_DMA_REQ_STATUS       12'hE10
+//      Reserved                        12'hE14
+`define PL230_ADDR_DMA_SREQ_STATUS      12'hE18
+//      Reserved                        12'hE1C
+`define PL230_ADDR_DMA_DONE_SET         12'hE20
+`define PL230_ADDR_DMA_DONE_CLR         12'hE24
+`define PL230_ADDR_DMA_ACTIVE_SET       12'hE28
+`define PL230_ADDR_DMA_ACTIVE_CLR       12'hE2C
+//      Reserved                        12'hE30
+//      Reserved                        12'hE34
+//      Reserved                        12'hE38
+//      Reserved                        12'hE3C
+//      Reserved                        12'hE40
+//      Reserved                        12'hE44
+`define PL230_ADDR_ERR_SET              12'hE48
+//      Reserved                        12'hE4C
+//  PrimeCell Configuration Registers
+`define PL230_ADDR_PERIPH_ID_4          12'hFD0
+//      Reserved                        12'hFD4
+//      Reserved                        12'hFD8
+//      Reserved                        12'hFDC
+`define PL230_ADDR_PERIPH_ID_0          12'hFE0
+`define PL230_ADDR_PERIPH_ID_1          12'hFE4
+`define PL230_ADDR_PERIPH_ID_2          12'hFE8
+`define PL230_ADDR_PERIPH_ID_3          12'hFEC
+`define PL230_ADDR_PCELL_ID_0           12'hFF0
+`define PL230_ADDR_PCELL_ID_1           12'hFF4
+`define PL230_ADDR_PCELL_ID_2           12'hFF8
+`define PL230_ADDR_PCELL_ID_3           12'hFFC
+
+
+// Bit vector definitions for channel_cfg
+`define PL230_CHANNEL_CFG_BITS          20
+//  Destination address increment
+`define PL230_CHANNEL_CFG_DST_INC       channel_cfg[19:18]
+`define PL230_HRDATA_DST_INC            hrdata[31:30]
+//  Destination transfer size
+//   Source and destination sizes must match
+//   so the same bits as the src_size are used
+`define PL230_CHANNEL_CFG_DST_SIZE      channel_cfg[15:14]
+`define PL230_HRDATA_DST_SIZE           hrdata[29:28]
+//  Source address increment
+`define PL230_CHANNEL_CFG_SRC_INC       channel_cfg[17:16]
+`define PL230_HRDATA_SRC_INC            hrdata[27:26]
+//  Source transfer size
+`define PL230_CHANNEL_CFG_SRC_SIZE      channel_cfg[15:14]
+`define PL230_HRDATA_SRC_SIZE           hrdata[25:24]
+//  Destination AHB protection control
+`define PL230_CHANNEL_CFG_DST_PROT_CTRL channel_cfg[13:11]
+`define PL230_HRDATA_DST_PROT_CTRL      hrdata[23:21]
+//  Source AHB protection control
+`define PL230_CHANNEL_CFG_SRC_PROT_CTRL channel_cfg[10:8]
+`define PL230_HRDATA_SRC_PROT_CTRL      hrdata[20:18]
+//  Power of two transactions per request
+`define PL230_CHANNEL_CFG_R             channel_cfg[7:4]
+`define PL230_HRDATA_R                  hrdata[17:14]
+//  Number of bits in the N counter     - hrdata[13:4]
+`define PL230_N_COUNT_BITS              10
+//  Lsb bit offset for n_minus_1
+`define PL230_N_COUNT_OFFSET            4
+//  Set chnl_useburst_status
+`define PL230_CHANNEL_CFG_NEXT_USEBURST channel_cfg[3]
+`define PL230_HRDATA_NEXT_USEBURST      hrdata[3]
+//  DMA cycle control
+`define PL230_CHANNEL_CFG_CYCLE_CTRL    channel_cfg[2:0]
+`define PL230_HRDATA_CYCLE_CTRL         hrdata[2:0]
+
+
+// Number of bits for the statemachine
+`define PL230_STATE_BITS 4
+// Statemachine state encoding
+`define PL230_ST_IDLE    4'h0
+`define PL230_ST_RD_CTRL 4'h1
+`define PL230_ST_RD_SPTR 4'h2
+`define PL230_ST_RD_DPTR 4'h3
+`define PL230_ST_RD_SDAT 4'h4
+`define PL230_ST_WR_DDAT 4'h5
+`define PL230_ST_WAIT    4'h6
+`define PL230_ST_WR_CTRL 4'h7
+`define PL230_ST_STALL   4'h8
+`define PL230_ST_DONE    4'h9
+`define PL230_ST_PSGP    4'hA
+`define PL230_ST_RESVD_0 4'hB
+`define PL230_ST_RESVD_1 4'hC
+`define PL230_ST_RESVD_2 4'hD
+`define PL230_ST_RESVD_3 4'hE
+`define PL230_ST_RESVD_4 4'hF
+
+`define PL230_SIZE_BYTE  2'b00
+`define PL230_SIZE_HWORD 2'b01
+`define PL230_SIZE_WORD  2'b10
+`define PL230_SIZE_RESVD 2'b11
+
+// pl230_defs.v end
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/tb_nanosoc.v b/Cortex-M0/nanosoc/systems/mcu/verilog/tb_nanosoc.v
new file mode 100644
index 0000000..19fedd8
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/tb_nanosoc.v
@@ -0,0 +1,571 @@
+//-----------------------------------------------------------------------------
+// customised example Cortex-M0 controller testbench with CPU trace for RTL or netlist
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+//
+//      Revision            : $Revision: 371321 $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Testbench for the Cortex-M0 example system
+//-----------------------------------------------------------------------------
+//
+`timescale 1ns/1ps
+
+module tb_cmsdk_mcu;
+
+  wire        XTAL1;   // crystal pin 1
+  wire        XTAL2;   // crystal pin 2
+  wire        NRST;    // active low reset
+
+  wire [15:0] P0;      // Port 0
+  wire [15:0] P1;      // Port 1
+
+  wire        VDDIO;
+  wire        VSSIO;
+  wire        VDD;
+  wire        VSS;
+  
+  //Debug tester signals
+  wire        nTRST;
+  wire        TDI;
+  wire        SWDIOTMS;
+  wire        SWCLKTCK;
+  wire        TDO;
+
+  wire        PCLK;          // Clock for UART capture device
+  wire [5:0]  debug_command; // used to drive debug tester
+  wire        debug_running; // indicate debug test is running
+  wire        debug_err;     // indicate debug test has error
+
+  wire        debug_test_en1;
+  wire        debug_test_en2;
+  wire        debug_test_en; // To enable the debug tester connection to MCU GPIO P0
+                             // This signal is controlled by software,
+                             // Use "UartPutc((char) 0x1B)" to send ESCAPE code to start
+                             // the command, use "UartPutc((char) 0x11)" to send debug test
+                             // enable command, use "UartPutc((char) 0x12)" to send debug test
+                             // disable command. Refer to tb_uart_capture.v file for detail
+  assign debug_test_en = debug_test_en1 | debug_test_en2; // FT1248 or UART2 control
+
+  //-----------------------------------------
+  // System options
+
+`define MEM_INIT 1;
+localparam BE=0;
+`define ARM_CMSDK_INCLUDE_DEBUG_TESTER 1
+
+SROM_Ax32
+  #(.ADDRWIDTH (8),
+    .filename ("bootloader.hex"),
+    .romgen (1)
+   )
+   u_BOOTROM (
+    .CLK(XTAL1),
+    .ADDR(8'h0),
+    .SEL(1'b0),
+    .RDATA( )
+  );
+  
+ // --------------------------------------------------------------------------------
+ // Cortex-M0/Cortex-M0+ Microcontroller
+ // --------------------------------------------------------------------------------
+
+  nanosoc_chip_pads
+   u_nanosoc_chip_pads (
+`ifdef POWER_PINS
+  .VDDIO      (VDDIO),
+  .VSSIO      (VSSIO),
+  .VDD        (VDD),
+  .VSS        (VSS),
+`endif
+  .XTAL1      (XTAL1),  // input
+  .XTAL2      (XTAL2),  // output
+  .NRST       (NRST),   // active low reset
+  .P0         (P0),
+  .P1         (P1),
+`ifdef ARM_CMSDK_INCLUDE_JTAG
+  .nTRST      (nTRST),  // Not needed if serial-wire debug is used
+  .TDI        (TDI),    // Not needed if serial-wire debug is used
+  .TDO        (TDO),    // Not needed if serial-wire debug is used
+`endif
+  .SWDIOTMS   (SWDIOTMS),
+  .SWCLKTCK   (SWCLKTCK)
+  );
+
+ // --------------------------------------------------------------------------------
+ // Source for clock and reset
+ // --------------------------------------------------------------------------------
+  cmsdk_clkreset u_cmsdk_clkreset(
+  .CLK  (XTAL1),
+  .NRST (NRST)
+  );
+
+  // Pullup to suppress X-inputs
+  pullup(P0[ 0]);
+  pullup(P0[ 1]);
+  pullup(P0[ 2]);
+  pullup(P0[ 3]);
+  pullup(P0[ 4]);
+  pullup(P0[ 5]);
+  pullup(P0[ 6]);
+  pullup(P0[ 7]);
+  pullup(P0[ 8]);
+  pullup(P0[ 9]);
+  pullup(P0[10]);
+  pullup(P0[11]);
+  pullup(P0[12]);
+  pullup(P0[13]);
+  pullup(P0[14]);
+  pullup(P0[15]);
+
+  pullup(P1[ 0]);
+  pullup(P1[ 1]);
+  pullup(P1[ 2]);
+  pullup(P1[ 3]);
+  pullup(P1[ 4]);
+  pullup(P1[ 5]);
+  pullup(P1[ 6]);
+  pullup(P1[ 7]);
+  pullup(P1[ 8]);
+  pullup(P1[ 9]);
+  pullup(P1[10]);
+  pullup(P1[11]);
+  pullup(P1[12]);
+  pullup(P1[13]);
+  pullup(P1[14]);
+  pullup(P1[15]);
+
+ // --------------------------------------------------------------------------------
+ // UART output capture
+ // --------------------------------------------------------------------------------
+`ifdef ARM_CMSDK_SLOWSPEED_PCLK
+  // If PCLK is running at slower speed, the UART output will also be slower
+  assign PCLK = u_cmsdk_mcu.u_cmsdk_mcu.PCLK;
+`else
+  assign PCLK = XTAL1;
+`endif
+
+ // --------------------------------------------------------------------------------
+ // external UART phase lock to (known) baud rate
+
+// seem unable to use the following (due to generate instance naming?)
+//  wire baudx16_clk = u_cmsdk_mcu.u_cmsdk_mcu.u_cmsdk_mcu_system.u_apb_subsystem.u_apb_uart_2.BAUDTICK;
+
+// 2000000/208 = 9615 baud (+0.16%)
+// 208 / 16
+`define BAUDPROG 130
+
+ reg [7:0] bauddiv;
+ wire    baudclken = (bauddiv == 8'b00000000);
+
+  always @(negedge NRST or posedge PCLK)
+    if (!NRST)
+      bauddiv <=0;
+    else
+      bauddiv <= (baudclken) ? (`BAUDPROG-1) : (bauddiv -1) ;   // count down of BAUDPROG
+
+  wire baudx16_clk = bauddiv[7]; //prefer:// !baudclken;
+
+  wire UARTXD =  P1[5];
+  reg  UARTXD_del;
+  always @(negedge NRST or posedge baudx16_clk)
+    if (!NRST)
+      UARTXD_del <= 1'b0;
+    else
+      UARTXD_del <= UARTXD; // delay one BAUD_TICK-time
+
+  wire UARTXD_edge = UARTXD_del ^ UARTXD; // edge detect
+
+  reg [3:0] pllq;
+  always @(negedge NRST or posedge baudx16_clk)
+    if (!NRST)
+      pllq[3:0] <= 4'b0000; // phase lock ready for Q[3] to go high
+    else
+      if (UARTXD_edge)
+        pllq[3:0] <= 4'b0110; // sync to mid bit-time
+      else
+        pllq[3:0] <= pllq[3:0] - 1; // count down divide-by-16
+
+  wire baud_clk = pllq[3];
+
+reg baud_clk_del;
+  always @(negedge NRST or posedge PCLK)
+    if (!NRST)
+      baud_clk_del <= 1'b1;
+    else
+      baud_clk_del <= baud_clk;
+
+ // --------------------------------------------------------------------------------
+ // set FASTMODE true if UART simulation mode is programmed
+  wire FASTMODE = 1'b0;
+  wire uart_clk = (FASTMODE) ? PCLK : baud_clk; //(baud_clk & !baud_clk_del);
+
+
+  cmsdk_uart_capture  #(.LOGFILENAME("uart2.log"))
+    u_cmsdk_uart_capture(
+    .RESETn               (NRST),
+    .CLK                  (uart_clk), //PCLK),
+    .RXD                  (UARTXD), // UART 2 use for StdOut
+    .DEBUG_TESTER_ENABLE  (debug_test_en2),
+    .SIMULATIONEND        (),      // This signal set to 1 at the end of simulation.
+    .AUXCTRL              ()
+  );
+
+ // --------------------------------------------------------------------------------
+ // FTDI IO capture
+ // --------------------------------------------------------------------------------
+
+  // UART connection cross over for UART test
+//  assign P1[0] = P1[3];  // UART 0 RXD = UART 1 TXD
+//  assign P1[2] = P1[1];  // UART 1 RXD = UART 0 TXD
+
+wire ft_clk_out = P1[1];
+wire ft_miso_in;
+assign P1[0] = ft_miso_in;
+wire ft_ssn_out = P1[3];
+
+//   bufif0 (P1[2], ft_miosio_i, ft_miosio_z);
+wire ft_clk2uart;
+wire ft_rxd2uart;
+wire ft_txd2uart;
+
+  cmsdk_ft1248x1_adpio //  #(.ADPFILENAME("ADPFILENAME.log"))
+    u_ft1248_adpio(
+    .ft_clk_i             (ft_clk_out),
+    .ft_ssn_i             (ft_ssn_out),
+    .ft_miso_o            (ft_miso_in),
+    .ft_miosio_io         (P1[2]),
+
+    .FTDI_CLK2UART_o      (ft_clk2uart),
+    .FTDI_OP2UART_o       (ft_rxd2uart),
+    .FTDI_IP2UART_o       (ft_txd2uart)
+  );
+
+  cmsdk_uart_capture  #(.LOGFILENAME("ft1248_op.log"))
+    u_cmsdk_uart_capture1(
+    .RESETn               (NRST),
+    .CLK                  (ft_clk2uart),
+    .RXD                  (ft_rxd2uart),
+    .DEBUG_TESTER_ENABLE  (debug_test_en1),
+    .SIMULATIONEND        (),      // This signal set to 1 at the end of simulation.
+    .AUXCTRL              ()
+  );
+
+  cmsdk_uart_capture  #(.LOGFILENAME("ft1248_ip.log"))
+    u_cmsdk_uart_capture2(
+    .RESETn               (NRST),
+    .CLK                  (ft_clk2uart),
+    .RXD                  (ft_txd2uart),
+    .DEBUG_TESTER_ENABLE  ( ),
+    .SIMULATIONEND        (),      // This signal set to 1 at the end of simulation.
+    .AUXCTRL              ()
+  );
+
+
+ 
+ // --------------------------------------------------------------------------------
+ // Tracking CPU with Tarmac trace support
+ // --------------------------------------------------------------------------------
+
+
+`ifdef CORTEX_M0
+`ifdef USE_TARMAC
+
+`define ARM_CM0IK_PATH u_nanosoc_chip_pads.u_nanosoc_chip.u_nanosoc_cpu.u_cortex_m0_integration.u_cortexm0
+
+  CORTEXM0
+     #(.ACG(1), .AHBSLV(0), .BE(0), .BKPT(4),
+       .DBG(1), .NUMIRQ(32), .RAR(1), .SMUL(0),
+       .SYST(1), .WIC(1), .WICLINES(34), .WPT(2))
+       u_cortexm0_track
+         (
+          // Outputs
+          .HADDR                          ( ),
+          .HBURST                         ( ),
+          .HMASTLOCK                      ( ),
+          .HPROT                          ( ),
+          .HSIZE                          ( ),
+          .HTRANS                         ( ),
+          .HWDATA                         ( ),
+          .HWRITE                         ( ),
+          .HMASTER                        ( ),
+          .SLVRDATA                       ( ),
+          .SLVREADY                       ( ),
+          .SLVRESP                        ( ),
+          .DBGRESTARTED                   ( ),
+          .HALTED                         ( ),
+          .TXEV                           ( ),
+          .LOCKUP                         ( ),
+          .SYSRESETREQ                    ( ),
+          .CODENSEQ                       ( ),
+          .CODEHINTDE                     ( ),
+          .SPECHTRANS                     ( ),
+          .SLEEPING                       ( ),
+          .SLEEPDEEP                      ( ),
+          .SLEEPHOLDACKn                  ( ),
+          .WICDSACKn                      ( ),
+          .WICMASKISR                     ( ),
+          .WICMASKNMI                     ( ),
+          .WICMASKRXEV                    ( ),
+          .WICLOAD                        ( ),
+          .WICCLEAR                       ( ),
+          // Inputs
+          .SCLK                           (`ARM_CM0IK_PATH.SCLK),
+          .HCLK                           (`ARM_CM0IK_PATH.HCLK),
+          .DCLK                           (`ARM_CM0IK_PATH.DCLK),
+          .DBGRESETn                      (`ARM_CM0IK_PATH.DBGRESETn),
+          .HRESETn                        (`ARM_CM0IK_PATH.HRESETn),
+          .HRDATA                         (`ARM_CM0IK_PATH.HRDATA[31:0]),
+          .HREADY                         (`ARM_CM0IK_PATH.HREADY),
+          .HRESP                          (`ARM_CM0IK_PATH.HRESP),
+          .SLVADDR                        (`ARM_CM0IK_PATH.SLVADDR[31:0]),
+          .SLVSIZE                        (`ARM_CM0IK_PATH.SLVSIZE[1:0]),
+          .SLVTRANS                       (`ARM_CM0IK_PATH.SLVTRANS[1:0]),
+          .SLVWDATA                       (`ARM_CM0IK_PATH.SLVWDATA[31:0]),
+          .SLVWRITE                       (`ARM_CM0IK_PATH.SLVWRITE),
+          .DBGRESTART                     (`ARM_CM0IK_PATH.DBGRESTART),
+          .EDBGRQ                         (`ARM_CM0IK_PATH.EDBGRQ),
+          .NMI                            (`ARM_CM0IK_PATH.NMI),
+          .IRQ                            (`ARM_CM0IK_PATH.IRQ[31:0]),
+          .RXEV                           (`ARM_CM0IK_PATH.RXEV),
+          .STCALIB                        (`ARM_CM0IK_PATH.STCALIB[25:0]),
+          .STCLKEN                        (`ARM_CM0IK_PATH.STCLKEN),
+          .IRQLATENCY                     (`ARM_CM0IK_PATH.IRQLATENCY[7:0]),
+          .ECOREVNUM                      (`ARM_CM0IK_PATH.ECOREVNUM[19:0]),
+          .SLEEPHOLDREQn                  (`ARM_CM0IK_PATH.SLEEPHOLDREQn),
+          .WICDSREQn                      (`ARM_CM0IK_PATH.WICDSREQn),
+          .SE                             (`ARM_CM0IK_PATH.SE));
+
+`define ARM_CM0IK_TRACK u_cortexm0_track
+  cm0_tarmac #(.LOGFILENAME("tarmac0.log"))
+    u_tarmac_track
+      (.enable_i      (1'b1),
+
+       .hclk_i        (`ARM_CM0IK_TRACK.HCLK),
+       .hready_i      (`ARM_CM0IK_TRACK.HREADY),
+       .haddr_i       (`ARM_CM0IK_TRACK.HADDR[31:0]),
+       .hprot_i       (`ARM_CM0IK_TRACK.HPROT[3:0]),
+       .hsize_i       (`ARM_CM0IK_TRACK.HSIZE[2:0]),
+       .hwrite_i      (`ARM_CM0IK_TRACK.HWRITE),
+       .htrans_i      (`ARM_CM0IK_TRACK.HTRANS[1:0]),
+       .hresetn_i     (`ARM_CM0IK_TRACK.HRESETn),
+       .hresp_i       (`ARM_CM0IK_TRACK.HRESP),
+       .hrdata_i      (`ARM_CM0IK_TRACK.HRDATA[31:0]),
+       .hwdata_i      (`ARM_CM0IK_TRACK.HWDATA[31:0]),
+       .lockup_i      (`ARM_CM0IK_TRACK.LOCKUP),
+       .halted_i      (`ARM_CM0IK_TRACK.HALTED),
+       .codehintde_i  (`ARM_CM0IK_TRACK.CODEHINTDE[2:0]),
+       .codenseq_i    (`ARM_CM0IK_TRACK.CODENSEQ),
+
+       .hdf_req_i     (`ARM_CM0IK_TRACK.u_top.u_sys.ctl_hdf_request),
+       .int_taken_i   (`ARM_CM0IK_TRACK.u_top.u_sys.dec_int_taken_o),
+       .int_return_i  (`ARM_CM0IK_TRACK.u_top.u_sys.dec_int_return_o),
+       .int_pend_i    (`ARM_CM0IK_TRACK.u_top.u_sys.nvm_int_pend),
+       .pend_num_i    (`ARM_CM0IK_TRACK.u_top.u_sys.nvm_int_pend_num[5:0]),
+       .ipsr_i        (`ARM_CM0IK_TRACK.u_top.u_sys.psr_ipsr[5:0]),
+
+       .ex_last_i     (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.ctl_ex_last),
+       .iaex_en_i     (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.ctl_iaex_en),
+       .reg_waddr_i   (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.ctl_wr_addr[3:0]),
+       .reg_write_i   (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.ctl_wr_en),
+       .xpsr_en_i     (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.ctl_xpsr_en),
+       .fe_addr_i     (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.pfu_fe_addr[30:0]),
+       .int_delay_i   (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.pfu_int_delay),
+       .special_i     (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.pfu_op_special),
+       .opcode_i      (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.pfu_opcode[15:0]),
+       .reg_wdata_i   (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.psr_gpr_wdata[31:0]),
+
+       .atomic_i      (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_ctl.atomic),
+       .atomic_nxt_i  (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_ctl.atomic_nxt),
+       .dabort_i      (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_ctl.data_abort),
+       .ex_last_nxt_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_ctl.ex_last_nxt),
+       .int_preempt_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_ctl.int_preempt),
+
+       .psp_sel_i     (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_gpr.psp_sel),
+       .xpsr_i        (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_gpr.xpsr[31:0]),
+
+       .iaex_i        (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_pfu.iaex[30:0]),
+       .iaex_nxt_i    (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_pfu.iaex_nxt[30:0]),
+       .opcode_nxt_i  (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_pfu.ibuf_de_nxt[15:0]),
+       .delay_count_i (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_pfu.ibuf_lo[13:6]),
+       .tbit_en_i     (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_pfu.tbit_en),
+
+       .cflag_en_i    (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_psr.cflag_ena),
+       .ipsr_en_i     (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_psr.ipsr_ena),
+       .nzflag_en_i   (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_psr.nzflag_ena),
+       .vflag_en_i    (`ARM_CM0IK_TRACK.u_top.u_sys.u_core.u_psr.vflag_ena)
+  );
+
+`endif // USE_TARMAC
+`endif // CORTEX_M0
+
+ // --------------------------------------------------------------------------------
+ // Debug tester connection -
+ // --------------------------------------------------------------------------------
+
+  `ifdef CORTEX_M0DESIGNSTART
+   // No debug connection for Cortex-M0 DesignStart
+   assign nTRST    = NRST;
+   assign TDI      = 1'b1;
+   assign SWDIOTMS = 1'b1;
+   assign SWCLKTCK = 1'b1;
+
+   bufif1 (P0[31-16], debug_running, debug_test_en);
+   bufif1 (P0[30-16], debug_err, debug_test_en);
+
+   pullup (debug_running);
+   pullup (debug_err);
+
+  `else
+  `ifdef ARM_CMSDK_INCLUDE_DEBUG_TESTER
+
+  // Add pullups and pulldowns on Debug Interface
+
+   pullup   (nTRST);
+   pullup   (TDI);
+   pullup   (TDO);
+   pullup   (SWDIOTMS);
+   pulldown (SWCLKTCK);
+
+
+   //connect to P0 for debug command and status pin
+   //add pulldown to debug command and debug status signals
+   // to give default value 0;
+   pulldown(debug_command[5]);
+   pulldown(debug_command[4]);
+   pulldown(debug_command[3]);
+   pulldown(debug_command[2]);
+   pulldown(debug_command[1]);
+   pulldown(debug_command[0]);
+
+   pulldown(debug_running);
+   pulldown(debug_err);
+
+   //Tristate logic for GPIO connection
+   bufif1 (debug_command[5], P0[29-16], debug_test_en);
+   bufif1 (debug_command[4], P0[28-16], debug_test_en);
+   bufif1 (debug_command[3], P0[27-16], debug_test_en);
+   bufif1 (debug_command[2], P0[26-16], debug_test_en);
+   bufif1 (debug_command[1], P0[25-16], debug_test_en);
+   bufif1 (debug_command[0], P0[24-16], debug_test_en);
+
+   bufif1 (P0[31-16], debug_running, debug_test_en);
+   bufif1 (P0[30-16], debug_err, debug_test_en);
+
+
+  cmsdk_debug_tester #(.ROM_MEMFILE((BE==1) ? "debugtester_be.hex" : "debugtester_le.hex"))
+  u_cmsdk_debug_tester
+  (
+   // Clock and Reset
+   .CLK                                 (XTAL1),
+   .PORESETn                            (NRST),
+
+   // Command Interface
+   .DBGCMD                              (debug_command[5:0]),
+   .DBGRUNNING                          (debug_running),
+   .DBGERROR                            (debug_err),
+
+   // Trace Interface
+   .TRACECLK                            (1'b0),
+   .TRACEDATA                           (4'h0),
+   .SWV                                 (1'b0),
+
+   // Debug Interface
+   .TDO                                 (TDO),
+   .nTRST                               (nTRST),
+   .SWCLKTCK                            (SWCLKTCK),
+   .TDI                                 (TDI),
+   .SWDIOTMS                            (SWDIOTMS)
+   );
+
+
+  `else
+   assign nTRST    = NRST;
+   assign TDI      = 1'b1;
+   assign SWDIOTMS = 1'b1;
+   assign SWCLKTCK = 1'b1;
+
+   bufif1 (P0[31-16], debug_running, debug_test_en);
+   bufif1 (P0[30-16], debug_err, debug_test_en);
+
+   pullup(debug_running);
+   pullup(debug_err);
+
+  `endif
+  `endif
+
+ // --------------------------------------------------------------------------------
+ // Misc
+ // --------------------------------------------------------------------------------
+
+  // Format for time reporting
+  initial    $timeformat(-9, 0, " ns", 0);
+
+  // Configuration checks
+  initial begin
+`ifdef CORTEX_M0DESIGNSTART
+`ifdef CORTEX_M0
+     $display("ERROR (tb_cmsdk_mcu.v) in CPU preprocessing directive : Both CORTEX_M0DESIGNSTART and CORTEX_M0 are set. Please use only one.");
+     $stop;
+`endif
+`endif
+`ifdef CORTEX_M0DESIGNSTART
+`ifdef CORTEX_M0PLUS
+     $display("ERROR (tb_cmsdk_mcu.v) in CPU preprocessing directive : Both CORTEX_M0DESIGNSTART and CORTEX_M0PLUS are set. Please use only one.");
+     $stop;
+`endif
+`endif
+`ifdef CORTEX_M0
+`ifdef CORTEX_M0PLUS
+     $display("ERROR (tb_cmsdk_mcu.v) in CPU preprocessing directive : Both CORTEX_M0 and CORTEX_M0PLUS are set. Please use only one.");
+     $stop;
+`endif
+`endif
+`ifdef CORTEX_M0DESIGNSTART
+`ifdef CORTEX_M0
+`ifdef CORTEX_M0PLUS
+     $display("ERROR (tb_cmsdk_mcu.v) in CPU preprocessing directive : All of CORTEX_M0DESIGNSTART, CORTEX_M0 and CORTEX_M0PLUS are set. Please use only one.");
+     $stop;
+`endif
+`endif
+`endif
+`ifdef CORTEX_M0
+`else
+`ifdef CORTEX_M0PLUS
+`else
+`ifdef CORTEX_M0DESIGNSTART
+`else
+     $display("ERROR (tb_cmsdk_mcu.v) in CPU preprocessing directive : None of CORTEX_M0DESIGNSTART, CORTEX_M0 and CORTEX_M0PLUS are set. Please select one.");
+     $stop;
+`endif
+`endif
+`endif
+
+  end
+endmodule
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/tbench_M0.vc b/Cortex-M0/nanosoc/systems/mcu/verilog/tbench_M0.vc
new file mode 100644
index 0000000..3e9c203
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/tbench_M0.vc
@@ -0,0 +1,145 @@
+//-----------------------------------------------------------------------------
+// customised Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date:  $
+//
+//      Revision            : $Revision:  $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Verilog Command File for Cortex-M0 example system
+//-----------------------------------------------------------------------------
+//
+// ================= MCU System options ===============
+// Option to select Cortex-M0+ processor in example system
++define+CORTEX_M0
+
+// =================== Tarmac Logging =================
++define+USE_TARMAC
+
+// ============= Verilog library extensions ===========
++libext+.v+.vlib
+
+// ================= Top level file ===================
+../verilog/tb_nanosoc.v
++incdir+../verilog
++incdir+/../verilog/soclabs_4x7_AhbMatrix
+-y ../verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix
+
+// =============   GLIB Generic Library path  =============
+../../../../../GLIB/pads/verilog/PAD_INOUT8MA_NOE.v
+../../../../../GLIB/pads/verilog/PAD_VDDIO.v
+../../../../../GLIB/pads/verilog/PAD_VSSIO.v
+../../../../../GLIB/pads/verilog/PAD_VDDSOC.v
+../../../../../GLIB/pads/verilog/PAD_VSS.v
+../../../../../GLIB/mem/verilog/SROM_Ax32.v
+
+// ================= Testbench path ===================
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_debug_tester/verilog
++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_debug_tester/verilog
+
+// =============    MCU Module search path    =============
+-y ../verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_timer/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_uart/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_slave_mux/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_subsystem/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_slave_mux/verilog
+//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_master_mux/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_default_slave/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_gpio/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_apb/verilog
+//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_bitband/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_iop_gpio/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/clkgate
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/memories/
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_sram/verilog
+//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_flash32/verilog
+//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_extmem16/verilog
++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog
++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog
++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/memories/
+
+
+//// Optional PL230 Micro DMA controller - configure in local ../verilog/pl230_defs.v file
+/// upgrade to AAA 'rel2' version
++incdir+../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog
+../verilog/pl230_defs.v
+../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_ahb_ctrl.v
+../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_apb_regs.v
+../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_dma_data.v
+../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_udma.v
+../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_undefs.v
+
+../../../../../IPLIB/FT1248_streamio_v1_0/ft1248_streamio_v1_0.v
+../../../../../IPLIB/ADPcontrol_v1_0/ADPcontrol_v1_0.v
+../../../../../IPLIB/ADPcontrol_v1_0/ADPmanager.v
+../verilog/cmsdk_apb_usrt.v
+
+// ============= Cortex-M0 Module search path =============
+
+-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0/verilog
+-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0_dap/verilog
+-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0_integration/verilog
+-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/cells
+-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/wrappers
+-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/ualdis/verilog
+
+
+// ============= Cortex-M0 Include file search path =============
+
++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0/verilog
++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0_dap/verilog
++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0_integration/verilog
++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/cells
++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/wrappers
++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/ualdis/verilog
+
+
+
+// =============Debug tester Include file search path =============
+
+
+// ============= OVL support libraries =============
+//+define+ASSERT_ON
+//+define+OVL_ASSERT_ON
+//+define+ARM_ASSERT_ON
+//+define+ARM_AHB_ASSERT_ON
+//+define+ARM_APB_ASSERT_ON
+//+define+ARM_CMSDK_ASSERT_ON
+
+// ============= Verification components =============
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/protocol_checkers/AhbLitePC/verilog/
++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/protocol_checkers/AhbLitePC/verilog/
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/protocol_checkers/ApbPC/verilog/
++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/protocol_checkers/ApbPC/verilog/
+
+///+incdir+/arm/tools/accellera/ovl/releases/ovl_v2p6_Oct2011/std_ovl
+///-y      /arm/tools/accellera/ovl/releases/ovl_v2p6_Oct2011/std_ovl
diff --git a/Cortex-M0/nanosoc/systems/mcu/verilog/v2html_M0.vc b/Cortex-M0/nanosoc/systems/mcu/verilog/v2html_M0.vc
new file mode 100644
index 0000000..f32853f
--- /dev/null
+++ b/Cortex-M0/nanosoc/systems/mcu/verilog/v2html_M0.vc
@@ -0,0 +1,120 @@
+//-----------------------------------------------------------------------------
+// customised Cortex-M0 'nanosoc' controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// The confidential and proprietary information contained in this file may
+// only be used by a person authorised under and to the extent permitted
+// by a subsisting licensing agreement from Arm Limited or its affiliates.
+//
+//            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+//                ALL RIGHTS RESERVED
+//
+// This entire notice must be reproduced on all copies of this file
+// and copies of this file may only be made by a person if such person is
+// permitted to do so under the terms of a subsisting license agreement
+// from Arm Limited or its affiliates.
+//
+//      SVN Information
+//
+//      Checked In          : $Date:  $
+//
+//      Revision            : $Revision:  $
+//
+//      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Verilog Command File for Cortex-M0 example system
+//-----------------------------------------------------------------------------
+//
+// ================= MCU System options ===============
+// Option to select Cortex-M0+ processor in example system
++define+CORTEX_M0
+
+// =================== Tarmac Logging =================
++define+USE_TARMAC
+
+// ============= Verilog library extensions ===========
++libext+.v+.vlib
+
+// ================= Top level file ===================
+../verilog/tb_nanosoc.v
++incdir+../verilog
++incdir+/../verilog/soclabs_4x7_AhbMatrix
+-y ../verilog/gen_ahb_busmatrix/verilog/built/soclabs_4x7_AhbMatrix
+
+// ================= Testbench path ===================
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_debug_tester/verilog
++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_debug_tester/verilog
+
+// =============   GLIB Generic Library path  =============
+../../../../../GLIB/pads/verilog/PAD_INOUT8MA_NOE.v
+../../../../../GLIB/pads/verilog/PAD_VDDIO.v
+../../../../../GLIB/pads/verilog/PAD_VSSIO.v
+../../../../../GLIB/pads/verilog/PAD_VDDSOC.v
+../../../../../GLIB/pads/verilog/PAD_VSS.v
+../../../../../GLIB/mem/verilog/SROM_Ax32.v
+
+// =============   IPLIB soclabs IP Library path  =============
+../../../../../IPLIB/FT1248_streamio_v1_0/ft1248_streamio_v1_0.v
+../../../../../IPLIB/ADPcontrol_v1_0/ADPcontrol_v1_0.v
+../../../../../IPLIB/ADPcontrol_v1_0/ADPmanager.v
+../verilog/cmsdk_apb_usrt.v
+
+// =============    MCU Module search path    =============
+-y ../verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_timer/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_uart/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_slave_mux/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_subsystem/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_slave_mux/verilog
+//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_master_mux/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_default_slave/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_gpio/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_apb/verilog
+//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_bitband/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_iop_gpio/verilog
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/clkgate
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/memories/
+-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_sram/verilog
+//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_flash32/verilog
+//-y ../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_ahb_to_extmem16/verilog
++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_dualtimers/verilog
++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/cmsdk_apb_watchdog/verilog
++incdir+../../../../../../arm-AAA-ip/Corstone-101_Foundation_IP/BP210-BU-00000-r1p1-00rel0/logical/models/memories/
+
+//// Optional PL230 Micro DMA controller - configure in local ../verilog/pl230_defs.v file
+/// upgrade to AAA 'rel2' version
++incdir+../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog
+../verilog/pl230_defs.v
+../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_ahb_ctrl.v
+../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_apb_regs.v
+../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_dma_data.v
+../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_udma.v
+../../../../../../arm-AAA-ip/DMA-230_MicroDMA_Controller/PL230-BU-00000-r0p0-02rel2/shared/logical/pl230_udma/verilog/pl230_undefs.v
+
+// ============= Cortex-M0 Module search path =============
+// guts of core not exposed, periphery only
+-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0_integration/verilog
+-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/cells
+-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/wrappers
+-y ../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/ualdis/verilog
+
+// ============= Cortex-M0 Include file search path =============
+// guts of core not exposed, periphery only
+
++incdi+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/cortexm0_integration/verilog
++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/cells
++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/models/wrappers
++incdir+../../../../../../arm-AAA-ip/Cortex-M0/AT510-BU-00000-r0p0-03rel3/logical/ualdis/verilog
+
diff --git a/FPGALIB/pads/verilog/PAD_INOUT8MA_NOE.v b/FPGALIB/pads/verilog/PAD_INOUT8MA_NOE.v
new file mode 100644
index 0000000..fa92fec
--- /dev/null
+++ b/FPGALIB/pads/verilog/PAD_INOUT8MA_NOE.v
@@ -0,0 +1,37 @@
+// from GLIB_PADLIB.v
+//-----------------------------------------------------------------------------
+// soclabs generic IO pad model
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module PAD_INOUT8MA_NOE (
+   // Inouts
+   PAD, 
+   // Outputs
+   I, 
+   // Inputs
+   O,
+   NOE
+   );
+   inout PAD;
+   output I;
+   input O;
+   input NOE;
+
+  IOBUF #(
+    .IOSTANDARD ("LVCMOS33"),
+    .DRIVE(8)
+  ) IOBUF3V3 (
+    .O(I),
+    .IO(PAD),
+    .I(O),
+    .T(NOE)
+  );
+    
+endmodule // PAD_INOUT8MA_NOE
diff --git a/FPGALIB/pads/verilog/PAD_VDDIO.v b/FPGALIB/pads/verilog/PAD_VDDIO.v
new file mode 100644
index 0000000..4fd7137
--- /dev/null
+++ b/FPGALIB/pads/verilog/PAD_VDDIO.v
@@ -0,0 +1,29 @@
+// from GLIB_PADLIB.v
+//-----------------------------------------------------------------------------
+// soclabs generic IO pad model
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module PAD_VDDIO (
+   // Inouts
+   PAD
+   );
+   inout PAD;
+
+  IOBUF #(
+    .IOSTANDARD ("LVCMOS33"),
+    .DRIVE(8)
+  ) IOBUF3V3 (
+    .O( ),
+    .IO(PAD),
+    .I(1'b1),
+    .T(1'b1)
+  );
+   
+endmodule // PAD_VDDIO
diff --git a/FPGALIB/pads/verilog/PAD_VDDSOC.v b/FPGALIB/pads/verilog/PAD_VDDSOC.v
new file mode 100644
index 0000000..80f6a72
--- /dev/null
+++ b/FPGALIB/pads/verilog/PAD_VDDSOC.v
@@ -0,0 +1,29 @@
+// from GLIB_PADLIB.v
+//-----------------------------------------------------------------------------
+// soclabs generic IO pad model
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module PAD_VDDSOC (
+   // Inouts
+   PAD
+   );
+   inout PAD;
+
+  IOBUF #(
+    .IOSTANDARD ("LVCMOS33"),
+    .DRIVE(8)
+  ) IOBUF3V3 (
+    .O( ),
+    .IO(PAD),
+    .I(1'b1),
+    .T(1'b1)
+  );
+    
+endmodule // PAD_VDDSOC
diff --git a/FPGALIB/pads/verilog/PAD_VSS.v b/FPGALIB/pads/verilog/PAD_VSS.v
new file mode 100644
index 0000000..046a389
--- /dev/null
+++ b/FPGALIB/pads/verilog/PAD_VSS.v
@@ -0,0 +1,29 @@
+// from GLIB_PADLIB.v
+//-----------------------------------------------------------------------------
+// soclabs generic IO pad model
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module PAD_VSS (
+   // Inouts
+   PAD
+   );
+   inout PAD;
+
+  IOBUF #(
+    .IOSTANDARD ("LVCMOS33"),
+    .DRIVE(8)
+  ) IOBUF3V3 (
+    .O( ),
+    .IO(PAD),
+    .I(1'b1),
+    .T(1'b1)
+  );
+    
+endmodule // PAD_VSS
diff --git a/FPGALIB/pads/verilog/PAD_VSSIO.v b/FPGALIB/pads/verilog/PAD_VSSIO.v
new file mode 100644
index 0000000..6bfb333
--- /dev/null
+++ b/FPGALIB/pads/verilog/PAD_VSSIO.v
@@ -0,0 +1,29 @@
+// from GLIB_PADLIB.v
+//-----------------------------------------------------------------------------
+// soclabs generic IO pad model
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module PAD_VSSIO (
+   // Inouts
+   PAD
+   );
+   inout PAD;
+
+  IOBUF #(
+    .IOSTANDARD ("LVCMOS33"),
+    .DRIVE(8)
+  ) IOBUF3V3 (
+    .O( ),
+    .IO(PAD),
+    .I(1'b1),
+    .T(1'b1)
+  );
+    
+endmodule // PAD_VSSIO
diff --git a/GLIB/mem/verilog/SROM_Ax32.v b/GLIB/mem/verilog/SROM_Ax32.v
new file mode 100644
index 0000000..f2c3a9a
--- /dev/null
+++ b/GLIB/mem/verilog/SROM_Ax32.v
@@ -0,0 +1,127 @@
+//-----------------------------------------------------------------------------
+//
+// Synthesizable byte-write addressible R/W (random-access) memory
+//
+// Synchronous data write, flow-though (non-pipeline registered) read data
+//
+// Auto-gernerates a synthesizable verilog ROM design
+// and binary text file for custom ROM via programming
+//
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module SROM_Ax32
+  #(parameter ADDRWIDTH = 10,
+    parameter filename = "rom32.hex",
+    parameter romgen = 0
+   )
+   (input  wire CLK,
+    input  wire [ADDRWIDTH-1:0] ADDR, //Address Input
+    input  wire SEL,                  //Select (active-high)
+    output wire [31:0] RDATA);        //Read Data
+    
+   localparam MEMDEPTH = (1 << (ADDRWIDTH)-1)-1;
+   localparam romgenfile = "bootrom.v";
+   localparam bingenfile = "bootrom.bintxt";
+
+   // Reg declarations
+   reg  [7:0] rombyte0 [0:MEMDEPTH];
+   reg  [7:0] rombyte1 [0:MEMDEPTH];
+   reg  [7:0] rombyte2 [0:MEMDEPTH];
+   reg  [7:0] rombyte3 [0:MEMDEPTH];
+
+   reg  [ADDRWIDTH-1:0] addr_r;  // registered Address for read access
+
+// optional simulation RAM_INIT option to suppress 'X' initial contents
+`ifdef MEM_INIT
+  reg [7:0] fileimage [((4<<ADDRWIDTH)-1):0];
+  function [31:0] NoX32; input [31:0] n; NoX32 = (((^n) === 1'bx) ? 32'h0 : n); endfunction
+  integer fd; // file descriptor for file output
+  integer fd2; // file descriptor for file 2 output
+  integer i;
+  reg [39:0] today [0:1];
+  
+initial
+  begin
+    $system("date +%y%m%d%H%M >date_file"); //format yymmdd
+    $readmemh("date_file", today);
+    $display("data_file: %x", today[0]);
+    
+    for (i=0; i<= MEMDEPTH; i=i+1) begin
+      rombyte0[i] <= 8'he5;
+      rombyte1[i] <= 8'he5;
+      rombyte2[i] <= 8'he5;
+      rombyte3[i] <= 8'he5;
+      end
+    if (filename != "") begin
+      $readmemh(filename, fileimage);
+      for (i = 0; i <= MEMDEPTH; i=i+1) begin
+        rombyte0[i] <= fileimage[(i<<2)+0];
+        rombyte1[i] <= fileimage[(i<<2)+1];
+        rombyte2[i] <= fileimage[(i<<2)+2];
+        rombyte3[i] <= fileimage[(i<<2)+3];
+        end
+      end
+    if (romgen != 0)
+      begin
+       fd = $fopen(romgenfile);
+       fd2 = $fopen(bingenfile);
+       if ((fd == 0) || (fd2 == 0)) begin
+         $display("rom32gen: Error, zero returned in response to $fopen\n");
+       end
+       else begin
+         $display(fd,"rom32gen: Generating output file\n");
+         $fwrite(fd,"//------------------------------------------------------------------------------------\n");
+         $fwrite(fd,"// customised auto-generated synthesizable ROM module abstraction\n");
+         $fwrite(fd,"// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.\n");
+         $fwrite(fd,"//\n");
+         $fwrite(fd,"// Contributors\n");
+         $fwrite(fd,"//\n");
+         $fwrite(fd,"// David Flynn (d.w.flynn@soton.ac.uk)\n");
+         $fwrite(fd,"//    Date:    %x\n", today[0]);
+         $fwrite(fd,"// Copyright (c) 2021-2, SoC Labs (www.soclabs.org)\n");
+         $fwrite(fd,"//------------------------------------------------------------------------------------\n");
+         $fwrite(fd,"module bootrom (\n");
+         $fwrite(fd,"  input  wire CLK,\n");
+         $fwrite(fd,"  input  wire EN,\n");
+         $fwrite(fd,"  input  wire [%0d:2] ADDR,\n", ADDRWIDTH+1);
+         $fwrite(fd,"  output reg [31:0] RDATA );\n");
+         $fwrite(fd,"reg [%0d:2] addr_r;\n", ADDRWIDTH+1);
+         $fwrite(fd,"always @(posedge CLK) if (EN) addr_r <= ADDR;\n");
+         $fwrite(fd,"always @(addr_r)");
+         $fwrite(fd,"  case(addr_r[%0d:2]) \n", ADDRWIDTH+1);
+         if (ADDRWIDTH > 8)
+           for (i = 0; i < 4 << (ADDRWIDTH); i=i+4) begin
+             $fwrite(fd,"    %2d'h%3x : RDATA <= 32'h%8x; // 0x%04x\n", ADDRWIDTH, i>>2, NoX32({fileimage[i+3],fileimage[i+2],fileimage[i+1],fileimage[i+0]}), i );
+             $fwrite(fd2,"%32b\n",NoX32({fileimage[i+3],fileimage[i+2],fileimage[i+1],fileimage[i+0]}));
+             end
+         else
+           for (i = 0; i < 4 << (ADDRWIDTH); i=i+4) begin
+             $fwrite(fd,"    %2d'h%2x : RDATA <= 32'h%8x; // 0x%04x\n", ADDRWIDTH, i>>2, NoX32({fileimage[i+3],fileimage[i+2],fileimage[i+1],fileimage[i+0]}), i );
+             $fwrite(fd2,"%32b\n",NoX32({fileimage[i+3],fileimage[i+2],fileimage[i+1],fileimage[i+0]}));
+             end
+         $fwrite(fd,"    default : RDATA <=32'h0;\n");
+         $fwrite(fd,"  endcase\n");
+         $fwrite(fd,"endmodule\n");
+         $fclose(fd);
+         $fclose(fd2);
+       end
+      end
+  end
+`endif
+
+// synchonous address and control
+   
+  always @(posedge CLK) // update on any byte lane read
+    if (SEL)
+      addr_r <= ADDR[ADDRWIDTH-1:0];
+
+  assign RDATA = {rombyte3[addr_r],rombyte2[addr_r],rombyte1[addr_r],rombyte0[addr_r]};
+   
+endmodule
diff --git a/GLIB/pads/verilog/GLIB_PADLIB.v b/GLIB/pads/verilog/GLIB_PADLIB.v
new file mode 100755
index 0000000..bc10d2b
--- /dev/null
+++ b/GLIB/pads/verilog/GLIB_PADLIB.v
@@ -0,0 +1,139 @@
+// GLIB_PADLIB.v
+//-----------------------------------------------------------------------------
+// soclabs generic IO pad model
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module PAD_INOUT8MA_NOE (
+   // Inouts
+   PAD, 
+   // Outputs
+   O, 
+   // Inputs
+   I,
+   NOE
+   );
+   inout PAD;
+   output I;
+   input O;
+   input NOE;
+
+`ifdef BEHAVIORAL_PADS
+   assign I = PAD;
+   assign PAD = ~NOE ? O : 1'bz; 
+`else
+   bufif1 #2 (PAD, O, ~NOE);
+   buf #1 (I, PAD);
+   always @(PAD)
+     begin
+       if (($countdrivers(PAD) > 1) && (PAD === 1'bx))
+         $display("%t ++BUS CONFLICT++ : %m", $realtime);
+     end
+`endif // ifdef BEHAVIORAL_PADS
+endmodule // PAD_INOUT8MA_NOE
+
+module PAD_INOUT8MA_OE (
+   // Inouts
+   PAD, 
+   // Outputs
+   O, 
+   // Inputs
+   I,
+   OE
+   );
+   inout PAD;
+   output I;
+   input O;
+   input OE;
+`ifdef BEHAVIORAL_PADS
+   assign I = PAD;
+   assign PAD = OE ? O : 1'bz; 
+`else
+   bufif1 #2 (PAD, O, OE);
+   buf #1 (I, PAD);
+
+   always @(PAD)
+     begin
+       if (($countdrivers(PAD) > 1) && (PAD === 1'bx))
+         $display("%t ++BUS CONFLICT++ : %m", $realtime);
+     end
+`endif // ifdef BEHAVIORAL_PADS
+endmodule // PAD_INOUT8MA_OE
+
+module PAD_VDDIO (
+   PAD
+   );
+   inout PAD;
+endmodule // PAD_VDDIO
+
+module PAD_VSSIO (
+   PAD
+   );
+   inout PAD;
+endmodule // PAD_VSSSIO
+
+// core logic supply rails (1V0, 0V)
+module PAD_VDDSOC (
+   PAD
+   );
+   inout PAD;
+endmodule // PAD_VDDSOC
+
+module PAD_VSS (
+   PAD
+   );
+   inout PAD;
+endmodule // PAD_VSS
+
+// VDDISOL
+module PAD_ANALOG (
+   PAD
+   );
+   inout PAD;
+endmodule // PAD_ANALOG
+
+`ifdef TSMC_PADS
+
+// VDDSOC
+module PVDD1CDG (
+   inout wire VDD
+   );
+endmodule // PVDD1CDG
+
+//VDDIO
+module PVDD2CDG (
+   inout wire VDDPST
+   );
+endmodule // PVDD2CDG
+
+module PVDD2POC (
+   inout wire VDDPST
+   );
+endmodule // PVDD2CDG
+
+module PVSS3CDG (
+   inout wire VSS
+   );
+endmodule // PVSS3CDG
+
+// VDDISOL
+module PVDD1ANA (
+   inout wire AVDD
+   );
+endmodule // PVDD1ANA
+
+
+module PCORNER     ( ); endmodule
+module PFILLER20   ( ); endmodule
+module PFILLER1    ( ); endmodule
+module PFILLER0005 ( ); endmodule
+
+module PAD60LU     ( ); endmodule
+
+`endif
diff --git a/GLIB/pads/verilog/PAD_ANALOG.v b/GLIB/pads/verilog/PAD_ANALOG.v
new file mode 100644
index 0000000..2715fb3
--- /dev/null
+++ b/GLIB/pads/verilog/PAD_ANALOG.v
@@ -0,0 +1,18 @@
+// from GLIB_PADLIB.v
+//-----------------------------------------------------------------------------
+// soclabs generic IO pad model
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+// VDDISOL
+module PAD_ANALOG (
+   PAD
+   );
+   inout PAD;
+endmodule // PAD_ANALOG
diff --git a/GLIB/pads/verilog/PAD_INOUT8MA_NOE.v b/GLIB/pads/verilog/PAD_INOUT8MA_NOE.v
new file mode 100644
index 0000000..42123e8
--- /dev/null
+++ b/GLIB/pads/verilog/PAD_INOUT8MA_NOE.v
@@ -0,0 +1,39 @@
+// from GLIB_PADLIB.v
+//-----------------------------------------------------------------------------
+// soclabs generic IO pad model
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module PAD_INOUT8MA_NOE (
+   // Inouts
+   PAD, 
+   // Outputs
+   O, 
+   // Inputs
+   I,
+   NOE
+   );
+   inout PAD;
+   output I;
+   input O;
+   input NOE;
+
+`ifdef BEHAVIORAL_PADS
+   assign I = PAD;
+   assign PAD = ~NOE ? O : 1'bz; 
+`else
+   bufif1 #2 (PAD, O, ~NOE);
+   buf #1 (I, PAD);
+   always @(PAD)
+     begin
+       if (($countdrivers(PAD) > 1) && (PAD === 1'bx))
+         $display("%t ++BUS CONFLICT++ : %m", $realtime);
+     end
+`endif // ifdef BEHAVIORAL_PADS
+endmodule // PAD_INOUT8MA_NOE
diff --git a/GLIB/pads/verilog/PAD_INOUT8MA_OE.v b/GLIB/pads/verilog/PAD_INOUT8MA_OE.v
new file mode 100644
index 0000000..12d3009
--- /dev/null
+++ b/GLIB/pads/verilog/PAD_INOUT8MA_OE.v
@@ -0,0 +1,39 @@
+// from GLIB_PADLIB.v
+//-----------------------------------------------------------------------------
+// soclabs generic IO pad model
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module PAD_INOUT8MA_OE (
+   // Inouts
+   PAD, 
+   // Outputs
+   O, 
+   // Inputs
+   I,
+   OE
+   );
+   inout PAD;
+   output I;
+   input O;
+   input OE;
+`ifdef BEHAVIORAL_PADS
+   assign I = PAD;
+   assign PAD = OE ? O : 1'bz; 
+`else
+   bufif1 #2 (PAD, O, OE);
+   buf #1 (I, PAD);
+
+   always @(PAD)
+     begin
+       if (($countdrivers(PAD) > 1) && (PAD === 1'bx))
+         $display("%t ++BUS CONFLICT++ : %m", $realtime);
+     end
+`endif // ifdef BEHAVIORAL_PADS
+endmodule // PAD_INOUT8MA_OE
diff --git a/GLIB/pads/verilog/PAD_VDDIO.v b/GLIB/pads/verilog/PAD_VDDIO.v
new file mode 100644
index 0000000..e8eda59
--- /dev/null
+++ b/GLIB/pads/verilog/PAD_VDDIO.v
@@ -0,0 +1,18 @@
+// from GLIB_PADLIB.v
+//-----------------------------------------------------------------------------
+// soclabs generic IO pad model
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module PAD_VDDIO (
+   PAD
+   );
+   inout PAD;
+   assign PAD = 1'b1;
+ endmodule // PAD_VDDIO
diff --git a/GLIB/pads/verilog/PAD_VDDSOC.v b/GLIB/pads/verilog/PAD_VDDSOC.v
new file mode 100644
index 0000000..02de9e9
--- /dev/null
+++ b/GLIB/pads/verilog/PAD_VDDSOC.v
@@ -0,0 +1,19 @@
+// from GLIB_PADLIB.v
+//-----------------------------------------------------------------------------
+// soclabs generic IO pad model
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+// core logic supply rails (1V0, 0V)
+module PAD_VDDSOC (
+   PAD
+   );
+   inout PAD;
+   assign PAD = 1'b1;
+endmodule // PAD_VDDSOC
diff --git a/GLIB/pads/verilog/PAD_VSS.v b/GLIB/pads/verilog/PAD_VSS.v
new file mode 100644
index 0000000..ea07cca
--- /dev/null
+++ b/GLIB/pads/verilog/PAD_VSS.v
@@ -0,0 +1,18 @@
+// from GLIB_PADLIB.v
+//-----------------------------------------------------------------------------
+// soclabs generic IO pad model
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module PAD_VSS (
+   PAD
+   );
+   inout PAD;
+   assign PAD = 1'b0;
+endmodule // PAD_VSS
diff --git a/GLIB/pads/verilog/PAD_VSSIO.v b/GLIB/pads/verilog/PAD_VSSIO.v
new file mode 100644
index 0000000..42d9edb
--- /dev/null
+++ b/GLIB/pads/verilog/PAD_VSSIO.v
@@ -0,0 +1,19 @@
+// from GLIB_PADLIB.v
+//-----------------------------------------------------------------------------
+// soclabs generic IO pad model
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module PAD_VSSIO (
+   PAD
+   );
+   inout PAD;
+   assign PAD = 1'b0;
+endmodule // PAD_VSSIO
+
diff --git a/IPLIB/ADPcontrol_v1_0/ADPcontrol_adv__mangled.v b/IPLIB/ADPcontrol_v1_0/ADPcontrol_adv__mangled.v
new file mode 100755
index 0000000..2699f10
--- /dev/null
+++ b/IPLIB/ADPcontrol_v1_0/ADPcontrol_adv__mangled.v
@@ -0,0 +1,7744 @@
+// 
+// A joint work commissioned on behalf of SoC Labs.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Obfuscated RTL
+//
+// Copyright (C) 2021-2, SoC Labs (www.soclabs.org)
+//
+
+/*
+                    instances: 0
+                        nodes: 3002 (0)
+                  node widths: 3242 (0)
+                      process: 281 (0)
+                   contassign:  2769 (0)
+                        ports: 27 (0)
+*/
+
+/* Source file "tokens.v", line 14 */
+module ADPcontrol(ahb_hclk, ahb_hresetn, com_rx_tready, com_rx_tdata,
+	com_rx_tvalid, com_tx_tvalid, com_tx_tdata, com_tx_tready,
+	stdio_rx_tready, stdio_rx_tdata, stdio_rx_tvalid, stdio_tx_tvalid,
+	stdio_tx_tdata, stdio_tx_tready, gpo8, gpi8, ahb_haddr, ahb_hburst,
+	ahb_hmastlock, ahb_hprot, ahb_hsize, ahb_htrans, ahb_hwdata, ahb_hwrite,
+	ahb_hrdata, ahb_hready, ahb_hresp);
+
+	input	[7:0]		com_rx_tdata;
+	output	[7:0]		com_tx_tdata;
+	input	[7:0]		stdio_rx_tdata;
+	output	[7:0]		stdio_tx_tdata;
+	output	[7:0]		gpo8;
+	input	[7:0]		gpi8;
+	output	[31:0]		ahb_haddr;
+	output	[2:0]		ahb_hburst;
+	output	[3:0]		ahb_hprot;
+	output	[2:0]		ahb_hsize;
+	output	[1:0]		ahb_htrans;
+	output	[31:0]		ahb_hwdata;
+	input	[31:0]		ahb_hrdata;
+	input			ahb_hclk;
+	input			ahb_hresetn;
+	input			com_rx_tvalid;
+	input			com_tx_tready;
+	input			stdio_rx_tvalid;
+	input			stdio_tx_tready;
+	input			ahb_hready;
+	input			ahb_hresp;
+	output			com_rx_tready;
+	output			com_tx_tvalid;
+	output			stdio_rx_tready;
+	output			stdio_tx_tvalid;
+	output			ahb_hmastlock;
+	output			ahb_hwrite;
+
+	wire			Xzpfh7;
+	wire			O0qfh7;
+	wire			F1qfh7;
+	wire			W1qfh7;
+	wire			N2qfh7;
+	wire			E3qfh7;
+	wire			V3qfh7;
+	wire			M4qfh7;
+	wire			D5qfh7;
+	wire			U5qfh7;
+	wire			L6qfh7;
+	wire			C7qfh7;
+	wire			T7qfh7;
+	wire			K8qfh7;
+	wire			B9qfh7;
+	wire			S9qfh7;
+	wire			Jaqfh7;
+	wire			Abqfh7;
+	wire			Rbqfh7;
+	wire			Icqfh7;
+	wire			Zcqfh7;
+	wire			Qdqfh7;
+	wire			Heqfh7;
+	wire			Yeqfh7;
+	wire			Pfqfh7;
+	wire			Ggqfh7;
+	wire			Xgqfh7;
+	wire			Ohqfh7;
+	wire			Fiqfh7;
+	wire			Wiqfh7;
+	wire			Njqfh7;
+	wire			Ekqfh7;
+	wire			Vkqfh7;
+	wire			Mlqfh7;
+	wire			Dmqfh7;
+	wire			Umqfh7;
+	wire			Lnqfh7;
+	wire			Coqfh7;
+	wire			Toqfh7;
+	wire			Kpqfh7;
+	wire			Bqqfh7;
+	wire			Sqqfh7;
+	wire			Jrqfh7;
+	wire			Asqfh7;
+	wire			Rsqfh7;
+	wire			Itqfh7;
+	wire			Ztqfh7;
+	wire			Quqfh7;
+	wire			Hvqfh7;
+	wire			Yvqfh7;
+	wire			Pwqfh7;
+	wire			Gxqfh7;
+	wire			Xxqfh7;
+	wire			Oyqfh7;
+	wire			Fzqfh7;
+	wire			Wzqfh7;
+	wire			N0rfh7;
+	wire			E1rfh7;
+	wire			V1rfh7;
+	wire			M2rfh7;
+	wire			D3rfh7;
+	wire			U3rfh7;
+	wire			L4rfh7;
+	wire			C5rfh7;
+	wire			T5rfh7;
+	wire			K6rfh7;
+	wire			B7rfh7;
+	wire			S7rfh7;
+	wire			J8rfh7;
+	wire			A9rfh7;
+	wire			R9rfh7;
+	wire			Iarfh7;
+	wire			Zarfh7;
+	wire			Qbrfh7;
+	wire			Hcrfh7;
+	wire			Ycrfh7;
+	wire			Pdrfh7;
+	wire			Gerfh7;
+	wire			Xerfh7;
+	wire			Ofrfh7;
+	wire			Fgrfh7;
+	wire			Wgrfh7;
+	wire			Nhrfh7;
+	wire			Eirfh7;
+	wire			Virfh7;
+	wire			Mjrfh7;
+	wire			Dkrfh7;
+	wire			Ukrfh7;
+	wire			Llrfh7;
+	wire			Cmrfh7;
+	wire			Tmrfh7;
+	wire			Knrfh7;
+	wire			Borfh7;
+	wire			Sorfh7;
+	wire			Jprfh7;
+	wire			Aqrfh7;
+	wire			Rqrfh7;
+	wire			Irrfh7;
+	wire			Zrrfh7;
+	wire			Qsrfh7;
+	wire			Htrfh7;
+	wire			Ytrfh7;
+	wire			Purfh7;
+	wire			Gvrfh7;
+	wire			Xvrfh7;
+	wire			Owrfh7;
+	wire			Fxrfh7;
+	wire			Wxrfh7;
+	wire			Nyrfh7;
+	wire			Ezrfh7;
+	wire			Vzrfh7;
+	wire			M0sfh7;
+	wire			D1sfh7;
+	wire			U1sfh7;
+	wire			L2sfh7;
+	wire			C3sfh7;
+	wire			T3sfh7;
+	wire			K4sfh7;
+	wire			B5sfh7;
+	wire			R5sfh7;
+	wire			H6sfh7;
+	wire			X6sfh7;
+	wire			N7sfh7;
+	wire			D8sfh7;
+	wire			T8sfh7;
+	wire			J9sfh7;
+	wire			Z9sfh7;
+	wire			Pasfh7;
+	wire			Fbsfh7;
+	wire			Vbsfh7;
+	wire			Lcsfh7;
+	wire			Bdsfh7;
+	wire			Rdsfh7;
+	wire			Hesfh7;
+	wire			Xesfh7;
+	wire			Nfsfh7;
+	wire			Dgsfh7;
+	wire			Tgsfh7;
+	wire			Jhsfh7;
+	wire			Zhsfh7;
+	wire			Pisfh7;
+	wire			Fjsfh7;
+	wire			Vjsfh7;
+	wire			Lksfh7;
+	wire			Blsfh7;
+	wire			Rlsfh7;
+	wire			Hmsfh7;
+	wire			Xmsfh7;
+	wire			Nnsfh7;
+	wire			Dosfh7;
+	wire			Tosfh7;
+	wire			Jpsfh7;
+	wire			Zpsfh7;
+	wire			Pqsfh7;
+	wire			Frsfh7;
+	wire			Vrsfh7;
+	wire			Lssfh7;
+	wire			Btsfh7;
+	wire			Rtsfh7;
+	wire			Husfh7;
+	wire			Xusfh7;
+	wire			Nvsfh7;
+	wire			Dwsfh7;
+	wire			Twsfh7;
+	wire			Jxsfh7;
+	wire			Zxsfh7;
+	wire			Pysfh7;
+	wire			Fzsfh7;
+	wire			Vzsfh7;
+	wire			L0tfh7;
+	wire			B1tfh7;
+	wire			R1tfh7;
+	wire			H2tfh7;
+	wire			X2tfh7;
+	wire			N3tfh7;
+	wire			D4tfh7;
+	wire			T4tfh7;
+	wire			J5tfh7;
+	wire			Z5tfh7;
+	wire			P6tfh7;
+	wire			F7tfh7;
+	wire			V7tfh7;
+	wire			L8tfh7;
+	wire			B9tfh7;
+	wire			R9tfh7;
+	wire			Patfh7;
+	wire			Obtfh7;
+	wire			Tbtfh7;
+	wire			Ybtfh7;
+	wire			Dctfh7;
+	wire			Jctfh7;
+	wire			Pctfh7;
+	wire			Vctfh7;
+	wire			Bdtfh7;
+	wire			Hdtfh7;
+	wire			Ndtfh7;
+	wire			Tdtfh7;
+	wire			Zdtfh7;
+	wire			Fetfh7;
+	wire			Letfh7;
+	wire			Retfh7;
+	wire			Xetfh7;
+	wire			Dftfh7;
+	wire			Jftfh7;
+	wire			Pftfh7;
+	wire			Vftfh7;
+	wire			Bgtfh7;
+	wire			Hgtfh7;
+	wire			Ngtfh7;
+	wire			Tgtfh7;
+	wire			Zgtfh7;
+	wire			Fhtfh7;
+	wire			Lhtfh7;
+	wire			Rhtfh7;
+	wire			Xhtfh7;
+	wire			Ditfh7;
+	wire			Jitfh7;
+	wire			Pitfh7;
+	wire			Vitfh7;
+	wire			Bjtfh7;
+	wire			Hjtfh7;
+	wire			Njtfh7;
+	wire			Tjtfh7;
+	wire			Zjtfh7;
+	wire			Fktfh7;
+	wire			Lktfh7;
+	wire			Rktfh7;
+	wire			Xktfh7;
+	wire			Dltfh7;
+	wire			Jltfh7;
+	wire			Pltfh7;
+	wire			Vltfh7;
+	wire			Bmtfh7;
+	wire			Hmtfh7;
+	wire			Nmtfh7;
+	wire			Tmtfh7;
+	wire			Zmtfh7;
+	wire			Fntfh7;
+	wire			Lntfh7;
+	wire			Rntfh7;
+	wire			Xntfh7;
+	wire			Dotfh7;
+	wire			Jotfh7;
+	wire			Potfh7;
+	wire			Votfh7;
+	wire			Bptfh7;
+	wire			Hptfh7;
+	wire			Nptfh7;
+	wire			Tptfh7;
+	wire			Zptfh7;
+	wire			Fqtfh7;
+	wire			Lqtfh7;
+	wire			Rqtfh7;
+	wire			Xqtfh7;
+	wire			Drtfh7;
+	wire			Jrtfh7;
+	wire			Prtfh7;
+	wire			Vrtfh7;
+	wire			Bstfh7;
+	wire			Hstfh7;
+	wire			Nstfh7;
+	wire			Tstfh7;
+	wire			Zstfh7;
+	wire			Fttfh7;
+	wire			Lttfh7;
+	wire			Rttfh7;
+	wire			Xttfh7;
+	wire			Dutfh7;
+	wire			Jutfh7;
+	wire			Putfh7;
+	wire			Vutfh7;
+	wire			Bvtfh7;
+	wire			Hvtfh7;
+	wire			Nvtfh7;
+	wire			Tvtfh7;
+	wire			Zvtfh7;
+	wire			Fwtfh7;
+	wire			Lwtfh7;
+	wire			Rwtfh7;
+	wire			Xwtfh7;
+	wire			Dxtfh7;
+	wire			Jxtfh7;
+	wire			Pxtfh7;
+	wire			Vxtfh7;
+	wire			Bytfh7;
+	wire			Hytfh7;
+	wire			Nytfh7;
+	wire			Tytfh7;
+	wire			Zytfh7;
+	wire			Fztfh7;
+	wire			Lztfh7;
+	wire			Rztfh7;
+	wire			Xztfh7;
+	wire			D0ufh7;
+	wire			J0ufh7;
+	wire			P0ufh7;
+	wire			V0ufh7;
+	wire			B1ufh7;
+	wire			H1ufh7;
+	wire			N1ufh7;
+	wire			T1ufh7;
+	wire			Z1ufh7;
+	wire			F2ufh7;
+	wire			L2ufh7;
+	wire			R2ufh7;
+	wire			X2ufh7;
+	wire			D3ufh7;
+	wire			J3ufh7;
+	wire			P3ufh7;
+	wire			V3ufh7;
+	wire			B4ufh7;
+	wire			H4ufh7;
+	wire			N4ufh7;
+	wire			T4ufh7;
+	wire			Z4ufh7;
+	wire			F5ufh7;
+	wire			L5ufh7;
+	wire			R5ufh7;
+	wire			X5ufh7;
+	wire			D6ufh7;
+	wire			J6ufh7;
+	wire			P6ufh7;
+	wire			V6ufh7;
+	wire			B7ufh7;
+	wire			H7ufh7;
+	wire			N7ufh7;
+	wire			T7ufh7;
+	wire			Z7ufh7;
+	wire			F8ufh7;
+	wire			L8ufh7;
+	wire			R8ufh7;
+	wire			X8ufh7;
+	wire			D9ufh7;
+	wire			J9ufh7;
+	wire			P9ufh7;
+	wire			V9ufh7;
+	wire			Baufh7;
+	wire			Haufh7;
+	wire			Naufh7;
+	wire			Taufh7;
+	wire			Zaufh7;
+	wire			Fbufh7;
+	wire			Lbufh7;
+	wire			Rbufh7;
+	wire			Xbufh7;
+	wire			Dcufh7;
+	wire			Jcufh7;
+	wire			Pcufh7;
+	wire			Vcufh7;
+	wire			Bdufh7;
+	wire			Hdufh7;
+	wire			Ndufh7;
+	wire			Tdufh7;
+	wire			Zdufh7;
+	wire			Feufh7;
+	wire			Leufh7;
+	wire			Reufh7;
+	wire			Xeufh7;
+	wire			Dfufh7;
+	wire			Jfufh7;
+	wire			Pfufh7;
+	wire			Vfufh7;
+	wire			Bgufh7;
+	wire			Hgufh7;
+	wire			Ngufh7;
+	wire			Tgufh7;
+	wire			Zgufh7;
+	wire			Fhufh7;
+	wire			Lhufh7;
+	wire			Rhufh7;
+	wire			Xhufh7;
+	wire			Diufh7;
+	wire			Jiufh7;
+	wire			Piufh7;
+	wire			Viufh7;
+	wire			Bjufh7;
+	wire			Hjufh7;
+	wire			Njufh7;
+	wire			Tjufh7;
+	wire			Zjufh7;
+	wire			Fkufh7;
+	wire			Lkufh7;
+	wire			Rkufh7;
+	wire			Xkufh7;
+	wire			Dlufh7;
+	wire			Jlufh7;
+	wire			Plufh7;
+	wire			Vlufh7;
+	wire			Bmufh7;
+	wire			Hmufh7;
+	wire			Nmufh7;
+	wire			Tmufh7;
+	wire			Zmufh7;
+	wire			Fnufh7;
+	wire			Lnufh7;
+	wire			Rnufh7;
+	wire			Xnufh7;
+	wire			Doufh7;
+	wire			Joufh7;
+	wire			Poufh7;
+	wire			Voufh7;
+	wire			Bpufh7;
+	wire			Hpufh7;
+	wire			Npufh7;
+	wire			Tpufh7;
+	wire			Zpufh7;
+	wire			Fqufh7;
+	wire			Lqufh7;
+	wire			Rqufh7;
+	wire			Xqufh7;
+	wire			Drufh7;
+	wire			Jrufh7;
+	wire			Prufh7;
+	wire			Vrufh7;
+	wire			Bsufh7;
+	wire			Hsufh7;
+	wire			Nsufh7;
+	wire			Tsufh7;
+	wire			Zsufh7;
+	wire			Ftufh7;
+	wire			Ltufh7;
+	wire			Rtufh7;
+	wire			Xtufh7;
+	wire			Duufh7;
+	wire			Juufh7;
+	wire			Puufh7;
+	wire			Vuufh7;
+	wire			Bvufh7;
+	wire			Hvufh7;
+	wire			Nvufh7;
+	wire			Tvufh7;
+	wire			Zvufh7;
+	wire			Fwufh7;
+	wire			Lwufh7;
+	wire			Rwufh7;
+	wire			Xwufh7;
+	wire			Dxufh7;
+	wire			Jxufh7;
+	wire			Pxufh7;
+	wire			Vxufh7;
+	wire			Byufh7;
+	wire			Hyufh7;
+	wire			Nyufh7;
+	wire			Tyufh7;
+	wire			Zyufh7;
+	wire			Fzufh7;
+	wire			Lzufh7;
+	wire			Rzufh7;
+	wire			Xzufh7;
+	wire			D0vfh7;
+	wire			J0vfh7;
+	wire			P0vfh7;
+	wire			V0vfh7;
+	wire			B1vfh7;
+	wire			H1vfh7;
+	wire			N1vfh7;
+	wire			T1vfh7;
+	wire			Z1vfh7;
+	wire			F2vfh7;
+	wire			L2vfh7;
+	wire			R2vfh7;
+	wire			X2vfh7;
+	wire			D3vfh7;
+	wire			J3vfh7;
+	wire			P3vfh7;
+	wire			V3vfh7;
+	wire			B4vfh7;
+	wire			H4vfh7;
+	wire			N4vfh7;
+	wire			T4vfh7;
+	wire			Z4vfh7;
+	wire			F5vfh7;
+	wire			L5vfh7;
+	wire			R5vfh7;
+	wire			X5vfh7;
+	wire			D6vfh7;
+	wire			J6vfh7;
+	wire			P6vfh7;
+	wire			V6vfh7;
+	wire			B7vfh7;
+	wire			H7vfh7;
+	wire			N7vfh7;
+	wire			T7vfh7;
+	wire			Z7vfh7;
+	wire			F8vfh7;
+	wire			L8vfh7;
+	wire			R8vfh7;
+	wire			X8vfh7;
+	wire			D9vfh7;
+	wire			J9vfh7;
+	wire			P9vfh7;
+	wire			V9vfh7;
+	wire			Bavfh7;
+	wire			Havfh7;
+	wire			Navfh7;
+	wire			Tavfh7;
+	wire			Zavfh7;
+	wire			Fbvfh7;
+	wire			Lbvfh7;
+	wire			Rbvfh7;
+	wire			Xbvfh7;
+	wire			Dcvfh7;
+	wire			Jcvfh7;
+	wire			Pcvfh7;
+	wire			Vcvfh7;
+	wire			Bdvfh7;
+	wire			Hdvfh7;
+	wire			Ndvfh7;
+	wire			Tdvfh7;
+	wire			Zdvfh7;
+	wire			Fevfh7;
+	wire			Levfh7;
+	wire			Revfh7;
+	wire			Xevfh7;
+	wire			Dfvfh7;
+	wire			Jfvfh7;
+	wire			Pfvfh7;
+	wire			Vfvfh7;
+	wire			Bgvfh7;
+	wire			Hgvfh7;
+	wire			Ngvfh7;
+	wire			Tgvfh7;
+	wire			Zgvfh7;
+	wire			Fhvfh7;
+	wire			Lhvfh7;
+	wire			Rhvfh7;
+	wire			Xhvfh7;
+	wire			Divfh7;
+	wire			Jivfh7;
+	wire			Pivfh7;
+	wire			Vivfh7;
+	wire			Bjvfh7;
+	wire			Hjvfh7;
+	wire			Njvfh7;
+	wire			Tjvfh7;
+	wire			Zjvfh7;
+	wire			Fkvfh7;
+	wire			Lkvfh7;
+	wire			Rkvfh7;
+	wire			Xkvfh7;
+	wire			Dlvfh7;
+	wire			Jlvfh7;
+	wire			Plvfh7;
+	wire			Vlvfh7;
+	wire			Bmvfh7;
+	wire			Hmvfh7;
+	wire			Nmvfh7;
+	wire			Tmvfh7;
+	wire			Zmvfh7;
+	wire			Fnvfh7;
+	wire			Lnvfh7;
+	wire			Rnvfh7;
+	wire			Xnvfh7;
+	wire			Dovfh7;
+	wire			Jovfh7;
+	wire			Povfh7;
+	wire			Vovfh7;
+	wire			Bpvfh7;
+	wire			Hpvfh7;
+	wire			Npvfh7;
+	wire			Tpvfh7;
+	wire			Zpvfh7;
+	wire			Fqvfh7;
+	wire			Lqvfh7;
+	wire			Rqvfh7;
+	wire			Xqvfh7;
+	wire			Drvfh7;
+	wire			Jrvfh7;
+	wire			Prvfh7;
+	wire			Vrvfh7;
+	wire			Bsvfh7;
+	wire			Hsvfh7;
+	wire			Nsvfh7;
+	wire			Tsvfh7;
+	wire			Zsvfh7;
+	wire			Ftvfh7;
+	wire			Ltvfh7;
+	wire			Rtvfh7;
+	wire			Xtvfh7;
+	wire			Duvfh7;
+	wire			Juvfh7;
+	wire			Puvfh7;
+	wire			Vuvfh7;
+	wire			Bvvfh7;
+	wire			Hvvfh7;
+	wire			Nvvfh7;
+	wire			Tvvfh7;
+	wire			Zvvfh7;
+	wire			Fwvfh7;
+	wire			Lwvfh7;
+	wire			Rwvfh7;
+	wire			Xwvfh7;
+	wire			Dxvfh7;
+	wire			Jxvfh7;
+	wire			Pxvfh7;
+	wire			Vxvfh7;
+	wire			Byvfh7;
+	wire			Hyvfh7;
+	wire			Nyvfh7;
+	wire			Tyvfh7;
+	wire			Zyvfh7;
+	wire			Fzvfh7;
+	wire			Lzvfh7;
+	wire			Rzvfh7;
+	wire			Xzvfh7;
+	wire			D0wfh7;
+	wire			J0wfh7;
+	wire			P0wfh7;
+	wire			V0wfh7;
+	wire			B1wfh7;
+	wire			H1wfh7;
+	wire			N1wfh7;
+	wire			T1wfh7;
+	wire			Z1wfh7;
+	wire			F2wfh7;
+	wire			L2wfh7;
+	wire			R2wfh7;
+	wire			X2wfh7;
+	wire			D3wfh7;
+	wire			J3wfh7;
+	wire			P3wfh7;
+	wire			V3wfh7;
+	wire			B4wfh7;
+	wire			H4wfh7;
+	wire			N4wfh7;
+	wire			T4wfh7;
+	wire			Z4wfh7;
+	wire			F5wfh7;
+	wire			L5wfh7;
+	wire			R5wfh7;
+	wire			X5wfh7;
+	wire			D6wfh7;
+	wire			J6wfh7;
+	wire			P6wfh7;
+	wire			V6wfh7;
+	wire			B7wfh7;
+	wire			H7wfh7;
+	wire			N7wfh7;
+	wire			T7wfh7;
+	wire			Z7wfh7;
+	wire			F8wfh7;
+	wire			L8wfh7;
+	wire			R8wfh7;
+	wire			X8wfh7;
+	wire			D9wfh7;
+	wire			J9wfh7;
+	wire			P9wfh7;
+	wire			V9wfh7;
+	wire			Bawfh7;
+	wire			Hawfh7;
+	wire			Nawfh7;
+	wire			Tawfh7;
+	wire			Zawfh7;
+	wire			Fbwfh7;
+	wire			Lbwfh7;
+	wire			Rbwfh7;
+	wire			Xbwfh7;
+	wire			Dcwfh7;
+	wire			Jcwfh7;
+	wire			Pcwfh7;
+	wire			Vcwfh7;
+	wire			Bdwfh7;
+	wire			Hdwfh7;
+	wire			Ndwfh7;
+	wire			Tdwfh7;
+	wire			Zdwfh7;
+	wire			Fewfh7;
+	wire			Lewfh7;
+	wire			Rewfh7;
+	wire			Xewfh7;
+	wire			Dfwfh7;
+	wire			Jfwfh7;
+	wire			Pfwfh7;
+	wire			Vfwfh7;
+	wire			Bgwfh7;
+	wire			Hgwfh7;
+	wire			Ngwfh7;
+	wire			Tgwfh7;
+	wire			Zgwfh7;
+	wire			Fhwfh7;
+	wire			Lhwfh7;
+	wire			Rhwfh7;
+	wire			Xhwfh7;
+	wire			Diwfh7;
+	wire			Jiwfh7;
+	wire			Piwfh7;
+	wire			Viwfh7;
+	wire			Bjwfh7;
+	wire			Hjwfh7;
+	wire			Njwfh7;
+	wire			Tjwfh7;
+	wire			Zjwfh7;
+	wire			Fkwfh7;
+	wire			Lkwfh7;
+	wire			Rkwfh7;
+	wire			Xkwfh7;
+	wire			Dlwfh7;
+	wire			Jlwfh7;
+	wire			Plwfh7;
+	wire			Vlwfh7;
+	wire			Bmwfh7;
+	wire			Hmwfh7;
+	wire			Nmwfh7;
+	wire			Tmwfh7;
+	wire			Zmwfh7;
+	wire			Fnwfh7;
+	wire			Lnwfh7;
+	wire			Rnwfh7;
+	wire			Xnwfh7;
+	wire			Dowfh7;
+	wire			Jowfh7;
+	wire			Powfh7;
+	wire			Vowfh7;
+	wire			Bpwfh7;
+	wire			Hpwfh7;
+	wire			Npwfh7;
+	wire			Tpwfh7;
+	wire			Zpwfh7;
+	wire			Fqwfh7;
+	wire			Lqwfh7;
+	wire			Rqwfh7;
+	wire			Xqwfh7;
+	wire			Drwfh7;
+	wire			Jrwfh7;
+	wire			Prwfh7;
+	wire			Vrwfh7;
+	wire			Bswfh7;
+	wire			Hswfh7;
+	wire			Nswfh7;
+	wire			Tswfh7;
+	wire			Zswfh7;
+	wire			Ftwfh7;
+	wire			Ltwfh7;
+	wire			Rtwfh7;
+	wire			Xtwfh7;
+	wire			Duwfh7;
+	wire			Juwfh7;
+	wire			Puwfh7;
+	wire			Vuwfh7;
+	wire			Bvwfh7;
+	wire			Hvwfh7;
+	wire			Nvwfh7;
+	wire			Tvwfh7;
+	wire			Zvwfh7;
+	wire			Fwwfh7;
+	wire			Lwwfh7;
+	wire			Rwwfh7;
+	wire			Xwwfh7;
+	wire			Dxwfh7;
+	wire			Jxwfh7;
+	wire			Pxwfh7;
+	wire			Vxwfh7;
+	wire			Bywfh7;
+	wire			Hywfh7;
+	wire			Nywfh7;
+	wire			Tywfh7;
+	wire			Zywfh7;
+	wire			Fzwfh7;
+	wire			Lzwfh7;
+	wire			Rzwfh7;
+	wire			Xzwfh7;
+	wire			D0xfh7;
+	wire			J0xfh7;
+	wire			P0xfh7;
+	wire			V0xfh7;
+	wire			B1xfh7;
+	wire			H1xfh7;
+	wire			N1xfh7;
+	wire			T1xfh7;
+	wire			Z1xfh7;
+	wire			F2xfh7;
+	wire			L2xfh7;
+	wire			R2xfh7;
+	wire			X2xfh7;
+	wire			D3xfh7;
+	wire			J3xfh7;
+	wire			P3xfh7;
+	wire			V3xfh7;
+	wire			B4xfh7;
+	wire			H4xfh7;
+	wire			N4xfh7;
+	wire			T4xfh7;
+	wire			Z4xfh7;
+	wire			F5xfh7;
+	wire			L5xfh7;
+	wire			R5xfh7;
+	wire			X5xfh7;
+	wire			D6xfh7;
+	wire			J6xfh7;
+	wire			P6xfh7;
+	wire			V6xfh7;
+	wire			B7xfh7;
+	wire			H7xfh7;
+	wire			N7xfh7;
+	wire			T7xfh7;
+	wire			Z7xfh7;
+	wire			F8xfh7;
+	wire			L8xfh7;
+	wire			R8xfh7;
+	wire			X8xfh7;
+	wire			D9xfh7;
+	wire			J9xfh7;
+	wire			P9xfh7;
+	wire			V9xfh7;
+	wire			Baxfh7;
+	wire			Haxfh7;
+	wire			Naxfh7;
+	wire			Taxfh7;
+	wire			Zaxfh7;
+	wire			Fbxfh7;
+	wire			Lbxfh7;
+	wire			Rbxfh7;
+	wire			Xbxfh7;
+	wire			Dcxfh7;
+	wire			Jcxfh7;
+	wire			Pcxfh7;
+	wire			Vcxfh7;
+	wire			Bdxfh7;
+	wire			Hdxfh7;
+	wire			Ndxfh7;
+	wire			Tdxfh7;
+	wire			Zdxfh7;
+	wire			Fexfh7;
+	wire			Lexfh7;
+	wire			Rexfh7;
+	wire			Xexfh7;
+	wire			Dfxfh7;
+	wire			Jfxfh7;
+	wire			Pfxfh7;
+	wire			Vfxfh7;
+	wire			Bgxfh7;
+	wire			Hgxfh7;
+	wire			Ngxfh7;
+	wire			Tgxfh7;
+	wire			Zgxfh7;
+	wire			Fhxfh7;
+	wire			Lhxfh7;
+	wire			Rhxfh7;
+	wire			Xhxfh7;
+	wire			Dixfh7;
+	wire			Jixfh7;
+	wire			Pixfh7;
+	wire			Vixfh7;
+	wire			Bjxfh7;
+	wire			Hjxfh7;
+	wire			Njxfh7;
+	wire			Tjxfh7;
+	wire			Zjxfh7;
+	wire			Fkxfh7;
+	wire			Lkxfh7;
+	wire			Rkxfh7;
+	wire			Xkxfh7;
+	wire			Dlxfh7;
+	wire			Jlxfh7;
+	wire			Plxfh7;
+	wire			Vlxfh7;
+	wire			Bmxfh7;
+	wire			Hmxfh7;
+	wire			Nmxfh7;
+	wire			Tmxfh7;
+	wire			Zmxfh7;
+	wire			Fnxfh7;
+	wire			Lnxfh7;
+	wire			Rnxfh7;
+	wire			Xnxfh7;
+	wire			Doxfh7;
+	wire			Joxfh7;
+	wire			Poxfh7;
+	wire			Voxfh7;
+	wire			Bpxfh7;
+	wire			Hpxfh7;
+	wire			Npxfh7;
+	wire			Tpxfh7;
+	wire			Zpxfh7;
+	wire			Fqxfh7;
+	wire			Lqxfh7;
+	wire			Rqxfh7;
+	wire			Xqxfh7;
+	wire			Drxfh7;
+	wire			Jrxfh7;
+	wire			Prxfh7;
+	wire			Vrxfh7;
+	wire			Bsxfh7;
+	wire			Hsxfh7;
+	wire			Nsxfh7;
+	wire			Tsxfh7;
+	wire			Zsxfh7;
+	wire			Ftxfh7;
+	wire			Ltxfh7;
+	wire			Rtxfh7;
+	wire			Xtxfh7;
+	wire			Duxfh7;
+	wire			Juxfh7;
+	wire			Puxfh7;
+	wire			Vuxfh7;
+	wire			Bvxfh7;
+	wire			Hvxfh7;
+	wire			Nvxfh7;
+	wire			Tvxfh7;
+	wire			Zvxfh7;
+	wire			Fwxfh7;
+	wire			Lwxfh7;
+	wire			Rwxfh7;
+	wire			Xwxfh7;
+	wire			Dxxfh7;
+	wire			Jxxfh7;
+	wire			Pxxfh7;
+	wire			Vxxfh7;
+	wire			Byxfh7;
+	wire			Hyxfh7;
+	wire			Nyxfh7;
+	wire			Tyxfh7;
+	wire			Zyxfh7;
+	wire			Fzxfh7;
+	wire			Lzxfh7;
+	wire			Rzxfh7;
+	wire			Xzxfh7;
+	wire			D0yfh7;
+	wire			J0yfh7;
+	wire			P0yfh7;
+	wire			V0yfh7;
+	wire			B1yfh7;
+	wire			H1yfh7;
+	wire			N1yfh7;
+	wire			T1yfh7;
+	wire			Z1yfh7;
+	wire			F2yfh7;
+	wire			L2yfh7;
+	wire			R2yfh7;
+	wire			X2yfh7;
+	wire			D3yfh7;
+	wire			J3yfh7;
+	wire			P3yfh7;
+	wire			V3yfh7;
+	wire			B4yfh7;
+	wire			H4yfh7;
+	wire			N4yfh7;
+	wire			T4yfh7;
+	wire			Z4yfh7;
+	wire			F5yfh7;
+	wire			L5yfh7;
+	wire			R5yfh7;
+	wire			X5yfh7;
+	wire			D6yfh7;
+	wire			J6yfh7;
+	wire			P6yfh7;
+	wire			V6yfh7;
+	wire			B7yfh7;
+	wire			H7yfh7;
+	wire			N7yfh7;
+	wire			T7yfh7;
+	wire			Z7yfh7;
+	wire			F8yfh7;
+	wire			L8yfh7;
+	wire			R8yfh7;
+	wire			X8yfh7;
+	wire			D9yfh7;
+	wire			J9yfh7;
+	wire			P9yfh7;
+	wire			V9yfh7;
+	wire			Bayfh7;
+	wire			Hayfh7;
+	wire			Nayfh7;
+	wire			Tayfh7;
+	wire			Zayfh7;
+	wire			Fbyfh7;
+	wire			Lbyfh7;
+	wire			Rbyfh7;
+	wire			Xbyfh7;
+	wire			Dcyfh7;
+	wire			Jcyfh7;
+	wire			Pcyfh7;
+	wire			Vcyfh7;
+	wire			Bdyfh7;
+	wire			Hdyfh7;
+	wire			Ndyfh7;
+	wire			Tdyfh7;
+	wire			Zdyfh7;
+	wire			Feyfh7;
+	wire			Leyfh7;
+	wire			Reyfh7;
+	wire			Xeyfh7;
+	wire			Dfyfh7;
+	wire			Jfyfh7;
+	wire			Pfyfh7;
+	wire			Vfyfh7;
+	wire			Bgyfh7;
+	wire			Hgyfh7;
+	wire			Ngyfh7;
+	wire			Tgyfh7;
+	wire			Zgyfh7;
+	wire			Fhyfh7;
+	wire			Lhyfh7;
+	wire			Rhyfh7;
+	wire			Xhyfh7;
+	wire			Diyfh7;
+	wire			Jiyfh7;
+	wire			Piyfh7;
+	wire			Viyfh7;
+	wire			Bjyfh7;
+	wire			Hjyfh7;
+	wire			Njyfh7;
+	wire			Tjyfh7;
+	wire			Zjyfh7;
+	wire			Fkyfh7;
+	wire			Lkyfh7;
+	wire			Rkyfh7;
+	wire			Xkyfh7;
+	wire			Dlyfh7;
+	wire			Jlyfh7;
+	wire			Plyfh7;
+	wire			Vlyfh7;
+	wire			Bmyfh7;
+	wire			Hmyfh7;
+	wire			Nmyfh7;
+	wire			Tmyfh7;
+	wire			Zmyfh7;
+	wire			Fnyfh7;
+	wire			Lnyfh7;
+	wire			Rnyfh7;
+	wire			Xnyfh7;
+	wire			Doyfh7;
+	wire			Joyfh7;
+	wire			Poyfh7;
+	wire			Voyfh7;
+	wire			Bpyfh7;
+	wire			Hpyfh7;
+	wire			Npyfh7;
+	wire			Tpyfh7;
+	wire			Zpyfh7;
+	wire			Fqyfh7;
+	wire			Lqyfh7;
+	wire			Rqyfh7;
+	wire			Xqyfh7;
+	wire			Dryfh7;
+	wire			Jryfh7;
+	wire			Pryfh7;
+	wire			Vryfh7;
+	wire			Bsyfh7;
+	wire			Hsyfh7;
+	wire			Nsyfh7;
+	wire			Tsyfh7;
+	wire			Zsyfh7;
+	wire			Ftyfh7;
+	wire			Ltyfh7;
+	wire			Rtyfh7;
+	wire			Xtyfh7;
+	wire			Duyfh7;
+	wire			Juyfh7;
+	wire			Puyfh7;
+	wire			Vuyfh7;
+	wire			Bvyfh7;
+	wire			Hvyfh7;
+	wire			Nvyfh7;
+	wire			Tvyfh7;
+	wire			Zvyfh7;
+	wire			Fwyfh7;
+	wire			Lwyfh7;
+	wire			Rwyfh7;
+	wire			Xwyfh7;
+	wire			Dxyfh7;
+	wire			Jxyfh7;
+	wire			Pxyfh7;
+	wire			Vxyfh7;
+	wire			Byyfh7;
+	wire			Hyyfh7;
+	wire			Nyyfh7;
+	wire			Tyyfh7;
+	wire			Zyyfh7;
+	wire			Fzyfh7;
+	wire			Lzyfh7;
+	wire			Rzyfh7;
+	wire			Xzyfh7;
+	wire			D0zfh7;
+	wire			J0zfh7;
+	wire			P0zfh7;
+	wire			V0zfh7;
+	wire			B1zfh7;
+	wire			H1zfh7;
+	wire			N1zfh7;
+	wire			T1zfh7;
+	wire			Z1zfh7;
+	wire			F2zfh7;
+	wire			L2zfh7;
+	wire			R2zfh7;
+	wire			X2zfh7;
+	wire			D3zfh7;
+	wire			J3zfh7;
+	wire			P3zfh7;
+	wire			V3zfh7;
+	wire			B4zfh7;
+	wire			H4zfh7;
+	wire			N4zfh7;
+	wire			T4zfh7;
+	wire			Z4zfh7;
+	wire			F5zfh7;
+	wire			L5zfh7;
+	wire			R5zfh7;
+	wire			X5zfh7;
+	wire			D6zfh7;
+	wire			J6zfh7;
+	wire			P6zfh7;
+	wire			V6zfh7;
+	wire			B7zfh7;
+	wire			H7zfh7;
+	wire			N7zfh7;
+	wire			T7zfh7;
+	wire			Z7zfh7;
+	wire			F8zfh7;
+	wire			L8zfh7;
+	wire			R8zfh7;
+	wire			X8zfh7;
+	wire			D9zfh7;
+	wire			J9zfh7;
+	wire			P9zfh7;
+	wire			V9zfh7;
+	wire			Bazfh7;
+	wire			Hazfh7;
+	wire			Nazfh7;
+	wire			Tazfh7;
+	wire			Zazfh7;
+	wire			Fbzfh7;
+	wire			Lbzfh7;
+	wire			Rbzfh7;
+	wire			Xbzfh7;
+	wire			Dczfh7;
+	wire			Jczfh7;
+	wire			Pczfh7;
+	wire			Vczfh7;
+	wire			Bdzfh7;
+	wire			Hdzfh7;
+	wire			Ndzfh7;
+	wire			Tdzfh7;
+	wire			Zdzfh7;
+	wire			Fezfh7;
+	wire			Lezfh7;
+	wire			Rezfh7;
+	wire			Xezfh7;
+	wire			Dfzfh7;
+	wire			Jfzfh7;
+	wire			Pfzfh7;
+	wire			Vfzfh7;
+	wire			Bgzfh7;
+	wire			Hgzfh7;
+	wire			Ngzfh7;
+	wire			Tgzfh7;
+	wire			Zgzfh7;
+	wire			Fhzfh7;
+	wire			Lhzfh7;
+	wire			Rhzfh7;
+	wire			Xhzfh7;
+	wire			Dizfh7;
+	wire			Jizfh7;
+	wire			Pizfh7;
+	wire			Vizfh7;
+	wire			Bjzfh7;
+	wire			Hjzfh7;
+	wire			Njzfh7;
+	wire			Tjzfh7;
+	wire			Zjzfh7;
+	wire			Fkzfh7;
+	wire			Lkzfh7;
+	wire			Rkzfh7;
+	wire			Xkzfh7;
+	wire			Dlzfh7;
+	wire			Jlzfh7;
+	wire			Plzfh7;
+	wire			Vlzfh7;
+	wire			Bmzfh7;
+	wire			Hmzfh7;
+	wire			Nmzfh7;
+	wire			Tmzfh7;
+	wire			Zmzfh7;
+	wire			Fnzfh7;
+	wire			Lnzfh7;
+	wire			Rnzfh7;
+	wire			Xnzfh7;
+	wire			Dozfh7;
+	wire			Jozfh7;
+	wire			Pozfh7;
+	wire			Vozfh7;
+	wire			Bpzfh7;
+	wire			Hpzfh7;
+	wire			Npzfh7;
+	wire			Tpzfh7;
+	wire			Zpzfh7;
+	wire			Fqzfh7;
+	wire			Lqzfh7;
+	wire			Rqzfh7;
+	wire			Xqzfh7;
+	wire			Drzfh7;
+	wire			Jrzfh7;
+	wire			Przfh7;
+	wire			Vrzfh7;
+	wire			Bszfh7;
+	wire			Hszfh7;
+	wire			Nszfh7;
+	wire			Tszfh7;
+	wire			Zszfh7;
+	wire			Ftzfh7;
+	wire			Ltzfh7;
+	wire			Rtzfh7;
+	wire			Xtzfh7;
+	wire			Duzfh7;
+	wire			Juzfh7;
+	wire			Puzfh7;
+	wire			Vuzfh7;
+	wire			Bvzfh7;
+	wire			Hvzfh7;
+	wire			Nvzfh7;
+	wire			Tvzfh7;
+	wire			Zvzfh7;
+	wire			Fwzfh7;
+	wire			Lwzfh7;
+	wire			Rwzfh7;
+	wire			Xwzfh7;
+	wire			Dxzfh7;
+	wire			Jxzfh7;
+	wire			Pxzfh7;
+	wire			Vxzfh7;
+	wire			Byzfh7;
+	wire			Hyzfh7;
+	wire			Nyzfh7;
+	wire			Tyzfh7;
+	wire			Zyzfh7;
+	wire			Fzzfh7;
+	wire			Lzzfh7;
+	wire			Rzzfh7;
+	wire			Xzzfh7;
+	wire			D00gh7;
+	wire			J00gh7;
+	wire			P00gh7;
+	wire			V00gh7;
+	wire			B10gh7;
+	wire			H10gh7;
+	wire			N10gh7;
+	wire			T10gh7;
+	wire			Z10gh7;
+	wire			F20gh7;
+	wire			L20gh7;
+	wire			R20gh7;
+	wire			X20gh7;
+	wire			D30gh7;
+	wire			J30gh7;
+	wire			P30gh7;
+	wire			V30gh7;
+	wire			B40gh7;
+	wire			H40gh7;
+	wire			N40gh7;
+	wire			T40gh7;
+	wire			Z40gh7;
+	wire			F50gh7;
+	wire			L50gh7;
+	wire			R50gh7;
+	wire			X50gh7;
+	wire			D60gh7;
+	wire			J60gh7;
+	wire			P60gh7;
+	wire			V60gh7;
+	wire			B70gh7;
+	wire			H70gh7;
+	wire			N70gh7;
+	wire			T70gh7;
+	wire			Z70gh7;
+	wire			F80gh7;
+	wire			L80gh7;
+	wire			R80gh7;
+	wire			X80gh7;
+	wire			D90gh7;
+	wire			J90gh7;
+	wire			P90gh7;
+	wire			V90gh7;
+	wire			Ba0gh7;
+	wire			Ha0gh7;
+	wire			Na0gh7;
+	wire			Ta0gh7;
+	wire			Za0gh7;
+	wire			Fb0gh7;
+	wire			Lb0gh7;
+	wire			Rb0gh7;
+	wire			Xb0gh7;
+	wire			Dc0gh7;
+	wire			Jc0gh7;
+	wire			Pc0gh7;
+	wire			Vc0gh7;
+	wire			Bd0gh7;
+	wire			Hd0gh7;
+	wire			Nd0gh7;
+	wire			Td0gh7;
+	wire			Zd0gh7;
+	wire			Fe0gh7;
+	wire			Le0gh7;
+	wire			Re0gh7;
+	wire			Xe0gh7;
+	wire			Df0gh7;
+	wire			Jf0gh7;
+	wire			Pf0gh7;
+	wire			Vf0gh7;
+	wire			Bg0gh7;
+	wire			Hg0gh7;
+	wire			Ng0gh7;
+	wire			Tg0gh7;
+	wire			Zg0gh7;
+	wire			Fh0gh7;
+	wire			Lh0gh7;
+	wire			Rh0gh7;
+	wire			Xh0gh7;
+	wire			Di0gh7;
+	wire			Ji0gh7;
+	wire			Pi0gh7;
+	wire			Vi0gh7;
+	wire			Bj0gh7;
+	wire			Hj0gh7;
+	wire			Nj0gh7;
+	wire			Tj0gh7;
+	wire			Zj0gh7;
+	wire			Fk0gh7;
+	wire			Lk0gh7;
+	wire			Rk0gh7;
+	wire			Xk0gh7;
+	wire			Dl0gh7;
+	wire			Jl0gh7;
+	wire			Pl0gh7;
+	wire			Vl0gh7;
+	wire			Bm0gh7;
+	wire			Hm0gh7;
+	wire			Nm0gh7;
+	wire			Tm0gh7;
+	wire			Zm0gh7;
+	wire			Fn0gh7;
+	wire			Ln0gh7;
+	wire			Rn0gh7;
+	wire			Xn0gh7;
+	wire			Do0gh7;
+	wire			Jo0gh7;
+	wire			Po0gh7;
+	wire			Vo0gh7;
+	wire			Bp0gh7;
+	wire			Hp0gh7;
+	wire			Np0gh7;
+	wire			Tp0gh7;
+	wire			Zp0gh7;
+	wire			Fq0gh7;
+	wire			Lq0gh7;
+	wire			Rq0gh7;
+	wire			Xq0gh7;
+	wire			Dr0gh7;
+	wire			Jr0gh7;
+	wire			Pr0gh7;
+	wire			Vr0gh7;
+	wire			Bs0gh7;
+	wire			Hs0gh7;
+	wire			Ns0gh7;
+	wire			Ts0gh7;
+	wire			Zs0gh7;
+	wire			Ft0gh7;
+	wire			Lt0gh7;
+	wire			Rt0gh7;
+	wire			Xt0gh7;
+	wire			Du0gh7;
+	wire			Ju0gh7;
+	wire			Pu0gh7;
+	wire			Vu0gh7;
+	wire			Bv0gh7;
+	wire			Hv0gh7;
+	wire			Nv0gh7;
+	wire			Tv0gh7;
+	wire			Zv0gh7;
+	wire			Fw0gh7;
+	wire			Lw0gh7;
+	wire			Rw0gh7;
+	wire			Xw0gh7;
+	wire			Dx0gh7;
+	wire			Jx0gh7;
+	wire			Px0gh7;
+	wire			Vx0gh7;
+	wire			By0gh7;
+	wire			Hy0gh7;
+	wire			Ny0gh7;
+	wire			Ty0gh7;
+	wire			Zy0gh7;
+	wire			Fz0gh7;
+	wire			Lz0gh7;
+	wire			Rz0gh7;
+	wire			Xz0gh7;
+	wire			D01gh7;
+	wire			J01gh7;
+	wire			P01gh7;
+	wire			V01gh7;
+	wire			B11gh7;
+	wire			H11gh7;
+	wire			N11gh7;
+	wire			T11gh7;
+	wire			Z11gh7;
+	wire			F21gh7;
+	wire			L21gh7;
+	wire			R21gh7;
+	wire			X21gh7;
+	wire			D31gh7;
+	wire			J31gh7;
+	wire			P31gh7;
+	wire			V31gh7;
+	wire			B41gh7;
+	wire			H41gh7;
+	wire			N41gh7;
+	wire			T41gh7;
+	wire			Z41gh7;
+	wire			F51gh7;
+	wire			L51gh7;
+	wire			R51gh7;
+	wire			X51gh7;
+	wire			D61gh7;
+	wire			J61gh7;
+	wire			P61gh7;
+	wire			V61gh7;
+	wire			B71gh7;
+	wire			H71gh7;
+	wire			N71gh7;
+	wire			T71gh7;
+	wire			Z71gh7;
+	wire			F81gh7;
+	wire			L81gh7;
+	wire			R81gh7;
+	wire			X81gh7;
+	wire			D91gh7;
+	wire			J91gh7;
+	wire			P91gh7;
+	wire			V91gh7;
+	wire			Ba1gh7;
+	wire			Ha1gh7;
+	wire			Na1gh7;
+	wire			Ta1gh7;
+	wire			Za1gh7;
+	wire			Fb1gh7;
+	wire			Lb1gh7;
+	wire			Rb1gh7;
+	wire			Xb1gh7;
+	wire			Dc1gh7;
+	wire			Jc1gh7;
+	wire			Pc1gh7;
+	wire			Vc1gh7;
+	wire			Bd1gh7;
+	wire			Hd1gh7;
+	wire			Nd1gh7;
+	wire			Td1gh7;
+	wire			Zd1gh7;
+	wire			Fe1gh7;
+	wire			Le1gh7;
+	wire			Re1gh7;
+	wire			Xe1gh7;
+	wire			Df1gh7;
+	wire			Jf1gh7;
+	wire			Pf1gh7;
+	wire			Vf1gh7;
+	wire			Bg1gh7;
+	wire			Hg1gh7;
+	wire			Ng1gh7;
+	wire			Tg1gh7;
+	wire			Zg1gh7;
+	wire			Fh1gh7;
+	wire			Lh1gh7;
+	wire			Rh1gh7;
+	wire			Xh1gh7;
+	wire			Di1gh7;
+	wire			Ji1gh7;
+	wire			Pi1gh7;
+	wire			Vi1gh7;
+	wire			Bj1gh7;
+	wire			Hj1gh7;
+	wire			Nj1gh7;
+	wire			Tj1gh7;
+	wire			Zj1gh7;
+	wire			Fk1gh7;
+	wire			Lk1gh7;
+	wire			Rk1gh7;
+	wire			Xk1gh7;
+	wire			Dl1gh7;
+	wire			Jl1gh7;
+	wire			Pl1gh7;
+	wire			Vl1gh7;
+	wire			Bm1gh7;
+	wire			Hm1gh7;
+	wire			Nm1gh7;
+	wire			Tm1gh7;
+	wire			Zm1gh7;
+	wire			Fn1gh7;
+	wire			Ln1gh7;
+	wire			Rn1gh7;
+	wire			Xn1gh7;
+	wire			Do1gh7;
+	wire			Jo1gh7;
+	wire			Po1gh7;
+	wire			Vo1gh7;
+	wire			Bp1gh7;
+	wire			Hp1gh7;
+	wire			Np1gh7;
+	wire			Tp1gh7;
+	wire			Zp1gh7;
+	wire			Fq1gh7;
+	wire			Lq1gh7;
+	wire			Rq1gh7;
+	wire			Xq1gh7;
+	wire			Dr1gh7;
+	wire			Jr1gh7;
+	wire			Pr1gh7;
+	wire			Vr1gh7;
+	wire			Bs1gh7;
+	wire			Hs1gh7;
+	wire			Ns1gh7;
+	wire			Ts1gh7;
+	wire			Zs1gh7;
+	wire			Ft1gh7;
+	wire			Lt1gh7;
+	wire			Rt1gh7;
+	wire			Xt1gh7;
+	wire			Du1gh7;
+	wire			Ju1gh7;
+	wire			Pu1gh7;
+	wire			Vu1gh7;
+	wire			Bv1gh7;
+	wire			Hv1gh7;
+	wire			Nv1gh7;
+	wire			Tv1gh7;
+	wire			Zv1gh7;
+	wire			Fw1gh7;
+	wire			Lw1gh7;
+	wire			Rw1gh7;
+	wire			Xw1gh7;
+	wire			Dx1gh7;
+	wire			Jx1gh7;
+	wire			Px1gh7;
+	wire			Vx1gh7;
+	wire			By1gh7;
+	wire			Hy1gh7;
+	wire			Ny1gh7;
+	wire			Ty1gh7;
+	wire			Zy1gh7;
+	wire			Fz1gh7;
+	wire			Lz1gh7;
+	wire			Rz1gh7;
+	wire			Xz1gh7;
+	wire			D02gh7;
+	wire			J02gh7;
+	wire			P02gh7;
+	wire			V02gh7;
+	wire			B12gh7;
+	wire			H12gh7;
+	wire			N12gh7;
+	wire			T12gh7;
+	wire			Z12gh7;
+	wire			F22gh7;
+	wire			L22gh7;
+	wire			R22gh7;
+	wire			X22gh7;
+	wire			D32gh7;
+	wire			J32gh7;
+	wire			P32gh7;
+	wire			V32gh7;
+	wire			B42gh7;
+	wire			H42gh7;
+	wire			N42gh7;
+	wire			T42gh7;
+	wire			Z42gh7;
+	wire			F52gh7;
+	wire			L52gh7;
+	wire			R52gh7;
+	wire			X52gh7;
+	wire			D62gh7;
+	wire			J62gh7;
+	wire			P62gh7;
+	wire			V62gh7;
+	wire			B72gh7;
+	wire			H72gh7;
+	wire			N72gh7;
+	wire			T72gh7;
+	wire			Z72gh7;
+	wire			F82gh7;
+	wire			L82gh7;
+	wire			R82gh7;
+	wire			X82gh7;
+	wire			D92gh7;
+	wire			J92gh7;
+	wire			P92gh7;
+	wire			V92gh7;
+	wire			Ba2gh7;
+	wire			Ha2gh7;
+	wire			Na2gh7;
+	wire			Ta2gh7;
+	wire			Za2gh7;
+	wire			Fb2gh7;
+	wire			Lb2gh7;
+	wire			Rb2gh7;
+	wire			Xb2gh7;
+	wire			Dc2gh7;
+	wire			Jc2gh7;
+	wire			Pc2gh7;
+	wire			Vc2gh7;
+	wire			Bd2gh7;
+	wire			Hd2gh7;
+	wire			Nd2gh7;
+	wire			Td2gh7;
+	wire			Zd2gh7;
+	wire			Fe2gh7;
+	wire			Le2gh7;
+	wire			Re2gh7;
+	wire			Xe2gh7;
+	wire			Df2gh7;
+	wire			Jf2gh7;
+	wire			Pf2gh7;
+	wire			Vf2gh7;
+	wire			Bg2gh7;
+	wire			Hg2gh7;
+	wire			Ng2gh7;
+	wire			Tg2gh7;
+	wire			Zg2gh7;
+	wire			Fh2gh7;
+	wire			Lh2gh7;
+	wire			Rh2gh7;
+	wire			Xh2gh7;
+	wire			Di2gh7;
+	wire			Ji2gh7;
+	wire			Pi2gh7;
+	wire			Vi2gh7;
+	wire			Bj2gh7;
+	wire			Hj2gh7;
+	wire			Nj2gh7;
+	wire			Tj2gh7;
+	wire			Zj2gh7;
+	wire			Fk2gh7;
+	wire			Lk2gh7;
+	wire			Rk2gh7;
+	wire			Xk2gh7;
+	wire			Dl2gh7;
+	wire			Jl2gh7;
+	wire			Pl2gh7;
+	wire			Vl2gh7;
+	wire			Bm2gh7;
+	wire			Hm2gh7;
+	wire			Nm2gh7;
+	wire			Tm2gh7;
+	wire			Zm2gh7;
+	wire			Fn2gh7;
+	wire			Ln2gh7;
+	wire			Rn2gh7;
+	wire			Xn2gh7;
+	wire			Do2gh7;
+	wire			Jo2gh7;
+	wire			Po2gh7;
+	wire			Vo2gh7;
+	wire			Bp2gh7;
+	wire			Hp2gh7;
+	wire			Np2gh7;
+	wire			Tp2gh7;
+	wire			Zp2gh7;
+	wire			Fq2gh7;
+	wire			Lq2gh7;
+	wire			Rq2gh7;
+	wire			Xq2gh7;
+	wire			Dr2gh7;
+	wire			Jr2gh7;
+	wire			Pr2gh7;
+	wire			Vr2gh7;
+	wire			Bs2gh7;
+	wire			Hs2gh7;
+	wire			Ns2gh7;
+	wire			Ts2gh7;
+	wire			Zs2gh7;
+	wire			Ft2gh7;
+	wire			Lt2gh7;
+	wire			Rt2gh7;
+	wire			Xt2gh7;
+	wire			Du2gh7;
+	wire			Ju2gh7;
+	wire			Pu2gh7;
+	wire			Vu2gh7;
+	wire			Bv2gh7;
+	wire			Hv2gh7;
+	wire			Nv2gh7;
+	wire			Tv2gh7;
+	wire			Zv2gh7;
+	wire			Fw2gh7;
+	wire			Lw2gh7;
+	wire			Rw2gh7;
+	wire			Xw2gh7;
+	wire			Dx2gh7;
+	wire			Jx2gh7;
+	wire			Px2gh7;
+	wire			Vx2gh7;
+	wire			By2gh7;
+	wire			Hy2gh7;
+	wire			Ny2gh7;
+	wire			Ty2gh7;
+	wire			Zy2gh7;
+	wire			Fz2gh7;
+	wire			Lz2gh7;
+	wire			Rz2gh7;
+	wire			Xz2gh7;
+	wire			D03gh7;
+	wire			J03gh7;
+	wire			P03gh7;
+	wire			V03gh7;
+	wire			B13gh7;
+	wire			H13gh7;
+	wire			N13gh7;
+	wire			T13gh7;
+	wire			Z13gh7;
+	wire			F23gh7;
+	wire			L23gh7;
+	wire			R23gh7;
+	wire			X23gh7;
+	wire			D33gh7;
+	wire			J33gh7;
+	wire			P33gh7;
+	wire			V33gh7;
+	wire			B43gh7;
+	wire			H43gh7;
+	wire			N43gh7;
+	wire			T43gh7;
+	wire			Z43gh7;
+	wire			F53gh7;
+	wire			L53gh7;
+	wire			R53gh7;
+	wire			X53gh7;
+	wire			D63gh7;
+	wire			J63gh7;
+	wire			P63gh7;
+	wire			V63gh7;
+	wire			B73gh7;
+	wire			H73gh7;
+	wire			N73gh7;
+	wire			T73gh7;
+	wire			Z73gh7;
+	wire			F83gh7;
+	wire			L83gh7;
+	wire			R83gh7;
+	wire			X83gh7;
+	wire			D93gh7;
+	wire			J93gh7;
+	wire			P93gh7;
+	wire			V93gh7;
+	wire			Ba3gh7;
+	wire			Ha3gh7;
+	wire			Na3gh7;
+	wire			Ta3gh7;
+	wire			Za3gh7;
+	wire			Fb3gh7;
+	wire			Lb3gh7;
+	wire			Rb3gh7;
+	wire			Xb3gh7;
+	wire			Dc3gh7;
+	wire			Jc3gh7;
+	wire			Pc3gh7;
+	wire			Vc3gh7;
+	wire			Bd3gh7;
+	wire			Hd3gh7;
+	wire			Nd3gh7;
+	wire			Td3gh7;
+	wire			Zd3gh7;
+	wire			Fe3gh7;
+	wire			Le3gh7;
+	wire			Re3gh7;
+	wire			Xe3gh7;
+	wire			Df3gh7;
+	wire			Jf3gh7;
+	wire			Pf3gh7;
+	wire			Vf3gh7;
+	wire			Bg3gh7;
+	wire			Hg3gh7;
+	wire			Ng3gh7;
+	wire			Tg3gh7;
+	wire			Zg3gh7;
+	wire			Fh3gh7;
+	wire			Lh3gh7;
+	wire			Rh3gh7;
+	wire			Xh3gh7;
+	wire			Di3gh7;
+	wire			Ji3gh7;
+	wire			Pi3gh7;
+	wire			Vi3gh7;
+	wire			Bj3gh7;
+	wire			Hj3gh7;
+	wire			Nj3gh7;
+	wire			Tj3gh7;
+	wire			Zj3gh7;
+	wire			Fk3gh7;
+	wire			Lk3gh7;
+	wire			Rk3gh7;
+	wire			Xk3gh7;
+	wire			Dl3gh7;
+	wire			Jl3gh7;
+	wire			Pl3gh7;
+	wire			Vl3gh7;
+	wire			Bm3gh7;
+	wire			Hm3gh7;
+	wire			Nm3gh7;
+	wire			Tm3gh7;
+	wire			Zm3gh7;
+	wire			Fn3gh7;
+	wire			Ln3gh7;
+	wire			Rn3gh7;
+	wire			Xn3gh7;
+	wire			Do3gh7;
+	wire			Jo3gh7;
+	wire			Po3gh7;
+	wire			Vo3gh7;
+	wire			Bp3gh7;
+	wire			Hp3gh7;
+	wire			Np3gh7;
+	wire			Tp3gh7;
+	wire			Zp3gh7;
+	wire			Fq3gh7;
+	wire			Lq3gh7;
+	wire			Rq3gh7;
+	wire			Xq3gh7;
+	wire			Dr3gh7;
+	wire			Jr3gh7;
+	wire			Pr3gh7;
+	wire			Vr3gh7;
+	wire			Bs3gh7;
+	wire			Hs3gh7;
+	wire			Ns3gh7;
+	wire			Ts3gh7;
+	wire			Zs3gh7;
+	wire			Ft3gh7;
+	wire			Lt3gh7;
+	wire			Rt3gh7;
+	wire			Xt3gh7;
+	wire			Du3gh7;
+	wire			Ju3gh7;
+	wire			Pu3gh7;
+	wire			Vu3gh7;
+	wire			Bv3gh7;
+	wire			Hv3gh7;
+	wire			Nv3gh7;
+	wire			Tv3gh7;
+	wire			Zv3gh7;
+	wire			Fw3gh7;
+	wire			Lw3gh7;
+	wire			Rw3gh7;
+	wire			Xw3gh7;
+	wire			Dx3gh7;
+	wire			Jx3gh7;
+	wire			Px3gh7;
+	wire			Vx3gh7;
+	wire			By3gh7;
+	wire			Hy3gh7;
+	wire			Ny3gh7;
+	wire			Ty3gh7;
+	wire			Zy3gh7;
+	wire			Fz3gh7;
+	wire			Lz3gh7;
+	wire			Rz3gh7;
+	wire			Xz3gh7;
+	wire			D04gh7;
+	wire			J04gh7;
+	wire			P04gh7;
+	wire			V04gh7;
+	wire			B14gh7;
+	wire			H14gh7;
+	wire			N14gh7;
+	wire			T14gh7;
+	wire			Z14gh7;
+	wire			F24gh7;
+	wire			L24gh7;
+	wire			R24gh7;
+	wire			X24gh7;
+	wire			D34gh7;
+	wire			J34gh7;
+	wire			P34gh7;
+	wire			V34gh7;
+	wire			B44gh7;
+	wire			H44gh7;
+	wire			N44gh7;
+	wire			T44gh7;
+	wire			Z44gh7;
+	wire			F54gh7;
+	wire			L54gh7;
+	wire			R54gh7;
+	wire			X54gh7;
+	wire			D64gh7;
+	wire			J64gh7;
+	wire			P64gh7;
+	wire			V64gh7;
+	wire			B74gh7;
+	wire			H74gh7;
+	wire			N74gh7;
+	wire			T74gh7;
+	wire			Z74gh7;
+	wire			F84gh7;
+	wire			L84gh7;
+	wire			R84gh7;
+	wire			X84gh7;
+	wire			D94gh7;
+	wire			J94gh7;
+	wire			P94gh7;
+	wire			V94gh7;
+	wire			Ba4gh7;
+	wire			Ha4gh7;
+	wire			Na4gh7;
+	wire			Ta4gh7;
+	wire			Za4gh7;
+	wire			Fb4gh7;
+	wire			Lb4gh7;
+	wire			Rb4gh7;
+	wire			Xb4gh7;
+	wire			Dc4gh7;
+	wire			Jc4gh7;
+	wire			Pc4gh7;
+	wire			Vc4gh7;
+	wire			Bd4gh7;
+	wire			Hd4gh7;
+	wire			Nd4gh7;
+	wire			Td4gh7;
+	wire			Zd4gh7;
+	wire			Fe4gh7;
+	wire			Le4gh7;
+	wire			Re4gh7;
+	wire			Xe4gh7;
+	wire			Df4gh7;
+	wire			Jf4gh7;
+	wire			Pf4gh7;
+	wire			Vf4gh7;
+	wire			Bg4gh7;
+	wire			Hg4gh7;
+	wire			Ng4gh7;
+	wire			Tg4gh7;
+	wire			Zg4gh7;
+	wire			Fh4gh7;
+	wire			Lh4gh7;
+	wire			Rh4gh7;
+	wire			Xh4gh7;
+	wire			Di4gh7;
+	wire			Ji4gh7;
+	wire			Pi4gh7;
+	wire			Vi4gh7;
+	wire			Bj4gh7;
+	wire			Hj4gh7;
+	wire			Nj4gh7;
+	wire			Tj4gh7;
+	wire			Zj4gh7;
+	wire			Fk4gh7;
+	wire			Lk4gh7;
+	wire			Rk4gh7;
+	wire			Xk4gh7;
+	wire			Dl4gh7;
+	wire			Jl4gh7;
+	wire			Pl4gh7;
+	wire			Vl4gh7;
+	wire			Bm4gh7;
+	wire			Hm4gh7;
+	wire			Nm4gh7;
+	wire			Tm4gh7;
+	wire			Zm4gh7;
+	wire			Fn4gh7;
+	wire			Ln4gh7;
+	wire			Rn4gh7;
+	wire			Xn4gh7;
+	wire			Do4gh7;
+	wire			Jo4gh7;
+	wire			Po4gh7;
+	wire			Vo4gh7;
+	wire			Bp4gh7;
+	wire			Hp4gh7;
+	wire			Np4gh7;
+	wire			Tp4gh7;
+	wire			Zp4gh7;
+	wire			Fq4gh7;
+	wire			Lq4gh7;
+	wire			Rq4gh7;
+	wire			Xq4gh7;
+	wire			Dr4gh7;
+	wire			Jr4gh7;
+	wire			Pr4gh7;
+	wire			Vr4gh7;
+	wire			Bs4gh7;
+	wire			Hs4gh7;
+	wire			Ns4gh7;
+	wire			Ts4gh7;
+	wire			Zs4gh7;
+	wire			Ft4gh7;
+	wire			Lt4gh7;
+	wire			Rt4gh7;
+	wire			Xt4gh7;
+	wire			Du4gh7;
+	wire			Ju4gh7;
+	wire			Pu4gh7;
+	wire			Vu4gh7;
+	wire			Bv4gh7;
+	wire			Hv4gh7;
+	wire			Nv4gh7;
+	wire			Tv4gh7;
+	wire			Zv4gh7;
+	wire			Fw4gh7;
+	wire			Lw4gh7;
+	wire			Rw4gh7;
+	wire			Xw4gh7;
+	wire			Dx4gh7;
+	wire			Jx4gh7;
+	wire			Px4gh7;
+	wire			Vx4gh7;
+	wire			By4gh7;
+	wire			Hy4gh7;
+	wire			Ny4gh7;
+	wire			Ty4gh7;
+	wire			Zy4gh7;
+	wire			Fz4gh7;
+	wire			Lz4gh7;
+	wire			Rz4gh7;
+	wire			Xz4gh7;
+	wire			D05gh7;
+	wire			J05gh7;
+	wire			P05gh7;
+	wire			V05gh7;
+	wire			B15gh7;
+	wire			H15gh7;
+	wire			N15gh7;
+	wire			T15gh7;
+	wire			Z15gh7;
+	wire			F25gh7;
+	wire			L25gh7;
+	wire			R25gh7;
+	wire			X25gh7;
+	wire			D35gh7;
+	wire			J35gh7;
+	wire			P35gh7;
+	wire			V35gh7;
+	wire			B45gh7;
+	wire			H45gh7;
+	wire			N45gh7;
+	wire			T45gh7;
+	wire			Z45gh7;
+	wire			F55gh7;
+	wire			L55gh7;
+	wire			R55gh7;
+	wire			X55gh7;
+	wire			D65gh7;
+	wire			J65gh7;
+	wire			P65gh7;
+	wire			V65gh7;
+	wire			B75gh7;
+	wire			H75gh7;
+	wire			N75gh7;
+	wire			T75gh7;
+	wire			Z75gh7;
+	wire			F85gh7;
+	wire			L85gh7;
+	wire			R85gh7;
+	wire			X85gh7;
+	wire			D95gh7;
+	wire			J95gh7;
+	wire			P95gh7;
+	wire			V95gh7;
+	wire			Ba5gh7;
+	wire			Ha5gh7;
+	wire			Na5gh7;
+	wire			Ta5gh7;
+	wire			Za5gh7;
+	wire			Fb5gh7;
+	wire			Lb5gh7;
+	wire			Rb5gh7;
+	wire			Xb5gh7;
+	wire			Dc5gh7;
+	wire			Jc5gh7;
+	wire			Pc5gh7;
+	wire			Vc5gh7;
+	wire			Bd5gh7;
+	wire			Hd5gh7;
+	wire			Nd5gh7;
+	wire			Td5gh7;
+	wire			Zd5gh7;
+	wire			Fe5gh7;
+	wire			Le5gh7;
+	wire			Re5gh7;
+	wire			Xe5gh7;
+	wire			Df5gh7;
+	wire			Jf5gh7;
+	wire			Pf5gh7;
+	wire			Vf5gh7;
+	wire			Bg5gh7;
+	wire			Hg5gh7;
+	wire			Ng5gh7;
+	wire			Tg5gh7;
+	wire			Zg5gh7;
+	wire			Fh5gh7;
+	wire			Lh5gh7;
+	wire			Rh5gh7;
+	wire			Xh5gh7;
+	wire			Di5gh7;
+	wire			Ji5gh7;
+	wire			Pi5gh7;
+	wire			Vi5gh7;
+	wire			Bj5gh7;
+	wire			Hj5gh7;
+	wire			Nj5gh7;
+	wire			Tj5gh7;
+	wire			Zj5gh7;
+	wire			Fk5gh7;
+	wire			Lk5gh7;
+	wire			Rk5gh7;
+	wire			Xk5gh7;
+	wire			Dl5gh7;
+	wire			Jl5gh7;
+	wire			Pl5gh7;
+	wire			Vl5gh7;
+	wire			Bm5gh7;
+	wire			Hm5gh7;
+	wire			Nm5gh7;
+	wire			Tm5gh7;
+	wire			Zm5gh7;
+	wire			Fn5gh7;
+	wire			Ln5gh7;
+	wire			Rn5gh7;
+	wire			Xn5gh7;
+	wire			Do5gh7;
+	wire			Jo5gh7;
+	wire			Po5gh7;
+	wire			Vo5gh7;
+	wire			Bp5gh7;
+	wire			Hp5gh7;
+	wire			Np5gh7;
+	wire			Tp5gh7;
+	wire			Zp5gh7;
+	wire			Fq5gh7;
+	wire			Lq5gh7;
+	wire			Rq5gh7;
+	wire			Xq5gh7;
+	wire			Dr5gh7;
+	wire			Jr5gh7;
+	wire			Pr5gh7;
+	wire			Vr5gh7;
+	wire			Bs5gh7;
+	wire			Hs5gh7;
+	wire			Ns5gh7;
+	wire			Ts5gh7;
+	wire			Zs5gh7;
+	wire			Ft5gh7;
+	wire			Lt5gh7;
+	wire			Rt5gh7;
+	wire			Xt5gh7;
+	wire			Du5gh7;
+	wire			Ju5gh7;
+	wire			Pu5gh7;
+	wire			Vu5gh7;
+	wire			Bv5gh7;
+	wire			Hv5gh7;
+	wire			Nv5gh7;
+	wire			Tv5gh7;
+	wire			Zv5gh7;
+	wire			Fw5gh7;
+	wire			Lw5gh7;
+	wire			Rw5gh7;
+	wire			Xw5gh7;
+	wire			Dx5gh7;
+	wire			Jx5gh7;
+	wire			Px5gh7;
+	wire			Vx5gh7;
+	wire			By5gh7;
+	wire			Hy5gh7;
+	wire			Ny5gh7;
+	wire			Ty5gh7;
+	wire			Zy5gh7;
+	wire			Fz5gh7;
+	wire			Lz5gh7;
+	wire			Rz5gh7;
+	wire			Xz5gh7;
+	wire			D06gh7;
+	wire			J06gh7;
+	wire			P06gh7;
+	wire			V06gh7;
+	wire			B16gh7;
+	wire			H16gh7;
+	wire			N16gh7;
+	wire			T16gh7;
+	wire			Z16gh7;
+	wire			F26gh7;
+	wire			L26gh7;
+	wire			R26gh7;
+	wire			X26gh7;
+	wire			D36gh7;
+	wire			J36gh7;
+	wire			P36gh7;
+	wire			V36gh7;
+	wire			B46gh7;
+	wire			H46gh7;
+	wire			N46gh7;
+	wire			T46gh7;
+	wire			Z46gh7;
+	wire			F56gh7;
+	wire			L56gh7;
+	wire			R56gh7;
+	wire			X56gh7;
+	wire			D66gh7;
+	wire			J66gh7;
+	wire			P66gh7;
+	wire			V66gh7;
+	wire			B76gh7;
+	wire			H76gh7;
+	wire			N76gh7;
+	wire			T76gh7;
+	wire			Z76gh7;
+	wire			F86gh7;
+	wire			L86gh7;
+	wire			R86gh7;
+	wire			X86gh7;
+	wire			D96gh7;
+	wire			J96gh7;
+	wire			P96gh7;
+	wire			V96gh7;
+	wire			Ba6gh7;
+	wire			Ha6gh7;
+	wire			Na6gh7;
+	wire			Ta6gh7;
+	wire			Za6gh7;
+	wire			Fb6gh7;
+	wire			Lb6gh7;
+	wire			Rb6gh7;
+	wire			Xb6gh7;
+	wire			Dc6gh7;
+	wire			Jc6gh7;
+	wire			Pc6gh7;
+	wire			Vc6gh7;
+	wire			Bd6gh7;
+	wire			Hd6gh7;
+	wire			Nd6gh7;
+	wire			Td6gh7;
+	wire			Zd6gh7;
+	wire			Fe6gh7;
+	wire			Le6gh7;
+	wire			Re6gh7;
+	wire			Xe6gh7;
+	wire			Df6gh7;
+	wire			Jf6gh7;
+	wire			Pf6gh7;
+	wire			Vf6gh7;
+	wire			Bg6gh7;
+	wire			Hg6gh7;
+	wire			Ng6gh7;
+	wire			Tg6gh7;
+	wire			Zg6gh7;
+	wire			Fh6gh7;
+	wire			Lh6gh7;
+	wire			Rh6gh7;
+	wire			Xh6gh7;
+	wire			Di6gh7;
+	wire			Ji6gh7;
+	wire			Pi6gh7;
+	wire			Vi6gh7;
+	wire			Bj6gh7;
+	wire			Hj6gh7;
+	wire			Nj6gh7;
+	wire			Tj6gh7;
+	wire			Zj6gh7;
+	wire			Fk6gh7;
+	wire			Lk6gh7;
+	wire			Rk6gh7;
+	wire			Xk6gh7;
+	wire			Dl6gh7;
+	wire			Jl6gh7;
+	wire			Pl6gh7;
+	wire			Vl6gh7;
+	wire			Bm6gh7;
+	wire			Hm6gh7;
+	wire			Nm6gh7;
+	wire			Tm6gh7;
+	wire			Zm6gh7;
+	wire			Fn6gh7;
+	wire			Ln6gh7;
+	wire			Rn6gh7;
+	wire			Xn6gh7;
+	wire			Do6gh7;
+	wire			Jo6gh7;
+	wire			Po6gh7;
+	wire			Vo6gh7;
+	wire			Bp6gh7;
+	wire			Hp6gh7;
+	wire			Np6gh7;
+	wire			Tp6gh7;
+	wire			Zp6gh7;
+	wire			Fq6gh7;
+	wire			Lq6gh7;
+	wire			Rq6gh7;
+	wire			Xq6gh7;
+	wire			Dr6gh7;
+	wire			Jr6gh7;
+	wire			Pr6gh7;
+	wire			Vr6gh7;
+	wire			Bs6gh7;
+	wire			Hs6gh7;
+	wire			Ns6gh7;
+	wire			Ts6gh7;
+	wire			Zs6gh7;
+	wire			Ft6gh7;
+	wire			Lt6gh7;
+	wire			Rt6gh7;
+	wire			Xt6gh7;
+	wire			Du6gh7;
+	wire			Ju6gh7;
+	wire			Pu6gh7;
+	wire			Vu6gh7;
+	wire			Bv6gh7;
+	wire			Hv6gh7;
+	wire			Nv6gh7;
+	wire			Tv6gh7;
+	wire			Zv6gh7;
+	wire			Fw6gh7;
+	wire			Lw6gh7;
+	wire			Rw6gh7;
+	wire			Xw6gh7;
+	wire			Dx6gh7;
+	wire			Jx6gh7;
+	wire			Px6gh7;
+	wire			Vx6gh7;
+	wire			By6gh7;
+	wire			Hy6gh7;
+	wire			Ny6gh7;
+	wire			Ty6gh7;
+	wire			Zy6gh7;
+	wire			Fz6gh7;
+	wire			Lz6gh7;
+	wire			Rz6gh7;
+	wire			Xz6gh7;
+	wire			D07gh7;
+	wire			J07gh7;
+	wire			P07gh7;
+	wire			V07gh7;
+	wire			B17gh7;
+	wire			H17gh7;
+	wire			N17gh7;
+	wire			T17gh7;
+	wire			Z17gh7;
+	wire			F27gh7;
+	wire			L27gh7;
+	wire			R27gh7;
+	wire			X27gh7;
+	wire			D37gh7;
+	wire			J37gh7;
+	wire			P37gh7;
+	wire			V37gh7;
+	wire			B47gh7;
+	wire			H47gh7;
+	wire			N47gh7;
+	wire			T47gh7;
+	wire			Z47gh7;
+	wire			F57gh7;
+	wire			L57gh7;
+	wire			R57gh7;
+	wire			X57gh7;
+	wire			D67gh7;
+	wire			J67gh7;
+	wire			P67gh7;
+	wire			V67gh7;
+	wire			B77gh7;
+	wire			H77gh7;
+	wire			N77gh7;
+	wire			T77gh7;
+	wire			Z77gh7;
+	wire			F87gh7;
+	wire			L87gh7;
+	wire			R87gh7;
+	wire			X87gh7;
+	wire			D97gh7;
+	wire			J97gh7;
+	wire			P97gh7;
+	wire			V97gh7;
+	wire			Ba7gh7;
+	wire			Ha7gh7;
+	wire			Na7gh7;
+	wire			Ta7gh7;
+	wire			Za7gh7;
+	wire			Fb7gh7;
+	wire			Lb7gh7;
+	wire			Rb7gh7;
+	wire			Xb7gh7;
+	wire			Dc7gh7;
+	wire			Jc7gh7;
+	wire			Pc7gh7;
+	wire			Vc7gh7;
+	wire			Bd7gh7;
+	wire			Hd7gh7;
+	wire			Nd7gh7;
+	wire			Td7gh7;
+	wire			Zd7gh7;
+	wire			Fe7gh7;
+	wire			Le7gh7;
+	wire			Re7gh7;
+	wire			Xe7gh7;
+	wire			Df7gh7;
+	wire			Jf7gh7;
+	wire			Pf7gh7;
+	wire			Vf7gh7;
+	wire			Bg7gh7;
+	wire			Hg7gh7;
+	wire			Ng7gh7;
+	wire			Tg7gh7;
+	wire			Zg7gh7;
+	wire			Fh7gh7;
+	wire			Lh7gh7;
+	wire			Rh7gh7;
+	wire			Xh7gh7;
+	wire			Di7gh7;
+	wire			Ji7gh7;
+	wire			Pi7gh7;
+	wire			Vi7gh7;
+	wire			Bj7gh7;
+	wire			Hj7gh7;
+	wire			Nj7gh7;
+	wire			Tj7gh7;
+	wire			Zj7gh7;
+	wire			Fk7gh7;
+	wire			Lk7gh7;
+	wire			Rk7gh7;
+	wire			Xk7gh7;
+	wire			Dl7gh7;
+	wire			Jl7gh7;
+	wire			Pl7gh7;
+	wire			Vl7gh7;
+	wire			Bm7gh7;
+	wire			Hm7gh7;
+	wire			Nm7gh7;
+	wire			Tm7gh7;
+	wire			Zm7gh7;
+	wire			Fn7gh7;
+	wire			Ln7gh7;
+	wire			Rn7gh7;
+	wire			Xn7gh7;
+	wire			Do7gh7;
+	wire			Jo7gh7;
+	wire			Po7gh7;
+	wire			Vo7gh7;
+	wire			Bp7gh7;
+	wire			Hp7gh7;
+	wire			Np7gh7;
+	wire			Tp7gh7;
+	wire			Zp7gh7;
+	wire			Fq7gh7;
+	wire			Lq7gh7;
+	wire			Rq7gh7;
+	wire			Xq7gh7;
+	wire			Dr7gh7;
+	wire			Jr7gh7;
+	wire			Pr7gh7;
+	wire			Vr7gh7;
+	wire			Bs7gh7;
+	wire			Hs7gh7;
+	wire			Ns7gh7;
+	wire			Ts7gh7;
+	wire			Zs7gh7;
+	wire			Ft7gh7;
+	wire			Lt7gh7;
+	wire			Rt7gh7;
+	wire			Xt7gh7;
+	wire			Du7gh7;
+	wire			Ju7gh7;
+	wire			Pu7gh7;
+	wire			Vu7gh7;
+	wire			Bv7gh7;
+	wire			Hv7gh7;
+	wire			Nv7gh7;
+	wire			Tv7gh7;
+	wire			Zv7gh7;
+	wire			Fw7gh7;
+	wire			Lw7gh7;
+	wire			Rw7gh7;
+	wire			Xw7gh7;
+	wire			Dx7gh7;
+	wire			Jx7gh7;
+	wire			Px7gh7;
+	wire			Vx7gh7;
+	wire			By7gh7;
+	wire			Hy7gh7;
+	wire			Ny7gh7;
+	wire			Ty7gh7;
+	wire			Zy7gh7;
+	wire			Fz7gh7;
+	wire			Lz7gh7;
+	wire			Rz7gh7;
+	wire			Xz7gh7;
+	wire			D08gh7;
+	wire			J08gh7;
+	wire			P08gh7;
+	wire			V08gh7;
+	wire			B18gh7;
+	wire			H18gh7;
+	wire			N18gh7;
+	wire			T18gh7;
+	wire			Z18gh7;
+	wire			F28gh7;
+	wire			L28gh7;
+	wire			R28gh7;
+	wire			X28gh7;
+	wire			D38gh7;
+	wire			J38gh7;
+	wire			P38gh7;
+	wire			V38gh7;
+	wire			B48gh7;
+	wire			H48gh7;
+	wire			N48gh7;
+	wire			T48gh7;
+	wire			Z48gh7;
+	wire			F58gh7;
+	wire			L58gh7;
+	wire			R58gh7;
+	wire			X58gh7;
+	wire			D68gh7;
+	wire			J68gh7;
+	wire			P68gh7;
+	wire			V68gh7;
+	wire			B78gh7;
+	wire			H78gh7;
+	wire			N78gh7;
+	wire			T78gh7;
+	wire			Z78gh7;
+	wire			F88gh7;
+	wire			L88gh7;
+	wire			R88gh7;
+	wire			X88gh7;
+	wire			D98gh7;
+	wire			J98gh7;
+	wire			P98gh7;
+	wire			V98gh7;
+	wire			Ba8gh7;
+	wire			Ha8gh7;
+	wire			Na8gh7;
+	wire			Ta8gh7;
+	wire			Za8gh7;
+	wire			Fb8gh7;
+	wire			Lb8gh7;
+	wire			Rb8gh7;
+	wire			Xb8gh7;
+	wire			Dc8gh7;
+	wire			Jc8gh7;
+	wire			Pc8gh7;
+	wire			Vc8gh7;
+	wire			Bd8gh7;
+	wire			Hd8gh7;
+	wire			Nd8gh7;
+	wire			Td8gh7;
+	wire			Zd8gh7;
+	wire			Fe8gh7;
+	wire			Le8gh7;
+	wire			Re8gh7;
+	wire			Xe8gh7;
+	wire			Df8gh7;
+	wire			Jf8gh7;
+	wire			Pf8gh7;
+	wire			Vf8gh7;
+	wire			Bg8gh7;
+	wire			Hg8gh7;
+	wire			Ng8gh7;
+	wire			Tg8gh7;
+	wire			Zg8gh7;
+	wire			Fh8gh7;
+	wire			Lh8gh7;
+	wire			Rh8gh7;
+	wire			Xh8gh7;
+	wire			Di8gh7;
+	wire			Ji8gh7;
+	wire			Pi8gh7;
+	wire			Vi8gh7;
+	wire			Bj8gh7;
+	wire			Hj8gh7;
+	wire			Nj8gh7;
+	wire			Tj8gh7;
+	wire			Zj8gh7;
+	wire			Fk8gh7;
+	wire			Lk8gh7;
+	wire			Rk8gh7;
+	wire			Xk8gh7;
+	wire			Dl8gh7;
+	wire			Jl8gh7;
+	wire			Pl8gh7;
+	wire			Vl8gh7;
+	wire			Bm8gh7;
+	wire			Hm8gh7;
+	wire			Nm8gh7;
+	wire			Tm8gh7;
+	wire			Zm8gh7;
+	wire			Fn8gh7;
+	wire			Ln8gh7;
+	wire			Rn8gh7;
+	wire			Xn8gh7;
+	wire			Do8gh7;
+	wire			Jo8gh7;
+	wire			Po8gh7;
+	wire			Vo8gh7;
+	wire			Bp8gh7;
+	wire			Hp8gh7;
+	wire			Np8gh7;
+	wire			Tp8gh7;
+	wire			Zp8gh7;
+	wire			Fq8gh7;
+	wire			Lq8gh7;
+	wire			Rq8gh7;
+	wire			Xq8gh7;
+	wire			Dr8gh7;
+	wire			Jr8gh7;
+	wire			Pr8gh7;
+	wire			Vr8gh7;
+	wire			Bs8gh7;
+	wire			Hs8gh7;
+	wire			Ns8gh7;
+	wire			Ts8gh7;
+	wire			Zs8gh7;
+	wire			Ft8gh7;
+	wire			Lt8gh7;
+	wire			Rt8gh7;
+	wire			Xt8gh7;
+	wire			Du8gh7;
+	wire			Ju8gh7;
+	wire			Pu8gh7;
+	wire			Vu8gh7;
+	wire			Bv8gh7;
+	wire			Hv8gh7;
+	wire			Nv8gh7;
+	wire			Tv8gh7;
+	wire			Zv8gh7;
+	wire			Fw8gh7;
+	wire			Lw8gh7;
+	wire			Rw8gh7;
+	wire			Xw8gh7;
+	wire			Dx8gh7;
+	wire			Jx8gh7;
+	wire			Px8gh7;
+	wire			Vx8gh7;
+	wire			By8gh7;
+	wire			Hy8gh7;
+	wire			Ny8gh7;
+	wire			Ty8gh7;
+	wire			Zy8gh7;
+	wire			Fz8gh7;
+	wire			Lz8gh7;
+	wire			Rz8gh7;
+	wire			Xz8gh7;
+	wire			D09gh7;
+	wire			J09gh7;
+	wire			P09gh7;
+	wire			V09gh7;
+	wire			B19gh7;
+	wire			H19gh7;
+	wire			N19gh7;
+	wire			T19gh7;
+	wire			Z19gh7;
+	wire			F29gh7;
+	wire			L29gh7;
+	wire			R29gh7;
+	wire			X29gh7;
+	wire			D39gh7;
+	wire			J39gh7;
+	wire			P39gh7;
+	wire			V39gh7;
+	wire			B49gh7;
+	wire			H49gh7;
+	wire			N49gh7;
+	wire			T49gh7;
+	wire			Z49gh7;
+	wire			F59gh7;
+	wire			L59gh7;
+	wire			R59gh7;
+	wire			X59gh7;
+	wire			D69gh7;
+	wire			J69gh7;
+	wire			P69gh7;
+	wire			V69gh7;
+	wire			B79gh7;
+	wire			H79gh7;
+	wire			N79gh7;
+	wire			T79gh7;
+	wire			Z79gh7;
+	wire			F89gh7;
+	wire			L89gh7;
+	wire			R89gh7;
+	wire			X89gh7;
+	wire			D99gh7;
+	wire			J99gh7;
+	wire			P99gh7;
+	wire			V99gh7;
+	wire			Ba9gh7;
+	wire			Ha9gh7;
+	wire			Na9gh7;
+	wire			Ta9gh7;
+	wire			Za9gh7;
+	wire			Fb9gh7;
+	wire			Lb9gh7;
+	wire			Rb9gh7;
+	wire			Xb9gh7;
+	wire			Dc9gh7;
+	wire			Jc9gh7;
+	wire			Pc9gh7;
+	wire			Vc9gh7;
+	wire			Bd9gh7;
+	wire			Hd9gh7;
+	wire	[31:0]		Nd9gh7;
+	reg			Ie9gh7;
+	reg			If9gh7;
+	reg			Ng9gh7;
+	reg			Ph9gh7;
+	reg			Ri9gh7;
+	reg			Tj9gh7;
+	reg			Wk9gh7;
+	reg			Wl9gh7;
+	reg			Zm9gh7;
+	reg			Bo9gh7;
+	reg			Dp9gh7;
+	reg			Fq9gh7;
+	reg			Ir9gh7;
+	reg			Ls9gh7;
+	reg			Lt9gh7;
+	reg			Ou9gh7;
+	reg			Pv9gh7;
+	reg			Rw9gh7;
+	reg			Tx9gh7;
+	reg			Wy9gh7;
+	reg			Zz9gh7;
+	reg			C1agh7;
+	reg			F2agh7;
+	reg			I3agh7;
+	reg			L4agh7;
+	reg			O5agh7;
+	reg			R6agh7;
+	reg			U7agh7;
+	reg			U8agh7;
+	reg			X9agh7;
+	reg			Abagh7;
+	reg			Wbagh7;
+	reg			Zcagh7;
+	reg			Ceagh7;
+	reg			Efagh7;
+	reg			Ggagh7;
+	reg			Jhagh7;
+	reg			Miagh7;
+	reg			Pjagh7;
+	reg			Skagh7;
+	reg			Vlagh7;
+	reg			Ymagh7;
+	reg			Boagh7;
+	reg			Epagh7;
+	reg			Eqagh7;
+	reg			Eragh7;
+	reg			Esagh7;
+	reg			Etagh7;
+	reg			Euagh7;
+	reg			Evagh7;
+	reg			Ewagh7;
+	reg			Hxagh7;
+	reg			Kyagh7;
+	reg			Nzagh7;
+	reg			Q0bgh7;
+	reg			T1bgh7;
+	reg			W2bgh7;
+	reg			Z3bgh7;
+	reg			C5bgh7;
+	reg			F6bgh7;
+	reg			H7bgh7;
+	reg			K8bgh7;
+	reg			N9bgh7;
+	reg			Pabgh7;
+	reg			Rbbgh7;
+	reg			Ucbgh7;
+	reg			Xdbgh7;
+	reg			Afbgh7;
+	reg			Dgbgh7;
+	reg			Ghbgh7;
+	reg			Iibgh7;
+	reg			Kjbgh7;
+	reg			Nkbgh7;
+	reg			Plbgh7;
+	reg			Rmbgh7;
+	reg			Tnbgh7;
+	reg			Vobgh7;
+	reg			Wpbgh7;
+	reg			Xqbgh7;
+	reg			Yrbgh7;
+	reg			Zsbgh7;
+	reg			Bubgh7;
+	reg			Cvbgh7;
+	reg			Dwbgh7;
+	reg			Dxbgh7;
+	reg			Fybgh7;
+	reg			Gzbgh7;
+	reg			H0cgh7;
+	reg			H1cgh7;
+	reg			H2cgh7;
+	reg			J3cgh7;
+	reg			K4cgh7;
+	reg			N5cgh7;
+	reg			P6cgh7;
+	reg			S7cgh7;
+	reg			U8cgh7;
+	reg			X9cgh7;
+	reg			Zacgh7;
+	reg			Cccgh7;
+	reg			Edcgh7;
+	reg			Hecgh7;
+	reg			Jfcgh7;
+	reg			Kgcgh7;
+	reg			Mhcgh7;
+	reg			Nicgh7;
+	reg			Pjcgh7;
+	reg			Qkcgh7;
+	reg			Slcgh7;
+	reg			Tmcgh7;
+	reg			Vncgh7;
+	reg			Wocgh7;
+	reg			Ypcgh7;
+	reg			Zqcgh7;
+	reg			Zrcgh7;
+	reg			Btcgh7;
+	reg			Cucgh7;
+	reg			Fvcgh7;
+	reg			Hwcgh7;
+	reg			Kxcgh7;
+	reg			Mycgh7;
+	reg			Pzcgh7;
+	reg			R0dgh7;
+	reg			U1dgh7;
+	reg			W2dgh7;
+	reg			Z3dgh7;
+	reg			B5dgh7;
+	reg			C6dgh7;
+	reg			E7dgh7;
+	reg			F8dgh7;
+	reg			H9dgh7;
+	reg			Iadgh7;
+	reg			Kbdgh7;
+	reg			Lcdgh7;
+	reg			Nddgh7;
+	reg			Oedgh7;
+	reg			Qfdgh7;
+	reg			Rgdgh7;
+	reg			Rhdgh7;
+	reg			Tidgh7;
+	reg			Ujdgh7;
+	reg			Xkdgh7;
+	reg			Zldgh7;
+	reg			Cndgh7;
+	reg			Eodgh7;
+	reg			Hpdgh7;
+	reg			Jqdgh7;
+	reg			Mrdgh7;
+	reg			Osdgh7;
+	reg			Rtdgh7;
+	reg			Tudgh7;
+	reg			Wvdgh7;
+	reg			Ywdgh7;
+	reg			Zxdgh7;
+	reg			Bzdgh7;
+	reg			C0egh7;
+	reg			E1egh7;
+	reg			F2egh7;
+	reg			H3egh7;
+	reg			I4egh7;
+	reg			K5egh7;
+	reg			L6egh7;
+	reg			N7egh7;
+	reg			O8egh7;
+	reg			Q9egh7;
+	reg			Raegh7;
+	reg			Rbegh7;
+	reg			Scegh7;
+	reg			Udegh7;
+	reg			Veegh7;
+	reg			Xfegh7;
+	reg			Ygegh7;
+	reg			Aiegh7;
+	reg			Bjegh7;
+	reg			Dkegh7;
+	reg			Elegh7;
+	reg			Gmegh7;
+	reg			Hnegh7;
+	reg			Joegh7;
+	reg			Jpegh7;
+	reg			Kqegh7;
+	reg			Kregh7;
+	reg			Ksegh7;
+	reg			Ktegh7;
+	reg			Kuegh7;
+	reg			Kvegh7;
+	reg			Kwegh7;
+	reg			Kxegh7;
+	reg			Kyegh7;
+	reg			Lzegh7;
+	reg			O0fgh7;
+	reg			P1fgh7;
+	reg			S2fgh7;
+	reg			V3fgh7;
+	reg			X4fgh7;
+	reg			Z5fgh7;
+	reg			B7fgh7;
+	reg			D8fgh7;
+	reg			H9fgh7;
+	reg			Hafgh7;
+	reg			Lbfgh7;
+	reg			Pcfgh7;
+	reg			Tdfgh7;
+	reg			Xefgh7;
+	reg			Bgfgh7;
+	reg			Fhfgh7;
+	reg			Jifgh7;
+	reg			Ojfgh7;
+	reg			Tkfgh7;
+	reg			Ylfgh7;
+	reg			Dnfgh7;
+	reg			Iofgh7;
+	reg			Npfgh7;
+	reg			Sqfgh7;
+	reg			Yrfgh7;
+	reg			Etfgh7;
+	reg			Kufgh7;
+	reg			Qvfgh7;
+	reg			Wwfgh7;
+	reg			Cyfgh7;
+	reg			Izfgh7;
+	reg			O0ggh7;
+	reg			U1ggh7;
+	reg			A3ggh7;
+	reg			G4ggh7;
+	reg			M5ggh7;
+	reg			S6ggh7;
+	reg			Y7ggh7;
+	reg			E9ggh7;
+	reg			Kaggh7;
+	reg			Qbggh7;
+	reg			Wcggh7;
+	reg			Ceggh7;
+	reg			Ifggh7;
+	reg			Ogggh7;
+	reg			Phggh7;
+	reg			Uiggh7;
+	reg			Yjggh7;
+	reg			Ykggh7;
+	reg			Ylggh7;
+	reg			Enggh7;
+	reg			Foggh7;
+	reg			Hpggh7;
+	reg			Jqggh7;
+	reg			Lrggh7;
+	reg			Nsggh7;
+	reg			Ptggh7;
+	reg			Ruggh7;
+	reg			Tvggh7;
+	reg			Vwggh7;
+	reg			Xxggh7;
+	reg			Azggh7;
+	reg			D0hgh7;
+	reg			G1hgh7;
+	reg			J2hgh7;
+	reg			M3hgh7;
+	reg			P4hgh7;
+	reg			S5hgh7;
+	reg			V6hgh7;
+	reg			Y7hgh7;
+	reg			B9hgh7;
+	reg			Eahgh7;
+	reg			Hbhgh7;
+	reg			Kchgh7;
+	reg			Ndhgh7;
+	reg			Qehgh7;
+	reg			Tfhgh7;
+	reg			Wghgh7;
+	reg			Zhhgh7;
+	reg			Cjhgh7;
+	reg			Fkhgh7;
+	reg			Ilhgh7;
+	reg			Lmhgh7;
+	reg			Mnhgh7;
+	reg			Mohgh7;
+	reg			Rphgh7;
+	reg			Vqhgh7;
+	reg			Zrhgh7;
+	reg			Dthgh7;
+	reg			Huhgh7;
+	reg			Lvhgh7;
+	reg			Pwhgh7;
+	wire	[33:0]		Txhgh7;
+	wire	[33:0]		Wyhgh7;
+
+	assign ahb_hburst[2] = 1'b0;
+	assign ahb_hburst[1] = 1'b0;
+	assign ahb_hmastlock = 1'b0;
+	assign ahb_hprot[3] = 1'b0;
+	assign ahb_hprot[2] = 1'b0;
+	assign ahb_hsize[2] = 1'b0;
+	assign ahb_hsize[0] = 1'b0;
+	assign ahb_htrans[0] = 1'b0;
+	assign ahb_hburst[0] = 1'b1;
+	assign ahb_hprot[1] = 1'b1;
+	assign ahb_hprot[0] = 1'b1;
+	assign ahb_hsize[1] = 1'b1;
+	assign Hd9gh7 = (!Ie9gh7);
+	assign ahb_hwdata[0] = If9gh7;
+	assign Jltfh7 = (!If9gh7);
+	assign Bd9gh7 = (!Ng9gh7);
+	assign Vc9gh7 = (!Ph9gh7);
+	assign Nd9gh7[1] = Ri9gh7;
+	assign Hgtfh7 = (!Ri9gh7);
+	assign Nv8gh7 = (!Tj9gh7);
+	assign com_rx_tready = Wk9gh7;
+	assign Xw8gh7 = (!Wl9gh7);
+	assign Fz8gh7 = (!Zm9gh7);
+	assign Ty8gh7 = (!Bo9gh7);
+	assign Pc9gh7 = (!Dp9gh7);
+	assign By8gh7 = (!Fq9gh7);
+	assign Vu8gh7 = (!Ir9gh7);
+	assign com_tx_tvalid = Ls9gh7;
+	assign Lz8gh7 = (!Lt9gh7);
+	assign ahb_haddr[0] = Ou9gh7;
+	assign Jc9gh7 = (!Pv9gh7);
+	assign Dc9gh7 = (!Rw9gh7);
+	assign Bv8gh7 = (!Tx9gh7);
+	assign Hv8gh7 = (!Wy9gh7);
+	assign Ft8gh7 = (!Zz9gh7);
+	assign Jx8gh7 = (!C1agh7);
+	assign P09gh7 = (!F2agh7);
+	assign Xz8gh7 = (!I3agh7);
+	assign N19gh7 = (!L4agh7);
+	assign Xt8gh7 = (!O5agh7);
+	assign Xb9gh7 = (!R6agh7);
+	assign stdio_rx_tready = U7agh7;
+	assign Hy8gh7 = (!U8agh7);
+	assign Rz8gh7 = (!X9agh7);
+	assign Fe8gh7 = (!Abagh7);
+	assign V09gh7 = (!Wbagh7);
+	assign Lw8gh7 = (!Zcagh7);
+	assign Lt8gh7 = (!Ceagh7);
+	assign Rt8gh7 = (!Efagh7);
+	assign Fw8gh7 = (!Ggagh7);
+	assign L29gh7 = (!Jhagh7);
+	assign D09gh7 = (!Miagh7);
+	assign Zv8gh7 = (!Pjagh7);
+	assign Dx8gh7 = (!Skagh7);
+	assign Tv8gh7 = (!Vlagh7);
+	assign Ju8gh7 = (!Ymagh7);
+	assign Pu8gh7 = (!Boagh7);
+	assign Rb9gh7 = (!Epagh7);
+	assign Zd8gh7 = (!Eqagh7);
+	assign Lb9gh7 = (!Eragh7);
+	assign Fb9gh7 = (!Esagh7);
+	assign Za9gh7 = (!Etagh7);
+	assign Ta9gh7 = (!Euagh7);
+	assign Na9gh7 = (!Evagh7);
+	assign Ha9gh7 = (!Ewagh7);
+	assign B19gh7 = (!Hxagh7);
+	assign Ba9gh7 = (!Kyagh7);
+	assign H19gh7 = (!Nzagh7);
+	assign F29gh7 = (!Q0bgh7);
+	assign Du8gh7 = (!T1bgh7);
+	assign T19gh7 = (!W2bgh7);
+	assign V99gh7 = (!Z3bgh7);
+	assign Z19gh7 = (!C5bgh7);
+	assign R9tfh7 = F6bgh7;
+	assign ahb_hwrite = H7bgh7;
+	assign J09gh7 = (!K8bgh7);
+	assign P99gh7 = (!N9bgh7);
+	assign J99gh7 = (!Pabgh7);
+	assign D99gh7 = (!Rbbgh7);
+	assign X89gh7 = (!Ucbgh7);
+	assign R89gh7 = (!Xdbgh7);
+	assign L89gh7 = (!Afbgh7);
+	assign F89gh7 = (!Dgbgh7);
+	assign ahb_haddr[29] = Ghbgh7;
+	assign ahb_haddr[31] = Iibgh7;
+	assign Z79gh7 = (!Kjbgh7);
+	assign ahb_haddr[25] = Nkbgh7;
+	assign ahb_haddr[21] = Plbgh7;
+	assign ahb_haddr[17] = Rmbgh7;
+	assign ahb_haddr[13] = Tnbgh7;
+	assign ahb_haddr[9] = Vobgh7;
+	assign ahb_haddr[5] = Wpbgh7;
+	assign ahb_haddr[4] = Xqbgh7;
+	assign ahb_haddr[1] = Yrbgh7;
+	assign T79gh7 = (!Zsbgh7);
+	assign ahb_haddr[2] = Bubgh7;
+	assign Tp8gh7 = (!Cvbgh7);
+	assign Np8gh7 = (!Dwbgh7);
+	assign N79gh7 = (!Dxbgh7);
+	assign ahb_haddr[3] = Fybgh7;
+	assign Df8gh7 = (!Gzbgh7);
+	assign Xe8gh7 = (!H0cgh7);
+	assign Tm8gh7 = (!H1cgh7);
+	assign H79gh7 = (!H2cgh7);
+	assign ahb_haddr[8] = J3cgh7;
+	assign B79gh7 = (!K4cgh7);
+	assign ahb_haddr[12] = N5cgh7;
+	assign V69gh7 = (!P6cgh7);
+	assign ahb_haddr[16] = S7cgh7;
+	assign P69gh7 = (!U8cgh7);
+	assign ahb_haddr[20] = X9cgh7;
+	assign J69gh7 = (!Zacgh7);
+	assign ahb_haddr[24] = Cccgh7;
+	assign D69gh7 = (!Edcgh7);
+	assign ahb_haddr[28] = Hecgh7;
+	assign Rn8gh7 = (!Jfcgh7);
+	assign Xn8gh7 = (!Kgcgh7);
+	assign Do8gh7 = (!Mhcgh7);
+	assign Jo8gh7 = (!Nicgh7);
+	assign Fn8gh7 = (!Pjcgh7);
+	assign Ln8gh7 = (!Qkcgh7);
+	assign Po8gh7 = (!Slcgh7);
+	assign Vo8gh7 = (!Tmcgh7);
+	assign Hm8gh7 = (!Vncgh7);
+	assign Nm8gh7 = (!Wocgh7);
+	assign Zm8gh7 = (!Ypcgh7);
+	assign Vf8gh7 = (!Zqcgh7);
+	assign X59gh7 = (!Zrcgh7);
+	assign ahb_haddr[7] = Btcgh7;
+	assign R59gh7 = (!Cucgh7);
+	assign ahb_haddr[11] = Fvcgh7;
+	assign L59gh7 = (!Hwcgh7);
+	assign ahb_haddr[15] = Kxcgh7;
+	assign F59gh7 = (!Mycgh7);
+	assign ahb_haddr[19] = Pzcgh7;
+	assign Z49gh7 = (!R0dgh7);
+	assign ahb_haddr[23] = U1dgh7;
+	assign T49gh7 = (!W2dgh7);
+	assign ahb_haddr[27] = Z3dgh7;
+	assign Lk8gh7 = (!B5dgh7);
+	assign Rk8gh7 = (!C6dgh7);
+	assign Nj8gh7 = (!E7dgh7);
+	assign Tj8gh7 = (!F8dgh7);
+	assign Pi8gh7 = (!H9dgh7);
+	assign Vi8gh7 = (!Iadgh7);
+	assign Rh8gh7 = (!Kbdgh7);
+	assign Xh8gh7 = (!Lcdgh7);
+	assign Tg8gh7 = (!Nddgh7);
+	assign Zg8gh7 = (!Oedgh7);
+	assign Bg8gh7 = (!Qfdgh7);
+	assign Zp8gh7 = (!Rgdgh7);
+	assign N49gh7 = (!Rhdgh7);
+	assign ahb_haddr[6] = Tidgh7;
+	assign H49gh7 = (!Ujdgh7);
+	assign ahb_haddr[10] = Xkdgh7;
+	assign B49gh7 = (!Zldgh7);
+	assign ahb_haddr[14] = Cndgh7;
+	assign V39gh7 = (!Eodgh7);
+	assign ahb_haddr[18] = Hpdgh7;
+	assign P39gh7 = (!Jqdgh7);
+	assign ahb_haddr[22] = Mrdgh7;
+	assign J39gh7 = (!Osdgh7);
+	assign ahb_haddr[26] = Rtdgh7;
+	assign D39gh7 = (!Tudgh7);
+	assign ahb_haddr[30] = Wvdgh7;
+	assign Ts8gh7 = (!Ywdgh7);
+	assign Zs8gh7 = (!Zxdgh7);
+	assign Hs8gh7 = (!Bzdgh7);
+	assign Ns8gh7 = (!C0egh7);
+	assign Vr8gh7 = (!E1egh7);
+	assign Bs8gh7 = (!F2egh7);
+	assign Jr8gh7 = (!H3egh7);
+	assign Pr8gh7 = (!I4egh7);
+	assign Xq8gh7 = (!K5egh7);
+	assign Dr8gh7 = (!L6egh7);
+	assign Lq8gh7 = (!N7egh7);
+	assign Rq8gh7 = (!O8egh7);
+	assign Fq8gh7 = (!Q9egh7);
+	assign Vl8gh7 = (!Raegh7);
+	assign Jl8gh7 = (!Rbegh7);
+	assign Pl8gh7 = (!Scegh7);
+	assign Xk8gh7 = (!Udegh7);
+	assign Dl8gh7 = (!Veegh7);
+	assign Zj8gh7 = (!Xfegh7);
+	assign Fk8gh7 = (!Ygegh7);
+	assign Bj8gh7 = (!Aiegh7);
+	assign Hj8gh7 = (!Bjegh7);
+	assign Di8gh7 = (!Dkegh7);
+	assign Ji8gh7 = (!Elegh7);
+	assign Fh8gh7 = (!Gmegh7);
+	assign Lh8gh7 = (!Hnegh7);
+	assign Hg8gh7 = (!Joegh7);
+	assign Ng8gh7 = (!Jpegh7);
+	assign gpo8[7] = Kqegh7;
+	assign Fktfh7 = (!Kqegh7);
+	assign gpo8[6] = Kregh7;
+	assign Zjtfh7 = (!Kregh7);
+	assign gpo8[4] = Ksegh7;
+	assign Njtfh7 = (!Ksegh7);
+	assign gpo8[3] = Ktegh7;
+	assign Hjtfh7 = (!Ktegh7);
+	assign gpo8[2] = Kuegh7;
+	assign Bjtfh7 = (!Kuegh7);
+	assign gpo8[1] = Kvegh7;
+	assign Vitfh7 = (!Kvegh7);
+	assign Jf8gh7 = (!Kwegh7);
+	assign gpo8[5] = Kxegh7;
+	assign Tjtfh7 = (!Kxegh7);
+	assign Pf8gh7 = (!Kyegh7);
+	assign Patfh7 = Lzegh7;
+	assign R29gh7 = (!O0fgh7);
+	assign Rw8gh7 = (!P1fgh7);
+	assign X29gh7 = (!S2fgh7);
+	assign Vx8gh7 = (!V3fgh7);
+	assign Ny8gh7 = (!X4fgh7);
+	assign Px8gh7 = (!Z5fgh7);
+	assign Zy8gh7 = (!B7fgh7);
+	assign com_tx_tdata[7] = D8fgh7;
+	assign stdio_tx_tvalid = H9fgh7;
+	assign stdio_tx_tdata[7] = Hafgh7;
+	assign stdio_tx_tdata[6] = Lbfgh7;
+	assign stdio_tx_tdata[5] = Pcfgh7;
+	assign stdio_tx_tdata[4] = Tdfgh7;
+	assign stdio_tx_tdata[3] = Xefgh7;
+	assign stdio_tx_tdata[2] = Bgfgh7;
+	assign stdio_tx_tdata[1] = Fhfgh7;
+	assign ahb_hwdata[2] = Jifgh7;
+	assign Vltfh7 = (!Jifgh7);
+	assign ahb_hwdata[3] = Ojfgh7;
+	assign Bmtfh7 = (!Ojfgh7);
+	assign ahb_hwdata[5] = Tkfgh7;
+	assign Nmtfh7 = (!Tkfgh7);
+	assign ahb_hwdata[6] = Ylfgh7;
+	assign Tmtfh7 = (!Ylfgh7);
+	assign ahb_hwdata[7] = Dnfgh7;
+	assign Zmtfh7 = (!Dnfgh7);
+	assign ahb_hwdata[8] = Iofgh7;
+	assign Fntfh7 = (!Iofgh7);
+	assign ahb_hwdata[9] = Npfgh7;
+	assign Lntfh7 = (!Npfgh7);
+	assign ahb_hwdata[10] = Sqfgh7;
+	assign Rntfh7 = (!Sqfgh7);
+	assign ahb_hwdata[11] = Yrfgh7;
+	assign Xntfh7 = (!Yrfgh7);
+	assign ahb_hwdata[12] = Etfgh7;
+	assign Dotfh7 = (!Etfgh7);
+	assign ahb_hwdata[13] = Kufgh7;
+	assign Jotfh7 = (!Kufgh7);
+	assign ahb_hwdata[14] = Qvfgh7;
+	assign Potfh7 = (!Qvfgh7);
+	assign ahb_hwdata[15] = Wwfgh7;
+	assign Votfh7 = (!Wwfgh7);
+	assign ahb_hwdata[17] = Cyfgh7;
+	assign Hptfh7 = (!Cyfgh7);
+	assign ahb_hwdata[18] = Izfgh7;
+	assign Nptfh7 = (!Izfgh7);
+	assign ahb_hwdata[19] = O0ggh7;
+	assign Tptfh7 = (!O0ggh7);
+	assign ahb_hwdata[20] = U1ggh7;
+	assign Zptfh7 = (!U1ggh7);
+	assign ahb_hwdata[21] = A3ggh7;
+	assign Fqtfh7 = (!A3ggh7);
+	assign ahb_hwdata[22] = G4ggh7;
+	assign Lqtfh7 = (!G4ggh7);
+	assign ahb_hwdata[23] = M5ggh7;
+	assign Rqtfh7 = (!M5ggh7);
+	assign ahb_hwdata[24] = S6ggh7;
+	assign Xqtfh7 = (!S6ggh7);
+	assign ahb_hwdata[25] = Y7ggh7;
+	assign Drtfh7 = (!Y7ggh7);
+	assign ahb_hwdata[26] = E9ggh7;
+	assign Jrtfh7 = (!E9ggh7);
+	assign ahb_hwdata[27] = Kaggh7;
+	assign Prtfh7 = (!Kaggh7);
+	assign ahb_hwdata[28] = Qbggh7;
+	assign Vrtfh7 = (!Qbggh7);
+	assign ahb_hwdata[29] = Wcggh7;
+	assign Bstfh7 = (!Wcggh7);
+	assign ahb_hwdata[30] = Ceggh7;
+	assign Hstfh7 = (!Ceggh7);
+	assign ahb_hwdata[31] = Ifggh7;
+	assign Nstfh7 = (!Ifggh7);
+	assign Bm8gh7 = (!Ogggh7);
+	assign ahb_hwdata[4] = Phggh7;
+	assign Hmtfh7 = (!Phggh7);
+	assign stdio_tx_tdata[0] = Uiggh7;
+	assign Bp8gh7 = (!Yjggh7);
+	assign gpo8[0] = Ykggh7;
+	assign Pitfh7 = (!Ykggh7);
+	assign ahb_hwdata[16] = Ylggh7;
+	assign Bptfh7 = (!Ylggh7);
+	assign Hp8gh7 = (!Enggh7);
+	assign Nd9gh7[0] = Foggh7;
+	assign Bsufh7 = (!Foggh7);
+	assign Nd9gh7[2] = Hpggh7;
+	assign Vctfh7 = (!Hpggh7);
+	assign Nd9gh7[3] = Jqggh7;
+	assign Ndtfh7 = (!Jqggh7);
+	assign Nd9gh7[4] = Lrggh7;
+	assign Tdtfh7 = (!Lrggh7);
+	assign Nd9gh7[5] = Nsggh7;
+	assign Zdtfh7 = (!Nsggh7);
+	assign Nd9gh7[6] = Ptggh7;
+	assign Fetfh7 = (!Ptggh7);
+	assign Nd9gh7[7] = Ruggh7;
+	assign Letfh7 = (!Ruggh7);
+	assign Nd9gh7[8] = Tvggh7;
+	assign Retfh7 = (!Tvggh7);
+	assign Nd9gh7[9] = Vwggh7;
+	assign Xetfh7 = (!Vwggh7);
+	assign Nd9gh7[10] = Xxggh7;
+	assign Jitfh7 = (!Xxggh7);
+	assign Nd9gh7[11] = Azggh7;
+	assign Xhtfh7 = (!Azggh7);
+	assign Nd9gh7[12] = D0hgh7;
+	assign Ditfh7 = (!D0hgh7);
+	assign Nd9gh7[13] = G1hgh7;
+	assign Zgtfh7 = (!G1hgh7);
+	assign Nd9gh7[14] = J2hgh7;
+	assign Fhtfh7 = (!J2hgh7);
+	assign Nd9gh7[15] = M3hgh7;
+	assign Lhtfh7 = (!M3hgh7);
+	assign Nd9gh7[16] = P4hgh7;
+	assign Rhtfh7 = (!P4hgh7);
+	assign Nd9gh7[17] = S5hgh7;
+	assign Ngtfh7 = (!S5hgh7);
+	assign Nd9gh7[18] = V6hgh7;
+	assign Tgtfh7 = (!V6hgh7);
+	assign Nd9gh7[19] = Y7hgh7;
+	assign Bgtfh7 = (!Y7hgh7);
+	assign Nd9gh7[20] = B9hgh7;
+	assign Pftfh7 = (!B9hgh7);
+	assign Nd9gh7[21] = Eahgh7;
+	assign Vftfh7 = (!Eahgh7);
+	assign Nd9gh7[22] = Hbhgh7;
+	assign Dftfh7 = (!Hbhgh7);
+	assign Nd9gh7[23] = Kchgh7;
+	assign Jftfh7 = (!Kchgh7);
+	assign Nd9gh7[24] = Ndhgh7;
+	assign Obtfh7 = (!Ndhgh7);
+	assign Nd9gh7[25] = Qehgh7;
+	assign Tbtfh7 = (!Qehgh7);
+	assign Nd9gh7[26] = Tfhgh7;
+	assign Ybtfh7 = (!Tfhgh7);
+	assign Nd9gh7[27] = Wghgh7;
+	assign Dctfh7 = (!Wghgh7);
+	assign Nd9gh7[28] = Zhhgh7;
+	assign Jctfh7 = (!Zhhgh7);
+	assign Nd9gh7[29] = Cjhgh7;
+	assign Pctfh7 = (!Cjhgh7);
+	assign Nd9gh7[30] = Fkhgh7;
+	assign Bdtfh7 = (!Fkhgh7);
+	assign Nd9gh7[31] = Ilhgh7;
+	assign Hdtfh7 = (!Ilhgh7);
+	assign Re8gh7 = (!Lmhgh7);
+	assign Le8gh7 = (!Mnhgh7);
+	assign ahb_hwdata[1] = Mohgh7;
+	assign Pltfh7 = (!Mohgh7);
+	assign com_tx_tdata[5] = Rphgh7;
+	assign com_tx_tdata[4] = Vqhgh7;
+	assign com_tx_tdata[3] = Zrhgh7;
+	assign com_tx_tdata[1] = Dthgh7;
+	assign Lktfh7 = (!Dthgh7);
+	assign com_tx_tdata[6] = Huhgh7;
+	assign Rktfh7 = (!Huhgh7);
+	assign com_tx_tdata[2] = Lvhgh7;
+	assign com_tx_tdata[0] = Pwhgh7;
+	assign Txhgh7 = ({Nd9gh7, 1'b0} - {{1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0,
+		1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0,
+		1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0,
+		1'b0, 1'b0, 1'b0, 1'b0, 1'b0, Tosfh7}, 1'b0});
+	assign {B5sfh7, R5sfh7, H6sfh7, X6sfh7, N7sfh7, D8sfh7, T8sfh7, J9sfh7,
+		Z9sfh7, Pasfh7, Fbsfh7, Vbsfh7, Lcsfh7, Bdsfh7, Rdsfh7, Hesfh7,
+		Xesfh7, Nfsfh7, Dgsfh7, Tgsfh7, Jhsfh7, Zhsfh7, Pisfh7, Fjsfh7,
+		Vjsfh7, Lksfh7, Blsfh7, Rlsfh7, Hmsfh7, Xmsfh7, Nnsfh7, Dosfh7}
+		= Txhgh7[33:1];
+	assign Wyhgh7 = ({ahb_haddr, 1'b0} + {{1'b0, 1'b0, 1'b0, 1'b0, 1'b0,
+		1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0,
+		1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0,
+		1'b0, 1'b0, 1'b0, 1'b0, B9tfh7, 1'b0, 1'b0}, 1'b1});
+	assign {Jpsfh7, Zpsfh7, Pqsfh7, Frsfh7, Vrsfh7, Lssfh7, Btsfh7, Rtsfh7,
+		Husfh7, Xusfh7, Nvsfh7, Dwsfh7, Twsfh7, Jxsfh7, Zxsfh7, Pysfh7,
+		Fzsfh7, Vzsfh7, L0tfh7, B1tfh7, R1tfh7, H2tfh7, X2tfh7, N3tfh7,
+		D4tfh7, T4tfh7, J5tfh7, Z5tfh7, P6tfh7, F7tfh7, V7tfh7, L8tfh7}
+		= Wyhgh7[33:1];
+	assign Duufh7 = (!Juufh7);
+	assign Juufh7 = (!ahb_hresetn);
+	assign Puufh7 = (!Vuufh7);
+	assign Vuufh7 = (!ahb_hclk);
+	assign Xtufh7 = (~(Bvufh7 & Hvufh7));
+	assign Hvufh7 = (~(stdio_tx_tdata[7] & Nvufh7));
+	assign Bvufh7 = (Tvufh7 & Zvufh7);
+	assign Zvufh7 = (~(com_rx_tdata[7] & Fwufh7));
+	assign Tvufh7 = (~(Lwufh7 & Rwufh7));
+	assign Rtufh7 = (~(Xwufh7 & Dxufh7));
+	assign Dxufh7 = (~(stdio_tx_tdata[6] & Nvufh7));
+	assign Xwufh7 = (Jxufh7 & Pxufh7);
+	assign Pxufh7 = (~(com_rx_tdata[6] & Fwufh7));
+	assign Jxufh7 = (~(Lwufh7 & Vxufh7));
+	assign Ltufh7 = (~(Byufh7 & Hyufh7));
+	assign Hyufh7 = (~(stdio_tx_tdata[5] & Nvufh7));
+	assign Byufh7 = (Nyufh7 & Tyufh7);
+	assign Tyufh7 = (~(com_rx_tdata[5] & Fwufh7));
+	assign Nyufh7 = (~(Lwufh7 & Zyufh7));
+	assign Ftufh7 = (~(Fzufh7 & Lzufh7));
+	assign Lzufh7 = (~(stdio_tx_tdata[4] & Nvufh7));
+	assign Fzufh7 = (Rzufh7 & Xzufh7);
+	assign Xzufh7 = (~(Fwufh7 & com_rx_tdata[4]));
+	assign Rzufh7 = (~(Lwufh7 & D0vfh7));
+	assign Zsufh7 = (~(J0vfh7 & P0vfh7));
+	assign P0vfh7 = (~(stdio_tx_tdata[3] & Nvufh7));
+	assign J0vfh7 = (V0vfh7 & B1vfh7);
+	assign B1vfh7 = (~(Fwufh7 & com_rx_tdata[3]));
+	assign V0vfh7 = (~(Lwufh7 & H1vfh7));
+	assign Tsufh7 = (~(N1vfh7 & T1vfh7));
+	assign T1vfh7 = (~(stdio_tx_tdata[2] & Nvufh7));
+	assign N1vfh7 = (Z1vfh7 & F2vfh7);
+	assign F2vfh7 = (~(com_rx_tdata[2] & Fwufh7));
+	assign Z1vfh7 = (~(Lwufh7 & L2vfh7));
+	assign Nsufh7 = (~(R2vfh7 & X2vfh7));
+	assign X2vfh7 = (~(stdio_tx_tdata[1] & Nvufh7));
+	assign R2vfh7 = (D3vfh7 & J3vfh7);
+	assign J3vfh7 = (~(Fwufh7 & com_rx_tdata[1]));
+	assign D3vfh7 = (~(Lwufh7 & P3vfh7));
+	assign Hsufh7 = (~(V3vfh7 & B4vfh7));
+	assign B4vfh7 = (~(stdio_tx_tdata[0] & Nvufh7));
+	assign V3vfh7 = (H4vfh7 & N4vfh7);
+	assign N4vfh7 = (~(Fwufh7 & com_rx_tdata[0]));
+	assign Fwufh7 = (~(Nvufh7 | T4vfh7));
+	assign H4vfh7 = (~(Lwufh7 & Z4vfh7));
+	assign Lwufh7 = (~(F5vfh7 | Nvufh7));
+	assign Nvufh7 = (~(L5vfh7 & stdio_tx_tready));
+	assign L5vfh7 = (Duufh7 & R5vfh7);
+	assign R5vfh7 = (X5vfh7 | D6vfh7);
+	assign Prufh7 = (~(J6vfh7 & P6vfh7));
+	assign J6vfh7 = (B7vfh7 ? V6vfh7 : Rb9gh7);
+	assign Jrufh7 = (B7vfh7 ? com_rx_tdata[7] : H7vfh7);
+	assign H7vfh7 = (!Zd8gh7);
+	assign Drufh7 = (B7vfh7 ? com_rx_tdata[6] : N7vfh7);
+	assign Xqufh7 = (~(T7vfh7 & P6vfh7));
+	assign T7vfh7 = (B7vfh7 ? Z7vfh7 : Fb9gh7);
+	assign Rqufh7 = (B7vfh7 ? com_rx_tdata[3] : F8vfh7);
+	assign Lqufh7 = (~(L8vfh7 & P6vfh7));
+	assign L8vfh7 = (B7vfh7 ? R8vfh7 : Ta9gh7);
+	assign Fqufh7 = (~(X8vfh7 & P6vfh7));
+	assign P6vfh7 = (~(D9vfh7 & B7vfh7));
+	assign X8vfh7 = (B7vfh7 ? J9vfh7 : Na9gh7);
+	assign B7vfh7 = (~(P9vfh7 & V9vfh7));
+	assign Zpufh7 = (Havfh7 ? ahb_hwrite : Bavfh7);
+	assign Bavfh7 = (~(Navfh7 & Tavfh7));
+	assign Navfh7 = (Zavfh7 & Fbvfh7);
+	assign Zavfh7 = (Lbvfh7 | Rbvfh7);
+	assign Tpufh7 = (~(Xbvfh7 & Dcvfh7));
+	assign Dcvfh7 = (Jcvfh7 & Pcvfh7);
+	assign Pcvfh7 = (~(Vcvfh7 & Bdvfh7));
+	assign Jcvfh7 = (Hdvfh7 & Ndvfh7);
+	assign Hdvfh7 = (~(Tdvfh7 & Zdvfh7));
+	assign Xbvfh7 = (Fevfh7 & Levfh7);
+	assign Levfh7 = (~(Revfh7 & ahb_haddr[31]));
+	assign Fevfh7 = (Xevfh7 & Dfvfh7);
+	assign Dfvfh7 = (~(Jfvfh7 & Pfvfh7));
+	assign Xevfh7 = (Vfvfh7 | Pl8gh7);
+	assign Npufh7 = (~(Bgvfh7 & Hgvfh7));
+	assign Hgvfh7 = (Ngvfh7 & Tgvfh7);
+	assign Tgvfh7 = (~(Jfvfh7 & Zgvfh7));
+	assign Ngvfh7 = (Fhvfh7 & Ndvfh7);
+	assign Fhvfh7 = (~(Lhvfh7 & Rhvfh7));
+	assign Lhvfh7 = (com_rx_tdata[0] ? Divfh7 : Xhvfh7);
+	assign Divfh7 = (~(Jivfh7 & Pivfh7));
+	assign Xhvfh7 = (Vivfh7 & Bjvfh7);
+	assign Bgvfh7 = (Hjvfh7 & Njvfh7);
+	assign Njvfh7 = (~(Revfh7 & ahb_haddr[0]));
+	assign Hjvfh7 = (Tjvfh7 & Zjvfh7);
+	assign Zjvfh7 = (~(Fkvfh7 & Z4vfh7));
+	assign Tjvfh7 = (Vfvfh7 | Hp8gh7);
+	assign Hpufh7 = (~(Lkvfh7 & Rkvfh7));
+	assign Rkvfh7 = (Xkvfh7 & Dlvfh7);
+	assign Dlvfh7 = (~(Vcvfh7 & Jlvfh7));
+	assign Xkvfh7 = (Plvfh7 & Ndvfh7);
+	assign Plvfh7 = (~(Tdvfh7 & Vlvfh7));
+	assign Lkvfh7 = (Bmvfh7 & Hmvfh7);
+	assign Hmvfh7 = (~(Revfh7 & ahb_haddr[30]));
+	assign Bmvfh7 = (Nmvfh7 & Tmvfh7);
+	assign Tmvfh7 = (~(Jfvfh7 & Zmvfh7));
+	assign Nmvfh7 = (Vfvfh7 | Zs8gh7);
+	assign Bpufh7 = (~(Fnvfh7 & Lnvfh7));
+	assign Lnvfh7 = (Rnvfh7 & Xnvfh7);
+	assign Xnvfh7 = (~(Vcvfh7 & Dovfh7));
+	assign Rnvfh7 = (Jovfh7 & Ndvfh7);
+	assign Jovfh7 = (~(Tdvfh7 & Povfh7));
+	assign Fnvfh7 = (Vovfh7 & Bpvfh7);
+	assign Bpvfh7 = (~(Revfh7 & ahb_haddr[29]));
+	assign Vovfh7 = (Hpvfh7 & Npvfh7);
+	assign Npvfh7 = (~(Jfvfh7 & Tpvfh7));
+	assign Hpvfh7 = (Vfvfh7 | Dl8gh7);
+	assign Voufh7 = (~(Zpvfh7 & Fqvfh7));
+	assign Fqvfh7 = (Lqvfh7 & Rqvfh7);
+	assign Rqvfh7 = (~(Vcvfh7 & Xqvfh7));
+	assign Lqvfh7 = (Drvfh7 & Ndvfh7);
+	assign Drvfh7 = (~(Tdvfh7 & Jrvfh7));
+	assign Zpvfh7 = (Prvfh7 & Vrvfh7);
+	assign Vrvfh7 = (~(Revfh7 & ahb_haddr[28]));
+	assign Prvfh7 = (Bsvfh7 & Hsvfh7);
+	assign Hsvfh7 = (~(Jfvfh7 & Nsvfh7));
+	assign Bsvfh7 = (Vfvfh7 | Xn8gh7);
+	assign Poufh7 = (~(Tsvfh7 & Zsvfh7));
+	assign Zsvfh7 = (Ftvfh7 & Ltvfh7);
+	assign Ltvfh7 = (~(Vcvfh7 & Zdvfh7));
+	assign Ftvfh7 = (Rtvfh7 & Ndvfh7);
+	assign Rtvfh7 = (~(Tdvfh7 & Xtvfh7));
+	assign Tsvfh7 = (Duvfh7 & Juvfh7);
+	assign Juvfh7 = (~(Revfh7 & ahb_haddr[27]));
+	assign Duvfh7 = (Puvfh7 & Vuvfh7);
+	assign Vuvfh7 = (~(Jfvfh7 & Bvvfh7));
+	assign Puvfh7 = (Vfvfh7 | Rk8gh7);
+	assign Joufh7 = (~(Hvvfh7 & Nvvfh7));
+	assign Nvvfh7 = (Tvvfh7 & Zvvfh7);
+	assign Zvvfh7 = (~(Vcvfh7 & Vlvfh7));
+	assign Tvvfh7 = (Fwvfh7 & Ndvfh7);
+	assign Fwvfh7 = (~(Tdvfh7 & Lwvfh7));
+	assign Hvvfh7 = (Rwvfh7 & Xwvfh7);
+	assign Xwvfh7 = (~(Revfh7 & ahb_haddr[26]));
+	assign Rwvfh7 = (Dxvfh7 & Jxvfh7);
+	assign Jxvfh7 = (~(Jfvfh7 & Pxvfh7));
+	assign Dxvfh7 = (Vfvfh7 | Ns8gh7);
+	assign Doufh7 = (~(Vxvfh7 & Byvfh7));
+	assign Byvfh7 = (Hyvfh7 & Nyvfh7);
+	assign Nyvfh7 = (~(Vcvfh7 & Povfh7));
+	assign Hyvfh7 = (Tyvfh7 & Ndvfh7);
+	assign Tyvfh7 = (~(Tdvfh7 & Zyvfh7));
+	assign Vxvfh7 = (Fzvfh7 & Lzvfh7);
+	assign Lzvfh7 = (~(Revfh7 & ahb_haddr[25]));
+	assign Fzvfh7 = (Rzvfh7 & Xzvfh7);
+	assign Xzvfh7 = (~(Jfvfh7 & D0wfh7));
+	assign Rzvfh7 = (Vfvfh7 | Fk8gh7);
+	assign Xnufh7 = (~(J0wfh7 & P0wfh7));
+	assign P0wfh7 = (V0wfh7 & B1wfh7);
+	assign B1wfh7 = (~(Vcvfh7 & Jrvfh7));
+	assign V0wfh7 = (H1wfh7 & Ndvfh7);
+	assign H1wfh7 = (~(Tdvfh7 & N1wfh7));
+	assign J0wfh7 = (T1wfh7 & Z1wfh7);
+	assign Z1wfh7 = (~(Revfh7 & ahb_haddr[24]));
+	assign T1wfh7 = (F2wfh7 & L2wfh7);
+	assign L2wfh7 = (~(Jfvfh7 & R2wfh7));
+	assign F2wfh7 = (Vfvfh7 | Jo8gh7);
+	assign Rnufh7 = (~(X2wfh7 & D3wfh7));
+	assign D3wfh7 = (J3wfh7 & P3wfh7);
+	assign P3wfh7 = (~(Vcvfh7 & Xtvfh7));
+	assign J3wfh7 = (V3wfh7 & Ndvfh7);
+	assign V3wfh7 = (~(Tdvfh7 & B4wfh7));
+	assign X2wfh7 = (H4wfh7 & N4wfh7);
+	assign N4wfh7 = (~(Revfh7 & ahb_haddr[23]));
+	assign H4wfh7 = (T4wfh7 & Z4wfh7);
+	assign Z4wfh7 = (~(Jfvfh7 & F5wfh7));
+	assign T4wfh7 = (Vfvfh7 | Tj8gh7);
+	assign Lnufh7 = (~(L5wfh7 & R5wfh7));
+	assign R5wfh7 = (X5wfh7 & D6wfh7);
+	assign D6wfh7 = (~(Vcvfh7 & Lwvfh7));
+	assign X5wfh7 = (J6wfh7 & Ndvfh7);
+	assign J6wfh7 = (~(Tdvfh7 & P6wfh7));
+	assign L5wfh7 = (V6wfh7 & B7wfh7);
+	assign B7wfh7 = (~(Revfh7 & ahb_haddr[22]));
+	assign V6wfh7 = (H7wfh7 & N7wfh7);
+	assign N7wfh7 = (~(Jfvfh7 & T7wfh7));
+	assign H7wfh7 = (Vfvfh7 | Bs8gh7);
+	assign Fnufh7 = (~(Z7wfh7 & F8wfh7));
+	assign F8wfh7 = (L8wfh7 & R8wfh7);
+	assign R8wfh7 = (~(Vcvfh7 & Zyvfh7));
+	assign L8wfh7 = (X8wfh7 & Ndvfh7);
+	assign X8wfh7 = (~(Tdvfh7 & D9wfh7));
+	assign Z7wfh7 = (J9wfh7 & P9wfh7);
+	assign P9wfh7 = (~(Revfh7 & ahb_haddr[21]));
+	assign J9wfh7 = (V9wfh7 & Bawfh7);
+	assign Bawfh7 = (~(Jfvfh7 & Hawfh7));
+	assign V9wfh7 = (Vfvfh7 | Hj8gh7);
+	assign Zmufh7 = (~(Nawfh7 & Tawfh7));
+	assign Tawfh7 = (Zawfh7 & Fbwfh7);
+	assign Fbwfh7 = (~(Vcvfh7 & N1wfh7));
+	assign Zawfh7 = (Lbwfh7 & Ndvfh7);
+	assign Lbwfh7 = (~(Tdvfh7 & Rbwfh7));
+	assign Nawfh7 = (Xbwfh7 & Dcwfh7);
+	assign Dcwfh7 = (~(Revfh7 & ahb_haddr[20]));
+	assign Xbwfh7 = (Jcwfh7 & Pcwfh7);
+	assign Pcwfh7 = (~(Jfvfh7 & Vcwfh7));
+	assign Jcwfh7 = (Vfvfh7 | Ln8gh7);
+	assign Tmufh7 = (~(Bdwfh7 & Hdwfh7));
+	assign Hdwfh7 = (Ndwfh7 & Tdwfh7);
+	assign Tdwfh7 = (~(Vcvfh7 & B4wfh7));
+	assign Ndwfh7 = (Zdwfh7 & Ndvfh7);
+	assign Zdwfh7 = (~(Tdvfh7 & Fewfh7));
+	assign Bdwfh7 = (Lewfh7 & Rewfh7);
+	assign Rewfh7 = (~(Revfh7 & ahb_haddr[19]));
+	assign Lewfh7 = (Xewfh7 & Dfwfh7);
+	assign Dfwfh7 = (~(Jfvfh7 & Jfwfh7));
+	assign Xewfh7 = (Vfvfh7 | Vi8gh7);
+	assign Nmufh7 = (~(Pfwfh7 & Vfwfh7));
+	assign Vfwfh7 = (Bgwfh7 & Hgwfh7);
+	assign Hgwfh7 = (~(Vcvfh7 & P6wfh7));
+	assign Bgwfh7 = (Ngwfh7 & Ndvfh7);
+	assign Ngwfh7 = (~(Tdvfh7 & Tgwfh7));
+	assign Pfwfh7 = (Zgwfh7 & Fhwfh7);
+	assign Fhwfh7 = (~(Revfh7 & ahb_haddr[18]));
+	assign Zgwfh7 = (Lhwfh7 & Rhwfh7);
+	assign Rhwfh7 = (~(Jfvfh7 & Xhwfh7));
+	assign Lhwfh7 = (Vfvfh7 | Pr8gh7);
+	assign Hmufh7 = (~(Diwfh7 & Jiwfh7));
+	assign Jiwfh7 = (Piwfh7 & Viwfh7);
+	assign Viwfh7 = (~(Vcvfh7 & D9wfh7));
+	assign Piwfh7 = (Bjwfh7 & Ndvfh7);
+	assign Bjwfh7 = (~(Tdvfh7 & Hjwfh7));
+	assign Diwfh7 = (Njwfh7 & Tjwfh7);
+	assign Tjwfh7 = (~(Revfh7 & ahb_haddr[17]));
+	assign Njwfh7 = (Zjwfh7 & Fkwfh7);
+	assign Fkwfh7 = (~(Jfvfh7 & Lkwfh7));
+	assign Zjwfh7 = (Vfvfh7 | Ji8gh7);
+	assign Bmufh7 = (~(Rkwfh7 & Xkwfh7));
+	assign Xkwfh7 = (Dlwfh7 & Jlwfh7);
+	assign Jlwfh7 = (~(Vcvfh7 & Rbwfh7));
+	assign Dlwfh7 = (Plwfh7 & Ndvfh7);
+	assign Plwfh7 = (~(Tdvfh7 & Vlwfh7));
+	assign Rkwfh7 = (Bmwfh7 & Hmwfh7);
+	assign Hmwfh7 = (~(Revfh7 & ahb_haddr[16]));
+	assign Bmwfh7 = (Nmwfh7 & Tmwfh7);
+	assign Tmwfh7 = (~(Jfvfh7 & Zmwfh7));
+	assign Nmwfh7 = (Vfvfh7 | Vo8gh7);
+	assign Vlufh7 = (~(Fnwfh7 & Lnwfh7));
+	assign Lnwfh7 = (Rnwfh7 & Xnwfh7);
+	assign Xnwfh7 = (~(Vcvfh7 & Fewfh7));
+	assign Rnwfh7 = (Dowfh7 & Ndvfh7);
+	assign Dowfh7 = (~(Tdvfh7 & Jowfh7));
+	assign Fnwfh7 = (Powfh7 & Vowfh7);
+	assign Vowfh7 = (~(Revfh7 & ahb_haddr[15]));
+	assign Powfh7 = (Bpwfh7 & Hpwfh7);
+	assign Hpwfh7 = (~(Jfvfh7 & Npwfh7));
+	assign Bpwfh7 = (Vfvfh7 | Xh8gh7);
+	assign Plufh7 = (~(Tpwfh7 & Zpwfh7));
+	assign Zpwfh7 = (Fqwfh7 & Lqwfh7);
+	assign Lqwfh7 = (~(Vcvfh7 & Tgwfh7));
+	assign Fqwfh7 = (Rqwfh7 & Ndvfh7);
+	assign Rqwfh7 = (~(Tdvfh7 & Xqwfh7));
+	assign Tpwfh7 = (Drwfh7 & Jrwfh7);
+	assign Jrwfh7 = (~(Revfh7 & ahb_haddr[14]));
+	assign Drwfh7 = (Prwfh7 & Vrwfh7);
+	assign Vrwfh7 = (~(Jfvfh7 & Bswfh7));
+	assign Prwfh7 = (Vfvfh7 | Dr8gh7);
+	assign Jlufh7 = (~(Hswfh7 & Nswfh7));
+	assign Nswfh7 = (Tswfh7 & Zswfh7);
+	assign Zswfh7 = (~(Vcvfh7 & Hjwfh7));
+	assign Tswfh7 = (Ftwfh7 & Ndvfh7);
+	assign Ftwfh7 = (~(Tdvfh7 & Ltwfh7));
+	assign Hswfh7 = (Rtwfh7 & Xtwfh7);
+	assign Xtwfh7 = (~(Revfh7 & ahb_haddr[13]));
+	assign Rtwfh7 = (Duwfh7 & Juwfh7);
+	assign Juwfh7 = (~(Jfvfh7 & Puwfh7));
+	assign Duwfh7 = (Vfvfh7 | Lh8gh7);
+	assign Dlufh7 = (~(Vuwfh7 & Bvwfh7));
+	assign Bvwfh7 = (Hvwfh7 & Nvwfh7);
+	assign Nvwfh7 = (~(Vcvfh7 & Vlwfh7));
+	assign Hvwfh7 = (Tvwfh7 & Ndvfh7);
+	assign Tvwfh7 = (~(Tdvfh7 & Zvwfh7));
+	assign Vuwfh7 = (Fwwfh7 & Lwwfh7);
+	assign Lwwfh7 = (~(Revfh7 & ahb_haddr[12]));
+	assign Fwwfh7 = (Rwwfh7 & Xwwfh7);
+	assign Xwwfh7 = (~(Jfvfh7 & Dxwfh7));
+	assign Rwwfh7 = (Vfvfh7 | Nm8gh7);
+	assign Xkufh7 = (~(Jxwfh7 & Pxwfh7));
+	assign Pxwfh7 = (Vxwfh7 & Bywfh7);
+	assign Bywfh7 = (~(Vcvfh7 & Jowfh7));
+	assign Vxwfh7 = (Hywfh7 & Ndvfh7);
+	assign Hywfh7 = (~(Tdvfh7 & Rwufh7));
+	assign Jxwfh7 = (Nywfh7 & Tywfh7);
+	assign Tywfh7 = (~(Revfh7 & ahb_haddr[11]));
+	assign Nywfh7 = (Zywfh7 & Fzwfh7);
+	assign Fzwfh7 = (~(Jfvfh7 & Lzwfh7));
+	assign Zywfh7 = (Vfvfh7 | Zg8gh7);
+	assign Rkufh7 = (~(Rzwfh7 & Xzwfh7));
+	assign Xzwfh7 = (D0xfh7 & J0xfh7);
+	assign J0xfh7 = (~(Vcvfh7 & Xqwfh7));
+	assign D0xfh7 = (P0xfh7 & Ndvfh7);
+	assign P0xfh7 = (~(Tdvfh7 & Vxufh7));
+	assign Rzwfh7 = (V0xfh7 & B1xfh7);
+	assign B1xfh7 = (~(Revfh7 & ahb_haddr[10]));
+	assign V0xfh7 = (H1xfh7 & N1xfh7);
+	assign N1xfh7 = (~(Jfvfh7 & T1xfh7));
+	assign H1xfh7 = (Vfvfh7 | Rq8gh7);
+	assign Lkufh7 = (~(Z1xfh7 & F2xfh7));
+	assign F2xfh7 = (L2xfh7 & R2xfh7);
+	assign R2xfh7 = (~(Vcvfh7 & Ltwfh7));
+	assign L2xfh7 = (X2xfh7 & Ndvfh7);
+	assign X2xfh7 = (~(Tdvfh7 & Zyufh7));
+	assign Z1xfh7 = (D3xfh7 & J3xfh7);
+	assign J3xfh7 = (~(Revfh7 & ahb_haddr[9]));
+	assign D3xfh7 = (P3xfh7 & V3xfh7);
+	assign V3xfh7 = (~(Jfvfh7 & B4xfh7));
+	assign P3xfh7 = (Vfvfh7 | Ng8gh7);
+	assign Fkufh7 = (~(H4xfh7 & N4xfh7));
+	assign N4xfh7 = (T4xfh7 & Z4xfh7);
+	assign Z4xfh7 = (~(Vcvfh7 & Zvwfh7));
+	assign T4xfh7 = (F5xfh7 & Ndvfh7);
+	assign F5xfh7 = (~(Tdvfh7 & D0vfh7));
+	assign H4xfh7 = (L5xfh7 & R5xfh7);
+	assign R5xfh7 = (~(Revfh7 & ahb_haddr[8]));
+	assign L5xfh7 = (X5xfh7 & D6xfh7);
+	assign D6xfh7 = (~(Jfvfh7 & J6xfh7));
+	assign X5xfh7 = (Vfvfh7 | Zm8gh7);
+	assign Zjufh7 = (~(P6xfh7 & V6xfh7));
+	assign V6xfh7 = (B7xfh7 & H7xfh7);
+	assign H7xfh7 = (~(Vcvfh7 & Rwufh7));
+	assign B7xfh7 = (N7xfh7 & Ndvfh7);
+	assign N7xfh7 = (~(Tdvfh7 & H1vfh7));
+	assign P6xfh7 = (T7xfh7 & Z7xfh7);
+	assign Z7xfh7 = (~(Revfh7 & ahb_haddr[7]));
+	assign T7xfh7 = (F8xfh7 & L8xfh7);
+	assign L8xfh7 = (~(Jfvfh7 & R8xfh7));
+	assign F8xfh7 = (Vfvfh7 | Bg8gh7);
+	assign Tjufh7 = (~(X8xfh7 & D9xfh7));
+	assign D9xfh7 = (J9xfh7 & P9xfh7);
+	assign P9xfh7 = (~(Vcvfh7 & Vxufh7));
+	assign J9xfh7 = (V9xfh7 & Ndvfh7);
+	assign V9xfh7 = (~(Tdvfh7 & L2vfh7));
+	assign X8xfh7 = (Baxfh7 & Haxfh7);
+	assign Haxfh7 = (~(Revfh7 & ahb_haddr[6]));
+	assign Baxfh7 = (Naxfh7 & Taxfh7);
+	assign Taxfh7 = (~(Jfvfh7 & Zaxfh7));
+	assign Naxfh7 = (Vfvfh7 | Fq8gh7);
+	assign Njufh7 = (~(Fbxfh7 & Lbxfh7));
+	assign Lbxfh7 = (Rbxfh7 & Xbxfh7);
+	assign Xbxfh7 = (~(Vcvfh7 & Zyufh7));
+	assign Rbxfh7 = (Dcxfh7 & Ndvfh7);
+	assign Dcxfh7 = (~(Tdvfh7 & P3vfh7));
+	assign Fbxfh7 = (Jcxfh7 & Pcxfh7);
+	assign Pcxfh7 = (~(Revfh7 & ahb_haddr[5]));
+	assign Jcxfh7 = (Vcxfh7 & Bdxfh7);
+	assign Bdxfh7 = (~(Jfvfh7 & Hdxfh7));
+	assign Vcxfh7 = (Vfvfh7 | Pf8gh7);
+	assign Hjufh7 = (~(Ndxfh7 & Tdxfh7));
+	assign Tdxfh7 = (Zdxfh7 & Fexfh7);
+	assign Fexfh7 = (~(Vcvfh7 & D0vfh7));
+	assign Vcvfh7 = (~(Lexfh7 & Rexfh7));
+	assign Rexfh7 = (~(Xexfh7 & Dfxfh7));
+	assign Zdxfh7 = (Jfxfh7 & Ndvfh7);
+	assign Jfxfh7 = (~(Tdvfh7 & Z4vfh7));
+	assign Tdvfh7 = (Rhvfh7 & Pfxfh7);
+	assign Pfxfh7 = (Vfxfh7 | Bgxfh7);
+	assign Ndxfh7 = (Hgxfh7 & Ngxfh7);
+	assign Ngxfh7 = (~(Revfh7 & ahb_haddr[4]));
+	assign Hgxfh7 = (Tgxfh7 & Zgxfh7);
+	assign Zgxfh7 = (~(Jfvfh7 & Fhxfh7));
+	assign Tgxfh7 = (Vfvfh7 | Bm8gh7);
+	assign Bjufh7 = (~(Lhxfh7 & Rhxfh7));
+	assign Rhxfh7 = (Xhxfh7 & Dixfh7);
+	assign Dixfh7 = (~(Jfvfh7 & Jixfh7));
+	assign Xhxfh7 = (Pixfh7 & Ndvfh7);
+	assign Pixfh7 = (~(Rhvfh7 & Vfxfh7));
+	assign Vfxfh7 = (~(Vixfh7 & Bjxfh7));
+	assign Vixfh7 = (Hjxfh7 & Jivfh7);
+	assign Jivfh7 = (~(Njxfh7 & Tjxfh7));
+	assign Njxfh7 = (Zjxfh7 & com_rx_tdata[3]);
+	assign Lhxfh7 = (Fkxfh7 & Lkxfh7);
+	assign Lkxfh7 = (~(Revfh7 & ahb_haddr[3]));
+	assign Fkxfh7 = (Rkxfh7 & Xkxfh7);
+	assign Xkxfh7 = (~(Fkvfh7 & H1vfh7));
+	assign Rkxfh7 = (Vfvfh7 | Df8gh7);
+	assign Viufh7 = (~(Dlxfh7 & Jlxfh7));
+	assign Jlxfh7 = (Plxfh7 & Vlxfh7);
+	assign Vlxfh7 = (~(Jfvfh7 & Bmxfh7));
+	assign Plxfh7 = (Hmxfh7 & Ndvfh7);
+	assign Hmxfh7 = (~(Rhvfh7 & Nmxfh7));
+	assign Nmxfh7 = (~(Bjxfh7 & Tmxfh7));
+	assign Tmxfh7 = (~(com_rx_tdata[2] & Zmxfh7));
+	assign Zmxfh7 = (~(Pivfh7 & Fnxfh7));
+	assign Fnxfh7 = (~(Vivfh7 & J9vfh7));
+	assign Pivfh7 = (!Bgxfh7);
+	assign Bjxfh7 = (~(Lnxfh7 & Vivfh7));
+	assign Lnxfh7 = (Rnxfh7 & Bjvfh7);
+	assign Rnxfh7 = (R8vfh7 ^ V6vfh7);
+	assign Dlxfh7 = (Xnxfh7 & Doxfh7);
+	assign Doxfh7 = (~(Revfh7 & ahb_haddr[2]));
+	assign Xnxfh7 = (Joxfh7 & Poxfh7);
+	assign Poxfh7 = (~(Fkvfh7 & L2vfh7));
+	assign Joxfh7 = (Vfvfh7 | Tp8gh7);
+	assign Piufh7 = (~(Voxfh7 & Bpxfh7));
+	assign Bpxfh7 = (Hpxfh7 & Npxfh7);
+	assign Npxfh7 = (~(Jfvfh7 & Tpxfh7));
+	assign Jfvfh7 = (Zpxfh7 & Fqxfh7);
+	assign Zpxfh7 = (Lqxfh7 & Rqxfh7);
+	assign Hpxfh7 = (Xqxfh7 & Ndvfh7);
+	assign Ndvfh7 = (Drxfh7 | Jrxfh7);
+	assign Xqxfh7 = (~(Rhvfh7 & Prxfh7));
+	assign Prxfh7 = (~(Hjxfh7 & Vrxfh7));
+	assign Vrxfh7 = (~(Bgxfh7 & com_rx_tdata[1]));
+	assign Bgxfh7 = (Tjxfh7 & Bsxfh7);
+	assign Tjxfh7 = (Hsxfh7 & com_rx_tdata[5]);
+	assign Hsxfh7 = (~(Z7vfh7 | com_rx_tdata[6]));
+	assign Hjxfh7 = (~(Nsxfh7 & Vivfh7));
+	assign Vivfh7 = (Tsxfh7 & com_rx_tdata[6]);
+	assign Tsxfh7 = (Bsxfh7 & Z7vfh7);
+	assign Nsxfh7 = (~(Zsxfh7 | Ftxfh7));
+	assign Zsxfh7 = (V6vfh7 & J9vfh7);
+	assign Voxfh7 = (Ltxfh7 & Rtxfh7);
+	assign Rtxfh7 = (~(Revfh7 & ahb_haddr[1]));
+	assign Revfh7 = (~(Xtxfh7 | Jrxfh7));
+	assign Ltxfh7 = (Duxfh7 & Juxfh7);
+	assign Juxfh7 = (~(Fkvfh7 & P3vfh7));
+	assign Fkvfh7 = (~(Lexfh7 & Puxfh7));
+	assign Puxfh7 = (~(Rhvfh7 & Dfxfh7));
+	assign Dfxfh7 = (~(Vuxfh7 & Bvxfh7));
+	assign Bvxfh7 = (~(Hvxfh7 | Nvxfh7));
+	assign Vuxfh7 = (Tvxfh7 & Zvxfh7);
+	assign Zvxfh7 = (~(Z7vfh7 & Fwxfh7));
+	assign Fwxfh7 = (~(Lwxfh7 & Rwxfh7));
+	assign Rwxfh7 = (com_rx_tdata[6] ? Dxxfh7 : Xwxfh7);
+	assign Dxxfh7 = (~(Zjxfh7 & V6vfh7));
+	assign Xwxfh7 = (~(com_rx_tdata[0] & Bsxfh7));
+	assign Lwxfh7 = (Jxxfh7 & Pxxfh7);
+	assign Pxxfh7 = (~(Ftxfh7 & com_rx_tdata[2]));
+	assign Jxxfh7 = (~(com_rx_tdata[5] & com_rx_tdata[3]));
+	assign Tvxfh7 = (com_rx_tdata[6] ? Byxfh7 : Vxxfh7);
+	assign Byxfh7 = (Bsxfh7 ? Z7vfh7 : V6vfh7);
+	assign Vxxfh7 = (~(Hyxfh7 | Nyxfh7));
+	assign Hyxfh7 = (Z7vfh7 & Bjvfh7);
+	assign Rhvfh7 = (Tyxfh7 & Xexfh7);
+	assign Tyxfh7 = (~(Jrxfh7 | com_rx_tdata[7]));
+	assign Lexfh7 = (Zyxfh7 & Fzxfh7);
+	assign Fzxfh7 = (~(Lzxfh7 | Jrxfh7));
+	assign Jrxfh7 = (Rzxfh7 & Xzxfh7);
+	assign Xzxfh7 = (D0yfh7 & V9vfh7);
+	assign Rzxfh7 = (J0yfh7 & P0yfh7);
+	assign P0yfh7 = (~(Xexfh7 & V0yfh7));
+	assign J0yfh7 = (Xtxfh7 | B1yfh7);
+	assign Zyxfh7 = (H1yfh7 & N1yfh7);
+	assign H1yfh7 = (~(Xexfh7 & com_rx_tdata[7]));
+	assign Duxfh7 = (Vfvfh7 | Re8gh7);
+	assign Vfvfh7 = (~(T1yfh7 & Lqxfh7));
+	assign T1yfh7 = (Z1yfh7 & Rqxfh7);
+	assign Jiufh7 = (!F2yfh7);
+	assign F2yfh7 = (N1yfh7 ? Hp8gh7 : Jc9gh7);
+	assign Diufh7 = (!L2yfh7);
+	assign L2yfh7 = (N1yfh7 ? Zs8gh7 : D39gh7);
+	assign Xhufh7 = (!R2yfh7);
+	assign R2yfh7 = (N1yfh7 ? Dl8gh7 : F89gh7);
+	assign Rhufh7 = (!X2yfh7);
+	assign X2yfh7 = (N1yfh7 ? Xn8gh7 : D69gh7);
+	assign Lhufh7 = (!D3yfh7);
+	assign D3yfh7 = (N1yfh7 ? Rk8gh7 : T49gh7);
+	assign Fhufh7 = (!J3yfh7);
+	assign J3yfh7 = (N1yfh7 ? Ns8gh7 : J39gh7);
+	assign Zgufh7 = (!P3yfh7);
+	assign P3yfh7 = (N1yfh7 ? Fk8gh7 : L89gh7);
+	assign Tgufh7 = (!V3yfh7);
+	assign V3yfh7 = (N1yfh7 ? Jo8gh7 : J69gh7);
+	assign Ngufh7 = (!B4yfh7);
+	assign B4yfh7 = (N1yfh7 ? Tj8gh7 : Z49gh7);
+	assign Hgufh7 = (!H4yfh7);
+	assign H4yfh7 = (N1yfh7 ? Bs8gh7 : P39gh7);
+	assign Bgufh7 = (!N4yfh7);
+	assign N4yfh7 = (N1yfh7 ? Hj8gh7 : R89gh7);
+	assign Vfufh7 = (!T4yfh7);
+	assign T4yfh7 = (N1yfh7 ? Ln8gh7 : P69gh7);
+	assign Pfufh7 = (!Z4yfh7);
+	assign Z4yfh7 = (N1yfh7 ? Vi8gh7 : F59gh7);
+	assign Jfufh7 = (!F5yfh7);
+	assign F5yfh7 = (N1yfh7 ? Pr8gh7 : V39gh7);
+	assign Dfufh7 = (!L5yfh7);
+	assign L5yfh7 = (N1yfh7 ? Ji8gh7 : X89gh7);
+	assign Xeufh7 = (!R5yfh7);
+	assign R5yfh7 = (N1yfh7 ? Vo8gh7 : V69gh7);
+	assign Reufh7 = (!X5yfh7);
+	assign X5yfh7 = (N1yfh7 ? Xh8gh7 : L59gh7);
+	assign Leufh7 = (!D6yfh7);
+	assign D6yfh7 = (N1yfh7 ? Dr8gh7 : B49gh7);
+	assign Feufh7 = (!J6yfh7);
+	assign J6yfh7 = (N1yfh7 ? Lh8gh7 : D99gh7);
+	assign Zdufh7 = (!P6yfh7);
+	assign P6yfh7 = (N1yfh7 ? Nm8gh7 : B79gh7);
+	assign Tdufh7 = (!V6yfh7);
+	assign V6yfh7 = (N1yfh7 ? Zg8gh7 : R59gh7);
+	assign Ndufh7 = (!B7yfh7);
+	assign B7yfh7 = (N1yfh7 ? Rq8gh7 : H49gh7);
+	assign Hdufh7 = (!H7yfh7);
+	assign H7yfh7 = (N1yfh7 ? Ng8gh7 : J99gh7);
+	assign Bdufh7 = (!N7yfh7);
+	assign N7yfh7 = (N1yfh7 ? Zm8gh7 : H79gh7);
+	assign Vcufh7 = (!T7yfh7);
+	assign T7yfh7 = (N1yfh7 ? Bg8gh7 : X59gh7);
+	assign Pcufh7 = (!Z7yfh7);
+	assign Z7yfh7 = (N1yfh7 ? Fq8gh7 : N49gh7);
+	assign Jcufh7 = (!F8yfh7);
+	assign F8yfh7 = (N1yfh7 ? Pf8gh7 : P99gh7);
+	assign Dcufh7 = (!L8yfh7);
+	assign L8yfh7 = (N1yfh7 ? Bm8gh7 : Dc9gh7);
+	assign Xbufh7 = (!R8yfh7);
+	assign R8yfh7 = (N1yfh7 ? Df8gh7 : N79gh7);
+	assign Rbufh7 = (!X8yfh7);
+	assign X8yfh7 = (D9yfh7 ? T79gh7 : Tp8gh7);
+	assign Lbufh7 = (!J9yfh7);
+	assign J9yfh7 = (N1yfh7 ? Re8gh7 : Vc9gh7);
+	assign N1yfh7 = (!D9yfh7);
+	assign Fbufh7 = (P9yfh7 ? Zgvfh7 : Z4vfh7);
+	assign Zaufh7 = (P9yfh7 ? Zmvfh7 : Jlvfh7);
+	assign Taufh7 = (P9yfh7 ? Tpvfh7 : Dovfh7);
+	assign Naufh7 = (P9yfh7 ? Nsvfh7 : Xqvfh7);
+	assign Haufh7 = (P9yfh7 ? Bvvfh7 : Zdvfh7);
+	assign Baufh7 = (P9yfh7 ? Pxvfh7 : Vlvfh7);
+	assign V9ufh7 = (P9yfh7 ? D0wfh7 : Povfh7);
+	assign P9ufh7 = (P9yfh7 ? R2wfh7 : Jrvfh7);
+	assign J9ufh7 = (P9yfh7 ? F5wfh7 : Xtvfh7);
+	assign D9ufh7 = (P9yfh7 ? T7wfh7 : Lwvfh7);
+	assign X8ufh7 = (P9yfh7 ? Hawfh7 : Zyvfh7);
+	assign R8ufh7 = (P9yfh7 ? Vcwfh7 : N1wfh7);
+	assign L8ufh7 = (P9yfh7 ? Jfwfh7 : B4wfh7);
+	assign F8ufh7 = (P9yfh7 ? Xhwfh7 : P6wfh7);
+	assign Z7ufh7 = (P9yfh7 ? Lkwfh7 : D9wfh7);
+	assign T7ufh7 = (P9yfh7 ? Zmwfh7 : Rbwfh7);
+	assign N7ufh7 = (P9yfh7 ? Npwfh7 : Fewfh7);
+	assign H7ufh7 = (P9yfh7 ? Bswfh7 : Tgwfh7);
+	assign B7ufh7 = (P9yfh7 ? Puwfh7 : Hjwfh7);
+	assign V6ufh7 = (P9yfh7 ? Dxwfh7 : Vlwfh7);
+	assign P6ufh7 = (P9yfh7 ? Lzwfh7 : Jowfh7);
+	assign J6ufh7 = (P9yfh7 ? T1xfh7 : Xqwfh7);
+	assign D6ufh7 = (P9yfh7 ? B4xfh7 : Ltwfh7);
+	assign X5ufh7 = (P9yfh7 ? J6xfh7 : Zvwfh7);
+	assign R5ufh7 = (P9yfh7 ? R8xfh7 : Rwufh7);
+	assign L5ufh7 = (P9yfh7 ? Zaxfh7 : Vxufh7);
+	assign F5ufh7 = (P9yfh7 ? Hdxfh7 : Zyufh7);
+	assign Z4ufh7 = (P9yfh7 ? Fhxfh7 : D0vfh7);
+	assign T4ufh7 = (P9yfh7 ? Jixfh7 : H1vfh7);
+	assign N4ufh7 = (P9yfh7 ? Bmxfh7 : L2vfh7);
+	assign P9yfh7 = (!Lzxfh7);
+	assign H4ufh7 = (Lzxfh7 ? P3vfh7 : Tpxfh7);
+	assign B4ufh7 = (~(V9yfh7 & Bayfh7));
+	assign Bayfh7 = (Hayfh7 | Vitfh7);
+	assign Hayfh7 = (Nayfh7 & Tayfh7);
+	assign Tayfh7 = (~(Vc9gh7 & Zayfh7));
+	assign V9yfh7 = (~(Fbyfh7 & P3vfh7));
+	assign V3ufh7 = (~(Lbyfh7 & Rbyfh7));
+	assign Rbyfh7 = (Xbyfh7 | Pitfh7);
+	assign Xbyfh7 = (Nayfh7 & Dcyfh7);
+	assign Dcyfh7 = (~(Jc9gh7 & Zayfh7));
+	assign Lbyfh7 = (~(Fbyfh7 & Z4vfh7));
+	assign P3ufh7 = (~(Jcyfh7 & Pcyfh7));
+	assign Pcyfh7 = (Vcyfh7 | Bjtfh7);
+	assign Vcyfh7 = (Nayfh7 & Bdyfh7);
+	assign Bdyfh7 = (~(T79gh7 & Zayfh7));
+	assign Jcyfh7 = (~(Fbyfh7 & L2vfh7));
+	assign J3ufh7 = (~(Hdyfh7 & Ndyfh7));
+	assign Ndyfh7 = (Tdyfh7 | Hjtfh7);
+	assign Tdyfh7 = (Nayfh7 & Zdyfh7);
+	assign Zdyfh7 = (~(N79gh7 & Zayfh7));
+	assign Hdyfh7 = (~(Fbyfh7 & H1vfh7));
+	assign D3ufh7 = (~(Feyfh7 & Leyfh7));
+	assign Leyfh7 = (Reyfh7 | Njtfh7);
+	assign Reyfh7 = (Nayfh7 & Xeyfh7);
+	assign Xeyfh7 = (~(Dc9gh7 & Zayfh7));
+	assign Feyfh7 = (~(Fbyfh7 & D0vfh7));
+	assign X2ufh7 = (~(Dfyfh7 & Jfyfh7));
+	assign Jfyfh7 = (Pfyfh7 | Tjtfh7);
+	assign Pfyfh7 = (Nayfh7 & Vfyfh7);
+	assign Vfyfh7 = (~(P99gh7 & Zayfh7));
+	assign Dfyfh7 = (~(Fbyfh7 & Zyufh7));
+	assign R2ufh7 = (~(Bgyfh7 & Hgyfh7));
+	assign Hgyfh7 = (Ngyfh7 | Zjtfh7);
+	assign Ngyfh7 = (Nayfh7 & Tgyfh7);
+	assign Tgyfh7 = (~(N49gh7 & Zayfh7));
+	assign Bgyfh7 = (~(Fbyfh7 & Vxufh7));
+	assign L2ufh7 = (~(Zgyfh7 & Fhyfh7));
+	assign Fhyfh7 = (Lhyfh7 | Fktfh7);
+	assign Lhyfh7 = (Nayfh7 & Rhyfh7);
+	assign Rhyfh7 = (~(X59gh7 & Zayfh7));
+	assign Nayfh7 = (Xhyfh7 & Sorfh7);
+	assign Xhyfh7 = (Diyfh7 & Zvwfh7);
+	assign Zgyfh7 = (~(Fbyfh7 & Rwufh7));
+	assign Fbyfh7 = (Jiyfh7 & Sorfh7);
+	assign Jiyfh7 = (Diyfh7 & Ltwfh7);
+	assign F2ufh7 = (!Piyfh7);
+	assign Piyfh7 = (D9yfh7 ? Z79gh7 : Pl8gh7);
+	assign D9yfh7 = (Viyfh7 & Bjyfh7);
+	assign Viyfh7 = (Z1yfh7 & B1yfh7);
+	assign Z1yfh7 = (!Hjyfh7);
+	assign Z1ufh7 = (Lzxfh7 ? Bdvfh7 : Pfvfh7);
+	assign Lzxfh7 = (Njyfh7 & Fqxfh7);
+	assign Njyfh7 = (Rqxfh7 & B1yfh7);
+	assign T1ufh7 = (!Tjyfh7);
+	assign Tjyfh7 = (Fkyfh7 ? Jltfh7 : Zjyfh7);
+	assign Zjyfh7 = (Lkyfh7 & Rkyfh7);
+	assign Rkyfh7 = (Xkyfh7 & Dlyfh7);
+	assign Dlyfh7 = (~(ahb_hrdata[0] & Jlyfh7));
+	assign Xkyfh7 = (Plyfh7 | Jc9gh7);
+	assign Lkyfh7 = (Vlyfh7 & Bmyfh7);
+	assign Bmyfh7 = (~(Hmyfh7 & Zgvfh7));
+	assign Vlyfh7 = (~(Nmyfh7 & com_rx_tdata[0]));
+	assign N1ufh7 = (!Tmyfh7);
+	assign Tmyfh7 = (Fkyfh7 ? Pltfh7 : Zmyfh7);
+	assign Zmyfh7 = (Fnyfh7 & Lnyfh7);
+	assign Lnyfh7 = (Rnyfh7 & Xnyfh7);
+	assign Xnyfh7 = (~(ahb_hrdata[1] & Jlyfh7));
+	assign Rnyfh7 = (Plyfh7 | Vc9gh7);
+	assign Fnyfh7 = (Doyfh7 & Joyfh7);
+	assign Joyfh7 = (~(Hmyfh7 & Tpxfh7));
+	assign Doyfh7 = (~(Nmyfh7 & com_rx_tdata[1]));
+	assign H1ufh7 = (!Poyfh7);
+	assign Poyfh7 = (Fkyfh7 ? Vltfh7 : Voyfh7);
+	assign Voyfh7 = (Bpyfh7 & Hpyfh7);
+	assign Hpyfh7 = (Npyfh7 & Tpyfh7);
+	assign Tpyfh7 = (~(ahb_hrdata[2] & Jlyfh7));
+	assign Npyfh7 = (Plyfh7 | T79gh7);
+	assign Bpyfh7 = (Zpyfh7 & Fqyfh7);
+	assign Fqyfh7 = (~(Hmyfh7 & Bmxfh7));
+	assign Bmxfh7 = (!Np8gh7);
+	assign Zpyfh7 = (~(Nmyfh7 & com_rx_tdata[2]));
+	assign B1ufh7 = (!Lqyfh7);
+	assign Lqyfh7 = (Fkyfh7 ? Bmtfh7 : Rqyfh7);
+	assign Rqyfh7 = (Xqyfh7 & Dryfh7);
+	assign Dryfh7 = (Jryfh7 & Pryfh7);
+	assign Pryfh7 = (~(ahb_hrdata[3] & Jlyfh7));
+	assign Jryfh7 = (Plyfh7 | N79gh7);
+	assign Xqyfh7 = (Vryfh7 & Bsyfh7);
+	assign Bsyfh7 = (~(Hmyfh7 & Jixfh7));
+	assign Vryfh7 = (~(Nmyfh7 & com_rx_tdata[3]));
+	assign V0ufh7 = (!Hsyfh7);
+	assign Hsyfh7 = (Fkyfh7 ? Hmtfh7 : Nsyfh7);
+	assign Nsyfh7 = (Tsyfh7 & Zsyfh7);
+	assign Zsyfh7 = (Ftyfh7 & Ltyfh7);
+	assign Ltyfh7 = (~(ahb_hrdata[4] & Jlyfh7));
+	assign Ftyfh7 = (Plyfh7 | Dc9gh7);
+	assign Tsyfh7 = (Rtyfh7 & Xtyfh7);
+	assign Xtyfh7 = (~(Hmyfh7 & Fhxfh7));
+	assign Rtyfh7 = (~(Nmyfh7 & com_rx_tdata[4]));
+	assign P0ufh7 = (!Duyfh7);
+	assign Duyfh7 = (Fkyfh7 ? Nmtfh7 : Juyfh7);
+	assign Fkyfh7 = (!Puyfh7);
+	assign Juyfh7 = (Vuyfh7 & Bvyfh7);
+	assign Bvyfh7 = (Hvyfh7 & Nvyfh7);
+	assign Nvyfh7 = (~(ahb_hrdata[5] & Jlyfh7));
+	assign Hvyfh7 = (Plyfh7 | P99gh7);
+	assign Vuyfh7 = (Tvyfh7 & Zvyfh7);
+	assign Zvyfh7 = (~(Hmyfh7 & Hdxfh7));
+	assign Tvyfh7 = (~(Nmyfh7 & com_rx_tdata[5]));
+	assign J0ufh7 = (!Fwyfh7);
+	assign Fwyfh7 = (Puyfh7 ? Lwyfh7 : Tmtfh7);
+	assign Lwyfh7 = (Rwyfh7 & Xwyfh7);
+	assign Xwyfh7 = (Dxyfh7 & Jxyfh7);
+	assign Jxyfh7 = (~(ahb_hrdata[6] & Jlyfh7));
+	assign Dxyfh7 = (Plyfh7 | N49gh7);
+	assign Rwyfh7 = (Pxyfh7 & Vxyfh7);
+	assign Vxyfh7 = (~(Hmyfh7 & Zaxfh7));
+	assign Pxyfh7 = (~(Nmyfh7 & com_rx_tdata[6]));
+	assign D0ufh7 = (!Byyfh7);
+	assign Byyfh7 = (Puyfh7 ? Hyyfh7 : Zmtfh7);
+	assign Puyfh7 = (~(Nyyfh7 & Tyyfh7));
+	assign Hyyfh7 = (Zyyfh7 & Fzyfh7);
+	assign Fzyfh7 = (Lzyfh7 & Rzyfh7);
+	assign Rzyfh7 = (~(ahb_hrdata[7] & Jlyfh7));
+	assign Lzyfh7 = (Plyfh7 | X59gh7);
+	assign Zyyfh7 = (Xzyfh7 & D0zfh7);
+	assign D0zfh7 = (~(Hmyfh7 & R8xfh7));
+	assign Xzyfh7 = (~(Nmyfh7 & com_rx_tdata[7]));
+	assign Xztfh7 = (V0zfh7 ? P0zfh7 : J0zfh7);
+	assign J0zfh7 = (~(B1zfh7 & H1zfh7));
+	assign H1zfh7 = (N1zfh7 & T1zfh7);
+	assign T1zfh7 = (~(ahb_hrdata[8] & Jlyfh7));
+	assign N1zfh7 = (Z1zfh7 | H79gh7);
+	assign B1zfh7 = (F2zfh7 & L2zfh7);
+	assign L2zfh7 = (~(Hmyfh7 & J6xfh7));
+	assign F2zfh7 = (~(R2zfh7 & com_rx_tdata[0]));
+	assign Rztfh7 = (V0zfh7 ? D3zfh7 : X2zfh7);
+	assign X2zfh7 = (~(J3zfh7 & P3zfh7));
+	assign P3zfh7 = (V3zfh7 & B4zfh7);
+	assign B4zfh7 = (~(ahb_hrdata[9] & Jlyfh7));
+	assign V3zfh7 = (Z1zfh7 | J99gh7);
+	assign J3zfh7 = (H4zfh7 & N4zfh7);
+	assign N4zfh7 = (~(Hmyfh7 & B4xfh7));
+	assign H4zfh7 = (~(R2zfh7 & com_rx_tdata[1]));
+	assign Lztfh7 = (V0zfh7 ? Z4zfh7 : T4zfh7);
+	assign T4zfh7 = (~(F5zfh7 & L5zfh7));
+	assign L5zfh7 = (R5zfh7 & X5zfh7);
+	assign X5zfh7 = (~(ahb_hrdata[10] & Jlyfh7));
+	assign R5zfh7 = (Z1zfh7 | H49gh7);
+	assign F5zfh7 = (D6zfh7 & J6zfh7);
+	assign J6zfh7 = (~(Hmyfh7 & T1xfh7));
+	assign D6zfh7 = (~(R2zfh7 & com_rx_tdata[2]));
+	assign Fztfh7 = (V0zfh7 ? V6zfh7 : P6zfh7);
+	assign P6zfh7 = (~(B7zfh7 & H7zfh7));
+	assign H7zfh7 = (N7zfh7 & T7zfh7);
+	assign T7zfh7 = (~(ahb_hrdata[11] & Jlyfh7));
+	assign N7zfh7 = (Z1zfh7 | R59gh7);
+	assign B7zfh7 = (Z7zfh7 & F8zfh7);
+	assign F8zfh7 = (~(Hmyfh7 & Lzwfh7));
+	assign Z7zfh7 = (~(R2zfh7 & com_rx_tdata[3]));
+	assign Zytfh7 = (V0zfh7 ? R8zfh7 : L8zfh7);
+	assign L8zfh7 = (~(X8zfh7 & D9zfh7));
+	assign D9zfh7 = (J9zfh7 & P9zfh7);
+	assign P9zfh7 = (~(ahb_hrdata[12] & Jlyfh7));
+	assign J9zfh7 = (Z1zfh7 | B79gh7);
+	assign X8zfh7 = (V9zfh7 & Bazfh7);
+	assign Bazfh7 = (~(Hmyfh7 & Dxwfh7));
+	assign V9zfh7 = (~(R2zfh7 & com_rx_tdata[4]));
+	assign Tytfh7 = (V0zfh7 ? Nazfh7 : Hazfh7);
+	assign Hazfh7 = (~(Tazfh7 & Zazfh7));
+	assign Zazfh7 = (Fbzfh7 & Lbzfh7);
+	assign Lbzfh7 = (~(ahb_hrdata[13] & Jlyfh7));
+	assign Fbzfh7 = (Z1zfh7 | D99gh7);
+	assign Tazfh7 = (Rbzfh7 & Xbzfh7);
+	assign Xbzfh7 = (~(Hmyfh7 & Puwfh7));
+	assign Rbzfh7 = (~(R2zfh7 & com_rx_tdata[5]));
+	assign Nytfh7 = (V0zfh7 ? Jczfh7 : Dczfh7);
+	assign Dczfh7 = (~(Pczfh7 & Vczfh7));
+	assign Vczfh7 = (Bdzfh7 & Hdzfh7);
+	assign Hdzfh7 = (~(ahb_hrdata[14] & Jlyfh7));
+	assign Bdzfh7 = (Z1zfh7 | B49gh7);
+	assign Pczfh7 = (Ndzfh7 & Tdzfh7);
+	assign Tdzfh7 = (~(Hmyfh7 & Bswfh7));
+	assign Ndzfh7 = (~(R2zfh7 & com_rx_tdata[6]));
+	assign Hytfh7 = (V0zfh7 ? Fezfh7 : Zdzfh7);
+	assign V0zfh7 = (Nyyfh7 & Lezfh7);
+	assign Lezfh7 = (~(R2zfh7 & Rezfh7));
+	assign Zdzfh7 = (~(Xezfh7 & Dfzfh7));
+	assign Dfzfh7 = (Jfzfh7 & Pfzfh7);
+	assign Pfzfh7 = (~(ahb_hrdata[15] & Jlyfh7));
+	assign Jfzfh7 = (Z1zfh7 | L59gh7);
+	assign Xezfh7 = (Vfzfh7 & Bgzfh7);
+	assign Bgzfh7 = (~(Hmyfh7 & Npwfh7));
+	assign Vfzfh7 = (~(R2zfh7 & com_rx_tdata[7]));
+	assign Bytfh7 = (Tgzfh7 ? Ngzfh7 : Hgzfh7);
+	assign Hgzfh7 = (~(Zgzfh7 & Fhzfh7));
+	assign Fhzfh7 = (Lhzfh7 & Rhzfh7);
+	assign Rhzfh7 = (Xhzfh7 | Pitfh7);
+	assign Lhzfh7 = (Dizfh7 & Jizfh7);
+	assign Jizfh7 = (~(ahb_hrdata[16] & Jlyfh7));
+	assign Dizfh7 = (~(Pizfh7 & Rbwfh7));
+	assign Zgzfh7 = (Vizfh7 & Bjzfh7);
+	assign Bjzfh7 = (~(Hmyfh7 & Zmwfh7));
+	assign Vizfh7 = (~(Hjzfh7 & com_rx_tdata[0]));
+	assign Vxtfh7 = (Tgzfh7 ? Tjzfh7 : Njzfh7);
+	assign Njzfh7 = (~(Zjzfh7 & Fkzfh7));
+	assign Fkzfh7 = (Lkzfh7 & Rkzfh7);
+	assign Rkzfh7 = (Xhzfh7 | Vitfh7);
+	assign Lkzfh7 = (Xkzfh7 & Dlzfh7);
+	assign Dlzfh7 = (~(ahb_hrdata[17] & Jlyfh7));
+	assign Xkzfh7 = (~(Pizfh7 & D9wfh7));
+	assign Zjzfh7 = (Jlzfh7 & Plzfh7);
+	assign Plzfh7 = (~(Hmyfh7 & Lkwfh7));
+	assign Jlzfh7 = (~(Hjzfh7 & com_rx_tdata[1]));
+	assign Pxtfh7 = (Tgzfh7 ? Bmzfh7 : Vlzfh7);
+	assign Vlzfh7 = (~(Hmzfh7 & Nmzfh7));
+	assign Nmzfh7 = (Tmzfh7 & Zmzfh7);
+	assign Zmzfh7 = (Xhzfh7 | Bjtfh7);
+	assign Tmzfh7 = (Fnzfh7 & Lnzfh7);
+	assign Lnzfh7 = (~(ahb_hrdata[18] & Jlyfh7));
+	assign Fnzfh7 = (~(Pizfh7 & P6wfh7));
+	assign Hmzfh7 = (Rnzfh7 & Xnzfh7);
+	assign Xnzfh7 = (~(Hmyfh7 & Xhwfh7));
+	assign Rnzfh7 = (~(Hjzfh7 & com_rx_tdata[2]));
+	assign Jxtfh7 = (Tgzfh7 ? Jozfh7 : Dozfh7);
+	assign Dozfh7 = (~(Pozfh7 & Vozfh7));
+	assign Vozfh7 = (Bpzfh7 & Hpzfh7);
+	assign Hpzfh7 = (Xhzfh7 | Hjtfh7);
+	assign Bpzfh7 = (Npzfh7 & Tpzfh7);
+	assign Tpzfh7 = (~(ahb_hrdata[19] & Jlyfh7));
+	assign Npzfh7 = (~(Pizfh7 & B4wfh7));
+	assign Pozfh7 = (Zpzfh7 & Fqzfh7);
+	assign Fqzfh7 = (~(Hmyfh7 & Jfwfh7));
+	assign Zpzfh7 = (~(Hjzfh7 & com_rx_tdata[3]));
+	assign Dxtfh7 = (Tgzfh7 ? Rqzfh7 : Lqzfh7);
+	assign Lqzfh7 = (~(Xqzfh7 & Drzfh7));
+	assign Drzfh7 = (Jrzfh7 & Przfh7);
+	assign Przfh7 = (Xhzfh7 | Njtfh7);
+	assign Jrzfh7 = (Vrzfh7 & Bszfh7);
+	assign Bszfh7 = (~(ahb_hrdata[20] & Jlyfh7));
+	assign Vrzfh7 = (~(Pizfh7 & N1wfh7));
+	assign Xqzfh7 = (Hszfh7 & Nszfh7);
+	assign Nszfh7 = (~(Hmyfh7 & Vcwfh7));
+	assign Hszfh7 = (~(Hjzfh7 & com_rx_tdata[4]));
+	assign Xwtfh7 = (Tgzfh7 ? Zszfh7 : Tszfh7);
+	assign Tszfh7 = (~(Ftzfh7 & Ltzfh7));
+	assign Ltzfh7 = (Rtzfh7 & Xtzfh7);
+	assign Xtzfh7 = (Xhzfh7 | Tjtfh7);
+	assign Rtzfh7 = (Duzfh7 & Juzfh7);
+	assign Juzfh7 = (~(ahb_hrdata[21] & Jlyfh7));
+	assign Duzfh7 = (~(Pizfh7 & Zyvfh7));
+	assign Ftzfh7 = (Puzfh7 & Vuzfh7);
+	assign Vuzfh7 = (~(Hmyfh7 & Hawfh7));
+	assign Puzfh7 = (~(Hjzfh7 & com_rx_tdata[5]));
+	assign Rwtfh7 = (Tgzfh7 ? Hvzfh7 : Bvzfh7);
+	assign Bvzfh7 = (~(Nvzfh7 & Tvzfh7));
+	assign Tvzfh7 = (Zvzfh7 & Fwzfh7);
+	assign Fwzfh7 = (Xhzfh7 | Zjtfh7);
+	assign Zvzfh7 = (Lwzfh7 & Rwzfh7);
+	assign Rwzfh7 = (~(ahb_hrdata[22] & Jlyfh7));
+	assign Lwzfh7 = (~(Pizfh7 & Lwvfh7));
+	assign Nvzfh7 = (Xwzfh7 & Dxzfh7);
+	assign Dxzfh7 = (~(Hmyfh7 & T7wfh7));
+	assign Xwzfh7 = (~(Hjzfh7 & com_rx_tdata[6]));
+	assign Lwtfh7 = (Tgzfh7 ? Pxzfh7 : Jxzfh7);
+	assign Tgzfh7 = (Nyyfh7 & Vxzfh7);
+	assign Vxzfh7 = (~(Hjzfh7 & Rezfh7));
+	assign Jxzfh7 = (~(Byzfh7 & Hyzfh7));
+	assign Hyzfh7 = (Nyzfh7 & Tyzfh7);
+	assign Tyzfh7 = (Xhzfh7 | Fktfh7);
+	assign Nyzfh7 = (Zyzfh7 & Fzzfh7);
+	assign Fzzfh7 = (~(ahb_hrdata[23] & Jlyfh7));
+	assign Zyzfh7 = (~(Pizfh7 & Xtvfh7));
+	assign Byzfh7 = (Lzzfh7 & Rzzfh7);
+	assign Rzzfh7 = (~(Hmyfh7 & F5wfh7));
+	assign Lzzfh7 = (~(Hjzfh7 & com_rx_tdata[7]));
+	assign Fwtfh7 = (J00gh7 ? D00gh7 : Xzzfh7);
+	assign Xzzfh7 = (~(P00gh7 & V00gh7));
+	assign V00gh7 = (B10gh7 & H10gh7);
+	assign H10gh7 = (~(gpi8[0] & N10gh7));
+	assign B10gh7 = (T10gh7 & Z10gh7);
+	assign Z10gh7 = (~(ahb_hrdata[24] & Jlyfh7));
+	assign T10gh7 = (~(Pizfh7 & Jrvfh7));
+	assign P00gh7 = (F20gh7 & L20gh7);
+	assign L20gh7 = (~(Hmyfh7 & R2wfh7));
+	assign F20gh7 = (~(R20gh7 & com_rx_tdata[0]));
+	assign Zvtfh7 = (J00gh7 ? D30gh7 : X20gh7);
+	assign X20gh7 = (~(J30gh7 & P30gh7));
+	assign P30gh7 = (V30gh7 & B40gh7);
+	assign B40gh7 = (~(gpi8[1] & N10gh7));
+	assign V30gh7 = (H40gh7 & N40gh7);
+	assign N40gh7 = (~(ahb_hrdata[25] & Jlyfh7));
+	assign H40gh7 = (~(Pizfh7 & Povfh7));
+	assign J30gh7 = (T40gh7 & Z40gh7);
+	assign Z40gh7 = (~(Hmyfh7 & D0wfh7));
+	assign T40gh7 = (~(R20gh7 & com_rx_tdata[1]));
+	assign Tvtfh7 = (J00gh7 ? L50gh7 : F50gh7);
+	assign F50gh7 = (~(R50gh7 & X50gh7));
+	assign X50gh7 = (D60gh7 & J60gh7);
+	assign J60gh7 = (~(gpi8[2] & N10gh7));
+	assign D60gh7 = (P60gh7 & V60gh7);
+	assign V60gh7 = (~(ahb_hrdata[26] & Jlyfh7));
+	assign P60gh7 = (~(Pizfh7 & Vlvfh7));
+	assign R50gh7 = (B70gh7 & H70gh7);
+	assign H70gh7 = (~(Hmyfh7 & Pxvfh7));
+	assign B70gh7 = (~(R20gh7 & com_rx_tdata[2]));
+	assign Nvtfh7 = (J00gh7 ? T70gh7 : N70gh7);
+	assign N70gh7 = (~(Z70gh7 & F80gh7));
+	assign F80gh7 = (L80gh7 & R80gh7);
+	assign R80gh7 = (~(gpi8[3] & N10gh7));
+	assign L80gh7 = (X80gh7 & D90gh7);
+	assign D90gh7 = (~(ahb_hrdata[27] & Jlyfh7));
+	assign X80gh7 = (~(Pizfh7 & Zdvfh7));
+	assign Z70gh7 = (J90gh7 & P90gh7);
+	assign P90gh7 = (~(Hmyfh7 & Bvvfh7));
+	assign J90gh7 = (~(R20gh7 & com_rx_tdata[3]));
+	assign Hvtfh7 = (J00gh7 ? Ba0gh7 : V90gh7);
+	assign V90gh7 = (~(Ha0gh7 & Na0gh7));
+	assign Na0gh7 = (Ta0gh7 & Za0gh7);
+	assign Za0gh7 = (~(gpi8[4] & N10gh7));
+	assign Ta0gh7 = (Fb0gh7 & Lb0gh7);
+	assign Lb0gh7 = (~(ahb_hrdata[28] & Jlyfh7));
+	assign Fb0gh7 = (~(Pizfh7 & Xqvfh7));
+	assign Ha0gh7 = (Rb0gh7 & Xb0gh7);
+	assign Xb0gh7 = (~(Hmyfh7 & Nsvfh7));
+	assign Rb0gh7 = (~(R20gh7 & com_rx_tdata[4]));
+	assign Bvtfh7 = (J00gh7 ? Jc0gh7 : Dc0gh7);
+	assign Dc0gh7 = (~(Pc0gh7 & Vc0gh7));
+	assign Vc0gh7 = (Bd0gh7 & Hd0gh7);
+	assign Hd0gh7 = (~(gpi8[5] & N10gh7));
+	assign Bd0gh7 = (Nd0gh7 & Td0gh7);
+	assign Td0gh7 = (~(ahb_hrdata[29] & Jlyfh7));
+	assign Nd0gh7 = (~(Pizfh7 & Dovfh7));
+	assign Pc0gh7 = (Zd0gh7 & Fe0gh7);
+	assign Fe0gh7 = (~(Hmyfh7 & Tpvfh7));
+	assign Zd0gh7 = (~(R20gh7 & com_rx_tdata[5]));
+	assign Vutfh7 = (J00gh7 ? Re0gh7 : Le0gh7);
+	assign Le0gh7 = (~(Xe0gh7 & Df0gh7));
+	assign Df0gh7 = (Jf0gh7 & Pf0gh7);
+	assign Pf0gh7 = (~(gpi8[6] & N10gh7));
+	assign Jf0gh7 = (Vf0gh7 & Bg0gh7);
+	assign Bg0gh7 = (~(ahb_hrdata[30] & Jlyfh7));
+	assign Vf0gh7 = (~(Pizfh7 & Jlvfh7));
+	assign Xe0gh7 = (Hg0gh7 & Ng0gh7);
+	assign Ng0gh7 = (~(Hmyfh7 & Zmvfh7));
+	assign Hg0gh7 = (~(R20gh7 & com_rx_tdata[6]));
+	assign Putfh7 = (J00gh7 ? Zg0gh7 : Tg0gh7);
+	assign J00gh7 = (Nyyfh7 & Fh0gh7);
+	assign Fh0gh7 = (~(R20gh7 & Rezfh7));
+	assign Nyyfh7 = (Lh0gh7 & Rh0gh7);
+	assign Rh0gh7 = (Xh0gh7 & Di0gh7);
+	assign Lh0gh7 = (Ji0gh7 & Pi0gh7);
+	assign Pi0gh7 = (~(Vi0gh7 & Jlyfh7));
+	assign Tg0gh7 = (~(Bj0gh7 & Hj0gh7));
+	assign Hj0gh7 = (Nj0gh7 & Tj0gh7);
+	assign Tj0gh7 = (~(gpi8[7] & N10gh7));
+	assign Nj0gh7 = (Zj0gh7 & Fk0gh7);
+	assign Fk0gh7 = (~(ahb_hrdata[31] & Jlyfh7));
+	assign Jlyfh7 = (!Lk0gh7);
+	assign Zj0gh7 = (~(Pizfh7 & Bdvfh7));
+	assign Bj0gh7 = (Rk0gh7 & Xk0gh7);
+	assign Xk0gh7 = (~(Hmyfh7 & Pfvfh7));
+	assign Hmyfh7 = (!Xh0gh7);
+	assign Rk0gh7 = (~(R20gh7 & com_rx_tdata[7]));
+	assign R20gh7 = (!Dl0gh7);
+	assign Jutfh7 = (Pl0gh7 ? com_tx_tdata[0] : Jl0gh7);
+	assign Jl0gh7 = (~(Vl0gh7 & Bm0gh7));
+	assign Bm0gh7 = (Hm0gh7 & Nm0gh7);
+	assign Nm0gh7 = (Tm0gh7 & Zm0gh7);
+	assign Zm0gh7 = (Fn0gh7 & Ln0gh7);
+	assign Fn0gh7 = (Rn0gh7 & Xn0gh7);
+	assign Tm0gh7 = (Do0gh7 & Xhzfh7);
+	assign Hm0gh7 = (Jo0gh7 & Po0gh7);
+	assign Po0gh7 = (Vo0gh7 & Bp0gh7);
+	assign Bp0gh7 = (~(Hp0gh7 & Np0gh7));
+	assign Np0gh7 = (~(Tp0gh7 & Zp0gh7));
+	assign Zp0gh7 = (~(Fq0gh7 & D3zfh7));
+	assign D3zfh7 = (!Lntfh7);
+	assign Tp0gh7 = (~(Lq0gh7 & P0zfh7));
+	assign P0zfh7 = (!Fntfh7);
+	assign Vo0gh7 = (Rq0gh7 & Xq0gh7);
+	assign Jo0gh7 = (Dr0gh7 & Jr0gh7);
+	assign Jr0gh7 = (~(Pr0gh7 & Vr0gh7));
+	assign Vr0gh7 = (~(Bs0gh7 & Hs0gh7));
+	assign Hs0gh7 = (Ns0gh7 | Hmtfh7);
+	assign Bs0gh7 = (Ts0gh7 | Nmtfh7);
+	assign Dr0gh7 = (~(Zs0gh7 & Ft0gh7));
+	assign Ft0gh7 = (~(Lt0gh7 & Rt0gh7));
+	assign Rt0gh7 = (Xt0gh7 | Pltfh7);
+	assign Xt0gh7 = (!Du0gh7);
+	assign Lt0gh7 = (~(Ju0gh7 & Pu0gh7));
+	assign Vl0gh7 = (Vu0gh7 & Bv0gh7);
+	assign Bv0gh7 = (Hv0gh7 & Nv0gh7);
+	assign Nv0gh7 = (Tv0gh7 & Zv0gh7);
+	assign Zv0gh7 = (~(Fw0gh7 & Lw0gh7));
+	assign Lw0gh7 = (~(Rw0gh7 & Xw0gh7));
+	assign Xw0gh7 = (~(Dx0gh7 & D30gh7));
+	assign D30gh7 = (!Drtfh7);
+	assign Rw0gh7 = (~(Jx0gh7 & D00gh7));
+	assign D00gh7 = (!Xqtfh7);
+	assign Tv0gh7 = (Px0gh7 & Vx0gh7);
+	assign Vx0gh7 = (~(By0gh7 & Hy0gh7));
+	assign Hy0gh7 = (~(Ny0gh7 & Ty0gh7));
+	assign Ty0gh7 = (~(Zy0gh7 & Nazfh7));
+	assign Nazfh7 = (!Jotfh7);
+	assign Ny0gh7 = (~(Fz0gh7 & R8zfh7));
+	assign R8zfh7 = (!Dotfh7);
+	assign Px0gh7 = (~(Lz0gh7 & Rz0gh7));
+	assign Rz0gh7 = (~(Xz0gh7 & D01gh7));
+	assign D01gh7 = (~(J01gh7 & Tjzfh7));
+	assign Tjzfh7 = (!Hptfh7);
+	assign Xz0gh7 = (~(P01gh7 & Ngzfh7));
+	assign Ngzfh7 = (!Bptfh7);
+	assign Hv0gh7 = (V01gh7 & B11gh7);
+	assign B11gh7 = (~(H11gh7 & N11gh7));
+	assign N11gh7 = (~(T11gh7 & Z11gh7));
+	assign Z11gh7 = (~(F21gh7 & Zszfh7));
+	assign Zszfh7 = (!Fqtfh7);
+	assign T11gh7 = (~(L21gh7 & Rqzfh7));
+	assign Rqzfh7 = (!Zptfh7);
+	assign V01gh7 = (~(R21gh7 & X21gh7));
+	assign X21gh7 = (~(D31gh7 & J31gh7));
+	assign J31gh7 = (~(P31gh7 & Jc0gh7));
+	assign Jc0gh7 = (!Bstfh7);
+	assign D31gh7 = (~(V31gh7 & Ba0gh7));
+	assign Ba0gh7 = (!Vrtfh7);
+	assign Vu0gh7 = (B41gh7 & H41gh7);
+	assign H41gh7 = (N41gh7 & T41gh7);
+	assign T41gh7 = (~(stdio_rx_tdata[0] & Z41gh7));
+	assign N41gh7 = (F51gh7 & L51gh7);
+	assign L51gh7 = (R51gh7 | Rb9gh7);
+	assign B41gh7 = (~(X51gh7 | D61gh7));
+	assign Dutfh7 = (J61gh7 & P61gh7);
+	assign P61gh7 = (~(V61gh7 & B71gh7));
+	assign B71gh7 = (H71gh7 & N71gh7);
+	assign N71gh7 = (T71gh7 & Z71gh7);
+	assign Z71gh7 = (F81gh7 & L81gh7);
+	assign F81gh7 = (~(R81gh7 & R21gh7));
+	assign R81gh7 = (~(P31gh7 | Bstfh7));
+	assign T71gh7 = (X81gh7 & D91gh7);
+	assign D91gh7 = (~(J91gh7 & By0gh7));
+	assign J91gh7 = (~(Zy0gh7 | Jotfh7));
+	assign X81gh7 = (~(P91gh7 & Zs0gh7));
+	assign P91gh7 = (~(Du0gh7 | Pltfh7));
+	assign H71gh7 = (V91gh7 & Ba1gh7);
+	assign Ba1gh7 = (~(Ha1gh7 & Lz0gh7));
+	assign Ha1gh7 = (~(J01gh7 | Hptfh7));
+	assign V91gh7 = (Na1gh7 & Ta1gh7);
+	assign Ta1gh7 = (~(Za1gh7 & Hp0gh7));
+	assign Za1gh7 = (~(Fq0gh7 | Lntfh7));
+	assign Na1gh7 = (~(Fb1gh7 & H11gh7));
+	assign Fb1gh7 = (~(F21gh7 | Fqtfh7));
+	assign V61gh7 = (Lb1gh7 & Rb1gh7);
+	assign Rb1gh7 = (Xb1gh7 & Dc1gh7);
+	assign Dc1gh7 = (~(Jc1gh7 & Pizfh7));
+	assign Jc1gh7 = (~(Na9gh7 & Lbvfh7));
+	assign Xb1gh7 = (Pc1gh7 & Vc1gh7);
+	assign Vc1gh7 = (~(Bd1gh7 & Fw0gh7));
+	assign Bd1gh7 = (~(Dx0gh7 | Drtfh7));
+	assign Pc1gh7 = (~(Hd1gh7 & Pr0gh7));
+	assign Hd1gh7 = (~(Nd1gh7 | Nmtfh7));
+	assign Lb1gh7 = (Td1gh7 & Zd1gh7);
+	assign Td1gh7 = (Fe1gh7 & Le1gh7);
+	assign Le1gh7 = (~(stdio_rx_tdata[1] & Z41gh7));
+	assign J61gh7 = (~(Lktfh7 & Pl0gh7));
+	assign Xttfh7 = (Pl0gh7 ? com_tx_tdata[2] : Re1gh7);
+	assign Re1gh7 = (~(Xe1gh7 & Df1gh7));
+	assign Df1gh7 = (Jf1gh7 & Pf1gh7);
+	assign Pf1gh7 = (Vf1gh7 & Bg1gh7);
+	assign Bg1gh7 = (~(Hg1gh7 & Hp0gh7));
+	assign Hg1gh7 = (~(Ng1gh7 | Rntfh7));
+	assign Vf1gh7 = (Tg1gh7 & Xq0gh7);
+	assign Tg1gh7 = (~(Zg1gh7 & Zs0gh7));
+	assign Zg1gh7 = (~(Fh1gh7 | Vltfh7));
+	assign Jf1gh7 = (Lh1gh7 & Rh1gh7);
+	assign Rh1gh7 = (~(Xh1gh7 & H11gh7));
+	assign Xh1gh7 = (~(Di1gh7 | Lqtfh7));
+	assign Lh1gh7 = (Ji1gh7 & Pi1gh7);
+	assign Pi1gh7 = (~(Vi1gh7 & By0gh7));
+	assign Vi1gh7 = (~(Bj1gh7 | Potfh7));
+	assign Ji1gh7 = (~(Hj1gh7 & Lz0gh7));
+	assign Hj1gh7 = (~(Nj1gh7 | Nptfh7));
+	assign Xe1gh7 = (Tj1gh7 & Zj1gh7);
+	assign Zj1gh7 = (Fk1gh7 & Lk1gh7);
+	assign Lk1gh7 = (~(Rk1gh7 & Pr0gh7));
+	assign Rk1gh7 = (~(Xk1gh7 | Tmtfh7));
+	assign Fk1gh7 = (Dl1gh7 & Jl1gh7);
+	assign Jl1gh7 = (~(Pl1gh7 & Fw0gh7));
+	assign Pl1gh7 = (~(Vl1gh7 | Jrtfh7));
+	assign Dl1gh7 = (~(Bm1gh7 & R21gh7));
+	assign Bm1gh7 = (~(Hm1gh7 | Hstfh7));
+	assign Tj1gh7 = (Nm1gh7 & Tm1gh7);
+	assign Nm1gh7 = (Zm1gh7 & Fn1gh7);
+	assign Fn1gh7 = (R51gh7 | Ta9gh7);
+	assign Zm1gh7 = (~(stdio_rx_tdata[2] & Z41gh7));
+	assign Rttfh7 = (Pl0gh7 ? com_tx_tdata[3] : Ln1gh7);
+	assign Ln1gh7 = (~(Rn1gh7 & Xn1gh7));
+	assign Xn1gh7 = (Do1gh7 & Jo1gh7);
+	assign Jo1gh7 = (Po1gh7 & Vo1gh7);
+	assign Vo1gh7 = (L81gh7 & Lbvfh7);
+	assign Po1gh7 = (Bp1gh7 & Hp1gh7);
+	assign Bp1gh7 = (~(Np1gh7 & Tp1gh7));
+	assign Np1gh7 = (~(Zp1gh7 | Zmtfh7));
+	assign Do1gh7 = (Fq1gh7 & Lq1gh7);
+	assign Lq1gh7 = (~(Rq1gh7 & Xq1gh7));
+	assign Rq1gh7 = (~(Dr1gh7 | Bmtfh7));
+	assign Fq1gh7 = (Jr1gh7 & Pr1gh7);
+	assign Pr1gh7 = (~(Vr1gh7 & Bs1gh7));
+	assign Vr1gh7 = (R21gh7 & Zg0gh7);
+	assign Jr1gh7 = (~(Hs1gh7 & Ns1gh7));
+	assign Hs1gh7 = (By0gh7 & Fezfh7);
+	assign Rn1gh7 = (Ts1gh7 & Zs1gh7);
+	assign Zs1gh7 = (Ft1gh7 & Lt1gh7);
+	assign Lt1gh7 = (Rt1gh7 & Xt1gh7);
+	assign Xt1gh7 = (~(Du1gh7 & Ju1gh7));
+	assign Du1gh7 = (Hp0gh7 & V6zfh7);
+	assign Rt1gh7 = (~(Pu1gh7 & Vu1gh7));
+	assign Pu1gh7 = (H11gh7 & Pxzfh7);
+	assign Ft1gh7 = (Bv1gh7 & Hv1gh7);
+	assign Hv1gh7 = (~(Nv1gh7 & Tv1gh7));
+	assign Nv1gh7 = (Lz0gh7 & Jozfh7);
+	assign Bv1gh7 = (~(Zv1gh7 & Fw1gh7));
+	assign Zv1gh7 = (Fw0gh7 & T70gh7);
+	assign Ts1gh7 = (Lw1gh7 & Rw1gh7);
+	assign Lw1gh7 = (Xw1gh7 & Dx1gh7);
+	assign Dx1gh7 = (R51gh7 | Za9gh7);
+	assign Xw1gh7 = (~(stdio_rx_tdata[3] & Z41gh7));
+	assign Lttfh7 = (Pl0gh7 ? com_tx_tdata[4] : Jx1gh7);
+	assign Jx1gh7 = (~(Px1gh7 & Vx1gh7));
+	assign Vx1gh7 = (By1gh7 & Hy1gh7);
+	assign Hy1gh7 = (Ny1gh7 & Ty1gh7);
+	assign Ty1gh7 = (Do0gh7 & Zy1gh7);
+	assign Ny1gh7 = (Hp1gh7 & Fz1gh7);
+	assign By1gh7 = (Lz1gh7 & Rz1gh7);
+	assign Rz1gh7 = (Xz1gh7 & D02gh7);
+	assign D02gh7 = (~(R21gh7 & V31gh7));
+	assign V31gh7 = (!J02gh7);
+	assign Xz1gh7 = (~(By0gh7 & Fz0gh7));
+	assign Fz0gh7 = (!P02gh7);
+	assign Lz1gh7 = (V02gh7 & B12gh7);
+	assign B12gh7 = (Zp1gh7 | Ns0gh7);
+	assign V02gh7 = (~(Zs0gh7 & Ju0gh7));
+	assign Px1gh7 = (H12gh7 & N12gh7);
+	assign N12gh7 = (T12gh7 & Z12gh7);
+	assign Z12gh7 = (F22gh7 & L22gh7);
+	assign L22gh7 = (~(Hp0gh7 & Lq0gh7));
+	assign Lq0gh7 = (!R22gh7);
+	assign F22gh7 = (~(H11gh7 & L21gh7));
+	assign L21gh7 = (!X22gh7);
+	assign T12gh7 = (D32gh7 & J32gh7);
+	assign J32gh7 = (~(Lz0gh7 & P01gh7));
+	assign P01gh7 = (!P32gh7);
+	assign D32gh7 = (~(Fw0gh7 & Jx0gh7));
+	assign Jx0gh7 = (!V32gh7);
+	assign H12gh7 = (B42gh7 & Tm1gh7);
+	assign Tm1gh7 = (H42gh7 & N42gh7);
+	assign H42gh7 = (L81gh7 & Xn0gh7);
+	assign B42gh7 = (T42gh7 & Z42gh7);
+	assign Z42gh7 = (R51gh7 | Fb9gh7);
+	assign T42gh7 = (~(stdio_rx_tdata[4] & Z41gh7));
+	assign Fttfh7 = (Pl0gh7 ? com_tx_tdata[5] : F52gh7);
+	assign F52gh7 = (~(L52gh7 & R52gh7));
+	assign R52gh7 = (X52gh7 & D62gh7);
+	assign D62gh7 = (~(stdio_rx_tdata[5] & Z41gh7));
+	assign X52gh7 = (Rq0gh7 & J62gh7);
+	assign L52gh7 = (N42gh7 & P62gh7);
+	assign N42gh7 = (V62gh7 & F51gh7);
+	assign F51gh7 = (Lbvfh7 | B72gh7);
+	assign Zstfh7 = (H72gh7 & N72gh7);
+	assign N72gh7 = (~(T72gh7 & Z72gh7));
+	assign Z72gh7 = (F82gh7 & L82gh7);
+	assign L82gh7 = (R82gh7 & X82gh7);
+	assign X82gh7 = (Hp1gh7 & Xn0gh7);
+	assign R82gh7 = (D92gh7 & J92gh7);
+	assign J92gh7 = (~(J02gh7 & R21gh7));
+	assign J02gh7 = (~(Nstfh7 | Bs1gh7));
+	assign Bs1gh7 = (Hstfh7 & Bstfh7);
+	assign D92gh7 = (~(P02gh7 & By0gh7));
+	assign P02gh7 = (~(Votfh7 | Ns1gh7));
+	assign Ns1gh7 = (Potfh7 & Jotfh7);
+	assign F82gh7 = (P92gh7 & V92gh7);
+	assign V92gh7 = (~(R22gh7 & Hp0gh7));
+	assign R22gh7 = (~(Xntfh7 | Ju1gh7));
+	assign Ju1gh7 = (Rntfh7 & Lntfh7);
+	assign P92gh7 = (Ba2gh7 & Ha2gh7);
+	assign Ha2gh7 = (~(Ns0gh7 & Pr0gh7));
+	assign Ns0gh7 = (~(Zmtfh7 | Tp1gh7));
+	assign Tp1gh7 = (Tmtfh7 & Nmtfh7);
+	assign Ba2gh7 = (Ju0gh7 | Dr1gh7);
+	assign Ju0gh7 = (Bmtfh7 | Xq1gh7);
+	assign Xq1gh7 = (Vltfh7 & Pltfh7);
+	assign T72gh7 = (Na2gh7 & Ta2gh7);
+	assign Ta2gh7 = (Za2gh7 & Fb2gh7);
+	assign Fb2gh7 = (~(V32gh7 & Fw0gh7));
+	assign V32gh7 = (~(Prtfh7 | Fw1gh7));
+	assign Fw1gh7 = (Jrtfh7 & Drtfh7);
+	assign Za2gh7 = (Lb2gh7 & Rb2gh7);
+	assign Rb2gh7 = (~(X22gh7 & H11gh7));
+	assign X22gh7 = (~(Rqtfh7 | Vu1gh7));
+	assign Vu1gh7 = (Lqtfh7 & Fqtfh7);
+	assign Lb2gh7 = (~(P32gh7 & Lz0gh7));
+	assign P32gh7 = (~(Tptfh7 | Tv1gh7));
+	assign Tv1gh7 = (Nptfh7 & Hptfh7);
+	assign Na2gh7 = (Xb2gh7 & Zd1gh7);
+	assign Zd1gh7 = (Dc2gh7 & Jc2gh7);
+	assign Jc2gh7 = (Pc2gh7 & Vc2gh7);
+	assign Vc2gh7 = (Ln0gh7 & Rn0gh7);
+	assign Rn0gh7 = (~(Bd2gh7 & R21gh7));
+	assign R21gh7 = (!Hd2gh7);
+	assign Bd2gh7 = (Hm1gh7 & Re0gh7);
+	assign Re0gh7 = (!Hstfh7);
+	assign Hm1gh7 = (Bstfh7 & P31gh7);
+	assign P31gh7 = (Vrtfh7 & Zg0gh7);
+	assign Zg0gh7 = (!Nstfh7);
+	assign Ln0gh7 = (~(Nd2gh7 & Hp0gh7));
+	assign Nd2gh7 = (Ng1gh7 & Z4zfh7);
+	assign Z4zfh7 = (!Rntfh7);
+	assign Ng1gh7 = (Lntfh7 & Fq0gh7);
+	assign Fq0gh7 = (Fntfh7 & V6zfh7);
+	assign V6zfh7 = (!Xntfh7);
+	assign Pc2gh7 = (Xhzfh7 & Zy1gh7);
+	assign Dc2gh7 = (Td2gh7 & Zd2gh7);
+	assign Zd2gh7 = (~(D61gh7 | Fe2gh7));
+	assign D61gh7 = (~(Le2gh7 & Re2gh7));
+	assign Re2gh7 = (~(Xe2gh7 & Fw0gh7));
+	assign Xe2gh7 = (Vl1gh7 & L50gh7);
+	assign L50gh7 = (!Jrtfh7);
+	assign Vl1gh7 = (Drtfh7 & Dx0gh7);
+	assign Dx0gh7 = (Xqtfh7 & T70gh7);
+	assign T70gh7 = (!Prtfh7);
+	assign Le2gh7 = (Df2gh7 & Jf2gh7);
+	assign Jf2gh7 = (~(Pf2gh7 & Lz0gh7));
+	assign Pf2gh7 = (Nj1gh7 & Bmzfh7);
+	assign Bmzfh7 = (!Nptfh7);
+	assign Nj1gh7 = (Hptfh7 & J01gh7);
+	assign J01gh7 = (Bptfh7 & Jozfh7);
+	assign Jozfh7 = (!Tptfh7);
+	assign Df2gh7 = (~(Vf2gh7 & H11gh7));
+	assign H11gh7 = (!Bg2gh7);
+	assign Vf2gh7 = (Di1gh7 & Hvzfh7);
+	assign Hvzfh7 = (!Lqtfh7);
+	assign Di1gh7 = (Fqtfh7 & F21gh7);
+	assign F21gh7 = (Zptfh7 & Pxzfh7);
+	assign Pxzfh7 = (!Rqtfh7);
+	assign Td2gh7 = (~(Pl0gh7 | X51gh7));
+	assign X51gh7 = (~(Hg2gh7 & Ng2gh7));
+	assign Ng2gh7 = (~(Tg2gh7 & Pr0gh7));
+	assign Tg2gh7 = (Xk1gh7 & Zg2gh7);
+	assign Zg2gh7 = (!Tmtfh7);
+	assign Xk1gh7 = (Nmtfh7 & Nd1gh7);
+	assign Nd1gh7 = (!Ts0gh7);
+	assign Ts0gh7 = (~(Hmtfh7 & Fh2gh7));
+	assign Fh2gh7 = (!Zmtfh7);
+	assign Hg2gh7 = (Lh2gh7 & Rh2gh7);
+	assign Rh2gh7 = (~(Xh2gh7 & Zs0gh7));
+	assign Xh2gh7 = (Fh1gh7 & Di2gh7);
+	assign Di2gh7 = (!Vltfh7);
+	assign Fh1gh7 = (Pltfh7 & Du0gh7);
+	assign Du0gh7 = (~(Pu0gh7 | Bmtfh7));
+	assign Pu0gh7 = (!Jltfh7);
+	assign Lh2gh7 = (~(Ji2gh7 & By0gh7));
+	assign Ji2gh7 = (Bj1gh7 & Jczfh7);
+	assign Jczfh7 = (!Potfh7);
+	assign Bj1gh7 = (Jotfh7 & Zy0gh7);
+	assign Zy0gh7 = (Dotfh7 & Fezfh7);
+	assign Fezfh7 = (!Votfh7);
+	assign Xb2gh7 = (Pi2gh7 & Vi2gh7);
+	assign Vi2gh7 = (R51gh7 | Lb9gh7);
+	assign Pi2gh7 = (~(stdio_rx_tdata[6] & Z41gh7));
+	assign H72gh7 = (~(Rktfh7 & Pl0gh7));
+	assign Tstfh7 = (Pl0gh7 ? com_tx_tdata[7] : Bj2gh7);
+	assign Pl0gh7 = (~(Duufh7 & Hj2gh7));
+	assign Hj2gh7 = (~(Nj2gh7 & Tj2gh7));
+	assign Tj2gh7 = (Zj2gh7 | Fk2gh7);
+	assign Bj2gh7 = (stdio_rx_tdata[7] & Z41gh7);
+	assign Dltfh7 = (ahb_hready ? ahb_htrans[1] : Lk2gh7);
+	assign Xktfh7 = (Rk2gh7 & Xk2gh7);
+	assign Rk2gh7 = (~(Dl2gh7 & Jl2gh7));
+	assign ahb_htrans[1] = (~(Lk2gh7 | R29gh7));
+	assign Lk2gh7 = (!Hd9gh7);
+	assign Xzpfh7 = (~(Pl2gh7 & Vl2gh7));
+	assign Vl2gh7 = (Tyyfh7 & Bm2gh7);
+	assign Pl2gh7 = (Hm2gh7 & Xh0gh7);
+	assign O0qfh7 = (~(Nm2gh7 & Tm2gh7));
+	assign Tm2gh7 = (~(Zm2gh7 & Bdvfh7));
+	assign Nm2gh7 = (~(Jpsfh7 & Fn2gh7));
+	assign F1qfh7 = (~(Ln2gh7 & Rn2gh7));
+	assign Rn2gh7 = (~(Zm2gh7 & Jlvfh7));
+	assign Ln2gh7 = (~(Zpsfh7 & Fn2gh7));
+	assign W1qfh7 = (~(Xn2gh7 & Do2gh7));
+	assign Do2gh7 = (~(Zm2gh7 & Dovfh7));
+	assign Xn2gh7 = (~(Pqsfh7 & Fn2gh7));
+	assign N2qfh7 = (~(Jo2gh7 & Po2gh7));
+	assign Po2gh7 = (~(Zm2gh7 & Xqvfh7));
+	assign Jo2gh7 = (~(Frsfh7 & Fn2gh7));
+	assign E3qfh7 = (~(Vo2gh7 & Bp2gh7));
+	assign Bp2gh7 = (~(Zm2gh7 & Zdvfh7));
+	assign Vo2gh7 = (~(Vrsfh7 & Fn2gh7));
+	assign V3qfh7 = (~(Hp2gh7 & Np2gh7));
+	assign Np2gh7 = (~(Zm2gh7 & Vlvfh7));
+	assign Hp2gh7 = (~(Lssfh7 & Fn2gh7));
+	assign M4qfh7 = (~(Tp2gh7 & Zp2gh7));
+	assign Zp2gh7 = (~(Zm2gh7 & Povfh7));
+	assign Tp2gh7 = (~(Btsfh7 & Fn2gh7));
+	assign D5qfh7 = (~(Fq2gh7 & Lq2gh7));
+	assign Lq2gh7 = (~(Zm2gh7 & Jrvfh7));
+	assign Fq2gh7 = (~(Rtsfh7 & Fn2gh7));
+	assign U5qfh7 = (~(Rq2gh7 & Xq2gh7));
+	assign Xq2gh7 = (~(Zm2gh7 & Xtvfh7));
+	assign Rq2gh7 = (~(Husfh7 & Fn2gh7));
+	assign L6qfh7 = (~(Dr2gh7 & Jr2gh7));
+	assign Jr2gh7 = (~(Zm2gh7 & Lwvfh7));
+	assign Dr2gh7 = (~(Xusfh7 & Fn2gh7));
+	assign C7qfh7 = (~(Pr2gh7 & Vr2gh7));
+	assign Vr2gh7 = (~(Zm2gh7 & Zyvfh7));
+	assign Pr2gh7 = (~(Nvsfh7 & Fn2gh7));
+	assign T7qfh7 = (~(Bs2gh7 & Hs2gh7));
+	assign Hs2gh7 = (~(Zm2gh7 & N1wfh7));
+	assign Bs2gh7 = (~(Dwsfh7 & Fn2gh7));
+	assign K8qfh7 = (~(Ns2gh7 & Ts2gh7));
+	assign Ts2gh7 = (~(Zm2gh7 & B4wfh7));
+	assign Ns2gh7 = (~(Twsfh7 & Fn2gh7));
+	assign B9qfh7 = (~(Zs2gh7 & Ft2gh7));
+	assign Ft2gh7 = (~(Zm2gh7 & P6wfh7));
+	assign Zs2gh7 = (~(Jxsfh7 & Fn2gh7));
+	assign S9qfh7 = (~(Lt2gh7 & Rt2gh7));
+	assign Rt2gh7 = (~(Zm2gh7 & D9wfh7));
+	assign Lt2gh7 = (~(Zxsfh7 & Fn2gh7));
+	assign Jaqfh7 = (~(Xt2gh7 & Du2gh7));
+	assign Du2gh7 = (~(Zm2gh7 & Rbwfh7));
+	assign Xt2gh7 = (~(Pysfh7 & Fn2gh7));
+	assign Abqfh7 = (~(Ju2gh7 & Pu2gh7));
+	assign Pu2gh7 = (~(Zm2gh7 & Fewfh7));
+	assign Ju2gh7 = (~(Fzsfh7 & Fn2gh7));
+	assign Rbqfh7 = (~(Vu2gh7 & Bv2gh7));
+	assign Bv2gh7 = (~(Zm2gh7 & Tgwfh7));
+	assign Vu2gh7 = (~(Vzsfh7 & Fn2gh7));
+	assign Icqfh7 = (~(Hv2gh7 & Nv2gh7));
+	assign Nv2gh7 = (~(Zm2gh7 & Hjwfh7));
+	assign Hv2gh7 = (~(L0tfh7 & Fn2gh7));
+	assign Zcqfh7 = (~(Tv2gh7 & Zv2gh7));
+	assign Zv2gh7 = (~(Zm2gh7 & Vlwfh7));
+	assign Tv2gh7 = (~(B1tfh7 & Fn2gh7));
+	assign Qdqfh7 = (~(Fw2gh7 & Lw2gh7));
+	assign Lw2gh7 = (~(Zm2gh7 & Jowfh7));
+	assign Fw2gh7 = (~(R1tfh7 & Fn2gh7));
+	assign Heqfh7 = (~(Rw2gh7 & Xw2gh7));
+	assign Xw2gh7 = (~(Zm2gh7 & Xqwfh7));
+	assign Rw2gh7 = (~(H2tfh7 & Fn2gh7));
+	assign Yeqfh7 = (~(Dx2gh7 & Jx2gh7));
+	assign Jx2gh7 = (~(Zm2gh7 & Ltwfh7));
+	assign Dx2gh7 = (~(X2tfh7 & Fn2gh7));
+	assign Pfqfh7 = (~(Px2gh7 & Vx2gh7));
+	assign Vx2gh7 = (~(Zm2gh7 & Zvwfh7));
+	assign Px2gh7 = (~(N3tfh7 & Fn2gh7));
+	assign Ggqfh7 = (~(By2gh7 & Hy2gh7));
+	assign Hy2gh7 = (~(Zm2gh7 & Rwufh7));
+	assign By2gh7 = (~(D4tfh7 & Fn2gh7));
+	assign Xgqfh7 = (~(Ny2gh7 & Ty2gh7));
+	assign Ty2gh7 = (~(Zm2gh7 & Vxufh7));
+	assign Ny2gh7 = (~(T4tfh7 & Fn2gh7));
+	assign Ohqfh7 = (~(Zy2gh7 & Fz2gh7));
+	assign Fz2gh7 = (~(Zm2gh7 & Zyufh7));
+	assign Zy2gh7 = (~(J5tfh7 & Fn2gh7));
+	assign Fiqfh7 = (~(Lz2gh7 & Rz2gh7));
+	assign Rz2gh7 = (~(Zm2gh7 & D0vfh7));
+	assign Lz2gh7 = (~(Z5tfh7 & Fn2gh7));
+	assign Wiqfh7 = (~(Xz2gh7 & D03gh7));
+	assign D03gh7 = (~(Zm2gh7 & H1vfh7));
+	assign Xz2gh7 = (~(P6tfh7 & Fn2gh7));
+	assign Njqfh7 = (~(J03gh7 & P03gh7));
+	assign P03gh7 = (~(Zm2gh7 & L2vfh7));
+	assign J03gh7 = (~(F7tfh7 & Fn2gh7));
+	assign Ekqfh7 = (~(V03gh7 & B13gh7));
+	assign B13gh7 = (~(Zm2gh7 & P3vfh7));
+	assign V03gh7 = (~(V7tfh7 & Fn2gh7));
+	assign Vkqfh7 = (~(H13gh7 & N13gh7));
+	assign N13gh7 = (~(Zm2gh7 & Z4vfh7));
+	assign Zm2gh7 = (~(Xtxfh7 | Lqxfh7));
+	assign Lqxfh7 = (!B1yfh7);
+	assign H13gh7 = (~(L8tfh7 & Fn2gh7));
+	assign Fn2gh7 = (~(T13gh7 & Z13gh7));
+	assign Z13gh7 = (F23gh7 & L23gh7);
+	assign L23gh7 = (R23gh7 & X23gh7);
+	assign R23gh7 = (D33gh7 & J33gh7);
+	assign F23gh7 = (P33gh7 & R51gh7);
+	assign P33gh7 = (Xhzfh7 & B1yfh7);
+	assign B1yfh7 = (~(V33gh7 & B43gh7));
+	assign B43gh7 = (H43gh7 & N43gh7);
+	assign N43gh7 = (T43gh7 & Z43gh7);
+	assign Z43gh7 = (F53gh7 & L53gh7);
+	assign L53gh7 = (Vlvfh7 & Jlvfh7);
+	assign Jlvfh7 = (!D39gh7);
+	assign Vlvfh7 = (!J39gh7);
+	assign F53gh7 = (P6wfh7 & Lwvfh7);
+	assign Lwvfh7 = (!P39gh7);
+	assign P6wfh7 = (!V39gh7);
+	assign T43gh7 = (R53gh7 & X53gh7);
+	assign X53gh7 = (Xqwfh7 & Tgwfh7);
+	assign Tgwfh7 = (!B49gh7);
+	assign Xqwfh7 = (!H49gh7);
+	assign R53gh7 = (Zdvfh7 & Vxufh7);
+	assign Vxufh7 = (!N49gh7);
+	assign Zdvfh7 = (!T49gh7);
+	assign H43gh7 = (D63gh7 & J63gh7);
+	assign J63gh7 = (P63gh7 & V63gh7);
+	assign V63gh7 = (B4wfh7 & Xtvfh7);
+	assign Xtvfh7 = (!Z49gh7);
+	assign B4wfh7 = (!F59gh7);
+	assign P63gh7 = (Jowfh7 & Fewfh7);
+	assign Fewfh7 = (!L59gh7);
+	assign Jowfh7 = (!R59gh7);
+	assign D63gh7 = (B73gh7 & H73gh7);
+	assign H73gh7 = (Xqvfh7 & Rwufh7);
+	assign Rwufh7 = (!X59gh7);
+	assign Xqvfh7 = (!D69gh7);
+	assign B73gh7 = (N1wfh7 & Jrvfh7);
+	assign Jrvfh7 = (!J69gh7);
+	assign N1wfh7 = (!P69gh7);
+	assign V33gh7 = (N73gh7 & T73gh7);
+	assign T73gh7 = (Z73gh7 & F83gh7);
+	assign F83gh7 = (L83gh7 & R83gh7);
+	assign R83gh7 = (Vlwfh7 & Rbwfh7);
+	assign Rbwfh7 = (!V69gh7);
+	assign Vlwfh7 = (!B79gh7);
+	assign L83gh7 = (H1vfh7 & Zvwfh7);
+	assign Zvwfh7 = (!H79gh7);
+	assign H1vfh7 = (!N79gh7);
+	assign Z73gh7 = (X83gh7 & D93gh7);
+	assign D93gh7 = (Bdvfh7 & L2vfh7);
+	assign L2vfh7 = (!T79gh7);
+	assign Bdvfh7 = (!Z79gh7);
+	assign X83gh7 = (Povfh7 & Dovfh7);
+	assign Dovfh7 = (!F89gh7);
+	assign Povfh7 = (!L89gh7);
+	assign N73gh7 = (J93gh7 & P93gh7);
+	assign P93gh7 = (V93gh7 & Ba3gh7);
+	assign Ba3gh7 = (D9wfh7 & Zyvfh7);
+	assign Zyvfh7 = (!R89gh7);
+	assign D9wfh7 = (!X89gh7);
+	assign V93gh7 = (Ltwfh7 & Hjwfh7);
+	assign Hjwfh7 = (!D99gh7);
+	assign Ltwfh7 = (!J99gh7);
+	assign J93gh7 = (Ha3gh7 & Na3gh7);
+	assign Na3gh7 = (D0vfh7 & Zyufh7);
+	assign Zyufh7 = (!P99gh7);
+	assign D0vfh7 = (!Dc9gh7);
+	assign Ha3gh7 = (P3vfh7 & Z4vfh7);
+	assign Z4vfh7 = (!Jc9gh7);
+	assign P3vfh7 = (!Vc9gh7);
+	assign T13gh7 = (Ta3gh7 & Za3gh7);
+	assign Za3gh7 = (Fb3gh7 & Lb3gh7);
+	assign Fb3gh7 = (~(Rb3gh7 | Fe2gh7));
+	assign Ta3gh7 = (Xb3gh7 & Dc3gh7);
+	assign Xb3gh7 = (Lk0gh7 & Jc3gh7);
+	assign Jc3gh7 = (!Pc3gh7);
+	assign Lk0gh7 = (~(Vc3gh7 | Bd3gh7));
+	assign Mlqfh7 = (~(Havfh7 & Hd3gh7));
+	assign Havfh7 = (Nd3gh7 & Td3gh7);
+	assign Td3gh7 = (!Vrufh7);
+	assign Vrufh7 = (~(Zd3gh7 & Fe3gh7));
+	assign Fe3gh7 = (Le3gh7 & Tyyfh7);
+	assign Le3gh7 = (Di0gh7 & Re3gh7);
+	assign Zd3gh7 = (Xe3gh7 & Xh0gh7);
+	assign Dmqfh7 = (~(Df3gh7 & Jf3gh7));
+	assign Jf3gh7 = (~(B5sfh7 & Pf3gh7));
+	assign Df3gh7 = (Vf3gh7 | Z79gh7);
+	assign Umqfh7 = (~(Bg3gh7 & Hg3gh7));
+	assign Hg3gh7 = (~(R5sfh7 & Pf3gh7));
+	assign Bg3gh7 = (Vf3gh7 | D39gh7);
+	assign Lnqfh7 = (~(Ng3gh7 & Tg3gh7));
+	assign Tg3gh7 = (~(H6sfh7 & Pf3gh7));
+	assign Ng3gh7 = (Vf3gh7 | F89gh7);
+	assign Coqfh7 = (~(Zg3gh7 & Fh3gh7));
+	assign Fh3gh7 = (~(X6sfh7 & Pf3gh7));
+	assign Zg3gh7 = (Vf3gh7 | D69gh7);
+	assign Toqfh7 = (~(Lh3gh7 & Rh3gh7));
+	assign Rh3gh7 = (~(N7sfh7 & Pf3gh7));
+	assign Lh3gh7 = (Vf3gh7 | T49gh7);
+	assign Kpqfh7 = (~(Xh3gh7 & Di3gh7));
+	assign Di3gh7 = (~(D8sfh7 & Pf3gh7));
+	assign Xh3gh7 = (Vf3gh7 | J39gh7);
+	assign Bqqfh7 = (~(Ji3gh7 & Pi3gh7));
+	assign Pi3gh7 = (~(T8sfh7 & Pf3gh7));
+	assign Ji3gh7 = (Vf3gh7 | L89gh7);
+	assign Sqqfh7 = (~(Vi3gh7 & Bj3gh7));
+	assign Bj3gh7 = (~(J9sfh7 & Pf3gh7));
+	assign Vi3gh7 = (Vf3gh7 | J69gh7);
+	assign Jrqfh7 = (~(Hj3gh7 & Nj3gh7));
+	assign Nj3gh7 = (~(Z9sfh7 & Pf3gh7));
+	assign Hj3gh7 = (Vf3gh7 | Z49gh7);
+	assign Asqfh7 = (~(Tj3gh7 & Zj3gh7));
+	assign Zj3gh7 = (~(Pasfh7 & Pf3gh7));
+	assign Tj3gh7 = (Vf3gh7 | P39gh7);
+	assign Rsqfh7 = (~(Fk3gh7 & Lk3gh7));
+	assign Lk3gh7 = (~(Fbsfh7 & Pf3gh7));
+	assign Fk3gh7 = (Vf3gh7 | R89gh7);
+	assign Itqfh7 = (~(Rk3gh7 & Xk3gh7));
+	assign Xk3gh7 = (~(Vbsfh7 & Pf3gh7));
+	assign Rk3gh7 = (Vf3gh7 | P69gh7);
+	assign Ztqfh7 = (~(Dl3gh7 & Jl3gh7));
+	assign Jl3gh7 = (~(Lcsfh7 & Pf3gh7));
+	assign Dl3gh7 = (Vf3gh7 | F59gh7);
+	assign Quqfh7 = (~(Pl3gh7 & Vl3gh7));
+	assign Vl3gh7 = (~(Bdsfh7 & Pf3gh7));
+	assign Pl3gh7 = (Vf3gh7 | V39gh7);
+	assign Hvqfh7 = (~(Bm3gh7 & Hm3gh7));
+	assign Hm3gh7 = (~(Rdsfh7 & Pf3gh7));
+	assign Bm3gh7 = (Vf3gh7 | X89gh7);
+	assign Yvqfh7 = (~(Nm3gh7 & Tm3gh7));
+	assign Tm3gh7 = (~(Hesfh7 & Pf3gh7));
+	assign Nm3gh7 = (Vf3gh7 | V69gh7);
+	assign Pwqfh7 = (~(Zm3gh7 & Fn3gh7));
+	assign Fn3gh7 = (~(Xesfh7 & Pf3gh7));
+	assign Zm3gh7 = (Vf3gh7 | L59gh7);
+	assign Gxqfh7 = (~(Ln3gh7 & Rn3gh7));
+	assign Rn3gh7 = (~(Nfsfh7 & Pf3gh7));
+	assign Ln3gh7 = (Vf3gh7 | B49gh7);
+	assign Xxqfh7 = (~(Xn3gh7 & Do3gh7));
+	assign Do3gh7 = (~(Dgsfh7 & Pf3gh7));
+	assign Xn3gh7 = (Vf3gh7 | D99gh7);
+	assign Oyqfh7 = (~(Jo3gh7 & Po3gh7));
+	assign Po3gh7 = (~(Tgsfh7 & Pf3gh7));
+	assign Jo3gh7 = (Vf3gh7 | B79gh7);
+	assign Fzqfh7 = (~(Vo3gh7 & Bp3gh7));
+	assign Bp3gh7 = (~(Jhsfh7 & Pf3gh7));
+	assign Vo3gh7 = (Vf3gh7 | R59gh7);
+	assign Wzqfh7 = (~(Hp3gh7 & Np3gh7));
+	assign Np3gh7 = (~(Zhsfh7 & Pf3gh7));
+	assign Hp3gh7 = (Vf3gh7 | H49gh7);
+	assign N0rfh7 = (~(Tp3gh7 & Zp3gh7));
+	assign Zp3gh7 = (~(Pisfh7 & Pf3gh7));
+	assign Tp3gh7 = (Vf3gh7 | J99gh7);
+	assign E1rfh7 = (~(Fq3gh7 & Lq3gh7));
+	assign Lq3gh7 = (~(Fjsfh7 & Pf3gh7));
+	assign Fq3gh7 = (Vf3gh7 | H79gh7);
+	assign V1rfh7 = (~(Rq3gh7 & Xq3gh7));
+	assign Xq3gh7 = (~(Vjsfh7 & Pf3gh7));
+	assign Rq3gh7 = (Vf3gh7 | X59gh7);
+	assign M2rfh7 = (~(Dr3gh7 & Jr3gh7));
+	assign Jr3gh7 = (~(Lksfh7 & Pf3gh7));
+	assign Dr3gh7 = (Vf3gh7 | N49gh7);
+	assign D3rfh7 = (~(Pr3gh7 & Vr3gh7));
+	assign Vr3gh7 = (~(Blsfh7 & Pf3gh7));
+	assign Pr3gh7 = (Vf3gh7 | P99gh7);
+	assign U3rfh7 = (~(Bs3gh7 & Hs3gh7));
+	assign Hs3gh7 = (~(Rlsfh7 & Pf3gh7));
+	assign Bs3gh7 = (Vf3gh7 | Dc9gh7);
+	assign L4rfh7 = (~(Ns3gh7 & Ts3gh7));
+	assign Ts3gh7 = (~(Hmsfh7 & Pf3gh7));
+	assign Ns3gh7 = (Vf3gh7 | N79gh7);
+	assign C5rfh7 = (~(Zs3gh7 & Ft3gh7));
+	assign Ft3gh7 = (~(Xmsfh7 & Pf3gh7));
+	assign Zs3gh7 = (Vf3gh7 | T79gh7);
+	assign T5rfh7 = (~(Lt3gh7 & Rt3gh7));
+	assign Rt3gh7 = (~(Nnsfh7 & Pf3gh7));
+	assign Lt3gh7 = (Vf3gh7 | Vc9gh7);
+	assign K6rfh7 = (~(Xt3gh7 & Du3gh7));
+	assign Du3gh7 = (~(Dosfh7 & Pf3gh7));
+	assign Pf3gh7 = (~(Ju3gh7 & Dc3gh7));
+	assign Dc3gh7 = (Pu3gh7 & Vu3gh7);
+	assign Vu3gh7 = (Bv3gh7 & Hv3gh7);
+	assign Hv3gh7 = (Nv3gh7 & Tv3gh7);
+	assign Nv3gh7 = (Drxfh7 & Zv3gh7);
+	assign Bv3gh7 = (Fw3gh7 & Nd3gh7);
+	assign Pu3gh7 = (Lw3gh7 & Rw3gh7);
+	assign Rw3gh7 = (Xw3gh7 & Dx3gh7);
+	assign Lw3gh7 = (Tavfh7 & Jx3gh7);
+	assign Ju3gh7 = (~(Px3gh7 | Vx3gh7));
+	assign Xt3gh7 = (Vf3gh7 | Jc9gh7);
+	assign B7rfh7 = (~(By3gh7 & Hy3gh7));
+	assign Hy3gh7 = (~(stdio_tx_tready & Ny3gh7));
+	assign Ny3gh7 = (~(F5vfh7 & Ty3gh7));
+	assign S7rfh7 = (~(Zy3gh7 & Fk2gh7));
+	assign Fk2gh7 = (Fz3gh7 & Lz3gh7);
+	assign Lz3gh7 = (Rz3gh7 & Xq0gh7);
+	assign Rz3gh7 = (~(Fe8gh7 & Jl2gh7));
+	assign Fz3gh7 = (P62gh7 & Xz3gh7);
+	assign Zy3gh7 = (Nj2gh7 & D04gh7);
+	assign D04gh7 = (~(J04gh7 & Zj2gh7));
+	assign J04gh7 = (~(P04gh7 & Lb3gh7));
+	assign P04gh7 = (Xn0gh7 & Tv3gh7);
+	assign Nj2gh7 = (V04gh7 & B14gh7);
+	assign B14gh7 = (H14gh7 & N14gh7);
+	assign N14gh7 = (J62gh7 & T14gh7);
+	assign H14gh7 = (Jx3gh7 & Z14gh7);
+	assign V04gh7 = (F24gh7 & L24gh7);
+	assign L24gh7 = (R24gh7 & X24gh7);
+	assign R24gh7 = (~(D34gh7 & Z41gh7));
+	assign Z41gh7 = (!J34gh7);
+	assign F24gh7 = (P34gh7 & V34gh7);
+	assign J8rfh7 = (~(B44gh7 & H44gh7));
+	assign H44gh7 = (N44gh7 | P09gh7);
+	assign B44gh7 = (L81gh7 | Zj2gh7);
+	assign A9rfh7 = (~(T44gh7 & Z44gh7));
+	assign Z44gh7 = (F54gh7 | X29gh7);
+	assign T44gh7 = (~(L54gh7 & D34gh7));
+	assign R9rfh7 = (~(R54gh7 & X54gh7));
+	assign X54gh7 = (~(D64gh7 & J64gh7));
+	assign Iarfh7 = (~(T14gh7 & P64gh7));
+	assign P64gh7 = (V64gh7 | Xt8gh7);
+	assign T14gh7 = (~(B74gh7 & H74gh7));
+	assign H74gh7 = (~(V62gh7 | com_rx_tvalid));
+	assign B74gh7 = (stdio_rx_tvalid & com_tx_tready);
+	assign Zarfh7 = (~(N74gh7 & T74gh7));
+	assign T74gh7 = (V64gh7 | Vu8gh7);
+	assign N74gh7 = (X24gh7 & Jx3gh7);
+	assign Jx3gh7 = (~(Z74gh7 & F84gh7));
+	assign F84gh7 = (L84gh7 & R84gh7);
+	assign R84gh7 = (X84gh7 & Nd3gh7);
+	assign X84gh7 = (Tv3gh7 & Zv3gh7);
+	assign L84gh7 = (Dx3gh7 & Fw3gh7);
+	assign Z74gh7 = (D94gh7 & J94gh7);
+	assign J94gh7 = (Tavfh7 & Xw3gh7);
+	assign Tavfh7 = (P94gh7 & V94gh7);
+	assign V94gh7 = (~(Ba4gh7 | Ha4gh7));
+	assign P94gh7 = (Xh0gh7 & Na4gh7);
+	assign D94gh7 = (~(Ta4gh7 | Px3gh7));
+	assign Px3gh7 = (~(Za4gh7 & Fb4gh7));
+	assign Fb4gh7 = (Lb3gh7 & Hm2gh7);
+	assign Lb3gh7 = (Lb4gh7 & Rb4gh7);
+	assign Za4gh7 = (~(Pc3gh7 | Rq0gh7));
+	assign Rq0gh7 = (~(Xb4gh7 & Plyfh7));
+	assign Plyfh7 = (Z1zfh7 & Do0gh7);
+	assign Z1zfh7 = (~(Pizfh7 | N10gh7));
+	assign N10gh7 = (!Xhzfh7);
+	assign Pizfh7 = (~(R51gh7 & Lbvfh7));
+	assign Xb4gh7 = (~(Rb3gh7 | Bd3gh7));
+	assign Rb3gh7 = (~(Dc4gh7 & Jc4gh7));
+	assign Jc4gh7 = (Rw1gh7 & J62gh7);
+	assign Rw1gh7 = (Pc4gh7 & Vc4gh7);
+	assign Vc4gh7 = (V62gh7 & Xn0gh7);
+	assign Pc4gh7 = (Fe1gh7 & Xq0gh7);
+	assign Fe1gh7 = (Bd4gh7 & Xz3gh7);
+	assign Bd4gh7 = (T4vfh7 & F5vfh7);
+	assign Dc4gh7 = (J34gh7 & P62gh7);
+	assign P62gh7 = (Hd4gh7 & Nd4gh7);
+	assign Nd4gh7 = (Td4gh7 & Zd4gh7);
+	assign Zd4gh7 = (Fe4gh7 & Fz1gh7);
+	assign Td4gh7 = (Le4gh7 & Re4gh7);
+	assign Hd4gh7 = (Xe4gh7 & Df4gh7);
+	assign Xe4gh7 = (~(Jf4gh7 | Pf4gh7));
+	assign X24gh7 = (~(Vf4gh7 & Bg4gh7));
+	assign Bg4gh7 = (~(Hg4gh7 | Ng4gh7));
+	assign Vf4gh7 = (Tg4gh7 & Rqxfh7);
+	assign Qbrfh7 = (~(V34gh7 & Zg4gh7));
+	assign Zg4gh7 = (Fh4gh7 | Lw8gh7);
+	assign V34gh7 = (Ji0gh7 & Lh4gh7);
+	assign Lh4gh7 = (~(Bd3gh7 & Vi0gh7));
+	assign Bd3gh7 = (!Zy1gh7);
+	assign Ji0gh7 = (Rh4gh7 & Xh4gh7);
+	assign Xh4gh7 = (Di4gh7 | Ji4gh7);
+	assign Di4gh7 = (~(Fe2gh7 & stdio_tx_tready));
+	assign Fe2gh7 = (!Do0gh7);
+	assign Rh4gh7 = (R51gh7 & Xhzfh7);
+	assign Xhzfh7 = (~(Pi4gh7 & Vi4gh7));
+	assign Vi4gh7 = (Z19gh7 & Bj4gh7);
+	assign R51gh7 = (~(Hj4gh7 & Nj4gh7));
+	assign Nj4gh7 = (Tj4gh7 & Lw8gh7);
+	assign Tj4gh7 = (~(Zj4gh7 | Fw8gh7));
+	assign Hj4gh7 = (Fk4gh7 & Xb9gh7);
+	assign Hcrfh7 = (~(Lk4gh7 & Rk4gh7));
+	assign Rk4gh7 = (Xk4gh7 & Dl4gh7);
+	assign Dl4gh7 = (~(Jl4gh7 & Pl4gh7));
+	assign Pl4gh7 = (~(Vl4gh7 & Bm4gh7));
+	assign Bm4gh7 = (~(Hm4gh7 & Tg4gh7));
+	assign Hm4gh7 = (Hg4gh7 & Rqxfh7);
+	assign Vl4gh7 = (~(Bjyfh7 & Nm4gh7));
+	assign Nm4gh7 = (Tm4gh7 | Zm4gh7);
+	assign Jl4gh7 = (!Fn4gh7);
+	assign Xk4gh7 = (D0yfh7 & Xtxfh7);
+	assign Xtxfh7 = (Ln4gh7 | Rn4gh7);
+	assign Ln4gh7 = (Lbvfh7 | Xn4gh7);
+	assign D0yfh7 = (~(Rqxfh7 & Do4gh7));
+	assign Do4gh7 = (Jo4gh7 | Fqxfh7);
+	assign Fqxfh7 = (Tg4gh7 & Ng4gh7);
+	assign Jo4gh7 = (~(Hjyfh7 | Po4gh7));
+	assign Lk4gh7 = (Vo4gh7 & Bp4gh7);
+	assign Bp4gh7 = (~(Vi0gh7 & Hp4gh7));
+	assign Hp4gh7 = (~(Na4gh7 & Np4gh7));
+	assign Np4gh7 = (~(Tp4gh7 & Zp4gh7));
+	assign Vo4gh7 = (~(Fq4gh7 & Tp4gh7));
+	assign Ycrfh7 = (~(Xh0gh7 & Lq4gh7));
+	assign Lq4gh7 = (V64gh7 | Pu8gh7);
+	assign Xh0gh7 = (~(Rq4gh7 & Xq4gh7));
+	assign Rq4gh7 = (~(Dr4gh7 | Du8gh7));
+	assign Pdrfh7 = (~(Jr4gh7 & Pr4gh7));
+	assign Pr4gh7 = (~(Vr4gh7 & Bs4gh7));
+	assign Bs4gh7 = (Rqxfh7 & Fn4gh7);
+	assign Vr4gh7 = (Tg4gh7 & Hg4gh7);
+	assign Tg4gh7 = (Hs4gh7 & Ns4gh7);
+	assign Ns4gh7 = (Hjyfh7 & Ts4gh7);
+	assign Hjyfh7 = (~(Zs4gh7 & Ft4gh7));
+	assign Zs4gh7 = (Lt4gh7 & Rt4gh7);
+	assign Hs4gh7 = (~(Po4gh7 | Zm4gh7));
+	assign Jr4gh7 = (~(Xt4gh7 & Ba4gh7));
+	assign Gerfh7 = (Vc3gh7 & Vi0gh7);
+	assign Xerfh7 = (~(Nd3gh7 & Du4gh7));
+	assign Du4gh7 = (V64gh7 | Ju8gh7);
+	assign Nd3gh7 = (~(Ju4gh7 & Pu4gh7));
+	assign Pu4gh7 = (L29gh7 & Vu4gh7);
+	assign Vu4gh7 = (!Tv8gh7);
+	assign Ofrfh7 = (~(Bv4gh7 & Hv4gh7));
+	assign Hv4gh7 = (~(Nv4gh7 & Zm4gh7));
+	assign Zm4gh7 = (Rbvfh7 & Ft4gh7);
+	assign Nv4gh7 = (Bjyfh7 & Fn4gh7);
+	assign Bv4gh7 = (~(Tv4gh7 & Fq4gh7));
+	assign Tv4gh7 = (~(Tp4gh7 | Zv4gh7));
+	assign Fgrfh7 = (~(Tyyfh7 & Fw4gh7));
+	assign Fw4gh7 = (Lw4gh7 | Zv8gh7);
+	assign Tyyfh7 = (~(Nmyfh7 & Rezfh7));
+	assign Wgrfh7 = (Rw4gh7 ? Nmyfh7 : R2zfh7);
+	assign Nmyfh7 = (!Fbvfh7);
+	assign Nhrfh7 = (Rw4gh7 ? R2zfh7 : Hjzfh7);
+	assign R2zfh7 = (!Xw4gh7);
+	assign Hjzfh7 = (!Dx4gh7);
+	assign Eirfh7 = (!Jx4gh7);
+	assign Jx4gh7 = (Rezfh7 ? Dl0gh7 : Px4gh7);
+	assign Px4gh7 = (Vx4gh7 | D09gh7);
+	assign Virfh7 = (~(By4gh7 & Hy4gh7));
+	assign Hy4gh7 = (V64gh7 | Nv8gh7);
+	assign By4gh7 = (Ny4gh7 & Fw3gh7);
+	assign Ny4gh7 = (~(Xt4gh7 & Ha4gh7));
+	assign Xt4gh7 = (Vi0gh7 & Ty4gh7);
+	assign Mjrfh7 = (Zy4gh7 & Bjyfh7);
+	assign Bjyfh7 = (~(Po4gh7 | Lbvfh7));
+	assign Po4gh7 = (~(Fz4gh7 & Lz4gh7));
+	assign Fz4gh7 = (~(Rz4gh7 | B72gh7));
+	assign Rz4gh7 = (Ng4gh7 & Rt4gh7);
+	assign Zy4gh7 = (Tm4gh7 & Fn4gh7);
+	assign Fn4gh7 = (~(Xz4gh7 & D05gh7));
+	assign D05gh7 = (J05gh7 & P05gh7);
+	assign P05gh7 = (V05gh7 & T79gh7);
+	assign V05gh7 = (Vc9gh7 & Zayfh7);
+	assign Zayfh7 = (J99gh7 & Diyfh7);
+	assign Diyfh7 = (B15gh7 & H15gh7);
+	assign H15gh7 = (N15gh7 & T15gh7);
+	assign T15gh7 = (Z15gh7 & F25gh7);
+	assign F25gh7 = (L25gh7 & R89gh7);
+	assign L25gh7 = (X89gh7 & D99gh7);
+	assign Z15gh7 = (R25gh7 & Z79gh7);
+	assign R25gh7 = (F89gh7 & L89gh7);
+	assign N15gh7 = (X25gh7 & D35gh7);
+	assign D35gh7 = (J35gh7 & P69gh7);
+	assign J35gh7 = (V69gh7 & B79gh7);
+	assign X25gh7 = (D69gh7 & J69gh7);
+	assign B15gh7 = (P35gh7 & V35gh7);
+	assign V35gh7 = (B45gh7 & H45gh7);
+	assign H45gh7 = (N45gh7 & F59gh7);
+	assign N45gh7 = (L59gh7 & R59gh7);
+	assign B45gh7 = (T45gh7 & H49gh7);
+	assign T45gh7 = (T49gh7 & Z49gh7);
+	assign P35gh7 = (Z45gh7 & F55gh7);
+	assign F55gh7 = (L55gh7 & P39gh7);
+	assign L55gh7 = (V39gh7 & B49gh7);
+	assign Z45gh7 = (D39gh7 & J39gh7);
+	assign J05gh7 = (Dc9gh7 & N79gh7);
+	assign Xz4gh7 = (R55gh7 & X55gh7);
+	assign X55gh7 = (N49gh7 & P99gh7);
+	assign R55gh7 = (H79gh7 & X59gh7);
+	assign Dkrfh7 = (~(D65gh7 & J65gh7));
+	assign J65gh7 = (~(P65gh7 & D34gh7));
+	assign D65gh7 = (F54gh7 | J09gh7);
+	assign Ukrfh7 = (~(V65gh7 & B75gh7));
+	assign B75gh7 = (V64gh7 | Ft8gh7);
+	assign Llrfh7 = (~(H75gh7 & N75gh7));
+	assign N75gh7 = (~(D6vfh7 & stdio_tx_tready));
+	assign H75gh7 = (V64gh7 | L29gh7);
+	assign Cmrfh7 = (~(T75gh7 & Z75gh7));
+	assign Z75gh7 = (V64gh7 | Hv8gh7);
+	assign T75gh7 = (Zv3gh7 | F85gh7);
+	assign Tmrfh7 = (~(L85gh7 & R85gh7));
+	assign R85gh7 = (X85gh7 & D95gh7);
+	assign D95gh7 = (~(Xn4gh7 & J95gh7));
+	assign J95gh7 = (~(Lbvfh7 & P95gh7));
+	assign P95gh7 = (~(Rezfh7 & Ta4gh7));
+	assign Xn4gh7 = (!J33gh7);
+	assign X85gh7 = (~(Dl2gh7 & V95gh7));
+	assign V95gh7 = (~(Tv3gh7 & Ba5gh7));
+	assign Ba5gh7 = (~(Jl2gh7 & Xk2gh7));
+	assign Xk2gh7 = (!Fe8gh7);
+	assign L85gh7 = (~(Ha5gh7 | Na5gh7));
+	assign Na5gh7 = (~(Fh4gh7 | Lz8gh7));
+	assign Ha5gh7 = (stdio_tx_tready ? Ta5gh7 : D6vfh7);
+	assign Ta5gh7 = (~(Xw3gh7 | Ji4gh7));
+	assign Ji4gh7 = (!stdio_tx_tvalid);
+	assign D6vfh7 = (!Ty3gh7);
+	assign Ty3gh7 = (~(Za5gh7 & Rezfh7));
+	assign Za5gh7 = (~(T4vfh7 | Fb5gh7));
+	assign Knrfh7 = (~(Z14gh7 & Lb5gh7));
+	assign Lb5gh7 = (V64gh7 | F29gh7);
+	assign Z14gh7 = (~(Rb5gh7 & B72gh7));
+	assign B72gh7 = (Hg4gh7 & Na9gh7);
+	assign Hg4gh7 = (Xb5gh7 & Ft4gh7);
+	assign Xb5gh7 = (Dc5gh7 & F8vfh7);
+	assign Rb5gh7 = (Lz4gh7 & Rqxfh7);
+	assign Borfh7 = (~(Di0gh7 & Jc5gh7));
+	assign Jc5gh7 = (V64gh7 | B19gh7);
+	assign Di0gh7 = (~(Pc5gh7 & Vc5gh7));
+	assign Vc5gh7 = (Rqxfh7 & Rt4gh7);
+	assign Pc5gh7 = (Ng4gh7 & Lz4gh7);
+	assign Lz4gh7 = (Bd5gh7 & Hd5gh7);
+	assign Hd5gh7 = (~(Rbvfh7 & Nd5gh7));
+	assign Ng4gh7 = (Td5gh7 & Zd5gh7);
+	assign Sorfh7 = (Fe5gh7 & Tm4gh7);
+	assign Fe5gh7 = (Le5gh7 & Rt4gh7);
+	assign Le5gh7 = (!D33gh7);
+	assign Jprfh7 = (~(Re5gh7 & Xe5gh7));
+	assign Xe5gh7 = (V64gh7 | Z19gh7);
+	assign Re5gh7 = (~(X5vfh7 & stdio_tx_tready));
+	assign Aqrfh7 = (Df5gh7 & Jf5gh7);
+	assign Jf5gh7 = (Rqxfh7 & Nd5gh7);
+	assign Df5gh7 = (Bd5gh7 & Rbvfh7);
+	assign Bd5gh7 = (Pf5gh7 & Vf5gh7);
+	assign Pf5gh7 = (Bg5gh7 & Hg5gh7);
+	assign Bg5gh7 = (~(Tm4gh7 & Rt4gh7));
+	assign Tm4gh7 = (!Ts4gh7);
+	assign Ts4gh7 = (Ng5gh7 | Na9gh7);
+	assign Rqrfh7 = (~(Re3gh7 & Tg5gh7));
+	assign Tg5gh7 = (V64gh7 | H19gh7);
+	assign Re3gh7 = (D33gh7 | Hg5gh7);
+	assign Hg5gh7 = (~(Rbvfh7 & Zd5gh7));
+	assign Zd5gh7 = (Nd5gh7 & Zg5gh7);
+	assign Zg5gh7 = (~(Ta9gh7 & Rt4gh7));
+	assign Rbvfh7 = (Fh5gh7 & Lt4gh7);
+	assign Lt4gh7 = (~(Lh5gh7 & Rh5gh7));
+	assign Lh5gh7 = (Ta9gh7 ? Di5gh7 : Xh5gh7);
+	assign Di5gh7 = (~(Td5gh7 & Za9gh7));
+	assign Td5gh7 = (~(Fb9gh7 | Na9gh7));
+	assign Xh5gh7 = (~(Ji5gh7 & Fb9gh7));
+	assign Ji5gh7 = (Na9gh7 & F8vfh7);
+	assign F8vfh7 = (!Za9gh7);
+	assign Fh5gh7 = (~(Na9gh7 & Rh5gh7));
+	assign D33gh7 = (~(Vf5gh7 & Rqxfh7));
+	assign Rqxfh7 = (!Lbvfh7);
+	assign Lbvfh7 = (~(Pi5gh7 & Vi5gh7));
+	assign Vi5gh7 = (Bd9gh7 & Bj5gh7);
+	assign Vf5gh7 = (Rn4gh7 & J33gh7);
+	assign Rn4gh7 = (Hj5gh7 | Ng5gh7);
+	assign Ng5gh7 = (~(Nj5gh7 & Fb9gh7));
+	assign Nj5gh7 = (Nd5gh7 & Ta9gh7);
+	assign Nd5gh7 = (Tj5gh7 & Za9gh7);
+	assign Tj5gh7 = (Ft4gh7 & Rh5gh7);
+	assign Rh5gh7 = (~(Na9gh7 & Dc5gh7));
+	assign Dc5gh7 = (Zj5gh7 & Ta9gh7);
+	assign Zj5gh7 = (~(Rt4gh7 | Fb9gh7));
+	assign Ft4gh7 = (Zd8gh7 & N7vfh7);
+	assign N7vfh7 = (!Lb9gh7);
+	assign Hj5gh7 = (~(Na9gh7 & Rt4gh7));
+	assign Rt4gh7 = (!Rb9gh7);
+	assign Irrfh7 = (~(Vf3gh7 & P9vfh7));
+	assign P9vfh7 = (Vx3gh7 | Drxfh7);
+	assign Vf3gh7 = (X23gh7 | Vx3gh7);
+	assign Vx3gh7 = (~(D9vfh7 & Rezfh7));
+	assign D9vfh7 = (!Fk5gh7);
+	assign Zrrfh7 = (~(V9vfh7 & Lk5gh7));
+	assign Lk5gh7 = (V64gh7 | T19gh7);
+	assign V9vfh7 = (~(Rk5gh7 & Xk5gh7));
+	assign Rk5gh7 = (V0yfh7 & Dl5gh7);
+	assign Dl5gh7 = (~(Jl5gh7 & Zjxfh7));
+	assign V0yfh7 = (Pl5gh7 & Rezfh7);
+	assign Qsrfh7 = (~(Vl5gh7 & Bm5gh7));
+	assign Bm5gh7 = (V64gh7 | N19gh7);
+	assign Vl5gh7 = (V62gh7 | F85gh7);
+	assign Htrfh7 = (~(Hm5gh7 & Nm5gh7));
+	assign Nm5gh7 = (Fh4gh7 | Xz8gh7);
+	assign Hm5gh7 = (~(Dl2gh7 & Tm5gh7));
+	assign Ytrfh7 = (~(Zm5gh7 & Fn5gh7));
+	assign Fn5gh7 = (~(Ln5gh7 & Dl2gh7));
+	assign Ln5gh7 = (Fe8gh7 & Jl2gh7);
+	assign Jl2gh7 = (!Xn0gh7);
+	assign Zm5gh7 = (V64gh7 | V09gh7);
+	assign V64gh7 = (~(Rn5gh7 | Xn5gh7));
+	assign Purfh7 = (~(Do5gh7 & Jo5gh7));
+	assign Jo5gh7 = (Lw4gh7 | Rz8gh7);
+	assign Do5gh7 = (Xq0gh7 | Zj2gh7);
+	assign Gvrfh7 = (~(Po5gh7 & P34gh7));
+	assign P34gh7 = (Vo5gh7 & Bp5gh7);
+	assign Bp5gh7 = (~(Hp5gh7 & Fb5gh7));
+	assign Fb5gh7 = (Np5gh7 & Tp5gh7);
+	assign Tp5gh7 = (Zp5gh7 & R8vfh7);
+	assign Np5gh7 = (Fq5gh7 & com_rx_tdata[3]);
+	assign Fq5gh7 = (com_rx_tdata[1] & Hvxfh7);
+	assign Hvxfh7 = (Lq5gh7 & com_rx_tdata[4]);
+	assign Lq5gh7 = (~(V6vfh7 | com_rx_tdata[5]));
+	assign Hp5gh7 = (Rezfh7 & Rq5gh7);
+	assign Rq5gh7 = (!T4vfh7);
+	assign Vo5gh7 = (~(X5vfh7 & Xq5gh7));
+	assign Xq5gh7 = (!stdio_tx_tready);
+	assign X5vfh7 = (!F5vfh7);
+	assign F5vfh7 = (~(Dr5gh7 & Jr5gh7));
+	assign Dr5gh7 = (~(Pr5gh7 | Ba9gh7));
+	assign Po5gh7 = (Vr5gh7 & Bs5gh7);
+	assign Bs5gh7 = (Fh4gh7 | Hy8gh7);
+	assign Fh4gh7 = (~(Rn5gh7 | Hs5gh7));
+	assign Vr5gh7 = (~(Dl2gh7 & Ns5gh7));
+	assign Xvrfh7 = (~(Ts5gh7 & Zs5gh7));
+	assign Zs5gh7 = (~(Xn5gh7 & Ft5gh7));
+	assign Ts5gh7 = (~(Zs0gh7 & Dl2gh7));
+	assign Owrfh7 = (~(Lt5gh7 & Rt5gh7));
+	assign Rt5gh7 = (N44gh7 | By8gh7);
+	assign N44gh7 = (Lw4gh7 & Xt5gh7);
+	assign Xt5gh7 = (~(Zs0gh7 & Zj2gh7));
+	assign Lw4gh7 = (!Xn5gh7);
+	assign Xn5gh7 = (~(Du5gh7 & Ju5gh7));
+	assign Ju5gh7 = (Pu5gh7 & Vu5gh7);
+	assign Vu5gh7 = (By3gh7 & Bv5gh7);
+	assign By3gh7 = (~(Hv5gh7 & Nv5gh7));
+	assign Nv5gh7 = (~(Xw3gh7 & Do0gh7));
+	assign Do0gh7 = (~(Pi4gh7 & Tv5gh7));
+	assign Tv5gh7 = (~(Bj4gh7 | Z19gh7));
+	assign Pi4gh7 = (Zv5gh7 & B19gh7);
+	assign Xw3gh7 = (~(Ju4gh7 & Fw5gh7));
+	assign Fw5gh7 = (Tv8gh7 & Lw5gh7);
+	assign Ju4gh7 = (Rw5gh7 & Bv8gh7);
+	assign Hv5gh7 = (~(stdio_tx_tvalid & stdio_tx_tready));
+	assign Pu5gh7 = (Xw5gh7 & Dx5gh7);
+	assign Dx5gh7 = (~(Jx5gh7 & Zj2gh7));
+	assign Jx5gh7 = (~(Lb4gh7 & Xz3gh7));
+	assign Xz3gh7 = (!Ns5gh7);
+	assign Ns5gh7 = (~(Px5gh7 & Vx5gh7));
+	assign Vx5gh7 = (~(By5gh7 & Hy5gh7));
+	assign Hy5gh7 = (By8gh7 & Ft5gh7);
+	assign Px5gh7 = (~(Ny5gh7 & Ty5gh7));
+	assign Ny5gh7 = (~(Zy5gh7 | Vu8gh7));
+	assign Lb4gh7 = (!Tm5gh7);
+	assign Tm5gh7 = (~(Fz5gh7 & Lz5gh7));
+	assign Lz5gh7 = (~(Rz5gh7 & Xz5gh7));
+	assign Xz5gh7 = (D06gh7 & J06gh7);
+	assign D06gh7 = (~(P06gh7 | P09gh7));
+	assign P06gh7 = (!V06gh7);
+	assign Rz5gh7 = (B16gh7 & X29gh7);
+	assign Fz5gh7 = (~(H16gh7 & N16gh7));
+	assign H16gh7 = (~(T16gh7 | V09gh7));
+	assign Xw5gh7 = (Z16gh7 | Rezfh7);
+	assign Du5gh7 = (F26gh7 & L26gh7);
+	assign L26gh7 = (Xe3gh7 & Hd3gh7);
+	assign Hd3gh7 = (~(Vc3gh7 & R26gh7));
+	assign Vc3gh7 = (!Hm2gh7);
+	assign Hm2gh7 = (~(X26gh7 & Xq4gh7));
+	assign Xq4gh7 = (D36gh7 & Ty5gh7);
+	assign D36gh7 = (Vu8gh7 & Pu8gh7);
+	assign X26gh7 = (Du8gh7 & Dr4gh7);
+	assign Xe3gh7 = (J36gh7 & Bm2gh7);
+	assign Bm2gh7 = (~(R26gh7 & Zp4gh7));
+	assign Zp4gh7 = (Ha4gh7 | Ba4gh7);
+	assign Ba4gh7 = (P36gh7 & V36gh7);
+	assign V36gh7 = (B46gh7 & Du8gh7);
+	assign B46gh7 = (~(Dr4gh7 | Pu8gh7));
+	assign Dr4gh7 = (!Ju8gh7);
+	assign P36gh7 = (Ty5gh7 & Vu8gh7);
+	assign Ty5gh7 = (H46gh7 & N46gh7);
+	assign N46gh7 = (T46gh7 & Lt8gh7);
+	assign T46gh7 = (Rt8gh7 & Xt8gh7);
+	assign Ha4gh7 = (Z46gh7 & F56gh7);
+	assign Z46gh7 = (~(L56gh7 | Zv8gh7));
+	assign L56gh7 = (!R56gh7);
+	assign J36gh7 = (~(R26gh7 & X56gh7));
+	assign X56gh7 = (~(Na4gh7 & Zy1gh7));
+	assign Zy1gh7 = (~(D66gh7 & Jr5gh7));
+	assign Jr5gh7 = (J66gh7 & P66gh7);
+	assign P66gh7 = (V66gh7 & T19gh7);
+	assign V66gh7 = (V99gh7 & Bd9gh7);
+	assign J66gh7 = (B76gh7 & N16gh7);
+	assign B76gh7 = (~(H76gh7 | N76gh7));
+	assign D66gh7 = (Ba9gh7 & Pr5gh7);
+	assign Pr5gh7 = (!H19gh7);
+	assign Na4gh7 = (~(T76gh7 & Z76gh7));
+	assign Z76gh7 = (~(Bj4gh7 | B19gh7));
+	assign Bj4gh7 = (!Ha9gh7);
+	assign T76gh7 = (Zv5gh7 & Z19gh7);
+	assign Zv5gh7 = (F86gh7 & L86gh7);
+	assign L86gh7 = (R86gh7 & F29gh7);
+	assign R86gh7 = (~(H76gh7 | T16gh7));
+	assign H76gh7 = (!V09gh7);
+	assign R26gh7 = (!Vi0gh7);
+	assign F26gh7 = (~(X86gh7 | Hs5gh7));
+	assign Hs5gh7 = (~(D96gh7 & J96gh7));
+	assign J96gh7 = (~(P96gh7 & F85gh7));
+	assign P96gh7 = (~(V96gh7 & Ba6gh7));
+	assign Ba6gh7 = (Ha6gh7 | stdio_rx_tvalid);
+	assign V96gh7 = (V62gh7 | com_tx_tready);
+	assign D96gh7 = (~(Na6gh7 & Zj2gh7));
+	assign Na6gh7 = (~(Ta6gh7 & Za6gh7));
+	assign Ta6gh7 = (Fe4gh7 & Xn0gh7);
+	assign Xn0gh7 = (~(Fb6gh7 & Lb6gh7));
+	assign Lb6gh7 = (Rb6gh7 & Lz8gh7);
+	assign Rb6gh7 = (~(Xb6gh7 | Rz8gh7));
+	assign Lt5gh7 = (Zp1gh7 | Zj2gh7);
+	assign Zp1gh7 = (!Pr0gh7);
+	assign Fxrfh7 = (!Dc6gh7);
+	assign Dc6gh7 = (Dl2gh7 ? Le4gh7 : Jc6gh7);
+	assign Jc6gh7 = (Df4gh7 | Pc9gh7);
+	assign Wxrfh7 = (Zj2gh7 ? Hp0gh7 : By0gh7);
+	assign Hp0gh7 = (!Le4gh7);
+	assign Le4gh7 = (~(Pc6gh7 & Vc6gh7));
+	assign Vc6gh7 = (Bd6gh7 & Fz8gh7);
+	assign Bd6gh7 = (~(Hd6gh7 | Ty8gh7));
+	assign Pc6gh7 = (Nd6gh7 & Td6gh7);
+	assign By0gh7 = (!Re4gh7);
+	assign Nyrfh7 = (~(Zd6gh7 & Fe6gh7));
+	assign Fe6gh7 = (~(D64gh7 & Le6gh7));
+	assign D64gh7 = (~(F54gh7 & Bv5gh7));
+	assign F54gh7 = (~(Rn5gh7 | X86gh7));
+	assign X86gh7 = (~(Re6gh7 & Xe6gh7));
+	assign Xe6gh7 = (Tv3gh7 | Dl2gh7);
+	assign Tv3gh7 = (~(Df6gh7 & Jf6gh7));
+	assign Jf6gh7 = (~(Pf6gh7 & Vf6gh7));
+	assign Vf6gh7 = (~(Bg6gh7 & Hg6gh7));
+	assign Hg6gh7 = (~(Ng6gh7 | J09gh7));
+	assign Bg6gh7 = (J06gh7 & D09gh7);
+	assign Pf6gh7 = (~(Tg6gh7 & V06gh7));
+	assign Tg6gh7 = (~(Zg6gh7 | F29gh7));
+	assign Re6gh7 = (Fh6gh7 & Lh6gh7);
+	assign Lh6gh7 = (~(Rh6gh7 & Jl5gh7));
+	assign Jl5gh7 = (Xh6gh7 & Di6gh7);
+	assign Di6gh7 = (!Ji6gh7);
+	assign Ji6gh7 = (com_rx_tdata[5] ? Vi6gh7 : Pi6gh7);
+	assign Vi6gh7 = (~(V6vfh7 & Bsxfh7));
+	assign Pi6gh7 = (~(com_rx_tdata[3] & com_rx_tdata[0]));
+	assign Rh6gh7 = (Xk5gh7 & Zjxfh7);
+	assign Xk5gh7 = (!Drxfh7);
+	assign Fh6gh7 = (~(Pl5gh7 & Xexfh7));
+	assign Xexfh7 = (!X23gh7);
+	assign Rn5gh7 = (~(Bj6gh7 & Hj6gh7));
+	assign Hj6gh7 = (~(Nj6gh7 & Zj2gh7));
+	assign Nj6gh7 = (~(Tj6gh7 & Df4gh7));
+	assign Df4gh7 = (Zj6gh7 & L81gh7);
+	assign L81gh7 = (~(Fk6gh7 & B16gh7));
+	assign Fk6gh7 = (~(Lk6gh7 | X29gh7));
+	assign Lk6gh7 = (!Rk6gh7);
+	assign Zj6gh7 = (~(Pr0gh7 | Zs0gh7));
+	assign Zs0gh7 = (!Dr1gh7);
+	assign Dr1gh7 = (~(By5gh7 & Xk6gh7));
+	assign Xk6gh7 = (~(Ft5gh7 | By8gh7));
+	assign Ft5gh7 = (!Jx8gh7);
+	assign By5gh7 = (Dl6gh7 & Jl6gh7);
+	assign Pr0gh7 = (Pl6gh7 & Vl6gh7);
+	assign Vl6gh7 = (~(Bm6gh7 | Pc9gh7));
+	assign Tj6gh7 = (Xq0gh7 & Re4gh7);
+	assign Re4gh7 = (~(Hm6gh7 & Nm6gh7));
+	assign Hm6gh7 = (~(Hd6gh7 | Fz8gh7));
+	assign Xq0gh7 = (~(Pl6gh7 & Tm6gh7));
+	assign Tm6gh7 = (Pc9gh7 & Bm6gh7);
+	assign Bm6gh7 = (!Hy8gh7);
+	assign Pl6gh7 = (Dl6gh7 & Zm6gh7);
+	assign Dl6gh7 = (Fn6gh7 & Ln6gh7);
+	assign Fn6gh7 = (D09gh7 & Rn6gh7);
+	assign Bj6gh7 = (~(Pc3gh7 & Rw4gh7));
+	assign Pc3gh7 = (~(Xn6gh7 & Vx4gh7));
+	assign Xn6gh7 = (Dl0gh7 & Fbvfh7);
+	assign Zd6gh7 = (~(Lz0gh7 & Dl2gh7));
+	assign Ezrfh7 = (!Do6gh7);
+	assign Do6gh7 = (Dl2gh7 ? Bg2gh7 : Jo6gh7);
+	assign Jo6gh7 = (~(Pf4gh7 & Po6gh7));
+	assign Vzrfh7 = (!Vo6gh7);
+	assign Vo6gh7 = (Dl2gh7 ? Hp6gh7 : Bp6gh7);
+	assign Bp6gh7 = (~(Jf4gh7 & Np6gh7));
+	assign M0sfh7 = (!Tp6gh7);
+	assign Tp6gh7 = (Dl2gh7 ? Hd2gh7 : Zp6gh7);
+	assign Zp6gh7 = (~(Pf4gh7 & Fq6gh7));
+	assign Pf4gh7 = (Fw0gh7 | Lz0gh7);
+	assign Lz0gh7 = (Lq6gh7 & Rq6gh7);
+	assign Rq6gh7 = (Zy8gh7 & Po6gh7);
+	assign Po6gh7 = (!Ny8gh7);
+	assign Fw0gh7 = (!Hp6gh7);
+	assign Hp6gh7 = (~(Xq6gh7 & Dr6gh7));
+	assign Dr6gh7 = (Jr6gh7 & Fq6gh7);
+	assign Fq6gh7 = (!Vx8gh7);
+	assign D1sfh7 = (!Pr6gh7);
+	assign Pr6gh7 = (Dl2gh7 ? Hp1gh7 : Vr6gh7);
+	assign Vr6gh7 = (~(Bs6gh7 & Hs6gh7));
+	assign U1sfh7 = (!Ns6gh7);
+	assign Ns6gh7 = (Dl2gh7 ? Fz1gh7 : Ts6gh7);
+	assign Ts6gh7 = (~(Jf4gh7 & Zs6gh7));
+	assign Jf4gh7 = (Bs6gh7 | Ft6gh7);
+	assign Ft6gh7 = (!Hp1gh7);
+	assign Hp1gh7 = (~(Lt6gh7 & Rt6gh7));
+	assign Rt6gh7 = (Xt8gh7 & Zs6gh7);
+	assign Zs6gh7 = (!Rt8gh7);
+	assign Bs6gh7 = (~(Hd2gh7 & Bg2gh7));
+	assign Bg2gh7 = (~(Lq6gh7 & Xt6gh7));
+	assign Xt6gh7 = (Ny8gh7 & Np6gh7);
+	assign Np6gh7 = (!Zy8gh7);
+	assign Lq6gh7 = (Nm6gh7 & Fz8gh7);
+	assign Nm6gh7 = (Xq6gh7 & Du6gh7);
+	assign Du6gh7 = (Vx8gh7 & Ty8gh7);
+	assign Xq6gh7 = (Td6gh7 & Px8gh7);
+	assign Hd2gh7 = (~(Ju6gh7 & Pu6gh7));
+	assign Pu6gh7 = (Jr6gh7 & Hs6gh7);
+	assign Hs6gh7 = (!Px8gh7);
+	assign Ju6gh7 = (Td6gh7 & Vx8gh7);
+	assign Td6gh7 = (Vu6gh7 & Bv6gh7);
+	assign Bv6gh7 = (Hv6gh7 & Zm6gh7);
+	assign Hv6gh7 = (Nv6gh7 & Tv6gh7);
+	assign L2sfh7 = (~(Zv6gh7 & J62gh7));
+	assign J62gh7 = (~(Pi5gh7 & Fw6gh7));
+	assign Fw6gh7 = (~(Bj5gh7 | Bd9gh7));
+	assign Bj5gh7 = (!V99gh7);
+	assign Pi5gh7 = (Lw6gh7 & T19gh7);
+	assign Zv6gh7 = (Dl2gh7 ? Fe4gh7 : Rw6gh7);
+	assign Fe4gh7 = (~(Xw6gh7 & Dx6gh7));
+	assign Xw6gh7 = (Rw8gh7 & Jx6gh7);
+	assign Jx6gh7 = (!Lw8gh7);
+	assign Rw6gh7 = (Za6gh7 | Lt8gh7);
+	assign Za6gh7 = (Rb4gh7 & Fz1gh7);
+	assign Fz1gh7 = (~(Px6gh7 & Vx6gh7));
+	assign Vx6gh7 = (~(By6gh7 | Lt8gh7));
+	assign Px6gh7 = (Hy6gh7 & Rt8gh7);
+	assign C3sfh7 = (Ny6gh7 & Zv4gh7);
+	assign Zv4gh7 = (Ty6gh7 & Zy6gh7);
+	assign Zy6gh7 = (Fz6gh7 & Lz6gh7);
+	assign Lz6gh7 = (Rz6gh7 & Xz6gh7);
+	assign Xz6gh7 = (D07gh7 & J07gh7);
+	assign J07gh7 = (P07gh7 & V07gh7);
+	assign V07gh7 = (~(Pxvfh7 ^ B17gh7));
+	assign B17gh7 = (~(Ns8gh7 | Jrtfh7));
+	assign Pxvfh7 = (!Hs8gh7);
+	assign P07gh7 = (~(Xhwfh7 ^ H17gh7));
+	assign H17gh7 = (~(Pr8gh7 | Nptfh7));
+	assign Xhwfh7 = (!Jr8gh7);
+	assign D07gh7 = (N17gh7 & T17gh7);
+	assign T17gh7 = (~(T1xfh7 ^ Z17gh7));
+	assign Z17gh7 = (~(Rq8gh7 | Rntfh7));
+	assign T1xfh7 = (!Lq8gh7);
+	assign N17gh7 = (Np8gh7 ^ F27gh7);
+	assign F27gh7 = (~(Tp8gh7 | Vltfh7));
+	assign Rz6gh7 = (L27gh7 & R27gh7);
+	assign R27gh7 = (X27gh7 & D37gh7);
+	assign D37gh7 = (~(Zmwfh7 ^ J37gh7));
+	assign J37gh7 = (~(Vo8gh7 | Bptfh7));
+	assign Zmwfh7 = (!Po8gh7);
+	assign X27gh7 = (~(Nsvfh7 ^ P37gh7));
+	assign P37gh7 = (~(Xn8gh7 | Vrtfh7));
+	assign Nsvfh7 = (!Rn8gh7);
+	assign L27gh7 = (V37gh7 & B47gh7);
+	assign B47gh7 = (~(J6xfh7 ^ H47gh7));
+	assign H47gh7 = (~(Zm8gh7 | Fntfh7));
+	assign J6xfh7 = (!Tm8gh7);
+	assign V37gh7 = (~(Fhxfh7 ^ N47gh7));
+	assign N47gh7 = (~(Bm8gh7 | Hmtfh7));
+	assign Fhxfh7 = (!Vl8gh7);
+	assign Fz6gh7 = (T47gh7 & Z47gh7);
+	assign Z47gh7 = (F57gh7 & L57gh7);
+	assign L57gh7 = (R57gh7 & X57gh7);
+	assign X57gh7 = (~(Tpvfh7 ^ D67gh7));
+	assign D67gh7 = (~(Dl8gh7 | Bstfh7));
+	assign Tpvfh7 = (!Xk8gh7);
+	assign R57gh7 = (~(D0wfh7 ^ J67gh7));
+	assign J67gh7 = (~(Fk8gh7 | Drtfh7));
+	assign D0wfh7 = (!Zj8gh7);
+	assign F57gh7 = (P67gh7 & V67gh7);
+	assign V67gh7 = (~(Hawfh7 ^ B77gh7));
+	assign B77gh7 = (~(Hj8gh7 | Fqtfh7));
+	assign Hawfh7 = (!Bj8gh7);
+	assign P67gh7 = (~(Lkwfh7 ^ H77gh7));
+	assign H77gh7 = (~(Ji8gh7 | Hptfh7));
+	assign Lkwfh7 = (!Di8gh7);
+	assign T47gh7 = (N77gh7 & T77gh7);
+	assign T77gh7 = (Z77gh7 & F87gh7);
+	assign F87gh7 = (~(Puwfh7 ^ L87gh7));
+	assign L87gh7 = (~(Lh8gh7 | Jotfh7));
+	assign Puwfh7 = (!Fh8gh7);
+	assign Z77gh7 = (~(B4xfh7 ^ R87gh7));
+	assign R87gh7 = (~(Ng8gh7 | Lntfh7));
+	assign B4xfh7 = (!Hg8gh7);
+	assign N77gh7 = (X87gh7 & D97gh7);
+	assign D97gh7 = (~(Hdxfh7 ^ J97gh7));
+	assign J97gh7 = (~(Pf8gh7 | Nmtfh7));
+	assign Hdxfh7 = (!Jf8gh7);
+	assign X87gh7 = (~(Tpxfh7 ^ P97gh7));
+	assign P97gh7 = (~(Re8gh7 | Pltfh7));
+	assign Tpxfh7 = (!Le8gh7);
+	assign Ty6gh7 = (V97gh7 & Ba7gh7);
+	assign Ba7gh7 = (Ha7gh7 & Na7gh7);
+	assign Na7gh7 = (Ta7gh7 & Za7gh7);
+	assign Za7gh7 = (Fb7gh7 & Lb7gh7);
+	assign Lb7gh7 = (~(Bswfh7 ^ Rb7gh7));
+	assign Rb7gh7 = (~(Dr8gh7 | Potfh7));
+	assign Bswfh7 = (!Xq8gh7);
+	assign Fb7gh7 = (~(Vcwfh7 ^ Xb7gh7));
+	assign Xb7gh7 = (~(Ln8gh7 | Zptfh7));
+	assign Vcwfh7 = (!Fn8gh7);
+	assign Ta7gh7 = (Dc7gh7 & Jc7gh7);
+	assign Jc7gh7 = (~(Zgvfh7 ^ Pc7gh7));
+	assign Pc7gh7 = (~(Hp8gh7 | Jltfh7));
+	assign Zgvfh7 = (!Bp8gh7);
+	assign Dc7gh7 = (~(F5wfh7 ^ Vc7gh7));
+	assign Vc7gh7 = (~(Tj8gh7 | Rqtfh7));
+	assign F5wfh7 = (!Nj8gh7);
+	assign Ha7gh7 = (Bd7gh7 & Hd7gh7);
+	assign Hd7gh7 = (Nd7gh7 & Td7gh7);
+	assign Td7gh7 = (~(R8xfh7 ^ Zd7gh7));
+	assign Zd7gh7 = (~(Bg8gh7 | Zmtfh7));
+	assign R8xfh7 = (!Vf8gh7);
+	assign Nd7gh7 = (~(Npwfh7 ^ Fe7gh7));
+	assign Fe7gh7 = (~(Xh8gh7 | Votfh7));
+	assign Npwfh7 = (!Rh8gh7);
+	assign Bd7gh7 = (Le7gh7 & Re7gh7);
+	assign Re7gh7 = (~(Pfvfh7 ^ Xe7gh7));
+	assign Xe7gh7 = (~(Pl8gh7 | Nstfh7));
+	assign Pfvfh7 = (!Jl8gh7);
+	assign Le7gh7 = (~(Zmvfh7 ^ Df7gh7));
+	assign Df7gh7 = (~(Zs8gh7 | Hstfh7));
+	assign Zmvfh7 = (!Ts8gh7);
+	assign V97gh7 = (Jf7gh7 & Pf7gh7);
+	assign Pf7gh7 = (Vf7gh7 & Bg7gh7);
+	assign Bg7gh7 = (Hg7gh7 & Ng7gh7);
+	assign Ng7gh7 = (~(T7wfh7 ^ Tg7gh7));
+	assign Tg7gh7 = (~(Bs8gh7 | Lqtfh7));
+	assign T7wfh7 = (!Vr8gh7);
+	assign Hg7gh7 = (~(Zaxfh7 ^ Zg7gh7));
+	assign Zg7gh7 = (~(Fq8gh7 | Tmtfh7));
+	assign Zaxfh7 = (!Zp8gh7);
+	assign Vf7gh7 = (Fh7gh7 & Lh7gh7);
+	assign Lh7gh7 = (~(R2wfh7 ^ Rh7gh7));
+	assign Rh7gh7 = (~(Jo8gh7 | Xqtfh7));
+	assign R2wfh7 = (!Do8gh7);
+	assign Fh7gh7 = (~(Dxwfh7 ^ Xh7gh7));
+	assign Xh7gh7 = (~(Nm8gh7 | Dotfh7));
+	assign Dxwfh7 = (!Hm8gh7);
+	assign Jf7gh7 = (Di7gh7 & Ji7gh7);
+	assign Ji7gh7 = (Pi7gh7 & Vi7gh7);
+	assign Vi7gh7 = (~(Bvvfh7 ^ Bj7gh7));
+	assign Bj7gh7 = (~(Rk8gh7 | Prtfh7));
+	assign Bvvfh7 = (!Lk8gh7);
+	assign Pi7gh7 = (~(Jfwfh7 ^ Hj7gh7));
+	assign Hj7gh7 = (~(Vi8gh7 | Tptfh7));
+	assign Jfwfh7 = (!Pi8gh7);
+	assign Di7gh7 = (Nj7gh7 & Tj7gh7);
+	assign Tj7gh7 = (~(Lzwfh7 ^ Zj7gh7));
+	assign Zj7gh7 = (~(Zg8gh7 | Xntfh7));
+	assign Lzwfh7 = (!Tg8gh7);
+	assign Nj7gh7 = (~(Jixfh7 ^ Fk7gh7));
+	assign Fk7gh7 = (~(Df8gh7 | Bmtfh7));
+	assign Jixfh7 = (!Xe8gh7);
+	assign Ny6gh7 = (Fq4gh7 & Ty4gh7);
+	assign Fq4gh7 = (!Dx3gh7);
+	assign Dx3gh7 = (~(Lk7gh7 & Dx6gh7));
+	assign Dx6gh7 = (Rk7gh7 & Fk4gh7);
+	assign Rk7gh7 = (Xb9gh7 & Fw8gh7);
+	assign Lk7gh7 = (Lw8gh7 & Zj4gh7);
+	assign Zj4gh7 = (!Rw8gh7);
+	assign T3sfh7 = (~(Xk7gh7 & Dl7gh7));
+	assign Dl7gh7 = (Jl7gh7 & Pl7gh7);
+	assign Pl7gh7 = (~(Pl5gh7 & Ta4gh7));
+	assign Ta4gh7 = (!Vl7gh7);
+	assign Pl5gh7 = (Fk5gh7 & J33gh7);
+	assign J33gh7 = (~(Bm7gh7 & Hm7gh7));
+	assign Hm7gh7 = (J9vfh7 & Bsxfh7);
+	assign Bsxfh7 = (!com_rx_tdata[3]);
+	assign Bm7gh7 = (Xh6gh7 & Nyxfh7);
+	assign Nyxfh7 = (~(com_rx_tdata[5] | com_rx_tdata[0]));
+	assign Fk5gh7 = (~(Nm7gh7 & Tm7gh7));
+	assign Tm7gh7 = (Zm7gh7 & Fn7gh7);
+	assign Fn7gh7 = (~(com_rx_tdata[2] & V6vfh7));
+	assign V6vfh7 = (!com_rx_tdata[0]);
+	assign Zm7gh7 = (~(Ftxfh7 | com_rx_tdata[5]));
+	assign Ftxfh7 = (com_rx_tdata[1] & com_rx_tdata[0]);
+	assign Nm7gh7 = (Nvxfh7 & Xh6gh7);
+	assign Xh6gh7 = (Zp5gh7 & Z7vfh7);
+	assign Z7vfh7 = (!com_rx_tdata[4]);
+	assign Zp5gh7 = (~(com_rx_tdata[6] | com_rx_tdata[7]));
+	assign Nvxfh7 = (com_rx_tdata[3] & Bjvfh7);
+	assign Bjvfh7 = (!Zjxfh7);
+	assign Zjxfh7 = (J9vfh7 & R8vfh7);
+	assign R8vfh7 = (!com_rx_tdata[2]);
+	assign J9vfh7 = (!com_rx_tdata[1]);
+	assign Jl7gh7 = (Fw3gh7 & Dl0gh7);
+	assign Dl0gh7 = (~(Ln7gh7 & Hv8gh7));
+	assign Ln7gh7 = (~(Rn7gh7 | Nv8gh7));
+	assign Fw3gh7 = (~(Xn7gh7 & Do7gh7));
+	assign Do7gh7 = (~(Lw5gh7 | Bv8gh7));
+	assign Lw5gh7 = (!L29gh7);
+	assign Xn7gh7 = (Rw5gh7 & Tv8gh7);
+	assign Rw5gh7 = (Jo7gh7 & Po7gh7);
+	assign Po7gh7 = (Vo7gh7 & Bp7gh7);
+	assign Xk7gh7 = (Hp7gh7 & Vx4gh7);
+	assign Vx4gh7 = (Xw4gh7 & Dx4gh7);
+	assign Dx4gh7 = (~(Np7gh7 & Ln6gh7));
+	assign Np7gh7 = (~(Ng6gh7 | D09gh7));
+	assign Xw4gh7 = (~(Tp7gh7 & Zp7gh7));
+	assign Zp7gh7 = (Dx8gh7 & Fq7gh7);
+	assign Hp7gh7 = (Lq7gh7 & Rq7gh7);
+	assign Rq7gh7 = (~(Xq7gh7 & Rw4gh7));
+	assign Rw4gh7 = (!Rezfh7);
+	assign Rezfh7 = (com_rx_tvalid & com_rx_tready);
+	assign Xq7gh7 = (~(Z16gh7 & Fbvfh7));
+	assign Fbvfh7 = (~(Tp7gh7 & Dr7gh7));
+	assign Dr7gh7 = (~(Fq7gh7 | Dx8gh7));
+	assign Fq7gh7 = (!Xw8gh7);
+	assign Tp7gh7 = (F56gh7 & Zv8gh7);
+	assign F56gh7 = (Jr7gh7 & Pr7gh7);
+	assign Pr7gh7 = (Xb9gh7 & Vr7gh7);
+	assign Z16gh7 = (Vl7gh7 & T4vfh7);
+	assign T4vfh7 = (~(Bs7gh7 & Nv8gh7));
+	assign Bs7gh7 = (~(Rn7gh7 | Hv8gh7));
+	assign Rn7gh7 = (~(Hs7gh7 & Ft8gh7));
+	assign Hs7gh7 = (Bp7gh7 & Ns7gh7);
+	assign Vl7gh7 = (Drxfh7 & X23gh7);
+	assign X23gh7 = (~(Ts7gh7 & Zs7gh7));
+	assign Zs7gh7 = (Bd9gh7 & Ft7gh7);
+	assign Ts7gh7 = (Lw6gh7 & V99gh7);
+	assign Lw6gh7 = (~(Lt7gh7 | N76gh7));
+	assign Drxfh7 = (~(Rt7gh7 & Xt7gh7));
+	assign Xt7gh7 = (Du7gh7 & V99gh7);
+	assign Du7gh7 = (Bd9gh7 & N76gh7);
+	assign N76gh7 = (!N19gh7);
+	assign Rt7gh7 = (~(Lt7gh7 | Ft7gh7));
+	assign Ft7gh7 = (!T19gh7);
+	assign Lt7gh7 = (~(Ju7gh7 & Pu7gh7));
+	assign Pu7gh7 = (H19gh7 & Ba9gh7);
+	assign Ju7gh7 = (N16gh7 & V09gh7);
+	assign N16gh7 = (F86gh7 & Vu7gh7);
+	assign Vu7gh7 = (~(Bv7gh7 | Hv7gh7));
+	assign F86gh7 = (Df6gh7 & V06gh7);
+	assign Lq7gh7 = (F85gh7 | Ha6gh7);
+	assign Ha6gh7 = (Zv3gh7 & V62gh7);
+	assign V62gh7 = (~(Fb6gh7 & Nv7gh7));
+	assign Nv7gh7 = (Tv7gh7 & Lz8gh7);
+	assign Tv7gh7 = (Rz8gh7 & Xb6gh7);
+	assign K4sfh7 = (~(Zv7gh7 & R54gh7));
+	assign R54gh7 = (Rb4gh7 | Zj2gh7);
+	assign Zj2gh7 = (!Dl2gh7);
+	assign Dl2gh7 = (com_tx_tready & com_tx_tvalid);
+	assign Rb4gh7 = (~(Lt6gh7 & Fw7gh7));
+	assign Fw7gh7 = (Rt8gh7 & By6gh7);
+	assign By6gh7 = (!Xt8gh7);
+	assign Lt6gh7 = (Hy6gh7 & Lt8gh7);
+	assign Hy6gh7 = (H46gh7 & Lw7gh7);
+	assign H46gh7 = (Rw7gh7 & Ft8gh7);
+	assign Zv7gh7 = (Bv5gh7 & V65gh7);
+	assign V65gh7 = (Xw7gh7 | Zv3gh7);
+	assign Zv3gh7 = (~(Fb6gh7 & Dx7gh7));
+	assign Dx7gh7 = (Jx7gh7 & Rz8gh7);
+	assign Jx7gh7 = (~(Xb6gh7 | Lz8gh7));
+	assign Xb6gh7 = (!Xz8gh7);
+	assign Fb6gh7 = (Px7gh7 & Nv6gh7);
+	assign Xw7gh7 = (~(stdio_rx_tvalid & F85gh7));
+	assign F85gh7 = (!com_rx_tvalid);
+	assign Bv5gh7 = (D34gh7 | J34gh7);
+	assign J34gh7 = (~(P65gh7 | L54gh7));
+	assign L54gh7 = (Vx7gh7 & Fk4gh7);
+	assign Fk4gh7 = (Jr7gh7 & By7gh7);
+	assign By7gh7 = (Zv8gh7 & R56gh7);
+	assign Jr7gh7 = (Px7gh7 & Tv6gh7);
+	assign Px7gh7 = (Vu6gh7 & Hy7gh7);
+	assign Hy7gh7 = (Ny7gh7 & Ty7gh7);
+	assign Ty7gh7 = (Vx8gh7 & Jr6gh7);
+	assign Ny7gh7 = (Zm6gh7 & Px8gh7);
+	assign Vu6gh7 = (Zy7gh7 & Ln6gh7);
+	assign Ln6gh7 = (Fz7gh7 & Df6gh7);
+	assign Df6gh7 = (Lz7gh7 & B16gh7);
+	assign B16gh7 = (Jo7gh7 & Rz7gh7);
+	assign Rz7gh7 = (Xz7gh7 & D08gh7);
+	assign D08gh7 = (Tv8gh7 & L29gh7);
+	assign Xz7gh7 = (Bp7gh7 & Bv8gh7);
+	assign Bp7gh7 = (!J08gh7);
+	assign Jo7gh7 = (P08gh7 & Hv8gh7);
+	assign P08gh7 = (Nv8gh7 & Ft8gh7);
+	assign Lz7gh7 = (X29gh7 & P09gh7);
+	assign Fz7gh7 = (J06gh7 & J09gh7);
+	assign Zy7gh7 = (D09gh7 & Jl6gh7);
+	assign Vx7gh7 = (Vr7gh7 & J64gh7);
+	assign J64gh7 = (!Xb9gh7);
+	assign P65gh7 = (V08gh7 & Rw7gh7);
+	assign Rw7gh7 = (B18gh7 & Hv8gh7);
+	assign B18gh7 = (Nv8gh7 & Ns7gh7);
+	assign Ns7gh7 = (H18gh7 & N18gh7);
+	assign N18gh7 = (Vo7gh7 & L29gh7);
+	assign Vo7gh7 = (X29gh7 & Rk6gh7);
+	assign Rk6gh7 = (T18gh7 & P09gh7);
+	assign T18gh7 = (J06gh7 & V06gh7);
+	assign V06gh7 = (Z18gh7 & D09gh7);
+	assign Z18gh7 = (J09gh7 & F28gh7);
+	assign F28gh7 = (!Ng6gh7);
+	assign Ng6gh7 = (~(L28gh7 & Rn6gh7));
+	assign Rn6gh7 = (Nd6gh7 & R28gh7);
+	assign R28gh7 = (X28gh7 & Nv6gh7);
+	assign Nv6gh7 = (D38gh7 & J38gh7);
+	assign J38gh7 = (Vr7gh7 & R56gh7);
+	assign R56gh7 = (Xw8gh7 & Dx8gh7);
+	assign Vr7gh7 = (P38gh7 & Fw8gh7);
+	assign P38gh7 = (Lw8gh7 & Rw8gh7);
+	assign D38gh7 = (Zv8gh7 & Xb9gh7);
+	assign X28gh7 = (Tv6gh7 & Jr6gh7);
+	assign Jr6gh7 = (V38gh7 & Ty8gh7);
+	assign V38gh7 = (~(Le6gh7 | Hd6gh7));
+	assign Hd6gh7 = (~(Ny8gh7 & Zy8gh7));
+	assign Le6gh7 = (!Fz8gh7);
+	assign Tv6gh7 = (B48gh7 & Lz8gh7);
+	assign B48gh7 = (Rz8gh7 & Xz8gh7);
+	assign Nd6gh7 = (Px8gh7 & Vx8gh7);
+	assign L28gh7 = (Jl6gh7 & Zm6gh7);
+	assign Zm6gh7 = (Jx8gh7 & By8gh7);
+	assign Jl6gh7 = (Hy8gh7 & Pc9gh7);
+	assign J06gh7 = (~(Bv7gh7 | Zg6gh7));
+	assign Zg6gh7 = (~(H48gh7 & V09gh7));
+	assign H48gh7 = (~(T16gh7 | Hv7gh7));
+	assign Hv7gh7 = (~(N48gh7 & B19gh7));
+	assign N48gh7 = (Z19gh7 & Ha9gh7);
+	assign T16gh7 = (~(T48gh7 & Z48gh7));
+	assign Z48gh7 = (F58gh7 & V99gh7);
+	assign F58gh7 = (Ba9gh7 & Bd9gh7);
+	assign T48gh7 = (L58gh7 & H19gh7);
+	assign L58gh7 = (N19gh7 & T19gh7);
+	assign Bv7gh7 = (!F29gh7);
+	assign H18gh7 = (Bv8gh7 & Tv8gh7);
+	assign V08gh7 = (~(J08gh7 | Ft8gh7));
+	assign J08gh7 = (~(R58gh7 & X58gh7));
+	assign X58gh7 = (Lw7gh7 & Xt8gh7);
+	assign Lw7gh7 = (Vu8gh7 & D68gh7);
+	assign D68gh7 = (!Zy5gh7);
+	assign Zy5gh7 = (~(J68gh7 & Du8gh7));
+	assign J68gh7 = (Ju8gh7 & Pu8gh7);
+	assign R58gh7 = (Lt8gh7 & Rt8gh7);
+	assign D34gh7 = (stdio_rx_tready & stdio_rx_tvalid);
+	assign Tosfh7 = (P68gh7 & Vi0gh7);
+	assign P68gh7 = (V68gh7 & Patfh7);
+	assign V68gh7 = (~(Bsufh7 & Tp4gh7));
+	assign Tp4gh7 = (!Ty4gh7);
+	assign Ty4gh7 = (~(B78gh7 & H78gh7));
+	assign H78gh7 = (N78gh7 & T78gh7);
+	assign T78gh7 = (Z78gh7 & F88gh7);
+	assign F88gh7 = (L88gh7 & R88gh7);
+	assign R88gh7 = (Jctfh7 & Dctfh7);
+	assign L88gh7 = (Vctfh7 & Pctfh7);
+	assign Z78gh7 = (X88gh7 & D98gh7);
+	assign D98gh7 = (Hdtfh7 & Bdtfh7);
+	assign X88gh7 = (Tdtfh7 & Ndtfh7);
+	assign N78gh7 = (J98gh7 & P98gh7);
+	assign P98gh7 = (V98gh7 & Ba8gh7);
+	assign Ba8gh7 = (Fetfh7 & Zdtfh7);
+	assign V98gh7 = (Retfh7 & Letfh7);
+	assign J98gh7 = (Ha8gh7 & Na8gh7);
+	assign Na8gh7 = (Dftfh7 & Xetfh7);
+	assign Ha8gh7 = (Pftfh7 & Jftfh7);
+	assign B78gh7 = (Ta8gh7 & Za8gh7);
+	assign Za8gh7 = (Fb8gh7 & Lb8gh7);
+	assign Lb8gh7 = (Rb8gh7 & Xb8gh7);
+	assign Xb8gh7 = (Bgtfh7 & Vftfh7);
+	assign Rb8gh7 = (Ngtfh7 & Hgtfh7);
+	assign Fb8gh7 = (Dc8gh7 & Jc8gh7);
+	assign Jc8gh7 = (Zgtfh7 & Tgtfh7);
+	assign Dc8gh7 = (Lhtfh7 & Fhtfh7);
+	assign Ta8gh7 = (Pc8gh7 & Vc8gh7);
+	assign Vc8gh7 = (Bd8gh7 & Hd8gh7);
+	assign Hd8gh7 = (Xhtfh7 & Rhtfh7);
+	assign Bd8gh7 = (Jitfh7 & Ditfh7);
+	assign Pc8gh7 = (Nd8gh7 & Ybtfh7);
+	assign Nd8gh7 = (Tbtfh7 & Obtfh7);
+	assign B9tfh7 = (Vi0gh7 & R9tfh7);
+	assign Vi0gh7 = (Td8gh7 & ahb_hready);
+	assign Td8gh7 = (~(Hd9gh7 | R29gh7));
+
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ie9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ie9gh7 <= Dltfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  If9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    If9gh7 <= T1ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ng9gh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Ng9gh7 <= C3sfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ph9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ph9gh7 <= Piufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ri9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ri9gh7 <= T5rfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Tj9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Tj9gh7 <= Virfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Wk9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Wk9gh7 <= T3sfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Wl9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Wl9gh7 <= Nhrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Zm9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Zm9gh7 <= Nyrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Bo9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Bo9gh7 <= Wxrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Dp9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Dp9gh7 <= Fxrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Fq9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Fq9gh7 <= Owrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ir9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ir9gh7 <= Zarfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ls9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ls9gh7 <= S7rfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Lt9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Lt9gh7 <= Tmrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ou9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ou9gh7 <= Vkqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Pv9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Pv9gh7 <= Npufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Rw9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rw9gh7 <= Hjufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Tx9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Tx9gh7 <= Mjrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Wy9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Wy9gh7 <= Cmrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Zz9gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Zz9gh7 <= Ukrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  C1agh7 <= 1'b0;
+	end
+	else
+	  begin
+	    C1agh7 <= Xvrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  F2agh7 <= 1'b0;
+	end
+	else
+	  begin
+	    F2agh7 <= J8rfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  I3agh7 <= 1'b0;
+	end
+	else
+	  begin
+	    I3agh7 <= Htrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  L4agh7 <= 1'b0;
+	end
+	else
+	  begin
+	    L4agh7 <= Qsrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  O5agh7 <= 1'b0;
+	end
+	else
+	  begin
+	    O5agh7 <= Iarfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  R6agh7 <= 1'b0;
+	end
+	else
+	  begin
+	    R6agh7 <= R9rfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  U7agh7 <= 1'b0;
+	end
+	else
+	  begin
+	    U7agh7 <= K4sfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  U8agh7 <= 1'b0;
+	end
+	else
+	  begin
+	    U8agh7 <= Gvrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  X9agh7 <= 1'b0;
+	end
+	else
+	  begin
+	    X9agh7 <= Purfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Abagh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Abagh7 <= Xktfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Wbagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Wbagh7 <= Ytrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Zcagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Zcagh7 <= Qbrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ceagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ceagh7 <= L2sfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Efagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Efagh7 <= U1sfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ggagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ggagh7 <= Hcrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Jhagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Jhagh7 <= Llrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Miagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Miagh7 <= Eirfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Pjagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Pjagh7 <= Fgrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Skagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Skagh7 <= Wgrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Vlagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Vlagh7 <= Ofrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ymagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ymagh7 <= Xerfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Boagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Boagh7 <= Ycrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Epagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Epagh7 <= Prufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Eqagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Eqagh7 <= Jrufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Eragh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Eragh7 <= Drufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Esagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Esagh7 <= Xqufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Etagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Etagh7 <= Rqufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Euagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Euagh7 <= Lqufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Evagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Evagh7 <= Fqufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ewagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ewagh7 <= Sorfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Hxagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Hxagh7 <= Borfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kyagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kyagh7 <= Aqrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Nzagh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Nzagh7 <= Rqrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Q0bgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Q0bgh7 <= Knrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  T1bgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    T1bgh7 <= Pdrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  W2bgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    W2bgh7 <= Zrrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Z3bgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Z3bgh7 <= Irrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  C5bgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    C5bgh7 <= Jprfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  F6bgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    F6bgh7 <= Vrufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  H7bgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    H7bgh7 <= Zpufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  K8bgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    K8bgh7 <= Dkrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  N9bgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    N9bgh7 <= Njufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Pabgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Pabgh7 <= Lkufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Rbbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rbbgh7 <= Jlufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ucbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ucbgh7 <= Hmufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Xdbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Xdbgh7 <= Fnufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Afbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Afbgh7 <= Doufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Dgbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Dgbgh7 <= Bpufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ghbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ghbgh7 <= W1qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Iibgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Iibgh7 <= O0qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kjbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kjbgh7 <= Tpufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Nkbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Nkbgh7 <= M4qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Plbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Plbgh7 <= C7qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Rmbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rmbgh7 <= S9qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Tnbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Tnbgh7 <= Icqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Vobgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Vobgh7 <= Yeqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Wpbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Wpbgh7 <= Ohqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Xqbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Xqbgh7 <= Fiqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Yrbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Yrbgh7 <= Ekqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Zsbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Zsbgh7 <= Viufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Bubgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Bubgh7 <= Njqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Cvbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Cvbgh7 <= Rbufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Dwbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Dwbgh7 <= N4ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Dxbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Dxbgh7 <= Bjufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Fybgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Fybgh7 <= Wiqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Gzbgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Gzbgh7 <= Xbufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  H0cgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    H0cgh7 <= T4ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  H1cgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    H1cgh7 <= X5ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  H2cgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    H2cgh7 <= Fkufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  J3cgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    J3cgh7 <= Pfqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  K4cgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    K4cgh7 <= Dlufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  N5cgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    N5cgh7 <= Zcqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  P6cgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    P6cgh7 <= Bmufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  S7cgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    S7cgh7 <= Jaqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  U8cgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    U8cgh7 <= Zmufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  X9cgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    X9cgh7 <= T7qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Zacgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Zacgh7 <= Xnufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Cccgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Cccgh7 <= D5qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Edcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Edcgh7 <= Voufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Hecgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Hecgh7 <= N2qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Jfcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Jfcgh7 <= Naufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kgcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kgcgh7 <= Rhufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Mhcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Mhcgh7 <= P9ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Nicgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Nicgh7 <= Tgufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Pjcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Pjcgh7 <= R8ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Qkcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Qkcgh7 <= Vfufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Slcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Slcgh7 <= T7ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Tmcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Tmcgh7 <= Xeufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Vncgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Vncgh7 <= V6ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Wocgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Wocgh7 <= Zdufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ypcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ypcgh7 <= Bdufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Zqcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Zqcgh7 <= R5ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Zrcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Zrcgh7 <= Zjufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Btcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Btcgh7 <= Ggqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Cucgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Cucgh7 <= Xkufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Fvcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Fvcgh7 <= Qdqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Hwcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Hwcgh7 <= Vlufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kxcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kxcgh7 <= Abqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Mycgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Mycgh7 <= Tmufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Pzcgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Pzcgh7 <= K8qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  R0dgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    R0dgh7 <= Rnufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  U1dgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    U1dgh7 <= U5qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  W2dgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    W2dgh7 <= Poufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Z3dgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Z3dgh7 <= E3qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  B5dgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    B5dgh7 <= Haufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  C6dgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    C6dgh7 <= Lhufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  E7dgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    E7dgh7 <= J9ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  F8dgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    F8dgh7 <= Ngufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  H9dgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    H9dgh7 <= L8ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Iadgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Iadgh7 <= Pfufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kbdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kbdgh7 <= N7ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Lcdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Lcdgh7 <= Reufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Nddgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Nddgh7 <= P6ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Oedgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Oedgh7 <= Tdufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Qfdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Qfdgh7 <= Vcufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Rgdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rgdgh7 <= L5ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Rhdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rhdgh7 <= Tjufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Tidgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Tidgh7 <= Xgqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ujdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ujdgh7 <= Rkufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Xkdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Xkdgh7 <= Heqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Zldgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Zldgh7 <= Plufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Cndgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Cndgh7 <= Rbqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Eodgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Eodgh7 <= Nmufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Hpdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Hpdgh7 <= B9qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Jqdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Jqdgh7 <= Lnufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Mrdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Mrdgh7 <= L6qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Osdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Osdgh7 <= Joufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Rtdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rtdgh7 <= V3qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Tudgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Tudgh7 <= Hpufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Wvdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Wvdgh7 <= F1qfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ywdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ywdgh7 <= Zaufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Zxdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Zxdgh7 <= Diufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Bzdgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Bzdgh7 <= Baufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  C0egh7 <= 1'b0;
+	end
+	else
+	  begin
+	    C0egh7 <= Fhufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  E1egh7 <= 1'b0;
+	end
+	else
+	  begin
+	    E1egh7 <= D9ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  F2egh7 <= 1'b0;
+	end
+	else
+	  begin
+	    F2egh7 <= Hgufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  H3egh7 <= 1'b0;
+	end
+	else
+	  begin
+	    H3egh7 <= F8ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  I4egh7 <= 1'b0;
+	end
+	else
+	  begin
+	    I4egh7 <= Jfufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  K5egh7 <= 1'b0;
+	end
+	else
+	  begin
+	    K5egh7 <= H7ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  L6egh7 <= 1'b0;
+	end
+	else
+	  begin
+	    L6egh7 <= Leufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  N7egh7 <= 1'b0;
+	end
+	else
+	  begin
+	    N7egh7 <= J6ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  O8egh7 <= 1'b0;
+	end
+	else
+	  begin
+	    O8egh7 <= Ndufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Q9egh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Q9egh7 <= Pcufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Raegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Raegh7 <= Z4ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Rbegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rbegh7 <= Z1ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Scegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Scegh7 <= F2ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Udegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Udegh7 <= Taufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Veegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Veegh7 <= Xhufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Xfegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Xfegh7 <= V9ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ygegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ygegh7 <= Zgufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Aiegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Aiegh7 <= X8ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Bjegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Bjegh7 <= Bgufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Dkegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Dkegh7 <= Z7ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Elegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Elegh7 <= Dfufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Gmegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Gmegh7 <= B7ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Hnegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Hnegh7 <= Feufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Joegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Joegh7 <= D6ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Jpegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Jpegh7 <= Hdufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kqegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kqegh7 <= L2ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kregh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kregh7 <= R2ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ksegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ksegh7 <= D3ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ktegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ktegh7 <= J3ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kuegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kuegh7 <= P3ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kvegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kvegh7 <= B4ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kwegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kwegh7 <= F5ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kxegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kxegh7 <= X2ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kyegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kyegh7 <= Jcufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Lzegh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Lzegh7 <= Xzpfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  O0fgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    O0fgh7 <= Mlqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  P1fgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    P1fgh7 <= Gerfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  S2fgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    S2fgh7 <= A9rfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  V3fgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    V3fgh7 <= M0sfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  X4fgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    X4fgh7 <= Ezrfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Z5fgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Z5fgh7 <= D1sfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  B7fgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    B7fgh7 <= Vzrfh7;
+	  end
+	always @(posedge Puufh7) D8fgh7 <= Tstfh7;
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  H9fgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    H9fgh7 <= B7rfh7;
+	  end
+	always @(posedge Puufh7) Hafgh7 <= Xtufh7;
+	always @(posedge Puufh7) Lbfgh7 <= Rtufh7;
+	always @(posedge Puufh7) Pcfgh7 <= Ltufh7;
+	always @(posedge Puufh7) Tdfgh7 <= Ftufh7;
+	always @(posedge Puufh7) Xefgh7 <= Zsufh7;
+	always @(posedge Puufh7) Bgfgh7 <= Tsufh7;
+	always @(posedge Puufh7) Fhfgh7 <= Nsufh7;
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Jifgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Jifgh7 <= H1ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ojfgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ojfgh7 <= B1ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Tkfgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Tkfgh7 <= P0ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ylfgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ylfgh7 <= J0ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Dnfgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Dnfgh7 <= D0ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Iofgh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Iofgh7 <= Xztfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Npfgh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Npfgh7 <= Rztfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Sqfgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Sqfgh7 <= Lztfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Yrfgh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Yrfgh7 <= Fztfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Etfgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Etfgh7 <= Zytfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kufgh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Kufgh7 <= Tytfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Qvfgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Qvfgh7 <= Nytfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Wwfgh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Wwfgh7 <= Hytfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Cyfgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Cyfgh7 <= Vxtfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Izfgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Izfgh7 <= Pxtfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  O0ggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    O0ggh7 <= Jxtfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  U1ggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    U1ggh7 <= Dxtfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  A3ggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    A3ggh7 <= Xwtfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  G4ggh7 <= 1'b1;
+	end
+	else
+	  begin
+	    G4ggh7 <= Rwtfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  M5ggh7 <= 1'b1;
+	end
+	else
+	  begin
+	    M5ggh7 <= Lwtfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  S6ggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    S6ggh7 <= Fwtfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Y7ggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Y7ggh7 <= Zvtfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  E9ggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    E9ggh7 <= Tvtfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kaggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kaggh7 <= Nvtfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Qbggh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Qbggh7 <= Hvtfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Wcggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Wcggh7 <= Bvtfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ceggh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Ceggh7 <= Vutfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ifggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ifggh7 <= Putfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ogggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ogggh7 <= Dcufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Phggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Phggh7 <= V0ufh7;
+	  end
+	always @(posedge Puufh7) Uiggh7 <= Hsufh7;
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Yjggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Yjggh7 <= Fbufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ykggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ykggh7 <= V3ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ylggh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Ylggh7 <= Bytfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Enggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Enggh7 <= Jiufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Foggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Foggh7 <= K6rfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Hpggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Hpggh7 <= C5rfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Jqggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Jqggh7 <= L4rfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Lrggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Lrggh7 <= U3rfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Nsggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Nsggh7 <= D3rfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ptggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ptggh7 <= M2rfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ruggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ruggh7 <= V1rfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Tvggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Tvggh7 <= E1rfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Vwggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Vwggh7 <= N0rfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Xxggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Xxggh7 <= Wzqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Azggh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Azggh7 <= Fzqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  D0hgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    D0hgh7 <= Oyqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  G1hgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    G1hgh7 <= Xxqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  J2hgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    J2hgh7 <= Gxqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  M3hgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    M3hgh7 <= Pwqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  P4hgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    P4hgh7 <= Yvqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  S5hgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    S5hgh7 <= Hvqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  V6hgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    V6hgh7 <= Quqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Y7hgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Y7hgh7 <= Ztqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  B9hgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    B9hgh7 <= Itqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Eahgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Eahgh7 <= Rsqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Hbhgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Hbhgh7 <= Asqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Kchgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kchgh7 <= Jrqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ndhgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ndhgh7 <= Sqqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Qehgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Qehgh7 <= Bqqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Tfhgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Tfhgh7 <= Kpqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Wghgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Wghgh7 <= Toqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Zhhgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Zhhgh7 <= Coqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Cjhgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Cjhgh7 <= Lnqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Fkhgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Fkhgh7 <= Umqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Ilhgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ilhgh7 <= Dmqfh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Lmhgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Lmhgh7 <= Lbufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Mnhgh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Mnhgh7 <= H4ufh7;
+	  end
+	always @(posedge Puufh7 or negedge Duufh7) if (~Duufh7) begin
+	  Mohgh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Mohgh7 <= N1ufh7;
+	  end
+	always @(posedge Puufh7) Rphgh7 <= Fttfh7;
+	always @(posedge Puufh7) Vqhgh7 <= Lttfh7;
+	always @(posedge Puufh7) Zrhgh7 <= Rttfh7;
+	always @(posedge Puufh7) Dthgh7 <= Dutfh7;
+	always @(posedge Puufh7) Huhgh7 <= Zstfh7;
+	always @(posedge Puufh7) Lvhgh7 <= Xttfh7;
+	always @(posedge Puufh7) Pwhgh7 <= Jutfh7;
+endmodule
+
+/*     Design Summary
+                      modules: 1
+                         udps: 0
+                mod flatinsts: 0
+                udp flatinsts: 0
+                        nodes: 3002 (0)
+                  node widths: 3242 (0)
+                      process: 281 (0)
+                        gates: 0 (0)
+                  contassigns: 2769 (0)
+                        ports: 27 (0)
+                     modinsts: 0 (0)
+                     udpinsts: 0 (0)
+                 portconnects: 0 (0)
+*/
+
+// END: VCS tokens
+// Currnet Allocated Virtual Memory Size:  203.99 MB 
+// ===================
+//  DESIGN STATISTICS 
+// ===================
+//
+// No. of design lines (note: includes comments and blank lines)                 7430
+//
+//                                                                             Static<!>  Elaborated<@>    Size(KB)
+//                                                                             ------     ----------       --------
+// No. of all modules (module+interface+package+program):                           1              1              0 
+// No. of module instances:                                                         1              1              0 
+// No. of all processes:                                                          281            281              0 
+// No. of all nodes (variable+net):                                              3002           3002              0 
+// No. of constants                                                               653            653              0 
+// No. of scalar nets:                                                           2705           2705              0 
+// No. of vector nets:                                                             16             16              0 
+// No. of scalar regs/logics:                                                     281            281              0 
+// No. of always blocks:                                                          281            281              0 
+// No. of operators:                                                             4486           4486              0 
+// No. of concatenations:                                                           8              8              0 
+// No. of bit selects:                                                            306            306              0 
+// No. of part selects:                                                             2              2              0 
+// No. of non-blocking assignments:                                               546            546              0 
+// No. of continuous assignments:                                                2769           2769              0 
+//
+// No. of top level modules/programs/packages/interfaces:                           1
+//        modules:                                                                  1
+// No. of module+udp ports:                                                        27
+//
+// Footnotes:
+// ---------
+// <!> No. of unique instances of a construct as it appears in the source.
+// <@> No. of instances of a construct when the design is elaborated.
+// K, M, B: Counted in thousands, millions and billions (if big numbers are present)
+//
+// <#> Multiple specify blocks in the SAME module are combined and counted
+//     as ONE block.
diff --git a/IPLIB/ADPcontrol_v1_0/ADPcontrol_bas__mangled.v b/IPLIB/ADPcontrol_v1_0/ADPcontrol_bas__mangled.v
new file mode 100755
index 0000000..20e0b88
--- /dev/null
+++ b/IPLIB/ADPcontrol_v1_0/ADPcontrol_bas__mangled.v
@@ -0,0 +1,4923 @@
+// 
+// A joint work commissioned on behalf of SoC Labs.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Obfuscated RTL
+//
+// Copyright (C) 2021-2, SoC Labs (www.soclabs.org)
+//
+
+/*
+                    instances: 0
+                        nodes: 1943 (0)
+                  node widths: 2119 (0)
+                      process: 173 (0)
+                   contassign:  1818 (0)
+                        ports: 27 (0)
+*/
+
+/* Source file "tokens.v", line 14 */
+module ADPcontrol(ahb_hclk, ahb_hresetn, com_rx_tready, com_rx_tdata,
+	com_rx_tvalid, com_tx_tvalid, com_tx_tdata, com_tx_tready,
+	stdio_rx_tready, stdio_rx_tdata, stdio_rx_tvalid, stdio_tx_tvalid,
+	stdio_tx_tdata, stdio_tx_tready, gpo8, gpi8, ahb_haddr, ahb_hburst,
+	ahb_hmastlock, ahb_hprot, ahb_hsize, ahb_htrans, ahb_hwdata, ahb_hwrite,
+	ahb_hrdata, ahb_hready, ahb_hresp);
+
+	input	[7:0]		com_rx_tdata;
+	output	[7:0]		com_tx_tdata;
+	input	[7:0]		stdio_rx_tdata;
+	output	[7:0]		stdio_tx_tdata;
+	output	[7:0]		gpo8;
+	input	[7:0]		gpi8;
+	output	[31:0]		ahb_haddr;
+	output	[2:0]		ahb_hburst;
+	output	[3:0]		ahb_hprot;
+	output	[2:0]		ahb_hsize;
+	output	[1:0]		ahb_htrans;
+	output	[31:0]		ahb_hwdata;
+	input	[31:0]		ahb_hrdata;
+	input			ahb_hclk;
+	input			ahb_hresetn;
+	input			com_rx_tvalid;
+	input			com_tx_tready;
+	input			stdio_rx_tvalid;
+	input			stdio_tx_tready;
+	input			ahb_hready;
+	input			ahb_hresp;
+	output			com_rx_tready;
+	output			com_tx_tvalid;
+	output			stdio_rx_tready;
+	output			stdio_tx_tvalid;
+	output			ahb_hmastlock;
+	output			ahb_hwrite;
+
+	wire			Xzpfh7;
+	wire			O0qfh7;
+	wire			F1qfh7;
+	wire			W1qfh7;
+	wire			N2qfh7;
+	wire			E3qfh7;
+	wire			V3qfh7;
+	wire			M4qfh7;
+	wire			D5qfh7;
+	wire			U5qfh7;
+	wire			L6qfh7;
+	wire			C7qfh7;
+	wire			T7qfh7;
+	wire			K8qfh7;
+	wire			B9qfh7;
+	wire			S9qfh7;
+	wire			Jaqfh7;
+	wire			Abqfh7;
+	wire			Rbqfh7;
+	wire			Icqfh7;
+	wire			Zcqfh7;
+	wire			Qdqfh7;
+	wire			Heqfh7;
+	wire			Yeqfh7;
+	wire			Pfqfh7;
+	wire			Ggqfh7;
+	wire			Xgqfh7;
+	wire			Ohqfh7;
+	wire			Fiqfh7;
+	wire			Wiqfh7;
+	wire			Njqfh7;
+	wire			Ekqfh7;
+	wire			Vkqfh7;
+	wire			Mlqfh7;
+	wire			Dmqfh7;
+	wire			Umqfh7;
+	wire			Lnqfh7;
+	wire			Coqfh7;
+	wire			Toqfh7;
+	wire			Kpqfh7;
+	wire			Bqqfh7;
+	wire			Sqqfh7;
+	wire			Jrqfh7;
+	wire			Asqfh7;
+	wire			Rsqfh7;
+	wire			Itqfh7;
+	wire			Ztqfh7;
+	wire			Quqfh7;
+	wire			Hvqfh7;
+	wire			Yvqfh7;
+	wire			Pwqfh7;
+	wire			Gxqfh7;
+	wire			Xxqfh7;
+	wire			Oyqfh7;
+	wire			Fzqfh7;
+	wire			Wzqfh7;
+	wire			N0rfh7;
+	wire			E1rfh7;
+	wire			V1rfh7;
+	wire			M2rfh7;
+	wire			D3rfh7;
+	wire			U3rfh7;
+	wire			L4rfh7;
+	wire			C5rfh7;
+	wire			T5rfh7;
+	wire			K6rfh7;
+	wire			B7rfh7;
+	wire			S7rfh7;
+	wire			J8rfh7;
+	wire			A9rfh7;
+	wire			R9rfh7;
+	wire			Iarfh7;
+	wire			Zarfh7;
+	wire			Qbrfh7;
+	wire			Gcrfh7;
+	wire			Wcrfh7;
+	wire			Mdrfh7;
+	wire			Cerfh7;
+	wire			Serfh7;
+	wire			Ifrfh7;
+	wire			Yfrfh7;
+	wire			Ogrfh7;
+	wire			Ehrfh7;
+	wire			Uhrfh7;
+	wire			Kirfh7;
+	wire			Ajrfh7;
+	wire			Qjrfh7;
+	wire			Gkrfh7;
+	wire			Wkrfh7;
+	wire			Mlrfh7;
+	wire			Cmrfh7;
+	wire			Smrfh7;
+	wire			Inrfh7;
+	wire			Ynrfh7;
+	wire			Oorfh7;
+	wire			Eprfh7;
+	wire			Uprfh7;
+	wire			Kqrfh7;
+	wire			Arrfh7;
+	wire			Qrrfh7;
+	wire			Gsrfh7;
+	wire			Wsrfh7;
+	wire			Mtrfh7;
+	wire			Curfh7;
+	wire			Surfh7;
+	wire			Ivrfh7;
+	wire			Yvrfh7;
+	wire			Wwrfh7;
+	wire			Bxrfh7;
+	wire			Gxrfh7;
+	wire			Lxrfh7;
+	wire			Qxrfh7;
+	wire			Vxrfh7;
+	wire			Ayrfh7;
+	wire			Fyrfh7;
+	wire			Kyrfh7;
+	wire			Pyrfh7;
+	wire			Uyrfh7;
+	wire			Zyrfh7;
+	wire			Ezrfh7;
+	wire			Jzrfh7;
+	wire			Ozrfh7;
+	wire			Tzrfh7;
+	wire			Yzrfh7;
+	wire			D0sfh7;
+	wire			I0sfh7;
+	wire			N0sfh7;
+	wire			S0sfh7;
+	wire			X0sfh7;
+	wire			C1sfh7;
+	wire			H1sfh7;
+	wire			M1sfh7;
+	wire			R1sfh7;
+	wire			W1sfh7;
+	wire			B2sfh7;
+	wire			G2sfh7;
+	wire			L2sfh7;
+	wire			Q2sfh7;
+	wire			V2sfh7;
+	wire			A3sfh7;
+	wire			F3sfh7;
+	wire			K3sfh7;
+	wire			P3sfh7;
+	wire			U3sfh7;
+	wire			Z3sfh7;
+	wire			E4sfh7;
+	wire			J4sfh7;
+	wire			O4sfh7;
+	wire			T4sfh7;
+	wire			Y4sfh7;
+	wire			D5sfh7;
+	wire			I5sfh7;
+	wire			N5sfh7;
+	wire			S5sfh7;
+	wire			X5sfh7;
+	wire			C6sfh7;
+	wire			H6sfh7;
+	wire			M6sfh7;
+	wire			R6sfh7;
+	wire			W6sfh7;
+	wire			B7sfh7;
+	wire			G7sfh7;
+	wire			L7sfh7;
+	wire			Q7sfh7;
+	wire			V7sfh7;
+	wire			A8sfh7;
+	wire			F8sfh7;
+	wire			K8sfh7;
+	wire			P8sfh7;
+	wire			U8sfh7;
+	wire			Z8sfh7;
+	wire			E9sfh7;
+	wire			J9sfh7;
+	wire			O9sfh7;
+	wire			T9sfh7;
+	wire			Y9sfh7;
+	wire			Dasfh7;
+	wire			Iasfh7;
+	wire			Nasfh7;
+	wire			Sasfh7;
+	wire			Xasfh7;
+	wire			Cbsfh7;
+	wire			Hbsfh7;
+	wire			Mbsfh7;
+	wire			Rbsfh7;
+	wire			Wbsfh7;
+	wire			Bcsfh7;
+	wire			Gcsfh7;
+	wire			Lcsfh7;
+	wire			Qcsfh7;
+	wire			Vcsfh7;
+	wire			Adsfh7;
+	wire			Fdsfh7;
+	wire			Kdsfh7;
+	wire			Pdsfh7;
+	wire			Udsfh7;
+	wire			Zdsfh7;
+	wire			Eesfh7;
+	wire			Jesfh7;
+	wire			Oesfh7;
+	wire			Tesfh7;
+	wire			Yesfh7;
+	wire			Dfsfh7;
+	wire			Ifsfh7;
+	wire			Nfsfh7;
+	wire			Sfsfh7;
+	wire			Xfsfh7;
+	wire			Cgsfh7;
+	wire			Hgsfh7;
+	wire			Mgsfh7;
+	wire			Rgsfh7;
+	wire			Wgsfh7;
+	wire			Bhsfh7;
+	wire			Ghsfh7;
+	wire			Lhsfh7;
+	wire			Qhsfh7;
+	wire			Vhsfh7;
+	wire			Aisfh7;
+	wire			Fisfh7;
+	wire			Kisfh7;
+	wire			Pisfh7;
+	wire			Uisfh7;
+	wire			Zisfh7;
+	wire			Ejsfh7;
+	wire			Jjsfh7;
+	wire			Ojsfh7;
+	wire			Tjsfh7;
+	wire			Yjsfh7;
+	wire			Dksfh7;
+	wire			Iksfh7;
+	wire			Oksfh7;
+	wire			Uksfh7;
+	wire			Alsfh7;
+	wire			Glsfh7;
+	wire			Mlsfh7;
+	wire			Slsfh7;
+	wire			Ylsfh7;
+	wire			Emsfh7;
+	wire			Kmsfh7;
+	wire			Qmsfh7;
+	wire			Wmsfh7;
+	wire			Cnsfh7;
+	wire			Insfh7;
+	wire			Onsfh7;
+	wire			Unsfh7;
+	wire			Aosfh7;
+	wire			Gosfh7;
+	wire			Mosfh7;
+	wire			Sosfh7;
+	wire			Yosfh7;
+	wire			Epsfh7;
+	wire			Kpsfh7;
+	wire			Qpsfh7;
+	wire			Wpsfh7;
+	wire			Cqsfh7;
+	wire			Iqsfh7;
+	wire			Oqsfh7;
+	wire			Uqsfh7;
+	wire			Arsfh7;
+	wire			Grsfh7;
+	wire			Mrsfh7;
+	wire			Srsfh7;
+	wire			Yrsfh7;
+	wire			Essfh7;
+	wire			Kssfh7;
+	wire			Qssfh7;
+	wire			Wssfh7;
+	wire			Ctsfh7;
+	wire			Itsfh7;
+	wire			Otsfh7;
+	wire			Utsfh7;
+	wire			Ausfh7;
+	wire			Gusfh7;
+	wire			Musfh7;
+	wire			Susfh7;
+	wire			Yusfh7;
+	wire			Evsfh7;
+	wire			Kvsfh7;
+	wire			Qvsfh7;
+	wire			Wvsfh7;
+	wire			Cwsfh7;
+	wire			Iwsfh7;
+	wire			Owsfh7;
+	wire			Uwsfh7;
+	wire			Axsfh7;
+	wire			Gxsfh7;
+	wire			Mxsfh7;
+	wire			Sxsfh7;
+	wire			Yxsfh7;
+	wire			Eysfh7;
+	wire			Kysfh7;
+	wire			Qysfh7;
+	wire			Wysfh7;
+	wire			Czsfh7;
+	wire			Izsfh7;
+	wire			Ozsfh7;
+	wire			Uzsfh7;
+	wire			A0tfh7;
+	wire			G0tfh7;
+	wire			M0tfh7;
+	wire			S0tfh7;
+	wire			Y0tfh7;
+	wire			E1tfh7;
+	wire			K1tfh7;
+	wire			Q1tfh7;
+	wire			W1tfh7;
+	wire			C2tfh7;
+	wire			I2tfh7;
+	wire			O2tfh7;
+	wire			U2tfh7;
+	wire			A3tfh7;
+	wire			G3tfh7;
+	wire			M3tfh7;
+	wire			S3tfh7;
+	wire			Y3tfh7;
+	wire			E4tfh7;
+	wire			K4tfh7;
+	wire			Q4tfh7;
+	wire			W4tfh7;
+	wire			C5tfh7;
+	wire			I5tfh7;
+	wire			O5tfh7;
+	wire			U5tfh7;
+	wire			A6tfh7;
+	wire			G6tfh7;
+	wire			M6tfh7;
+	wire			S6tfh7;
+	wire			Y6tfh7;
+	wire			E7tfh7;
+	wire			K7tfh7;
+	wire			Q7tfh7;
+	wire			W7tfh7;
+	wire			C8tfh7;
+	wire			I8tfh7;
+	wire			O8tfh7;
+	wire			U8tfh7;
+	wire			A9tfh7;
+	wire			G9tfh7;
+	wire			M9tfh7;
+	wire			S9tfh7;
+	wire			Y9tfh7;
+	wire			Eatfh7;
+	wire			Katfh7;
+	wire			Qatfh7;
+	wire			Watfh7;
+	wire			Cbtfh7;
+	wire			Ibtfh7;
+	wire			Obtfh7;
+	wire			Ubtfh7;
+	wire			Actfh7;
+	wire			Gctfh7;
+	wire			Mctfh7;
+	wire			Sctfh7;
+	wire			Yctfh7;
+	wire			Edtfh7;
+	wire			Kdtfh7;
+	wire			Qdtfh7;
+	wire			Wdtfh7;
+	wire			Cetfh7;
+	wire			Ietfh7;
+	wire			Oetfh7;
+	wire			Uetfh7;
+	wire			Aftfh7;
+	wire			Gftfh7;
+	wire			Mftfh7;
+	wire			Sftfh7;
+	wire			Yftfh7;
+	wire			Egtfh7;
+	wire			Kgtfh7;
+	wire			Qgtfh7;
+	wire			Wgtfh7;
+	wire			Chtfh7;
+	wire			Ihtfh7;
+	wire			Ohtfh7;
+	wire			Uhtfh7;
+	wire			Aitfh7;
+	wire			Gitfh7;
+	wire			Mitfh7;
+	wire			Sitfh7;
+	wire			Yitfh7;
+	wire			Ejtfh7;
+	wire			Kjtfh7;
+	wire			Qjtfh7;
+	wire			Wjtfh7;
+	wire			Cktfh7;
+	wire			Iktfh7;
+	wire			Oktfh7;
+	wire			Uktfh7;
+	wire			Altfh7;
+	wire			Gltfh7;
+	wire			Mltfh7;
+	wire			Sltfh7;
+	wire			Yltfh7;
+	wire			Emtfh7;
+	wire			Kmtfh7;
+	wire			Qmtfh7;
+	wire			Wmtfh7;
+	wire			Cntfh7;
+	wire			Intfh7;
+	wire			Ontfh7;
+	wire			Untfh7;
+	wire			Aotfh7;
+	wire			Gotfh7;
+	wire			Motfh7;
+	wire			Sotfh7;
+	wire			Yotfh7;
+	wire			Eptfh7;
+	wire			Kptfh7;
+	wire			Qptfh7;
+	wire			Wptfh7;
+	wire			Cqtfh7;
+	wire			Iqtfh7;
+	wire			Oqtfh7;
+	wire			Uqtfh7;
+	wire			Artfh7;
+	wire			Grtfh7;
+	wire			Mrtfh7;
+	wire			Srtfh7;
+	wire			Yrtfh7;
+	wire			Estfh7;
+	wire			Kstfh7;
+	wire			Qstfh7;
+	wire			Wstfh7;
+	wire			Cttfh7;
+	wire			Ittfh7;
+	wire			Ottfh7;
+	wire			Uttfh7;
+	wire			Autfh7;
+	wire			Gutfh7;
+	wire			Mutfh7;
+	wire			Sutfh7;
+	wire			Yutfh7;
+	wire			Evtfh7;
+	wire			Kvtfh7;
+	wire			Qvtfh7;
+	wire			Wvtfh7;
+	wire			Cwtfh7;
+	wire			Iwtfh7;
+	wire			Owtfh7;
+	wire			Uwtfh7;
+	wire			Axtfh7;
+	wire			Gxtfh7;
+	wire			Mxtfh7;
+	wire			Sxtfh7;
+	wire			Yxtfh7;
+	wire			Eytfh7;
+	wire			Kytfh7;
+	wire			Qytfh7;
+	wire			Wytfh7;
+	wire			Cztfh7;
+	wire			Iztfh7;
+	wire			Oztfh7;
+	wire			Uztfh7;
+	wire			A0ufh7;
+	wire			G0ufh7;
+	wire			M0ufh7;
+	wire			S0ufh7;
+	wire			Y0ufh7;
+	wire			E1ufh7;
+	wire			K1ufh7;
+	wire			Q1ufh7;
+	wire			W1ufh7;
+	wire			C2ufh7;
+	wire			I2ufh7;
+	wire			O2ufh7;
+	wire			U2ufh7;
+	wire			A3ufh7;
+	wire			G3ufh7;
+	wire			M3ufh7;
+	wire			S3ufh7;
+	wire			Y3ufh7;
+	wire			E4ufh7;
+	wire			K4ufh7;
+	wire			Q4ufh7;
+	wire			W4ufh7;
+	wire			C5ufh7;
+	wire			I5ufh7;
+	wire			O5ufh7;
+	wire			U5ufh7;
+	wire			A6ufh7;
+	wire			G6ufh7;
+	wire			M6ufh7;
+	wire			S6ufh7;
+	wire			Y6ufh7;
+	wire			E7ufh7;
+	wire			K7ufh7;
+	wire			Q7ufh7;
+	wire			W7ufh7;
+	wire			C8ufh7;
+	wire			I8ufh7;
+	wire			O8ufh7;
+	wire			U8ufh7;
+	wire			A9ufh7;
+	wire			G9ufh7;
+	wire			M9ufh7;
+	wire			S9ufh7;
+	wire			Y9ufh7;
+	wire			Eaufh7;
+	wire			Kaufh7;
+	wire			Qaufh7;
+	wire			Waufh7;
+	wire			Cbufh7;
+	wire			Ibufh7;
+	wire			Obufh7;
+	wire			Ubufh7;
+	wire			Acufh7;
+	wire			Gcufh7;
+	wire			Mcufh7;
+	wire			Scufh7;
+	wire			Ycufh7;
+	wire			Edufh7;
+	wire			Kdufh7;
+	wire			Qdufh7;
+	wire			Wdufh7;
+	wire			Ceufh7;
+	wire			Ieufh7;
+	wire			Oeufh7;
+	wire			Ueufh7;
+	wire			Afufh7;
+	wire			Gfufh7;
+	wire			Mfufh7;
+	wire			Sfufh7;
+	wire			Yfufh7;
+	wire			Egufh7;
+	wire			Kgufh7;
+	wire			Qgufh7;
+	wire			Wgufh7;
+	wire			Chufh7;
+	wire			Ihufh7;
+	wire			Ohufh7;
+	wire			Uhufh7;
+	wire			Aiufh7;
+	wire			Giufh7;
+	wire			Miufh7;
+	wire			Siufh7;
+	wire			Yiufh7;
+	wire			Ejufh7;
+	wire			Kjufh7;
+	wire			Qjufh7;
+	wire			Wjufh7;
+	wire			Ckufh7;
+	wire			Ikufh7;
+	wire			Okufh7;
+	wire			Ukufh7;
+	wire			Alufh7;
+	wire			Glufh7;
+	wire			Mlufh7;
+	wire			Slufh7;
+	wire			Ylufh7;
+	wire			Emufh7;
+	wire			Kmufh7;
+	wire			Qmufh7;
+	wire			Wmufh7;
+	wire			Cnufh7;
+	wire			Inufh7;
+	wire			Onufh7;
+	wire			Unufh7;
+	wire			Aoufh7;
+	wire			Goufh7;
+	wire			Moufh7;
+	wire			Soufh7;
+	wire			Youfh7;
+	wire			Epufh7;
+	wire			Kpufh7;
+	wire			Qpufh7;
+	wire			Wpufh7;
+	wire			Cqufh7;
+	wire			Iqufh7;
+	wire			Oqufh7;
+	wire			Uqufh7;
+	wire			Arufh7;
+	wire			Grufh7;
+	wire			Mrufh7;
+	wire			Srufh7;
+	wire			Yrufh7;
+	wire			Esufh7;
+	wire			Ksufh7;
+	wire			Qsufh7;
+	wire			Wsufh7;
+	wire			Ctufh7;
+	wire			Itufh7;
+	wire			Otufh7;
+	wire			Utufh7;
+	wire			Auufh7;
+	wire			Guufh7;
+	wire			Muufh7;
+	wire			Suufh7;
+	wire			Yuufh7;
+	wire			Evufh7;
+	wire			Kvufh7;
+	wire			Qvufh7;
+	wire			Wvufh7;
+	wire			Cwufh7;
+	wire			Iwufh7;
+	wire			Owufh7;
+	wire			Uwufh7;
+	wire			Axufh7;
+	wire			Gxufh7;
+	wire			Mxufh7;
+	wire			Sxufh7;
+	wire			Yxufh7;
+	wire			Eyufh7;
+	wire			Kyufh7;
+	wire			Qyufh7;
+	wire			Wyufh7;
+	wire			Czufh7;
+	wire			Izufh7;
+	wire			Ozufh7;
+	wire			Uzufh7;
+	wire			A0vfh7;
+	wire			G0vfh7;
+	wire			M0vfh7;
+	wire			S0vfh7;
+	wire			Y0vfh7;
+	wire			E1vfh7;
+	wire			K1vfh7;
+	wire			Q1vfh7;
+	wire			W1vfh7;
+	wire			C2vfh7;
+	wire			I2vfh7;
+	wire			O2vfh7;
+	wire			U2vfh7;
+	wire			A3vfh7;
+	wire			G3vfh7;
+	wire			M3vfh7;
+	wire			S3vfh7;
+	wire			Y3vfh7;
+	wire			E4vfh7;
+	wire			K4vfh7;
+	wire			Q4vfh7;
+	wire			W4vfh7;
+	wire			C5vfh7;
+	wire			I5vfh7;
+	wire			O5vfh7;
+	wire			U5vfh7;
+	wire			A6vfh7;
+	wire			G6vfh7;
+	wire			M6vfh7;
+	wire			S6vfh7;
+	wire			Y6vfh7;
+	wire			E7vfh7;
+	wire			K7vfh7;
+	wire			Q7vfh7;
+	wire			W7vfh7;
+	wire			C8vfh7;
+	wire			I8vfh7;
+	wire			O8vfh7;
+	wire			U8vfh7;
+	wire			A9vfh7;
+	wire			G9vfh7;
+	wire			M9vfh7;
+	wire			S9vfh7;
+	wire			Y9vfh7;
+	wire			Eavfh7;
+	wire			Kavfh7;
+	wire			Qavfh7;
+	wire			Wavfh7;
+	wire			Cbvfh7;
+	wire			Ibvfh7;
+	wire			Obvfh7;
+	wire			Ubvfh7;
+	wire			Acvfh7;
+	wire			Gcvfh7;
+	wire			Mcvfh7;
+	wire			Scvfh7;
+	wire			Ycvfh7;
+	wire			Edvfh7;
+	wire			Kdvfh7;
+	wire			Qdvfh7;
+	wire			Wdvfh7;
+	wire			Cevfh7;
+	wire			Ievfh7;
+	wire			Oevfh7;
+	wire			Uevfh7;
+	wire			Afvfh7;
+	wire			Gfvfh7;
+	wire			Mfvfh7;
+	wire			Sfvfh7;
+	wire			Yfvfh7;
+	wire			Egvfh7;
+	wire			Kgvfh7;
+	wire			Qgvfh7;
+	wire			Wgvfh7;
+	wire			Chvfh7;
+	wire			Ihvfh7;
+	wire			Ohvfh7;
+	wire			Uhvfh7;
+	wire			Aivfh7;
+	wire			Givfh7;
+	wire			Mivfh7;
+	wire			Sivfh7;
+	wire			Yivfh7;
+	wire			Ejvfh7;
+	wire			Kjvfh7;
+	wire			Qjvfh7;
+	wire			Wjvfh7;
+	wire			Ckvfh7;
+	wire			Ikvfh7;
+	wire			Okvfh7;
+	wire			Ukvfh7;
+	wire			Alvfh7;
+	wire			Glvfh7;
+	wire			Mlvfh7;
+	wire			Slvfh7;
+	wire			Ylvfh7;
+	wire			Emvfh7;
+	wire			Kmvfh7;
+	wire			Qmvfh7;
+	wire			Wmvfh7;
+	wire			Cnvfh7;
+	wire			Invfh7;
+	wire			Onvfh7;
+	wire			Unvfh7;
+	wire			Aovfh7;
+	wire			Govfh7;
+	wire			Movfh7;
+	wire			Sovfh7;
+	wire			Yovfh7;
+	wire			Epvfh7;
+	wire			Kpvfh7;
+	wire			Qpvfh7;
+	wire			Wpvfh7;
+	wire			Cqvfh7;
+	wire			Iqvfh7;
+	wire			Oqvfh7;
+	wire			Uqvfh7;
+	wire			Arvfh7;
+	wire			Grvfh7;
+	wire			Mrvfh7;
+	wire			Srvfh7;
+	wire			Yrvfh7;
+	wire			Esvfh7;
+	wire			Ksvfh7;
+	wire			Qsvfh7;
+	wire			Wsvfh7;
+	wire			Ctvfh7;
+	wire			Itvfh7;
+	wire			Otvfh7;
+	wire			Utvfh7;
+	wire			Auvfh7;
+	wire			Guvfh7;
+	wire			Muvfh7;
+	wire			Suvfh7;
+	wire			Yuvfh7;
+	wire			Evvfh7;
+	wire			Kvvfh7;
+	wire			Qvvfh7;
+	wire			Wvvfh7;
+	wire			Cwvfh7;
+	wire			Iwvfh7;
+	wire			Owvfh7;
+	wire			Uwvfh7;
+	wire			Axvfh7;
+	wire			Gxvfh7;
+	wire			Mxvfh7;
+	wire			Sxvfh7;
+	wire			Yxvfh7;
+	wire			Eyvfh7;
+	wire			Kyvfh7;
+	wire			Qyvfh7;
+	wire			Wyvfh7;
+	wire			Czvfh7;
+	wire			Izvfh7;
+	wire			Ozvfh7;
+	wire			Uzvfh7;
+	wire			A0wfh7;
+	wire			G0wfh7;
+	wire			M0wfh7;
+	wire			S0wfh7;
+	wire			Y0wfh7;
+	wire			E1wfh7;
+	wire			K1wfh7;
+	wire			Q1wfh7;
+	wire			W1wfh7;
+	wire			C2wfh7;
+	wire			I2wfh7;
+	wire			O2wfh7;
+	wire			U2wfh7;
+	wire			A3wfh7;
+	wire			G3wfh7;
+	wire			M3wfh7;
+	wire			S3wfh7;
+	wire			Y3wfh7;
+	wire			E4wfh7;
+	wire			K4wfh7;
+	wire			Q4wfh7;
+	wire			W4wfh7;
+	wire			C5wfh7;
+	wire			I5wfh7;
+	wire			O5wfh7;
+	wire			U5wfh7;
+	wire			A6wfh7;
+	wire			G6wfh7;
+	wire			M6wfh7;
+	wire			S6wfh7;
+	wire			Y6wfh7;
+	wire			E7wfh7;
+	wire			K7wfh7;
+	wire			Q7wfh7;
+	wire			W7wfh7;
+	wire			C8wfh7;
+	wire			I8wfh7;
+	wire			O8wfh7;
+	wire			U8wfh7;
+	wire			A9wfh7;
+	wire			G9wfh7;
+	wire			M9wfh7;
+	wire			S9wfh7;
+	wire			Y9wfh7;
+	wire			Eawfh7;
+	wire			Kawfh7;
+	wire			Qawfh7;
+	wire			Wawfh7;
+	wire			Cbwfh7;
+	wire			Ibwfh7;
+	wire			Obwfh7;
+	wire			Ubwfh7;
+	wire			Acwfh7;
+	wire			Gcwfh7;
+	wire			Mcwfh7;
+	wire			Scwfh7;
+	wire			Ycwfh7;
+	wire			Edwfh7;
+	wire			Kdwfh7;
+	wire			Qdwfh7;
+	wire			Wdwfh7;
+	wire			Cewfh7;
+	wire			Iewfh7;
+	wire			Oewfh7;
+	wire			Uewfh7;
+	wire			Afwfh7;
+	wire			Gfwfh7;
+	wire			Mfwfh7;
+	wire			Sfwfh7;
+	wire			Yfwfh7;
+	wire			Egwfh7;
+	wire			Kgwfh7;
+	wire			Qgwfh7;
+	wire			Wgwfh7;
+	wire			Chwfh7;
+	wire			Ihwfh7;
+	wire			Ohwfh7;
+	wire			Uhwfh7;
+	wire			Aiwfh7;
+	wire			Giwfh7;
+	wire			Miwfh7;
+	wire			Siwfh7;
+	wire			Yiwfh7;
+	wire			Ejwfh7;
+	wire			Kjwfh7;
+	wire			Qjwfh7;
+	wire			Wjwfh7;
+	wire			Ckwfh7;
+	wire			Ikwfh7;
+	wire			Okwfh7;
+	wire			Ukwfh7;
+	wire			Alwfh7;
+	wire			Glwfh7;
+	wire			Mlwfh7;
+	wire			Slwfh7;
+	wire			Ylwfh7;
+	wire			Emwfh7;
+	wire			Kmwfh7;
+	wire			Qmwfh7;
+	wire			Wmwfh7;
+	wire			Cnwfh7;
+	wire			Inwfh7;
+	wire			Onwfh7;
+	wire			Unwfh7;
+	wire			Aowfh7;
+	wire			Gowfh7;
+	wire			Mowfh7;
+	wire			Sowfh7;
+	wire			Yowfh7;
+	wire			Epwfh7;
+	wire			Kpwfh7;
+	wire			Qpwfh7;
+	wire			Wpwfh7;
+	wire			Cqwfh7;
+	wire			Iqwfh7;
+	wire			Oqwfh7;
+	wire			Uqwfh7;
+	wire			Arwfh7;
+	wire			Grwfh7;
+	wire			Mrwfh7;
+	wire			Srwfh7;
+	wire			Yrwfh7;
+	wire			Eswfh7;
+	wire			Kswfh7;
+	wire			Qswfh7;
+	wire			Wswfh7;
+	wire			Ctwfh7;
+	wire			Itwfh7;
+	wire			Otwfh7;
+	wire			Utwfh7;
+	wire			Auwfh7;
+	wire			Guwfh7;
+	wire			Muwfh7;
+	wire			Suwfh7;
+	wire			Yuwfh7;
+	wire			Evwfh7;
+	wire			Kvwfh7;
+	wire			Qvwfh7;
+	wire			Wvwfh7;
+	wire			Cwwfh7;
+	wire			Iwwfh7;
+	wire			Owwfh7;
+	wire			Uwwfh7;
+	wire			Axwfh7;
+	wire			Gxwfh7;
+	wire			Mxwfh7;
+	wire			Sxwfh7;
+	wire			Yxwfh7;
+	wire			Eywfh7;
+	wire			Kywfh7;
+	wire			Qywfh7;
+	wire			Wywfh7;
+	wire			Czwfh7;
+	wire			Izwfh7;
+	wire			Ozwfh7;
+	wire			Uzwfh7;
+	wire			A0xfh7;
+	wire			G0xfh7;
+	wire			M0xfh7;
+	wire			S0xfh7;
+	wire			Y0xfh7;
+	wire			E1xfh7;
+	wire			K1xfh7;
+	wire			Q1xfh7;
+	wire			W1xfh7;
+	wire			C2xfh7;
+	wire			I2xfh7;
+	wire			O2xfh7;
+	wire			U2xfh7;
+	wire			A3xfh7;
+	wire			G3xfh7;
+	wire			M3xfh7;
+	wire			S3xfh7;
+	wire			Y3xfh7;
+	wire			E4xfh7;
+	wire			K4xfh7;
+	wire			Q4xfh7;
+	wire			W4xfh7;
+	wire			C5xfh7;
+	wire			I5xfh7;
+	wire			O5xfh7;
+	wire			U5xfh7;
+	wire			A6xfh7;
+	wire			G6xfh7;
+	wire			M6xfh7;
+	wire			S6xfh7;
+	wire			Y6xfh7;
+	wire			E7xfh7;
+	wire			K7xfh7;
+	wire			Q7xfh7;
+	wire			W7xfh7;
+	wire			C8xfh7;
+	wire			I8xfh7;
+	wire			O8xfh7;
+	wire			U8xfh7;
+	wire			A9xfh7;
+	wire			G9xfh7;
+	wire			M9xfh7;
+	wire			S9xfh7;
+	wire			Y9xfh7;
+	wire			Eaxfh7;
+	wire			Kaxfh7;
+	wire			Qaxfh7;
+	wire			Waxfh7;
+	wire			Cbxfh7;
+	wire			Ibxfh7;
+	wire			Obxfh7;
+	wire			Ubxfh7;
+	wire			Acxfh7;
+	wire			Gcxfh7;
+	wire			Mcxfh7;
+	wire			Scxfh7;
+	wire			Ycxfh7;
+	wire			Edxfh7;
+	wire			Kdxfh7;
+	wire			Qdxfh7;
+	wire			Wdxfh7;
+	wire			Cexfh7;
+	wire			Iexfh7;
+	wire			Oexfh7;
+	wire			Uexfh7;
+	wire			Afxfh7;
+	wire			Gfxfh7;
+	wire			Mfxfh7;
+	wire			Sfxfh7;
+	wire			Yfxfh7;
+	wire			Egxfh7;
+	wire			Kgxfh7;
+	wire			Qgxfh7;
+	wire			Wgxfh7;
+	wire			Chxfh7;
+	wire			Ihxfh7;
+	wire			Ohxfh7;
+	wire			Uhxfh7;
+	wire			Aixfh7;
+	wire			Gixfh7;
+	wire			Mixfh7;
+	wire			Sixfh7;
+	wire			Yixfh7;
+	wire			Ejxfh7;
+	wire			Kjxfh7;
+	wire			Qjxfh7;
+	wire			Wjxfh7;
+	wire			Ckxfh7;
+	wire			Ikxfh7;
+	wire			Okxfh7;
+	wire			Ukxfh7;
+	wire			Alxfh7;
+	wire			Glxfh7;
+	wire			Mlxfh7;
+	wire			Slxfh7;
+	wire			Ylxfh7;
+	wire			Emxfh7;
+	wire			Kmxfh7;
+	wire			Qmxfh7;
+	wire			Wmxfh7;
+	wire			Cnxfh7;
+	wire			Inxfh7;
+	wire			Onxfh7;
+	wire			Unxfh7;
+	wire			Aoxfh7;
+	wire			Goxfh7;
+	wire			Moxfh7;
+	wire			Soxfh7;
+	wire			Yoxfh7;
+	wire			Epxfh7;
+	wire			Kpxfh7;
+	wire			Qpxfh7;
+	wire			Wpxfh7;
+	wire			Cqxfh7;
+	wire			Iqxfh7;
+	wire			Oqxfh7;
+	wire			Uqxfh7;
+	wire			Arxfh7;
+	wire			Grxfh7;
+	wire			Mrxfh7;
+	wire			Srxfh7;
+	wire			Yrxfh7;
+	wire			Esxfh7;
+	wire			Ksxfh7;
+	wire			Qsxfh7;
+	wire			Wsxfh7;
+	wire			Ctxfh7;
+	wire			Itxfh7;
+	wire			Otxfh7;
+	wire			Utxfh7;
+	wire			Auxfh7;
+	wire			Guxfh7;
+	wire			Muxfh7;
+	wire			Suxfh7;
+	wire			Yuxfh7;
+	wire			Evxfh7;
+	wire			Kvxfh7;
+	wire			Qvxfh7;
+	wire			Wvxfh7;
+	wire			Cwxfh7;
+	wire			Iwxfh7;
+	wire			Owxfh7;
+	wire			Uwxfh7;
+	wire			Axxfh7;
+	wire			Gxxfh7;
+	wire			Mxxfh7;
+	wire			Sxxfh7;
+	wire			Yxxfh7;
+	wire			Eyxfh7;
+	wire			Kyxfh7;
+	wire			Qyxfh7;
+	wire			Wyxfh7;
+	wire			Czxfh7;
+	wire			Izxfh7;
+	wire			Ozxfh7;
+	wire			Uzxfh7;
+	wire			A0yfh7;
+	wire			G0yfh7;
+	wire			M0yfh7;
+	wire			S0yfh7;
+	wire			Y0yfh7;
+	wire			E1yfh7;
+	wire			K1yfh7;
+	wire			Q1yfh7;
+	wire			W1yfh7;
+	wire			C2yfh7;
+	wire			I2yfh7;
+	wire			O2yfh7;
+	wire			U2yfh7;
+	wire			A3yfh7;
+	wire			G3yfh7;
+	wire			M3yfh7;
+	wire			S3yfh7;
+	wire			Y3yfh7;
+	wire			E4yfh7;
+	wire			K4yfh7;
+	wire			Q4yfh7;
+	wire			W4yfh7;
+	wire			C5yfh7;
+	wire			I5yfh7;
+	wire			O5yfh7;
+	wire			U5yfh7;
+	wire			A6yfh7;
+	wire			G6yfh7;
+	wire			M6yfh7;
+	wire			S6yfh7;
+	wire			Y6yfh7;
+	wire			E7yfh7;
+	wire			K7yfh7;
+	wire			Q7yfh7;
+	wire			W7yfh7;
+	wire			C8yfh7;
+	wire			I8yfh7;
+	wire			O8yfh7;
+	wire			U8yfh7;
+	wire			A9yfh7;
+	wire			G9yfh7;
+	wire			M9yfh7;
+	wire			S9yfh7;
+	wire			Y9yfh7;
+	wire			Eayfh7;
+	wire			Kayfh7;
+	wire			Qayfh7;
+	wire			Wayfh7;
+	wire			Cbyfh7;
+	wire			Ibyfh7;
+	wire			Obyfh7;
+	wire			Ubyfh7;
+	wire			Acyfh7;
+	wire			Gcyfh7;
+	wire			Mcyfh7;
+	wire			Scyfh7;
+	wire			Ycyfh7;
+	wire			Edyfh7;
+	wire			Kdyfh7;
+	wire			Qdyfh7;
+	wire			Wdyfh7;
+	wire			Ceyfh7;
+	wire			Ieyfh7;
+	wire			Oeyfh7;
+	wire			Ueyfh7;
+	wire			Afyfh7;
+	wire			Gfyfh7;
+	wire			Mfyfh7;
+	wire			Sfyfh7;
+	wire			Yfyfh7;
+	wire			Egyfh7;
+	wire			Kgyfh7;
+	wire			Qgyfh7;
+	wire			Wgyfh7;
+	wire			Chyfh7;
+	wire			Ihyfh7;
+	wire			Ohyfh7;
+	wire			Uhyfh7;
+	wire			Aiyfh7;
+	wire			Giyfh7;
+	wire			Miyfh7;
+	wire			Siyfh7;
+	wire			Yiyfh7;
+	wire			Ejyfh7;
+	wire			Kjyfh7;
+	wire			Qjyfh7;
+	wire			Wjyfh7;
+	wire			Ckyfh7;
+	wire			Ikyfh7;
+	wire			Okyfh7;
+	wire			Ukyfh7;
+	wire			Alyfh7;
+	wire			Glyfh7;
+	wire			Mlyfh7;
+	wire			Slyfh7;
+	wire			Ylyfh7;
+	wire			Emyfh7;
+	wire			Kmyfh7;
+	wire			Qmyfh7;
+	wire			Wmyfh7;
+	wire			Cnyfh7;
+	wire			Inyfh7;
+	wire			Onyfh7;
+	wire			Unyfh7;
+	wire			Aoyfh7;
+	wire			Goyfh7;
+	wire			Moyfh7;
+	wire			Soyfh7;
+	wire			Yoyfh7;
+	wire			Epyfh7;
+	wire			Kpyfh7;
+	wire			Qpyfh7;
+	wire			Wpyfh7;
+	wire			Cqyfh7;
+	wire			Iqyfh7;
+	wire			Oqyfh7;
+	wire			Uqyfh7;
+	wire			Aryfh7;
+	wire			Gryfh7;
+	wire			Mryfh7;
+	wire			Sryfh7;
+	wire			Yryfh7;
+	wire			Esyfh7;
+	wire			Ksyfh7;
+	wire			Qsyfh7;
+	wire			Wsyfh7;
+	wire			Ctyfh7;
+	wire			Ityfh7;
+	wire			Otyfh7;
+	wire			Utyfh7;
+	wire			Auyfh7;
+	wire			Guyfh7;
+	wire			Muyfh7;
+	wire			Suyfh7;
+	wire			Yuyfh7;
+	wire			Evyfh7;
+	wire			Kvyfh7;
+	wire			Qvyfh7;
+	wire			Wvyfh7;
+	wire			Cwyfh7;
+	wire			Iwyfh7;
+	wire			Owyfh7;
+	wire			Uwyfh7;
+	wire			Axyfh7;
+	wire			Gxyfh7;
+	wire			Mxyfh7;
+	wire			Sxyfh7;
+	wire			Yxyfh7;
+	wire			Eyyfh7;
+	wire			Kyyfh7;
+	wire			Qyyfh7;
+	wire			Wyyfh7;
+	wire			Czyfh7;
+	wire			Izyfh7;
+	wire			Ozyfh7;
+	wire			Uzyfh7;
+	wire			A0zfh7;
+	wire			G0zfh7;
+	wire			M0zfh7;
+	wire			S0zfh7;
+	wire			Y0zfh7;
+	wire			E1zfh7;
+	wire			K1zfh7;
+	wire			Q1zfh7;
+	wire			W1zfh7;
+	wire			C2zfh7;
+	wire			I2zfh7;
+	wire			O2zfh7;
+	wire			U2zfh7;
+	wire			A3zfh7;
+	wire			G3zfh7;
+	wire			M3zfh7;
+	wire			S3zfh7;
+	wire			Y3zfh7;
+	wire			E4zfh7;
+	wire			K4zfh7;
+	wire			Q4zfh7;
+	wire			W4zfh7;
+	wire			C5zfh7;
+	wire			I5zfh7;
+	wire			O5zfh7;
+	wire			U5zfh7;
+	wire			A6zfh7;
+	wire			G6zfh7;
+	wire			M6zfh7;
+	wire			S6zfh7;
+	wire			Y6zfh7;
+	wire			E7zfh7;
+	wire			K7zfh7;
+	wire			Q7zfh7;
+	wire			W7zfh7;
+	wire			C8zfh7;
+	wire			I8zfh7;
+	wire			O8zfh7;
+	wire			U8zfh7;
+	wire			A9zfh7;
+	wire			G9zfh7;
+	wire			M9zfh7;
+	wire			S9zfh7;
+	wire			Y9zfh7;
+	wire			Eazfh7;
+	wire			Kazfh7;
+	wire			Qazfh7;
+	wire			Wazfh7;
+	wire			Cbzfh7;
+	wire			Ibzfh7;
+	wire			Obzfh7;
+	wire			Ubzfh7;
+	wire			Aczfh7;
+	wire			Gczfh7;
+	wire			Mczfh7;
+	wire			Sczfh7;
+	wire			Yczfh7;
+	wire			Edzfh7;
+	wire			Kdzfh7;
+	wire			Qdzfh7;
+	wire			Wdzfh7;
+	wire			Cezfh7;
+	wire			Iezfh7;
+	wire			Oezfh7;
+	wire			Uezfh7;
+	wire			Afzfh7;
+	wire			Gfzfh7;
+	wire			Mfzfh7;
+	wire			Sfzfh7;
+	wire			Yfzfh7;
+	wire			Egzfh7;
+	wire			Kgzfh7;
+	wire			Qgzfh7;
+	wire			Wgzfh7;
+	wire			Chzfh7;
+	wire			Ihzfh7;
+	wire			Ohzfh7;
+	wire			Uhzfh7;
+	wire			Aizfh7;
+	wire			Gizfh7;
+	wire			Mizfh7;
+	wire			Sizfh7;
+	wire			Yizfh7;
+	wire			Ejzfh7;
+	wire			Kjzfh7;
+	wire			Qjzfh7;
+	wire			Wjzfh7;
+	wire			Ckzfh7;
+	wire			Ikzfh7;
+	wire			Okzfh7;
+	wire			Ukzfh7;
+	wire			Alzfh7;
+	wire			Glzfh7;
+	wire			Mlzfh7;
+	wire			Slzfh7;
+	wire			Ylzfh7;
+	wire			Emzfh7;
+	wire			Kmzfh7;
+	wire			Qmzfh7;
+	wire			Wmzfh7;
+	wire			Cnzfh7;
+	wire			Inzfh7;
+	wire			Onzfh7;
+	wire			Unzfh7;
+	wire			Aozfh7;
+	wire			Gozfh7;
+	wire			Mozfh7;
+	wire			Sozfh7;
+	wire			Yozfh7;
+	wire			Epzfh7;
+	wire			Kpzfh7;
+	wire			Qpzfh7;
+	wire			Wpzfh7;
+	wire			Cqzfh7;
+	wire			Iqzfh7;
+	wire			Oqzfh7;
+	wire			Uqzfh7;
+	wire			Arzfh7;
+	wire			Grzfh7;
+	wire			Mrzfh7;
+	wire			Srzfh7;
+	wire			Yrzfh7;
+	wire			Eszfh7;
+	wire			Kszfh7;
+	wire			Qszfh7;
+	wire			Wszfh7;
+	wire			Ctzfh7;
+	wire			Itzfh7;
+	wire			Otzfh7;
+	wire			Utzfh7;
+	wire			Auzfh7;
+	wire			Guzfh7;
+	wire			Muzfh7;
+	wire			Suzfh7;
+	wire			Yuzfh7;
+	wire			Evzfh7;
+	wire			Kvzfh7;
+	wire			Qvzfh7;
+	wire			Wvzfh7;
+	wire			Cwzfh7;
+	wire			Iwzfh7;
+	wire			Owzfh7;
+	wire			Uwzfh7;
+	wire			Axzfh7;
+	wire			Gxzfh7;
+	wire			Mxzfh7;
+	wire			Sxzfh7;
+	wire			Yxzfh7;
+	wire			Eyzfh7;
+	wire			Kyzfh7;
+	wire			Qyzfh7;
+	wire			Wyzfh7;
+	wire			Czzfh7;
+	wire			Izzfh7;
+	wire			Ozzfh7;
+	wire			Uzzfh7;
+	wire			A00gh7;
+	wire			G00gh7;
+	wire			M00gh7;
+	wire			S00gh7;
+	wire			Y00gh7;
+	wire			E10gh7;
+	wire			K10gh7;
+	wire			Q10gh7;
+	wire			W10gh7;
+	wire			C20gh7;
+	wire			I20gh7;
+	wire			O20gh7;
+	wire			U20gh7;
+	wire			A30gh7;
+	wire			G30gh7;
+	wire			M30gh7;
+	wire			S30gh7;
+	wire			Y30gh7;
+	wire			E40gh7;
+	wire			K40gh7;
+	wire			Q40gh7;
+	wire			W40gh7;
+	wire			C50gh7;
+	wire			I50gh7;
+	wire			O50gh7;
+	wire			U50gh7;
+	wire			A60gh7;
+	wire			G60gh7;
+	wire			M60gh7;
+	wire			S60gh7;
+	wire			Y60gh7;
+	wire			E70gh7;
+	wire			K70gh7;
+	wire			Q70gh7;
+	wire			W70gh7;
+	wire			C80gh7;
+	wire			I80gh7;
+	wire			O80gh7;
+	wire			U80gh7;
+	wire			A90gh7;
+	wire			G90gh7;
+	wire			M90gh7;
+	wire			S90gh7;
+	wire			Y90gh7;
+	wire			Ea0gh7;
+	wire			Ka0gh7;
+	wire			Qa0gh7;
+	wire			Wa0gh7;
+	wire			Cb0gh7;
+	wire			Ib0gh7;
+	wire			Ob0gh7;
+	wire			Ub0gh7;
+	wire			Ac0gh7;
+	wire			Gc0gh7;
+	wire			Mc0gh7;
+	wire			Sc0gh7;
+	wire			Yc0gh7;
+	wire			Ed0gh7;
+	wire			Kd0gh7;
+	wire			Qd0gh7;
+	wire			Wd0gh7;
+	wire			Ce0gh7;
+	wire			Ie0gh7;
+	wire			Oe0gh7;
+	wire			Ue0gh7;
+	wire			Af0gh7;
+	wire			Gf0gh7;
+	wire			Mf0gh7;
+	wire			Sf0gh7;
+	wire			Yf0gh7;
+	wire			Eg0gh7;
+	wire			Kg0gh7;
+	wire			Qg0gh7;
+	wire			Wg0gh7;
+	wire			Ch0gh7;
+	wire			Ih0gh7;
+	wire			Oh0gh7;
+	wire			Uh0gh7;
+	wire			Ai0gh7;
+	wire			Gi0gh7;
+	wire			Mi0gh7;
+	wire			Si0gh7;
+	wire			Yi0gh7;
+	wire			Ej0gh7;
+	wire			Kj0gh7;
+	wire			Qj0gh7;
+	wire			Wj0gh7;
+	wire			Ck0gh7;
+	wire			Ik0gh7;
+	wire			Ok0gh7;
+	wire			Uk0gh7;
+	wire			Al0gh7;
+	wire			Gl0gh7;
+	wire			Ml0gh7;
+	wire			Sl0gh7;
+	wire			Yl0gh7;
+	wire			Em0gh7;
+	wire			Km0gh7;
+	wire			Qm0gh7;
+	wire			Wm0gh7;
+	wire			Cn0gh7;
+	wire			In0gh7;
+	wire			On0gh7;
+	wire			Un0gh7;
+	wire			Ao0gh7;
+	wire			Go0gh7;
+	wire			Mo0gh7;
+	wire			So0gh7;
+	wire			Yo0gh7;
+	wire			Ep0gh7;
+	wire			Kp0gh7;
+	wire			Qp0gh7;
+	wire			Wp0gh7;
+	wire			Cq0gh7;
+	wire			Iq0gh7;
+	wire			Oq0gh7;
+	wire			Uq0gh7;
+	wire			Ar0gh7;
+	wire			Gr0gh7;
+	wire			Mr0gh7;
+	wire			Sr0gh7;
+	wire			Yr0gh7;
+	wire			Es0gh7;
+	wire			Ks0gh7;
+	wire			Qs0gh7;
+	wire			Ws0gh7;
+	wire			Ct0gh7;
+	wire			It0gh7;
+	wire			Ot0gh7;
+	wire			Ut0gh7;
+	wire			Au0gh7;
+	wire			Gu0gh7;
+	wire			Mu0gh7;
+	wire			Su0gh7;
+	wire			Yu0gh7;
+	wire			Ev0gh7;
+	wire			Kv0gh7;
+	wire			Qv0gh7;
+	wire			Wv0gh7;
+	wire			Cw0gh7;
+	wire			Iw0gh7;
+	wire			Ow0gh7;
+	wire			Uw0gh7;
+	wire			Ax0gh7;
+	wire			Gx0gh7;
+	wire			Mx0gh7;
+	wire			Sx0gh7;
+	wire			Yx0gh7;
+	wire			Ey0gh7;
+	wire			Ky0gh7;
+	wire			Qy0gh7;
+	wire			Wy0gh7;
+	wire			Cz0gh7;
+	wire			Iz0gh7;
+	wire			Oz0gh7;
+	wire			Uz0gh7;
+	wire			A01gh7;
+	wire			G01gh7;
+	wire			M01gh7;
+	wire			S01gh7;
+	wire			Y01gh7;
+	wire			E11gh7;
+	wire			K11gh7;
+	wire			Q11gh7;
+	wire			W11gh7;
+	wire			C21gh7;
+	wire			I21gh7;
+	wire			O21gh7;
+	wire			U21gh7;
+	wire			A31gh7;
+	wire			G31gh7;
+	wire			M31gh7;
+	wire			S31gh7;
+	wire			Y31gh7;
+	wire			E41gh7;
+	wire			K41gh7;
+	wire			Q41gh7;
+	wire			W41gh7;
+	wire			C51gh7;
+	wire			I51gh7;
+	wire			O51gh7;
+	wire			U51gh7;
+	wire			A61gh7;
+	wire			G61gh7;
+	wire			M61gh7;
+	wire			S61gh7;
+	wire			Y61gh7;
+	wire			E71gh7;
+	wire			K71gh7;
+	wire			Q71gh7;
+	wire			W71gh7;
+	wire			C81gh7;
+	wire			I81gh7;
+	wire			O81gh7;
+	wire			U81gh7;
+	wire			A91gh7;
+	wire			G91gh7;
+	wire			M91gh7;
+	wire			S91gh7;
+	wire			Y91gh7;
+	wire			Ea1gh7;
+	wire			Ka1gh7;
+	wire			Qa1gh7;
+	wire			Wa1gh7;
+	wire			Cb1gh7;
+	wire			Ib1gh7;
+	wire			Ob1gh7;
+	wire			Ub1gh7;
+	wire			Ac1gh7;
+	wire			Gc1gh7;
+	wire			Mc1gh7;
+	wire			Sc1gh7;
+	wire			Yc1gh7;
+	wire			Ed1gh7;
+	wire			Kd1gh7;
+	wire			Qd1gh7;
+	wire			Wd1gh7;
+	wire			Ce1gh7;
+	wire			Ie1gh7;
+	wire			Oe1gh7;
+	wire			Ue1gh7;
+	wire			Af1gh7;
+	wire			Gf1gh7;
+	wire			Mf1gh7;
+	wire			Sf1gh7;
+	wire			Yf1gh7;
+	wire			Eg1gh7;
+	wire			Kg1gh7;
+	wire			Qg1gh7;
+	wire			Wg1gh7;
+	wire			Ch1gh7;
+	wire			Ih1gh7;
+	wire			Oh1gh7;
+	wire			Uh1gh7;
+	wire			Ai1gh7;
+	wire			Gi1gh7;
+	wire			Mi1gh7;
+	wire			Si1gh7;
+	wire			Yi1gh7;
+	wire			Ej1gh7;
+	wire			Kj1gh7;
+	wire			Qj1gh7;
+	wire			Wj1gh7;
+	wire			Ck1gh7;
+	wire			Ik1gh7;
+	wire			Ok1gh7;
+	wire			Uk1gh7;
+	wire			Al1gh7;
+	wire			Gl1gh7;
+	wire			Ml1gh7;
+	wire			Sl1gh7;
+	wire			Yl1gh7;
+	wire			Em1gh7;
+	wire			Km1gh7;
+	wire			Qm1gh7;
+	wire			Wm1gh7;
+	wire			Cn1gh7;
+	wire			In1gh7;
+	wire			On1gh7;
+	wire			Un1gh7;
+	wire			Ao1gh7;
+	wire			Go1gh7;
+	wire			Mo1gh7;
+	wire			So1gh7;
+	wire			Yo1gh7;
+	wire			Ep1gh7;
+	wire			Kp1gh7;
+	wire			Qp1gh7;
+	wire			Wp1gh7;
+	wire			Cq1gh7;
+	wire			Iq1gh7;
+	wire			Oq1gh7;
+	wire			Uq1gh7;
+	wire			Ar1gh7;
+	wire			Gr1gh7;
+	wire			Mr1gh7;
+	wire			Sr1gh7;
+	wire			Yr1gh7;
+	wire			Es1gh7;
+	wire			Ks1gh7;
+	wire			Qs1gh7;
+	wire			Ws1gh7;
+	wire			Ct1gh7;
+	wire			It1gh7;
+	wire			Ot1gh7;
+	wire			Ut1gh7;
+	wire			Au1gh7;
+	wire			Gu1gh7;
+	wire			Mu1gh7;
+	wire			Su1gh7;
+	wire			Yu1gh7;
+	wire			Ev1gh7;
+	wire			Kv1gh7;
+	wire			Qv1gh7;
+	wire			Wv1gh7;
+	wire			Cw1gh7;
+	wire			Iw1gh7;
+	wire			Ow1gh7;
+	wire			Uw1gh7;
+	wire			Ax1gh7;
+	wire			Gx1gh7;
+	wire			Mx1gh7;
+	wire			Sx1gh7;
+	wire			Yx1gh7;
+	wire			Ey1gh7;
+	wire			Ky1gh7;
+	wire			Qy1gh7;
+	wire			Wy1gh7;
+	wire			Cz1gh7;
+	wire			Iz1gh7;
+	wire			Oz1gh7;
+	wire			Uz1gh7;
+	wire			A02gh7;
+	wire			G02gh7;
+	wire			M02gh7;
+	wire			S02gh7;
+	wire			Y02gh7;
+	wire			E12gh7;
+	wire			K12gh7;
+	wire			Q12gh7;
+	wire			W12gh7;
+	wire			C22gh7;
+	wire			I22gh7;
+	wire			O22gh7;
+	wire			U22gh7;
+	wire			A32gh7;
+	wire			G32gh7;
+	wire			M32gh7;
+	wire			S32gh7;
+	wire			Y32gh7;
+	wire			E42gh7;
+	wire			K42gh7;
+	wire			Q42gh7;
+	wire			W42gh7;
+	wire			C52gh7;
+	wire			I52gh7;
+	wire			O52gh7;
+	wire			U52gh7;
+	wire			A62gh7;
+	wire			G62gh7;
+	wire			M62gh7;
+	wire			S62gh7;
+	wire			Y62gh7;
+	wire			E72gh7;
+	wire			K72gh7;
+	wire			Q72gh7;
+	wire			W72gh7;
+	wire			C82gh7;
+	wire			I82gh7;
+	wire			O82gh7;
+	wire			U82gh7;
+	wire			A92gh7;
+	wire			G92gh7;
+	reg			M92gh7;
+	reg			Ma2gh7;
+	reg			Pb2gh7;
+	reg			Sc2gh7;
+	reg			Ud2gh7;
+	reg			Ue2gh7;
+	reg			Xf2gh7;
+	reg			Xg2gh7;
+	reg			Ai2gh7;
+	reg			Dj2gh7;
+	reg			Fk2gh7;
+	reg			Hl2gh7;
+	reg			Jm2gh7;
+	reg			Ln2gh7;
+	reg			Oo2gh7;
+	reg			Rp2gh7;
+	reg			Rq2gh7;
+	reg			Rr2gh7;
+	reg			Rs2gh7;
+	reg			Rt2gh7;
+	reg			Ru2gh7;
+	reg			Rv2gh7;
+	reg			Rw2gh7;
+	reg			Rx2gh7;
+	reg			Uy2gh7;
+	reg			Xz2gh7;
+	reg			A13gh7;
+	reg			D23gh7;
+	reg			F33gh7;
+	reg			H43gh7;
+	reg			J53gh7;
+	reg			L63gh7;
+	reg			O73gh7;
+	reg			R83gh7;
+	reg			U93gh7;
+	reg			Xa3gh7;
+	reg			Ac3gh7;
+	reg			Wc3gh7;
+	reg			Zd3gh7;
+	reg			Cf3gh7;
+	reg			Fg3gh7;
+	reg			Ih3gh7;
+	reg			Li3gh7;
+	reg			Oj3gh7;
+	reg			Rk3gh7;
+	reg			Tl3gh7;
+	reg			Wm3gh7;
+	reg			Zn3gh7;
+	reg			Cp3gh7;
+	reg			Dq3gh7;
+	reg			Fr3gh7;
+	reg			Is3gh7;
+	reg			Lt3gh7;
+	reg			Lu3gh7;
+	reg			Pv3gh7;
+	reg			Tw3gh7;
+	reg			Ux3gh7;
+	reg			Wy3gh7;
+	reg			Yz3gh7;
+	reg			A14gh7;
+	reg			D24gh7;
+	reg			G34gh7;
+	reg			J44gh7;
+	reg			M54gh7;
+	reg			P64gh7;
+	reg			R74gh7;
+	reg			T84gh7;
+	reg			W94gh7;
+	reg			Ya4gh7;
+	reg			Ac4gh7;
+	reg			Cd4gh7;
+	reg			Ee4gh7;
+	reg			Ff4gh7;
+	reg			Gg4gh7;
+	reg			Ih4gh7;
+	reg			Ji4gh7;
+	reg			Nj4gh7;
+	reg			Sk4gh7;
+	reg			Ul4gh7;
+	reg			Vm4gh7;
+	reg			Xn4gh7;
+	reg			Yo4gh7;
+	reg			Bq4gh7;
+	reg			Dr4gh7;
+	reg			Gs4gh7;
+	reg			It4gh7;
+	reg			Lu4gh7;
+	reg			Nv4gh7;
+	reg			Qw4gh7;
+	reg			Sx4gh7;
+	reg			Vy4gh7;
+	reg			Xz4gh7;
+	reg			D15gh7;
+	reg			J25gh7;
+	reg			P35gh7;
+	reg			U45gh7;
+	reg			Y55gh7;
+	reg			D75gh7;
+	reg			F85gh7;
+	reg			G95gh7;
+	reg			Ia5gh7;
+	reg			Jb5gh7;
+	reg			Mc5gh7;
+	reg			Od5gh7;
+	reg			Re5gh7;
+	reg			Tf5gh7;
+	reg			Wg5gh7;
+	reg			Yh5gh7;
+	reg			Bj5gh7;
+	reg			Dk5gh7;
+	reg			Gl5gh7;
+	reg			Im5gh7;
+	reg			On5gh7;
+	reg			Uo5gh7;
+	reg			Aq5gh7;
+	reg			Er5gh7;
+	reg			Js5gh7;
+	reg			Nt5gh7;
+	reg			Su5gh7;
+	reg			Uv5gh7;
+	reg			Vw5gh7;
+	reg			Xx5gh7;
+	reg			Yy5gh7;
+	reg			B06gh7;
+	reg			D16gh7;
+	reg			G26gh7;
+	reg			I36gh7;
+	reg			L46gh7;
+	reg			N56gh7;
+	reg			Q66gh7;
+	reg			S76gh7;
+	reg			V86gh7;
+	reg			X96gh7;
+	reg			Ab6gh7;
+	reg			Cc6gh7;
+	reg			Id6gh7;
+	reg			Oe6gh7;
+	reg			Uf6gh7;
+	reg			Ah6gh7;
+	reg			Ei6gh7;
+	reg			Jj6gh7;
+	reg			Nk6gh7;
+	reg			Sl6gh7;
+	reg			Ym6gh7;
+	reg			Eo6gh7;
+	reg			Kp6gh7;
+	reg			Qq6gh7;
+	reg			Vr6gh7;
+	reg			Vs6gh7;
+	reg			Bu6gh7;
+	reg			Bv6gh7;
+	reg			Hw6gh7;
+	reg			Hx6gh7;
+	reg			Ny6gh7;
+	reg			Nz6gh7;
+	reg			T07gh7;
+	reg			T17gh7;
+	reg			Z27gh7;
+	reg			Z37gh7;
+	reg			F57gh7;
+	reg			J67gh7;
+	reg			N77gh7;
+	reg			N87gh7;
+	reg			T97gh7;
+	reg			Ya7gh7;
+	reg			Cc7gh7;
+	reg			Cd7gh7;
+	reg			Ie7gh7;
+	reg			Nf7gh7;
+	reg			Rg7gh7;
+	reg			Vh7gh7;
+	reg			Zi7gh7;
+	reg			Dk7gh7;
+	wire	[33:0]		Hl7gh7;
+
+	assign ahb_hburst[2] = 1'b0;
+	assign ahb_hburst[1] = 1'b0;
+	assign ahb_hmastlock = 1'b0;
+	assign ahb_hprot[3] = 1'b0;
+	assign ahb_hprot[2] = 1'b0;
+	assign ahb_hsize[2] = 1'b0;
+	assign ahb_hsize[0] = 1'b0;
+	assign ahb_htrans[0] = 1'b0;
+	assign ahb_hburst[0] = 1'b1;
+	assign ahb_hprot[1] = 1'b1;
+	assign ahb_hprot[0] = 1'b1;
+	assign ahb_hsize[1] = 1'b1;
+	assign G92gh7 = (!M92gh7);
+	assign A92gh7 = (!Ma2gh7);
+	assign U82gh7 = (!Pb2gh7);
+	assign M62gh7 = (!Sc2gh7);
+	assign stdio_rx_tready = Ud2gh7;
+	assign O82gh7 = (!Ue2gh7);
+	assign com_tx_tvalid = Xf2gh7;
+	assign M32gh7 = (!Xg2gh7);
+	assign S32gh7 = (!Ai2gh7);
+	assign I22gh7 = (!Dj2gh7);
+	assign Y02gh7 = (!Fk2gh7);
+	assign I82gh7 = (!Hl2gh7);
+	assign M02gh7 = (!Jm2gh7);
+	assign A62gh7 = (!Ln2gh7);
+	assign A02gh7 = (!Oo2gh7);
+	assign com_rx_tready = Rp2gh7;
+	assign Iz1gh7 = (!Rq2gh7);
+	assign Uz1gh7 = (!Rr2gh7);
+	assign Oz1gh7 = (!Rs2gh7);
+	assign Cz1gh7 = (!Rt2gh7);
+	assign Wy1gh7 = (!Ru2gh7);
+	assign C82gh7 = (!Rv2gh7);
+	assign Qy1gh7 = (!Rw2gh7);
+	assign I52gh7 = (!Rx2gh7);
+	assign G02gh7 = (!Uy2gh7);
+	assign Y32gh7 = (!Xz2gh7);
+	assign Q42gh7 = (!A13gh7);
+	assign W12gh7 = (!D23gh7);
+	assign Q12gh7 = (!F33gh7);
+	assign E12gh7 = (!H43gh7);
+	assign U22gh7 = (!J53gh7);
+	assign G62gh7 = (!L63gh7);
+	assign C22gh7 = (!O73gh7);
+	assign G32gh7 = (!R83gh7);
+	assign A32gh7 = (!U93gh7);
+	assign K42gh7 = (!Xa3gh7);
+	assign W72gh7 = (!Ac3gh7);
+	assign S62gh7 = (!Wc3gh7);
+	assign W42gh7 = (!Zd3gh7);
+	assign O52gh7 = (!Cf3gh7);
+	assign U52gh7 = (!Fg3gh7);
+	assign E72gh7 = (!Ih3gh7);
+	assign Q72gh7 = Li3gh7;
+	assign S02gh7 = (!Oj3gh7);
+	assign K12gh7 = (!Rk3gh7);
+	assign C52gh7 = (!Tl3gh7);
+	assign Y62gh7 = (!Wm3gh7);
+	assign ahb_hwrite = Zn3gh7;
+	assign K72gh7 = (!Cp3gh7);
+	assign Yvrfh7 = Dq3gh7;
+	assign E42gh7 = (!Fr3gh7);
+	assign O22gh7 = (!Is3gh7);
+	assign stdio_tx_tvalid = Lt3gh7;
+	assign com_tx_tdata[7] = Lu3gh7;
+	assign com_tx_tdata[5] = Pv3gh7;
+	assign Yzrfh7 = (!Pv3gh7);
+	assign ahb_haddr[0] = Tw3gh7;
+	assign Gr1gh7 = (!Ux3gh7);
+	assign Es1gh7 = (!Wy3gh7);
+	assign Ct1gh7 = (!Yz3gh7);
+	assign Au1gh7 = (!A14gh7);
+	assign Ky1gh7 = (!D24gh7);
+	assign Mx1gh7 = (!G34gh7);
+	assign Iw1gh7 = (!J44gh7);
+	assign Ow1gh7 = (!M54gh7);
+	assign ahb_haddr[28] = P64gh7;
+	assign ahb_haddr[31] = R74gh7;
+	assign Ev1gh7 = (!T84gh7);
+	assign ahb_haddr[24] = W94gh7;
+	assign ahb_haddr[20] = Ya4gh7;
+	assign ahb_haddr[16] = Ac4gh7;
+	assign ahb_haddr[12] = Cd4gh7;
+	assign ahb_haddr[8] = Ee4gh7;
+	assign ahb_haddr[4] = Ff4gh7;
+	assign Mr1gh7 = (!Gg4gh7);
+	assign ahb_haddr[1] = Ih4gh7;
+	assign stdio_tx_tdata[1] = Ji4gh7;
+	assign ahb_hwdata[1] = Nj4gh7;
+	assign X0sfh7 = (!Nj4gh7);
+	assign Ks1gh7 = (!Sk4gh7);
+	assign ahb_haddr[5] = Ul4gh7;
+	assign It1gh7 = (!Vm4gh7);
+	assign ahb_haddr[9] = Xn4gh7;
+	assign Gu1gh7 = (!Yo4gh7);
+	assign ahb_haddr[13] = Bq4gh7;
+	assign Ey1gh7 = (!Dr4gh7);
+	assign ahb_haddr[17] = Gs4gh7;
+	assign Gx1gh7 = (!It4gh7);
+	assign ahb_haddr[21] = Lu4gh7;
+	assign Wv1gh7 = (!Nv4gh7);
+	assign ahb_haddr[25] = Qw4gh7;
+	assign Cw1gh7 = (!Sx4gh7);
+	assign ahb_haddr[29] = Vy4gh7;
+	assign ahb_hwdata[29] = Xz4gh7;
+	assign X5sfh7 = (!Xz4gh7);
+	assign ahb_hwdata[25] = D15gh7;
+	assign D5sfh7 = (!D15gh7);
+	assign ahb_hwdata[13] = J25gh7;
+	assign V2sfh7 = (!J25gh7);
+	assign ahb_hwdata[9] = P35gh7;
+	assign G2sfh7 = (!P35gh7);
+	assign stdio_tx_tdata[5] = U45gh7;
+	assign ahb_hwdata[5] = Y55gh7;
+	assign R1sfh7 = (!Y55gh7);
+	assign Yr1gh7 = (!D75gh7);
+	assign ahb_haddr[3] = F85gh7;
+	assign Ws1gh7 = (!G95gh7);
+	assign ahb_haddr[7] = Ia5gh7;
+	assign Ut1gh7 = (!Jb5gh7);
+	assign ahb_haddr[11] = Mc5gh7;
+	assign Su1gh7 = (!Od5gh7);
+	assign ahb_haddr[15] = Re5gh7;
+	assign Sx1gh7 = (!Tf5gh7);
+	assign ahb_haddr[19] = Wg5gh7;
+	assign Uw1gh7 = (!Yh5gh7);
+	assign ahb_haddr[23] = Bj5gh7;
+	assign Yu1gh7 = (!Dk5gh7);
+	assign ahb_haddr[27] = Gl5gh7;
+	assign ahb_hwdata[27] = Im5gh7;
+	assign N5sfh7 = (!Im5gh7);
+	assign ahb_hwdata[15] = On5gh7;
+	assign F3sfh7 = (!On5gh7);
+	assign ahb_hwdata[11] = Uo5gh7;
+	assign Q2sfh7 = (!Uo5gh7);
+	assign stdio_tx_tdata[7] = Aq5gh7;
+	assign ahb_hwdata[7] = Er5gh7;
+	assign W1sfh7 = (!Er5gh7);
+	assign stdio_tx_tdata[3] = Js5gh7;
+	assign ahb_hwdata[3] = Nt5gh7;
+	assign H1sfh7 = (!Nt5gh7);
+	assign Sr1gh7 = (!Su5gh7);
+	assign ahb_haddr[2] = Uv5gh7;
+	assign Qs1gh7 = (!Vw5gh7);
+	assign ahb_haddr[6] = Xx5gh7;
+	assign Ot1gh7 = (!Yy5gh7);
+	assign ahb_haddr[10] = B06gh7;
+	assign Mu1gh7 = (!D16gh7);
+	assign ahb_haddr[14] = G26gh7;
+	assign Yx1gh7 = (!I36gh7);
+	assign ahb_haddr[18] = L46gh7;
+	assign Ax1gh7 = (!N56gh7);
+	assign ahb_haddr[22] = Q66gh7;
+	assign Kv1gh7 = (!S76gh7);
+	assign ahb_haddr[26] = V86gh7;
+	assign Qv1gh7 = (!X96gh7);
+	assign ahb_haddr[30] = Ab6gh7;
+	assign ahb_hwdata[30] = Cc6gh7;
+	assign C6sfh7 = (!Cc6gh7);
+	assign ahb_hwdata[26] = Id6gh7;
+	assign I5sfh7 = (!Id6gh7);
+	assign ahb_hwdata[14] = Oe6gh7;
+	assign A3sfh7 = (!Oe6gh7);
+	assign ahb_hwdata[10] = Uf6gh7;
+	assign L2sfh7 = (!Uf6gh7);
+	assign stdio_tx_tdata[6] = Ah6gh7;
+	assign ahb_hwdata[6] = Ei6gh7;
+	assign Ozrfh7 = (!Ei6gh7);
+	assign stdio_tx_tdata[2] = Jj6gh7;
+	assign ahb_hwdata[2] = Nk6gh7;
+	assign C1sfh7 = (!Nk6gh7);
+	assign ahb_hwdata[31] = Sl6gh7;
+	assign H6sfh7 = (!Sl6gh7);
+	assign ahb_hwdata[28] = Ym6gh7;
+	assign S5sfh7 = (!Ym6gh7);
+	assign ahb_hwdata[24] = Eo6gh7;
+	assign Y4sfh7 = (!Eo6gh7);
+	assign ahb_hwdata[12] = Kp6gh7;
+	assign Kyrfh7 = (!Kp6gh7);
+	assign ahb_hwdata[8] = Qq6gh7;
+	assign B2sfh7 = (!Qq6gh7);
+	assign gpo8[6] = Vr6gh7;
+	assign Ayrfh7 = (!Vr6gh7);
+	assign ahb_hwdata[22] = Vs6gh7;
+	assign O4sfh7 = (!Vs6gh7);
+	assign gpo8[5] = Bu6gh7;
+	assign Vxrfh7 = (!Bu6gh7);
+	assign ahb_hwdata[21] = Bv6gh7;
+	assign J4sfh7 = (!Bv6gh7);
+	assign gpo8[3] = Hw6gh7;
+	assign Lxrfh7 = (!Hw6gh7);
+	assign ahb_hwdata[19] = Hx6gh7;
+	assign Z3sfh7 = (!Hx6gh7);
+	assign gpo8[2] = Ny6gh7;
+	assign Gxrfh7 = (!Ny6gh7);
+	assign ahb_hwdata[18] = Nz6gh7;
+	assign U3sfh7 = (!Nz6gh7);
+	assign gpo8[1] = T07gh7;
+	assign Bxrfh7 = (!T07gh7);
+	assign ahb_hwdata[17] = T17gh7;
+	assign P3sfh7 = (!T17gh7);
+	assign gpo8[7] = Z27gh7;
+	assign Fyrfh7 = (!Z27gh7);
+	assign ahb_hwdata[23] = Z37gh7;
+	assign T4sfh7 = (!Z37gh7);
+	assign com_tx_tdata[4] = F57gh7;
+	assign Tzrfh7 = (!F57gh7);
+	assign stdio_tx_tdata[4] = J67gh7;
+	assign gpo8[4] = N77gh7;
+	assign Qxrfh7 = (!N77gh7);
+	assign ahb_hwdata[20] = N87gh7;
+	assign E4sfh7 = (!N87gh7);
+	assign ahb_hwdata[4] = T97gh7;
+	assign M1sfh7 = (!T97gh7);
+	assign stdio_tx_tdata[0] = Ya7gh7;
+	assign gpo8[0] = Cc7gh7;
+	assign Wwrfh7 = (!Cc7gh7);
+	assign ahb_hwdata[16] = Cd7gh7;
+	assign K3sfh7 = (!Cd7gh7);
+	assign ahb_hwdata[0] = Ie7gh7;
+	assign Pyrfh7 = (!Ie7gh7);
+	assign com_tx_tdata[2] = Nf7gh7;
+	assign Ezrfh7 = (!Nf7gh7);
+	assign com_tx_tdata[0] = Rg7gh7;
+	assign Uyrfh7 = (!Rg7gh7);
+	assign com_tx_tdata[1] = Vh7gh7;
+	assign Zyrfh7 = (!Vh7gh7);
+	assign com_tx_tdata[3] = Zi7gh7;
+	assign Jzrfh7 = (!Zi7gh7);
+	assign com_tx_tdata[6] = Dk7gh7;
+	assign D0sfh7 = (!Dk7gh7);
+	assign Hl7gh7 = ({ahb_haddr, 1'b0} + {{1'b0, 1'b0, 1'b0, 1'b0, 1'b0,
+		1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0,
+		1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0, 1'b0,
+		1'b0, 1'b0, 1'b0, 1'b0, Ivrfh7, 1'b0, 1'b0}, 1'b1});
+	assign {Qbrfh7, Gcrfh7, Wcrfh7, Mdrfh7, Cerfh7, Serfh7, Ifrfh7, Yfrfh7,
+		Ogrfh7, Ehrfh7, Uhrfh7, Kirfh7, Ajrfh7, Qjrfh7, Gkrfh7, Wkrfh7,
+		Mlrfh7, Cmrfh7, Smrfh7, Inrfh7, Ynrfh7, Oorfh7, Eprfh7, Uprfh7,
+		Kqrfh7, Arrfh7, Qrrfh7, Gsrfh7, Wsrfh7, Mtrfh7, Curfh7, Surfh7}
+		= Hl7gh7[33:1];
+	assign Wpsfh7 = (!Cqsfh7);
+	assign Cqsfh7 = (!ahb_hresetn);
+	assign Iqsfh7 = (!Oqsfh7);
+	assign Oqsfh7 = (!ahb_hclk);
+	assign Dksfh7 = (~(Uqsfh7 & Arsfh7));
+	assign Uqsfh7 = (Mrsfh7 ? Iz1gh7 : Grsfh7);
+	assign Yjsfh7 = (!Srsfh7);
+	assign Srsfh7 = (Mrsfh7 ? Uz1gh7 : Yrsfh7);
+	assign Tjsfh7 = (Mrsfh7 ? Essfh7 : com_rx_tdata[6]);
+	assign Ojsfh7 = (~(Kssfh7 & Arsfh7));
+	assign Kssfh7 = (Mrsfh7 ? Cz1gh7 : Qssfh7);
+	assign Jjsfh7 = (!Wssfh7);
+	assign Wssfh7 = (Mrsfh7 ? Wy1gh7 : Ctsfh7);
+	assign Ejsfh7 = (~(Itsfh7 & Arsfh7));
+	assign Itsfh7 = (Mrsfh7 ? C82gh7 : Otsfh7);
+	assign Mrsfh7 = (!Utsfh7);
+	assign Zisfh7 = (~(Ausfh7 & Arsfh7));
+	assign Arsfh7 = (~(Utsfh7 & Gusfh7));
+	assign Ausfh7 = (Utsfh7 ? Musfh7 : Qy1gh7);
+	assign Uisfh7 = (S0sfh7 ? Susfh7 : ahb_hwrite);
+	assign Susfh7 = (~(Yusfh7 & Evsfh7));
+	assign Evsfh7 = (~(Kvsfh7 & Qvsfh7));
+	assign Pisfh7 = (~(Wvsfh7 & Cwsfh7));
+	assign Cwsfh7 = (Iwsfh7 & Owsfh7);
+	assign Iwsfh7 = (~(Uwsfh7 & Axsfh7));
+	assign Wvsfh7 = (Gxsfh7 & Mxsfh7);
+	assign Mxsfh7 = (~(Sxsfh7 & Yxsfh7));
+	assign Gxsfh7 = (~(Eysfh7 & ahb_haddr[31]));
+	assign Kisfh7 = (~(Kysfh7 & Qysfh7));
+	assign Qysfh7 = (Wysfh7 & Owsfh7);
+	assign Wysfh7 = (~(Czsfh7 & Izsfh7));
+	assign Izsfh7 = (~(Ozsfh7 & Uzsfh7));
+	assign Uzsfh7 = (~(A0tfh7 & G0tfh7));
+	assign Ozsfh7 = (~(com_rx_tdata[0] & M0tfh7));
+	assign M0tfh7 = (S0tfh7 | Y0tfh7);
+	assign Kysfh7 = (E1tfh7 & K1tfh7);
+	assign K1tfh7 = (~(Sxsfh7 & Q1tfh7));
+	assign E1tfh7 = (~(Eysfh7 & ahb_haddr[0]));
+	assign Fisfh7 = (~(W1tfh7 & C2tfh7));
+	assign C2tfh7 = (I2tfh7 & Owsfh7);
+	assign I2tfh7 = (~(Uwsfh7 & O2tfh7));
+	assign W1tfh7 = (U2tfh7 & A3tfh7);
+	assign A3tfh7 = (~(Sxsfh7 & G3tfh7));
+	assign U2tfh7 = (~(Eysfh7 & ahb_haddr[30]));
+	assign Aisfh7 = (~(M3tfh7 & S3tfh7));
+	assign S3tfh7 = (Y3tfh7 & Owsfh7);
+	assign Y3tfh7 = (~(Uwsfh7 & E4tfh7));
+	assign M3tfh7 = (K4tfh7 & Q4tfh7);
+	assign Q4tfh7 = (~(Sxsfh7 & W4tfh7));
+	assign K4tfh7 = (~(Eysfh7 & ahb_haddr[29]));
+	assign Vhsfh7 = (~(C5tfh7 & I5tfh7));
+	assign I5tfh7 = (O5tfh7 & Owsfh7);
+	assign O5tfh7 = (~(Uwsfh7 & U5tfh7));
+	assign C5tfh7 = (A6tfh7 & G6tfh7);
+	assign G6tfh7 = (~(Sxsfh7 & M6tfh7));
+	assign A6tfh7 = (~(Eysfh7 & ahb_haddr[28]));
+	assign Qhsfh7 = (~(S6tfh7 & Y6tfh7));
+	assign Y6tfh7 = (E7tfh7 & Owsfh7);
+	assign E7tfh7 = (~(Uwsfh7 & K7tfh7));
+	assign S6tfh7 = (Q7tfh7 & W7tfh7);
+	assign W7tfh7 = (~(Sxsfh7 & Axsfh7));
+	assign Q7tfh7 = (~(Eysfh7 & ahb_haddr[27]));
+	assign Lhsfh7 = (~(C8tfh7 & I8tfh7));
+	assign I8tfh7 = (O8tfh7 & Owsfh7);
+	assign O8tfh7 = (~(Uwsfh7 & U8tfh7));
+	assign C8tfh7 = (A9tfh7 & G9tfh7);
+	assign G9tfh7 = (~(Sxsfh7 & O2tfh7));
+	assign A9tfh7 = (~(Eysfh7 & ahb_haddr[26]));
+	assign Ghsfh7 = (~(M9tfh7 & S9tfh7));
+	assign S9tfh7 = (Y9tfh7 & Owsfh7);
+	assign Y9tfh7 = (~(Uwsfh7 & Eatfh7));
+	assign M9tfh7 = (Katfh7 & Qatfh7);
+	assign Qatfh7 = (~(Sxsfh7 & E4tfh7));
+	assign Katfh7 = (~(Eysfh7 & ahb_haddr[25]));
+	assign Bhsfh7 = (~(Watfh7 & Cbtfh7));
+	assign Cbtfh7 = (Ibtfh7 & Owsfh7);
+	assign Ibtfh7 = (~(Uwsfh7 & Obtfh7));
+	assign Watfh7 = (Ubtfh7 & Actfh7);
+	assign Actfh7 = (~(Sxsfh7 & U5tfh7));
+	assign Ubtfh7 = (~(Eysfh7 & ahb_haddr[24]));
+	assign Wgsfh7 = (~(Gctfh7 & Mctfh7));
+	assign Mctfh7 = (Sctfh7 & Owsfh7);
+	assign Sctfh7 = (~(Uwsfh7 & Yctfh7));
+	assign Gctfh7 = (Edtfh7 & Kdtfh7);
+	assign Kdtfh7 = (~(Sxsfh7 & K7tfh7));
+	assign Edtfh7 = (~(Eysfh7 & ahb_haddr[23]));
+	assign Rgsfh7 = (~(Qdtfh7 & Wdtfh7));
+	assign Wdtfh7 = (Cetfh7 & Owsfh7);
+	assign Cetfh7 = (~(Uwsfh7 & Ietfh7));
+	assign Qdtfh7 = (Oetfh7 & Uetfh7);
+	assign Uetfh7 = (~(Sxsfh7 & U8tfh7));
+	assign Oetfh7 = (~(Eysfh7 & ahb_haddr[22]));
+	assign Mgsfh7 = (~(Aftfh7 & Gftfh7));
+	assign Gftfh7 = (Mftfh7 & Owsfh7);
+	assign Mftfh7 = (~(Uwsfh7 & Sftfh7));
+	assign Aftfh7 = (Yftfh7 & Egtfh7);
+	assign Egtfh7 = (~(Sxsfh7 & Eatfh7));
+	assign Yftfh7 = (~(Eysfh7 & ahb_haddr[21]));
+	assign Hgsfh7 = (~(Kgtfh7 & Qgtfh7));
+	assign Qgtfh7 = (Wgtfh7 & Owsfh7);
+	assign Wgtfh7 = (~(Uwsfh7 & Chtfh7));
+	assign Kgtfh7 = (Ihtfh7 & Ohtfh7);
+	assign Ohtfh7 = (~(Sxsfh7 & Obtfh7));
+	assign Ihtfh7 = (~(Eysfh7 & ahb_haddr[20]));
+	assign Cgsfh7 = (~(Uhtfh7 & Aitfh7));
+	assign Aitfh7 = (Gitfh7 & Owsfh7);
+	assign Gitfh7 = (~(Uwsfh7 & Mitfh7));
+	assign Uhtfh7 = (Sitfh7 & Yitfh7);
+	assign Yitfh7 = (~(Sxsfh7 & Yctfh7));
+	assign Sitfh7 = (~(Eysfh7 & ahb_haddr[19]));
+	assign Xfsfh7 = (~(Ejtfh7 & Kjtfh7));
+	assign Kjtfh7 = (Qjtfh7 & Owsfh7);
+	assign Qjtfh7 = (~(Uwsfh7 & Wjtfh7));
+	assign Ejtfh7 = (Cktfh7 & Iktfh7);
+	assign Iktfh7 = (~(Sxsfh7 & Ietfh7));
+	assign Cktfh7 = (~(Eysfh7 & ahb_haddr[18]));
+	assign Sfsfh7 = (~(Oktfh7 & Uktfh7));
+	assign Uktfh7 = (Altfh7 & Owsfh7);
+	assign Altfh7 = (~(Uwsfh7 & Gltfh7));
+	assign Oktfh7 = (Mltfh7 & Sltfh7);
+	assign Sltfh7 = (~(Sxsfh7 & Sftfh7));
+	assign Mltfh7 = (~(Eysfh7 & ahb_haddr[17]));
+	assign Nfsfh7 = (~(Yltfh7 & Emtfh7));
+	assign Emtfh7 = (Kmtfh7 & Owsfh7);
+	assign Kmtfh7 = (~(Uwsfh7 & Qmtfh7));
+	assign Yltfh7 = (Wmtfh7 & Cntfh7);
+	assign Cntfh7 = (~(Sxsfh7 & Chtfh7));
+	assign Wmtfh7 = (~(Eysfh7 & ahb_haddr[16]));
+	assign Ifsfh7 = (~(Intfh7 & Ontfh7));
+	assign Ontfh7 = (Untfh7 & Owsfh7);
+	assign Untfh7 = (~(Uwsfh7 & Aotfh7));
+	assign Intfh7 = (Gotfh7 & Motfh7);
+	assign Motfh7 = (~(Sxsfh7 & Mitfh7));
+	assign Gotfh7 = (~(Eysfh7 & ahb_haddr[15]));
+	assign Dfsfh7 = (~(Sotfh7 & Yotfh7));
+	assign Yotfh7 = (Eptfh7 & Owsfh7);
+	assign Eptfh7 = (~(Uwsfh7 & Kptfh7));
+	assign Sotfh7 = (Qptfh7 & Wptfh7);
+	assign Wptfh7 = (~(Sxsfh7 & Wjtfh7));
+	assign Qptfh7 = (~(Eysfh7 & ahb_haddr[14]));
+	assign Yesfh7 = (~(Cqtfh7 & Iqtfh7));
+	assign Iqtfh7 = (Oqtfh7 & Owsfh7);
+	assign Oqtfh7 = (~(Uwsfh7 & Uqtfh7));
+	assign Cqtfh7 = (Artfh7 & Grtfh7);
+	assign Grtfh7 = (~(Sxsfh7 & Gltfh7));
+	assign Artfh7 = (~(Eysfh7 & ahb_haddr[13]));
+	assign Tesfh7 = (~(Mrtfh7 & Srtfh7));
+	assign Srtfh7 = (Yrtfh7 & Owsfh7);
+	assign Yrtfh7 = (~(Uwsfh7 & Estfh7));
+	assign Mrtfh7 = (Kstfh7 & Qstfh7);
+	assign Qstfh7 = (~(Sxsfh7 & Qmtfh7));
+	assign Kstfh7 = (~(Eysfh7 & ahb_haddr[12]));
+	assign Oesfh7 = (~(Wstfh7 & Cttfh7));
+	assign Cttfh7 = (Ittfh7 & Owsfh7);
+	assign Ittfh7 = (~(Uwsfh7 & Ottfh7));
+	assign Wstfh7 = (Uttfh7 & Autfh7);
+	assign Autfh7 = (~(Sxsfh7 & Aotfh7));
+	assign Uttfh7 = (~(Eysfh7 & ahb_haddr[11]));
+	assign Jesfh7 = (~(Gutfh7 & Mutfh7));
+	assign Mutfh7 = (Sutfh7 & Owsfh7);
+	assign Sutfh7 = (~(Uwsfh7 & Yutfh7));
+	assign Gutfh7 = (Evtfh7 & Kvtfh7);
+	assign Kvtfh7 = (~(Sxsfh7 & Kptfh7));
+	assign Evtfh7 = (~(Eysfh7 & ahb_haddr[10]));
+	assign Eesfh7 = (~(Qvtfh7 & Wvtfh7));
+	assign Wvtfh7 = (Cwtfh7 & Owsfh7);
+	assign Cwtfh7 = (~(Uwsfh7 & Iwtfh7));
+	assign Qvtfh7 = (Owtfh7 & Uwtfh7);
+	assign Uwtfh7 = (~(Sxsfh7 & Uqtfh7));
+	assign Owtfh7 = (~(Eysfh7 & ahb_haddr[9]));
+	assign Zdsfh7 = (~(Axtfh7 & Gxtfh7));
+	assign Gxtfh7 = (Mxtfh7 & Owsfh7);
+	assign Mxtfh7 = (~(Uwsfh7 & Sxtfh7));
+	assign Axtfh7 = (Yxtfh7 & Eytfh7);
+	assign Eytfh7 = (~(Sxsfh7 & Estfh7));
+	assign Yxtfh7 = (~(Eysfh7 & ahb_haddr[8]));
+	assign Udsfh7 = (~(Kytfh7 & Qytfh7));
+	assign Qytfh7 = (Wytfh7 & Owsfh7);
+	assign Wytfh7 = (~(Uwsfh7 & Cztfh7));
+	assign Kytfh7 = (Iztfh7 & Oztfh7);
+	assign Oztfh7 = (~(Sxsfh7 & Ottfh7));
+	assign Iztfh7 = (~(Eysfh7 & ahb_haddr[7]));
+	assign Pdsfh7 = (~(Uztfh7 & A0ufh7));
+	assign A0ufh7 = (G0ufh7 & Owsfh7);
+	assign G0ufh7 = (~(Uwsfh7 & M0ufh7));
+	assign Uztfh7 = (S0ufh7 & Y0ufh7);
+	assign Y0ufh7 = (~(Sxsfh7 & Yutfh7));
+	assign S0ufh7 = (~(Eysfh7 & ahb_haddr[6]));
+	assign Kdsfh7 = (~(E1ufh7 & K1ufh7));
+	assign K1ufh7 = (Q1ufh7 & Owsfh7);
+	assign Q1ufh7 = (~(Uwsfh7 & W1ufh7));
+	assign E1ufh7 = (C2ufh7 & I2ufh7);
+	assign I2ufh7 = (~(Sxsfh7 & Iwtfh7));
+	assign C2ufh7 = (~(Eysfh7 & ahb_haddr[5]));
+	assign Fdsfh7 = (~(O2ufh7 & U2ufh7));
+	assign U2ufh7 = (A3ufh7 & Owsfh7);
+	assign A3ufh7 = (~(Uwsfh7 & Q1tfh7));
+	assign Uwsfh7 = (Czsfh7 & G3ufh7);
+	assign G3ufh7 = (M3ufh7 | S0tfh7);
+	assign O2ufh7 = (S3ufh7 & Y3ufh7);
+	assign Y3ufh7 = (~(Sxsfh7 & Sxtfh7));
+	assign S3ufh7 = (~(Eysfh7 & ahb_haddr[4]));
+	assign Adsfh7 = (~(E4ufh7 & K4ufh7));
+	assign K4ufh7 = (Q4ufh7 & Owsfh7);
+	assign Q4ufh7 = (~(Czsfh7 & M3ufh7));
+	assign M3ufh7 = (W4ufh7 | C5ufh7);
+	assign C5ufh7 = (com_rx_tdata[2] ? A0tfh7 : I5ufh7);
+	assign I5ufh7 = (O5ufh7 & com_rx_tdata[1]);
+	assign W4ufh7 = (U5ufh7 | Y0tfh7);
+	assign Y0tfh7 = (A6ufh7 & G6ufh7);
+	assign A6ufh7 = (M6ufh7 & com_rx_tdata[3]);
+	assign E4ufh7 = (S6ufh7 & Y6ufh7);
+	assign Y6ufh7 = (~(Sxsfh7 & Cztfh7));
+	assign S6ufh7 = (~(Eysfh7 & ahb_haddr[3]));
+	assign Vcsfh7 = (~(E7ufh7 & K7ufh7));
+	assign K7ufh7 = (Q7ufh7 & Owsfh7);
+	assign Q7ufh7 = (~(Czsfh7 & W7ufh7));
+	assign W7ufh7 = (~(C8ufh7 & I8ufh7));
+	assign C8ufh7 = (Otsfh7 ? U8ufh7 : O8ufh7);
+	assign U8ufh7 = (~(A9ufh7 & O5ufh7));
+	assign E7ufh7 = (G9ufh7 & M9ufh7);
+	assign M9ufh7 = (~(Sxsfh7 & M0ufh7));
+	assign G9ufh7 = (~(Eysfh7 & ahb_haddr[2]));
+	assign Qcsfh7 = (~(S9ufh7 & Y9ufh7));
+	assign Y9ufh7 = (Eaufh7 & Owsfh7);
+	assign Owsfh7 = (~(Kaufh7 & Qaufh7));
+	assign Eaufh7 = (~(Czsfh7 & Waufh7));
+	assign Waufh7 = (U5ufh7 | Cbufh7);
+	assign Cbufh7 = (~(Musfh7 | O8ufh7));
+	assign O8ufh7 = (~(S0tfh7 | A0tfh7));
+	assign A0tfh7 = (O5ufh7 & Grsfh7);
+	assign S0tfh7 = (G6ufh7 & Ctsfh7);
+	assign G6ufh7 = (Ibufh7 & com_rx_tdata[4]);
+	assign Ibufh7 = (~(Obufh7 | com_rx_tdata[6]));
+	assign U5ufh7 = (~(I8ufh7 & Ubufh7));
+	assign Ubufh7 = (~(Acufh7 & O5ufh7));
+	assign Acufh7 = (M6ufh7 & com_rx_tdata[0]);
+	assign I8ufh7 = (~(Gcufh7 & Mcufh7));
+	assign Mcufh7 = (com_rx_tdata[0] & Musfh7);
+	assign Gcufh7 = (O5ufh7 & com_rx_tdata[2]);
+	assign O5ufh7 = (Scufh7 & com_rx_tdata[6]);
+	assign Scufh7 = (Ctsfh7 & Qssfh7);
+	assign S9ufh7 = (Ycufh7 & Edufh7);
+	assign Edufh7 = (~(Sxsfh7 & W1ufh7));
+	assign Sxsfh7 = (~(Kdufh7 & Qdufh7));
+	assign Qdufh7 = (~(Wdufh7 & com_rx_tdata[7]));
+	assign Kdufh7 = (Ceufh7 & Qaufh7);
+	assign Ceufh7 = (~(Czsfh7 & Ieufh7));
+	assign Ieufh7 = (~(Oeufh7 & Ueufh7));
+	assign Ueufh7 = (com_rx_tdata[6] ? Gfufh7 : Afufh7);
+	assign Gfufh7 = (Ctsfh7 ? Qssfh7 : Grsfh7);
+	assign Afufh7 = (~(Mfufh7 & Obufh7));
+	assign Mfufh7 = (~(com_rx_tdata[0] & Qssfh7));
+	assign Oeufh7 = (Sfufh7 & Yfufh7);
+	assign Yfufh7 = (~(Egufh7 & Qssfh7));
+	assign Egufh7 = (~(Kgufh7 & Qgufh7));
+	assign Qgufh7 = (com_rx_tdata[6] ? Chufh7 : Wgufh7);
+	assign Chufh7 = (~(M6ufh7 & Grsfh7));
+	assign Wgufh7 = (~(G0tfh7 | Ihufh7));
+	assign Kgufh7 = (Ohufh7 & Uhufh7);
+	assign Uhufh7 = (~(A9ufh7 & com_rx_tdata[2]));
+	assign Ohufh7 = (~(com_rx_tdata[5] & com_rx_tdata[3]));
+	assign Sfufh7 = (~(com_rx_tdata[3] & G0tfh7));
+	assign G0tfh7 = (!M6ufh7);
+	assign Czsfh7 = (Aiufh7 & Wdufh7);
+	assign Aiufh7 = (Qaufh7 & Yrsfh7);
+	assign Yrsfh7 = (!com_rx_tdata[7]);
+	assign Ycufh7 = (~(Eysfh7 & ahb_haddr[1]));
+	assign Eysfh7 = (Kvsfh7 & Qaufh7);
+	assign Qaufh7 = (~(Giufh7 & Miufh7));
+	assign Miufh7 = (~(Wdufh7 & Siufh7));
+	assign Giufh7 = (Yiufh7 & Ejufh7);
+	assign Ejufh7 = (Kjufh7 | Qjufh7);
+	assign Lcsfh7 = (~(Wjufh7 & Ckufh7));
+	assign Ckufh7 = (Ikufh7 | Fyrfh7);
+	assign Ikufh7 = (Okufh7 & Ukufh7);
+	assign Ukufh7 = (~(Ws1gh7 & It1gh7));
+	assign Wjufh7 = (~(Alufh7 & Ottfh7));
+	assign Gcsfh7 = (~(Glufh7 & Mlufh7));
+	assign Mlufh7 = (Slufh7 | Wwrfh7);
+	assign Slufh7 = (Okufh7 & Ylufh7);
+	assign Ylufh7 = (~(Gr1gh7 & It1gh7));
+	assign Glufh7 = (~(Alufh7 & Q1tfh7));
+	assign Bcsfh7 = (~(Emufh7 & Kmufh7));
+	assign Kmufh7 = (Qmufh7 | Bxrfh7);
+	assign Qmufh7 = (Okufh7 & Wmufh7);
+	assign Wmufh7 = (~(Mr1gh7 & It1gh7));
+	assign Emufh7 = (~(Alufh7 & W1ufh7));
+	assign Wbsfh7 = (~(Cnufh7 & Inufh7));
+	assign Inufh7 = (Onufh7 | Gxrfh7);
+	assign Onufh7 = (Okufh7 & Unufh7);
+	assign Unufh7 = (~(Sr1gh7 & It1gh7));
+	assign Cnufh7 = (~(Alufh7 & M0ufh7));
+	assign Rbsfh7 = (~(Aoufh7 & Goufh7));
+	assign Goufh7 = (Moufh7 | Lxrfh7);
+	assign Moufh7 = (Okufh7 & Soufh7);
+	assign Soufh7 = (~(Yr1gh7 & It1gh7));
+	assign Aoufh7 = (~(Alufh7 & Cztfh7));
+	assign Mbsfh7 = (~(Youfh7 & Epufh7));
+	assign Epufh7 = (Kpufh7 | Qxrfh7);
+	assign Kpufh7 = (Okufh7 & Qpufh7);
+	assign Qpufh7 = (~(Es1gh7 & It1gh7));
+	assign Youfh7 = (~(Alufh7 & Sxtfh7));
+	assign Hbsfh7 = (~(Wpufh7 & Cqufh7));
+	assign Cqufh7 = (Iqufh7 | Vxrfh7);
+	assign Iqufh7 = (Okufh7 & Oqufh7);
+	assign Oqufh7 = (~(Ks1gh7 & It1gh7));
+	assign Wpufh7 = (~(Alufh7 & Iwtfh7));
+	assign Cbsfh7 = (~(Uqufh7 & Arufh7));
+	assign Arufh7 = (Grufh7 | Ayrfh7);
+	assign Grufh7 = (Okufh7 & Mrufh7);
+	assign Mrufh7 = (~(Qs1gh7 & It1gh7));
+	assign Okufh7 = (~(Srufh7 | Ct1gh7));
+	assign Uqufh7 = (~(Alufh7 & Yutfh7));
+	assign Alufh7 = (~(Srufh7 | It1gh7));
+	assign Srufh7 = (~(Yrufh7 & Esufh7));
+	assign Esufh7 = (Ksufh7 & Qsufh7);
+	assign Qsufh7 = (Wsufh7 & Ctufh7);
+	assign Ctufh7 = (Itufh7 & Ky1gh7);
+	assign Itufh7 = (Wpsfh7 & Hvqfh7);
+	assign Wsufh7 = (Otufh7 & Sx1gh7);
+	assign Otufh7 = (Yx1gh7 & Ey1gh7);
+	assign Ksufh7 = (Utufh7 & Auufh7);
+	assign Auufh7 = (Guufh7 & Ax1gh7);
+	assign Guufh7 = (Gx1gh7 & Mx1gh7);
+	assign Utufh7 = (Muufh7 & Iw1gh7);
+	assign Muufh7 = (Ow1gh7 & Uw1gh7);
+	assign Yrufh7 = (Suufh7 & Yuufh7);
+	assign Yuufh7 = (Evufh7 & Kvufh7);
+	assign Kvufh7 = (Qvufh7 & Qv1gh7);
+	assign Qvufh7 = (Wv1gh7 & Cw1gh7);
+	assign Evufh7 = (Wvufh7 & Yu1gh7);
+	assign Wvufh7 = (Ev1gh7 & Kv1gh7);
+	assign Suufh7 = (Cwufh7 & Iwufh7);
+	assign Iwufh7 = (Owufh7 & Gu1gh7);
+	assign Owufh7 = (Mu1gh7 & Su1gh7);
+	assign Cwufh7 = (Uwufh7 & Ot1gh7);
+	assign Uwufh7 = (Ut1gh7 & Au1gh7);
+	assign Xasfh7 = (~(Axufh7 & Gxufh7));
+	assign Gxufh7 = (Mxufh7 & Sxufh7);
+	assign Sxufh7 = (~(Yxufh7 & Chtfh7));
+	assign Mxufh7 = (~(ahb_hrdata[16] & Eyufh7));
+	assign Axufh7 = (Kyufh7 & Qyufh7);
+	assign Qyufh7 = (Wyufh7 | K3sfh7);
+	assign Kyufh7 = (Czufh7 | Wwrfh7);
+	assign Sasfh7 = (~(Izufh7 & Ozufh7));
+	assign Ozufh7 = (Uzufh7 & A0vfh7);
+	assign A0vfh7 = (~(Yxufh7 & Sftfh7));
+	assign Uzufh7 = (~(ahb_hrdata[17] & Eyufh7));
+	assign Izufh7 = (G0vfh7 & M0vfh7);
+	assign M0vfh7 = (~(S0vfh7 & Y0vfh7));
+	assign G0vfh7 = (Czufh7 | Bxrfh7);
+	assign Nasfh7 = (~(E1vfh7 & K1vfh7));
+	assign K1vfh7 = (Q1vfh7 & W1vfh7);
+	assign W1vfh7 = (~(Yxufh7 & Ietfh7));
+	assign Q1vfh7 = (~(ahb_hrdata[18] & Eyufh7));
+	assign E1vfh7 = (C2vfh7 & I2vfh7);
+	assign I2vfh7 = (~(S0vfh7 & O2vfh7));
+	assign C2vfh7 = (Czufh7 | Gxrfh7);
+	assign Iasfh7 = (~(U2vfh7 & A3vfh7));
+	assign A3vfh7 = (G3vfh7 & M3vfh7);
+	assign M3vfh7 = (~(Yxufh7 & Yctfh7));
+	assign G3vfh7 = (~(ahb_hrdata[19] & Eyufh7));
+	assign U2vfh7 = (S3vfh7 & Y3vfh7);
+	assign Y3vfh7 = (~(S0vfh7 & E4vfh7));
+	assign S3vfh7 = (Czufh7 | Lxrfh7);
+	assign Dasfh7 = (~(K4vfh7 & Q4vfh7));
+	assign Q4vfh7 = (W4vfh7 & C5vfh7);
+	assign C5vfh7 = (~(Yxufh7 & Obtfh7));
+	assign W4vfh7 = (~(ahb_hrdata[20] & Eyufh7));
+	assign K4vfh7 = (I5vfh7 & O5vfh7);
+	assign O5vfh7 = (Wyufh7 | E4sfh7);
+	assign I5vfh7 = (Czufh7 | Qxrfh7);
+	assign Y9sfh7 = (~(U5vfh7 & A6vfh7));
+	assign A6vfh7 = (G6vfh7 & M6vfh7);
+	assign M6vfh7 = (~(Yxufh7 & Eatfh7));
+	assign G6vfh7 = (~(ahb_hrdata[21] & Eyufh7));
+	assign U5vfh7 = (S6vfh7 & Y6vfh7);
+	assign Y6vfh7 = (~(S0vfh7 & E7vfh7));
+	assign S6vfh7 = (Czufh7 | Vxrfh7);
+	assign T9sfh7 = (~(K7vfh7 & Q7vfh7));
+	assign Q7vfh7 = (W7vfh7 & C8vfh7);
+	assign C8vfh7 = (~(Yxufh7 & U8tfh7));
+	assign W7vfh7 = (~(ahb_hrdata[22] & Eyufh7));
+	assign K7vfh7 = (I8vfh7 & O8vfh7);
+	assign O8vfh7 = (~(S0vfh7 & U8vfh7));
+	assign I8vfh7 = (Czufh7 | Ayrfh7);
+	assign O9sfh7 = (~(A9vfh7 & G9vfh7));
+	assign G9vfh7 = (M9vfh7 & S9vfh7);
+	assign S9vfh7 = (~(Yxufh7 & K7tfh7));
+	assign M9vfh7 = (~(ahb_hrdata[23] & Eyufh7));
+	assign A9vfh7 = (Y9vfh7 & Eavfh7);
+	assign Eavfh7 = (~(S0vfh7 & Kavfh7));
+	assign Y9vfh7 = (Czufh7 | Fyrfh7);
+	assign J9sfh7 = (~(Qavfh7 & Wavfh7));
+	assign Wavfh7 = (Cbvfh7 & Ibvfh7);
+	assign Ibvfh7 = (~(Yxufh7 & U5tfh7));
+	assign Cbvfh7 = (~(ahb_hrdata[24] & Eyufh7));
+	assign Qavfh7 = (Obvfh7 & Ubvfh7);
+	assign Ubvfh7 = (Wyufh7 | Y4sfh7);
+	assign Obvfh7 = (~(gpi8[0] & Acvfh7));
+	assign E9sfh7 = (~(Gcvfh7 & Mcvfh7));
+	assign Mcvfh7 = (Scvfh7 & Ycvfh7);
+	assign Ycvfh7 = (~(Yxufh7 & E4tfh7));
+	assign Scvfh7 = (~(ahb_hrdata[25] & Eyufh7));
+	assign Gcvfh7 = (Edvfh7 & Kdvfh7);
+	assign Kdvfh7 = (~(S0vfh7 & Qdvfh7));
+	assign Edvfh7 = (~(gpi8[1] & Acvfh7));
+	assign Z8sfh7 = (~(Wdvfh7 & Cevfh7));
+	assign Cevfh7 = (Ievfh7 & Oevfh7);
+	assign Oevfh7 = (~(Yxufh7 & O2tfh7));
+	assign Ievfh7 = (~(ahb_hrdata[26] & Eyufh7));
+	assign Wdvfh7 = (Uevfh7 & Afvfh7);
+	assign Afvfh7 = (~(S0vfh7 & Gfvfh7));
+	assign Uevfh7 = (~(gpi8[2] & Acvfh7));
+	assign U8sfh7 = (~(Mfvfh7 & Sfvfh7));
+	assign Sfvfh7 = (Yfvfh7 & Egvfh7);
+	assign Egvfh7 = (~(Yxufh7 & Axsfh7));
+	assign Yfvfh7 = (~(ahb_hrdata[27] & Eyufh7));
+	assign Mfvfh7 = (Kgvfh7 & Qgvfh7);
+	assign Qgvfh7 = (~(S0vfh7 & Wgvfh7));
+	assign Kgvfh7 = (~(gpi8[3] & Acvfh7));
+	assign P8sfh7 = (~(Chvfh7 & Ihvfh7));
+	assign Ihvfh7 = (Ohvfh7 & Uhvfh7);
+	assign Uhvfh7 = (~(Yxufh7 & M6tfh7));
+	assign Ohvfh7 = (~(ahb_hrdata[28] & Eyufh7));
+	assign Chvfh7 = (Aivfh7 & Givfh7);
+	assign Givfh7 = (Wyufh7 | S5sfh7);
+	assign Aivfh7 = (~(gpi8[4] & Acvfh7));
+	assign K8sfh7 = (~(Mivfh7 & Sivfh7));
+	assign Sivfh7 = (Yivfh7 & Ejvfh7);
+	assign Ejvfh7 = (~(Yxufh7 & W4tfh7));
+	assign Yivfh7 = (~(ahb_hrdata[29] & Eyufh7));
+	assign Mivfh7 = (Kjvfh7 & Qjvfh7);
+	assign Qjvfh7 = (~(S0vfh7 & Wjvfh7));
+	assign Kjvfh7 = (~(gpi8[5] & Acvfh7));
+	assign F8sfh7 = (~(Ckvfh7 & Ikvfh7));
+	assign Ikvfh7 = (Okvfh7 & Ukvfh7);
+	assign Ukvfh7 = (~(Yxufh7 & G3tfh7));
+	assign Okvfh7 = (~(ahb_hrdata[30] & Eyufh7));
+	assign Ckvfh7 = (Alvfh7 & Glvfh7);
+	assign Glvfh7 = (~(S0vfh7 & Mlvfh7));
+	assign Alvfh7 = (~(gpi8[6] & Acvfh7));
+	assign A8sfh7 = (~(Slvfh7 & Ylvfh7));
+	assign Ylvfh7 = (Emvfh7 & Kmvfh7);
+	assign Kmvfh7 = (~(Yxufh7 & Yxsfh7));
+	assign Yxufh7 = (!Qmvfh7);
+	assign Emvfh7 = (~(ahb_hrdata[31] & Eyufh7));
+	assign Slvfh7 = (Wmvfh7 & Cnvfh7);
+	assign Cnvfh7 = (~(S0vfh7 & Invfh7));
+	assign Wmvfh7 = (~(gpi8[7] & Acvfh7));
+	assign Acvfh7 = (!Czufh7);
+	assign V7sfh7 = (Onvfh7 & Unvfh7);
+	assign Unvfh7 = (~(Aovfh7 & Govfh7));
+	assign Govfh7 = (Movfh7 & Sovfh7);
+	assign Sovfh7 = (Yovfh7 & Epvfh7);
+	assign Epvfh7 = (Kpvfh7 & Qpvfh7);
+	assign Yovfh7 = (Wpvfh7 & Cqvfh7);
+	assign Cqvfh7 = (~(Iqvfh7 & Oqvfh7));
+	assign Iqvfh7 = (~(Uqvfh7 | M1sfh7));
+	assign Wpvfh7 = (~(Arvfh7 & Grvfh7));
+	assign Arvfh7 = (Mrvfh7 ^ Srvfh7);
+	assign Movfh7 = (Yrvfh7 & Esvfh7);
+	assign Esvfh7 = (Ksvfh7 & Qsvfh7);
+	assign Qsvfh7 = (~(Wsvfh7 & Ctvfh7));
+	assign Wsvfh7 = (Itvfh7 ^ Otvfh7);
+	assign Ksvfh7 = (~(Utvfh7 & Auvfh7));
+	assign Utvfh7 = (~(Guvfh7 ^ S5sfh7));
+	assign Yrvfh7 = (Muvfh7 & Suvfh7);
+	assign Suvfh7 = (~(Yuvfh7 & Evvfh7));
+	assign Yuvfh7 = (~(Kvvfh7 ^ K3sfh7));
+	assign Muvfh7 = (~(Qvvfh7 & Wvvfh7));
+	assign Qvvfh7 = (~(Cwvfh7 ^ Y4sfh7));
+	assign Aovfh7 = (Iwvfh7 & Owvfh7);
+	assign Owvfh7 = (Uwvfh7 & Axvfh7);
+	assign Axvfh7 = (Gxvfh7 & Mxvfh7);
+	assign Mxvfh7 = (~(Sxvfh7 & Yxvfh7));
+	assign Sxvfh7 = (~(Eyvfh7 ^ E4sfh7));
+	assign Gxvfh7 = (~(Kyvfh7 & Qyvfh7));
+	assign Kyvfh7 = (Wyvfh7 ^ Czvfh7);
+	assign Uwvfh7 = (Izvfh7 & Ozvfh7);
+	assign Ozvfh7 = (~(Uzvfh7 & A0wfh7));
+	assign Izvfh7 = (~(G0wfh7 & M0wfh7));
+	assign Iwvfh7 = (S0wfh7 & Y0wfh7);
+	assign S0wfh7 = (E1wfh7 & K1wfh7);
+	assign K1wfh7 = (Q1wfh7 | Iz1gh7);
+	assign E1wfh7 = (~(stdio_rx_tdata[0] & W1wfh7));
+	assign Onvfh7 = (~(Uyrfh7 & C2wfh7));
+	assign Q7sfh7 = (I2wfh7 & O2wfh7);
+	assign O2wfh7 = (~(U2wfh7 & A3wfh7));
+	assign A3wfh7 = (G3wfh7 & M3wfh7);
+	assign M3wfh7 = (S3wfh7 & Y3wfh7);
+	assign Y3wfh7 = (E4wfh7 & K4wfh7);
+	assign S3wfh7 = (Q4wfh7 & W4wfh7);
+	assign W4wfh7 = (C5wfh7 | I5wfh7);
+	assign C5wfh7 = (G2sfh7 ? U5wfh7 : O5wfh7);
+	assign U5wfh7 = (~(O5wfh7 & A6wfh7));
+	assign O5wfh7 = (B2sfh7 & G6wfh7);
+	assign Q4wfh7 = (M6wfh7 | S6wfh7);
+	assign M6wfh7 = (X0sfh7 ? E7wfh7 : Y6wfh7);
+	assign E7wfh7 = (~(Y6wfh7 & K7wfh7));
+	assign Y6wfh7 = (Pyrfh7 & Q7wfh7);
+	assign G3wfh7 = (W7wfh7 & C8wfh7);
+	assign C8wfh7 = (~(Wvvfh7 & I8wfh7));
+	assign I8wfh7 = (~(O8wfh7 & U8wfh7));
+	assign U8wfh7 = (~(A9wfh7 & Gfvfh7));
+	assign A9wfh7 = (!G9wfh7);
+	assign O8wfh7 = (~(M9wfh7 & Qdvfh7));
+	assign W7wfh7 = (S9wfh7 & Y9wfh7);
+	assign Y9wfh7 = (~(Auvfh7 & Eawfh7));
+	assign Eawfh7 = (~(Kawfh7 & Qawfh7));
+	assign Qawfh7 = (~(Wawfh7 & Mlvfh7));
+	assign Wawfh7 = (!Cbwfh7);
+	assign Kawfh7 = (~(Ibwfh7 & Wjvfh7));
+	assign S9wfh7 = (~(Evvfh7 & Obwfh7));
+	assign Obwfh7 = (~(Ubwfh7 & Acwfh7));
+	assign Acwfh7 = (~(Gcwfh7 & O2vfh7));
+	assign Gcwfh7 = (!Mcwfh7);
+	assign Ubwfh7 = (~(Scwfh7 & Y0vfh7));
+	assign U2wfh7 = (Ycwfh7 & Edwfh7);
+	assign Edwfh7 = (Kdwfh7 & Qdwfh7);
+	assign Qdwfh7 = (Wdwfh7 & Cewfh7);
+	assign Cewfh7 = (~(Yxvfh7 & Iewfh7));
+	assign Iewfh7 = (~(Oewfh7 & Uewfh7));
+	assign Uewfh7 = (~(Afwfh7 & U8vfh7));
+	assign Afwfh7 = (!Gfwfh7);
+	assign Oewfh7 = (~(Mfwfh7 & E7vfh7));
+	assign Wdwfh7 = (Sfwfh7 | Yfwfh7);
+	assign Sfwfh7 = (V2sfh7 ? Kgwfh7 : Egwfh7);
+	assign Kgwfh7 = (~(Egwfh7 & Qgwfh7));
+	assign Egwfh7 = (Kyrfh7 & Wgwfh7);
+	assign Kdwfh7 = (Chwfh7 & Ihwfh7);
+	assign Ihwfh7 = (Q1wfh7 | Qy1gh7);
+	assign Chwfh7 = (~(stdio_rx_tdata[1] & W1wfh7));
+	assign Ycwfh7 = (Ohwfh7 & Uhwfh7);
+	assign Uhwfh7 = (A0wfh7 ? Giwfh7 : Aiwfh7);
+	assign Giwfh7 = (~(R1sfh7 & Miwfh7));
+	assign Aiwfh7 = (!Uzvfh7);
+	assign Ohwfh7 = (Siwfh7 & Yiwfh7);
+	assign I2wfh7 = (~(Zyrfh7 & C2wfh7));
+	assign L7sfh7 = (Ejwfh7 & Kjwfh7);
+	assign Kjwfh7 = (~(Qjwfh7 & Wjwfh7));
+	assign Wjwfh7 = (Ckwfh7 & Ikwfh7);
+	assign Ikwfh7 = (Okwfh7 & Ukwfh7);
+	assign Ukwfh7 = (Alwfh7 & Kpvfh7);
+	assign Alwfh7 = (~(Glwfh7 & Ctvfh7));
+	assign Glwfh7 = (Mlwfh7 & K7wfh7);
+	assign Mlwfh7 = (~(Pyrfh7 & X0sfh7));
+	assign Okwfh7 = (Slwfh7 & Ylwfh7);
+	assign Ylwfh7 = (~(Emwfh7 & Grvfh7));
+	assign Emwfh7 = (Kmwfh7 & A6wfh7);
+	assign Kmwfh7 = (~(B2sfh7 & G2sfh7));
+	assign Slwfh7 = (~(Qmwfh7 & Qyvfh7));
+	assign Qmwfh7 = (Wmwfh7 & Qgwfh7);
+	assign Wmwfh7 = (~(Kyrfh7 & V2sfh7));
+	assign Ckwfh7 = (Cnwfh7 & Inwfh7);
+	assign Inwfh7 = (Onwfh7 & Unwfh7);
+	assign Onwfh7 = (~(Aowfh7 & Evvfh7));
+	assign Aowfh7 = (Mcwfh7 & O2vfh7);
+	assign O2vfh7 = (!U3sfh7);
+	assign Mcwfh7 = (Scwfh7 | Y0vfh7);
+	assign Y0vfh7 = (!P3sfh7);
+	assign Scwfh7 = (~(K3sfh7 & E4vfh7));
+	assign Cnwfh7 = (Gowfh7 & Mowfh7);
+	assign Mowfh7 = (~(Sowfh7 & Yxvfh7));
+	assign Sowfh7 = (Gfwfh7 & U8vfh7);
+	assign U8vfh7 = (!O4sfh7);
+	assign Gfwfh7 = (Mfwfh7 | E7vfh7);
+	assign E7vfh7 = (!J4sfh7);
+	assign Mfwfh7 = (~(E4sfh7 & Kavfh7));
+	assign Gowfh7 = (~(Yowfh7 & Wvvfh7));
+	assign Yowfh7 = (G9wfh7 & Gfvfh7);
+	assign Gfvfh7 = (!I5sfh7);
+	assign G9wfh7 = (M9wfh7 | Qdvfh7);
+	assign Qdvfh7 = (!D5sfh7);
+	assign M9wfh7 = (~(Y4sfh7 & Wgvfh7));
+	assign Qjwfh7 = (Epwfh7 & Kpwfh7);
+	assign Kpwfh7 = (Qpwfh7 & Wpwfh7);
+	assign Wpwfh7 = (Cqwfh7 & Iqwfh7);
+	assign Iqwfh7 = (~(Oqwfh7 & Auvfh7));
+	assign Oqwfh7 = (Cbwfh7 & Mlvfh7);
+	assign Mlvfh7 = (!C6sfh7);
+	assign Cbwfh7 = (Ibwfh7 | Wjvfh7);
+	assign Wjvfh7 = (!X5sfh7);
+	assign Ibwfh7 = (~(S5sfh7 & Invfh7));
+	assign Cqwfh7 = (~(Uqwfh7 & Q2sfh7));
+	assign Uqwfh7 = (Grvfh7 & A6wfh7);
+	assign Qpwfh7 = (Arwfh7 & Grwfh7);
+	assign Grwfh7 = (~(Mrwfh7 & H1sfh7));
+	assign Mrwfh7 = (Ctvfh7 & K7wfh7);
+	assign Arwfh7 = (~(Srwfh7 & F3sfh7));
+	assign Srwfh7 = (Qyvfh7 & Qgwfh7);
+	assign Epwfh7 = (Yrwfh7 & Eswfh7);
+	assign Eswfh7 = (Kswfh7 & Qswfh7);
+	assign Qswfh7 = (~(W1sfh7 & Miwfh7));
+	assign Kswfh7 = (Q1wfh7 | C82gh7);
+	assign Yrwfh7 = (Wswfh7 & Ctwfh7);
+	assign Ctwfh7 = (~(stdio_rx_tdata[2] & W1wfh7));
+	assign Ejwfh7 = (~(Ezrfh7 & C2wfh7));
+	assign G7sfh7 = (Itwfh7 & Otwfh7);
+	assign Otwfh7 = (~(Utwfh7 & Auwfh7));
+	assign Auwfh7 = (Guwfh7 & Muwfh7);
+	assign Muwfh7 = (Suwfh7 & Yuwfh7);
+	assign Yuwfh7 = (Evwfh7 & Kvwfh7);
+	assign Evwfh7 = (~(Qvwfh7 & Wvwfh7));
+	assign Wvwfh7 = (G2sfh7 & G6wfh7);
+	assign Qvwfh7 = (Grvfh7 & L2sfh7);
+	assign Suwfh7 = (Cwwfh7 & Iwwfh7);
+	assign Iwwfh7 = (~(Owwfh7 & Uwwfh7));
+	assign Uwwfh7 = (Oqvfh7 & Axwfh7);
+	assign Owwfh7 = (R1sfh7 & Ozrfh7);
+	assign Cwwfh7 = (~(Gxwfh7 & Mxwfh7));
+	assign Mxwfh7 = (X0sfh7 & Q7wfh7);
+	assign Gxwfh7 = (Ctvfh7 & C1sfh7);
+	assign Guwfh7 = (Sxwfh7 & Yxwfh7);
+	assign Yxwfh7 = (~(Eywfh7 & Kywfh7));
+	assign Kywfh7 = (D5sfh7 & Wgvfh7);
+	assign Eywfh7 = (Wvvfh7 & I5sfh7);
+	assign Sxwfh7 = (Qywfh7 & Wywfh7);
+	assign Wywfh7 = (~(Czwfh7 & Izwfh7));
+	assign Izwfh7 = (X5sfh7 & Invfh7);
+	assign Czwfh7 = (Auvfh7 & C6sfh7);
+	assign Qywfh7 = (~(Ozwfh7 & Uzwfh7));
+	assign Uzwfh7 = (P3sfh7 & E4vfh7);
+	assign Ozwfh7 = (Evvfh7 & U3sfh7);
+	assign Utwfh7 = (A0xfh7 & G0xfh7);
+	assign G0xfh7 = (M0xfh7 & S0xfh7);
+	assign S0xfh7 = (Q1wfh7 | Wy1gh7);
+	assign M0xfh7 = (Y0xfh7 & E1xfh7);
+	assign E1xfh7 = (~(K1xfh7 & Q1xfh7));
+	assign Q1xfh7 = (J4sfh7 & Kavfh7);
+	assign K1xfh7 = (Yxvfh7 & O4sfh7);
+	assign Y0xfh7 = (~(W1xfh7 & C2xfh7));
+	assign C2xfh7 = (V2sfh7 & Wgwfh7);
+	assign W1xfh7 = (Qyvfh7 & A3sfh7);
+	assign A0xfh7 = (I2xfh7 & Wswfh7);
+	assign Wswfh7 = (O2xfh7 & U2xfh7);
+	assign O2xfh7 = (A3xfh7 & Qpvfh7);
+	assign I2xfh7 = (Siwfh7 & G3xfh7);
+	assign G3xfh7 = (~(stdio_rx_tdata[3] & W1wfh7));
+	assign Siwfh7 = (M3xfh7 & S3xfh7);
+	assign S3xfh7 = (Y3xfh7 & M0wfh7);
+	assign M3xfh7 = (E4xfh7 & K4xfh7);
+	assign Itwfh7 = (~(Jzrfh7 & C2wfh7));
+	assign B7sfh7 = (Q4xfh7 & W4xfh7);
+	assign W4xfh7 = (~(C5xfh7 & I5xfh7));
+	assign I5xfh7 = (O5xfh7 & U5xfh7);
+	assign U5xfh7 = (A6xfh7 & G6xfh7);
+	assign G6xfh7 = (M6xfh7 & Kpvfh7);
+	assign M6xfh7 = (S6xfh7 & K4wfh7);
+	assign A6xfh7 = (Kvwfh7 & Y6xfh7);
+	assign O5xfh7 = (E7xfh7 & K7xfh7);
+	assign K7xfh7 = (Q7xfh7 & A3xfh7);
+	assign Q7xfh7 = (W7xfh7 | Uqvfh7);
+	assign Uqvfh7 = (Axwfh7 & C8xfh7);
+	assign C8xfh7 = (~(R1sfh7 & Ozrfh7));
+	assign E7xfh7 = (I8xfh7 & O8xfh7);
+	assign O8xfh7 = (~(Evvfh7 & U8xfh7));
+	assign U8xfh7 = (!Kvvfh7);
+	assign I8xfh7 = (~(Yxvfh7 & A9xfh7));
+	assign A9xfh7 = (!Eyvfh7);
+	assign C5xfh7 = (G9xfh7 & M9xfh7);
+	assign M9xfh7 = (S9xfh7 & Y9xfh7);
+	assign Y9xfh7 = (Eaxfh7 & Kaxfh7);
+	assign Kaxfh7 = (~(Wvvfh7 & Qaxfh7));
+	assign Qaxfh7 = (!Cwvfh7);
+	assign Eaxfh7 = (~(Auvfh7 & Waxfh7));
+	assign Waxfh7 = (!Guvfh7);
+	assign S9xfh7 = (Cbxfh7 & Ibxfh7);
+	assign Ibxfh7 = (I5wfh7 | Mrvfh7);
+	assign Cbxfh7 = (Yfwfh7 | Wyvfh7);
+	assign G9xfh7 = (Obxfh7 & Ubxfh7);
+	assign Ubxfh7 = (Acxfh7 & Gcxfh7);
+	assign Gcxfh7 = (S6wfh7 | Itvfh7);
+	assign Acxfh7 = (Q1wfh7 | Cz1gh7);
+	assign Obxfh7 = (U2xfh7 & Mcxfh7);
+	assign Mcxfh7 = (~(stdio_rx_tdata[4] & W1wfh7));
+	assign Q4xfh7 = (~(Tzrfh7 & C2wfh7));
+	assign W6sfh7 = (Scxfh7 & Ycxfh7);
+	assign Ycxfh7 = (~(Edxfh7 & Kdxfh7));
+	assign Kdxfh7 = (Qdxfh7 & Wdxfh7);
+	assign Wdxfh7 = (Cexfh7 & W7xfh7);
+	assign Cexfh7 = (S6wfh7 & Iexfh7);
+	assign Qdxfh7 = (Kpvfh7 & I5wfh7);
+	assign Edxfh7 = (Oexfh7 & Uexfh7);
+	assign Uexfh7 = (Afxfh7 & Gfxfh7);
+	assign Gfxfh7 = (~(stdio_rx_tdata[5] & W1wfh7));
+	assign Afxfh7 = (Mfxfh7 & Sfxfh7);
+	assign Mfxfh7 = (~(Yfxfh7 & G0wfh7));
+	assign Yfxfh7 = (A3xfh7 & M0wfh7);
+	assign Oexfh7 = (U2xfh7 & Egxfh7);
+	assign U2xfh7 = (Kgxfh7 & Qgxfh7);
+	assign Kgxfh7 = (E4wfh7 & Wgxfh7);
+	assign Scxfh7 = (~(Yzrfh7 & C2wfh7));
+	assign R6sfh7 = (Chxfh7 & Ihxfh7);
+	assign Ihxfh7 = (~(Ohxfh7 & Uhxfh7));
+	assign Uhxfh7 = (Aixfh7 & Gixfh7);
+	assign Gixfh7 = (Mixfh7 & Sixfh7);
+	assign Sixfh7 = (Kvwfh7 & K4wfh7);
+	assign Mixfh7 = (Yixfh7 & Unwfh7);
+	assign Unwfh7 = (~(Ejxfh7 & Miwfh7));
+	assign Ejxfh7 = (Kjxfh7 & Axwfh7);
+	assign Kjxfh7 = (~(R1sfh7 & M1sfh7));
+	assign Yixfh7 = (~(Itvfh7 & Ctvfh7));
+	assign Ctvfh7 = (!S6wfh7);
+	assign Itvfh7 = (Qjxfh7 & Q7wfh7);
+	assign Qjxfh7 = (~(C1sfh7 & X0sfh7));
+	assign Aixfh7 = (Wjxfh7 & Ckxfh7);
+	assign Ckxfh7 = (~(Uzvfh7 & Axwfh7));
+	assign Uzvfh7 = (Oqvfh7 & Ikxfh7);
+	assign Wjxfh7 = (Okxfh7 & Ukxfh7);
+	assign Ukxfh7 = (~(Mrvfh7 & Grvfh7));
+	assign Grvfh7 = (!I5wfh7);
+	assign Mrvfh7 = (Alxfh7 & G6wfh7);
+	assign Alxfh7 = (~(L2sfh7 & G2sfh7));
+	assign Okxfh7 = (~(Wyvfh7 & Qyvfh7));
+	assign Qyvfh7 = (!Yfwfh7);
+	assign Wyvfh7 = (Glxfh7 & Wgwfh7);
+	assign Glxfh7 = (~(A3sfh7 & V2sfh7));
+	assign Ohxfh7 = (Mlxfh7 & Slxfh7);
+	assign Slxfh7 = (Ylxfh7 & Emxfh7);
+	assign Emxfh7 = (Kmxfh7 & Qmxfh7);
+	assign Qmxfh7 = (~(Evvfh7 & Kvvfh7));
+	assign Kvvfh7 = (Wmxfh7 & E4vfh7);
+	assign E4vfh7 = (!Z3sfh7);
+	assign Wmxfh7 = (~(U3sfh7 & P3sfh7));
+	assign Kmxfh7 = (~(Yxvfh7 & Eyvfh7));
+	assign Eyvfh7 = (Cnxfh7 & Kavfh7);
+	assign Kavfh7 = (!T4sfh7);
+	assign Cnxfh7 = (~(O4sfh7 & J4sfh7));
+	assign Yxvfh7 = (!Inxfh7);
+	assign Ylxfh7 = (Onxfh7 & Unxfh7);
+	assign Unxfh7 = (~(Wvvfh7 & Cwvfh7));
+	assign Cwvfh7 = (Aoxfh7 & Wgvfh7);
+	assign Wgvfh7 = (!N5sfh7);
+	assign Aoxfh7 = (~(I5sfh7 & D5sfh7));
+	assign Onxfh7 = (~(Auvfh7 & Guvfh7));
+	assign Guvfh7 = (Goxfh7 & Invfh7);
+	assign Invfh7 = (!H6sfh7);
+	assign Goxfh7 = (~(C6sfh7 & X5sfh7));
+	assign Auvfh7 = (!Moxfh7);
+	assign Mlxfh7 = (Soxfh7 & Y0wfh7);
+	assign Y0wfh7 = (Yoxfh7 & Yiwfh7);
+	assign Yiwfh7 = (Epxfh7 & Qgxfh7);
+	assign Epxfh7 = (S6xfh7 & Czufh7);
+	assign Yoxfh7 = (Kpxfh7 & A3xfh7);
+	assign Kpxfh7 = (~(Miwfh7 & A0wfh7));
+	assign A0wfh7 = (~(Qpxfh7 | W1sfh7));
+	assign Miwfh7 = (~(W7xfh7 | Ozrfh7));
+	assign Soxfh7 = (Wpxfh7 & Cqxfh7);
+	assign Cqxfh7 = (Q1wfh7 | Oz1gh7);
+	assign Wpxfh7 = (~(stdio_rx_tdata[6] & W1wfh7));
+	assign Chxfh7 = (~(D0sfh7 & C2wfh7));
+	assign M6sfh7 = (C2wfh7 ? com_tx_tdata[7] : Iqxfh7);
+	assign C2wfh7 = (!Qgxfh7);
+	assign Qgxfh7 = (Wpsfh7 & Oqxfh7);
+	assign Oqxfh7 = (~(Uqxfh7 & Arxfh7));
+	assign Arxfh7 = (~(Grxfh7 & Mrxfh7));
+	assign Mrxfh7 = (~(Srxfh7 & Yrxfh7));
+	assign Iqxfh7 = (stdio_rx_tdata[7] & W1wfh7);
+	assign S0sfh7 = (~(Esxfh7 & Ksxfh7));
+	assign Esxfh7 = (Qsxfh7 & Wsxfh7);
+	assign N0sfh7 = (ahb_hready ? ahb_htrans[1] : Ctxfh7);
+	assign I0sfh7 = (~(Itxfh7 | W72gh7));
+	assign Itxfh7 = (~(Otxfh7 | A3xfh7));
+	assign Qpsfh7 = (~(Utxfh7 & Auxfh7));
+	assign Auxfh7 = (~(stdio_tx_tdata[7] & Guxfh7));
+	assign Utxfh7 = (Muxfh7 & Suxfh7);
+	assign Suxfh7 = (~(Yuxfh7 & com_rx_tdata[7]));
+	assign Muxfh7 = (~(Evxfh7 & Ottfh7));
+	assign Kpsfh7 = (~(Kvxfh7 & Qvxfh7));
+	assign Qvxfh7 = (~(stdio_tx_tdata[6] & Guxfh7));
+	assign Kvxfh7 = (Wvxfh7 & Cwxfh7);
+	assign Cwxfh7 = (~(Yuxfh7 & com_rx_tdata[6]));
+	assign Wvxfh7 = (~(Evxfh7 & Yutfh7));
+	assign Epsfh7 = (~(Iwxfh7 & Owxfh7));
+	assign Owxfh7 = (~(stdio_tx_tdata[5] & Guxfh7));
+	assign Iwxfh7 = (Uwxfh7 & Axxfh7);
+	assign Axxfh7 = (~(Yuxfh7 & com_rx_tdata[5]));
+	assign Uwxfh7 = (~(Evxfh7 & Iwtfh7));
+	assign Yosfh7 = (~(Gxxfh7 & Mxxfh7));
+	assign Mxxfh7 = (~(stdio_tx_tdata[4] & Guxfh7));
+	assign Gxxfh7 = (Sxxfh7 & Yxxfh7);
+	assign Yxxfh7 = (~(Yuxfh7 & com_rx_tdata[4]));
+	assign Sxxfh7 = (~(Evxfh7 & Sxtfh7));
+	assign Sosfh7 = (~(Eyxfh7 & Kyxfh7));
+	assign Kyxfh7 = (~(stdio_tx_tdata[3] & Guxfh7));
+	assign Eyxfh7 = (Qyxfh7 & Wyxfh7);
+	assign Wyxfh7 = (~(Yuxfh7 & com_rx_tdata[3]));
+	assign Qyxfh7 = (~(Evxfh7 & Cztfh7));
+	assign Mosfh7 = (~(Czxfh7 & Izxfh7));
+	assign Izxfh7 = (~(stdio_tx_tdata[2] & Guxfh7));
+	assign Czxfh7 = (Ozxfh7 & Uzxfh7);
+	assign Uzxfh7 = (~(Yuxfh7 & com_rx_tdata[2]));
+	assign Ozxfh7 = (~(Evxfh7 & M0ufh7));
+	assign Gosfh7 = (~(A0yfh7 & G0yfh7));
+	assign G0yfh7 = (~(stdio_tx_tdata[1] & Guxfh7));
+	assign A0yfh7 = (M0yfh7 & S0yfh7);
+	assign S0yfh7 = (~(Yuxfh7 & com_rx_tdata[1]));
+	assign M0yfh7 = (~(Evxfh7 & W1ufh7));
+	assign Aosfh7 = (~(Y0yfh7 & E1yfh7));
+	assign E1yfh7 = (~(stdio_tx_tdata[0] & Guxfh7));
+	assign Y0yfh7 = (K1yfh7 & Q1yfh7);
+	assign Q1yfh7 = (~(Yuxfh7 & com_rx_tdata[0]));
+	assign Yuxfh7 = (~(Guxfh7 | Y3xfh7));
+	assign K1yfh7 = (~(Evxfh7 & Q1tfh7));
+	assign Evxfh7 = (~(Guxfh7 | K4xfh7));
+	assign Guxfh7 = (~(W1yfh7 & stdio_tx_tready));
+	assign W1yfh7 = (Wpsfh7 & C2yfh7);
+	assign C2yfh7 = (~(I2yfh7 & K4xfh7));
+	assign I2yfh7 = (~(O2yfh7 & U2yfh7));
+	assign Unsfh7 = (~(A3yfh7 & G3yfh7));
+	assign G3yfh7 = (~(S0vfh7 & Wgwfh7));
+	assign Wgwfh7 = (!F3sfh7);
+	assign A3yfh7 = (M3yfh7 & S3yfh7);
+	assign S3yfh7 = (Y3yfh7 | Su1gh7);
+	assign M3yfh7 = (~(ahb_hrdata[15] & Eyufh7));
+	assign Onsfh7 = (~(E4yfh7 & K4yfh7));
+	assign K4yfh7 = (~(S0vfh7 & Qgwfh7));
+	assign Qgwfh7 = (!A3sfh7);
+	assign E4yfh7 = (Q4yfh7 & W4yfh7);
+	assign W4yfh7 = (Y3yfh7 | Mu1gh7);
+	assign Q4yfh7 = (~(ahb_hrdata[14] & Eyufh7));
+	assign Insfh7 = (~(C5yfh7 & I5yfh7));
+	assign I5yfh7 = (Wyufh7 | V2sfh7);
+	assign C5yfh7 = (O5yfh7 & U5yfh7);
+	assign U5yfh7 = (Y3yfh7 | Gu1gh7);
+	assign O5yfh7 = (~(ahb_hrdata[13] & Eyufh7));
+	assign Cnsfh7 = (~(A6yfh7 & G6yfh7));
+	assign G6yfh7 = (~(S0vfh7 & Czvfh7));
+	assign Czvfh7 = (!Kyrfh7);
+	assign A6yfh7 = (M6yfh7 & S6yfh7);
+	assign S6yfh7 = (Y3yfh7 | Au1gh7);
+	assign M6yfh7 = (~(ahb_hrdata[12] & Eyufh7));
+	assign Wmsfh7 = (~(Y6yfh7 & E7yfh7));
+	assign E7yfh7 = (~(S0vfh7 & G6wfh7));
+	assign G6wfh7 = (!Q2sfh7);
+	assign Y6yfh7 = (K7yfh7 & Q7yfh7);
+	assign Q7yfh7 = (Y3yfh7 | Ut1gh7);
+	assign K7yfh7 = (~(ahb_hrdata[11] & Eyufh7));
+	assign Qmsfh7 = (~(W7yfh7 & C8yfh7));
+	assign C8yfh7 = (~(S0vfh7 & A6wfh7));
+	assign A6wfh7 = (!L2sfh7);
+	assign W7yfh7 = (I8yfh7 & O8yfh7);
+	assign O8yfh7 = (Y3yfh7 | Ot1gh7);
+	assign I8yfh7 = (~(ahb_hrdata[10] & Eyufh7));
+	assign Kmsfh7 = (~(U8yfh7 & A9yfh7));
+	assign A9yfh7 = (Wyufh7 | G2sfh7);
+	assign U8yfh7 = (G9yfh7 & M9yfh7);
+	assign M9yfh7 = (Y3yfh7 | It1gh7);
+	assign G9yfh7 = (~(ahb_hrdata[9] & Eyufh7));
+	assign Emsfh7 = (~(S9yfh7 & Y9yfh7));
+	assign Y9yfh7 = (~(S0vfh7 & Srvfh7));
+	assign Srvfh7 = (!B2sfh7);
+	assign S9yfh7 = (Eayfh7 & Kayfh7);
+	assign Kayfh7 = (Y3yfh7 | Ct1gh7);
+	assign Eayfh7 = (~(ahb_hrdata[8] & Eyufh7));
+	assign Ylsfh7 = (~(Qayfh7 & Wayfh7));
+	assign Wayfh7 = (~(S0vfh7 & Axwfh7));
+	assign Axwfh7 = (!W1sfh7);
+	assign Qayfh7 = (Cbyfh7 & Ibyfh7);
+	assign Ibyfh7 = (~(Obyfh7 & Ottfh7));
+	assign Cbyfh7 = (~(ahb_hrdata[7] & Eyufh7));
+	assign Slsfh7 = (~(Ubyfh7 & Acyfh7));
+	assign Acyfh7 = (Wyufh7 | Ozrfh7);
+	assign Ubyfh7 = (Gcyfh7 & Mcyfh7);
+	assign Mcyfh7 = (~(Obyfh7 & Yutfh7));
+	assign Gcyfh7 = (~(ahb_hrdata[6] & Eyufh7));
+	assign Mlsfh7 = (~(Scyfh7 & Ycyfh7));
+	assign Ycyfh7 = (~(S0vfh7 & Ikxfh7));
+	assign Ikxfh7 = (!R1sfh7);
+	assign Scyfh7 = (Edyfh7 & Kdyfh7);
+	assign Kdyfh7 = (~(Obyfh7 & Iwtfh7));
+	assign Edyfh7 = (~(ahb_hrdata[5] & Eyufh7));
+	assign Glsfh7 = (~(Qdyfh7 & Wdyfh7));
+	assign Wdyfh7 = (~(S0vfh7 & Qpxfh7));
+	assign Qpxfh7 = (!M1sfh7);
+	assign Qdyfh7 = (Ceyfh7 & Ieyfh7);
+	assign Ieyfh7 = (~(Obyfh7 & Sxtfh7));
+	assign Ceyfh7 = (~(ahb_hrdata[4] & Eyufh7));
+	assign Alsfh7 = (~(Oeyfh7 & Ueyfh7));
+	assign Ueyfh7 = (~(S0vfh7 & Q7wfh7));
+	assign Q7wfh7 = (!H1sfh7);
+	assign Oeyfh7 = (Afyfh7 & Gfyfh7);
+	assign Gfyfh7 = (~(Obyfh7 & Cztfh7));
+	assign Afyfh7 = (~(ahb_hrdata[3] & Eyufh7));
+	assign Uksfh7 = (~(Mfyfh7 & Sfyfh7));
+	assign Sfyfh7 = (~(S0vfh7 & K7wfh7));
+	assign K7wfh7 = (!C1sfh7);
+	assign Mfyfh7 = (Yfyfh7 & Egyfh7);
+	assign Egyfh7 = (~(Obyfh7 & M0ufh7));
+	assign Yfyfh7 = (~(ahb_hrdata[2] & Eyufh7));
+	assign Oksfh7 = (~(Kgyfh7 & Qgyfh7));
+	assign Qgyfh7 = (Wyufh7 | X0sfh7);
+	assign Kgyfh7 = (Wgyfh7 & Chyfh7);
+	assign Chyfh7 = (~(Obyfh7 & W1ufh7));
+	assign Wgyfh7 = (~(ahb_hrdata[1] & Eyufh7));
+	assign Iksfh7 = (~(Ihyfh7 & Ohyfh7));
+	assign Ohyfh7 = (~(S0vfh7 & Otvfh7));
+	assign Otvfh7 = (!Pyrfh7);
+	assign Ihyfh7 = (Uhyfh7 & Aiyfh7);
+	assign Aiyfh7 = (~(Obyfh7 & Q1tfh7));
+	assign Obyfh7 = (~(Y3yfh7 & Giyfh7));
+	assign Giyfh7 = (~(Miyfh7 & Wyufh7));
+	assign Y3yfh7 = (Czufh7 & Qmvfh7);
+	assign Qmvfh7 = (~(Siyfh7 & Wyufh7));
+	assign Wyufh7 = (!S0vfh7);
+	assign Siyfh7 = (~(M0wfh7 & Q1wfh7));
+	assign Uhyfh7 = (~(ahb_hrdata[0] & Eyufh7));
+	assign Eyufh7 = (~(K4wfh7 | S0vfh7));
+	assign S0vfh7 = (Yiyfh7 & Wsxfh7);
+	assign ahb_htrans[1] = (~(Ctxfh7 | K72gh7));
+	assign Ctxfh7 = (!G92gh7);
+	assign Xzpfh7 = (~(Ejyfh7 & Kjyfh7));
+	assign Kjyfh7 = (~(Qjyfh7 & Yxsfh7));
+	assign Ejyfh7 = (~(Qbrfh7 & Wjyfh7));
+	assign O0qfh7 = (~(Ckyfh7 & Ikyfh7));
+	assign Ikyfh7 = (~(Qjyfh7 & G3tfh7));
+	assign Ckyfh7 = (~(Gcrfh7 & Wjyfh7));
+	assign F1qfh7 = (~(Okyfh7 & Ukyfh7));
+	assign Ukyfh7 = (~(Qjyfh7 & W4tfh7));
+	assign Okyfh7 = (~(Wcrfh7 & Wjyfh7));
+	assign W1qfh7 = (~(Alyfh7 & Glyfh7));
+	assign Glyfh7 = (~(Qjyfh7 & M6tfh7));
+	assign Alyfh7 = (~(Mdrfh7 & Wjyfh7));
+	assign N2qfh7 = (~(Mlyfh7 & Slyfh7));
+	assign Slyfh7 = (~(Qjyfh7 & Axsfh7));
+	assign Mlyfh7 = (~(Cerfh7 & Wjyfh7));
+	assign E3qfh7 = (~(Ylyfh7 & Emyfh7));
+	assign Emyfh7 = (~(Qjyfh7 & O2tfh7));
+	assign Ylyfh7 = (~(Serfh7 & Wjyfh7));
+	assign V3qfh7 = (~(Kmyfh7 & Qmyfh7));
+	assign Qmyfh7 = (~(Qjyfh7 & E4tfh7));
+	assign Kmyfh7 = (~(Ifrfh7 & Wjyfh7));
+	assign M4qfh7 = (~(Wmyfh7 & Cnyfh7));
+	assign Cnyfh7 = (~(Qjyfh7 & U5tfh7));
+	assign Wmyfh7 = (~(Yfrfh7 & Wjyfh7));
+	assign D5qfh7 = (~(Inyfh7 & Onyfh7));
+	assign Onyfh7 = (~(Qjyfh7 & K7tfh7));
+	assign Inyfh7 = (~(Ogrfh7 & Wjyfh7));
+	assign U5qfh7 = (~(Unyfh7 & Aoyfh7));
+	assign Aoyfh7 = (~(Qjyfh7 & U8tfh7));
+	assign Unyfh7 = (~(Ehrfh7 & Wjyfh7));
+	assign L6qfh7 = (~(Goyfh7 & Moyfh7));
+	assign Moyfh7 = (~(Qjyfh7 & Eatfh7));
+	assign Goyfh7 = (~(Uhrfh7 & Wjyfh7));
+	assign C7qfh7 = (~(Soyfh7 & Yoyfh7));
+	assign Yoyfh7 = (~(Qjyfh7 & Obtfh7));
+	assign Soyfh7 = (~(Kirfh7 & Wjyfh7));
+	assign T7qfh7 = (~(Epyfh7 & Kpyfh7));
+	assign Kpyfh7 = (~(Qjyfh7 & Yctfh7));
+	assign Epyfh7 = (~(Ajrfh7 & Wjyfh7));
+	assign K8qfh7 = (~(Qpyfh7 & Wpyfh7));
+	assign Wpyfh7 = (~(Qjyfh7 & Ietfh7));
+	assign Qpyfh7 = (~(Qjrfh7 & Wjyfh7));
+	assign B9qfh7 = (~(Cqyfh7 & Iqyfh7));
+	assign Iqyfh7 = (~(Qjyfh7 & Sftfh7));
+	assign Cqyfh7 = (~(Gkrfh7 & Wjyfh7));
+	assign S9qfh7 = (~(Oqyfh7 & Uqyfh7));
+	assign Uqyfh7 = (~(Qjyfh7 & Chtfh7));
+	assign Oqyfh7 = (~(Wkrfh7 & Wjyfh7));
+	assign Jaqfh7 = (~(Aryfh7 & Gryfh7));
+	assign Gryfh7 = (~(Qjyfh7 & Mitfh7));
+	assign Aryfh7 = (~(Mlrfh7 & Wjyfh7));
+	assign Abqfh7 = (~(Mryfh7 & Sryfh7));
+	assign Sryfh7 = (~(Qjyfh7 & Wjtfh7));
+	assign Mryfh7 = (~(Cmrfh7 & Wjyfh7));
+	assign Rbqfh7 = (~(Yryfh7 & Esyfh7));
+	assign Esyfh7 = (~(Qjyfh7 & Gltfh7));
+	assign Yryfh7 = (~(Smrfh7 & Wjyfh7));
+	assign Icqfh7 = (~(Ksyfh7 & Qsyfh7));
+	assign Qsyfh7 = (~(Qjyfh7 & Qmtfh7));
+	assign Ksyfh7 = (~(Inrfh7 & Wjyfh7));
+	assign Zcqfh7 = (~(Wsyfh7 & Ctyfh7));
+	assign Ctyfh7 = (~(Qjyfh7 & Aotfh7));
+	assign Wsyfh7 = (~(Ynrfh7 & Wjyfh7));
+	assign Qdqfh7 = (~(Ityfh7 & Otyfh7));
+	assign Otyfh7 = (~(Qjyfh7 & Kptfh7));
+	assign Ityfh7 = (~(Oorfh7 & Wjyfh7));
+	assign Heqfh7 = (~(Utyfh7 & Auyfh7));
+	assign Auyfh7 = (~(Qjyfh7 & Uqtfh7));
+	assign Utyfh7 = (~(Eprfh7 & Wjyfh7));
+	assign Yeqfh7 = (~(Guyfh7 & Muyfh7));
+	assign Muyfh7 = (~(Qjyfh7 & Estfh7));
+	assign Guyfh7 = (~(Uprfh7 & Wjyfh7));
+	assign Pfqfh7 = (~(Suyfh7 & Yuyfh7));
+	assign Yuyfh7 = (~(Qjyfh7 & Ottfh7));
+	assign Suyfh7 = (~(Kqrfh7 & Wjyfh7));
+	assign Ggqfh7 = (~(Evyfh7 & Kvyfh7));
+	assign Kvyfh7 = (~(Qjyfh7 & Yutfh7));
+	assign Evyfh7 = (~(Arrfh7 & Wjyfh7));
+	assign Xgqfh7 = (~(Qvyfh7 & Wvyfh7));
+	assign Wvyfh7 = (~(Qjyfh7 & Iwtfh7));
+	assign Qvyfh7 = (~(Qrrfh7 & Wjyfh7));
+	assign Ohqfh7 = (~(Cwyfh7 & Iwyfh7));
+	assign Iwyfh7 = (~(Qjyfh7 & Sxtfh7));
+	assign Cwyfh7 = (~(Gsrfh7 & Wjyfh7));
+	assign Fiqfh7 = (~(Owyfh7 & Uwyfh7));
+	assign Uwyfh7 = (~(Qjyfh7 & Cztfh7));
+	assign Owyfh7 = (~(Wsrfh7 & Wjyfh7));
+	assign Wiqfh7 = (~(Axyfh7 & Gxyfh7));
+	assign Gxyfh7 = (~(Qjyfh7 & M0ufh7));
+	assign Axyfh7 = (~(Mtrfh7 & Wjyfh7));
+	assign Njqfh7 = (~(Mxyfh7 & Sxyfh7));
+	assign Sxyfh7 = (~(Qjyfh7 & W1ufh7));
+	assign Mxyfh7 = (~(Curfh7 & Wjyfh7));
+	assign Ekqfh7 = (~(Yxyfh7 & Eyyfh7));
+	assign Eyyfh7 = (~(Qjyfh7 & Q1tfh7));
+	assign Qjyfh7 = (Kyyfh7 & Kjufh7);
+	assign Yxyfh7 = (~(Surfh7 & Wjyfh7));
+	assign Wjyfh7 = (~(Qyyfh7 & Wyyfh7));
+	assign Wyyfh7 = (Czyfh7 & Izyfh7);
+	assign Czyfh7 = (Ozyfh7 & Kjufh7);
+	assign Kjufh7 = (~(Uzyfh7 & A0zfh7));
+	assign A0zfh7 = (G0zfh7 & M0zfh7);
+	assign M0zfh7 = (S0zfh7 & Y0zfh7);
+	assign Y0zfh7 = (E1zfh7 & K1zfh7);
+	assign K1zfh7 = (W1ufh7 & Q1tfh7);
+	assign Q1tfh7 = (!Gr1gh7);
+	assign W1ufh7 = (!Mr1gh7);
+	assign E1zfh7 = (Cztfh7 & M0ufh7);
+	assign M0ufh7 = (!Sr1gh7);
+	assign Cztfh7 = (!Yr1gh7);
+	assign S0zfh7 = (Q1zfh7 & W1zfh7);
+	assign W1zfh7 = (Iwtfh7 & Sxtfh7);
+	assign Sxtfh7 = (!Es1gh7);
+	assign Iwtfh7 = (!Ks1gh7);
+	assign Q1zfh7 = (Ottfh7 & Yutfh7);
+	assign Yutfh7 = (!Qs1gh7);
+	assign Ottfh7 = (!Ws1gh7);
+	assign G0zfh7 = (C2zfh7 & I2zfh7);
+	assign I2zfh7 = (O2zfh7 & U2zfh7);
+	assign U2zfh7 = (Uqtfh7 & Estfh7);
+	assign Estfh7 = (!Ct1gh7);
+	assign Uqtfh7 = (!It1gh7);
+	assign O2zfh7 = (Aotfh7 & Kptfh7);
+	assign Kptfh7 = (!Ot1gh7);
+	assign Aotfh7 = (!Ut1gh7);
+	assign C2zfh7 = (A3zfh7 & G3zfh7);
+	assign G3zfh7 = (Gltfh7 & Qmtfh7);
+	assign Qmtfh7 = (!Au1gh7);
+	assign Gltfh7 = (!Gu1gh7);
+	assign A3zfh7 = (Mitfh7 & Wjtfh7);
+	assign Wjtfh7 = (!Mu1gh7);
+	assign Mitfh7 = (!Su1gh7);
+	assign Uzyfh7 = (M3zfh7 & S3zfh7);
+	assign S3zfh7 = (Y3zfh7 & E4zfh7);
+	assign E4zfh7 = (K4zfh7 & Q4zfh7);
+	assign Q4zfh7 = (Yxsfh7 & Axsfh7);
+	assign Axsfh7 = (!Yu1gh7);
+	assign Yxsfh7 = (!Ev1gh7);
+	assign K4zfh7 = (G3tfh7 & O2tfh7);
+	assign O2tfh7 = (!Kv1gh7);
+	assign G3tfh7 = (!Qv1gh7);
+	assign Y3zfh7 = (W4zfh7 & C5zfh7);
+	assign C5zfh7 = (W4tfh7 & E4tfh7);
+	assign E4tfh7 = (!Wv1gh7);
+	assign W4tfh7 = (!Cw1gh7);
+	assign W4zfh7 = (M6tfh7 & U5tfh7);
+	assign U5tfh7 = (!Iw1gh7);
+	assign M6tfh7 = (!Ow1gh7);
+	assign M3zfh7 = (I5zfh7 & O5zfh7);
+	assign O5zfh7 = (U5zfh7 & A6zfh7);
+	assign A6zfh7 = (U8tfh7 & K7tfh7);
+	assign K7tfh7 = (!Uw1gh7);
+	assign U8tfh7 = (!Ax1gh7);
+	assign U5zfh7 = (Obtfh7 & Eatfh7);
+	assign Eatfh7 = (!Gx1gh7);
+	assign Obtfh7 = (!Mx1gh7);
+	assign I5zfh7 = (G6zfh7 & M6zfh7);
+	assign M6zfh7 = (Ietfh7 & Yctfh7);
+	assign Yctfh7 = (!Sx1gh7);
+	assign Ietfh7 = (!Yx1gh7);
+	assign G6zfh7 = (Chtfh7 & Sftfh7);
+	assign Sftfh7 = (!Ey1gh7);
+	assign Chtfh7 = (!Ky1gh7);
+	assign Qyyfh7 = (~(S6zfh7 | Y6zfh7));
+	assign Vkqfh7 = (~(E7zfh7 & K7zfh7));
+	assign E7zfh7 = (Q7zfh7 & W7zfh7);
+	assign Mlqfh7 = (~(C8zfh7 & I8zfh7));
+	assign I8zfh7 = (O8zfh7 & Yrxfh7);
+	assign O8zfh7 = (U8zfh7 | Grxfh7);
+	assign C8zfh7 = (Uqxfh7 & Srxfh7);
+	assign Uqxfh7 = (A9zfh7 & G9zfh7);
+	assign G9zfh7 = (M9zfh7 & S9zfh7);
+	assign S9zfh7 = (Y9zfh7 & Eazfh7);
+	assign Y9zfh7 = (Kazfh7 & Sfxfh7);
+	assign A9zfh7 = (Qazfh7 & Wazfh7);
+	assign Wazfh7 = (Cbzfh7 & Ibzfh7);
+	assign Qazfh7 = (Yiyfh7 & Obzfh7);
+	assign Obzfh7 = (~(Ubzfh7 & W1wfh7));
+	assign W1wfh7 = (!Aczfh7);
+	assign Dmqfh7 = (~(Gczfh7 & Mczfh7));
+	assign Mczfh7 = (Sczfh7 | S32gh7);
+	assign Gczfh7 = (E4wfh7 | Otxfh7);
+	assign Umqfh7 = (~(Yczfh7 & Edzfh7));
+	assign Edzfh7 = (~(Kdzfh7 & Ubzfh7));
+	assign Yczfh7 = (Qdzfh7 | M32gh7);
+	assign Lnqfh7 = (~(Wdzfh7 & Cezfh7));
+	assign Cezfh7 = (~(Iezfh7 & Oezfh7));
+	assign Coqfh7 = (~(Ibzfh7 & Uezfh7));
+	assign Uezfh7 = (Afzfh7 | C22gh7);
+	assign Ibzfh7 = (~(Gfzfh7 & Mfzfh7));
+	assign Mfzfh7 = (Sfzfh7 & Yfzfh7);
+	assign Gfzfh7 = (stdio_rx_tvalid & com_tx_tready);
+	assign Toqfh7 = (~(M9zfh7 & Egzfh7));
+	assign Egzfh7 = (Afzfh7 | G02gh7);
+	assign M9zfh7 = (~(Y6zfh7 | Kgzfh7));
+	assign Kgzfh7 = (Qgzfh7 & Wgzfh7);
+	assign Wgzfh7 = (Chzfh7 & Qvsfh7);
+	assign Chzfh7 = (Ihzfh7 & Ozyfh7);
+	assign Qgzfh7 = (Ohzfh7 & Uhzfh7);
+	assign Uhzfh7 = (~(Aizfh7 & Gizfh7));
+	assign Ohzfh7 = (!Kpvfh7);
+	assign Kpvfh7 = (~(Kvsfh7 & Mizfh7));
+	assign Mizfh7 = (~(Sizfh7 & Yizfh7));
+	assign Yizfh7 = (Ejzfh7 & Kjzfh7);
+	assign Sizfh7 = (Iz1gh7 & Qy1gh7);
+	assign Y6zfh7 = (~(S6zfh7 | Kvsfh7));
+	assign Kvsfh7 = (!M0wfh7);
+	assign S6zfh7 = (~(Qjzfh7 & Wjzfh7));
+	assign Wjzfh7 = (Ckzfh7 & Ikzfh7);
+	assign Ckzfh7 = (Okzfh7 & Yusfh7);
+	assign Qjzfh7 = (Ukzfh7 & Alzfh7);
+	assign Ukzfh7 = (G0wfh7 & U8zfh7);
+	assign G0wfh7 = (Glzfh7 & Mlzfh7);
+	assign Mlzfh7 = (Slzfh7 & Ylzfh7);
+	assign Ylzfh7 = (Emzfh7 & Czufh7);
+	assign Emzfh7 = (K4wfh7 & Q1wfh7);
+	assign Slzfh7 = (Y3xfh7 & S6xfh7);
+	assign Glzfh7 = (Kmzfh7 & Qmzfh7);
+	assign Qmzfh7 = (Wmzfh7 & K4xfh7);
+	assign Wmzfh7 = (Sfxfh7 & Wgxfh7);
+	assign Kmzfh7 = (Aczfh7 & Srxfh7);
+	assign Kpqfh7 = (~(Yiyfh7 & Cnzfh7));
+	assign Cnzfh7 = (Qdzfh7 | U82gh7);
+	assign Yiyfh7 = (Inzfh7 & Onzfh7);
+	assign Onzfh7 = (Czufh7 & Q1wfh7);
+	assign Q1wfh7 = (~(Unzfh7 & Aozfh7));
+	assign Unzfh7 = (Gozfh7 & Mozfh7);
+	assign Mozfh7 = (!A92gh7);
+	assign Czufh7 = (~(Sozfh7 & Yozfh7));
+	assign Yozfh7 = (~(Epzfh7 | E72gh7));
+	assign Sozfh7 = (Kpzfh7 & Qpzfh7);
+	assign Inzfh7 = (Wpzfh7 & Cqzfh7);
+	assign Cqzfh7 = (~(Iqzfh7 & Oqzfh7));
+	assign Oqzfh7 = (!K4wfh7);
+	assign Wpzfh7 = (~(Miyfh7 & Uqzfh7));
+	assign Miyfh7 = (!S6xfh7);
+	assign Bqqfh7 = (~(Qjufh7 & Arzfh7));
+	assign Arzfh7 = (~(Grzfh7 & Iqzfh7));
+	assign Grzfh7 = (!Yusfh7);
+	assign Qjufh7 = (!Kyyfh7);
+	assign Kyyfh7 = (Mrzfh7 & Qy1gh7);
+	assign Mrzfh7 = (Srzfh7 & Yrzfh7);
+	assign Sqqfh7 = (~(Eszfh7 & Kszfh7));
+	assign Kszfh7 = (~(Qszfh7 & Ubzfh7));
+	assign Eszfh7 = (Qdzfh7 | G32gh7);
+	assign Jrqfh7 = (~(Wszfh7 & Ctzfh7));
+	assign Ctzfh7 = (Afzfh7 | A02gh7);
+	assign Asqfh7 = (~(W7zfh7 & Itzfh7));
+	assign Itzfh7 = (Afzfh7 | S02gh7);
+	assign W7zfh7 = (~(Otzfh7 & O2yfh7));
+	assign Otzfh7 = (stdio_tx_tready & U2yfh7);
+	assign Rsqfh7 = (~(Utzfh7 & Auzfh7));
+	assign Auzfh7 = (Afzfh7 | A62gh7);
+	assign Utzfh7 = (~(Guzfh7 & com_rx_tvalid));
+	assign Itqfh7 = (~(Muzfh7 & Suzfh7));
+	assign Suzfh7 = (Yuzfh7 & Evzfh7);
+	assign Evzfh7 = (~(Grxfh7 & Kvzfh7));
+	assign Kvzfh7 = (~(Qvzfh7 & Wvzfh7));
+	assign Wvzfh7 = (A3xfh7 | W72gh7);
+	assign Yuzfh7 = (Cwzfh7 & Iwzfh7);
+	assign Iwzfh7 = (~(Owzfh7 & O2yfh7));
+	assign Owzfh7 = (U2yfh7 & Uwzfh7);
+	assign Cwzfh7 = (~(Axzfh7 & Gxzfh7));
+	assign Gxzfh7 = (~(M0wfh7 & Mxzfh7));
+	assign Mxzfh7 = (Sxzfh7 | Alzfh7);
+	assign Muzfh7 = (Yxzfh7 & Eyzfh7);
+	assign Eyzfh7 = (Ikzfh7 | Kyzfh7);
+	assign Kyzfh7 = (!Uqzfh7);
+	assign Yxzfh7 = (Qyzfh7 | A32gh7);
+	assign Ztqfh7 = (~(Eazfh7 & Wyzfh7));
+	assign Wyzfh7 = (Afzfh7 | Y62gh7);
+	assign Eazfh7 = (~(Czzfh7 & Izzfh7));
+	assign Izzfh7 = (Ejzfh7 & Yrzfh7);
+	assign Ejzfh7 = (~(Cz1gh7 | Wy1gh7));
+	assign Czzfh7 = (Ozzfh7 & Iz1gh7);
+	assign Ozzfh7 = (Qy1gh7 & Kjzfh7);
+	assign Quqfh7 = (~(Wsxfh7 & Uzzfh7));
+	assign Uzzfh7 = (Afzfh7 | I52gh7);
+	assign Wsxfh7 = (~(A00gh7 & G00gh7));
+	assign G00gh7 = (~(C82gh7 | Iz1gh7));
+	assign A00gh7 = (Yrzfh7 & Aizfh7);
+	assign Hvqfh7 = (~(Izyfh7 | Ihzfh7));
+	assign Yvqfh7 = (~(M00gh7 & K7zfh7));
+	assign K7zfh7 = (~(S00gh7 & stdio_tx_tready));
+	assign M00gh7 = (Afzfh7 | W42gh7);
+	assign Pwqfh7 = (Y00gh7 & E10gh7);
+	assign E10gh7 = (Aizfh7 & Qvsfh7);
+	assign Y00gh7 = (C82gh7 & Yrzfh7);
+	assign Gxqfh7 = (~(K10gh7 & Ksxfh7));
+	assign Ksxfh7 = (Izyfh7 | Qvsfh7);
+	assign Qvsfh7 = (~(Q10gh7 & Iz1gh7));
+	assign Q10gh7 = (C82gh7 & Aizfh7);
+	assign Aizfh7 = (W10gh7 & C20gh7);
+	assign C20gh7 = (I20gh7 & Essfh7);
+	assign I20gh7 = (~(Cz1gh7 | Qy1gh7));
+	assign W10gh7 = (Wy1gh7 & Uz1gh7);
+	assign Izyfh7 = (~(Yrzfh7 & O20gh7));
+	assign O20gh7 = (~(Qy1gh7 & Srzfh7));
+	assign Srzfh7 = (!Ihzfh7);
+	assign Ihzfh7 = (~(U20gh7 & A30gh7));
+	assign A30gh7 = (Wy1gh7 & Gizfh7);
+	assign Gizfh7 = (!Iz1gh7);
+	assign U20gh7 = (Cz1gh7 & Kjzfh7);
+	assign Kjzfh7 = (G30gh7 & C82gh7);
+	assign G30gh7 = (Uz1gh7 & Essfh7);
+	assign Essfh7 = (!Oz1gh7);
+	assign Yrzfh7 = (~(M0wfh7 | Axzfh7));
+	assign M0wfh7 = (~(M30gh7 & S30gh7));
+	assign S30gh7 = (~(Q72gh7 | U52gh7));
+	assign M30gh7 = (G62gh7 & Y30gh7);
+	assign K10gh7 = (E40gh7 | Afzfh7);
+	assign Xxqfh7 = (K40gh7 & Gusfh7);
+	assign Gusfh7 = (!Q40gh7);
+	assign K40gh7 = (~(Sxzfh7 | Alzfh7));
+	assign Oyqfh7 = (~(W40gh7 & Yiufh7));
+	assign Yiufh7 = (~(Utsfh7 & Q40gh7));
+	assign Utsfh7 = (C50gh7 & I50gh7);
+	assign I50gh7 = (O50gh7 & Ozyfh7);
+	assign O50gh7 = (~(U50gh7 & A60gh7));
+	assign U50gh7 = (M6ufh7 & G60gh7);
+	assign C50gh7 = (Kaufh7 & Siufh7);
+	assign W40gh7 = (Afzfh7 | O52gh7);
+	assign Fzqfh7 = (~(M60gh7 & S60gh7));
+	assign S60gh7 = (Afzfh7 | G62gh7);
+	assign M60gh7 = (~(Sfzfh7 & com_rx_tvalid));
+	assign Sfzfh7 = (!Wgxfh7);
+	assign Wzqfh7 = (~(Y60gh7 & E70gh7));
+	assign E70gh7 = (Otxfh7 | K70gh7);
+	assign Y60gh7 = (~(Iezfh7 & Q70gh7));
+	assign N0rfh7 = (~(W70gh7 & C80gh7));
+	assign C80gh7 = (Yrxfh7 | Otxfh7);
+	assign Yrxfh7 = (~(W72gh7 & I80gh7));
+	assign W70gh7 = (Afzfh7 | S62gh7);
+	assign E1rfh7 = (!O80gh7);
+	assign O80gh7 = (Grxfh7 ? Qpvfh7 : U80gh7);
+	assign U80gh7 = (A90gh7 | Q42gh7);
+	assign V1rfh7 = (~(G90gh7 & M90gh7));
+	assign M90gh7 = (Grxfh7 ? E4xfh7 : S90gh7);
+	assign S90gh7 = (~(Y90gh7 & Ea0gh7));
+	assign G90gh7 = (Cbzfh7 & Kazfh7);
+	assign Kazfh7 = (~(Ka0gh7 & O2yfh7));
+	assign O2yfh7 = (~(Y3xfh7 | Sxzfh7));
+	assign Sxzfh7 = (!Siufh7);
+	assign Ka0gh7 = (!U2yfh7);
+	assign U2yfh7 = (~(Qa0gh7 & Wa0gh7));
+	assign Wa0gh7 = (Cb0gh7 & Ib0gh7);
+	assign Cb0gh7 = (Otsfh7 & Obufh7);
+	assign Qa0gh7 = (Ob0gh7 & A9ufh7);
+	assign Ob0gh7 = (com_rx_tdata[4] & com_rx_tdata[3]);
+	assign Cbzfh7 = (~(S00gh7 & Uwzfh7));
+	assign Uwzfh7 = (!stdio_tx_tready);
+	assign S00gh7 = (!K4xfh7);
+	assign K4xfh7 = (~(Ub0gh7 & Ac0gh7));
+	assign Ac0gh7 = (W42gh7 & Gc0gh7);
+	assign M2rfh7 = (!Mc0gh7);
+	assign Mc0gh7 = (Grxfh7 ? S6wfh7 : Sc0gh7);
+	assign Sc0gh7 = (A90gh7 | Y32gh7);
+	assign D3rfh7 = (!Yc0gh7);
+	assign Yc0gh7 = (Grxfh7 ? W7xfh7 : Ed0gh7);
+	assign Ed0gh7 = (~(Kd0gh7 & Qd0gh7));
+	assign U3rfh7 = (!Wd0gh7);
+	assign Wd0gh7 = (Grxfh7 ? I5wfh7 : Ce0gh7);
+	assign Ce0gh7 = (Ie0gh7 | U22gh7);
+	assign L4rfh7 = (!Oe0gh7);
+	assign Oe0gh7 = (Grxfh7 ? Yfwfh7 : Ue0gh7);
+	assign Ue0gh7 = (~(Af0gh7 & Gf0gh7));
+	assign C5rfh7 = (!Mf0gh7);
+	assign Mf0gh7 = (Grxfh7 ? Yf0gh7 : Sf0gh7);
+	assign Sf0gh7 = (~(Eg0gh7 & Kg0gh7));
+	assign T5rfh7 = (!Qg0gh7);
+	assign Qg0gh7 = (Grxfh7 ? Inxfh7 : Wg0gh7);
+	assign Wg0gh7 = (~(Af0gh7 & Ch0gh7));
+	assign Af0gh7 = (Y90gh7 | Evvfh7);
+	assign K6rfh7 = (!Ih0gh7);
+	assign Ih0gh7 = (Grxfh7 ? Uh0gh7 : Oh0gh7);
+	assign Oh0gh7 = (~(Ai0gh7 & Gi0gh7));
+	assign B7rfh7 = (!Mi0gh7);
+	assign Mi0gh7 = (Grxfh7 ? Moxfh7 : Si0gh7);
+	assign Si0gh7 = (Yi0gh7 | I82gh7);
+	assign S7rfh7 = (!Ej0gh7);
+	assign Ej0gh7 = (Grxfh7 ? Kvwfh7 : Moxfh7);
+	assign J8rfh7 = (~(Kj0gh7 & Qj0gh7));
+	assign Qj0gh7 = (Sczfh7 | Y02gh7);
+	assign Sczfh7 = (~(Otxfh7 & Wj0gh7));
+	assign Wj0gh7 = (~(A90gh7 & Kvwfh7));
+	assign A90gh7 = (U8zfh7 & E4xfh7);
+	assign Kj0gh7 = (Y6xfh7 | Otxfh7);
+	assign A9rfh7 = (~(Ck0gh7 & Sfxfh7));
+	assign Sfxfh7 = (~(Ik0gh7 & Ok0gh7));
+	assign Ok0gh7 = (~(Uk0gh7 | M62gh7));
+	assign Ck0gh7 = (Grxfh7 ? Iexfh7 : Al0gh7);
+	assign Al0gh7 = (~(Gl0gh7 & Ml0gh7));
+	assign R9rfh7 = (~(Afzfh7 | M62gh7));
+	assign Afzfh7 = (~(Sl0gh7 | Iezfh7));
+	assign Iezfh7 = (~(Yl0gh7 & Em0gh7));
+	assign Em0gh7 = (Km0gh7 & Qm0gh7);
+	assign Qm0gh7 = (~(Wm0gh7 & Wdufh7));
+	assign Wdufh7 = (!Cn0gh7);
+	assign Wm0gh7 = (Q40gh7 & Ozyfh7);
+	assign Km0gh7 = (In0gh7 & Qyzfh7);
+	assign Qyzfh7 = (~(On0gh7 & Un0gh7));
+	assign Un0gh7 = (~(stdio_rx_tvalid & Ao0gh7));
+	assign Ao0gh7 = (Wgxfh7 | com_tx_tready);
+	assign On0gh7 = (Go0gh7 & Yfzfh7);
+	assign In0gh7 = (~(Mo0gh7 & So0gh7));
+	assign So0gh7 = (A60gh7 & G60gh7);
+	assign G60gh7 = (Yo0gh7 & Qssfh7);
+	assign Yo0gh7 = (Obufh7 ? com_rx_tdata[0] : Ctsfh7);
+	assign A60gh7 = (~(Ep0gh7 | Ihufh7));
+	assign Ihufh7 = (com_rx_tdata[0] & Ctsfh7);
+	assign Ep0gh7 = (!Ib0gh7);
+	assign Mo0gh7 = (Kaufh7 & M6ufh7);
+	assign Kaufh7 = (!Kp0gh7);
+	assign Yl0gh7 = (Qp0gh7 & Wp0gh7);
+	assign Qp0gh7 = (Qsxfh7 & Q7zfh7);
+	assign Q7zfh7 = (Cq0gh7 | Uqzfh7);
+	assign Uqzfh7 = (stdio_tx_tvalid & stdio_tx_tready);
+	assign Cq0gh7 = (Ikzfh7 & S6xfh7);
+	assign S6xfh7 = (~(Ub0gh7 & Iq0gh7));
+	assign Iq0gh7 = (~(Gc0gh7 | W42gh7));
+	assign Gc0gh7 = (!C52gh7);
+	assign Ub0gh7 = (Oq0gh7 & Uq0gh7);
+	assign Ikzfh7 = (~(Ar0gh7 & Gr0gh7));
+	assign Ar0gh7 = (M02gh7 & Mr0gh7);
+	assign Qsxfh7 = (Sr0gh7 | Iqzfh7);
+	assign Sr0gh7 = (K4wfh7 & Yusfh7);
+	assign Yusfh7 = (~(Yr0gh7 & Es0gh7));
+	assign Es0gh7 = (Ks0gh7 & Qpzfh7);
+	assign Ks0gh7 = (~(Epzfh7 | I52gh7));
+	assign Epzfh7 = (!Qs0gh7);
+	assign Yr0gh7 = (Ws0gh7 & Oq0gh7);
+	assign Ws0gh7 = (Ct0gh7 & E72gh7);
+	assign K4wfh7 = (~(It0gh7 & Ot0gh7));
+	assign It0gh7 = (Q72gh7 & G62gh7);
+	assign Sl0gh7 = (~(Ut0gh7 & Qdzfh7));
+	assign Qdzfh7 = (~(Au0gh7 & Otxfh7));
+	assign Otxfh7 = (!Grxfh7);
+	assign Au0gh7 = (~(U8zfh7 & Srxfh7));
+	assign Srxfh7 = (~(Gl0gh7 | Gu0gh7));
+	assign Gu0gh7 = (!Iexfh7);
+	assign Iexfh7 = (~(Mu0gh7 & Su0gh7));
+	assign Mu0gh7 = (~(Yu0gh7 | U82gh7));
+	assign Gl0gh7 = (~(Ev0gh7 & Kv0gh7));
+	assign Kv0gh7 = (Egxfh7 & E4wfh7);
+	assign E4wfh7 = (~(Qv0gh7 & Wv0gh7));
+	assign Wv0gh7 = (Cw0gh7 & S32gh7);
+	assign Cw0gh7 = (~(Oezfh7 | M32gh7));
+	assign Qv0gh7 = (Su0gh7 & U82gh7);
+	assign Egxfh7 = (Iw0gh7 & Ow0gh7);
+	assign Ow0gh7 = (Y6xfh7 & Moxfh7);
+	assign Moxfh7 = (~(Uw0gh7 & Gr0gh7));
+	assign Gr0gh7 = (Ax0gh7 & Gx0gh7);
+	assign Ax0gh7 = (~(Mx0gh7 | Sx0gh7));
+	assign Uw0gh7 = (S02gh7 & Yx0gh7);
+	assign Yx0gh7 = (!M02gh7);
+	assign Y6xfh7 = (~(Ey0gh7 & Ky0gh7));
+	assign Ky0gh7 = (~(Qy0gh7 | I22gh7));
+	assign Ey0gh7 = (~(Wy0gh7 | Mx0gh7));
+	assign Mx0gh7 = (!A02gh7);
+	assign Iw0gh7 = (Yi0gh7 & Kvwfh7);
+	assign Kvwfh7 = (~(Cz0gh7 & Iz0gh7));
+	assign Cz0gh7 = (~(Gf0gh7 | Y02gh7));
+	assign Yi0gh7 = (~(Eg0gh7 | Evvfh7));
+	assign Evvfh7 = (!Yf0gh7);
+	assign Yf0gh7 = (~(Oz0gh7 & Uz0gh7));
+	assign Oz0gh7 = (A01gh7 & Ch0gh7);
+	assign Ch0gh7 = (!W12gh7);
+	assign Eg0gh7 = (Ai0gh7 | Wvvfh7);
+	assign Wvvfh7 = (!Uh0gh7);
+	assign Uh0gh7 = (~(G01gh7 & M01gh7));
+	assign M01gh7 = (~(S01gh7 | I82gh7));
+	assign Ai0gh7 = (~(Yfwfh7 & Inxfh7));
+	assign Inxfh7 = (~(Y01gh7 & E11gh7));
+	assign E11gh7 = (Q12gh7 & Gi0gh7);
+	assign Yfwfh7 = (~(Y01gh7 & K11gh7));
+	assign K11gh7 = (K12gh7 & Kg0gh7);
+	assign Y01gh7 = (Uz0gh7 & W12gh7);
+	assign Uz0gh7 = (G01gh7 & Q11gh7);
+	assign Q11gh7 = (W11gh7 & I82gh7);
+	assign Ev0gh7 = (~(C21gh7 | Y90gh7));
+	assign Y90gh7 = (~(Ie0gh7 & I5wfh7));
+	assign I5wfh7 = (~(I21gh7 & Iz0gh7));
+	assign Iz0gh7 = (G01gh7 & O21gh7);
+	assign O21gh7 = (U21gh7 & I82gh7);
+	assign G01gh7 = (A31gh7 & G02gh7);
+	assign I21gh7 = (Y02gh7 & Gf0gh7);
+	assign Gf0gh7 = (!E12gh7);
+	assign Ie0gh7 = (~(Kd0gh7 | Oqvfh7));
+	assign Oqvfh7 = (!W7xfh7);
+	assign W7xfh7 = (~(G31gh7 & M31gh7));
+	assign G31gh7 = (~(Qd0gh7 | U22gh7));
+	assign Kd0gh7 = (~(Qpvfh7 & S6wfh7));
+	assign S6wfh7 = (~(S31gh7 & M31gh7));
+	assign M31gh7 = (Y31gh7 & E41gh7);
+	assign S31gh7 = (U22gh7 & Qd0gh7);
+	assign Qd0gh7 = (!O22gh7);
+	assign Qpvfh7 = (~(K41gh7 & Q41gh7));
+	assign Q41gh7 = (Y32gh7 & Ea0gh7);
+	assign C21gh7 = (!E4xfh7);
+	assign E4xfh7 = (W41gh7 & C51gh7);
+	assign C51gh7 = (~(K41gh7 & I51gh7));
+	assign I51gh7 = (~(Ea0gh7 | Y32gh7));
+	assign Ea0gh7 = (!E42gh7);
+	assign K41gh7 = (O51gh7 & U51gh7);
+	assign W41gh7 = (~(A61gh7 & G61gh7));
+	assign G61gh7 = (~(S01gh7 | G02gh7));
+	assign S01gh7 = (!M61gh7);
+	assign A61gh7 = (A31gh7 & I82gh7);
+	assign A31gh7 = (S61gh7 & Y61gh7);
+	assign Y61gh7 = (M02gh7 & S02gh7);
+	assign S61gh7 = (Gx0gh7 & A02gh7);
+	assign U8zfh7 = (E71gh7 & K71gh7);
+	assign K71gh7 = (~(I80gh7 | Q71gh7));
+	assign I80gh7 = (!A3xfh7);
+	assign A3xfh7 = (~(W71gh7 & C81gh7));
+	assign C81gh7 = (K42gh7 & I81gh7);
+	assign E71gh7 = (Qvzfh7 & K70gh7);
+	assign K70gh7 = (O81gh7 & U81gh7);
+	assign U81gh7 = (~(Ik0gh7 & A91gh7));
+	assign A91gh7 = (M62gh7 & Uk0gh7);
+	assign Ik0gh7 = (G91gh7 & A62gh7);
+	assign O81gh7 = (~(M91gh7 & S91gh7));
+	assign M91gh7 = (~(Oezfh7 | S32gh7));
+	assign Qvzfh7 = (Y91gh7 & Ea1gh7);
+	assign Ea1gh7 = (~(Ka1gh7 & Qa1gh7));
+	assign Qa1gh7 = (~(Wa1gh7 | Y62gh7));
+	assign Y91gh7 = (~(Cb1gh7 & Ib1gh7));
+	assign Ib1gh7 = (~(Ob1gh7 | G32gh7));
+	assign Iarfh7 = (~(Ub1gh7 & Ac1gh7));
+	assign Ac1gh7 = (~(com_rx_tvalid & Go0gh7));
+	assign Go0gh7 = (~(Okzfh7 & Wgxfh7));
+	assign Wgxfh7 = (~(W71gh7 & Gc1gh7));
+	assign Gc1gh7 = (Q42gh7 & Q70gh7);
+	assign W71gh7 = (O51gh7 & Mc1gh7);
+	assign O51gh7 = (Sc1gh7 & Yc1gh7);
+	assign Okzfh7 = (!Guzfh7);
+	assign Ub1gh7 = (Ut0gh7 & Ed1gh7);
+	assign Ed1gh7 = (~(Kd1gh7 & Q40gh7));
+	assign Q40gh7 = (~(Qd1gh7 & Wd1gh7));
+	assign Wd1gh7 = (Ce1gh7 & Ie1gh7);
+	assign Ie1gh7 = (~(com_rx_tdata[2] & Grsfh7));
+	assign Grsfh7 = (!com_rx_tdata[0]);
+	assign Ce1gh7 = (~(A9ufh7 | M6ufh7));
+	assign M6ufh7 = (Musfh7 & Otsfh7);
+	assign Otsfh7 = (!com_rx_tdata[2]);
+	assign A9ufh7 = (com_rx_tdata[1] & com_rx_tdata[0]);
+	assign Qd1gh7 = (~(Ctsfh7 | Oe1gh7));
+	assign Kd1gh7 = (~(Axzfh7 | Alzfh7));
+	assign Axzfh7 = (!Ozyfh7);
+	assign Ozyfh7 = (~(Ue1gh7 & Af1gh7));
+	assign Af1gh7 = (Musfh7 & Ctsfh7);
+	assign Ctsfh7 = (!com_rx_tdata[3]);
+	assign Musfh7 = (!com_rx_tdata[1]);
+	assign Ue1gh7 = (~(Oe1gh7 | com_rx_tdata[0]));
+	assign Oe1gh7 = (~(Gf1gh7 & Ib0gh7));
+	assign Ib0gh7 = (~(com_rx_tdata[6] | com_rx_tdata[7]));
+	assign Gf1gh7 = (Qssfh7 & Obufh7);
+	assign Obufh7 = (!com_rx_tdata[5]);
+	assign Qssfh7 = (!com_rx_tdata[4]);
+	assign Ut0gh7 = (Mf1gh7 | Siufh7);
+	assign Siufh7 = (com_rx_tvalid & com_rx_tready);
+	assign Mf1gh7 = (Alzfh7 & Y3xfh7);
+	assign Y3xfh7 = (~(Sf1gh7 & Yf1gh7));
+	assign Yf1gh7 = (~(Uk0gh7 | A62gh7));
+	assign Uk0gh7 = (!S62gh7);
+	assign Sf1gh7 = (G91gh7 & M62gh7);
+	assign G91gh7 = (Eg1gh7 & Kg1gh7);
+	assign Kg1gh7 = (Qg1gh7 & Uq0gh7);
+	assign Qg1gh7 = (~(Wg1gh7 | Q72gh7));
+	assign Eg1gh7 = (Ch1gh7 & G62gh7);
+	assign Ch1gh7 = (U52gh7 & O52gh7);
+	assign Alzfh7 = (Cn0gh7 & Kp0gh7);
+	assign Kp0gh7 = (~(Ot0gh7 & Ih1gh7));
+	assign Ih1gh7 = (~(Q72gh7 | G62gh7));
+	assign Ot0gh7 = (U52gh7 & Y30gh7);
+	assign Y30gh7 = (Oh1gh7 & Uh1gh7);
+	assign Uh1gh7 = (Ai1gh7 & S62gh7);
+	assign Ai1gh7 = (Uq0gh7 & Ct0gh7);
+	assign Oh1gh7 = (Gi1gh7 & O52gh7);
+	assign Gi1gh7 = (A62gh7 & M62gh7);
+	assign Cn0gh7 = (~(Mi1gh7 & Si1gh7));
+	assign Si1gh7 = (~(Wg1gh7 | O52gh7));
+	assign Wg1gh7 = (!Ct0gh7);
+	assign Mi1gh7 = (Yi1gh7 & Uq0gh7);
+	assign Uq0gh7 = (Ej1gh7 & Kj1gh7);
+	assign Kj1gh7 = (Qpzfh7 & Qs0gh7);
+	assign Ej1gh7 = (I52gh7 & E72gh7);
+	assign Zarfh7 = (~(Qj1gh7 & Wdzfh7));
+	assign Wdzfh7 = (~(Q71gh7 & Grxfh7));
+	assign Grxfh7 = (com_tx_tready & com_tx_tvalid);
+	assign Q71gh7 = (Wj1gh7 & Ck1gh7);
+	assign Ck1gh7 = (Ik1gh7 & Ok1gh7);
+	assign Ok1gh7 = (~(Qy0gh7 | C22gh7));
+	assign Ik1gh7 = (A02gh7 & I22gh7);
+	assign Wj1gh7 = (Uk1gh7 & Al1gh7);
+	assign Uk1gh7 = (Qpzfh7 & Y62gh7);
+	assign Qj1gh7 = (Wp0gh7 & Wszfh7);
+	assign Wszfh7 = (~(Gl1gh7 & Guzfh7));
+	assign Guzfh7 = (Cb1gh7 & Ml1gh7);
+	assign Ml1gh7 = (G32gh7 & Ob1gh7);
+	assign Ob1gh7 = (!A32gh7);
+	assign Cb1gh7 = (Aozfh7 & A92gh7);
+	assign Aozfh7 = (Sl1gh7 & Yl1gh7);
+	assign Sl1gh7 = (U82gh7 & Em1gh7);
+	assign Gl1gh7 = (stdio_rx_tvalid & Yfzfh7);
+	assign Yfzfh7 = (!com_rx_tvalid);
+	assign Wp0gh7 = (Ubzfh7 | Aczfh7);
+	assign Aczfh7 = (~(Qszfh7 | Kdzfh7));
+	assign Kdzfh7 = (Km1gh7 & S91gh7);
+	assign S91gh7 = (Qm1gh7 & Su0gh7);
+	assign Su0gh7 = (Wm1gh7 & Yl1gh7);
+	assign Yl1gh7 = (Cn1gh7 & Sc1gh7);
+	assign Sc1gh7 = (Y31gh7 & In1gh7);
+	assign Y31gh7 = (Al1gh7 & Qs0gh7);
+	assign Qs0gh7 = (~(On1gh7 | Wa1gh7));
+	assign Wa1gh7 = (~(Un1gh7 & Ao1gh7));
+	assign Ao1gh7 = (~(Ml0gh7 | Qy0gh7));
+	assign Un1gh7 = (A02gh7 & C22gh7);
+	assign On1gh7 = (!Y62gh7);
+	assign Wm1gh7 = (A92gh7 & Gozfh7);
+	assign Qm1gh7 = (U82gh7 & M32gh7);
+	assign Km1gh7 = (S32gh7 & Oezfh7);
+	assign Oezfh7 = (!O82gh7);
+	assign Qszfh7 = (Go1gh7 & Gx0gh7);
+	assign Gx0gh7 = (~(Wy0gh7 | Ml0gh7));
+	assign Ml0gh7 = (!I22gh7);
+	assign Wy0gh7 = (~(Ka1gh7 & Mo1gh7));
+	assign Mo1gh7 = (Y62gh7 & C22gh7);
+	assign Ka1gh7 = (Al1gh7 & Qpzfh7);
+	assign Qpzfh7 = (In1gh7 & E41gh7);
+	assign E41gh7 = (Cn1gh7 & Yc1gh7);
+	assign Yc1gh7 = (So1gh7 & Yo1gh7);
+	assign Yo1gh7 = (Em1gh7 & Gozfh7);
+	assign Gozfh7 = (A32gh7 & G32gh7);
+	assign Em1gh7 = (!Yu0gh7);
+	assign Yu0gh7 = (~(Ep1gh7 & M32gh7));
+	assign Ep1gh7 = (S32gh7 & O82gh7);
+	assign So1gh7 = (U82gh7 & A92gh7);
+	assign Cn1gh7 = (U51gh7 & Mc1gh7);
+	assign Mc1gh7 = (Y32gh7 & E42gh7);
+	assign U51gh7 = (~(Q70gh7 | I81gh7));
+	assign I81gh7 = (!Q42gh7);
+	assign Q70gh7 = (!K42gh7);
+	assign In1gh7 = (O22gh7 & U22gh7);
+	assign Al1gh7 = (Kpzfh7 & E72gh7);
+	assign Kpzfh7 = (Kp1gh7 & Oq0gh7);
+	assign Oq0gh7 = (Yi1gh7 & O52gh7);
+	assign Yi1gh7 = (Qp1gh7 & Wp1gh7);
+	assign Wp1gh7 = (Cq1gh7 & M62gh7);
+	assign Cq1gh7 = (S62gh7 & E40gh7);
+	assign E40gh7 = (!Q72gh7);
+	assign Qp1gh7 = (Iq1gh7 & G62gh7);
+	assign Iq1gh7 = (U52gh7 & A62gh7);
+	assign Kp1gh7 = (Ct0gh7 & I52gh7);
+	assign Ct0gh7 = (W42gh7 & C52gh7);
+	assign Go1gh7 = (~(Qy0gh7 | A02gh7));
+	assign Qy0gh7 = (~(Oq1gh7 & M02gh7));
+	assign Oq1gh7 = (~(Mr0gh7 | Sx0gh7));
+	assign Sx0gh7 = (~(Uq1gh7 & G02gh7));
+	assign Uq1gh7 = (I82gh7 & M61gh7);
+	assign M61gh7 = (W11gh7 & U21gh7);
+	assign U21gh7 = (W12gh7 & A01gh7);
+	assign A01gh7 = (~(Gi0gh7 | Kg0gh7));
+	assign Kg0gh7 = (!Q12gh7);
+	assign Gi0gh7 = (!K12gh7);
+	assign W11gh7 = (Y02gh7 & E12gh7);
+	assign Mr0gh7 = (!S02gh7);
+	assign Ubzfh7 = (stdio_rx_tready & stdio_rx_tvalid);
+	assign Ivrfh7 = (Iqzfh7 & Yvrfh7);
+	assign Iqzfh7 = (Ar1gh7 & ahb_hready);
+	assign Ar1gh7 = (~(G92gh7 | K72gh7));
+
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  M92gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    M92gh7 <= N0sfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ma2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ma2gh7 <= Bqqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Pb2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Pb2gh7 <= Kpqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Sc2gh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Sc2gh7 <= R9rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ud2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ud2gh7 <= Zarfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ue2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ue2gh7 <= Lnqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Xf2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Xf2gh7 <= Mlqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Xg2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Xg2gh7 <= Umqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ai2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ai2gh7 <= Dmqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Dj2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Dj2gh7 <= A9rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Fk2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Fk2gh7 <= J8rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Hl2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Hl2gh7 <= B7rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Jm2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Jm2gh7 <= S7rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ln2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ln2gh7 <= Rsqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Oo2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Oo2gh7 <= Jrqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Rp2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rp2gh7 <= Iarfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Rq2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rq2gh7 <= Dksfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Rr2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rr2gh7 <= Yjsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Rs2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rs2gh7 <= Tjsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Rt2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rt2gh7 <= Ojsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ru2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ru2gh7 <= Jjsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Rv2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rv2gh7 <= Ejsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Rw2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rw2gh7 <= Zisfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Rx2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rx2gh7 <= Quqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Uy2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Uy2gh7 <= Toqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Xz2gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Xz2gh7 <= M2rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  A13gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    A13gh7 <= E1rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  D23gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    D23gh7 <= T5rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  F33gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    F33gh7 <= C5rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  H43gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    H43gh7 <= L4rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  J53gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    J53gh7 <= U3rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  L63gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    L63gh7 <= Fzqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  O73gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    O73gh7 <= Coqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  R83gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    R83gh7 <= Sqqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  U93gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    U93gh7 <= Itqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Xa3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Xa3gh7 <= Wzqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ac3gh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Ac3gh7 <= I0sfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Wc3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Wc3gh7 <= N0rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Zd3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Zd3gh7 <= Yvqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Cf3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Cf3gh7 <= Oyqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Fg3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Fg3gh7 <= Xxqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ih3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ih3gh7 <= Hvqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Li3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Li3gh7 <= Gxqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Oj3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Oj3gh7 <= Asqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Rk3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Rk3gh7 <= K6rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Tl3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Tl3gh7 <= Pwqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Wm3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Wm3gh7 <= Ztqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Zn3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Zn3gh7 <= Uisfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Cp3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Cp3gh7 <= S0sfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Dq3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Dq3gh7 <= S0sfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Fr3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Fr3gh7 <= V1rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Is3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Is3gh7 <= D3rfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Lt3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Lt3gh7 <= Vkqfh7;
+	  end
+	always @(posedge Iqsfh7) Lu3gh7 <= M6sfh7;
+	always @(posedge Iqsfh7) Pv3gh7 <= W6sfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Tw3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Tw3gh7 <= Ekqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ux3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ux3gh7 <= Kisfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Wy3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Wy3gh7 <= Fdsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Yz3gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Yz3gh7 <= Zdsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  A14gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    A14gh7 <= Tesfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  D24gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    D24gh7 <= Nfsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  G34gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    G34gh7 <= Hgsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  J44gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    J44gh7 <= Bhsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  M54gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    M54gh7 <= Vhsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  P64gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    P64gh7 <= W1qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  R74gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    R74gh7 <= Xzpfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  T84gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    T84gh7 <= Pisfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  W94gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    W94gh7 <= M4qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ya4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ya4gh7 <= C7qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ac4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ac4gh7 <= S9qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Cd4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Cd4gh7 <= Icqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ee4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ee4gh7 <= Yeqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ff4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ff4gh7 <= Ohqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Gg4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Gg4gh7 <= Qcsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ih4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ih4gh7 <= Njqfh7;
+	  end
+	always @(posedge Iqsfh7) Ji4gh7 <= Gosfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Nj4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Nj4gh7 <= Oksfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Sk4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Sk4gh7 <= Kdsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ul4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ul4gh7 <= Xgqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Vm4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Vm4gh7 <= Eesfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Xn4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Xn4gh7 <= Heqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Yo4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Yo4gh7 <= Yesfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Bq4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Bq4gh7 <= Rbqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Dr4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Dr4gh7 <= Sfsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Gs4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Gs4gh7 <= B9qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  It4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    It4gh7 <= Mgsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Lu4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Lu4gh7 <= L6qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Nv4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Nv4gh7 <= Ghsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Qw4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Qw4gh7 <= V3qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Sx4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Sx4gh7 <= Aisfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Vy4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Vy4gh7 <= F1qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Xz4gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Xz4gh7 <= K8sfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  D15gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    D15gh7 <= E9sfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  J25gh7 <= 1'b1;
+	end
+	else
+	  begin
+	    J25gh7 <= Insfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  P35gh7 <= 1'b1;
+	end
+	else
+	  begin
+	    P35gh7 <= Kmsfh7;
+	  end
+	always @(posedge Iqsfh7) U45gh7 <= Epsfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Y55gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Y55gh7 <= Mlsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  D75gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    D75gh7 <= Adsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  F85gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    F85gh7 <= Fiqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  G95gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    G95gh7 <= Udsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ia5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ia5gh7 <= Pfqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Jb5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Jb5gh7 <= Oesfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Mc5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Mc5gh7 <= Zcqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Od5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Od5gh7 <= Ifsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Re5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Re5gh7 <= Jaqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Tf5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Tf5gh7 <= Cgsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Wg5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Wg5gh7 <= T7qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Yh5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Yh5gh7 <= Wgsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Bj5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Bj5gh7 <= D5qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Dk5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Dk5gh7 <= Qhsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Gl5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Gl5gh7 <= N2qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Im5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Im5gh7 <= U8sfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  On5gh7 <= 1'b1;
+	end
+	else
+	  begin
+	    On5gh7 <= Unsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Uo5gh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Uo5gh7 <= Wmsfh7;
+	  end
+	always @(posedge Iqsfh7) Aq5gh7 <= Qpsfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Er5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Er5gh7 <= Ylsfh7;
+	  end
+	always @(posedge Iqsfh7) Js5gh7 <= Sosfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Nt5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Nt5gh7 <= Alsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Su5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Su5gh7 <= Vcsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Uv5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Uv5gh7 <= Wiqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Vw5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Vw5gh7 <= Pdsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Xx5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Xx5gh7 <= Ggqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Yy5gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Yy5gh7 <= Jesfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  B06gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    B06gh7 <= Qdqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  D16gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    D16gh7 <= Dfsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  G26gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    G26gh7 <= Abqfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  I36gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    I36gh7 <= Xfsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  L46gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    L46gh7 <= K8qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  N56gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    N56gh7 <= Rgsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Q66gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Q66gh7 <= U5qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  S76gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    S76gh7 <= Lhsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  V86gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    V86gh7 <= E3qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  X96gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    X96gh7 <= Fisfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ab6gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ab6gh7 <= O0qfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Cc6gh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Cc6gh7 <= F8sfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Id6gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Id6gh7 <= Z8sfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Oe6gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Oe6gh7 <= Onsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Uf6gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Uf6gh7 <= Qmsfh7;
+	  end
+	always @(posedge Iqsfh7) Ah6gh7 <= Kpsfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ei6gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Ei6gh7 <= Slsfh7;
+	  end
+	always @(posedge Iqsfh7) Jj6gh7 <= Mosfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Nk6gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Nk6gh7 <= Uksfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Sl6gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Sl6gh7 <= A8sfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ym6gh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Ym6gh7 <= P8sfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Eo6gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Eo6gh7 <= J9sfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Kp6gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Kp6gh7 <= Cnsfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Qq6gh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Qq6gh7 <= Emsfh7;
+	  end
+	always @(posedge Iqsfh7) Vr6gh7 <= Cbsfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Vs6gh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Vs6gh7 <= T9sfh7;
+	  end
+	always @(posedge Iqsfh7) Bu6gh7 <= Hbsfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Bv6gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Bv6gh7 <= Y9sfh7;
+	  end
+	always @(posedge Iqsfh7) Hw6gh7 <= Rbsfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Hx6gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Hx6gh7 <= Iasfh7;
+	  end
+	always @(posedge Iqsfh7) Ny6gh7 <= Wbsfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Nz6gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    Nz6gh7 <= Nasfh7;
+	  end
+	always @(posedge Iqsfh7) T07gh7 <= Bcsfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  T17gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    T17gh7 <= Sasfh7;
+	  end
+	always @(posedge Iqsfh7) Z27gh7 <= Lcsfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Z37gh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Z37gh7 <= O9sfh7;
+	  end
+	always @(posedge Iqsfh7) F57gh7 <= B7sfh7;
+	always @(posedge Iqsfh7) J67gh7 <= Yosfh7;
+	always @(posedge Iqsfh7) N77gh7 <= Mbsfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  N87gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    N87gh7 <= Dasfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  T97gh7 <= 1'b0;
+	end
+	else
+	  begin
+	    T97gh7 <= Glsfh7;
+	  end
+	always @(posedge Iqsfh7) Ya7gh7 <= Aosfh7;
+	always @(posedge Iqsfh7) Cc7gh7 <= Gcsfh7;
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Cd7gh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Cd7gh7 <= Xasfh7;
+	  end
+	always @(posedge Iqsfh7 or negedge Wpsfh7) if (~Wpsfh7) begin
+	  Ie7gh7 <= 1'b1;
+	end
+	else
+	  begin
+	    Ie7gh7 <= Iksfh7;
+	  end
+	always @(posedge Iqsfh7) Nf7gh7 <= L7sfh7;
+	always @(posedge Iqsfh7) Rg7gh7 <= V7sfh7;
+	always @(posedge Iqsfh7) Vh7gh7 <= Q7sfh7;
+	always @(posedge Iqsfh7) Zi7gh7 <= G7sfh7;
+	always @(posedge Iqsfh7) Dk7gh7 <= R6sfh7;
+endmodule
+
+/*     Design Summary
+                      modules: 1
+                         udps: 0
+                mod flatinsts: 0
+                udp flatinsts: 0
+                        nodes: 1943 (0)
+                  node widths: 2119 (0)
+                      process: 173 (0)
+                        gates: 0 (0)
+                  contassigns: 1818 (0)
+                        ports: 27 (0)
+                     modinsts: 0 (0)
+                     udpinsts: 0 (0)
+                 portconnects: 0 (0)
+*/
+
+// END: VCS tokens
+// Currnet Allocated Virtual Memory Size:  203.73 MB 
+// ===================
+//  DESIGN STATISTICS 
+// ===================
+//
+// No. of design lines (note: includes comments and blank lines)                 4726
+//
+//                                                                             Static<!>  Elaborated<@>    Size(KB)
+//                                                                             ------     ----------       --------
+// No. of all modules (module+interface+package+program):                           1              1              0 
+// No. of module instances:                                                         1              1              0 
+// No. of all processes:                                                          173            173              0 
+// No. of all nodes (variable+net):                                              1943           1943              0 
+// No. of constants                                                               430            430              0 
+// No. of scalar nets:                                                           1756           1756              0 
+// No. of vector nets:                                                             14             14              0 
+// No. of scalar regs/logics:                                                     173            173              0 
+// No. of always blocks:                                                          173            173              0 
+// No. of operators:                                                             2933           2933              0 
+// No. of concatenations:                                                           4              4              0 
+// No. of bit selects:                                                            234            234              0 
+// No. of part selects:                                                             1              1              0 
+// No. of non-blocking assignments:                                               322            322              0 
+// No. of continuous assignments:                                                1818           1818              0 
+//
+// No. of top level modules/programs/packages/interfaces:                           1
+//        modules:                                                                  1
+// No. of module+udp ports:                                                        27
+//
+// Footnotes:
+// ---------
+// <!> No. of unique instances of a construct as it appears in the source.
+// <@> No. of instances of a construct when the design is elaborated.
+// K, M, B: Counted in thousands, millions and billions (if big numbers are present)
+//
+// <#> Multiple specify blocks in the SAME module are combined and counted
+//     as ONE block.
diff --git a/IPLIB/ADPcontrol_v1_0/ADPcontrol_v1_0.v b/IPLIB/ADPcontrol_v1_0/ADPcontrol_v1_0.v
new file mode 100755
index 0000000..7b8967c
--- /dev/null
+++ b/IPLIB/ADPcontrol_v1_0/ADPcontrol_v1_0.v
@@ -0,0 +1,103 @@
+//-----------------------------------------------------------------------------
+// top-level soclabs ASCII Debug Protocol controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-2, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+
+	module ADPcontrol_v1_0 #
+	(
+		// Users to add parameters here
+    parameter PROMPT_CHAR          = "]"
+
+		// User parameters ends
+		// Do not modify the parameters beyond this line
+
+	)
+	(
+		// Users to add ports here
+
+		// User ports ends
+		// Do not modify the ports beyond this line
+
+		// Ports of Axi Slave Bus Interface com_rx
+		input wire  ahb_hclk,
+		input wire  ahb_hresetn,
+		
+		output wire com_rx_tready,
+		input wire [7 : 0] com_rx_tdata,
+		input wire  com_rx_tvalid,
+
+		// Ports of Axi Master Bus Interface com_tx
+		output wire  com_tx_tvalid,
+		output wire [7 : 0] com_tx_tdata,
+		input wire  com_tx_tready,
+
+		// Ports of Axi Slave Bus Interface stdio_rx
+		output wire  stdio_rx_tready,
+		input wire [7 : 0] stdio_rx_tdata,
+		input wire  stdio_rx_tvalid,
+
+		// Ports of Axi Master Bus Interface stdio_tx
+		output wire  stdio_tx_tvalid,
+		output wire [7 : 0] stdio_tx_tdata,
+		input wire  stdio_tx_tready,
+
+		output wire [7 : 0]    gpo8,
+		input  wire [7 : 0]    gpi8,
+		
+        output wire [31:0]     ahb_haddr    ,
+        output wire [ 2:0]     ahb_hburst   ,
+        output wire            ahb_hmastlock,
+        output wire [ 3:0]     ahb_hprot    ,
+        output wire [ 2:0]     ahb_hsize    ,
+        output wire [ 1:0]     ahb_htrans   ,
+        output wire [31:0]     ahb_hwdata   ,
+        output wire            ahb_hwrite   ,
+        input  wire  [31:0]    ahb_hrdata   ,
+        input  wire            ahb_hready   ,
+        input  wire            ahb_hresp    
+	);
+
+	// Add user logic here
+
+ADPmanager
+   #(.PROMPT_CHAR     (PROMPT_CHAR))
+ ADPmanager(
+  .HCLK        (ahb_hclk      ),
+  .HRESETn     (ahb_hresetn   ),
+  .HADDR32_o   (ahb_haddr     ),
+  .HBURST3_o   (ahb_hburst    ),
+  .HMASTLOCK_o (ahb_hmastlock ),
+  .HPROT4_o    (ahb_hprot     ),
+  .HSIZE3_o    (ahb_hsize     ),
+  .HTRANS2_o   (ahb_htrans    ),
+  .HWDATA32_o  (ahb_hwdata    ),
+  .HWRITE_o    (ahb_hwrite    ),
+  .HRDATA32_i  (ahb_hrdata    ),
+  .HREADY_i    (ahb_hready    ),
+  .HRESP_i     (ahb_hresp     ),
+  .GPO8_o      (gpo8          ),
+  .GPI8_i      (gpi8          ),
+  .COMRX_TREADY_o(com_rx_tready),
+  .COMRX_TDATA_i(com_rx_tdata),
+  .COMRX_TVALID_i(com_rx_tvalid),
+  .STDRX_TREADY_o(stdio_rx_tready),
+  .STDRX_TDATA_i(stdio_rx_tdata),
+  .STDRX_TVALID_i(stdio_rx_tvalid),
+  .COMTX_TVALID_o(com_tx_tvalid),
+  .COMTX_TDATA_o(com_tx_tdata),
+  .COMTX_TREADY_i(com_tx_tready),
+  .STDTX_TVALID_o(stdio_tx_tvalid),
+  .STDTX_TDATA_o(stdio_tx_tdata),
+  .STDTX_TREADY_i(stdio_tx_tready)
+
+  );
+
+
+endmodule
diff --git a/IPLIB/ADPcontrol_v1_0/ADPmanager.v b/IPLIB/ADPcontrol_v1_0/ADPmanager.v
new file mode 100755
index 0000000..f4747ae
--- /dev/null
+++ b/IPLIB/ADPcontrol_v1_0/ADPmanager.v
@@ -0,0 +1,786 @@
+//-----------------------------------------------------------------------------
+// soclabs ASCII Debug Protocol controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-2, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+
+//`define ADPBASIC 1
+
+module ADPmanager // AHB initiator interface
+   #(parameter PROMPT_CHAR          = "]"
+    )
+            ( input  wire                  HCLK,
+              input  wire                  HRESETn,
+              output wire        [31:0]    HADDR32_o,
+              output wire        [ 2:0]    HBURST3_o,
+              output wire                  HMASTLOCK_o,
+              output wire        [ 3:0]    HPROT4_o,
+              output wire        [ 2:0]    HSIZE3_o,
+              output wire        [ 1:0]    HTRANS2_o,
+              output wire        [31:0]    HWDATA32_o,
+              output wire                  HWRITE_o,
+              input  wire         [31:0]   HRDATA32_i,
+              input  wire                  HREADY_i,
+              input  wire                  HRESP_i,
+// COMIO interface
+    output wire [ 7:0] GPO8_o,
+    input  wire [ 7:0] GPI8_i,
+//    input  wire     COM_RXE_i,
+    input  wire [ 7:0] COMRX_TDATA_i,
+    input  wire        COMRX_TVALID_i,
+    output wire        COMRX_TREADY_o,
+//    input  wire     COM_TXF_i,
+    output wire [ 7:0] COMTX_TDATA_o,
+    output wire        COMTX_TVALID_o,
+    input  wire        COMTX_TREADY_i,
+// STDIO interface
+//    input  wire     STDOUT_RXE_i,
+    input  wire [ 7:0] STDRX_TDATA_i,
+    input  wire        STDRX_TVALID_i,
+    output wire        STDRX_TREADY_o,
+//    input  wire     STDIN_TXF_i
+    output wire [ 7:0] STDTX_TDATA_o,
+    output wire        STDTX_TVALID_o,
+    input  wire        STDTX_TREADY_i
+);
+
+wire COM_RXE_i = !COMRX_TVALID_i;
+wire COM_TXF_i = !COMTX_TREADY_i;
+
+//wire adp_rx_req = COMRX_TVALID_i & COMRX_TREADY_o;
+//wire std_rx_req = STDRX_TVALID_i & STDRX_TREADY_o;
+
+
+wire STD_TXF_i = !STDTX_TREADY_i;
+wire STD_RXE_i = !STDRX_TVALID_i;
+
+`ifdef ADPBASIC
+  localparam BANNERHEX = 32'h50c1ab01;
+`else
+  localparam BANNERHEX = 32'h50c1ab02;
+`endif
+ 
+localparam CMD_bad = 4'b0000;
+localparam CMD_A   = 4'b0001;  // set address
+`ifndef ADPBASIC
+localparam CMD_B   = 4'b1000;  // Binary upload (wordocunt) from addr++
+localparam CMD_M   = 4'b1010;  // set read mask
+localparam CMD_P   = 4'b1011;  // Poll hardware  (count)
+localparam CMD_V   = 4'b1100;  // match value
+localparam CMD_Z   = 4'b1101;  // Zero-fill (wordocunt) from addr++
+`endif
+localparam CMD_C   = 4'b1001;  // Control
+localparam CMD_R   = 4'b0010;  // read word, addr++
+localparam CMD_S   = 4'b0011;  // Status/STDIN
+localparam CMD_W   = 4'b0100;  // write word, addr++
+localparam CMD_X   = 4'b0101;  // exit
+
+
+function FNvalid_adp_entry; // Escape char
+input [7:0] char8;
+  FNvalid_adp_entry = (char8[7:0] ==  8'h1b);
+endfunction
+
+function [3:0] FNvalid_cmd;
+input [7:0] char8;
+case (char8[7:0])
+"A": FNvalid_cmd = CMD_A;
+"a": FNvalid_cmd = CMD_A;
+"C": FNvalid_cmd = CMD_C;
+"c": FNvalid_cmd = CMD_C;
+"R": FNvalid_cmd = CMD_R;
+"r": FNvalid_cmd = CMD_R;
+"S": FNvalid_cmd = CMD_S;
+"s": FNvalid_cmd = CMD_S;
+"W": FNvalid_cmd = CMD_W;
+"w": FNvalid_cmd = CMD_W;
+"X": FNvalid_cmd = CMD_X;
+"x": FNvalid_cmd = CMD_X;
+`ifndef ADPBASIC
+"B": FNvalid_cmd = CMD_B;
+"b": FNvalid_cmd = CMD_B;
+"M": FNvalid_cmd = CMD_M;
+"m": FNvalid_cmd = CMD_M;
+"P": FNvalid_cmd = CMD_P;
+"p": FNvalid_cmd = CMD_P;
+"V": FNvalid_cmd = CMD_V;
+"v": FNvalid_cmd = CMD_V;
+"Z": FNvalid_cmd = CMD_Z;
+"z": FNvalid_cmd = CMD_Z;
+`endif
+default:
+      FNvalid_cmd = 0;
+endcase
+endfunction
+
+function FNvalid_space; // space or tab char
+input [7:0] char8;
+  FNvalid_space = ((char8[7:0] == 8'h20) || (char8[7:0] == 8'h09));
+endfunction
+
+function FNnull; // space or tab char
+input [7:0] char8;
+  FNnull = (char8[7:0] == 8'h00);
+endfunction
+
+function FNexit; // EOF
+input [7:0] char8;
+  FNexit = ((char8[7:0] == 8'h04) || (char8[7:0] == 8'h00));
+endfunction
+
+function FNvalid_EOL; // CR or LF
+input [7:0] char8;
+  FNvalid_EOL = ((char8[7:0] == 8'h0a) || (char8[7:0] == 8'h0d));
+endfunction
+
+function FNuppercase;
+input [7:0] char8;
+  FNuppercase = (char8[6]) ? (char8 & 8'h5f) : (char8);
+endfunction
+ 
+function [63:0] FNBuild_param64_hexdigit;
+input [63:0] param64;
+input [7:0] char8;
+case (char8[7:0])
+"\t":FNBuild_param64_hexdigit = 64'b0; // tab starts new (zeroed) param64
+" ": FNBuild_param64_hexdigit = 64'b0; // space starts new (zeroed) param64
+"x": FNBuild_param64_hexdigit = 64'b0; // hex prefix starts new (zeroed) param64
+"X": FNBuild_param64_hexdigit = 64'b0; // hex prefix starts new (zeroed) param64
+"0": FNBuild_param64_hexdigit = {param64[59:0],4'b0000};
+"1": FNBuild_param64_hexdigit = {param64[59:0],4'b0001};
+"2": FNBuild_param64_hexdigit = {param64[59:0],4'b0010};
+"3": FNBuild_param64_hexdigit = {param64[59:0],4'b0011};
+"4": FNBuild_param64_hexdigit = {param64[59:0],4'b0100};
+"5": FNBuild_param64_hexdigit = {param64[59:0],4'b0101};
+"6": FNBuild_param64_hexdigit = {param64[59:0],4'b0110};
+"7": FNBuild_param64_hexdigit = {param64[59:0],4'b0111};
+"8": FNBuild_param64_hexdigit = {param64[59:0],4'b1000};
+"9": FNBuild_param64_hexdigit = {param64[59:0],4'b1001};
+"A": FNBuild_param64_hexdigit = {param64[59:0],4'b1010};
+"B": FNBuild_param64_hexdigit = {param64[59:0],4'b1011};
+"C": FNBuild_param64_hexdigit = {param64[59:0],4'b1100};
+"D": FNBuild_param64_hexdigit = {param64[59:0],4'b1101};
+"E": FNBuild_param64_hexdigit = {param64[59:0],4'b1110};
+"F": FNBuild_param64_hexdigit = {param64[59:0],4'b1111};
+"a": FNBuild_param64_hexdigit = {param64[59:0],4'b1010};
+"b": FNBuild_param64_hexdigit = {param64[59:0],4'b1011};
+"c": FNBuild_param64_hexdigit = {param64[59:0],4'b1100};
+"d": FNBuild_param64_hexdigit = {param64[59:0],4'b1101};
+"e": FNBuild_param64_hexdigit = {param64[59:0],4'b1110};
+"f": FNBuild_param64_hexdigit = {param64[59:0],4'b1111};
+default: FNBuild_param64_hexdigit = param64; // EOL etc returns param64 unchanged
+endcase
+endfunction
+
+function [63:0] FNBuild_param64_byte;
+input [63:0] param64;
+input [7:0] byte;
+  FNBuild_param64_byte = {byte[7:0], param64[63:08]};
+endfunction
+
+function [31:0] FNBuild_param32_hexdigit;
+input [31:0] param32;
+input [7:0] char8;
+case (char8[7:0])
+"\t":FNBuild_param32_hexdigit = 32'b0; // tab starts new (zeroed) param32
+" ": FNBuild_param32_hexdigit = 32'b0; // space starts new (zeroed) param32
+"x": FNBuild_param32_hexdigit = 32'b0; // hex prefix starts new (zeroed) param32
+"X": FNBuild_param32_hexdigit = 32'b0; // hex prefix starts new (zeroed) param32
+"0": FNBuild_param32_hexdigit = {param32[27:0],4'b0000};
+"1": FNBuild_param32_hexdigit = {param32[27:0],4'b0001};
+"2": FNBuild_param32_hexdigit = {param32[27:0],4'b0010};
+"3": FNBuild_param32_hexdigit = {param32[27:0],4'b0011};
+"4": FNBuild_param32_hexdigit = {param32[27:0],4'b0100};
+"5": FNBuild_param32_hexdigit = {param32[27:0],4'b0101};
+"6": FNBuild_param32_hexdigit = {param32[27:0],4'b0110};
+"7": FNBuild_param32_hexdigit = {param32[27:0],4'b0111};
+"8": FNBuild_param32_hexdigit = {param32[27:0],4'b1000};
+"9": FNBuild_param32_hexdigit = {param32[27:0],4'b1001};
+"A": FNBuild_param32_hexdigit = {param32[27:0],4'b1010};
+"B": FNBuild_param32_hexdigit = {param32[27:0],4'b1011};
+"C": FNBuild_param32_hexdigit = {param32[27:0],4'b1100};
+"D": FNBuild_param32_hexdigit = {param32[27:0],4'b1101};
+"E": FNBuild_param32_hexdigit = {param32[27:0],4'b1110};
+"F": FNBuild_param32_hexdigit = {param32[27:0],4'b1111};
+"a": FNBuild_param32_hexdigit = {param32[27:0],4'b1010};
+"b": FNBuild_param32_hexdigit = {param32[27:0],4'b1011};
+"c": FNBuild_param32_hexdigit = {param32[27:0],4'b1100};
+"d": FNBuild_param32_hexdigit = {param32[27:0],4'b1101};
+"e": FNBuild_param32_hexdigit = {param32[27:0],4'b1110};
+"f": FNBuild_param32_hexdigit = {param32[27:0],4'b1111};
+default: FNBuild_param32_hexdigit = param32; // EOL etc returns param32 unchanged
+endcase
+endfunction
+
+function [31:0] FNBuild_param32_byte;
+input [31:0] param32;
+input [7:0] byte;
+  FNBuild_param32_byte = {byte[7:0], param32[31:08]};
+endfunction
+
+
+
+function [7:0] FNmap_hex_digit;
+input [3:0] nibble;
+case (nibble[3:0])
+4'b0000: FNmap_hex_digit = "0";
+4'b0001: FNmap_hex_digit = "1";
+4'b0010: FNmap_hex_digit = "2";
+4'b0011: FNmap_hex_digit = "3";
+4'b0100: FNmap_hex_digit = "4";
+4'b0101: FNmap_hex_digit = "5";
+4'b0110: FNmap_hex_digit = "6";
+4'b0111: FNmap_hex_digit = "7";
+4'b1000: FNmap_hex_digit = "8";
+4'b1001: FNmap_hex_digit = "9";
+4'b1010: FNmap_hex_digit = "a";
+4'b1011: FNmap_hex_digit = "b";
+4'b1100: FNmap_hex_digit = "c";
+4'b1101: FNmap_hex_digit = "d";
+4'b1110: FNmap_hex_digit = "e";
+4'b1111: FNmap_hex_digit = "f";
+default: FNmap_hex_digit = "0";
+endcase
+endfunction
+
+
+// as per Vivado synthesis mapping
+`ifdef ADPFSMDESIGN
+localparam    ADP_WRITEHEX = 6'b000000 ; 
+localparam   ADP_WRITEHEXS = 6'b000001 ; 
+localparam   ADP_WRITEHEX9 = 6'b000010 ; 
+localparam   ADP_WRITEHEX8 = 6'b000011 ; 
+localparam   ADP_WRITEHEX7 = 6'b000100 ; 
+localparam   ADP_WRITEHEX6 = 6'b000101 ; 
+localparam   ADP_WRITEHEX5 = 6'b000110 ; 
+localparam   ADP_WRITEHEX4 = 6'b000111 ; 
+localparam   ADP_WRITEHEX3 = 6'b001000 ; 
+localparam   ADP_WRITEHEX2 = 6'b001001 ; 
+localparam   ADP_WRITEHEX1 = 6'b001010 ; 
+localparam   ADP_WRITEHEX0 = 6'b001011 ; 
+localparam     ADP_LINEACK = 6'b001101 ; 
+localparam    ADP_LINEACK2 = 6'b110010 ; 
+localparam  	ADP_PROMPT = 6'b001110 ; 
+localparam  	 ADP_IOCHK = 6'b001111 ; 
+localparam  	 ADP_RXCMD = 6'b010000 ; 
+localparam     ADP_RXPARAM = 6'b010010 ; 
+localparam  	ADP_ACTION = 6'b010011 ; 
+localparam  	  ADP_READ = 6'b010001 ; 
+localparam  	ADP_SYSCHK = 6'b010100 ; 
+localparam  	 ADP_STDIN = 6'b010101 ; 
+localparam  	ADP_SYSCTL = 6'b010110 ; 
+localparam  	 ADP_WRITE = 6'b010111 ; 
+localparam  	  ADP_EXIT = 6'b011000 ; 
+localparam  	 STD_IOCHK = 6'b011001 ; 
+localparam  	  STD_RXD1 = 6'b011010 ; 
+localparam  	  STD_RXD2 = 6'b011011 ; 
+localparam  	  STD_TXD1 = 6'b011101 ; 
+localparam  	  STD_TXD2 = 6'b011110 ; 
+localparam  	 ADP_BCTRL = 6'b011111 ; 
+localparam     ADP_BREADB0 = 6'b100000 ; 
+localparam     ADP_BREADB1 = 6'b100001 ; 
+localparam     ADP_BREADB2 = 6'b100010 ; 
+localparam     ADP_BREADB3 = 6'b100011 ; 
+localparam  	ADP_BWRITE = 6'b100100 ; 
+localparam  	  ADP_POLL = 6'b100101 ; 
+localparam  	 ADP_POLL1 = 6'b100110 ; 
+localparam  	 ADP_POLL2 = 6'b100111 ; 
+localparam  	 ADP_ZCTRL = 6'b101110 ;
+localparam  	ADP_ZWRITE = 6'b101111 ; 
+localparam     ADP_ECHOCMD = 6'b110000 ; 
+localparam   ADP_ECHOCMDSP = 6'b110001 ;
+localparam     ADP_UNKNOWN = 6'b101000 ; 
+localparam  	ADP_STDOUT = 6'b101010 ;
+localparam     ADP_STDOUT1 = 6'b101011 ;
+localparam     ADP_STDOUT2 = 6'b101100 ;
+localparam     ADP_STDOUT3 = 6'b101101 ;
+reg  [5:0] adp_state   ;
+`else
+// one-hot encoded explicitly
+localparam   ADP_WRITEHEX = 48'b000000000000000000000000000000000000000000000001 ; // = 6'b000000
+localparam  ADP_WRITEHEXS = 48'b000000000000000000000000000000000000000000000010 ; // = 6'b000001
+localparam  ADP_WRITEHEX9 = 48'b000000000000000000000000000000000000000000000100 ; // = 6'b000010
+localparam  ADP_WRITEHEX8 = 48'b000000000000000000000000000000000000000000001000 ; // = 6'b000011
+localparam  ADP_WRITEHEX7 = 48'b000000000000000000000000000000000000000000010000 ; // = 6'b000100
+localparam  ADP_WRITEHEX6 = 48'b000000000000000000000000000000000000000000100000 ; // = 6'b000101
+localparam  ADP_WRITEHEX5 = 48'b000000000000000000000000000000000000000001000000 ; // = 6'b000110
+localparam  ADP_WRITEHEX4 = 48'b000000000000000000000000000000000000000010000000 ; // = 6'b000111
+localparam  ADP_WRITEHEX3 = 48'b000000000000000000000000000000000000000100000000 ; // = 6'b001000
+localparam  ADP_WRITEHEX2 = 48'b000000000000000000000000000000000000001000000000 ; // = 6'b001001
+localparam  ADP_WRITEHEX1 = 48'b000000000000000000000000000000000000010000000000 ; // = 6'b001010
+localparam  ADP_WRITEHEX0 = 48'b000000000000000000000000000000000000100000000000 ; // = 6'b001011
+localparam    ADP_LINEACK = 48'b000000000000000000000000000000000001000000000000 ; // = 6'b001101
+localparam   ADP_LINEACK2 = 48'b000000000000000000000000000000000010000000000000 ; // = 6'b110010
+localparam     ADP_PROMPT = 48'b000000000000000000000000000000000100000000000000 ; // = 6'b001110
+localparam      ADP_IOCHK = 48'b000000000000000000000000000000001000000000000000 ; // = 6'b001111
+localparam      ADP_RXCMD = 48'b000000000000000000000000000000010000000000000000 ; // = 6'b010000
+localparam    ADP_RXPARAM = 48'b000000000000000000000000000000100000000000000000 ; // = 6'b010010
+localparam     ADP_ACTION = 48'b000000000000000000000000000001000000000000000000 ; // = 6'b010011
+localparam       ADP_READ = 48'b000000000000000000000000000010000000000000000000 ; // = 6'b010001
+localparam     ADP_SYSCHK = 48'b000000000000000000000000000100000000000000000000 ; // = 6'b010100
+localparam      ADP_STDIN = 48'b000000000000000000000000001000000000000000000000 ; // = 6'b010101
+localparam     ADP_SYSCTL = 48'b000000000000000000000000010000000000000000000000 ; // = 6'b010110
+localparam      ADP_WRITE = 48'b000000000000000000000000100000000000000000000000 ; // = 6'b010111
+localparam       ADP_EXIT = 48'b000000000000000000000001000000000000000000000000 ; // = 6'b011000
+localparam      STD_IOCHK = 48'b000000000000000000000010000000000000000000000000 ; // = 6'b011001
+localparam       STD_RXD1 = 48'b000000000000000000000100000000000000000000000000 ; // = 6'b011010
+localparam       STD_RXD2 = 48'b000000000000000000001000000000000000000000000000 ; // = 6'b011011
+localparam       STD_TXD1 = 48'b000000000000000000010000000000000000000000000000 ; // = 6'b011101
+localparam       STD_TXD2 = 48'b000000000000000000100000000000000000000000000000 ; // = 6'b011110
+localparam      ADP_BCTRL = 48'b000000000000000001000000000000000000000000000000 ; // = 6'b011111
+localparam    ADP_BREADB0 = 48'b000000000000000010000000000000000000000000000000 ; // = 6'b100000
+localparam    ADP_BREADB1 = 48'b000000000000000100000000000000000000000000000000 ; // = 6'b100001
+localparam    ADP_BREADB2 = 48'b000000000000001000000000000000000000000000000000 ; // = 6'b100010
+localparam    ADP_BREADB3 = 48'b000000000000010000000000000000000000000000000000 ; // = 6'b100011
+localparam     ADP_BWRITE = 48'b000000000000100000000000000000000000000000000000 ; // = 6'b100100
+localparam       ADP_POLL = 48'b000000000001000000000000000000000000000000000000 ; // = 6'b100101
+localparam      ADP_POLL1 = 48'b000000000010000000000000000000000000000000000000 ; // = 6'b100110
+localparam      ADP_POLL2 = 48'b000000000100000000000000000000000000000000000000 ; // = 6'b100111
+localparam      ADP_ZCTRL = 48'b000000001000000000000000000000000000000000000000 ; // = 6'b101110
+localparam     ADP_ZWRITE = 48'b000000010000000000000000000000000000000000000000 ; // = 6'b101111
+localparam    ADP_ECHOCMD = 48'b000000100000000000000000000000000000000000000000 ; // = 6'b110000
+localparam  ADP_ECHOCMDSP = 48'b000001000000000000000000000000000000000000000000 ; // = 6'b110001
+localparam    ADP_UNKNOWN = 48'b000010000000000000000000000000000000000000000000 ; // = 6'b101000
+localparam     ADP_STDOUT = 48'b000100000000000000000000000000000000000000000000 ; // = 6'b101010
+localparam    ADP_STDOUT1 = 48'b001000000000000000000000000000000000000000000000 ; // = 6'b101011
+localparam    ADP_STDOUT2 = 48'b010000000000000000000000000000000000000000000000 ; // = 6'b101100
+localparam    ADP_STDOUT3 = 48'b100000000000000000000000000000000000000000000000 ; // = 6'b101101
+reg [47:0] adp_state   ;
+`endif
+
+reg [31:0] adp_bus_data;
+reg        banner      ;
+reg        com_tx_req  ;
+reg  [7:0] com_tx_byte ;
+reg        com_rx_ack  ;
+reg        std_tx_req  ;
+reg [ 7:0] std_tx_byte;
+reg        std_rx_ack  ;
+reg        adp_bus_req ;
+reg        adp_bus_write ;
+reg  [7:0] adp_cmd     ;
+reg [31:0] adp_param   ;
+reg [31:0] adp_addr    ;
+reg        adp_addr_inc;
+reg [31:0] adp_sys     ;
+
+assign GPO8_o = adp_sys[7:0];
+
+// ADP RX stream
+wire        com_rx_req = COMRX_TVALID_i;
+wire [ 7:0] com_rx_byte = COMRX_TDATA_i;
+assign      COMRX_TREADY_o = com_rx_ack;
+// ADP TX stream
+wire        com_tx_ack = COMTX_TREADY_i;
+assign      COMTX_TDATA_o = com_tx_byte;
+assign      COMTX_TVALID_o = com_tx_req;
+// STD RX stream (from STDOUT)
+wire        std_rx_req  = STDRX_TVALID_i;
+wire [ 7:0] std_rx_byte = STDRX_TDATA_i;
+assign      STDRX_TREADY_o = std_rx_ack;
+// STD TX stream (to STDIN)
+wire         std_tx_ack = STDTX_TREADY_i;
+assign       STDTX_TDATA_o = std_tx_byte;
+assign       STDTX_TVALID_o = std_tx_req;
+
+//AMBA AHB master as "stream" interface
+reg        ahb_dphase;
+wire       ahb_aphase = adp_bus_req & !ahb_dphase;
+wire       adp_bus_ack = ahb_dphase & HREADY_i;
+// control pipe
+always @(posedge HCLK or negedge HRESETn)
+  if(!HRESETn)
+    ahb_dphase    <= 0;
+  else if (HREADY_i)
+    ahb_dphase    <= (ahb_aphase);
+
+assign HADDR32_o     =  adp_addr;
+assign HBURST3_o     =  3'b001; // "INCR" burst signalled whenever transfer;
+assign HMASTLOCK_o   =  1'b0;
+assign HPROT4_o[3:0] = {1'b0, 1'b0, 1'b1, 1'b1};
+assign HSIZE3_o[2:0] = {1'b0, 2'b10};
+assign HTRANS2_o     = {ahb_aphase,1'b0}; // non-seq
+assign HWDATA32_o    =  adp_bus_data;
+assign HWRITE_o      =  adp_bus_write;
+
+
+`ifndef ADPBASIC
+//reg  [63:0] adp_bctrl64;
+reg  [31:0] adp_bctrl;
+reg  [31:0] adp_val;
+reg  [31:0] adp_mask;
+reg  [31:0] adp_poll;
+reg  [31:0] adp_count;
+reg         adp_count_dec ;
+wire        adp_delay_done;
+wire        adp_bctrl_done;
+wire        adp_bctrl_zero;
+wire        poll2_loop_next;
+`endif
+
+// ADP_control flags in the 'C' control field
+wire        adp_disable;
+wire        adp_stdin_wait;
+
+// commnon interface handshake terms
+wire com_rx_done   = COMRX_TVALID_i & COMRX_TREADY_o;
+wire com_tx_done   = COMTX_TVALID_o & COMTX_TREADY_i;
+wire std_rx_done   = STDRX_TVALID_i & STDRX_TREADY_o;
+wire std_tx_done   = STDTX_TVALID_o & STDTX_TREADY_i;
+wire adp_bus_done  = (adp_bus_req & adp_bus_ack);
+
+// common task to set up for next state
+task ADP_LINEACK_next; // prepare newline TX (and cancel any startup banner)
+//  begin com_tx_req <= 1; com_tx_byte <= 8'h0A; banner <= 0; adp_state <= ADP_LINEACK; end
+  begin com_tx_req <= 1; com_tx_byte <= 8'h0A; adp_state <= ADP_LINEACK; end
+endtask
+task ADP_PROMPT_next; // prepare prompt TX
+  begin com_tx_req <= 1; com_tx_byte <= PROMPT_CHAR; adp_state <= ADP_PROMPT; end
+endtask
+task ADP_BUSWRITEINC_next; // prepare bus write and addr++ on completion
+  begin adp_bus_req <=1; adp_bus_write <=1; adp_addr_inc <=1; end
+endtask
+task ADP_BUSREADINC_next; // prepare bus read and addr++ on completion
+  begin adp_bus_req <=1; adp_bus_write <=0; adp_addr_inc <=1; end
+endtask
+
+task ADP_hexdigit_next; // output nibble
+input [3:0] nibble;
+  begin com_tx_req <= 1; com_tx_byte <= FNmap_hex_digit(nibble[3:0]); end
+endtask
+task ADP_txchar_next; // output char
+input [7:0] byte;
+  begin com_tx_req<= 1; com_tx_byte <= byte; end
+endtask
+
+task com_rx_nxt; com_rx_ack <=1; endtask
+
+function FNcount_down_zero_next; // param about to be zero
+input [31:0] counter;
+  FNcount_down_zero_next = !(|counter[31:1]);
+endfunction
+
+always @(posedge HCLK or negedge HRESETn)
+  if(!HRESETn) begin
+      adp_state    <= ADP_WRITEHEX ;
+      adp_bus_data <= BANNERHEX;
+      banner       <= 1; // start-up HEX message
+      com_tx_req   <= 0; // default no TX req
+      com_rx_ack   <= 0; // default no RX ack
+      std_tx_req   <= 0; // default no TX req
+      std_rx_ack   <= 0; // default no RX ack
+      adp_bus_req  <= 0; // default no bus transaction
+      adp_cmd      <= 0;
+      adp_param    <= 0;
+      adp_addr     <= 0;
+      adp_addr_inc <= 0;
+      adp_bus_write<= 0;
+`ifndef ADPBASIC
+      adp_count    <= 0;
+      adp_count_dec<= 0;
+      adp_val      <= 0;
+      adp_mask     <= 0;
+      adp_sys      <= 0;
+`endif
+  end else begin // default states
+      adp_state    <= adp_state; // default to hold current state
+      com_tx_req   <= 0; // default no TX req
+      com_rx_ack   <= 0; // default no RX ack
+      std_tx_req   <= 0; // default no TX req
+      std_rx_ack   <= 0; // default no RX ack
+      adp_bus_req  <= 0; // default no bus transaction
+      adp_addr     <= (adp_addr_inc & adp_bus_done) ? adp_addr + 4 : adp_addr; // address++
+      adp_addr_inc <= 0;
+`ifndef ADPBASIC
+      adp_count    <= (adp_count_dec & adp_bus_done & |adp_count) ? adp_count - 1 : adp_count; // param--
+      adp_count_dec<= 0;
+`endif     
+    case (adp_state)
+// >>>>>>>>>>>>>>>> STDIO BYPASS >>>>>>>>>>>>>>>>>>>>>>
+       STD_IOCHK:  // check for commsrx or STDOUT and not busy service, else loop back
+         if (com_rx_req) begin com_rx_ack <= 1; adp_state <= STD_RXD1; end // input char pending for STDIN
+//         else if (com_tx_ack & std_rx_req) begin std_rx_ack <= 1; adp_state <= STD_TXD1; end // STDOUT char pending and not busy
+         else if (std_rx_req) begin std_rx_ack <= 1; adp_state <= STD_TXD1; end // STDOUT char pending and not busy
+       STD_TXD1:  // get STD out char
+         if (std_rx_done)
+           begin com_tx_byte <= std_rx_byte; com_tx_req <= 1; adp_state <= STD_TXD2; end
+         else std_rx_ack <= 1; // extend
+       STD_TXD2:  // output char to ADP channel
+         if (com_tx_done) begin adp_state <= STD_IOCHK; end
+         else com_tx_req <= 1;  // extend
+       STD_RXD1:  // read rx char and check for ADP entry else STDIN **
+         if (com_rx_done) begin
+           if (FNvalid_adp_entry(com_rx_byte))
+             begin ADP_txchar_next(8'h0A); adp_state <= ADP_LINEACK; end // ADP prompt
+           else if (std_tx_ack)
+             begin std_tx_byte <= com_rx_byte; std_tx_req <= 1; adp_state <= STD_RXD2; end
+           else adp_state <= STD_IOCHK; // otherwise discard STDIN char and process OP data if blocked
+         end else com_rx_ack <= 1;  // extend
+       STD_RXD2:  // get STD in char
+         if (std_tx_done) begin adp_state <= STD_IOCHK; end
+         else std_tx_req <= 1; // extend
+              
+// >>>>>>>>>>>>>>>> ADP Monitor >>>>>>>>>>>>>>>>>>>>>>
+       ADP_PROMPT:  // transition after reset deassertion
+         if (com_tx_done) begin adp_state <= ADP_IOCHK; end
+         else com_tx_req <= 1;  // extend
+
+       ADP_IOCHK:  // check for commsrx or STDOUT and not busy service, else loop back
+         if (com_rx_req) begin com_rx_ack <= 1; adp_state <= ADP_RXCMD; end
+         else if (com_tx_ack & std_rx_req) begin com_tx_byte <= "<"; com_tx_req <= 1; adp_state <= ADP_STDOUT; end
+//         else if (std_rx_req) begin com_tx_byte <= "<"; com_tx_req <= 1; adp_state <= ADP_STDOUT; end
+
+// >>>>>>>>>>>>>>>> ADP <STDOUT> >>>>>>>>>>>>>>>>>>>>>>
+       ADP_STDOUT:  // output "<"
+         if (com_tx_done) begin std_rx_ack <= 1; adp_state <= ADP_STDOUT1; end
+         else com_tx_req <= 1; // extend stream request if not ready
+       ADP_STDOUT1:  // get STD out char
+         if (std_rx_done) begin com_tx_byte <= std_rx_byte; com_tx_req <= 1; adp_state <= ADP_STDOUT2; end
+         else std_rx_ack <= 1; // else extend
+       ADP_STDOUT2:  // output char
+         if (com_tx_done) begin com_tx_byte <= ">"; com_tx_req <= 1; adp_state <= ADP_STDOUT3; end
+         else com_tx_req <= 1;  // else extend
+       ADP_STDOUT3:  // output ">"
+         if (com_tx_done) begin adp_state <= ADP_IOCHK; end
+         else com_tx_req <= 1; // else extend
+
+// >>>>>>>>>>>>>>>> ADP COMMAND PARSING >>>>>>>>>>>>>>>>>>>>>>
+       ADP_RXCMD:  // read and save ADP command
+         if (com_rx_done) begin
+           if (FNexit(com_rx_byte)) adp_state <= STD_IOCHK; // immediate exit
+           else if (FNvalid_space(com_rx_byte)) com_rx_ack <= 1; // retry for a command
+           else if (FNvalid_EOL(com_rx_byte)) begin adp_cmd <= "?"; adp_state <= ADP_ACTION; end // no command, skip param
+           else begin adp_cmd <= com_rx_byte; adp_param <= 32'hffffffff; com_rx_ack <= 1; adp_state <= ADP_RXPARAM; end // get optional parameter
+         end
+         else com_rx_ack <= 1; // extend stream request if not ready
+       ADP_RXPARAM:  // read and build hex parameter
+         if (com_rx_done) begin  // RX byte
+           if (FNexit(com_rx_byte)) adp_state <= STD_IOCHK; // exit
+           else if (FNvalid_EOL(com_rx_byte))
+`ifndef ADPBASIC
+            begin adp_count <= adp_param; adp_state <= ADP_ACTION; end // parameter complete on EOL
+`else
+            begin adp_state <= ADP_ACTION; end // parameter complete on EOL
+`endif
+           else
+             begin adp_param <= FNBuild_param32_hexdigit(adp_param, com_rx_byte); com_rx_ack <= 1; end // build parameter
+           end
+         else com_rx_ack <= 1;
+
+       ADP_ACTION:  // parse command and action with parameter
+         if (FNexit(com_rx_byte))
+           adp_state <= STD_IOCHK;
+         else if (FNvalid_cmd(adp_cmd) == CMD_A)
+           begin if (adp_param == 32'hffffffff) adp_param <= adp_addr; else adp_addr <= adp_param;
+             adp_state <= ADP_ECHOCMD; end
+         else if (FNvalid_cmd(adp_cmd) == CMD_C) begin
+           if (adp_param[31:8] == 0) // report GPO
+             begin adp_state <= ADP_SYSCTL; end
+           else if (adp_param[31:8] == 1) // clear bits in GPO
+             begin adp_sys[7:0] <= adp_sys[7:0] & ~adp_param[7:0]; adp_state <= ADP_SYSCTL; end
+           else if (adp_param[31:8] == 2) // set bits in GPO
+             begin adp_sys[7:0] <= adp_sys[7:0] | adp_param[7:0]; adp_state <= ADP_SYSCTL; end
+           else if (adp_param[31:8] == 3) // overwrite bits in GPO
+             begin adp_sys[7:0] <= adp_param[7:0]; adp_state <= ADP_SYSCTL; end
+           else // 4 etc, report GPO
+             begin adp_state <= ADP_SYSCTL; end
+           end
+         else if (FNvalid_cmd(adp_cmd) == CMD_R)
+           begin ADP_BUSREADINC_next(); adp_state <= ADP_READ; end // no param
+         else if (FNvalid_cmd(adp_cmd) == CMD_S)
+           begin adp_state <= ADP_SYSCHK; end
+         else if (FNvalid_cmd(adp_cmd) == CMD_W)
+           begin adp_bus_data <= adp_param; ADP_BUSWRITEINC_next(); adp_state <= ADP_WRITE; end
+         else if (FNvalid_cmd(adp_cmd) == CMD_X)
+           begin com_tx_byte <= 8'h0a; com_tx_req <= 1; adp_state <= ADP_EXIT; end
+`ifndef ADPBASIC
+         else if (FNvalid_cmd(adp_cmd) == CMD_B)
+           if (FNcount_down_zero_next(adp_param)) adp_state <= ADP_ECHOCMD; else adp_state <= ADP_BCTRL; // non-zero count
+         else if (FNvalid_cmd(adp_cmd) == CMD_M)
+           begin if (adp_param == 32'hffffffff) adp_param <= adp_mask; else adp_mask <= adp_param;
+             adp_state <= ADP_ECHOCMD; end
+         else if (FNvalid_cmd(adp_cmd) == CMD_P)
+           if (FNcount_down_zero_next(adp_param)) adp_state <= ADP_ECHOCMD; else adp_state <= ADP_POLL; // non-zero count
+         else if (FNvalid_cmd(adp_cmd) == CMD_V)
+           begin if (adp_param == 32'hffffffff) adp_param <= adp_val; else adp_val <= adp_param;
+             adp_state <= ADP_ECHOCMD; end
+         else if (FNvalid_cmd(adp_cmd) == CMD_Z)
+           if (FNcount_down_zero_next(adp_param)) adp_state <= ADP_ECHOCMD; else adp_state <= ADP_ZCTRL; // non-zero count
+`endif
+         else
+           begin ADP_txchar_next("?"); adp_state <= ADP_UNKNOWN; end // unrecognised/invald
+
+// >>>>>>>>>>>>>>>> ADP BUS WRITE and READ >>>>>>>>>>>>>>>>>>>>>>
+
+       ADP_WRITE:  // perform bus write at current address pointer (and auto increment)
+         if (adp_bus_done) begin adp_state <= ADP_ECHOCMD; end
+         else begin ADP_BUSWRITEINC_next(); end // extend request
+              
+       ADP_READ:  // perform bus read at current adp address (and auto increment)  - and report in hex
+         if (adp_bus_done) begin adp_bus_data <= HRDATA32_i; ADP_txchar_next("R"); com_tx_req <= 1; adp_state <= ADP_ECHOCMDSP; end
+         else begin ADP_BUSREADINC_next(); end // extend request
+
+`ifndef ADPBASIC
+
+// >>>>>>>>>>>>>>>> ADP BINARY UPLOAD >>>>>>>>>>>>>>>>>>>>>>
+       ADP_BCTRL:  // set control value
+         begin com_rx_ack <= 1; adp_state <= ADP_BREADB0; end  // read next 4 bytes
+       ADP_BREADB0: // read raw binary byte
+         if (com_rx_done) begin com_rx_ack <= 1; adp_bus_data[31:24] <= com_rx_byte; adp_state <= ADP_BREADB1; end
+         else com_rx_ack <= 1;  // extend stream request if not ready
+       ADP_BREADB1: // read raw binary byte
+         if (com_rx_done) begin com_rx_ack <= 1; adp_bus_data[23:16] <= com_rx_byte; adp_state <= ADP_BREADB2; end
+         else com_rx_ack <= 1;  // extend stream request if not ready
+       ADP_BREADB2: // read raw binary byte 0
+         if (com_rx_done) begin com_rx_ack <= 1; adp_bus_data[15: 8] <= com_rx_byte; adp_state <= ADP_BREADB3; end
+         else com_rx_ack <= 1;  // extend stream request if not ready
+       ADP_BREADB3: // read raw binary byte 0
+         if (com_rx_done)
+           begin adp_bus_data[ 7: 0] <= com_rx_byte; ADP_BUSWRITEINC_next(); adp_count_dec <= 1; adp_state <= ADP_BWRITE; end
+         else com_rx_ack <= 1;  // extend stream request if not ready
+       ADP_BWRITE:  // Write word to Addr++
+         if (adp_bus_done) begin // auto address++, count--
+           if (FNcount_down_zero_next(adp_count)) adp_state <= ADP_ECHOCMD; else begin adp_state <= ADP_BREADB0; end
+         end else begin  ADP_BUSWRITEINC_next(); adp_count_dec <= 1; end // extend request
+
+// >>>>>>>>>>>>>>>> ADP BUS READ LOOP >>>>>>>>>>>>>>>>>>>>>>
+       ADP_POLL:  // set poll value
+         begin adp_bus_req <= 1; adp_bus_write <= 0; adp_state <= ADP_POLL1; end
+       ADP_POLL1:  // wait for read data, no addr++
+         if (adp_bus_done) begin adp_bus_data <= HRDATA32_i; adp_count_dec <=1; adp_state <= ADP_POLL2; end
+         else begin adp_bus_req <= 1; adp_count_dec <=1; end
+       ADP_POLL2:
+         if (FNcount_down_zero_next(adp_count)) adp_state <= ADP_ECHOCMD; // timeout
+         else if (((adp_bus_data  & adp_mask) ^ adp_val) == 0) adp_state <= ADP_WRITEHEX; // exact match
+         else adp_state <= ADP_POLL;
+
+// >>>>>>>>>>>>>>>> ADP ZERO MEMORY >>>>>>>>>>>>>>>>>>>>>>
+       ADP_ZCTRL:  // set control value
+           begin adp_bus_data <= adp_val; ADP_BUSWRITEINC_next(); adp_count_dec <= 1; adp_state <= ADP_ZWRITE; end
+       ADP_ZWRITE:  // Write word to Addr++
+         if (adp_bus_done) begin // auto address++, count--
+           if (FNcount_down_zero_next(adp_count)) adp_state <= ADP_ECHOCMD; else begin adp_state <= ADP_ZCTRL; end
+         end else begin  ADP_BUSWRITEINC_next(); adp_count_dec <= 1; end // extend request
+`endif
+        
+        // >>>>>>>>>>>>>>>> ADP MISC >>>>>>>>>>>>>>>>>>>>>>
+
+       ADP_UNKNOWN:  // output "?"
+         if (com_tx_done) begin ADP_LINEACK_next(); end
+         else com_tx_req <= 1;  // extend stream request if not ready
+
+       ADP_EXIT:  // exit ADP mode
+         if (com_tx_done) adp_state <= STD_IOCHK;
+         else com_tx_req <= 1;  // extend stream request if not ready
+
+       ADP_SYSCHK:  // check STDIN fifo
+         begin // no upper flags so STDIN char
+           if (std_tx_ack) begin std_tx_req <=1; std_tx_byte <= adp_param[7:0]; adp_state <= ADP_STDIN; end
+           else begin ADP_txchar_next(8'h0A); com_tx_req <= 1; adp_state <= ADP_LINEACK; end // newline and prompt
+         end 
+       ADP_STDIN:  // push char into STDIN
+         if (std_tx_done) begin adp_bus_data <= adp_param[7:0]; ADP_txchar_next("S"); com_tx_req <= 1; adp_state <= ADP_ECHOCMDSP;  end
+         else std_tx_req <= 1; // extend
+
+       ADP_SYSCTL:  // read current status - and report in hex
+         begin adp_bus_data <= {GPI8_i[7:0],adp_sys[7:0],adp_param[15:0]}; ADP_txchar_next("C"); com_tx_req <= 1; adp_state <= ADP_ECHOCMDSP;  end
+     
+       ADP_ECHOCMD:  // output command and (param) data
+         begin adp_state <= ADP_ECHOCMDSP; ADP_txchar_next(adp_cmd & 8'h5f); adp_bus_data <= adp_param; end // output command char
+       ADP_ECHOCMDSP:  // output command space and (bus) data
+         if (com_tx_done) begin adp_state <= ADP_WRITEHEXS; ADP_txchar_next(" "); end // output space char      
+         else com_tx_req <= 1;  // extend 
+           
+       ADP_WRITEHEX:  // output hex word with prefix
+         begin adp_state <= ADP_WRITEHEXS; ADP_txchar_next(" "); end // output "0" hex prefix
+
+       ADP_WRITEHEXS:
+         if (com_tx_done) begin adp_state <= ADP_WRITEHEX9; ADP_txchar_next("0"); end // output "0" hex prefix
+         else com_tx_req <= 1;  // extend
+       ADP_WRITEHEX9:
+         if (com_tx_done) begin adp_state <= ADP_WRITEHEX8; ADP_txchar_next("x"); end // output "x" hex prefix
+         else com_tx_req <= 1;  // extend
+       ADP_WRITEHEX8:
+         if (com_tx_done) begin adp_state <= ADP_WRITEHEX7; ADP_hexdigit_next(adp_bus_data[31:28]); end // hex nibble 7
+         else com_tx_req <= 1;  // extend
+       ADP_WRITEHEX7:  // output hex nibble 7
+         if (com_tx_done) begin adp_state <= ADP_WRITEHEX6; ADP_hexdigit_next(adp_bus_data[27:24]); end // hex nibble 6
+         else com_tx_req <= 1;  // extend
+       ADP_WRITEHEX6:  // output hex nibble 6
+         if (com_tx_done) begin adp_state <= ADP_WRITEHEX5; ADP_hexdigit_next(adp_bus_data[23:20]); end // hex nibble 5
+         else com_tx_req <= 1;  // extend
+       ADP_WRITEHEX5:  // output hex nibble 5
+         if (com_tx_done) begin adp_state <= ADP_WRITEHEX4; ADP_hexdigit_next(adp_bus_data[19:16]); end // hex nibble 4
+         else com_tx_req <= 1;  // extend
+       ADP_WRITEHEX4:  // output hex nibble 4
+         if (com_tx_done) begin adp_state <= ADP_WRITEHEX3; ADP_hexdigit_next(adp_bus_data[15:12]); end // hex nibble 3
+         else com_tx_req <= 1;  // extend
+       ADP_WRITEHEX3:  // output hex nibble 3
+         if (com_tx_done) begin adp_state <= ADP_WRITEHEX2; ADP_hexdigit_next(adp_bus_data[11: 8]); end // hex nibble 2
+         else com_tx_req <= 1;  // extend
+       ADP_WRITEHEX2:  // output hex nibble 2
+         if (com_tx_done) begin adp_state <= ADP_WRITEHEX1; ADP_hexdigit_next(adp_bus_data[ 7: 4]); end // hex nibble 1
+         else com_tx_req <= 1;  // extend
+       ADP_WRITEHEX1:  // output hex nibble 1
+         if (com_tx_done) begin adp_state <= ADP_WRITEHEX0; ADP_hexdigit_next(adp_bus_data[ 3: 0]); end // hex nibble 0
+         else com_tx_req <= 1;  // extend
+       ADP_WRITEHEX0:  // output hex nibble 0 (if not startup banner then scan to end of line before lineack
+         if (com_tx_done) begin
+           if (banner) begin ADP_LINEACK_next(); end
+           else begin ADP_txchar_next(8'h0A); com_tx_req <= 1; adp_state <= ADP_LINEACK; end // newline and prompt
+         end else com_tx_req <= 1;  // extend
+
+       ADP_LINEACK:  // write EOLN 
+         if (com_tx_done) begin
+           begin ADP_txchar_next(8'h0D); adp_state <= ADP_LINEACK2; end
+         end else com_tx_req <= 1;  // extend
+       ADP_LINEACK2: // CR
+         if (com_tx_done) begin
+           if (banner) begin banner <= 0; adp_state <= STD_IOCHK; end
+           else begin ADP_txchar_next(PROMPT_CHAR); adp_state <= ADP_PROMPT; end
+         end else com_tx_req <= 1;  // extend
+      default: 
+        begin ADP_txchar_next("!"); adp_state <= ADP_UNKNOWN; end // default error
+    endcase
+  end
+
+endmodule
+
+////AHBLITE_ADPMASTER instancing
+//ADPmaster
+//   #(.PROMPT_CHAR     ("]"))
+// ADPmaster(
+//  .HCLK          (ahb_hclk      ),
+//  .HRESETn       (ahb_hrestn    ),
+//  .HADDR32_o   (ahb_haddr     ),
+//  .HBURST3_o   (ahb_hburst    ),
+//  .HMASTLOCK_o (ahb_hmastlock ),
+//  .HPROT4_o    (ahb_hprot     ),
+//  .HSIZE3_o    (ahb_hsize     ),
+//  .HTRANS2_o   (ahb_htrans    ),
+//  .HWDATA32_o  (ahb_hwdata    ),
+//  .HWRITE_o    (ahb_hwrite    ),
+//  .HRDATA32_i  (ahb_hrdata    ),
+//  .HREADY_i    (ahb_hready    ),
+//  .HRESP_i     (ahb_hresp     ),
+  
+//  .COMRX_TREADY_o(com_rx_tready),
+//  .COMRX_TDATA_i(com_rx_tdata),
+//  .COMRX_TVALID_i(com_rx_tvalid),
+//  .STDRX_TREADY_o(std_rx_tready),
+//  .STDRX_TDATA_i(std_rx_tdata),
+//  .STDRX_TVALID_i(std_rx_tvalid),
+//  .COMTX_TVALID_o(com_tx_tvalid),
+//  .COMTX_TDATA_o(com_tx_tdata),
+//  .COMTX_TREADY_i(com_tx_tready),
+//  .STDTX_TVALID_o(std_tx_tvalid),
+//  .STDTX_TDATA_o(std_tx_tdata),
+//  .STDTX_TREADY_i(std_tx_tready)
+
+//  );
diff --git a/IPLIB/FT1248_streamio_v1_0/ft1248_streamio_v1_0.v b/IPLIB/FT1248_streamio_v1_0/ft1248_streamio_v1_0.v
new file mode 100755
index 0000000..b5b8d4b
--- /dev/null
+++ b/IPLIB/FT1248_streamio_v1_0/ft1248_streamio_v1_0.v
@@ -0,0 +1,305 @@
+//-----------------------------------------------------------------------------
+// soclabs on-chip AXI stream to FTDI FT1248 controller
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2022, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module ft1248_streamio_v1_0 #
+	(
+		// Users to add parameters here
+		// FTDI Interface 1,2,4 width supported
+		parameter integer FT1248_WIDTH	= 1,
+		// FTDI clock always on - else quiet when no access
+		parameter integer FT1248_CLKON	= 1
+
+		// User parameters ends
+		// Do not modify the parameters beyond this line
+
+		// Parameters of Axi Stream Master Bus Interface TXD
+		// Parameters of Axi Stream Slave Bus Interface RXD
+	)
+	(
+		// IO pad interface - to FT232R configured in 1/2/4/8 mode
+        output wire  ft_clk_o,         // SCLK
+        output wire  ft_ssn_o,         // SS_N
+        input  wire  ft_miso_i,          // MISO
+        output wire [FT1248_WIDTH-1:0] ft_miosio_o,   // MIOSIO tristate output when enabled
+        output wire [FT1248_WIDTH-1:0] ft_miosio_e,    // MIOSIO tristate output enable (active hi)
+        output wire [FT1248_WIDTH-1:0] ft_miosio_z,   // MIOSIO tristate output enable (active lo)
+        input  wire [FT1248_WIDTH-1:0] ft_miosio_i,    // MIOSIO tristate input
+        
+        input  wire [7:0] ft_clkdiv,    // divider prescaler to ensure SCLK <1MHz
+        
+		// User ports ends
+		// Do not modify the ports beyond this line
+
+        // initially clocked from aclk
+        // asynch 
+		input  wire  clk,
+		input  wire  resetn,
+
+		// Ports of Axi Master Bus Interface TXD
+		output wire  txd_tvalid,
+		output wire [7 : 0] txd_tdata,
+		output wire  txd_tlast,
+		input  wire  txd_tready,
+
+		// Ports of Axi Slave Bus Interface RXD
+		output wire  rxd_tready,
+		input  wire [7 : 0] rxd_tdata,
+		input  wire  rxd_tlast,
+		input  wire  rxd_tvalid
+	);
+
+	//----------------------------------------------
+	//-- State Machine encoding
+	//----------------------------------------------
+
+// Explicit FSM state bit assignment
+//  bit [0] SCLK
+//  bit [1] MIO_OE
+//  bit [2] CMD/W
+//  bit [3] DAT/R
+//  bit [4] SSEL
+
+localparam FT_0_IDLE       = 5'b00000;
+localparam FT_1_IDLE       = 5'b00001;
+localparam FT_ZCMD_CLKLO   = 5'b10100;
+localparam FT_CMD_CLKHI    = 5'b10111;
+localparam FT_CMD_CLKLO    = 5'b10110;
+localparam FT_ZBT_CLKHI    = 5'b10001;
+localparam FT_ZBT_CLKLO    = 5'b10000;
+localparam FT_WD_CLKHI     = 5'b11111;
+localparam FT_WD_CLKLO     = 5'b11110;
+localparam FT_ZWD_CLKLO    = 5'b11100;
+localparam FT_RD_CLKHI     = 5'b11001;
+localparam FT_RD_CLKLO     = 5'b11000;
+
+reg [4:0] ft_state;
+// 9- bit shift register to support 8-bit data + 1 sequence control flag
+// write data uses bits[7:0], with bit[8] set to flag length for serialized transfers
+// read  data uses bits[8:1], with bit[0] set to flag continuation for serialized transfers
+reg [8:0] ft_reg;
+
+	//----------------------------------------------
+	//-- IO PAD control, parameterized on WIDTH param
+	//----------------------------------------------
+	
+wire bwid8 = (FT1248_WIDTH==8);
+wire bwid4 = (FT1248_WIDTH==4);
+wire bwid2 = (FT1248_WIDTH==2);
+wire bwid1 = (FT1248_WIDTH==1);
+
+wire [7:0] ft_rdmasked;
+
+generate if (FT1248_WIDTH == 8) begin
+assign ft_rdmasked[7:1] =  ft_miosio_i[7:1];
+assign ft_miosio_o[7:1] =  ft_reg[7:1];
+assign ft_miosio_e[7:1]  =  {7{ft_state[1]}};
+assign ft_miosio_z[7:1] = ~{7{ft_state[1]}};
+end 
+endgenerate
+
+generate if (FT1248_WIDTH == 4) begin
+assign ft_rdmasked[7:1] =  {4'b1111, ft_miosio_i[3:1]};
+assign ft_miosio_o[3:1] =  ft_reg[3:1];
+assign ft_miosio_e[3:1]  =  {3{ft_state[1]}};
+assign ft_miosio_z[3:1] = ~{3{ft_state[1]}};
+end
+endgenerate
+
+generate if (FT1248_WIDTH == 2) begin
+assign ft_rdmasked[7:1] =  {6'b111111, ft_miosio_i[1]};
+assign ft_miosio_o[1] =  ft_reg[1];
+assign ft_miosio_e[1]  =  ft_state[1];
+assign ft_miosio_z[1] = ~ft_state[1];
+end
+endgenerate
+
+generate if (FT1248_WIDTH == 1)
+assign ft_rdmasked[7:1] =  7'b1111111;
+endgenerate
+
+assign ft_rdmasked[0] = ft_miosio_i[0];
+assign ft_miosio_o[0] =  ft_reg[0];
+assign ft_miosio_e[0]  =  ft_state[1];
+assign ft_miosio_z[0] = ~ft_state[1];
+
+assign ft_clk_o =  ft_state[0];
+assign ft_ssn_o = !ft_state[4];
+
+// diagnostic decodes
+//wire   ft_cmd = !ft_state[3] &  ft_state[2];
+//wire   ft_dwr =  ft_state[3] &  ft_state[2];
+//wire   ft_drd =  ft_state[3] & !ft_state[2];
+
+
+	//----------------------------------------------
+	//-- Internal clock prescaler
+	//----------------------------------------------
+
+	// clock prescaler, ft_clken enables serial IO engine clocking
+	reg [7:0] ft_clkcnt_r;
+	reg       ft_clken;
+
+	always @(posedge clk or negedge resetn )
+	begin
+	  if (!resetn) begin
+	    ft_clkcnt_r <= 0;
+	    ft_clken    <= 0;
+	    end
+	  else begin
+	    ft_clken    <= (ft_clkcnt_r == ft_clkdiv);
+	    ft_clkcnt_r <= (ft_clkcnt_r == ft_clkdiv) ? 0 : (ft_clkcnt_r +1);
+	    end
+	 end
+
+	//----------------------------------------------
+	//-- Internal "synchronizers" (dual stage)
+	//----------------------------------------------
+	// synchronizers for channel ready flags when idle
+	// (treat these signals as synchronous during transfer sequencing)
+	reg ft_miso_i_sync;
+	reg ft_miosio_i0_sync;
+	reg ft_miso_i_sync_1;
+	reg ft_miosio_i0_sync_1;
+
+	always @(posedge clk or negedge resetn )
+	begin
+	  if (!resetn) begin
+	    ft_miso_i_sync_1   <= 1;
+	    ft_miosio_i0_sync_1 <= 1;
+	    ft_miso_i_sync     <= 1;
+	    ft_miosio_i0_sync   <= 1;
+	    end
+	  else begin
+	    ft_miso_i_sync_1   <= ft_miso_i;
+	    ft_miosio_i0_sync_1 <= ft_miosio_i[0];
+	    ft_miso_i_sync     <= ft_miso_i_sync_1;
+	    ft_miosio_i0_sync   <= ft_miosio_i0_sync_1;
+	    end
+	 end
+
+	//----------------------------------------------
+	//-- AXI Stream interface handshakes
+	//----------------------------------------------
+
+reg ft_txf;  // FTDI Transmit channel Full
+reg ft_rxe;  // FTDO Receive channel Empty
+reg ft_wcyc; // read access committed
+reg ft_nak;  // check for NAK terminate
+
+// TX stream delivers valid FT1248 read data transfer
+// 8-bit write port with extra top-bit used as valid qualifer
+reg [8:0] txdata;
+assign txd_tdata = txdata[7:0];
+assign txd_tvalid = txdata[8];
+
+// activate if RX channel data and the stream buffer is not full
+wire ft_rxreq = !ft_rxe & !txdata[8];
+
+
+// RX stream handshakes on valid FT1248 write data transfer
+reg       rxdone;
+reg       rxrdy;
+assign    rxd_tready = rxdone;
+
+// activate if TX channel not full and and the stream buffer data valid
+wire ft_txreq = !ft_txf & rxd_tvalid; // & !rxdone; // FTDI TX data ready and rxstream ready
+
+// FTDI1248 commands
+wire [3:0] wcmd = 4'b0000; // write request
+wire [3:0] rcmd = 4'b0001; // read  request
+wire [3:0] fcmd = 4'b0100; // write flush request
+//wire [3:0] rcmd = 4'b1000; // read  request BE bit-pattern
+//wire [3:0] fcmd = 4'b0010; // write flush request BE bit-pattern
+// and full FT1248 command bit patterns (using top-bits for shift sequencing)
+wire [8:0] wcmdpatt = {2'b11, wcmd[0], wcmd[1], 1'b0, wcmd[2], 1'b0, 1'b0, wcmd[3]};
+wire [8:0] rcmdpatt = {2'b11, rcmd[0], rcmd[1], 1'b0, rcmd[2], 1'b0, 1'b0, rcmd[3]};
+
+reg ssn_del;
+always @(posedge clk or negedge resetn)
+  if (!resetn)
+    ssn_del  <= 1'b1;
+  else if (ft_clken)
+      ssn_del  <= ft_ssn_o;
+wire ssn_start = ft_ssn_o & ssn_del;
+
+// FTDI1248 state machine
+
+always @(posedge clk or negedge resetn)
+  if (!resetn) begin
+    ft_state <= FT_0_IDLE;
+    ft_reg   <= 0;
+    txdata   <= 0;
+    rxdone   <= 0;
+    ft_wcyc  <= 0;
+    ft_txf   <= 1; // ftdi channel  TXE# ('1' full)
+    ft_rxe   <= 1; // ftdi channel  RXF# ('1' empty)
+    ft_nak   <= 0;
+    end
+  else begin
+    ft_txf <= (ft_state==FT_0_IDLE) ? (ft_miosio_i[0] | ft_miosio_i0_sync) : 1'b1; //ft_txf & !( ft_wcyc &(ft_state==FT_ZBT_CLKHI) & ft_miso_i);
+    ft_rxe <= (ft_state==FT_0_IDLE) ? (ft_miso_i | ft_miso_i_sync)  : 1'b1; //ft_rxe & !(!ft_wcyc & (ft_state==FT_ZBT_CLKHI) & ft_miso_i);
+    txdata[8] <= txdata[8] & !txd_tready; // tx_valid handshake
+    rxdone   <= (ft_clken & (ft_state==FT_ZWD_CLKLO) & !ft_nak) | (rxdone & !rxd_tvalid); // hold until acknowledged
+    if (ft_clken)
+      case (ft_state)
+      FT_0_IDLE: begin // RX req priority
+        if (ssn_start & ft_rxreq) begin ft_reg <= rcmdpatt; ft_state <= FT_ZCMD_CLKLO; end
+        else if (ssn_start & ft_txreq) begin ft_reg <= wcmdpatt; ft_state <= FT_ZCMD_CLKLO; ft_wcyc <= 1; end
+        else ft_state <= (!ft_txf | !ft_rxe | (FT1248_CLKON!=0)) ? FT_1_IDLE : FT_0_IDLE;
+        end
+      FT_1_IDLE:
+        ft_state <= FT_0_IDLE;
+      FT_ZCMD_CLKLO:
+        ft_state <= FT_CMD_CLKHI;
+      FT_CMD_CLKHI:
+        ft_state <= FT_CMD_CLKLO;
+      FT_CMD_CLKLO: // 2, 4 or 7 shifts
+        if      (bwid8) begin ft_reg <= FT_ZBT_CLKHI; end 
+        else if (bwid4) begin ft_reg <= {4'b0000,ft_reg[8:4]}; ft_state <= (|ft_reg[8:5]) ? FT_CMD_CLKHI : FT_ZBT_CLKHI; end 
+        else if (bwid2) begin ft_reg <= {  2'b00,ft_reg[8:2]}; ft_state <= (|ft_reg[8:3]) ? FT_CMD_CLKHI : FT_ZBT_CLKHI; end 
+        else            begin ft_reg <= {   1'b0,ft_reg[8:1]}; ft_state <= (|ft_reg[8:3]) ? FT_CMD_CLKHI : FT_ZBT_CLKHI; end 
+      FT_ZBT_CLKHI:
+        ft_state <= FT_ZBT_CLKLO;
+      FT_ZBT_CLKLO:
+        if    (ft_wcyc) begin ft_reg <= {1'b1,rxd_tdata}; ft_state <= FT_WD_CLKHI; end
+        else            begin ft_reg <=  9'b011111111;    ft_state <= FT_RD_CLKHI; end
+      FT_WD_CLKHI:
+        if (ft_miso_i & ft_reg[8]) begin ft_nak <= 1'b1; ft_state <= FT_ZWD_CLKLO; end // NAK terminate on first cycle
+        else if (bwid8) ft_state <=  (ft_reg[8])   ? FT_WD_CLKLO : FT_ZWD_CLKLO; // special case repeat on write data
+        else if (bwid4) ft_state <= (|ft_reg[8:5]) ? FT_WD_CLKLO : FT_ZWD_CLKLO; 
+        else if (bwid2) ft_state <= (|ft_reg[8:3]) ? FT_WD_CLKLO : FT_ZWD_CLKLO; 
+        else            ft_state <= (|ft_reg[8:2]) ? FT_WD_CLKLO : FT_ZWD_CLKLO; 
+      FT_WD_CLKLO:
+        if      (bwid8) begin ft_reg <= {   1'b0,ft_reg[7:0]}; ft_state <= FT_WD_CLKHI; end // clear top flag
+        else if (bwid4) begin ft_reg <= {4'b0000,ft_reg[8:4]}; ft_state <= FT_WD_CLKHI; end // shift 4 bits right
+        else if (bwid2) begin ft_reg <= {  2'b00,ft_reg[8:2]}; ft_state <= FT_WD_CLKHI; end // shift 2 bits right
+        else            begin ft_reg <= {   1'b0,ft_reg[8:1]}; ft_state <= FT_WD_CLKHI; end // shift 1 bit right
+      FT_ZWD_CLKLO:
+        if (ft_nak) begin ft_nak<= 1'b0; ft_state <= FT_0_IDLE;  ft_wcyc <= 1'b0; end // terminate without TX handshake
+        else begin ft_state <= FT_0_IDLE;  ft_wcyc <= 1'b0; end
+      FT_RD_CLKHI: // capture iodata pins end of CLKHI phase
+        if (ft_miso_i & (&ft_reg[7:0])) begin ft_nak <= 1'b1; ft_state <= FT_RD_CLKLO; end // NAK terminate on first cycle
+        else if (bwid8) begin ft_reg <= (ft_reg[0]) ? {ft_rdmasked[7:0],1'b1} : {ft_reg[8:1],1'b0}; ft_state <= FT_RD_CLKLO; end // 8-bit read twice
+        else if (bwid4) begin ft_reg <= {ft_rdmasked[3:0],ft_reg[8:4]}; ft_state <= FT_RD_CLKLO; end 
+        else if (bwid2) begin ft_reg <= {ft_rdmasked[1:0],ft_reg[8:2]}; ft_state <= FT_RD_CLKLO; end 
+        else            begin ft_reg <= {ft_rdmasked[  0],ft_reg[8:1]}; ft_state <= FT_RD_CLKLO; end 
+      FT_RD_CLKLO:
+        if (ft_nak) begin ft_nak<= 1'b0; ft_state <= FT_0_IDLE; txdata <= 9'b0; end // terminate without TX handshake
+        else if (ft_reg[0]) begin ft_state <= FT_RD_CLKHI; ft_reg[0] <= !(bwid8); end // loop until all 8 bits shifted in (or 8-bit read repeated)
+        else begin ft_state <= FT_0_IDLE; txdata <= {1'b1,ft_reg[8:1]}; end
+      default:
+        ft_state <= FT_0_IDLE;
+      endcase
+    end
+	
+	// User logic ends
+
+endmodule
diff --git a/IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0.v b/IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0.v
new file mode 100755
index 0000000..a229917
--- /dev/null
+++ b/IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0.v
@@ -0,0 +1,114 @@
+
+`timescale 1 ns / 1 ps
+
+	module iostream_v1_0 #
+	(
+		// Users to add parameters here
+
+		// User parameters ends
+		// Do not modify the parameters beyond this line
+
+
+		// Parameters of Axi Slave Bus Interface axi
+		parameter integer C_axi_DATA_WIDTH	= 32,
+		parameter integer C_axi_ADDR_WIDTH	= 4,
+
+		// Parameters of Axi Master Bus Interface tx
+		parameter integer C_tx_TDATA_WIDTH	= 8,
+		parameter integer C_tx_START_COUNT	= 3,
+
+		// Parameters of Axi Slave Bus Interface rx
+		parameter integer C_rx_TDATA_WIDTH	= 8
+	)
+	(
+		// Users to add ports here
+
+		// User ports ends
+		// Do not modify the ports beyond this line
+
+
+		// Ports of Axi Slave Bus Interface axi
+		input wire  axi_aclk,
+		input wire  axi_aresetn,
+		input wire [C_axi_ADDR_WIDTH-1 : 0] axi_awaddr,
+		input wire [2 : 0] axi_awprot,
+		input wire  axi_awvalid,
+		output wire  axi_awready,
+		input wire [C_axi_DATA_WIDTH-1 : 0] axi_wdata,
+		input wire [(C_axi_DATA_WIDTH/8)-1 : 0] axi_wstrb,
+		input wire  axi_wvalid,
+		output wire  axi_wready,
+		output wire [1 : 0] axi_bresp,
+		output wire  axi_bvalid,
+		input wire  axi_bready,
+		input wire [C_axi_ADDR_WIDTH-1 : 0] axi_araddr,
+		input wire [2 : 0] axi_arprot,
+		input wire  axi_arvalid,
+		output wire  axi_arready,
+		output wire [C_axi_DATA_WIDTH-1 : 0] axi_rdata,
+		output wire [1 : 0] axi_rresp,
+		output wire  axi_rvalid,
+		input wire  axi_rready,
+
+        output wire interrupt,
+		// Ports of Axi Master Bus Interface tx
+		output wire  tx_tvalid,
+		output wire [C_tx_TDATA_WIDTH-1 : 0] tx_tdata,
+		output wire [(C_tx_TDATA_WIDTH/8)-1 : 0] tx_tstrb,
+		output wire  tx_tlast,
+		input wire  tx_tready,
+
+		// Ports of Axi Slave Bus Interface rx
+		output wire  rx_tready,
+		input wire [C_rx_TDATA_WIDTH-1 : 0] rx_tdata,
+		input wire [(C_rx_TDATA_WIDTH/8)-1 : 0] rx_tstrb,
+		input wire  rx_tlast,
+		input wire  rx_tvalid
+	);
+// Instantiation of Axi Bus Interface axi
+	iostream_v1_0_axi # ( 
+		.C_S_AXI_DATA_WIDTH(C_axi_DATA_WIDTH),
+		.C_S_AXI_ADDR_WIDTH(C_axi_ADDR_WIDTH)
+	) iostream_v1_0_axi_inst (
+		.S_AXI_ACLK(axi_aclk),
+		.S_AXI_ARESETN(axi_aresetn),
+		.tx_tvalid(tx_tvalid),
+		.tx_tdata(tx_tdata),
+//		output wire [0 : 0] tx_tstrb,
+//		output wire  tx_tlast,
+		.tx_tready(tx_tready),
+		.rx_tvalid(rx_tvalid),
+		.rx_tdata(rx_tdata),
+//		input wire [0 : 0] tx_tstrb,
+//		input wire  tx_tlast,
+		.tx_tready(rx_tready),
+		.interrupt(interrupt),
+		.S_AXI_AWADDR(axi_awaddr),
+		.S_AXI_AWPROT(axi_awprot),
+		.S_AXI_AWVALID(axi_awvalid),
+		.S_AXI_AWREADY(axi_awready),
+		.S_AXI_WDATA(axi_wdata),
+		.S_AXI_WSTRB(axi_wstrb),
+		.S_AXI_WVALID(axi_wvalid),
+		.S_AXI_WREADY(axi_wready),
+		.S_AXI_BRESP(axi_bresp),
+		.S_AXI_BVALID(axi_bvalid),
+		.S_AXI_BREADY(axi_bready),
+		.S_AXI_ARADDR(axi_araddr),
+		.S_AXI_ARPROT(axi_arprot),
+		.S_AXI_ARVALID(axi_arvalid),
+		.S_AXI_ARREADY(axi_arready),
+		.S_AXI_RDATA(axi_rdata),
+		.S_AXI_RRESP(axi_rresp),
+		.S_AXI_RVALID(axi_rvalid),
+		.S_AXI_RREADY(axi_rready)
+	);
+
+assign tx_tstrb[0:0] = tx_tvalid;
+assign tx_tlast      = 1'b0;
+
+	// Add user logic here
+
+	// User logic ends
+
+	endmodule
diff --git a/IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0_axi_s.v b/IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0_axi_s.v
new file mode 100755
index 0000000..d8e6eea
--- /dev/null
+++ b/IPLIB/axi_stream_io_v1_0/axi_stream_io_v1_0_axi_s.v
@@ -0,0 +1,424 @@
+
+`timescale 1 ns / 1 ps
+
+	module iostream_v1_0_axi #
+	(
+		// Users to add parameters here
+
+		// User parameters ends
+		// Do not modify the parameters beyond this line
+
+		// Width of S_AXI data bus
+		parameter integer C_S_AXI_DATA_WIDTH	= 32,
+		// Width of S_AXI address bus
+		parameter integer C_S_AXI_ADDR_WIDTH	= 4
+	)
+	(
+		// Users to add ports here
+		output wire interrupt,
+		
+		// Ports of Axi Master Bus Interface tx
+//		input wire  tx_aclk,
+//		input wire  tx_aresetn,
+		output wire  tx_tvalid,
+		output wire [7 : 0] tx_tdata,
+//		output wire [0 : 0] tx_tstrb,
+//		output wire  tx_tlast,
+		input wire  tx_tready,
+
+		// Ports of Axi Slave Bus Interface rx
+//		input wire  rx_aclk,
+//		input wire  rx_aresetn,
+		output wire  rx_tready,
+		input wire [7 : 0] rx_tdata,
+//		input wire [0 : 0] rx_tstrb,
+//		input wire  rx_tlast,
+		input wire  rx_tvalid,
+
+		// User ports ends
+		// Do not modify the ports beyond this line
+
+		// Global Clock Signal
+		input wire  S_AXI_ACLK,
+		// Global Reset Signal. This Signal is Active LOW
+		input wire  S_AXI_ARESETN,
+		// Write address (issued by master, acceped by Slave)
+		input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_AWADDR,
+		// Write channel Protection type. This signal indicates the
+    		// privilege and security level of the transaction, and whether
+    		// the transaction is a data access or an instruction access.
+		input wire [2 : 0] S_AXI_AWPROT,
+		// Write address valid. This signal indicates that the master signaling
+    		// valid write address and control information.
+		input wire  S_AXI_AWVALID,
+		// Write address ready. This signal indicates that the slave is ready
+    		// to accept an address and associated control signals.
+		output wire  S_AXI_AWREADY,
+		// Write data (issued by master, acceped by Slave) 
+		input wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_WDATA,
+		// Write strobes. This signal indicates which byte lanes hold
+    		// valid data. There is one write strobe bit for each eight
+    		// bits of the write data bus.    
+		input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB,
+		// Write valid. This signal indicates that valid write
+    		// data and strobes are available.
+		input wire  S_AXI_WVALID,
+		// Write ready. This signal indicates that the slave
+    		// can accept the write data.
+		output wire  S_AXI_WREADY,
+		// Write response. This signal indicates the status
+    		// of the write transaction.
+		output wire [1 : 0] S_AXI_BRESP,
+		// Write response valid. This signal indicates that the channel
+    		// is signaling a valid write response.
+		output wire  S_AXI_BVALID,
+		// Response ready. This signal indicates that the master
+    		// can accept a write response.
+		input wire  S_AXI_BREADY,
+		// Read address (issued by master, acceped by Slave)
+		input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_ARADDR,
+		// Protection type. This signal indicates the privilege
+    		// and security level of the transaction, and whether the
+    		// transaction is a data access or an instruction access.
+		input wire [2 : 0] S_AXI_ARPROT,
+		// Read address valid. This signal indicates that the channel
+    		// is signaling valid read address and control information.
+		input wire  S_AXI_ARVALID,
+		// Read address ready. This signal indicates that the slave is
+    		// ready to accept an address and associated control signals.
+		output wire  S_AXI_ARREADY,
+		// Read data (issued by slave)
+		output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA,
+		// Read response. This signal indicates the status of the
+    		// read transfer.
+		output wire [1 : 0] S_AXI_RRESP,
+		// Read valid. This signal indicates that the channel is
+    		// signaling the required read data.
+		output wire  S_AXI_RVALID,
+		// Read ready. This signal indicates that the master can
+    		// accept the read data and response information.
+		input wire  S_AXI_RREADY
+	);
+
+	// AXI4LITE signals
+	reg [C_S_AXI_ADDR_WIDTH-1 : 0] 	axi_awaddr;
+	reg  	axi_awready;
+	reg  	axi_wready;
+	reg [1 : 0] 	axi_bresp;
+	reg  	axi_bvalid;
+	reg [C_S_AXI_ADDR_WIDTH-1 : 0] 	axi_araddr;
+	reg  	axi_arready;
+	reg [C_S_AXI_DATA_WIDTH-1 : 0] 	axi_rdata;
+	reg [1 : 0] 	axi_rresp;
+	reg  	axi_rvalid;
+
+	// Example-specific design signals
+	// local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH
+	// ADDR_LSB is used for addressing 32/64 bit registers/memories
+	// ADDR_LSB = 2 for 32 bits (n downto 2)
+	// ADDR_LSB = 3 for 64 bits (n downto 3)
+	localparam integer ADDR_LSB = (C_S_AXI_DATA_WIDTH/32) + 1;
+	localparam integer OPT_MEM_ADDR_BITS = 1;
+
+	//----------------------------------------------
+	//-- Signals for user logic register space example
+	//------------------------------------------------
+	//-- Number of Slave Registers 4
+	reg [8:0]	tx_reg; // TX data
+	reg [8:0]	rx_reg; // RX data
+	reg [7:0]	ctrl_reg; // ctrl
+	wire	 slv_reg_rden;
+	wire	 slv_reg_wren;
+	reg [7:0]	 reg_data_out;
+	integer	 byte_index;
+	reg	 aw_en;
+	
+	wire	tx_req = tx_reg[8];  // request to transmit
+	wire	tx_ack = tx_tready;    // acknowledge when stream ready
+    wire	tx_rdy = !tx_reg[8];
+	wire	rx_req = rx_tvalid;    // request to receive
+	wire	rx_ack = !rx_reg[8];
+    wire    rx_rdy = rx_reg[8];
+    
+	//assign	rx_reg[7:0] <= rx_tdata;
+
+	// I/O Connections assignments
+
+    assign interrupt = ctrl_reg[4] & (!tx_req | rx_req);
+	
+    // TX stream interface
+	assign	tx_tdata = tx_reg[7:0];
+	assign  tx_tvalid = tx_req;
+
+	// RX stream interface
+	assign  rx_tready = rx_ack;
+    
+	//AXI Slave
+	assign S_AXI_AWREADY	= axi_awready;
+	assign S_AXI_WREADY	= axi_wready;
+	assign S_AXI_BRESP	= axi_bresp;
+	assign S_AXI_BVALID	= axi_bvalid;
+	assign S_AXI_ARREADY	= axi_arready;
+	assign S_AXI_RDATA	= axi_rdata;
+	assign S_AXI_RRESP	= axi_rresp;
+	assign S_AXI_RVALID	= axi_rvalid;
+	// Implement axi_awready generation
+	// axi_awready is asserted for one S_AXI_ACLK clock cycle when both
+	// S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is
+	// de-asserted when reset is low.
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+	    begin
+	      axi_awready <= 1'b0;
+	      aw_en <= 1'b1;
+	    end 
+	  else
+	    begin    
+	      if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en)
+	        begin
+	          // slave is ready to accept write address when 
+	          // there is a valid write address and write data
+	          // on the write address and data bus. This design 
+	          // expects no outstanding transactions. 
+	          axi_awready <= 1'b1;
+	          aw_en <= 1'b0;
+	        end
+	        else if (S_AXI_BREADY && axi_bvalid)
+	            begin
+	              aw_en <= 1'b1;
+	              axi_awready <= 1'b0;
+	            end
+	      else           
+	        begin
+	          axi_awready <= 1'b0;
+	        end
+	    end 
+	end       
+
+	// Implement axi_awaddr latching
+	// This process is used to latch the address when both 
+	// S_AXI_AWVALID and S_AXI_WVALID are valid. 
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+	    begin
+	      axi_awaddr <= 0;
+	    end 
+	  else
+	    begin    
+	      if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID && aw_en)
+	        begin
+	          // Write Address latching 
+	          axi_awaddr <= S_AXI_AWADDR;
+	        end
+	    end 
+	end       
+
+	// Implement axi_wready generation
+	// axi_wready is asserted for one S_AXI_ACLK clock cycle when both
+	// S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is 
+	// de-asserted when reset is low. 
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+	    begin
+	      axi_wready <= 1'b0;
+	    end 
+	  else
+	    begin    
+	      if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID && aw_en )
+	        begin
+	          // slave is ready to accept write data when 
+	          // there is a valid write address and write data
+	          // on the write address and data bus. This design 
+	          // expects no outstanding transactions. 
+	          axi_wready <= 1'b1;
+	        end
+	      else
+	        begin
+	          axi_wready <= 1'b0;
+	        end
+	    end 
+	end       
+
+	// Implement memory mapped register select and write logic generation
+	// The write data is accepted and written to memory mapped registers when
+	// axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to
+	// select byte enables of slave registers while writing.
+	// These registers are cleared when reset (active low) is applied.
+	// Slave register write enable is asserted when valid address and data are available
+	// and the slave is ready to accept the write address and write data.
+	assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID;
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+		rx_reg <= 0;
+      else if ((ctrl_reg[1] == 1'b1))
+        rx_reg <= 0;
+	  else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h0))
+		rx_reg[8:0] <= {1'b1, S_AXI_WDATA[7:0]};
+	  else if (slv_reg_rden && (axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h0))
+		rx_reg[8] <= 1'b0;
+      else if (rx_req & rx_ack) // check precedence (rx_req)
+		rx_reg[8:0] <= {1'b1, rx_tdata[7:0]};
+	end    
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+		tx_reg <= 0;
+      else if ((ctrl_reg[0] == 1'b1))
+        tx_reg <= 0;
+	  else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h1))
+		tx_reg[8:0] <= {1'b1, S_AXI_WDATA[7:0]};
+      else if (tx_req & tx_ack)
+		tx_reg[8] <= 1'b0;
+	end    
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+		ctrl_reg <= 8'b00000100;
+	  else if (slv_reg_wren && (axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] == 2'h3))
+		ctrl_reg[7:0] <= S_AXI_WDATA[7:0];
+	end    
+
+	// Implement write response logic generation
+	// The write response and response valid signals are asserted by the slave 
+	// when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted.  
+	// This marks the acceptance of address and indicates the status of 
+	// write transaction.
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+	    begin
+	      axi_bvalid  <= 0;
+	      axi_bresp   <= 2'b0;
+	    end 
+	  else
+	    begin    
+	      if (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready && S_AXI_WVALID)
+	        begin
+	          // indicates a valid write response is available
+	          axi_bvalid <= 1'b1;
+	          axi_bresp  <= 2'b0; // 'OKAY' response 
+	        end                   // work error responses in future
+	      else
+	        begin
+	          if (S_AXI_BREADY && axi_bvalid) 
+	            //check if bready is asserted while bvalid is high) 
+	            //(there is a possibility that bready is always asserted high)   
+	            begin
+	              axi_bvalid <= 1'b0; 
+	            end  
+	        end
+	    end
+	end   
+
+	// Implement axi_arready generation
+	// axi_arready is asserted for one S_AXI_ACLK clock cycle when
+	// S_AXI_ARVALID is asserted. axi_awready is 
+	// de-asserted when reset (active low) is asserted. 
+	// The read address is also latched when S_AXI_ARVALID is 
+	// asserted. axi_araddr is reset to zero on reset assertion.
+
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+	    begin
+	      axi_arready <= 1'b0;
+	      axi_araddr  <= 32'b0;
+	    end 
+	  else
+	    begin    
+	      if (~axi_arready && S_AXI_ARVALID)
+	        begin
+	          // indicates that the slave has acceped the valid read address
+	          axi_arready <= 1'b1;
+	          // Read address latching
+	          axi_araddr  <= S_AXI_ARADDR;
+	        end
+	      else
+	        begin
+	          axi_arready <= 1'b0;
+	        end
+	    end 
+	end       
+
+	// Implement axi_arvalid generation
+	// axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both 
+	// S_AXI_ARVALID and axi_arready are asserted. The slave registers 
+	// data are available on the axi_rdata bus at this instance. The 
+	// assertion of axi_rvalid marks the validity of read data on the 
+	// bus and axi_rresp indicates the status of read transaction.axi_rvalid 
+	// is deasserted on reset (active low). axi_rresp and axi_rdata are 
+	// cleared to zero on reset (active low).  
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+	    begin
+	      axi_rvalid <= 0;
+	      axi_rresp  <= 0;
+	    end
+	  else
+	    begin    
+	      if (axi_arready && S_AXI_ARVALID && ~axi_rvalid)
+	        begin
+	          // Valid read data is available at the read data bus
+	          axi_rvalid <= 1'b1;
+	          axi_rresp  <= 2'b0; // 'OKAY' response
+	        end   
+	      else if (axi_rvalid && S_AXI_RREADY)
+	        begin
+	          // Read data is accepted by the master
+	          axi_rvalid <= 1'b0;
+	        end                
+	    end
+	end    
+
+	// Implement memory mapped register select and read logic generation
+	// Slave register read enable is asserted when valid address is available
+	// and the slave is ready to accept the read address.
+	assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid;
+	always @(*)
+	begin
+	      // Address decoding for reading registers
+	      case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] )
+	        2'h0   : reg_data_out <= rx_reg[7:0];
+	        2'h1   : reg_data_out <= tx_reg[7:0];
+	        2'h2   : reg_data_out <= {3'b000, ctrl_reg[4], !tx_rdy, tx_rdy, rx_rdy, rx_rdy};
+	        2'h3   : reg_data_out <= ctrl_reg;
+	        default : reg_data_out <= 0;
+	      endcase
+	end
+
+	// Output register or memory read data
+	always @( posedge S_AXI_ACLK )
+	begin
+	  if ( S_AXI_ARESETN == 1'b0 )
+	    begin
+	      axi_rdata  <= 0;
+	    end 
+	  else
+	    begin    
+	      // When there is a valid read address (S_AXI_ARVALID) with 
+	      // acceptance of read address by the slave (axi_arready), 
+	      // output the read dada 
+	      if (slv_reg_rden)
+	        begin
+	          axi_rdata <= {24'h000000, reg_data_out};     // register read data
+	        end   
+	    end
+	end    
+
+	// Add user logic here
+
+	// User logic ends
+
+	endmodule
-- 
GitLab