aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-11-23 15:35:48 -0800
committerJosh Blum <josh@joshknows.com>2010-11-23 15:35:48 -0800
commitf56c1247cbe7b7e90acee2711b5dda3356b9486a (patch)
tree81dadc83537c2c50550cd94e224571e472176c6f
parent9f94ef843ceca63bcb83b2d473cbba709c9110b6 (diff)
parenteb26e8adb4a5718ee3db3bb7f32c0cd31d060af9 (diff)
downloaduhd-f56c1247cbe7b7e90acee2711b5dda3356b9486a.tar.gz
uhd-f56c1247cbe7b7e90acee2711b5dda3356b9486a.tar.bz2
uhd-f56c1247cbe7b7e90acee2711b5dda3356b9486a.zip
Merge branch 'next' of ettus.sourcerepo.com:ettus/uhdpriv into next
-rw-r--r--firmware/microblaze/apps/txrx_uhd.c14
-rw-r--r--firmware/microblaze/lib/eeprom.c12
-rw-r--r--firmware/microblaze/lib/eth_addrs.c21
-rw-r--r--firmware/microblaze/lib/ethernet.h6
-rw-r--r--firmware/microblaze/lib/i2c.h3
-rw-r--r--firmware/microblaze/lib/net_common.c11
-rw-r--r--firmware/microblaze/lib/pic.c2
-rw-r--r--firmware/microblaze/usrp2/memory_map.h4
-rw-r--r--firmware/microblaze/usrp2p/Makefile.am3
-rw-r--r--firmware/microblaze/usrp2p/bootloader/init_bootloader.c23
-rw-r--r--firmware/microblaze/usrp2p/memory_map.h4
-rw-r--r--firmware/microblaze/usrp2p/udp_fw_update.c4
-rw-r--r--fpga/usrp2/control_lib/Makefile.srcs7
-rw-r--r--fpga/usrp2/control_lib/atr_controller16.v60
-rw-r--r--fpga/usrp2/control_lib/bootram.v250
-rw-r--r--fpga/usrp2/control_lib/newfifo/fifo_pacer.v24
-rw-r--r--fpga/usrp2/control_lib/newfifo/packet32_tb.v27
-rw-r--r--fpga/usrp2/control_lib/newfifo/packet_generator.v59
-rw-r--r--fpga/usrp2/control_lib/newfifo/packet_generator32.v21
-rw-r--r--fpga/usrp2/control_lib/newfifo/packet_tb.v29
-rw-r--r--fpga/usrp2/control_lib/newfifo/packet_verifier.v61
-rw-r--r--fpga/usrp2/control_lib/newfifo/packet_verifier32.v30
-rw-r--r--fpga/usrp2/control_lib/nsgpio16LE.v123
-rw-r--r--fpga/usrp2/control_lib/quad_uart.v71
-rw-r--r--fpga/usrp2/control_lib/ram_2port_mixed_width.v120
-rw-r--r--fpga/usrp2/control_lib/ram_harvard2.v77
-rw-r--r--fpga/usrp2/control_lib/s3a_icap_wb.v59
-rw-r--r--fpga/usrp2/control_lib/settings_bus.v17
-rw-r--r--fpga/usrp2/control_lib/settings_bus_16LE.v54
-rw-r--r--fpga/usrp2/control_lib/simple_uart.v13
-rw-r--r--fpga/usrp2/control_lib/v5icap_wb.v54
-rw-r--r--fpga/usrp2/coregen/Makefile.srcs8
-rw-r--r--fpga/usrp2/coregen/_xmsgs/pn_parser.xmsgs15
-rw-r--r--fpga/usrp2/coregen/coregen.cgp24
-rw-r--r--fpga/usrp2/coregen/fifo_generator_ug175.pdfbin1069823 -> 2895895 bytes
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.gise30
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.ncf0
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.ngc3
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.v3839
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.veo47
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.xco84
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.xise72
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_32x36_2clk_flist.txt12
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_32x36_2clk_readme.txt46
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_32x36_2clk_xmdf.tcl68
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.gise30
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.ncf0
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.ngc3
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.v173
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.veo53
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.xco84
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.xise72
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36_flist.txt12
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36_readme.txt47
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36_xmdf.tcl68
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.gise30
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.ncf0
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.ngc3
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.v169
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.veo51
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.xco84
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.xise72
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18_flist.txt12
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18_readme.txt47
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18_xmdf.tcl68
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.gise30
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.ngc3
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.v173
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.veo53
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.xco84
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.xise72
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full_flist.txt12
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full_readme.txt47
-rw-r--r--fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full_xmdf.tcl68
-rw-r--r--fpga/usrp2/extramfifo/.gitignore3
-rw-r--r--fpga/usrp2/extramfifo/Makefile.srcs17
-rw-r--r--fpga/usrp2/extramfifo/ext_fifo.v171
-rw-r--r--fpga/usrp2/extramfifo/ext_fifo_tb.cmd12
-rw-r--r--fpga/usrp2/extramfifo/ext_fifo_tb.prj9
-rw-r--r--fpga/usrp2/extramfifo/ext_fifo_tb.sav30
-rwxr-xr-xfpga/usrp2/extramfifo/ext_fifo_tb.sh2
-rw-r--r--fpga/usrp2/extramfifo/ext_fifo_tb.v415
-rw-r--r--fpga/usrp2/extramfifo/fifo_extram.v188
-rw-r--r--fpga/usrp2/extramfifo/fifo_extram36.v47
-rwxr-xr-xfpga/usrp2/extramfifo/fifo_extram36_tb.build1
-rw-r--r--fpga/usrp2/extramfifo/fifo_extram36_tb.v475
-rwxr-xr-xfpga/usrp2/extramfifo/fifo_extram_tb.build1
-rw-r--r--fpga/usrp2/extramfifo/fifo_extram_tb.v134
-rw-r--r--fpga/usrp2/extramfifo/icon.v1286
-rw-r--r--fpga/usrp2/extramfifo/icon.xco47
-rw-r--r--fpga/usrp2/extramfifo/ila.v5544
-rw-r--r--fpga/usrp2/extramfifo/ila.xco130
-rw-r--r--fpga/usrp2/extramfifo/nobl_fifo.v97
-rw-r--r--fpga/usrp2/extramfifo/nobl_if.v148
-rw-r--r--fpga/usrp2/extramfifo/refill_randomizer.v66
-rw-r--r--fpga/usrp2/extramfifo/test_sram_if.v175
-rw-r--r--fpga/usrp2/fifo/.gitignore2
-rw-r--r--fpga/usrp2/fifo/fifo18_to_fifo36.v20
-rw-r--r--fpga/usrp2/fifo/fifo19_to_fifo36.v41
-rw-r--r--fpga/usrp2/fifo/fifo36_mux.v19
-rw-r--r--fpga/usrp2/fifo/fifo36_to_fifo18.v40
-rw-r--r--fpga/usrp2/fifo/fifo36_to_fifo19.v44
-rw-r--r--fpga/usrp2/fifo/fifo36_to_ll8.v1
-rw-r--r--fpga/usrp2/fifo/fifo_2clock_cascade.v14
-rw-r--r--fpga/usrp2/gpmc/.gitignore2
-rw-r--r--fpga/usrp2/gpmc/Makefile.srcs20
-rw-r--r--fpga/usrp2/gpmc/burst_data_write.txt16
-rw-r--r--fpga/usrp2/gpmc/dbsm.v80
-rw-r--r--fpga/usrp2/gpmc/edge_sync.v22
-rw-r--r--fpga/usrp2/gpmc/fifo_to_gpmc_async.v37
-rw-r--r--fpga/usrp2/gpmc/fifo_to_gpmc_sync.v26
-rw-r--r--fpga/usrp2/gpmc/fifo_watcher.v56
-rw-r--r--fpga/usrp2/gpmc/gpmc_async.v130
-rw-r--r--fpga/usrp2/gpmc/gpmc_sync.v108
-rw-r--r--fpga/usrp2/gpmc/gpmc_to_fifo_async.v68
-rw-r--r--fpga/usrp2/gpmc/gpmc_to_fifo_sync.v57
-rw-r--r--fpga/usrp2/gpmc/gpmc_wb.v57
-rwxr-xr-xfpga/usrp2/gpmc/make_timing_diag6
-rw-r--r--fpga/usrp2/gpmc/ram_to_fifo.v46
-rw-r--r--fpga/usrp2/gpmc/single_data_read.txt12
-rw-r--r--fpga/usrp2/gpmc/single_data_write.txt10
-rw-r--r--fpga/usrp2/models/gpmc_model_async.v130
-rw-r--r--fpga/usrp2/models/gpmc_model_sync.v97
-rwxr-xr-xfpga/usrp2/models/idt71v65603s150.v301
-rw-r--r--fpga/usrp2/opencores/Makefile.srcs2
-rw-r--r--fpga/usrp2/opencores/aemb/rtl/verilog/aeMB_core_BE.v4
-rw-r--r--fpga/usrp2/opencores/spi/rtl/verilog/spi_clgen.v27
-rw-r--r--fpga/usrp2/opencores/spi/rtl/verilog/spi_defines.v10
-rw-r--r--fpga/usrp2/opencores/spi/rtl/verilog/spi_shift.v99
-rw-r--r--fpga/usrp2/opencores/spi/rtl/verilog/spi_top.v88
-rw-r--r--fpga/usrp2/opencores/spi/rtl/verilog/spi_top16.v182
-rw-r--r--fpga/usrp2/opencores/spi/rtl/verilog/timescale.v2
-rw-r--r--fpga/usrp2/timing/time_compare.v26
-rw-r--r--fpga/usrp2/top/.gitignore1
-rw-r--r--fpga/usrp2/top/Makefile.common8
-rwxr-xr-xfpga/usrp2/top/python/check_inout.py62
-rw-r--r--fpga/usrp2/top/safe_u2plus/.gitignore2
-rw-r--r--fpga/usrp2/top/safe_u2plus/Makefile246
-rw-r--r--fpga/usrp2/top/safe_u2plus/safe_u2plus.v23
-rwxr-xr-xfpga/usrp2/top/safe_u2plus/u2plus.ucf401
-rw-r--r--fpga/usrp2/top/u1e/.gitignore6
-rw-r--r--fpga/usrp2/top/u1e/Makefile101
-rw-r--r--fpga/usrp2/top/u1e/README4
-rw-r--r--fpga/usrp2/top/u1e/cmdfile20
-rw-r--r--fpga/usrp2/top/u1e/make.sim7
-rw-r--r--fpga/usrp2/top/u1e/tb_u1e.v41
-rw-r--r--fpga/usrp2/top/u1e/timing.ucf13
-rw-r--r--fpga/usrp2/top/u1e/u1e.ucf259
-rw-r--r--fpga/usrp2/top/u1e/u1e.v141
-rw-r--r--fpga/usrp2/top/u1e/u1e_core.v459
-rw-r--r--fpga/usrp2/top/u1e_ethdebug/.gitignore6
-rw-r--r--fpga/usrp2/top/u1e_ethdebug/Makefile83
-rw-r--r--fpga/usrp2/top/u1e_ethdebug/u1e.ucf88
-rw-r--r--fpga/usrp2/top/u1e_ethdebug/u1e.v28
-rw-r--r--fpga/usrp2/top/u1e_passthru/.gitignore1
-rw-r--r--fpga/usrp2/top/u1e_passthru/Makefile99
-rw-r--r--fpga/usrp2/top/u1e_passthru/passthru.ucf6
-rw-r--r--fpga/usrp2/top/u1e_passthru/passthru.v18
-rw-r--r--fpga/usrp2/top/u2_rev3/Makefile.udp2
-rw-r--r--[-rwxr-xr-x]fpga/usrp2/top/u2_rev3/u2_core.v2
-rw-r--r--fpga/usrp2/top/u2_rev3/u2_core_udp.v255
-rw-r--r--fpga/usrp2/top/u2_rev3/u2_rev3.ucf151
-rw-r--r--fpga/usrp2/top/u2_rev3/u2_rev3.v320
-rw-r--r--fpga/usrp2/top/u2plus/.gitignore1
-rw-r--r--fpga/usrp2/top/u2plus/Makefile99
-rw-r--r--fpga/usrp2/top/u2plus/bootloader.rmi245
-rw-r--r--fpga/usrp2/top/u2plus/capture_ddrlvds.v39
-rwxr-xr-xfpga/usrp2/top/u2plus/u2plus.ucf590
-rw-r--r--fpga/usrp2/top/u2plus/u2plus.v391
-rw-r--r--fpga/usrp2/top/u2plus/u2plus_core.v696
-rw-r--r--fpga/usrp2/vrt/Makefile.srcs1
-rw-r--r--fpga/usrp2/vrt/gen_context_pkt.v38
-rw-r--r--fpga/usrp2/vrt/trigger_context_pkt.v52
-rw-r--r--fpga/usrp2/vrt/vita_rx_control.v62
-rw-r--r--fpga/usrp2/vrt/vita_rx_framer.v38
-rw-r--r--fpga/usrp2/vrt/vita_rx_tb.v67
-rwxr-xr-xfpga/usrp2/vrt/vita_tx.build2
-rw-r--r--fpga/usrp2/vrt/vita_tx_chain.v57
-rw-r--r--fpga/usrp2/vrt/vita_tx_control.v39
-rw-r--r--fpga/usrp2/vrt/vita_tx_deframer.v93
-rw-r--r--fpga/usrp2/vrt/vita_tx_tb.v48
-rw-r--r--host/CMakeLists.txt4
-rw-r--r--host/README4
-rw-r--r--host/apps/omap_debug/.gitignore20
-rw-r--r--host/apps/omap_debug/Makefile61
-rw-r--r--host/apps/omap_debug/README1
-rw-r--r--host/apps/omap_debug/clkgen-config.cc296
-rwxr-xr-xhost/apps/omap_debug/fetch-bin.sh6
-rwxr-xr-xhost/apps/omap_debug/fetch-kernel.sh7
-rwxr-xr-xhost/apps/omap_debug/fetch-module.sh6
-rwxr-xr-xhost/apps/omap_debug/fetch-u-boot.sh7
-rw-r--r--host/apps/omap_debug/fpga-downloader.cc253
-rwxr-xr-xhost/apps/omap_debug/read_board_id.sh10
-rwxr-xr-xhost/apps/omap_debug/reload-fpga.sh7
-rwxr-xr-xhost/apps/omap_debug/set_debug_pins.py35
-rwxr-xr-xhost/apps/omap_debug/setup-board-id-eeprom.sh17
-rw-r--r--host/apps/omap_debug/test.c34
-rw-r--r--host/apps/omap_debug/u1e-read-stream.c21
-rw-r--r--host/apps/omap_debug/usrp-e-button.c56
-rw-r--r--host/apps/omap_debug/usrp-e-crc-rw.c274
-rw-r--r--host/apps/omap_debug/usrp-e-ctl.c48
-rw-r--r--host/apps/omap_debug/usrp-e-debug-pins.c77
-rw-r--r--host/apps/omap_debug/usrp-e-gpio.c83
-rw-r--r--host/apps/omap_debug/usrp-e-i2c.c87
-rw-r--r--host/apps/omap_debug/usrp-e-lb-test.c58
-rw-r--r--host/apps/omap_debug/usrp-e-led.c35
-rw-r--r--host/apps/omap_debug/usrp-e-loopback.c194
-rw-r--r--host/apps/omap_debug/usrp-e-mm-loopback.c258
-rw-r--r--host/apps/omap_debug/usrp-e-ram.c25
-rw-r--r--host/apps/omap_debug/usrp-e-random-loopback.c149
-rw-r--r--host/apps/omap_debug/usrp-e-read.c18
-rw-r--r--host/apps/omap_debug/usrp-e-spi.c54
-rw-r--r--host/apps/omap_debug/usrp-e-timed.c233
-rw-r--r--host/apps/omap_debug/usrp-e-uart-rx.c53
-rw-r--r--host/apps/omap_debug/usrp-e-uart.c48
-rw-r--r--host/apps/omap_debug/usrp-e-write.c21
-rw-r--r--host/apps/omap_debug/usrp_e.h90
-rwxr-xr-xhost/apps/omap_debug/write-eeprom.sh92
-rwxr-xr-xhost/apps/omap_debug/write_board_id.sh10
-rw-r--r--host/docs/transport.rst11
-rw-r--r--host/docs/usrp_nxxx.rst15
-rw-r--r--host/examples/ascii_art_dft.hpp2
-rw-r--r--host/examples/test_async_messages.cpp104
-rw-r--r--host/examples/tx_from_file.cpp125
-rw-r--r--host/include/uhd/types/metadata.hpp4
-rw-r--r--host/include/uhd/usrp/dsp_utils.hpp5
-rw-r--r--host/include/uhd/usrp/mboard_eeprom.hpp3
-rw-r--r--host/include/uhd/utils/pimpl.hpp3
-rwxr-xr-xhost/lib/ic_reg_maps/gen_ad9522_regs.py6
-rw-r--r--host/lib/transport/CMakeLists.txt6
-rw-r--r--host/lib/transport/convert_types_impl.hpp48
-rw-r--r--host/lib/usrp/CMakeLists.txt1
-rw-r--r--host/lib/usrp/README5
-rw-r--r--host/lib/usrp/dsp_utils.cpp6
-rw-r--r--host/lib/usrp/mboard_eeprom.cpp83
-rw-r--r--host/lib/usrp/usrp2/fw_common.h4
-rw-r--r--host/lib/usrp/usrp2/io_impl.cpp200
-rw-r--r--host/lib/usrp/usrp2/mboard_impl.cpp47
-rw-r--r--host/lib/usrp/usrp2/usrp2_iface.cpp14
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.cpp13
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.hpp15
-rw-r--r--host/lib/usrp/usrp2/usrp2_regs.cpp2
-rw-r--r--host/lib/usrp/usrp2/usrp2_regs.hpp18
-rw-r--r--host/lib/usrp/usrp_e100/CMakeLists.txt60
-rw-r--r--host/lib/usrp/usrp_e100/clock_ctrl.cpp263
-rw-r--r--host/lib/usrp/usrp_e100/clock_ctrl.hpp103
-rw-r--r--host/lib/usrp/usrp_e100/codec_ctrl.cpp296
-rw-r--r--host/lib/usrp/usrp_e100/codec_ctrl.hpp90
-rw-r--r--host/lib/usrp/usrp_e100/codec_impl.cpp149
-rw-r--r--host/lib/usrp/usrp_e100/dboard_iface.cpp298
-rw-r--r--host/lib/usrp/usrp_e100/dboard_impl.cpp172
-rw-r--r--host/lib/usrp/usrp_e100/dsp_impl.cpp192
-rw-r--r--host/lib/usrp/usrp_e100/fpga-downloader.cc274
-rw-r--r--host/lib/usrp/usrp_e100/include/linux/usrp_e.h91
-rw-r--r--host/lib/usrp/usrp_e100/io_impl.cpp272
-rw-r--r--host/lib/usrp/usrp_e100/mboard_impl.cpp198
-rw-r--r--host/lib/usrp/usrp_e100/usrp_e100_iface.cpp268
-rw-r--r--host/lib/usrp/usrp_e100/usrp_e100_iface.hpp119
-rw-r--r--host/lib/usrp/usrp_e100/usrp_e100_impl.cpp212
-rw-r--r--host/lib/usrp/usrp_e100/usrp_e100_impl.hpp167
-rw-r--r--host/lib/usrp/usrp_e100/usrp_e100_mmap_zero_copy.cpp215
-rw-r--r--host/lib/usrp/usrp_e100/usrp_e100_regs.hpp198
-rw-r--r--host/test/CMakeLists.txt4
-rw-r--r--host/utils/CMakeLists.txt12
-rw-r--r--host/utils/clkgen-config.cpp296
-rw-r--r--host/utils/fpga-downloader.cpp267
-rw-r--r--host/utils/usrp-e-debug-pins.c77
-rw-r--r--host/utils/usrp-e-i2c.c87
-rw-r--r--host/utils/usrp-e-loopback.c231
-rw-r--r--host/utils/usrp-e-spi.c54
-rw-r--r--host/utils/usrp_e_regs.hpp196
-rwxr-xr-xhost/utils/usrp_n2xx_net_burner.py3
-rw-r--r--images/Makefile40
273 files changed, 30459 insertions, 1379 deletions
diff --git a/firmware/microblaze/apps/txrx_uhd.c b/firmware/microblaze/apps/txrx_uhd.c
index d00f2bc1f..9c1873e1c 100644
--- a/firmware/microblaze/apps/txrx_uhd.c
+++ b/firmware/microblaze/apps/txrx_uhd.c
@@ -396,7 +396,7 @@ eth_pkt_inspector(dbsm_t *sm, int bufno)
// In the future, a hardware state machine will do this...
if ( //warning! magic numbers approaching....
(((buff + ((2 + 14 + 20)/sizeof(uint32_t)))[0] & 0xffff) == USRP2_UDP_DATA_PORT) &&
- ((buff + ((2 + 14 + 20 + 8)/sizeof(uint32_t)))[0] != USRP2_INVALID_VRT_HEADER)
+ ((buff + ((2 + 14 + 20 + 8)/sizeof(uint32_t)))[1] != USRP2_INVALID_VRT_HEADER)
) return false;
//test if its an ip recovery packet
@@ -497,6 +497,16 @@ main(void)
{
u2_init();
+//we do this to see if we should set a default ip addr or not
+#ifdef USRP2P
+ bool safe_fw = find_safe_booted_flag();
+ set_safe_booted_flag(0);
+ if(safe_fw) {
+ set_default_ip_addr();
+ set_default_mac_addr();
+ }
+#endif
+
putstr("\nTxRx-NEWETH\n");
print_mac_addr(ethernet_mac_addr()->addr);
newline();
@@ -507,7 +517,7 @@ main(void)
//1) register the addresses into the network stack
register_mac_addr(ethernet_mac_addr());
register_ip_addr(get_ip_addr());
-
+
//2) register callbacks for udp ports we service
register_udp_listener(USRP2_UDP_CTRL_PORT, handle_udp_ctrl_packet);
register_udp_listener(USRP2_UDP_DATA_PORT, handle_udp_data_packet);
diff --git a/firmware/microblaze/lib/eeprom.c b/firmware/microblaze/lib/eeprom.c
index b12ffe082..d4e170046 100644
--- a/firmware/microblaze/lib/eeprom.c
+++ b/firmware/microblaze/lib/eeprom.c
@@ -17,9 +17,21 @@
#include "i2c.h"
#include "mdelay.h"
+#include "usrp2/fw_common.h"
static const int EEPROM_PAGESIZE = 16;
+bool find_safe_booted_flag(void) {
+ unsigned char flag_byte;
+ eeprom_read(USRP2_I2C_ADDR_MBOARD, USRP2_EE_MBOARD_BOOTLOADER_FLAGS, &flag_byte, 1);
+ return (flag_byte == 0x5E);
+}
+
+void set_safe_booted_flag(bool flag) {
+ unsigned char flag_byte = flag ? 0x5E : 0xDC;
+ eeprom_write(USRP2_I2C_ADDR_MBOARD, USRP2_EE_MBOARD_BOOTLOADER_FLAGS, &flag_byte, 1);
+}
+
bool
eeprom_write (int i2c_addr, int eeprom_offset, const void *buf, int len)
{
diff --git a/firmware/microblaze/lib/eth_addrs.c b/firmware/microblaze/lib/eth_addrs.c
index c6320e4fa..ff5d04f4d 100644
--- a/firmware/microblaze/lib/eth_addrs.c
+++ b/firmware/microblaze/lib/eth_addrs.c
@@ -46,9 +46,20 @@ unprogrammed(const void *t, size_t len)
//////////////////// MAC Addr Stuff ///////////////////////
static int8_t src_mac_addr_initialized = false;
+
+static const eth_mac_addr_t default_mac_addr = {{
+ 0x00, 0x50, 0xC2, 0x85, 0x3f, 0xff
+ }};
+
static eth_mac_addr_t src_mac_addr = {{
0x00, 0x50, 0xC2, 0x85, 0x3f, 0xff
}};
+
+void set_default_mac_addr(void)
+{
+ src_mac_addr_initialized = true;
+ src_mac_addr = default_mac_addr;
+}
const eth_mac_addr_t *
ethernet_mac_addr(void)
@@ -88,10 +99,20 @@ ethernet_set_mac_addr(const eth_mac_addr_t *t)
//////////////////// IP Addr Stuff ///////////////////////
static int8_t src_ip_addr_initialized = false;
+
+static const struct ip_addr default_ip_addr = {
+ (192 << 24 | 168 << 16 | 10 << 8 | 2 << 0)
+};
+
static struct ip_addr src_ip_addr = {
(192 << 24 | 168 << 16 | 10 << 8 | 2 << 0)
};
+void set_default_ip_addr(void)
+{
+ src_ip_addr_initialized = true;
+ src_ip_addr = default_ip_addr;
+}
const struct ip_addr *get_ip_addr(void)
{
diff --git a/firmware/microblaze/lib/ethernet.h b/firmware/microblaze/lib/ethernet.h
index 8c6d8b567..52b297349 100644
--- a/firmware/microblaze/lib/ethernet.h
+++ b/firmware/microblaze/lib/ethernet.h
@@ -44,6 +44,9 @@ void ethernet_register_link_changed_callback(ethernet_link_changed_callback_t cb
*/
const eth_mac_addr_t *ethernet_mac_addr(void);
+/*!set mac addr to default*/
+void set_default_mac_addr(void);
+
/*!
* \brief write mac address to eeprom and begin using it
*/
@@ -54,6 +57,9 @@ bool ethernet_set_mac_addr(const eth_mac_addr_t *t);
*/
const struct ip_addr *get_ip_addr(void);
+/*!set ip addr to default*/
+void set_default_ip_addr(void);
+
/*!
* \brief write ip address to eeprom and begin using it
*/
diff --git a/firmware/microblaze/lib/i2c.h b/firmware/microblaze/lib/i2c.h
index 6ff0e6982..1af4d72df 100644
--- a/firmware/microblaze/lib/i2c.h
+++ b/firmware/microblaze/lib/i2c.h
@@ -33,4 +33,7 @@ bool eeprom_write (int i2c_addr, int eeprom_offset, const void *buf, int len);
bool eeprom_read (int i2c_addr, int eeprom_offset, void *buf, int len);
+bool find_safe_booted_flag(void);
+void set_safe_booted_flag(bool flag);
+
#endif /* INCLUDED_I2C_H */
diff --git a/firmware/microblaze/lib/net_common.c b/firmware/microblaze/lib/net_common.c
index beaaa5948..6305408d6 100644
--- a/firmware/microblaze/lib/net_common.c
+++ b/firmware/microblaze/lib/net_common.c
@@ -291,8 +291,17 @@ handle_icmp_packet(struct ip_addr src, struct ip_addr dst,
{
switch (icmp->type){
case ICMP_DUR: // Destinatino Unreachable
- //stop_streaming(); //FIXME
if (icmp->code == ICMP_DUR_PORT){ // port unreachable
+ //handle destination port unreachable (the host ctrl+c'd the app):
+
+ //end async update packets per second
+ sr_tx_ctrl->cyc_per_up = 0;
+
+ //the end continuous streaming command
+ sr_rx_ctrl->cmd = 1 << 31; //no samples now
+ sr_rx_ctrl->time_secs = 0;
+ sr_rx_ctrl->time_ticks = 0; //latch the command
+
//struct udp_hdr *udp = (struct udp_hdr *)((char *)icmp + 28);
//printf("icmp port unr %d\n", udp->dest);
putchar('i');
diff --git a/firmware/microblaze/lib/pic.c b/firmware/microblaze/lib/pic.c
index e89d2b755..226da5f85 100644
--- a/firmware/microblaze/lib/pic.c
+++ b/firmware/microblaze/lib/pic.c
@@ -44,7 +44,7 @@ pic_init(void)
// uP is level triggered
pic_regs->mask = ~0; // mask all interrupts
- pic_regs->edge_enable = PIC_ONETIME_INT;
+ pic_regs->edge_enable = PIC_ONETIME_INT | PIC_UNDERRUN_INT | PIC_OVERRUN_INT | PIC_PPS_INT;
pic_regs->polarity = ~0 & ~PIC_PHY_INT; // rising edge
pic_regs->pending = ~0; // clear all pending ints
}
diff --git a/firmware/microblaze/usrp2/memory_map.h b/firmware/microblaze/usrp2/memory_map.h
index 41a2820bc..eac0c217f 100644
--- a/firmware/microblaze/usrp2/memory_map.h
+++ b/firmware/microblaze/usrp2/memory_map.h
@@ -463,6 +463,10 @@ typedef struct {
typedef struct {
volatile uint32_t num_chan;
volatile uint32_t clear_state; // clears out state machine, fifos,
+ volatile uint32_t report_sid;
+ volatile uint32_t policy;
+ volatile uint32_t cyc_per_up;
+ volatile uint32_t packets_per_up;
} sr_tx_ctrl_t;
#define sr_tx_ctrl ((sr_tx_ctrl_t *) _SR_ADDR(SR_TX_CTRL))
diff --git a/firmware/microblaze/usrp2p/Makefile.am b/firmware/microblaze/usrp2p/Makefile.am
index a5df3ff08..40766b406 100644
--- a/firmware/microblaze/usrp2p/Makefile.am
+++ b/firmware/microblaze/usrp2p/Makefile.am
@@ -18,7 +18,8 @@
include $(top_srcdir)/Makefile.common
AM_CFLAGS = \
- $(COMMON_CFLAGS)
+ $(COMMON_CFLAGS) \
+ -DUSRP2P
AM_LDFLAGS = \
$(COMMON_LFLAGS) \
diff --git a/firmware/microblaze/usrp2p/bootloader/init_bootloader.c b/firmware/microblaze/usrp2p/bootloader/init_bootloader.c
index 2bbbd405e..1d9d681d7 100644
--- a/firmware/microblaze/usrp2p/bootloader/init_bootloader.c
+++ b/firmware/microblaze/usrp2p/bootloader/init_bootloader.c
@@ -18,9 +18,6 @@
#include <i2c.h>
#include "usrp2/fw_common.h"
-bool find_safe_booted_flag(void);
-void set_safe_booted_flag(bool flag);
-
void pic_interrupt_handler() __attribute__ ((interrupt_handler));
void pic_interrupt_handler()
@@ -28,18 +25,6 @@ void pic_interrupt_handler()
// nop stub
}
-bool find_safe_booted_flag(void) {
- unsigned char flag_byte;
- eeprom_read(USRP2_I2C_ADDR_MBOARD, USRP2_EE_MBOARD_BOOTLOADER_FLAGS, &flag_byte, 1);
- return (flag_byte == 0x5E);
-}
-
-void set_safe_booted_flag(bool flag) {
- unsigned char flag_byte = flag ? 0x5E : 0xDC;
- eeprom_write(USRP2_I2C_ADDR_MBOARD, USRP2_EE_MBOARD_BOOTLOADER_FLAGS, &flag_byte, 1);
-}
-
-
void load_ihex(void) { //simple IHEX parser to load proper records into RAM. loads program when it receives end of record.
char buf[128]; //input data buffer
uint8_t ihx[32]; //ihex data buffer
@@ -79,22 +64,22 @@ int main(int argc, char *argv[]) {
puts("USRP2+ bootloader\n");
bool production_image = find_safe_booted_flag();
- if(production_image) set_safe_booted_flag(0); //we're the production image, so we clear the flag for the next boot
-
+ set_safe_booted_flag(0); //haven't booted yet
+
if(BUTTON_PUSHED) { //see memory_map.h
puts("Starting USRP2+ in safe mode.");
if(is_valid_fw_image(SAFE_FW_IMAGE_LOCATION_ADDR)) {
+ set_safe_booted_flag(1); //let the firmware know it's the safe image
spi_flash_read(SAFE_FW_IMAGE_LOCATION_ADDR, FW_IMAGE_SIZE_BYTES, (void *)RAM_BASE);
start_program(RAM_BASE);
puts("ERROR: return from main program! This should never happen!");
icap_reload_fpga(SAFE_FPGA_IMAGE_LOCATION_ADDR);
} else {
puts("ERROR: no safe firmware image available. I am a brick. Feel free to load IHEX to RAM.");
- //puts("ERROR: no safe firmware image available. I am a brick.");
load_ihex();
}
}
-
+
if(!production_image) {
puts("Checking for valid production FPGA image...");
if(is_valid_fpga_image(PROD_FPGA_IMAGE_LOCATION_ADDR)) {
diff --git a/firmware/microblaze/usrp2p/memory_map.h b/firmware/microblaze/usrp2p/memory_map.h
index 8d0d0c365..3b2dc0057 100644
--- a/firmware/microblaze/usrp2p/memory_map.h
+++ b/firmware/microblaze/usrp2p/memory_map.h
@@ -490,6 +490,10 @@ typedef struct {
typedef struct {
volatile uint32_t num_chan;
volatile uint32_t clear_state; // clears out state machine, fifos,
+ volatile uint32_t report_sid;
+ volatile uint32_t policy;
+ volatile uint32_t cyc_per_up;
+ volatile uint32_t packets_per_up;
} sr_tx_ctrl_t;
#define sr_tx_ctrl ((sr_tx_ctrl_t *) _SR_ADDR(SR_TX_CTRL))
diff --git a/firmware/microblaze/usrp2p/udp_fw_update.c b/firmware/microblaze/usrp2p/udp_fw_update.c
index 55c206b1b..ead08ad2c 100644
--- a/firmware/microblaze/usrp2p/udp_fw_update.c
+++ b/firmware/microblaze/usrp2p/udp_fw_update.c
@@ -38,13 +38,13 @@ void handle_udp_fw_update_packet(struct socket_address src, struct socket_addres
usrp2_fw_update_id_t update_data_in_id = update_data_in->id;
//ensure that the protocol versions match
- if (payload_len >= sizeof(uint32_t) && update_data_in->proto_ver != USRP2_FW_COMPAT_NUM){
+/* if (payload_len >= sizeof(uint32_t) && update_data_in->proto_ver != USRP2_FW_COMPAT_NUM){
printf("!Error in update packet handler: Expected compatibility number %d, but got %d\n",
USRP2_FW_COMPAT_NUM, update_data_in->proto_ver
);
update_data_in_id = USRP2_FW_UPDATE_ID_OHAI_LOL; //so we can respond
}
-
+*/
//ensure that this is not a short packet
if (payload_len < sizeof(usrp2_fw_update_data_t)){
printf("!Error in update packet handler: Expected payload length %d, but got %d\n",
diff --git a/fpga/usrp2/control_lib/Makefile.srcs b/fpga/usrp2/control_lib/Makefile.srcs
index bc8e4d5bc..d3bb7e2c8 100644
--- a/fpga/usrp2/control_lib/Makefile.srcs
+++ b/fpga/usrp2/control_lib/Makefile.srcs
@@ -21,6 +21,7 @@ nsgpio.v \
ram_2port.v \
ram_harv_cache.v \
ram_harvard.v \
+ram_harvard2.v \
ram_loader.v \
setting_reg.v \
settings_bus.v \
@@ -29,6 +30,7 @@ srl.v \
system_control.v \
wb_1master.v \
wb_readback_mux.v \
+quad_uart.v \
simple_uart.v \
simple_uart_tx.v \
simple_uart_rx.v \
@@ -42,4 +44,9 @@ pic.v \
longfifo.v \
shortfifo.v \
medfifo.v \
+s3a_icap_wb.v \
+bootram.v \
+nsgpio16LE.v \
+settings_bus_16LE.v \
+atr_controller16.v \
))
diff --git a/fpga/usrp2/control_lib/atr_controller16.v b/fpga/usrp2/control_lib/atr_controller16.v
new file mode 100644
index 000000000..3d8b5b1e9
--- /dev/null
+++ b/fpga/usrp2/control_lib/atr_controller16.v
@@ -0,0 +1,60 @@
+
+// Automatic transmit/receive switching of control pins to daughterboards
+// Store everything in registers for now, but could use a RAM for more
+// complex state machines in the future
+
+module atr_controller16
+ (input clk_i, input rst_i,
+ input [5:0] adr_i, input [1:0] sel_i, input [15:0] dat_i, output reg [15:0] dat_o,
+ input we_i, input stb_i, input cyc_i, output reg ack_o,
+ input run_rx, input run_tx, input [31:0] master_time,
+ output [31:0] ctrl_lines);
+
+ reg [3:0] state;
+ reg [31:0] atr_ram [0:15]; // DP distributed RAM
+
+ wire [3:0] sel_int = { (sel_i[1] & adr_i[1]), (sel_i[0] & adr_i[1]),
+ (sel_i[1] & ~adr_i[1]), (sel_i[0] & ~adr_i[1]) };
+
+ // WB Interface
+ always @(posedge clk_i)
+ if(we_i & stb_i & cyc_i)
+ begin
+ if(sel_int[3])
+ atr_ram[adr_i[5:2]][31:24] <= dat_i[15:8];
+ if(sel_int[2])
+ atr_ram[adr_i[5:2]][23:16] <= dat_i[7:0];
+ if(sel_int[1])
+ atr_ram[adr_i[5:2]][15:8] <= dat_i[15:8];
+ if(sel_int[0])
+ atr_ram[adr_i[5:2]][7:0] <= dat_i[7:0];
+ end // if (we_i & stb_i & cyc_i)
+
+ always @(posedge clk_i)
+ dat_o <= adr_i[1] ? atr_ram[adr_i[5:2]][31:16] : atr_ram[adr_i[5:2]][15:0];
+
+ always @(posedge clk_i)
+ ack_o <= stb_i & cyc_i & ~ack_o;
+
+ // Control side of DP RAM
+ assign ctrl_lines = atr_ram[state];
+
+ // Put a more complex state machine with time delays and multiple states here
+ // if daughterboard requires more complex sequencing
+ localparam ATR_IDLE = 4'd0;
+ localparam ATR_TX = 4'd1;
+ localparam ATR_RX = 4'd2;
+ localparam ATR_FULL_DUPLEX = 4'd3;
+
+ always @(posedge clk_i)
+ if(rst_i)
+ state <= ATR_IDLE;
+ else
+ case ({run_rx,run_tx})
+ 2'b00 : state <= ATR_IDLE;
+ 2'b01 : state <= ATR_TX;
+ 2'b10 : state <= ATR_RX;
+ 2'b11 : state <= ATR_FULL_DUPLEX;
+ endcase // case({run_rx,run_tx})
+
+endmodule // atr_controller16
diff --git a/fpga/usrp2/control_lib/bootram.v b/fpga/usrp2/control_lib/bootram.v
new file mode 100644
index 000000000..668012504
--- /dev/null
+++ b/fpga/usrp2/control_lib/bootram.v
@@ -0,0 +1,250 @@
+
+// Boot RAM for S3A, 8KB, dual port
+
+// RAMB16BWE_S36_S36: 512 x 32 + 4 Parity bits byte-wide write Dual-Port RAM
+// Spartan-3A Xilinx HDL Libraries Guide, version 10.1.1
+
+module bootram
+ (input clk, input reset,
+ input [12:0] if_adr,
+ output [31:0] if_data,
+
+ input [12:0] dwb_adr_i,
+ input [31:0] dwb_dat_i,
+ output [31:0] dwb_dat_o,
+ input dwb_we_i,
+ output reg dwb_ack_o,
+ input dwb_stb_i,
+ input [3:0] dwb_sel_i);
+
+ wire [31:0] DOA0, DOA1, DOA2, DOA3;
+ wire [31:0] DOB0, DOB1, DOB2, DOB3;
+ wire ENB0, ENB1, ENB2, ENB3;
+ wire [3:0] WEB;
+
+ reg [1:0] delayed_if_bank;
+ always @(posedge clk)
+ delayed_if_bank <= if_adr[12:11];
+
+ assign if_data = delayed_if_bank[1] ? (delayed_if_bank[0] ? DOA3 : DOA2) : (delayed_if_bank[0] ? DOA1 : DOA0);
+ assign dwb_dat_o = dwb_adr_i[12] ? (dwb_adr_i[11] ? DOB3 : DOB2) : (dwb_adr_i[11] ? DOB1 : DOB0);
+
+ always @(posedge clk)
+ if(reset)
+ dwb_ack_o <= 0;
+ else
+ dwb_ack_o <= dwb_stb_i & ~dwb_ack_o;
+
+ assign ENB0 = dwb_stb_i & (dwb_adr_i[12:11] == 2'b00);
+ assign ENB1 = dwb_stb_i & (dwb_adr_i[12:11] == 2'b01);
+ assign ENB2 = dwb_stb_i & (dwb_adr_i[12:11] == 2'b10);
+ assign ENB3 = dwb_stb_i & (dwb_adr_i[12:11] == 2'b11);
+
+ assign WEB = {4{dwb_we_i}} & dwb_sel_i;
+
+ RAMB16BWE_S36_S36
+ #(.INIT_A(36'h000000000), // Value of output RAM registers on Port A at startup
+ .INIT_B(36'h000000000), // Value of output RAM registers on Port B at startup
+ .SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"
+ .SRVAL_A(36'h000000000), // Port A output value upon SSR assertion
+ .SRVAL_B(36'h000000000), // Port B output value upon SSR assertion
+ .WRITE_MODE_A("WRITE_FIRST"), // WRITE_FIRST, READ_FIRST or NO_CHANGE
+ .WRITE_MODE_B("WRITE_FIRST")) // WRITE_FIRST, READ_FIRST or NO_CHANGE
+ RAM0
+ (.DOA(DOA0), // Port A 32-bit Data Output
+ .DOPA(), // Port A 4-bit Parity Output
+ .ADDRA(if_adr[10:2]), // Port A 9-bit Address Input
+ .CLKA(clk), // Port A 1-bit Clock
+ .DIA(32'd0), // Port A 32-bit Data Input
+ .DIPA(4'd0), // Port A 4-bit parity Input
+ .ENA(1'b1), // Port A 1-bit RAM Enable Input
+ .SSRA(1'b0), // Port A 1-bit Synchronous Set/Reset Input
+ .WEA(1'b0), // Port A 4-bit Write Enable Input
+
+ .DOB(DOB0), // Port B 32-bit Data Output
+ .DOPB(), // Port B 4-bit Parity Output
+ .ADDRB(dwb_adr_i[10:2]), // Port B 9-bit Address Input
+ .CLKB(clk), // Port B 1-bit Clock
+ .DIB(dwb_dat_i), // Port B 32-bit Data Input
+ .DIPB(4'd0), // Port-B 4-bit parity Input
+ .ENB(ENB0), // Port B 1-bit RAM Enable Input
+ .SSRB(1'b0), // Port B 1-bit Synchronous Set/Reset Input
+ .WEB(WEB) // Port B 4-bit Write Enable Input
+ ); // End of RAMB16BWE_S36_S36_inst instantiation
+
+ RAMB16BWE_S36_S36
+ #(.INIT_A(36'h000000000), // Value of output RAM registers on Port A at startup
+ .INIT_B(36'h000000000), // Value of output RAM registers on Port B at startup
+ .SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"
+ .SRVAL_A(36'h000000000), // Port A output value upon SSR assertion
+ .SRVAL_B(36'h000000000), // Port B output value upon SSR assertion
+ .WRITE_MODE_A("WRITE_FIRST"), // WRITE_FIRST, READ_FIRST or NO_CHANGE
+ .WRITE_MODE_B("WRITE_FIRST")) // WRITE_FIRST, READ_FIRST or NO_CHANGE
+ RAM1
+ (.DOA(DOA1), // Port A 32-bit Data Output
+ .DOPA(), // Port A 4-bit Parity Output
+ .ADDRA(if_adr[10:2]), // Port A 9-bit Address Input
+ .CLKA(clk), // Port A 1-bit Clock
+ .DIA(32'd0), // Port A 32-bit Data Input
+ .DIPA(4'd0), // Port A 4-bit parity Input
+ .ENA(1'b1), // Port A 1-bit RAM Enable Input
+ .SSRA(1'b0), // Port A 1-bit Synchronous Set/Reset Input
+ .WEA(1'b0), // Port A 4-bit Write Enable Input
+
+ .DOB(DOB1), // Port B 32-bit Data Output
+ .DOPB(), // Port B 4-bit Parity Output
+ .ADDRB(dwb_adr_i[10:2]), // Port B 9-bit Address Input
+ .CLKB(clk), // Port B 1-bit Clock
+ .DIB(dwb_dat_i), // Port B 32-bit Data Input
+ .DIPB(4'd0), // Port-B 4-bit parity Input
+ .ENB(ENB1), // Port B 1-bit RAM Enable Input
+ .SSRB(1'b0), // Port B 1-bit Synchronous Set/Reset Input
+ .WEB(WEB) // Port B 4-bit Write Enable Input
+ ); // End of RAMB16BWE_S36_S36_inst instantiation
+
+ RAMB16BWE_S36_S36
+ #(.INIT_A(36'h000000000), // Value of output RAM registers on Port A at startup
+ .INIT_B(36'h000000000), // Value of output RAM registers on Port B at startup
+ .SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"
+ .SRVAL_A(36'h000000000), // Port A output value upon SSR assertion
+ .SRVAL_B(36'h000000000), // Port B output value upon SSR assertion
+ .WRITE_MODE_A("WRITE_FIRST"), // WRITE_FIRST, READ_FIRST or NO_CHANGE
+ .WRITE_MODE_B("WRITE_FIRST")) // WRITE_FIRST, READ_FIRST or NO_CHANGE
+ RAM2
+ (.DOA(DOA2), // Port A 32-bit Data Output
+ .DOPA(), // Port A 4-bit Parity Output
+ .ADDRA(if_adr[10:2]), // Port A 9-bit Address Input
+ .CLKA(clk), // Port A 1-bit Clock
+ .DIA(32'd0), // Port A 32-bit Data Input
+ .DIPA(4'd0), // Port A 4-bit parity Input
+ .ENA(1'b1), // Port A 1-bit RAM Enable Input
+ .SSRA(1'b0), // Port A 1-bit Synchronous Set/Reset Input
+ .WEA(1'b0), // Port A 4-bit Write Enable Input
+
+ .DOB(DOB2), // Port B 32-bit Data Output
+ .DOPB(), // Port B 4-bit Parity Output
+ .ADDRB(dwb_adr_i[10:2]), // Port B 9-bit Address Input
+ .CLKB(clk), // Port B 1-bit Clock
+ .DIB(dwb_dat_i), // Port B 32-bit Data Input
+ .DIPB(4'd0), // Port-B 4-bit parity Input
+ .ENB(ENB2), // Port B 1-bit RAM Enable Input
+ .SSRB(1'b0), // Port B 1-bit Synchronous Set/Reset Input
+ .WEB(WEB) // Port B 4-bit Write Enable Input
+ ); // End of RAMB16BWE_S36_S36_inst instantiation
+
+ RAMB16BWE_S36_S36
+ #(.INIT_A(36'h000000000), // Value of output RAM registers on Port A at startup
+ .INIT_B(36'h000000000), // Value of output RAM registers on Port B at startup
+ .SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"
+ .SRVAL_A(36'h000000000), // Port A output value upon SSR assertion
+ .SRVAL_B(36'h000000000), // Port B output value upon SSR assertion
+ .WRITE_MODE_A("WRITE_FIRST"), // WRITE_FIRST, READ_FIRST or NO_CHANGE
+ .WRITE_MODE_B("WRITE_FIRST")) // WRITE_FIRST, READ_FIRST or NO_CHANGE
+ RAM3
+ (.DOA(DOA3), // Port A 32-bit Data Output
+ .DOPA(), // Port A 4-bit Parity Output
+ .ADDRA(if_adr[10:2]), // Port A 9-bit Address Input
+ .CLKA(clk), // Port A 1-bit Clock
+ .DIA(32'd0), // Port A 32-bit Data Input
+ .DIPA(4'd0), // Port A 4-bit parity Input
+ .ENA(1'b1), // Port A 1-bit RAM Enable Input
+ .SSRA(1'b0), // Port A 1-bit Synchronous Set/Reset Input
+ .WEA(1'b0), // Port A 4-bit Write Enable Input
+
+ .DOB(DOB3), // Port B 32-bit Data Output
+ .DOPB(), // Port B 4-bit Parity Output
+ .ADDRB(dwb_adr_i[10:2]), // Port B 9-bit Address Input
+ .CLKB(clk), // Port B 1-bit Clock
+ .DIB(dwb_dat_i), // Port B 32-bit Data Input
+ .DIPB(4'd0), // Port-B 4-bit parity Input
+ .ENB(ENB3), // Port B 1-bit RAM Enable Input
+ .SSRB(1'b0), // Port B 1-bit Synchronous Set/Reset Input
+ .WEB(WEB) // Port B 4-bit Write Enable Input
+ ); // End of RAMB16BWE_S36_S36_inst instantiation
+
+endmodule // bootram
+
+/*
+ // The following INIT_xx declarations specify the initial contents of the RAM
+ // Address 0 to 127
+ .INIT_00(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_01(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_02(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_03(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_04(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_05(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_06(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_07(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_08(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_09(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_0A(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_0B(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_0C(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_0D(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_0E(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_0F(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ // Address 128 to 255
+ .INIT_10(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_11(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_12(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_13(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_14(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_15(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_16(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_17(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_18(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_19(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_1A(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_1B(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_1C(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_1D(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_1E(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_1F(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ // Address 256 to 383
+ .INIT_20(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_21(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_22(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_23(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_24(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_25(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_26(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_27(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_28(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_29(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_2A(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_2B(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_2C(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_2D(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_2E(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_2F(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ // Address 384 to 511
+ .INIT_30(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_31(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_32(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_33(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_34(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_35(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_36(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_37(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_38(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_39(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_3A(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_3B(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_3C(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_3D(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_3E(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ .INIT_3F(256’h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000),
+ // The next set of INITP_xx are for the parity bits
+ // Address 0 to 127
+ .INITP_00(256’h0000000000000000000000000000000000000000000000000000000000000000),
+ .INITP_01(256’h0000000000000000000000000000000000000000000000000000000000000000),
+ // Address 128 to 255
+ .INITP_02(256’h0000000000000000000000000000000000000000000000000000000000000000),
+ .INITP_03(256’h0000000000000000000000000000000000000000000000000000000000000000),
+ // Address 256 to 383
+ .INITP_04(256’h0000000000000000000000000000000000000000000000000000000000000000),
+ .INITP_05(256’h0000000000000000000000000000000000000000000000000000000000000000),
+ // Address 384 to 511
+ .INITP_06(256’h0000000000000000000000000000000000000000000000000000000000000000),
+ .INITP_07(256’h0000000000000000000000000000000000000000000000000000000000000000)
+*/
diff --git a/fpga/usrp2/control_lib/newfifo/fifo_pacer.v b/fpga/usrp2/control_lib/newfifo/fifo_pacer.v
new file mode 100644
index 000000000..1bf03ab6e
--- /dev/null
+++ b/fpga/usrp2/control_lib/newfifo/fifo_pacer.v
@@ -0,0 +1,24 @@
+
+
+module fifo_pacer
+ (input clk,
+ input reset,
+ input [7:0] rate,
+ input enable,
+ input src1_rdy_i, output dst1_rdy_o,
+ output src2_rdy_o, input dst2_rdy_i,
+ output underrun, overrun);
+
+ wire strobe;
+
+ cic_strober strober (.clock(clk), .reset(reset), .enable(enable),
+ .rate(rate), .strobe_fast(1), .strobe_slow(strobe));
+
+ wire all_ready = src1_rdy_i & dst2_rdy_i;
+ assign dst1_rdy_o = all_ready & strobe;
+ assign src2_rdy_o = dst1_rdy_o;
+
+ assign underrun = strobe & ~src1_rdy_i;
+ assign overrun = strobe & ~dst2_rdy_i;
+
+endmodule // fifo_pacer
diff --git a/fpga/usrp2/control_lib/newfifo/packet32_tb.v b/fpga/usrp2/control_lib/newfifo/packet32_tb.v
new file mode 100644
index 000000000..82bb09c29
--- /dev/null
+++ b/fpga/usrp2/control_lib/newfifo/packet32_tb.v
@@ -0,0 +1,27 @@
+
+
+module packet32_tb();
+
+ wire [35:0] data;
+ wire src_rdy, dst_rdy;
+
+ wire clear = 0;
+ reg clk = 0;
+ reg reset = 1;
+
+ always #10 clk <= ~clk;
+ initial #1000 reset <= 0;
+
+ initial $dumpfile("packet32_tb.vcd");
+ initial $dumpvars(0,packet32_tb);
+
+ wire [31:0] total, crc_err, seq_err, len_err;
+
+ packet_generator32 pkt_gen (.clk(clk), .reset(reset), .clear(clear),
+ .data_o(data), .src_rdy_o(src_rdy), .dst_rdy_i(dst_rdy));
+
+ packet_verifier32 pkt_ver (.clk(clk), .reset(reset), .clear(clear),
+ .data_i(data), .src_rdy_i(src_rdy), .dst_rdy_o(dst_rdy),
+ .total(total), .crc_err(crc_err), .seq_err(seq_err), .len_err(len_err));
+
+endmodule // packet32_tb
diff --git a/fpga/usrp2/control_lib/newfifo/packet_generator.v b/fpga/usrp2/control_lib/newfifo/packet_generator.v
new file mode 100644
index 000000000..6e8b45ccd
--- /dev/null
+++ b/fpga/usrp2/control_lib/newfifo/packet_generator.v
@@ -0,0 +1,59 @@
+
+
+module packet_generator
+ (input clk, input reset, input clear,
+ output reg [7:0] data_o, output sof_o, output eof_o,
+ output src_rdy_o, input dst_rdy_i);
+
+ localparam len = 32'd2000;
+
+ reg [31:0] state;
+ reg [31:0] seq;
+ wire [31:0] crc_out;
+ wire calc_crc = src_rdy_o & dst_rdy_i & ~(state[31:2] == 30'h3FFF_FFFF);
+
+
+ always @(posedge clk)
+ if(reset | clear)
+ seq <= 0;
+ else
+ if(eof_o & src_rdy_o & dst_rdy_i)
+ seq <= seq + 1;
+
+ always @(posedge clk)
+ if(reset | clear)
+ state <= 0;
+ else
+ if(src_rdy_o & dst_rdy_i)
+ if(state == (len - 1))
+ state <= 32'hFFFF_FFFC;
+ else
+ state <= state + 1;
+
+ always @*
+ case(state)
+ 0 : data_o <= len[7:0];
+ 1 : data_o <= len[15:8];
+ 2 : data_o <= len[23:16];
+ 3 : data_o <= len[31:24];
+ 4 : data_o <= seq[7:0];
+ 5 : data_o <= seq[15:8];
+ 6 : data_o <= seq[23:16];
+ 7 : data_o <= seq[31:24];
+ 32'hFFFF_FFFC : data_o <= crc_out[31:24];
+ 32'hFFFF_FFFD : data_o <= crc_out[23:16];
+ 32'hFFFF_FFFE : data_o <= crc_out[15:8];
+ 32'hFFFF_FFFF : data_o <= crc_out[7:0];
+ default : data_o <= state[7:0];
+ endcase // case (state)
+
+ assign src_rdy_o = 1;
+ assign sof_o = (state == 0);
+ assign eof_o = (state == 32'hFFFF_FFFF);
+
+ wire clear_crc = eof_o & src_rdy_o & dst_rdy_i;
+
+ crc crc(.clk(clk), .reset(reset), .clear(clear_crc), .data(data_o),
+ .calc(calc_crc), .crc_out(crc_out), .match());
+
+endmodule // packet_generator
diff --git a/fpga/usrp2/control_lib/newfifo/packet_generator32.v b/fpga/usrp2/control_lib/newfifo/packet_generator32.v
new file mode 100644
index 000000000..6f8004964
--- /dev/null
+++ b/fpga/usrp2/control_lib/newfifo/packet_generator32.v
@@ -0,0 +1,21 @@
+
+
+module packet_generator32
+ (input clk, input reset, input clear,
+ output [35:0] data_o, output src_rdy_o, input dst_rdy_i);
+
+ wire [7:0] ll_data;
+ wire ll_sof, ll_eof, ll_src_rdy, ll_dst_rdy_n;
+
+ packet_generator pkt_gen
+ (.clk(clk), .reset(reset), .clear(clear),
+ .data_o(ll_data), .sof_o(ll_sof), .eof_o(ll_eof),
+ .src_rdy_o(ll_src_rdy), .dst_rdy_i(~ll_dst_rdy_n));
+
+ ll8_to_fifo36 ll8_to_f36
+ (.clk(clk), .reset(reset), .clear(clear),
+ .ll_data(ll_data), .ll_sof_n(~ll_sof), .ll_eof_n(~ll_eof),
+ .ll_src_rdy_n(~ll_src_rdy), .ll_dst_rdy_n(ll_dst_rdy_n),
+ .f36_data(data_o), .f36_src_rdy_o(src_rdy_o), .f36_dst_rdy_i(dst_rdy_i));
+
+endmodule // packet_generator32
diff --git a/fpga/usrp2/control_lib/newfifo/packet_tb.v b/fpga/usrp2/control_lib/newfifo/packet_tb.v
new file mode 100644
index 000000000..3c423d2ba
--- /dev/null
+++ b/fpga/usrp2/control_lib/newfifo/packet_tb.v
@@ -0,0 +1,29 @@
+
+
+module packet_tb();
+
+ wire [7:0] data;
+ wire sof, eof, src_rdy, dst_rdy;
+
+ wire clear = 0;
+ reg clk = 0;
+ reg reset = 1;
+
+ always #10 clk <= ~clk;
+ initial #1000 reset <= 0;
+
+ initial $dumpfile("packet_tb.vcd");
+ initial $dumpvars(0,packet_tb);
+
+ wire [31:0] total, crc_err, seq_err, len_err;
+
+ packet_generator pkt_gen (.clk(clk), .reset(reset), .clear(clear),
+ .data_o(data), .sof_o(sof), .eof_o(eof),
+ .src_rdy_o(src_rdy), .dst_rdy_i(dst_rdy));
+
+ packet_verifier pkt_ver (.clk(clk), .reset(reset), .clear(clear),
+ .data_i(data), .sof_i(sof), .eof_i(eof),
+ .src_rdy_i(src_rdy), .dst_rdy_o(dst_rdy),
+ .total(total), .crc_err(crc_err), .seq_err(seq_err), .len_err(len_err));
+
+endmodule // packet_tb
diff --git a/fpga/usrp2/control_lib/newfifo/packet_verifier.v b/fpga/usrp2/control_lib/newfifo/packet_verifier.v
new file mode 100644
index 000000000..b49ad1bbb
--- /dev/null
+++ b/fpga/usrp2/control_lib/newfifo/packet_verifier.v
@@ -0,0 +1,61 @@
+
+
+// Packet format --
+// Line 1 -- Length, 32 bits
+// Line 2 -- Sequence number, 32 bits
+// Last line -- CRC, 32 bits
+
+module packet_verifier
+ (input clk, input reset, input clear,
+ input [7:0] data_i, input sof_i, input eof_i, input src_rdy_i, output dst_rdy_o,
+
+ output reg [31:0] total,
+ output reg [31:0] crc_err,
+ output reg [31:0] seq_err,
+ output reg [31:0] len_err);
+
+ reg [31:0] seq_num;
+ reg [31:0] length;
+ wire first_byte, last_byte;
+ reg second_byte, last_byte_d1;
+
+ wire calc_crc = src_rdy_i & dst_rdy_o;
+
+ crc crc(.clk(clk), .reset(reset), .clear(last_byte_d1), .data(data_i),
+ .calc(calc_crc), .crc_out(), .match(match_crc));
+
+ assign first_byte = src_rdy_i & dst_rdy_o & sof_i;
+ assign last_byte = src_rdy_i & dst_rdy_o & eof_i;
+ assign dst_rdy_o = ~last_byte_d1;
+
+ // stubs for now
+ wire match_seq = 1;
+ wire match_len = 1;
+
+ always @(posedge clk)
+ if(reset | clear)
+ last_byte_d1 <= 0;
+ else
+ last_byte_d1 <= last_byte;
+
+ always @(posedge clk)
+ if(reset | clear)
+ begin
+ total <= 0;
+ crc_err <= 0;
+ seq_err <= 0;
+ len_err <= 0;
+ end
+ else
+ if(last_byte_d1)
+ begin
+ total <= total + 1;
+ if(~match_crc)
+ crc_err <= crc_err + 1;
+ else if(~match_seq)
+ seq_err <= seq_err + 1;
+ else if(~match_len)
+ seq_err <= len_err + 1;
+ end
+
+endmodule // packet_verifier
diff --git a/fpga/usrp2/control_lib/newfifo/packet_verifier32.v b/fpga/usrp2/control_lib/newfifo/packet_verifier32.v
new file mode 100644
index 000000000..06a13d242
--- /dev/null
+++ b/fpga/usrp2/control_lib/newfifo/packet_verifier32.v
@@ -0,0 +1,30 @@
+
+
+module packet_verifier32
+ (input clk, input reset, input clear,
+ input [35:0] data_i, input src_rdy_i, output dst_rdy_o,
+ output [31:0] total, output [31:0] crc_err, output [31:0] seq_err, output [31:0] len_err);
+
+ wire [7:0] ll_data;
+ wire ll_sof_n, ll_eof_n, ll_src_rdy_n, ll_dst_rdy;
+ wire [35:0] data_int;
+ wire src_rdy_int, dst_rdy_int;
+
+ fifo_short #(.WIDTH(36)) fifo_short
+ (.clk(clk), .reset(reset), .clear(clear),
+ .datain(data_i), .src_rdy_i(src_rdy_i), .dst_rdy_o(dst_rdy_o),
+ .dataout(data_int), .src_rdy_o(src_rdy_int), .dst_rdy_i(dst_rdy_int));
+
+ fifo36_to_ll8 f36_to_ll8
+ (.clk(clk), .reset(reset), .clear(clear),
+ .f36_data(data_int), .f36_src_rdy_i(src_rdy_int), .f36_dst_rdy_o(dst_rdy_int),
+ .ll_data(ll_data), .ll_sof_n(ll_sof_n), .ll_eof_n(ll_eof_n),
+ .ll_src_rdy_n(ll_src_rdy_n), .ll_dst_rdy_n(~ll_dst_rdy));
+
+ packet_verifier pkt_ver
+ (.clk(clk), .reset(reset), .clear(clear),
+ .data_i(ll_data), .sof_i(~ll_sof_n), .eof_i(~ll_eof_n),
+ .src_rdy_i(~ll_src_rdy_n), .dst_rdy_o(ll_dst_rdy),
+ .total(total), .crc_err(crc_err), .seq_err(seq_err), .len_err(len_err));
+
+endmodule // packet_verifier32
diff --git a/fpga/usrp2/control_lib/nsgpio16LE.v b/fpga/usrp2/control_lib/nsgpio16LE.v
new file mode 100644
index 000000000..8aef0c7ae
--- /dev/null
+++ b/fpga/usrp2/control_lib/nsgpio16LE.v
@@ -0,0 +1,123 @@
+// Modified from code originally by Richard Herveille, his copyright is below
+
+/////////////////////////////////////////////////////////////////////
+//// ////
+//// OpenCores Simple General Purpose IO core ////
+//// ////
+//// Author: Richard Herveille ////
+//// richard@asics.ws ////
+//// www.asics.ws ////
+//// ////
+/////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2002 Richard Herveille ////
+//// richard@asics.ws ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer.////
+//// ////
+//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
+//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
+//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
+//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
+//// OR 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. ////
+//// ////
+/////////////////////////////////////////////////////////////////////
+
+
+module nsgpio16LE
+ (input clk_i, input rst_i,
+ input cyc_i, input stb_i, input [3:0] adr_i, input we_i, input [15:0] dat_i,
+ output reg [15:0] dat_o, output reg ack_o,
+ input [31:0] atr, input [31:0] debug_0, input [31:0] debug_1,
+ inout [31:0] gpio
+ );
+
+ reg [31:0] ctrl, line, ddr, dbg, lgpio;
+
+ wire wb_acc = cyc_i & stb_i; // WISHBONE access
+ wire wb_wr = wb_acc & we_i; // WISHBONE write access
+
+ always @(posedge clk_i or posedge rst_i)
+ if (rst_i)
+ begin
+ ctrl <= 32'h0;
+ line <= 32'h0;
+ ddr <= 32'h0;
+ dbg <= 32'h0;
+ end
+ else if (wb_wr)
+ case( adr_i[3:1] )
+ 3'b000 :
+ line[15:0] <= dat_i;
+ 3'b001 :
+ line[31:16] <= dat_i;
+ 3'b010 :
+ ddr[15:0] <= dat_i;
+ 3'b011 :
+ ddr[31:16] <= dat_i;
+ 3'b100 :
+ ctrl[15:0] <= dat_i;
+ 3'b101 :
+ ctrl[31:16] <= dat_i;
+ 3'b110 :
+ dbg[15:0] <= dat_i;
+ 3'b111 :
+ dbg[31:16] <= dat_i;
+ endcase // case ( adr_i[3:1] )
+
+ always @(posedge clk_i)
+ case (adr_i[3:1])
+ 3'b000 :
+ dat_o <= lgpio[15:0];
+ 3'b001 :
+ dat_o <= lgpio[31:16];
+ 3'b010 :
+ dat_o <= ddr[15:0];
+ 3'b011 :
+ dat_o <= ddr[31:16];
+ 3'b100 :
+ dat_o <= ctrl[15:0];
+ 3'b101 :
+ dat_o <= ctrl[31:16];
+ 3'b110 :
+ dat_o <= dbg[15:0];
+ 3'b111 :
+ dat_o <= dbg[31:16];
+ endcase // case (adr_i[3:1])
+
+
+ always @(posedge clk_i or posedge rst_i)
+ if (rst_i)
+ ack_o <= 1'b0;
+ else
+ ack_o <= wb_acc & !ack_o;
+
+ // latch GPIO input pins
+ always @(posedge clk_i)
+ lgpio <= gpio;
+
+ // assign GPIO outputs
+ integer n;
+ reg [31:0] igpio; // temporary internal signal
+
+ always @(ctrl or line or debug_1 or debug_0 or atr or ddr or dbg)
+ for(n=0;n<32;n=n+1)
+ igpio[n] <= ddr[n] ? (dbg[n] ? (ctrl[n] ? debug_1[n] : debug_0[n]) :
+ (ctrl[n] ? atr[n] : line[n]) )
+ : 1'bz;
+
+ assign gpio = igpio;
+
+endmodule
+
diff --git a/fpga/usrp2/control_lib/quad_uart.v b/fpga/usrp2/control_lib/quad_uart.v
new file mode 100644
index 000000000..afa6fae1d
--- /dev/null
+++ b/fpga/usrp2/control_lib/quad_uart.v
@@ -0,0 +1,71 @@
+
+module quad_uart
+ #(parameter TXDEPTH = 1,
+ parameter RXDEPTH = 1)
+ (input clk_i, input rst_i,
+ input we_i, input stb_i, input cyc_i, output reg ack_o,
+ input [4:0] adr_i, input [31:0] dat_i, output reg [31:0] dat_o,
+ output [3:0] rx_int_o, output [3:0] tx_int_o,
+ output [3:0] tx_o, input [3:0] rx_i, output [3:0] baud_o
+ );
+
+ // Register Map
+ localparam SUART_CLKDIV = 0;
+ localparam SUART_TXLEVEL = 1;
+ localparam SUART_RXLEVEL = 2;
+ localparam SUART_TXCHAR = 3;
+ localparam SUART_RXCHAR = 4;
+
+ wire wb_acc = cyc_i & stb_i; // WISHBONE access
+ wire wb_wr = wb_acc & we_i; // WISHBONE write access
+
+ reg [15:0] clkdiv[0:3];
+ wire [7:0] rx_char[0:3];
+ wire [3:0] tx_fifo_full, rx_fifo_empty;
+ wire [7:0] tx_fifo_level[0:3], rx_fifo_level[0:3];
+
+ always @(posedge clk_i)
+ if (rst_i)
+ ack_o <= 1'b0;
+ else
+ ack_o <= wb_acc & ~ack_o;
+
+ integer i;
+ always @(posedge clk_i)
+ if (rst_i)
+ for(i=0;i<4;i=i+1)
+ clkdiv[i] <= 0;
+ else if (wb_wr)
+ case(adr_i[2:0])
+ SUART_CLKDIV : clkdiv[adr_i[4:3]] <= dat_i[15:0];
+ endcase // case(adr_i)
+
+ always @(posedge clk_i)
+ case (adr_i[2:0])
+ SUART_TXLEVEL : dat_o <= tx_fifo_level[adr_i[4:3]];
+ SUART_RXLEVEL : dat_o <= rx_fifo_level[adr_i[4:3]];
+ SUART_RXCHAR : dat_o <= rx_char[adr_i[4:3]];
+ endcase // case(adr_i)
+
+ genvar j;
+ generate
+ for(j=0;j<4;j=j+1)
+ begin : gen_uarts
+ simple_uart_tx #(.DEPTH(TXDEPTH)) simple_uart_tx
+ (.clk(clk_i),.rst(rst_i),
+ .fifo_in(dat_i[7:0]),.fifo_write(ack_o && wb_wr && (adr_i[2:0] == SUART_TXCHAR) && (adr_i[4:3]==j)),
+ .fifo_level(tx_fifo_level[j]),.fifo_full(tx_fifo_full[j]),
+ .clkdiv(clkdiv[j]),.baudclk(baud_o[j]),.tx(tx_o[j]));
+
+ simple_uart_rx #(.DEPTH(RXDEPTH)) simple_uart_rx
+ (.clk(clk_i),.rst(rst_i),
+ .fifo_out(rx_char[j]),.fifo_read(ack_o && ~wb_wr && (adr_i[2:0] == SUART_RXCHAR) && (adr_i[4:3]==j)),
+ .fifo_level(rx_fifo_level[j]),.fifo_empty(rx_fifo_empty[j]),
+ .clkdiv(clkdiv[j]),.rx(rx_i[j]));
+ end // block: gen_uarts
+ endgenerate
+
+ assign tx_int_o = ~tx_fifo_full; // Interrupt for those that have space
+ assign rx_int_o = ~rx_fifo_empty; // Interrupt for those that have data
+
+endmodule // quad_uart
diff --git a/fpga/usrp2/control_lib/ram_2port_mixed_width.v b/fpga/usrp2/control_lib/ram_2port_mixed_width.v
new file mode 100644
index 000000000..fae7d8de3
--- /dev/null
+++ b/fpga/usrp2/control_lib/ram_2port_mixed_width.v
@@ -0,0 +1,120 @@
+
+module ram_2port_mixed_width
+ (input clk16,
+ input en16,
+ input we16,
+ input [10:0] addr16,
+ input [15:0] di16,
+ output [15:0] do16,
+ input clk32,
+ input en32,
+ input we32,
+ input [9:0] addr32,
+ input [31:0] di32,
+ output [31:0] do32);
+
+ wire en32a = en32 & ~addr32[9];
+ wire en32b = en32 & addr32[9];
+ wire en16a = en16 & ~addr16[10];
+ wire en16b = en16 & addr16[10];
+
+ wire [31:0] do32a, do32b;
+ wire [15:0] do16a, do16b;
+
+ assign do32 = addr32[9] ? do32b : do32a;
+ assign do16 = addr16[10] ? do16b : do16a;
+
+ RAMB16BWE_S36_S18 #(.INIT_A(36'h000000000),
+ .INIT_B(18'h00000),
+ .SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"
+ .SRVAL_A(36'h000000000), // Port A output value upon SSR assertion
+ .SRVAL_B(18'h00000), // Port B output value upon SSR assertion
+ .WRITE_MODE_A("WRITE_FIRST"), // WRITE_FIRST, READ_FIRST or NO_CHANGE
+ .WRITE_MODE_B("WRITE_FIRST") // WRITE_FIRST, READ_FIRST or NO_CHANGE
+ )
+ RAMB16BWE_S36_S18_0 (.DOA(do32a), // Port A 32-bit Data Output
+ .DOB(do16a), // Port B 16-bit Data Output
+ .DOPA(), // Port A 4-bit Parity Output
+ .DOPB(), // Port B 2-bit Parity Output
+ .ADDRA(addr32[8:0]), // Port A 9-bit Address Input
+ .ADDRB(addr16[9:0]), // Port B 10-bit Address Input
+ .CLKA(clk32), // Port A 1-bit Clock
+ .CLKB(clk16), // Port B 1-bit Clock
+ .DIA(di32), // Port A 32-bit Data Input
+ .DIB(di16), // Port B 16-bit Data Input
+ .DIPA(0), // Port A 4-bit parity Input
+ .DIPB(0), // Port-B 2-bit parity Input
+ .ENA(en32a), // Port A 1-bit RAM Enable Input
+ .ENB(en16a), // Port B 1-bit RAM Enable Input
+ .SSRA(0), // Port A 1-bit Synchronous Set/Reset Input
+ .SSRB(0), // Port B 1-bit Synchronous Set/Reset Input
+ .WEA({4{we32}}), // Port A 4-bit Write Enable Input
+ .WEB({2{we16}}) // Port B 2-bit Write Enable Input
+ );
+
+ RAMB16BWE_S36_S18 #(.INIT_A(36'h000000000),
+ .INIT_B(18'h00000),
+ .SIM_COLLISION_CHECK("ALL"), // "NONE", "WARNING_ONLY", "GENERATE_X_ONLY", "ALL"
+ .SRVAL_A(36'h000000000), // Port A output value upon SSR assertion
+ .SRVAL_B(18'h00000), // Port B output value upon SSR assertion
+ .WRITE_MODE_A("WRITE_FIRST"), // WRITE_FIRST, READ_FIRST or NO_CHANGE
+ .WRITE_MODE_B("WRITE_FIRST") // WRITE_FIRST, READ_FIRST or NO_CHANGE
+ )
+ RAMB16BWE_S36_S18_1 (.DOA(do32b), // Port A 32-bit Data Output
+ .DOB(do16b), // Port B 16-bit Data Output
+ .DOPA(), // Port A 4-bit Parity Output
+ .DOPB(), // Port B 2-bit Parity Output
+ .ADDRA(addr32[8:0]), // Port A 9-bit Address Input
+ .ADDRB(addr16[9:0]), // Port B 10-bit Address Input
+ .CLKA(clk32), // Port A 1-bit Clock
+ .CLKB(clk16), // Port B 1-bit Clock
+ .DIA(di32), // Port A 32-bit Data Input
+ .DIB(di16), // Port B 16-bit Data Input
+ .DIPA(0), // Port A 4-bit parity Input
+ .DIPB(0), // Port-B 2-bit parity Input
+ .ENA(en32b), // Port A 1-bit RAM Enable Input
+ .ENB(en16b), // Port B 1-bit RAM Enable Input
+ .SSRA(0), // Port A 1-bit Synchronous Set/Reset Input
+ .SSRB(0), // Port B 1-bit Synchronous Set/Reset Input
+ .WEA({4{we32}}), // Port A 4-bit Write Enable Input
+ .WEB({2{we16}}) // Port B 2-bit Write Enable Input
+ );
+
+endmodule // ram_2port_mixed_width
+
+
+
+
+// ISE 10.1.03 chokes on the following
+
+/*
+
+ reg [31:0] ram [(1<<AWIDTH)-1:0];
+ integer i;
+ initial
+ for(i=0;i<512;i=i+1)
+ ram[i] <= 32'b0;
+
+ always @(posedge clk16)
+ if (en16)
+ begin
+ if (we16)
+ if(addr16[0])
+ ram[addr16[10:1]][15:0] <= di16;
+ else
+ ram[addr16[10:1]][31:16] <= di16;
+ do16 <= addr16[0] ? ram[addr16[10:1]][15:0] : ram[addr16[10:1]][31:16];
+ end
+
+ always @(posedge clk32)
+ if (en32)
+ begin
+ if (we32)
+ ram[addr32] <= di32;
+ do32 <= ram[addr32];
+ end
+
+endmodule // ram_2port_mixed_width
+
+
+ */
diff --git a/fpga/usrp2/control_lib/ram_harvard2.v b/fpga/usrp2/control_lib/ram_harvard2.v
new file mode 100644
index 000000000..67777af2a
--- /dev/null
+++ b/fpga/usrp2/control_lib/ram_harvard2.v
@@ -0,0 +1,77 @@
+
+
+// Dual ported, Harvard architecture
+
+module ram_harvard2
+ #(parameter AWIDTH=15,
+ parameter RAM_SIZE=32768)
+ (input wb_clk_i,
+ input wb_rst_i,
+ // Instruction fetch port.
+ input [AWIDTH-1:0] if_adr,
+ output reg [31:0] if_data,
+ // Data access port.
+ input [AWIDTH-1:0] dwb_adr_i,
+ input [31:0] dwb_dat_i,
+ output reg [31:0] dwb_dat_o,
+ input dwb_we_i,
+ output dwb_ack_o,
+ input dwb_stb_i,
+ input [3:0] dwb_sel_i);
+
+ reg ack_d1;
+ reg stb_d1;
+
+ assign dwb_ack_o = dwb_stb_i & (dwb_we_i | (stb_d1 & ~ack_d1));
+
+ always @(posedge wb_clk_i)
+ if(wb_rst_i)
+ ack_d1 <= 1'b0;
+ else
+ ack_d1 <= dwb_ack_o;
+
+ always @(posedge wb_clk_i)
+ if(wb_rst_i)
+ stb_d1 <= 0;
+ else
+ stb_d1 <= dwb_stb_i;
+
+ reg [7:0] ram0 [0:(RAM_SIZE/4)-1];
+ reg [7:0] ram1 [0:(RAM_SIZE/4)-1];
+ reg [7:0] ram2 [0:(RAM_SIZE/4)-1];
+ reg [7:0] ram3 [0:(RAM_SIZE/4)-1];
+
+ // Port 1, Read only
+ always @(posedge wb_clk_i)
+ if_data[31:24] <= ram3[if_adr[AWIDTH-1:2]];
+ always @(posedge wb_clk_i)
+ if_data[23:16] <= ram2[if_adr[AWIDTH-1:2]];
+ always @(posedge wb_clk_i)
+ if_data[15:8] <= ram1[if_adr[AWIDTH-1:2]];
+ always @(posedge wb_clk_i)
+ if_data[7:0] <= ram0[if_adr[AWIDTH-1:2]];
+
+ // Port 2, R/W
+ always @(posedge wb_clk_i)
+ if(dwb_stb_i) dwb_dat_o[31:24] <= ram3[dwb_adr_i[AWIDTH-1:2]];
+ always @(posedge wb_clk_i)
+ if(dwb_stb_i) dwb_dat_o[23:16] <= ram2[dwb_adr_i[AWIDTH-1:2]];
+ always @(posedge wb_clk_i)
+ if(dwb_stb_i) dwb_dat_o[15:8] <= ram1[dwb_adr_i[AWIDTH-1:2]];
+ always @(posedge wb_clk_i)
+ if(dwb_stb_i) dwb_dat_o[7:0] <= ram0[dwb_adr_i[AWIDTH-1:2]];
+
+ always @(posedge wb_clk_i)
+ if(dwb_we_i & dwb_stb_i & dwb_sel_i[3])
+ ram3[dwb_adr_i[AWIDTH-1:2]] <= dwb_dat_i[31:24];
+ always @(posedge wb_clk_i)
+ if(dwb_we_i & dwb_stb_i & dwb_sel_i[2])
+ ram2[dwb_adr_i[AWIDTH-1:2]] <= dwb_dat_i[23:16];
+ always @(posedge wb_clk_i)
+ if(dwb_we_i & dwb_stb_i & dwb_sel_i[1])
+ ram1[dwb_adr_i[AWIDTH-1:2]] <= dwb_dat_i[15:8];
+ always @(posedge wb_clk_i)
+ if(dwb_we_i & dwb_stb_i & dwb_sel_i[0])
+ ram0[dwb_adr_i[AWIDTH-1:2]] <= dwb_dat_i[7:0];
+
+endmodule // ram_harvard
diff --git a/fpga/usrp2/control_lib/s3a_icap_wb.v b/fpga/usrp2/control_lib/s3a_icap_wb.v
new file mode 100644
index 000000000..83d9f775e
--- /dev/null
+++ b/fpga/usrp2/control_lib/s3a_icap_wb.v
@@ -0,0 +1,59 @@
+
+
+module s3a_icap_wb
+ (input clk, input reset,
+ input cyc_i, input stb_i, input we_i, output ack_o,
+ input [31:0] dat_i, output [31:0] dat_o);//, output [31:0] debug_out);
+
+ assign dat_o[31:8] = 24'd0;
+
+ wire BUSY, CE, WRITE, ICAPCLK;
+
+ //changed this to gray-ish code to prevent glitching
+ reg [2:0] icap_state;
+ localparam ICAP_IDLE = 0;
+ localparam ICAP_WR0 = 1;
+ localparam ICAP_WR1 = 5;
+ localparam ICAP_RD0 = 2;
+ localparam ICAP_RD1 = 3;
+
+ always @(posedge clk)
+ if(reset)
+ icap_state <= ICAP_IDLE;
+ else
+ case(icap_state)
+ ICAP_IDLE :
+ begin
+ if(stb_i & cyc_i)
+ if(we_i)
+ icap_state <= ICAP_WR0;
+ else
+ icap_state <= ICAP_RD0;
+ end
+ ICAP_WR0 :
+ icap_state <= ICAP_WR1;
+ ICAP_WR1 :
+ icap_state <= ICAP_IDLE;
+ ICAP_RD0 :
+ icap_state <= ICAP_RD1;
+ ICAP_RD1 :
+ icap_state <= ICAP_IDLE;
+ endcase // case (icap_state)
+
+ assign WRITE = (icap_state == ICAP_WR0) | (icap_state == ICAP_WR1);
+ assign CE = (icap_state == ICAP_WR0) | (icap_state == ICAP_RD0);
+ assign ICAPCLK = CE & (~clk);
+
+ assign ack_o = (icap_state == ICAP_WR1) | (icap_state == ICAP_RD1);
+ //assign debug_out = {17'd0, BUSY, dat_i[7:0], ~CE, ICAPCLK, ~WRITE, icap_state};
+
+ ICAP_SPARTAN3A ICAP_SPARTAN3A_inst
+ (.BUSY(BUSY), // Busy output
+ .O(dat_o[7:0]), // 32-bit data output
+ .CE(~CE), // Clock enable input
+ .CLK(ICAPCLK), // Clock input
+ .I(dat_i[7:0]), // 32-bit data input
+ .WRITE(~WRITE) // Write input
+ );
+
+endmodule // s3a_icap_wb
diff --git a/fpga/usrp2/control_lib/settings_bus.v b/fpga/usrp2/control_lib/settings_bus.v
index fc960e456..aec179516 100644
--- a/fpga/usrp2/control_lib/settings_bus.v
+++ b/fpga/usrp2/control_lib/settings_bus.v
@@ -10,7 +10,7 @@ module settings_bus
input wb_stb_i,
input wb_we_i,
output reg wb_ack_o,
- output strobe,
+ output reg strobe,
output reg [7:0] addr,
output reg [31:0] data);
@@ -19,18 +19,18 @@ module settings_bus
always @(posedge wb_clk)
if(wb_rst)
begin
- stb_int <= 1'b0;
+ strobe <= 1'b0;
addr <= 8'd0;
data <= 32'd0;
end
- else if(wb_we_i & wb_stb_i)
+ else if(wb_we_i & wb_stb_i & ~wb_ack_o)
begin
- stb_int <= 1'b1;
+ strobe <= 1'b1;
addr <= wb_adr_i[9:2];
data <= wb_dat_i;
end
else
- stb_int <= 1'b0;
+ strobe <= 1'b0;
always @(posedge wb_clk)
if(wb_rst)
@@ -38,11 +38,4 @@ module settings_bus
else
wb_ack_o <= wb_stb_i & ~wb_ack_o;
- always @(posedge wb_clk)
- stb_int_d1 <= stb_int;
-
- //assign strobe = stb_int & ~stb_int_d1;
- assign strobe = stb_int & wb_ack_o;
-
endmodule // settings_bus
-
diff --git a/fpga/usrp2/control_lib/settings_bus_16LE.v b/fpga/usrp2/control_lib/settings_bus_16LE.v
new file mode 100644
index 000000000..76061e9e0
--- /dev/null
+++ b/fpga/usrp2/control_lib/settings_bus_16LE.v
@@ -0,0 +1,54 @@
+
+// Grab settings off the wishbone bus, send them out to settings bus
+// 16 bits little endian, but all registers need to be written 32 bits at a time.
+// This means that you write the low 16 bits first and then the high 16 bits.
+// The setting regs are strobed when the high 16 bits are written
+
+module settings_bus_16LE
+ #(parameter AWIDTH=16, RWIDTH=8)
+ (input wb_clk,
+ input wb_rst,
+ input [AWIDTH-1:0] wb_adr_i,
+ input [15:0] wb_dat_i,
+ input wb_stb_i,
+ input wb_we_i,
+ output reg wb_ack_o,
+ output strobe,
+ output reg [7:0] addr,
+ output reg [31:0] data);
+
+ reg stb_int;
+
+ always @(posedge wb_clk)
+ if(wb_rst)
+ begin
+ stb_int <= 1'b0;
+ addr <= 8'd0;
+ data <= 32'd0;
+ end
+ else if(wb_we_i & wb_stb_i)
+ begin
+ addr <= wb_adr_i[RWIDTH+1:2]; // Zero pad high bits
+ if(wb_adr_i[1])
+ begin
+ stb_int <= 1'b1; // We now have both halves
+ data[31:16] <= wb_dat_i;
+ end
+ else
+ begin
+ stb_int <= 1'b0; // Don't strobe, we need other half
+ data[15:0] <= wb_dat_i;
+ end
+ end
+ else
+ stb_int <= 1'b0;
+
+ always @(posedge wb_clk)
+ if(wb_rst)
+ wb_ack_o <= 0;
+ else
+ wb_ack_o <= wb_stb_i & ~wb_ack_o;
+
+ assign strobe = stb_int & wb_ack_o;
+
+endmodule // settings_bus_16LE
diff --git a/fpga/usrp2/control_lib/simple_uart.v b/fpga/usrp2/control_lib/simple_uart.v
index 22f0e70a2..0dd58b5f5 100644
--- a/fpga/usrp2/control_lib/simple_uart.v
+++ b/fpga/usrp2/control_lib/simple_uart.v
@@ -1,11 +1,12 @@
module simple_uart
#(parameter TXDEPTH = 1,
- parameter RXDEPTH = 1)
- (input clk_i, input rst_i,
- input we_i, input stb_i, input cyc_i, output reg ack_o,
- input [2:0] adr_i, input [31:0] dat_i, output reg [31:0] dat_o,
- output rx_int_o, output tx_int_o, output tx_o, input rx_i, output baud_o);
+ parameter RXDEPTH = 1,
+ parameter CLKDIV_DEFAULT = 16'd0)
+ (input clk_i, input rst_i,
+ input we_i, input stb_i, input cyc_i, output reg ack_o,
+ input [2:0] adr_i, input [31:0] dat_i, output reg [31:0] dat_o,
+ output rx_int_o, output tx_int_o, output tx_o, input rx_i, output baud_o);
// Register Map
localparam SUART_CLKDIV = 0;
@@ -30,7 +31,7 @@ module simple_uart
always @(posedge clk_i)
if (rst_i)
- clkdiv <= 0;
+ clkdiv <= CLKDIV_DEFAULT;
else if (wb_wr)
case(adr_i)
SUART_CLKDIV : clkdiv <= dat_i[15:0];
diff --git a/fpga/usrp2/control_lib/v5icap_wb.v b/fpga/usrp2/control_lib/v5icap_wb.v
new file mode 100644
index 000000000..c8800285a
--- /dev/null
+++ b/fpga/usrp2/control_lib/v5icap_wb.v
@@ -0,0 +1,54 @@
+
+
+module v5icap_wb
+ (input clk, input reset,
+ input cyc_i, input stb_i, input we_i, output ack_o,
+ input [31:0] dat_i, output [31:0] dat_o);
+
+ wire BUSY, CE, WRITE;
+
+ reg [2:0] icap_state;
+ localparam ICAP_IDLE = 0;
+ localparam ICAP_WR0 = 1;
+ localparam ICAP_WR1 = 2;
+ localparam ICAP_RD0 = 3;
+ localparam ICAP_RD1 = 4;
+
+ always @(posedge clk)
+ if(reset)
+ icap_state <= ICAP_IDLE;
+ else
+ case(icap_state)
+ ICAP_IDLE :
+ begin
+ if(stb_i & cyc_i)
+ if(we_i)
+ icap_state <= ICAP_WR0;
+ else
+ icap_state <= ICAP_RD0;
+ end
+ ICAP_WR0 :
+ icap_state <= ICAP_WR1;
+ ICAP_WR1 :
+ icap_state <= ICAP_IDLE;
+ ICAP_RD0 :
+ icap_state <= ICAP_RD1;
+ ICAP_RD1 :
+ icap_state <= ICAP_IDLE;
+ endcase // case (icap_state)
+
+ assign WRITE = (icap_state == ICAP_WR0) | (icap_state == ICAP_WR1);
+ assign CE = (icap_state == ICAP_WR1) | (icap_state == ICAP_RD0);
+
+ assign ack_o = (icap_state == ICAP_WR1) | (icap_state == ICAP_RD1);
+
+ ICAP_VIRTEX5 #(.ICAP_WIDTH("X32")) ICAP_VIRTEX5_inst
+ (.BUSY(BUSY), // Busy output
+ .O(dat_o), // 32-bit data output
+ .CE(~CE), // Clock enable input
+ .CLK(clk), // Clock input
+ .I(dat_i), // 32-bit data input
+ .WRITE(~WRITE) // Write input
+ );
+
+endmodule // v5icap_wb
diff --git a/fpga/usrp2/coregen/Makefile.srcs b/fpga/usrp2/coregen/Makefile.srcs
index 7b29225ca..a3a5d826d 100644
--- a/fpga/usrp2/coregen/Makefile.srcs
+++ b/fpga/usrp2/coregen/Makefile.srcs
@@ -16,4 +16,12 @@ fifo_xlnx_16x19_2clk.v \
fifo_xlnx_16x19_2clk.xco \
fifo_xlnx_16x40_2clk.v \
fifo_xlnx_16x40_2clk.xco \
+fifo_xlnx_32x36_2clk.v \
+fifo_xlnx_32x36_2clk.xco \
+fifo_xlnx_512x36_2clk_36to18.v \
+fifo_xlnx_512x36_2clk_36to18.xco \
+fifo_xlnx_512x36_2clk_18to36.v \
+fifo_xlnx_512x36_2clk_18to36.xco \
+fifo_xlnx_512x36_2clk_prog_full.v \
+fifo_xlnx_512x36_2clk_prog_full.xco \
))
diff --git a/fpga/usrp2/coregen/_xmsgs/pn_parser.xmsgs b/fpga/usrp2/coregen/_xmsgs/pn_parser.xmsgs
new file mode 100644
index 000000000..d946af064
--- /dev/null
+++ b/fpga/usrp2/coregen/_xmsgs/pn_parser.xmsgs
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- IMPORTANT: This is an internal file that has been generated -->
+<!-- by the Xilinx ISE software. Any direct editing or -->
+<!-- changes made to this file may result in unpredictable -->
+<!-- behavior or data corruption. It is strongly advised that -->
+<!-- users do not edit the contents of this file. -->
+<!-- -->
+<!-- Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved. -->
+
+<messages>
+<msg type="info" file="ProjectMgmt" num="1062" ><arg fmt="%s" index="1">Parsing Verilog file &quot;/home/jblum/uhdpriv/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.v&quot; into library work</arg>
+</msg>
+
+</messages>
+
diff --git a/fpga/usrp2/coregen/coregen.cgp b/fpga/usrp2/coregen/coregen.cgp
index 810d64dac..dd85a7f50 100644
--- a/fpga/usrp2/coregen/coregen.cgp
+++ b/fpga/usrp2/coregen/coregen.cgp
@@ -1,20 +1,22 @@
-# Date: Thu Sep 3 17:40:48 2009
-SET addpads = False
-SET asysymbol = False
+# Date: Fri Oct 15 07:50:19 2010
+
+SET addpads = false
+SET asysymbol = false
SET busformat = BusFormatAngleBracketNotRipped
-SET createndf = False
+SET createndf = false
SET designentry = Verilog
SET device = xc3s2000
SET devicefamily = spartan3
SET flowvendor = Other
-SET formalverification = False
-SET foundationsym = False
+SET formalverification = false
+SET foundationsym = false
SET implementationfiletype = Ngc
SET package = fg456
-SET removerpms = False
-SET simulationfiles = Behavioral
+SET removerpms = false
+SET simulationfiles = Structural
SET speedgrade = -5
-SET verilogsim = True
-SET vhdlsim = False
-SET workingdirectory = /home/matt/coregen/tmp
+SET verilogsim = true
+SET vhdlsim = false
+SET workingdirectory = /tmp/
+# CRC: 983b9b45
diff --git a/fpga/usrp2/coregen/fifo_generator_ug175.pdf b/fpga/usrp2/coregen/fifo_generator_ug175.pdf
index 2c3e3c200..5fba6029c 100644
--- a/fpga/usrp2/coregen/fifo_generator_ug175.pdf
+++ b/fpga/usrp2/coregen/fifo_generator_ug175.pdf
Binary files differ
diff --git a/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.gise b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.gise
new file mode 100644
index 000000000..70ee54054
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.gise
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<generated_project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
+
+ <!-- -->
+
+ <!-- For tool use only. Do not edit. -->
+
+ <!-- -->
+
+ <!-- ProjectNavigator created generated project file. -->
+
+ <!-- For use in tracking generated file and other information -->
+
+ <!-- allowing preservation of process status. -->
+
+ <!-- -->
+
+ <!-- Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved. -->
+
+ <version xmlns="http://www.xilinx.com/XMLSchema">11.1</version>
+
+ <sourceproject xmlns="http://www.xilinx.com/XMLSchema" xil_pn:fileType="FILE_XISE" xil_pn:name="fifo_xlnx_32x36_2clk.xise"/>
+
+ <files xmlns="http://www.xilinx.com/XMLSchema">
+ <file xil_pn:fileType="FILE_VEO" xil_pn:name="fifo_xlnx_32x36_2clk.veo" xil_pn:origination="imported"/>
+ </files>
+
+ <transforms xmlns="http://www.xilinx.com/XMLSchema"/>
+
+</generated_project>
diff --git a/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.ncf b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.ncf
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.ncf
diff --git a/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.ngc b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.ngc
new file mode 100644
index 000000000..d1ed419a7
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.ngc
@@ -0,0 +1,3 @@
+XILINX-XDB 0.1 STUB 0.1 ASCII
+XILINX-XDM V1.6e
+$56140<,[o}e~g`n;"2*726&;$9,)<>;.vnt*Ydo&lbjbQwloz\77~4>V8h`f agn3847=7081:?6?!039244=5<288?>?=;249MKVR\3nbb1=::1<20>512F__\XZ5dnww863=87n0?~<?01dd000*=81?86:?FG6811379l1>6D@_UU8svjaXmdzuRzgrdqk81<76;?097GAPTV9twi`Wlg{xtQ{hsgplZgt{lx094?>3781?OIX\^1|ah_dosp|Ys`{oxdR`jg`vf81<768n097GAPTV9twi`Wog`Rzgrdqk81<76;>097GAPTV9twi`Wog`Rzgrdqk[dutm{~787>12596>LHW]]0{~biPftno[qnumzbTbhintd>7>58602?1CXZ_UU8geqgXkfex1:50?3a?0<H]]Z^X7|k_ecweZeh}g~787>11c96>JSSX\^1{Qkauc\gjsi|5>1<3?46595=<053?K?7;ONA394B1=?:=;?75:=159;A=G630805=:491230>?780805;<4A108E44<I;80M><4A7;8EV_IKVXNK>5MU3:8FPUXAGLD=6M=;BG26>EOMJAT@DMJNRG\P\VB:2IB?6MCR89@KHKN\]OO=95LOSG\C@HBZH^BCCQFNGM4?FTBI]OO=6J=;EK0?AVH=2N[^L>:;ERQE43<LYXJ>85KPSC06>C3<2OHM=<4F308BA5<NMI?7KJLE29E@U2<NMZN=6I<;FLG5>O53@:97D?=;H01?L5>3@DBX^ZNTD18MKP53EC97AA9;MMB@@B03EELENOC4:NVP70<D\^9SA:4LTV02>JR\:UG86BZT548HPR3WE?0A^I@N49NQ]E^k2Gjfb|Yesqjkke<E`dd~[k}shmm6>H6<2D:<=:4N0220>H68;>0B<><4:L2412<F8:>86@>0768J460<2D:<5:4N02:7>H69=1E=<>;;O3251=I988?7C?>359M54233G;:995A1047?K76?=1E=<6;;O32=6=I9;>0B<<=3:L276=I9=>0B<:>3:L216=I9?90B<9<;O3;7>H61:1E>==4N330?K45;2D9?>5A2518J7343G8=?6@=729M6=5<F;387C=?3:L056=I;;90B>=<;O177>H4=:1E?;=4N250?K5?;2D85>5A4118J1743G>9?6@;329M015<F=?87C:93:L736=I<180B8<4N618J=443G28?6@7429M<05<F1<87C683:L;<6=I0080B4=4N820?K?6;2D2>>5A9218J<243G3>?6@6629M=25<F0287C76f:LA[GSTX@DT\_A_S69MAQQHZB;0C?5@K09S0>VFZ]k0\D@PBTQJ@]d<X@DTNX]AALG0?UTB92[37_OB17Z2@4=T>2YDY_MJ3:QSK1=SQYO8>6[?/fpe*w`(ojr%oaew/LzlvZtcWyd~Ril_ymq4567W[oxyaz>339V4*aun'xm#jmw.bnh|*Kg{UyhR~ats]dgZ~hz9:;=R\jstnw564<]9%l~k }f.e`|+ekcq%Ftb|Pre]sjqtXojUsc>?03]Qavsk|8997X> gsd-vc)`kq$h`fv Mymq[wbXxg~ySjmPxnp3455XZly~`y?<2:W3+bta&{l$knv!cmi{+H~hzV}yS}`{r^e`[}iu89:;S_k|umv277=R8&myj#|i/fa{*fjlp&GscQxr^rmpwY`kVrd~=>?1^Pfwpjs9:80Y=!hrg,qb*adp'iggu!Bxnp\swYwf}xTknQwos2347YUmzgx<==;T2,cw`)zo%lou lljz,I}iuW~xT|cz}_fa\|jt7899T^h}zlu315>S7'nxm"h gbz-gim'{nT|cz}_ckm858592_;#j|i.sd,cf~)keas#jPpovq[goi4849=6[?/fpe*w`(ojr%oaew/sf\tkruWkce0?0=1:W3+bta&{l$knv!cmi{+wbXxg~ySoga<2<15>S7'nxm"h gbz-gim'{nT|cz}_ckm818582_;#j|i.sd,cf~)keas#jPpovq[goiW98;7X> gsd-vc)`kq$h`fv re]sjqtXj`dT=?>4U1-dvc(un&mht#mcky-q`Zvi|{UiecQ=219V4*aun'xm#jmw.bnh|*tcWyd~Rlfn^114>S7'nxm"h gbz-gim'{nT|cz}_ckm[1413\:$kh!rg-dg}(ddbr$~iQnup\flhXpfx;<=>=7:W3+bta&{l$knv!cmi{+wbXxg~ySoga_ymq45679;<0Y=!hrg,qb*adp'iggu!}d^rmpwYeagUsc>?0004?P6(o{l%~k!hcy,`hn~(zmU{by|Pbhl\|jt789;:>;5Z0.eqb+ta'nis"nbdx.pg[uhszVhbbRv`r123671<]9%l~k }f.e`|+ekcq%yhR~ats]amkYg{:;<??=6:W3+bta&{l$knv!cmi{+wbXxg~ySoga_ymq4564:h1^<"i}f/pe+be&jf`t"|k_qlwvZdnfVrd~=>?3^QT476<]9%l~k }f.e`|+ekcq%yhR~ats]dg969:91^<"i}f/pe+be&jf`t"|k_qlwvZad4849<6[?/fpe*w`(ojr%oaew/sf\tkruWni7>3<?;T2,cw`)zo%lou lljz,vaYwf}xTkn2<>328Q5)`zo$yj"ilx/aoo})ulVzexQhc=6=5c=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[57a3\:$kh!rg-dg}(ddbr$~iQnup\cfY69o1^<"i}f/pe+be&jf`t"|k_qlwvZadW;;m7X> gsd-vc)`kq$h`fv re]sjqtXojU8=k5Z0.eqb+ta'nis"nbdx.pg[uhszVmhS9<9;T2,cw`)zo%lou lljz,vaYwf}xTknQnssgd8585>2_;#j|i.sd,cf~)keas#jPpovq[beXizxnk1?1279V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqab:56;<0Y=!hrg,qb*adp'iggu!}d^rmpwY`kVkx~hi33?05?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]bwwc`4=4996[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg^211>S7'nxm"h gbz-gim'{nT|cz}_fa\evtboV;996[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg^011>S7'nxm"h gbz-gim'{nT|cz}_fa\evtboV9996[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg^61=>S7'nxm"h gbz-gim'{nT|cz}_fa\evtboVn:0=0=9:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfcZb6484956[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg^f2878512_;#j|i.sd,cf~)keas#jPpovq[beXizxnkRj><2<1=>S7'nxm"h gbz-gim'{nT|cz}_fa\evtboVn:090=8:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfcZb6W9837X> gsd-vc)`kq$h`fv re]sjqtXojUjkh_e3\57><]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlmTh<Q=299V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabYc9V9946[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg^f2[1423\:$kh!rg-dg}(ddbr$~iQnup\cfYg{:;<=<:;T2,cw`)zo%lou lljz,vaYwf}xTknQwos2344423\:$kh!rg-dg}(ddbr$~iQnup\cfYg{:;<?<:;T2,cw`)zo%lou lljz,vaYwf}xTknQwos2346463\:$kh!rg-dg}(ddbr${Qnup\flh;878:7X> gsd-vc)`kq$h`fv ws]sjqtXj`d7=3<>;T2,cw`)zo%lou lljz,swYwf}xTnd`32?02?P6(o{l%~k!hcy,`hn~({U{by|Pbhl?7;463\:$kh!rg-dg}(ddbr${Qnup\flh;<78;7X> gsd-vc)`kq$h`fv ws]sjqtXj`dT<?>4U1-dvc(un&mht#mcky-tvZvi|{UiecQ>219V4*aun'xm#jmw.bnh|*quWyd~Rlfn^014>S7'nxm"h gbz-gim'~xT|cz}_ckm[6473\:$kh!rg-dg}(ddbr${Qnup\flhX<;<0Y=!hrg,qb*adp'iggu!xr^rmpwYeagUsc>?0104?P6(o{l%~k!hcy,`hn~({U{by|Pbhl\|jt789::>;5Z0.eqb+ta'nis"nbdx.uq[uhszVhbbRv`r123571<]9%l~k }f.e`|+ekcq%|~R~ats]amkYg{:;<<?=6:W3+bta&{l$knv!cmi{+rtXxg~ySoga_ymq4565:>1^<"i}f/pe+be&jf`t"y}_qlwvZdnfVrd~=>?2005?P6(o{l%~k!hcy,`hn~({U{by|Pbhl\|jt78999m6[?/fpe*w`(ojr%oaew/vp\tkruWkceSua}0120[VQ7:91^<"i}f/pe+be&jf`t"y}_qlwvZad4949<6[?/fpe*w`(ojr%oaew/vp\tkruWni7=3<?;T2,cw`)zo%lou lljz,swYwf}xTkn2=>328Q5)`zo$yj"ilx/aoo})pzVzexQhc=1=65=R8&myj#|i/fa{*fjlp&}yS}`{r^e`8186n2_;#j|i.sd,cf~)keas#z|Ppovq[beX88l0Y=!hrg,qb*adp'iggu!xr^rmpwY`kV;:j6[?/fpe*w`(ojr%oaew/vp\tkruWniT><h4U1-dvc(un&mht#mcky-tvZvi|{UloR=>f:W3+bta&{l$knv!cmi{+rtXxg~ySjmP4348Q5)`zo$yj"ilx/aoo})pzVzexQhc^cpv`a;878=7X> gsd-vc)`kq$h`fv ws]sjqtXojUjkh<0<12>S7'nxm"h gbz-gim'~xT|cz}_fa\evtbo585>;5Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef>0:70<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlm783<:;T2,cw`)zo%lou lljz,swYwf}xTknQnssgd[5423\:$kh!rg-dg}(ddbr${Qnup\cfYf{{olS<<:;T2,cw`)zo%lou lljz,swYwf}xTknQnssgd[7423\:$kh!rg-dg}(ddbr${Qnup\cfYf{{olS><:;T2,cw`)zo%lou lljz,swYwf}xTknQnssgd[14>3\:$kh!rg-dg}(ddbr${Qnup\cfYf{{olSi?30?0:?P6(o{l%~k!hcy,`hn~({U{by|Pgb]bwwc`Wm;7=3<6;T2,cw`)zo%lou lljz,swYwf}xTknQnssgd[a7;:7827X> gsd-vc)`kq$h`fv ws]sjqtXojUjkh_e3?7;4>3\:$kh!rg-dg}(ddbr${Qnup\cfYf{{olSi?34?0;?P6(o{l%~k!hcy,`hn~({U{by|Pgb]bwwc`Wm;T<?64U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\`4Y6:11^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQk1^01<>S7'nxm"h gbz-gim'~xT|cz}_fa\evtboVn:S><7;T2,cw`)zo%lou lljz,swYwf}xTknQnssgd[a7X<;?0Y=!hrg,qb*adp'iggu!xr^rmpwY`kVrd~=>?0378Q5)`zo$yj"ilx/aoo})pzVzexQhc^zlv5679;?0Y=!hrg,qb*adp'iggu!xr^rmpwY`kVrd~=>?2378Q5)`zo$yj"ilx/aoo})pzVzexQhc^zlv567;::0Y=!hrg,qb*ak8'xo#j|>.sdtbq)Je|rT^LCPRE]FJZ@PN]8:??5Z0.eqb+ta'nf;"j gs3-vcqa|&GfyuQ]AL]Q@ZCIWO]MX??P13d8Q5)`zo$yj"ic0/pg+bt6&{l|jy!Bmtz\VDKXZLMDYYQJN031`>S7'nxm"h gm2-va)`z8$yjzh{/bwqvZ`pn}Uxxlzj<1<1`>S7'nxm"h gm2-va)`z8$yjzh{/bwqvZ`pn}Uxxlzj<0<1g>S7'nxm"h gm2-va)`z8$yjzh{/bwqvZ`pn}Uxxlzj_10`?P6(o{l%~k!hl1,q`*au9'xm{kz ctpq[cqa|VymykP1278Q5)`zo$yj"ic0/pg+bt6&{l|jy!lusp\br`sWz~jxhQbuy2344:76:<0Y=!hrg,qb*ak8'xo#j|>.sdtbq)d}{xTjzh{_rvbp`Yj}q:;<<2?>016?P6(o{l%~k!hl1,q`*au9'xm{kz ctpq[cqa|VymykPmtz3457;979=7X> gsd-vc)`d9$yh"i}1/pescr(k|xySkyit^qweqcXe|r;<=?31?31<>S7'nxm"h gm2-va)`z8$yjzh{/dosp|Yao~Tjo<8;T2,cw`)zo%l`= }d.eq5+tao~$i`~{y^dtbqYn:o1^<"i}f/pe+bj7&{n$k?!rguep*cjx}sTjzh{_h]nq}67899;7X> gsd-vc)`d9$yh"i}1/pescr(mdzuRhxfu]j[hs89:;=?74U1-dvc(un&mg<#|k/fpbw+tt|z%ym`Qjmqvz[cdXa::0Y=!hrg,qb*ak8'xo#j|ns/pppv)uidUna}zv_g`\mZiu89:;?>5Z0.eqb+ta'nf;"j gscp*wus{&xjaRkbpu{\bgYnWfx;<=>>1410?P6(o{l%~k!hl1,q`*auiz$yy} r`o\ahvsqVliSdQ`r1234431;:1^<"i}f/pe+bj7&{n$ko|.sqww*tfeVof|ywPfc]j[jt789::95=<;T2,cw`)zo%l`= }d.eqev(u{}y$~lcPelrw}Z`eW`Ud~=>?00:077=R8&myj#|i/fn3*wb(o{kx"}{s.pbiZcjx}sTjoQf_np34565>:80Y=!hrg,qb*ak8'xo#j|ns/pppv)uidUna}zv_g`\mZiu89:;:?==;T2,cw`)zo%l`= }d.eqev(u{}y$~lcPelrw}Z`eW`Ud~=>?07117>S7'nxm"h gm2-va)uxg~y#@m`uov\gjsi|;>0Y=!hrg,qb*ak8'xo#~ats-Ngjsi|Vidycz>259V4*aun'xm#jb?.sf,vuhsz&Ghcx`{_bmvjq45<2_;#j|i.sd,ci6)zm%y|cz}/LalqkrXkfex><;;T2,cw`)zo%l`= }d.psjqt(Eje~byQlotlw064<]9%l~k }f.eo4+tc'{zex!BcnwmpZeh}g~Ttb|30?32[LHQW98h7X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{_ymq84869;i0Y=!hrg,qb*ak8'xo#~ats-Ngjsi|VidyczPxnp?6;76:m1^<"i}f/pe+bj7&{n$~}`{r.O`kphsWje~byQwos>0:476:j1^<"i}f/pe+bj7&{n$~}`{r.O`kphsWje~byQwos>0:445k2_;#j|i.sd,ci6)zm%y|cz}/LalqkrXkfexRv`r=6=547f3\:$kh!rg-dh5(ul&x{by| N032b>S7'nxm"h gm2-va)uxg~y#naznu>3:4`<]9%l~k }f.eo4+tc'{zex!lotlw8486n2_;#j|i.sd,ci6)zm%y|cz}/bmvjq:568l0Y=!hrg,qb*ak8'xo#~ats-`kphs4:4:j6[?/fpe*w`(oe:%~i!}povq+firf}6?2<k4U1-dvc(un&mg<#|k/srmpw)dg|dS=?j;T2,cw`)zo%l`= }d.psjqt(kfexR?>e:W3+bta&{l$ka>!re-qtkru'je~byQ=1d9V4*aun'xm#jb?.sf,vuhsz&idyczP30g8Q5)`zo$yj"ic0/pg+wvi|{%hcx`{_501?P6(o{l%~k!hl1,q`*twf}x$ob{at^f28585:2_;#j|i.sd,ci6)zm%y|cz}/bmvjqYc95;5>?5Z0.eqb+ta'nf;"j rqlwv*eh}g~Th<2=>308Q5)`zo$yj"ic0/pg+wvi|{%hcx`{_e3?7;453\:$kh!rg-dh5(ul&x{by| cnwmpZb64=49=6[?/fpe*w`(oe:%~i!}povq+firf}Uo=R>=1:W3+bta&{l$ka>!re-qtkru'je~byQk1^315>S7'nxm"h gm2-va)uxg~y#naznu]g5Z4592_;#j|i.sd,ci6)zm%y|cz}/bmvjqYc9V99=6[?/fpe*w`(oe:%~i!}povq+firf}Uo=R:=4:W3+bta&{l$ka>!re-qtkru'je~byQaou23445a3\:$kh!rg-dh5(pz&m|m~ hpg,tvu`(EhnoSigif^rmpwYwimUjhi>?01]`}969;o1^<"i}f/pe+bj7&~x$kzo|.fre*rtwn&GjhiQkigd\tkruWykoSljk0123[f;979m7X> gsd-vc)`d9$|~"ixar,dtc(pzyl$Aljk_ekebZvi|{U{miQnde2345Ydq585?k5Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"Cnde]gmc`Xxg~yS}ok_`fg4567Wjs7?3=i;T2,cw`)zo%l`= xr.etev(`xo$|~}h M`fg[aoanVzexQae]b`a6789Uhu1:1419V4*aun'xm#jb?.vp,crgt&nzm"z|f.Ob`aYcaolT|cz}_qcg[dbc89:;Sa{{<0<74>S7'nxm"h gm2-sw)`hy%k}h!wsre+HgclVnbjkQnup\tdbXimn;<=>Pltv?6;273\:$kh!rg-dh5(pz&m|m~ hpg,tvu`(EhnoSigif^rmpwYwimUjhi>?01]oqq:46=:0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%FmijPdhde[uhszVzjhRokd1234Zjr|5>58=5Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"Cnde]gmc`Xxg~yS}ok_`fg4567We080;0:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/Lcg`ZbnnoU{by|Pp`f\eab789:Ttb|34?63?P6(o{l%~k!hl1,tv*apiz$l|k xrqd,IdbcWmcmjR~ats]seaYflm:;<=Qwos>6:7`<]9%l~k }f.eo4+qu'n}j#if/uqtc)caolT|cz}_qcg8185n2_;#j|i.sd,ci6){%l{l}!gqd-swva'mcmjR~ats]sea:26;o0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%oekhPpovq[ugcW=8n7X> gsd-vc)`d9$|~"ixar,dtc(pzyl$hdhi_qlwvZvflV?8;6[?/fpe*w`(oe:%{!hw`q-cu`){zm#igif^rmpwYwimUjhi>?01>7:61<]9%l~k }f.eo4+qu'n}j#if/uqtc)caolT|cz}_qcg[dbc89:;080=a:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/qplcZ`rdeUb??5Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"~}of]eqijXaVg~t=>?3218Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-svjaXn|fgSdQbuy234674:2_;#j|i.sd,ci6){%l{l}!gqd-swva'yxdkRhzlm]j[kis89::>;5Z0.eqb+ta'nf;"z| gvcp*rus{&i9#iazt^k1270<]9%l~k }f.eo4+qu'n}j#y|tr-`6*bh}}Ub:?<9;T2,cw`)zo%l`= xr.etev(p{}y$o?!kotv\m2>582_;#j|i.sd,ci6){%l{l}!wrvp+fijx;8h7X> gsd-vc)`d9$|~"ixar,twqu(zhgTmac`su]eqijXa:>0Y=!hrg,qb*ak8'}y#jyns/uppv)uidUj``a|t^dvhiYnWds<=>?369V4*aun'xm#jb?.vp,crgt&~y"|nm^coijusWog`RgPmtz345668>9=7X> gsd-vc)`d9$|~"ixar,twqu(zhgTmac`su]eqijXaVg~t=>?03402>S7'nxm"h gm2-sw)`hy%{~z|/scn[djjgz~Tjxbc_h]nq}6789<<?;5Z0.eqb+ta'nf;"z| gvcp*rus{&xjaRocmnqw[cskdVcTaxv?0125=63<]9%l~k }f.eo4+qu'n}j#y|tr-qehYfddexxRhzlm]j[kis89::=?64U1-dvc(un&mg<#y}/fubw+qt|z%ym`Qiumn\bgYn:<1^<"i}f/pe+bj7&~x$kzo|.vqww*tfeVl~`aQf2e9V4*aun'xm#jb?.vp,crgt&~y"|nm^dvhiYnWds<=>?319V4*aun'xm#jb?.vp,crgt&~y"|nm^dvhiYnWds<=>?1171b>S7'nxm"h gm2-sw)`hy%{~z|/scn[cskdVcTaxv?012137`<]9%l~k }f.eo4+qu'n}j#y|tr-qehYa}efTeRczx1234355n2_;#j|i.sd,ci6){%l{l}!wrvp+wgjWog`RgPmtz3456018n0Y=!hrg,qb*ak8'}y#ob_vp\akYn98l0Y=!hrg,qb*ak8'}y#ob_vp\akYn9V;9?6[?/fpe*w`(oe:%{!xpovq+Heh}g~Tob{at368Q5)`zo$yj"ic0/uq+rvi|{%Fob{at^alqkr6:=1^<"i}f/pe+bj7&~x${}`{r.O`kphsWje~by<=4:W3+bta&{l$ka>!ws-ttkru'DidyczPcnwmp6433\:$kh!rg-dh5(pz&}{by| MbmvjqYdg|d8><4U1-dvc(un&mg<#y}/vrmpw)JkfexRm`uov\|jt;87;:SD@Y_10`?P6(o{l%~k!hl1,tv*qwf}x$Anaznu]`kphsWqey0<0>13a8Q5)`zo$yj"ic0/uq+rvi|{%Fob{at^alqkrXpfx7>3?>2e9V4*aun'xm#jb?.vp,suhsz&Ghcx`{_bmvjqYg{682<?>2b9V4*aun'xm#jb?.vp,suhsz&Ghcx`{_bmvjqYg{682<<=c:W3+bta&{l$ka>!ws-ttkru'DidyczPcnwmpZ~hz5>5=<?n;T2,cw`)zo%l`= xr.usjqt(F8;:j6[?/fpe*w`(oe:%{!xpovq+firf}6;2<h4U1-dvc(un&mg<#y}/vrmpw)dg|d0<0>f:W3+bta&{l$ka>!ws-ttkru'je~by2=>0d8Q5)`zo$yj"ic0/uq+rvi|{%hcx`{<2<2b>S7'nxm"h gm2-sw)pxg~y#naznu>7:4c<]9%l~k }f.eo4+qu'~zex!lotlw[57b3\:$kh!rg-dh5(pz&}{by| cnwmpZ76m2_;#j|i.sd,ci6){%||cz}/bmvjqY59l1^<"i}f/pe+bj7&~x${}`{r.alqkrX;8o0Y=!hrg,qb*ak8'}y#z~ats-`kphsW=897X> gsd-vc)`d9$|~"ynup,gjsi|Vn:0=0=2:W3+bta&{l$ka>!ws-ttkru'je~byQk1=3=67=R8&myj#|i/fn3*rt(yd~"m`uov\`4:56;80Y=!hrg,qb*ak8'}y#z~ats-`kphsWm;7?3<=;T2,cw`)zo%l`= xr.usjqt(kfexRj><5<15>S7'nxm"h gm2-sw)pxg~y#naznu]g5Z6592_;#j|i.sd,ci6){%||cz}/bmvjqYc9V;9=6[?/fpe*w`(oe:%{!xpovq+firf}Uo=R<=1:W3+bta&{l$ka>!ws-ttkru'je~byQk1^115>S7'nxm"h gm2-sw)pxg~y#naznu]g5Z25:2_;#j|i.sd,ci6){%||cz}/bmvjqYc:5:5>?5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th?2>>308Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e0?6;453\:$kh!rg-dh5(pz&}{by| cnwmpZb54:49>6[?/fpe*w`(oe:%{!xpovq+firf}Uo>1:1209V4*aun'xm#jb?.vp,suhsz&idyczPd3]364=R8&myj#|i/fn3*rt(yd~"m`uov\`7Y6:81^<"i}f/pe+bj7&~x${}`{r.alqkrXl;U9><5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th?Q<209V4*aun'xm#jb?.vp,suhsz&idyczPd3]767=R8&myj#|i/fn3*rt(yd~"m`uov\`6:76;80Y=!hrg,qb*ak8'}y#z~ats-`kphsWm97=3<=;T2,cw`)zo%l`= xr.usjqt(kfexRj<<3<16>S7'nxm"h gm2-sw)pxg~y#naznu]g7959:;1^<"i}f/pe+bj7&~x${}`{r.alqkrXl:6?2??4U1-dvc(un&mg<#y}/vrmpw)dg|dSi=P0338Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e1\577<]9%l~k }f.eo4+qu'~zex!lotlw[a5X:;;0Y=!hrg,qb*ak8'}y#z~ats-`kphsWm9T???4U1-dvc(un&mg<#y}/vrmpw)dg|dSi=P4368Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_omw45669>1^<"i}f/pe+hcj'me~xRg30?3;?P6(o{l%~k!bel-gkprXa5;;2<64U1-dvc(un&gna"j`uu]j8479911^<"i}f/pe+hcj'me~xRg313<2<>S7'nxm"h mdo,`jssW`6:?3?7;T2,cw`)zo%fi`!kotv\m9736820Y=!hrg,qb*kbe&ndyyQf<07=5==R8&myj#|i/lgn+air|Vc7=;0>8:W3+bta&{l$ahc dnww[l:6?7;37X> gsd-vc)jmd%ocxzPi=3;:4><]9%l~k }f.ofi*bh}}Ub0<71169V4*aun'xm#`kb/emvpZo;97;37X> gsd-vc)jmd%ocxzPi=03:4><]9%l~k }f.ofi*bh}}Ub0??1199V4*aun'xm#`kb/emvpZo;:;4:46[?/fpe*w`(elg$hb{{_h>17;7?3\:$kh!rg-nah)cg|~Te1<;>0:8Q5)`zo$yj"cjm.flqqYn4;?5=55Z0.eqb+ta'dof#iazt^k?638602_;#j|i.sd,i`k(lfSd2=7?3;?P6(o{l%~k!bel-gkprXa5832<64U1-dvc(un&gna"j`uu]j87?99>1^<"i}f/pe+hcj'me~xRg32?3;?P6(o{l%~k!bel-gkprXa59;2<64U1-dvc(un&gna"j`uu]j8679911^<"i}f/pe+hcj'me~xRg333<2<>S7'nxm"h mdo,`jssW`68?3?7;T2,cw`)zo%fi`!kotv\m9536820Y=!hrg,qb*kbe&ndyyQf<27=52=R8&myj#|i/lgn+air|Vc7?3?8;T2,cw`)zo%fi`!kotv\m9299>1^<"i}f/pe+hcj'me~xRg35?34?P6(o{l%~k!bel-gkprXa5<5=:5Z0.eqb+ta'dof#iazt^k?3;703\:$kh!rg-nah)cg|~Te161169V4*aun'xm#`kb/emvpZo;17;=7X> gsd-vc)jmd%ocxzPi^222>S7'nxm"h mdo,`jssW`U:=:5Z0.eqb+ta'dof#iazt^k\55703\:$kh!rg-nah)cg|~TeR?>169V4*aun'xm#`kb/emvpZoX9;;<7X> gsd-vc)jmd%ocxzPi^3052=R8&myj#|i/lgn+air|VcT=9?8;T2,cw`)zo%fi`!kotv\mZ729>1^<"i}f/pe+hcj'me~xRgP1734?P6(o{l%~k!bel-gkprXaV;<=:5Z0.eqb+ta'dof#iazt^k\5=703\:$kh!rg-nah)cg|~TeR?6179V4*aun'xm#`kb/emvpZoX:8=0Y=!hrg,qb*kbe&ndyyQf_3223>S7'nxm"h mdo,`jssW`U9=<94U1-dvc(un&gna"j`uu]j[746?2_;#j|i.sd,i`k(lfSdQ=3058Q5)`zo$yj"cjm.flqqYnW;>:;6[?/fpe*w`(elg$hb{{_h]1141<]9%l~k }f.ofi*bh}}UbS?8>7:W3+bta&{l$ahc dnww[lY5?8=0Y=!hrg,qb*kbe&ndyyQf_3:23>S7'nxm"h mdo,`jssW`U95<84U1-dvc(un&gna"j`uu]j[6703\:$kh!rg-nah)cg|~TeR=?169V4*aun'xm#`kb/emvpZoX;8;<7X> gsd-vc)jmd%ocxzPi^1152=R8&myj#|i/lgn+air|VcT?>?8;T2,cw`)zo%fi`!kotv\mZ539>1^<"i}f/pe+hcj'me~xRgP3435?P6(o{l%~k!bel-gkprXaV>::6[?/fpe*w`(elg$hb{{_h]653=R8&myj#|i/lgn+air|VcT:<84U1-dvc(un&gna"j`uu]j[2713\:$kh!rg-nah)cg|~TeR6>6:W3+bta&{l$ahc dnww[lY>9j1^<"i}f/pe+hcj'me~xRgPnnv34576m2_;#j|i.sd,i`k(omg%h`!Br`o\VDK69o1^<"i}f/pe+hcj'nnf"ic Mscn[WGJ99;m7X> gsd-vc)jmd%lh` km.OqehYUID;:=k5Z0.eqb+ta'dof#jjb.eo,IwgjW[KF=??i;T2,cw`)zo%fi`!hdl,gi*KuidUYM@?<1g9V4*aun'xm#`kb/ffn*ak(E{kfS_OB153e?P6(o{l%~k!bel-d`h(ce&Gym`Q]AL365c=R8&myj#|i/lgn+bbj&mg$Aob_SCN537a3\:$kh!rg-nah)`ld$oa"C}al]QEH709o1^<"i}f/pe+hcj'nnf"ic Mscn[WGJ91;m7X> gsd-vc)jmd%lh` km.OqehYUID;2=h5Z0.eqb+ta'dof#jjb.eo,IwgjW[KF><h4U1-dvc(un&gna"ikm/fn+HtfeVXJA?>>f:W3+bta&{l$ahc geo-`h)JzhgT^LC=10d8Q5)`zo$yj"cjm.egi+bj'DxjaR\NM302b>S7'nxm"h mdo,cak)ld%F~lcPR@O174`<]9%l~k }f.ofi*ace'nf#@|nm^PBI726n2_;#j|i.sd,i`k(omg%h`!Br`o\VDK5=8l0Y=!hrg,qb*kbe&moa#jb/LpbiZTFE;<:j6[?/fpe*w`(elg$kic!dl-NvdkXZHG9;<h4U1-dvc(un&gna"ikm/fn+HtfeVXJA?6>f:W3+bta&{l$ahc geo-`h)JzhgT^LC=90g8Q5)`zo$yj"cjm.egi+bj'DxjaR\NM23e?P6(o{l%~k!bel-d`h(ce&Gym`Q]AL135c=R8&myj#|i/lgn+bbj&mg$Aob_SCN747a3\:$kh!rg-nah)`ld$oa"C}al]QEH559o1^<"i}f/pe+hcj'nnf"ic Mscn[WGJ;:;m7X> gsd-vc)jmd%lh` km.OqehYUID9?=k5Z0.eqb+ta'dof#jjb.eo,IwgjW[KF?8?i;T2,cw`)zo%fi`!hdl,gi*KuidUYM@=91g9V4*aun'xm#`kb/ffn*ak(E{kfS_OB363e?P6(o{l%~k!bel-d`h(ce&Gym`Q]AL1;5c=R8&myj#|i/lgn+bbj&mg$Aob_SCN7<7b3\:$kh!rg-nah)`ld$oa"C}al]QEH26n2_;#j|i.sd,i`k(omg%h`!Br`o\VDK388l0Y=!hrg,qb*kbe&moa#jb/LpbiZTFE=;:j6[?/fpe*w`(elg$kic!dl-NvdkXZHG?><h4U1-dvc(un&gna"ikm/fn+HtfeVXJA9=>f:W3+bta&{l$ahc geo-`h)JzhgT^LC;40d8Q5)`zo$yj"cjm.egi+bj'DxjaR\NM572b>S7'nxm"h mdo,cak)ld%F~lcPR@O724`<]9%l~k }f.ofi*ace'nf#@|nm^PBI116n2_;#j|i.sd,i`k(omg%h`!Br`o\VDK308l0Y=!hrg,qb*kbe&moa#jb/LpbiZTFE=3:i6[?/fpe*w`(elg$kic!dl-NvdkXZHG>=k5Z0.eqb+ta'dof#jjb.eo,IwgjW[KF9=?i;T2,cw`)zo%fi`!hdl,gi*KuidUYM@;>1g9V4*aun'xm#`kb/ffn*ak(E{kfS_OB533e?P6(o{l%~k!bel-d`h(ce&Gym`Q]AL705c=R8&myj#|i/lgn+bbj&mg$Aob_SCN117a3\:$kh!rg-nah)`ld$oa"C}al]QEH329o1^<"i}f/pe+hcj'nnf"ic Mscn[WGJ=?;m7X> gsd-vc)jmd%lh` km.OqehYUID?<=k5Z0.eqb+ta'dof#jjb.eo,IwgjW[KF95?i;T2,cw`)zo%fi`!hdl,gi*KuidUYM@;61d9V4*aun'xm#`kb/ffn*ak(E{kfS_OB60d8Q5)`zo$yj"cjm.egi+bj'DxjaR\NM722b>S7'nxm"h mdo,cak)ld%F~lcPR@O554`<]9%l~k }f.ofi*ace'nf#@|nm^PBI346n2_;#j|i.sd,i`k(omg%h`!Br`o\VDK1;8l0Y=!hrg,qb*kbe&moa#jb/LpbiZTFE?>:j6[?/fpe*w`(elg$kic!dl-NvdkXZHG=9<h4U1-dvc(un&gna"ikm/fn+HtfeVXJA;8>f:W3+bta&{l$ahc geo-`h)JzhgT^LC970d8Q5)`zo$yj"cjm.egi+bj'DxjaR\NM7:2b>S7'nxm"h mdo,cak)ld%F~lcPR@O5=4c<]9%l~k }f.ofi*ace'nf#@|nm^PBI27a3\:$kh!rg-nah)`ld$oa"C}al]QEH179o1^<"i}f/pe+hcj'nnf"ic Mscn[WGJ?8;m7X> gsd-vc)jmd%lh` km.OqehYUID=9=h5Z0.eqb+ta'dof#jjb.eo,IwgjW[KF4<k4U1-dvc(un&gna"ikm/fn+HtfeVXJA4?6;T2,cw`)zo%fi`!hdl,gi*H688;27X> gsd-vc)jmd%lh` km.L2467>3\:$kh!rg-nah)`ld$oa"@>043:?P6(o{l%~k!bel-d`h(ce&D:<:?6;T2,cw`)zo%fi`!hdl,gi*H680;37X> gsd-vc)jmd%lh` km.L254?<]9%l~k }f.ofi*ace'nf#C?>10;8Q5)`zo$yj"cjm.egi+bj'G;:?<74U1-dvc(un&gna"ikm/fn+K76=830Y=!hrg,qb*kbe&moa#jb/O3234?<]9%l~k }f.ofi*ace'nf#C?>90;8Q5)`zo$yj"cjm.egi+bj'G;9=<74U1-dvc(un&gna"ikm/fn+K75;830Y=!hrg,qb*kbe&moa#jb/O3114?<]9%l~k }f.ofi*ace'nf#C?=70;8Q5)`zo$yj"cjm.egi+bj'G;95<64U1-dvc(un&gna"ikm/fn+K74901^<"i}f/pe+hcj'nnf"ic N0125<=R8&myj#|i/lgn+bbj&mg$B<=<189V4*aun'xm#`kb/ffn*ak(F89>=45Z0.eqb+ta'dof#jjb.eo,J450901^<"i}f/pe+hcj'nnf"ic N01:5<=R8&myj#|i/lgn+bbj&mg$B<:>189V4*aun'xm#`kb/ffn*ak(F8>8=45Z0.eqb+ta'dof#jjb.eo,J422901^<"i}f/pe+hcj'nnf"ic N0645==R8&myj#|i/lgn+bbj&mg$B<;>8:W3+bta&{l$ahc geo-`h)I9>;37X> gsd-vc)jmd%lh` km.L2=4><]9%l~k }f.ofi*ace'nf#C<>199V4*aun'xm#`kb/ffn*ak(F;9:46[?/fpe*w`(elg$kic!dl-M607?3\:$kh!rg-nah)`ld$oa"@=70:8Q5)`zo$yj"cjm.egi+bj'G82=55Z0.eqb+ta'dof#jjb.eo,J67602_;#j|i.sd,i`k(omg%h`!A323;?P6(o{l%~k!bel-d`h(ce&D89<64U1-dvc(un&gna"ikm/fn+K50911^<"i}f/pe+hcj'nnf"ic N2;2<>S7'nxm"h mdo,cak)ld%E8<?7;T2,cw`)zo%fi`!hdl,gi*H3;820Y=!hrg,qb*kbe&moa#jb/O665==R8&myj#|i/lgn+bbj&mg$B99>8:W3+bta&{l$ahc geo-`h)I<0;<7X> gsd-vc)jmd%lh` km.L65==R8&myj#|i/lgn+bbj&mg$B8?>8:W3+bta&{l$ahc geo-`h)I=:;37X> gsd-vc)jmd%lh` km.L614><]9%l~k }f.ofi*ace'nf#C;8199V4*aun'xm#`kb/ffn*ak(F<3:46[?/fpe*w`(elg$kic!dl-M247?3\:$kh!rg-nah)`ld$oa"@930:8Q5)`zo$yj"cjm.egi+bj'G<>=55Z0.eqb+ta'dof#jjb.eo,J31602_;#j|i.sd,i`k(omg%h`!A6834?P6(o{l%~k!bel-d`h(ce&D<=55Z0.eqb+ta'dof#jjb.eo,J27602_;#j|i.sd,i`k(omg%h`!A723;?P6(o{l%~k!bel-d`h(ce&D<9<64U1-dvc(un&gna"ikm/fn+K10911^<"i}f/pe+hcj'nnf"ic N6;2<>S7'nxm"h mdo,cak)ld%E4<?7;T2,cw`)zo%fi`!hdl,gi*H?;820Y=!hrg,qb*kbe&moa#jb/O:65==R8&myj#|i/lgn+bbj&mg$B59>8:W3+bta&{l$ahc geo-`h)I00;<7X> gsd-vc)jmd%lh` km.L:5==R8&myj#|i/lgn+bbj&mg$B4?>8:W3+bta&{l$ahc geo-`h)I1:;37X> gsd-vc)jmd%lh` km.L:14><]9%l~k }f.ofi*ace'nf#C78199V4*aun'xm#`kb/ffn*ak(F03996[?/fpe*w`(elg$kic!dl-\rdtnfmos<=>?<1<12>S7'nxm"h mdo,cak)ld%Tzl|fneg{456748:5>;5Z0.eqb+ta'dof#jjb.eo,[sguagnnt=>?0=32:70<]9%l~k }f.ofi*ace'nf#Rxnrhlga}67896:>3<9;T2,cw`)zo%fi`!hdl,gi*Yqi{cehhv?012?5685>2_;#j|i.sd,i`k(omg%h`!Pv`pjjac89:;0<:1279V4*aun'xm#`kb/ffn*ak(Wkyecjjx12349726;<0Y=!hrg,qb*kbe&moa#jb/^tbvlhcmq:;<=2>6?05?P6(o{l%~k!bel-d`h(ce&U}mgaddz3456;9>49:6[?/fpe*w`(elg$kic!dl-\rdtnfmos<=>?<0:=63=R8&myj#|i/lgn+bbj&mg$S{o}ioff|56785;22?;4U1-dvc(un&gna"ikm/fn+Zpfz`doiu>?01>2:70<]9%l~k }f.ofi*ace'nf#Rxnrhlga}678969<3<9;T2,cw`)zo%fi`!hdl,gi*Yqi{cehhv?012?6485>2_;#j|i.sd,i`k(omg%h`!Pv`pjjac89:;0?<1279V4*aun'xm#`kb/ffn*ak(Wkyecjjx12349446;<0Y=!hrg,qb*kbe&moa#jb/^tbvlhcmq:;<=2=4?05?P6(o{l%~k!bel-d`h(ce&U}mgaddz3456;:<49:6[?/fpe*w`(elg$kic!dl-\rdtnfmos<=>?<34=63=R8&myj#|i/lgn+bbj&mg$S{o}ioff|567858<2?84U1-dvc(un&gna"ikm/fn+Zpfz`doiu>?01>1<;413\:$kh!rg-nah)`ld$oa"Qyaskm``~789:7>40=5:W3+bta&{l$ahc geo-`h)X~hxbbikw01238785>2_;#j|i.sd,i`k(omg%h`!Pv`pjjac89:;0>>1279V4*aun'xm#`kb/ffn*ak(Wkyecjjx12349566;<0Y=!hrg,qb*kbe&moa#jb/^tbvlhcmq:;<=2<2?05?P6(o{l%~k!bel-d`h(ce&U}mgaddz3456;;:49:6[?/fpe*w`(elg$kic!dl-\rdtnfmos<=>?<26=63=R8&myj#|i/lgn+bbj&mg$S{o}ioff|567859>2?;4U1-dvc(un&gna"ikm/fn+Zpfz`doiu>?01>0:73<]9%l~k }f.ofi*ace'nf#Rxnrhlga}67896?2?;4U1-dvc(un&gna"ikm/fn+Zpfz`doiu>?01>6:73<]9%l~k }f.ofi*ace'nf#Rxnrhlga}67896=2?;4U1-dvc(un&gna"ikm/fn+Zpfz`doiu>?01>4:73<]9%l~k }f.ofi*ace'nf#Rxnrhlga}6789632?;4U1-dvc(un&gna"ikm/fn+Zpfz`doiu>?01>::4c<]9%l~k }f.ofi*ace'nf#iazt^k?4;7a3\:$kh!rg-nah)`ld$oa"j`uu]j84699o1^<"i}f/pe+hcj'nnf"ic dnww[l:697;m7X> gsd-vc)jmd%lh` km.flqqYn4885=k5Z0.eqb+ta'dof#jjb.eo,`jssW`6:?3?i;T2,cw`)zo%fi`!hdl,gi*bh}}Ub0<:11g9V4*aun'xm#`kb/ffn*ak(lfSd2>5?3e?P6(o{l%~k!bel-d`h(ce&ndyyQf<04=5c=R8&myj#|i/lgn+bbj&mg$hb{{_h>23;7a3\:$kh!rg-nah)`ld$oa"j`uu]j84>99o1^<"i}f/pe+hcj'nnf"ic dnww[l:617;n7X> gsd-vc)jmd%lh` km.flqqYn484:j6[?/fpe*w`(elg$kic!dl-gkprXa58;2<h4U1-dvc(un&gna"ikm/fn+air|Vc7><0>f:W3+bta&{l$ahc geo-`h)cg|~Te1<=>0d8Q5)`zo$yj"cjm.egi+bj'me~xRg322<2b>S7'nxm"h mdo,cak)ld%ocxzPi=07:4`<]9%l~k }f.ofi*ace'nf#iazt^k?6086n2_;#j|i.sd,i`k(omg%h`!kotv\m94168l0Y=!hrg,qb*kbe&moa#jb/emvpZo;:>4:j6[?/fpe*w`(elg$kic!dl-gkprXa5832<h4U1-dvc(un&gna"ikm/fn+air|Vc7>40>e:W3+bta&{l$ahc geo-`h)cg|~Te1<11g9V4*aun'xm#`kb/ffn*ak(lfSd2<0?3e?P6(o{l%~k!bel-d`h(ce&ndyyQf<23=5c=R8&myj#|i/lgn+bbj&mg$hb{{_h>06;7a3\:$kh!rg-nah)`ld$oa"j`uu]j86599o1^<"i}f/pe+hcj'nnf"ic dnww[l:4<7;m7X> gsd-vc)jmd%lh` km.flqqYn4:?5=h5Z0.eqb+ta'dof#jjb.eo,`jssW`682<k4U1-dvc(un&gna"ikm/fn+air|Vc783?j;T2,cw`)zo%fi`!hdl,gi*bh}}Ub080>e:W3+bta&{l$ahc geo-`h)cg|~Te1811d9V4*aun'xm#`kb/ffn*ak(lfSd28>0g8Q5)`zo$yj"cjm.egi+bj'me~xRg38?3f?P6(o{l%~k!bel-d`h(ce&ndyyQf<8<2`>S7'nxm"h mdo,cak)ld%ocxzPi^22`>S7'nxm"h mdo,cak)ld%ocxzPi^32a>S7'nxm"h mdo,cak)ld%ocxzPi^335`=R8&myj#|i/lgn+bbj&mg$hb{{_h]254c<]9%l~k }f.ofi*ace'nf#iazt^k\577b3\:$kh!rg-nah)`ld$oa"j`uu]j[456m2_;#j|i.sd,i`k(omg%h`!kotv\mZ739l1^<"i}f/pe+hcj'nnf"ic dnww[lY6=8o0Y=!hrg,qb*kbe&moa#jb/emvpZoX9?;n7X> gsd-vc)jmd%lh` km.flqqYnW8=:i6[?/fpe*w`(elg$kic!dl-gkprXaV;3=h5Z0.eqb+ta'dof#jjb.eo,`jssW`U:5<j4U1-dvc(un&gna"ikm/fn+air|VcT><k4U1-dvc(un&gna"ikm/fn+air|VcT>=?j;T2,cw`)zo%fi`!hdl,gi*bh}}UbS??>e:W3+bta&{l$ahc geo-`h)cg|~TeR<=1d9V4*aun'xm#`kb/ffn*ak(lfSdQ=30g8Q5)`zo$yj"cjm.egi+bj'me~xRgP253f?P6(o{l%~k!bel-d`h(ce&ndyyQf_372a>S7'nxm"h mdo,cak)ld%ocxzPi^055`=R8&myj#|i/lgn+bbj&mg$hb{{_h]134c<]9%l~k }f.ofi*ace'nf#iazt^k\6=7b3\:$kh!rg-nah)`ld$oa"j`uu]j[7?6l2_;#j|i.sd,i`k(omg%h`!kotv\mZ56m2_;#j|i.sd,i`k(omg%h`!kotv\mZ579l1^<"i}f/pe+hcj'nnf"ic dnww[lY498o0Y=!hrg,qb*kbe&moa#jb/emvpZoX;;;n7X> gsd-vc)jmd%lh` km.flqqYnW:9:i6[?/fpe*w`(elg$kic!dl-gkprXaV9?=h5Z0.eqb+ta'dof#jjb.eo,`jssW`U89<j4U1-dvc(un&gna"ikm/fn+air|VcT8<j4U1-dvc(un&gna"ikm/fn+air|VcT9<j4U1-dvc(un&gna"ikm/fn+air|VcT:<j4U1-dvc(un&gna"ikm/fn+air|VcT;<j4U1-dvc(un&gna"ikm/fn+air|VcT4<j4U1-dvc(un&gna"ikm/fn+air|VcT5?;4U1-dvc(un&gna"ikm/fn+lht|VF[ARCZX022575<]9%l~k }f.ofi*ace'nf#d`|t^NSIZKRP8;996[?/fpe*w`(elg$kic!dl-jjvrXDYGTAXV>10312>S7'nxm"h mdo,cak)ld%bb~zPLQO\IP^698;:>85Z0.eqb+ta'dof#jjb.eo,mkusWEZFS@[W133260=R8&myj#|i/lgn+bbj&mg$ec}{_MRN[HS_9:;:>85Z0.eqb+ta'dof#jjb.eo,mkusWEZFS@[W153260=R8&myj#|i/lgn+bbj&mg$ec}{_MRN[HS_9<;:>85Z0.eqb+ta'dof#jjb.eo,mkusWEZFS@[W173260=R8&myj#|i/lgn+bbj&mg$ec}{_MRN[HS_9>;:>85Z0.eqb+ta'dof#jjb.eo,mkusWEZFS@[W193260=R8&myj#|i/lgn+bbj&mg$ec}{_MRN[HS_90;:>85Z0.eqb+ta'dof#jjb.eo,mkusWEZFS@[W213260=R8&myj#|i/lgn+bbj&mg$ec}{_MRN[HS_:8;:>;5Z0.eqb+ta'dof#jjb.eo,mkusWEZFS@[W2032573<]9%l~k }f.ofi*ace'nf#d`|t^NSIZKRP;8:=?;4U1-dvc(un&gna"ikm/fn+lht|VF[ARCZX312573<]9%l~k }f.ofi*ace'nf#d`|t^NSIZKRP;>:=?;4U1-dvc(un&gna"ikm/fn+lht|VF[ARCZX372573<]9%l~k }f.ofi*ace'nf#d`|t^NSIZKRP;<:=?;4U1-dvc(un&gna"ikm/fn+lht|VF[ARCZX352573<]9%l~k }f.ofi*ace'nf#d`|t^NSIZKRP;2:=?;4U1-dvc(un&gna"ikm/fn+lht|VF[ARCZX3;2573<]9%l~k }f.ofi*ace'nf#d`|t^NSIZKRP:::=?;4U1-dvc(un&gna"ikm/fn+lht|VF[ARCZX232570<]9%l~k }f.ofi*ace'nf#d`|t^NSIZKRP:;:=<<:;T2,cw`)zo%fi`!hdl,gi*oi{}UG\@QBUY1154423\:$kh!rg-nah)`ld$oa"gasu]OTHYJ]Q98=<<:;T2,cw`)zo%fi`!hdl,gi*oi{}UG\@QBUY1754423\:$kh!rg-nah)`ld$oa"gasu]OTHYJ]Q9>=<<;;T2,cw`)zo%fi`!hdl,gi*oi{}UG\@QBUY62572<]9%l~k }f.ofi*ace'nf#d`|t^NSIZKRP<;:>95Z0.eqb+ta'dof#jjb.eo,mkusWEZFS@[W60310>S7'nxm"h mdo,cak)ld%bb~zPLQO\IP^0988?7X> gsd-vc)jmd%lh` km.kmwqYKXDUFYU6>1368Q5)`zo$yj"cjm.egi+bj'`dxxRB_M^OV\<769o1^<"i}f/pe+hcj'nnf"ic wskwaZesze8;7X> gsd-vc)jmd%lh` km.uqmqcXk}xg=<j4U1-dvc(un&xxxobd/SQW[CSKDVMNB<j4U1-dvc(un&xxxobd/sf\vvrXizxnk?>4U1-dvc(un&xxxobd/sf\vvrXizxnkRj>219V4*aun'xm#}{bmi,vaYu{}Ujkh_e02g>S7'nxm"h rrvahn)ulVxxxRm`mc3g?P6(o{l%~k!}su`oo*tcW{ySnabb03f?P6(o{l%~k!}su`oo*tcW{ySkh<1<2a>S7'nxm"h rrvahn)ulVxxxR|jg=3=5`=R8&myj#|i/sqwfim(zmUyyQ}ef>1:4b<]9%l~k }f.pppgjl'{nT~~zPrde\44b<]9%l~k }f.pppgjl'{nT~~zPrde\54b<]9%l~k }f.pppgjl'{nT~~zPrde\641<]9%l~k }f.pppgjl'{ySi?>7:W3+bta&{l$~~zmlj-qwqYc:8=0Y=!hrg,qb*tt|kf`#}{_e12`>S7'nxm"h rrvahn)pzVxxxRo|rde14>S7'nxm"h rrvahn)pzVxxxRo|rde\`4473\:$kh!rg-qwqdkc&}yS}{_`qqabYc:8i0Y=!hrg,qb*tt|kf`#z|Prrv\gjke9m1^<"i}f/pe+wusjea${Q}su]`khd69l1^<"i}f/pe+wusjea${Q}su]qab:768o0Y=!hrg,qb*tt|kf`#z|Prrv\v`a;97;o7X> gsd-vc)u{}hgg"y}_sqw[wc`W9;o7X> gsd-vc)u{}hgg"y}_sqw[wc`W8k0Y^K]_@NJEVe<]ZOYS[G\ICNF7>PDK01]EHYPTXRF0>QDDB80[H?k;YKOMK^*PMH+<#?/SUWA$5(6(HYHED;4XNP@]3=_[]FBN:5WSU]DJA1<PZ^TZNMm;Y]@KWCXAGLD:6Vkb^Kgb>^c`VZye`Xjrrklj46<PmgTAld`rWgqwlii991Sh`QBiomqR`ttafdh7lbborv\ahvsqk1j``a|t^dvhi0<jhi`y}j4b`ahquYji{an~>5lljf8`drfWje~by&?)e9geqgXkfex%?&d:fbpdYdg|d$?'k;ecweZeh}g~#?$j4d`vb[firf}"?%k5kauc\gjsi|5>1<394dckwawt13mce$='9;ekm,4/03mce$<>&7:fjj-76!>1oec&>2(58`lh/9:#<7iga(06*3>bnf!;>%:5kio*22,1<l`d#=:'8;ekm,4>.?2nbb%?6)79gmk.5!>1oec&=0(58`lh/:8#<7iga(30*3>bnf!88%:5kio*10,1<l`d#>8'8;ekm,70.?2nbb%<8)69gmk.50 =0hd`'28+5?aoi :#<7iga(22*3>bnf!9:%:5kio*06,1<l`d#?>'8;ekm,62.?2nbb%=:)79gmk.3!?1oec&:)79gmk.1!?1oec&8)79gmk.?!?1oec&6)79gmk:76>1oec2>0?58`lh;984<7iga<00=3>bnf5;82:5kio>20;1<l`d7=808;ekm8409?2nbb1?8>69gmk:607=0hd`318<5?aoi484<7iga<32=3>bnf58:2:5kio>16;1<l`d7>>08;ekm8729?2nbb1<:>69gmk:5>7=0hd`326<4?aoi4;25;6jfn=0::3=cag692:5kio>04;1<l`d7?<08;ekm8649?2nbb1=<>69gmk:4<730hd`33483:2=cag689384dhl?7;0<l`d78384dhl?1;0<l`d7:384dhl?3;0<l`d74384dhl?=;1<lf$='8;emvp-7.02ndyy&>0(:8`jss 8;"46j`uu*26,><lf$<=&8:flqq.6< 20hb{{(07*<>bh}}"::$64dnww,41.02ndyy&>8(:8`jss 83";6j`uu*1-==cg|~#>='7;emvp-46!11ocxz'23+;?air|!88%55kotv+61/?3me~x%<:)99gkpr/:?#37iazt)04-==cg|~#>5'7;emvp-4>!>1ocxz'3(:8`jss ::"46j`uu*05,><lf$><&8:flqq.4; 20hb{{(26*<>bh}}"89$94dnww,1/03me~x%;&7:flqq.1!>1ocxz'7(58`jss 1#<7iazt);*3>bh}}6;255kotv?558?3me~x1?>>99gkpr;9;437iazt=30:==cg|~7=907;emvp972611ocxz317<;?air|5;<255kotv?5=8?3me~x1?6>69gkpr;9720hb{{<32=<>bh}}69=364dnww874902ndyy2=3?:8`jss4;>546j`uu>11;><lf0?818:flqq:5?720hb{{<3:=<>bh}}695394dnww878?3me~x1=?>99gkpr;;8437iazt=11:==cg|~7?>07;emvp9536h1ocxz33483:==cg|~7?808;emvp959?2ndyy2;>69gkpr;=7=0hb{{<7<4?air|5=5;6j`uu>;:2=cg|~75364eeke6kac=2of|yw=f:djbjY`mgoymya}_w4\5)&_aecet-M@RD"Dakcui}ey,<<!2068bl`hWqfetR==x24\6fjl;;1mekaPxml{[64;?U9oae#fhdl[bcim{kcQy6^3/JJHB$GEEI>kn;gkekZ~kfqU8>u=9_3aoo)`nnfUlick}aumq[s0X9%qhSeo|_hlw[fjl59&hSeo|_rppp86+kVxoSk|jq<3/gZciikfnS}{_r{mg87+kVbjR|k_ecweZeh}g~6<!mPdhl\slbs`49= nQgar]tvZbf|hUhcx`{=1.`[cskdVlgmj}Prrv\rdj:9%iTe`~celgmpdrnggUu}k22-a\qvcXmdhnhikk_sgd95*dW~xTjk~=0.`[pubWme~xR||t<3/gZsillxm`byPlnu>4)eX`hyTc{k}fmmt95*dWyxn`bok_mcwake~59&hSiazt^uj`qn:;?&hS`}hoo]uei;6$jUyhRjjpuj>77*dWlxycQfnkg`pliiW}s{i0>#c^jbwZsillxm`by20-a\lduXiegdyQiumn>5)eX`hyT~~z21-a\`drfWje~byQxievk90*dWakxSz|Pabi>4)eX}zoTinm20-a\gjkjggUh`bmd=1.`[rtXijaT`by20-a\vaYwf}xT{dj{h<7/gZstmVl|jyQkauc\gjsi|4:'oRfns^coijusWlg{xt3?,b]q`Zbf|hUhcx`{_vkgpm;2$jUdzh|ilnu\hjq:8%iT{Qnup\slbs`4?'oR~}of]fiur~W}s{i0>#c^uq[agsiVidyczPwhfwl83+kVzyiaand^pfcv;6$jUocxzPrrv\rdj:8%iTdl}Pd`vb[firf}7; nQrne\bpjkW}byi~fPndebp`Yqie79?!mPws]gauro5:8'oR~}of]fiur~W}byi~fPndebp`Yqie7> nQrne\ahvsqV~c~h}g_`qpawrX~hf68!mPh`q\rdjnl4:'oR~}of]eqijX|axneQnsrgqpZpfd48? nabpnlfjqYiido6jdh`_ynm|Z55p:<T>nbd,b]ueiocWee|1="l_qpjiZ`nnfUu}k2500{73*dWyxdkRhzlm]w}uc:9%iTahc`rx]w}uc::%w9i6hffn]{hk~X;;r8:R<llj]emciXoldn~lz`r^t5[4Y{}U:86hzlmf8mklbk}nieyk}re9jjocd|zhbxh|}7:kmpZekc11eknlzimf;?jpbzofd{l5rne\ahvsq8>0|ah_dosp|Ys`{oxd%>&159svjaXmdzuRzgrdqk,4/6<2zycjQjmqvz[qnumzb#>$?;;qplcZcjx}sTxe|jsi*0-42<x{elShctx]wlwct`!>"=;5rne\ahvsqV~c~h}g<583:4d<x{elShctx]wlwct`Vkxh|{(1+2f>vugnUna}zv_ujqavnXizyn~y&>)0`8twi`Wlg{xtQ{hsgplZgt{lx$?'>b:rqkbYbey~rSyf}erj\evubz}"8%<l4psmd[`kw|pUdk|h^cpw`ts =#:h6~}of]fiur~W}byi~fParqfvq:3294:n6~}of]fiur~W}byi~fPndebp`.7!8h0|ah_dosp|Ys`{oxdR`jg`vf,4/6j2zycjQjmqvz[qnumzbTbhintd*1-4d<x{elShctx]wlwct`Vdnklzj(2+2f>vugnUna}zv_ujqavnXflmjxh&;)0f8twi`Wlg{xtQ{hsgplZhboh~n094?>89svjaXn|fg=>5rne\bpjkW}byi~f'0(30?uthoVl~`aQ{hsgpl-7.9:1{~biPftno[qnumzb#>$?<;qplcZ`rdeUdk|h)1*56=wzfmTjxbc_ujqavn/< ;>7}|`g^dvhiYs`{oxd1:50?3b?uthoVl~`aQ{hsgplZgt{lx$='>a:rqkbYa}efTxe|jsi]bwvcu|!;"=l5rne\bpjkW}byi~fParqfvq.5!8k0|ah_gwohZrozlycSl}|esv+7,7f3yxdkRhzlm]wlwct`Vkxh|{(5+2g>vugnUmyabPtipfwmYf{zoyx1:50?3b?uthoVl~`aQ{hsgplZhboh~n$='>a:rqkbYa}efTxe|jsi]mabgsm!;"=l5rne\bpjkW}byi~fPndebp`.5!8k0|ah_gwohZrozlycSckhaug+7,7f3yxdkRhzlm]wlwct`Vdnklzj(5+2g>vugnUmyabPtipfwmYimnki1:50?48vaYddb;;7jPd`vb[firf}";%<>4re]geqgXkfex%?&119q`Zbf|hUhcx`{(3+24>tcWmkmRm`uov+7,773{nThlzn_bmvjq.3!8:0~iQkauc\gjsi|5:5=?5}d^fbpdYdg|d094?>49q`Zci>2xoS}{3:ppp2=tj`~n~:4ssqw0>ru}l30ycjjrgnls0=qieco:6y}_`ah2>quWjf`==5xr^fbpdYdg|d$='>0:uq[agsiVidycz'1(33?rtXlh~jSnaznu*1-46<{UomyoPcnwmp-5.991|~Rjnt`]`kphs =#:>6y}_ecweZeh}g~787>15:uq[`h13~xT~~zr@Arf5==GHq;1J7:51zQ00?5a=3?1=><m7859572alrd8984>;o162?0<,:?86>:k;|Q06?5a=3?1=><m7859572al2Y?j7:?0;29564e?0=1=?:ie:Q06?2783:1=><m7859572an2n8j54?:082V532:l>684>33`4=2<6:=lo7{Zm9;295?7=913p_>:53g791?74:k=2;7?=4gf8 62f2<:0Z>;;:3yv1<<63|?j6=5r$c09f>d4n10;68?53;72M5302P9o7<ta;;9y!de2:l37)=:2;1e3>o3;90;66a<5983>>i39<0;66g;4183>>i4nj0;66a<f783>>o3;00;66g;3383>>i4k00;6)l;:2g`?kd42910c>m7:18'f1<4mj1en>4>;:m0g2<72-h?6>kl;o`0>7=<g:i=6=4+b580af=ij:0876a<c483>!d32:oh7cl<:598k6e3290/n94<eb9mf6<232e8o?4?:%`7>6cd3gh86;54o2a2>5<#j=08in5ab284?>i4k90;6)l;:2g`?kd42110c>li:18'f1<4mj1en>46;:m0f`<72-h?6>kl;o`0>d=<g:ho6=4+b580af=ij:0i76a<bb83>!d32:oh7cl<:b98k6de290/n94<eb9mf6<c32e8nl4?:%`7>6cd3gh86h54o2`:>5<#j=08in5ab28e?>i4j>0;6)l;:2g`?kd428:07b=m6;29 g2=;li0bo=51098k6d2290/n94<eb9mf6<6:21d?o:50;&a0?5bk2di?7?<;:m0f6<72-h?6>kl;o`0>42<3f9i>7>5$c697`e<fk91=854o2`2>5<#j=08in5ab2822>=h;k:1<7*m4;1fg>he;3;<76a<ag83>!d32:oh7cl<:0:8?j5fm3:1(o:53da8jg5=9010c>mi:18'f1<4mj1en>4>a:9l7fc=83.i87=jc:la7?7e32e8oi4?:%`7>6cd3gh86<m4;n1`g?6=,k>1?hm4nc195a=<g:ii6=4+b580af=ij:0:i65`3bc94?"e<39no6`m3;3e?>i4k:0;6)l;:2g`?kd42;:07b=m8;29 g2=;li0bo=52098k6gc290/n94<eb9mf6<5:21d?lm50;&a0?5bk2di?7<<;:k0<5<72-h?6>o<;o`0>5=<a:=m6=4+b580e6=ij:0:76g<7d83>!d32:k87cl<:398m61c290/n94<a29mf6<432c8;n4?:%`7>6g43gh86954i25a>5<#j=08m>5ab286?>o4?00;6)l;:2c0?kd42?10e>97:18'f1<4i:1en>48;:k032<72-h?6>o<;o`0>==<a:==6=4+b580e6=ij:0276g<7483>!d32:k87cl<:`98m613290/n94<a29mf6<e32c8;>4?:%`7>6g43gh86n54i251>5<#j=08m>5ab28g?>o4?80;6)l;:2c0?kd42l10e>9?:18'f1<4i:1en>4i;:k02`<72-h?6>o<;o`0>46<3`9=h7>5$c697d5<fk91=<54i24`>5<#j=08m>5ab2826>=n;?h1<7*m4;1b7>he;3;876g<6`83>!d32:k87cl<:068?l5113:1(o:53`18jg5=9<10e>87:18'f1<4i:1en>4>6:9j731=83.i87=n3:la7?7032c8:;4?:%`7>6g43gh86<64;h151?6=,k>1?l=4nc195<=<a:2=6=4+b580e6=ij:0:m65f39794?"e<39j?6`m3;3a?>o40=0;6)l;:2c0?kd428i07d=73;29 g2=;h90bo=51e98m6>5290/n94<a29mf6<6m21b?5?50;&a0?5f;2di?7?i;:k03d<72-h?6>o<;o`0>76<3`9=j7>5$c697d5<fk91><54i247>5<#j=08m>5ab2816>=n;?91<7*m4;1b7>he;38876g;2983>>d4<00;6<4?:1yK71><,kh1?974oc394?=zj=?1<7?50;2xL62?3-hi69;4o5694?=zj;h1<76i:043>4>>sA9?46T=c;3546=n3;:6<;513827?732h026<8516821?702h0::7??:8820?742881=<4i:|&af?5aj2.9j7=i9:&07?5ai2.jh7l?;h63`?6=,k>18=k4nc194>=n<9i1<7*m4;63a>he;3;07d:?b;29 g2=<9o0bo=52:9j05g=83.i87:?e:la7?5<3`>;57>5$c6905c<fk91865f3gg94?=n<:;1<75f42694?=h<:=1<75f41594?"e<3>;46`m3;28?l27>3:1(o:541:8jg5=921b8=;50;&a0?2702di?7<4;h630?6=,k>18=64nc197>=n<991<7*m4;63<>he;3>07d:<0;29?j2793:17d:>3;29 g2=<8>0bo=50:9j044=83.i87:>4:la7?7<3`>:=7>5$c69042<fk91>65f40294?"e<3>:86`m3;18?l27n3:1(o:54068jg5=<21d?8650;9l736=83.i87=91:la7?6<3f9>j7>5$c69737<fk91=65`34g94?"e<39==6`m3;08?j52l3:1(o:53738jg5=;21d?8m50;&a0?5192di?7:4;n621?6=3`>?<7>5;h62e?6=,k>18<l4nc194>=n<831<7*m4;62f>he;3;07d:>8;29 g2=<8h0bo=52:9j041=83.i87:>b:la7?5<3`>::7>5$c6904d<fk91865`3ga94?=h;o<1<75f42;94?=n;<k1<75f43294?"e<3>9=6`m3;28?l26n3:1(o:54338jg5=921b8<k50;&a0?2592di?7<4;h62`?6=,k>18??4nc197>=n<8i1<7*m4;615>he;3>07d:=6;29 g2=<;=0bo=50:9j073=83.i87:=7:la7?7<3`>987>5$c69071<fk91>65f43194?"e<3>9;6`m3;18?l25:3:1(o:54358jg5=<21d?8950;9j7c`=831b?8l50;9j017=831d8>=50;9l06>=831b8><50;9l7f?=83.i87=jc:la7?6<3f9h47>5$c697`e<fk91=65`3b594?"e<39no6`m3;08?j5d>3:1(o:53da8jg5=;21d?n;50;&a0?5bk2di?7:4;n1`0?6=,k>1?hm4nc191>=h;j81<7*m4;1fg>he;3<07b=l1;29 g2=;li0bo=57:9l7f6=83.i87=jc:la7?><3f9ij7>5$c697`e<fk91565`3cg94?"e<39no6`m3;c8?j5el3:1(o:53da8jg5=j21d?om50;&a0?5bk2di?7m4;n1af?6=,k>1?hm4nc19`>=h;kk1<7*m4;1fg>he;3o07b=m9;29 g2=;li0bo=5f:9l7g1=83.i87=jc:la7?7732e8n;4?:%`7>6cd3gh86<?4;n1a1?6=,k>1?hm4nc1957=<g:h?6=4+b580af=ij:0:?65`3c194?"e<39no6`m3;37?>i4j;0;6)l;:2g`?kd428?07b=m1;29 g2=;li0bo=51798k6d7290/n94<eb9mf6<6?21d?lh50;&a0?5bk2di?7?7;:m0e`<72-h?6>kl;o`0>4?<3f9hj7>5$c697`e<fk91=l54o2af>5<#j=08in5ab282f>=h;jn1<7*m4;1fg>he;3;h76a<cb83>!d32:oh7cl<:0f8?j5dj3:1(o:53da8jg5=9l10c>mn:18'f1<4mj1en>4>f:9l7f5=83.i87=jc:la7?4732e8n54?:%`7>6cd3gh86??4;n1b`?6=,k>1?hm4nc1967=<g:kh6=4+b580af=ij:09?65f39294?"e<39j?6`m3;28?l50n3:1(o:53`18jg5=921b?:k50;&a0?5f;2di?7<4;h14`?6=,k>1?l=4nc197>=n;>i1<7*m4;1b7>he;3>07d=8b;29 g2=;h90bo=55:9j72?=83.i87=n3:la7?0<3`9<47>5$c697d5<fk91;65f36594?"e<39j?6`m3;:8?l50>3:1(o:53`18jg5=121b?:;50;&a0?5f;2di?7o4;h140?6=,k>1?l=4nc19f>=n;>91<7*m4;1b7>he;3i07d=82;29 g2=;h90bo=5d:9j727=83.i87=n3:la7?c<3`9<<7>5$c697d5<fk91j65f37g94?"e<39j?6`m3;33?>o4>m0;6)l;:2c0?kd428;07d=9c;29 g2=;h90bo=51398m60e290/n94<a29mf6<6;21b?;o50;&a0?5f;2di?7?;;:k02<<72-h?6>o<;o`0>43<3`9=47>5$c697d5<fk91=;54i244>5<#j=08m>5ab2823>=n;?<1<7*m4;1b7>he;3;376g<6483>!d32:k87cl<:0;8?l5?>3:1(o:53`18jg5=9h10e>6::18'f1<4i:1en>4>b:9j7=2=83.i87=n3:la7?7d32c84>4?:%`7>6g43gh86<j4;h1;6?6=,k>1?l=4nc195`=<a:2:6=4+b580e6=ij:0:j65f36c94?"e<39j?6`m3;03?>o4>o0;6)l;:2c0?kd42;;07d=94;29 g2=;h90bo=52398m604290/n94<a29mf6<5;21b?8750;9l07b=83.i87:=f:la7?6<3f>9o7>5$c6907`<fk91=65`43`94?"e<3>9j6`m3;08?j25i3:1(o:543d8jg5=;21d8?750;&a0?25n2di?7:4;n60a?6=,k>18>h4nc194>=h<:n1<7*m4;60b>he;3;07b:<c;29 g2=<:l0bo=52:9l06d=83.i87:<f:la7?5<3f>8m7>5$c6906`<fk91865`41094?=n;on1<75`37094?=n<;21<75`42494?=e;<:1<7?50;2x gd=<<1C?9h4H26;?j232900qo=:1;295?6=8r.in7=;9:J00c=O;=20co?50;9~f45e290?6=4?{%`a>14<@:>m7E=;8:&7f?2<a;n1<75f3483>>oe=3:17bl9:188yg55n3:187>50z&af?273A9?j6F<499'0g<53`8o6=44i2394?=n;<0;66am6;29?xd4;m0;694?:1y'fg<3:2B88k5G35:8L7g<,<=18>;4$5`90>o5l3:17d=::188mg3=831dn;4?::a764=8391<7>t$c`97c=O;=l0D>:7;I0b?!302=9>7):m:39j6a<722c897>5;n`5>5<<uk9?<7>53;294~"ej39m7E=;f:J00==O:h1/9:4;349'0g<53`8o6=44i2794?=hj?0;66sm32a94?2=83:p(ol5439K71`<@:>37E<n;%74>1523->i695f2e83>>o4=3:17dl::188kg0=831vn>=>:180>5<7s-hi6>h4H26e?M5302B9m6*:7;601>"3j380e?j50;9j70<722ei:7>5;|`07`<72<0;6=u+bc877>N4<o1C?964H3c8 01=<:?0e?j50;9j6`<722c897>5;h`6>5<<gk<1<75rb21e>5<4290;w)lm:2d8L62a3A9?46F=a:&63?24=2.?n7<4i3f94?=n;<0;66am6;29?xd4;90;684?:1y'fg<3;2B88k5G35:8L7g<,<=18>;4i3f94?=n:l0;66g<5;29?ld22900co850;9~f65e290?6=4?{%`a>14<@:>m7E=;8:J1e>"2?3>896*;b;68m7b=831b?84?::ka1?6=3fh=6=44}c10e?6=<3:1<v*mb;61?M53n2B8855+4c87?l4c2900e>;50;9jf0<722ei:7>5;|`07<<72=0;6=u+bc876>N4<o1C?964$5`90>o5l3:17d=::188mg3=831dn;4?::a76>=83>1<7>t$c`907=O;=l0D>:7;%6a>1=n:m0;66g<5;29?ld22900co850;9~f621290?6=4?{%`a>14<@:>m7E=;8:&7f?2<a;n1<75f3483>>oe=3:17bl9:188yg53=3:187>50z&af?253A9?j6F<499'0g<33`8o6=44i2794?=nj<0;66am6;29?xddl3:187>50z&af?273A9?j6F<499'0g<53`8o6=44i2394?=n;<0;66am6;29?xddk3:187>50z&af?273A9?j6F<499'0g<53`8o6=44i2394?=n;<0;66am6;29?xddj3:187>50z&af?273A9?j6F<499'0g<53`8o6=44i2394?=n;<0;66am6;29?xddi3:187>50z&af?273A9?j6F<499'0g<53`8o6=44i2394?=n;<0;66am6;29?xdd13:187>50z&af?273A9?j6F<499'0g<53`8o6=44i2394?=n;<0;66am6;29?xd6880;694?:1y'fg<382B88k5G35:8 1d=:2c9h7>5;h12>5<<a:?1<75`b783>>{e99:1<7:50;2x gd=<91C?9h4H26;?!2e2;1b>i4?::k05?6=3`9>6=44oc494?=zjol1<7:50;2x gd=<91C?9h4H26;?!2e2;1b>i4?::k05?6=3`9>6=44oc494?=zjoo1<7:50;2x gd=<91C?9h4H26;?!2e2;1b>i4?::k05?6=3`9>6=44oc494?=zjon1<7:50;2x gd=<91C?9h4H26;?!2e2;1b>i4?::k05?6=3`9>6=44oc494?=zj88<6=4;:183!de2=:0D>:i;I17<>"3j380e?j50;9j74<722c897>5;n`5>5<<uk;9:7>54;294~"ej3>;7E=;f:J00==#<k097d<k:188m67=831b?84?::ma2?6=3th:>84?:583>5}#jk0?<6F<4g9K71><,=h1>6g=d;29?l562900e>;50;9lf3<722wi=?:50;694?6|,kh18=5G35d8L62?3->i6?5f2e83>>o493:17d=::188kg0=831vn<<<:187>5<7s-hi69>4H26e?M5302.?n7<4i3f94?=n;80;66g<5;29?jd12900qoh<:187>5<7s-hi69>4H26e?M5302.?n7<4i3f94?=n;80;66g<5;29?jd12900qoh=:187>5<7s-hi69>4H26e?M5302.?n7<4i3f94?=n;80;66g<5;29?jd12900qoh>:187>5<7s-hi69>4H26e?M5302.?n7<4i3f94?=n;80;66g<5;29?jd12900qoh?:187>5<7s-hi69>4H26e?M5302.?n7<4i3f94?=n;80;66g<5;29?jd12900qoki:187>5<7s-hi69>4H26e?M5302.?n7<4i3f94?=n;80;66g<5;29?jd12900qo?>d;290?6=8r.in7:?;I17b>N4<11C>l5+568770=#<k097d<k:188m67=831b?84?::ma2?6=3th:=n4?:583>5}#jk0?<6F<4g9K71><@;k0(8954278 1d=:2c9h7>5;h12>5<<a:?1<75`b783>>{e98h1<7:50;2x gd=<91C?9h4H26;?M4f3-?<69=:;%6a>7=n:m0;66g<1;29?l522900co850;9~f47f290?6=4?{%`a>16<@:>m7E=;8:J1e>"2?3>896*;b;08m7b=831b?<4?::k01?6=3fh=6=44}c32=?6=<3:1<v*mb;63?M53n2B8855G2`9'12<3;<1/8o4=;h0g>5<<a:;1<75f3483>>ie>3:17plj9;290?6=8r.in7:?;I17b>N4<11C>l5+568770=#<k097d<k:188m67=831b?84?::ma2?6=3thn47>54;294~"ej3>;7E=;f:J00==O:h1/9:4;349'0g<53`8o6=44i2394?=n;<0;66am6;29?xdb?3:187>50z&af?273A9?j6F<499K6d=#=>0??85+4c81?l4c2900e>?50;9j70<722ei:7>5;|`f2?6=<3:1<v*mb;63?M53n2B8855G2`9'12<3;<1/8o4=;h0g>5<<a:;1<75f3483>>ie>3:17plj5;290?6=8r.in7:?;I17b>N4<11C>l5+568770=#<k097d<k:188m67=831b?84?::ma2?6=3thoj7>54;294~"ej3>;7E=;f:J00==#<k097d<k:188m67=831b?84?::ma2?6=3thoi7>54;294~"ej3>;7E=;f:J00==#<k097d<k:188m67=831b?84?::ma2?6=3thoh7>54;294~"ej3>;7E=;f:J00==#<k097d<k:188m67=831b?84?::ma2?6=3thoo7>54;294~"ej3>;7E=;f:J00==#<k097d<k:188m67=831b?84?::ma2?6=3thon7>54;294~"ej3>;7E=;f:J00==#<k097d<k:188m67=831b?84?::ma2?6=3th:=>4?:583>5}#jk0?<6F<4g9K71><,=h1>6g=d;29?l562900e>;50;9lf3<722wi=<<50;694?6|,kh18=5G35d8L62?3->i6?5f2e83>>o493:17d=::188kg0=831vn<?>:187>5<7s-hi69>4H26e?M5302.?n7<4i3f94?=n;80;66g<5;29?jd12900qo?>0;290?6=8r.in7:?;I17b>N4<11/8o4=;h0g>5<<a:;1<75f3483>>ie>3:17pl>0g83>1<729q/no4;0:J00c=O;=20(9l52:k1`?6=3`9:6=44i2794?=hj?0;66sm14;94?3=83:p(ol5409K71`<@:>37):m:39j6a<722c9i7>5;h12>5<<a:?1<75`b783>>{e9<21<7;50;2x gd=<81C?9h4H26;?!2e2;1b>i4?::k1a?6=3`9:6=44i2794?=hj?0;66sm14494?3=83:p(ol5409K71`<@:>37):m:39j6a<722c9i7>5;h12>5<<a:?1<75`b783>>{e9<?1<7;50;2x gd=<:1C?9h4H26;?!2e2=1b>i4?::k1a?6=3`9>6=44ic794?=hj?0;66sm14594?3=83:p(ol5409K71`<@:>37):m:39j6a<722c9i7>5;h12>5<<a:?1<75`b783>>{e9?91<7;50;2x gd=<81C?9h4H26;?!2e2;1b>i4?::k1a?6=3`9:6=44i2794?=hj?0;66sm17094?3=83:p(ol5409K71`<@:>37):m:39j6a<722c9i7>5;h12>5<<a:?1<75`b783>>{e9?;1<7;50;2x gd=<81C?9h4H26;?!2e2;1b>i4?::k1a?6=3`9:6=44i2794?=hj?0;66sm17294?3=83:p(ol5409K71`<@:>37):m:39j6a<722c9i7>5;h12>5<<a:?1<75`b783>>{e9<l1<7;50;2x gd=<81C?9h4H26;?!2e2;1b>i4?::k1a?6=3`9:6=44i2794?=hj?0;66sm12594?2=83:p(ol5439K71`<@:>37):m:59j6a<722c897>5;h`6>5<<gk<1<75rb01;>5<3290;w)lm:508L62a3A9?46*;b;68m7b=831b?84?::ka1?6=3fh=6=44}c306?6=<3:1<v*mb;63?M53n2B8855+4c81?l4c2900e>?50;9j70<722ei:7>5;|`274<72=0;6=u+bc874>N4<o1C?964$5`96>o5l3:17d=>:188m63=831dn;4?::a526=8391<7>t$c`971c<@:>m7E=;8:k04?6=3`>o6=44o`d94?=zj8<m6=4<:183!de2:>n7E=;f:J00==n;90;66g;d;29?jga2900qo?99;290?6=8r.in7;7;I17b>N4<11b?=4?::k02?6=3`h36=44o`d94?=zj8<36=4;:183!de2<20D>:i;I17<>o483:17d=9:188mg>=831dmk4?::a531=83>1<7>t$c`91==O;=l0D>:7;h13>5<<a:<1<75fb983>>ifn3:17pl>6783>1<729q/no4:8:J00c=O;=20e>>50;9j73<722ci47>5;nce>5<<uk;=97>54;294~"ej3?37E=;f:J00==n;90;66g<6;29?ld?2900clh50;9~f413290?6=4?{%`a>16<@:>m7E=;8:&7f?4<a;n1<75f3083>>o4=3:17bl9:188yg70;3:187>50z&af?273A9?j6F<499'0g<53`8o6=44i2394?=n;<0;66am6;29?xd6?>0;684?:1y'fg<3;2B88k5G35:8 1d=<2c9h7>5;h0f>5<<a:?1<75fb483>>ie>3:17pl>a583>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6i:0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>a083>0<729q/no4;3:J00c=O;=20(9l54:k1`?6=3`8n6=44i2794?=nj<0;66am6;29?xd6i90;684?:1y'fg<3;2B88k5G35:8 1d=<2c9h7>5;h0f>5<<a:?1<75fb483>>ie>3:17pl>a383>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6ij0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>a`83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6ik0;684?:1y'fg<3;2B88k5G35:8 1d=<2c9h7>5;h0f>5<<a:?1<75fb483>>ie>3:17pl>ae83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6il0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>b783>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6j=0;684?:1y'fg<3;2B88k5G35:8 1d=<2c9h7>5;h0f>5<<a:?1<75fb483>>ie>3:17pl>b483>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6j>0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>b983>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6k;0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>c083>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6k90;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>bg83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6jl0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=e483>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5m?0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=f083>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5nj0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl<0283>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd48=0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl<0483>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd48?0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl<0683>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd4810;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=e683>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5m10;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=e883>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5mh0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=ec83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5mj0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=ee83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5ml0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=eg83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5n90;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=f383>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5n:0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=f583>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5n<0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=f783>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5n>0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=f983>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5n00;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=f`83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5nk0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=fe83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5nl0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=fg83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd4890;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl<0083>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd48;0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=0e83>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th9=54?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd5::0;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`101<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=2d83>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th9?44?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd5<o0;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`116<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=5583>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th9<h4?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd5980;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`14c<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=1183>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th9=?4?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd59:0;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`151<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=1483>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th9=44?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd59?0;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`152<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=1`83>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th9=o4?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd59j0;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`15a<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=2183>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th9=h4?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd59o0;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`164<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=2383>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th9>94?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd5:<0;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`16=<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=2783>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th9>:4?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd5:00;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`16d<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=2c83>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th9>n4?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd5;90;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`16a<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=2g83>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th9?<4?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd5;;0;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`176<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=3583>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th9?:4?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd5;<0;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`173<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=3c83>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th9?54?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd5;h0;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`17`<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=3b83>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th9?i4?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd5;o0;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`105<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=4083>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th98?4?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd5<?0;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`106<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=4483>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th98:4?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd5<10;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`10<<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=4`83>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th98i4?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd5<k0;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`10f<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=4d83>a<729q/no4m7:J00c=O;=20e?;50;9j63<722c9;7>5;h0;>5<<a:?1<75f3983>>o413:17d=n:188m6d=831b?9l50;9j71e=831dnl4?::m03?6=3th99=4?:e83>5}#jk0i;6F<4g9K71><a;?1<75f2783>>o5?3:17d<7:188m63=831b?54?::k0=?6=3`9j6=44i2`94?=n;=h1<75f35a94?=hjh0;66a<7;29?xd5=80;6i4?:1y'fg<e?2B88k5G35:8m73=831b>;4?::k13?6=3`836=44i2794?=n;10;66g<9;29?l5f2900e>l50;9j71d=831b?9m50;9lfd<722e8;7>5;|`117<72m0;6=u+bc8a3>N4<o1C?964i3794?=n:?0;66g=7;29?l4?2900e>;50;9j7=<722c857>5;h1b>5<<a:h1<75f35`94?=n;=i1<75`b`83>>i4?3:17pl=0483>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd58=0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=0283>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd58;0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=0083>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5890;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>fd83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6nm0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>fb83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6nk0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>f`83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6n00;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>f983>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6n>0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>f783>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6n<0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>f283>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6n;0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>f083>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6n90;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>eg83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6ml0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>ee83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6mj0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>ec83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6mh0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=0c83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd58h0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=0883>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd5810;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl=0683>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd58?0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>fg83>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6n=0;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>e883>0<729q/no4;1:J00c=O;=20(9l52:k1`?6=3`8n6=44i2394?=n;<0;66am6;29?xd6m10;684?:1y'fg<392B88k5G35:8 1d=:2c9h7>5;h0f>5<<a:;1<75f3483>>ie>3:17pl>8783>1<729q/no4;2:J00c=O;=20(9l54:k1`?6=3`9>6=44ic794?=hj?0;66sm19594?2=83:p(ol5439K71`<@:>37):m:59j6a<722c897>5;h`6>5<<gk<1<75rb05e>5<2290;w)lm:518L62a3A9?46*;b;68m7b=831b>h4?::k01?6=3`h>6=44oc494?=zj:>96=4<:183!de2<;0D>:i;I17<>"3j3i0e9950;9j0=<722ejj7>5;|`071<72:0;6=u+bc865>N4<o1C?964$5`9g>o3?3:17d:7:188kd`=831vn<><:180>5<7s-hi68?4H26e?M5302.?n7?7;h64>5<<a=21<75`ag83>>{eko0;6>4?:1y'fg<292B88k5G35:8 1d=911b8:4?::k7<?6=3fkm6=44}c3:1?6=;3:1<v*mb;72?M53n2B8855+4c82<>o3?3:17d:7:188kd`=831vn<:n:180>5<7s-hi68?4H26e?M5302.?n7?7;h64>5<<a=21<75`ag83>>{ek:0;6>4?:1y'fg<292B88k5G35:8 1d=911b8:4?::k7<?6=3fkm6=44}ca1>5<4290;w)lm:438L62a3A9?46*;b;3;?l202900e9650;9lec<722wio<4?:283>5}#jk0>=6F<4g9K71><,=h1=55f4683>>o303:17boi:188yge729086=4?{%`a>07<@:>m7E=;8:&7f?7?3`><6=44i5:94?=hio0;66smbg83>6<729q/no4:1:J00c=O;=20(9l5199j02<722c?47>5;nce>5<<ukhn6=4<:183!de2<;0D>:i;I17<>"3j3;37d:8:188m1>=831dmk4?::afa<72:0;6=u+bc865>N4<o1C?964$5`95==n<>0;66g;8;29?jga2900qoll:180>5<7s-hi68?4H26e?M5302.?n7?7;h64>5<<a=21<75`ag83>>{e9>31<7:50;2x gd==:1C?9h4H26;?!2e2:1b8:4?::k7<?6=3`>26=44o`d94?=zj89=6=4;:183!de2<90D>:i;I17<>"3j39n7d:8:188m1>=831b844?::mbb?6=3th:<84?:583>5}#jk0>?6F<4g9K71><,=h1>95f4683>>o303:17d:6:188kd`=831vni?50;694?6|,kh19>5G35d8L62?3->i6?:4i5594?=n<10;66g;9;29?jga2900qo?66;290?6=8r.in7;<;I17b>N4<11/8o4>a:k73?6=3`>36=44i5;94?=hio0;66sm15`94?2=83:p(ol5529K71`<@:>37):m:0c8m11=831b854?::k7=?6=3fkm6=44}c300?6==3:1<v*mb;76?M53n2B8855+4c8g?l202900e9650;9j0<<722c?m7>5;nce>5<<uk;;;7>55;294~"ej3?>7E=;f:J00==#<k0:56g;7;29?l2?2900e9750;9j0d<722ejj7>5;|`g7?6==3:1<v*mb;76?M53n2B8855+4c82=>o3?3:17d:7:188m1?=831b8l4?::mbb?6=3th:?l4?:483>5}#jk0>96F<4g9K71><,=h1=k5f4683>>o303:17d:6:188m1g=831dmk4?::a5=3=8391<7>t$c`914=O;=l0D>:7;%6a>63<a==1<75f4983>>ifn3:17pl>2d83>1<729q/no4:3:J00c=O;=20(9l5269j02<722c?47>5;h6:>5<<ghl1<75rb02;>5<2290;w)lm:478L62a3A9?46*;b;3:?l202900e9650;9j0<<722c?m7>5;nce>5<<ukn?6=4::183!de2<?0D>:i;I17<>"3j3;27d:8:188m1>=831b844?::k7e?6=3fkm6=44}c11g?6=<3:1<v*mb;70?M53n2B8855+4c80g>o3?3:17d:7:188m1?=831dmk4?::a77d=83>1<7>t$c`916=O;=l0D>:7;%6a>6e<a==1<75f4983>>o313:17boi:188yg55i3:187>50z&af?343A9?j6F<499'0g<4k2c?;7>5;h6;>5<<a=31<75`ag83>>{e;;31<7:50;2x gd==:1C?9h4H26;?!2e2:i0e9950;9j0=<722c?57>5;nce>5<<uk9947>54;294~"ej3?87E=;f:J00==#<k08o6g;7;29?l2?2900e9750;9lec<722wi??950;694?6|,kh19>5G35d8L62?3->i6>m4i5594?=n<10;66g;9;29?jga2900qo==6;290?6=8r.in7;<;I17b>N4<11/8o4<c:k73?6=3`>36=44i5;94?=hio0;66sm33794?2=83:p(ol5529K71`<@:>37):m:2a8m11=831b854?::k7=?6=3fkm6=44}c110?6=<3:1<v*mb;70?M53n2B8855+4c80g>o3?3:17d:7:188m1?=831dmk4?::a775=83>1<7>t$c`916=O;=l0D>:7;%6a>6e<a==1<75f4983>>o313:17boi:188yg55:3:187>50z&af?343A9?j6F<499'0g<4k2c?;7>5;h6;>5<<a=31<75`ag83>>{e;;;1<7:50;2x gd==:1C?9h4H26;?!2e2:i0e9950;9j0=<722c?57>5;nce>5<<uk99<7>54;294~"ej3?87E=;f:J00==#<k08o6g;7;29?l2?2900e9750;9lec<722wi?<h50;694?6|,kh19>5G35d8L62?3->i6>m4i5594?=n<10;66g;9;29?jga2900qo=>e;290?6=8r.in7;<;I17b>N4<11/8o4<c:k73?6=3`>36=44i5;94?=hio0;66sm30f94?2=83:p(ol5529K71`<@:>37):m:2a8m11=831b854?::k7=?6=3fkm6=44}c12g?6=<3:1<v*mb;70?M53n2B8855+4c80g>o3?3:17d:7:188m1?=831dmk4?::a74d=83>1<7>t$c`916=O;=l0D>:7;%6a>6e<a==1<75f4983>>o313:17boi:188yg56i3:187>50z&af?343A9?j6F<499'0g<4k2c?;7>5;h6;>5<<a=31<75`ag83>>{e;831<7:50;2x gd==:1C?9h4H26;?!2e2:i0e9950;9j0=<722c?57>5;nce>5<<uk9:47>54;294~"ej3?87E=;f:J00==#<k08o6g;7;29?l2?2900e9750;9lec<722wi?<950;694?6|,kh19>5G35d8L62?3->i6>m4i5594?=n<10;66g;9;29?jga2900qo=>6;290?6=8r.in7;<;I17b>N4<11/8o4<c:k73?6=3`>36=44i5;94?=hio0;66sm30794?2=83:p(ol5529K71`<@:>37):m:2a8m11=831b854?::k7=?6=3fkm6=44}c120?6=<3:1<v*mb;70?M53n2B8855+4c80g>o3?3:17d:7:188m1?=831dmk4?::a745=83>1<7>t$c`916=O;=l0D>:7;%6a>6e<a==1<75f4983>>o313:17boi:188yg56:3:187>50z&af?343A9?j6F<499'0g<4k2c?;7>5;h6;>5<<a=31<75`ag83>>{e;8;1<7:50;2x gd==:1C?9h4H26;?!2e2:i0e9950;9j0=<722c?57>5;nce>5<<uk9:<7>54;294~"ej3?87E=;f:J00==#<k08o6g;7;29?l2?2900e9750;9lec<722wi?=h50;694?6|,kh19>5G35d8L62?3->i6>m4i5594?=n<10;66g;9;29?jga2900qo=?e;290?6=8r.in7;<;I17b>N4<11/8o4<c:k73?6=3`>36=44i5;94?=hio0;66sm31f94?2=83:p(ol5529K71`<@:>37):m:2a8m11=831b854?::k7=?6=3fkm6=44}c13g?6=<3:1<v*mb;70?M53n2B8855+4c80g>o3?3:17d:7:188m1?=831dmk4?::a75d=83>1<7>t$c`916=O;=l0D>:7;%6a>6e<a==1<75f4983>>o313:17boi:188yg5713:187>50z&af?343A9?j6F<499'0g<4k2c?;7>5;h6;>5<<a=31<75`ag83>>{e;9k1<7:50;2x gd==:1C?9h4H26;?!2e2:i0e9950;9j0=<722c?57>5;nce>5<<uk;257>54;294~"ej3?87E=;f:J00==#<k0956g;7;29?l2?2900e9750;9lec<722wi=9k50;694?6|,kh19>5G35d8L62?3->i6?74i5594?=n<10;66g;9;29?jga2900qo?=c;291?6=8r.in7;:;I17b>N4<11/8o47;h64>5<<a=21<75f4883>>o3i3:17boi:188yg7393:197>50z&af?323A9?j6F<499'0g<6l2c?;7>5;h6;>5<<a=31<75f4`83>>ifn3:17pl>4383>0<729q/no4:5:J00c=O;=20(9l51d9j02<722c?47>5;h6:>5<<a=k1<75`ag83>>{e9:n1<7;50;2x gd==<1C?9h4H26;?!2e2;90e9950;9j0=<722c?57>5;h6b>5<<ghl1<75rb063>5<2290;w)lm:478L62a3A9?46*;b;1g?l202900e9650;9j0<<722c?m7>5;nce>5<<uk;3h7>53;294~"ej3?:7E=;f:J00==#<k0<7d:8:188m1>=831dmk4?::a5=4=83?1<7>t$c`910=O;=l0D>:7;%6a>75<a==1<75f4983>>o313:17d:n:188kd`=831vn<6<:186>5<7s-hi68;4H26e?M5302.?n7<<;h64>5<<a=21<75f4883>>o3i3:17boi:188yg7?93:197>50z&af?323A9?j6F<499'0g<b3`><6=44i5:94?=n<00;66g;a;29?jga2900qo?8b;291?6=8r.in7;:;I17b>N4<11/8o4>e:k73?6=3`>36=44i5;94?=n<h0;66anf;29?xd60h0;684?:1y'fg<2=2B88k5G35:8 1d=::1b8:4?::k7<?6=3`>26=44i5c94?=hio0;66sm19`94?3=83:p(ol5549K71`<@:>37):m:318m11=831b854?::k7=?6=3`>j6=44o`d94?=zj8226=4::183!de2<?0D>:i;I17<>"3j3o0e9950;9j0=<722c?57>5;h6b>5<<ghl1<75rb04b>5<4290;w)lm:438L62a3A9?46*;b;03?l202900e9650;9lec<722wi=;l50;194?6|,kh19<5G35d8L62?3->i6?>4i5594?=n<10;66anf;29?xd6>j0;6>4?:1y'fg<292B88k5G35:8 1d=:91b8:4?::k7<?6=3fkm6=44}c35`?6=;3:1<v*mb;72?M53n2B8855+4c814>o3?3:17d:7:188kd`=831vn<=i:186>5<7s-hi68;4H26e?M5302.?n7<=;h64>5<<a=21<75f4883>>o3i3:17boi:188yg70l3:197>50z&af?323A9?j6F<499'0g<5:2c?;7>5;h6;>5<<a=31<75f4`83>>ifn3:17pl>6d83>6<729q/no4:1:J00c=O;=20(9l5219j02<722c?47>5;nce>5<<uk99h7>54;294~"ej3?87E=;f:J00==#<k0=7d:8:188m1>=831b844?::mbb?6=3th8>h4?:583>5}#jk0>?6F<4g9K71><,=h1?6g;7;29?l2?2900e9750;9lec<722wi=4650;794?6|,kh1985G35d8L62?3->i6<l4i5594?=n<10;66g;9;29?l2f2900clh50;9~f42c290>6=4?{%`a>03<@:>m7E=;8:&7f?7e3`><6=44i5:94?=n<00;66g;a;29?jga2900qo?=d;291?6=8r.in7;:;I17b>N4<11/8o47;h64>5<<a=21<75f4883>>o3i3:17boi:188yg7?m3:1?7>50z&af?363A9?j6F<499'0g<03`><6=44i5:94?=hio0;66sm18694?4=83:p(ol54b9K71`<@:>37d:9:188kd`=831vn<:6:181>5<7s-hi69m4H26e?M5302c?:7>5;nce>5<<uk;;57>53;294~"ej3?97E=;f:J00==#<k0:46g;7;29?l2?2900c9k50;9~fa3=8391<7>t$c`917=O;=l0D>:7;%6a>4><a==1<75f4983>>i3m3:17pl>9683>1<729q/no4:4:J00c=O;=20(9l51b9j02<722c?47>5;h6:>5<<g=o1<75rb06`>5<3290;w)lm:468L62a3A9?46*;b;3`?l202900e9650;9j0<<722e?i7>5;|`27`<72<0;6=u+bc862>N4<o1C?964$5`95a=n<>0;66g;8;29?l2>2900e9o50;9l0`<722wi=:m50;794?6|,kh19;5G35d8L62?3->i6<k4i5594?=n<10;66g;9;29?l2f2900c9k50;9~f4>3290>6=4?{%`a>00<@:>m7E=;8:&7f?453`><6=44i5:94?=n<00;66g;a;29?j2b2900qo?7c;291?6=8r.in7;9;I17b>N4<11/8o4=2:k73?6=3`>36=44i5;94?=n<h0;66a;e;29?xd6<:0;694?:1y'fg<2<2B88k5G35:8 1d=:81b8:4?::k7<?6=3`>26=44o5g94?=z{=9;6=48{_604>;6;?0?463>35873>;6;h0?m63>2d87=>;6:j0?;63>2e873>{t<;o1<7<>{_156>X3;11U8>84^274?[24;2T?<<5Q4258Z1653W9=<6P<5g9]70c<V:?o7S=:c:\77`=Y<:n0R9=l;_60f>X3;h1U8?j4^50`?[25j2T?>l5Q43;896372=>01>=j:27896572:?01>=m:278965f2:?01>=6:278965?2:?01>:9:27896222:?01<8::c:8yv70n3:1>vP<599>52`=j?1v9==:184[24:278>k4<1:?07a<e=278?n4m5:?07`<e=278?=4m5:?07g<e=2wx=>650;0xZ6`134;847l9;|q705<72<qU89>4=0:g>11<5:8o6974=20f>11<582n6994}r61<?6=?;qU8?64=01a>7b<5:996?j4=212>7b<5:9;6?j4=21b>7b<5:926?j4=21;>7b<58::6?j4=023>7b<5ol1>i52fd81`>;al38o70?=7;0g?875>38o70?=5;0g?875<38o70?=3;0g?876l38o70?>c;0g?876j38o70?>a;0g?876138o70ji:3f89ac=:m16hi4=d:?gg?4c34ni6?j4=07:>7b<58?36?j4=075>7b<58?>6?j4=074>7b<58<86?j4=041>7b<58<:6?j4=043>7b<58?m6?j4=014>7b<58936?j4=011>7b<589:6?j4=3g6>7b<5;o=6?j4=3d2>7b<5;lh6?j4=220>7b<5::?6?j4=226>7b<5::=6?j4=224>7b<5::36?j4=3g4>7b<5;o36?j4=3g:>7b<5;oj6?j4=3ga>7b<5;oh6?j4=3gg>7b<5;on6?j4=3ge>7b<5;l;6?j4=3d1>7b<5;l86?j4=3d7>7b<5;l>6?j4=3d5>7b<5;l<6?j4=3d;>7b<5;l26?j4=3db>7b<5;li6?j4=3dg>7b<5;ln6?j4=3de>7b<5::;6?j4=222>7b<5::96?j4=326>7b<5;:?6?j4=320>7b<5;:96?j4=322>7b<5;:;6?j4=0df>7b<58lo6?j4=0d`>7b<58li6?j4=0db>7b<58l26?j4=0d;>7b<58l<6?j4=0d5>7b<58l>6?j4=0d0>7b<58l96?j4=0d2>7b<58l;6?j4=0ge>7b<58on6?j4=0gg>7b<58oh6?j4=0ga>7b<58oj6?j4=32a>7b<5;:j6?j4=32:>7b<5;:36?j4=324>7b<5;:=6?j4=0de>7b<58l?6?j4=0g:>7b<58o36?j4}r3;3?6=:rT8jn521959f3=z{=926=470z\77<=:;;l1>i5232f96a=:;=:1>i5232a96a=:;:o1>i5232d96a=:;:h1>i5235496a=:;=?1>i52ce81`>;dk38o70mm:3f89fg=:m16o44=d:?e7?4c34l96?j4=g396a=:n909h63jf;0g?8c>2;n01h652e9>a2<5l27n:7<k;<g6>7b<58;86?j4=031>7b<58;:6?j4=033>7b<58:m6?j4=057>7b<58=86?j4=054>7b<58k?6?j4=0c0>7b<58k:6?j4=0c3>7b<58k96?j4=0c`>7b<58kj6?j4=0ca>7b<58ko6?j4=0cf>7b<58h=6?j4=0`7>7b<58h>6?j4=0`4>7b<58h36?j4=0a1>7b<58i:6?j4=0a3>7b<58hm6?j4=0`f>7b<5;:o6>:m;<02<?53j279>>4<4c9>612=;=h01?<j:26a?844139?n63=4g800g=::<91?9l4=377>62e348;i7=;b:?154<4<k16>=h535`897772:>i70<>2;17f>;59:088o52206971d<5;;>6>:m;<02=?53j279=;4<4c9>641=;=h01??n:26a?846j39?n63=1b800g=::8n1?9l4=303>62e348:i7=;b:?15c<4<k16>??535`897452:>i70<=4;17f>;5:<088o5223:971d<5;8=6>:m;<013?53j279>44<4c9>67g=;=h01?<m:26a?845k39?n63=31800g=::;n1?9l4=30e>62e3488=7=;b:?177<4<k16>>=535`897532:>i70<<7;17f>;5;<088o52224971d<5;9i6>:m;<00<?53j279?l4<4c9>66c=;=h01?=l:26a?844l39?n63=3g800g=::=:1?9l4=362>62e348?>7=;b:?103<4<k16>9=535`897222:>i70<;7;17f>;5<1088o5225;971d<5;>j6>:m;<07`?53j2798o4<4c9>61e=;=h01?:j:26a?842839?n63=50800g=::<81?9l4=0:5>7b<582<6?j4=05e>7b<uz;<;7>52z\750=:9>=1n;5rs0g3>5<5sW9h563=048a2>{t9ml1<7<t^2a;?847<3h=7p}>dd83>7}Y;j=01?><:c48yv7cl3:1>vP<c79>654=j?1v<jl:181[5d=279<<4m6:p5ad=838pR>m;;<034?d13ty:h44?:3y]7f4<58ln6o84}r3g<?6=:rT8o<521gf9f3=z{8n<6=4={_1`4>;6nj0i:6s|1e494?4|V:hm70?ib;`5?xu6l<0;6?uQ3cg894`f2k<0q~?k4;296~X4jm16=k75b79~w4b42909wS=mc:?2b=<e>2wx=i<50;0xZ6de34;m;7l9;|q2`4<72;qU?oo4=0d5>g0<uz;o<7>52z\0f<=:9o?1n;5rs0af>5<5sW9i;63>f28a2>{t9jn1<7<t^2`5?87a:3h=7p}>cb83>7}Y;k?01<h>:c48yv7dj3:1>vP<b59>5c6=j?1v<mn:181[5e;27:ik4m6:p5f?=838pR>l=;<3fa?d13ty:o54?:3y]7g7<58oo6o84}r3`3?6=:rT8n=521da9f3=z{8i=6=4={_1bb>;6mk0i:6s|1b794?4|V:kn70?ja;`5?xu6m>0;6?uQ3bd8976e2k<0q~?j6;296~X4kl16>=o5b79~w4c22909wS=ld:?14<<e>2wx=h:50;0xZ6ed348;47l9;|q2a6<72;qU?nl4=324>g0<uz;n>7>52z\0gd=::9<1n;5rs0g2>5<5sW9h?63>fg8a2>{t9mk1<7<t^2`;?87a<3h=7p}>cg83>7}Y;hn01<k6:c48yv7d<3:1>vP<ab9>5`>=j?1v>o;:180[5?82799<4<5:?117<4=2wx?l<50;1xZ61a348?i7=:;<064?523ty8m<4?:2y]72c<5;>o6>;4=36`>63<uz9j<7>53z\03a=::=k1?85225`970=z{:3m6=4<{_14g>;5<108963=48801>{t;0o1<7=t^25a?843>39>70<;7;16?xu41j0;6>uQ36;897242:?01?:::278yv5>j3:1?vP<799>617=;<16>9<5349~w6?f2908wS=87:?17c<4=2798=4<5:p7<?=839pR>99;<00a?523488h7=:;|q0==<72:qU?:;4=31a>63<5;9h6>;4}r1:3?6=;rT8;95222:970=:::k1?85rs2;5>5<4sW9<?63=36801>;5;?0896s|38794?5|V:=970<<4;16?844=39>7p}<9583>6}Y;>;01?==:27897542:?0q~=63;297~X4?916>>>5349>667=;<1v>7>:180[51m279>i4<5:?16c<4=2wx?4>50;1xZ60c3489n7=:;<01g?523ty84k4?:2y]73e<5;826>;4=30b>63<uz93i7>53z\02g=::;21?852235970=z{:2o6=4<{_15e>;5:<08963=27801>{t;1i1<7=t^24:?845:39>70<=4;16?xu40k0;6>uQ37:897472:?01?<>:278yv5?i3:1?vP<669>64c=;<16><h5349~w6>>2908wS=96:?15f<4=279=i4<5:p7=>=839pR>8:;<02e?52348:n7=:;|q0eg<72:qU?584=33:>63<5;;<6>;4}r1be?6=;rT84852207970=::8<1?85rs2c:>5<4sW93863=12801>;59=0896s|3`:94?5|V:2870<>1;16?846:39>7p}<a683>6}Y;1801?>i:27897772:?0q~=n6;297~X40816>8:5349>65c=;<1v>o::180[50i2798k4<5:?116<4=2wx?4j50;1xZ60a348?87=:;<00=?523ty85?4?:2y]732<5;886>;4=30f>63<uz93;7>53z\026=::9n1?85220:970=z{<h1<7<t=272>g7<58<>6>>4}r30g?6=:r7:?o4<5:?205<fn2wx?>950;33874j3h>70=<a;`5?872139:70?:8;12?872>39:70?:5;`6?872?39:70?93;12?871:39:70?91;12?871839:70?:f;12?874?3h>70?<8;`6?874:39:70?<1;12?xu6;k0;69u212`9f3=:9:>18l5213a90==:9;n1855rs21g>5<5s499j7=:;<10`?d13ty8>k4?:4y>77`=j?16=:75489>5=3=<116=5?5469>5=?=<>1v>=l:185854l39>70=<c;`5?870?3h>70?76;`6?87??3h>70?8f;`6?xu4;80;6>u2320970=:;:;1n;5232296`=z{:996=4={<106?d1349887:8;|q07c<72:q6?9>5349>76c=:l16?>h5b79~w6272909w0=;0;`5?853:3><7p}<3c83>7}:;:i1?85232`9f3=z{:9;6=4<{<105?523498<7l9;<100?2?3ty8?h4?:2y>76c=j?16?>h5349>714=<11v>=<:187854i3h>70=<9;`6?85403h>70=<4;ce?xu4;?0;6<;t=21:>g0<58::6>?4=023>67<5ol1?<52fd805>;al39:70?=7;12?875>39:70?=5;12?875<39:70?=3;12?876l39:70?>c;12?876j39:70?>a;12?876139:70ji:2389ac=;816hi4<1:?gg?5634ni6>?4}r101?6=<0q6?>65b79>6`3=;816>h85309>6c7=;816>km5309>755=;816?=:5309>753=;816?=85309>751=;816?=65309>6`1=;816>h65309>6`?=;816>ho5309>6`d=;816>hm5309>6`b=;816>hk5309>6``=;816>k>5309>6c4=;816>k=5309>6c2=;816>k;5309>6c0=;816>k95309>6c>=;816>k75309>6cg=;816>kl5309>6cb=;816>kk5309>6c`=;816?=>5309>757=;816?=<5309>653=;816>=:5309>655=;816>=<5309>657=;816>=>5309>5cc=;816=kj5309>5ce=;816=kl5309>5cg=;816=k75309>5c>=;816=k95309>5c0=;816=k;5309>5c5=;816=k<5309>5c7=;816=k>5309>5``=;816=hk5309>5`b=;816=hm5309>5`d=;816=ho5309>65d=;816>=o5309>65?=;816>=65309>651=;816>=85309>5c`=;816=k:5309>5`?=;816=h65309~w6262908w0=;6;`6?853=3h>70=;2;ce?xu4<=0;6<9t=265>g0<58=?6>?4=050>67<58k?6>?4=0c0>67<58k:6o;4=0c3>g3<58k96>?4=0c`>67<58kj6>?4=0ca>g3<58ko6>?4=0cf>67<58h=6>?4=0`7>g3<58h>6>?4=0`4>67<58h36>?4=0a1>67<58i:6>?4=0a3>67<58hm6>?4=0`f>67<uz9??7>514y>713=j?16oi4<1:?`g?5634ii6>?4=bc974=:k008=63i3;12?8`52:;01k?5309>b5<4927nj7=>;<g:>67<5l21?<52e6805>;b>39:70k::23894742:;01<?=:23894762:;01<??:238946a2:;0q~kj:1858ec2:?01k=5b79>gc<3027o=7:8;<f0>1?<5m>1845rsb:94?3|5jn1n;52190902=:9>h18l5219c902=:9?o1855rsbg94?4|5ji1?852cg8bb>{tk>0;68u2cb8a2>;60;0?563>8c873>;6>m0?463>7b87e>{tl90;6?u2cc801>;c93km7p}l6;291~;dj3h=70?73;64?87?j3>270?9c;6;?870k3>27p}k2;296~;di39>70j<:`d8yve2290>w0mn:c4894>42=301<9m:5;894>f2=301<8m:5:8yvb32909w0m6:2789a2=io1vn:50;7x9f?=j?16=;o5499>52b=<116=5:5469>5=e=<11v<<=:185877939>70?=7;`5?877;3>370??5;64?877?3>270??8;6:?xuak3:1?v3>008a2>;6<80?463>3e87<>{t9981<7<t=023>63<58:86lh4}rda>5<4s4;;<7l9;<376?2?34;8h7:n;|q241<72;q6jk4<5:?240<fn2wxjl4?:2y>bc<e>27:8?4;7:?27`<302wx==850;0x9cc=;<16==95ag9~wc?=839p1kk5b79>517=<>16=>k5469~w46?2909w0hk:278946?2hl0q~h7:1808`c2k<01<=i:55894242==0q~?>8;296~;6:>08963>1e8a2>{t98=1<7<t=005>63<58;h6o84}r315?6==r7:>;4m6:?246<3?27:<84;8:?242<3i27:<44;7:p540=838p1<<::278947e2k<0q~?=0;290~;6:<0i:63>0487=>;68>0?;63>0887<>{t98?1<7<t=007>63<58;j6o84}r32b?6=;r7:>94m6:?242<3027:<54;7:p542=838p1<<<:278947>2k<0q~?>e;296~;6::0i:63>0987<>{tm=0;6?u2f2801>;b13h=7p}j3;296~;a:39>70k7:c48yvcc290>w0h=:c489f`=<>16h<4;8:?g7?2f34n>6994}rg1>5<5s4l:6>;4=d59f3=z{li1<7:t=g39f3=:l80?563k3;64?8b22=20q~k>:1818`72:?01h85b79~w`d=839p1k>5b79>`6<3027o87:8;|qf4?6=:r7nj7=:;<g6>g0<uzoj6=4={<ge>g0<5m>1855rs02f>5<5s4;:h7=:;<327?d13ty:<i4?:3y>54e=;<16=<<5b79~w46d2909w0?>b;16?87693h=7p}>0c83>7}:98k1?8521029f3=z{8:j6=4={<32=?5234;;j7l9;|qge?6=:r7n57=:;<fe>g0<uzn26=4={<g;>63<5mo1n;5rse:94?4|5l=1?852de8a2>{tl>0;6?u2e7801>;ck3h=7p}k6;296~;b=39>70jm:c48yv72m3:1>5u2dg801>;6>:0i:63mc;64?855k3><70==b;64?855i3><70==9;64?85503><70==7;64?855>3><70==5;64?855<3><70==3;64?855:3><70==1;64?85583><70=>f;64?856m3><70=>d;64?856k3><70=>b;64?856i3><70=>9;64?85603><70=>7;64?856>3><70=>5;64?856<3><70=>3;64?856:3><70=>1;64?85683><70=?f;64?857m3><70=?d;64?857k3><70=?b;64?85713><70=?a;64?87393>27p}i4;296~;cm39>70ll:`d8yv`22909w0jk:2789gb=io1vk850;0x9ae=;<16nh4nf:pb2<72;q6ho4<5:?ab?ga3ty:ni4?:4y>545=;<16=n<5b79>g5<3?278>i4;8:?06`<302wx=?650;0x94752:?01n>5ag9~w44>2909w0?>1;16?8e62hl0q~?=a;296~;69908963l2;ce?xu6:k0;6?u211d970=:k:0jj6s|13a94?4as4;>57<j;<36<?4b34;>:7<j;<361?4b34;>;7<j;<357?4b34;=>7<j;<355?4b34;=<7<j;<36b?4b348n97<j;<0f2?4b348m=7<j;<0eg?4b349;?7<j;<130?4b349;97<j;<132?4b349;;7<j;<13<?4b348n;7<j;<0f<?4b348n57<j;<0fe?4b348nn7<j;<0fg?4b348nh7<j;<0fa?4b348nj7<j;<0e4?4b348m>7<j;<0e7?4b348m87<j;<0e1?4b348m:7<j;<0e3?4b348m47<j;<0e=?4b348mm7<j;<0ef?4b348mh7<j;<0ea?4b348mj7<j;<134?4b349;=7<j;<136?4b34;9h7oi;|q20=<72;q6=875349>51c=io1v<;;:18787213h=70?93;16?873m3><70?<d;64?xu6<>0;6?u214:970=:9=n1mk5rs070>5<2s4;>47l9;<356?5234;?i7:7;<30`?2>34;?h7:8;|q200<72;q6=885349>51g=io1v<;>:184872>3h=70?90;16?873i3>370?;b;6:?873l3>270?;c;6;?874m3>j7p}>4583>7}:9<?1?85215;9ec=z{8?;6=47{<361?d134;>j7=:;<37e?2034;?n7:7;<30b?2?34;?h7:7;<37=?2134;?o7:8;|q203<72;q6=895349>51d=io1v<;=:185872?3h=70?91;16?873j3><70?;d;6b?873k3>270?<e;6:?xu6=m0;69mt=041>g0<5;:o6>l4=33;>6d<5;886>l4=367>6d<5;8n6>l4=31:>6d<5;>m6>l4=370>6d<5;??6>l4=32f>6d<5;;:6>l4=32e>6d<5;;;6>l4=331>6d<5;;86>l4=337>6d<5;;>6>l4=33:>6d<5;;=6>l4=334>6d<5;;j6>l4=33a>6d<5;;h6>l4=33g>6d<5;8;6>l4=33f>6d<5;;m6>l4=302>6d<5;896>l4=307>6d<5;8>6>l4=30;>6d<5;8=6>l4=304>6d<5;826>l4=30b>6d<5;8i6>l4=30`>6d<5;9;6>l4=30g>6d<5;8m6>l4=312>6d<5;996>l4=310>6d<5;9?6>l4=314>6d<5;9>6>l4=315>6d<5;9i6>l4=31;>6d<5;9j6>l4=31f>6d<5;9h6>l4=31g>6d<5;9m6>l4=363>6d<5;>:6>l4=361>6d<5;>=6>l4=360>6d<5;>>6>l4=364>6d<5;>36>l4=36:>6d<5;>j6>l4=36g>6d<5;>i6>l4=36`>6d<5;>n6>l4=373>6d<5;?:6>l4=371>6d<5kn18:52bb87<>;6<;0?m6s|14a94?2ds4;==7l9;<03`?5f348:47=n;<017?5f348?87=n;<01a?5f348857=n;<07b?5f348>?7=n;<060?5f348;i7=n;<025?5f348;j7=n;<024?5f348:>7=n;<027?5f348:87=n;<021?5f348:57=n;<022?5f348:;7=n;<02e?5f348:n7=n;<02g?5f348:h7=n;<014?5f348:i7=n;<02b?5f3489=7=n;<016?5f348987=n;<011?5f348947=n;<012?5f3489;7=n;<01=?5f3489m7=n;<01f?5f3489o7=n;<004?5f3489h7=n;<01b?5f3488=7=n;<006?5f3488?7=n;<000?5f3488;7=n;<001?5f3488:7=n;<00f?5f348847=n;<00e?5f3488i7=n;<00g?5f3488h7=n;<00b?5f348?<7=n;<075?5f348?>7=n;<072?5f348??7=n;<071?5f348?;7=n;<07<?5f348?57=n;<07e?5f348?h7=n;<07f?5f348?o7=n;<07a?5f348><7=n;<065?5f348>>7=n;<`f>11<5kn1855215090<=z{8?i6=4;cz?225<e>279<i4<9:?15=<41279>>4<9:?101<41279>h4<9:?17<<412798k4<9:?116<41279994<9:?14`<41279=<4<9:?14c<41279==4<9:?157<41279=>4<9:?151<41279=84<9:?15<<41279=;4<9:?152<41279=l4<9:?15g<41279=n4<9:?15a<41279>=4<9:?15`<41279=k4<9:?164<41279>?4<9:?161<41279>84<9:?16=<41279>;4<9:?162<41279>44<9:?16d<41279>o4<9:?16f<41279?=4<9:?16a<41279>k4<9:?174<41279??4<9:?176<41279?94<9:?172<41279?84<9:?173<41279?o4<9:?17=<41279?l4<9:?17`<41279?n4<9:?17a<41279?k4<9:?105<412798<4<9:?107<412798;4<9:?106<41279884<9:?102<41279854<9:?10<<412798l4<9:?10a<412798o4<9:?10f<412798h4<9:?115<412799<4<9:?117<4127ij7:8;<`f>1><58>:69o4}r36e?6=<kq6=8h5b79>65b=;116><65399>675=;116>9:5399>67c=;116>>75399>61`=;116>8=5399>602=;116>=k5399>647=;116>=h5399>646=;116><<5399>645=;116><:5399>643=;116><75399>640=;116><95399>64g=;116><l5399>64e=;116><j5399>676=;116><k5399>64`=;116>??5399>674=;116>?:5399>673=;116>?65399>670=;116>?95399>67?=;116>?o5399>67d=;116>?m5399>666=;116>?j5399>67`=;116>>?5399>664=;116>>=5399>662=;116>>95399>663=;116>>85399>66d=;116>>65399>66g=;116>>k5399>66e=;116>>j5399>66`=;116>9>5399>617=;116>9<5399>610=;116>9=5399>613=;116>995399>61>=;116>975399>61g=;116>9j5399>61d=;116>9m5399>61c=;116>8>5399>607=;116>8<5399>fc<3027:8>4;8:p56?=839p1<=8:278945?2:?01<=n:`d8yv74?3:1>v3>368a2>;6;h0?;6s|12194?4|58996>;4=017>d`<uz;8<7>57z?277<e>27:?;4;9:?271<3127:?l4;9:?26`<3?27:>n4;9:?26a<312wx=>;50;0x94562:?01<=9:`d8yv75n3:1;v3>308a2>;6;?0?;63>3587<>;6;h0?463>2d87<>;6:j0?m63>2e87e>{t9?31<7<t=053>66<58<26lh4}r35a?6=:r7:;=4;d:?22`<fn2wx=:850;0x94172hl01<9;:278yv7103:1?v3>6g804>;6>008<63>698bb>{t9?n1<7=t=04e>1b<58<26o64=04g>d`<uz;<97>52z?22c<fn27:;>4<5:p5g4=83?p1<86:24894d02k<01<m>:27894>e2=201<8k:558yv71?3:1>v3>69804>;6>>0jj6s|1c394?3|58<36>84=0`5>g0<58i;6>;4=0:a>1g<58<h6994}r35g?6=:r7::54m8:?22f<fn2wx=;850;0x94002::01<89:`d8yv7e83:19v3>66802>;6j<0i:63>bg801>;60h0?m63>6c873>{t9?h1<7<t=044>g><58<i6lh4}r351?6=:r7::;4<0:?220<fn2wx=lh50;7x94012:<01<l;:c4894db2:?01<8n:55894>d2==0q~?9a;296~;6>?0i463>6`8bb>{t91n1<7?8{<351?5134;j87<j;<3b7?4b34;j=7<j;<3b4?4b34;j>7<j;<3bg?4b34;jm7<j;<3bf?4b34;jh7<j;<3ba?4b34;i:7<j;<3a0?4b34;i97<j;<3a3?4b34;i47<j;<3`6?4b34;h=7<j;<3`4?4b34;ij7<j;<3aa?4b34;3i7oi;<3;0?2f3ty:;?4?:3y>522=j?16=:75499~w4162909w0?83;`5?87013><7p}>7`83>6}:9>=1>h5216d96`=:91?1mk5rs05;>5<5s4;<;7=:;<34=?ga3ty:5>4?:3y>5d2=;<16=475ag9~w4?a290?w0?n4;`5?87fm39>70?69;64?87?:3>37p}>9383>7}:9h91?85218:9ec=z{83n6=4:{<3b7?d134;jh7=:;<3:=?2?34;3>7:n;<3:<?203ty:5=4?:3y>5d7=;<16=4;5ag9~w4?d290<w0?n1;`5?87fj39>70?65;64?87>>3>270?73;6b?87>03>270?67;6;?xu60o0;6?u21`2970=:90>1mk5rs0;a>5<?s4;j<7l9;<3be?5234;297:7;<3:2?2?34;247:7;<3:0?2134;2;7:8;<3;0?2?3ty:5<4?:3y>5d4=;<16=485ag9~w4?c290=w0?n2;`5?87fk39>70?66;64?87?;3>370?68;6b?87>?3>27p}>a683>6}:9hi1n;521c4970=:9>i18:5rs0c6>5<4s4;jm7l9;<3a0?5234;<h7:8;|q2e3<72:q6=ll5b79>5g3=;<16=:l5469~w4g?2908w0?nd;`5?87e?39>70?8c;6;?xu6i00;6>u21`g9f3=:9k21?85216`90==z{8h86=4;{<3a<?d134;h>7=:;<3;e?2?34;=i7:8;|q2ff<72=hp1<m>:c48976c2;201??7:3:897442;201?:;:3:8974b2;201?=6:3:8972a2;201?;<:3:897332;201?>j:3:897762;201?>i:3:897772;201??=:3:897742;201??;:3:897722;201??6:3:897712;201??8:3:8977f2;201??m:3:8977d2;201??k:3:897472;201??j:3:8977a2;201?<>:3:897452;201?<;:3:897422;201?<7:3:897412;201?<8:3:8974>2;201?<n:3:8974e2;201?<l:3:897572;201?<k:3:8974a2;201?=>:3:897552;201?=<:3:897532;201?=8:3:897522;201?=9:3:8975e2;201?=7:3:8975f2;201?=j:3:8975d2;201?=k:3:8975a2;201?:?:3:897262;201?:=:3:897212;201?:<:3:897222;201?:8:3:8972?2;201?:6:3:8972f2;201?:k:3:8972e2;201?:l:3:8972b2;201?;?:3:897362;201?;=:3:89f7=<>16o=4;8:p5gd=83>iw0?l0;`5?847l38<70<>8;04?845;38<70<;4;04?845m38<70<<9;04?843n38<70<:3;04?842<38<70<?e;04?846938<70<?f;04?846838<70<>2;04?846;38<70<>4;04?846=38<70<>9;04?846>38<70<>7;04?846i38<70<>b;04?846k38<70<>d;04?845838<70<>e;04?846n38<70<=1;04?845:38<70<=4;04?845=38<70<=8;04?845>38<70<=7;04?845138<70<=a;04?845j38<70<=c;04?844838<70<=d;04?845n38<70<<1;04?844:38<70<<3;04?844<38<70<<7;04?844=38<70<<6;04?844j38<70<<8;04?844i38<70<<e;04?844k38<70<<d;04?844n38<70<;0;04?843938<70<;2;04?843>38<70<;3;04?843=38<70<;7;04?843038<70<;9;04?843i38<70<;d;04?843j38<70<;c;04?843m38<70<:0;04?842938<70<:2;04?8e52==01n?5499~w4df290?nv3>bg8a2>;58m09:63=19812>;5::09:63=45812>;5:l09:63=38812>;5<o09:63=52812>;5==09:63=0d812>;59809:63=0g812>;59909:63=13812>;59:09:63=15812>;59<09:63=18812>;59?09:63=16812>;59h09:63=1c812>;59j09:63=1e812>;5:909:63=1d812>;59o09:63=20812>;5:;09:63=25812>;5:<09:63=29812>;5:?09:63=26812>;5:009:63=2`812>;5:k09:63=2b812>;5;909:63=2e812>;5:o09:63=30812>;5;;09:63=32812>;5;=09:63=36812>;5;<09:63=37812>;5;k09:63=39812>;5;h09:63=3d812>;5;j09:63=3e812>;5;o09:63=41812>;5<809:63=43812>;5<?09:63=42812>;5<<09:63=46812>;5<109:63=48812>;5<h09:63=4e812>;5<k09:63=4b812>;5<l09:63=51812>;5=809:63=53812>;d;3><70m=:5:8yv7e13:18lu21cg9f3=::9n1>85220:960=::;91>852256960=::;o1>85222;960=::=l1>852241960=::<>1>85221g960=::8;1>85221d960=::8:1>852200960=::891>852206960=::8?1>85220;960=::8<1>852205960=::8k1>85220`960=::8i1>85220f960=::;:1>85220g960=::8l1>852233960=::;81>852236960=::;?1>85223:960=::;<1>852235960=::;31>85223c960=::;h1>85223a960=::::1>85223f960=::;l1>852223960=:::81>852221960=:::>1>852225960=:::?1>852224960=:::h1>85222:960=:::k1>85222g960=:::i1>85222f960=:::l1>852252960=::=;1>852250960=::=<1>852251960=::=?1>852255960=::=21>85225;960=::=k1>85225f960=::=h1>85225a960=::=o1>852242960=::<;1>852240960=:k:0?46s|28f94?4|5;o>6>;4=22b>d`<uz8h=7>52z?1a0<e>27:i54<5:p6d>=838p1?k9:278966e2hl0q~<lc;296~;5m?0i:63>e8801>{t:k91<7<t=3d2>63<5:;=6lh4}r0g3?6=:r79j<4m6:?2b1<4=2wx>oo50;0x97`d2:?01><>:`d8yv4cm3:1>v3=fb8a2>;6no0896s|2c`94?4|5::86>;4=204>d`<uz8oj7>52z?046<e>279<;4<5:p6ge=838p1>>;:278964?2hl0q~<j0;296~;48=0i:63=06801>{t:kn1<7<t=226>63<5:826lh4}r0f5?6=:r78<84m6:?14=<4=2wx>ok50;0x96612:?01><n:`d8yv4b:3:1>v3<078a2>;5800896s|2cd94?4|5::<6>;4=20a>d`<uz8n?7>52z?042<e>279<l4<5:p6f6=838p1>>7:278964d2hl0q~<j4;296~;4810i:63=0c801>{t:0o1<7<t=3g4>63<5::26lh4}r0`6?6=:r79i:4m6:?2ad<4=2wx>4h50;0x97c?2:?01>>l:`d8yv4d;3:1>v3=e98a2>;6mk0896s|2`294?4|5;o26>;4=22g>d`<uz8h87>52z?1a<<e>27:in4<5:p6d7=838p1?kn:278966b2hl0q~<l5;296~;5mh0i:63>ee801>{t:h81<7<t=3ga>63<5::m6lh4}r0`2?6=:r79io4m6:?2a`<4=2wx>l=50;0x97cd2:?01>??:`d8yv4d?3:1>v3=eb8a2>;6mo0896s|2`694?4|5;oo6>;4=232>d`<uz8h47>52z?1aa<e>27:j=4<5:p6d3=838p1?kj:27896752hl0q~<l9;296~;5ml0i:63>f0801>{t:h<1<7<t=3ge>63<5:;86lh4}r0`e?6=:r79ik4m6:?2b7<4=2wx>l950;0x97`72:?01>?;:`d8yv4dj3:1>v3=f18a2>;6n:0896s|2`;94?4|5;l96>;4=236>d`<uz8hh7>52z?1b7<e>27:j84<5:p6dg=838p1?h<:27896702hl0q~<le;296~;5n:0i:63>f7801>{t:hh1<7<t=3d7>63<5:;36lh4}r0`b?6=:r79j94m6:?2b2<4=2wx>lm50;0x97`22:?01>?6:`d8yv4c83:1>v3=f48a2>;6n10896s|2`f94?4|5;l=6>;4=23b>d`<uz8o=7>52z?1b3<e>27:j44<5:p6dc=838p1?h8:278967e2hl0q~<k2;296~;5n>0i:63>f`801>{t:hl1<7<t=3d;>63<5:;h6lh4}r0g7?6=:r79j54m6:?2bg<4=2wx>o>50;0x97`>2:?01>?k:`d8yv4c<3:1>v3=f88a2>;6nj0896s|2c394?4|5;lj6>;4=23f>d`<uz8o97>52z?1bd<e>27:ji4<5:p6g4=838p1?hm:278967a2hl0q~<k6;296~;5nk0i:63>fd801>{t:k>1<7<t=3dg>63<5:8;6lh4}r0g<?6=:r79ji4m6:?145<4=2wx>o;50;0x97`b2:?01><=:`d8yv4c13:1>v3=fd8a2>;5880896s|2c494?4|5;lm6>;4=200>d`<uz8om7>52z?1bc<e>279<?4<5:p6g1=838p1>>?:27896432hl0q~<kb;296~;4890i:63=02801>{t:k21<7<t=222>63<5:8>6lh4}r0gg?6=:r78<<4m6:?141<4=2wx>o750;0x96652:?01><9:`d8yv4cl3:1>v3<038a2>;58<0896s|33f94?42s48;h7=;c:?166<4<j16>>7535a8972a2:>h70<:4;17g>;598088n5221d971e<5;;86>:l;<021?53k279=:4<4b9>64g=;=i01??l:26`?845839?o63=1d800f=::;81?9m4=306>62d3489;7=;c:?16<<4<j16>?l535a897572:>h70<=d;17g>;5;;088n52226971e<5;9=6>:l;<00f?53k279?54<4b9>66b=;=i01?=i:26`?843939?o63=47800f=::=91?9m4=36;>62d348?m7=;c:?10f<4<j16>9k535a897362:>h70==d;ce?xu5080;6?u221f972=:;9k1855rs20f>5<5=r79=54<4b9>612=;=i01?<j:26`?842;39?o63=0d800f=::8:1?9m4=331>62d348:87=;c:?15<<4<j16><8535a8977e2:>h70<>d;17g>;59o088n52233971e<5;8?6>:l;<01<?53k279>;4<4b9>67g=;=i01?<l:26`?845n39?o63=30800f=:::91?9m4=314>62d348897=;c:?17d<4<j16>>k535a8975d2:>h70<;0;17g>;5<;088n52257971e<5;><6>:l;<07=?53k2798i4<4b9>61d=;=i01?;?:26`?842:39?o63<2d8bb>{t:1i1<7<t=33;>61<5::j6974}r0:3?6=:r79>>4<7:?04g<302wx>;h50;0x97232:=01>?9:5;8yv42i3:1>v3=2d803>;48k0?56s|27794?4|5;926>94=235>1><uz8<<7>52z?10c<4?278><4;8:p627=838p1?;<:25896462=30q~<82;296~;5==08;63<2687<>{t:>91<7<t=32f>61<5:8<6974}r042?6=:r79=<4<7:?06<<302wx>::50;0x976a2:=01><7:5:8yv40=3:1>v3=11803>;4:10?56s|26594?4|5;;96>94=20:>1?<uz8<47>52z?156<4?278>l4;8:p62?=838p1??;:258964f2=30q~<8a;296~;59<08;63<2c87<>{t:>n1<7<t=33:>61<5:8h6974}r04f?6=:r79=;4<7:?06g<312wx>:m50;0x97702:=01><l:5:8yv40m3:1>v3=1`803>;4800?46s|26d94?4|5;;i6>94=22:>1?<uz83<7>52z?15f<4?278<n4;8:p6=4=838p1??k:258966d2=30q~<75;296~;5:908;63<0d87<>{t:191<7<t=33f>61<5::o6964}r0;0?6=:r79=k4<7:?04a<312wx>5850;0x97462:=01>>j:5;8yv4??3:1>v3=23803>;48o0?46s|29:94?4|5;8?6>94=22e>1?<uz8357>52z?160<4?278==4;8:p6=b=838p1?<7:25896762=30q~<7a;296~;5:?08;63<1187=>{t:1h1<7<t=304>61<5:;:6964}r0;a?6=:r79>44<7:?057<302wx>5h50;0x974f2:=01>?=:5;8yv4>83:1>v3=2c803>;49:0?46s|28394?4|5;8h6>94=230>1?<uz8287>52z?175<4?278=84;8:p6<4=838p1?<k:25896732=20q~<63;296~;5:o08;63<1587=>{t:0?1<7<t=312>61<5:;>6974}r0:2?6=:r79??4<7:?052<302wx>4650;0x97542:=01>?8:5;8yv4>13:1>v3=35803>;4910?46s|28a94?4|5;9<6>94=23:>1?<uz82m7>52z?170<4?278=54;9:p6<d=838p1?=9:258967>2=20q~<:7;296~;5;k08;63<1c87<>{t:<?1<7<t=31;>61<5:;j6964}r062?6=:r79?l4<7:?05d<312wx>8l50;0x975b2:=01>?l:5;8yv4203:1>v3=3b803>;49k0?56s|24;94?4|5;9o6>94=23`>1><uz8>o7>52z?17c<4?278=i4;8:p60b=838p1?:?:258967c2=30q~<:e;296~;5<808;63<1d87<>{t:<l1<7<t=361>61<5:;n6974}r056?6=:r798;4<7:?065<302wx>;>50;0x97242:=01>?i:5:8yv4193:1>v3=44803>;49o0?56s|27194?4|5;><6>94=203>1?<uz8=87>52z?10=<4?278>?4;8:p630=838p1?:6:25896452=30q~<97;296~;5<h08;63<2287<>{t:?k1<7<t=36g>61<5:8?6974}r05<?6=:r798o4<7:?066<312wx>;750;0x972d2:=01><;:5:8yv41j3:1>v3=4d803>;4:<0?46s|27a94?4|5;?;6>94=206>1?<uz8=h7>52z?114<4?278>;4;8:p63c=838p1?;=:25896412=30q~<?c;2960}::9?1>h5221696`=::991>h5221096`=::9;1>h5221296`=:9oo1>h521gf96`=:9oi1>h521g`96`=:9ok1>h521g;96`=:9o21>h521g596`=:9o<1>h521g796`=:9o91>h521g096`=:9o;1>h521g296`=:9ll1>h521dg96`=:9ln1>h521da96`=:9lh1>h521dc96`=::9h1>h5221c96`=::931>h5221:96`=::9=1>h5221496`=:9ol1>h521g696`=:9l31>h521d:96`=:9;o1mk5rs0:;>5<4s4;3:7=:;<3;3?5234;357oi;|q2<3<72?q6=585b79>5=3=<>16=5j5499>77b=<>16??k5489>5=c=<11v<6?:181870n39>70?71;ce?xu0<3:1>v3>0987e>;6800?i6s|7683>7}:l=0?m63k5;6f?xu61h0;6?u218;90<=:90=18h5rs06e>5<5s4;?i7:6;<37g?2b3ty::94?:3y>57e=io16=>h54`9~w4262909w0?;1;ce?87383>37p}>4383>7}:9=81mk5215190<=z{89o6=4={<30`?ga34;?<7:8;|q27c<72;q6=9>5489>56`=io1v<:<:18187383>j70?;3;6f?xu6k:0;6?u219f9ec=:9131855rs0:1>5<5s4;3>7oi;<3;5?2?3ty:4>4?:3y>5=5=io16=5:5489~w41b2908w0?71;6:?87?13>j70?8d;ce?xu60=0;6?u219390d=:91>18h5rs05a>5<5s4;<n7oi;<34`?2f3ty:4l4?:3y>5=g=io16=5m54`9~w4>e2909w0?7b;ce?87?k3>27p}>8b83>7}:9131845219a90`=z{89n6=4={<30b?2>34;8i7:j;|q23f<72;q6=:j5489>52e=<l1vq~:<2;296~X3;;16>o4;339'711=111v9=6:181[241279n7:<9:&002<>12wx8?650;0xZ14?348i69<7;%173?g53ty8m94?:3y]7=6<5;h1?5>4$264>30<uz9j>7>52z\03c=::k08;k5+355934=z{:k:6=4={_14a>;5j39<i6*<46847>{t;h:1<7<t^25g?84e2:=o7)=;7;57?xu41o0;6?uQ36a897d=;>i0(>:8:648yv5>m3:1>vP<7c9>6g<4?k1/?995769~w6?d2909wS=89:?1f?5012.88:488:p7<d=838pR>97;<0a>61?3-9?;796;|q0=d<72;qU?:94=3`9721<,:><6:o4}r1:=?6=:rT8;;522c8033=#;==1;o5rs2;;>5<5sW9<963=b;141>"4<>0<o6s|38594?4|V:=?70<m:257?!53?3=o7p}<9783>7}Y;>901?l53618 6202>o0q~=65;296~X4?;16>o4<739'711=?o1v>7;:181[509279n7=81:&002<?82wx?4=50;0xZ617348i6>9?;%173?>63ty85<4?:3y]73c<5;h1?;k4$264>=4<uz92<7>52z\02a=::k08:i5+3559<6=z{:2m6=4={_15g>;5j39=o6*<468;0>{t;1o1<7<t^24a?84e2:<i7)=;7;:6?xu40m0;6?uQ37c897d=;?k0(>:8:948yv5?k3:1>vP<689>6g<4>01/?995869~w6>e2909wS=98:?1f?5102.88:478:p7=g=838pR>88;<0a>6003-9?;766;|q0<<<72;qU?;84=3`9730<,:><65o4}r1;<?6=:rT8:8522c8020=#;==14o5rs2ca>5<5sW93:63=b;1;2>"4<>03o6s|3`c94?4|V:2>70<m:2:6?!53?32o7p}<a883>7}Y;1>01?l53968 62021o0q~=n8;296~X40:16>o4<829'711=0o1v>o8:181[5?:279n7=72:&002<>82wx?l850;0xZ6>6348i6>6>;%173??63ty8m84?:3y]72g<5;h1?:o4$264><4<uz92h7>52z\02c=::k08:k5+3559=6=z{:396=4={_150>;5j39=86*<468:0>{t;1=1<7<t^240?84e2:<87)=;7;;6?xu3<90;6?uQ452897d=<=:0(>:8:848yv2483:1>vP;319>6g<3;91/?995969~w6cc2909wS=l9:?1f?5d12.88:46a:p7`d=838pR>m7;<0a>6e?3-9?;77m;|q0ad<72;qU?n94=3`97f1<,:><64m4}r1f=?6=:rT8o;522c80g3=#;==15i5rs2g;>5<5sW9h963=b;1`1>"4<>02i6s|3d594?4|V:i?70<m:2a7?!53?33m7p}<e483>7}Y;j801?l53b08 6202h:0q~=j4;296~X4k816>o4<c09'711=i81v>k<:181[5d8279n7=l0:&002<f;2wx?h<50;0xZ6da348i6>li;%173?g33ty8i<4?:3y]7gc<5;h1?ok4$264>d3<uz9n<7>52z\0fa=::k08ni5+3559e3=z{:nm6=4={_1ag>;5j39io6*<468b3>{t;mo1<7<t^2`a?84e2:hi7)=;7;c;?xu4lm0;6?uQ3cc897d=;kk0(>:8:`;8yv5ck3:1>vP<b89>6g<4j01/?995a`9~w6bf2909wS=m7:?1f?5e?2.88:4nb:p7a?=838pR>l9;<0a>6d13-9?;7ol;|q0`=<72;qU?o;4=3`97g3<,:><68m4}r1g3?6=:rT8n9522c80f1=#;==19i5rs2f5>5<5sW9i?63=b;1a7>"4<>0>i6s|3e794?4|V:h970<m:2`1?!53?3?m7p}<d583>7}Y;k;01?l53c38 6202?:0q~=k3;296~X4j916>o4<b19'711=>81v>j=:181[5fn279n7=nf:&002<1:2wx?i?50;0xZ6gb348i6>oj;%173?043ty8j94?:3y]7f`<5;h1?nh4$264>32<uz9m?7>52z\0g`=::k08oh5+355920=z{:l96=4={_1``>;5j39hh6*<46853>{t;o;1<7<t^2a`?84e2:ih7)=;7;4;?xu4n90;6?uQ3b`897d=;jh0(>:8:7;8yv5bn3:1>vP<c`9>6g<4kh1/?9956`9~w6cb2909wS=l3:?1f?5d;2.88:49b:p7`0=838pR>l7;<0a>6d?3-9?;78l;|q0`g<72;qU?lj4=3`97db<,:><6;j4}r1g4?6=:rT8mn522c80ef=#;==1:h5rs2d`>5<5sW9mo63=b;1eg>"4<>0=j6s|34:94?4|V:?370<m:27;?!53?3=;7p}<f783>7}Y;o<01?l53g48 6202>80q~:>5;296~X39<16>o4;149'711=?<1vqcm<e;296~N4<11vbn=i:181M5302weo9>50;0xL62?3tdh8<4?:3yK71><ugi?>7>52zJ00==zfj>86=4={I17<>{ik=>1<7<tH26;?xhd<<0;6?uG35:8yke3>3:1>vF<499~jf202909wE=;8:mg1>=838pD>:7;|l`0<<72;qC?964}oa7e?6=:rB8855rnb6a>5<5sA9?46sac5a94?4|@:>37p`l4e83>7}O;=20qcm;e;296~N4<11vbn:i:181M5302weo8>50;0xL62?3tdh9<4?:3yK71><ugi>>7>52zJ00==zfj?86=4={I17<>{ik<>1<7<tH26;?xhd=<0;6?uG35:8yke2>3:1>vF<499~jf302909wE=;8:mg0>=838pD>:7;|l`1<<72;qC?964}oa6e?6=:rB8855rnb7a>5<5sA9?46sac4a94?4|@:>37p`l5e83>7}O;=20qcm:e;296~N4<11vbn;i:181M5302weo;>50;0xL62?3tdh:<4?:3yK71><ugi=>7>52zJ00==zfj<86=4={I17<>{ik?>1<7<tH26;?xhd><0;6?uG35:8yke1>3:1>vF<499~jf002909wE=;8:mg3>=838pD>:7;|l`2<<72;qC?964}oa5e?6=:rB8855rnb4a>5<5sA9?46sac7a94?4|@:>37p`l6e83>7}O;=20qcm9e;296~N4<11vbn8i:181M5302weo:>50;0xL62?3tdh;<4?:3yK71><ugi<>7>52zJ00==zfj=86=4={I17<>{ik>>1<7<tH26;?xhd?<0;6?uG35:8yke0>3:1>vF<499~jf102909wE=;8:mg2>=838pD>:7;|l`3<<72;qC?964}oa4e?6=:rB8855rnb5a>5<5sA9?46sac6a94?4|@:>37p`l7e83>7}O;=20qcm8e;296~N4<11vbn9i:181M5302weo5>50;0xL62?3tdh4<4?:3yK71><ugi3>7>52zJ00==zfj286=4={I17<>{ik1>1<7<tH26;?xhd0<0;6?uG35:8yke?>3:1>vF<499~jf>02909wE=;8:mg=>=838pD>:7;|l`<<<72;qC?964}oa;e?6=:rB8855rnb:a>5<5sA9?46sac9a94?4|@:>37p`l8e83>7}O;=20qcm7e;296~N4<11vbll9:182M5302wen=950;3xL62?3tdi<54?:0yK71><ugh;57>51zJ00==zfk:j6=4>{I17<>{ij9h1<7?tH26;?xhe8j0;6<uG35:8ykd7l3:1=vF<499~jg6b290:wE=;8:mf5`=83;pD>:7;|la55<728qC?964}o`25?6=9rB8855rnc31>5<6sA9?46sab0194?7|@:>37p`m1583>4}O;=20qcl>5;295~N4<11vbo?9:182M5302wen<950;3xL62?3tdi=54?:0yK71><ugh:57>51zJ00==zfk;j6=4>{I17<>{ij8h1<7?tH26;?xhe9j0;6<uG35:8ykd6l3:1=vF<499~jg7b290:wE=;8:mf4`=83;pD>:7;|la65<728qC?964}o`15?6=9rB8855rnc01>5<6sA9?46sab3194?7|@:>37p`m2583>4}O;=20qcl=5;295~N4<11vbo<9:182M5302wen?950;3xL62?3tdi>54?:0yK71><ugh957>51zJ00==zfk8j6=4>{I17<>{ij;h1<7?tH26;?xhe:j0;6<uG35:8ykd5l3:1=vF<499~jg4b290:wE=;8:mf7`=83;pD>:7;|la75<728qC?964}o`05?6=9rB8855rnc11>5<6sA9?46sab2194?7|@:>37p`m3583>4}O;=20qcl<5;295~N4<11vbo=9:182M5302wen>950;3xL62?3tdi?54?:0yK71><ugh857>51zJ00==zfk9j6=4>{I17<>{ij:h1<7?tH26;?xhe;j0;6<uG35:8ykd4l3:1=vF<499~jg5b290:wE=;8:mf6`=83;pD>:7;|la05<728qC?964}o`75?6=9rB8855rnc61>5<6sA9?46sab5194?7|@:>37p`m4583>4}O;=20qcl;5;295~N4<11vbo:9:182M5302wen9950;3xL62?3tdi854?:0yK71><ugh?57>51zJ00==zfk>j6=4>{I17<>{ij=h1<7?tH26;?xhe<j0;6<uG35:8ykd3l3:1=vF<499~jg2b290:wE=;8:mf1`=83;pD>:7;|la15<728qC?964}o`65?6=9rB8855rnc71>5<6sA9?46sab4194?7|@:>37p`m5583>4}O;=20qcl:5;295~N4<11vbo;9:182M5302wen8950;3xL62?3tdi954?:0yK71><ugh>57>51zJ00==zfk?j6=4>{I17<>{ij<h1<7?tH26;?xhe=j0;6<uG35:8ykd2l3:1=vF<499~jg3b290:wE=;8:mf0`=83;pD>:7;|la25<728qC?964}o`55?6=9rB8855rnc41>5<6sA9?46sab7194?7|@:>37p`m6583>4}O;=20qcl95;295~N4<11vbo89:182M5302wen;950;3xL62?3tdi:54?:0yK71><ugh=57>51zJ00==zfk<j6=4>{I17<>{ij?h1<7?tH26;?xhe>j0;6<uG35:8ykd1l3:1=vF<499~jg0b290:wE=;8:mf3`=83;pD>:7;|la35<728qC?964}o`45?6=9rB8855rnc51>5<6sA9?46sab6194?7|@:>37p`m7583>4}O;=20qcl85;295~N4<11vbo99:182M5302wen:950;3xL62?3tdi;54?:0yK71><ugh<57>51zJ00==zfk=j6=4>{I17<>{ij>h1<7?tH26;?xhe?j0;6<uG35:8ykd0l3:1=vF<499~jg1b290:wE=;8:mf2`=83;pD>:7;|la<5<728qC?964}o`;5?6=9rB8855rnc:1>5<6sA9?46sab9194?7|@:>37p`m8583>4}O;=20qcl75;295~N4<11vbo69:182M5302wen5950;3xL62?3tdi454?:0yK71><ugh357>51zJ00==zfk2j6=4>{I17<>{ij1h1<7?tH26;?xhe0j0;6<uG35:8ykd?l3:1=vF<499~jg>b290:wE=;8:mf=`=83;pD>:7;|la=5<728qC?964}o`:5?6=9rB8855rnc;1>5<6sA9?46sab8194?7|@:>37p`m9583>4}O;=20qcl65;295~N4<11vbo79:182M5302wen4950;3xL62?3tdi554?:0yK71><ugh257>51zJ00==zfk3j6=4>{I17<>{ij0h1<7?tH26;?xhe1j0;6<uG35:8ykd>l3:1=vF<499~jg?b290:wE=;8:mf<`=83;pD>:7;|lae5<728qC?964}o`b5?6=9rB8855rncc1>5<6sA9?46sab`194?7|@:>37p`ma583>4}O;=20qcln5;295~N4<11vboo9:182M5302wenl950;3xL62?3tdim54?:0yK71><ughj57>51zJ00==zfkkj6=4>{I17<>{ijhh1<7?tH26;?xheij0;6<uG35:8ykdfl3:1=vF<499~jggb290:wE=;8:mfd`=83;pD>:7;|laf5<728qC?964}o`a5?6=9rB8855rnc`1>5<6sA9?46sabc194?7|@:>37p`mb583>4}O;=20qclm5;295~N4<11vbol9:182M5302weno950;3xL62?3tdin54?:0yK71><ughi57>51zJ00==zfkhj6=4>{I17<>{ijkh1<7?tH26;?xhejj0;6<uG35:8ykdel3:1=vF<499~jgdb290:wE=;8:mfg`=83;pD>:7;|lag5<728qC?964}o``5?6=9rB8855rnca1>5<6sA9?46sabb194?7|@:>37p`mc583>4}O;=20qcll5;295~N4<11vbom9:182M5302wenn950;3xL62?3tdio54?:0yK71><ughh57>51zJ00==zfkij6=4>{I17<>{ijjh1<7?tH26;?xhekj0;6<uG35:8ykddl3:1=vF<499~jgeb290:wE=;8:mff`=83;pD>:7;|la`5<728qC?964}o`g5?6=9rB8855rncf1>5<6sA9?46sabe194?7|@:>37p`md583>4}O;=20qclk5;295~N4<11vboj9:182M5302weni950;3xL62?3tdih54?:0yK71><ugho57>51zJ00==zfknj6=4>{I17<>{ijmh1<7?tH26;?xhelj0;6<uG35:8ykdcl3:1=vF<499~jgbb290:wE=;8:mfa`=83;pD>:7;|laa5<728qC?964}o`f5?6=9rB8855rncg1>5<6sA9?46sabd194?7|@:>37p`me583>4}O;=20qclj5;295~N4<11vbok9:182M5302wenh950;3xL62?3tdii54?:0yK71><ughn57>51zJ00==zfkoj6=4>{I17<>{ijlh1<7?tH26;?xhemj0;6<uG35:8ykdbl3:1=vF<499~jgcb290:wE=;8:mf``=83;pD>:7;|lab5<728qC?964}o`e5?6=9rB8855rncd1>5<6sA9?46sabg194?7|@:>37p`mf583>4}O;=20qcli5;295~N4<11vboh9:182M5302wenk950;3xL62?3tdij54?:0yK71><ughm57>51zJ00==zfklj6=4>{I17<>{ijoh1<7?tH26;?xhenj0;6<uG35:8ykdal3:1=vF<499~jg`b290:wE=;8:mfc`=83;pD>:7;|l`45<728qC?964}oa35?6=9rB8855rnb21>5<6sA9?46sac1194?7|@:>37p`l0583>4}O;=20qcm?5;295~N4<11vbn>9:182M5302weo=950;3xL62?3tdh<54?:0yK71><ugi;57>51zJ00==zfj:j6=4>{I17<>{ik9h1<7?tH26;?xhd8j0;6<uG35:8yke7l3:1=vF<499~jf6b290:wE=;8:mg5`=83;pD>:7;|l`55<728qC?964}oa25?6=9rB8855rnb31>5<6sA9?46sac0194?7|@:>37p`l1583>4}O;=20qcm>5;295~N4<11vbn?9:182M5302weo<950;3xL62?3tdh=54?:0yK71><ugi:57>51zJ00==zfj;j6=4>{I17<>{ik8h1<7?tH26;?xhd9j0;6<uG35:8yke6l3:1=vF<499~jf7b290:wE=;8:mg4`=83;pD>:7;|l`65<728qC?964}oa15?6=9rB8855rnb01>5<6sA9?46sac3194?7|@:>37p`l2583>4}O;=20qcm=5;295~N4<11vbn<9:182M5302weo?950;3xL62?3tdh>54?:0yK71><ugi957>51zJ00==zfj8j6=4>{I17<>{ik;h1<7?tH26;?xhd:j0;6<uG35:8yke5l3:1=vF<499~jf4b290:wE=;8:mg7`=83;pD>:7;|l`75<728qC?964}oa05?6=9rB8855rnb11>5<6sA9?46sac2194?7|@:>37p`l3583>4}O;=20qcm<5;295~N4<11vbn=9:182M5302weo>950;3xL62?3tdh?54?:0yK71><ugi857>51zJ00==zfj9j6=4>{I17<>{ik:h1<7?tH26;?xhd;j0;6<uG35:8yke4l3:1=vF<499~yx{GHJqn=546ee65e44zHIHp<pNOPzCD \ No newline at end of file
diff --git a/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.v b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.v
new file mode 100644
index 000000000..68a8caaf6
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.v
@@ -0,0 +1,3839 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved.
+////////////////////////////////////////////////////////////////////////////////
+// ____ ____
+// / /\/ /
+// /___/ \ / Vendor: Xilinx
+// \ \ \/ Version: M.63c
+// \ \ Application: netgen
+// / / Filename: fifo_xlnx_32x36_2clk.v
+// /___/ /\ Timestamp: Fri Oct 15 00:50:08 2010
+// \ \ / \
+// \___\/\___\
+//
+// Command : -intstyle ise -w -sim -ofmt verilog /tmp/_cg/fifo_xlnx_32x36_2clk.ngc /tmp/_cg/fifo_xlnx_32x36_2clk.v
+// Device : 3s2000fg456-5
+// Input file : /tmp/_cg/fifo_xlnx_32x36_2clk.ngc
+// Output file : /tmp/_cg/fifo_xlnx_32x36_2clk.v
+// # of Modules : 1
+// Design Name : fifo_xlnx_32x36_2clk
+// Xilinx : /opt/Xilinx/12.2/ISE_DS/ISE/
+//
+// Purpose:
+// This verilog netlist is a verification model and uses simulation
+// primitives which may not represent the true implementation of the
+// device, however the netlist is functionally correct and should not
+// be modified. This file cannot be synthesized and should only be used
+// with supported simulation tools.
+//
+// Reference:
+// Command Line Tools User Guide, Chapter 23 and Synthesis and Simulation Design Guide, Chapter 6
+//
+////////////////////////////////////////////////////////////////////////////////
+
+`timescale 1 ns/1 ps
+
+module fifo_xlnx_32x36_2clk (
+ rd_en, almost_full, prog_full, wr_en, full, empty, wr_clk, rst, rd_clk, dout, din
+)/* synthesis syn_black_box syn_noprune=1 */;
+ input rd_en;
+ output almost_full;
+ output prog_full;
+ input wr_en;
+ output full;
+ output empty;
+ input wr_clk;
+ input rst;
+ input rd_clk;
+ output [35 : 0] dout;
+ input [35 : 0] din;
+
+ // synthesis translate_off
+
+ wire \BU2/U0/grf.rf/gl0.wr/gwas.wsts/c2/dout_i62_392 ;
+ wire \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000156_391 ;
+ wire \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux000079_390 ;
+ wire \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux000063_389 ;
+ wire \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux000027_388 ;
+ wire \BU2/U0/grf.rf/gl0.wr/gwas.wsts/c2/dout_i26_387 ;
+ wire \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux000069_386 ;
+ wire \BU2/U0/grf.rf/gl0.wr/gwas.wsts/comp2 ;
+ wire \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux000067_384 ;
+ wire \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux000026_383 ;
+ wire \BU2/U0/grf.rf/gl0.wr/wpntr/count_not0001 ;
+ wire \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or000063_381 ;
+ wire \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000158_380 ;
+ wire \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000115_379 ;
+ wire \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or000062_378 ;
+ wire \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or000026_377 ;
+ wire \BU2/U0/grf.rf/gl0.rd/rpntr/count_not0001 ;
+ wire \BU2/U0/grf.rf/gl0.rd/rpntr/N11 ;
+ wire \BU2/U0/grf.rf/gl0.wr/wpntr/N11 ;
+ wire \BU2/N16 ;
+ wire \BU2/N14 ;
+ wire \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux0000 ;
+ wire \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_fb_i_370 ;
+ wire \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux0000 ;
+ wire \BU2/U0/grf.rf/mem/dout_i_not0001 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N147 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N145 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N143 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N141 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N137 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N135 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N139 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N133 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N131 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N129 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N127 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N123 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N121 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N125 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N119 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N117 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N115 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N113 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N109 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N107 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N111 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N103 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N101 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N105 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N97 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N95 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N99 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N93 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N91 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N89 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N87 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N83 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N81 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N85 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N79 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N77 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N75 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N73 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N69 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N67 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N71 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N65 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N63 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N61 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N59 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N55 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N53 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N57 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N51 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N49 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N47 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N45 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N41 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N39 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N43 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N37 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N35 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N33 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N31 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N27 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N25 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N29 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N23 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N21 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N19 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N17 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N13 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N11 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N15 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N9 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N7 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/N5 ;
+ wire \BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ;
+ wire \BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count2 ;
+ wire \BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count ;
+ wire \BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count1 ;
+ wire \BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count3 ;
+ wire \BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count4 ;
+ wire \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/prog_full_i_mux0003 ;
+ wire \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/prog_full_i_not0001 ;
+ wire \BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ;
+ wire \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/empty_fwft_fb_176 ;
+ wire \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/empty_fwft_i_mux0000 ;
+ wire \BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count2 ;
+ wire \BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count ;
+ wire \BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count1 ;
+ wire \BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count3 ;
+ wire \BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count4 ;
+ wire \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_xor0003 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_xor0002 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_xor0001 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_xor0000 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_xor0003 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_xor0002 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_xor0001 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_xor0000 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor0003_120 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor0002 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor0001 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor0000 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor0003_110 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor0002 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor0001 ;
+ wire \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor0000 ;
+ wire \BU2/U0/grf.rf/rstblk/wr_rst_comb ;
+ wire \BU2/U0/grf.rf/rstblk/rd_rst_comb ;
+ wire \BU2/U0/grf.rf/rstblk/wr_rst_asreg_95 ;
+ wire \BU2/U0/grf.rf/rstblk/rd_rst_asreg_94 ;
+ wire \BU2/U0/grf.rf/rstblk/rst_d1_93 ;
+ wire \BU2/U0/grf.rf/rstblk/wr_rst_asreg_d2_92 ;
+ wire \BU2/U0/grf.rf/rstblk/wr_rst_asreg_d1_91 ;
+ wire \BU2/U0/grf.rf/rstblk/rd_rst_asreg_d2_90 ;
+ wire \BU2/U0/grf.rf/rstblk/rd_rst_asreg_d1_89 ;
+ wire \BU2/U0/grf.rf/rstblk/rst_d2_88 ;
+ wire \BU2/U0/grf.rf/rstblk/RST_FULL_GEN_87 ;
+ wire \BU2/U0/grf.rf/rstblk/rst_d3_86 ;
+ wire \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_85 ;
+ wire \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000 ;
+ wire \BU2/N1 ;
+ wire NLW_VCC_P_UNCONNECTED;
+ wire NLW_GND_G_UNCONNECTED;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM72_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM71_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM70_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM69_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM67_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM66_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM68_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM65_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM64_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM63_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM62_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM60_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM59_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM61_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM58_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM57_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM56_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM55_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM53_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM52_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM54_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM50_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM49_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM51_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM47_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM46_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM48_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM45_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM44_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM43_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM42_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM40_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM39_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM41_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM38_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM37_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM36_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM35_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM33_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM32_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM34_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM31_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM30_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM29_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM28_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM26_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM25_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM27_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM24_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM23_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM22_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM21_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM19_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM18_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM20_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM17_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM16_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM15_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM14_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM12_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM11_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM13_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM10_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM9_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM8_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM7_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM5_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM4_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM6_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM3_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM2_SPO_UNCONNECTED ;
+ wire \NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM1_SPO_UNCONNECTED ;
+ wire [35 : 0] din_2;
+ wire [35 : 0] dout_3;
+ wire [35 : 0] \BU2/U0/grf.rf/mem/gdm.dm/dout_i ;
+ wire [35 : 0] \BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 ;
+ wire [4 : 0] \BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 ;
+ wire [4 : 0] \BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 ;
+ wire [4 : 0] \BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 ;
+ wire [4 : 0] \BU2/U0/grf.rf/gl0.wr/wpntr/count ;
+ wire [5 : 4] \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/diff_pntr_pad ;
+ wire [5 : 1] \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut ;
+ wire [4 : 0] \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy ;
+ wire [5 : 4] \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/diff_pntr_pad_add0000 ;
+ wire [1 : 0] \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state ;
+ wire [1 : 0] \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state_mux0001 ;
+ wire [4 : 0] \BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 ;
+ wire [4 : 0] \BU2/U0/grf.rf/gl0.rd/rpntr/count ;
+ wire [4 : 0] \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc ;
+ wire [4 : 0] \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc ;
+ wire [4 : 0] \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 ;
+ wire [4 : 0] \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg ;
+ wire [4 : 0] \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 ;
+ wire [4 : 0] \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg ;
+ wire [4 : 0] \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin ;
+ wire [4 : 0] \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin ;
+ wire [1 : 0] \BU2/U0/grf.rf/rstblk/wr_rst_reg ;
+ wire [2 : 0] \BU2/U0/grf.rf/rstblk/rd_rst_reg ;
+ wire [0 : 0] \BU2/rd_data_count ;
+ assign
+ dout[35] = dout_3[35],
+ dout[34] = dout_3[34],
+ dout[33] = dout_3[33],
+ dout[32] = dout_3[32],
+ dout[31] = dout_3[31],
+ dout[30] = dout_3[30],
+ dout[29] = dout_3[29],
+ dout[28] = dout_3[28],
+ dout[27] = dout_3[27],
+ dout[26] = dout_3[26],
+ dout[25] = dout_3[25],
+ dout[24] = dout_3[24],
+ dout[23] = dout_3[23],
+ dout[22] = dout_3[22],
+ dout[21] = dout_3[21],
+ dout[20] = dout_3[20],
+ dout[19] = dout_3[19],
+ dout[18] = dout_3[18],
+ dout[17] = dout_3[17],
+ dout[16] = dout_3[16],
+ dout[15] = dout_3[15],
+ dout[14] = dout_3[14],
+ dout[13] = dout_3[13],
+ dout[12] = dout_3[12],
+ dout[11] = dout_3[11],
+ dout[10] = dout_3[10],
+ dout[9] = dout_3[9],
+ dout[8] = dout_3[8],
+ dout[7] = dout_3[7],
+ dout[6] = dout_3[6],
+ dout[5] = dout_3[5],
+ dout[4] = dout_3[4],
+ dout[3] = dout_3[3],
+ dout[2] = dout_3[2],
+ dout[1] = dout_3[1],
+ dout[0] = dout_3[0],
+ din_2[35] = din[35],
+ din_2[34] = din[34],
+ din_2[33] = din[33],
+ din_2[32] = din[32],
+ din_2[31] = din[31],
+ din_2[30] = din[30],
+ din_2[29] = din[29],
+ din_2[28] = din[28],
+ din_2[27] = din[27],
+ din_2[26] = din[26],
+ din_2[25] = din[25],
+ din_2[24] = din[24],
+ din_2[23] = din[23],
+ din_2[22] = din[22],
+ din_2[21] = din[21],
+ din_2[20] = din[20],
+ din_2[19] = din[19],
+ din_2[18] = din[18],
+ din_2[17] = din[17],
+ din_2[16] = din[16],
+ din_2[15] = din[15],
+ din_2[14] = din[14],
+ din_2[13] = din[13],
+ din_2[12] = din[12],
+ din_2[11] = din[11],
+ din_2[10] = din[10],
+ din_2[9] = din[9],
+ din_2[8] = din[8],
+ din_2[7] = din[7],
+ din_2[6] = din[6],
+ din_2[5] = din[5],
+ din_2[4] = din[4],
+ din_2[3] = din[3],
+ din_2[2] = din[2],
+ din_2[1] = din[1],
+ din_2[0] = din[0];
+ VCC VCC_0 (
+ .P(NLW_VCC_P_UNCONNECTED)
+ );
+ GND GND_1 (
+ .G(NLW_GND_G_UNCONNECTED)
+ );
+ LUT3_L #(
+ .INIT ( 8'h90 ))
+ \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or000063 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [0]),
+ .I1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .I2(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or000062_378 ),
+ .LO(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or000063_381 )
+ );
+ LUT4_L #(
+ .INIT ( 16'h9000 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux000079 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [0]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [0]),
+ .I2(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux000063_389 ),
+ .I3(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux000027_388 ),
+ .LO(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux000079_390 )
+ );
+ LUT4_L #(
+ .INIT ( 16'h9000 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux000069 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [0]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count [0]),
+ .I2(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux000067_384 ),
+ .I3(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .LO(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux000069_386 )
+ );
+ LUT4_L #(
+ .INIT ( 16'h8421 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/c2/dout_i62 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [2]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [3]),
+ .I2(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [2]),
+ .I3(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [3]),
+ .LO(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/c2/dout_i62_392 )
+ );
+ LUT4_L #(
+ .INIT ( 16'h8241 ))
+ \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000156 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [1]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [2]),
+ .I2(\BU2/U0/grf.rf/gl0.rd/rpntr/count [2]),
+ .I3(\BU2/U0/grf.rf/gl0.rd/rpntr/count [1]),
+ .LO(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000156_391 )
+ );
+ LUT3_L #(
+ .INIT ( 8'h7F ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count_xor<3>111 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count [0]),
+ .I1(\BU2/U0/grf.rf/gl0.rd/rpntr/count [1]),
+ .I2(\BU2/U0/grf.rf/gl0.rd/rpntr/count [2]),
+ .LO(\BU2/U0/grf.rf/gl0.rd/rpntr/N11 )
+ );
+ LUT3_L #(
+ .INIT ( 8'h7F ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count_xor<3>111 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count [0]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count [1]),
+ .I2(\BU2/U0/grf.rf/gl0.wr/wpntr/count [2]),
+ .LO(\BU2/U0/grf.rf/gl0.wr/wpntr/N11 )
+ );
+ LUT2_L #(
+ .INIT ( 4'h6 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor0003_SW0 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [3]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [2]),
+ .LO(\BU2/N16 )
+ );
+ LUT2_L #(
+ .INIT ( 4'h6 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor0003_SW0 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [3]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [2]),
+ .LO(\BU2/N14 )
+ );
+ INV \BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count_xor<0>11_INV_0 (
+ .I(\BU2/U0/grf.rf/gl0.rd/rpntr/count [0]),
+ .O(\BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count )
+ );
+ INV \BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count_xor<0>11_INV_0 (
+ .I(\BU2/U0/grf.rf/gl0.wr/wpntr/count [0]),
+ .O(\BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count )
+ );
+ LUT2 #(
+ .INIT ( 4'h2 ))
+ \BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_1 (
+ .I0(wr_en),
+ .I1(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_fb_i_370 ),
+ .O(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 )
+ );
+ LUT4 #(
+ .INIT ( 16'h2333 ))
+ \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_1 (
+ .I0(rd_en),
+ .I1(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_85 ),
+ .I2(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state [1]),
+ .I3(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state [0]),
+ .O(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 )
+ );
+ LUT4 #(
+ .INIT ( 16'h6AAA ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count_xor<3>12 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count [3]),
+ .I1(\BU2/U0/grf.rf/gl0.rd/rpntr/count [0]),
+ .I2(\BU2/U0/grf.rf/gl0.rd/rpntr/count [1]),
+ .I3(\BU2/U0/grf.rf/gl0.rd/rpntr/count [2]),
+ .O(\BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count3 )
+ );
+ LUT4 #(
+ .INIT ( 16'h6AAA ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count_xor<3>12 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count [3]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count [0]),
+ .I2(\BU2/U0/grf.rf/gl0.wr/wpntr/count [1]),
+ .I3(\BU2/U0/grf.rf/gl0.wr/wpntr/count [2]),
+ .O(\BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count3 )
+ );
+ LUT3 #(
+ .INIT ( 8'h08 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1 (
+ .I0(wr_en),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [4]),
+ .I2(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_fb_i_370 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 )
+ );
+ LUT3 #(
+ .INIT ( 8'h10 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/write_ctrl (
+ .I0(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_fb_i_370 ),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [4]),
+ .I2(wr_en),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 )
+ );
+ LUT2 #(
+ .INIT ( 4'h9 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut<5> (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [4]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [4]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut [5])
+ );
+ LUT4 #(
+ .INIT ( 16'h9000 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/c2/dout_i78 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [0]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [0]),
+ .I2(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/c2/dout_i62_392 ),
+ .I3(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/c2/dout_i26_387 ),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/comp2 )
+ );
+ LUT4 #(
+ .INIT ( 16'h9000 ))
+ \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000158 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [0]),
+ .I1(\BU2/U0/grf.rf/gl0.rd/rpntr/count [0]),
+ .I2(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000156_391 ),
+ .I3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_not0001 ),
+ .O(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000158_380 )
+ );
+ LUT2 #(
+ .INIT ( 4'h9 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut<4> (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [3]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [3]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut [4])
+ );
+ LUT2 #(
+ .INIT ( 4'h9 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut<3> (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [2]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [2]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut [3])
+ );
+ LUT2 #(
+ .INIT ( 4'h9 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut<2> (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [1]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [1]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut [2])
+ );
+ LUT2 #(
+ .INIT ( 4'h9 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut<1> (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [0]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [0]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut [1])
+ );
+ LUT4 #(
+ .INIT ( 16'h5450 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux0000105 (
+ .I0(\BU2/U0/grf.rf/rstblk/RST_FULL_GEN_87 ),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_not0001 ),
+ .I2(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux000079_390 ),
+ .I3(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/comp2 ),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux0000 )
+ );
+ LUT4 #(
+ .INIT ( 16'h9009 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux000063 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [3]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [3]),
+ .I2(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [2]),
+ .I3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [2]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux000063_389 )
+ );
+ LUT4 #(
+ .INIT ( 16'h9009 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux000027 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [4]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [4]),
+ .I2(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [1]),
+ .I3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [1]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux000027_388 )
+ );
+ LUT4 #(
+ .INIT ( 16'h8421 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/c2/dout_i26 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [1]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [4]),
+ .I2(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [1]),
+ .I3(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [4]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/c2/dout_i26_387 )
+ );
+ LUT4 #(
+ .INIT ( 16'h5450 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux0000107 (
+ .I0(\BU2/U0/grf.rf/rstblk/RST_FULL_GEN_87 ),
+ .I1(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux000026_383 ),
+ .I2(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/comp2 ),
+ .I3(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux000069_386 ),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux0000 )
+ );
+ LUT4 #(
+ .INIT ( 16'h9009 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux000067 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [2]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count [2]),
+ .I2(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [1]),
+ .I3(\BU2/U0/grf.rf/gl0.wr/wpntr/count [1]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux000067_384 )
+ );
+ LUT4 #(
+ .INIT ( 16'h9009 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux000026 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [4]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count [4]),
+ .I2(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [3]),
+ .I3(\BU2/U0/grf.rf/gl0.wr/wpntr/count [3]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux000026_383 )
+ );
+ LUT2 #(
+ .INIT ( 4'h2 ))
+ \BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1 (
+ .I0(wr_en),
+ .I1(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_fb_i_370 ),
+ .O(\BU2/U0/grf.rf/gl0.wr/wpntr/count_not0001 )
+ );
+ LUT4 #(
+ .INIT ( 16'hECA0 ))
+ \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000183 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000115_379 ),
+ .I1(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or000026_377 ),
+ .I2(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000158_380 ),
+ .I3(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or000063_381 ),
+ .O(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000 )
+ );
+ LUT4 #(
+ .INIT ( 16'h9009 ))
+ \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000115 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count [4]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [4]),
+ .I2(\BU2/U0/grf.rf/gl0.rd/rpntr/count [3]),
+ .I3(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [3]),
+ .O(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000115_379 )
+ );
+ LUT4 #(
+ .INIT ( 16'h8421 ))
+ \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or000062 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [2]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [3]),
+ .I2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .I3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .O(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or000062_378 )
+ );
+ LUT4 #(
+ .INIT ( 16'h8241 ))
+ \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or000026 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [1]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [4]),
+ .I2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .O(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or000026_377 )
+ );
+ LUT4 #(
+ .INIT ( 16'h2333 ))
+ \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21 (
+ .I0(rd_en),
+ .I1(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_85 ),
+ .I2(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state [1]),
+ .I3(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state [0]),
+ .O(\BU2/U0/grf.rf/gl0.rd/rpntr/count_not0001 )
+ );
+ LUT3 #(
+ .INIT ( 8'hA6 ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count_xor<4>11 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count [4]),
+ .I1(\BU2/U0/grf.rf/gl0.rd/rpntr/count [3]),
+ .I2(\BU2/U0/grf.rf/gl0.rd/rpntr/N11 ),
+ .O(\BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count4 )
+ );
+ LUT3 #(
+ .INIT ( 8'hA6 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count_xor<4>11 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count [4]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count [3]),
+ .I2(\BU2/U0/grf.rf/gl0.wr/wpntr/N11 ),
+ .O(\BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count4 )
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX11 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N5 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N7 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [0])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX1011 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N45 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N47 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [10])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX1111 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N9 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N11 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [1])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX11111 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N49 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N51 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [11])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX1211 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N53 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N55 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [12])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX1311 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N57 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N59 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [13])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX1411 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N61 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N63 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [14])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX1511 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N65 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N67 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [15])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX1611 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N69 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N71 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [16])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX1711 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N73 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N75 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [17])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX1811 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N77 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N79 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [18])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX1911 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N81 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N83 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [19])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX2011 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N85 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N87 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [20])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX2111 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N13 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N15 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [2])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX21111 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N89 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N91 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [21])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX2211 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N93 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N95 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [22])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX2311 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N97 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N99 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [23])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX2411 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N101 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N103 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [24])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX2511 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N105 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N107 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [25])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX2611 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N109 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N111 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [26])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX2711 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N113 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N115 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [27])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX2811 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N117 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N119 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [28])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX2911 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N121 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N123 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [29])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX3011 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N125 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N127 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [30])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX3111 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N17 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N19 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [3])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX31111 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N129 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N131 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [31])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX3211 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N133 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N135 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [32])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX3311 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N137 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N139 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [33])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX3411 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N141 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N143 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [34])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX3511 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N145 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N147 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [35])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX411 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N21 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N23 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [4])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX511 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N25 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N27 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [5])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX611 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N29 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N31 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [6])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX711 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N33 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N35 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [7])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX811 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N37 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N39 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [8])
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/inst_LPM_MUX911 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/mem/gdm.dm/N41 ),
+ .I2(\BU2/U0/grf.rf/mem/gdm.dm/N43 ),
+ .O(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [9])
+ );
+ LUT4 #(
+ .INIT ( 16'h6996 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor0003 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [1]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [0]),
+ .I2(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [4]),
+ .I3(\BU2/N16 ),
+ .O(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor0003_110 )
+ );
+ LUT4 #(
+ .INIT ( 16'h6996 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor0003 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [1]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [0]),
+ .I2(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [4]),
+ .I3(\BU2/N14 ),
+ .O(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor0003_120 )
+ );
+ LUT3 #(
+ .INIT ( 8'hA2 ))
+ \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_REGOUT_EN11 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state [1]),
+ .I1(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state [0]),
+ .I2(rd_en),
+ .O(\BU2/U0/grf.rf/mem/dout_i_not0001 )
+ );
+ LUT2 #(
+ .INIT ( 4'hD ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_not00011 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_fb_i_370 ),
+ .I1(\BU2/U0/grf.rf/rstblk/RST_FULL_GEN_87 ),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/prog_full_i_not0001 )
+ );
+ LUT4 #(
+ .INIT ( 16'h8E8A ))
+ \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/empty_fwft_i_mux00001 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/empty_fwft_fb_176 ),
+ .I1(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state [0]),
+ .I2(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state [1]),
+ .I3(rd_en),
+ .O(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/empty_fwft_i_mux0000 )
+ );
+ LUT4 #(
+ .INIT ( 16'h6996 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor00021 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [2]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [1]),
+ .I2(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [4]),
+ .I3(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [3]),
+ .O(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor0002 )
+ );
+ LUT4 #(
+ .INIT ( 16'h6996 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor00021 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [2]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [1]),
+ .I2(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [4]),
+ .I3(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [3]),
+ .O(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor0002 )
+ );
+ LUT4 #(
+ .INIT ( 16'h40FF ))
+ \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state_mux0001<0>1 (
+ .I0(rd_en),
+ .I1(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state [0]),
+ .I2(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state [1]),
+ .I3(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_85 ),
+ .O(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state_mux0001 [0])
+ );
+ LUT3 #(
+ .INIT ( 8'h6A ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count_xor<2>11 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count [2]),
+ .I1(\BU2/U0/grf.rf/gl0.rd/rpntr/count [0]),
+ .I2(\BU2/U0/grf.rf/gl0.rd/rpntr/count [1]),
+ .O(\BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count2 )
+ );
+ LUT3 #(
+ .INIT ( 8'h6A ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count_xor<2>11 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count [2]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count [0]),
+ .I2(\BU2/U0/grf.rf/gl0.wr/wpntr/count [1]),
+ .O(\BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count2 )
+ );
+ LUT3 #(
+ .INIT ( 8'h96 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor00011 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [4]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [3]),
+ .I2(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [2]),
+ .O(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor0001 )
+ );
+ LUT3 #(
+ .INIT ( 8'h96 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor00011 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [4]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [3]),
+ .I2(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [2]),
+ .O(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor0001 )
+ );
+ LUT3 #(
+ .INIT ( 8'hF2 ))
+ \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state_mux0001<1>1 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state [0]),
+ .I1(rd_en),
+ .I2(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state [1]),
+ .O(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state_mux0001 [1])
+ );
+ LUT3 #(
+ .INIT ( 8'h08 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/prog_full_i_mux00031 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/diff_pntr_pad [4]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/diff_pntr_pad [5]),
+ .I2(\BU2/U0/grf.rf/rstblk/RST_FULL_GEN_87 ),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/prog_full_i_mux0003 )
+ );
+ LUT2 #(
+ .INIT ( 4'h6 ))
+ \BU2/U0/grf.rf/gcx.clkx/Mxor_rd_pntr_gc_xor0000_Result1 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .I1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .O(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_xor0000 )
+ );
+ LUT2 #(
+ .INIT ( 4'h6 ))
+ \BU2/U0/grf.rf/gcx.clkx/Mxor_rd_pntr_gc_xor0001_Result1 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .I1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .O(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_xor0001 )
+ );
+ LUT2 #(
+ .INIT ( 4'h6 ))
+ \BU2/U0/grf.rf/gcx.clkx/Mxor_rd_pntr_gc_xor0002_Result1 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .I1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .O(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_xor0002 )
+ );
+ LUT2 #(
+ .INIT ( 4'h6 ))
+ \BU2/U0/grf.rf/gcx.clkx/Mxor_rd_pntr_gc_xor0003_Result1 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .I1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .O(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_xor0003 )
+ );
+ LUT2 #(
+ .INIT ( 4'h6 ))
+ \BU2/U0/grf.rf/gcx.clkx/Mxor_wr_pntr_gc_xor0000_Result1 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [4]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .O(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_xor0000 )
+ );
+ LUT2 #(
+ .INIT ( 4'h6 ))
+ \BU2/U0/grf.rf/gcx.clkx/Mxor_wr_pntr_gc_xor0001_Result1 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .O(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_xor0001 )
+ );
+ LUT2 #(
+ .INIT ( 4'h6 ))
+ \BU2/U0/grf.rf/gcx.clkx/Mxor_wr_pntr_gc_xor0002_Result1 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .O(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_xor0002 )
+ );
+ LUT2 #(
+ .INIT ( 4'h6 ))
+ \BU2/U0/grf.rf/gcx.clkx/Mxor_wr_pntr_gc_xor0003_Result1 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .O(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_xor0003 )
+ );
+ LUT2 #(
+ .INIT ( 4'h6 ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count_xor<1>11 (
+ .I0(\BU2/U0/grf.rf/gl0.rd/rpntr/count [0]),
+ .I1(\BU2/U0/grf.rf/gl0.rd/rpntr/count [1]),
+ .O(\BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count1 )
+ );
+ LUT2 #(
+ .INIT ( 4'h6 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count_xor<1>11 (
+ .I0(\BU2/U0/grf.rf/gl0.wr/wpntr/count [1]),
+ .I1(\BU2/U0/grf.rf/gl0.wr/wpntr/count [0]),
+ .O(\BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count1 )
+ );
+ LUT2 #(
+ .INIT ( 4'h6 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor00001 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [3]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [4]),
+ .O(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor0000 )
+ );
+ LUT2 #(
+ .INIT ( 4'h6 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor00001 (
+ .I0(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [3]),
+ .I1(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [4]),
+ .O(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor0000 )
+ );
+ LUT2 #(
+ .INIT ( 4'h4 ))
+ \BU2/U0/grf.rf/rstblk/rd_rst_comb1 (
+ .I0(\BU2/U0/grf.rf/rstblk/rd_rst_asreg_d2_90 ),
+ .I1(\BU2/U0/grf.rf/rstblk/rd_rst_asreg_94 ),
+ .O(\BU2/U0/grf.rf/rstblk/rd_rst_comb )
+ );
+ LUT2 #(
+ .INIT ( 4'h4 ))
+ \BU2/U0/grf.rf/rstblk/wr_rst_comb1 (
+ .I0(\BU2/U0/grf.rf/rstblk/wr_rst_asreg_d2_92 ),
+ .I1(\BU2/U0/grf.rf/rstblk/wr_rst_asreg_95 ),
+ .O(\BU2/U0/grf.rf/rstblk/wr_rst_comb )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/prog_full_i_not0001 ),
+ .D(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_almost_full_i_mux0000 ),
+ .PRE(\BU2/U0/grf.rf/rstblk/rst_d2_88 ),
+ .Q(almost_full)
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i (
+ .C(wr_clk),
+ .D(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux0000 ),
+ .PRE(\BU2/U0/grf.rf/rstblk/rst_d2_88 ),
+ .Q(full)
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_fb_i (
+ .C(wr_clk),
+ .D(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_i_mux0000 ),
+ .PRE(\BU2/U0/grf.rf/rstblk/rst_d2_88 ),
+ .Q(\BU2/U0/grf.rf/gl0.wr/gwas.wsts/ram_full_fb_i_370 )
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_0 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [0]),
+ .Q(dout_3[0])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_1 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [1]),
+ .Q(dout_3[1])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_2 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [2]),
+ .Q(dout_3[2])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_3 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [3]),
+ .Q(dout_3[3])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_4 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [4]),
+ .Q(dout_3[4])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_5 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [5]),
+ .Q(dout_3[5])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_6 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [6]),
+ .Q(dout_3[6])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_7 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [7]),
+ .Q(dout_3[7])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_8 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [8]),
+ .Q(dout_3[8])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_9 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [9]),
+ .Q(dout_3[9])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_10 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [10]),
+ .Q(dout_3[10])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_11 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [11]),
+ .Q(dout_3[11])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_12 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [12]),
+ .Q(dout_3[12])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_13 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [13]),
+ .Q(dout_3[13])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_14 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [14]),
+ .Q(dout_3[14])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_15 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [15]),
+ .Q(dout_3[15])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_16 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [16]),
+ .Q(dout_3[16])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_17 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [17]),
+ .Q(dout_3[17])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_18 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [18]),
+ .Q(dout_3[18])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_19 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [19]),
+ .Q(dout_3[19])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_20 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [20]),
+ .Q(dout_3[20])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_21 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [21]),
+ .Q(dout_3[21])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_22 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [22]),
+ .Q(dout_3[22])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_23 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [23]),
+ .Q(dout_3[23])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_24 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [24]),
+ .Q(dout_3[24])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_25 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [25]),
+ .Q(dout_3[25])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_26 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [26]),
+ .Q(dout_3[26])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_27 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [27]),
+ .Q(dout_3[27])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_28 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [28]),
+ .Q(dout_3[28])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_29 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [29]),
+ .Q(dout_3[29])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_30 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [30]),
+ .Q(dout_3[30])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_31 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [31]),
+ .Q(dout_3[31])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_32 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [32]),
+ .Q(dout_3[32])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_33 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [33]),
+ .Q(dout_3[33])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_34 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [34]),
+ .Q(dout_3[34])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/dout_i_35 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/mem/dout_i_not0001 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [35]),
+ .Q(dout_3[35])
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM72 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[35]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM72_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N147 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM71 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[35]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM71_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N145 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM70 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[34]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM70_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N143 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM69 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[34]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM69_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N141 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM67 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[33]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM67_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N137 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM66 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[32]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM66_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N135 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM68 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[33]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM68_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N139 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM65 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[32]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM65_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N133 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM64 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[31]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM64_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N131 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM63 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[31]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM63_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N129 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM62 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[30]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM62_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N127 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM60 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[29]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM60_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N123 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM59 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[29]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM59_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N121 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM61 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[30]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM61_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N125 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM58 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[28]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM58_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N119 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM57 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[28]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM57_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N117 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM56 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[27]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM56_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N115 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM55 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[27]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM55_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N113 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM53 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[26]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM53_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N109 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM52 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[25]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM52_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N107 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM54 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[26]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM54_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N111 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM50 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[24]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM50_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N103 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM49 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[24]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM49_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N101 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM51 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[25]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM51_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N105 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM47 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[23]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM47_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N97 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM46 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[22]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM46_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N95 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM48 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[23]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM48_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N99 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM45 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[22]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM45_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N93 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM44 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[21]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM44_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N91 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM43 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[21]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM43_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N89 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM42 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[20]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM42_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N87 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM40 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[19]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM40_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N83 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM39 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[19]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM39_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N81 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM41 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[20]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM41_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N85 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM38 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[18]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM38_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N79 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM37 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[18]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM37_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N77 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM36 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[17]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM36_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N75 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM35 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[17]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM35_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N73 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM33 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[16]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM33_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N69 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM32 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[15]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM32_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N67 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM34 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[16]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM34_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N71 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM31 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[15]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM31_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N65 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM30 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[14]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM30_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N63 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM29 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[14]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM29_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N61 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM28 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[13]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM28_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N59 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM26 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[12]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM26_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N55 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM25 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[12]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM25_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N53 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM27 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[13]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM27_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N57 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM24 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[11]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM24_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N51 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM23 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[11]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM23_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N49 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM22 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[10]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM22_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N47 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM21 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[10]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM21_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N45 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM19 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[9]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM19_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N41 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM18 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[8]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM18_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N39 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM20 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[9]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM20_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N43 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM17 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[8]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM17_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N37 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM16 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[7]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM16_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N35 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM15 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[7]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM15_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N33 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM14 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[6]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM14_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N31 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM12 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[5]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM12_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N27 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM11 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[5]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM11_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N25 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM13 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[6]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM13_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N29 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM10 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[4]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM10_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N23 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM9 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[4]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM9_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N21 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM8 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[3]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM8_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N19 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM7 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[3]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM7_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N17 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM5 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[2]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM5_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N13 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM4 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[1]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM4_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N11 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM6 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[2]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM6_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N15 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM3 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[1]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM3_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N9 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM2 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[0]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl1_296 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM2_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N7 )
+ );
+ RAM16X1D \BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM1 (
+ .A0(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0]),
+ .A1(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1]),
+ .A2(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2]),
+ .A3(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3]),
+ .D(din_2[0]),
+ .DPRA0(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0]),
+ .DPRA1(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1]),
+ .DPRA2(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2]),
+ .DPRA3(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3]),
+ .WCLK(wr_clk),
+ .WE(\BU2/U0/grf.rf/mem/gdm.dm/write_ctrl_294 ),
+ .SPO(\NLW_BU2/U0/grf.rf/mem/gdm.dm/Mram_RAM1_SPO_UNCONNECTED ),
+ .DPO(\BU2/U0/grf.rf/mem/gdm.dm/N5 )
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_35 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [35]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [35])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_34 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [34]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [34])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_33 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [33]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [33])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_32 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [32]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [32])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_31 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [31]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [31])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_30 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [30]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [30])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_29 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [29]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [29])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_28 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [28]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [28])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_27 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [27]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [27])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_26 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [26]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [26])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_25 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [25]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [25])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_24 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [24]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [24])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_23 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [23]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [23])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_22 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [22]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [22])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_21 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [21]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [21])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_20 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [20]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [20])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_19 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [19]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [19])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_18 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [18]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [18])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_17 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [17]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [17])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_16 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [16]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [16])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_15 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [15]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [15])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_14 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [14]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [14])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_13 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [13]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [13])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_12 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [12]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [12])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_11 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [11]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [11])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_10 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [10]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [10])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_9 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [9]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [9])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_8 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [8]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [8])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_7 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [7]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [7])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_6 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [6]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [6])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_5 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [5]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [5])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_4 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [4]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [4])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_3 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [3]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [3])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_2 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [2]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [2])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_1 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [1]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [1])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/mem/gdm.dm/dout_i_0 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/mem/gdm.dm/_varindex0000 [0]),
+ .Q(\BU2/U0/grf.rf/mem/gdm.dm/dout_i [0])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d3_0 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [0]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [0])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d3_1 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [1]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [1])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d3_2 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [2]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [2])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d3_3 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [3]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [3])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d3_4 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [4]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [4])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d2_4 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [4]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [4])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d2_3 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [3]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [3])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d2_1 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [1]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [1])
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d2_0 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [0]),
+ .PRE(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [0])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d2_2 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [2]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [2])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d1_4 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count [4]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [4])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d1_3 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count [3]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [3])
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d1_1 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count [1]),
+ .PRE(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [1])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d1_0 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count [0]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [0])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_d1_2 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count [2]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d1 [2])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_2 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count2 ),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count [2])
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_0 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count ),
+ .PRE(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count [0])
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_1 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count1 ),
+ .PRE(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count [1])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_3 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count3 ),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count [3])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/wpntr/count_4 (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/Mcount_count4 ),
+ .Q(\BU2/U0/grf.rf/gl0.wr/wpntr/count [4])
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/prog_full_i (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/prog_full_i_not0001 ),
+ .D(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/prog_full_i_mux0003 ),
+ .PRE(\BU2/U0/grf.rf/rstblk/rst_d2_88 ),
+ .Q(prog_full)
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/diff_pntr_pad_4 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/diff_pntr_pad_add0000 [4]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/diff_pntr_pad [4])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/diff_pntr_pad_5 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/diff_pntr_pad_add0000 [5]),
+ .Q(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/diff_pntr_pad [5])
+ );
+ MUXCY \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy<0> (
+ .CI(\BU2/N1 ),
+ .DI(\BU2/U0/grf.rf/gl0.wr/ram_wr_en_i1_197 ),
+ .S(\BU2/rd_data_count [0]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy [0])
+ );
+ MUXCY \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy<1> (
+ .CI(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy [0]),
+ .DI(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [0]),
+ .S(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut [1]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy [1])
+ );
+ MUXCY \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy<2> (
+ .CI(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy [1]),
+ .DI(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [1]),
+ .S(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut [2]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy [2])
+ );
+ MUXCY \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy<3> (
+ .CI(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy [2]),
+ .DI(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [2]),
+ .S(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut [3]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy [3])
+ );
+ MUXCY \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy<4> (
+ .CI(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy [3]),
+ .DI(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d2 [3]),
+ .S(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut [4]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy [4])
+ );
+ XORCY \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_xor<4> (
+ .CI(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy [3]),
+ .LI(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut [4]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/diff_pntr_pad_add0000 [4])
+ );
+ XORCY \BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_xor<5> (
+ .CI(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_cy [4]),
+ .LI(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/Madd_diff_pntr_pad_add0000_lut [5]),
+ .O(\BU2/U0/grf.rf/gl0.wr/gwas.gpf.wrpf/diff_pntr_pad_add0000 [5])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state_0 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .D(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state_mux0001 [1]),
+ .Q(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state [0])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state_1 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .D(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state_mux0001 [0]),
+ .Q(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/curr_fwft_state [1])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/empty_fwft_i (
+ .C(rd_clk),
+ .D(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/empty_fwft_i_mux0000 ),
+ .PRE(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .Q(empty)
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/gl0.rd/gr1.rfwft/empty_fwft_fb (
+ .C(rd_clk),
+ .D(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/empty_fwft_i_mux0000 ),
+ .PRE(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .Q(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/empty_fwft_fb_176 )
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/count_d1_0 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .D(\BU2/U0/grf.rf/gl0.rd/rpntr/count [0]),
+ .Q(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [0])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/count_d1_1 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .D(\BU2/U0/grf.rf/gl0.rd/rpntr/count [1]),
+ .Q(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [1])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/count_d1_2 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .D(\BU2/U0/grf.rf/gl0.rd/rpntr/count [2]),
+ .Q(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [2])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/count_d1_3 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .D(\BU2/U0/grf.rf/gl0.rd/rpntr/count [3]),
+ .Q(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [3])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/count_d1_4 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .D(\BU2/U0/grf.rf/gl0.rd/rpntr/count [4]),
+ .Q(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/count_2 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .D(\BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count2 ),
+ .Q(\BU2/U0/grf.rf/gl0.rd/rpntr/count [2])
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/count_0 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .D(\BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count ),
+ .PRE(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .Q(\BU2/U0/grf.rf/gl0.rd/rpntr/count [0])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/count_1 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .D(\BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count1 ),
+ .Q(\BU2/U0/grf.rf/gl0.rd/rpntr/count [1])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/count_3 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .D(\BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count3 ),
+ .Q(\BU2/U0/grf.rf/gl0.rd/rpntr/count [3])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gl0.rd/rpntr/count_4 (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/gl0.rd/gr1.rfwft/Mmux_RAM_RD_EN_FWFT21_160 ),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .D(\BU2/U0/grf.rf/gl0.rd/rpntr/Mcount_count4 ),
+ .Q(\BU2/U0/grf.rf/gl0.rd/rpntr/count [4])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_0 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_xor0003 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc [0])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_1 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_xor0002 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc [1])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_2 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_xor0001 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc [2])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_3 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_xor0000 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc [3])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_4 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gl0.wr/wpntr/count_d3 [4]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc [4])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_0 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_xor0003 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc [0])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_1 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_xor0002 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc [1])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_2 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_xor0001 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc [2])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_3 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_xor0000 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc [3])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_4 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gl0.rd/rpntr/count_d1 [4]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc [4])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_0 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc [0]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg [0])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_1 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc [1]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg [1])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_2 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc [2]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg [2])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_3 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc [3]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg [3])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_4 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc [4]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg [4])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_0 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc [0]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg [0])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_1 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc [1]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg [1])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_2 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc [2]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg [2])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_3 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc [3]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg [3])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_4 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc [4]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg [4])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1_0 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg [0]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [0])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1_1 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg [1]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [1])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1_2 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg [2]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [2])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1_3 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg [3]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [3])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1_4 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg [4]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [4])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1_0 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg [0]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [0])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1_1 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg [1]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [1])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1_2 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg [2]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [2])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1_3 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg [3]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [3])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1_4 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg [4]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [4])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_0 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor0003_120 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [0])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_1 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor0002 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [1])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_2 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor0001 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [2])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_3 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_xor0000 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [3])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin_4 (
+ .C(rd_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_gc_asreg_d1 [4]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/wr_pntr_bin [4])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_0 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor0003_110 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [0])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_1 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor0002 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [1])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_2 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor0001 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [2])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_3 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_xor0000 ),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [3])
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin_4 (
+ .C(wr_clk),
+ .CLR(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0]),
+ .D(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_gc_asreg_d1 [4]),
+ .Q(\BU2/U0/grf.rf/gcx.clkx/rd_pntr_bin [4])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/rstblk/wr_rst_reg_0 (
+ .C(wr_clk),
+ .D(\BU2/rd_data_count [0]),
+ .PRE(\BU2/U0/grf.rf/rstblk/wr_rst_comb ),
+ .Q(\BU2/U0/grf.rf/rstblk/wr_rst_reg [0])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/rstblk/wr_rst_reg_1 (
+ .C(wr_clk),
+ .D(\BU2/rd_data_count [0]),
+ .PRE(\BU2/U0/grf.rf/rstblk/wr_rst_comb ),
+ .Q(\BU2/U0/grf.rf/rstblk/wr_rst_reg [1])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/rstblk/rd_rst_reg_0 (
+ .C(rd_clk),
+ .D(\BU2/rd_data_count [0]),
+ .PRE(\BU2/U0/grf.rf/rstblk/rd_rst_comb ),
+ .Q(\BU2/U0/grf.rf/rstblk/rd_rst_reg [0])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/rstblk/rd_rst_reg_1 (
+ .C(rd_clk),
+ .D(\BU2/rd_data_count [0]),
+ .PRE(\BU2/U0/grf.rf/rstblk/rd_rst_comb ),
+ .Q(\BU2/U0/grf.rf/rstblk/rd_rst_reg [1])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/rstblk/rd_rst_reg_2 (
+ .C(rd_clk),
+ .D(\BU2/rd_data_count [0]),
+ .PRE(\BU2/U0/grf.rf/rstblk/rd_rst_comb ),
+ .Q(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/rstblk/rst_d1 (
+ .C(wr_clk),
+ .D(\BU2/rd_data_count [0]),
+ .PRE(rst),
+ .Q(\BU2/U0/grf.rf/rstblk/rst_d1_93 )
+ );
+ FDPE \BU2/U0/grf.rf/rstblk/rd_rst_asreg (
+ .C(rd_clk),
+ .CE(\BU2/U0/grf.rf/rstblk/rd_rst_asreg_d1_89 ),
+ .D(\BU2/rd_data_count [0]),
+ .PRE(rst),
+ .Q(\BU2/U0/grf.rf/rstblk/rd_rst_asreg_94 )
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/rstblk/wr_rst_asreg_d1 (
+ .C(wr_clk),
+ .D(\BU2/U0/grf.rf/rstblk/wr_rst_asreg_95 ),
+ .Q(\BU2/U0/grf.rf/rstblk/wr_rst_asreg_d1_91 )
+ );
+ FDPE \BU2/U0/grf.rf/rstblk/wr_rst_asreg (
+ .C(wr_clk),
+ .CE(\BU2/U0/grf.rf/rstblk/wr_rst_asreg_d1_91 ),
+ .D(\BU2/rd_data_count [0]),
+ .PRE(rst),
+ .Q(\BU2/U0/grf.rf/rstblk/wr_rst_asreg_95 )
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/rstblk/rd_rst_asreg_d1 (
+ .C(rd_clk),
+ .D(\BU2/U0/grf.rf/rstblk/rd_rst_asreg_94 ),
+ .Q(\BU2/U0/grf.rf/rstblk/rd_rst_asreg_d1_89 )
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/rstblk/rst_d2 (
+ .C(wr_clk),
+ .D(\BU2/U0/grf.rf/rstblk/rst_d1_93 ),
+ .PRE(rst),
+ .Q(\BU2/U0/grf.rf/rstblk/rst_d2_88 )
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/rstblk/wr_rst_asreg_d2 (
+ .C(wr_clk),
+ .D(\BU2/U0/grf.rf/rstblk/wr_rst_asreg_d1_91 ),
+ .Q(\BU2/U0/grf.rf/rstblk/wr_rst_asreg_d2_92 )
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/rstblk/rd_rst_asreg_d2 (
+ .C(rd_clk),
+ .D(\BU2/U0/grf.rf/rstblk/rd_rst_asreg_d1_89 ),
+ .Q(\BU2/U0/grf.rf/rstblk/rd_rst_asreg_d2_90 )
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/rstblk/rst_d3 (
+ .C(wr_clk),
+ .D(\BU2/U0/grf.rf/rstblk/rst_d2_88 ),
+ .PRE(rst),
+ .Q(\BU2/U0/grf.rf/rstblk/rst_d3_86 )
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \BU2/U0/grf.rf/rstblk/RST_FULL_GEN (
+ .C(wr_clk),
+ .CLR(rst),
+ .D(\BU2/U0/grf.rf/rstblk/rst_d3_86 ),
+ .Q(\BU2/U0/grf.rf/rstblk/RST_FULL_GEN_87 )
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i (
+ .C(rd_clk),
+ .D(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_or0000 ),
+ .PRE(\BU2/U0/grf.rf/rstblk/rd_rst_reg [2]),
+ .Q(\BU2/U0/grf.rf/gl0.rd/gras.rsts/ram_empty_fb_i_85 )
+ );
+ VCC \BU2/XST_VCC (
+ .P(\BU2/N1 )
+ );
+ GND \BU2/XST_GND (
+ .G(\BU2/rd_data_count [0])
+ );
+
+// synthesis translate_on
+
+endmodule
+
+// synthesis translate_off
+
+`ifndef GLBL
+`define GLBL
+
+`timescale 1 ps / 1 ps
+
+module glbl ();
+
+ parameter ROC_WIDTH = 100000;
+ parameter TOC_WIDTH = 0;
+
+ wire GSR;
+ wire GTS;
+ wire GWE;
+ wire PRLD;
+ tri1 p_up_tmp;
+ tri (weak1, strong0) PLL_LOCKG = p_up_tmp;
+
+ reg GSR_int;
+ reg GTS_int;
+ reg PRLD_int;
+
+//-------- JTAG Globals --------------
+ wire JTAG_TDO_GLBL;
+ wire JTAG_TCK_GLBL;
+ wire JTAG_TDI_GLBL;
+ wire JTAG_TMS_GLBL;
+ wire JTAG_TRST_GLBL;
+
+ reg JTAG_CAPTURE_GLBL;
+ reg JTAG_RESET_GLBL;
+ reg JTAG_SHIFT_GLBL;
+ reg JTAG_UPDATE_GLBL;
+ reg JTAG_RUNTEST_GLBL;
+
+ reg JTAG_SEL1_GLBL = 0;
+ reg JTAG_SEL2_GLBL = 0 ;
+ reg JTAG_SEL3_GLBL = 0;
+ reg JTAG_SEL4_GLBL = 0;
+
+ reg JTAG_USER_TDO1_GLBL = 1'bz;
+ reg JTAG_USER_TDO2_GLBL = 1'bz;
+ reg JTAG_USER_TDO3_GLBL = 1'bz;
+ reg JTAG_USER_TDO4_GLBL = 1'bz;
+
+ assign (weak1, weak0) GSR = GSR_int;
+ assign (weak1, weak0) GTS = GTS_int;
+ assign (weak1, weak0) PRLD = PRLD_int;
+
+ initial begin
+ GSR_int = 1'b1;
+ PRLD_int = 1'b1;
+ #(ROC_WIDTH)
+ GSR_int = 1'b0;
+ PRLD_int = 1'b0;
+ end
+
+ initial begin
+ GTS_int = 1'b1;
+ #(TOC_WIDTH)
+ GTS_int = 1'b0;
+ end
+
+endmodule
+
+`endif
+
+// synthesis translate_on
diff --git a/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.veo b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.veo
new file mode 100644
index 000000000..eb98a2b70
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.veo
@@ -0,0 +1,47 @@
+/*******************************************************************************
+* This file is owned and controlled by Xilinx and must be used *
+* solely for design, simulation, implementation and creation of *
+* design files limited to Xilinx devices or technologies. Use *
+* with non-Xilinx devices or technologies is expressly prohibited *
+* and immediately terminates your license. *
+* *
+* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" *
+* SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR *
+* XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION *
+* AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION *
+* OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS *
+* IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, *
+* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE *
+* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY *
+* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE *
+* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR *
+* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF *
+* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *
+* FOR A PARTICULAR PURPOSE. *
+* *
+* Xilinx products are not intended for use in life support *
+* appliances, devices, or systems. Use in such applications are *
+* expressly prohibited. *
+* *
+* (c) Copyright 1995-2009 Xilinx, Inc. *
+* All rights reserved. *
+*******************************************************************************/
+// The following must be inserted into your Verilog file for this
+// core to be instantiated. Change the instance name and port connections
+// (in parentheses) to your own signal names.
+
+//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
+fifo_xlnx_32x36_2clk YourInstanceName (
+ .rst(rst),
+ .wr_clk(wr_clk),
+ .rd_clk(rd_clk),
+ .din(din), // Bus [35 : 0]
+ .wr_en(wr_en),
+ .rd_en(rd_en),
+ .dout(dout), // Bus [35 : 0]
+ .full(full),
+ .almost_full(almost_full),
+ .empty(empty),
+ .prog_full(prog_full));
+
+// INST_TAG_END ------ End INSTANTIATION Template ---------
diff --git a/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.xco b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.xco
new file mode 100644
index 000000000..1cf4c8ba5
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.xco
@@ -0,0 +1,84 @@
+##############################################################
+#
+# Xilinx Core Generator version 12.2
+# Date: Fri Oct 15 07:50:15 2010
+#
+##############################################################
+#
+# This file contains the customisation parameters for a
+# Xilinx CORE Generator IP GUI. It is strongly recommended
+# that you do not manually alter this file as it may cause
+# unexpected and unsupported behavior.
+#
+##############################################################
+#
+# BEGIN Project Options
+SET addpads = false
+SET asysymbol = false
+SET busformat = BusFormatAngleBracketNotRipped
+SET createndf = false
+SET designentry = Verilog
+SET device = xc3s2000
+SET devicefamily = spartan3
+SET flowvendor = Other
+SET formalverification = false
+SET foundationsym = false
+SET implementationfiletype = Ngc
+SET package = fg456
+SET removerpms = false
+SET simulationfiles = Structural
+SET speedgrade = -5
+SET verilogsim = true
+SET vhdlsim = false
+# END Project Options
+# BEGIN Select
+SELECT Fifo_Generator family Xilinx,_Inc. 6.1
+# END Select
+# BEGIN Parameters
+CSET almost_empty_flag=false
+CSET almost_full_flag=true
+CSET component_name=fifo_xlnx_32x36_2clk
+CSET data_count=false
+CSET data_count_width=5
+CSET disable_timing_violations=false
+CSET dout_reset_value=0
+CSET empty_threshold_assert_value=4
+CSET empty_threshold_negate_value=5
+CSET enable_ecc=false
+CSET enable_int_clk=false
+CSET enable_reset_synchronization=true
+CSET fifo_implementation=Independent_Clocks_Distributed_RAM
+CSET full_flags_reset_value=1
+CSET full_threshold_assert_value=24
+CSET full_threshold_negate_value=23
+CSET inject_dbit_error=false
+CSET inject_sbit_error=false
+CSET input_data_width=36
+CSET input_depth=32
+CSET output_data_width=36
+CSET output_depth=32
+CSET overflow_flag=false
+CSET overflow_sense=Active_High
+CSET performance_options=First_Word_Fall_Through
+CSET programmable_empty_type=No_Programmable_Empty_Threshold
+CSET programmable_full_type=Single_Programmable_Full_Threshold_Constant
+CSET read_clock_frequency=1
+CSET read_data_count=false
+CSET read_data_count_width=5
+CSET reset_pin=true
+CSET reset_type=Asynchronous_Reset
+CSET underflow_flag=false
+CSET underflow_sense=Active_High
+CSET use_dout_reset=true
+CSET use_embedded_registers=false
+CSET use_extra_logic=false
+CSET valid_flag=false
+CSET valid_sense=Active_High
+CSET write_acknowledge_flag=false
+CSET write_acknowledge_sense=Active_High
+CSET write_clock_frequency=1
+CSET write_data_count=false
+CSET write_data_count_width=5
+# END Parameters
+GENERATE
+# CRC: 8e84ee7f
diff --git a/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.xise b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.xise
new file mode 100644
index 000000000..b9eb7bd1a
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk.xise
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
+
+ <header>
+ <!-- ISE source project file created by Project Navigator. -->
+ <!-- -->
+ <!-- This file contains project source information including a list of -->
+ <!-- project source files, project and process properties. This file, -->
+ <!-- along with the project source files, is sufficient to open and -->
+ <!-- implement in ISE Project Navigator. -->
+ <!-- -->
+ <!-- Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved. -->
+ </header>
+
+ <version xil_pn:ise_version="12.1" xil_pn:schema_version="2"/>
+
+ <files>
+ <file xil_pn:name="fifo_xlnx_32x36_2clk.ngc" xil_pn:type="FILE_NGC">
+ <association xil_pn:name="BehavioralSimulation"/>
+ <association xil_pn:name="Implementation"/>
+ </file>
+ <file xil_pn:name="fifo_xlnx_32x36_2clk.v" xil_pn:type="FILE_VERILOG">
+ <association xil_pn:name="BehavioralSimulation"/>
+ <association xil_pn:name="Implementation"/>
+ <association xil_pn:name="PostMapSimulation"/>
+ <association xil_pn:name="PostRouteSimulation"/>
+ <association xil_pn:name="PostTranslateSimulation"/>
+ </file>
+ </files>
+
+ <properties>
+ <property xil_pn:name="Auto Implementation Top" xil_pn:value="false" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Device" xil_pn:value="xc3s2000" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Device Family" xil_pn:value="Spartan3" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Stop View" xil_pn:value="PreSynthesis" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Top" xil_pn:value="Module|fifo_xlnx_32x36_2clk" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Top File" xil_pn:value="fifo_xlnx_32x36_2clk.ngc" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Top Instance Path" xil_pn:value="/fifo_xlnx_32x36_2clk" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Package" xil_pn:value="fg456" xil_pn:valueState="default"/>
+ <property xil_pn:name="Preferred Language" xil_pn:value="Verilog" xil_pn:valueState="default"/>
+ <property xil_pn:name="Project Generator" xil_pn:value="CoreGen" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Property Specification in Project File" xil_pn:value="Store all values" xil_pn:valueState="default"/>
+ <property xil_pn:name="Simulator" xil_pn:value="ISim (VHDL/Verilog)" xil_pn:valueState="default"/>
+ <property xil_pn:name="Speed Grade" xil_pn:value="-5" xil_pn:valueState="default"/>
+ <property xil_pn:name="Synthesis Tool" xil_pn:value="XST (VHDL/Verilog)" xil_pn:valueState="default"/>
+ <property xil_pn:name="Top-Level Source Type" xil_pn:value="HDL" xil_pn:valueState="default"/>
+ <property xil_pn:name="Working Directory" xil_pn:value="." xil_pn:valueState="non-default"/>
+ <!-- -->
+ <!-- The following properties are for internal use only. These should not be modified.-->
+ <!-- -->
+ <property xil_pn:name="PROP_DesignName" xil_pn:value="fifo_xlnx_32x36_2clk" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_DevFamilyPMName" xil_pn:value="spartan3" xil_pn:valueState="default"/>
+ <property xil_pn:name="PROP_intProjectCreationTimestamp" xil_pn:value="2010-10-15T00:50:17" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_intWbtProjectID" xil_pn:value="F8449944117490A53CFE9CD2127BE2AA" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_intWorkingDirLocWRTProjDir" xil_pn:value="Same" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_intWorkingDirUsed" xil_pn:value="No" xil_pn:valueState="non-default"/>
+ </properties>
+
+ <bindings/>
+
+ <libraries/>
+
+ <autoManagedFiles>
+ <!-- The following files are identified by `include statements in verilog -->
+ <!-- source files and are automatically managed by Project Navigator. -->
+ <!-- -->
+ <!-- Do not hand-edit this section, as it will be overwritten when the -->
+ <!-- project is analyzed based on files automatically identified as -->
+ <!-- include files. -->
+ </autoManagedFiles>
+
+</project>
diff --git a/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk_flist.txt b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk_flist.txt
new file mode 100644
index 000000000..b8c69a9f7
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk_flist.txt
@@ -0,0 +1,12 @@
+# Output products list for <fifo_xlnx_32x36_2clk>
+_xmsgs/pn_parser.xmsgs
+fifo_generator_ug175.pdf
+fifo_xlnx_32x36_2clk.gise
+fifo_xlnx_32x36_2clk.ngc
+fifo_xlnx_32x36_2clk.v
+fifo_xlnx_32x36_2clk.veo
+fifo_xlnx_32x36_2clk.xco
+fifo_xlnx_32x36_2clk.xise
+fifo_xlnx_32x36_2clk_flist.txt
+fifo_xlnx_32x36_2clk_readme.txt
+fifo_xlnx_32x36_2clk_xmdf.tcl
diff --git a/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk_readme.txt b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk_readme.txt
new file mode 100644
index 000000000..8ab5679fd
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk_readme.txt
@@ -0,0 +1,46 @@
+The following files were generated for 'fifo_xlnx_32x36_2clk' in directory
+/home/ianb/ettus/sram_fifo/fpgapriv/usrp2/coregen/
+
+fifo_generator_ug175.pdf:
+ Please see the core data sheet.
+
+fifo_xlnx_32x36_2clk.gise:
+ ISE Project Navigator support file. This is a generated file and should
+ not be edited directly.
+
+fifo_xlnx_32x36_2clk.ngc:
+ Binary Xilinx implementation netlist file containing the information
+ required to implement the module in a Xilinx (R) FPGA.
+
+fifo_xlnx_32x36_2clk.v:
+ Unisim Verilog file containing the information required to simulate
+ the module.
+
+fifo_xlnx_32x36_2clk.veo:
+ VEO template file containing code that can be used as a model for
+ instantiating a CORE Generator module in a Verilog design.
+
+fifo_xlnx_32x36_2clk.xco:
+ CORE Generator input file containing the parameters used to
+ regenerate a core.
+
+fifo_xlnx_32x36_2clk.xise:
+ ISE Project Navigator support file. This is a generated file and should
+ not be edited directly.
+
+fifo_xlnx_32x36_2clk_readme.txt:
+ Text file indicating the files generated and how they are used.
+
+fifo_xlnx_32x36_2clk_xmdf.tcl:
+ ISE Project Navigator interface file. ISE uses this file to determine
+ how the files output by CORE Generator for the core can be integrated
+ into your ISE project.
+
+fifo_xlnx_32x36_2clk_flist.txt:
+ Text file listing all of the output files produced when a customized
+ core was generated in the CORE Generator.
+
+
+Please see the Xilinx CORE Generator online help for further details on
+generated files and how to use them.
+
diff --git a/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk_xmdf.tcl b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk_xmdf.tcl
new file mode 100644
index 000000000..ec9426357
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_32x36_2clk_xmdf.tcl
@@ -0,0 +1,68 @@
+# The package naming convention is <core_name>_xmdf
+package provide fifo_xlnx_32x36_2clk_xmdf 1.0
+
+# This includes some utilities that support common XMDF operations
+package require utilities_xmdf
+
+# Define a namespace for this package. The name of the name space
+# is <core_name>_xmdf
+namespace eval ::fifo_xlnx_32x36_2clk_xmdf {
+# Use this to define any statics
+}
+
+# Function called by client to rebuild the params and port arrays
+# Optional when the use context does not require the param or ports
+# arrays to be available.
+proc ::fifo_xlnx_32x36_2clk_xmdf::xmdfInit { instance } {
+# Variable containg name of library into which module is compiled
+# Recommendation: <module_name>
+# Required
+utilities_xmdf::xmdfSetData $instance Module Attributes Name fifo_xlnx_32x36_2clk
+}
+# ::fifo_xlnx_32x36_2clk_xmdf::xmdfInit
+
+# Function called by client to fill in all the xmdf* data variables
+# based on the current settings of the parameters
+proc ::fifo_xlnx_32x36_2clk_xmdf::xmdfApplyParams { instance } {
+
+set fcount 0
+# Array containing libraries that are assumed to exist
+# Examples include unisim and xilinxcorelib
+# Optional
+# In this example, we assume that the unisim library will
+# be magically
+# available to the simulation and synthesis tool
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type logical_library
+utilities_xmdf::xmdfSetData $instance FileSet $fcount logical_library unisim
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_generator_ug175.pdf
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type AnyView
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_32x36_2clk.ngc
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type ngc
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_32x36_2clk.v
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type verilog
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_32x36_2clk.veo
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type verilog_template
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_32x36_2clk.xco
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type coregen_ip
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_32x36_2clk_xmdf.tcl
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type AnyView
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount associated_module fifo_xlnx_32x36_2clk
+incr fcount
+
+}
+
+# ::gen_comp_name_xmdf::xmdfApplyParams
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.gise b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.gise
new file mode 100644
index 000000000..c18cf3bf0
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.gise
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<generated_project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
+
+ <!-- -->
+
+ <!-- For tool use only. Do not edit. -->
+
+ <!-- -->
+
+ <!-- ProjectNavigator created generated project file. -->
+
+ <!-- For use in tracking generated file and other information -->
+
+ <!-- allowing preservation of process status. -->
+
+ <!-- -->
+
+ <!-- Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved. -->
+
+ <version xmlns="http://www.xilinx.com/XMLSchema">11.1</version>
+
+ <sourceproject xmlns="http://www.xilinx.com/XMLSchema" xil_pn:fileType="FILE_XISE" xil_pn:name="fifo_xlnx_512x36_2clk_18to36.xise"/>
+
+ <files xmlns="http://www.xilinx.com/XMLSchema">
+ <file xil_pn:fileType="FILE_VEO" xil_pn:name="fifo_xlnx_512x36_2clk_18to36.veo" xil_pn:origination="imported"/>
+ </files>
+
+ <transforms xmlns="http://www.xilinx.com/XMLSchema"/>
+
+</generated_project>
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.ncf b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.ncf
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.ncf
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.ngc b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.ngc
new file mode 100644
index 000000000..d9277b0c3
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.ngc
@@ -0,0 +1,3 @@
+XILINX-XDB 0.1 STUB 0.1 ASCII
+XILINX-XDM V1.6e
+$45640<,[o}e~g`n;"2*726&;$:,)?40493456712:;<=>?01274>6789:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?0123454<80;0=>5>.130?46=AGZ^X7OKDSC?=?699l1:<7GAPTV9twi`Wog`Rzgrdqk8<<76;?0==4FNQWW>uthoVl~`aQ{hsgplZgt{lx044?>37855<NFY__6}|`g^dvhiYs`{oxdR`jg`vf8<<76830==4@UURVP?bf|hUhcx`{<883:4e<990DYY^ZT;uq[agsiVidycz39;2=57=6>3CE\XZ5DHC?50<76890=;4@UURVP?BHI5;>6=0>2:3;>LHW]]0oec2>7;2=5>433;98?<?42;KMTPR=L@ZJ0<4?>0086?IR\Y__6IA_A=394;753:81EC^ZT;FJF956294:?6==:NWWTPR=LFH7?<4?>06873<H]]Z^X7j`uu>01?69l29x>=>?ff662(363=>08=HI1097>LHW]]0OE]L33;2=57=32F__\XZ5DNRA86<7681=>6864:4:=32<09:;866J8@38=1=>8939748;;845=44<13CE\XZ5AEFQF9>=87;n744FNQWW>uthoVof|ywPtipfwm:?29499675IORVP?vugnUna}zv_ujqavnXizyn~y27:1<11>?=AGZ^X7~}of]fiur~W}byi~fPndebp`:?294:n675OTVSQQ<ulVnjxlQlotlw8=<76;1J>55NDEPB858?3HNO^L2>>99B@ATF4;437LJKR@>0:==FLMXJ0907;@FGVD:2611JHI\N<7<;?DBCZH6<255NDEPB8=8f3HNO^L26:1<;?DBCZH62255NDEPA858?3HNO^O2>>99B@ATE4;437LJKRC>0:==FLMXI0907;@FGVG:2611JHI\M<7<;?DBCZK6<2l5NDEPA8=<7611JHI\M<9<0?DJK12KXUCMPRDE0?GS502H^_RGAFN38G7=DM880OEKLK^NJG@HTMV^R\H<4CH68GIMF<2IGGO=4CMP:?FIJE@^_II?;;BMQAZABFLXJXDAA_HLEK2=DZLK_II?4D39GG7=CA?1OEL2?>69GMD:687=0HDO310<4?AOF4885;6JFA=30:2=CAH6:8374DHC?50<76>1OEL2>5?48@LG;97<0HDO32?48@LG;;7<0HDO34?48@LG;=7<0HDO36?48@LG;?7<0HDO38?48@LG;17<0HDL30?58@LD;994<7IGM<03=3>BNJ5;92:5KIC>27;1<L@H7=908;EKA8439?2NBN1?9>69GMG:6?7=0HDL319<4?AOE4835:6JFB=3=3>BNJ58;2:5KIC>15;1<L@H7>?08;EKA8759?2NBN1<;>69GMG:5=7=0HDL327<4?AOE4;=5;6JFB=0;:2=CAK695384DH@?6;1<L@H7?=06;EKA867=87=0HDL330<5?AOE4:4=7IGM<5<5?AOE4<4=7IGM<7<5?AOE4>4=7IGM<9<5?AOE404<7IG_A=2==>BNXH6:6=08;EKSE979?2NB\O2?>69GMUD;97=0HD^M<3<:?AOWJ591<394DHRA86813MEJ0=08;EMB8469?2NDM1?>>69GKD:6:7=0HBO312<4?AIF48>556J@A=36>5803MEJ0<;16:FLE979>2NDM1<16:FLE959>2NDM1:16:FLE939>2NDM1816:FLE919>2NDM1616:FLE9?9?2NDMR\JG79GKG:76>1OCO2>0?58@JD;984<7IAM<00=3>BHJ5;82:5KOC>20;1<LFH7=808;EMA8409?2NDN1?8>69GKG:607=0HBL318<5?AIE484<7IAM<32=3>BHJ58:2:5KOC>16;1<LFH7>>08;EMA8729?2NDN1<:>69GKG:5>7=0HBL326<4?AIE4;25;6J@B=0::3=CGK692:5KOC>04;?<LFH7?<4?>69GKG:497<0HBL33?48@JD;<7<0HBL35?48@JD;>7<0HBL37?48@JD;07<0HBL39?58@JDXZLM<7IA_A=2==>BHXH6:6=08;EMSE979?2ND\O2?>69GKUD;97=0HB^M<3<:?AIWJ591<394DNRA86843LDJ?6KABc9FJZCDKVXNMIm4EO]FGFYPZ@^N>6H=2:D;1>@FDZO97KJ<;GF@0>@CKL90JI^;;GFSA1=AL[O?7KH7009D7>AIL81B>6G?2:K26>O5:2C846GAIUR\45><AGC_\R>>8:KMMQVX8;20ECG[P^20<>OIA]ZT<964IOKWTZ6202CEEY^P07:8MKOSXV:<56GAIUQWEQC03@DBXR>?7:KMMQY79>1BBDZP0358MKOSW99<7D@FT^273>OIA]U;9:5FNHV\431<AGC_S=98;HLJPZ6??2CEEYQ?969JJLRX8H=0ECG[_1@4?LHN\V:H;6GAIU]3@2=NF@^T<H94IOKW[5@03@DBXR??7:KMMQY69>1BBDZP1358MKOSW89<7D@FT^373>OIA]U:9:5FNHV\531<AGC_S<98;HLJPZ7??2CEEYQ>969JJLRX9H=0ECG[_0@4?LHN\V;H;6GAIU]2@2=NF@^T=H94IOKW[4@03@DBXR<?7:KMMQY59>1BBDZP2358MKOSW;9<7D@FT^073>OIA]U99:5FNHV\631<AGC_S?98;HLJPZ4??2CEEYQ=969JJLRX:H=0ECG[_3@4?LHN\V8H;6GAIU]1@2=NF@^T>H94IOKW[7@03@DBXR=?7:KMMQY49>1BBDZP3358MKOSW:9<7D@FT^173>OIA]U89:5FNHV\731<AGC_S>98;HLJPZ5??2CEEYQ<969JJLRX;H=0ECG[_2@4?LHN\V9H;6GAIU]0@2=NF@^T?H94IOKW[6@13@DBXRO9;HLJPZD43@D]>6BF2:NL2>JHIMOO;6B@GHABH1=K]];?7A[[259OQQ533E__8;5CUU6\@0=J[NEE96CZXB[`?Hgmg{\n~~g`nb9Nmkiu^lxxeb`<;O226>H6<2D:<=:4N0220>H68;>0B<><4:L2412<F8:>86@>0768J460<2D:<5:4N02:7>H69=1E=<>;;O3251=I988?7C?>359M54233G;:995A1047?K76?=1E=<6;;O32=6=I9;>0B<<?4:L2642<F88986@>2268J443<2D:>8:4N0050>H6:>>0B<<73:L271=I9:;87C?;3:L216=I9?>0B<8;3:L236=I9190B<7=;O00?K47;2D9=>5A2318J7543G8??6@=529M635<F;=87C<73:L1=7=I;:1E?=<4N408J24<F090B4?<;O;17>H>;:1E59=4N870?K?1;2D2;>5A9918J<?a3GHTNX]_IO]SVJVT?2DNXZA]K09L6>IL92Z?7]O]T`9SMKYE]ZCOTo5_IO]AQVHFEL90\_K>;P38V`=UIDH::R]>8^Q02d=UMHNTJD\\Tb9QADBX_@N_DROl;SGB@ZQNL]BTN<5\129PMHYDGEFB_DAA_BJFGN0<[F_YOH94SSTBHZG03ZX]MAQM4:QPVD2<[ZXI86ZVPD11?P6(o{l%~k!hcy,`hn~(EqeySjPpovq[beXpfx;<=>PRdqvhq74:2_;#j|i.sd,cf~)keas#@v`r^pg[uhszVmhSua}0122[Wct}e~:??5Z0.eqb+ta'nis"nbdx.O{kwYulVzexQhc^zlv567:VXnxb{1208Q5)`zo$yj"ilx/aoo})JpfxT~iQnup\cfYg{:;<>Q]erwop4553\:$kh!rg-dg}(ddbr$Aua}_sf\tkruWniTtb|?016\V`urd};8>6[?/fpe*w`(ojr%oaew/LzlvZtcWyd~Ril_ymq4562W[oxyaz>339V4*aun'xm#jmw.bnh|*Kg{UyhR~ats]dgZ~hz9:;:R\jstnw564<]9%l~k }f.e`|+ekcq%Ftb|Pre]sjqtXojUsc>?06]Qavsk|8997X> gsd-vc)`kq$h`fv Mymq[rtXxg~ySjmPxnp3456XZly~`y?<2:W3+bta&{l$knv!cmi{+H~hzV}yS}`{r^e`[}iu89::S_k|umv277=R8&myj#|i/fa{*fjlp&GscQxr^rmpwY`kVrd~=>?2^Pfwpjs9:80Y=!hrg,qb*adp'iggu!Bxnp\swYwf}xTknQwos2346YUmzgx<==;T2,cw`)zo%lou lljz,I}iuW~xT|cz}_fa\|jt789>T^h}zlu306>S7'nxm"h gbz-gim'Drd~Ry}_qlwvZadWqey<=>:_Sgpqir6;;1^<"i}f/pe+be&jf`t"Cwos]tvZvi|{UloRv`r1232ZTb{|f=><4U1-dvc(un&mht#mcky-N|jtX{U{by|Pgb]{kw678>UYi~{ct011?P6(o{l%~k!hcy,`hn~(EqeySz|Ppovq[beXpfx;<=6PRdqvhq7592_;#j|i.sd,cf~)keas#jPpovq[goi4949=6[?/fpe*w`(ojr%oaew/sf\tkruWkce0<0=1:W3+bta&{l$knv!cmi{+wbXxg~ySoga<3<15>S7'nxm"h gbz-gim'{nT|cz}_ckm868592_;#j|i.sd,cf~)keas#jPpovq[goi4=49=6[?/fpe*w`(ojr%oaew/sf\tkruWkce080=1:W3+bta&{l$knv!cmi{+wbXxg~ySoga<7<15>S7'nxm"h gbz-gim'{nT|cz}_ckm828592_;#j|i.sd,cf~)keas#jPpovq[goi4149<6[?/fpe*w`(ojr%oaew/sf\tkruWkceS=<?;T2,cw`)zo%lou lljz,vaYwf}xTnd`P1328Q5)`zo$yj"ilx/aoo})ulVzexQmio]165=R8&myj#|i/fa{*fjlp&xoS}`{r^`jjZ5582_;#j|i.sd,cf~)keas#jPpovq[goiW=8;7X> gsd-vc)`kq$h`fv re]sjqtXj`dT9?>4U1-dvc(un&mht#mcky-q`Zvi|{UiecQ9219V4*aun'xm#jmw.bnh|*tcWyd~Rlfn^514>S7'nxm"h gbz-gim'{nT|cz}_ckm[=413\:$kh!rg-dg}(ddbr$~iQnup\flhXpfx;<=>=7:W3+bta&{l$knv!cmi{+wbXxg~ySoga_ymq45679;<0Y=!hrg,qb*adp'iggu!}d^rmpwYeagUsc>?0004?P6(o{l%~k!hcy,`hn~(zmU{by|Pbhl\|jt789;:>;5Z0.eqb+ta'nis"nbdx.pg[uhszVhbbRv`r123671<]9%l~k }f.e`|+ekcq%yhR~ats]amkYg{:;<??=6:W3+bta&{l$knv!cmi{+wbXxg~ySoga_ymq4564:>1^<"i}f/pe+be&jf`t"|k_qlwvZdnfVrd~=>?3305?P6(o{l%~k!hcy,`hn~(zmU{by|Pbhl\|jt789>9;6[?/fpe*w`(ojr%oaew/sf\tkruWkceSua}0127570<]9%l~k }f.e`|+ekcq%yhR~ats]amkYg{:;<8<8;T2,cw`)zo%lou lljz,vaYwf}xTnd`Pxnp34536:?1^<"i}f/pe+be&jf`t"|k_qlwvZdnfVrd~=>?63:8Q5)`zo$yj"ilx/aoo})ulVzexQmio]{kw678?;:>:5Z0.eqb+ta'nis"nbdx.pg[uhszVhbbRv`r123274e3\:$kh!rg-dg}(ddbr$~iQnup\flhXpfx;<=8Pbef363=R8&myj#|i/fa{*fjlp&xoS}`{r^`jjZ~hz9:;;?94U1-dvc(un&mht#mcky-q`Zvi|{UiecQwos23427582_;#j|i.sd,cf~)keas#jPpovq[be;878;7X> gsd-vc)`kq$h`fv re]sjqtXoj6:2?>4U1-dvc(un&mht#mcky-q`Zvi|{Ulo1<1219V4*aun'xm#jmw.bnh|*tcWyd~Ril<2<14>S7'nxm"h gbz-gim'{nT|cz}_fa?0;473\:$kh!rg-dg}(ddbr$~iQnup\cf:26;:0Y=!hrg,qb*adp'iggu!}d^rmpwY`k5<5>=5Z0.eqb+ta'nis"nbdx.pg[uhszVmh0:0=0:W3+bta&{l$knv!cmi{+wbXxg~ySjm38?3e?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]35c=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[47a3\:$kh!rg-dg}(ddbr$~iQnup\cfY59o1^<"i}f/pe+be&jf`t"|k_qlwvZadW:;m7X> gsd-vc)`kq$h`fv re]sjqtXojU?=k5Z0.eqb+ta'nis"nbdx.pg[uhszVmhS8?i;T2,cw`)zo%lou lljz,vaYwf}xTknQ91g9V4*aun'xm#jmw.bnh|*tcWyd~Ril_63e?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb];63=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumn6;2?84U1-dvc(un&mht#mcky-q`Zvi|{UloRo|rde?5;413\:$kh!rg-dg}(ddbr$~iQnup\cfYf{{ol0?0=6:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfc959:?1^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyij2;>348Q5)`zo$yj"ilx/aoo})ulVzexQhc^cpv`a;=78=7X> gsd-vc)`kq$h`fv re]sjqtXojUjkh<7<12>S7'nxm"h gbz-gim'{nT|cz}_fa\evtbo5=5>;5Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef>;:73<]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlmT<?;4U1-dvc(un&mht#mcky-q`Zvi|{UloRo|rde\573<]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlmT>?;4U1-dvc(un&mht#mcky-q`Zvi|{UloRo|rde\773<]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlmT8?;4U1-dvc(un&mht#mcky-q`Zvi|{UloRo|rde\173<]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlmT:?;4U1-dvc(un&mht#mcky-q`Zvi|{UloRo|rde\373<]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlmT4?74U1-dvc(un&mht#mcky-q`Zvi|{UloRo|rde\`4:76;30Y=!hrg,qb*adp'iggu!}d^rmpwY`kVkx~hiPd0>2:7?<]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlmTh<2=>3;8Q5)`zo$yj"ilx/aoo})ulVzexQhc^cpv`aXl8682?74U1-dvc(un&mht#mcky-q`Zvi|{UloRo|rde\`4:36;30Y=!hrg,qb*adp'iggu!}d^rmpwY`kVkx~hiPd0>6:7?<]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlmTh<29>3;8Q5)`zo$yj"ilx/aoo})ulVzexQhc^cpv`aXl86<2?74U1-dvc(un&mht#mcky-q`Zvi|{UloRo|rde\`4:?6;20Y=!hrg,qb*adp'iggu!}d^rmpwY`kVkx~hiPd0]36==R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnUo=R?=8:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfcZb6W;837X> gsd-vc)`kq$h`fv re]sjqtXojUjkh_e3\77><]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlmTh<Q;299V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabYc9V?946[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg^f2[34?3\:$kh!rg-dg}(ddbr$~iQnup\cfYf{{olSi?P73:8Q5)`zo$yj"ilx/aoo})ulVzexQhc^cpv`aXl8U3>85Z0.eqb+ta'nis"nbdx.pg[uhszVmhSua}012360=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[}iu89::>85Z0.eqb+ta'nis"nbdx.pg[uhszVmhSua}012160=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[}iu89:8>85Z0.eqb+ta'nis"nbdx.pg[uhszVmhSua}012760=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[}iu89:>>85Z0.eqb+ta'nis"nbdx.pg[uhszVmhSua}012560=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[}iu89:<><5Z0.eqb+ta'nis"nbdx.uq[uhszVhbb1?1209V4*aun'xm#jmw.bnh|*quWyd~Rlfn=0=64=R8&myj#|i/fa{*fjlp&}yS}`{r^`jj959:81^<"i}f/pe+be&jf`t"y}_qlwvZdnf5>5><5Z0.eqb+ta'nis"nbdx.uq[uhszVhbb1;1209V4*aun'xm#jmw.bnh|*quWyd~Rlfn=4=64=R8&myj#|i/fa{*fjlp&}yS}`{r^`jj919:81^<"i}f/pe+be&jf`t"y}_qlwvZdnf525><5Z0.eqb+ta'nis"nbdx.uq[uhszVhbb171219V4*aun'xm#jmw.bnh|*quWyd~Rlfn^314>S7'nxm"h gbz-gim'~xT|cz}_ckm[7473\:$kh!rg-dg}(ddbr${Qnup\flhX;;:0Y=!hrg,qb*adp'iggu!xr^rmpwYeagU?>=5Z0.eqb+ta'nis"nbdx.uq[uhszVhbbR;=0:W3+bta&{l$knv!cmi{+rtXxg~ySoga_703?P6(o{l%~k!hcy,`hn~({U{by|Pbhl\376<]9%l~k }f.e`|+ekcq%|~R~ats]amkY?:91^<"i}f/pe+be&jf`t"y}_qlwvZdnfV39:6[?/fpe*w`(ojr%oaew/vp\tkruWkceSua}012362=R8&myj#|i/fa{*fjlp&}yS}`{r^`jjZ~hz9:;<<<9;T2,cw`)zo%lou lljz,swYwf}xTnd`Pxnp34575?2_;#j|i.sd,cf~)keas#z|Ppovq[goiWqey<=>>1348Q5)`zo$yj"ilx/aoo})pzVzexQmio]{kw678;8<7X> gsd-vc)`kq$h`fv ws]sjqtXj`dTtb|?010263=R8&myj#|i/fa{*fjlp&}yS}`{r^`jjZ~hz9:;??94U1-dvc(un&mht#mcky-tvZvi|{UiecQwos234645>2_;#j|i.sd,cf~)keas#z|Ppovq[goiWqey<=>;269V4*aun'xm#jmw.bnh|*quWyd~Rlfn^zlv567<88=7X> gsd-vc)`kq$h`fv ws]sjqtXj`dTtb|?01713>S7'nxm"h gbz-gim'~xT|cz}_ckm[}iu89:>=?84U1-dvc(un&mht#mcky-tvZvi|{UiecQwos23434?3\:$kh!rg-dg}(ddbr${Qnup\flhXpfx;<=8>1358Q5)`zo$yj"ilx/aoo})pzVzexQmio]{kw678?89n6[?/fpe*w`(ojr%oaew/vp\tkruWkceSua}0125[gbc8;<0Y=!hrg,qb*adp'iggu!xr^rmpwYeagUsc>?0604?P6(o{l%~k!hcy,`hn~({U{by|Pbhl\|jt789=:>=5Z0.eqb+ta'nis"nbdx.uq[uhszVmh0=0=0:W3+bta&{l$knv!cmi{+rtXxg~ySjm31?03?P6(o{l%~k!hcy,`hn~({U{by|Pgb>1:76<]9%l~k }f.e`|+ekcq%|~R~ats]dg959:91^<"i}f/pe+be&jf`t"y}_qlwvZad4=49<6[?/fpe*w`(ojr%oaew/vp\tkruWni793<?;T2,cw`)zo%lou lljz,swYwf}xTkn29>328Q5)`zo$yj"ilx/aoo})pzVzexQhc=5=65=R8&myj#|i/fa{*fjlp&}yS}`{r^e`8=8582_;#j|i.sd,cf~)keas#z|Ppovq[be;17;m7X> gsd-vc)`kq$h`fv ws]sjqtXojU;=k5Z0.eqb+ta'nis"nbdx.uq[uhszVmhS<?i;T2,cw`)zo%lou lljz,swYwf}xTknQ=1g9V4*aun'xm#jmw.bnh|*quWyd~Ril_23e?P6(o{l%~k!hcy,`hn~({U{by|Pgb]75c=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[07a3\:$kh!rg-dg}(ddbr${Qnup\cfY19o1^<"i}f/pe+be&jf`t"y}_qlwvZadW>;m7X> gsd-vc)`kq$h`fv ws]sjqtXojU3=k5Z0.eqb+ta'nis"nbdx.uq[uhszVmhS4<9;T2,cw`)zo%lou lljz,swYwf}xTknQnssgd8585>2_;#j|i.sd,cf~)keas#z|Ppovq[beXizxnk1?1279V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqab:56;<0Y=!hrg,qb*adp'iggu!xr^rmpwY`kVkx~hi33?05?P6(o{l%~k!hcy,`hn~({U{by|Pgb]bwwc`4=49:6[?/fpe*w`(ojr%oaew/vp\tkruWniTm~|jg=7=63=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumn6=2?84U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde?3;413\:$kh!rg-dg}(ddbr${Qnup\cfYf{{ol050=6:W3+bta&{l$knv!cmi{+rtXxg~ySjmParpfc9?9:<1^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQ?249V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabY6:<1^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQ=249V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabY4:<1^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQ;249V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabY2:<1^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQ9249V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabY0:<1^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQ7249V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabY>:01^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQk1=3=6<=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnUo=1<1289V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabYc9595>45Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]g5929:01^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQk1=7=6<=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnUo=181289V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabYc95=5>45Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]g59>9:01^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQk1=;=6==R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnUo=R?=8:W3+bta&{l$knv!cmi{+rtXxg~ySjmParpfcZb6W;837X> gsd-vc)`kq$h`fv ws]sjqtXojUjkh_e3\77><]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmTh<Q;299V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabYc9V?946[?/fpe*w`(ojr%oaew/vp\tkruWniTm~|jg^f2[34?3\:$kh!rg-dg}(ddbr${Qnup\cfYf{{olSi?P73:8Q5)`zo$yj"ilx/aoo})pzVzexQhc^cpv`aXl8U3>55Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]g5Z?5=2_;#j|i.sd,cf~)keas#z|Ppovq[beXpfx;<=>=5:W3+bta&{l$knv!cmi{+rtXxg~ySjmPxnp34575=2_;#j|i.sd,cf~)keas#z|Ppovq[beXpfx;<=<=5:W3+bta&{l$knv!cmi{+rtXxg~ySjmPxnp34555=2_;#j|i.sd,cf~)keas#z|Ppovq[beXpfx;<=:=5:W3+bta&{l$knv!cmi{+rtXxg~ySjmPxnp34535=2_;#j|i.sd,cf~)keas#z|Ppovq[beXpfx;<=8=5:W3+bta&{l$knv!cmi{+rtXxg~ySjmPxnp34515=2_;#j|i.sd,cf~)keas#z|Ppovq[beXpfx;<=6<0:W3+bta&{l$ka>!re-dv4(un~l#@czx^PBIZTCWLDTJZH[200e?P6(o{l%~k!hl1,q`*au9'xm{kz Mlw{[WGJW[OLCXZPEO326a=R8&myj#|i/fn3*wb(o{;%~kyit.avvwYao~Tyo{e=2=6a=R8&myj#|i/fn3*wb(o{;%~kyit.avvwYao~Tyo{e=3=6f=R8&myj#|i/fn3*wb(o{;%~kyit.avvwYao~Tyo{e^21g>S7'nxm"h gm2-va)`z8$yjzh{/bwqvZ`pn}Uxxlzj_016?P6(o{l%~k!hl1,q`*au9'xm{kz ctpq[cqa|VymykPmtz3457;879=7X> gsd-vc)`d9$yh"i}1/pescr(k|xySkyit^qweqcXe|r;<=?30?301>S7'nxm"h gm2-va)`z8$yjzh{/bwqvZ`pn}Uxxlzj_lw{45664848:6[?/fpe*w`(oe:%~i!hr0,qbr`s'jy~Rhxfu]ppdrbWds<=>><0<26==R8&myj#|i/fn3*wb(o{;%~kyit.gntqXn~lSkl=7:W3+bta&{l$ka>!re-dv4(un~l#hctx]escrXa;l0Y=!hrg,qb*ak8'xo#j|>.sdtbq)bey~rSkyit^k\ip~789:8<6[?/fpe*w`(oe:%~i!hr0,qbr`s'lg{xtQiwgv\mZkrp9:;<<<6;T2,cw`)zo%l`= }d.eqev(u{}y$o=!laspzj`r;87827X> gsd-vc)`d9$yh"i}ar,qwqu(k9%hm|vndv?5;4>3\:$kh!rg-dh5(ul&mym~ }suq,g5)di{xrbhz32?0:?P6(o{l%~k!hl1,q`*auiz$yy} c1-`ewt~fl~7?3<i;T2,cw`)zo%l`= }d.eqev(u{}y$o=!hmtz-ch]7U'mf=#c>2g9V4*aun'xm#jb?.sf,cwgt&{y"m?/fov|+ajS8W%k`}!mr0e?P6(o{l%~k!hl1,q`*auiz$yy} c1-dip~)odQ9Q#ibs/op6c=R8&myj#|i/fn3*wb(o{kx"}{s.a3+bkrp'mfW>S!glq-iv4a3\:$kh!rg-dh5(ul&mym~ }suq,g5)`e|r%k`U;]/enw+kt::1^<"i}f/pe+bj7&{n$ko|.sqww*e7';7<3<<;T2,cw`)zo%l`= }d.eqev(u{}y$o=!y1=3=66=R8&myj#|i/fn3*wb(o{kx"}{s.a3+s7;:7887X> gsd-vc)`d9$yh"i}ar,qwqu(k9%}=1=1229V4*aun'xm#jb?.sf,cwgt&{y"m?/w3?0;4e3\:$kh!rg-dh5(ul&mym~ }suq,g5)q9V:Tmcj?01226g=R8&myj#|i/fn3*wb(o{kx"}{s.a3+s7X9Vkeh=>?000a?P6(o{l%~k!hl1,q`*auiz$yy} c1-u5Z4Xign;<=>>2c9V4*aun'xm#jb?.sf,cwgt&{y"m?/w3\7Zgil9:;<<<m;T2,cw`)zo%l`= }d.eqev(u{}y$o=!y1^6\jjr789::>45Z0.eqb+ta'nf;"j gscp*wus{&i:#no}rxlfp969:01^<"i}f/pe+bj7&{n$ko|.sqww*e6'jky~t`jt=3=6<=R8&myj#|i/fn3*wb(o{kx"}{s.a2+fguzpdnx1<1289V4*aun'xm#jb?.sf,cwgt&{y"m>/bcqv|hb|595>k5Z0.eqb+ta'nf;"j gscp*wus{&i:#jczx/en_5[)od;%a<<i;T2,cw`)zo%l`= }d.eqev(u{}y$o<!hmtz-ch]6U'mf#c|2g9V4*aun'xm#jb?.sf,cwgt&{y"m>/fov|+ajS;W%k`}!mr0e?P6(o{l%~k!hl1,q`*auiz$yy} c0-dip~)odQ8Q#ibs/op6c=R8&myj#|i/fn3*wb(o{kx"}{s.a2+bkrp'mfW9S!glq-iv443\:$kh!rg-dh5(ul&mym~ }suq,g4)q95:5>>5Z0.eqb+ta'nf;"j gscp*wus{&i:#{?31?00?P6(o{l%~k!hl1,q`*auiz$yy} c0-u5949::1^<"i}f/pe+bj7&{n$ko|.sqww*e6';7?3<<;T2,cw`)zo%l`= }d.eqev(u{}y$o<!y1=6=6g=R8&myj#|i/fn3*wb(o{kx"}{s.a2+s7X8Vkeh=>?000a?P6(o{l%~k!hl1,q`*auiz$yy} c0-u5Z7Xign;<=>>2c9V4*aun'xm#jb?.sf,cwgt&{y"m>/w3\6Zgil9:;<<<m;T2,cw`)zo%l`= }d.eqev(u{}y$o<!y1^1\ekb789::>o5Z0.eqb+ta'nf;"j gscp*wus{&i:#{?P4^llp567888;7X> gsd-vc)`d9$yh"i}ar,qwqu(kfg{<?>4U1-dvc(un&mg<#|k/fpbw+tt|z%hc`~>289V4*aun'xm#jb?.sf,cwgt&{y"|nm^gntqXnkUb?=5Z0.eqb+ta'nf;"j gscp*wus{&xjaRkbpu{\bgYnWfx;<=><1:W3+bta&{l$ka>!re-dvdu)zz~x#ob_dosp|YajVcTc>?01317>S7'nxm"h gm2-va)uxg~y#@m`uov\gjsi|;>0Y=!hrg,qb*ak8'xo#~ats-Ngjsi|Vidycz>259V4*aun'xm#jb?.sf,vuhsz&Ghcx`{_bmvjq45<2_;#j|i.sd,ci6)zm%y|cz}/LalqkrXkfex><;;T2,cw`)zo%l`= }d.psjqt(Eje~byQlotlw072<]9%l~k }f.eo4+tc'{zex!BcnwmpZeh}g~>>95Z0.eqb+ta'nf;"j rqlwv*Kdg|dSnaznu410>S7'nxm"h gm2-va)uxg~y#@m`uov\gjsi|>8?7X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{83;8Q5)`zo$yj"ic0/pg+wvi|{%Fob{at^alqkrXkp6;2?m4U1-dvc(un&mg<#|k/srmpw)JkfexRm`uov\g|:76Vx>45Z0.eqb+ta'nf;"j rqlwv*Kdg|dSnaznu]`}979:j1^<"i}f/pe+bj7&{n$~}`{r.O`kphsWje~byQly=3=[wr512_;#j|i.sd,ci6)zm%y|cz}/LalqkrXkfexRmv<3<1g>S7'nxm"h gm2-va)uxg~y#@m`uov\gjsi|Vir0?0Pru0:?P6(o{l%~k!hl1,q`*twf}x$Anaznu]`kphsWjs7?3<l;T2,cw`)zo%l`= }d.psjqt(Eje~byQlotlw[f;;7Uyx?74U1-dvc(un&mg<#|k/srmpw)JkfexRm`uov\g|:36;i0Y=!hrg,qb*ak8'xo#~ats-Ngjsi|VidyczPcx>7:Zts:01^<"i}f/pe+bj7&{n$~}`{r.O`kphsWje~byQly=7=6f=R8&myj#|i/fn3*wb(zyd~"Clotlw[firf}Uhu1;1_sv1=>S7'nxm"h gm2-va)uxg~y#@m`uov\gjsi|Vir0;0=c:W3+bta&{l$ka>!re-qtkru'DidyczPcnwmpZe~4?4T~y<6;T2,cw`)zo%l`= }d.psjqt(Eje~byQlotlw[f;?78h7X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{_b{?3;Yu|;k0Y=!hrg,qb*ak8'xo#~ats-Ngjsi|VidyczPxnp?4;4f3\:$kh!rg-dh5(ul&x{by| MbmvjqYdg|dSua}<0<1e>S7'nxm"h gm2-va)uxg~y#@m`uov\gjsi|Vrd~1<12`9V4*aun'xm#jb?.sf,vuhsz&Ghcx`{_bmvjqYg{682?o4U1-dvc(un&mg<#|k/srmpw)JkfexRm`uov\|jt;<78j7X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{_ymq8085i2_;#j|i.sd,ci6)zm%y|cz}/LalqkrXkfexRv`r=4=6d=R8&myj#|i/fn3*wb(zyd~"Clotlw[firf}Usc28>3c8Q5)`zo$yj"ic0/pg+wvi|{%Fob{at^alqkrXpfx743<k;T2,cw`)zo%l`= }d.psjqt(Eje~byQlotlw[}iu414T~y?i;T2,cw`)zo%l`= }d.psjqt(kfex1>11g9V4*aun'xm#jb?.sf,vuhsz&idycz31?3e?P6(o{l%~k!hl1,q`*twf}x$ob{at=0=5c=R8&myj#|i/fn3*wb(zyd~"m`uov?7;7a3\:$kh!rg-dh5(ul&x{by| cnwmp9299o1^<"i}f/pe+bj7&{n$~}`{r.alqkr;=7;m7X> gsd-vc)`d9$yh"|nup,gjsi|5<5=k5Z0.eqb+ta'nf;"j rqlwv*eh}g~7;3?i;T2,cw`)zo%l`= }d.psjqt(kfex1611d9V4*aun'xm#jb?.sf,vuhsz&idyczP00g8Q5)`zo$yj"ic0/pg+wvi|{%hcx`{_03f?P6(o{l%~k!hl1,q`*twf}x$ob{at^02a>S7'nxm"h gm2-va)uxg~y#naznu]05`=R8&myj#|i/fn3*wb(zyd~"m`uov\04c<]9%l~k }f.eo4+tc'{zex!lotlw[07b3\:$kh!rg-dh5(ul&x{by| cnwmpZ06m2_;#j|i.sd,ci6)zm%y|cz}/bmvjqY09l1^<"i}f/pe+bj7&{n$~}`{r.alqkrX0;80Y=!hrg,qb*ak8'xo#~ats-`kphsWm;7<3<=;T2,cw`)zo%l`= }d.psjqt(kfexRj><0<16>S7'nxm"h gm2-va)uxg~y#naznu]g5949:;1^<"i}f/pe+bj7&{n$~}`{r.alqkrXl8682?<4U1-dvc(un&mg<#|k/srmpw)dg|dSi?34?01?P6(o{l%~k!hl1,q`*twf}x$ob{at^f28085:2_;#j|i.sd,ci6)zm%y|cz}/bmvjqYc95<5>?5Z0.eqb+ta'nf;"j rqlwv*eh}g~Th<28>308Q5)`zo$yj"ic0/pg+wvi|{%hcx`{_e3?<;463\:$kh!rg-dh5(ul&x{by| cnwmpZb6W98:7X> gsd-vc)`d9$yh"|nup,gjsi|Vn:S<<>;T2,cw`)zo%l`= }d.psjqt(kfexRj>_302?P6(o{l%~k!hl1,q`*twf}x$ob{at^f2[6463\:$kh!rg-dh5(ul&x{by| cnwmpZb6W=8:7X> gsd-vc)`d9$yh"|nup,gjsi|Vn:S8<>;T2,cw`)zo%l`= }d.psjqt(kfexRj>_702?P6(o{l%~k!hl1,q`*twf}x$ob{at^f2[2463\:$kh!rg-dh5(ul&x{by| cnwmpZb6W18?7X> gsd-vc)`d9$yh"|nup,gjsi|Vddx=>?12d8Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-NeabXl`lmS}`{r^rb`Zgcl9:;<Rmv<1<0b>S7'nxm"h gm2-sw)`hy%k}h!wsre+HgclVnbjkQnup\tdbXimn;<=>Pcx>2:6`<]9%l~k }f.eo4+qu'n}j#if/uqtc)JimnThdhi_qlwvZvflVkoh=>?0^az8784n2_;#j|i.sd,ci6){%l{l}!gqd-swva'DkohRjffg]sjqtXxhnTmij?012\g|:46:l0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%FmijPdhde[uhszVzjhRokd1234Ze~4=48j6[?/fpe*w`(oe:%{!hw`q-cu`){zm#@okd^fjbcYwf}xT|ljPaef3456Xkp6>2>h4U1-dvc(un&mg<#y}/fubw+awn'}y|k!Baef\`l`aWyd~R~nd^cg`5678Vir0;0<f:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/Lcg`ZbnnoU{by|Pp`f\eab789:Tot28>2d8Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-NeabXl`lmS}`{r^rb`Zgcl9:;<Rmv<9<0b>S7'nxm"h gm2-sw)`hy%k}h!wsre+HgclVnbjkQnup\tdbXimn;<=>Pcx>::17<]9%l~k }f.eo4+qu'n}j#if/uqtc)JimnThdhi_qlwvZvflVkoh=>?0^nvp9776=:0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%FmijPdhde[uhszVzjhRokd1234Zjr|5;58;5Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"Cnde]gmc`Xxg~yS}ok_`fg4567We0<0PIOT\416<]9%l~k }f.eo4+qu'n}j#if/uqtc)JimnThdhi_qlwvZvflVkoh=>?0^nvp949<91^<"i}f/pe+bj7&~x$kzo|.fre*rtwn&GjhiQkigd\tkruWykoSljk0123[iss4:4?<6[?/fpe*w`(oe:%{!hw`q-cu`){zm#@okd^fjbcYwf}xT|ljPaef3456Xd|~783:?;T2,cw`)zo%l`= xr.etev(`xo$|~}h M`fg[aoanVzexQae]b`a6789Ugyy2:>528Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-NeabXl`lmS}`{r^rb`Zgcl9:;<Rbzt=4=05=R8&myj#|i/fn3*rt(o~kx"j~i.vpsb*KflmUoekhPpovq[ugcWhno<=>?_mww828382_;#j|i.sd,ci6){%l{l}!gqd-swva'DkohRjffg]sjqtXxhnTmij?012\hpr;07>;7X> gsd-vc)`d9$|~"ixar,dtc(pzyl$Aljk_ekebZvi|{U{miQnde2345Yk}}6229?4U1-dvc(un&mg<#y}/fubw+awn'}y|k!Baef\`l`aWyd~R~nd^cg`5678Vrd~1??>528Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-NeabXl`lmS}`{r^rb`Zgcl9:;<Rv`r=3=05=R8&myj#|i/fn3*rt(o~kx"j~i.vpsb*KflmUoekhPpovq[ugcWhno<=>?_ymq878382_;#j|i.sd,ci6){%l{l}!gqd-swva'DkohRjffg]sjqtXxhnTmij?012\|jt;;7>;7X> gsd-vc)`d9$|~"ixar,dtc(pzyl$Aljk_ekebZvi|{U{miQnde2345Yg{6?29>4U1-dvc(un&mg<#y}/fubw+awn'}y|k!Baef\`l`aWyd~R~nd^cg`5678Vrd~1;1419V4*aun'xm#jb?.vp,crgt&nzm"z|f.Ob`aYcaolT|cz}_qcg[dbc89:;Sua}<7<74>S7'nxm"h gm2-sw)`hy%k}h!wsre+HgclVnbjkQnup\tdbXimn;<=>Pxnp?3;273\:$kh!rg-dh5(pz&m|m~ hpg,tvu`(EhnoSigif^rmpwYwimUjhi>?01]{kw:?6=:0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%FmijPdhde[uhszVzjhRokd1234Z~hz535?=5Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"jffg]sjqtXxhn7==0=f:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/ekebZvi|{U{mi2>>3d8Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-gmc`Xxg~yS}ok<3<1b>S7'nxm"h gm2-sw)`hy%k}h!wsre+aoanVzexQae>0:7`<]9%l~k }f.eo4+qu'n}j#if/uqtc)caolT|cz}_qcg8185n2_;#j|i.sd,ci6){%l{l}!gqd-swva'mcmjR~ats]sea:26;l0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%oekhPpovq[ugc4?49j6[?/fpe*w`(oe:%{!hw`q-cu`){zm#igif^rmpwYwim6<2?h4U1-dvc(un&mg<#y}/fubw+awn'}y|k!kigd\tkruWyko050=f:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/ekebZvi|{U{mi26>3g8Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-gmc`Xxg~yS}ok_00e?P6(o{l%~k!hl1,tv*apiz$l|k xrqd,`l`aWyd~R~nd^336`=R8&myj#|i/fn3*rt(o~kx"j~i.vpsb*bnnoU{by|Pp`f\67c<]9%l~k }f.eo4+qu'n}j#if/uqtc)caolT|cz}_qcg[64b3\:$kh!rg-dh5(pz&m|m~ hpg,tvu`(l`lmS}`{r^rb`Z25m2_;#j|i.sd,ci6){%l{l}!gqd-swva'mcmjR~ats]seaY2:l1^<"i}f/pe+bj7&~x$kzo|.fre*rtwn&nbjkQnup\tdbX>;o0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%oekhPpovq[ugcW>8n7X> gsd-vc)`d9$|~"ixar,dtc(pzyl$hdhi_qlwvZvflV29i6[?/fpe*w`(oe:%{!hw`q-cu`){zm#igif^rmpwYwimU2?55Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"jffg]sjqtXxhnTmij?012?5584?2_;#j|i.sd,ci6){%l{l}!gqd-swva'mcmjR~ats]seaYflm:;<=2>>258Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-gmc`Xxg~yS}ok_`fg45674;48;6[?/fpe*w`(oe:%{!hw`q-cu`){zm#igif^rmpwYwimUjhi>?01>0:61<]9%l~k }f.eo4+qu'n}j#if/uqtc)caolT|cz}_qcg[dbc89:;090<7:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/ekebZvi|{U{miQnde2345:26:=0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%oekhPpovq[ugcWhno<=>?<7<03>S7'nxm"h gm2-sw)`hy%k}h!wsre+aoanVzexQae]b`a67896<2>94U1-dvc(un&mg<#y}/fubw+awn'}y|k!kigd\tkruWykoSljk01238=84?2_;#j|i.sd,ci6){%l{l}!gqd-swva'mcmjR~ats]seaYflm:;<=26>3c8Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-svjaXn|fgSd==;T2,cw`)zo%l`= xr.etev(`xo$|~}h psmd[cskdVcTaxv?01100>S7'nxm"h gm2-sw)`hy%k}h!wsre+uthoVl~`aQf_lw{4564989?7X> gsd-vc)`d9$|~"ixar,dtc(pzyl$|ah_gwohZoXe|r;<==>92:8Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-svjaXn|fgSdQbuy23467>WZ];??5Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"~}of]eqijXaVddx=>?13;8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l1.abvwim}6;2?74U1-dvc(un&mg<#y}/fubw+qt|z%h="mnrs{maq:66;30Y=!hrg,qb*ak8'}y#jyns/uppv)d9&ij~waeu>1:7?<]9%l~k }f.eo4+qu'n}j#y|tr-`5*efz{seiy2<>3d8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l1.enq}(`eR:V"jc>.l31b>S7'nxm"h gm2-sw)`hy%{~z|/b3,chs&ngP=P hmr,nw7`<]9%l~k }f.eo4+qu'n}j#y|tr-`5*aj}q$laV<R.fop*hu5n2_;#j|i.sd,ci6){%l{l}!wrvp+f7(ods"jcT3\,div(j{;l0Y=!hrg,qb*ak8'}y#jyns/uppv)d9&mfyu hmZ6^*bkt&dy9?6[?/fpe*w`(oe:%{!hw`q-svrt'j;$z<2?>318Q5)`zo$yj"ic0/uq+bqf{'}xx~!l1.t28485;2_;#j|i.sd,ci6){%l{l}!wrvp+f7(~8692?=4U1-dvc(un&mg<#y}/fubw+qt|z%h="x><2<17>S7'nxm"h gm2-sw)`hy%{~z|/b3,r4:36;h0Y=!hrg,qb*ak8'}y#jyns/uppv)d9&|:S=Qnne234575j2_;#j|i.sd,ci6){%l{l}!wrvp+f7(~8U:Sl`k012357d<]9%l~k }f.eo4+qu'n}j#y|tr-`5*p6W;Ujbi>?0131f>S7'nxm"h gm2-sw)`hy%{~z|/b3,r4Y4Whdo<=>?13`8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l1.t2[1Yffm:;<=?=9:W3+bta&{l$ka>!ws-dsdu)z~x#n< c`pq}kcs494956[?/fpe*w`(oe:%{!hw`q-svrt'j8$ol|}yogw848512_;#j|i.sd,ci6){%l{l}!wrvp+f4(khxyuck{<3<1=>S7'nxm"h gm2-sw)`hy%{~z|/b0,gdtuqgo0>0=f:W3+bta&{l$ka>!ws-dsdu)z~x#n< glw{*bk\8T$la< b13d8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l2.enq}(`eR;V"jc|.lq1b>S7'nxm"h gm2-sw)`hy%{~z|/b0,chs&ngP>P hmr,nw7`<]9%l~k }f.eo4+qu'n}j#y|tr-`6*aj}q$laV=R.fop*hu5n2_;#j|i.sd,ci6){%l{l}!wrvp+f4(ods"jcT4\,div(j{;90Y=!hrg,qb*ak8'}y#jyns/uppv)d:&|:0=0=3:W3+bta&{l$ka>!ws-dsdu)z~x#n< v0>2:75<]9%l~k }f.eo4+qu'n}j#y|tr-`6*p64;49?6[?/fpe*w`(oe:%{!hw`q-svrt'j8$z<2<>318Q5)`zo$yj"ic0/uq+bqf{'}xx~!l2.t28185j2_;#j|i.sd,ci6){%l{l}!wrvp+f4(~8U;Sl`k012357d<]9%l~k }f.eo4+qu'n}j#y|tr-`6*p6W8Ujbi>?0131f>S7'nxm"h gm2-sw)`hy%{~z|/b0,r4Y5Whdo<=>?13`8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l2.t2[6Yffm:;<=?=b:W3+bta&{l$ka>!ws-dsdu)z~x#n< v0]7[dhc89:;=?>4U1-dvc(un&mg<#y}/fubw+qt|z%hc`~>219V4*aun'xm#jb?.vp,crgt&~y"m`mq014>S7'nxm"h gm2-sw)`hy%{~z|/bmnt64c3\:$kh!rg-dh5(pz&m|m~ xsuq,cd`)k:%hm|vndv?4;4c3\:$kh!rg-dh5(pz&m|m~ xsuq,cd`)k:%hm|vndv?5;4c3\:$kh!rg-dh5(pz&m|m~ xsuq,cd`)k:%hm|vndv?6;4c3\:$kh!rg-dh5(pz&m|m~ xsuq,cd`)k:%hm|vndv?7;543\:$kh!rg-dh5(pz&m|m~ xsuq,cd`)k:%laxv!glY3Y+aj9'g:?>5Z0.eqb+ta'nf;"z| gvcp*rus{&mjj#m</fov|+ajS8W%k`}!mr10?P6(o{l%~k!hl1,tv*apiz$|y} g`d-g6)`e|r%k`U=]/enw+kt;:1^<"i}f/pe+bj7&~x$kzo|.vqww*afn'i8#jczx/en_6[)ody%a~=<;T2,cw`)zo%l`= xr.etev(p{}y$klh!c2-dip~)odQ?Q#ibs/op62=R8&myj#|i/fn3*rt(o~kx"z}{s.ebb+e4';7<3<8;T2,cw`)zo%l`= xr.etev(p{}y$klh!c2-u5979:>1^<"i}f/pe+bj7&~x$kzo|.vqww*afn'i8#{?32?04?P6(o{l%~k!hl1,tv*apiz$|y} g`d-g6)q9595>:5Z0.eqb+ta'nf;"z| gvcp*rus{&mjj#m</w3?0;4a3\:$kh!rg-dh5(pz&m|m~ xsuq,cd`)k:%}=R>Paof34566:o1^<"i}f/pe+bj7&~x$kzo|.vqww*afn'i8#{?P1^cm`567888m7X> gsd-vc)`d9$|~"ixar,twqu(ohl%o>!y1^0\ekb789::>k5Z0.eqb+ta'nf;"z| gvcp*rus{&mjj#m</w3\7Zgil9:;<<<i;T2,cw`)zo%l`= xr.etev(p{}y$klh!c2-u5Z2Xign;<=>>2b9V4*aun'xm#jb?.vp,crgt&~y"|nm^coijusWog`Rg<4:W3+bta&{l$ka>!ws-dsdu)z~x#ob_`nnkvrXn|fgSdQbuy2345523\:$kh!rg-dh5(pz&m|m~ xsuq,vdkXiegdyQiumn\mZkrp9:;<<=m;T2,cw`)zo%l`= xr.etev(p{}y$~lcPamolwqYa}efTeR``t12354YNF_U;>55Z0.eqb+ta'nf;"z| gvcp*rus{&xjaRhzlm]efZo5=2_;#j|i.sd,ci6){%l{l}!wrvp+wgjWog`Rg=d:W3+bta&{l$ka>!ws-dsdu)z~x#ob_gwohZoXe|r;<=>=e:W3+bta&{l$ka>!ws-dsdu)z~x#ob_gwohZoXe|r;<=>>1e9V4*aun'xm#jb?.vp,vdkX{UnbRg>1g9V4*aun'xm#jb?.vp,vdkX{UnbRg>_000?P6(o{l%~k!hl1,tv*qwf}x$Anaznu]`kphs:=1^<"i}f/pe+bj7&~x${}`{r.O`kphsWje~by?=4:W3+bta&{l$ka>!ws-ttkru'DidyczPcnwmp7433\:$kh!rg-dh5(pz&}{by| MbmvjqYdg|d??:4U1-dvc(un&mg<#y}/vrmpw)JkfexRm`uov761=R8&myj#|i/fn3*rt(yd~"Clotlw[firf}?986[?/fpe*w`(oe:%{!xpovq+Heh}g~Tob{at707?P6(o{l%~k!hl1,tv*qwf}x$Anaznu]`kphs?;>0Y=!hrg,qb*ak8'}y#z~ats-Ngjsi|Vidycz7259V4*aun'xm#jb?.vp,suhsz&Ghcx`{_bmvjq?512_;#j|i.sd,ci6){%||cz}/LalqkrXkfexRmv<1<1g>S7'nxm"h gm2-sw)pxg~y#@m`uov\gjsi|Vir0=0Pru0:?P6(o{l%~k!hl1,tv*qwf}x$Anaznu]`kphsWjs7=3<l;T2,cw`)zo%l`= xr.usjqt(Eje~byQlotlw[f;97Uyx?74U1-dvc(un&mg<#y}/vrmpw)JkfexRm`uov\g|:56;i0Y=!hrg,qb*ak8'}y#z~ats-Ngjsi|VidyczPcx>1:Zts:01^<"i}f/pe+bj7&~x${}`{r.O`kphsWje~byQly=1=6f=R8&myj#|i/fn3*rt(yd~"Clotlw[firf}Uhu1=1_sv1=>S7'nxm"h gm2-sw)pxg~y#@m`uov\gjsi|Vir090=c:W3+bta&{l$ka>!ws-ttkru'DidyczPcnwmpZe~4=4T~y<6;T2,cw`)zo%l`= xr.usjqt(Eje~byQlotlw[f;=78h7X> gsd-vc)`d9$|~"ynup,Ifirf}Uhcx`{_b{?1;Yu|;30Y=!hrg,qb*ak8'}y#z~ats-Ngjsi|VidyczPcx>5:7e<]9%l~k }f.eo4+qu'~zex!BcnwmpZeh}g~Tot29>^pw6<=R8&myj#|i/fn3*rt(yd~"Clotlw[firf}Uhu1912b9V4*aun'xm#jb?.vp,suhsz&Ghcx`{_bmvjqYdq5=5Sz=9:W3+bta&{l$ka>!ws-ttkru'DidyczPcnwmpZe~4149o6[?/fpe*w`(oe:%{!xpovq+Heh}g~Tob{at^az8=8Xz}8j7X> gsd-vc)`d9$|~"ynup,Ifirf}Uhcx`{_ymq8585i2_;#j|i.sd,ci6){%||cz}/LalqkrXkfexRv`r=3=6d=R8&myj#|i/fn3*rt(yd~"Clotlw[firf}Usc2=>3c8Q5)`zo$yj"ic0/uq+rvi|{%Fob{at^alqkrXpfx7?3<n;T2,cw`)zo%l`= xr.usjqt(Eje~byQlotlw[}iu4=49m6[?/fpe*w`(oe:%{!xpovq+Heh}g~Tob{at^zlv939:h1^<"i}f/pe+bj7&~x${}`{r.O`kphsWje~byQwos>5:7g<]9%l~k }f.eo4+qu'~zex!BcnwmpZeh}g~Ttb|37?0b?P6(o{l%~k!hl1,tv*qwf}x$Anaznu]`kphsWqey050=a:W3+bta&{l$ka>!ws-ttkru'DidyczPcnwmpZ~hz535>i5Z0.eqb+ta'nf;"z| wqlwv*Kdg|dSnaznu]{kw:>6Vx=k5Z0.eqb+ta'nf;"z| wqlwv*eh}g~7<3?i;T2,cw`)zo%l`= xr.usjqt(kfex1?11g9V4*aun'xm#jb?.vp,suhsz&idycz32?3e?P6(o{l%~k!hl1,tv*qwf}x$ob{at=1=5c=R8&myj#|i/fn3*rt(yd~"m`uov?0;7a3\:$kh!rg-dh5(pz&}{by| cnwmp9399o1^<"i}f/pe+bj7&~x${}`{r.alqkr;>7;m7X> gsd-vc)`d9$|~"ynup,gjsi|5=5=k5Z0.eqb+ta'nf;"z| wqlwv*eh}g~743?i;T2,cw`)zo%l`= xr.usjqt(kfex1711d9V4*aun'xm#jb?.vp,suhsz&idyczP00g8Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_03f?P6(o{l%~k!hl1,tv*qwf}x$ob{at^02a>S7'nxm"h gm2-sw)pxg~y#naznu]05`=R8&myj#|i/fn3*rt(yd~"m`uov\04c<]9%l~k }f.eo4+qu'~zex!lotlw[07b3\:$kh!rg-dh5(pz&}{by| cnwmpZ06m2_;#j|i.sd,ci6){%||cz}/bmvjqY09l1^<"i}f/pe+bj7&~x${}`{r.alqkrX08o0Y=!hrg,qb*ak8'}y#z~ats-`kphsW0897X> gsd-vc)`d9$|~"ynup,gjsi|Vn:0=0=2:W3+bta&{l$ka>!ws-ttkru'je~byQk1=3=67=R8&myj#|i/fn3*rt(yd~"m`uov\`4:56;80Y=!hrg,qb*ak8'}y#z~ats-`kphsWm;7?3<=;T2,cw`)zo%l`= xr.usjqt(kfexRj><5<16>S7'nxm"h gm2-sw)pxg~y#naznu]g5939:;1^<"i}f/pe+bj7&~x${}`{r.alqkrXl86=2?<4U1-dvc(un&mg<#y}/vrmpw)dg|dSi?37?01?P6(o{l%~k!hl1,tv*qwf}x$ob{at^f28=85:2_;#j|i.sd,ci6){%||cz}/bmvjqYc9535><5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th<Q?209V4*aun'xm#jb?.vp,suhsz&idyczPd0]264=R8&myj#|i/fn3*rt(yd~"m`uov\`4Y5:81^<"i}f/pe+bj7&~x${}`{r.alqkrXl8U8><5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th<Q;209V4*aun'xm#jb?.vp,suhsz&idyczPd0]664=R8&myj#|i/fn3*rt(yd~"m`uov\`4Y1:81^<"i}f/pe+bj7&~x${}`{r.alqkrXl8U<><5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th<Q7209V4*aun'xm#jb?.vp,suhsz&idyczPd0]:67=R8&myj#|i/fn3*rt(yd~"m`uov\`7:76;80Y=!hrg,qb*ak8'}y#z~ats-`kphsWm87=3<=;T2,cw`)zo%l`= xr.usjqt(kfexRj=<3<16>S7'nxm"h gm2-sw)pxg~y#naznu]g6959:;1^<"i}f/pe+bj7&~x${}`{r.alqkrXl;6?2?<4U1-dvc(un&mg<#y}/vrmpw)dg|dSi<35?01?P6(o{l%~k!hl1,tv*qwf}x$ob{at^f18385:2_;#j|i.sd,ci6){%||cz}/bmvjqYc:5=5>?5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th?27>308Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e0?=;463\:$kh!rg-dh5(pz&}{by| cnwmpZb5W98:7X> gsd-vc)`d9$|~"ynup,gjsi|Vn9S<<>;T2,cw`)zo%l`= xr.usjqt(kfexRj=_302?P6(o{l%~k!hl1,tv*qwf}x$ob{at^f1[6463\:$kh!rg-dh5(pz&}{by| cnwmpZb5W=8:7X> gsd-vc)`d9$|~"ynup,gjsi|Vn9S8<>;T2,cw`)zo%l`= xr.usjqt(kfexRj=_702?P6(o{l%~k!hl1,tv*qwf}x$ob{at^f1[2463\:$kh!rg-dh5(pz&}{by| cnwmpZb5W18:7X> gsd-vc)`d9$|~"ynup,gjsi|Vn9S4<=;T2,cw`)zo%l`= xr.usjqt(kfexRj<<1<16>S7'nxm"h gm2-sw)pxg~y#naznu]g7979:;1^<"i}f/pe+bj7&~x${}`{r.alqkrXl:692?<4U1-dvc(un&mg<#y}/vrmpw)dg|dSi=33?01?P6(o{l%~k!hl1,tv*qwf}x$ob{at^f08185:2_;#j|i.sd,ci6){%||cz}/bmvjqYc;5?5>?5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th>29>308Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e1?3;453\:$kh!rg-dh5(pz&}{by| cnwmpZb44149>6[?/fpe*w`(oe:%{!xpovq+firf}Uo?171209V4*aun'xm#jb?.vp,suhsz&idyczPd2]364=R8&myj#|i/fn3*rt(yd~"m`uov\`6Y6:81^<"i}f/pe+bj7&~x${}`{r.alqkrXl:U9><5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th>Q<209V4*aun'xm#jb?.vp,suhsz&idyczPd2]764=R8&myj#|i/fn3*rt(yd~"m`uov\`6Y2:81^<"i}f/pe+bj7&~x${}`{r.alqkrXl:U=><5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th>Q8209V4*aun'xm#jb?.vp,suhsz&idyczPd2];64=R8&myj#|i/fn3*rt(yd~"m`uov\`6Y>:=1^<"i}f/pe+bj7&~x${}`{r.alqkrXff~;<=?>7:W3+bta&{l$ahc dnww[l:76820Y=!hrg,qb*kbe&ndyyQf<02=5==R8&myj#|i/lgn+air|Vc7=<0>8:W3+bta&{l$ahc dnww[l:6:7;37X> gsd-vc)jmd%ocxzPi=30:4><]9%l~k }f.ofi*bh}}Ub0<:1199V4*aun'xm#`kb/emvpZo;9<4:46[?/fpe*w`(elg$hb{{_h>22;7?3\:$kh!rg-nah)cg|~Te1?8>0:8Q5)`zo$yj"cjm.flqqYn4825=55Z0.eqb+ta'dof#iazt^k?5<86?2_;#j|i.sd,i`k(lfSd2>>0:8Q5)`zo$yj"cjm.flqqYn4;:5=55Z0.eqb+ta'dof#iazt^k?648602_;#j|i.sd,i`k(lfSd2=2?3;?P6(o{l%~k!bel-gkprXa5882<64U1-dvc(un&gna"j`uu]j8729911^<"i}f/pe+hcj'me~xRg324<2<>S7'nxm"h mdo,`jssW`69:3?7;T2,cw`)zo%fi`!kotv\m9406820Y=!hrg,qb*kbe&ndyyQf<3:=5==R8&myj#|i/lgn+air|Vc7>40>7:W3+bta&{l$ahc dnww[l:56820Y=!hrg,qb*kbe&ndyyQf<22=5==R8&myj#|i/lgn+air|Vc7?<0>8:W3+bta&{l$ahc dnww[l:4:7;37X> gsd-vc)jmd%ocxzPi=10:4><]9%l~k }f.ofi*bh}}Ub0>:1199V4*aun'xm#`kb/emvpZo;;<4:;6[?/fpe*w`(elg$hb{{_h>0:41<]9%l~k }f.ofi*bh}}Ub090>7:W3+bta&{l$ahc dnww[l:268=0Y=!hrg,qb*kbe&ndyyQf<7<23>S7'nxm"h mdo,`jssW`6<2<94U1-dvc(un&gna"j`uu]j8=86?2_;#j|i.sd,i`k(lfSd26>048Q5)`zo$yj"cjm.flqqYnW9;=7X> gsd-vc)jmd%ocxzPi^323>S7'nxm"h mdo,`jssW`U:<<94U1-dvc(un&gna"j`uu]j[476?2_;#j|i.sd,i`k(lfSdQ>2058Q5)`zo$yj"cjm.flqqYnW89:;6[?/fpe*w`(elg$hb{{_h]2041<]9%l~k }f.ofi*bh}}UbS<;>7:W3+bta&{l$ahc dnww[lY6>8=0Y=!hrg,qb*kbe&ndyyQf_0523>S7'nxm"h mdo,`jssW`U:4<94U1-dvc(un&gna"j`uu]j[4?6>2_;#j|i.sd,i`k(lfSdQ=169V4*aun'xm#`kb/emvpZoX:9;<7X> gsd-vc)jmd%ocxzPi^0252=R8&myj#|i/lgn+air|VcT>??8;T2,cw`)zo%fi`!kotv\mZ449>1^<"i}f/pe+hcj'me~xRgP2534?P6(o{l%~k!bel-gkprXaV8>=:5Z0.eqb+ta'dof#iazt^k\63703\:$kh!rg-nah)cg|~TeR<8169V4*aun'xm#`kb/emvpZoX:1;<7X> gsd-vc)jmd%ocxzPi^0:53=R8&myj#|i/lgn+air|VcT?<94U1-dvc(un&gna"j`uu]j[666?2_;#j|i.sd,i`k(lfSdQ<1058Q5)`zo$yj"cjm.flqqYnW:8:;6[?/fpe*w`(elg$hb{{_h]0741<]9%l~k }f.ofi*bh}}UbS>:>7:W3+bta&{l$ahc dnww[lY4=8<0Y=!hrg,qb*kbe&ndyyQf_535?P6(o{l%~k!bel-gkprXaV?::6[?/fpe*w`(elg$hb{{_h]553=R8&myj#|i/lgn+air|VcT;<84U1-dvc(un&gna"j`uu]j[=713\:$kh!rg-nah)cg|~TeR7>9:W3+bta&{l$ahc dnww[hcj494:m6[?/fpe*w`(elg$hb{{_lgn84699h1^<"i}f/pe+hcj'me~xRcjm=32:4g<]9%l~k }f.ofi*bh}}Ufi`2>2?3b?P6(o{l%~k!bel-gkprXelg7=>0>a:W3+bta&{l$ahc dnww[hcj48>5=l5Z0.eqb+ta'dof#iazt^ofi97268k0Y=!hrg,qb*kbe&ndyyQbel>22;7f3\:$kh!rg-nah)cg|~Tahc316<2e>S7'nxm"h mdo,`jssWdof0<611`9V4*aun'xm#`kb/emvpZkbe5;22<74U1-dvc(un&gna"j`uu]nah:668k0Y=!hrg,qb*kbe&ndyyQbel>14;7f3\:$kh!rg-nah)cg|~Tahc320<2e>S7'nxm"h mdo,`jssWdof0?<11`9V4*aun'xm#`kb/emvpZkbe5882<o4U1-dvc(un&gna"j`uu]nah:5<7;j7X> gsd-vc)jmd%ocxzPmdo?6086i2_;#j|i.sd,i`k(lfS`kb<34=5d=R8&myj#|i/lgn+air|Vgna1<8>0c8Q5)`zo$yj"cjm.flqqYjmd6943?n;T2,cw`)zo%fi`!kotv\i`k;:04:56[?/fpe*w`(elg$hb{{_lgn8786i2_;#j|i.sd,i`k(lfS`kb<22=5d=R8&myj#|i/lgn+air|Vgna1=>>0c8Q5)`zo$yj"cjm.flqqYjmd68>3?n;T2,cw`)zo%fi`!kotv\i`k;;:4:m6[?/fpe*w`(elg$hb{{_lgn86299h1^<"i}f/pe+hcj'me~xRcjm=16:4?<]9%l~k }f.ofi*bh}}Ufi`2<>0;8Q5)`zo$yj"cjm.flqqYjmd6?2<74U1-dvc(un&gna"j`uu]nah:26830Y=!hrg,qb*kbe&ndyyQbel>5:4?<]9%l~k }f.ofi*bh}}Ufi`28>0;8Q5)`zo$yj"cjm.flqqYjmd632<74U1-dvc(un&gna"j`uu]nah:>6>>0Y=!hrg,qb*kbe&mia#immf,dfhaf&gmnon mmf-ahnYjmdUlick}aumq+sgkam$hy| r`ookjv\8T$ym` }/r1\jjoia}$ym`!kpscn*av60q9="ob1c9V4*aun'xm#`kb/uos[wgjW{nTic?l;T2,cw`)zo%fi`!{mq]qehYulVoe=<94U1-dvc(un&xjaR|jgnww[`h6l2_;#j|i.sd,vvredb%yhR||t^cpv`a582_;#j|i.sd,vvredb%yhR||t^cpv`aXl88;7X> gsd-vc)u{}hgg"|k_sqw[duumnUo><m4U1-dvc(un&xxxobd/sf\vvrXkfgi=i5Z0.eqb+ta'{ynae re]qwqYdgdh:=h5Z0.eqb+ta'{ynae re]qwqYumn6;2<k4U1-dvc(un&xxxobd/sf\vvrXzlm7=3?j;T2,cw`)zo%yylck.pg[wusW{ol0?0>d:W3+bta&{l$~~zmlj-q`Ztt|VxnkR>>d:W3+bta&{l$~~zmlj-q`Ztt|VxnkR?>d:W3+bta&{l$~~zmlj-q`Ztt|VxnkR<>d:W3+bta&{l$~~zmlj-tvZtt|Vkx~hi=0:W3+bta&{l$~~zmlj-tvZtt|Vkx~hiPd003?P6(o{l%~k!}su`oo*quW{ySl}}ef]g64e<]9%l~k }f.pppgjl'~xT~~zPcnoa5a=R8&myj#|i/sqwfim({UyyQlol`25`=R8&myj#|i/sqwfim({UyyQ}ef>3:4c<]9%l~k }f.pppgjl'~xT~~zPrde?5;7c3\:$kh!rg-qwqdkc&}yS}{_sgd[57c3\:$kh!rg-qwqdkc&}yS}{_sgd[4g<]ZOYSLBFARa8QVCUW_CXEOBJ3:T@G<=QAL]TXT^J3:UFE6=PMKi0[_G[E^OL@@YFk2]YEYKPMNFF[Gb<_[C_IRYFDUJ\Ea=PZ@^NSZGKTI]A5a=_AECET VKB!2-5%US]K*;"<.NSBKJ1>^HZJS=7U][LH@4?]USWNDO;6V\T^T@Gg=_WJEYIRGAFN48\adXAml0TifPPsknR`ttafd:<6Vkm^ObnjtQm{ybcc??;Yfn[Hoig{\n~~g`nb9bhhit|Vof|ywm;`nnkvrXn|fg:6lncjws`>dfkb{S`o}kdp0?fjll2njxlQlotlw,5/c3mkmRm`uov+5,b<lh~jSnaznu*1-a=ci}kTob{at)1*`>bf|hUhcx`{(5+g?agsiVidycz'5(f8`drfWje~by&9)e9geqgXkfex%9&d:fbpdYdg|d$5'k;ecweZeh}g~#5$h4d`vb[firf}626=08;e`jp`tu>2nbb%>&6:fjj-7.?2nbb%??)69gmk.69 =0hd`'13+4?aoi 89";6jfn)37-2=cag":9$94dhl+53/03mce$<9&6:fjj-4.>2nbb%=&6:fjj-2.>2nbb%;&6:fjj-0.>2nbb%9&6:fjj->.>2nbb%7&6:fjj969?2nbb1??>69gmk:697=0hd`313<4?aoi4895;6jfn=37:2=cag6:9394dhl?538>3mce0<950?58`lh;9>4=7iga<0<5?aoi4;4=7iga<2<5?aoi4=4=7iga<4<5?aoi4?4=7iga<6<5?aoi414=7iga<8<4?air|!:";6j`uu*2-==cg|~#=='7;emvp-76!11ocxz'13+;?air|!;8%55kotv+51/?3me~x%?:)99gkpr/9?#37iazt)34-==cg|~#=5'7;emvp-7>!>1ocxz'2(:8`jss ;:"46j`uu*15,><lf$?<&8:flqq.5; 20hb{{(36*<>bh}}"99$64dnww,70.02ndyy&=7(:8`jss ;2"46j`uu*1=,1<lf$>'7;emvp-57!11ocxz'30+;?air|!99%55kotv+76/?3me~x%=;)99gkpr/;<#<7iazt)6*3>bh}}">%:5kotv+2,1<lf$:'8;emvp->.?2ndyy&6)69gkpr;8720hb{{<02=<>bh}}6:=364dnww844902ndyy2>3?:8`jss48>546j`uu>21;><lf0<818:flqq:6?720hb{{<0:=<>bh}}6:5394dnww848?3me~x1<?>99gkpr;:8437iazt=01:==cg|~7>>07;emvp943611ocxz324<;?air|58=255kotv?628?3me~x1<7>99gkpr;:04<7iazt=0=<>bh}}68<364dnww867902ndyy2<2?:8`jss4:9546j`uu>00;g<lf0>;50?:8`jss4:?5;6j`uu>0:2=cg|~78394dnww80803me~x1817:flqq:06>1ocxz38?58`jss40437hjff3ld`0=bey~r>k5iigm\c`hbzh~d~Rx9_0.#\ljnfq*HC_K/Gdlfvdrhz);9"<?l;gkekZ~kfqU>=?v<6^0`hnY60}e8:>o4fhdl[}jipV?:>u=9_3aooZ7?|f9= kgio^efj`tf|fxTz;Q>,OMMA)HHFL>;?6hffn]{hk~X=88s?;Q=cmi\5=rh;?&mekaPgdlfvdrhzV|=S<"tc^jbwZoi|Vigg0>#c^jbwZuu{}7; nQ}d^dqat;6$jUnbllce^pppZu~fj7: nQgar]q`Zbf|hUhcx`{=1.`[aoiW~coxe3>8-a\lduX{UomyoPcnwmp86+kVl~`aQil`ep[wusWkg1="l_hosh`kbf}keb`Ptxrf97*dW|ynShcmeeff`Ztbo4:'oRy}_gpfu87+kVxiRj`uu]qwq;6$jU~bik}fmmt[iip59&hSeo|_ntfvcjh4:'oR~}emmb`Zjf|ldhu0>#c^flqqYpam~c1>8#c^opcjhX~hf6=!mPre]gauro5<;9 nQjrsmq[lhmmj~bccQ{yqg>4)eX`hyTycjjrgnls86+kVbjRocmnqw[cskd4;'oRfns^ppp87+kVnjxlQlotlw[roc|a7:<!mPh`q\swYfkb7; nQzsd]fgf;7$jUhc`c`n^aokfm:8%iT{Qncj]okr;7$jUyhR~ats]tmaro50&hSx}j_guepZbf|hUhcx`{=1.`[mgtWhffc~zPelrw}86+kVxoSio{a^alqkrX`nd07#c^muaw`kg~Ugcz3?,b]tvZvi|{U|eizg=02/gZvugnUna}zv_u{sa86+kV}ySio{a^alqkrX`nd0??,b]sv`jhimUyij}21-a\`jssW{yS{oc=1.`[mgtWmkmRm`uov>4)eXx{elSk{cl^vkv`uoWgolmykPv`n>5573$jU|~Rjjpuj>5543$jU{~biPelrw}ZrozlycSckhaug\rdj:=%iT|ah_dosp|Ys`{oxdRo|sdpw[sgk5=&hSeo|_wcoma;7$jU{~biPftno[qnumzbTm~}jru]uei;688?'obcoogmpZhfel7mekaPxml{[075p:<T>nbd_0:wk60+kV|j`djPlnu>4)eXx{cfSkgio^vzt`;6cq;3 nQrne\bpjkW}s{i0?#c^ofijt~W}s{i0?#}248bl`hWqfetR;>2y15[7ekcV;3xb=9_gkekZabflxjxb|Pv7]2[}usW8>0jxbcd:kmn`eslkci|k;hliafrtj`~n~94iov\gim?3gmhnxgcd99lr`tadf}j7}|`g^gntq6<2zycjQjmqvz[qnumzb#<$?;;qplcZcjx}sTxe|jsi*2-42<x{elShctx]wlwct`!8"=95rne\ahvsqV~c~h}g(2+20>vugnUna}zv_ujqavn/< ;?7}|`g^gntqX|axne&:)068twi`Wlg{xtQ{hsgpl-0.9=1{~biPelrw}Zrozlyc$:'>4:rqkbYbey~rSyf}erj+<,713yxdkRkbpu{\pmtb{a636=0>b:rqkbYbey~rSyf}erj\evubz}";%<l4psmd[`kw|pUdk|h^cpw`ts 8#:n6~}of]fiur~W}byi~fParqfvq.5!8h0|ah_dosp|Ys`{oxdRo|sdpw,6/6j2zycjQjmqvz[qnumzbTm~}jru*7-4d<x{elShctx]wlwct`Vkxh|{(4+2f>vugnUna}zv_ujqavnXizyn~y&9)0`8twi`Wlg{xtQ{hsgplZgt{lx$:'>b:rqkbYbey~rSyf}erj\evubz}"3%<j4psmd[`kw|pUdk|h^cpw`ts410;2<l4psmd[`kw|pUdk|h^lfcdrb 9#:n6~}of]fiur~W}byi~fPndebp`.6!8h0|ah_dosp|Ys`{oxdR`jg`vf,7/6j2zycjQjmqvz[qnumzbTbhintd*0-4d<x{elShctx]wlwct`Vdnklzj(5+2f>vugnUna}zv_ujqavnXflmjxh&:)0`8twi`Wlg{xtQ{hsgplZhboh~n$;'>b:rqkbYbey~rSyf}erj\j`af|l"<%<l4psmd[`kw|pUdk|h^lfcdrb 1#:h6~}of]fiur~W}byi~fPndebp`:?29427}|`g^dvhi743yxdkRhzlm]wlwct`!:"=>5rne\bpjkW}byi~f'1(30?uthoVl~`aQ{hsgpl-4.9:1{~biPftno[qnumzb#?$?<;qplcZ`rdeUdk|h)6*56=wzfmTjxbc_ujqavn/= ;87}|`g^dvhiYs`{oxd%8&129svjaXn|fgSyf}erj+3,743yxdkRhzlm]wlwct`!2"=>5rne\bpjkW}byi~f'9(36?uthoVl~`aQ{hsgpl9?=87;j7}|`g^dvhiYs`{oxdRo|sdpw,5/6i2zycjQiumn\pmtb{aUj~k}t)3*5d=wzfmTjxbc_ujqavnXizyn~y&=)0c8twi`Wog`Rzgrdqk[dutm{~#?$?n;qplcZ`rdeUdk|h^cpw`ts =#:m6~}of]eqijX|axneQnsrgqp-3.9h1{~biPftno[qnumzbTm~}jru*5-4g<x{elSk{cl^vkv`uoWhyxiz'7(3b?uthoVl~`aQ{hsgplZgt{lx$5'>a:rqkbYa}efTxe|jsi]bwvcu|!3"=n5rne\bpjkW}byi~fParqfvq:>294:m6~}of]eqijX|axneQaefcwa-6.9h1{~biPftno[qnumzbTbhintd*2-4g<x{elSk{cl^vkv`uoWgolmyk'2(3b?uthoVl~`aQ{hsgplZhboh~n$>'>a:rqkbYa}efTxe|jsi]mabgsm!>"=l5rne\bpjkW}byi~fPndebp`.2!8k0|ah_gwohZrozlycSckhaug+2,7f3yxdkRhzlm]wlwct`Vdnklzj(6+2e>vugnUmyabPtipfwmYimnki%6&1`9svjaXn|fgSyf}erj\j`af|l"2%<m4psmd[cskdV~c~h}g_ogdeqc;13:5:6|k_bnh55=ulVnjxlQlotlw,5/682xoSio{a^alqkr/9 ;;7jPd`vb[firf}"9%<>4re]geqgXkfex%=&119q`Zbf|hUhcx`{(5+24>tcWmkmRm`uov+1,773{nThlzn_bmvjq.1!8:0~iQkauc\gjsi|!="==5}d^fbpdYdg|d$5'>0:pg[agsiVidycz30?31?wbXlh~jSnaznu>;>5823{nTic84re]qwq5<zz~<7~lftdpq0>uu{}837yc/^ad+coagVrgbuQ:13z02Z4ddbU:4ya<6/ldk1=sz|o27x`kesdokr3<~hfbh;5xr^c`o3=pzVigg<>4ws]geqgXkfex%>&119tvZbf|hUhcx`{(0+24>quWmkmRm`uov+6,773~xThlzn_bmvjq.4!8:0{Qkauc\gjsi|!>"==5xr^fbpdYdg|d$8'>0:uq[agsiVidycz'6(33?rtXlh~jSnaznu*4-46<{UomyoPcnwmp->.991|~Rjnt`]`kphs 0#:>6y}_ecweZeh}g~757>15:uq[`h13~xT~~zr@Ar``==GHq?=>7H54;3xW1c==991;7?<2c4g6?4f:k=pb96=:09m0=5=>2.?4=4;7`9~W1e==991;7?<2c4g6?4f:k=0_<<m:42f>5<6;;h=h?4=a3`;?V2d2<:n6=4>33`5`7<5i;h37i;?6;295?7|[=o19==57;306g0c:38j>o94vU3;e?6=93;1=n>tS5g9155=?3;8>o8k2;0b6g1<,==86<<l;W6;5?4|}89?6<5z12794>{#9>o1=55m51494?5a2:08jvF;709Y01<5s8=1==4r$0:e>0613-><j7;?5:k61a<722e?484?::m66c<722c>;>4?::m64d<722e><94?::k622<722c>9k4?::m7`2<72-;3<7:ia:l23c<732e?h;4?:%3;4?2ai2d:;k4>;:m7`0<72-;3<7:ia:l23c<532e?h94?:%3;4?2ai2d:;k4<;:m7`6<72-;3<7:ia:l23c<332e?h?4?:%3;4?2ai2d:;k4:;:m7`5<72-;3<7:ia:l23c<132e?ok4?:%3;4?2ai2d:;k48;:m7g`<72-;3<7:ia:l23c<?32e?oi4?:%3;4?2ai2d:;k46;:m7gf<72-;3<7:ia:l23c<f32e?oo4?:%3;4?2ai2d:;k4m;:m7gd<72-;3<7:ia:l23c<d32e?o44?:%3;4?2ai2d:;k4k;:m7g=<72-;3<7:ia:l23c<b32e?o:4?:%3;4?2ai2d:;k4i;:m7g0<72-;3<7:ia:l23c<6821d8n:50;&2<5<3nh1e=:h51098k1e4290/=5>54gc8j41a28807b:l2;29 4>72=lj7c?8f;30?>i3k80;6)?70;6ee>h6?o0:865`4b294?"6090?jl5a16d950=<g=hm6=4+19290cg<f8=m6<84;n6aa?6=,82;69hn;o34b?7032e?ni4?:%3;4?2ai2d:;k4>8:9l0ge=83.:4=4;f`9m52`=9010c9jk:18'5=6=<ok0b<9i:0c8?j2ck3:1(<6?:5db?k70n3;i76a;dc83>!7?83>mm6`>7g82g>=h<mk1<7*>8187bd=i9>l1=i54o5f:>5<#91:18ko4n05e>4c<3f>o47>5$0:3>1`f3g;<j7?i;:m7`4<72-;3<7:ia:l23c<5821d8n850;&2<5<3nh1e=:h52098k1de290/=5>54gc8j41a2;807b:ma;29 4>72=lj7c?8f;00?>o31l0;6)?70;6bb>h6?o0;76g;9e83>!7?83>jj6`>7g82?>o31j0;6)?70;6bb>h6?o0976g;9c83>!7?83>jj6`>7g80?>o31h0;6)?70;6bb>h6?o0?76g;9883>!7?83>jj6`>7g86?>o3110;6)?70;6bb>h6?o0=76g;9683>!7?83>jj6`>7g84?>o3i?0;6)?70;6bb>h6?o0376g;a483>!7?83>jj6`>7g8:?>o3i=0;6)?70;6bb>h6?o0j76g;a283>!7?83>jj6`>7g8a?>o3i;0;6)?70;6bb>h6?o0h76g;a083>!7?83>jj6`>7g8g?>o3i90;6)?70;6bb>h6?o0n76g;9g83>!7?83>jj6`>7g8e?>o31?0;6)?70;6bb>h6?o0:<65f48794?"6090?mk5a16d954=<a<?:6=44b551>5<6290;wE:81:&2<c<3?;1d=:j50;9~fa1=83;1<7>tH552?!7?n3n<7bj9:188yg24290j:7?74;3`4~N3?81Q894>6z0;>71=:00h644n:c823?772;k1h7m5d;34>7g=:10:<7l5a;;96<<5?3w/=5h551;8 11==9=0(9j551:8 41>28=h7d;=3;29 4>72<8?7c?8f;28?l35:3:1(<6?:407?k70n3;07d;=1;29 4>72<8?7c?8f;08?l3583:1(<6?:407?k70n3907d;>f;29 4>72<8?7c?8f;68?l36m3:1(<6?:407?k70n3?07d;>d;29 4>72<8?7c?8f;48?l36k3:1(<6?:407?k70n3=07d;>b;29 4>72<8?7c?8f;:8?l37k3:17d;:e;29?l3193:17b;95;29?l3613:1(<6?:43b?k70n3:07d;>8;29 4>72<;j7c?8f;38?l36?3:1(<6?:43b?k70n3807d;>6;29 4>72<;j7c?8f;18?l36=3:1(<6?:43b?k70n3>07d;>4;29 4>72<;j7c?8f;78?l36;3:1(<6?:43b?k70n3<07d;>2;29 4>72<;j7c?8f;58?l3693:1(<6?:43b?k70n3207d;:d;29?j37n3:17d;=d;29 4>72<8n7c?8f;28?l35k3:1(<6?:40f?k70n3;07d;=b;29 4>72<8n7c?8f;08?l35i3:1(<6?:40f?k70n3907d;=9;29 4>72<8n7c?8f;68?l3503:1(<6?:40f?k70n3?07d;=7;29 4>72<8n7c?8f;48?l35>3:1(<6?:40f?k70n3=07d;=5;29 4>72<8n7c?8f;:8?j2?=3:17b:62;29 4>72=387c?8f;28?j2>93:1(<6?:5;0?k70n3;07b:60;29 4>72=387c?8f;08?j2?n3:1(<6?:5;0?k70n3907b:7e;29 4>72=387c?8f;68?j2?l3:1(<6?:5;0?k70n3?07b:7c;29 4>72=387c?8f;48?j2?j3:1(<6?:5;0?k70n3=07b:7a;29 4>72=387c?8f;:8?j2?13:1(<6?:5;0?k70n3307b;=f;29?l30;3:17d;<9;29 4>72<9j7c?8f;28?l3403:1(<6?:41b?k70n3;07d;<7;29 4>72<9j7c?8f;08?l34>3:1(<6?:41b?k70n3907d;<5;29 4>72<9j7c?8f;68?l34<3:1(<6?:41b?k70n3?07d;<3;29 4>72<9j7c?8f;48?l34:3:1(<6?:41b?k70n3=07d;<1;29 4>72<9j7c?8f;:8?l3483:1(<6?:41b?k70n3307b;?a;29?j37<3:17d;97;29?l2??3:17d;;4;29 4>72<>>7c?8f;28?l33;3:1(<6?:466?k70n3;07d;;2;29 4>72<>>7c?8f;08?l3393:1(<6?:466?k70n3907d;;0;29 4>72<>>7c?8f;68?l34n3:1(<6?:466?k70n3?07d;<e;29 4>72<>>7c?8f;48?l34l3:1(<6?:466?k70n3=07d;<c;29 4>72<>>7c?8f;:8?l34j3:1(<6?:466?k70n3307d;;f;29 4>72<?;7c?8f;28?l33m3:1(<6?:473?k70n3;07d;;d;29 4>72<?;7c?8f;08?l33k3:1(<6?:473?k70n3907d;;b;29 4>72<?;7c?8f;68?l33i3:1(<6?:473?k70n3?07d;;9;29 4>72<?;7c?8f;48?l3303:1(<6?:473?k70n3=07d;;7;29 4>72<?;7c?8f;:8?l33>3:1(<6?:473?k70n3307b:74;29?l37l3:17d:78;29?l30<3:17b;90;29?j31>3:17d;:f;29?j2c?3:1(<6?:5db?k70n3:07b:k6;29 4>72=lj7c?8f;38?j2c=3:1(<6?:5db?k70n3807b:k4;29 4>72=lj7c?8f;18?j2c;3:1(<6?:5db?k70n3>07b:k2;29 4>72=lj7c?8f;78?j2c83:1(<6?:5db?k70n3<07b:lf;29 4>72=lj7c?8f;58?j2dm3:1(<6?:5db?k70n3207b:ld;29 4>72=lj7c?8f;;8?j2dk3:1(<6?:5db?k70n3k07b:lb;29 4>72=lj7c?8f;`8?j2di3:1(<6?:5db?k70n3i07b:l9;29 4>72=lj7c?8f;f8?j2d03:1(<6?:5db?k70n3o07b:l7;29 4>72=lj7c?8f;d8?j2d=3:1(<6?:5db?k70n3;;76a;c583>!7?83>mm6`>7g825>=h<j91<7*>8187bd=i9>l1=?54o5a1>5<#91:18ko4n05e>45<3f>h=7>5$0:3>1`f3g;<j7?;;:m7g5<72-;3<7:ia:l23c<6=21d8oh50;&2<5<3nh1e=:h51798k1db290/=5>54gc8j41a28=07b:md;29 4>72=lj7c?8f;3;?>i3jj0;6)?70;6ee>h6?o0:565`4ef94?"6090?jl5a16d95d=<g=nh6=4+19290cg<f8=m6<l4;n6gf?6=,82;69hn;o34b?7d32e?hl4?:%3;4?2ai2d:;k4>d:9l0a?=83.:4=4;f`9m52`=9l10c9j7:18'5=6=<ok0b<9i:0d8?j2c93:1(<6?:5db?k70n38;76a;c783>!7?83>mm6`>7g815>=h<kh1<7*>8187bd=i9>l1>?54o5`b>5<#91:18ko4n05e>75<3`>2i7>5$0:3>1ga3g;<j7>4;h6:`?6=,82;69oi;o34b?7<3`>2o7>5$0:3>1ga3g;<j7<4;h6:f?6=,82;69oi;o34b?5<3`>2m7>5$0:3>1ga3g;<j7:4;h6:=?6=,82;69oi;o34b?3<3`>247>5$0:3>1ga3g;<j784;h6:3?6=,82;69oi;o34b?1<3`>j:7>5$0:3>1ga3g;<j764;h6b1?6=,82;69oi;o34b??<3`>j87>5$0:3>1ga3g;<j7o4;h6b7?6=,82;69oi;o34b?d<3`>j>7>5$0:3>1ga3g;<j7m4;h6b5?6=,82;69oi;o34b?b<3`>j<7>5$0:3>1ga3g;<j7k4;h6:b?6=,82;69oi;o34b?`<3`>2:7>5$0:3>1ga3g;<j7??;:k7=0<72-;3<7:nf:l23c<6921b85850;9l10g=83.:4=4:5b9m52`=821d98750;&2<5<2=j1e=:h51:9l10>=83.:4=4:5b9m52`=:21d98950;&2<5<2=j1e=:h53:9l100=83.:4=4:5b9m52`=<21d98;50;&2<5<2=j1e=:h55:9l102=83.:4=4:5b9m52`=>21d98=50;&2<5<2=j1e=:h57:9l104=83.:4=4:5b9m52`=021d9:?50;&2<5<2?;1e=:h50:9l126=83.:4=4:739m52`=921d9;h50;&2<5<2?;1e=:h52:9l13c=83.:4=4:739m52`=;21d9;j50;&2<5<2?;1e=:h54:9l13e=83.:4=4:739m52`==21d9;l50;&2<5<2?;1e=:h56:9l13g=83.:4=4:739m52`=?21d9;750;&2<5<2?;1e=:h58:9l13>=83.:4=4:739m52`=121d9<>50;9j15d=831d84:50;9j107=831d9;:50;9a02b=83;1<7>t$0:e>a1<@==h7E:81:mg2?6=3th?;h4?:083>5}#91l18:<4H55`?M2092e:;i4?::a6d6=83>1<7>t$0:e>a4<@==h7E:81:&f1?0<a=?1<75f4g83>>o6080;66a>8383>>{e<<o1<7=50;2x 4>a2jl0D99l;I645>N3:2.:??4:629'a0<63`>>6=44i5d94?=h9181<75rb54:>5<4290;w)?7f;ae?M20k2B?;<5G439'564==?90(h;51:k71?6=3`>m6=44o0:1>5<<uk>>h7>53;294~"60o0hj6F;7b9K027<@=80(<==:440?!c2281b884?::k7b?6=3f;3>7>5;|`722<72<0;6=u+19d9`6=O<>i0D99>;I61?!74:3?=?6g;5;29?l212900e9h50;9j5=7=831d=5<50;9~f10?29086=4?{%3;b?ea3A><o6F;709K07=#9:819;=4$d795>o3=3:17d:i:188k4>52900qo::c;291?6=8r.:4k4k3:J73f=O<>;0D9<4$011>0043`>>6=44i5494?=n<o0;66g>8083>>i60;0;66sm47494?2=83:p(<6i:e08L11d3A><=6*j5;48m13=831b8k4?::k2<4<722e:4?4?::a033=83>1<7>t$0:e>a4<@==h7E:81:&f1?0<a=?1<75f4g83>>o6080;66a>8383>>{e<?>1<7:50;2x 4>a2m80D99l;I645>"b=3<0e9;50;9j0c<722c:4<4?::m2<7<722wi8;h50;694?6|,82m6i<4H55`?M2092.n9784i5794?=n<o0;66g>8083>>i60;0;66sm47g94?2=83:p(<6i:e08L11d3A><=6*j5;48m13=831b8k4?::k2<4<722e:4?4?::a642=83>1<7>t$0:e>a6<@==h7E:81:&f1?7<a=?1<75f4c83>>o3n3:17b?72;29?xd59:0;694?:1y'5=`=l91C8:m4H552?!c2281b884?::k7f?6=3`>m6=44o0:1>5<<uk8:>7>54;294~"60o0o<6F;7b9K027<,l?1=6g;5;29?l2e2900e9h50;9l5=4=831vn??>:187>5<7s-;3j7j?;I64g>N3?81/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm20294?2=83:p(<6i:e28L11d3A><=6*j5;38m13=831b8o4?::k7b?6=3f;3>7>5;|`14c<72=0;6=u+19d9`5=O<>i0D99>;%g6>4=n<<0;66g;b;29?l2a2900c<6=:188yg47m3:187>50z&2<c<c82B?;n5G4638 `3=92c?97>5;h6a>5<<a=l1<75`19094?=zj;:o6=4;:183!7?n3n;7E:8c:J734=#m<0:7d:::188m1d=831b8k4?::m2<7<722wi>=m50;694?6|,82m6i>4H55`?M2092.n97?4i5794?=n<k0;66g;f;29?j7?:3:17pl>b383>1<729q/=5h5d19K02e<@==:7)k::09j00<722c?n7>5;h6e>5<<g8296=44}c3a5?6=<3:1<v*>8g8g4>N3?j1C8:?4$d795>o3=3:17d:m:188m1`=831d=5<50;9~f4d7290?6=4?{%3;b?b73A><o6F;709'a0<63`>>6=44i5`94?=n<o0;66a>8383>>{e9hl1<7:50;2x 4>a2m:0D99l;I645>"b=3;0e9;50;9j0g<722c?j7>5;n3;6?6=3th:mh4?:583>5}#91l1h=5G46a8L1163-o>6<5f4483>>o3j3:17d:i:188k4>52900qo?nd;290?6=8r.:4k4k0:J73f=O<>;0(h;51:k71?6=3`>i6=44i5d94?=h9181<75rb0c`>5<3290;w)?7f;f3?M20k2B?;<5+e482?l222900e9l50;9j0c<722e:4?4?::a5dd=83>1<7>t$0:e>a6<@==h7E:81:&f1?7<a=?1<75f4c83>>o3n3:17b?72;29?xd6ih0;694?:1y'5=`=l91C8:m4H552?!c2281b884?::k7f?6=3`>m6=44o0:1>5<<uk8=<7>54;294~"60o0o<6F;7b9K027<,l?1=6g;5;29?l2e2900e9h50;9l5=4=831vn?;i:187>5<7s-;3j7j?;I64g>N3?81/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm24g94?2=83:p(<6i:e28L11d3A><=6*j5;38m13=831b8o4?::k7b?6=3f;3>7>5;|`11a<72=0;6=u+19d9`5=O<>i0D99>;%g6>4=n<<0;66g;b;29?l2a2900c<6=:188yg42k3:187>50z&2<c<c82B?;n5G4638 `3=92c?97>5;h6a>5<<a=l1<75`19094?=zj;?i6=4;:183!7?n3n;7E:8c:J734=#m<0:7d:::188m1d=831b8k4?::m2<7<722wi>8o50;694?6|,82m6i>4H55`?M2092.n97?4i5794?=n<k0;66g;f;29?j7?:3:17pl=5883>1<729q/=5h5d19K02e<@==:7)k::09j00<722c?n7>5;h6e>5<<g8296=44}c06<?6=<3:1<v*>8g8g4>N3?j1C8:?4$d795>o3=3:17d:m:188m1`=831d=5<50;9~f4`f290?6=4?{%3;b?b73A><o6F;709'a0<63`>>6=44i5`94?=n<o0;66a>8383>>{e9o31<7:50;2x 4>a2m:0D99l;I645>"b=3;0e9;50;9j0g<722c?j7>5;n3;6?6=3th:j54?:583>5}#91l1h=5G46a8L1163-o>6<5f4483>>o3j3:17d:i:188k4>52900qo?i7;290?6=8r.:4k4k0:J73f=O<>;0(h;51:k71?6=3`>i6=44i5d94?=h9181<75rb0d5>5<3290;w)?7f;f3?M20k2B?;<5+e482?l222900e9l50;9j0c<722e:4?4?::a5c3=83>1<7>t$0:e>a6<@==h7E:81:&f1?7<a=?1<75f4c83>>o3n3:17b?72;29?xd6n=0;694?:1y'5=`=l91C8:m4H552?!c2281b884?::k7f?6=3`>m6=44o0:1>5<<uk;m?7>54;294~"60o0o<6F;7b9K027<,l?1=6g;5;29?l2e2900e9h50;9l5=4=831vn<h=:187>5<7s-;3j7j?;I64g>N3?81/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm25g94?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm25f94?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm25a94?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm25`94?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm25c94?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm25;94?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm25:94?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm25594?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm25494?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm25794?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm1d:94?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm1d594?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm1d494?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm1d794?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm1d694?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm1d194?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm1d094?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm1d394?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm1d294?2=83:p(<6i:e28L11d3A><=6F;2:&277<2>:1/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm1e494?2=83:p(<6i:e28L11d3A><=6*j5;38m13=831b8o4?::k7b?6=3f;3>7>5;|`2`0<72=0;6=u+19d9`5=O<>i0D99>;%g6>4=n<<0;66g;b;29?l2a2900c<6=:188yg7c<3:187>50z&2<c<c82B?;n5G4638 `3=92c?97>5;h6a>5<<a=l1<75`19094?=zj8n86=4;:183!7?n3n;7E:8c:J734=#m<0:7d:::188m1d=831b8k4?::m2<7<722wi=i<50;694?6|,82m6i>4H55`?M2092.n97?4i5794?=n<k0;66g;f;29?j7?:3:17pl>d083>1<729q/=5h5d19K02e<@==:7)k::09j00<722c?n7>5;h6e>5<<g8296=44}c3g4?6=<3:1<v*>8g8g4>N3?j1C8:?4$d795>o3=3:17d:m:188m1`=831d=5<50;9~f4ea290?6=4?{%3;b?b73A><o6F;709'a0<63`>>6=44i5`94?=n<o0;66a>8383>>{e9jo1<7:50;2x 4>a2m:0D99l;I645>"b=3;0e9;50;9j0g<722c?j7>5;n3;6?6=3th9?l4?:583>5}#91l1h=5G46a8L1163-o>6<5f4483>>o3j3:17d:i:188k4>52900qo<<9;290?6=8r.:4k4k0:J73f=O<>;0(h;51:k71?6=3`>i6=44i5d94?=h9181<75rb31;>5<3290;w)?7f;f3?M20k2B?;<5+e482?l222900e9l50;9j0c<722e:4?4?::a661=83>1<7>t$0:e>a6<@==h7E:81:&f1?7<a=?1<75f4c83>>o3n3:17b?72;29?xd5;?0;694?:1y'5=`=l91C8:m4H552?!c2281b884?::k7f?6=3`>m6=44o0:1>5<<uk8897>54;294~"60o0o<6F;7b9K027<,l?1=6g;5;29?l2e2900e9h50;9l5=4=831vn?=;:187>5<7s-;3j7j?;I64g>N3?81/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm22194?2=83:p(<6i:e28L11d3A><=6*j5;38m13=831b8o4?::k7b?6=3f;3>7>5;|`177<72=0;6=u+19d9`5=O<>i0D99>;%g6>4=n<<0;66g;b;29?l2a2900c<6=:188yg4493:187>50z&2<c<c82B?;n5G4638 `3=92c?97>5;h6a>5<<a=l1<75`19094?=zj;n<6=4::183!7?n3n:7E:8c:J734=#m<0:7d:::188m10=831b8o4?::k7b?6=3f;3>7>5;|`1`3<72<0;6=u+19d9`4=O<>i0D99>;%g6>4=n<<0;66g;6;29?l2e2900e9h50;9l5=4=831vn?j::186>5<7s-;3j7j>;I64g>N3?81/i84>;h66>5<<a=<1<75f4c83>>o3n3:17b?72;29?xd5l=0;684?:1y'5=`=l81C8:m4H552?!c2281b884?::k72?6=3`>i6=44i5d94?=h9181<75rb3f0>5<2290;w)?7f;f2?M20k2B?;<5+e482?l222900e9850;9j0g<722c?j7>5;n3;6?6=3th9h?4?:483>5}#91l1h<5G46a8L1163-o>6<5f4483>>o3>3:17d:m:188m1`=831d=5<50;9~f7b7290>6=4?{%3;b?b63A><o6F;709'a0<63`>>6=44i5494?=n<k0;66g;f;29?j7?:3:17pl=cg83>0<729q/=5h5d29K02e<@==:7)k::79j00<722c?:7>5;h6e>5<<a82:6=44o0:1>5<<uk8o=7>55;294~"60o0o=6F;7b9K027<,l?1=6g;5;29?l212900e9l50;9j0c<722e:4?4?::a6f2=8391<7>t$0:e>11e3A><o6F;709j0=<722c:>44?::m23g<722wi>n=50;194?6|,82m699m;I64g>N3?81b854?::k26<<722e:;o4?::a6gg=83>1<7>t$0:e>4543A><o6F;709j0=<722c>=7>5;h3;<?6=3f;<n7>5;|`1g7<72:0;6=u+19d902d<@==h7E:81:k7<?6=3`;957>5;n34f?6=3th9n54?:583>5}#91l1=>=4H55`?M2092c?47>5;h72>5<<a8236=44o05a>5<<uk8h=7>53;294~"60o0?;o5G46a8L1163`>36=44i00:>5<<g8=i6=44}c0a2?6=<3:1<v*>8g8276=O<>i0D99>;h6;>5<<a<;1<75f19:94?=h9>h1<75rb3a3>5<4290;w)?7f;64f>N3?j1C8:?4i5:94?=n9;31<75`16`94?=zj;h?6=4;:183!7?n3;8?6F;7b9K027<a=21<75f5083>>o6010;66a>7c83>>{e:kl1<7=50;2x 4>a2==i7E:8c:J734=n<10;66g>2883>>i6?k0;66sm2c094?2=83:p(<6i:010?M20k2B?;<5f4983>>o293:17d?78;29?j70j3:17pl=bd83>6<729q/=5h546`8L11d3A><=6g;8;29?l7513:17b?8b;29?xd5j90;694?:1y'5=`=9:90D99l;I645>o303:17d;>:188m4>?2900c<9m:188yg4el3:1?7>50z&2<c<3?k1C8:m4H552?l2?2900e<<6:188k41e2900qo<ne;290?6=8r.:4k4>329K02e<@==:7d:7:188m07=831b=5650;9l52d=831vn?ll:180>5<7s-;3j7:8b:J73f=O<>;0e9650;9j57?=831d=:l50;9~f7gd290?6=4?{%3;b?74;2B?;n5G4638m1>=831b9<4?::k2<=<722e:;o4?::a6`?=83?1<7>t$0:e>a7<@==h7E:81:&f1?7<a=?1<75f4783>>o3j3:17d:i:188k4>52900qo<j8;291?6=8r.:4k4k1:J73f=O<>;0(h;51:k71?6=3`>=6=44i5`94?=n<o0;66a>8383>>{e:l=1<7;50;2x 4>a2m;0D99l;I645>"b=3;0e9;50;9j03<722c?n7>5;h6e>5<<g8296=44}c0f2?6==3:1<v*>8g8g5>N3?j1C8:?4$d795>o3=3:17d:9:188m1d=831b8k4?::m2<7<722wi>h;50;794?6|,82m6i?4H55`?M2092.n97?4i5794?=n<?0;66g;b;29?l2a2900c<6=:188yg4b<3:197>50z&2<c<c92B?;n5G4638 `3=92c?97>5;h65>5<<a=h1<75f4g83>>i60;0;66sm2d194?3=83:p(<6i:e38L11d3A><=6*j5;38m13=831b8;4?::k7f?6=3`>m6=44o0:1>5<<uk8n>7>55;294~"60o0o=6F;7b9K027<,l?1=6g;5;29?l212900e9l50;9j0c<722e:4?4?::a6`7=83?1<7>t$0:e>a7<@==h7E:81:&f1?7<a=?1<75f4783>>o3j3:17d:i:188k4>52900qo<84;290?6=8r.:4k4k2:J73f=O<>;0(h;56:k71?6=3`>m6=44i0:2>5<<g8296=44}c041?6=<3:1<v*>8g8g6>N3?j1C8:?4$d792>o3=3:17d:i:188m4>62900c<6=:188yg41n3:187>50z&2<c<c82B?;n5G4638 `3=92c?97>5;h6a>5<<a=l1<75`19094?=zj;<n6=4;:183!7?n3n;7E:8c:J734=#m<0:7d:::188m1d=831b8k4?::m2<7<722wi?=>50;194?6|,82m699m;I64g>N3?81b854?::k26<<722e:;o4?::a75?=8391<7>t$0:e>11e3A><o6F;709j0=<722c:>44?::m23g<722wi>k:50;694?6|,82m6<=<;I64g>N3?81b854?::k65?6=3`;347>5;n34f?6=3th8<54?:283>5}#91l18:l4H55`?M2092c?47>5;h31=?6=3f;<n7>5;|`1b6<72=0;6=u+19d9565<@==h7E:81:k7<?6=3`?:6=44i0:;>5<<g8=i6=44}c133?6=;3:1<v*>8g873g=O<>i0D99>;h6;>5<<a8826=44o05a>5<<uk8m>7>54;294~"60o0:?>5G46a8L1163`>36=44i4394?=n9121<75`16`94?=zj::=6=4<:183!7?n3><n6F;7b9K027<a=21<75f13;94?=h9>h1<75rb3d2>5<3290;w)?7f;307>N3?j1C8:?4i5:94?=n=80;66g>8983>>i6?k0;66sm31794?5=83:p(<6i:55a?M20k2B?;<5f4983>>o6:00;66a>7c83>>{e:o:1<7:50;2x 4>a28987E:8c:J734=n<10;66g:1;29?l7?03:17b?8b;29?xd48=0;6>4?:1y'5=`=<>h0D99l;I645>o303:17d?=9;29?j70j3:17pl=eg83>1<729q/=5h51218L11d3A><=6g;8;29?l362900e<67:188k41e2900qo=?3;297?6=8r.:4k4;7c9K02e<@==:7d:7:188m44>2900c<9m:188yg4bm3:187>50z&2<c<6;:1C8:m4H552?l2?2900e8?50;9j5=>=831d=:l50;9~f66529086=4?{%3;b?20j2B?;n5G4638m1>=831b=?750;9l52d=831vn?kk:187>5<7s-;3j7?<3:J73f=O<>;0e9650;9j14<722c:454?::m23g<722wi?=?50;194?6|,82m699m;I64g>N3?81b854?::k26<<722e:;o4?::a6`e=83>1<7>t$0:e>4543A><o6F;709j0=<722c>=7>5;h3;<?6=3f;<n7>5;|`1ag<72=0;6=u+19d9565<@==h7E:81:k7<?6=3`?:6=44i0:;>5<<g8=i6=44}c121?6=<3:1<v*>8g8g4>N3?j1C8:?4$d795>o3=3:17d:m:188m1`=831d=5<50;9~f67c290?6=4?{%3;b?b73A><o6F;709'a0<63`>>6=44i5`94?=n<o0;66a>8383>>{e;8i1<7:50;2x 4>a2m:0D99l;I645>"b=3;0e9;50;9j0g<722c?j7>5;n3;6?6=3th8=o4?:583>5}#91l1h=5G46a8L1163-o>6<5f4483>>o3j3:17d:i:188k4>52900qo=>a;290?6=8r.:4k4k0:J73f=O<>;0(h;51:k71?6=3`>i6=44i5d94?=h9181<75rb23:>5<3290;w)?7f;f3?M20k2B?;<5+e482?l222900e9l50;9j0c<722e:4?4?::a74>=83>1<7>t$0:e>a6<@==h7E:81:&f1?7<a=?1<75f4c83>>o3n3:17b?72;29?xd49>0;694?:1y'5=`=l91C8:m4H552?!c2281b884?::k7f?6=3`>m6=44o0:1>5<<uk9::7>54;294~"60o0o<6F;7b9K027<,l?1=6g;5;29?l2e2900e9h50;9l5=4=831vn>?;:187>5<7s-;3j7j?;I64g>N3?81/i84>;h66>5<<a=h1<75f4g83>>i60;0;66sm33:94?3=83:p(<6i:e38L11d3A><=6*j5;38m13=831b8;4?::k7f?6=3`>m6=44o0:1>5<<uk82?7>54;294~"60o0:?>5G46a8L1163`>36=44i4394?=n9121<75`16`94?=zj;396=4;:183!7?n3;8?6F;7b9K027<a=21<75f5083>>o6010;66a>7c83>>{e:0;1<7:50;2x 4>a28987E:8c:J734=n<10;66g:1;29?l7?03:17b?8b;29?xd5190;694?:1y'5=`=9:90D99l;I645>o303:17d;>:188m4>?2900c<9m:188yg4?n3:187>50z&2<c<6;:1C8:m4H552?l2?2900e8?50;9j5=>=831d=:l50;9~f7>7290?6=4?{%3;b?74;2B?;n5G4638m1>=831b9<4?::k2<=<722e:;o4?::a62`=83>1<7>t$0:e>4543A><o6F;709j0=<722c>=7>5;h3;<?6=3f;<n7>5;|`13`<72=0;6=u+19d9565<@==h7E:81:k7<?6=3`?:6=44i0:;>5<<g8=i6=44}c04`?6=<3:1<v*>8g8276=O<>i0D99>;h6;>5<<a<;1<75f19:94?=h9>h1<75rb35`>5<3290;w)?7f;307>N3?j1C8:?4i5:94?=n=80;66g>8983>>i6?k0;66sm3c`94?3=83:p(<6i:e38L11d3A><=6*j5;38m13=831b8;4?::k7f?6=3`>m6=44o0:1>5<<uk9i57>55;294~"60o0o=6F;7b9K027<,l?1=6g;5;29?l212900e9l50;9j0c<722e:4?4?::a7gg=83?1<7>t$0:e>a5<@==h7E:81:&f1?0<a=?1<75f4783>>o3n3:17d?71;29?j7?:3:17pl<bb83>0<729q/=5h5d09K02e<@==:7)k::09j00<722c?:7>5;h6a>5<<a=l1<75`19094?=zj:ho6=4::183!7?n3n:7E:8c:J734=#m<0:7d:::188m10=831b8o4?::k7b?6=3f;3>7>5;|`0g5<72<0;6=u+19d9`4=O<>i0D99>;%g6>4=n<<0;66g;6;29?l2e2900e9h50;9l5=4=831vn>lj:186>5<7s-;3j7j>;I64g>N3?81/i84>;h66>5<<a=<1<75f4c83>>o3n3:17b?72;29?xd4jo0;684?:1y'5=`=l81C8:m4H552?!c2281b884?::k72?6=3`>i6=44i5d94?=h9181<75rb2a2>5<2290;w)?7f;f2?M20k2B?;<5+e482?l222900e9850;9j0g<722c?j7>5;n3;6?6=3th8o?4?:483>5}#91l1h<5G46a8L1163-o>6<5f4483>>o3>3:17d:m:188m1`=831d=5<50;9~f6ea290>6=4?{%3;b?b63A><o6F;709'a0<63`>>6=44i5494?=n<k0;66g;f;29?j7?:3:17pl<ce83>0<729q/=5h5d29K02e<@==:7)k::79j00<722c?:7>5;h6e>5<<a82:6=44o0:1>5<<uk9hi7>55;294~"60o0o=6F;7b9K027<,l?1=6g;5;29?l212900e9l50;9j0c<722e:4?4?::a7a6=83?1<7>t$0:e>a7<@==h7E:81:&f1?7<a=?1<75f4783>>o3j3:17d:i:188k4>52900qo=k1;291?6=8r.:4k4k1:J73f=O<>;0(h;51:k71?6=3`>=6=44i5`94?=n<o0;66a>8383>>{e;m>1<7;50;2x 4>a2m;0D99l;I645>"b=3;0e9;50;9j03<722c?n7>5;h6e>5<<g8296=44}c1g6?6==3:1<v*>8g8g5>N3?j1C8:?4$d795>o3=3:17d:9:188m1d=831b8k4?::m2<7<722wi?i=50;794?6|,82m6i?4H55`?M2092.n97?4i5794?=n<?0;66g;b;29?l2a2900c<6=:188yg5c=3:197>50z&2<c<c92B?;n5G4638 `3=92c?97>5;h65>5<<a=h1<75f4g83>>i60;0;66sm3e494?3=83:p(<6i:e38L11d3A><=6*j5;38m13=831b8;4?::k7f?6=3`>m6=44o0:1>5<<uk9jh7>55;294~"60o0o=6F;7b9K027<,l?1=6g;5;29?l212900e9l50;9j0c<722e:4?4?::a7de=83?1<7>t$0:e>a7<@==h7E:81:&f1?7<a=?1<75f4783>>o3j3:17d:i:188k4>52900qo=ne;291?6=8r.:4k4k1:J73f=O<>;0(h;51:k71?6=3`>=6=44i5`94?=n<o0;66a>8383>>{e;hk1<7;50;2x 4>a2m;0D99l;I645>"b=3;0e9;50;9j03<722c?n7>5;h6e>5<<g8296=44}c1b=?6==3:1<v*>8g8g5>N3?j1C8:?4$d795>o3=3:17d:9:188m1d=831b8k4?::m2<7<722wi?ll50;794?6|,82m6i?4H55`?M2092.n97?4i5794?=n<?0;66g;b;29?l2a2900c<6=:188yg5f?3:197>50z&2<c<c92B?;n5G4638 `3=92c?97>5;h65>5<<a=h1<75f4g83>>i60;0;66sm3`494?3=83:p(<6i:e18L11d3A><=6*j5;48m13=831b8;4?::k7b?6=3`;3=7>5;n3;6?6=3th8m54?:483>5}#91l1h<5G46a8L1163-o>6<5f4483>>o3>3:17d:m:188m1`=831d=5<50;9~f6g2290>6=4?{%3;b?b43A><o6F;709'a0<13`>>6=44i5494?=n<o0;66g>8083>>i60;0;66sm38;94?5=83:p(<6i:55a?M20k2B?;<5f4983>>o6:00;66a>7c83>>{e;021<7=50;2x 4>a2==i7E:8c:J734=n<10;66g>2883>>i6?k0;66sm39g94?2=83:p(<6i:010?M20k2B?;<5f4983>>o293:17d?78;29?j70j3:17pl<9683>6<729q/=5h546`8L11d3A><=6g;8;29?l7513:17b?8b;29?xd40j0;694?:1y'5=`=9:90D99l;I645>o303:17d;>:188m4>?2900c<9m:188yg5>>3:1?7>50z&2<c<3?k1C8:m4H552?l2?2900e<<6:188k41e2900qo=7a;290?6=8r.:4k4>329K02e<@==:7d:7:188m07=831b=5650;9l52d=831vn>7::180>5<7s-;3j7:8b:J73f=O<>;0e9650;9j57?=831d=:l50;9~f6>?290?6=4?{%3;b?74;2B?;n5G4638m1>=831b9<4?::k2<=<722e:;o4?::a7<2=8391<7>t$0:e>11e3A><o6F;709j0=<722c:>44?::m23g<722wi?5850;694?6|,82m6<=<;I64g>N3?81b854?::k65?6=3`;347>5;n34f?6=3th85>4?:283>5}#91l18:l4H55`?M2092c?47>5;h31=?6=3f;<n7>5;|`0<1<72=0;6=u+19d9565<@==h7E:81:k7<?6=3`?:6=44i0:;>5<<g8=i6=44}c1:6?6=;3:1<v*>8g873g=O<>i0D99>;h6;>5<<a8826=44o05a>5<<uk93>7>54;294~"60o0:?>5G46a8L1163`>36=44i4394?=n9121<75`16`94?=zj:3:6=4<:183!7?n3><n6F;7b9K027<a=21<75f13;94?=h9>h1<75rb2:3>5<3290;w)?7f;307>N3?j1C8:?4i5:94?=n=80;66g>8983>>i6?k0;66sm38294?5=83:p(<6i:55a?M20k2B?;<5f4983>>o6:00;66a>7c83>>{e;>o1<7:50;2x 4>a28987E:8c:J734=n<10;66g:1;29?l7?03:17b?8b;29?xd4mh0;684?:1y'5=`=l81C8:m4H552?!c2281b884?::k72?6=3`>i6=44i5d94?=h9181<75rb2g:>5<2290;w)?7f;f2?M20k2B?;<5+e482?l222900e9850;9j0g<722c?j7>5;n3;6?6=3th8i54?:483>5}#91l1h<5G46a8L1163-o>6<5f4483>>o3>3:17d:m:188m1`=831d=5<50;9~f6c0290>6=4?{%3;b?b63A><o6F;709'a0<63`>>6=44i5494?=n<k0;66g;f;29?j7?:3:17pl<e783>0<729q/=5h5d09K02e<@==:7)k::09j00<722c?:7>5;h6a>5<<a=l1<75`19094?=zj:o>6=4::183!7?n3n:7E:8c:J734=#m<0:7d:::188m10=831b8o4?::k7b?6=3f;3>7>5;|`0a1<72<0;6=u+19d9`4=O<>i0D99>;%g6>4=n<<0;66g;6;29?l2e2900e9h50;9l5=4=831vn>k<:186>5<7s-;3j7j>;I64g>N3?81/i84>;h66>5<<a=<1<75f4c83>>o3n3:17b?72;29?xd4m;0;684?:1y'5=`=l81C8:m4H552?!c2281b884?::k72?6=3`>i6=44i5d94?=h9181<75rb2g2>5<2290;w)?7f;f2?M20k2B?;<5+e482?l222900e9850;9j0g<722c?j7>5;n3;6?6=3th8??4?:583>5}#91l1=>=4H55`?M2092c?47>5;h72>5<<a8236=44o05a>5<<uk98?7>54;294~"60o0:?>5G46a8L1163`>36=44i4394?=n9121<75`16`94?=zj:9?6=4;:183!7?n3;8?6F;7b9K027<a=21<75f5083>>o6010;66a>7c83>>{e;:?1<7:50;2x 4>a28987E:8c:J734=n<10;66g:1;29?l7?03:17b?8b;29?xd4;?0;694?:1y'5=`=9:90D99l;I645>o303:17d;>:188m4>?2900c<9m:188yg53=3:187>50z&2<c<6;:1C8:m4H552?l2?2900e8?50;9j5=>=831d=:l50;9~f621290?6=4?{%3;b?74;2B?;n5G4638m1>=831b9<4?::k2<=<722e:;o4?::a711=83>1<7>t$0:e>4543A><o6F;709j0=<722c>=7>5;h3;<?6=3f;<n7>5;|`00=<72=0;6=u+19d9565<@==h7E:81:k7<?6=3`?:6=44i0:;>5<<g8=i6=44}c17=?6=<3:1<v*>8g8276=O<>i0D99>;h6;>5<<a<;1<75f19:94?=h9>h1<75rb27a>5<3290;w)?7f;307>N3?j1C8:?4i5:94?=n=80;66g>8983>>i6?k0;66sm34a94?2=83:p(<6i:010?M20k2B?;<5f4983>>o293:17d?78;29?j70j3:17pl<5e83>1<729q/=5h51218L11d3A><=6g;8;29?l362900e<67:188k41e2900qo=:e;290?6=8r.:4k4>329K02e<@==:7d:7:188m07=831b=5650;9l52d=831vn>;i:187>5<7s-;3j7?<3:J73f=O<>;0e9650;9j14<722c:454?::m23g<722wi?;k50;694?6|,82m6i>4H55`?M2092.n97?4i5794?=n<k0;66g;f;29?j7?:3:17pl<6g83>1<729q/=5h5d19K02e<@==:7)k::09j00<722c?n7>5;h6e>5<<g8296=44}c15e?6==3:1<v*>8g8g5>N3?j1C8:?4$d795>o3=3:17d:9:188m1d=831b8k4?::m2<7<722wi8?j50;794?6|,82m6i:4H55`?M2092.n97?4i5794?=n<?0;66g;f;29?l7?;3:17b?72;29?xd3:j0;684?:1y'5=`=l=1C8:m4H552?!c2281b884?::k72?6=3`>m6=44i0:0>5<<g8296=44}c61f?6==3:1<v*>8g8g0>N3?j1C8:?4$d795>o3=3:17d:9:188m1`=831b=5=50;9l5=4=831vn9<n:186>5<7s-;3j7j;;I64g>N3?81/i84>;h66>5<<a=<1<75f4g83>>o60:0;66a>8383>>{e<;31<7;50;2x 4>a2m>0D99l;I645>"b=3;0e9;50;9j03<722c?j7>5;h3;7?6=3f;3>7>5;|`76=<72<0;6=u+19d9`1=O<>i0D99>;%g6>4=n<<0;66g;6;29?l2a2900e<6<:188k4>52900qo:=6;291?6=8r.:4k4k4:J73f=O<>;0(h;51:k71?6=3`>=6=44i5d94?=n9191<75`19094?=zj=8>6=4::183!7?n3n?7E:8c:J734=#m<0:7d:::188m10=831b8k4?::k2<6<722e:4?4?::a072=83?1<7>t$0:e>a2<@==h7E:81:&f1?7<a=?1<75f4783>>o3n3:17d?73;29?j7?:3:17pl;2283>0<729q/=5h5d59K02e<@==:7)k::09j00<722c?:7>5;h6e>5<<a8286=44o0:1>5<<uk>9>7>55;294~"60o0o86F;7b9K027<,l?1=6g;5;29?l212900e9h50;9j5=5=831d=5<50;9~f146290>6=4?{%3;b?b33A><o6F;709'a0<63`>>6=44i5494?=n<o0;66g>8283>>i60;0;66sm43294?3=83:p(<6i:e68L11d3A><=6*j5;38m13=831b8;4?::k7b?6=3`;3?7>5;n3;6?6=3th?=k4?:483>5}#91l1h95G46a8L1163-o>6<5f4483>>o3>3:17d:i:188m4>42900c<6=:188yg26m3:197>50z&2<c<c<2B?;n5G4638 `3=92c?97>5;h65>5<<a=l1<75f19194?=h9181<75rb53g>5<2290;w)?7f;f7?M20k2B?;<5+e482?l222900e9850;9j0c<722c:4>4?::m2<7<722wi8<l50;794?6|,82m6i:4H55`?M2092.n97?4i5794?=n<?0;66g;f;29?l7?;3:17b?72;29?xd39h0;684?:1y'5=`=l=1C8:m4H552?!c2281b884?::k72?6=3`>m6=44i0:0>5<<g8296=44}c62=?6==3:1<v*>8g8g0>N3?j1C8:?4$d795>o3=3:17d:9:188m1`=831b=5=50;9l5=4=831vn9?7:186>5<7s-;3j7j;;I64g>N3?81/i84>;h66>5<<a=<1<75f4g83>>o60:0;66a>8383>>{e<8=1<7;50;2x 4>a2m>0D99l;I645>"b=3;0e9;50;9j03<722c?j7>5;h3;7?6=3f;3>7>5;|`753<72<0;6=u+19d9`1=O<>i0D99>;%g6>4=n<<0;66g;6;29?l2a2900e<6<:188k4>52900qo:>5;291?6=8r.:4k4k4:J73f=O<>;0(h;51:k71?6=3`>=6=44i5d94?=n9191<75`19094?=zj=;?6=4::183!7?n3n?7E:8c:J734=#m<0:7d:::188m10=831b8k4?::k2<6<722e:4?4?::a045=83?1<7>t$0:e>a2<@==h7E:81:&f1?7<a=?1<75f4783>>o3n3:17d?73;29?j7?:3:17pl;1383>0<729q/=5h5d59K02e<@==:7)k::09j00<722c?:7>5;h6e>5<<a8286=44o0:1>5<<uk>8?7>55;294~"60o0o86F;7b9K027<,l?1=6g;5;29?l212900e9h50;9j5=5=831d=5<50;9~f155290>6=4?{%3;b?b33A><o6F;709'a0<63`>>6=44i5494?=n<o0;66g>8283>>i60;0;66sm42394?3=83:p(<6i:e68L11d3A><=6*j5;38m13=831b8;4?::k7b?6=3`;3?7>5;n3;6?6=3th??=4?:483>5}#91l1h95G46a8L1163-o>6<5f4483>>o3>3:17d:i:188m4>42900c<6=:188yg25n3:197>50z&2<c<c<2B?;n5G4638 `3=92c?97>5;h65>5<<a=l1<75f19194?=h9181<75rb50f>5<2290;w)?7f;f7?M20k2B?;<5+e482?l222900e9850;9j0c<722c:4>4?::m2<7<722wi8?950;794?6|,82m6i:4H55`?M2092.n97?4i5794?=n<?0;66g;f;29?l7?;3:17b?72;29?xd39j0;684?:1y'5=`=l=1C8:m4H552?!c2281b884?::k72?6=3`>m6=44i0:0>5<<g8296=44}c625?6==3:1<v*>8g8g0>N3?j1C8:?4$d795>o3=3:17d:9:188m1`=831b=5=50;9l5=4=831vn9??:186>5<7s-;3j7j;;I64g>N3?81/i84>;h66>5<<a=<1<75f4g83>>o60:0;66a>8383>>{e<?h1<7=50;2x 4>a288n7E:8c:J734=#m<0:56gk9;29?lbf2900c<9m:188yg2183:1?7>50z&2<c<6:l1C8:m4H552?!c22830ei750;9j`d<722e:;o4?::a640=8391<7>t$0:e>44b3A><o6F;709'a0<6l2co57>5;hfb>5<<g8=i6=44}c3a0?6=;3:1<v*>8g826`=O<>i0D99>;%g6>4b<am31<75fd`83>>i6?k0;66sm1`294?5=83:p(<6i:00f?M20k2B?;<5+e482`>oc13:17djn:188k41e2900qo?6f;297?6=8r.:4k4>2d9K02e<@==:7)k::0f8ma?=831bhl4?::m23g<722wi=4k50;194?6|,82m6<<j;I64g>N3?81/i84>d:kg=?6=3`nj6=44o05a>5<<uk;2h7>53;294~"60o0:>h5G46a8L1163-o>6<j4ie;94?=nlh0;66a>7c83>>{e90i1<7=50;2x 4>a288n7E:8c:J734=#m<0:h6gk9;29?lbf2900c<9m:188yg7>j3:1?7>50z&2<c<6:l1C8:m4H552?!c228n0ei750;9j`d<722e:;o4?::a5<g=8391<7>t$0:e>44b3A><o6F;709'a0<6l2co57>5;hfb>5<<g8=i6=44}c3:=?6=;3:1<v*>8g826`=O<>i0D99>;%g6>4b<am31<75fd`83>>i6?k0;66sm18:94?5=83:p(<6i:00f?M20k2B?;<5+e482`>oc13:17djn:188k41e2900qo?67;297?6=8r.:4k4>2d9K02e<@==:7)k::0f8ma?=831bhl4?::m23g<722wi=4850;194?6|,82m6<<j;I64g>N3?81/i84>d:kg=?6=3`nj6=44o05a>5<<uk;297>53;294~"60o0:>h5G46a8L1163-o>6<j4ie;94?=nlh0;66a>7c83>>{e90>1<7=50;2x 4>a288n7E:8c:J734=#m<0:h6gk9;29?lbf2900c<9m:188yg7>;3:1?7>50z&2<c<6:l1C8:m4H552?!c228n0ei750;9j`d<722e:;o4?::a5<4=8391<7>t$0:e>44b3A><o6F;709'a0<6l2co57>5;hfb>5<<g8=i6=44}c3:5?6=;3:1<v*>8g826`=O<>i0D99>;%g6>4b<am31<75fd`83>>i6?k0;66sm18294?5=83:p(<6i:00f?M20k2B?;<5+e482`>oc13:17djn:188k41e2900qo<83;290?6=8r.:4k4>2g9K02e<@==:7)k::ba8ma?=831bhl4?::kgf?6=3f;<n7>5;|`15=<72=0;6=u+19d957`<@==h7E:81:&f1?433`n26=44iec94?=nlk0;66a>7c83>>{e9k<1<7:50;2x 4>a288m7E:8c:J734=#m<0986gk9;29?lbf2900eil50;9l52d=831vn?9>:186>5<7s-;3j7?<0:J73f=O<>;0(h;51`9j`<<722com7>5;hfa>5<<ami1<75`16`94?=zj;;j6=4::183!7?n3;8<6F;7b9K027<,l?1=k5fd883>>oci3:17djm:188mae=831d=:l50;9~f4d?290>6=4?{%3;b?7482B?;n5G4638 `3=9o1bh44?::kge?6=3`ni6=44iea94?=h9>h1<75rb354>5<2290;w)?7f;304>N3?j1C8:?4$d7964=nl00;66gka;29?lbe2900eim50;9l52d=831vn?8m:187>5<7s-;3j7?=f:J73f=O<>;0(h;52c9j`<<722com7>5;hfa>5<<g8=i6=44}c02g?6=;3:1<v*>8g826`=O<>i0D99>;%g6>4b<am31<75fd`83>>i6?k0;66sm1cc94?5=83:p(<6i:00f?M20k2B?;<5+e482`>oc13:17djn:188k41e2900qo<>e;290?6=8r.:4k4>2g9K02e<@==:7)k::368ma?=831bhl4?::kgf?6=3f;<n7>5;|`2ff<72=0;6=u+19d957`<@==h7E:81:&f1?433`n26=44iec94?=nlk0;66a>7c83>>{e:;:1<7;50;2x 4>a289;7E:8c:J734=#m<0:j6gk9;29?lbf2900eil50;9j`f<722e:;o4?::a5gc=83?1<7>t$0:e>4573A><o6F;709'a0<6n2co57>5;hfb>5<<amh1<75fdb83>>i6?k0;66sm33c94?3=83:p(<6i:013?M20k2B?;<5+e4814>oc13:17djn:188mad=831bhn4?::m23g<722wi88o50;694?6|,82m6<<i;I64g>N3?81/i84:0:kg=?6=3`nj6=44ie`94?=h9>h1<75rb34b>5<2290;w)?7f;304>N3?j1C8:?4$d7957=nl00;66gka;29?lbe2900eim50;9l52d=831vn?7k:180>5<7s-;3j7?=e:J73f=O<>;0(h;5239j`<<722com7>5;n34f?6=3th94l4?:283>5}#91l1=?k4H55`?M2092.n97<=;hf:>5<<amk1<75`16`94?=zj:<26=4::183!7?n3;8<6F;7b9K027<,l?1>>5fd883>>oci3:17djm:188mae=831d=:l50;9~f634290>6=4?{%3;b?7482B?;n5G4638 `3=::1bh44?::kge?6=3`ni6=44iea94?=h9>h1<75rb263>5<2290;w)?7f;304>N3?j1C8:?4$d7966=nl00;66gka;29?lbe2900eim50;9l52d=831vn>87:186>5<7s-;3j7?<0:J73f=O<>;0(h;5229j`<<722com7>5;hfa>5<<ami1<75`16`94?=zj:?96=4::183!7?n3;8<6F;7b9K027<,l?1>>5fd883>>oci3:17djm:188mae=831d=:l50;9~f65a290>6=4?{%3;b?7482B?;n5G4638 `3=::1bh44?::kge?6=3`ni6=44iea94?=h9>h1<75rb3;`>5<2290;w)?7f;304>N3?j1C8:?4$d7966=nl00;66gka;29?lbe2900eim50;9l52d=831vn?66:186>5<7s-;3j7?<0:J73f=O<>;0(h;5229j`<<722com7>5;hfa>5<<ami1<75`16`94?=zj:<<6=4::183!7?n3;8<6F;7b9K027<,l?1>>5fd883>>oci3:17djm:188mae=831d=:l50;9~f636290>6=4?{%3;b?7482B?;n5G4638 `3=::1bh44?::kge?6=3`ni6=44iea94?=h9>h1<75rb21f>5<2290;w)?7f;304>N3?j1C8:?4$d7966=nl00;66gka;29?lbe2900eim50;9l52d=831vn?7m:186>5<7s-;3j7?<0:J73f=O<>;0(h;5229j`<<722com7>5;hfa>5<<ami1<75`16`94?=zj;236=4::183!7?n3;8<6F;7b9K027<,l?1>>5fd883>>oci3:17djm:188mae=831d=:l50;9~f601290>6=4?{%3;b?7482B?;n5G4638 `3=::1bh44?::kge?6=3`ni6=44iea94?=h9>h1<75rb273>5<2290;w)?7f;304>N3?j1C8:?4$d7966=nl00;66gka;29?lbe2900eim50;9l52d=831vn>=k:186>5<7s-;3j7?<0:J73f=O<>;0(h;5229j`<<722com7>5;hfa>5<<ami1<75`16`94?=zj;3j6=4::183!7?n3;8<6F;7b9K027<,l?1>>5fd883>>oci3:17djm:188mae=831d=:l50;9~f7>0290>6=4?{%3;b?7482B?;n5G4638 `3=::1bh44?::kge?6=3`ni6=44iea94?=h9>h1<75rb252>5<3290;w)?7f;31b>N3?j1C8:?4$d79ga=nl00;66gka;29?lbe2900c<9m:188yg51k3:187>50z&2<c<6:o1C8:m4H552?!c22jn0ei750;9j`d<722con7>5;n34f?6=3th9m?4?:583>5}#91l1=?h4H55`?M2092.n97mk;hf:>5<<amk1<75fdc83>>i6?k0;66sm37794?2=83:p(<6i:00e?M20k2B?;<5+e486?lb>2900eio50;9j`g<722e:;o4?::a71`=83>1<7>t$0:e>44a3A><o6F;709'a0<23`n26=44iec94?=nlk0;66a>7c83>>{e;:i1<7:50;2x 4>a288m7E:8c:J734=#m<0>7dj6:188mag=831bho4?::m23g<722wi>4750;794?6|,82m6<=?;I64g>N3?81/i84=3:kg=?6=3`nj6=44ie`94?=nlj0;66a>7c83>>{e:1<1<7;50;2x 4>a289;7E:8c:J734=#m<09?6gk9;29?lbf2900eil50;9j`f<722e:;o4?::a675=8391<7>t$0:e>44b3A><o6F;709'a0<5:2co57>5;hfb>5<<g8=i6=44}c3`5?6=;3:1<v*>8g826`=O<>i0D99>;%g6>74<am31<75fd`83>>i6?k0;66sm23494?2=83:p(<6i:00e?M20k2B?;<5+e482a>oc13:17djn:188mad=831d=:l50;9~f4e3290?6=4?{%3;b?75n2B?;n5G4638 `3=9l1bh44?::kge?6=3`ni6=44o05a>5<<uk9<>7>53;294~"60o0:>h5G46a8L1163-o>6<?4ie;94?=nlh0;66a>7c83>>{e:kh1<7<50;2x 4>a288o7E:8c:J734=#m<0:=6gk9;29?j70j3:17pl=b883>7<729q/=5h513f8L11d3A><=6*j5;32?lb>2900c<9m:188yg4e?3:1>7>50z&2<c<6:m1C8:m4H552?!c228;0ei750;9l52d=831vn?l::181>5<7s-;3j7?=d:J73f=O<>;0(h;5109j`<<722e:;o4?::a6g5=8381<7>t$0:e>44c3A><o6F;709'a0<692co57>5;n34f?6=3th9n<4?:383>5}#91l1=?j4H55`?M2092.n97?>;hf:>5<<g8=i6=44}c0bb?6=:3:1<v*>8g826a=O<>i0D99>;%g6>47<am31<75`16`94?=zj;ko6=4=:183!7?n3;9h6F;7b9K027<,l?1=<5fd883>>i6?k0;66sm39d94?4=83:p(<6i:00g?M20k2B?;<5+e4825>oc13:17b?8b;29?xd40m0;6?4?:1y'5=`=9;n0D99l;I645>"b=3;:7dj6:188k41e2900qo=7b;296?6=8r.:4k4>2e9K02e<@==:7)k::038ma?=831d=:l50;9~f6>>29096=4?{%3;b?75l2B?;n5G4638 `3=981bh44?::m23g<722wi?5950;094?6|,82m6<<k;I64g>N3?81/i84>1:kg=?6=3f;<n7>5;|`0<0<72;0;6=u+19d957b<@==h7E:81:&f1?763`n26=44o05a>5<<uk93?7>52;294~"60o0:>i5G46a8L1163-o>6<?4ie;94?=h9>h1<75rb2:2>5<5290;w)?7f;31`>N3?j1C8:?4$d7954=nl00;66a>7c83>>{e;>l1<7<50;2x 4>a288o7E:8c:J734=#m<0:=6gk9;29?j70j3:17pl=c483>7<729q/=5h513f8L11d3A><=6*j5;32?lb>2900c<9m:188yg5>i3:1>7>50z&2<c<6:m1C8:m4H552?!c228;0ei750;9l52d=831vn?h7:180>5<7s-;3j7?=e:J73f=O<>;0(h;5239j`<<722com7>5;n34f?6=3th9j44?:283>5}#91l1=?k4H55`?M2092.n97<=;hf:>5<<amk1<75`16`94?=zj;lj6=4<:183!7?n3;9i6F;7b9K027<,l?1>?5fd883>>oci3:17b?8b;29?xd5nk0;6>4?:1y'5=`=9;o0D99l;I645>"b=3897dj6:188mag=831d=:l50;9~f7`d29086=4?{%3;b?75m2B?;n5G4638 `3=:;1bh44?::kge?6=3f;<n7>5;|`1ba<72:0;6=u+19d957c<@==h7E:81:&f1?453`n26=44iec94?=h9>h1<75rb3df>5<4290;w)?7f;31a>N3?j1C8:?4$d7967=nl00;66gka;29?j70j3:17pl=fg83>6<729q/=5h513g8L11d3A><=6*j5;01?lb>2900eio50;9l52d=831vn?h::180>5<7s-;3j7?=e:J73f=O<>;0(h;5239j`<<722com7>5;n34f?6=3th8>n4?:483>5}#91l1=>>4H55`?M2092.n97j:;hf:>5<<amk1<75fdc83>>ock3:17b?8b;29?xd4:k0;684?:1y'5=`=9::0D99l;I645>"b=38;7dj6:188mag=831bho4?::kgg?6=3f;<n7>5;|`036<72:0;6=u+19d957c<@==h7E:81:&f1?763`n26=44iec94?=h9>h1<75rb3d4>5<5290;w)?7f;31<>N3?j1C8:?4ie:94?=h9>h1<75rb24g>5<5290;w)?7f;31<>N3?j1C8:?4ie:94?=h9>h1<75rb301>5<1290;w)?7f;305>N3?j1C8:?4$d7960=nl00;66gka;29?lbe2900eim50;9l57g=831d=:l50;9~f4e7290=6=4?{%3;b?7492B?;n5G4638 `3=:<1bh44?::kge?6=3`ni6=44iea94?=h9;k1<75`16`94?=zj=?36=477;294~N3?81/=5h51968^12=ir21>;4j:07956<6j3l1=;4>4;3`>x"6:>087)jk:59'``<33-nm695+e187?!c62=1/i?4;;%g0>1=#kh0hi6*j6;68 `1=<2.n47:4$d;90>"bi3>0(hl54:&fg?2<,ln186*je;68 ``=<2.m<7:4$g390>"a:3>0(k=54:&e0?2<,o?186*i6;68 c1=<2.m47:4$g;90>"ai3>0(kl54:&eg?2<,on186*ie;68 c`=<2.:<=4;;%335?2<,8:9695+11190>"68=0?7)??5;68 4612=1/==954:&24=<33-;;57:4$02b>1=#99h186*>0b87?!77l3>0(<>j:59'55`=<2.:==4;;%325?2<,8;9695+10190>"69=0?7)?>5;68 4712=1/=<954:&25=<33-;:57:4$03b>1=#98h186*>1b87?!76l3>0(<?j:59'54`=<2.:>=4;;%315?2<,889695+13190>"6:=0?7)?=5;68 4412;1/=575409'a1<33-;3n7<4$555>4>23-><;7?75:l:`?6<fkl1<6`>87826>h60>0986`;79826>h3?00986*lb;af?!7?k390e9750;9j0d<722c?;94?::k`=?6=3`2<6=4+1929<d=i9>l1?65f19g94?=n;?0;6)?70;16?k70n3:07d=;:18'5=6=;<1e=:h51:9j76<72-;3<7=:;o34b?4<3`996=4+192970=i9>l1?65f3083>!7?839>7c?8f;68?l57290/=5>5349m52`==21b>k4?:%3;4?523g;<j784;h0f>5<#91:1?85a16d93>=n:m0;6)?70;16?k70n3207d<l:18'5=6=;<1e=:h59:9j05<72-;3<7=i;o34b?6<3`9n6=4+19297c=i9>l1=65f3e83>!7?839m7c?8f;08?l5d290/=5>53g9m52`=;21b?o4?:%3;4?5a3g;<j7:4;h1b>5<#91:1?k5a16d91>=n;00;6)?70;1e?k70n3<07d=7:18'5=6=;o1e=:h57:9j72<72-;3<7=i;o34b?><3`?26=4+19291==i9>l1<65f5683>!7?83?37c?8f;38?l31290/=5>5599m52`=:21b984?:%3;4?3?3g;<j7=4;h77>5<#91:1955a16d90>=n=:0;6)?70;7;?k70n3?07d8=:18'5=6==11e=:h56:9j24<72-;3<7;7;o34b?1<3`<;6=4+19291==i9>l1465f5g83>!7?83?37c?8f;;8?l3b290/=5>5599m52`=i21b9i4?:%3;4?3?3g;<j7l4;h7`>5<#91:1955a16d9g>=n=k0;6)?70;7;?k70n3n07d;n:18'5=6==11e=:h5e:9j17<72-;3<7;7;o34b?`<3`2=6=4+1929<0=i9>l1<65f8583>!7?832>7c?8f;38?jd0290/=5>5b79m52`=821dn84?:%3;4?d13g;<j7?4;n`0>5<#91:1n;5a16d96>=hj;0;6)?70;`5?k70n3907bl>:18'5=6=j?1e=:h54:9lf5<72-;3<7l9;o34b?3<3fkm6=4+1929f3=i9>l1:65`ad83>!7?83h=7c?8f;58?jgc290/=5>5b79m52`=021dmn4?:%3;4?d13g;<j774;nca>5<#91:1n;5a16d9e>=hih0;6)?70;`5?k70n3h07bo7:18'5=6=j?1e=:h5c:9le2<72-;3<7l9;o34b?b<3fk=6=4+1929f3=i9>l1i65`a483>!7?83h=7c?8f;d8?jg3290/=5>5b79m52`=9910cl=50;&2<5<e>2d:;k4>1:9le7<72-;3<7l9;o34b?7532ej=7>5$0:3>g0<f8=m6<=4;nc3>5<#91:1n;5a16d951=<g0l1<7*>818a2>h6?o0:965`bd83>!7?83h=7c?8f;35?>iel3:1(<6?:c48j41a28=07bll:18'5=6=j?1e=:h51998kgd=83.:4=4m6:l23c<6121dnl4?:%3;4?d13g;<j7?n;:ma=?6=,82;6o84n05e>4d<3fh36=4+1929f3=i9>l1=n54oc694?"6090i:6`>7g82`>=hi00;6)?70;`5?k70n3;n76a6e;29 4>72k<0b<9i:0d8?je0290/=5>5c79m52`=821do84?:%3;4?e13g;<j7?4;na7>5<#91:1o;5a16d96>=hk:0;6)?70;a5?k70n3907dm7:188m4>c2900e99::188m2e=83.:4=48b:l23c<732c<m7>5$0:3>2d<f8=m6<54i6:94?"6090<n6`>7g81?>o0?3:1(<6?:6`8j41a2:10e:850;&2<5<0j2d:;k4;;:k41?6=,82;6:l4n05e>0=<a>>1<7*>8184f>h6?o0=76g83;29 4>72>h0b<9i:698m24=83.:4=48b:l23c<?32c<=7>5$0:3>2d<f8=m6454i6294?"6090<n6`>7g8b?>o1n3:1(<6?:6`8j41a2k10e;j50;&2<5<0j2d:;k4l;:k5g?6=,82;6:l4n05e>a=<a?h1<7*>8184f>h6?o0n76g9a;29 4>72>h0b<9i:g98m3?=83.:4=48b:l23c<6821b:54?:%3;4?1e3g;<j7?>;:k53?6=,82;6:l4n05e>44<3`<=6=4+19293g=i9>l1=>54i7794?"6090<n6`>7g820>=n>=0;6)?70;5a?k70n3;>76g73;29 4>72>h0b<9i:048?l>5290/=5>57c9m52`=9>10e5?50;&2<5<0j2d:;k4>8:9j<5<72-;3<79m;o34b?7>32c<j7>5$0:3>2d<f8=m6<o4;h5f>5<#91:1;o5a16d95g=<a>n1<7*>8184f>h6?o0:o65f7883>!7?83=i7c?8f;3g?>o1m3:1(<6?:6`8j41a28o07d8<:18'5=6=?k1e=:h51g98m=d=83.:4=47a:l23c<732c357>5$0:3>=g<f8=m6<54i9:94?"60903m6`>7g81?>i>;3:1(<6?:808j41a2910c4?50;&2<5<>:2d:;k4>;:m:4?6=,82;64<4n05e>7=<g1l1<7*>818:6>h6?o0876a7e;29 4>72080b<9i:598k=b=83.:4=462:l23c<232e2o7>5$0:3><4<f8=m6;54o8`94?"60902>6`>7g84?>i>i3:1(<6?:808j41a2110c4750;&2<5<>:2d:;k46;:m:<?6=,82;64<4n05e>d=<g0=1<7*>818:6>h6?o0i76a66;29 4>72080b<9i:b98k<3=83.:4=462:l23c<c32e287>5$0:3><4<f8=m6h54o9a94?"60902>6`>7g8e?>id:3:1(<6?:b38j41a2910cn>50;&2<5<d92d:;k4>;:p10b=83<pR8;k;<047?bf348<=7j6;<043?bd348=n7jm;<05e?b>3ty>9o4?:6gxZ1?33W?=:6P:659]0=2<V<<;7S;?f:\620=Y=8:0R97=;_6:5>X3191U85h4^5:f?[2?l2T?4n5Q49`8Z1>f3W>356P:709]126<V<<m7S;9e:\62a=Y=?i0R88m;_75e>X2>01U9;64^47b?[3212T>955Q5458Z0313W?>96P:559]105<V<?970:8d;f5?821?3>m70::c;6e?821>3>m70:95;6e?821<3>m70:9f;6e?821m3>m70<ma;72?84e03?:70<m6;72?84e<3?:70<m2;72?84e83?:70<ne;72?84fk3?:70<jb;3;<>;51:0>=63=93865>;5180>=63=91865>;50o0>=63=81865>;5?o0>=63=7d865>;5?m0>=63=7b865>;40l0>=63<8b865>;40h0>=63<89865>;40?0>=63<85865>;40;0>=63<81865>;4?l0>=63<33865>;4;:0>=63<35865>;4;<0>=63<37865>;4<<0>=63<47865>;4<>0>=63<49865>;4<00>=63<5c865>;4=j0>=63<5e865>;4=l0>=63<5g865>;3=103;63;5982<a=:<<218:;4=57;>2e<5=?36:o4=57;>2><5=?36:94=57;>20<5=?36:;4=57;>22<5=?36:=4=57;>24<5=?36:?4=57;>26<5=?36;h4=57;>3b<5=?36;m4=57;>3d<5=?36;o4=57;>3?<5=?36;64=57;>31<5=?36;84=57;>33<5=?36;:4=57;>=5<5=?365<4=57;>=7<5=?365>4=57;>2`<5=?36:k4=57;>2b<5=?36:74=57;>3c<5=?36;=4=57;>=d<5=?36574=57;>=><uz9=m7>52z\7<0=:;?k1=5<4}r76b?6=;rT>9k5247595=7<5=?h6<6>;|q130<72;qU9=:4=356>4>53ty>;>4?:2y]125<5:=96i74=250>a?<uz?>=7>569y]107<5;k;69;4=57f>13<5=?o69;4=57`>13<5=<=69;4=546>13<5=<?69;4=337>13<5;;869;4=331>13<5;;:69;4=333>13<5;:m69;4=32f>13<5;:o69;4=32`>13<5;<;69;4=37e>13<5;?n69;4=37g>13<5;?h69;4=37a>13<5;?j69;4=37:>13<5;?369;4=36f>13<5;>o69;4=36`>13<5;>i69;4=36b>13<5;>269;4=36;>13<5;><69;4=365>13<5;>>69;4=0f5>13<58n>69;4=0f7>13<58n869;4=0f1>13<58n:69;4=0f3>13<58im69;4=0af>13<5;n<69;4=3f5>13<5;n>69;4=3f7>13<5;n869;4=3f1>13<5;n;69;4=3ae>13<5;n:69;4=3g:>13<5;o369;4=3g4>13<5;o=69;4=3g6>13<5;o?69;4=3g0>13<5;o969;4=3g2>13<5;=?69;4=356>13<5;<m69;4=34f>13<5=8o69;4=50`>13<5=8i69;4=50b>13<5=8269;4=50;>13<5=8=69;4=506>13<5=8?69;4=500>13<5=8969;4=502>13<5=8;69;4=53e>13<5=;n69;4=53g>13<5=;i69;4=53b>13<5=;269;4=53;>13<5=;<69;4=535>13<5=;>69;4=537>13<5=;869;4=531>13<5=9869;4=511>13<5=9:69;4=513>13<5=8m69;4=50f>13<5=8<69;4=53`>13<5=;:69;4=533>13<5=?369o4}r15b?6=:rT><l5237d95=4<uz?=;7>563y]131<5=<269;4=544>13<5=<369;4=54e>13<5=<n69;4=0`1>13<58h:69;4=0`3>13<58km69;4=0cf>13<58ko69;4=0c`>13<58ki69;4=0cb>13<58lj69;4=0d:>13<58l369;4=0d4>13<58l=69;4=0d6>13<58l?69;4=0d0>13<58l969;4=0g;>13<58o<69;4=0g5>13<58o>69;4=0g7>13<58o869;4=0g1>13<58o:69;4=0g3>13<5;9j69;4=31:>13<5;9369;4=314>13<5;9=69;4=316>13<5;9?69;4=310>13<5;9969;4=312>13<5:;>69;4=23g>13<5:;h69;4=23a>13<5:;j69;4=23:>13<5:;369;4=234>13<5:;=69;4=237>13<5:8369;4=2`a>13<5:h269;4=2`b>13<5:hh69;4=2`g>13<5:i;69;4=2`f>13<5:hm69;4=2a2>13<5:i969;4=2ae>13<5:io69;4=2af>13<5:n;69;4=2f2>13<5:n?69;4=2f1>13<5:n869;4=2f6>13<5:n=69;4=2cg>13<5:kh69;4=2cf>13<5:kj69;4=2c:>13<5:ki69;4=2c4>13<5:k=69;4=2c;>13<5:k>69;4=2gb>13<5:o269;4=2g;>13<5:o<69;4=2g5>13<5:o>69;4=2g7>13<5:o869;4=2g1>13<5:o:69;4=24f>13<5:<m69;4=24b>13<5=?36974}r11<?6=:rT>>k5233:95=4<uz9m87>52z\7`2=:<831=5<4}r1e7?6=:rT?h;5240:95=4<uz9m>7>52z\7`0=:<8=1=5<4}r1e5?6=:rT?h95240495=4<uz9m<7>52z\7`6=:<8?1=5<4}r1fb?6=:rT?h?5240695=4<uz9ni7>52z\7`5=:<891=5<4}r1f`?6=:rT?ok5240095=4<uz>;j7>52z\7g`=:<:91=5<4}r63a?6=:rT?oi5242095=4<uz>;h7>52z\7gf=:<:;1=5<4}r63g?6=:rT?oo5242295=4<uz>;n7>52z\7gd=:<;l1=5<4}r63e?6=:rT?o45243g95=4<uz>;57>52z\7g==:<;=1=5<4}r636?6=:rT?o:5240a95=4<uz9m;7>52z\7g0=:<8;1=5<4}r1fg?6=:rT?o95240295=4<uz>;47>52z\7g6=:<;n1=5<4}r633?6=:rT?o?5243a95=4<uz>;:7>52z\7g4=:<;h1=5<4}r631?6=:rT?o=5243c95=4<uz>;87>52z\7fc=:<;31=5<4}r637?6=:rT?nh5243:95=4<uz>;=7>52z\7fa=:<;<1=5<4}r634?6=:rT?nn5243795=4<uz9mj7>52z\7`a=:<;>1=5<4}r1ea?6=:rT?hn5243195=4<uz9mh7>52z\7`g=:<;81=5<4}r1eg?6=:rT?hl5243395=4<uz9mn7>52z\7`<=:<;:1=5<4}r1ee?6=:rT?h55240d95=4<uz9m57>52z\7`4=:<8o1=5<4}r1e<?6=:rT?o;5240f95=4<uz9m:7>52z\7fg=:<8h1=5<4}r1e1?6=:rT?nl5240c95=4<uz>i<7>52z\7=`=:<<214;5rs5cf>5<5sW>2h63;5986=>{t<hn1<7<t^5;`?82203?<7p};ab83>7}Y<0h019;7:448yv2fj3:1>vP;9`9>00>==<1v9on:181[2>127?954:4:p0d?=838pR977;<66<?343ty?m54?:3y]0<1<5=?36;<4}r6a=?6=:rT?m;5244:924=z{=h36=4={_6b1>;3=10386s|4c594?4|V=k?70::8;43?xu3j?0;6?uQ4`18913?2<l0q~:m5;296~X3i;1688655d9~w1d32909wS:n1:?71=<2l2wx8o=50;0xZ1g734>>47;l;|q7f7<72;qU84h4=57;>0d<uz>i=7>52z\7=3=:<<219l5rs5c4>5<5sW>2963;59866>{t9:=1<7mt=55f>41c348io7:7;<0bg?2?348no7;>;<0ff?2?3483j7:7;<04g?2?3492<7:7;<14a?2?3498>7:7;<171?2?349>n7:7;|q1e4<72;q6>l>54g9>6d4=9>h0q~:93;295=}::h:1=5?4=545>4>5348o;7:m;<0g2?2e348o97:m;<0g0?2e348o?7:m;<0g6?2e348o<7:m;<0`b?7?9279h<4;b:?1a<<3j279i54;b:?1a2<3j279i;4;b:?1a0<3j279i94;b:?1a6<3j279i?4;b:?1a4<3j279;94>809>623=91;01?8i:5`8970b2=h0q~<n0;290~;5i90:4?522639`f=:<<k1h45227c9`d=z{=?o6=4<{<66a?2a34>>h7?72:?71f<3>2wx88k50;0x913b282970:90;f:?xu3>10;6>u247;90c=:<?=18;5247:95=4<uz>=57>52z?72<<60;168;l5d89~w13d2908w0::d;6e?822k3;3>63;618ge>{t<?=1<7=t=544>4>534>=47:i;<65f?bf3ty?9k4?:5y>030=91;0198::0:2?821<3;3=63;61823g=z{=<96=4=6z?720<60;16><:54c9>645=<k16><<54c9>647=<k16><>54c9>65`=<k16>=k54c9>65b=<k16>=m54c9>636=<k16>8h54c9>60c=<k16>8j54c9>60e=<k16>8l54c9>60g=<k16>8754c9>60>=<k16>9k54c9>61b=<k16>9m54c9>61d=<k16>9o54c9>61?=<k16>9654c9>611=<k16>9854c9>613=<k16=i854c9>5a3=<k16=i:54c9>5a5=<k16=i<54c9>5a7=<k16=i>54c9>5f`=<k16=nk54c9~w1062909;v3;6582<7=:<;n1=5=4=50`>4>434>9n7?73:?76d<60:168?751918914?282870:=6;3;7>;3:<0:4>5243695=5<5=886<6<;<616?7?;27?><4>829>076=919019?i:0:0?826m3;3?63;1e82<6=:<8h1=5=4=53b>4>434>:57?73:?75=<60:168<9519189171282870:>5;3;7>;39=0:4>5240195=5<5=;96<6<;<607?7?;27???4>829>067=919019=?:0:0?825n3;3?63;2d82<6=:<;=1=5=4=53`>4>434>:=7?73:?755<60:1688o5d`9>00>=91o0q~:9a;297~;3>o0:4<5247g95=7<5=<i6<9m;|q72a<72:9p198i:0:1?856=3>i70=>d;6a?856k3>i70=>b;6a?856i3>i70=>9;6a?85603>i70=>7;6a?856>3>i70=>4;6a?85ej3>i70=m9;6a?85ei3;3=63<bb87f>;4jm0?n63<c187f>;4jl0?n63<bg87f>;4k80?n63<c387f>;4ko0?n63<ce82<4=:;jo18o523e290g=:;m;18o523e690g=:;m818o523e190g=:;m?18o523e490g=:;hn18o523`a90g=:;ho18o523`c90g=:;h318o523``90g=:;h=18o523`495=7<5:k369l4=2c6>4>6349nm7:m;<1f=?2e349n47:m;<1f3?2e349n:7:m;<1f1?2e349n87:m;<1f7?2e349n>7:m;<1f5?2e3ty?:n4?:3cx910b282970?m2;6a?87e93>i70?m0;6a?87fn3>i70?ne;6a?87fl3>i70?nc;6a?87fj3>i70?na;6a?87ai3>i70?i9;6a?87a03>i70?i7;6a?87a>3>i70?i5;6a?87a<3>i70?i3;6a?87a:3>i70?j8;6a?87b?3>i70?j6;6a?87b=3>i70?j4;6a?87b;3>i70?j2;6a?87b93>i70?j0;6a?844i3>i70<<9;6a?84403>i70<<7;6a?844>3>i70<<5;6a?844<3>i70<<3;6a?844:3>i70<<1;6a?85503>i70=9e;6a?851n3>i70=9a;6a?xu5=>0;68u220690c=::?:1=5<4=335>ag<5;;36i74=33b>ae<uz8;n7>53z?151<60;16>4j5d89>6=g=l01v??::181846;3>m70<>6;34f>{t:9k1<7=t=330>4>53482o7jn;<0;=?bf3ty9=:4?:3y>644=<o16><6516`8yv4713:1?v3=1382<7=::0i1hn5229;9`f=z{;;26=49{<025?2a348:m7?8b:?15f<ci279=h4k9:?165<cj279>?4kc:p65>=839p1??>:0:1?84>j3nj70<78;fb?xu59k0;6?u220290c=::8i1=:l4}r033?6=;r79==4>839>6<d=lj16>565db9~w77c2909w0<?f;6e?846m3;<n6s|21494?5|5;:m6<6=;<0:e?bf3483;7jn;|q15c<72;q6>=k54g9>676=9>h0q~<?5;297~;58l0:4?5228c9`f=::1=1hn5rs302>5<5s48;h7:i;<017?70j2wx>=:50;1x976c282970<69;fb?84?>3nj7p}=2483>7}::9i18k52234952d<uz8;?7>53z?14f<60;16>475db9>6=0=lj1v<h>:18687e:3>m70?ia;3;6>;6j=0om63>b78g=>;6j10oo6s|1`;94?3|58h96<6=;<15=?b>349>?7j6;<174?b>348m97jn;|q2f6<72;q6=o?54g9>5g2=9>h0q~?n8;291~;6j80:4?5237;9`g=:;<91ho523529`g=::ol1hl5rs0`6>5<5s4;i<7:i;<3a2?70j2wx=l950;7x94d7282970=98;f:?852:3n270=<f;f:?84am3nj7p}>b683>3}:9hl18k521c:952d<58hj6io4=0``>a?<58hn6il4=0a3>ae<uz;j:7>55z?2ec<60;16?;65dc9>704=lk16?>h5dc9>6cb=lh1v<l6:18187fm3>m70?ma;34f>{t9h?1<7;t=0cf>4>5349=;7j6;<165?b>3498i7j6;<0eg?bf3ty:no4?:3y>5db=<o16=om516`8yv7f<3:19v3>ae82<7=:;?=1ho523439`g=:;:o1ho522g`9`d=z{8ho6=4={<3bg?2a34;ii7?8b:p5d5=83?p1<ol:0:1?851>3n270=:0;f:?854l3n270<ia;fb?xu6jo0;6?u21``90c=:9j;1=:l4}r3b6?6==r7:mo4>839>730=lk16?8>5dc9>76b=lk16>k75d`9~w4e42909w0?na;6e?87d<3;<n6s|1`394?3|58kj6<6=;<151?b>349?j7j6;<10g?b>348m47jn;|q101<72;q6>;>54g9>61c=9180q~<;3;296~;5=o0?j63=4e82<7=z{;?=6=4;{<06b?7?:279=;4k9:?15=<ci279=l4kb:p614=838p1?;j:5d8972d28297p}=5483>6}::<o1=5<4=33;>ad<5;;j6io4}r075?6=:r799i4;f:?10g<60;1v?;;:181842l3;3>63=1`8g=>{t:=:1<7<t=37`>1`<5;>j6<6=;|q116<72<q6>8m51908977d2m301??j:ec897472mi01?<=:e`8yv44n3:1>v3=5c87b>;5<00:4?5rs371>5<3s48>n7?72:?15`<cj279>=4k9:?167<ci2wx>>k50;0x973f2=l01?:7:0:1?xu5=80;6>u224c95=4<5;8;6io4=301>a?<uz88h7>52z?11<<3n2798:4>839~w7372908w0<:9;3;6>;5::0o563=278ge>{t::i1<7<t=37;>1`<5;>=6<6=;|q10c<72;q6>865190897412m30q~?kf;296~;6nh0?j63>e982<7=z{8nn6=4={<3e=?2a34;n;7?72:p5c6=83>p1<h6:0:1?87e<3n270?m6;fb?87e03ni7p}>de83>7}:9o218k521d495=4<uz;nj7>53z?2b=<60;16=o85dc9>5g>=lh1v<jl:18187a?3>m70?j5;3;6>{t9lo1<7<t=0d4>4>534;i47j6;|q2`g<72;q6=k854g9>5`2=9180q~?jd;291~;6n?0:4?521cc9`<=:9ki1hl521cg9`f=:9j:1ho5rs0fb>5<5s4;m97:i;<3f7?7?:2wx=hm50;6x94`2282970?mc;fa?87em3n270?l0;fb?xu6l00;6?u21g690c=:9l81=5<4}r3ff?6=;r7:j94>839>5gc=lh16=n>5d89~w4b?2909w0?i3;6e?87b93;3>6s|1dc94?5|58l86<6=;<3`5?b>34;h87jn;|q2`2<72;q6=k<54g9>5`6=9180q~?j9;296~;6n;0:4?521b69`<=z{;9;6=4={<07a?2a3488m7?72:p67`=838p1?:k:5d8975>28297p}=2d83>7}::=i18k5222:95=4<uz89h7>52z?10g<3n279?:4>839~w74d2909w0<;a;6e?844>3;3>6s|23`94?4|5;>269h4=316>4>53ty9>l4?:3y>61>=<o16>>:51908yv4513:1>v3=4687b>;5;:0:4?5rs30;>5<5s48?:7:i;<006?7?:2wx>?950;0x97222=l01?=>:0:1?xu5;k0;6<u225795=4<uz;hh7>52z?2a=<3n27:h;4>839~w4ed2909w0?j7;6e?87c=3;3>6s|1b`94?4|58o=69h4=0f7>4>53ty:ol4?:3y>5`3=<o16=i=51908yv7d13:1>v3>e587b>;6l;0:4?5rs0a;>5<5s4;n?7:i;<3g5?7?:2wx=n950;0x94c52=l01<j?:0:1?xu6k?0;6?u21d390c=:9jl1=5<4}r3`1?6=:r7:i=4;f:?2g`<60;1v?k?:18687c>3>m70<j9;3;6>;6190o563=8`8ge>;3=10?<6s|1g`94?4|58n>69h4=0;3>41e3ty:jn4?:3y>5a2=<o16=4?516`8yv7al3:1>v3>d287b>;61;0:;o5rs0df>5<5s4;o>7:i;<3:7?70j2wx=kh50;0x94b62=l01<7;:05a?xu5890;6?u21e290c=:90?1=:l4}r035?6=:r7:ok4;f:?2=3<6?k1v?>=:18187dm3>m70?67;34f>{t;l:1<7:t=31b>1`<5:oj6<6=;<3:<?b>34>>47=9;|q124<72;q6>>754g9>5<>=9>h0q~<92;296~;5;10?j63>98823g=z{;<86=4={<003?2a34;2m7?8b:p632=838p1?=9:5d894?e28=i7p}=6483>7}:::?18k5218a952d<uz8=:7>52z?171<3n27:5i4>7c9~w7002909w0<<3;6e?87>m3;<n6s|27:94?4|5;9969h4=0;e>41e3ty9:44?:3y>667=<o16=l>516`8yv4bi3:1=8u22e5903=::m<18;522e7903=::m>18;522e1903=::m818;522e2903=::jl18;522e3903=::l318;522d:903=::l=18;522d4903=::l?18;522d6903=::l918;522d0903=::l;18;5244c9`g=::?k1=:l4=3c1>ag<uz8jn7>52z?1`2<3n279o94>7c9~w7eb290?w0<k7;3;6>;5m00?j63=9e8ge>;5k<0o56s|2`c94?4|5;n=69h4=3a0>41e3ty9oi4?:5y>6a0=91801?k7:5d897?d2m301?lm:e;8yv4f13:1>v3=d487b>;5k;0:;o5rs3a`>5<3s48o97?72:?1a2<3n2795n4kb:?1f<<c12wx>l650;0x97b32=l01?m>:05a?xu5kk0;69u22e695=4<5;o=69h4=3;a>a?<5;h<6i74}r0b3?6=:r79h>4;f:?1g5<6?k1v?mn:18784c;3;3>63=e487b>;51k0on63=b48g=>{t:h<1<7<t=3f1>1`<5;hm6<9m;|q1g<<72=q6>i<5190897c32=l01?7n:e;897d42m30q~<n4;296~;5l90?j63=be823g=z{;i<6=4;{<0g4?7?:279i?4;f:?1=<<c1279mk4k9:p6d5=838p1?mi:5d897dd28=i7p}=c783>1}::jl1=5<4=3g2>1`<5;326il4=3cg>a?<uz8j97>52z?1`4<3n279nh4>7c9~w7e?290?w0<k1;3;6>;5m:0?j63=9`8gf>;5j80o56s|2cc94?4|5;i?6964=3`b>41e3ty9o84?:3y>6f2=9;301?m::05a?xu5j10;6>u22b190==::kk185522c:952d<uz8in7>53z?1g6<6:016>oo519:897de28=i7p}=b783>6}::j8185522c:90==::k<1=:l4}r0a=?6=;r79o?4>289>6g>=91201?l6:05a?xu5j=0;6>u22b390==::k<185522c6952d<uz8i;7>53z?1g4<6:016>o8519:897d028=i7p}=b383>6}::j:185522c690==::k81=:l4}r0a1?6=;r79o=4>289>6g2=91201?l::05a?xu5j90;6>u22cd90==::k8185522c2952d<uz8i?7>53z?1fc<6:016>o<519:897d428=i7p}=ad83>6}::ko185522c290==::ho1=:l4}r0a5?6=;r79nh4>289>6g6=91201?l>:05a?xu5ij0;6>u22cf90==::ho185522`a952d<uz8jj7>53z?1fa<6:016>lk519:897ga28=i7p}=ae83>6}::ki1=?74=3c`>4>?348jh7?8b:p6a`=83?p1?k7:0:1?87>93n270?60;fb?84?13n270::8;1f?xu5ll0;68u22d595=4<58396i74=0;2>ag<5;226il4=57;>6b<uz8oh7>55z?1a3<60;16=4=5d89>5<4=lh16>565d89>00>=;j1v?jl:18684b=3;3>63>958g=>;61:0om63=898gf>;3=108n6s|2e`94?3|5;o?6<6=;<3:1?b>34;287jn;<0;3?b>34>>47=n;|q1`d<72<q6>h=5190894?12m301<7::ec897>02mh019;7:2;8yv4c13:19v3=e382<7=:90=1h4521849`d=::1<1h45244:97==z{;n36=4;{<0f5?7?:27:5:4ka:?1<3<cj27?954<7:p620=839p1?9;:5d897122=l01?98:05a?xu5?=0;6?u226695=4<5;=<6i74}r044?6=:r79:k4;f:?134<6?k1v?8k:185841n3;3>63=728gf>;5?80on63=768gf>;5>k0o563=6`8gg>{t:>81<7<t=34f>1`<5;=86<9m;|q12f<72?q6>;k5190897142m301?9>:ec897102mk01?8m:ec8970f2mh0q~<i4;296~;4890?463=f5823g=z{;l>6=4={<134?751279j84>7c9~w67b2909w0=?0;34f>;49<0?j6s|2g194?5|5::26964=3d7>1><5;l86<9m;|q1bc<72:q6?=7513;897`3282370<if;34f>{t;;=1<7<t=22:>41e349:h7:i;|q0gg<72<q6>k:5509>7a3=91801>k6:5d896272mi01?hi:e;8yv4a:3:1?v3<0987<>;5n:0?463=f3823g=z{;ln6=4<{<13<?751279j>4>899>6cc=9>h0q~==6;296~;4810:;o5230a90c=z{:ij6=4:{<0e7?36349o87?72:?0a=<3n278?k4ka:?1b`<c12wx>k?50;1x96602=201?h=:5:897`628=i7p}=fe83>6}:;9=1=?74=3d1>4>?348mh7?8b:p773=838p1>>8:05a?856j3>m7p}<c883>0}::o819<523e195=4<5:o<69h4=21e>ae<5;lo6i74}r0e4?6=;r78<;4;8:?1b4<30279j=4>7c9~w7`d2908w0=?6;31=>;5n80:45522ga952d<uz9987>52z?043<6?k16?<o54g9~w6e?290>w0<i1;72?85c:3;3>63<e787b>;4;l0om63=fb8g=>{t:ll1<7=t=226>1><5;l;6964=3ge>41e3ty9jo4?:2y>753=9;301?h?:0:;?84aj3;<n6s|33194?4|5::>6<9m;<12=?2a3ty8o:4?:4y>6c6==816?i?5190896c22=l01>=j:ea897`e2m30q~<je;297~;48=0?463=eg87<>;5ml0:;o5rs3db>5<4s49;87?=9:?1ac<60116>ko516`8yv55:3:1>v3<05823g=:;8218k5rs2a5>5<2s48nj7;>;<1g4?7?:278i94;f:?07a<ci279jl4k9:p6`b=839p1>><:5:897cb2=201?kk:05a?xu5n00;6>u2311957?<5;on6<67;<0e=?70j2wx???50;0x966428=i70=>7;6e?xu4k<0;68u22dg914=:;jl1=5<4=2g0>1`<5:9o6im4=3d:>a?<uz8no7>53z?047<30279ii4;8:?1af<6?k1v?h7:180857:3;9563=ee82<==::o21=:l4}r114?6=:r78<?4>7c9>740=<o1v>m;:18684bl3?:70=le;3;6>;4m;0?j63<3b8ge>;5n10o56s|2d`94?5|5:::6964=3g`>1><5;oi6<9m;|q1b3<72:q6?=?513;897cd282370<i7;34f>{t;8l1<7<t=222>41e349:87:i;|q037<72;kp1?km:43896de2=<01>l6:54896df2=<01>ll:54896dc2=<01>m?:54896db2=<01>li:54896e62=<01>m=:54896ea2=<01>mk:54896eb2=<01>j?:54896b62=<01>j;:54896b52=<01>j<:54896b22=<01>j9:54896gc2=<01>ol:54896gb2=<01>on:54896g>2=<01>om:54896g02=<01>o9:54896g?2=<01>o::54896cf2=<01>k6:54896c?2=<01>k8:54896c12=<01>k::54896c32=<01>k<:54896c52=<01>k>:548961428=i7p}<0`83>7}:;8?1=5<4=20b>ae<uz9:?7>52z?05a<60;16??o5dc9~w6752909w0=>c;3;6>;4:h0om6s|30394?4|5:;i6<6=;<11e?b>3ty8==4?:3y>74g=91801><m:ec8yv57n3:1>v3<1882<7=:;;h1h45rs22f>5<5s49:47?72:?06f<ck2wx?=j50;0x9670282970==c;fa?xu48j0;6?u230495=4<5:8h6io4}r13f?6=:r78=94>839>77e=l01v><k:18085503>=70=9a;65?851l3;<n6s|33;94?4|5:8369h4=20a>41e3ty94h4?:3y>6<5=<116>4<516`8yv4>03:1>v3=9282<==::0n1=:l4}r0:b?6=:r795>4>7c9>6d4=l01v?6k:18184>:3>370<61;34f>{t:0=1<7<t=3;1>4>?3482o7?8b:p6=e=838p1?7>:5:897?728=i7p}=9783>7}::0;1=564=3;a>41e3ty94o4?:3y>6<6=<116>5h516`8yv4>=3:1>v3=9182<==::0k1=:l4}r0:0?6=:r794k4>899>6<?=9>h0q~<8b;296~;5090?463=7g823g=z{;2>6=4={<0;4?7?02794l4>7c9~w7?b2909w0<70;34f>;5i;0on6s|26c94?4|5;=m6964=35f>41e3ty9494?:3y>62`=91201?66:05a?xu5?00;6?u226g90==::>n1=:l4}r0;7?6=:r79;h4>899>6=>=9>h0q~<88;296~;5?m0?463=7b823g=z{;296=4={<04`?7?02794:4>7c9~w7>62909w0<8c;3;<>;50?0:;o5rs2;g>5<3s49in7:i;<1b3?7?:278:;4kc:?0<6<c12wx?o?50;1x96de282970=lf;6e?85283nh7p}<9c83>1}:;k318k523`795=4<5:<>6il4=25e>a?<uz9jj7>53z?0f<<60;16?nj54g9>71`=lk1v>7l:18785ei3>m70=n6;3;6>;4><0om63<808g=>{t;k:1<7=t=2`b>4>5349hi7:i;<17b?bf3ty85h4?:5y>7ge=<o16?l65190896012mk01>6::e;8yv5e:3:1?v3<bb82<7=:;m:18k523429`d=z{:3m6=4;{<1a`?2a349j57?72:?022<ck2784:4k9:p7g5=839p1>lk:0:1?85c93>m70=:1;f`?xu4i;0;69u23b290c=:;hi1=5<4=24;>ag<5:2o6i74}r1a2?6=;r78o=4>839>7a2=<o16?8<5d`9~w6g7290?w0=me;6e?85fi3;3>63<668ge>;4000o56s|3c694?5|5:hn6<6=;<1g6?2a349>=7jn;|q0e4<72=q6?oh54g9>7dd=91801>87:ea896>e2m30q~=m5;297~;4jo0:4?523e190c=:;<81hn5rs2c0>5<3s49h=7:i;<1b`?7?:278:44kc:?0<c<c12wx?o950;1x96e6282970=k5;6e?852;3nh7p}<a583>1}:;j818k523`g95=4<5:<26io4=2;b>a?<uz9i47>53z?0g7<60;16?i854g9>705=lh1v>m<:18785dl3;3>63<e087b>;4;j0on63=f68g<>{t;ji1<7:t=2f5>4>5349nm7:i;<174?bf348m97j6;|q03f<72;q6?lj54g9>7<>=9>h0q~=8b;296~;4ij0?j63<96823g=z{:=o6=4={<1ba?2a349257?8b:p72?=838p1>on:5d896?228=i7p}<7983>7}:;h318k52386952d<uz9<m7>52z?0eg<3n2785;4>7c9~w6112909w0=n7;6e?85>:3;<n6s|36794?4|5:k=69h4=2;2>41e3ty8;:4?:3y>7d>=<o16?4=516`8yv50<3:1>v3<a487b>;4190:;o5rs2:f>5<5s49257:7;<1;a?70j2wx?4o50;0x96?>288270=6a;34f>{t;1i1<7=t=2;;>1><5:2n6964=2:`>41e3ty84k4?:2y>7<>=9;301>6j:0:;?85?n3;<n6s|39c94?5|5:3<6964=2:`>1><5:2j6<9m;|q0<a<72:q6?49513;896>d282370=7d;34f>{t;121<7=t=2;5>1><5:2j6964=2:;>41e3ty84o4?:2y>7<0=9;301>6n:0:;?85?j3;<n6s|39494?5|5:3>6964=2:;>1><5:2=6<9m;|q0<<<72:q6?4;513;896>?282370=79;34f>{t;1>1<7=t=2;7>1><5:2=6964=2:7>41e3ty84:4?:2y>7<2=9;301>69:0:;?85??3;<n6s|39094?5|5:386964=2:7>1><5:296<9m;|q0<0<72:q6?4=513;896>3282370=75;34f>{t;1:1<7=t=2;1>1><5:296964=2:3>41e3ty84>4?:2y>7<4=9;301>6=:0:;?85?;3;<n6s|36g94?5|5:3:6964=2:3>1><5:=n6<9m;|q0<4<72:q6?4?513;896>7282370=71;34f>{t;>l1<7=t=2;3>44>349<i7?78:?03c<6?k1v>ji:18785b13;3>63>988g=>;6110om63;59800>{t;mo1<7:t=2g;>4>534;2m7j6;<3:=?bf34>>47=<;|q0`a<72=q6?h95190894?e2m301<7n:ec8913?2:80q~=kc;290~;4m?0:4?5218a9`<=:90h1hl5244:974=z{:ni6=4;{<1f1?7?:27:5i4k9:?2=f<ci27?954<0:p7ag=83>p1>k;:0:1?87>m3n270?6d;fb?822038m7p}<d883>1}:;l91=5<4=0;e>a?<583n6io4=57;>7c<uz9o47>54z?0a7<60;16=l>5d89>5<`=lh1688652e9~w6b02908w0=j1;3;6>;6i90om63;5981g>{t;:=1<7<t=211>4>?3498o7?8b:p77c=838p1>==:05a?854;3>37p}<3983>7}:;:91=564=21g>41e3ty8>k4?:3y>765=9>h01>=;:5:8yv5413:1>v3<3582<==:;:o1=:l4}r104?6=:r78?94>7c9>763=<11v>=n:181854=3;3463<3g823g=z{:9:6=4={<101?70j278?;4;8:p76d=838p1>=9:0:;?85383;<n6s|34694?4|5:9=6<9m;<145?be3ty88l4?:3y>713=91201>:i:05a?xu4<80;6?u2357952d<5:>=6964}r17f?6=:r788;4>899>706=9>h0q~=;2;296~;4<?0:;o5235590==z{:>h6=4={<173?7?02789<4>7c9~w6242909w0=;7;34f>;4<10?46s|35f94?4|5:>36<67;<166?70j2wx?9:50;0x962?28=i70=;9;6;?xu4<l0;6?u235;95=><5:?86<9m;|q010<72:q6?97516`896162m301>8l:e`8yv5183:1>v3<5c82<==:;??1=:l4}r163?6=:r789o4>7c9>70e=<11v>8>:181852k3;3463<67823g=z{:?36=4={<16g?70j2789i4;8:p734=838p1>;k:0:;?851?3;<n6s|34;94?4|5:?o6<9m;<16a?2?3ty8:>4?:3y>70c=91201>87:05a?xu4=h0;6?u234g952d<5:?m6964}r150?6=:r789k4>899>73?=9>h0q~=:6;296~;4=o0:;o5237a9`<=z{:=;6=4<{<15a?2a349=j7:i;<145?70j2wx?;k50;6x960b282970=82;fb?850;3nj70=9d;f;?xu4>k0;6?u237c90c=:;?i1=:l4}r66f?6=:<q68?j5479>07e=<?168?l5479>07g=<?168?75479>07>=<?168?85479>073=<?168?:5479>075=<?168?<5479>077=<?168?>5479>04`=<?168<k5479>04b=<?168<l5479>04g=<?168<75479>04>=<?168<95479>040=<?168<;5479>042=<?168<=5479>044=<?168>=5479>064=<?168>?5479>066=<?168?h5479>07c=<?168?95479>04e=<?168<?5479>046=<?16>;l516`8yv2283:1>v3;2e87b>;3=10h;6s|45d94?4|5=8h69h4=57;>g1<uz>?i7>52z?76g<3n27?954m5:p01b=838p19<n:5d8913?2k90q~:;c;296~;3:00?j63;598a6>{t<=h1<7<t=50;>1`<5=?36o?4}r67=?6=:r7?>;4;f:?71=<e82wx89650;0x91422=l019;7:`d8yv23?3:1>v3;2587b>;3=10ji6s|45494?4|5=8869h4=57;>f3<uz>?97>52z?767<3n27?954nd:p012=838p19<>:5d8913?2hi0q~:;3;296~;3:90?j63;598bf>{t<=81<7<t=53e>1`<5=?36lo4}r675?6=:r7?=h4;f:?71=<f02wx89>50;0x917c2=l019;7:`58yv24m3:1>v3;1c87b>;3=10j:6s|42f94?4|5=;j69h4=57;>d3<uz>8o7>52z?75<<3n27?954l4:p06d=838p19?7:5d8913?2h>0q~:<a;296~;39>0?j63;598b7>{t<:31<7<t=535>1`<5=?36l<4}r60<?6=:r7?=84;f:?71=<f92wx8>950;0x91732=l019;7:`28yv24>3:1>v3;1287b>;3=102j6s|42794?4|5=;969h4=57;>gc<uz>>;7>52z?776<3n27?954md:p000=838p19==:5d8913?2j90q~::5;296~;3;80?j63;598ag>{t<<>1<7<t=513>1`<5=?36ol4}r667?6=:r7?>k4;f:?71=<ei2wx88<50;0x914b2=l019;7:c;8yv2293:1>v3;2687b>;3=10i46s|45c94?4|5=;h69h4=57;>g2<uz>8j7>52z?754<3n27?954n9:p062=838p19??:5d8913?20o0q~==a;296~;4:h0:;o5233`9`g=z{=?26=4={<66e?70j27?954l9:p7`d=83?p1>9>:ec8960d2mk01>9=:05a?82203><863;598`<>{t9?:1<7<t=300>ag<5;896<<n;|q22g<72;q6=n?5d`9>5f6=9;k0q~<=4;296~;5:?0on63=23823g=z{8i96=4={<3`0?be34;h<7?8b:p560=838p1><l:05a?855j3nh7ps|54d94?4|V<?m70:<:47e?!2083;=h6s|57594?4|V<<<70:<:444?!2083;=i6s|54394?4|V<?:70:<:472?!2083;=j6s|4c294?4|V=3n70:<:5;f?!2083;?>6s|4`g94?4|V=3o70:<:5;g?!2083;?h6s|4`f94?4|V=3h70:<:5;`?!2083;>;6s|4`a94?4|V=3i70:<:5;a?!2083;>56s|4``94?4|V=3j70:<:5;b?!2083;>m6s|4`c94?4|V=3270:<:5;:?!2083;>n6s|4`;94?4|V=3370:<:5;;?!2083;>h6s|4`:94?4|V=3<70:<:5;4?!2083;>i6s|4c;94?4|V=k=70:<:5c5?!2083;>j6s|4c:94?4|V=k>70:<:5c6?!2083;==6s|4c594?4|V=k?70:<:5c7?!2083;=>6s|4c494?4|V=k870:<:5c0?!2083;=?6s|4c794?4|V=k970:<:5c1?!2083;=86s|4c694?4|V=k:70:<:5c2?!2083;=96s|4c194?4|V=k;70:<:5c3?!2083;=:6s|4c094?4|V=3m70:<:5;e?!2083;=;6s|4c394?4|V=3=70:<:5;5?!2083;=46s|4`594?4|V=3>70:<:5;6?!2083;=56s|56194?4|V<=870:<:450?!2083;=m6s|54f94?4|V<?o70:<:47g?!2083;=o6s|4g`94?4|V=n<70:<:5f4?!2083;<<6s|4g;94?4|V=n=70:<:5f5?!2083;<=6s|4g:94?4|V=n>70:<:5f6?!2083;<>6s|4g594?4|V=n?70:<:5f7?!2083;<?6s|4g494?4|V=n870:<:5f0?!2083;<86s|4g794?4|V=n970:<:5f1?!2083;<96s|4g194?4|V=n;70:<:5f3?!2083;<:6s|4g094?4|V=im70:<:5ae?!2083;<;6s|4g394?4|V=in70:<:5af?!2083;<46s|4g294?4|V=io70:<:5ag?!2083;846s|4dd94?4|V=ih70:<:5a`?!2083;856s|4dg94?4|V=ii70:<:5aa?!2083;8m6s|4df94?4|V=ij70:<:5ab?!2083;8n6s|4da94?4|V=i270:<:5a:?!2083;8o6s|4d`94?4|V=i370:<:5a;?!2083;8h6s|4dc94?4|V=i<70:<:5a4?!2083;8i6s|4d:94?4|V=i>70:<:5a6?!2083;8j6s|4d594?4|V=i?70:<:5a7?!2083;?<6s|4d494?4|V=i870:<:5a0?!2083;?=6s|4d794?4|V=i970:<:5a1?!2083;??6s|4d694?4|V=i:70:<:5a2?!2083;?86s|4d194?4|V=i;70:<:5a3?!2083;?96s|4d094?4|V=hm70:<:5`e?!2083;?:6s|4d394?4|V=hn70:<:5`f?!2083;?;6s|4d294?4|V=ho70:<:5`g?!2083;?46s|4ed94?4|V=hh70:<:5``?!2083;?56s|51094?4|V=no70:<:5fg?!2083;?m6s|51394?4|V=nh70:<:5f`?!2083;?n6s|51294?4|V=ni70:<:5fa?!2083;?o6s|4gd94?4|V=nj70:<:5fb?!2083;?i6s|4gg94?4|V=n270:<:5f:?!2083;?j6s|4gf94?4|V=n370:<:5f;?!2083;><6s|4ga94?4|V=n:70:<:5f2?!2083;>=6s|4g694?4|V=i=70:<:5a5?!2083;>>6s|4d;94?4|V=hi70:<:5`a?!2083;>?6s|4eg94?4|V=hj70:<:5`b?!2083;>86s|51c94?4|V<:j70:<:42b?!2083;>96s|49794?4|V=2>70:<:5:6?!2083;>:6s|51694?4|V<:?70:<:427?!2083;>46s|53d94?4|V<8m70:<:40e?!2083;>o6srn`f:>5<5sA><=6saaec94?4|@==:7p`ndc83>7}O<>;0qcokc;296~N3?81vbljk:181M2092wemik50;0xL1163tdjhk4?:3yK027<ugkn<7>52zJ734=zfho:6=4={I645>{iil81<7<tH552?xhfm:0;6?uG4638ykgb<3:1>vF;709~jdc22909wE:81:me`0=838pD99>;|lba2<72;qC8:?4}ocf<?6=:rB?;<5rn`g:>5<5sA><=6saadc94?4|@==:7p`nec83>7}O<>;0qcojc;296~N3?81vblkk:181M2092wemhk50;0xL1163tdjik4?:3yK027<ugkm<7>52zJ734=zfhl:6=4={I645>{iio81<7<tH552?xhfn:0;6?uG4638ykga<3:1>vF;709~jd`22909wE:81:mec0=838pD99>;|lbb2<72;qC8:?4}oce<?6=:rB?;<5rn`d:>5<5sA><=6saagc94?4|@==:7p`nfc83>7}O<>;0qcoic;296~N3?81vblhk:181M2092wemkk50;0xL1163tdjjk4?:3yK027<ugh;<7>52zJ734=zfk::6=4={I645>{ij981<7<tH552?xhe8:0;6?uG4638ykd7<3:1>vF;709~jg622909wE:81:mf50=838pD99>;|la42<72;qC8:?4}o`3<?6=:rB?;<5rnc2:>5<5sA><=6sab1c94?4|@==:7p`m0c83>7}O<>;0qcl?c;296~N3?81vbo>k:181M2092wen=k50;0xL1163tdi<k4?:3yK027<ugh:<7>52zJ734=zfk;:6=4={I645>{ij881<7<tH552?xhe9:0;6?uG4638ykd6<3:1>vF;709~jg722909wE:81:mf40=838pD99>;|la52<72;qC8:?4}o;2e?6=9rB?;<5rn87:>5<6sA><=6sa94c94?7|@==:7p`65c83>4}O<>;0qc7:c;295~N3?81vb4;k:182M2092we58k50;3xL1163td29k4?:0yK027<ug3=<7>51zJ734=zf0<:6=4>{I645>{i1?81<7?tH552?xh>>:0;6<uG4638yk?1<3:1=vF;709~j<02290:wE:81:m=30=83;pD99>;|l:22<728qC8:?4}o;5<?6=9rB?;<5rn84:>5<6sA><=6sa97c94?7|@==:7p`66c83>4}O<>;0qc79c;295~N3?81vb48k:182M2092we5;k50;3xL1163td2:k4?:0yK027<ug3<<7>51zJ734=zf0=:6=4>{I645>{i1>81<7?tH552?xh>?:0;6<uG4638yk?0<3:1=vF;709~j<12290:wE:81:m=20=83;pD99>;|l:32<728qC8:?4}o;4<?6=9rB?;<5rn85:>5<6sA><=6sa96c94?7|@==:7p`67c83>4}O<>;0qc78c;295~N3?81vb49k:182M2092we5:k50;3xL1163td2;k4?:0yK027<ug33<7>51zJ734=zf02:6=4>{I645>{i1181<7?tH552?xh>0:0;6<uG4638yk??<3:1=vF;709~j<>2290:wE:81:m==0=83;pD99>;|l:<2<728qC8:?4}o;;<?6=9rB?;<5rn8::>5<6sA><=6sa99c94?7|@==:7p`68c83>4}O<>;0qc77c;295~N3?81vb46k:182M2092we55k50;3xL1163td24k4?:0yK027<ug32<7>51zJ734=zf03:6=4>{I645>{i1081<7?tH552?xh>1:0;6<uG4638yk?><3:1=vF;709~j<?2290:wE:81:m=<0=83;pD99>;|l:=2<728qC8:?4}o;:<?6=9rB?;<5rn8;:>5<6sA><=6sa98c94?7|@==:7p`69c83>4}O<>;0qc76c;295~N3?81vb47k:182M2092we54k50;3xL1163td25k4?:0yK027<ug3j<7>51zJ734=zf0k:6=4>{I645>{i1h81<7?tH552?xh>i:0;6<uG4638yk?f<3:1=vF;709~j<g2290:wE:81:m=d0=83;pD99>;|l:e2<728qC8:?4}o;b<?6=9rB?;<5rn8c:>5<6sA><=6sa9`c94?7|@==:7p`6ac83>4}O<>;0qc7nc;295~N3?81vb4ok:182M2092we5lk50;3xL1163td2mk4?:0yK027<ug3i<7>51zJ734=zf0h:6=4>{I645>{i1k81<7?tH552?xh>j:0;6<uG4638yk?e<3:1=vF;709~j<d2290:wE:81:m=g0=83;pD99>;|l:f2<728qC8:?4}o;a<?6=9rB?;<5rn8`:>5<6sA><=6sa9cc94?7|@==:7p`6bc83>4}O<>;0qc7mc;295~N3?81vb4lk:182M2092we5ok50;3xL1163td2nk4?:0yK027<ug3h<7>51zJ734=zf0i:6=4>{I645>{i1j81<7?tH552?xh>k:0;6<uG4638yk?d<3:1=vF;709~j<e2290:wE:81:m=f0=83;pD99>;|l:g2<728qC8:?4}o;`<?6=9rB?;<5rn8a:>5<6sA><=6sa9bc94?7|@==:7p`6cc83>4}O<>;0qc7lc;295~N3?81vb4mk:182M2092we5nk50;3xL1163td2ok4?:0yK027<ug3o<7>51zJ734=zf0n:6=4>{I645>{i1m81<7?tH552?xh>l:0;6<uG4638yk?c<3:1=vF;709~j<b2290:wE:81:m=a0=83;pD99>;|l:`2<728qC8:?4}o;g<?6=9rB?;<5rn8f:>5<6sA><=6sa9ec94?7|@==:7p`6dc83>4}O<>;0qc7kc;295~N3?81vb4jk:182M2092we5ik50;3xL1163td2hk4?:0yK027<ug3n<7>51zJ734=zf0o:6=4>{I645>{i1l81<7?tH552?xh>m:0;6<uG4638yk?b<3:1=vF;709~j<c2290:wE:81:m=`0=83;pD99>;|l:a2<728qC8:?4}o;f<?6=9rB?;<5rn8g:>5<6sA><=6sa9dc94?7|@==:7p`6ec83>4}O<>;0qc7jc;295~N3?81vb4kk:182M2092we5hk50;3xL1163td2ik4?:0yK027<ug3m<7>51zJ734=zf0l:6=4>{I645>{i1o81<7?tH552?xh>n:0;6<uG4638yk?a<3:1=vF;709~j<`2290:wE:81:m=c0=83;pD99>;|l:b2<728qC8:?4}o;e<?6=9rB?;<5rn8d:>5<6sA><=6sa9gc94?7|@==:7p`6fc83>4}O<>;0qc7ic;295~N3?81vb4hk:182M2092we5kk50;3xL1163td2jk4?:0yK027<ugk;<7>51zJ734=zfh::6=4>{I645>{ii981<7?tH552?xhf8:0;6<uG4638ykg7<3:1=vF;709~jd62290:wE:81:me50=83;pD99>;|lb42<728qC8:?4}oc3<?6=9rB?;<5rn`2:>5<6sA><=6saa1c94?7|@==:7p`n0c83>4}O<>;0qco?c;295~N3?81vbl>k:182M2092wem=k50;3xL1163tdj<k4?:0yK027<ugk:<7>51zJ734=zfh;:6=4>{I645>{ii881<7?tH552?xhf9:0;6<uG4638ykg6<3:1=vF;709~jd72290:wE:81:me40=83;pD99>;|lb52<728qC8:?4}oc2<?6=9rB?;<5rn`3:>5<6sA><=6saa0c94?7|@==:7p`n1c83>4}O<>;0qco>c;295~N3?81vbl?k:182M2092wem<k50;3xL1163tdj=k4?:0yK027<ugk9<7>51zJ734=zfh8:6=4>{I645>{ii;81<7?tH552?xhf::0;6<uG4638ykg5<3:1=vF;709~jd42290:wE:81:me70=83;pD99>;|lb62<728qC8:?4}oc1<?6=9rB?;<5rn`0:>5<6sA><=6saa3c94?7|@==:7p`n2c83>4}O<>;0qco=c;295~N3?81vbl<k:182M2092wem?k50;3xL1163tdj>k4?:0yK027<ugk8<7>51zJ734=zfh9:6=4>{I645>{ii:81<7?tH552?xhf;:0;6<uG4638ykg4<3:1=vF;709~jd52290:wE:81:me60=83;pD99>;|lb72<728qC8:?4}oc0<?6=9rB?;<5rn`1:>5<6sA><=6saa2c94?7|@==:7p`n3c83>4}O<>;0qco<c;295~N3?81vbl=k:182M2092wem>k50;3xL1163tdj?k4?:0yK027<ugk?<7>51zJ734=zfh>:6=4>{I645>{ii=81<7?tH552?xhf<:0;6<uG4638ykg3<3:1=vF;709~jd22290:wE:81:me10=83;pD99>;|lb02<728qC8:?4}oc7<?6=9rB?;<5rn`6:>5<6sA><=6saa5c94?7|@==:7p`n4c83>4}O<>;0qco;c;295~N3?81vbl:k:182M2092wem9k50;3xL1163tdj8k4?:0yK027<ugk><7>51zJ734=zfh?:6=4>{I645>{ii<81<7?tH552?xhf=:0;6<uG4638ykg2<3:1=vF;709~jd32290:wE:81:me00=83;pD99>;|lb12<728qC8:?4}oc6<?6=9rB?;<5rn`7:>5<6sA><=6saa4c94?7|@==:7p`n5c83>4}O<>;0qco:c;295~N3?81vbl;k:182M2092wem8k50;3xL1163tdj9k4?:0yK027<ugk=<7>51zJ734=zfh<:6=4>{I645>{ii?81<7?tH552?xhf>:0;6<uG4638ykg1<3:1=vF;709~jd02290:wE:81:me30=83;pD99>;|lb22<728qC8:?4}oc5<?6=9rB?;<5rn`4:>5<6sA><=6saa7c94?7|@==:7p`n6c83>4}O<>;0qco9c;295~N3?81vbl8k:182M2092wem;k50;3xL1163tdj:k4?:0yK027<ugk<<7>51zJ734=zfh=:6=4>{I645>{ii>81<7?tH552?xhf?:0;6<uG4638ykg0<3:1=vF;709~jd12290:wE:81:me20=83;pD99>;|lb32<728qC8:?4}oc4<?6=9rB?;<5rn`5:>5<6sA><=6saa6c94?7|@==:7p`n7c83>4}O<>;0qco8c;295~N3?81vbl9k:182M2092wem:k50;3xL1163tdj;k4?:0yK027<ugk3<7>51zJ734=zfh2:6=4>{I645>{ii181<7?tH552?xhf0:0;6<uG4638ykg?<3:1=vF;709~jd>2290:wE:81:me=0=83;pD99>;|lb<2<728qC8:?4}oc;<?6=9rB?;<5rn`::>5<6sA><=6saa9c94?7|@==:7p`n8c83>4}O<>;0qco7c;295~N3?81vbl6k:182M2092wem5k50;3xL1163tdj4k4?:0yK027<ugk2<7>51zJ734=zfh3:6=4>{I645>{ii081<7?tH552?xhf1:0;6<uG4638ykg><3:1=vF;709~jd?2290:wE:81:me<0=83;pD99>;|lb=2<728qC8:?4}oc:<?6=9rB?;<5rn`;:>5<6sA><=6saa8c94?7|@==:7p`n9c83>4}O<>;0qco6c;295~N3?81vbl7k:182M2092wem4k50;3xL1163tdj5k4?:0yK027<ugkj<7>51zJ734=zfhk:6=4>{I645>{iih81<7?tH552?xhfi:0;6<uG4638ykgf<3:1=vF;709~jdg2290:wE:81:med0=83;pD99>;|lbe2<728qC8:?4}ocb<?6=9rB?;<5rn`c:>5<6sA><=6saa`c94?7|@==:7p`nac83>4}O<>;0qconc;295~N3?81vblok:182M2092wemlk50;3xL1163tdjmk4?:0yK027<ugki<7>51zJ734=zfhh:6=4>{I645>{iik81<7?tH552?xhfj:0;6<uG4638ykge<3:1=vF;709~jdd2290:wE:81:meg0=83;pD99>;|lbf2<728qC8:?4}oca<?6=9rB?;<5rn``:>5<6sA><=6saacc94?7|@==:7p`nbc83>4}O<>;0qcomc;295~N3?81vbllk:182M2092wemok50;3xL1163tdjnk4?:0yK027<ugkh<7>51zJ734=zfhi:6=4>{I645>{iij81<7?tH552?xhfk:0;6<uG4638ykgd<3:1=vF;709~jde2290:wE:81:mef0=83;pD99>;|lbg2<728qC8:?4}oc`<?6=9rB?;<5rn`a:>5<6sA><=6saabc94?7|@==:7p`ncc83>4}O<>;0qcolc;295~N3?81vblmk:182M2092wemnk50;3xL1163tdjok4?:0yK027<ugko<7>51zJ734=zfhn:6=4>{I645>{iim81<7?tH552?xhfl:0;6<uG4638ykgc<3:1=vF;709~jdb2290:wE:81:mea0=83;pD99>;|lb`2<728qC8:?4}ocg<?6=9rB?;<5r}|CDF}dl10<jh:ke93~DED|8tJK\vsO@ \ No newline at end of file
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.v b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.v
new file mode 100644
index 000000000..25ac9779e
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.v
@@ -0,0 +1,173 @@
+/*******************************************************************************
+* This file is owned and controlled by Xilinx and must be used *
+* solely for design, simulation, implementation and creation of *
+* design files limited to Xilinx devices or technologies. Use *
+* with non-Xilinx devices or technologies is expressly prohibited *
+* and immediately terminates your license. *
+* *
+* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" *
+* SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR *
+* XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION *
+* AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION *
+* OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS *
+* IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, *
+* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE *
+* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY *
+* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE *
+* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR *
+* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF *
+* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *
+* FOR A PARTICULAR PURPOSE. *
+* *
+* Xilinx products are not intended for use in life support *
+* appliances, devices, or systems. Use in such applications are *
+* expressly prohibited. *
+* *
+* (c) Copyright 1995-2009 Xilinx, Inc. *
+* All rights reserved. *
+*******************************************************************************/
+// The synthesis directives "translate_off/translate_on" specified below are
+// supported by Xilinx, Mentor Graphics and Synplicity synthesis
+// tools. Ensure they are correct for your synthesis tool(s).
+
+// You must compile the wrapper file fifo_xlnx_512x36_2clk_18to36.v when simulating
+// the core, fifo_xlnx_512x36_2clk_18to36. When compiling the wrapper file, be sure to
+// reference the XilinxCoreLib Verilog simulation library. For detailed
+// instructions, please refer to the "CORE Generator Help".
+
+`timescale 1ns/1ps
+
+module fifo_xlnx_512x36_2clk_18to36(
+ rst,
+ wr_clk,
+ rd_clk,
+ din,
+ wr_en,
+ rd_en,
+ dout,
+ full,
+ almost_full,
+ empty,
+ prog_full);
+
+
+input rst;
+input wr_clk;
+input rd_clk;
+input [17 : 0] din;
+input wr_en;
+input rd_en;
+output [35 : 0] dout;
+output full;
+output almost_full;
+output empty;
+output prog_full;
+
+// synthesis translate_off
+
+ FIFO_GENERATOR_V6_1 #(
+ .C_COMMON_CLOCK(0),
+ .C_COUNT_TYPE(0),
+ .C_DATA_COUNT_WIDTH(10),
+ .C_DEFAULT_VALUE("BlankString"),
+ .C_DIN_WIDTH(18),
+ .C_DOUT_RST_VAL("0"),
+ .C_DOUT_WIDTH(36),
+ .C_ENABLE_RLOCS(0),
+ .C_ENABLE_RST_SYNC(1),
+ .C_ERROR_INJECTION_TYPE(0),
+ .C_FAMILY("spartan3"),
+ .C_FULL_FLAGS_RST_VAL(0),
+ .C_HAS_ALMOST_EMPTY(0),
+ .C_HAS_ALMOST_FULL(1),
+ .C_HAS_BACKUP(0),
+ .C_HAS_DATA_COUNT(0),
+ .C_HAS_INT_CLK(0),
+ .C_HAS_MEMINIT_FILE(0),
+ .C_HAS_OVERFLOW(0),
+ .C_HAS_RD_DATA_COUNT(0),
+ .C_HAS_RD_RST(0),
+ .C_HAS_RST(1),
+ .C_HAS_SRST(0),
+ .C_HAS_UNDERFLOW(0),
+ .C_HAS_VALID(0),
+ .C_HAS_WR_ACK(0),
+ .C_HAS_WR_DATA_COUNT(0),
+ .C_HAS_WR_RST(0),
+ .C_IMPLEMENTATION_TYPE(2),
+ .C_INIT_WR_PNTR_VAL(0),
+ .C_MEMORY_TYPE(1),
+ .C_MIF_FILE_NAME("BlankString"),
+ .C_MSGON_VAL(1),
+ .C_OPTIMIZATION_MODE(0),
+ .C_OVERFLOW_LOW(0),
+ .C_PRELOAD_LATENCY(0),
+ .C_PRELOAD_REGS(1),
+ .C_PRIM_FIFO_TYPE("1kx18"),
+ .C_PROG_EMPTY_THRESH_ASSERT_VAL(4),
+ .C_PROG_EMPTY_THRESH_NEGATE_VAL(5),
+ .C_PROG_EMPTY_TYPE(0),
+ .C_PROG_FULL_THRESH_ASSERT_VAL(1015),
+ .C_PROG_FULL_THRESH_NEGATE_VAL(1014),
+ .C_PROG_FULL_TYPE(1),
+ .C_RD_DATA_COUNT_WIDTH(9),
+ .C_RD_DEPTH(512),
+ .C_RD_FREQ(1),
+ .C_RD_PNTR_WIDTH(9),
+ .C_UNDERFLOW_LOW(0),
+ .C_USE_DOUT_RST(1),
+ .C_USE_ECC(0),
+ .C_USE_EMBEDDED_REG(0),
+ .C_USE_FIFO16_FLAGS(0),
+ .C_USE_FWFT_DATA_COUNT(0),
+ .C_VALID_LOW(0),
+ .C_WR_ACK_LOW(0),
+ .C_WR_DATA_COUNT_WIDTH(10),
+ .C_WR_DEPTH(1024),
+ .C_WR_FREQ(1),
+ .C_WR_PNTR_WIDTH(10),
+ .C_WR_RESPONSE_LATENCY(1))
+ inst (
+ .RST(rst),
+ .WR_CLK(wr_clk),
+ .RD_CLK(rd_clk),
+ .DIN(din),
+ .WR_EN(wr_en),
+ .RD_EN(rd_en),
+ .DOUT(dout),
+ .FULL(full),
+ .ALMOST_FULL(almost_full),
+ .EMPTY(empty),
+ .PROG_FULL(prog_full),
+ .BACKUP(),
+ .BACKUP_MARKER(),
+ .CLK(),
+ .SRST(),
+ .WR_RST(),
+ .RD_RST(),
+ .PROG_EMPTY_THRESH(),
+ .PROG_EMPTY_THRESH_ASSERT(),
+ .PROG_EMPTY_THRESH_NEGATE(),
+ .PROG_FULL_THRESH(),
+ .PROG_FULL_THRESH_ASSERT(),
+ .PROG_FULL_THRESH_NEGATE(),
+ .INT_CLK(),
+ .INJECTDBITERR(),
+ .INJECTSBITERR(),
+ .WR_ACK(),
+ .OVERFLOW(),
+ .ALMOST_EMPTY(),
+ .VALID(),
+ .UNDERFLOW(),
+ .DATA_COUNT(),
+ .RD_DATA_COUNT(),
+ .WR_DATA_COUNT(),
+ .PROG_EMPTY(),
+ .SBITERR(),
+ .DBITERR());
+
+
+// synthesis translate_on
+
+endmodule
+
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.veo b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.veo
new file mode 100644
index 000000000..db2795098
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.veo
@@ -0,0 +1,53 @@
+/*******************************************************************************
+* This file is owned and controlled by Xilinx and must be used *
+* solely for design, simulation, implementation and creation of *
+* design files limited to Xilinx devices or technologies. Use *
+* with non-Xilinx devices or technologies is expressly prohibited *
+* and immediately terminates your license. *
+* *
+* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" *
+* SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR *
+* XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION *
+* AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION *
+* OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS *
+* IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, *
+* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE *
+* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY *
+* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE *
+* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR *
+* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF *
+* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *
+* FOR A PARTICULAR PURPOSE. *
+* *
+* Xilinx products are not intended for use in life support *
+* appliances, devices, or systems. Use in such applications are *
+* expressly prohibited. *
+* *
+* (c) Copyright 1995-2009 Xilinx, Inc. *
+* All rights reserved. *
+*******************************************************************************/
+// The following must be inserted into your Verilog file for this
+// core to be instantiated. Change the instance name and port connections
+// (in parentheses) to your own signal names.
+
+//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
+fifo_xlnx_512x36_2clk_18to36 YourInstanceName (
+ .rst(rst),
+ .wr_clk(wr_clk),
+ .rd_clk(rd_clk),
+ .din(din), // Bus [17 : 0]
+ .wr_en(wr_en),
+ .rd_en(rd_en),
+ .dout(dout), // Bus [35 : 0]
+ .full(full),
+ .almost_full(almost_full),
+ .empty(empty),
+ .prog_full(prog_full));
+
+// INST_TAG_END ------ End INSTANTIATION Template ---------
+
+// You must compile the wrapper file fifo_xlnx_512x36_2clk_18to36.v when simulating
+// the core, fifo_xlnx_512x36_2clk_18to36. When compiling the wrapper file, be sure to
+// reference the XilinxCoreLib Verilog simulation library. For detailed
+// instructions, please refer to the "CORE Generator Help".
+
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.xco b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.xco
new file mode 100644
index 000000000..f888ba5f4
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.xco
@@ -0,0 +1,84 @@
+##############################################################
+#
+# Xilinx Core Generator version 12.1
+# Date: Wed Aug 18 17:27:35 2010
+#
+##############################################################
+#
+# This file contains the customisation parameters for a
+# Xilinx CORE Generator IP GUI. It is strongly recommended
+# that you do not manually alter this file as it may cause
+# unexpected and unsupported behavior.
+#
+##############################################################
+#
+# BEGIN Project Options
+SET addpads = false
+SET asysymbol = false
+SET busformat = BusFormatAngleBracketNotRipped
+SET createndf = false
+SET designentry = Verilog
+SET device = xc3s2000
+SET devicefamily = spartan3
+SET flowvendor = Other
+SET formalverification = false
+SET foundationsym = false
+SET implementationfiletype = Ngc
+SET package = fg456
+SET removerpms = false
+SET simulationfiles = Behavioral
+SET speedgrade = -5
+SET verilogsim = true
+SET vhdlsim = false
+# END Project Options
+# BEGIN Select
+SELECT Fifo_Generator family Xilinx,_Inc. 6.1
+# END Select
+# BEGIN Parameters
+CSET almost_empty_flag=false
+CSET almost_full_flag=true
+CSET component_name=fifo_xlnx_512x36_2clk_18to36
+CSET data_count=false
+CSET data_count_width=10
+CSET disable_timing_violations=false
+CSET dout_reset_value=0
+CSET empty_threshold_assert_value=4
+CSET empty_threshold_negate_value=5
+CSET enable_ecc=false
+CSET enable_int_clk=false
+CSET enable_reset_synchronization=true
+CSET fifo_implementation=Independent_Clocks_Block_RAM
+CSET full_flags_reset_value=0
+CSET full_threshold_assert_value=1015
+CSET full_threshold_negate_value=1014
+CSET inject_dbit_error=false
+CSET inject_sbit_error=false
+CSET input_data_width=18
+CSET input_depth=1024
+CSET output_data_width=36
+CSET output_depth=512
+CSET overflow_flag=false
+CSET overflow_sense=Active_High
+CSET performance_options=First_Word_Fall_Through
+CSET programmable_empty_type=No_Programmable_Empty_Threshold
+CSET programmable_full_type=Single_Programmable_Full_Threshold_Constant
+CSET read_clock_frequency=1
+CSET read_data_count=false
+CSET read_data_count_width=9
+CSET reset_pin=true
+CSET reset_type=Asynchronous_Reset
+CSET underflow_flag=false
+CSET underflow_sense=Active_High
+CSET use_dout_reset=true
+CSET use_embedded_registers=false
+CSET use_extra_logic=false
+CSET valid_flag=false
+CSET valid_sense=Active_High
+CSET write_acknowledge_flag=false
+CSET write_acknowledge_sense=Active_High
+CSET write_clock_frequency=1
+CSET write_data_count=false
+CSET write_data_count_width=10
+# END Parameters
+GENERATE
+# CRC: 77234081
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.xise b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.xise
new file mode 100644
index 000000000..04acaf578
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36.xise
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
+
+ <header>
+ <!-- ISE source project file created by Project Navigator. -->
+ <!-- -->
+ <!-- This file contains project source information including a list of -->
+ <!-- project source files, project and process properties. This file, -->
+ <!-- along with the project source files, is sufficient to open and -->
+ <!-- implement in ISE Project Navigator. -->
+ <!-- -->
+ <!-- Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved. -->
+ </header>
+
+ <version xil_pn:ise_version="12.1" xil_pn:schema_version="2"/>
+
+ <files>
+ <file xil_pn:name="fifo_xlnx_512x36_2clk_18to36.ngc" xil_pn:type="FILE_NGC">
+ <association xil_pn:name="BehavioralSimulation"/>
+ <association xil_pn:name="Implementation"/>
+ </file>
+ <file xil_pn:name="fifo_xlnx_512x36_2clk_18to36.v" xil_pn:type="FILE_VERILOG">
+ <association xil_pn:name="BehavioralSimulation"/>
+ <association xil_pn:name="Implementation"/>
+ <association xil_pn:name="PostMapSimulation"/>
+ <association xil_pn:name="PostRouteSimulation"/>
+ <association xil_pn:name="PostTranslateSimulation"/>
+ </file>
+ </files>
+
+ <properties>
+ <property xil_pn:name="Auto Implementation Top" xil_pn:value="false" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Device" xil_pn:value="xc3s2000" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Device Family" xil_pn:value="Spartan3" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Stop View" xil_pn:value="PreSynthesis" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Top" xil_pn:value="Module|fifo_xlnx_512x36_2clk_18to36" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Top File" xil_pn:value="fifo_xlnx_512x36_2clk_18to36.ngc" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Top Instance Path" xil_pn:value="/fifo_xlnx_512x36_2clk_18to36" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Package" xil_pn:value="fg456" xil_pn:valueState="default"/>
+ <property xil_pn:name="Preferred Language" xil_pn:value="Verilog" xil_pn:valueState="default"/>
+ <property xil_pn:name="Project Generator" xil_pn:value="CoreGen" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Property Specification in Project File" xil_pn:value="Store all values" xil_pn:valueState="default"/>
+ <property xil_pn:name="Simulator" xil_pn:value="ISim (VHDL/Verilog)" xil_pn:valueState="default"/>
+ <property xil_pn:name="Speed Grade" xil_pn:value="-5" xil_pn:valueState="default"/>
+ <property xil_pn:name="Synthesis Tool" xil_pn:value="XST (VHDL/Verilog)" xil_pn:valueState="default"/>
+ <property xil_pn:name="Top-Level Source Type" xil_pn:value="HDL" xil_pn:valueState="default"/>
+ <property xil_pn:name="Working Directory" xil_pn:value="." xil_pn:valueState="non-default"/>
+ <!-- -->
+ <!-- The following properties are for internal use only. These should not be modified.-->
+ <!-- -->
+ <property xil_pn:name="PROP_DesignName" xil_pn:value="fifo_xlnx_512x36_2clk_18to36" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_DevFamilyPMName" xil_pn:value="spartan3" xil_pn:valueState="default"/>
+ <property xil_pn:name="PROP_intProjectCreationTimestamp" xil_pn:value="2010-08-18T10:27:37" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_intWbtProjectID" xil_pn:value="224FA43C81F32871F9E1930EA6CDD6AD" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_intWorkingDirLocWRTProjDir" xil_pn:value="Same" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_intWorkingDirUsed" xil_pn:value="No" xil_pn:valueState="non-default"/>
+ </properties>
+
+ <bindings/>
+
+ <libraries/>
+
+ <autoManagedFiles>
+ <!-- The following files are identified by `include statements in verilog -->
+ <!-- source files and are automatically managed by Project Navigator. -->
+ <!-- -->
+ <!-- Do not hand-edit this section, as it will be overwritten when the -->
+ <!-- project is analyzed based on files automatically identified as -->
+ <!-- include files. -->
+ </autoManagedFiles>
+
+</project>
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36_flist.txt b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36_flist.txt
new file mode 100644
index 000000000..2f8d522f6
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36_flist.txt
@@ -0,0 +1,12 @@
+# Output products list for <fifo_xlnx_512x36_2clk_18to36>
+_xmsgs/pn_parser.xmsgs
+fifo_generator_ug175.pdf
+fifo_xlnx_512x36_2clk_18to36.gise
+fifo_xlnx_512x36_2clk_18to36.ngc
+fifo_xlnx_512x36_2clk_18to36.v
+fifo_xlnx_512x36_2clk_18to36.veo
+fifo_xlnx_512x36_2clk_18to36.xco
+fifo_xlnx_512x36_2clk_18to36.xise
+fifo_xlnx_512x36_2clk_18to36_flist.txt
+fifo_xlnx_512x36_2clk_18to36_readme.txt
+fifo_xlnx_512x36_2clk_18to36_xmdf.tcl
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36_readme.txt b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36_readme.txt
new file mode 100644
index 000000000..03829e876
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36_readme.txt
@@ -0,0 +1,47 @@
+The following files were generated for 'fifo_xlnx_512x36_2clk_18to36' in directory
+/home/ianb/ettus/sram_fifo/fpgapriv/usrp2/coregen/
+
+fifo_generator_ug175.pdf:
+ Please see the core data sheet.
+
+fifo_xlnx_512x36_2clk_18to36.gise:
+ ISE Project Navigator support file. This is a generated file and should
+ not be edited directly.
+
+fifo_xlnx_512x36_2clk_18to36.ngc:
+ Binary Xilinx implementation netlist file containing the information
+ required to implement the module in a Xilinx (R) FPGA.
+
+fifo_xlnx_512x36_2clk_18to36.v:
+ Verilog wrapper file provided to support functional simulation.
+ This file contains simulation model customization data that is
+ passed to a parameterized simulation model for the core.
+
+fifo_xlnx_512x36_2clk_18to36.veo:
+ VEO template file containing code that can be used as a model for
+ instantiating a CORE Generator module in a Verilog design.
+
+fifo_xlnx_512x36_2clk_18to36.xco:
+ CORE Generator input file containing the parameters used to
+ regenerate a core.
+
+fifo_xlnx_512x36_2clk_18to36.xise:
+ ISE Project Navigator support file. This is a generated file and should
+ not be edited directly.
+
+fifo_xlnx_512x36_2clk_18to36_readme.txt:
+ Text file indicating the files generated and how they are used.
+
+fifo_xlnx_512x36_2clk_18to36_xmdf.tcl:
+ ISE Project Navigator interface file. ISE uses this file to determine
+ how the files output by CORE Generator for the core can be integrated
+ into your ISE project.
+
+fifo_xlnx_512x36_2clk_18to36_flist.txt:
+ Text file listing all of the output files produced when a customized
+ core was generated in the CORE Generator.
+
+
+Please see the Xilinx CORE Generator online help for further details on
+generated files and how to use them.
+
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36_xmdf.tcl b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36_xmdf.tcl
new file mode 100644
index 000000000..9b9b1f37a
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_18to36_xmdf.tcl
@@ -0,0 +1,68 @@
+# The package naming convention is <core_name>_xmdf
+package provide fifo_xlnx_512x36_2clk_18to36_xmdf 1.0
+
+# This includes some utilities that support common XMDF operations
+package require utilities_xmdf
+
+# Define a namespace for this package. The name of the name space
+# is <core_name>_xmdf
+namespace eval ::fifo_xlnx_512x36_2clk_18to36_xmdf {
+# Use this to define any statics
+}
+
+# Function called by client to rebuild the params and port arrays
+# Optional when the use context does not require the param or ports
+# arrays to be available.
+proc ::fifo_xlnx_512x36_2clk_18to36_xmdf::xmdfInit { instance } {
+# Variable containg name of library into which module is compiled
+# Recommendation: <module_name>
+# Required
+utilities_xmdf::xmdfSetData $instance Module Attributes Name fifo_xlnx_512x36_2clk_18to36
+}
+# ::fifo_xlnx_512x36_2clk_18to36_xmdf::xmdfInit
+
+# Function called by client to fill in all the xmdf* data variables
+# based on the current settings of the parameters
+proc ::fifo_xlnx_512x36_2clk_18to36_xmdf::xmdfApplyParams { instance } {
+
+set fcount 0
+# Array containing libraries that are assumed to exist
+# Examples include unisim and xilinxcorelib
+# Optional
+# In this example, we assume that the unisim library will
+# be magically
+# available to the simulation and synthesis tool
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type logical_library
+utilities_xmdf::xmdfSetData $instance FileSet $fcount logical_library unisim
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_generator_ug175.pdf
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type AnyView
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_18to36.ngc
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type ngc
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_18to36.v
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type verilog
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_18to36.veo
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type verilog_template
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_18to36.xco
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type coregen_ip
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_18to36_xmdf.tcl
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type AnyView
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount associated_module fifo_xlnx_512x36_2clk_18to36
+incr fcount
+
+}
+
+# ::gen_comp_name_xmdf::xmdfApplyParams
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.gise b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.gise
new file mode 100644
index 000000000..d0c862319
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.gise
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<generated_project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
+
+ <!-- -->
+
+ <!-- For tool use only. Do not edit. -->
+
+ <!-- -->
+
+ <!-- ProjectNavigator created generated project file. -->
+
+ <!-- For use in tracking generated file and other information -->
+
+ <!-- allowing preservation of process status. -->
+
+ <!-- -->
+
+ <!-- Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved. -->
+
+ <version xmlns="http://www.xilinx.com/XMLSchema">11.1</version>
+
+ <sourceproject xmlns="http://www.xilinx.com/XMLSchema" xil_pn:fileType="FILE_XISE" xil_pn:name="fifo_xlnx_512x36_2clk_36to18.xise"/>
+
+ <files xmlns="http://www.xilinx.com/XMLSchema">
+ <file xil_pn:fileType="FILE_VEO" xil_pn:name="fifo_xlnx_512x36_2clk_36to18.veo" xil_pn:origination="imported"/>
+ </files>
+
+ <transforms xmlns="http://www.xilinx.com/XMLSchema"/>
+
+</generated_project>
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.ncf b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.ncf
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.ncf
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.ngc b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.ngc
new file mode 100644
index 000000000..00814f02e
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.ngc
@@ -0,0 +1,3 @@
+XILINX-XDB 0.1 STUB 0.1 ASCII
+XILINX-XDM V1.6e
+$5a540<,[o}e~g`n;"2*726&;$:,)<6;.vnt*Ydo&lbjbQwloz\144;?U9oaeP37vl5=(iof;0<85?0123=>6789:;<=>;0:23456789:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?013856=6&9;87<>5IORVP?GCL[K757>11g924?OIX\^1|ah_dosp|Ys`{oxd1750?05?46=AGZ^X7~}of]fiur~W}byi~fParqfvq:>2949:6??:HLSQQ<wzfmTi`~{y^vkv`uoWgolmyk39;2=5f=683E^X][[:sf\`drfWje~by26:1<26>712@D[YY4KI@>21?699:1::7AZTQWW>AIF48?1<3?;;0:9KPRW]]0ocxz31683:4=5:28:86<<3232?7<NFY__6IG_A=394;753;0DYY^ZT;FLTD:6294:>6==:HLSQQ<CAK68=7>112906?IR\Y__6IAM<2394;753:<1EC^ZT;fjj952294o7>}=012ec131%<;0895;0GD25>2=AGZ^X7JFPC>0>586:2>1CXZ_UU8GKUD;;3:5=68=;7;7?3?>>=138??;;9G;E4=><23;<4<49768=30>9;126D@_UU8B@ATE410;2<j49;KMTPR=x{elSk{cl^vkv`uo410;2?:49;KMTPR=x{elSk{cl^vkv`uoWhyxiz38;2=61=>2@D[YY4rne\bpjkW}byi~fPndebp`:?294:4675OTVSQQ<ci}kTob{at=:94;7e300DYY^ZT;uq[agsiVidycz38;2=6>G502KOH_O30?:8EABUI5;546OKDSC?6;><IMNYM1=18:CG@WG;<720MIJ]A=7=<>GCL[K7:364AEFQE91902KOH_O38?c8EABUI531<364AEFQE9?902KOH_L30?:8EABUJ5;546OKDS@?6;><IMNYN1=18:CG@WD;<720MIJ]B=7=<>GCL[H7:364AEFQF919i2KOH_L38;2=<>GCL[H743=4AMN:?DU^FJUYIJ=4BT0;?GSTW@DMC<5L2:AF57=D@LI@SAGLEOQF[Q_WM;1HE95LLJC7?FJLJ:1H@_74CNONMQRBL8>0OB\J_FGMAWGSAFDTECH@7:AQADRBL81O>6JL2:FJ2>BNI5:5;6JFA=33:2=CAH6:=394DHC?57803MCJ0<=17:FJE973601OEL2>5;2=3>BNI5;>2;5KI@>2:3=CAH692;5KI@>0:3=CAH6?2;5KI@>6:3=CAH6=2;5KI@>4:3=CAH632;5KI@>::3=CAK6;2:5KIC>24;1<L@H7=<08;EKA8449?2NBN1?<>69GMG:6<7=0HDL314<4?AOE48<5;6JFB=34:2=CAK6:4394DH@?5<813MCI0<08;EKA8769?2NBN1<>>69GMG:5:7=0HDL322<4?AOE4;>5;6JFB=06:2=CAK69:394DH@?62803MCI0?617:FJF94>6?1OEO2=>69GMG:48730HDL33083:2=CAK68=384DH@?7;0<L@H78384DH@?1;0<L@H7:384DH@?3;0<L@H74384DH@?=;1<L@ZJ0=06;EKSE97=87=0HD^N<0<4?AOWJ5:5;6JFPC>2:2=CAYH7>374DHRA86<76>1OE]L33?48@JG;87=0HBO311<4?AIF48;5;6J@A=31:2=CGH6:?394DNC?518>3MEJ0<;50?58@JG;9<4=7IAN<0<5?AIF4;4=7IAN<2<5?AIF4=4=7IAN<4<5?AIF4?4=7IAN<6<5?AIF414=7IAN<8<4?AIFW[OL:6J@B=2=3>BHJ5;;2:5KOC>25;1<LFH7=?08;EMA8459?2NDN1?;>69GKG:6=7=0HBL317<4?AIE48=5;6J@B=3;:2=CGK6:5384DN@?5;1<LFH7>=08;EMA8779?2NDN1<=>69GKG:5;7=0HBL325<4?AIE4;?5;6J@B=05:2=CGK69;394DN@?6=803MEI0?716:FLF949?2NDN1=?>89GKG:493:5;6J@B=12:3=CGK682;5KOC>7:3=CGK6>2;5KOC>5:3=CGK6<2;5KOC>;:3=CGK622:5KOC]QAB1<LFZJ0=06;EMSE97=87=0HB^N<0<4?AIWJ5:5;6J@PC>2:2=CGYH7>374DNRA86<76>1OC]L33?18AKG43LDIn6KA_DA@[WCFLj1NBRKLC^UQMQC53O8?7K<I039E<0=AIEYN>6HK3:DGG1=ALJO87KJ_4:DGT@2<NMXN=6I<;FLG6>O7:2C:>6G=2:K0<>OIA]ZT<=64IOKWTZ6602CEEY^P03:8MKOSXV:846GAIUR\41><AGC_\R>:8:KMMQVX8?20ECG[P^24=>OIA]Y_MYK8;HLJPZ67?2CEEYQ?169JJLRX8;=0ECG[_114?LHN\V:?;6GAIU]312=NF@^T<;94IOKW[5103@DBXR>77:KMMQY71>1BBDZP0@58MKOSW9H<7D@FT^2@3>OIA]U;H:5FNHV\4@1<AGC_S=H8;HLJPZ77?2CEEYQ>169JJLRX9;=0ECG[_014?LHN\V;?;6GAIU]212=NF@^T=;94IOKW[4103@DBXR?77:KMMQY61>1BBDZP1@58MKOSW8H<7D@FT^3@3>OIA]U:H:5FNHV\5@1<AGC_S<H8;HLJPZ47?2CEEYQ=169JJLRX:;=0ECG[_314?LHN\V8?;6GAIU]112=NF@^T>;94IOKW[7103@DBXR<77:KMMQY51>1BBDZP2@58MKOSW;H<7D@FT^0@3>OIA]U9H:5FNHV\6@1<AGC_S?H8;HLJPZ57?2CEEYQ<169JJLRX;;=0ECG[_214?LHN\V9?;6GAIU]012=NF@^T?;94IOKW[6103@DBXR=77:KMMQY41>1BBDZP3@58MKOSW:H<7D@FT^1@3>OIA]U8H:5FNHV\7@1<AGC_S>H9;HLJPZG13@DBXRL=;MK1?II13EEJHHJ8;MMDMFGK<2F^X<:4LTV10>JR\:>0@XZ;6:NVP1YC=2GXKB@:;LW[G\e<Eh`d~[k}shmmg>Knffx]i}foo08J42<F8:2?6@>159M54633G;:=95A1007?K76;=1E=<:;;O3211=I98<?7C?>759M54>33G;:5>5A1368J447<2D:><:4N0010>H6::>0B<<;4:L2602<F88=86@>2618J4533G;8=>5A1518J4343G;=?6@>729M5=5<F8397C<<;O037>H59:1E>?=4N310?K43;2D99>5A2718J7143G83?6@=929M755<F:;87C==3:L076=I;=90B>;<;O157>H4?:1E?5=4N2;0?K27;2D?=>5A4318J1543G>??6@;529M035<F==87C:72:L66>H0:2D2j6@M_CWPTLHXX[E[_:5AEUULVN7<G;1DG<5_4:RBVQg<X@DTNX]FDY`8TLHXJ\YEM@K<;QPF5>W63[o0^LCM17]P5=YT;?k0^HOK_GKQWQe<ZLKOSZGKTI]Bg>TBIMU\EIZG_C38W45<[@GTOBBCIRKLJZEOMJA=7^AZRBG4?VTQIEUJ;6]]V@N\F1=T[[K?7^]]B59W]UC4:2_;#j|i.sd,cf~)keas#@v`r^pg[uhszVmhSua}0123[Wct}e~:??5Z0.eqb+ta'nis"nbdx.O{kwYulVzexQhc^zlv5679VXnxb{1208Q5)`zo$yj"ilx/aoo})JpfxT~iQnup\cfYg{:;<?Q]erwop4553\:$kh!rg-dg}(ddbr$Aua}_sf\tkruWniTtb|?011\V`urd};8>6[?/fpe*w`(ojr%oaew/LzlvZtcWyd~Ril_ymq4563W[oxyaz>339V4*aun'xm#jmw.bnh|*Kg{UyhR~ats]dgZ~hz9:;9R\jstnw564<]9%l~k }f.e`|+ekcq%Ftb|Pre]sjqtXojUsc>?07]Qavsk|8997X> gsd-vc)`kq$h`fv Mymq[wbXxg~ySjmPxnp3451XZly~`y?<2:W3+bta&{l$knv!cmi{+H~hzVxoS}`{r^e`[}iu89:3S_k|umv277=R8&myj#|i/fa{*fjlp&GscQxr^rmpwY`kVrd~=>?0^Pfwpjs9:80Y=!hrg,qb*adp'iggu!Bxnp\swYwf}xTknQwos2344YUmzgx<==;T2,cw`)zo%lou lljz,I}iuW~xT|cz}_fa\|jt7898T^h}zlu306>S7'nxm"h gbz-gim'Drd~Ry}_qlwvZadWqey<=><_Sgpqir6;;1^<"i}f/pe+be&jf`t"Cwos]tvZvi|{UloRv`r1230ZTb{|f=><4U1-dvc(un&mht#mcky-N|jtX{U{by|Pgb]{kw678<UYi~{ct011?P6(o{l%~k!hcy,`hn~(EqeySz|Ppovq[beXpfx;<=8PRdqvhq74:2_;#j|i.sd,cf~)keas#@v`r^uq[uhszVmhSua}0124[Wct}e~:><5Z0.eqb+ta'nis"nbdx.pg[uhszVhbb1?1209V4*aun'xm#jmw.bnh|*tcWyd~Rlfn=0=64=R8&myj#|i/fa{*fjlp&xoS}`{r^`jj959:81^<"i}f/pe+be&jf`t"|k_qlwvZdnf5>5><5Z0.eqb+ta'nis"nbdx.pg[uhszVhbb1;1209V4*aun'xm#jmw.bnh|*tcWyd~Rlfn=4=64=R8&myj#|i/fa{*fjlp&xoS}`{r^`jj919:81^<"i}f/pe+be&jf`t"|k_qlwvZdnf525><5Z0.eqb+ta'nis"nbdx.pg[uhszVhbb171219V4*aun'xm#jmw.bnh|*tcWyd~Rlfn^314>S7'nxm"h gbz-gim'{nT|cz}_ckm[7473\:$kh!rg-dg}(ddbr$~iQnup\flhX;;:0Y=!hrg,qb*adp'iggu!}d^rmpwYeagU?>=5Z0.eqb+ta'nis"nbdx.pg[uhszVhbbR;=0:W3+bta&{l$knv!cmi{+wbXxg~ySoga_703?P6(o{l%~k!hcy,`hn~(zmU{by|Pbhl\376<]9%l~k }f.e`|+ekcq%yhR~ats]amkY?:91^<"i}f/pe+be&jf`t"|k_qlwvZdnfV39:6[?/fpe*w`(ojr%oaew/sf\tkruWkceSua}012362=R8&myj#|i/fa{*fjlp&xoS}`{r^`jjZ~hz9:;<<<9;T2,cw`)zo%lou lljz,vaYwf}xTnd`Pxnp34575?2_;#j|i.sd,cf~)keas#jPpovq[goiWqey<=>>1348Q5)`zo$yj"ilx/aoo})ulVzexQmio]{kw678;8<7X> gsd-vc)`kq$h`fv re]sjqtXj`dTtb|?010263=R8&myj#|i/fa{*fjlp&xoS}`{r^`jjZ~hz9:;??94U1-dvc(un&mht#mcky-q`Zvi|{UiecQwos234645>2_;#j|i.sd,cf~)keas#jPpovq[goiWqey<=>;269V4*aun'xm#jmw.bnh|*tcWyd~Rlfn^zlv567<88=7X> gsd-vc)`kq$h`fv re]sjqtXj`dTtb|?01713>S7'nxm"h gbz-gim'{nT|cz}_ckm[}iu89:>=?84U1-dvc(un&mht#mcky-q`Zvi|{UiecQwos23434?3\:$kh!rg-dg}(ddbr$~iQnup\flhXpfx;<=8>1358Q5)`zo$yj"ilx/aoo})ulVzexQmio]{kw678?89n6[?/fpe*w`(ojr%oaew/sf\tkruWkceSua}0125[gbc8;<0Y=!hrg,qb*adp'iggu!}d^rmpwYeagUsc>?0604?P6(o{l%~k!hcy,`hn~(zmU{by|Pbhl\|jt789=:>=5Z0.eqb+ta'nis"nbdx.pg[uhszVmh0=0=0:W3+bta&{l$knv!cmi{+wbXxg~ySjm31?03?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb>1:76<]9%l~k }f.e`|+ekcq%yhR~ats]dg959:91^<"i}f/pe+be&jf`t"|k_qlwvZad4=49<6[?/fpe*w`(ojr%oaew/sf\tkruWni793<?;T2,cw`)zo%lou lljz,vaYwf}xTkn29>328Q5)`zo$yj"ilx/aoo})ulVzexQhc=5=65=R8&myj#|i/fa{*fjlp&xoS}`{r^e`8=8582_;#j|i.sd,cf~)keas#jPpovq[be;17;m7X> gsd-vc)`kq$h`fv re]sjqtXojU;=k5Z0.eqb+ta'nis"nbdx.pg[uhszVmhS<?i;T2,cw`)zo%lou lljz,vaYwf}xTknQ=1g9V4*aun'xm#jmw.bnh|*tcWyd~Ril_23e?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]75c=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[07a3\:$kh!rg-dg}(ddbr$~iQnup\cfY19o1^<"i}f/pe+be&jf`t"|k_qlwvZadW>;m7X> gsd-vc)`kq$h`fv re]sjqtXojU3=k5Z0.eqb+ta'nis"nbdx.pg[uhszVmhS4<9;T2,cw`)zo%lou lljz,vaYwf}xTknQnssgd8585>2_;#j|i.sd,cf~)keas#jPpovq[beXizxnk1?1279V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqab:56;<0Y=!hrg,qb*adp'iggu!}d^rmpwY`kVkx~hi33?05?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]bwwc`4=49:6[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg=7=63=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumn6=2?84U1-dvc(un&mht#mcky-q`Zvi|{UloRo|rde?3;413\:$kh!rg-dg}(ddbr$~iQnup\cfYf{{ol050=6:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfc9?9:<1^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQ?249V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabY6:<1^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQ=249V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabY4:<1^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQ;249V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabY2:<1^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQ9249V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabY0:<1^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQ7249V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabY>:01^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQk1=3=6<=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnUo=1<1289V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabYc9595>45Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]g5929:01^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQk1=7=6<=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnUo=181289V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabYc95=5>45Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]g59>9:01^<"i}f/pe+be&jf`t"|k_qlwvZadWhyyijQk1=;=6==R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnUo=R?=8:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfcZb6W;837X> gsd-vc)`kq$h`fv re]sjqtXojUjkh_e3\77><]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlmTh<Q;299V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabYc9V?946[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg^f2[34?3\:$kh!rg-dg}(ddbr$~iQnup\cfYf{{olSi?P73:8Q5)`zo$yj"ilx/aoo})ulVzexQhc^cpv`aXl8U3>55Z0.eqb+ta'nis"nbdx.pg[uhszVmhSl}}ef]g5Z?5=2_;#j|i.sd,cf~)keas#jPpovq[beXpfx;<=>=5:W3+bta&{l$knv!cmi{+wbXxg~ySjmPxnp34575=2_;#j|i.sd,cf~)keas#jPpovq[beXpfx;<=<=5:W3+bta&{l$knv!cmi{+wbXxg~ySjmPxnp34555=2_;#j|i.sd,cf~)keas#jPpovq[beXpfx;<=:=5:W3+bta&{l$knv!cmi{+wbXxg~ySjmPxnp34535=2_;#j|i.sd,cf~)keas#jPpovq[beXpfx;<=8=5:W3+bta&{l$knv!cmi{+wbXxg~ySjmPxnp34515=2_;#j|i.sd,cf~)keas#jPpovq[beXpfx;<=6=1:W3+bta&{l$knv!cmi{+rtXxg~ySoga<1<15>S7'nxm"h gbz-gim'~xT|cz}_ckm848592_;#j|i.sd,cf~)keas#z|Ppovq[goi4;49=6[?/fpe*w`(ojr%oaew/vp\tkruWkce0>0=1:W3+bta&{l$knv!cmi{+rtXxg~ySoga<5<15>S7'nxm"h gbz-gim'~xT|cz}_ckm808592_;#j|i.sd,cf~)keas#z|Ppovq[goi4?49=6[?/fpe*w`(ojr%oaew/vp\tkruWkce0:0=1:W3+bta&{l$knv!cmi{+rtXxg~ySoga<9<14>S7'nxm"h gbz-gim'~xT|cz}_ckm[5473\:$kh!rg-dg}(ddbr${Qnup\flhX9;:0Y=!hrg,qb*adp'iggu!xr^rmpwYeagU9>=5Z0.eqb+ta'nis"nbdx.uq[uhszVhbbR==0:W3+bta&{l$knv!cmi{+rtXxg~ySoga_503?P6(o{l%~k!hcy,`hn~({U{by|Pbhl\176<]9%l~k }f.e`|+ekcq%|~R~ats]amkY1:91^<"i}f/pe+be&jf`t"y}_qlwvZdnfV=9<6[?/fpe*w`(ojr%oaew/vp\tkruWkceS5<9;T2,cw`)zo%lou lljz,swYwf}xTnd`Pxnp34565?2_;#j|i.sd,cf~)keas#z|Ppovq[goiWqey<=>?1348Q5)`zo$yj"ilx/aoo})pzVzexQmio]{kw67888<7X> gsd-vc)`kq$h`fv ws]sjqtXj`dTtb|?013263=R8&myj#|i/fa{*fjlp&}yS}`{r^`jjZ~hz9:;>?94U1-dvc(un&mht#mcky-tvZvi|{UiecQwos234775>2_;#j|i.sd,cf~)keas#z|Ppovq[goiWqey<=><269V4*aun'xm#jmw.bnh|*quWyd~Rlfn^zlv567;;8=7X> gsd-vc)`kq$h`fv ws]sjqtXj`dTtb|?01613>S7'nxm"h gbz-gim'~xT|cz}_ckm[}iu89:?=?84U1-dvc(un&mht#mcky-tvZvi|{UiecQwos2340403\:$kh!rg-dg}(ddbr${Qnup\flhXpfx;<=;>279V4*aun'xm#jmw.bnh|*quWyd~Rlfn^zlv567>;20Y=!hrg,qb*adp'iggu!xr^rmpwYeagUsc>?073262=R8&myj#|i/fa{*fjlp&}yS}`{r^`jjZ~hz9:;:?<m;T2,cw`)zo%lou lljz,swYwf}xTnd`Pxnp3450Xjmn;>;5Z0.eqb+ta'nis"nbdx.uq[uhszVhbbRv`r123371<]9%l~k }f.e`|+ekcq%|~R~ats]amkYg{:;<:?=0:W3+bta&{l$knv!cmi{+rtXxg~ySjm30?03?P6(o{l%~k!hcy,`hn~({U{by|Pgb>2:76<]9%l~k }f.e`|+ekcq%|~R~ats]dg949:91^<"i}f/pe+be&jf`t"y}_qlwvZad4:49<6[?/fpe*w`(ojr%oaew/vp\tkruWni783<?;T2,cw`)zo%lou lljz,swYwf}xTkn2:>328Q5)`zo$yj"ilx/aoo})pzVzexQhc=4=65=R8&myj#|i/fa{*fjlp&}yS}`{r^e`828582_;#j|i.sd,cf~)keas#z|Ppovq[be;07;m7X> gsd-vc)`kq$h`fv ws]sjqtXojU;=k5Z0.eqb+ta'nis"nbdx.uq[uhszVmhS<?i;T2,cw`)zo%lou lljz,swYwf}xTknQ=1g9V4*aun'xm#jmw.bnh|*quWyd~Ril_23e?P6(o{l%~k!hcy,`hn~({U{by|Pgb]75c=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[07a3\:$kh!rg-dg}(ddbr${Qnup\cfY19o1^<"i}f/pe+be&jf`t"y}_qlwvZadW>;m7X> gsd-vc)`kq$h`fv ws]sjqtXojU3>;5Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef>3:70<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlm7=3<9;T2,cw`)zo%lou lljz,swYwf}xTknQnssgd8785>2_;#j|i.sd,cf~)keas#z|Ppovq[beXizxnk1=1279V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqab:36;<0Y=!hrg,qb*adp'iggu!xr^rmpwY`kVkx~hi35?05?P6(o{l%~k!hcy,`hn~({U{by|Pgb]bwwc`4?49:6[?/fpe*w`(ojr%oaew/vp\tkruWniTm~|jg=5=63=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumn632?;4U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\473<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmT=?;4U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\673<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmT??;4U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\073<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmT9?;4U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\273<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmT;?;4U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\<7?<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmTh<2?>3;8Q5)`zo$yj"ilx/aoo})pzVzexQhc^cpv`aXl86:2?74U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\`4:56;30Y=!hrg,qb*adp'iggu!xr^rmpwY`kVkx~hiPd0>0:7?<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmTh<2;>3;8Q5)`zo$yj"ilx/aoo})pzVzexQhc^cpv`aXl86>2?74U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\`4:16;30Y=!hrg,qb*adp'iggu!xr^rmpwY`kVkx~hiPd0>4:7?<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmTh<27>3:8Q5)`zo$yj"ilx/aoo})pzVzexQhc^cpv`aXl8U;>55Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]g5Z7502_;#j|i.sd,cf~)keas#z|Ppovq[beXizxnkRj>_30;?P6(o{l%~k!hcy,`hn~({U{by|Pgb]bwwc`Wm;T??64U1-dvc(un&mht#mcky-tvZvi|{UloRo|rde\`4Y3:11^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQk1^71<>S7'nxm"h gbz-gim'~xT|cz}_fa\evtboVn:S;<7;T2,cw`)zo%lou lljz,swYwf}xTknQnssgd[a7X?;20Y=!hrg,qb*adp'iggu!xr^rmpwY`kVkx~hiPd0];60=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[}iu89:;>85Z0.eqb+ta'nis"nbdx.uq[uhszVmhSua}012260=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[}iu89:9>85Z0.eqb+ta'nis"nbdx.uq[uhszVmhSua}012060=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[}iu89:?>85Z0.eqb+ta'nis"nbdx.uq[uhszVmhSua}012660=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[}iu89:=>85Z0.eqb+ta'nis"nbdx.uq[uhszVmhSua}012475=R8&myj#|i/fn3*wb(o{;%~kyit.Onq}YUIDUYHRKA_GUEP775n2_;#j|i.sd,ci6)zm%l~< }fvdw+HkrpVXJAR\JGNWW[@H69;n0Y=!hrg,qb*ak8'xo#j|>.sdtbq)d}{xTjzh{_rvbp`:76;n0Y=!hrg,qb*ak8'xo#j|>.sdtbq)d}{xTjzh{_rvbp`:66;i0Y=!hrg,qb*ak8'xo#j|>.sdtbq)d}{xTjzh{_rvbp`Y7:j1^<"i}f/pe+bj7&{n$k?!rguep*erz{Um{kzPsucwaZ74=2_;#j|i.sd,ci6)zm%l~< }fvdw+fsuzVl|jyQ|t`vf[hs89::0=0<6:W3+bta&{l$ka>!re-dv4(un~l#n{}r^dtbqYt|h~nS`{w01228586;<1^<"i}f/pe+bj7&{n$k?!rguep*erz{Um{kzPsucwaZkrp9:;=1?1379V4*aun'xm#jb?.sf,cw7)zo}mx"mzrs]escrX{}kiRczx12359799;20Y=!hrg,qb*ak8'xo#j|>.sdtbq)bey~rSkyit^da62=R8&myj#|i/fn3*wb(o{;%~kyit.gntqXn~lSd<i;T2,cw`)zo%l`= }d.eq5+tao~$i`~{y^dtbqYnWds<=>?319V4*aun'xm#jb?.sf,cw7)zo}mx"kbpu{\br`sW`Ufyu>?0131=>S7'nxm"h gm2-va)`zhy%~~z|/b2,gdtuqgo0=0=9:W3+bta&{l$ka>!re-dvdu)zz~x#n> c`pq}kcs484956[?/fpe*w`(oe:%~i!hr`q-vvrt'j:$ol|}yogw878512_;#j|i.sd,ci6)zm%l~l}!rrvp+f6(khxyuck{<2<1b>S7'nxm"h gm2-va)`zhy%~~z|/b2,chs&ngP<P hm0,n57`<]9%l~k }f.eo4+tc'nxj#||tr-`4*aj}q$laV?R.fop*hu5n2_;#j|i.sd,ci6)zm%l~l}!rrvp+f6(ods"jcT2\,div(j{;l0Y=!hrg,qb*ak8'xo#j|ns/pppv)d8&mfyu hmZ1^*bkt&dy9j6[?/fpe*w`(oe:%~i!hr`q-vvrt'j:$k`{w.foX0X(`ez$f?=4U1-dvc(un&mg<#|k/fpbw+tt|z%h<"x><1<17>S7'nxm"h gm2-va)`zhy%~~z|/b2,r4:66;90Y=!hrg,qb*ak8'xo#j|ns/pppv)d8&|:0?0=3:W3+bta&{l$ka>!re-dvdu)zz~x#n> v0>0:75<]9%l~k }f.eo4+tc'nxj#||tr-`4*p64=49n6[?/fpe*w`(oe:%~i!hr`q-vvrt'j:$z<Q?_`lg45679;h0Y=!hrg,qb*ak8'xo#j|ns/pppv)d8&|:S<Qnne234575j2_;#j|i.sd,ci6)zm%l~l}!rrvp+f6(~8U9Sl`k012357d<]9%l~k }f.eo4+tc'nxj#||tr-`4*p6W:Ujbi>?0131f>S7'nxm"h gm2-va)`zhy%~~z|/b2,r4Y3Whdo<=>?13;8Q5)`zo$yj"ic0/pg+btf{'xxx~!l1.abvwim}6;2?74U1-dvc(un&mg<#|k/fpbw+tt|z%h="mnrs{maq:66;30Y=!hrg,qb*ak8'xo#j|ns/pppv)d9&ij~waeu>1:7?<]9%l~k }f.eo4+tc'nxj#||tr-`5*efz{seiy2<>3d8Q5)`zo$yj"ic0/pg+btf{'xxx~!l1.enq}(`eR:V"jc>.l31b>S7'nxm"h gm2-va)`zhy%~~z|/b3,chs&ngP=P hmr,nw7`<]9%l~k }f.eo4+tc'nxj#||tr-`5*aj}q$laV<R.fop*hu5n2_;#j|i.sd,ci6)zm%l~l}!rrvp+f7(ods"jcT3\,div(j{;l0Y=!hrg,qb*ak8'xo#j|ns/pppv)d9&mfyu hmZ6^*bkt&dy9?6[?/fpe*w`(oe:%~i!hr`q-vvrt'j;$z<2?>318Q5)`zo$yj"ic0/pg+btf{'xxx~!l1.t28485;2_;#j|i.sd,ci6)zm%l~l}!rrvp+f7(~8692?=4U1-dvc(un&mg<#|k/fpbw+tt|z%h="x><2<17>S7'nxm"h gm2-va)`zhy%~~z|/b3,r4:36;h0Y=!hrg,qb*ak8'xo#j|ns/pppv)d9&|:S=Qnne234575j2_;#j|i.sd,ci6)zm%l~l}!rrvp+f7(~8U:Sl`k012357d<]9%l~k }f.eo4+tc'nxj#||tr-`5*p6W;Ujbi>?0131f>S7'nxm"h gm2-va)`zhy%~~z|/b3,r4Y4Whdo<=>?13`8Q5)`zo$yj"ic0/pg+btf{'xxx~!l1.t2[1Yffm:;<=?=0:W3+bta&{l$ka>!re-dvdu)zz~x#nabp103?P6(o{l%~k!hl1,q`*auiz$yy} cnos57?<]9%l~k }f.eo4+tc'nxj#||tr-qehYbey~rSklPi228Q5)`zo$yj"ic0/pg+btf{'xxx~!}al]fiur~WohTeRa}012374=R8&myj#|i/fn3*wb(o{kx"}{s.pbiZcjx}sTjoQf_np34566::1^<"i}f/pe+bj7&{n$~}`{r.O`kphsWje~by<;;T2,cw`)zo%l`= }d.psjqt(Eje~byQlotlw572<]9%l~k }f.eo4+tc'{zex!BcnwmpZeh}g~9>95Z0.eqb+ta'nf;"j rqlwv*Kdg|dSnaznu110>S7'nxm"h gm2-va)uxg~y#@m`uov\gjsi|=8?7X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{5368Q5)`zo$yj"ic0/pg+wvi|{%Fob{at^alqkr1:=1^<"i}f/pe+bj7&{n$~}`{r.O`kphsWje~by9=4:W3+bta&{l$ka>!re-qtkru'DidyczPcnwmp=433\:$kh!rg-dh5(ul&x{by| MbmvjqYdg|d5?74U1-dvc(un&mg<#|k/srmpw)JkfexRm`uov\g|:76;i0Y=!hrg,qb*ak8'xo#~ats-Ngjsi|VidyczPcx>3:Zts:01^<"i}f/pe+bj7&{n$~}`{r.O`kphsWje~byQly=3=6f=R8&myj#|i/fn3*wb(zyd~"Clotlw[firf}Uhu1?1_sv1=>S7'nxm"h gm2-va)uxg~y#@m`uov\gjsi|Vir0?0=c:W3+bta&{l$ka>!re-qtkru'DidyczPcnwmpZe~4;4T~y<6;T2,cw`)zo%l`= }d.psjqt(Eje~byQlotlw[f;;78h7X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{_b{?7;Yu|;30Y=!hrg,qb*ak8'xo#~ats-Ngjsi|VidyczPcx>7:7e<]9%l~k }f.eo4+tc'{zex!BcnwmpZeh}g~Tot2;>^pw6<=R8&myj#|i/fn3*wb(zyd~"Clotlw[firf}Uhu1;12b9V4*aun'xm#jb?.sf,vuhsz&Ghcx`{_bmvjqYdq5?5Sz=9:W3+bta&{l$ka>!re-qtkru'DidyczPcnwmpZe~4?49o6[?/fpe*w`(oe:%~i!}povq+Heh}g~Tob{at^az838Xz}827X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{_b{?3;4d3\:$kh!rg-dh5(ul&x{by| MbmvjqYdg|dSnw37?]qp7?<]9%l~k }f.eo4+tc'{zex!BcnwmpZeh}g~Tot27>3a8Q5)`zo$yj"ic0/pg+wvi|{%Fob{at^alqkrXkp632R|{2`9V4*aun'xm#jb?.sf,vuhsz&Ghcx`{_bmvjqYg{6;2?o4U1-dvc(un&mg<#|k/srmpw)JkfexRm`uov\|jt;978j7X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{_ymq8785i2_;#j|i.sd,ci6)zm%y|cz}/LalqkrXkfexRv`r=1=6d=R8&myj#|i/fn3*wb(zyd~"Clotlw[firf}Usc2;>3c8Q5)`zo$yj"ic0/pg+wvi|{%Fob{at^alqkrXpfx793<n;T2,cw`)zo%l`= }d.psjqt(Eje~byQlotlw[}iu4?49m6[?/fpe*w`(oe:%~i!}povq+Heh}g~Tob{at^zlv919:h1^<"i}f/pe+bj7&{n$~}`{r.O`kphsWje~byQwos>;:7g<]9%l~k }f.eo4+tc'{zex!BcnwmpZeh}g~Ttb|39?0g?P6(o{l%~k!hl1,q`*twf}x$Anaznu]`kphsWqey040Pru3e?P6(o{l%~k!hl1,q`*twf}x$ob{at=2=5c=R8&myj#|i/fn3*wb(zyd~"m`uov?5;7a3\:$kh!rg-dh5(ul&x{by| cnwmp9499o1^<"i}f/pe+bj7&{n$~}`{r.alqkr;;7;m7X> gsd-vc)`d9$yh"|nup,gjsi|5>5=k5Z0.eqb+ta'nf;"j rqlwv*eh}g~793?i;T2,cw`)zo%l`= }d.psjqt(kfex1811g9V4*aun'xm#jb?.sf,vuhsz&idycz37?3e?P6(o{l%~k!hl1,q`*twf}x$ob{at=:=5c=R8&myj#|i/fn3*wb(zyd~"m`uov?=;7b3\:$kh!rg-dh5(ul&x{by| cnwmpZ66m2_;#j|i.sd,ci6)zm%y|cz}/bmvjqY69l1^<"i}f/pe+bj7&{n$~}`{r.alqkrX:8o0Y=!hrg,qb*ak8'xo#~ats-`kphsW:;n7X> gsd-vc)`d9$yh"|nup,gjsi|V>:i6[?/fpe*w`(oe:%~i!}povq+firf}U>=h5Z0.eqb+ta'nf;"j rqlwv*eh}g~T:<k4U1-dvc(un&mg<#|k/srmpw)dg|dS:?j;T2,cw`)zo%l`= }d.psjqt(kfexR6>e:W3+bta&{l$ka>!re-qtkru'je~byQ6239V4*aun'xm#jb?.sf,vuhsz&idyczPd0>3:74<]9%l~k }f.eo4+tc'{zex!lotlw[a7;97897X> gsd-vc)`d9$yh"|nup,gjsi|Vn:0?0=2:W3+bta&{l$ka>!re-qtkru'je~byQk1=1=67=R8&myj#|i/fn3*wb(zyd~"m`uov\`4:36;80Y=!hrg,qb*ak8'xo#~ats-`kphsWm;793<=;T2,cw`)zo%l`= }d.psjqt(kfexRj><7<16>S7'nxm"h gm2-va)uxg~y#naznu]g5919:;1^<"i}f/pe+bj7&{n$~}`{r.alqkrXl8632?<4U1-dvc(un&mg<#|k/srmpw)dg|dSi?39?02?P6(o{l%~k!hl1,q`*twf}x$ob{at^f2[5463\:$kh!rg-dh5(ul&x{by| cnwmpZb6W88:7X> gsd-vc)`d9$yh"|nup,gjsi|Vn:S?<>;T2,cw`)zo%l`= }d.psjqt(kfexRj>_202?P6(o{l%~k!hl1,q`*twf}x$ob{at^f2[1463\:$kh!rg-dh5(ul&x{by| cnwmpZb6W<8:7X> gsd-vc)`d9$yh"|nup,gjsi|Vn:S;<>;T2,cw`)zo%l`= }d.psjqt(kfexRj>_602?P6(o{l%~k!hl1,q`*twf}x$ob{at^f2[=463\:$kh!rg-dh5(ul&x{by| cnwmpZb6W08?7X> gsd-vc)`d9$yh"|nup,gjsi|Vddx=>?13;8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l1.abvwim}6;2?74U1-dvc(un&mg<#y}/fubw+qt|z%h="mnrs{maq:66;30Y=!hrg,qb*ak8'}y#jyns/uppv)d9&ij~waeu>1:7?<]9%l~k }f.eo4+qu'n}j#y|tr-`5*efz{seiy2<>3d8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l1.enq}(`eR:V"jc>.l31b>S7'nxm"h gm2-sw)`hy%{~z|/b3,chs&ngP=P hmr,nw7`<]9%l~k }f.eo4+qu'n}j#y|tr-`5*aj}q$laV<R.fop*hu5n2_;#j|i.sd,ci6){%l{l}!wrvp+f7(ods"jcT3\,div(j{;l0Y=!hrg,qb*ak8'}y#jyns/uppv)d9&mfyu hmZ6^*bkt&dy9?6[?/fpe*w`(oe:%{!hw`q-svrt'j;$z<2?>318Q5)`zo$yj"ic0/uq+bqf{'}xx~!l1.t28485;2_;#j|i.sd,ci6){%l{l}!wrvp+f7(~8692?=4U1-dvc(un&mg<#y}/fubw+qt|z%h="x><2<17>S7'nxm"h gm2-sw)`hy%{~z|/b3,r4:36;h0Y=!hrg,qb*ak8'}y#jyns/uppv)d9&|:S=Qnne234575j2_;#j|i.sd,ci6){%l{l}!wrvp+f7(~8U:Sl`k012357d<]9%l~k }f.eo4+qu'n}j#y|tr-`5*p6W;Ujbi>?0131f>S7'nxm"h gm2-sw)`hy%{~z|/b3,r4Y4Whdo<=>?13`8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l1.t2[1Yig}:;<=?=9:W3+bta&{l$ka>!ws-dsdu)z~x#n< c`pq}kcs494956[?/fpe*w`(oe:%{!hw`q-svrt'j8$ol|}yogw848512_;#j|i.sd,ci6){%l{l}!wrvp+f4(khxyuck{<3<1=>S7'nxm"h gm2-sw)`hy%{~z|/b0,gdtuqgo0>0=f:W3+bta&{l$ka>!ws-dsdu)z~x#n< glw{*bk\8T$la< b13d8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l2.enq}(`eR;V"jc|.lq1b>S7'nxm"h gm2-sw)`hy%{~z|/b0,chs&ngP>P hmr,nw7`<]9%l~k }f.eo4+qu'n}j#y|tr-`6*aj}q$laV=R.fop*hu5n2_;#j|i.sd,ci6){%l{l}!wrvp+f4(ods"jcT4\,div(j{;90Y=!hrg,qb*ak8'}y#jyns/uppv)d:&|:0=0=3:W3+bta&{l$ka>!ws-dsdu)z~x#n< v0>2:75<]9%l~k }f.eo4+qu'n}j#y|tr-`6*p64;49?6[?/fpe*w`(oe:%{!hw`q-svrt'j8$z<2<>318Q5)`zo$yj"ic0/uq+bqf{'}xx~!l2.t28185j2_;#j|i.sd,ci6){%l{l}!wrvp+f4(~8U;Sl`k012357d<]9%l~k }f.eo4+qu'n}j#y|tr-`6*p6W8Ujbi>?0131f>S7'nxm"h gm2-sw)`hy%{~z|/b0,r4Y5Whdo<=>?13`8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l2.t2[6Yffm:;<=?=b:W3+bta&{l$ka>!ws-dsdu)z~x#n< v0]7[kis89:;=?>4U1-dvc(un&mg<#y}/fubw+qt|z%hc`~>219V4*aun'xm#jb?.vp,crgt&~y"m`mq01<>S7'nxm"h gm2-sw)`hy%{~z|/scn[cskdVliSd<:;T2,cw`)zo%l`= xr.etev(p{}y$~lcPftno[l4c3\:$kh!rg-dh5(pz&m|m~ xsuq,vdkXn|fgSdQbuy23454b3\:$kh!rg-dh5(pz&m|m~ xsuq,vdkXn|fgSdQbuy234576l2_;#j|i.sd,ci6){%ym`Qxr^gm[l75;2_;#j|i.sd,ci6){%||cz}/LalqkrXkfex?:4U1-dvc(un&mg<#y}/vrmpw)JkfexRm`uov261=R8&myj#|i/fn3*rt(yd~"Clotlw[firf}8986[?/fpe*w`(oe:%{!xpovq+Heh}g~Tob{at207?P6(o{l%~k!hl1,tv*qwf}x$Anaznu]`kphs<;>0Y=!hrg,qb*ak8'}y#z~ats-Ngjsi|Vidycz:259V4*aun'xm#jb?.vp,suhsz&Ghcx`{_bmvjq05<2_;#j|i.sd,ci6){%||cz}/LalqkrXkfex:<;;T2,cw`)zo%l`= xr.usjqt(Eje~byQlotlw<7?<]9%l~k }f.eo4+qu'~zex!BcnwmpZeh}g~Tot2?>3a8Q5)`zo$yj"ic0/uq+rvi|{%Fob{at^alqkrXkp6;2R|{289V4*aun'xm#jb?.vp,suhsz&Ghcx`{_bmvjqYdq5;5>n5Z0.eqb+ta'nf;"z| wqlwv*Kdg|dSnaznu]`}979W{~956[?/fpe*w`(oe:%{!xpovq+Heh}g~Tob{at^az8785k2_;#j|i.sd,ci6){%||cz}/LalqkrXkfexRmv<3<\vq4>3\:$kh!rg-dh5(pz&}{by| MbmvjqYdg|dSnw33?0`?P6(o{l%~k!hl1,tv*qwf}x$Anaznu]`kphsWjs7?3Q}t3;8Q5)`zo$yj"ic0/uq+rvi|{%Fob{at^alqkrXkp6?2?m4U1-dvc(un&mg<#y}/vrmpw)JkfexRm`uov\g|:36Vx>45Z0.eqb+ta'nf;"z| wqlwv*Kdg|dSnaznu]`}939:j1^<"i}f/pe+bj7&~x${}`{r.O`kphsWje~byQly=7=[wr512_;#j|i.sd,ci6){%||cz}/LalqkrXkfexRmv<7<1g>S7'nxm"h gm2-sw)pxg~y#@m`uov\gjsi|Vir0;0Pru0:?P6(o{l%~k!hl1,tv*qwf}x$Anaznu]`kphsWjs7;3<l;T2,cw`)zo%l`= xr.usjqt(Eje~byQlotlw[f;?7Uyx?o4U1-dvc(un&mg<#y}/vrmpw)JkfexRm`uov\|jt;878j7X> gsd-vc)`d9$|~"ynup,Ifirf}Uhcx`{_ymq8485i2_;#j|i.sd,ci6){%||cz}/LalqkrXkfexRv`r=0=6d=R8&myj#|i/fn3*rt(yd~"Clotlw[firf}Usc2<>3c8Q5)`zo$yj"ic0/uq+rvi|{%Fob{at^alqkrXpfx783<n;T2,cw`)zo%l`= xr.usjqt(Eje~byQlotlw[}iu4<49m6[?/fpe*w`(oe:%{!xpovq+Heh}g~Tob{at^zlv909:h1^<"i}f/pe+bj7&~x${}`{r.O`kphsWje~byQwos>4:7g<]9%l~k }f.eo4+qu'~zex!BcnwmpZeh}g~Ttb|38?0g?P6(o{l%~k!hl1,tv*qwf}x$Anaznu]`kphsWqey050Pru3e?P6(o{l%~k!hl1,tv*qwf}x$ob{at=2=5c=R8&myj#|i/fn3*rt(yd~"m`uov?5;7a3\:$kh!rg-dh5(pz&}{by| cnwmp9499o1^<"i}f/pe+bj7&~x${}`{r.alqkr;;7;m7X> gsd-vc)`d9$|~"ynup,gjsi|5>5=k5Z0.eqb+ta'nf;"z| wqlwv*eh}g~793?i;T2,cw`)zo%l`= xr.usjqt(kfex1811g9V4*aun'xm#jb?.vp,suhsz&idycz37?3e?P6(o{l%~k!hl1,tv*qwf}x$ob{at=:=5`=R8&myj#|i/fn3*rt(yd~"m`uov\44c<]9%l~k }f.eo4+qu'~zex!lotlw[47b3\:$kh!rg-dh5(pz&}{by| cnwmpZ46m2_;#j|i.sd,ci6){%||cz}/bmvjqY49l1^<"i}f/pe+bj7&~x${}`{r.alqkrX<8o0Y=!hrg,qb*ak8'}y#z~ats-`kphsW<;n7X> gsd-vc)`d9$|~"ynup,gjsi|V<:i6[?/fpe*w`(oe:%{!xpovq+firf}U<=h5Z0.eqb+ta'nf;"z| wqlwv*eh}g~T4?<4U1-dvc(un&mg<#y}/vrmpw)dg|dSi?30?01?P6(o{l%~k!hl1,tv*qwf}x$ob{at^f28485:2_;#j|i.sd,ci6){%||cz}/bmvjqYc9585>?5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th<2<>308Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e3?0;453\:$kh!rg-dh5(pz&}{by| cnwmpZb64<49>6[?/fpe*w`(oe:%{!xpovq+firf}Uo=181239V4*aun'xm#jb?.vp,suhsz&idyczPd0>4:74<]9%l~k }f.eo4+qu'~zex!lotlw[a7;078:7X> gsd-vc)`d9$|~"ynup,gjsi|Vn:S=<>;T2,cw`)zo%l`= xr.usjqt(kfexRj>_002?P6(o{l%~k!hl1,tv*qwf}x$ob{at^f2[7463\:$kh!rg-dh5(pz&}{by| cnwmpZb6W:8:7X> gsd-vc)`d9$|~"ynup,gjsi|Vn:S9<>;T2,cw`)zo%l`= xr.usjqt(kfexRj>_402?P6(o{l%~k!hl1,tv*qwf}x$ob{at^f2[3463\:$kh!rg-dh5(pz&}{by| cnwmpZb6W>8:7X> gsd-vc)`d9$|~"ynup,gjsi|Vn:S5<=;T2,cw`)zo%l`= xr.usjqt(kfexRj=<1<16>S7'nxm"h gm2-sw)pxg~y#naznu]g6979:;1^<"i}f/pe+bj7&~x${}`{r.alqkrXl;692?<4U1-dvc(un&mg<#y}/vrmpw)dg|dSi<33?01?P6(o{l%~k!hl1,tv*qwf}x$ob{at^f18185:2_;#j|i.sd,ci6){%||cz}/bmvjqYc:5?5>?5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th?29>308Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e0?3;453\:$kh!rg-dh5(pz&}{by| cnwmpZb54149=6[?/fpe*w`(oe:%{!xpovq+firf}Uo>R>=1:W3+bta&{l$ka>!ws-ttkru'je~byQk2^315>S7'nxm"h gm2-sw)pxg~y#naznu]g6Z4592_;#j|i.sd,ci6){%||cz}/bmvjqYc:V99=6[?/fpe*w`(oe:%{!xpovq+firf}Uo>R:=1:W3+bta&{l$ka>!ws-ttkru'je~byQk2^715>S7'nxm"h gm2-sw)pxg~y#naznu]g6Z0592_;#j|i.sd,ci6){%||cz}/bmvjqYc:V=9=6[?/fpe*w`(oe:%{!xpovq+firf}Uo>R6=4:W3+bta&{l$ka>!ws-ttkru'je~byQaou2344703\:$kh!rg-nah)cg|~Te1>1199V4*aun'xm#`kb/emvpZo;994:46[?/fpe*w`(elg$hb{{_h>25;7?3\:$kh!rg-nah)cg|~Te1?=>0:8Q5)`zo$yj"cjm.flqqYn4895=55Z0.eqb+ta'dof#iazt^k?518602_;#j|i.sd,i`k(lfSd2>5?3;?P6(o{l%~k!bel-gkprXa5;=2<64U1-dvc(un&gna"j`uu]j84199>1^<"i}f/pe+hcj'me~xRg31?34?P6(o{l%~k!bel-gkprXa585=:5Z0.eqb+ta'dof#iazt^k?7;703\:$kh!rg-nah)cg|~Te1:1169V4*aun'xm#`kb/emvpZo;=7;<7X> gsd-vc)jmd%ocxzPi=4=52=R8&myj#|i/lgn+air|Vc7;3?8;T2,cw`)zo%fi`!kotv\m9>99>1^<"i}f/pe+hcj'me~xRg39?35?P6(o{l%~k!bel-gkprXaV:::6[?/fpe*w`(elg$hb{{_h]252=R8&myj#|i/lgn+air|VcT==?8;T2,cw`)zo%fi`!kotv\mZ769>1^<"i}f/pe+hcj'me~xRgP1334?P6(o{l%~k!bel-gkprXaV;8=:5Z0.eqb+ta'dof#iazt^k\51703\:$kh!rg-nah)cg|~TeR?:169V4*aun'xm#`kb/emvpZoX9?;<7X> gsd-vc)jmd%ocxzPi^3453=R8&myj#|i/lgn+air|VcT><84U1-dvc(un&gna"j`uu]j[6713\:$kh!rg-nah)cg|~TeR:>6:W3+bta&{l$ahc dnww[lY29?1^<"i}f/pe+hcj'me~xRgP6048Q5)`zo$yj"cjm.flqqYnW>;=7X> gsd-vc)jmd%ocxzPi^:22>S7'nxm"h mdo,`jssW`U2=45Z0.eqb+ta'dof#iazt^ofi9699h1^<"i}f/pe+hcj'me~xRcjm=33:4g<]9%l~k }f.ofi*bh}}Ufi`2>1?3b?P6(o{l%~k!bel-gkprXelg7=?0>a:W3+bta&{l$ahc dnww[hcj4895=l5Z0.eqb+ta'dof#iazt^ofi97368k0Y=!hrg,qb*kbe&ndyyQbel>21;7f3\:$kh!rg-nah)cg|~Tahc317<2e>S7'nxm"h mdo,`jssWdof0<91189V4*aun'xm#`kb/emvpZkbe5;5=45Z0.eqb+ta'dof#iazt^ofi949901^<"i}f/pe+hcj'me~xRcjm=1=5<=R8&myj#|i/lgn+air|Vgna1:1189V4*aun'xm#`kb/emvpZkbe5?5=45Z0.eqb+ta'dof#iazt^ofi909901^<"i}f/pe+hcj'me~xRcjm=5=5<=R8&myj#|i/lgn+air|Vgna161189V4*aun'xm#`kb/emvpZkbe535;95Z0.eqb+ta'dof#jlb.f`nc+aeenk%bjklc/`nc*dkcVgnaRijndpbpjt(~hfbh#m|ts-qehjhgyQ;Q#|nm/p,w6Yig`dbx#|nm.fsvdk)ly9=t<6!r`o2f>S7'nxm"h mdo,phvXzhgT~iQjn0a8Q5)`zo$yj"cjm.vntZtfeVxoSh`>169V4*aun'xm#ob_sgdkprXmg;o7X> gsd-vc)u{}hgg"|k_sqw[duumn8;7X> gsd-vc)u{}hgg"|k_sqw[duumnUo=?>4U1-dvc(un&xxxobd/sf\vvrXizxnkRj=1b9V4*aun'xm#}{bmi,vaYu{}Uhc`l>d:W3+bta&{l$~~zmlj-q`Ztt|Vidao?>e:W3+bta&{l$~~zmlj-q`Ztt|Vxnk1>11d9V4*aun'xm#}{bmi,vaYu{}Uyij2>>0g8Q5)`zo$yj"||tcnh+wbXzz~T~hi32?3g?P6(o{l%~k!}su`oo*tcW{ySkh_13g?P6(o{l%~k!}su`oo*tcW{ySkh_03g?P6(o{l%~k!}su`oo*tcW{ySkh_33g?P6(o{l%~k!}su`oo*quW{ySl}}ef03?P6(o{l%~k!}su`oo*quW{ySl}}ef]g576<]9%l~k }f.pppgjl'~xT~~zParpfcZb59j1^<"i}f/pe+wusjea${Q}su]`khd6l2_;#j|i.sd,vvredb%|~R||t^alig76m2_;#j|i.sd,vvredb%|~R||t^pfc9699l1^<"i}f/pe+wusjea${Q}su]qab:668n0Y=!hrg,qb*tt|kf`#z|Prrv\v`aX88n0Y=!hrg,qb*tt|kf`#z|Prrv\v`aX9h1^_H\PAMKBWf=R[LXTZD]FBMG0?SED12\BIZQ[YQG0?RCF;2]NNn5XRHVF[HICMVKh7Z\FTD]NKACXJm1\^DZJ_VKGPMYFl2]YEYKPWHFWLZD6l2RB@D@W-YFA$5(6(Z^^N->!1!CPGLO23QEYOT84XRVOMG1<PZ^TKCJ8;YQW[SEDj2RTOB\J_HLEK3=_lkUBhk5Wdi]SvlkQm{ybcc??;Yfn[Hgmg{\n~~g`n028\akXE`dd~[k}shmmg>gkefyShctx`8eikh{}Umyab9;cc`opvc3kkhgx~Pm`phaw5<keao7io{a^alqkr/8 n0hlzn_bmvjq.6!m1omyoPcnwmp-4.l2njxlQlotlw,6/c3mkmRm`uov+0,b<lh~jSnaznu*6-a=ci}kTob{at)4*`>bf|hUhcx`{(6+g?agsiVidycz'8(d8`drfWje~by27:1<4?adn|lxy:6jfn)2*2>bnf!;";6jfn)33-2=cag":=$94dhl+57/03mce$<=&7:fjj-73!>1oec&>5(58`lh/9?#<7iga(05*3>bnf!;3%:5kio*2=,0<l`d#>$94dhl+65/03mce$??&7:fjj-45!>1oec&=3(58`lh/:=#<7iga(37*3>bnf!8=%:5kio*13,1<l`d#>5'8;ekm,7?.>2nbb%=&7:fjj-57!>1oec&<1(58`lh/;;#<7iga(21*3>bnf!9?%:5kio*01,0<l`d#8$84dhl+1,0<l`d#:$84dhl+3,0<l`d#4$84dhl+=,0<l`d7<394dhl?55803mce0<?17:fjj9756>1oec2>3?58`lh;9=4<7iga<07=3>bnf5;=2:5kio>23;1<l`d7=508;ekm84?9>2nbb1?17:fjj9476>1oec2=1?58`lh;:;4<7iga<31=3>bnf58?2:5kio>11;1<l`d7>;08;ekm8719?2nbb1<7>69gmk:517<0hd`32?58`lh;;94<7iga<23=3>bnf5992:5kio>07;1<l`d7?906;ekm863=87=0hd`334<5?aoi4:4=7iga<5<5?aoi4<4=7iga<7<5?aoi4>4=7iga<9<5?aoi404<7iazt)2*3>bh}}":%55kotv+55/?3me~x%?>)99gkpr/9;#37iazt)30-==cg|~#=9'7;emvp-72!11ocxz'17+;?air|!;<%:5kotv+6,1<lf$>'8;emvp-2.?2ndyy&:)69gkpr/> =0hb{{(6+4?air|!2";6j`uu*:-2=cg|~7<364dnww846902ndyy2>1?:8`jss488546j`uu>27;><lf0<:18:flqq:6=720hb{{<04=e>bh}}6:;7>18:flqq:6?7=0hb{{<0<4?air|585;6j`uu>0:2=cg|~78394dnww80803me~x1817:flqq:06>1ocxz38?58`jss40437hjff3ld`0=bey~r>k5iigm\c`hbzh~d~Rx9_0.#\ljnfq*HC_K/Gdlfvdrhz);9"<?l;gkekZ~kfqU>=?v<6^0`hnY4>}e:4>o4fhdl[}jipV?:>u=9_3aooZ51|f;3 kgio^efj`tf|fxTz;Q>,OMMA)HHFL>;=6hffn]{hk~X=88s?;Q=cmi\73rh91&mekaPgdlfvdrhzV|=S<"tc^jbwZoi|Vigg0>#c^jbwZuu{}7; nQ}d^dqat;6$jUnbllce^pppZu~fj7: nQgar]q`Zbf|hUhcx`{=1.`[aoiW~coxe3<6-a\lduX{UomyoPcnwmp86+kVl~`aQil`ep[wusWkg1="l_hosh`kbf}keb`Ptxrf97*dW|ynShcmeeff`Ztbo4:'oRy}_gpfu87+kVxiRj`uu]qwq;6$jU~bik}fmmt[iip59&hSeo|_ntfvcjh4:'oR~}emmb`Zjf|ldhu0>#c^flqqYpam~c1<6#c^opcjhX~hf6=!mPre]gauro58:98!mPesplvZoiblieb`Ptxrf95*dWakxSx`kesdokr;7$jUcm~QnllmppZ`rde7; nQgar]qwq;6$jUomyoPcnwmpZqnl}b65!mPh`q\swYfkb7; nQzsd]fgf;7$jUhc`c`n^aokfm:8%iT{Qncj]okr;7$jUyhR~ats]tmaro58:'oR{|e^dtbqYci}kTob{at<2/gZnf{Vkgab}{_dosp|;7$jUyhRjnt`]`kphsW~coxe3>0-a\kscunee|Saax=1.`[rtXxg~ySzgkti?:(fYwzfmTi`~{y^vzt`;7$jU|~Rjnt`]`kphsW~coxe36,b]sv`jhimUyij}21-a\`jssW{yS{oc=1.`[mgtWmkmRm`uov>4)eXx{elSk{cl^vkv`uoWgolmykPv`n>15>+kV}ySikti?657*dWyxdkRkbpu{\pmtb{aUeijo{e^tbh83+kVzycjQjmqvz[qnumzbTm~}jru]uei;3$jUcm~Qyamkg95*dWyxdkRhzlm]wlwct`Vkxh|{_wco906>$jef|b`jnu]mehc:n`ldSubax^726}51W;iggR=9tn3;(fYqiecoSaax=1.`[utneVlbjbQ{yqg>144;?&hS}|`g^dvhiYsqyo6<!mPmdolv|Ysqyo6=!s<6:djbjYdgrT9<<w37]1gimX;?~d=5Qiigm\c`hbzh~d~Rx9_0]{wqY6<2l~`aj4iohfgqbea}oy~i5fnkg`pvdn|lxy;6gat^aoo==iojh~eaj7;ntfvcjhh1{~biPelrw}42<x{elShctx]wlwct`!:"=95rne\ahvsqV~c~h}g(0+20>vugnUna}zv_ujqavn/: ;?7}|`g^gntqX|axne&<)068twi`Wlg{xtQ{hsgpl-2.9=1{~biPelrw}Zrozlyc$8'>4:rqkbYbey~rSyf}erj+2,733yxdkRkbpu{\pmtb{a"<%<:4psmd[`kw|pUdk|h):*51=wzfmTi`~{y^vkv`uo 0#::6~}of]fiur~W}byi~f39;2=5g=wzfmTi`~{y^vkv`uoWhyxiz'0(3a?uthoVof|ywPtipfwmYf{zoyx%?&1c9svjaXmdzuRzgrdqk[dutm{~#>$?m;qplcZcjx}sTxe|jsi]bwvcu|!9"=o5rne\ahvsqV~c~h}g_`qpawr/< ;i7}|`g^gntqX|axneQnsrgqp-3.9k1{~biPelrw}ZrozlycSl}|esv+2,7e3yxdkRkbpu{\pmtb{aUj~k}t)5*5g=wzfmTi`~{y^vkv`uoWhyxiz'8(3a?uthoVof|ywPtipfwmYf{zoyx%7&1e9svjaXmdzuRzgrdqk[dutm{~757>11c9svjaXmdzuRzgrdqk[kc`i}o#<$?m;qplcZcjx}sTxe|jsi]mabgsm!;"=o5rne\ahvsqV~c~h}g_ogdeqc/: ;i7}|`g^gntqX|axneQaefcwa-5.9k1{~biPelrw}ZrozlycSckhaug+0,7e3yxdkRkbpu{\pmtb{aUeijo{e)7*5g=wzfmTi`~{y^vkv`uoWgolmyk'6(3a?uthoVof|ywPtipfwmYimnki%9&1c9svjaXmdzuRzgrdqk[kc`i}o#4$?m;qplcZcjx}sTxe|jsi]mabgsm!3"=i5rne\ahvsqV~c~h}g_ogdeqc;13:556~}of]eqij6;2zycjQiumn\pmtb{a";%<=4psmd[cskdV~c~h}g(0+27>vugnUmyabPtipfwm.5!890|ah_gwohZrozlyc$>'>3:rqkbYa}efTxe|jsi*7-45<x{elSk{cl^vkv`uo <#:?6~}of]eqijX|axne&9)018twi`Wog`Rzgrdqk,2/6;2zycjQiumn\pmtb{a"3%<;4psmd[cskdV~c~h}g<983:4g<x{elSk{cl^vkv`uoWhyxiz'0(3b?uthoVl~`aQ{hsgplZgt{lx$<'>a:rqkbYa}efTxe|jsi]bwvcu|!8"=l5rne\bpjkW}byi~fParqfvq.4!8k0|ah_gwohZrozlycSl}|esv+0,7f3yxdkRhzlm]wlwct`Vkxh|{(4+2e>vugnUmyabPtipfwmYf{zoyx%8&1`9svjaXn|fgSyf}erj\evubz}"<%<o4psmd[cskdV~c~h}g_`qpawr/0 ;h7}|`g^dvhiYs`{oxdRo|sdpw8=<768k0|ah_gwohZrozlycSckhaug+4,7f3yxdkRhzlm]wlwct`Vdnklzj(0+2e>vugnUmyabPtipfwmYimnki%<&1`9svjaXn|fgSyf}erj\j`af|l"8%<o4psmd[cskdV~c~h}g_ogdeqc/< ;j7}|`g^dvhiYs`{oxdR`jg`vf,0/6i2zycjQiumn\pmtb{aUeijo{e)4*5d=wzfmTjxbc_ujqavnXflmjxh&8)0c8twi`Wog`Rzgrdqk[kc`i}o#4$?l;qplcZ`rdeUdk|h^lfcdrb410;2;5}d^aoo46<zmUomyoPcnwmp-6.991yhRjnt`]`kphs 8#:<6|k_ecweZeh}g~#>$??;sf\`drfWje~by&<)028vaYci}kTob{at)6*55=ulVnjxlQlotlw,0/682xoSio{a^alqkr/> ;;7jPd`vb[firf}"<%<>4re]geqgXkfex%6&119q`Zbf|hUhcx`{(8+24>tcWmkmRm`uov?4;753{nThlzn_bmvjq:>294>7jPeo48vaYu{}90~~z8;r`jp`tu<2yyy:4tswf=>sillxm`by:;wcoma0<{Ujof84ws]`hn773~xThlzn_bmvjq.7!8:0{Qkauc\gjsi|!;"==5xr^fbpdYdg|d$?'>0:uq[agsiVidycz'3(33?rtXlh~jSnaznu*7-46<{UomyoPcnwmp-3.991|~Rjnt`]`kphs ?#:<6y}_ecweZeh}g~#;$??;vp\`drfWje~by&7)008swYci}kTob{at=:94;3<{Unb;5xr^pppxFGxh<>7MNw1;D90?7|[=l188;57;306g0dk398:ljtn2f6>4=i;m<1:6*<d280ga=z[=n188;57;306g0dk398:lj4S00b>107290:??l9cb8073gb3Z>o698?:18277d1kj08?;oi;e66<?6=93;p_9h544793?74:k<ho7=<6`f8rQ7?=3:1=7?517;xW1`=<<?1;7?<2c4`g?54>hn0(>m9:00a?S5c<38py<=<:09v562=82w/=:75199a00>=839o6>4<dzJ0g1=]<<09wk4>7;'5=g=<<20(>j=:574?l2e83:17d:l4;29?j22k3:17b::6;29?l2e13:17d:m2;29?j2413:1(<9m:56b?k70i3:07b:<8;29 41e2=>j7c?8a;38?j24?3:1(<9m:56b?k70i3807b:<6;29 41e2=>j7c?8a;18?j24=3:1(<9m:56b?k70i3>07b:<4;29 41e2=>j7c?8a;78?j24;3:1(<9m:56b?k70i3<07b:<2;29 41e2=>j7c?8a;58?j2393:1(<9m:56b?k70i3207b:;0;29 41e2=>j7c?8a;;8?j24n3:1(<9m:56b?k70i3k07b:<e;29 41e2=>j7c?8a;`8?j24l3:1(<9m:56b?k70i3i07b:<c;29 41e2=>j7c?8a;f8?j24j3:1(<9m:56b?k70i3o07b:<a;29 41e2=>j7c?8a;d8?j2493:1(<9m:56b?k70i3;;76a;3183>!70j3>?m6`>7`825>=n<9>1<7*>7c8762=i9>k1<65f41194?"6?k0?>:5a16c95>=n<981<7*>7c8762=i9>k1>65f41394?"6?k0?>:5a16c97>=n<9:1<7*>7c8762=i9>k1865f3gd94?"6?k0?>:5a16c91>=n;on1<7*>7c8762=i9>k1:65f3ga94?"6?k0?>:5a16c93>=n;oh1<7*>7c8762=i9>k1465f3gc94?"6?k0?>:5a16c9=>=n;o31<7*>7c8762=i9>k1m65f3g:94?"6?k0?>:5a16c9f>=n;o=1<7*>7c8762=i9>k1o65f3g494?"6?k0?>:5a16c9`>=n;o?1<7*>7c8762=i9>k1i65f3g694?"6?k0?>:5a16c9b>=n;o81<7*>7c8762=i9>k1==54i2d2>5<#9>h18?94n05b>47<3`9m<7>5$05a>1403g;<m7?=;:k0ac<72-;<n7:=7:l23d<6;21b?hk50;&23g<3:>1e=:o51598m6cc290/=:l54358j41f28?07d=jc;29 41e2=8<7c?8a;35?>o4mk0;6)?8b;613>h6?h0:;65f3dc94?"6?k0?>:5a16c95==<a:o26=4+16`9071<f8=j6<74;h63e?6=,8=i69<8;o34e?7f32c?<44?:%34f?25?2d:;l4>b:9j05>=83.:;o4;269m52g=9j10e9>8:18'52d=<;=0b<9n:0f8?l27>3:1(<9m:504?k70i3;n76g;0483>!70j3>9;6`>7`82b>=n;oo1<7*>7c8762=i9>k1>=54i2d0>5<#9>h18?94n05b>77<3`9n47>5$05a>1403g;<m7<=;:k0a2<72-;<n7:=7:l23d<5;21b8l=50;9a7f3=83;1<7>tH2a7?!7?i39h96a>7983>>{el10;6<4?:1yK7f2<,82j6i64oe594?=zj=>1<7o::00g>40>sA9h86T;5;35d<>2k09m7<8:3:96<<a28=1o7<m:3c96g<a2j0j6<952881<?402k026p*>8`871g=#<10?945+4d871d=#9>>1=:94i554>5<#9>h18:64n05b>5=<a===6=4+16`902><f8=j6<54i556>5<#9>h18:64n05b>7=<a==?6=4+16`902><f8=j6>54i550>5<#9>h18:64n05b>1=<a==96=4+16`902><f8=j6854i552>5<#9>h18:64n05b>3=<a==;6=4+16`902><f8=j6:54i54e>5<#9>h18:64n05b>==<a=<n6=4+16`902><f8=j6454i57f>5<<a=h:6=44i5`7>5<<g=h<6=44i54`>5<#9>h18;j4n05b>5=<a=<i6=4+16`903b<f8=j6<54i54b>5<#9>h18;j4n05b>7=<a=<26=4+16`903b<f8=j6>54i54;>5<#9>h18;j4n05b>1=<a=<<6=4+16`903b<f8=j6854i545>5<#9>h18;j4n05b>3=<a=<>6=4+16`903b<f8=j6:54i547>5<#9>h18;j4n05b>==<a=<86=4+16`903b<f8=j6454i5`3>5<<g=<:6=44i5:1>5<#9>h185=4n05b>5=<a=2:6=4+16`90=5<f8=j6<54i5:3>5<#9>h185=4n05b>7=<a==m6=4+16`90=5<f8=j6>54i55f>5<#9>h185=4n05b>1=<a==o6=4+16`90=5<f8=j6854i55`>5<#9>h185=4n05b>3=<a==i6=4+16`90=5<f8=j6:54i55b>5<#9>h185=4n05b>==<a==26=4+16`90=5<f8=j6454o2f;>5<<g:o?6=4+16`97`3<f8=j6=54o2g0>5<#9>h1?h;4n05b>4=<g:o96=4+16`97`3<f8=j6?54o2g2>5<#9>h1?h;4n05b>6=<g:o;6=4+16`97`3<f8=j6954o2fe>5<#9>h1?h;4n05b>0=<g:nn6=4+16`97`3<f8=j6;54o2fg>5<#9>h1?h;4n05b>2=<g:nh6=4+16`97`3<f8=j6554o5:7>5<<a=i?6=44i5:g>5<#9>h185k4n05b>5=<a=2h6=4+16`90=c<f8=j6<54i5:a>5<#9>h185k4n05b>7=<a=2j6=4+16`90=c<f8=j6>54i5::>5<#9>h185k4n05b>1=<a=236=4+16`90=c<f8=j6854i5:4>5<#9>h185k4n05b>3=<a=2=6=4+16`90=c<f8=j6:54i5:6>5<#9>h185k4n05b>==<g=?h6=44o575>5<<a=h26=44i2fb>5<<a=3<6=4+16`90<><f8=j6=54i5;5>5<#9>h18464n05b>4=<a=3>6=4+16`90<><f8=j6?54i5;7>5<#9>h18464n05b>6=<a=386=4+16`90<><f8=j6954i5;1>5<#9>h18464n05b>0=<a=3:6=4+16`90<><f8=j6;54i5;3>5<#9>h18464n05b>2=<a=2m6=4+16`90<><f8=j6554i5c2>5<#9>h18l<4n05b>5=<a=k;6=4+16`90d4<f8=j6<54i5;e>5<#9>h18l<4n05b>7=<a=3n6=4+16`90d4<f8=j6>54i5;g>5<#9>h18l<4n05b>1=<a=3h6=4+16`90d4<f8=j6854i5;a>5<#9>h18l<4n05b>3=<a=3j6=4+16`90d4<f8=j6:54i5;:>5<#9>h18l<4n05b>==<g:n<6=44i57e>5<<a:ni6=44i5a6>5<<g=h86=44o5`;>5<<a=h96=44o51:>5<#9>h189o4n05b>5=<g=936=4+16`901g<f8=j6<54o514>5<#9>h189o4n05b>7=<g=9=6=4+16`901g<f8=j6>54o516>5<#9>h189o4n05b>1=<g=9?6=4+16`901g<f8=j6854o510>5<#9>h189o4n05b>3=<g=996=4+16`901g<f8=j6:54o562>5<#9>h189o4n05b>==<g=>;6=4+16`901g<f8=j6454o51e>5<#9>h189o4n05b>d=<g=9n6=4+16`901g<f8=j6o54o51g>5<#9>h189o4n05b>f=<g=9h6=4+16`901g<f8=j6i54o51a>5<#9>h189o4n05b>`=<g=9j6=4+16`901g<f8=j6k54o512>5<#9>h189o4n05b>46<3f>8<7>5$05a>12f3g;<m7?>;:k741<72-;<n7:=7:l23d<732c?<>4?:%34f?25?2d:;l4>;:k747<72-;<n7:=7:l23d<532c?<<4?:%34f?25?2d:;l4<;:k745<72-;<n7:=7:l23d<332c8jk4?:%34f?25?2d:;l4:;:k0ba<72-;<n7:=7:l23d<132c8jn4?:%34f?25?2d:;l48;:k0bg<72-;<n7:=7:l23d<?32c8jl4?:%34f?25?2d:;l46;:k0b<<72-;<n7:=7:l23d<f32c8j54?:%34f?25?2d:;l4m;:k0b2<72-;<n7:=7:l23d<d32c8j;4?:%34f?25?2d:;l4k;:k0b0<72-;<n7:=7:l23d<b32c8j94?:%34f?25?2d:;l4i;:k0b7<72-;<n7:=7:l23d<6821b?k?50;&23g<3:>1e=:o51098m6`7290/=:l54358j41f28807d=jf;29 41e2=8<7c?8a;30?>o4ml0;6)?8b;613>h6?h0:865f3df94?"6?k0?>:5a16c950=<a:oh6=4+16`9071<f8=j6<84;h1ff?6=,8=i69<8;o34e?7032c8il4?:%34f?25?2d:;l4>8:9j7`?=83.:;o4;269m52g=9010e9>n:18'52d=<;=0b<9n:0c8?l2713:1(<9m:504?k70i3;i76g;0983>!70j3>9;6`>7`82g>=n<9=1<7*>7c8762=i9>k1=i54i525>5<#9>h18?94n05b>4c<3`>;97>5$05a>1403g;<m7?i;:k0b`<72-;<n7:=7:l23d<5821b?k=50;&23g<3:>1e=:o52098m6c?290/=:l54358j41f2;807d=j7;29 41e2=8<7c?8a;00?>o4l00;66a;ae83>!70j3>jj6`>7`83?>i3ij0;6)?8b;6bb>h6?h0:76a;ac83>!70j3>jj6`>7`81?>i3ih0;6)?8b;6bb>h6?h0876a;a883>!70j3>jj6`>7`87?>i3i10;6)?8b;6bb>h6?h0>76a;a683>!70j3>jj6`>7`85?>i3i?0;6)?8b;6bb>h6?h0<76a;a483>!70j3>jj6`>7`8;?>i3i=0;6)?8b;6bb>h6?h0276a;c383>!70j3>h?6`>7`83?>i3k80;6)?8b;6`7>h6?h0:76a;c183>!70j3>h?6`>7`81?>i3jo0;6)?8b;6`7>h6?h0876a;bd83>!70j3>h?6`>7`87?>i3jm0;6)?8b;6`7>h6?h0>76a;bb83>!70j3>h?6`>7`85?>i3jk0;6)?8b;6`7>h6?h0<76a;b`83>!70j3>h?6`>7`8;?>i3>;0;66g;5e83>>i4m?0;66g;a283>>i3j?0;66l<d183>4<729q/=5o5d99K7f`<@:i?7bj8:188yg5c93:1=7>50z&2<d<4k<1C?nh4H2a7?j7003:17pl=9c83>1<729q/=5o5d59K7f`<@:i?7)k::79j03<722c><7>5;h34g?6=3f;<h7>5;|`052<72=0;6=u+19c9`7=O;jl0D>m;;%g6>7=n<?0;66g;c;29?l372900c<9k:188yg56>3:187>50z&2<d<c:2B8ok5G3b68 `3=:2c?:7>5;h6`>5<<a<:1<75`16f94?=zj:h:6=4<:183!7?i3n:7E=lf:J0g1=O<:1/=>?54c78 `3=:2c?:7>5;h73>5<<g8=o6=44}c1ag?6=;3:1<v*>8`8g5>N4ko1C?n:4H518 4562=h>7)k::39j03<722c><7>5;n34`?6=3th8n=4?:283>5}#91k1h<5G3bd8L6e33A>87)?<1;6a1>"b=380e9850;9j15<722e:;i4?::a7gg=83?1<7>t$0:b>a3<@:im7E=l4:J77>"6;80?n85f4783>>o3?3:17d;?:188m41d2900c<9k:188yg5ej3:1?7>50z&2<d<c92B8ok5G3b68L15<,89:69l:;%g6>7=n<?0;66g:0;29?j70l3:17pl<ag83>0<729q/=5o5d49K7f`<@:i?7E:<;%305?2e=2c?:7>5;h64>5<<a<:1<75f16a94?=h9>n1<75rb2`:>5<3290;w)?7a;f7?M5dn2B8o95+e485?l212900e8>50;9j52e=831d=:j50;9~f6d?290?6=4?{%3;e?b33A9hj6F<c59'a0<13`>=6=44i4294?=n9>i1<75`16f94?=zj:h<6=4;:183!7?i3n?7E=lf:J0g1=#m<0=7d:9:188m06=831b=:m50;9l52b=831vn>m=:187>5<7s-;3m7j;;I1`b>N4k=1/i849;h65>5<<a<:1<75f16a94?=h9>n1<75rb2a2>5<3290;w)?7a;f7?M5dn2B8o95+e485?l212900e8>50;9j52e=831d=:j50;9~f4gc290?6=4?{%3;e?b53A9hj6F<c59'a0<53`>=6=44i5a94?=n=90;66a>7e83>>{e9hi1<7:50;2x 4>f2m80D>mi;I1`0>"b=380e9850;9j0f<722c><7>5;n34`?6=3th:mo4?:583>5}#91k1h?5G3bd8L6e33-o>6?5f4783>>o3k3:17d;?:188k41c2900qo?na;290?6=8r.:4l4k2:J0gc=O;j>0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb0c:>5<3290;w)?7a;f1?M5dn2B8o95+e481?l212900e9m50;9j15<722e:;i4?::a5d>=83>1<7>t$0:b>a4<@:im7E=l4:&f1?4<a=<1<75f4b83>>o283:17b?8d;29?xd6i>0;694?:1y'5=g=l;1C?nh4H2a7?!c22;1b8;4?::k7g?6=3`?;6=44o05g>5<<uk;j:7>54;294~"60h0o>6F<cg9K7f2<,l?1>6g;6;29?l2d2900e8>50;9l52b=831vn<o::187>5<7s-;3m7j=;I1`b>N4k=1/i84=;h65>5<<a=i1<75f5183>>i6?m0;66sm20694?2=83:p(<6n:e08L6ea3A9h86*j5;08m10=831b8n4?::k64?6=3f;<h7>5;|`156<72=0;6=u+19c9`7=O;jl0D>m;;%g6>7=n<?0;66g;c;29?l372900c<9k:188yg46:3:187>50z&2<d<c:2B8ok5G3b68 `3=:2c?:7>5;h6`>5<<a<:1<75`16f94?=zj;;:6=4;:183!7?i3n97E=lf:J0g1=#m<097d:9:188m1e=831b9=4?::m23a<722wi><>50;694?6|,82j6i<4H2ae?M5d<2.n97<4i5494?=n<j0;66g:0;29?j70l3:17pl=0g83>1<729q/=5o5d39K7f`<@:i?7)k::39j03<722c?o7>5;h73>5<<g8=o6=44}c03a?6=<3:1<v*>8`8g6>N4ko1C?n:4$d796>o3>3:17d:l:188m06=831d=:j50;9~f76c290?6=4?{%3;e?b53A9hj6F<c59'a0<53`>=6=44i5a94?=n=90;66a>7e83>>{e:9i1<7:50;2x 4>f2m80D>mi;I1`0>"b=380e9850;9j0f<722c><7>5;n34`?6=3th99n4?:583>5}#91k1h?5G3bd8L6e33-o>6?5f4783>>o3k3:17d;?:188k41c2900qo<:b;290?6=8r.:4l4k2:J0gc=O;j>0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb37b>5<3290;w)?7a;f1?M5dn2B8o95+e481?l212900e9m50;9j15<722e:;i4?::a60?=83>1<7>t$0:b>a4<@:im7E=l4:&f1?4<a=<1<75f4b83>>o283:17b?8d;29?xd5=10;694?:1y'5=g=l;1C?nh4H2a7?!c22;1b8;4?::k7g?6=3`?;6=44o05g>5<<uk8>;7>54;294~"60h0o>6F<cg9K7f2<,l?1>6g;6;29?l2d2900e8>50;9l52b=831vn?;9:187>5<7s-;3m7j=;I1`b>N4k=1/i84=;h65>5<<a=i1<75f5183>>i6?m0;66sm24794?2=83:p(<6n:e08L6ea3A9h86*j5;08m10=831b8n4?::k64?6=3f;<h7>5;|`111<72=0;6=u+19c9`7=O;jl0D>m;;%g6>7=n<?0;66g;c;29?l372900c<9k:188yg7a13:187>50z&2<d<c:2B8ok5G3b68 `3=:2c?:7>5;h6`>5<<a<:1<75`16f94?=zj8l36=4;:183!7?i3n97E=lf:J0g1=#m<097d:9:188m1e=831b9=4?::m23a<722wi=k950;694?6|,82j6i<4H2ae?M5d<2.n97<4i5494?=n<j0;66g:0;29?j70l3:17pl>f783>1<729q/=5o5d39K7f`<@:i?7)k::39j03<722c?o7>5;h73>5<<g8=o6=44}c3e1?6=<3:1<v*>8`8g6>N4ko1C?n:4$d796>o3>3:17d:l:188m06=831d=:j50;9~f4`3290?6=4?{%3;e?b53A9hj6F<c59'a0<53`>=6=44i5a94?=n=90;66a>7e83>>{e9o91<7:50;2x 4>f2m80D>mi;I1`0>"b=380e9850;9j0f<722c><7>5;n34`?6=3th:j?4?:583>5}#91k1h?5G3bd8L6e33-o>6?5f4783>>o3k3:17d;?:188k41c2900qo?i1;290?6=8r.:4l4k2:J0gc=O;j>0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb36b>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb36:>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb36;>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb364>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb365>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb366>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb367>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb360>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb361>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb0g4>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb0g5>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb0g6>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb0g7>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb0g0>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb0g1>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb0g2>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb0g3>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb0fe>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb0ff>5<3290;w)?7a;f1?M5dn2B8o95G429'567=<k?0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb0f0>5<3290;w)?7a;f1?M5dn2B8o95+e481?l212900e9m50;9j15<722e:;i4?::a5a4=83>1<7>t$0:b>a4<@:im7E=l4:&f1?4<a=<1<75f4b83>>o283:17b?8d;29?xd6l80;694?:1y'5=g=l;1C?nh4H2a7?!c22;1b8;4?::k7g?6=3`?;6=44o05g>5<<uk;o<7>54;294~"60h0o>6F<cg9K7f2<,l?1>6g;6;29?l2d2900e8>50;9l52b=831vn<mi:187>5<7s-;3m7j=;I1`b>N4k=1/i84=;h65>5<<a=i1<75f5183>>i6?m0;66sm1bg94?2=83:p(<6n:e08L6ea3A9h86*j5;08m10=831b8n4?::k64?6=3f;<h7>5;|`2ga<72=0;6=u+19c9`7=O;jl0D>m;;%g6>7=n<?0;66g;c;29?l372900c<9k:188yg7dk3:187>50z&2<d<c:2B8ok5G3b68 `3=:2c?:7>5;h6`>5<<a<:1<75`16f94?=zj8ii6=4;:183!7?i3n97E=lf:J0g1=#m<097d:9:188m1e=831b9=4?::m23a<722wi=no50;694?6|,82j6i<4H2ae?M5d<2.n97<4i5494?=n<j0;66g:0;29?j70l3:17pl=3983>1<729q/=5o5d39K7f`<@:i?7)k::39j03<722c?o7>5;h73>5<<g8=o6=44}c003?6=<3:1<v*>8`8g6>N4ko1C?n:4$d796>o3>3:17d:l:188m06=831d=:j50;9~f751290?6=4?{%3;e?b53A9hj6F<c59'a0<53`>=6=44i5a94?=n=90;66a>7e83>>{e::?1<7:50;2x 4>f2m80D>mi;I1`0>"b=380e9850;9j0f<722c><7>5;n34`?6=3th9?94?:583>5}#91k1h?5G3bd8L6e33-o>6?5f4783>>o3k3:17d;?:188k41c2900qo<<3;290?6=8r.:4l4k2:J0gc=O;j>0(h;52:k72?6=3`>h6=44i4294?=h9>n1<75rb311>5<3290;w)?7a;f1?M5dn2B8o95+e481?l212900e9m50;9j15<722e:;i4?::a667=83>1<7>t$0:b>a4<@:im7E=l4:&f1?4<a=<1<75f4b83>>o283:17b?8d;29?xd5;90;694?:1y'5=g=l;1C?nh4H2a7?!c22;1b8;4?::k7g?6=3`?;6=44o05g>5<<uk8o47>55;294~"60h0o?6F<cg9K7f2<,l?1>6g;6;29?l202900e9m50;9j15<722e:;i4?::a6a1=83?1<7>t$0:b>a5<@:im7E=l4:&f1?4<a=<1<75f4683>>o3k3:17d;?:188k41c2900qo<k5;291?6=8r.:4l4k3:J0gc=O;j>0(h;52:k72?6=3`><6=44i5a94?=n=90;66a>7e83>>{e:m>1<7;50;2x 4>f2m90D>mi;I1`0>"b=380e9850;9j02<722c?o7>5;h73>5<<g8=o6=44}c0g2?6==3:1<v*>8`8g7>N4ko1C?n:4$d796>o3>3:17d:8:188m1e=831b9=4?::m23a<722wi>i=50;794?6|,82j6i=4H2ae?M5d<2.n97<4i5494?=n<>0;66g;c;29?l372900c<9k:188yg4c:3:197>50z&2<d<c;2B8ok5G3b68 `3=:2c?:7>5;h64>5<<a=i1<75f5183>>i6?m0;66sm2e294?3=83:p(<6n:e18L6ea3A9h86*j5;08m10=831b8:4?::k7g?6=3`?;6=44o05g>5<<uk8hj7>55;294~"60h0o96F<cg9K7f2<,l?1:6g;6;29?l202900e8>50;9j52e=831d=:j50;9~f7b6290>6=4?{%3;e?b43A9hj6F<c59'a0<53`>=6=44i5594?=n<j0;66g:0;29?j70l3:17pl=c283>6<729q/=5o53bg8L6ea3A9h86g;9;29?l7503:17b?86;29?xd5k;0;6>4?:1y'5=g=;jo0D>mi;I1`0>o313:17d?=8;29?j70>3:17pl=b983>1<729q/=5o51208L6ea3A9h86g;9;29?l352900e<6<:188k4112900qo<l1;297?6=8r.:4l4<cd9K7f`<@:i?7d:6:188m44?2900c<99:188yg4e>3:187>50z&2<d<6;;1C?nh4H2a7?l2>2900e8<50;9j5=5=831d=:850;9~f7e729086=4?{%3;e?5dm2B8ok5G3b68m1?=831b=?650;9l520=831vn?l;:187>5<7s-;3m7?<2:J0gc=O;j>0e9750;9j17<722c:4>4?::m233<722wi>oh50;194?6|,82j6>mj;I1`b>N4k=1b844?::k26=<722e:;;4?::a6g4=83>1<7>t$0:b>4553A9hj6F<c59j0<<722c>>7>5;h3;7?6=3f;<:7>5;|`1f`<72:0;6=u+19c97fc<@:im7E=l4:k7=?6=3`;947>5;n342?6=3th9n=4?:583>5}#91k1=><4H2ae?M5d<2c?57>5;h71>5<<a8286=44o055>5<<uk8ih7>53;294~"60h08oh5G3bd8L6e33`>26=44i00;>5<<g8==6=44}c0ba?6=<3:1<v*>8`8277=O;jl0D>m;;h6:>5<<a<81<75f19194?=h9><1<75rb3``>5<4290;w)?7a;1`a>N4ko1C?n:4i5;94?=n9;21<75`16494?=zj;kh6=4;:183!7?i3;8>6F<cg9K7f2<a=31<75f5383>>o60:0;66a>7783>>{e:kh1<7=50;2x 4>f2:in7E=lf:J0g1=n<00;66g>2983>>i6??0;66sm2`c94?2=83:p(<6n:011?M5dn2B8o95f4883>>o2:3:17d?73;29?j70>3:17pl=b`83>6<729q/=5o53bg8L6ea3A9h86g;9;29?l7503:17b?86;29?xd5i10;694?:1y'5=g=9:80D>mi;I1`0>o313:17d;=:188m4>42900c<99:188yg4bk3:197>50z&2<d<c;2B8ok5G3b68 `3=:2c?:7>5;h64>5<<a=i1<75f5183>>i6?m0;66sm2d`94?3=83:p(<6n:e18L6ea3A9h86*j5;08m10=831b8:4?::k7g?6=3`?;6=44o05g>5<<uk8nm7>55;294~"60h0o?6F<cg9K7f2<,l?1>6g;6;29?l202900e9m50;9j15<722e:;i4?::a6`?=83?1<7>t$0:b>a5<@:im7E=l4:&f1?4<a=<1<75f4683>>o3k3:17d;?:188k41c2900qo<j8;291?6=8r.:4l4k3:J0gc=O;j>0(h;52:k72?6=3`><6=44i5a94?=n=90;66a>7e83>>{e:l=1<7;50;2x 4>f2m90D>mi;I1`0>"b=380e9850;9j02<722c?o7>5;h73>5<<g8=o6=44}c0f2?6==3:1<v*>8`8g7>N4ko1C?n:4$d796>o3>3:17d:8:188m1e=831b9=4?::m23a<722wi>h;50;794?6|,82j6i=4H2ae?M5d<2.n97<4i5494?=n<>0;66g;c;29?l372900c<9k:188yg4b<3:197>50z&2<d<c;2B8ok5G3b68 `3=:2c?:7>5;h64>5<<a=i1<75f5183>>i6?m0;66sm2d194?3=83:p(<6n:e18L6ea3A9h86*j5;08m10=831b8:4?::k7g?6=3`?;6=44o05g>5<<uk8=j7>54;294~"60h0o86F<cg9K7f2<,l?1:6g;6;29?l372900e<9l:188k41c2900qo<80;290?6=8r.:4l4k4:J0gc=O;j>0(h;56:k72?6=3`?;6=44i05`>5<<g8=o6=44}c05e?6=<3:1<v*>8`8g6>N4ko1C?n:4$d796>o3>3:17d:l:188m06=831d=:j50;9~f70>290?6=4?{%3;e?b53A9hj6F<c59'a0<53`>=6=44i5a94?=n=90;66a>7e83>>{e:1o1<7:50;2x 4>f28997E=lf:J0g1=n<00;66g:2;29?l7?;3:17b?86;29?xd50m0;694?:1y'5=g=9:80D>mi;I1`0>o313:17d;=:188m4>42900c<99:188yg4?k3:187>50z&2<d<6;;1C?nh4H2a7?l2>2900e8<50;9j5=5=831d=:850;9~f7>e290?6=4?{%3;e?74:2B8ok5G3b68m1?=831b9?4?::k2<6<722e:;;4?::a6=g=83>1<7>t$0:b>4553A9hj6F<c59j0<<722c>>7>5;h3;7?6=3f;<:7>5;|`13g<72=0;6=u+19c9564<@:im7E=l4:k7=?6=3`?96=44i0:0>5<<g8==6=44}c04e?6=<3:1<v*>8`8277=O;jl0D>m;;h6:>5<<a<81<75f19194?=h9><1<75rb35:>5<3290;w)?7a;306>N4ko1C?n:4i5;94?=n=;0;66g>8283>>i6??0;66sm26:94?2=83:p(<6n:011?M5dn2B8o95f4883>>o2:3:17d?73;29?j70>3:17pl=7683>1<729q/=5o51208L6ea3A9h86g;9;29?l352900e<6<:188k4112900qo=?9;290?6=8r.:4l4>339K7f`<@:i?7d:6:188m04=831b=5=50;9l520=831vn>>7:187>5<7s-;3m7?<2:J0gc=O;j>0e9750;9j17<722c:4>4?::m233<722wi?=950;694?6|,82j6<==;I1`b>N4k=1b844?::k66?6=3`;3?7>5;n342?6=3th8<;4?:583>5}#91k1=><4H2ae?M5d<2c?57>5;h71>5<<a8286=44o055>5<<uk9;97>54;294~"60h0:??5G3bd8L6e33`>26=44i4094?=n9191<75`16494?=zj;l=6=4;:183!7?i3;8>6F<cg9K7f2<a=31<75f5383>>o60:0;66a>7783>>{e:o?1<7:50;2x 4>f28997E=lf:J0g1=n<00;66g:2;29?l7?;3:17b?86;29?xd5n=0;694?:1y'5=g=9:80D>mi;I1`0>o313:17d;=:188m4>42900c<99:188yg4a;3:187>50z&2<d<6;;1C?nh4H2a7?l2>2900e8<50;9j5=5=831d=:850;9~f7`5290?6=4?{%3;e?74:2B8ok5G3b68m1?=831b9?4?::k2<6<722e:;;4?::a70d=83?1<7>t$0:b>a5<@:im7E=l4:&f1?4<a=<1<75f4683>>o3k3:17d;?:188k41c2900qo=:9;291?6=8r.:4l4k5:J0gc=O;j>0(h;56:k72?6=3`><6=44i4294?=n9>i1<75`16f94?=zj:?j6=4::183!7?i3n87E=lf:J0g1=#m<097d:9:188m11=831b8n4?::k64?6=3f;<h7>5;|`01f<72<0;6=u+19c9`6=O;jl0D>m;;%g6>7=n<?0;66g;7;29?l2d2900e8>50;9l52b=831vn>;k:186>5<7s-;3m7j<;I1`b>N4k=1/i84=;h65>5<<a==1<75f4b83>>o283:17b?8d;29?xd4=l0;684?:1y'5=g=l:1C?nh4H2a7?!c22;1b8;4?::k73?6=3`>h6=44i4294?=h9>n1<75rb27e>5<2290;w)?7a;f0?M5dn2B8o95+e481?l212900e9950;9j0f<722c><7>5;n34`?6=3th8:=4?:483>5}#91k1h>5G3bd8L6e33-o>6?5f4783>>o3?3:17d:l:188m06=831d=:j50;9~f606290>6=4?{%3;e?b43A9hj6F<c59'a0<53`>=6=44i5594?=n<j0;66g:0;29?j70l3:17pl<4g83>0<729q/=5o5d29K7f`<@:i?7)k::39j03<722c?;7>5;h6`>5<<a<:1<75`16f94?=zj:>n6=4::183!7?i3n87E=lf:J0g1=#m<097d:9:188m11=831b8n4?::k64?6=3f;<h7>5;|`00f<72<0;6=u+19c9`6=O;jl0D>m;;%g6>7=n<?0;66g;7;29?l2d2900e8>50;9l52b=831vn>:m:186>5<7s-;3m7j<;I1`b>N4k=1/i84=;h65>5<<a==1<75f4b83>>o283:17b?8d;29?xd4<m0;684?:1y'5=g=l:1C?nh4H2a7?!c22;1b8;4?::k73?6=3`>h6=44i4294?=h9>n1<75rb26b>5<2290;w)?7a;f0?M5dn2B8o95+e481?l212900e9950;9j0f<722c><7>5;n34`?6=3th8844?:483>5}#91k1h>5G3bd8L6e33-o>6?5f4783>>o3?3:17d:l:188m06=831d=:j50;9~f620290>6=4?{%3;e?b43A9hj6F<c59'a0<53`>=6=44i5594?=n<j0;66g:0;29?j70l3:17pl<4983>0<729q/=5o5d49K7f`<@:i?7)k::79j03<722c?;7>5;h73>5<<a8=h6=44o05g>5<<uk98o7>53;294~"60h08oh5G3bd8L6e33`>26=44i00;>5<<g8==6=44}c10f?6=;3:1<v*>8`80g`=O;jl0D>m;;h6:>5<<a8836=44o055>5<<uk98>7>54;294~"60h0:??5G3bd8L6e33`>26=44i4094?=n9191<75`16494?=zj:9j6=4<:183!7?i39hi6F<cg9K7f2<a=31<75f13:94?=h9><1<75rb213>5<3290;w)?7a;306>N4ko1C?n:4i5;94?=n=;0;66g>8283>>i6??0;66sm32;94?5=83:p(<6n:2af?M5dn2B8o95f4883>>o6:10;66a>7783>>{e;;o1<7:50;2x 4>f28997E=lf:J0g1=n<00;66g:2;29?l7?;3:17b?86;29?xd4;10;6>4?:1y'5=g=;jo0D>mi;I1`0>o313:17d?=8;29?j70>3:17pl<2b83>1<729q/=5o51208L6ea3A9h86g;9;29?l352900e<6<:188k4112900qo=<7;297?6=8r.:4l4<cd9K7f`<@:i?7d:6:188m44?2900c<99:188yg55i3:187>50z&2<d<6;;1C?nh4H2a7?l2>2900e8<50;9j5=5=831d=:850;9~f65129086=4?{%3;e?5dm2B8ok5G3b68m1?=831b=?650;9l520=831vn><7:187>5<7s-;3m7?<2:J0gc=O;j>0e9750;9j17<722c:4>4?::m233<722wi?>;50;194?6|,82j6>mj;I1`b>N4k=1b844?::k26=<722e:;;4?::a770=83>1<7>t$0:b>4553A9hj6F<c59j0<<722c>>7>5;h3;7?6=3f;<:7>5;|`071<72:0;6=u+19c97fc<@:im7E=l4:k7=?6=3`;947>5;n342?6=3th8>94?:583>5}#91k1=><4H2ae?M5d<2c?57>5;h71>5<<a8286=44o055>5<<uk9<?7>55;294~"60h0o?6F<cg9K7f2<,l?1>6g;6;29?l202900e9m50;9j15<722e:;i4?::a724=83?1<7>t$0:b>a5<@:im7E=l4:&f1?4<a=<1<75f4683>>o3k3:17d;?:188k41c2900qo=81;291?6=8r.:4l4k3:J0gc=O;j>0(h;52:k72?6=3`><6=44i5a94?=n=90;66a>7e83>>{e;>:1<7;50;2x 4>f2m90D>mi;I1`0>"b=380e9850;9j02<722c?o7>5;h73>5<<g8=o6=44}c15b?6==3:1<v*>8`8g7>N4ko1C?n:4$d796>o3>3:17d:8:188m1e=831b9=4?::m23a<722wi?;k50;794?6|,82j6i=4H2ae?M5d<2.n97<4i5494?=n<>0;66g;c;29?l372900c<9k:188yg51l3:197>50z&2<d<c;2B8ok5G3b68 `3=:2c?:7>5;h64>5<<a=i1<75f5183>>i6?m0;66sm37a94?3=83:p(<6n:e18L6ea3A9h86*j5;08m10=831b8:4?::k7g?6=3`?;6=44o05g>5<<uk9=n7>55;294~"60h0o?6F<cg9K7f2<,l?1>6g;6;29?l202900e9m50;9j15<722e:;i4?::a7<6=83?1<7>t$0:b>a0<@:im7E=l4:&f1?4<a=<1<75f4683>>o283:17d?8e;29?j70l3:17pl<8g83>0<729q/=5o5d79K7f`<@:i?7)k::39j03<722c?;7>5;h73>5<<a8=n6=44o05g>5<<uk93i7>55;294~"60h0o:6F<cg9K7f2<,l?1>6g;6;29?l202900e8>50;9j52c=831d=:j50;9~f6>c290>6=4?{%3;e?b13A9hj6F<c59'a0<53`>=6=44i5594?=n=90;66g>7d83>>i6?m0;66sm39a94?3=83:p(<6n:e48L6ea3A9h86*j5;08m10=831b8:4?::k64?6=3`;<i7>5;n34`?6=3th84o4?:483>5}#91k1h;5G3bd8L6e33-o>6?5f4783>>o3?3:17d;?:188m41b2900c<9k:188yg5?i3:197>50z&2<d<c>2B8ok5G3b68 `3=:2c?:7>5;h64>5<<a<:1<75f16g94?=h9>n1<75rb2::>5<2290;w)?7a;f5?M5dn2B8o95+e481?l212900e9950;9j15<722c:;h4?::m23a<722wi?4650;794?6|,82j6i84H2ae?M5d<2.n97<4i5494?=n<>0;66g:0;29?l70m3:17b?8d;29?xd41>0;684?:1y'5=g=l?1C?nh4H2a7?!c22;1b8;4?::k73?6=3`?;6=44i05f>5<<g8=o6=44}c1:2?6==3:1<v*>8`8g2>N4ko1C?n:4$d796>o3>3:17d:8:188m06=831b=:k50;9l52b=831vn>7::186>5<7s-;3m7j9;I1`b>N4k=1/i84=;h65>5<<a==1<75f5183>>o6?l0;66a>7e83>>{e;0>1<7;50;2x 4>f2m<0D>mi;I1`0>"b=380e9850;9j02<722c><7>5;h34a?6=3f;<h7>5;|`0=6<72<0;6=u+19c9`3=O;jl0D>m;;%g6>7=n<?0;66g;7;29?l372900e<9j:188k41c2900qo=62;291?6=8r.:4l4k6:J0gc=O;j>0(h;52:k72?6=3`><6=44i4294?=n9>o1<75`16f94?=zj:3:6=4::183!7?i3n=7E=lf:J0g1=#m<097d:9:188m11=831b9=4?::k23`<722e:;i4?::a7=>=83?1<7>t$0:b>a0<@:im7E=l4:&f1?4<a=<1<75f4683>>o283:17d?8e;29?j70l3:17pl<8683>0<729q/=5o5d79K7f`<@:i?7)k::39j03<722c?;7>5;h73>5<<a8=n6=44o05g>5<<uk9ii7>53;294~"60h0:>i5G3bd8L6e33-o>6<74ie;94?=nlh0;66a>7783>>{e;k91<7=50;2x 4>f288o7E=lf:J0g1=#m<0:56gk9;29?lbf2900c<99:188yg46>3:1?7>50z&2<d<6:m1C?nh4H2a7?!c228n0ei750;9j`d<722e:;;4?::a5d`=8391<7>t$0:b>44c3A9hj6F<c59'a0<6l2co57>5;hfb>5<<g8==6=44}c3:f?6=;3:1<v*>8`826a=O;jl0D>m;;%g6>4b<am31<75fd`83>>i6??0;66sm18c94?5=83:p(<6n:00g?M5dn2B8o95+e482`>oc13:17djn:188k4112900qo?69;297?6=8r.:4l4>2e9K7f`<@:i?7)k::0f8ma?=831bhl4?::m233<722wi=4650;194?6|,82j6<<k;I1`b>N4k=1/i84>d:kg=?6=3`nj6=44o055>5<<uk;2;7>53;294~"60h0:>i5G3bd8L6e33-o>6<j4ie;94?=nlh0;66a>7783>>{e90<1<7=50;2x 4>f288o7E=lf:J0g1=#m<0:h6gk9;29?lbf2900c<99:188yg7>=3:1?7>50z&2<d<6:m1C?nh4H2a7?!c228n0ei750;9j`d<722e:;;4?::a5<2=8391<7>t$0:b>44c3A9hj6F<c59'a0<6l2co57>5;hfb>5<<g8==6=44}c3:7?6=;3:1<v*>8`826a=O;jl0D>m;;%g6>4b<am31<75fd`83>>i6??0;66sm18094?5=83:p(<6n:00g?M5dn2B8o95+e482`>oc13:17djn:188k4112900qo?61;297?6=8r.:4l4>2e9K7f`<@:i?7)k::0f8ma?=831bhl4?::m233<722wi=4>50;194?6|,82j6<<k;I1`b>N4k=1/i84>d:kg=?6=3`nj6=44o055>5<<uk;3j7>53;294~"60h0:>i5G3bd8L6e33-o>6<j4ie;94?=nlh0;66a>7783>>{e91o1<7=50;2x 4>f288o7E=lf:J0g1=#m<0:h6gk9;29?lbf2900c<99:188yg7?l3:1?7>50z&2<d<6:m1C?nh4H2a7?!c228n0ei750;9j`d<722e:;;4?::a5=e=8391<7>t$0:b>44c3A9hj6F<c59'a0<6l2co57>5;hfb>5<<g8==6=44}c3;f?6=;3:1<v*>8`826a=O;jl0D>m;;%g6>4b<am31<75fd`83>>i6??0;66sm27g94?2=83:p(<6n:00f?M5dn2B8o95+e48``>oc13:17djn:188mad=831d=:850;9~f77?290?6=4?{%3;e?75m2B8ok5G3b68 `3=:=1bh44?::kge?6=3`ni6=44o055>5<<uk;i=7>54;294~"60h0:>h5G3bd8L6e33-o>6?:4ie;94?=nlh0;66gkb;29?j70>3:17pl=6b83>0<729q/=5o513d8L6ea3A9h86*j5;3b?lb>2900eio50;9j`g<722coo7>5;n342?6=3th9=l4?:483>5}#91k1=?h4H2ae?M5d<2.n97?i;hf:>5<<amk1<75fdc83>>ock3:17b?86;29?xd6j:0;684?:1y'5=g=9;l0D>mi;I1`0>"b=3;m7dj6:188mag=831bho4?::kgg?6=3f;<:7>5;|`137<72<0;6=u+19c957`<@:im7E=l4:&f1?463`n26=44iec94?=nlk0;66gkc;29?j70>3:17pl<1`83>6<729q/=5o513f8L6ea3A9h86*j5;33?lb>2900eio50;9l520=831vn?89:187>5<7s-;3m7?=e:J0gc=O;j>0(h;52b9j`<<722com7>5;hfa>5<<g8==6=44}c02g?6=;3:1<v*>8`826a=O;jl0D>m;;%g6>4b<am31<75fd`83>>i6??0;66sm1c794?5=83:p(<6n:00g?M5dn2B8o95+e482`>oc13:17djn:188k4112900qo<>e;290?6=8r.:4l4>2d9K7f`<@:i?7)k::368ma?=831bhl4?::kgf?6=3f;<:7>5;|`2f2<72=0;6=u+19c957c<@:im7E=l4:&f1?433`n26=44iec94?=nlk0;66a>7783>>{e:;:1<7;50;2x 4>f288m7E=lf:J0g1=#m<0:j6gk9;29?lbf2900eil50;9j`f<722e:;;4?::a5g?=83?1<7>t$0:b>44a3A9hj6F<c59'a0<6n2co57>5;hfb>5<<amh1<75fdb83>>i6??0;66sm3`f94?2=83:p(<6n:00f?M5dn2B8o95+e4865>oc13:17djn:188mad=831d=:850;9~f702290>6=4?{%3;e?75n2B8ok5G3b68 `3=9;1bh44?::kge?6=3`ni6=44iea94?=h9><1<75rb230>5<4290;w)?7a;31`>N4ko1C?n:4$d7967=nl00;66gka;29?j70>3:17pl<0183>6<729q/=5o513f8L6ea3A9h86*j5;01?lb>2900eio50;9l520=831vn?77:186>5<7s-;3m7?=f:J0gc=O;j>0(h;5219j`<<722com7>5;hfa>5<<ami1<75`16494?=zj;2>6=4::183!7?i3;9j6F<cg9K7f2<,l?1>>5fd883>>oci3:17djm:188mae=831d=:850;9~f675290>6=4?{%3;e?75n2B8ok5G3b68 `3=::1bh44?::kge?6=3`ni6=44iea94?=h9><1<75rb3de>5<2290;w)?7a;31b>N4ko1C?n:4$d7966=nl00;66gka;29?lbe2900eim50;9l520=831vn?78:186>5<7s-;3m7?=f:J0gc=O;j>0(h;5219j`<<722com7>5;hfa>5<<ami1<75`16494?=zj;2?6=4::183!7?i3;9j6F<cg9K7f2<,l?1>=5fd883>>oci3:17djm:188mae=831d=:850;9~f676290>6=4?{%3;e?75n2B8ok5G3b68 `3=::1bh44?::kge?6=3`ni6=44iea94?=h9><1<75rb3df>5<2290;w)?7a;31b>N4ko1C?n:4$d7966=nl00;66gka;29?lbe2900eim50;9l520=831vn?79:186>5<7s-;3m7?=f:J0gc=O;j>0(h;5219j`<<722com7>5;hfa>5<<ami1<75`16494?=zj;286=4::183!7?i3;9j6F<cg9K7f2<,l?1>=5fd883>>oci3:17djm:188mae=831d=:850;9~f677290>6=4?{%3;e?75n2B8ok5G3b68 `3=::1bh44?::kge?6=3`ni6=44iea94?=h9><1<75rb3dg>5<2290;w)?7a;31b>N4ko1C?n:4$d7966=nl00;66gka;29?lbe2900eim50;9l520=831vn?7::186>5<7s-;3m7?=f:J0gc=O;j>0(h;5219j`<<722com7>5;hfa>5<<ami1<75`16494?=zj;296=4::183!7?i3;9j6F<cg9K7f2<,l?1>=5fd883>>oci3:17djm:188mae=831d=:850;9~f7?c290?6=4?{%3;e?75m2B8ok5G3b68 `3=ko1bh44?::kge?6=3`ni6=44o055>5<<uk8287>54;294~"60h0:>h5G3bd8L6e33-o>6<?4ie;94?=nlh0;66gkb;29?j70>3:17pl=8083>1<729q/=5o513g8L6ea3A9h86*j5;32?lb>2900eio50;9j`g<722e:;;4?::a74?=83?1<7>t$0:b>44a3A9hj6F<c59'a0<dm2co57>5;hfb>5<<amh1<75fdb83>>i6??0;66sm31d94?3=83:p(<6n:00e?M5dn2B8o95+e4817>oc13:17djn:188mad=831bhn4?::m233<722wi>km50;794?6|,82j6<<i;I1`b>N4k=1/i84=3:kg=?6=3`nj6=44ie`94?=nlj0;66a>7783>>{e:;91<7=50;2x 4>f288o7E=lf:J0g1=#m<09>6gk9;29?lbf2900c<99:188yg7ek3:1?7>50z&2<d<6:m1C?nh4H2a7?!c22;80ei750;9j`d<722e:;;4?::a670=83>1<7>t$0:b>44b3A9hj6F<c59'a0<6m2co57>5;hfb>5<<amh1<75`16494?=zj8hm6=4;:183!7?i3;9i6F<cg9K7f2<,l?1=h5fd883>>oci3:17djm:188k4112900qo<m9;296?6=8r.:4l4>2b9K7f`<@:i?7)k::028ma?=831d=:850;9~f7d029096=4?{%3;e?75k2B8ok5G3b68 `3=991bh44?::m233<722wi>o;50;094?6|,82j6<<l;I1`b>N4k=1/i84>0:kg=?6=3f;<:7>5;|`1f6<72;0;6=u+19c957e<@:im7E=l4:&f1?773`n26=44o055>5<<uk8i=7>52;294~"60h0:>n5G3bd8L6e33-o>6<>4ie;94?=h9><1<75rb3ce>5<5290;w)?7a;31g>N4ko1C?n:4$d7955=nl00;66a>7783>>{e:hn1<7<50;2x 4>f288h7E=lf:J0g1=#m<0:<6gk9;29?j70>3:17pl=ac83>7<729q/=5o513a8L6ea3A9h86*j5;33?lb>2900c<99:188yg4f13:1>7>50z&2<d<6:j1C?nh4H2a7?!c228:0ei750;9l520=831vn>=<:181>5<7s-;3m7?=c:J0gc=O;j>0(h;5119j`<<722e:;;4?::a767=8381<7>t$0:b>44d3A9hj6F<c59'a0<682co57>5;n342?6=3th8>k4?:383>5}#91k1=?m4H2ae?M5d<2.n97??;hf:>5<<g8==6=44}c11`?6=:3:1<v*>8`826f=O;jl0D>m;;%g6>46<am31<75`16494?=zj:8i6=4=:183!7?i3;9o6F<cg9K7f2<,l?1==5fd883>>i6??0;66sm33;94?4=83:p(<6n:00`?M5dn2B8o95+e4824>oc13:17b?86;29?xd4:>0;6?4?:1y'5=g=9;i0D>mi;I1`0>"b=3;;7dj6:188k4112900qo==5;296?6=8r.:4l4>2b9K7f`<@:i?7)k::028ma?=831d=:850;9~f7e329096=4?{%3;e?75k2B8ok5G3b68 `3=991bh44?::m233<722wi?>j50;094?6|,82j6<<l;I1`b>N4k=1/i84>0:kg=?6=3f;<:7>5;|`167<72?0;6=u+19c9566<@:im7E=l4:&f1?423`n26=44iec94?=nlk0;66gkc;29?j7513:17b?86;29?xd6jk0;6;4?:1y'5=g=9::0D>mi;I1`0>"b=38>7dj6:188mag=831bho4?::kgg?6=3f;957>5;n342?6=3th8mo4?:9594?6|@:i?7)?7a;34b>\3=3kp47<9:e821?7428h1i7?9:0695f<z,88<695+de86?!bb2<1/hk4:;%g3>0=#m80>7)k=:49'a6<23-ii6i>4$d491>"b?3?0(h655:&f=?3<,lk196*jb;78 `e==2.nh7;4$dg91>"bn3?0(k>55:&e5?3<,o8196*i3;78 c2==2.m97;4$g491>"a?3?0(k655:&e=?3<,ok196*ib;78 ce==2.mh7;4$gg91>"an3?0(<>?:49'557==2.:<?4:;%337?3<,8:?685+11791>"68?0>7)??7;78 46?2<1/==755:&24d<23-;;n7;4$02`>0=#99n196*>0d86?!77n3?0(<??:49'547==2.:=?4:;%327?3<,8;?685+10791>"69?0>7)?>7;78 47?2<1/=<755:&25d<23-;:n7;4$03`>0=#98n196*>1d86?!76n3?0(<<?:49'577==2.:>?4:;%317?3<,88?685+13791>"6:?087)?74;61?!c32<1/=5853:&0g<<6091/?no51928j<c=82dh<7>4n0:2>44<f8296?:4n2aa>44<f:ih6?:4$ba9`5=#91=186g;a;29?l2e2900en750;9j7f>=831b=5650;9j<0<72-;<n769;o34e?7<3`9<6=4+16`973=i9>k1<65f3483>!70j39=7c?8a;38?l53290/=:l5379m52g=:21b?>4?:%34f?513g;<m7=4;h11>5<#9>h1?;5a16c90>=n;80;6)?8b;15?k70i3?07d=?:18'52d=;?1e=:o56:9j6c<72-;<n7=9;o34e?1<3`8n6=4+16`973=i9>k1465f2e83>!70j39=7c?8a;;8?l26290/=:l5419m52g=821b?k4?:%34f?273g;<m7?4;h1f>5<#9>h18=5a16c96>=n;m0;6)?8b;63?k70i3907d=l:18'52d=<91e=:o54:9j7g<72-;<n7:?;o34e?3<3`9j6=4+16`905=i9>k1:65f3883>!70j3>;7c?8a;58?l5?290/=:l5419m52g=021b;i4?:%34f?1d3g;<m7>4;h5a>5<#9>h1;n5a16c95>=n?00;6)?8b;5`?k70i3807d97:18'52d=?j1e=:o53:9j32<72-;<n79l;o34e?2<3`==6=4+16`93f=i9>k1965f7483>!70j3=h7c?8a;48?l13290/=:l57b9m52g=?21b;>4?:%34f?1d3g;<m764;h51>5<#9>h1;n5a16c9=>=n?80;6)?8b;5`?k70i3k07d9?:18'52d=?j1e=:o5b:9j2`<72-;<n79l;o34e?e<3`<o6=4+16`93f=i9>k1h65f6b83>!70j3=h7c?8a;g8?l0e290/=:l57b9m52g=n21b:l4?:%34f?1d3g;<m7??;:k5=?6=,8=i6:m4n05b>47<3`<36=4+16`93f=i9>k1=?54i7594?"6?k0<o6`>7`827>=n>?0;6)?8b;5`?k70i3;?76g95;29 41e2>i0b<9n:078?l>3290/=:l57b9m52g=9?10e5=50;&23g<0k2d:;l4>7:9j<7<72-;<n79l;o34e?7?32c3=7>5$05a>2e<f8=j6<74;h:3>5<#9>h1;n5a16c95d=<a>l1<7*>7c84g>h6?h0:n65f7d83>!70j3=h7c?8a;3`?>o0i3:1(<9m:6a8j41f28n07d8i:18'52d=?j1e=:o51d98m32=83.:;o48c:l23d<6n21b4n4?:%34f?>e3g;<m7>4;h:b>5<#9>h14o5a16c95>=n000;6)?8b;:a?k70i3807d67:18'52d=0k1e=:o53:9l=1<72-;<n77<;o34e?6<3f396=4+16`9=6=i9>k1=65`9083>!70j3387c?8a;08?j?7290/=:l5929m52g=;21d4k4?:%34f??43g;<m7:4;n:f>5<#9>h15>5a16c91>=h1m0;6)?8b;;0?k70i3<07b7l:18'52d=1:1e=:o57:9l=g<72-;<n77<;o34e?><3f3j6=4+16`9=6=i9>k1565`9883>!70j3387c?8a;c8?j??290/=:l5929m52g=j21d5:4?:%34f??43g;<m7m4;n;5>5<#9>h15>5a16c9`>=h1<0;6)?8b;;0?k70i3o07b6k:18'52d=1:1e=:o5f:9lg6<72-;<n7m=;o34e?6<3fi:6=4+16`9g7=i9>k1=65fc`83>>o6000;66g<c683>>o2i3:1(<9m:4;8j41f2910e8650;&23g<212d:;l4>;:k63?6=,8=i6874n05b>7=<a<<1<7*>7c86=>h6?h0876g:5;29 41e2<30b<9n:598m02=83.:;o4:9:l23d<232c=?7>5$05a>0?<f8=j6;54i7094?"6?k0>56`>7`84?>o193:1(<9m:4;8j41f2110e;>50;&23g<212d:;l46;:k6b?6=,8=i6874n05b>d=<a<o1<7*>7c86=>h6?h0i76g:d;29 41e2<30b<9n:b98m0e=83.:;o4:9:l23d<c32c>n7>5$05a>0?<f8=j6h54i4194?"6?k0>56`>7`8e?>o??3:1(<9m:948j41f2910co650;&23g<e?2d:;l4?;:ma2?6=,8=i6o94n05b>4=<gk>1<7*>7c8a3>h6?h0976am3;29 41e2k=0b<9n:298kg4=83.:;o4m7:l23d<332ei=7>5$05a>g1<f8=j6854oc294?"6?k0i;6`>7`85?>ifn3:1(<9m:c58j41f2>10clk50;&23g<e?2d:;l47;:mb`?6=,8=i6o94n05b><=<ghi1<7*>7c8a3>h6?h0j76anb;29 41e2k=0b<9n:c98kd?=83.:;o4m7:l23d<d32ej47>5$05a>g1<f8=j6i54o`594?"6?k0i;6`>7`8f?>if>3:1(<9m:c58j41f2o10cl;50;&23g<e?2d:;l4>0:9le1<72-;<n7l8;o34e?7632ej?7>5$05a>g1<f8=j6<<4;nc1>5<#9>h1n:5a16c956=<gh;1<7*>7c8a3>h6?h0:865`a183>!70j3h<7c?8a;36?>ien3:1(<9m:c58j41f28<07blj:18'52d=j>1e=:o51698kgb=83.:;o4m7:l23d<6021dnn4?:%34f?d03g;<m7?6;:maf?6=,8=i6o94n05b>4g<3fhj6=4+16`9f2=i9>k1=o54oc;94?"6?k0i;6`>7`82g>=hj<0;6)?8b;`4?k70i3;o76ana;29 41e2k=0b<9n:0g8?j?a290/=:l5b69m52g=9o10cn650;&23g<d?2d:;l4?;:m`2?6=,8=i6n94n05b>4=<gj?1<7*>7c8`3>h6?h0976al4;29 41e2j=0b<9n:298yv2e83:1:vP;b19>63c=lh16>;m5d89>624=lj16>;85dc9>633=l01v9oj:1853~X4m?1U?i64^5`;?[2e>2T8h:5Q4c18Z1063W>i;6P;639]0=2<V:o?7S=j3:\0a7=Y;l;0R>k?;_1gb>X4ll1U?ij4^2f`?[2d:2T?o<5Q4b28Z1da3W>ii6P;be9]0ge<V=hi7S:ma:\7ea=Y<hi0R9om;_6be>X3i01U8l64^5c4?[2f>2T?m85Q4`6896b72m=01>ln:42896ga2<:01>l6:42896d?2<:01>l8:42896e52<:01>m>:42897d?2<801?l9:40897d32<801?l=:40897d72<801?oj:40897gd2<801?on:40897g?2<801?6j:40897>c2<801?6l:40897>e2<801?6n:408971e2<801?9n:408971>2<801?97:40897102<801>>6:408966?2<801>>8:40896612<801>>::40897`12<801?h::40897`32<801?h<:40897`52<801>==:40896572<801><j:408964d2<801><n:408964?2<801><9:40896432<801>om:97896ge282270=nb;1`3>;4ik0>m63<ac86<>;4ik0>;63<ac862>;4ik0>963<ac860>;4ik0=?63<ac856>;4ik0==63<ac854>;4ik0>j63<ac86a>;4ik0>h63<ac86g>;4ik0>n63<ac867>;4ik03;6s|4c094?5|V=h970=ma;34g>;4io0:;n5rs353>5<5sW>>:63=71823a=z{=i?6=4<{_6`0>;49h0o563<188g=>{t<h91<7;7{_6b7>;51k0?:63<b0872>;4j90?:63<ag872>;4j00?:63<b9872>;4j>0?:63=15872>;59:0?:63=13872>;5980?:63=11872>;58o0?:63=0d872>;58m0?:63=0b872>;5=j0?:63=5c872>;5=h0?:63=58872>;5=10?:63=56872>;5=?0?:63=54872>;5==0?:63=4`872>;5<00?:63=49872>;5<>0?:63=47872>;5<<0?:63=45872>;5<:0?:63=43872>;6l:0?:63>d3872>;6l80?:63>d1872>;6ko0?:63>cd872>;6km0?:63>cb872>;6kk0?:63>c`872>;5l10?:63=d6872>;5l<0?:63=d5872>;5l?0?:63=d2872>;5l;0?:63=d1872>;5ko0?:63=d0872>;5mj0?:63=ec872>;5mh0?:63=e8872>;5m10?:63=e6872>;5m?0?:63=e4872>;5m=0?:63=e2872>;5>o0?:63=71872>;5>h0?:63=68872>;4190?:63<8g872>;40l0?:63<8e872>;40j0?:63<8c872>;40h0?:63<88872>;4110?:63<96872>;41?0?:63<94872>;41=0?:63<92872>;41;0?:63<90872>;4010?:63<86872>;4ik0?m6s|30594?4|V=?h70=>7;34`>{t<k31<7:6{_6a=>;49>0?:63<17872>;4jj0?:63<b`872>;4jk0?:63<c3872>;4k80?:63>ae872>;6ij0?:63>ac872>;6ih0?:63>a8872>;6i10?:63>a6872>;6i?0?:63>a4872>;6n00?:63>f9872>;6n>0?:63>f7872>;6n<0?:63>f5872>;6n:0?:63>f3872>;6n80?:63>e6872>;6m?0?:63>e4872>;6m=0?:63>e2872>;6m;0?:63>e0872>;6m90?:63>dg872>;6ll0?:63=39872>;5;>0?:63=37872>;5;<0?:63=35872>;5;:0?:63=33872>;5;80?:63=31872>;4=k0?:63<58872>;4=h0?:63<5b872>;4=m0?:63<5d872>;4=o0?:63<61872>;4>80?:63<4g872>;4<l0?:63<4b872>;4<k0?:63<4e872>;4<h0?:63<48872>;4<>0?:63<49872>;4?:0?:63<73872>;4?80?:63<71872>;4>o0?:63<6d872>;4>m0?:63<6b872>;4>k0?:63<ac87f>{t;>n1<7<t^51:?85>83;<h6s|36a94?4|V=9370=7f;34`>{t;>h1<7<t^514?85?m3;<h6s|36c94?4|V=9=70=7d;34`>{t;>31<7<t^516?85?k3;<h6s|36:94?4|V=9?70=7b;34`>{t;>=1<7<t^510?85?i3;<h6s|36494?4|V=9970=79;34`>{t;1<1<7<t^562?85>03;<h6s|39794?4|V=>;70=67;34`>{t;1>1<7<t^51e?85>>3;<h6s|39194?4|V=9n70=65;34`>{t;181<7<t^51g?85><3;<h6s|39394?4|V=9h70=63;34`>{t;1:1<7<t^51a?85>:3;<h6s|36d94?4|V=9j70=61;34`>{t;>o1<7<t^512?85?03;<h6s|36794?4|V=9;70=77;34`>{t<;21<7<t^527?85fj3227p};2783>7}Y<9901>om:7c8yv25=3:1>vP;039>7dd=>01v9<;:181[279278mo498:p075=838pR9>?;<1bf?003ty?>?4?:3y]7c`<5:ki6;84}r614?6=:rT8ji523``920=z{=;m6=4={_1eg>;4ik0386s|40g94?4|V:li70=nb;:0?xu39m0;6?uQ3gc896ge2120q~:>c;296~X4n016?ll5839~w17e2909wS=i8:?0eg<?92wx8<o50;0xZ6`0349jn76?;|q75<<72;qU?k84=2ca>2`<uz>:47>52z\0b0=:;hh1;h5rs534>5<5sW9m863<ac84e>{t<8?1<7<t^2d1?85fj3<m7p};1583>7}Y;o;01>om:768yv26;3:1>vP<f19>7dd=0j1v9?=:181[5bn278mo48d:p047=838pR>kj;<1bf?1e3ty?==4?:3y]7`b<5:ki6:74}r63b?6=:rT8in523``93==z{=:n6=4={_1ff>;4ik0<;6s|41f94?4|V:oj70=nb;55?xu38j0;6?uQ3d;896ge2>?0q~:=f;296~X38h16?ll5759~w14b2909wS:?9:?0eg<?i2wx8?j50;0xZ16?349jn79<;|q76f<72;qU8=94=2ca>24<uz>9n7>52z\743=:;hh1;<5rs50b>5<5sW>;963<ac844>{t<;31<7<t^2df?85fj3<n7p};2083>7}Y;o901>om:7f8yv26>3:1>vP<e99>7dd=>j1v9>m:181[5b?278mo49b:p563=833p1>j>:05;?84ei3>270<n8;6:?84?i3>270<87;6:?857=3>270<i2;6:?854<3>270==4;6:?xu51j0;6?u228`915=::0n1=:84}r1a2?6=9hq6>4l516a896d>28=o70<k8;6`?84c?3>h70<k5;6`?84c<3>h70<k6;6`?84c;3>h70<k2;6`?84c83>h70<lf;34g>;5l80?o63=eb87g>;5mk0?o63=e`87g>;5m00?o63=e987g>;5m>0?o63=e787g>;5m<0?o63=e587g>;5m:0?o63=6g823f=::>:1=:m4=34b>1e<5;<269m4}r0:f?6=<r795o4>7e9>63e=lj16?lj5d89>633=lh1v>li:181<~;49>0?o63<1787g>;4k80:;i521`f90f=:9hi18n521``90f=:9hk18n521`;90f=:9h218n521`590f=:9h<18n521`790f=:9o318n521g:90f=:9o=18n521g490f=:9o?18n521g690f=:9o918n521g090f=:9o;18n521d590f=:9l<18n521d790f=:9l>18n521d190f=:9l818n521d390f=:9l:18n521ed90f=:9mo18n5222:90f=:::=18n5222490f=:::?18n5222690f=:::918n5222090f=:::;18n5222290f=z{:;36=4<{<123?37349::7;?;<12=?70>2wx?<850;1x967128=o70=>a;fb?85613nj7p}<b183>6}:;k;19=523c2952b<5:km6994}r1a5?6=:r78n<4>7e9>7g5=l01v>lm:18085ek3?;70=ma;64?85ej3;<h6s|3ca94?4|5:hh6<9k;<1aa?b>3ty8mk4?:2y>7g6==916?lh516f896d42mk0q~=ma;297~;4jh0:;i523c`915=:;ko1hl5rs2`1>5<3s49i57?8c:?0f=<6?j16?o9516a896d428==7p}<b483>70|5:h36<9k;<020?2d348:?7:l;<026?2d348:=7:l;<024?2d348;j7:l;<03a?2d348;h7:l;<03g?2d348>o7:l;<06f?2d348>m7:l;<06=?2d348>47:l;<063?2d348>:7:l;<061?2d348>87:l;<07e?2d348?57:l;<07<?2d348?;7:l;<072?2d348?97:l;<070?2d348??7:l;<076?2d34;o?7:l;<3g6?2d34;o=7:l;<3g4?2d34;hj7:l;<3`a?2d34;hh7:l;<3`g?2d34;hn7:l;<3`e?2d3ty8n94?:07x96d028=o70=60;34a>;40o0:;h5239g952c<5:2o6<9j;<1;g?70m2784o4>7d9>7=g=9>o01>66:05f?85>03;<i63<96823`=:;0<1=:k4=2;6>41b349287?8e:?0=6<6?l16?4<516g896?628=n70=78;34a>;40>0:;h523`f9`d=:;hh1=564}r1a`?6=;r78o?4>7b9>7f7=9>i01>lj:055?xu4k90;6<mt=2a1>41c349>n7:l;<16=?70k2789l4;c:?01f<3k2789i4;c:?01`<3k2789k4;c:?025<3k278:<4;c:?00c<3k2788h4;c:?00f<3k2788o4;c:?00a<3k2788l4;c:?00<<3k2788:4;c:?00=<6?j16?:=54b9>724=<j16?:?54b9>726=<j16?;h54b9>73c=<j16?;j54b9>73e=<j16?;l54b9~w4`7290>w0?nd;73?87a13;<h63>ag8ge>;6j80o563>b28gg>{t9h>1<7=t=0cg>41c349:?7jn;<134?bf3ty:mh4?:3y>5de==916=lh51648yv7f;3:1?v3>ab823a=:;881h4522gd9`<=z{8h;6=4={<3bf?3734;i=7?86:p5d4=839p1<om:05g?856:3ni70<if;fa?xu6j;0;6;u21`c915=:9k91=:84=0`6>ag<58h<6i74=0`:>ae<58hi6im4}r3b5?6=;r7:ml4>7e9>747=l016>kk5d89~w4d32909w0?n9;73?87e=3;<:6s|1`294?5|58k26<9k;<125?be348mi7jm;|q2f3<72;q6=l65519>5g1=9><0q~?6f;297~;6i10:;i523029`<=::on1h45rs0`;>5<5s4;j;7;?;<3a=?70>2wx=4k50;1x94g028=o70=>0;fa?84al3ni7p}>b`83>7}:9h<19=521ca9520<uz;2h7>53z?2e3<6?m16?=h5d89>6ce=l01v<lj:18187f=3?;70?mf;342>{t90i1<7=t=0c6>41c349;j7jm;<0eg?be3ty99>4?:4y>642==916>8m516f897712mk01??7:e;8977f2mi0q~<?b;297~;59=0:;i5228:9`d=::1?1hl5rs336>5<5s48:?7;?;<022?70>2wx>=o50;1x977428=o70<68;f:?84?=3nh7p}=1683>7}::8819=5220:9520<uz8;57>53z?157<6?m16>495d`9>6=2=lh1v??6:18584693?;70<>a;342>;59j0om63=1d8g=>;5:90oo63=238gg>{t:921<7=t=332>41c3482;7j6;<0;0?b>3ty9=o4?:3y>646==916><m51648yv47?3:1?v3=11823a=::0<1hl522919`d=z{;;o6=4={<03b?37348:i7?86:p650=839p1?>i:05g?84>>3n270<73;f:?xu59o0;6?u221g915=::;:1=:84}r031?6=;r79<h4>7e9>6<3=lh16>5<5d`9~w7462909w0<?d;73?845;3;<:6s|21694?5|5;:o6<9k;<0:1?b>3483>7j6;|q160<72;q6>=m5519>670=9><0q~<?3;297~;58j0:;i522869`<=::1;1h45rs362>5<5s48>o7;?;<07e?70l2wx>9>50;0x973e2<:01?:6:05g?xu5=;0;69u224`952b<5;;=6i74=33;>ag<5;;j6il4}r00b?6=:r799l4:0:?10=<6?m1v?;>:180842i3;<h63=198gf>;59h0om6s|22g94?4|5;?268>4=364>41c3ty99=4?:3y>60?=9>n01??n:e;8yv44l3:1>v3=59864>;5<?0:;i5rs36e>5<2s48>47?8d:?15f<c1279=h4ka:?165<cj279>?4kb:p66e=838p1?;8:428972228=o7p}=4d83>1}::<=1=:j4=33f>ad<5;8;6io4=301>ag<uz88n7>52z?113<28279894>7e9~w72c2908w0<:6;34`>;5:90o563=238g=>{t::k1<7<t=376>06<5;>86<9k;|q10f<72:q6>8;516f897442m301?<9:ec8yv4413:1>v3=55864>;5<;0:;i5rs36a>5<5s48>87?8d:?163<c12wx=ij50;0x94`>2<:01<k8:05g?xu6lj0;6?u21g:915=:9l<1=:j4}r3fb?6=<r7:j54>7e9>5d`=l016=o?5d`9>5g5=lk1v<jm:18187a?3?;70?j5;34`>{t9lo1<7=t=0d4>41c34;i=7jm;<3a7?bf3ty:hl4?:3y>5c0==916=h:516f8yv7bl3:1>v3>f7823a=:9k91h45rs0f:>5<5s4;m97;?;<3f7?70l2wx=hm50;7x94`228=o70?m5;f:?87e?3nj70?m9;fa?87ej3ni7p}>d983>7}:9o>19=521d0952b<uz;nn7>54z?2b1<6?m16=o95dc9>5g?=lh16=ol5d`9~w4b02909w0?i3;73?87b93;<h6s|1dc94?5|58l86<9k;<3a=?b>34;in7j6;|q2`3<72;q6=k<5519>5`6=9>n0q~?j9;297~;6n;0:;i521ca9`<=:9kl1hl5rs0f6>5<5s4;m=7;?;<3gb?70l2wx=h650;0x94`628=o70?mf;f:?xu5:o0;6?u225c915=:::21=:j4}r01a?6=:r79844:0:?172<6?m1v?<k:18184303?;70<<6;34`>{t:;i1<7<t=364>06<5;9>6<9k;|q16g<72;q6>985519>662=9>n0q~<=a;296~;5<<0><63=32823a=z{;826=4={<070?373488>7?8d:p67>=838p1?:<:428975628=o7p}=2683>7}::=819=52222952b<uz;h57>52z?2a2<2827:h>4>7e9~w4e?2909w0?j6;73?87c:3;<h6s|1b594?4|58o>68>4=0f2>41c3ty:o;4?:3y>5`2==916=i>516f8yv7d=3:1>v3>e2864>;6ko0:;i5rs0a7>5<5s4;n>7;?;<3`a?70l2wx=n=50;0x94c62<:01<mk:05g?xu6k;0;6?u21d2915=:9ji1=:j4}r3`5?6=:r7:hk4:0:?2gg<6?m1v<m?:18187cm3?;70?la;34`>{t9m>1<7?t=0ff>41c3ty9i?4?:4y>5a5==916>hm516f894>e2m301?6::e;896ge2:=0q~?ia;296~;6l;0><63>8c8233=z{8li6=4={<3g5?3734;3o7?86:p5ce=838p1<j?:42894>c28==7p}>fe83>7}:9jl19=5219g9520<uz;mi7>52z?2g`<2827:4k4>779~w4`a2909w0?ld;73?87>83;<:6s|21294?4|58ih68>4=0;2>4113ty9<<4?:3y>5fd==916=4<51648yv47:3:1>v3>c`864>;61:0:;;5rs24b>5<3s48847;?;<147?70l27:594k9:?0eg<392wx>8j50;0x97502<:01<7;:055?xu5=l0;6?u2224915=:90?1=:84}r06b?6=:r79?84:0:?2=3<6??1v?8?:181844<3?;70?67;342>{t:?;1<7<t=310>06<58336<99;|q127<72;q6>><5519>5<?=9><0q~<93;296~;5;80><63>9`8233=z{;<?6=4={<004?3734;2n7?86:p6`b=83;<w0<k8;64?84c?3><70<k5;64?84c<3><70<k6;64?84c;3><70<k2;64?84c83><70<lf;64?84c93><70<jc;64?84bj3><70<ja;64?84b13><70<j8;64?84b?3><70<j6;64?84b=3><70<j4;64?84b;3><70=nd;fa?841=3;<:63=9e8g=>{t:h=1<7<t=3f;>06<5;i86<99;|q1g`<72=q6>i6516f897cd2<:01?77:ea897e32m30q~<n6;296~;5l>0><63=c38233=z{;io6=4;{<0g3?70l279io4:0:?1==<cj279n44k9:p6d2=838p1?j::42897e728==7p}=cc83>1}::m?1=:j4=3g:>06<5;3<6il4=3`6>a?<uz8j?7>52z?1`1<28279nk4>779~w7ef290?w0<k4;34`>;5m10><63=978gg>;5j:0o56s|2`794?4|5;n=68>4=3a2>4113ty9on4?:5y>6a0=9>n01?kn:42897?02mi01?l8:e;8yv4f:3:1>v3=d2864>;5jl0:;;5rs3a:>5<3s48o?7?8d:?1a2<282795;4kb:?1f4<c12wx>l?50;0x97b52<:01?lk:055?xu5k10;69u22e0952b<5;o=68>4=3;6>ae<5;km6i74}r0:b?6=:r79h=4:0:?1fg<6??1v?m9:18784c83;<h63=e5864>;51=0on63=ac8g=>{t:0o1<7<t=3ae>06<5;hj6<99;|q1g0<72=q6>nh516f897c42<:01?7;:ec897g>2m30q~<n0;296~;5l80><63=bb8233=z{;i<6=4;{<0g5?70l279i84:0:?1=0<cj279mi4k9:p6g>=838p1?m<:5;897d?28==7p}=c583>7}::j91=?64=3a7>4113ty9n;4?:2y>6f4=<016>o65489>6g0=9><0q~<m9;297~;5k;0:>5522c:95=5<5;h26<99;|q1f1<72:q6>n?5489>6g0=<016>o:51648yv4e?3:1?v3=c0826==::k<1=5=4=3`4>4113ty9n?4?:2y>6f6=<016>o:5489>6g4=9><0q~<m5;297~;5k90:>5522c695=5<5;h>6<99;|q1f5<72:q6>oh5489>6g4=<016>o>51648yv4e;3:1?v3=bg826==::k81=5=4=3`0>4113ty9mh4?:2y>6gc=<016>o>5489>6dc=9><0q~<m1;297~;5jl0:>5522c295=5<5;h:6<99;|q1ef<72:q6>oj5489>6dc=<016>lm51648yv4fn3:1?v3=be826==::ho1=5=4=3ce>4113ty9ml4?:2y>6ge=<016>lm5489>6dg=9><0q~<nd;297~;5jj0:>5522`a95=5<5;ko6<99;|q1e=<72:q6>ol5489>6dg=<016>l651648yv4fj3:1?v3=bc826==::hk1=5=4=3ca>4113ty9m44?:2y>6gg=9;201?o7:0:0?84f13;<:6s|2d394?3|5;oi6<9k;<3;g?b>34;3n7jn;<0;1?be349jn7=:;|q1a5<72<q6>ho516f894>c2m301<6l:ec897>32mi01>om:268yv4cn3:19v3=e8823a=:91o1h45219f9`d=::1>1ho523``976=z{;nn6=4:{<0f<?70l27:4k4k9:?2<`<ci2794>4kc:?0eg<4:2wx>ij50;7x97c028=o70?60;f:?87?n3nj70<73;fa?85fj39:7p}=db83>0}::l<1=:j4=0;2>a?<583;6io4=3:1>ae<5:ki6>>4}r0gf?6==r79i84>7e9>5<4=l016=4?5d`9>6=4=lk16?ll52g9~w7bf290>w0<j4;34`>;61:0o563>938ge>;5080on63<ac81a>{t:m31<7:t=3g0>41c34;2?7jn;<0;5?bf349jn7<k;|q134<72:q6>;h5519>626==916>:<51648yv41n3:1>v3=6g823a=::>81h45rs34a>5<5s48=m7;?;<05g?70>2wx>;650;4x970f28=o70<9e;fa?841k3ni70<82;fa?841>3n270<95;fa?xu5>m0;6?u227;915=::?o1=:84}r053?6=>r79:44>7e9>63c=l016>;m5d`9>624=lh16>;85d`9>633=lj1v?66:18184?m3>270<7d;342>{t:091<7<t=3:f>4>4348247?86:p6<g=838p1?6j:055?84>l3nj7p}=8983>7}::1n1845229a9520<uz82>7>52z?1<a<60:16>4951648yv4??3:1>v3=8b87=>;50k0:;;5rs3;2>5<5s483o7?73:?1=3<6??1v?69:18184?j3>270<7a;342>{t:0:1<7<t=3:a>4>4348297?86:p6=`=838p1?6n:0:0?84><3;<:6s|26494?4|5;=i6974=35b>4113ty94=4?:3y>62d=91901?6::055?xu5100;6?u226`9520<5;3o6il4}r041?6=:r79;l4;9:?13<<6??1v?9i:181840i3;3?63=858233=z{;=?6=4={<04=?2>348<47?86:p62c=838p1?96:0:0?84?;3;<:6s|26194?4|5;=36974=354>4113ty9;i4?:3y>62>=91901?6=:055?xu5?j0;6?u226595=5<5;2:6<99;|q041<72;q6?=75489>75>=9><0q~=?e;296~;4800:4>523019520<uz9:97>52z?04<<6??16?<75db9~w6642909w0=?8;6:?857?3;<:6s|31f94?4|5::36<6<;<126?70>2wx?=<50;0x96602=301>>9:055?xu48j0;6?u231595=5<5:;:6<99;|q044<72;q6?=85489>753=9><0q~=?b;296~;48?0:4>523029520<uz9;m7>52z?040<60:16?=h51648yv4a93:1>v3=f787=>;5n<0:;;5rs3da>5<5s48m:7?73:?045<6??1v>?;:18184a>3;<:63<188gf>{t:o:1<7<t=3d6>1?<5;l?6<99;|q1bd<72;q6>k;5191897`a28==7p}=eg83>7}::o>184522g19520<uz8m57>52z?1b1<60:16>kk51648yv4bm3:1>v3=f287=>;5n;0:;;5rs3d;>5<5s48m?7?73:?1ba<6??1v?h8:18184a:3;3?63=fb8233=z{:=?6=4>ez?01g<3?278944;7:?01d<3?2789n4;7:?01a<3?2789h4;7:?01c<3?278:=4;7:?024<3?2788k4;7:?00`<3?2788n4;7:?00g<3?2788i4;7:?00d<3?278844;7:?002<3?278854;7:?036<3?278;?4;7:?034<3?278;=4;7:?02c<3?278:h4;7:?02a<3?278:n4;7:?02g<3?278=l4>779>7dd=;j201>om:bc8yv5383:18v3<5c864>;4<00:;i523029`f=:;;31h45rs271>5<4s49>n7?8d:?02a<28279ji4kc:p76c=83>p1>;6:428962028=o70=?f;f`?855=3n27p}<5183>6}:;<31=:j4=24a>06<5;lh6im4}r10b?6=<r789l4:0:?00=<6?m16?=h5d`9>771=l01v>;>:180852i3;<h63<6b864>;5nj0om6s|35394?2|5:?h68>4=26b>41c349:<7jn;<11f?b>3ty89>4?:2y>70e=9>n01>8j:42897`c2mk0q~=;2;290~;4=m0><63<4c823a=:;8;1hn5233f9`<=z{:??6=4<{<16`?70l278:k4:0:?1b`<ck2wx?9=50;6x963b2<:01>:l:05g?85693nj70==f;f:?xu4=<0;6>u234g952b<5:=;68>4=3df>ag<uz9?87>54z?01c<282788i4>7e9>744=lj16?>?5d89~w6312908w0=:f;34`>;4?80><63=fg8gg>{t;=?1<7:t=243>06<5:>n6<9k;<126?bf3498?7j6;|q012<72:q6?;>516f896152<:01?hi:ec8yv53>3:18v3<60864>;4<o0:;i523019`<=:;:n1h45rs27;>5<4s49==7?8d:?036<28278<=4k9:p775=838p1>:i:428965d28==7p}<2383>7}:;=o19=5232`9520<uz99<7>52z?00f<28278?44>779~w67a2909w0=;b;73?85403;<:6s|33394?4|5:>o68>4=21b>4113ty8=h4?:3y>71g==916?>951648yv56l3:1>v3<48864>;4;?0:;;5rs23a>5<5s49?;7;?;<100?70>2wx?<m50;0x962?2<:01>=::055?xu4;;0;6?u232a90<=:;:81=:84}r10`?6=:r78?n4>299>76b=9><0q~=<0;297~;4;k0?563<3387=>;4;90:;;5rs210>5<4s498n7?=8:?077<60:16?>=51648yv55m3:1?v3<3`87=>;4;90?563<2d8233=z{:9:6=4<{<10e?750278?=4>829>767=9><0q~==c;297~;4;00?563<2d87=>;4:j0:;;5rs20e>5<4s49857?=8:?06`<60:16??h51648yv55i3:1?v3<3987=>;4:j0?563<2`8233=z{:8o6=4<{<10<?750278>n4>829>77b=9><0q~==8;297~;4;>0?563<2`87=>;4:10:;;5rs20a>5<4s498;7?=8:?06d<60:16??l51648yv55>3:1?v3<3787=>;4:10?563<278233=z{:826=4<{<102?750278>54>829>77?=9><0q~==4;297~;4;<0?563<2787=>;4:=0:;;5rs204>5<4s49897?=8:?063<60:16??951648yv55=3:1?v3<35826==:;;>1=5=4=206>4113ty8:44?:5y>724=9>n01<7::e;894?32mk01>om:2d8yv5103:18v3<70823a=:90<1h4521879`d=:;hh1?h5rs244>5<3s49<<7?8d:?2=2<c127:5;4ka:?0eg<4l2wx?;850;6x960a28=o70?68;f:?87>?3nj70=nb;1`?xu4><0;69u237g952b<58326i74=0;;>ag<5:ki6>l4}r150?6=<r78:i4>7e9>5<g=l016=475d`9>7dd=;h1v>8<:187851k3;<h63>9c8g=>;61h0om63<ac80=>{t;?81<7=t=24a>41c34;2n7jn;<1bf?5?3ty8mh4?:01x96?72==01>6i:55896>b2==01>6k:55896>d2==01>6m:55896>f2==01>66:55896??2==01>78:55896?12==01>7::55896?32==01>7<:55896?52==01>7>:55896>?2==01>68:558970128==7p}<a083>7}:;0:19=523``9g6=z{:k;6=4={<1;b?37349jn77;;|q0=c<72;q6?5k5519>7dd=1;1v>7j:18185?l3?;70=nb;;2?xu41m0;6?u239a915=:;hh15=5rs2;`>5<5s493n7;?;<1bf?>a3ty85o4?:3y>7=g==916?ll58d9~w6?f2909w0=79;73?85fj33o7p}<a`83>7}:;0219=523``9=f=z{:k26=4={<1:3?37349jn7m>;|q0e=<72;q6?485519>7dd=1k1v>o8:18185>=3?;70=nb;;b?xu4i?0;6?u2386915=:;hh1545rs2c6>5<5s492?7;?;<1bf???3ty8m94?:3y>7<4==916?ll5969~w6g42909w0=61;73?85fj33=7p}<a383>7}:;1219=523``9=0=z{:326=4={<1;3?37349jn76k;|q0ef<72;q6?lj5164896ge2j30q~?<7;296~;5::0om63=23826<=z{8?86=4={<3ag?bf34;in7?=9:p672=838p1?<9:e`8974528==7p}>be83>7}:9kl1ho521c`9520<uty?n?4?:3y]0g4<5=>18o<4$2a0>4163ty?n44?:3y]0g?<5=>18o74$2a0>4153ty?m>4?:3y]0d5<5=>18l=4$2a0>4143ty?>54?:3y]052<5=>18=:4$2a0>4503ty?>;4?:3y]055<5=>18==4$2a0>4253ty?>84?:3y]054<5=>18=<4$2a0>42e3ty?>94?:3y]057<5=>18=?4$2a0>42c3ty?>>4?:3y]056<5=>18=>4$2a0>42b3ty?>?4?:3y]7c`<5=>1?kh4$2a0>42a3ty?>=4?:3y]7cb<5=>1?kj4$2a0>4373ty?=k4?:3y]7ce<5=>1?km4$2a0>4363ty?=h4?:3y]7cd<5=>1?kl4$2a0>4353ty?=i4?:3y]7cg<5=>1?ko4$2a0>4333ty?=n4?:3y]7c?<5=>1?k74$2a0>4323ty?=o4?:3y]7c><5=>1?k64$2a0>4313ty?=l4?:3y]7c1<5=>1?k94$2a0>4303ty?=44?:3y]7c0<5=>1?k84$2a0>43?3ty?=54?:3y]7c3<5=>1?k;4$2a0>43>3ty?=:4?:3y]7c2<5=>1?k:4$2a0>43f3ty?=84?:3y]7c4<5=>1?k<4$2a0>43e3ty?=94?:3y]7c7<5=>1?k?4$2a0>43d3ty?=>4?:3y]7c6<5=>1?k>4$2a0>43c3ty?=?4?:3y]7``<5=>1?hh4$2a0>43b3ty?=<4?:3y]7`c<5=>1?hk4$2a0>43a3ty?==4?:3y]7`b<5=>1?hj4$2a0>4073ty?<k4?:3y]7`e<5=>1?hm4$2a0>4063ty?<h4?:3y]7`d<5=>1?hl4$2a0>4053ty?<i4?:3y]7`g<5=>1?ho4$2a0>4043ty?<n4?:3y]7`?<5=>1?h74$2a0>4033ty?>k4?:3y]05g<5=>18=o4$2a0>4023ty?>h4?:3y]05?<5=>18=74$2a0>4013ty?>i4?:3y]05><5=>18=64$2a0>4003ty?>n4?:3y]051<5=>18=94$2a0>40?3ty?>o4?:3y]050<5=>18=84$2a0>40>3ty?>l4?:3y]053<5=>18=;4$2a0>40f3ty?>44?:3y]7cc<5=>1?kk4$2a0>40e3ty?><4?:3y]7c5<5=>1?k=4$2a0>40d3ty?=;4?:3y]7`><5=>1?h64$2a0>40c3ty?<o4?:3y]7`1<5=>1?h94$2a0>40b3ty?o94?:3y]0f2<5=>18n:4$2a0>40a3ty?n=4?:3y]0g6<5=>18o>4$2a0>4173ty?8o4?:3y]06?<5=>18>74$2a0>4513ty?844?:3y]06><5=>18>64$2a0>45?3ty?854?:3y]061<5=>18>94$2a0>45>3ty?8:4?:3y]060<5=>18>84$2a0>45f3ty?8;4?:3y]063<5=>18>;4$2a0>45e3ty?884?:3y]062<5=>18>:4$2a0>45d3ty?894?:3y]065<5=>18>=4$2a0>45c3ty?8>4?:3y]064<5=>18><4$2a0>45b3ty?994?:3y]017<5=>189?4$2a0>45a3ty?9>4?:3y]016<5=>189>4$2a0>4273ty?9?4?:3y]06`<5=>18>h4$2a0>4263ty?9<4?:3y]06c<5=>18>k4$2a0>4243ty?9=4?:3y]06b<5=>18>j4$2a0>4233ty?8k4?:3y]06e<5=>18>m4$2a0>4223ty?8h4?:3y]06d<5=>18>l4$2a0>4213ty?8i4?:3y]06g<5=>18>o4$2a0>4203ty?8n4?:3y]067<5=>18>?4$2a0>42?3ty?8?4?:3y]066<5=>18>>4$2a0>42>3ty?9n4?:3y]00e<5=>188m4$2a0>42f3ty?9;4?:3y]000<5=>18884$2a0>42d3twe4oh50;0xL6e33td3o=4?:3yK7f2<ug2h=7>52zJ0g1=zf1i96=4={I1`0>{i0j91<7<tH2a7?xh?k=0;6?uG3b68yk>d=3:1>vF<c59~j=e12909wE=l4:m<f1=838pD>m;;|l;g=<72;qC?n:4}o:`=?6=:rB8o95rn9ab>5<5sA9h86sa8b`94?4|@:i?7p`7cb83>7}O;j>0qc6ld;296~N4k=1vb5mj:181M5d<2we4nh50;0xL6e33td3h=4?:3yK7f2<ug2o=7>52zJ0g1=zf1n96=4={I1`0>{i0m91<7<tH2a7?xh?l=0;6?uG3b68yk>c=3:1>vF<c59~j=b12909wE=l4:m<a1=838pD>m;;|l;`=<72;qC?n:4}o:g=?6=:rB8o95rn9fb>5<5sA9h86sa8e`94?4|@:i?7p`7db83>7}O;j>0qc6kd;296~N4k=1vb5jj:181M5d<2we4ih50;0xL6e33td3i=4?:3yK7f2<ug2n=7>52zJ0g1=zf1o96=4={I1`0>{i0l91<7<tH2a7?xh?m=0;6?uG3b68yk>b=3:1>vF<c59~j=c12909wE=l4:m<`1=838pD>m;;|l;a=<72;qC?n:4}o:f=?6=:rB8o95rn9gb>5<5sA9h86sa8d`94?4|@:i?7p`7eb83>7}O;j>0qc6jd;296~N4k=1vb5kj:181M5d<2we4hh50;0xL6e33td3j=4?:3yK7f2<ug2m=7>52zJ0g1=zf1l96=4={I1`0>{i0o91<7<tH2a7?xh?n=0;6?uG3b68yk>a=3:1>vF<c59~j=`12909wE=l4:m<c1=838pD>m;;|l;b=<72;qC?n:4}o:e=?6=:rB8o95rn9db>5<5sA9h86sa8g`94?4|@:i?7p`85683>4}O;j>0qc964;295~N4k=1vb:7::182M5d<2we;4850;3xL6e33td<5:4?:0yK7f2<ug=247>51zJ0g1=zf>326=4>{I1`0>{i?0k1<7?tH2a7?xh01k0;6<uG3b68yk1>k3:1=vF<c59~j2?c290:wE=l4:m3<c=83;pD>m;;|l4=c<728qC?n:4}o5b4?6=9rB8o95rn6c2>5<6sA9h86sa7`094?7|@:i?7p`8a283>4}O;j>0qc9n4;295~N4k=1vb:o::182M5d<2we;l850;3xL6e33td<m:4?:0yK7f2<ug=j47>51zJ0g1=zf>k26=4>{I1`0>{i?hk1<7?tH2a7?xh0ik0;6<uG3b68yk1fk3:1=vF<c59~j2gc290:wE=l4:m3dc=83;pD>m;;|l4ec<728qC?n:4}o5a4?6=9rB8o95rn6`2>5<6sA9h86sa7c094?7|@:i?7p`8b283>4}O;j>0qc9m4;295~N4k=1vb:l::182M5d<2we;o850;3xL6e33td<n:4?:0yK7f2<ug=i47>51zJ0g1=zf>h26=4>{I1`0>{i?kk1<7?tH2a7?xh0jk0;6<uG3b68yk1ek3:1=vF<c59~j2dc290:wE=l4:m3gc=83;pD>m;;|l4fc<728qC?n:4}o5`4?6=9rB8o95rn6a2>5<6sA9h86sa7b094?7|@:i?7p`8c283>4}O;j>0qc9l4;295~N4k=1vb:m::182M5d<2we;n850;3xL6e33td<o:4?:0yK7f2<ug=h47>51zJ0g1=zf>i26=4>{I1`0>{i?jk1<7?tH2a7?xh0kk0;6<uG3b68yk1dk3:1=vF<c59~j2ec290:wE=l4:m3fc=83;pD>m;;|l4gc<728qC?n:4}o5g4?6=9rB8o95rn6f2>5<6sA9h86sa7e094?7|@:i?7p`8d283>4}O;j>0qc9k4;295~N4k=1vb:j::182M5d<2we;i850;3xL6e33td<h:4?:0yK7f2<ug=o47>51zJ0g1=zf>n26=4>{I1`0>{i?mk1<7?tH2a7?xh0lk0;6<uG3b68yk1ck3:1=vF<c59~j2bc290:wE=l4:m3ac=83;pD>m;;|l4`c<728qC?n:4}o5f4?6=9rB8o95rn6g2>5<6sA9h86sa7d094?7|@:i?7p`8e283>4}O;j>0qc9j4;295~N4k=1vb:k::182M5d<2we;h850;3xL6e33td<i:4?:0yK7f2<ug=n47>51zJ0g1=zf>o26=4>{I1`0>{i?lk1<7?tH2a7?xh0mk0;6<uG3b68yk1bk3:1=vF<c59~j2cc290:wE=l4:m3`c=83;pD>m;;|l4ac<728qC?n:4}o5e4?6=9rB8o95rn6d2>5<6sA9h86sa7g094?7|@:i?7p`8f283>4}O;j>0qc9i4;295~N4k=1vb:h::182M5d<2we;k850;3xL6e33td<j:4?:0yK7f2<ug=m47>51zJ0g1=zf>l26=4>{I1`0>{i?ok1<7?tH2a7?xh0nk0;6<uG3b68yk1ak3:1=vF<c59~j2`c290:wE=l4:m3cc=83;pD>m;;|l4bc<728qC?n:4}o:34?6=9rB8o95rn922>5<6sA9h86sa81094?7|@:i?7p`70283>4}O;j>0qc6?4;295~N4k=1vb5>::182M5d<2we4=850;3xL6e33td3<:4?:0yK7f2<ug2;47>51zJ0g1=zf1:26=4>{I1`0>{i09k1<7?tH2a7?xh?8k0;6<uG3b68yk>7k3:1=vF<c59~j=6c290:wE=l4:m<5c=83;pD>m;;|l;4c<728qC?n:4}o:24?6=9rB8o95rn932>5<6sA9h86sa80094?7|@:i?7p`71283>4}O;j>0qc6>4;295~N4k=1vb5?::182M5d<2we4<850;3xL6e33td3=:4?:0yK7f2<ug2:47>51zJ0g1=zf1;26=4>{I1`0>{i08k1<7?tH2a7?xh?9k0;6<uG3b68yk>6k3:1=vF<c59~j=7c290:wE=l4:m<4c=83;pD>m;;|l;5c<728qC?n:4}o:14?6=9rB8o95rn902>5<6sA9h86sa83094?7|@:i?7p`72283>4}O;j>0qc6=4;295~N4k=1vb5<::182M5d<2we4?850;3xL6e33td3>:4?:0yK7f2<ug2947>51zJ0g1=zf1826=4>{I1`0>{i0;k1<7?tH2a7?xh?:k0;6<uG3b68yk>5k3:1=vF<c59~j=4c290:wE=l4:m<7c=83;pD>m;;|l;6c<728qC?n:4}o:04?6=9rB8o95rn912>5<6sA9h86sa82094?7|@:i?7p`73283>4}O;j>0qc6<4;295~N4k=1vb5=::182M5d<2we4>850;3xL6e33td3?:4?:0yK7f2<ug2847>51zJ0g1=zf1926=4>{I1`0>{i0:k1<7?tH2a7?xh?;k0;6<uG3b68yk>4k3:1=vF<c59~j=5c290:wE=l4:m<6c=83;pD>m;;|l;7c<728qC?n:4}o:74?6=9rB8o95rn962>5<6sA9h86sa85094?7|@:i?7p`74283>4}O;j>0qc6;4;295~N4k=1vb5:::182M5d<2we49850;3xL6e33td38:4?:0yK7f2<ug2?47>51zJ0g1=zf1>26=4>{I1`0>{i0=k1<7?tH2a7?xh?<k0;6<uG3b68yk>3k3:1=vF<c59~j=2c290:wE=l4:m<1c=83;pD>m;;|l;0c<728qC?n:4}o:64?6=9rB8o95rn972>5<6sA9h86sa84094?7|@:i?7p`75283>4}O;j>0qc6:4;295~N4k=1vb5;::182M5d<2we48850;3xL6e33td39:4?:0yK7f2<ug2>47>51zJ0g1=zf1?26=4>{I1`0>{i0<k1<7?tH2a7?xh?=k0;6<uG3b68yk>2k3:1=vF<c59~j=3c290:wE=l4:m<0c=83;pD>m;;|l;1c<728qC?n:4}o:54?6=9rB8o95rn942>5<6sA9h86sa87094?7|@:i?7p`76283>4}O;j>0qc694;295~N4k=1vb58::182M5d<2we4;850;3xL6e33td3::4?:0yK7f2<ug2=47>51zJ0g1=zf1<26=4>{I1`0>{i0?k1<7?tH2a7?xh?>k0;6<uG3b68yk>1k3:1=vF<c59~j=0c290:wE=l4:m<3c=83;pD>m;;|l;2c<728qC?n:4}o:44?6=9rB8o95rn952>5<6sA9h86sa86094?7|@:i?7p`77283>4}O;j>0qc684;295~N4k=1vb59::182M5d<2we4:850;3xL6e33td3;:4?:0yK7f2<ug2<47>51zJ0g1=zf1=26=4>{I1`0>{i0>k1<7?tH2a7?xh??k0;6<uG3b68yk>0k3:1=vF<c59~j=1c290:wE=l4:m<2c=83;pD>m;;|l;3c<728qC?n:4}o:;4?6=9rB8o95rn9:2>5<6sA9h86sa89094?7|@:i?7p`78283>4}O;j>0qc674;295~N4k=1vb56::182M5d<2we45850;3xL6e33td34:4?:0yK7f2<ug2347>51zJ0g1=zf1226=4>{I1`0>{i01k1<7?tH2a7?xh?0k0;6<uG3b68yk>?k3:1=vF<c59~j=>c290:wE=l4:m<=c=83;pD>m;;|l;<c<728qC?n:4}o::4?6=9rB8o95rn9;2>5<6sA9h86sa88094?7|@:i?7p`79283>4}O;j>0qc664;295~N4k=1vb57::182M5d<2we44850;3xL6e33td35:4?:0yK7f2<ug2247>51zJ0g1=zf1326=4>{I1`0>{i00k1<7?tH2a7?xh?1k0;6<uG3b68yk>>k3:1=vF<c59~j=?c290:wE=l4:m<<c=83;pD>m;;|l;=c<728qC?n:4}o:b4?6=9rB8o95rn9c2>5<6sA9h86sa8`094?7|@:i?7p`7a283>4}O;j>0qc6n4;295~N4k=1vb5o::182M5d<2we4l850;3xL6e33td3m:4?:0yK7f2<ug2j47>51zJ0g1=zf1k26=4>{I1`0>{i0hk1<7?tH2a7?xh?ik0;6<uG3b68yk>fk3:1=vF<c59~j=gc290:wE=l4:m<dc=83;pD>m;;|l;ec<728qC?n:4}o:a4?6=9rB8o95rn9`2>5<6sA9h86sa8c094?7|@:i?7p`7b283>4}O;j>0qc6m4;295~N4k=1vb5l::182M5d<2we4o850;3xL6e33td3n:4?:0yK7f2<ug2i47>51zJ0g1=zf1h26=4>{I1`0>{i0kk1<7?tH2a7?xh?jk0;6<uG3b68yk>ek3:1=vF<c59~j=dc290:wE=l4:m<gc=83;pD>m;;|~yEFDsh<>69>i25f;exFGJr:vLM^t}AB \ No newline at end of file
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.v b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.v
new file mode 100644
index 000000000..b3d994ae8
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.v
@@ -0,0 +1,169 @@
+/*******************************************************************************
+* This file is owned and controlled by Xilinx and must be used *
+* solely for design, simulation, implementation and creation of *
+* design files limited to Xilinx devices or technologies. Use *
+* with non-Xilinx devices or technologies is expressly prohibited *
+* and immediately terminates your license. *
+* *
+* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" *
+* SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR *
+* XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION *
+* AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION *
+* OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS *
+* IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, *
+* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE *
+* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY *
+* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE *
+* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR *
+* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF *
+* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *
+* FOR A PARTICULAR PURPOSE. *
+* *
+* Xilinx products are not intended for use in life support *
+* appliances, devices, or systems. Use in such applications are *
+* expressly prohibited. *
+* *
+* (c) Copyright 1995-2009 Xilinx, Inc. *
+* All rights reserved. *
+*******************************************************************************/
+// The synthesis directives "translate_off/translate_on" specified below are
+// supported by Xilinx, Mentor Graphics and Synplicity synthesis
+// tools. Ensure they are correct for your synthesis tool(s).
+
+// You must compile the wrapper file fifo_xlnx_512x36_2clk_36to18.v when simulating
+// the core, fifo_xlnx_512x36_2clk_36to18. When compiling the wrapper file, be sure to
+// reference the XilinxCoreLib Verilog simulation library. For detailed
+// instructions, please refer to the "CORE Generator Help".
+
+`timescale 1ns/1ps
+
+module fifo_xlnx_512x36_2clk_36to18(
+ rst,
+ wr_clk,
+ rd_clk,
+ din,
+ wr_en,
+ rd_en,
+ dout,
+ full,
+ empty);
+
+
+input rst;
+input wr_clk;
+input rd_clk;
+input [35 : 0] din;
+input wr_en;
+input rd_en;
+output [17 : 0] dout;
+output full;
+output empty;
+
+// synthesis translate_off
+
+ FIFO_GENERATOR_V6_1 #(
+ .C_COMMON_CLOCK(0),
+ .C_COUNT_TYPE(0),
+ .C_DATA_COUNT_WIDTH(9),
+ .C_DEFAULT_VALUE("BlankString"),
+ .C_DIN_WIDTH(36),
+ .C_DOUT_RST_VAL("0"),
+ .C_DOUT_WIDTH(18),
+ .C_ENABLE_RLOCS(0),
+ .C_ENABLE_RST_SYNC(1),
+ .C_ERROR_INJECTION_TYPE(0),
+ .C_FAMILY("spartan3"),
+ .C_FULL_FLAGS_RST_VAL(0),
+ .C_HAS_ALMOST_EMPTY(0),
+ .C_HAS_ALMOST_FULL(0),
+ .C_HAS_BACKUP(0),
+ .C_HAS_DATA_COUNT(0),
+ .C_HAS_INT_CLK(0),
+ .C_HAS_MEMINIT_FILE(0),
+ .C_HAS_OVERFLOW(0),
+ .C_HAS_RD_DATA_COUNT(0),
+ .C_HAS_RD_RST(0),
+ .C_HAS_RST(1),
+ .C_HAS_SRST(0),
+ .C_HAS_UNDERFLOW(0),
+ .C_HAS_VALID(0),
+ .C_HAS_WR_ACK(0),
+ .C_HAS_WR_DATA_COUNT(0),
+ .C_HAS_WR_RST(0),
+ .C_IMPLEMENTATION_TYPE(2),
+ .C_INIT_WR_PNTR_VAL(0),
+ .C_MEMORY_TYPE(1),
+ .C_MIF_FILE_NAME("BlankString"),
+ .C_MSGON_VAL(1),
+ .C_OPTIMIZATION_MODE(0),
+ .C_OVERFLOW_LOW(0),
+ .C_PRELOAD_LATENCY(0),
+ .C_PRELOAD_REGS(1),
+ .C_PRIM_FIFO_TYPE("512x36"),
+ .C_PROG_EMPTY_THRESH_ASSERT_VAL(4),
+ .C_PROG_EMPTY_THRESH_NEGATE_VAL(5),
+ .C_PROG_EMPTY_TYPE(0),
+ .C_PROG_FULL_THRESH_ASSERT_VAL(509),
+ .C_PROG_FULL_THRESH_NEGATE_VAL(508),
+ .C_PROG_FULL_TYPE(0),
+ .C_RD_DATA_COUNT_WIDTH(10),
+ .C_RD_DEPTH(1024),
+ .C_RD_FREQ(1),
+ .C_RD_PNTR_WIDTH(10),
+ .C_UNDERFLOW_LOW(0),
+ .C_USE_DOUT_RST(1),
+ .C_USE_ECC(0),
+ .C_USE_EMBEDDED_REG(0),
+ .C_USE_FIFO16_FLAGS(0),
+ .C_USE_FWFT_DATA_COUNT(0),
+ .C_VALID_LOW(0),
+ .C_WR_ACK_LOW(0),
+ .C_WR_DATA_COUNT_WIDTH(9),
+ .C_WR_DEPTH(512),
+ .C_WR_FREQ(1),
+ .C_WR_PNTR_WIDTH(9),
+ .C_WR_RESPONSE_LATENCY(1))
+ inst (
+ .RST(rst),
+ .WR_CLK(wr_clk),
+ .RD_CLK(rd_clk),
+ .DIN(din),
+ .WR_EN(wr_en),
+ .RD_EN(rd_en),
+ .DOUT(dout),
+ .FULL(full),
+ .EMPTY(empty),
+ .BACKUP(),
+ .BACKUP_MARKER(),
+ .CLK(),
+ .SRST(),
+ .WR_RST(),
+ .RD_RST(),
+ .PROG_EMPTY_THRESH(),
+ .PROG_EMPTY_THRESH_ASSERT(),
+ .PROG_EMPTY_THRESH_NEGATE(),
+ .PROG_FULL_THRESH(),
+ .PROG_FULL_THRESH_ASSERT(),
+ .PROG_FULL_THRESH_NEGATE(),
+ .INT_CLK(),
+ .INJECTDBITERR(),
+ .INJECTSBITERR(),
+ .ALMOST_FULL(),
+ .WR_ACK(),
+ .OVERFLOW(),
+ .ALMOST_EMPTY(),
+ .VALID(),
+ .UNDERFLOW(),
+ .DATA_COUNT(),
+ .RD_DATA_COUNT(),
+ .WR_DATA_COUNT(),
+ .PROG_FULL(),
+ .PROG_EMPTY(),
+ .SBITERR(),
+ .DBITERR());
+
+
+// synthesis translate_on
+
+endmodule
+
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.veo b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.veo
new file mode 100644
index 000000000..e93be1591
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.veo
@@ -0,0 +1,51 @@
+/*******************************************************************************
+* This file is owned and controlled by Xilinx and must be used *
+* solely for design, simulation, implementation and creation of *
+* design files limited to Xilinx devices or technologies. Use *
+* with non-Xilinx devices or technologies is expressly prohibited *
+* and immediately terminates your license. *
+* *
+* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" *
+* SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR *
+* XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION *
+* AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION *
+* OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS *
+* IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, *
+* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE *
+* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY *
+* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE *
+* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR *
+* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF *
+* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *
+* FOR A PARTICULAR PURPOSE. *
+* *
+* Xilinx products are not intended for use in life support *
+* appliances, devices, or systems. Use in such applications are *
+* expressly prohibited. *
+* *
+* (c) Copyright 1995-2009 Xilinx, Inc. *
+* All rights reserved. *
+*******************************************************************************/
+// The following must be inserted into your Verilog file for this
+// core to be instantiated. Change the instance name and port connections
+// (in parentheses) to your own signal names.
+
+//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
+fifo_xlnx_512x36_2clk_36to18 YourInstanceName (
+ .rst(rst),
+ .wr_clk(wr_clk),
+ .rd_clk(rd_clk),
+ .din(din), // Bus [35 : 0]
+ .wr_en(wr_en),
+ .rd_en(rd_en),
+ .dout(dout), // Bus [17 : 0]
+ .full(full),
+ .empty(empty));
+
+// INST_TAG_END ------ End INSTANTIATION Template ---------
+
+// You must compile the wrapper file fifo_xlnx_512x36_2clk_36to18.v when simulating
+// the core, fifo_xlnx_512x36_2clk_36to18. When compiling the wrapper file, be sure to
+// reference the XilinxCoreLib Verilog simulation library. For detailed
+// instructions, please refer to the "CORE Generator Help".
+
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.xco b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.xco
new file mode 100644
index 000000000..d3115e7d5
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.xco
@@ -0,0 +1,84 @@
+##############################################################
+#
+# Xilinx Core Generator version 12.1
+# Date: Thu Aug 12 21:06:13 2010
+#
+##############################################################
+#
+# This file contains the customisation parameters for a
+# Xilinx CORE Generator IP GUI. It is strongly recommended
+# that you do not manually alter this file as it may cause
+# unexpected and unsupported behavior.
+#
+##############################################################
+#
+# BEGIN Project Options
+SET addpads = false
+SET asysymbol = false
+SET busformat = BusFormatAngleBracketNotRipped
+SET createndf = false
+SET designentry = Verilog
+SET device = xc3s2000
+SET devicefamily = spartan3
+SET flowvendor = Other
+SET formalverification = false
+SET foundationsym = false
+SET implementationfiletype = Ngc
+SET package = fg456
+SET removerpms = false
+SET simulationfiles = Behavioral
+SET speedgrade = -5
+SET verilogsim = true
+SET vhdlsim = false
+# END Project Options
+# BEGIN Select
+SELECT Fifo_Generator family Xilinx,_Inc. 6.1
+# END Select
+# BEGIN Parameters
+CSET almost_empty_flag=false
+CSET almost_full_flag=false
+CSET component_name=fifo_xlnx_512x36_2clk_36to18
+CSET data_count=false
+CSET data_count_width=9
+CSET disable_timing_violations=false
+CSET dout_reset_value=0
+CSET empty_threshold_assert_value=4
+CSET empty_threshold_negate_value=5
+CSET enable_ecc=false
+CSET enable_int_clk=false
+CSET enable_reset_synchronization=true
+CSET fifo_implementation=Independent_Clocks_Block_RAM
+CSET full_flags_reset_value=0
+CSET full_threshold_assert_value=509
+CSET full_threshold_negate_value=508
+CSET inject_dbit_error=false
+CSET inject_sbit_error=false
+CSET input_data_width=36
+CSET input_depth=512
+CSET output_data_width=18
+CSET output_depth=1024
+CSET overflow_flag=false
+CSET overflow_sense=Active_High
+CSET performance_options=First_Word_Fall_Through
+CSET programmable_empty_type=No_Programmable_Empty_Threshold
+CSET programmable_full_type=No_Programmable_Full_Threshold
+CSET read_clock_frequency=1
+CSET read_data_count=false
+CSET read_data_count_width=10
+CSET reset_pin=true
+CSET reset_type=Asynchronous_Reset
+CSET underflow_flag=false
+CSET underflow_sense=Active_High
+CSET use_dout_reset=true
+CSET use_embedded_registers=false
+CSET use_extra_logic=false
+CSET valid_flag=false
+CSET valid_sense=Active_High
+CSET write_acknowledge_flag=false
+CSET write_acknowledge_sense=Active_High
+CSET write_clock_frequency=1
+CSET write_data_count=false
+CSET write_data_count_width=9
+# END Parameters
+GENERATE
+# CRC: a4e70980
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.xise b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.xise
new file mode 100644
index 000000000..cfe983130
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18.xise
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
+
+ <header>
+ <!-- ISE source project file created by Project Navigator. -->
+ <!-- -->
+ <!-- This file contains project source information including a list of -->
+ <!-- project source files, project and process properties. This file, -->
+ <!-- along with the project source files, is sufficient to open and -->
+ <!-- implement in ISE Project Navigator. -->
+ <!-- -->
+ <!-- Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved. -->
+ </header>
+
+ <version xil_pn:ise_version="12.1" xil_pn:schema_version="2"/>
+
+ <files>
+ <file xil_pn:name="fifo_xlnx_512x36_2clk_36to18.ngc" xil_pn:type="FILE_NGC">
+ <association xil_pn:name="BehavioralSimulation"/>
+ <association xil_pn:name="Implementation"/>
+ </file>
+ <file xil_pn:name="fifo_xlnx_512x36_2clk_36to18.v" xil_pn:type="FILE_VERILOG">
+ <association xil_pn:name="BehavioralSimulation"/>
+ <association xil_pn:name="Implementation"/>
+ <association xil_pn:name="PostMapSimulation"/>
+ <association xil_pn:name="PostRouteSimulation"/>
+ <association xil_pn:name="PostTranslateSimulation"/>
+ </file>
+ </files>
+
+ <properties>
+ <property xil_pn:name="Auto Implementation Top" xil_pn:value="false" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Device" xil_pn:value="xc3s2000" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Device Family" xil_pn:value="Spartan3" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Stop View" xil_pn:value="PreSynthesis" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Top" xil_pn:value="Module|fifo_xlnx_512x36_2clk_36to18" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Top File" xil_pn:value="fifo_xlnx_512x36_2clk_36to18.ngc" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Top Instance Path" xil_pn:value="/fifo_xlnx_512x36_2clk_36to18" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Package" xil_pn:value="fg456" xil_pn:valueState="default"/>
+ <property xil_pn:name="Preferred Language" xil_pn:value="Verilog" xil_pn:valueState="default"/>
+ <property xil_pn:name="Project Generator" xil_pn:value="CoreGen" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Property Specification in Project File" xil_pn:value="Store all values" xil_pn:valueState="default"/>
+ <property xil_pn:name="Simulator" xil_pn:value="ISim (VHDL/Verilog)" xil_pn:valueState="default"/>
+ <property xil_pn:name="Speed Grade" xil_pn:value="-5" xil_pn:valueState="default"/>
+ <property xil_pn:name="Synthesis Tool" xil_pn:value="XST (VHDL/Verilog)" xil_pn:valueState="default"/>
+ <property xil_pn:name="Top-Level Source Type" xil_pn:value="HDL" xil_pn:valueState="default"/>
+ <property xil_pn:name="Working Directory" xil_pn:value="." xil_pn:valueState="non-default"/>
+ <!-- -->
+ <!-- The following properties are for internal use only. These should not be modified.-->
+ <!-- -->
+ <property xil_pn:name="PROP_DesignName" xil_pn:value="fifo_xlnx_512x36_2clk_36to18" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_DevFamilyPMName" xil_pn:value="spartan3" xil_pn:valueState="default"/>
+ <property xil_pn:name="PROP_intProjectCreationTimestamp" xil_pn:value="2010-08-12T14:06:16" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_intWbtProjectID" xil_pn:value="3646C65496E43142DA83C69469B5BF88" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_intWorkingDirLocWRTProjDir" xil_pn:value="Same" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_intWorkingDirUsed" xil_pn:value="No" xil_pn:valueState="non-default"/>
+ </properties>
+
+ <bindings/>
+
+ <libraries/>
+
+ <autoManagedFiles>
+ <!-- The following files are identified by `include statements in verilog -->
+ <!-- source files and are automatically managed by Project Navigator. -->
+ <!-- -->
+ <!-- Do not hand-edit this section, as it will be overwritten when the -->
+ <!-- project is analyzed based on files automatically identified as -->
+ <!-- include files. -->
+ </autoManagedFiles>
+
+</project>
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18_flist.txt b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18_flist.txt
new file mode 100644
index 000000000..54c85b15e
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18_flist.txt
@@ -0,0 +1,12 @@
+# Output products list for <fifo_xlnx_512x36_2clk_36to18>
+_xmsgs/pn_parser.xmsgs
+fifo_generator_ug175.pdf
+fifo_xlnx_512x36_2clk_36to18.gise
+fifo_xlnx_512x36_2clk_36to18.ngc
+fifo_xlnx_512x36_2clk_36to18.v
+fifo_xlnx_512x36_2clk_36to18.veo
+fifo_xlnx_512x36_2clk_36to18.xco
+fifo_xlnx_512x36_2clk_36to18.xise
+fifo_xlnx_512x36_2clk_36to18_flist.txt
+fifo_xlnx_512x36_2clk_36to18_readme.txt
+fifo_xlnx_512x36_2clk_36to18_xmdf.tcl
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18_readme.txt b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18_readme.txt
new file mode 100644
index 000000000..3efc586bf
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18_readme.txt
@@ -0,0 +1,47 @@
+The following files were generated for 'fifo_xlnx_512x36_2clk_36to18' in directory
+/home/ianb/ettus/sram_fifo/fpgapriv/usrp2/coregen/
+
+fifo_generator_ug175.pdf:
+ Please see the core data sheet.
+
+fifo_xlnx_512x36_2clk_36to18.gise:
+ ISE Project Navigator support file. This is a generated file and should
+ not be edited directly.
+
+fifo_xlnx_512x36_2clk_36to18.ngc:
+ Binary Xilinx implementation netlist file containing the information
+ required to implement the module in a Xilinx (R) FPGA.
+
+fifo_xlnx_512x36_2clk_36to18.v:
+ Verilog wrapper file provided to support functional simulation.
+ This file contains simulation model customization data that is
+ passed to a parameterized simulation model for the core.
+
+fifo_xlnx_512x36_2clk_36to18.veo:
+ VEO template file containing code that can be used as a model for
+ instantiating a CORE Generator module in a Verilog design.
+
+fifo_xlnx_512x36_2clk_36to18.xco:
+ CORE Generator input file containing the parameters used to
+ regenerate a core.
+
+fifo_xlnx_512x36_2clk_36to18.xise:
+ ISE Project Navigator support file. This is a generated file and should
+ not be edited directly.
+
+fifo_xlnx_512x36_2clk_36to18_readme.txt:
+ Text file indicating the files generated and how they are used.
+
+fifo_xlnx_512x36_2clk_36to18_xmdf.tcl:
+ ISE Project Navigator interface file. ISE uses this file to determine
+ how the files output by CORE Generator for the core can be integrated
+ into your ISE project.
+
+fifo_xlnx_512x36_2clk_36to18_flist.txt:
+ Text file listing all of the output files produced when a customized
+ core was generated in the CORE Generator.
+
+
+Please see the Xilinx CORE Generator online help for further details on
+generated files and how to use them.
+
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18_xmdf.tcl b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18_xmdf.tcl
new file mode 100644
index 000000000..5161c1826
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_36to18_xmdf.tcl
@@ -0,0 +1,68 @@
+# The package naming convention is <core_name>_xmdf
+package provide fifo_xlnx_512x36_2clk_36to18_xmdf 1.0
+
+# This includes some utilities that support common XMDF operations
+package require utilities_xmdf
+
+# Define a namespace for this package. The name of the name space
+# is <core_name>_xmdf
+namespace eval ::fifo_xlnx_512x36_2clk_36to18_xmdf {
+# Use this to define any statics
+}
+
+# Function called by client to rebuild the params and port arrays
+# Optional when the use context does not require the param or ports
+# arrays to be available.
+proc ::fifo_xlnx_512x36_2clk_36to18_xmdf::xmdfInit { instance } {
+# Variable containg name of library into which module is compiled
+# Recommendation: <module_name>
+# Required
+utilities_xmdf::xmdfSetData $instance Module Attributes Name fifo_xlnx_512x36_2clk_36to18
+}
+# ::fifo_xlnx_512x36_2clk_36to18_xmdf::xmdfInit
+
+# Function called by client to fill in all the xmdf* data variables
+# based on the current settings of the parameters
+proc ::fifo_xlnx_512x36_2clk_36to18_xmdf::xmdfApplyParams { instance } {
+
+set fcount 0
+# Array containing libraries that are assumed to exist
+# Examples include unisim and xilinxcorelib
+# Optional
+# In this example, we assume that the unisim library will
+# be magically
+# available to the simulation and synthesis tool
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type logical_library
+utilities_xmdf::xmdfSetData $instance FileSet $fcount logical_library unisim
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_generator_ug175.pdf
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type AnyView
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_36to18.ngc
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type ngc
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_36to18.v
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type verilog
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_36to18.veo
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type verilog_template
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_36to18.xco
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type coregen_ip
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_36to18_xmdf.tcl
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type AnyView
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount associated_module fifo_xlnx_512x36_2clk_36to18
+incr fcount
+
+}
+
+# ::gen_comp_name_xmdf::xmdfApplyParams
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.gise b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.gise
new file mode 100644
index 000000000..9abec8c3e
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.gise
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<generated_project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
+
+ <!-- -->
+
+ <!-- For tool use only. Do not edit. -->
+
+ <!-- -->
+
+ <!-- ProjectNavigator created generated project file. -->
+
+ <!-- For use in tracking generated file and other information -->
+
+ <!-- allowing preservation of process status. -->
+
+ <!-- -->
+
+ <!-- Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved. -->
+
+ <version xmlns="http://www.xilinx.com/XMLSchema">11.1</version>
+
+ <sourceproject xmlns="http://www.xilinx.com/XMLSchema" xil_pn:fileType="FILE_XISE" xil_pn:name="fifo_xlnx_512x36_2clk_prog_full.xise"/>
+
+ <files xmlns="http://www.xilinx.com/XMLSchema">
+ <file xil_pn:fileType="FILE_VEO" xil_pn:name="fifo_xlnx_512x36_2clk_prog_full.veo" xil_pn:origination="imported"/>
+ </files>
+
+ <transforms xmlns="http://www.xilinx.com/XMLSchema"/>
+
+</generated_project>
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.ngc b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.ngc
new file mode 100644
index 000000000..9cb73d5ce
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.ngc
@@ -0,0 +1,3 @@
+XILINX-XDB 0.1 STUB 0.1 ASCII
+XILINX-XDM V1.6e
+$4cb40<,[o}e~g`n;"2*726&;$9,)?40893456789:;8=5?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>?0123456789:;<=>;;1A3<4=6;2;%<<5=4:0076753:81EC^ZT;FJE956294:>6==:HLSQQ<CAK68=7>112906?IR\Y__6IAN<2394;743:81CXZ_UU8GKG:493:5=?5<6;KMTPR=l`d7?84?>06873<H]]Z^X7j`uu>01?69l29x>=>?ff662(363=>08=HI1097>LHW]]0OE]O33;2=54=32@D[YY4KIQ@?7?699;1?6B[[PTV9@JVF4:0;2<<44;MVPUSS2ME[N1=50?68102792<97;7;;7;:24=?<22;<=:48D:B5>?330:;5?56659:23?6:231EC^ZT;CG@WG;03:5=?56:HLSQQ<FLMXI054?>0g8=?OIX\^1|ah_dosp|Ys`{oxd1650?06?<<NFY__6}|`g^gntqX|axneQnsrgqp9>=878>744FNQWW>uthoVof|ywPtipfwmYimnki1650?3g?<<NFY__6}|`g^dvhiYs`{oxd1650?07?<<NFY__6}|`g^dvhiYs`{oxdRo|sdpw8=<76;>057GAPTV9twi`Wog`Rzgrdqk[kc`i}o747>1199:>JSSX\^1hlzn_bmvjq:?294:n675OTVSQQ<ulVnjxlQlotlw8=<768h057AZTQWW>rtXlh~jSnaznu>;>5853H837LJKR@>3:==FLMXJ0<07;@FGVD:5611JHI\N<2<;?DBCZH6?255NDEPB808?3HNO^L29>99B@ATF4>4j7LJKR@>;>58?3HNO^L27>99B@ATE49437LJKRC>2:==FLMXI0?07;@FGVG:4611JHI\M<5<;?DBCZK6>255NDEPA838?3HNO^O28>`9B@ATE410;255NDEPA8=843HFG56O\YOA\V@A63K90NX<7;CWP[LHAG81H>6MJ139@L@ELWECHIC]J_U[SA7=DA=1H@FO;;BNHF6=DD[30OBCBIUVF@42<KFXNSJKAESCWMJHXAGLD;6M]E@VF@4=C:2NH>6JF6:FJE969?2NBM1??>69GMD:697=0HDO313<4?AOF4895;6JFA=37:2=CAH6:9394DHC?53803MCJ0<917:FJE97?6>1OEL2>9?48@LG;97=0HDO321<4?AOF4;;5;6JFA=01:2=CAH69?394DHC?61803MCJ0?;17:FJE9416>1OEL2=7?58@LG;:14<7IGN<3;=2>BNI585;6JFA=13:<=CAH68=7>17:FJE9566?1OEL2<>79GMD:36?1OEL2:>79GMD:16?1OEL28>79GMD:?6?1OEL26>79GMG:76>1OEO2>0?58@LD;984<7IGM<00=3>BNJ5;82:5KIC>20;1<L@H7=808;EKA8409?2NBN1?8>69GMG:607=0HDL318<5?AOE484<7IGM<32=3>BNJ58:2:5KIC>16;1<L@H7>>08;EKA8729?2NBN1<:>69GMG:5>7=0HDL326<4?AOE4;25;6JFB=0::3=CAK692:5KIC>04;?<L@H7?<4?>69GMG:497<0HDL33?48@LD;<7<0HDL35?48@LD;>7<0HDL37?48@LD;07<0HDL39?58@LVF494<7IG_A=3=3>BNXH69245KIQC?7?69?2NB\L2<>69GMUD;87=0HD^M<0<4?AOWJ58556JFPC>0>5803MC[N1=16:FLE969?2NDM1??>69GKD:697=0HBO313<4?AIF4895;6J@A=37:2=CGH6:9394DNC?53803MEJ0<917:FLE97?6>1OCL2>9?48@JG;97=0HBO321<4?AIF4;;5;6J@A=01:2=CGH69?394DNC?61803MEJ0?;17:FLE9416>1OCL2=7?58@JG;:14<7IAN<3;=2>BHI585;6J@A=13:<=CGH68=7>17:FLE9566?1OCL2<>79GKD:36?1OCL2:>79GKD:16?1OCL28>79GKD:?6?1OCL26>69GKDYUMN<0HBL30?58@JD;994<7IAM<03=3>BHJ5;92:5KOC>27;1<LFH7=908;EMA8439?2NDN1?9>69GKG:6?7=0HBL319<4?AIE4835:6J@B=3=3>BHJ58;2:5KOC>15;1<LFH7>?08;EMA8759?2NDN1<;>69GKG:5=7=0HBL327<4?AIE4;=5;6J@B=0;:2=CGK695384DN@?6;1<LFH7?=06;EMA867=87=0HBL330<5?AIE4:4=7IAM<5<5?AIE4<4=7IAM<7<5?AIE4>4=7IAM<9<5?AIE404<7IAM_SGD3>BHXH6;2:5KOQC?5;1<LFZJ0?06;EMSE95=87=0HB^N<2<4?AIWJ5:5;6J@PC>2:2=CGYH7>374DNRA86<76>1OC]L33?18AKG43LDIn6KA_DA@[WCFLj1NBRKLC^UQMQC53O897K6:;GCOW@4<NM90JIM;;GF@A6=ALY>0JI^J4:DGV@7<O:1LBI<4I108M44<A;80E>64IOKWTZ6702CEEY^P00:8MKOSXV:946GAIUR\46><AGC_\R>;8:KMMQVX8<20ECG[P^25<>OIA]ZT<:74IOKWWQGSM>1BBDZP0158MKOSW9;<7D@FT^213>OIA]U;?:5FNHV\411<AGC_S=;8;HLJPZ61?2CEEYQ?769JJLRX81=0ECG[_1;4?LHN\V:J;6GAIU]3F2=NF@^T<N94IOKW[5B03@DBXR>J7:KMMQY7N>1BBDZP1158MKOSW8;<7D@FT^313>OIA]U:?:5FNHV\511<AGC_S<;8;HLJPZ71?2CEEYQ>769JJLRX91=0ECG[_0;4?LHN\V;J;6GAIU]2F2=NF@^T=N94IOKW[4B03@DBXR?J7:KMMQY6N>1BBDZP2158MKOSW;;<7D@FT^013>OIA]U9?:5FNHV\611<AGC_S?;8;HLJPZ41?2CEEYQ=769JJLRX:1=0ECG[_3;4?LHN\V8J;6GAIU]1F2=NF@^T>N94IOKW[7B03@DBXR<J7:KMMQY5N>1BBDZP3158MKOSW:;<7D@FT^113>OIA]U8?:5FNHV\711<AGC_S>;8;HLJPZ51?2CEEYQ<769JJLRX;1=0ECG[_2;4?LHN\V9J;6GAIU]0F2=NF@^T?N94IOKW[6B03@DBXR=J7:KMMQY4N?1BBDZPA79JJLRXJ;1GE?5CO79OKDBBL>1GCJGLAM68HPR6<2F^X?:4LTV00>JR\=<0@XZ;_E48HPR3WE?0A^I@N49NQ]E^k2Gjfb|Yesqjkke<E`dd~[k}shmm6>H7:2D:86@>0768J460<2D:<5:4N02:7>H69=1E=<>;;O3251=I988?7C?>359M54233G;:995A1047?K76?=1E=<6;;O32=6=I9;>0B<<?4:L2642<F88986@>2268J443<2D:>8:4N0050>H6:>>0B<<74:L26<5<F89?7C?<059M56733G;8>95A1217?K74<=1E=>;;;O3021=I9:=?7C?<859M56?43G;?86@>4168J426<2D:8?:4N0600>H6<?90B<;<;O357>H6?=1E=:9<;O3;7>H61:1E>==4N330?K45;2D9?>5A2518J7343G8=?6@=729M6=5<F;387C=?3:L056=I;;90B>=<;O177>H4=:1E?;=4N250?K5?;2D85>5A4118J1743G>9?6@;329M015<F=?87C:93:L736=I<180B8<4N608J<`<FKUIY^^FN^RQKUU03GO_[B\D1:M1?JM63Y>0\L\[a:RJJZDR[@NSn6^FN^@VWKGJM:1[^H?4Q09Qa>TFEK;=S^=9_R15e>TBIMUME_][c:PFEAYPAM^CSLm4RDCG[ROC\AUI=6]>3:QJIZEHDECXEB@PCIG@O3=TG\XHI:5\RWCO[D1<[[\J@RL;;RQQE1=T[[H?7YW_E208Q5)`zo$yj"ilx/aoo})JpfxT~iQnup\cfYg{:;<=Q]erwop4553\:$kh!rg-dg}(ddbr$Aua}_sf\tkruWniTtb|?013\V`urd};8>6[?/fpe*w`(ojr%oaew/LzlvZtcWyd~Ril_ymq4565W[oxyaz>339V4*aun'xm#jmw.bnh|*Kg{UyhR~ats]dgZ~hz9:;?R\jstnw564<]9%l~k }f.e`|+ekcq%Ftb|Pre]sjqtXojUsc>?05]Qavsk|8997X> gsd-vc)`kq$h`fv Mymq[wbXxg~ySjmPxnp3453XZly~`y?<2:W3+bta&{l$knv!cmi{+H~hzVxoS}`{r^e`[}iu89:=S_k|umv277=R8&myj#|i/fa{*fjlp&GscQ}d^rmpwY`kVrd~=>?7^Pfwpjs9:80Y=!hrg,qb*adp'iggu!Bxnp\swYwf}xTknQwos2345YUmzgx<==;T2,cw`)zo%lou lljz,I}iuW~xT|cz}_fa\|jt789;T^h}zlu306>S7'nxm"h gbz-gim'Drd~Ry}_qlwvZadWqey<=>=_Sgpqir6;;1^<"i}f/pe+be&jf`t"Cwos]tvZvi|{UloRv`r1237ZTb{|f=><4U1-dvc(un&mht#mcky-N|jtX{U{by|Pgb]{kw678=UYi~{ct011?P6(o{l%~k!hcy,`hn~(EqeySz|Ppovq[beXpfx;<=;PRdqvhq74:2_;#j|i.sd,cf~)keas#@v`r^uq[uhszVmhSua}0125[Wct}e~:??5Z0.eqb+ta'nis"nbdx.O{kwYpzVzexQhc^zlv567?VXnxb{1338Q5)`zo$yj"ilx/aoo})ulVzexQmio>3:77<]9%l~k }f.e`|+ekcq%yhR~ats]amk:66;;0Y=!hrg,qb*adp'iggu!}d^rmpwYeag692??4U1-dvc(un&mht#mcky-q`Zvi|{Uiec2<>338Q5)`zo$yj"ilx/aoo})ulVzexQmio>7:77<]9%l~k }f.e`|+ekcq%yhR~ats]amk:26;;0Y=!hrg,qb*adp'iggu!}d^rmpwYeag6=2??4U1-dvc(un&mht#mcky-q`Zvi|{Uiec28>338Q5)`zo$yj"ilx/aoo})ulVzexQmio>;:76<]9%l~k }f.e`|+ekcq%yhR~ats]amkY7:91^<"i}f/pe+be&jf`t"|k_qlwvZdnfV;9<6[?/fpe*w`(ojr%oaew/sf\tkruWkceS?<?;T2,cw`)zo%lou lljz,vaYwf}xTnd`P3328Q5)`zo$yj"ilx/aoo})ulVzexQmio]765=R8&myj#|i/fa{*fjlp&xoS}`{r^`jjZ3582_;#j|i.sd,cf~)keas#jPpovq[goiW?8;7X> gsd-vc)`kq$h`fv re]sjqtXj`dT;?>4U1-dvc(un&mht#mcky-q`Zvi|{UiecQ7279V4*aun'xm#jmw.bnh|*tcWyd~Rlfn^zlv5678;=0Y=!hrg,qb*adp'iggu!}d^rmpwYeagUsc>?01312>S7'nxm"h gbz-gim'{nT|cz}_ckm[}iu89::>:5Z0.eqb+ta'nis"nbdx.pg[uhszVhbbRv`r12354413\:$kh!rg-dg}(ddbr$~iQnup\flhXpfx;<=<=7:W3+bta&{l$knv!cmi{+wbXxg~ySoga_ymq45659;<0Y=!hrg,qb*adp'iggu!}d^rmpwYeagUsc>?0204?P6(o{l%~k!hcy,`hn~(zmU{by|Pbhl\|jt78999>;5Z0.eqb+ta'nis"nbdx.pg[uhszVhbbRv`r123071<]9%l~k }f.e`|+ekcq%yhR~ats]amkYg{:;<9?=6:W3+bta&{l$knv!cmi{+wbXxg~ySoga_ymq4562:>1^<"i}f/pe+be&jf`t"|k_qlwvZdnfVrd~=>?5005?P6(o{l%~k!hcy,`hn~(zmU{by|Pbhl\|jt789<946[?/fpe*w`(ojr%oaew/sf\tkruWkceSua}012554403\:$kh!rg-dg}(ddbr$~iQnup\flhXpfx;<=8=2c9V4*aun'xm#jmw.bnh|*tcWyd~Rlfn^zlv567>Vhoh=<9;T2,cw`)zo%lou lljz,vaYwf}xTnd`Pxnp34515?2_;#j|i.sd,cf~)keas#jPpovq[goiWqey<=>81328Q5)`zo$yj"ilx/aoo})ulVzexQhc=2=65=R8&myj#|i/fa{*fjlp&xoS}`{r^e`848582_;#j|i.sd,cf~)keas#jPpovq[be;:78;7X> gsd-vc)`kq$h`fv re]sjqtXoj682?>4U1-dvc(un&mht#mcky-q`Zvi|{Ulo1:1219V4*aun'xm#jmw.bnh|*tcWyd~Ril<4<14>S7'nxm"h gbz-gim'{nT|cz}_fa?2;473\:$kh!rg-dg}(ddbr$~iQnup\cf:06;:0Y=!hrg,qb*adp'iggu!}d^rmpwY`k525=k5Z0.eqb+ta'nis"nbdx.pg[uhszVmhS=?i;T2,cw`)zo%lou lljz,vaYwf}xTknQ>1g9V4*aun'xm#jmw.bnh|*tcWyd~Ril_33e?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]05c=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[17a3\:$kh!rg-dg}(ddbr$~iQnup\cfY29o1^<"i}f/pe+be&jf`t"|k_qlwvZadW?;m7X> gsd-vc)`kq$h`fv re]sjqtXojU<=k5Z0.eqb+ta'nis"nbdx.pg[uhszVmhS5<9;T2,cw`)zo%lou lljz,vaYwf}xTknQnssgd8585>2_;#j|i.sd,cf~)keas#jPpovq[beXizxnk1?1279V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqab:56;<0Y=!hrg,qb*adp'iggu!}d^rmpwY`kVkx~hi33?05?P6(o{l%~k!hcy,`hn~(zmU{by|Pgb]bwwc`4=49:6[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg=7=63=R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumn6=2?84U1-dvc(un&mht#mcky-q`Zvi|{UloRo|rde?3;413\:$kh!rg-dg}(ddbr$~iQnup\cfYf{{ol050=5:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfcZ65=2_;#j|i.sd,cf~)keas#jPpovq[beXizxnkR?=5:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfcZ45=2_;#j|i.sd,cf~)keas#jPpovq[beXizxnkR==5:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfcZ25=2_;#j|i.sd,cf~)keas#jPpovq[beXizxnkR;=5:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfcZ05=2_;#j|i.sd,cf~)keas#jPpovq[beXizxnkR9=5:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfcZ>512_;#j|i.sd,cf~)keas#jPpovq[beXizxnkRj><1<1=>S7'nxm"h gbz-gim'{nT|cz}_fa\evtboVn:0<0=9:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfcZb64;4956[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg^f2868512_;#j|i.sd,cf~)keas#jPpovq[beXizxnkRj><5<1=>S7'nxm"h gbz-gim'{nT|cz}_fa\evtboVn:080=9:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfcZb64?4956[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg^f2828512_;#j|i.sd,cf~)keas#jPpovq[beXizxnkRj><9<1<>S7'nxm"h gbz-gim'{nT|cz}_fa\evtboVn:S=<7;T2,cw`)zo%lou lljz,vaYwf}xTknQnssgd[a7X9;20Y=!hrg,qb*adp'iggu!}d^rmpwY`kVkx~hiPd0]16==R8&myj#|i/fa{*fjlp&xoS}`{r^e`[duumnUo=R==8:W3+bta&{l$knv!cmi{+wbXxg~ySjmParpfcZb6W=837X> gsd-vc)`kq$h`fv re]sjqtXojUjkh_e3\17><]9%l~k }f.e`|+ekcq%yhR~ats]dgZgtzlmTh<Q9299V4*aun'xm#jmw.bnh|*tcWyd~Ril_`qqabYc9V=946[?/fpe*w`(ojr%oaew/sf\tkruWniTm~|jg^f2[=423\:$kh!rg-dg}(ddbr$~iQnup\cfYg{:;<=<:;T2,cw`)zo%lou lljz,vaYwf}xTknQwos2344423\:$kh!rg-dg}(ddbr$~iQnup\cfYg{:;<?<:;T2,cw`)zo%lou lljz,vaYwf}xTknQwos2346423\:$kh!rg-dg}(ddbr$~iQnup\cfYg{:;<9<:;T2,cw`)zo%lou lljz,vaYwf}xTknQwos2340423\:$kh!rg-dg}(ddbr$~iQnup\cfYg{:;<;<:;T2,cw`)zo%lou lljz,vaYwf}xTknQwos2342463\:$kh!rg-dg}(ddbr${Qnup\flh;878:7X> gsd-vc)`kq$h`fv ws]sjqtXj`d7=3<>;T2,cw`)zo%lou lljz,swYwf}xTnd`32?02?P6(o{l%~k!hcy,`hn~({U{by|Pbhl?7;463\:$kh!rg-dg}(ddbr${Qnup\flh;<78:7X> gsd-vc)`kq$h`fv ws]sjqtXj`d793<>;T2,cw`)zo%lou lljz,swYwf}xTnd`36?02?P6(o{l%~k!hcy,`hn~({U{by|Pbhl?3;463\:$kh!rg-dg}(ddbr${Qnup\flh;078;7X> gsd-vc)`kq$h`fv ws]sjqtXj`dT<?>4U1-dvc(un&mht#mcky-tvZvi|{UiecQ>219V4*aun'xm#jmw.bnh|*quWyd~Rlfn^014>S7'nxm"h gbz-gim'~xT|cz}_ckm[6473\:$kh!rg-dg}(ddbr${Qnup\flhX<;:0Y=!hrg,qb*adp'iggu!xr^rmpwYeagU>>=5Z0.eqb+ta'nis"nbdx.uq[uhszVhbbR8=0:W3+bta&{l$knv!cmi{+rtXxg~ySoga_603?P6(o{l%~k!hcy,`hn~({U{by|Pbhl\<70<]9%l~k }f.e`|+ekcq%|~R~ats]amkYg{:;<=<8;T2,cw`)zo%lou lljz,swYwf}xTnd`Pxnp34566:?1^<"i}f/pe+be&jf`t"y}_qlwvZdnfVrd~=>?1358Q5)`zo$yj"ilx/aoo})pzVzexQmio]{kw6788;9:6[?/fpe*w`(ojr%oaew/vp\tkruWkceSua}012162=R8&myj#|i/fa{*fjlp&}yS}`{r^`jjZ~hz9:;><<9;T2,cw`)zo%lou lljz,swYwf}xTnd`Pxnp34555?2_;#j|i.sd,cf~)keas#z|Ppovq[goiWqey<=><2348Q5)`zo$yj"ilx/aoo})pzVzexQmio]{kw678=8<7X> gsd-vc)`kq$h`fv ws]sjqtXj`dTtb|?016263=R8&myj#|i/fa{*fjlp&}yS}`{r^`jjZ~hz9:;9?94U1-dvc(un&mht#mcky-tvZvi|{UiecQwos234075>2_;#j|i.sd,cf~)keas#z|Ppovq[goiWqey<=>9299V4*aun'xm#jmw.bnh|*quWyd~Rlfn^zlv567>8;9;6[?/fpe*w`(ojr%oaew/vp\tkruWkceSua}012567d<]9%l~k }f.e`|+ekcq%|~R~ats]amkYg{:;<;Qmde212>S7'nxm"h gbz-gim'~xT|cz}_ckm[}iu89:<>:5Z0.eqb+ta'nis"nbdx.uq[uhszVhbbRv`r12334473\:$kh!rg-dg}(ddbr${Qnup\cf:76;:0Y=!hrg,qb*adp'iggu!xr^rmpwY`k5;5>=5Z0.eqb+ta'nis"nbdx.uq[uhszVmh0?0=0:W3+bta&{l$knv!cmi{+rtXxg~ySjm33?03?P6(o{l%~k!hcy,`hn~({U{by|Pgb>7:76<]9%l~k }f.e`|+ekcq%|~R~ats]dg939:91^<"i}f/pe+be&jf`t"y}_qlwvZad4?49<6[?/fpe*w`(ojr%oaew/vp\tkruWni7;3<?;T2,cw`)zo%lou lljz,swYwf}xTkn27>0d8Q5)`zo$yj"ilx/aoo})pzVzexQhc^22b>S7'nxm"h gbz-gim'~xT|cz}_fa\54`<]9%l~k }f.e`|+ekcq%|~R~ats]dgZ46n2_;#j|i.sd,cf~)keas#z|Ppovq[beX;8l0Y=!hrg,qb*adp'iggu!xr^rmpwY`kV>:j6[?/fpe*w`(ojr%oaew/vp\tkruWniT9<h4U1-dvc(un&mht#mcky-tvZvi|{UloR8>f:W3+bta&{l$knv!cmi{+rtXxg~ySjmP70d8Q5)`zo$yj"ilx/aoo})pzVzexQhc^:12>S7'nxm"h gbz-gim'~xT|cz}_fa\evtbo5:5>;5Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef>2:70<]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlm7>3<9;T2,cw`)zo%lou lljz,swYwf}xTknQnssgd8685>2_;#j|i.sd,cf~)keas#z|Ppovq[beXizxnk1:1279V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqab:26;<0Y=!hrg,qb*adp'iggu!xr^rmpwY`kVkx~hi36?05?P6(o{l%~k!hcy,`hn~({U{by|Pgb]bwwc`4>49:6[?/fpe*w`(ojr%oaew/vp\tkruWniTm~|jg=:=60=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnU;>85Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]260=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnU9>85Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]060=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnU?>85Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]660=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnU=>85Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]460=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnU3>45Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]g5969:01^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQk1=3=6<=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnUo=1<1289V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabYc9595>45Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]g5929:01^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQk1=7=6<=R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnUo=181289V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabYc95=5>45Z0.eqb+ta'nis"nbdx.uq[uhszVmhSl}}ef]g59>9:11^<"i}f/pe+be&jf`t"y}_qlwvZadWhyyijQk1^21<>S7'nxm"h gbz-gim'~xT|cz}_fa\evtboVn:S<<7;T2,cw`)zo%lou lljz,swYwf}xTknQnssgd[a7X:;20Y=!hrg,qb*adp'iggu!xr^rmpwY`kVkx~hiPd0]06==R8&myj#|i/fa{*fjlp&}yS}`{r^e`[duumnUo=R:=8:W3+bta&{l$knv!cmi{+rtXxg~ySjmParpfcZb6W<837X> gsd-vc)`kq$h`fv ws]sjqtXojUjkh_e3\27><]9%l~k }f.e`|+ekcq%|~R~ats]dgZgtzlmTh<Q8299V4*aun'xm#jmw.bnh|*quWyd~Ril_`qqabYc9V2996[?/fpe*w`(ojr%oaew/vp\tkruWniTtb|?01211>S7'nxm"h gbz-gim'~xT|cz}_fa\|jt789;996[?/fpe*w`(ojr%oaew/vp\tkruWniTtb|?01011>S7'nxm"h gbz-gim'~xT|cz}_fa\|jt7899996[?/fpe*w`(ojr%oaew/vp\tkruWniTtb|?01611>S7'nxm"h gbz-gim'~xT|cz}_fa\|jt789?996[?/fpe*w`(ojr%oaew/vp\tkruWniTtb|?01411>S7'nxm"h gbz-gim'~xT|cz}_fa\|jt789=8<6[?/fpe*w`(oe:%~i!hr0,qbr`s'Dg~tR\NM^PG[@HXN^L_><<i;T2,cw`)zo%l`= }d.eq5+tao~$A`{w_SCN[WC@G\^TIC?>2e9V4*aun'xm#jb?.sf,cw7)zo}mx"mzrs]escrX{}ki1>12e9V4*aun'xm#jb?.sf,cw7)zo}mx"mzrs]escrX{}ki1?12b9V4*aun'xm#jb?.sf,cw7)zo}mx"mzrs]escrX{}kiR>=c:W3+bta&{l$ka>!re-dv4(un~l#n{}r^dtbqYt|h~nS<=:;T2,cw`)zo%l`= }d.eq5+tao~$ox|}_guepZusi}oTaxv?013?4;513\:$kh!rg-dh5(ul&my=#|iwgv,gptuWo}mxR}{aug\ip~789;7<3?<5:W3+bta&{l$ka>!re-dv4(un~l#n{}r^dtbqYt|h~nS`{w01228484>2_;#j|i.sd,ci6)zm%l~< }fvdw+fsuzVl|jyQ|t`vf[hs89::0<0>299V4*aun'xm#jb?.sf,cw7)zo}mx"kbpu{\br`sWoh9;6[?/fpe*w`(oe:%~i!hr0,qbr`s'lg{xtQiwgv\m7`<]9%l~k }f.eo4+tc'nx:"hxfu-fiur~Wo}mxRgPmtz3456482_;#j|i.sd,ci6)zm%l~< }fvdw+`kw|pUm{kzPi^ov|56788827X> gsd-vc)`d9$yh"i}ar,qwqu(k9%hm|vndv?4;4>3\:$kh!rg-dh5(ul&mym~ }suq,g5)di{xrbhz31?0:?P6(o{l%~k!hl1,q`*auiz$yy} c1-`ewt~fl~7>3<6;T2,cw`)zo%l`= }d.eqev(u{}y$o=!laspzj`r;;78m7X> gsd-vc)`d9$yh"i}ar,qwqu(k9%laxv!glY3Y+aj9'g:>k5Z0.eqb+ta'nf;"j gscp*wus{&i;#jczx/en_4[)ody%a~<i;T2,cw`)zo%l`= }d.eqev(u{}y$o=!hmtz-ch]5U'mf#c|2g9V4*aun'xm#jb?.sf,cwgt&{y"m?/fov|+ajS:W%k`}!mr0e?P6(o{l%~k!hl1,q`*auiz$yy} c1-dip~)odQ?Q#ibs/op66=R8&myj#|i/fn3*wb(o{kx"}{s.a3+s7;87887X> gsd-vc)`d9$yh"i}ar,qwqu(k9%}=1?1229V4*aun'xm#jb?.sf,cwgt&{y"m?/w3?6;443\:$kh!rg-dh5(ul&mym~ }suq,g5)q9595>>5Z0.eqb+ta'nf;"j gscp*wus{&i;#{?34?0a?P6(o{l%~k!hl1,q`*auiz$yy} c1-u5Z6Xign;<=>>2c9V4*aun'xm#jb?.sf,cwgt&{y"m?/w3\5Zgil9:;<<<m;T2,cw`)zo%l`= }d.eqev(u{}y$o=!y1^0\ekb789::>o5Z0.eqb+ta'nf;"j gscp*wus{&i;#{?P3^cm`567888i7X> gsd-vc)`d9$yh"i}ar,qwqu(k9%}=R:Pnnv34566:01^<"i}f/pe+bj7&{n$ko|.sqww*e6'jky~t`jt=2=6<=R8&myj#|i/fn3*wb(o{kx"}{s.a2+fguzpdnx1?1289V4*aun'xm#jb?.sf,cwgt&{y"m>/bcqv|hb|585>45Z0.eqb+ta'nf;"j gscp*wus{&i:#no}rxlfp959:o1^<"i}f/pe+bj7&{n$ko|.sqww*e6'ng~t#ib[1_-ch7)e88m7X> gsd-vc)`d9$yh"i}ar,qwqu(k8%laxv!glY2Y+aj{'gx>k5Z0.eqb+ta'nf;"j gscp*wus{&i:#jczx/en_7[)ody%a~<i;T2,cw`)zo%l`= }d.eqev(u{}y$o<!hmtz-ch]4U'mf#c|2g9V4*aun'xm#jb?.sf,cwgt&{y"m>/fov|+ajS=W%k`}!mr00?P6(o{l%~k!hl1,q`*auiz$yy} c0-u5969::1^<"i}f/pe+bj7&{n$ko|.sqww*e6';7=3<<;T2,cw`)zo%l`= }d.eqev(u{}y$o<!y1=0=66=R8&myj#|i/fn3*wb(o{kx"}{s.a2+s7;;7887X> gsd-vc)`d9$yh"i}ar,qwqu(k8%}=1:12c9V4*aun'xm#jb?.sf,cwgt&{y"m>/w3\4Zgil9:;<<<m;T2,cw`)zo%l`= }d.eqev(u{}y$o<!y1^3\ekb789::>o5Z0.eqb+ta'nf;"j gscp*wus{&i:#{?P2^cm`567888i7X> gsd-vc)`d9$yh"i}ar,qwqu(k8%}=R=Paof34566:k1^<"i}f/pe+bj7&{n$ko|.sqww*e6';T8R``t12344473\:$kh!rg-dh5(ul&mym~ }suq,gjkw8;:0Y=!hrg,qb*ak8'xo#j|ns/pppv)dgdz:>45Z0.eqb+ta'nf;"j gscp*wus{&xjaRkbpu{\bgYn;91^<"i}f/pe+bj7&{n$ko|.sqww*tfeVof|ywPfc]j[jt789:8=6[?/fpe*w`(oe:%~i!hr`q-vvrt'{kfShctx]efZoXg{:;<=?=3:W3+bta&{l$ka>!re-qtkru'DidyczPcnwmp72<]9%l~k }f.eo4+tc'{zex!BcnwmpZeh}g~:>95Z0.eqb+ta'nf;"j rqlwv*Kdg|dSnaznu010>S7'nxm"h gm2-va)uxg~y#@m`uov\gjsi|:8?7X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{4368Q5)`zo$yj"ic0/pg+wvi|{%Fob{at^alqkr2:=1^<"i}f/pe+bj7&{n$~}`{r.O`kphsWje~by8=4:W3+bta&{l$ka>!re-qtkru'DidyczPcnwmp2433\:$kh!rg-dh5(ul&x{by| MbmvjqYdg|d4?74U1-dvc(un&mg<#|k/srmpw)JkfexRm`uov\g|:76;i0Y=!hrg,qb*ak8'xo#~ats-Ngjsi|VidyczPcx>3:Zts:01^<"i}f/pe+bj7&{n$~}`{r.O`kphsWje~byQly=3=6f=R8&myj#|i/fn3*wb(zyd~"Clotlw[firf}Uhu1?1_sv1=>S7'nxm"h gm2-va)uxg~y#@m`uov\gjsi|Vir0?0=c:W3+bta&{l$ka>!re-qtkru'DidyczPcnwmpZe~4;4T~y<6;T2,cw`)zo%l`= }d.psjqt(Eje~byQlotlw[f;;78h7X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{_b{?7;Yu|;30Y=!hrg,qb*ak8'xo#~ats-Ngjsi|VidyczPcx>7:7e<]9%l~k }f.eo4+tc'{zex!BcnwmpZeh}g~Tot2;>^pw6<=R8&myj#|i/fn3*wb(zyd~"Clotlw[firf}Uhu1;12b9V4*aun'xm#jb?.sf,vuhsz&Ghcx`{_bmvjqYdq5?5Sz=9:W3+bta&{l$ka>!re-qtkru'DidyczPcnwmpZe~4?49o6[?/fpe*w`(oe:%~i!}povq+Heh}g~Tob{at^az838Xz}827X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{_b{?3;4d3\:$kh!rg-dh5(ul&x{by| MbmvjqYdg|dSnw37?]qp7g<]9%l~k }f.eo4+tc'{zex!BcnwmpZeh}g~Ttb|30?0b?P6(o{l%~k!hl1,q`*twf}x$Anaznu]`kphsWqey0<0=a:W3+bta&{l$ka>!re-qtkru'DidyczPcnwmpZ~hz585>l5Z0.eqb+ta'nf;"j rqlwv*Kdg|dSnaznu]{kw:46;k0Y=!hrg,qb*ak8'xo#~ats-Ngjsi|VidyczPxnp?0;4f3\:$kh!rg-dh5(ul&x{by| MbmvjqYdg|dSua}<4<1e>S7'nxm"h gm2-va)uxg~y#@m`uov\gjsi|Vrd~1812`9V4*aun'xm#jb?.sf,vuhsz&Ghcx`{_bmvjqYg{6<2?o4U1-dvc(un&mg<#|k/srmpw)JkfexRm`uov\|jt;078o7X> gsd-vc)`d9$yh"|nup,Ifirf}Uhcx`{_ymq8=8Xz};m7X> gsd-vc)`d9$yh"|nup,gjsi|5:5=k5Z0.eqb+ta'nf;"j rqlwv*eh}g~7=3?i;T2,cw`)zo%l`= }d.psjqt(kfex1<11g9V4*aun'xm#jb?.sf,vuhsz&idycz33?3e?P6(o{l%~k!hl1,q`*twf}x$ob{at=6=5c=R8&myj#|i/fn3*wb(zyd~"m`uov?1;7a3\:$kh!rg-dh5(ul&x{by| cnwmp9099o1^<"i}f/pe+bj7&{n$~}`{r.alqkr;?7;m7X> gsd-vc)`d9$yh"|nup,gjsi|525=h5Z0.eqb+ta'nf;"j rqlwv*eh}g~T<<k4U1-dvc(un&mg<#|k/srmpw)dg|dS<?j;T2,cw`)zo%l`= }d.psjqt(kfexR<>e:W3+bta&{l$ka>!re-qtkru'je~byQ<1d9V4*aun'xm#jb?.sf,vuhsz&idyczP40g8Q5)`zo$yj"ic0/pg+wvi|{%hcx`{_43f?P6(o{l%~k!hl1,q`*twf}x$ob{at^42a>S7'nxm"h gm2-va)uxg~y#naznu]45`=R8&myj#|i/fn3*wb(zyd~"m`uov\<74<]9%l~k }f.eo4+tc'{zex!lotlw[a7;87897X> gsd-vc)`d9$yh"|nup,gjsi|Vn:0<0=2:W3+bta&{l$ka>!re-qtkru'je~byQk1=0=67=R8&myj#|i/fn3*wb(zyd~"m`uov\`4:46;80Y=!hrg,qb*ak8'xo#~ats-`kphsWm;783<=;T2,cw`)zo%l`= }d.psjqt(kfexRj><4<16>S7'nxm"h gm2-va)uxg~y#naznu]g5909:;1^<"i}f/pe+bj7&{n$~}`{r.alqkrXl86<2?<4U1-dvc(un&mg<#|k/srmpw)dg|dSi?38?02?P6(o{l%~k!hl1,q`*twf}x$ob{at^f2[5463\:$kh!rg-dh5(ul&x{by| cnwmpZb6W88:7X> gsd-vc)`d9$yh"|nup,gjsi|Vn:S?<>;T2,cw`)zo%l`= }d.psjqt(kfexRj>_202?P6(o{l%~k!hl1,q`*twf}x$ob{at^f2[1463\:$kh!rg-dh5(ul&x{by| cnwmpZb6W<8:7X> gsd-vc)`d9$yh"|nup,gjsi|Vn:S;<>;T2,cw`)zo%l`= }d.psjqt(kfexRj>_602?P6(o{l%~k!hl1,q`*twf}x$ob{at^f2[=433\:$kh!rg-dh5(ul&x{by| cnwmpZhh|9:;=>h4U1-dvc(un&mg<#y}/fubw+awn'}y|k!Baef\`l`aWyd~R~nd^cg`5678Vir0=0<f:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/Lcg`ZbnnoU{by|Pp`f\eab789:Tot2>>2d8Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-NeabXl`lmS}`{r^rb`Zgcl9:;<Rmv<3<0b>S7'nxm"h gm2-sw)`hy%k}h!wsre+HgclVnbjkQnup\tdbXimn;<=>Pcx>0:6`<]9%l~k }f.eo4+qu'n}j#if/uqtc)JimnThdhi_qlwvZvflVkoh=>?0^az8184n2_;#j|i.sd,ci6){%l{l}!gqd-swva'DkohRjffg]sjqtXxhnTmij?012\g|:26:l0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%FmijPdhde[uhszVzjhRokd1234Ze~4?48j6[?/fpe*w`(oe:%{!hw`q-cu`){zm#@okd^fjbcYwf}xT|ljPaef3456Xkp6<2>h4U1-dvc(un&mg<#y}/fubw+awn'}y|k!Baef\`l`aWyd~R~nd^cg`5678Vir050;0:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/Lcg`ZbnnoU{by|Pp`f\eab789:T`xz31?63?P6(o{l%~k!hl1,tv*apiz$l|k xrqd,IdbcWmcmjR~ats]seaYflm:;<=Qcuu>1:16<]9%l~k }f.eo4+qu'n}j#if/uqtc)JimnThdhi_qlwvZvflVkoh=>?0^nvp959<91^<"i}f/pe+bj7&~x$kzo|.fre*rtwn&GjhiQkigd\tkruWykoSljk0123[iss4=4?<6[?/fpe*w`(oe:%{!hw`q-cu`){zm#@okd^fjbcYwf}xT|ljPaef3456Xd|~793:?;T2,cw`)zo%l`= xr.etev(`xo$|~}h M`fg[aoanVzexQae]b`a6789Ugyy29>528Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-NeabXl`lmS}`{r^rb`Zgcl9:;<Rbzt=5=05=R8&myj#|i/fn3*rt(o~kx"j~i.vpsb*KflmUoekhPpovq[ugcWhno<=>?_mww8=8382_;#j|i.sd,ci6){%l{l}!gqd-swva'DkohRjffg]sjqtXxhnTmij?012\hpr;17>;7X> gsd-vc)`d9$|~"ixar,dtc(pzyl$Aljk_ekebZvi|{U{miQnde2345Yg{6829>4U1-dvc(un&mg<#y}/fubw+awn'}y|k!Baef\`l`aWyd~R~nd^cg`5678Vrd~1:1419V4*aun'xm#jb?.vp,crgt&nzm"z|f.Ob`aYcaolT|cz}_qcg[dbc89:;Sua}<4<74>S7'nxm"h gm2-sw)`hy%k}h!wsre+HgclVnbjkQnup\tdbXimn;<=>Pxnp?2;273\:$kh!rg-dh5(pz&m|m~ hpg,tvu`(EhnoSigif^rmpwYwimUjhi>?01]{kw:06=:0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%FmijPdhde[uhszVzjhRokd1234Z~hz5258=5Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"Cnde]gmc`Xxg~yS}ok_`fg4567Wqey040=f:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/ekebZvi|{U{mi2<>3d8Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-gmc`Xxg~yS}ok<5<1b>S7'nxm"h gm2-sw)`hy%k}h!wsre+aoanVzexQae>6:7`<]9%l~k }f.eo4+qu'n}j#if/uqtc)caolT|cz}_qcg8385n2_;#j|i.sd,ci6){%l{l}!gqd-swva'mcmjR~ats]sea:06;l0Y=!hrg,qb*ak8'}y#jyns/esb+quxo%oekhPpovq[ugc4149j6[?/fpe*w`(oe:%{!hw`q-cu`){zm#igif^rmpwYwim622?k4U1-dvc(un&mg<#y}/fubw+awn'}y|k!kigd\tkruWykoS><j;T2,cw`)zo%l`= xr.etev(`xo$|~}h dhde[uhszVzjhR:=e:W3+bta&{l$ka>!ws-dsdu)oyl%{~i/ekebZvi|{U{miQ:2d9V4*aun'xm#jb?.vp,crgt&nzm"z|f.fjbcYwf}xT|ljP63g8Q5)`zo$yj"ic0/uq+bqf{'m{j#y}pg-gmc`Xxg~yS}ok_60f?P6(o{l%~k!hl1,tv*apiz$l|k xrqd,`l`aWyd~R~nd^:1a>S7'nxm"h gm2-sw)`hy%k}h!wsre+aoanVzexQae]:72=R8&myj#|i/fn3*rt(o~kx"j~i.vpsb*bnnoU{by|Pp`f\eab789:7?3=8;T2,cw`)zo%l`= xr.etev(`xo$|~}h dhde[uhszVzjhRokd1234929;>1^<"i}f/pe+bj7&~x$kzo|.fre*rtwn&nbjkQnup\tdbXimn;<=>35?14?P6(o{l%~k!hl1,tv*apiz$l|k xrqd,`l`aWyd~R~nd^cg`56785<5?:5Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"jffg]sjqtXxhnTmij?012?3;503\:$kh!rg-dh5(pz&m|m~ hpg,tvu`(l`lmS}`{r^rb`Zgcl9:;<161369V4*aun'xm#jb?.vp,crgt&nzm"z|f.fjbcYwf}xT|ljPaef3456;178j7X> gsd-vc)`d9$|~"ixar,dtc(pzyl$|ah_gwohZo4:2_;#j|i.sd,ci6){%l{l}!gqd-swva'yxdkRhzlm]j[hs89:8?95Z0.eqb+ta'nf;"z| gvcp*bva&~x{j"~}of]eqijXaVg~t=>?30000>S7'nxm"h gm2-sw)`hy%k}h!wsre+uthoVl~`aQf_lw{45649:987X> gsd-vc)`d9$|~"ixar,dtc(pzyl$|ah_gwohZoXe|r;<==8339V4*aun'xm#jb?.vp,crgt&nzm"z|f.rqkbYa}efTeR``t12357?<]9%l~k }f.eo4+qu'n}j#y|tr-`5*efz{seiy2?>3;8Q5)`zo$yj"ic0/uq+bqf{'}xx~!l1.abvwim}6:2?74U1-dvc(un&mg<#y}/fubw+qt|z%h="mnrs{maq:56;30Y=!hrg,qb*ak8'}y#jyns/uppv)d9&ij~waeu>0:7`<]9%l~k }f.eo4+qu'n}j#y|tr-`5*aj}q$laV>R.fo2*h75n2_;#j|i.sd,ci6){%l{l}!wrvp+f7(ods"jcT1\,div(j{;l0Y=!hrg,qb*ak8'}y#jyns/uppv)d9&mfyu hmZ0^*bkt&dy9j6[?/fpe*w`(oe:%{!hw`q-svrt'j;$k`{w.foX7X(`ez$f?h4U1-dvc(un&mg<#y}/fubw+qt|z%h="ibuy,di^2Z&ngx"`}=3:W3+bta&{l$ka>!ws-dsdu)z~x#n? v0>3:75<]9%l~k }f.eo4+qu'n}j#y|tr-`5*p64849?6[?/fpe*w`(oe:%{!hw`q-svrt'j;$z<2=>318Q5)`zo$yj"ic0/uq+bqf{'}xx~!l1.t28685;2_;#j|i.sd,ci6){%l{l}!wrvp+f7(~86?2?l4U1-dvc(un&mg<#y}/fubw+qt|z%h="x>_1]bja6789;9n6[?/fpe*w`(oe:%{!hw`q-svrt'j;$z<Q>_`lg45679;h0Y=!hrg,qb*ak8'}y#jyns/uppv)d9&|:S?Qnne234575j2_;#j|i.sd,ci6){%l{l}!wrvp+f7(~8U8Sl`k012357d<]9%l~k }f.eo4+qu'n}j#y|tr-`5*p6W=Uecy>?0131=>S7'nxm"h gm2-sw)`hy%{~z|/b0,gdtuqgo0=0=9:W3+bta&{l$ka>!ws-dsdu)z~x#n< c`pq}kcs484956[?/fpe*w`(oe:%{!hw`q-svrt'j8$ol|}yogw878512_;#j|i.sd,ci6){%l{l}!wrvp+f4(khxyuck{<2<1b>S7'nxm"h gm2-sw)`hy%{~z|/b0,chs&ngP<P hm0,n57`<]9%l~k }f.eo4+qu'n}j#y|tr-`6*aj}q$laV?R.fop*hu5n2_;#j|i.sd,ci6){%l{l}!wrvp+f4(ods"jcT2\,div(j{;l0Y=!hrg,qb*ak8'}y#jyns/uppv)d:&mfyu hmZ1^*bkt&dy9j6[?/fpe*w`(oe:%{!hw`q-svrt'j8$k`{w.foX0X(`ez$f?=4U1-dvc(un&mg<#y}/fubw+qt|z%h>"x><1<17>S7'nxm"h gm2-sw)`hy%{~z|/b0,r4:66;90Y=!hrg,qb*ak8'}y#jyns/uppv)d:&|:0?0=3:W3+bta&{l$ka>!ws-dsdu)z~x#n< v0>0:75<]9%l~k }f.eo4+qu'n}j#y|tr-`6*p64=49n6[?/fpe*w`(oe:%{!hw`q-svrt'j8$z<Q?_`lg45679;h0Y=!hrg,qb*ak8'}y#jyns/uppv)d:&|:S<Qnne234575j2_;#j|i.sd,ci6){%l{l}!wrvp+f4(~8U9Sl`k012357d<]9%l~k }f.eo4+qu'n}j#y|tr-`6*p6W:Ujbi>?0131f>S7'nxm"h gm2-sw)`hy%{~z|/b0,r4Y3Wge<=>?1328Q5)`zo$yj"ic0/uq+bqf{'}xx~!lolr265=R8&myj#|i/fn3*rt(o~kx"z}{s.aliu4582_;#j|i.sd,ci6){%l{l}!wrvp+fijx:8o7X> gsd-vc)`d9$|~"ixar,twqu(ohl%o>!laspzj`r;878o7X> gsd-vc)`d9$|~"ixar,twqu(ohl%o>!laspzj`r;978o7X> gsd-vc)`d9$|~"ixar,twqu(ohl%o>!laspzj`r;:78o7X> gsd-vc)`d9$|~"ixar,twqu(ohl%o>!laspzj`r;;7987X> gsd-vc)`d9$|~"ixar,twqu(ohl%o>!hmtz-ch]7U'mf=#c>329V4*aun'xm#jb?.vp,crgt&~y"inf/a0+bkrp'mfW<S!glq-iv543\:$kh!rg-dh5(pz&m|m~ xsuq,cd`)k:%laxv!glY1Y+aj{'gx?>5Z0.eqb+ta'nf;"z| gvcp*rus{&mjj#m</fov|+ajS:W%k`}!mr10?P6(o{l%~k!hl1,tv*apiz$|y} g`d-g6)`e|r%k`U;]/enw+kt:>1^<"i}f/pe+bj7&~x$kzo|.vqww*afn'i8#{?30?04?P6(o{l%~k!hl1,tv*apiz$|y} g`d-g6)q95;5>:5Z0.eqb+ta'nf;"z| gvcp*rus{&mjj#m</w3?6;403\:$kh!rg-dh5(pz&m|m~ xsuq,cd`)k:%}=1=1269V4*aun'xm#jb?.vp,crgt&~y"inf/a0+s7;<78m7X> gsd-vc)`d9$|~"ixar,twqu(ohl%o>!y1^2\ekb789::>k5Z0.eqb+ta'nf;"z| gvcp*rus{&mjj#m</w3\5Zgil9:;<<<i;T2,cw`)zo%l`= xr.etev(p{}y$klh!c2-u5Z4Xign;<=>>2g9V4*aun'xm#jb?.vp,crgt&~y"inf/a0+s7X;Vkeh=>?000e?P6(o{l%~k!hl1,tv*apiz$|y} g`d-g6)q9V>Tbbz?01226f=R8&myj#|i/fn3*rt(o~kx"z}{s.pbiZgkefySk{cl^k00>S7'nxm"h gm2-sw)`hy%{~z|/scn[djjgz~Tjxbc_h]nq}67899>7X> gsd-vc)`d9$|~"ixar,twqu(zhgTmac`su]eqijXaVg~t=>?0016?P6(o{l%~k!hl1,tv*apiz$|y} r`o\eikh{}UmyabPi^llp56798837X> gsd-vc)`d9$|~"ixar,twqu(zhgTjxbc_g`\m73<]9%l~k }f.eo4+qu'n}j#y|tr-qehYa}efTe?j4U1-dvc(un&mg<#y}/fubw+qt|z%ym`Qiumn\mZkrp9:;<?k4U1-dvc(un&mg<#y}/fubw+qt|z%ym`Qiumn\mZkrp9:;<<?k;T2,cw`)zo%l`= xr.pbiZquWldTe<?i;T2,cw`)zo%l`= xr.pbiZquWldTe<Q>229V4*aun'xm#jb?.vp,suhsz&Ghcx`{_bmvjq433\:$kh!rg-dh5(pz&}{by| MbmvjqYdg|d=?:4U1-dvc(un&mg<#y}/vrmpw)JkfexRm`uov161=R8&myj#|i/fn3*rt(yd~"Clotlw[firf}9986[?/fpe*w`(oe:%{!xpovq+Heh}g~Tob{at507?P6(o{l%~k!hl1,tv*qwf}x$Anaznu]`kphs=;>0Y=!hrg,qb*ak8'}y#z~ats-Ngjsi|Vidycz9259V4*aun'xm#jb?.vp,suhsz&Ghcx`{_bmvjq15<2_;#j|i.sd,ci6){%||cz}/LalqkrXkfex5<6;T2,cw`)zo%l`= xr.usjqt(Eje~byQlotlw[f;878h7X> gsd-vc)`d9$|~"ynup,Ifirf}Uhcx`{_b{?4;Yu|;30Y=!hrg,qb*ak8'}y#z~ats-Ngjsi|VidyczPcx>2:7e<]9%l~k }f.eo4+qu'~zex!BcnwmpZeh}g~Tot2>>^pw6<=R8&myj#|i/fn3*rt(yd~"Clotlw[firf}Uhu1<12b9V4*aun'xm#jb?.vp,suhsz&Ghcx`{_bmvjqYdq585Sz=9:W3+bta&{l$ka>!ws-ttkru'DidyczPcnwmpZe~4:49o6[?/fpe*w`(oe:%{!xpovq+Heh}g~Tob{at^az868Xz}827X> gsd-vc)`d9$|~"ynup,Ifirf}Uhcx`{_b{?0;4d3\:$kh!rg-dh5(pz&}{by| MbmvjqYdg|dSnw34?]qp7?<]9%l~k }f.eo4+qu'~zex!BcnwmpZeh}g~Tot2:>3a8Q5)`zo$yj"ic0/uq+rvi|{%Fob{at^alqkrXkp6>2R|{289V4*aun'xm#jb?.vp,suhsz&Ghcx`{_bmvjqYdq5<5>n5Z0.eqb+ta'nf;"z| wqlwv*Kdg|dSnaznu]`}909W{~956[?/fpe*w`(oe:%{!xpovq+Heh}g~Tob{at^az8285k2_;#j|i.sd,ci6){%||cz}/LalqkrXkfexRmv<6<\vq4f3\:$kh!rg-dh5(pz&}{by| MbmvjqYdg|dSua}<1<1e>S7'nxm"h gm2-sw)pxg~y#@m`uov\gjsi|Vrd~1?12`9V4*aun'xm#jb?.vp,suhsz&Ghcx`{_bmvjqYg{692?o4U1-dvc(un&mg<#y}/vrmpw)JkfexRm`uov\|jt;;78j7X> gsd-vc)`d9$|~"ynup,Ifirf}Uhcx`{_ymq8185i2_;#j|i.sd,ci6){%||cz}/LalqkrXkfexRv`r=7=6d=R8&myj#|i/fn3*rt(yd~"Clotlw[firf}Usc29>3c8Q5)`zo$yj"ic0/uq+rvi|{%Fob{at^alqkrXpfx7;3<n;T2,cw`)zo%l`= xr.usjqt(Eje~byQlotlw[}iu4149h6[?/fpe*w`(oe:%{!xpovq+Heh}g~Tob{at^zlv9>9W{~:j6[?/fpe*w`(oe:%{!xpovq+firf}6;2<h4U1-dvc(un&mg<#y}/vrmpw)dg|d0<0>f:W3+bta&{l$ka>!ws-ttkru'je~by2=>0d8Q5)`zo$yj"ic0/uq+rvi|{%hcx`{<2<2b>S7'nxm"h gm2-sw)pxg~y#naznu>7:4`<]9%l~k }f.eo4+qu'~zex!lotlw8086n2_;#j|i.sd,ci6){%||cz}/bmvjq:168l0Y=!hrg,qb*ak8'}y#z~ats-`kphs4>4:j6[?/fpe*w`(oe:%{!xpovq+firf}632<k4U1-dvc(un&mg<#y}/vrmpw)dg|dS=?j;T2,cw`)zo%l`= xr.usjqt(kfexR?>e:W3+bta&{l$ka>!ws-ttkru'je~byQ=1d9V4*aun'xm#jb?.vp,suhsz&idyczP30g8Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_53f?P6(o{l%~k!hl1,tv*qwf}x$ob{at^72a>S7'nxm"h gm2-sw)pxg~y#naznu]55`=R8&myj#|i/fn3*rt(yd~"m`uov\34c<]9%l~k }f.eo4+qu'~zex!lotlw[=453\:$kh!rg-dh5(pz&}{by| cnwmpZb64949>6[?/fpe*w`(oe:%{!xpovq+firf}Uo=1?1239V4*aun'xm#jb?.vp,suhsz&idyczPd0>1:74<]9%l~k }f.eo4+qu'~zex!lotlw[a7;;7897X> gsd-vc)`d9$|~"ynup,gjsi|Vn:090=2:W3+bta&{l$ka>!ws-ttkru'je~byQk1=7=67=R8&myj#|i/fn3*rt(yd~"m`uov\`4:16;80Y=!hrg,qb*ak8'}y#z~ats-`kphsWm;7;3<=;T2,cw`)zo%l`= xr.usjqt(kfexRj><9<15>S7'nxm"h gm2-sw)pxg~y#naznu]g5Z6592_;#j|i.sd,ci6){%||cz}/bmvjqYc9V;9=6[?/fpe*w`(oe:%{!xpovq+firf}Uo=R<=1:W3+bta&{l$ka>!ws-ttkru'je~byQk1^115>S7'nxm"h gm2-sw)pxg~y#naznu]g5Z2592_;#j|i.sd,ci6){%||cz}/bmvjqYc9V?9=6[?/fpe*w`(oe:%{!xpovq+firf}Uo=R8=1:W3+bta&{l$ka>!ws-ttkru'je~byQk1^515>S7'nxm"h gm2-sw)pxg~y#naznu]g5Z>5:2_;#j|i.sd,ci6){%||cz}/bmvjqYc:5:5>?5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th?2>>308Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e0?6;453\:$kh!rg-dh5(pz&}{by| cnwmpZb54:49>6[?/fpe*w`(oe:%{!xpovq+firf}Uo>1:1239V4*aun'xm#jb?.vp,suhsz&idyczPd3>6:74<]9%l~k }f.eo4+qu'~zex!lotlw[a4;>7897X> gsd-vc)`d9$|~"ynup,gjsi|Vn90:0=2:W3+bta&{l$ka>!ws-ttkru'je~byQk2=:=64=R8&myj#|i/fn3*rt(yd~"m`uov\`7Y7:81^<"i}f/pe+bj7&~x${}`{r.alqkrXl;U:><5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th?Q=209V4*aun'xm#jb?.vp,suhsz&idyczPd3]064=R8&myj#|i/fn3*rt(yd~"m`uov\`7Y3:81^<"i}f/pe+bj7&~x${}`{r.alqkrXl;U>><5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th?Q9209V4*aun'xm#jb?.vp,suhsz&idyczPd3]464=R8&myj#|i/fn3*rt(yd~"m`uov\`7Y?:;1^<"i}f/pe+bj7&~x${}`{r.alqkrXl:6;2?<4U1-dvc(un&mg<#y}/vrmpw)dg|dSi=31?01?P6(o{l%~k!hl1,tv*qwf}x$ob{at^f08785:2_;#j|i.sd,ci6){%||cz}/bmvjqYc;595>?5Z0.eqb+ta'nf;"z| wqlwv*eh}g~Th>2;>308Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e1?1;453\:$kh!rg-dh5(pz&}{by| cnwmpZb44?49>6[?/fpe*w`(oe:%{!xpovq+firf}Uo?191239V4*aun'xm#jb?.vp,suhsz&idyczPd2>;:77<]9%l~k }f.eo4+qu'~zex!lotlw[a5X8;;0Y=!hrg,qb*ak8'}y#z~ats-`kphsWm9T=??4U1-dvc(un&mg<#y}/vrmpw)dg|dSi=P2338Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e1\777<]9%l~k }f.eo4+qu'~zex!lotlw[a5X<;;0Y=!hrg,qb*ak8'}y#z~ats-`kphsWm9T9??4U1-dvc(un&mg<#y}/vrmpw)dg|dSi=P6338Q5)`zo$yj"ic0/uq+rvi|{%hcx`{_e1\377<]9%l~k }f.eo4+qu'~zex!lotlw[a5X0;>0Y=!hrg,qb*ak8'}y#z~ats-`kphsWge<=>>169V4*aun'xm#`kb/emvpZo;87;37X> gsd-vc)jmd%ocxzPi=33:4><]9%l~k }f.ofi*bh}}Ub0<?1199V4*aun'xm#`kb/emvpZo;9;4:46[?/fpe*w`(elg$hb{{_h>27;7?3\:$kh!rg-nah)cg|~Te1?;>0:8Q5)`zo$yj"cjm.flqqYn48?5=55Z0.eqb+ta'dof#iazt^k?538602_;#j|i.sd,i`k(lfSd2>7?3;?P6(o{l%~k!bel-gkprXa5;32<64U1-dvc(un&gna"j`uu]j84?99>1^<"i}f/pe+hcj'me~xRg31?3;?P6(o{l%~k!bel-gkprXa58;2<64U1-dvc(un&gna"j`uu]j8779911^<"i}f/pe+hcj'me~xRg323<2<>S7'nxm"h mdo,`jssW`69?3?7;T2,cw`)zo%fi`!kotv\m9436820Y=!hrg,qb*kbe&ndyyQf<37=5==R8&myj#|i/lgn+air|Vc7>;0>8:W3+bta&{l$ahc dnww[l:5?7;37X> gsd-vc)jmd%ocxzPi=0;:4><]9%l~k }f.ofi*bh}}Ub0?71169V4*aun'xm#`kb/emvpZo;:7;37X> gsd-vc)jmd%ocxzPi=13:4><]9%l~k }f.ofi*bh}}Ub0>?1199V4*aun'xm#`kb/emvpZo;;;4:46[?/fpe*w`(elg$hb{{_h>07;7?3\:$kh!rg-nah)cg|~Te1=;>0:8Q5)`zo$yj"cjm.flqqYn4:?5=:5Z0.eqb+ta'dof#iazt^k?7;703\:$kh!rg-nah)cg|~Te1:1169V4*aun'xm#`kb/emvpZo;=7;<7X> gsd-vc)jmd%ocxzPi=4=52=R8&myj#|i/lgn+air|Vc7;3?8;T2,cw`)zo%fi`!kotv\m9>99>1^<"i}f/pe+hcj'me~xRg39?35?P6(o{l%~k!bel-gkprXaV:::6[?/fpe*w`(elg$hb{{_h]252=R8&myj#|i/lgn+air|VcT==?8;T2,cw`)zo%fi`!kotv\mZ769>1^<"i}f/pe+hcj'me~xRgP1334?P6(o{l%~k!bel-gkprXaV;8=:5Z0.eqb+ta'dof#iazt^k\51703\:$kh!rg-nah)cg|~TeR?:169V4*aun'xm#`kb/emvpZoX9?;<7X> gsd-vc)jmd%ocxzPi^3452=R8&myj#|i/lgn+air|VcT=5?8;T2,cw`)zo%fi`!kotv\mZ7>9?1^<"i}f/pe+hcj'me~xRgP2058Q5)`zo$yj"cjm.flqqYnW;::;6[?/fpe*w`(elg$hb{{_h]1541<]9%l~k }f.ofi*bh}}UbS?<>7:W3+bta&{l$ahc dnww[lY5;8=0Y=!hrg,qb*kbe&ndyyQf_3623>S7'nxm"h mdo,`jssW`U99<94U1-dvc(un&gna"j`uu]j[706?2_;#j|i.sd,i`k(lfSdQ=7058Q5)`zo$yj"cjm.flqqYnW;2:;6[?/fpe*w`(elg$hb{{_h]1=40<]9%l~k }f.ofi*bh}}UbS>?8;T2,cw`)zo%fi`!kotv\mZ579>1^<"i}f/pe+hcj'me~xRgP3034?P6(o{l%~k!bel-gkprXaV99=:5Z0.eqb+ta'dof#iazt^k\76703\:$kh!rg-nah)cg|~TeR=;169V4*aun'xm#`kb/emvpZoX;<;=7X> gsd-vc)jmd%ocxzPi^622>S7'nxm"h mdo,`jssW`U>=;5Z0.eqb+ta'dof#iazt^k\240<]9%l~k }f.ofi*bh}}UbS:?9;T2,cw`)zo%fi`!kotv\mZ>6>2_;#j|i.sd,i`k(lfSdQ6189V4*aun'xm#`kb/emvpZkbe5:5=l5Z0.eqb+ta'dof#iazt^ofi97768k0Y=!hrg,qb*kbe&ndyyQbel>25;7f3\:$kh!rg-nah)cg|~Tahc313<2e>S7'nxm"h mdo,`jssWdof0<=11`9V4*aun'xm#`kb/emvpZkbe5;?2<o4U1-dvc(un&gna"j`uu]nah:6=7;j7X> gsd-vc)jmd%ocxzPmdo?5386i2_;#j|i.sd,i`k(lfS`kb<05=5d=R8&myj#|i/lgn+air|Vgna1?7>0c8Q5)`zo$yj"cjm.flqqYjmd6:53?6;T2,cw`)zo%fi`!kotv\i`k;97;j7X> gsd-vc)jmd%ocxzPmdo?6586i2_;#j|i.sd,i`k(lfS`kb<33=5d=R8&myj#|i/lgn+air|Vgna1<=>0c8Q5)`zo$yj"cjm.flqqYjmd69?3?n;T2,cw`)zo%fi`!kotv\i`k;:=4:m6[?/fpe*w`(elg$hb{{_lgn87399h1^<"i}f/pe+hcj'me~xRcjm=05:4g<]9%l~k }f.ofi*bh}}Ufi`2=7?3b?P6(o{l%~k!bel-gkprXelg7>50>a:W3+bta&{l$ahc dnww[hcj4;35=45Z0.eqb+ta'dof#iazt^ofi9499h1^<"i}f/pe+hcj'me~xRcjm=13:4g<]9%l~k }f.ofi*bh}}Ufi`2<1?3b?P6(o{l%~k!bel-gkprXelg7??0>a:W3+bta&{l$ahc dnww[hcj4:95=l5Z0.eqb+ta'dof#iazt^ofi95368k0Y=!hrg,qb*kbe&ndyyQbel>01;7>3\:$kh!rg-nah)cg|~Tahc33?3:?P6(o{l%~k!bel-gkprXelg783?6;T2,cw`)zo%fi`!kotv\i`k;=7;27X> gsd-vc)jmd%ocxzPmdo?2;7>3\:$kh!rg-nah)cg|~Tahc37?3:?P6(o{l%~k!bel-gkprXelg743?6;T2,cw`)zo%fi`!kotv\i`k;17=?7X> gsd-vc)jmd%ln` hble-cgk`i'dlinm!ble,fimXelgTkh`jr`vlv*pfd`n%o~z}/scnhjiwS9W%~lc!r.q0[kinf`~%~lc dqpbi+bw;?r8:#|nm0`8Q5)`zo$yj"cjm.vntZtfeVxoSh`>c:W3+bta&{l$ahc tlr\vdkXzmUnb<?8;T2,cw`)zo%ym`Q}efmvpZci9m1^<"i}f/pe+wusjea$^^ZPFTNO[BCI9m1^<"i}f/pe+wusjea$~iQ}su]bwwc`:91^<"i}f/pe+wusjea$~iQ}su]bwwc`Wm;9<6[?/fpe*w`(zz~i`f!}d^pppZgtzlmTh??l;T2,cw`)zo%yylck.pg[wusWjefn<j4U1-dvc(un&xxxobd/sf\vvrXkfgi=<k4U1-dvc(un&xxxobd/sf\vvrXzlm7<3?j;T2,cw`)zo%yylck.pg[wusW{ol0<0>e:W3+bta&{l$~~zmlj-q`Ztt|Vxnk1<11e9V4*aun'xm#}{bmi,vaYu{}UyijQ?1e9V4*aun'xm#}{bmi,vaYu{}UyijQ>1e9V4*aun'xm#}{bmi,vaYu{}UyijQ=169V4*aun'xm#}{bmi,vvrXl8;<7X> gsd-vc)u{}hgg"||t^f152=R8&myj#|i/sqwfim(zz~Th>?k;T2,cw`)zo%yylck.uq[wusWhyyij<?;T2,cw`)zo%yylck.uq[wusWhyyijQk1328Q5)`zo$yj"||tcnh+rtXzz~Tm~|jg^f15f=R8&myj#|i/sqwfim({UyyQlol`2`>S7'nxm"h rrvahn)pzVxxxRm`mc32a>S7'nxm"h rrvahn)pzVxxxR|jg=2=5`=R8&myj#|i/sqwfim({UyyQ}ef>2:4b<]9%l~k }f.pppgjl'~xT~~zPrde\44b<]9%l~k }f.pppgjl'~xT~~zPrde\5d=R[LXTMAGNSb9VW@TX^@YBNAK<;WA@=>PNM^U_U]K<;VGB7>QBJj1\^DZJ_LMGAZGd3^XBXHQBOEG\Fa=PZ@^NSZGKTI]B`>QUA]OT[DJ[H^@2`>^ND@DS!UJM 1,2$VRRJ):%=-O\CHK6?]IUKP<0T^ZCIC58\VRXOGN<7U][_WA@f>^XKFXNSD@IO79[`gYNlo1SheQ_rhoUawungg;;7Ujb_LcikwPbzzcdb<>4Xeo\Ilhhz_oydaac:coijusWlg{xtl4amolwqYa}ef=7oolktrg?ggdc|zTal|des18gimc3mkmRm`uov+4,b<lh~jSnaznu*2-a=ci}kTob{at)0*`>bf|hUhcx`{(2+g?agsiVidycz'4(f8`drfWje~by&:)e9geqgXkfex%8&d:fbpdYdg|d$:'k;ecweZeh}g~#4$h4d`vb[firf}636=08;e`jp`tu>2nbb%>&6:fjj-7.?2nbb%??)69gmk.69 =0hd`'13+4?aoi 89";6jfn)37-2=cag":9$94dhl+53/03mce$<9&7:fjj-7?!>1oec&>9(48`lh/: =0hd`'21+4?aoi ;;";6jfn)01-2=cag"9?$94dhl+61/03mce$?;&7:fjj-41!>1oec&=7(58`lh/:1#<7iga(3;*2>bnf!9";6jfn)13-2=cag"8=$94dhl+77/03mce$>=&7:fjj-53!>1oec&<5(48`lh/< <0hd`'5(48`lh/> <0hd`'7(48`lh/0 <0hd`'9(48`lh;87=0hd`311<4?aoi48;5;6jfn=31:2=cag6:?394dhl?51803mce0<;17:fjj9716>1oec2>7?58`lh;914<7iga<0;=2>bnf5;5;6jfn=03:2=cag69=394dhl?67803mce0?=17:fjj9436>1oec2=5?58`lh;:?4<7iga<35=3>bnf5832:5kio>1=;0<l`d7>394dhl?75803mce0>?17:fjj9556>1oec2<3?58`lh;;=427iga<2794;1<l`d7?809;ekm86813mce0909;ekm80813mce0;09;ekm82813mce0509;ekm8<803me~x%>&7:flqq.6!11ocxz'11+;?air|!;:%55kotv+57/?3me~x%?<)99gkpr/9=#37iazt)36-==cg|~#=;'7;emvp-70!11ocxz'19+;?air|!;2%:5kotv+6,><lf$?>&8:flqq.59 20hb{{(30*<>bh}}"9?$64dnww,72.02ndyy&=5(:8`jss ;<"46j`uu*13,><lf$?6&8:flqq.51 =0hb{{(2+;?air|!9;%55kotv+74/?3me~x%==)99gkpr/;:#37iazt)17-==cg|~#?8'8;emvp-2.?2ndyy&:)69gkpr/> =0hb{{(6+4?air|!2";6j`uu*:-2=cg|~7<364dnww846902ndyy2>1?:8`jss488546j`uu>27;><lf0<:18:flqq:6=720hb{{<04=<>bh}}6:;364dnww84>902ndyy2>9?58`jss48437iazt=03:==cg|~7><07;emvp945611ocxz322<;?air|58?255kotv?608?3me~x1<9>99gkpr;:>437iazt=0;:==cg|~7>408;emvp94902ndyy2<0?:8`jss4:;546j`uu>06;><lf0>=18:flqq:4<7k0hb{{<2794;><lf0>;17:flqq:46>1ocxz34?58`jss4<4<7iazt=4=3>bh}}6<2:5kotv?<;1<lf0407;dfjb7h`l<1na}zv2g9emciXoldn~lz`r^t5[4*'P`fbbu.LOSG#C`hbzh~d~-?=.33e?coagVrgbuQ:13z02Z4ddbU{~biPftno7a=aaoeTta`w_431|60X:jf`S}|`g^dvhi*aaoeTkh`jr`vlvZp1W8&ECCK#NNLF052<n`ldSubax^726}51W;iggR~}of]eqij+n`ldSjkaescwkwYq>V;'wnQgar]jjqYddb7; nQgar]pvvr:8%iT~iQirds>5)eXmgki`hQ}su]p}ke:9%iTdl}Pre]geqgXkfex0>#c^fjjZqnl}b6?;"l_icp[rtXlh~jSnaznu?3(fYa}efTjaohs^pppZpfd4;'oRgbpmgnakrf|`eeSywe<0/gZstmVofnhjkee]qab;7$jU|~Rh}ep?2(fYr{lUocxzPrrv>5)eX}gnn~kb`w^nls86+kVbjRayesdokr;7$jU{~hb`ae]oeqcikp7; nQkotv\slbs`49= nQbsfmm[sgk58&hSjPddrwl836:%iTi|`r^kmn`esafdTxt~j=1.`[mgtW|doihcov?3(fYoizUj``a|t^dvhi;6$jUcm~Q}su?2(fYci}kTob{at^uj`qn:1%iTdl}Pws]bgn;7$jU~hQjcb?3(fYdgdgdbRmcobi>4)eX{UjofQcov?3(fYulVzexQxievk9<*dW|ynSkyit^fbpdYdg|d1="l_icp[djjgz~Ti`~{y<2/gZtcWmkmRm`uov\slbs`43'oRayesdokrYkg~7; nQxr^rmpwYpam~c14"l_qplcZcjx}sTxt~j=1.`[rtXlh~jSnaznu]tmaro50&hS}|jlncg[wc`{4;'oRj`uu]qwqYqie7; nQgar]geqgXkfex0>#c^rqkbYa}efTxe|jsi]mabgsmV|j`0:69-a\swYcmy~c18?=,b]svjaXmdzuRzgrdqk[kc`i}oTzlb25-a\twi`Wlg{xtQ{hsgplZgt{lxS{oc=5.`[mgtWkgei3?,b]svjaXn|fgSyf}erj\evubz}U}ma3:01.`khvhfldScobe<djbjYdgrT9<<w37]1gimXx{elSk{cl-a\rdjnlVfd{0>#c^rqmhYaaoeTxt~j=431|60+kVzycjQiumn\p|vb58&hS`kbos{\p|vb58&v?45iigm\|ihW<;9t>8P2bnh[uthoVl~`aQiigm\c`hbzh~d~Rx9_0]{wqY6<2l~`aj4iohfgqbea}oy~i5fnkg`pvdn|lxy;6gat^aoo==iojh~eaj7;ntfvcjhh1{~biPelrw}42<x{elShctx]wlwct`!:"=95rne\ahvsqV~c~h}g(0+20>vugnUna}zv_ujqavn/: ;?7}|`g^gntqX|axne&<)068twi`Wlg{xtQ{hsgpl-2.9=1{~biPelrw}Zrozlyc$8'>4:rqkbYbey~rSyf}erj+2,733yxdkRkbpu{\pmtb{a"<%<:4psmd[`kw|pUdk|h):*53=wzfmTi`~{y^vkv`uo410;2<l4psmd[`kw|pUdk|h^cpw`ts 9#:n6~}of]fiur~W}byi~fParqfvq.6!8h0|ah_dosp|Ys`{oxdRo|sdpw,7/6j2zycjQjmqvz[qnumzbTm~}jru*0-4d<x{elShctx]wlwct`Vkxh|{(5+2f>vugnUna}zv_ujqavnXizyn~y&:)0`8twi`Wlg{xtQ{hsgplZgt{lx$;'>b:rqkbYbey~rSyf}erj\evubz}"<%<l4psmd[`kw|pUdk|h^cpw`ts 1#:h6~}of]fiur~W}byi~fParqfvq:?294:n6~}of]fiur~W}byi~fPndebp`.7!8h0|ah_dosp|Ys`{oxdR`jg`vf,4/6j2zycjQjmqvz[qnumzbTbhintd*1-4d<x{elShctx]wlwct`Vdnklzj(2+2f>vugnUna}zv_ujqavnXflmjxh&;)0`8twi`Wlg{xtQ{hsgplZhboh~n$8'>b:rqkbYbey~rSyf}erj\j`af|l"=%<l4psmd[`kw|pUdk|h^lfcdrb >#:n6~}of]fiur~W}byi~fPndebp`.?!8n0|ah_dosp|Ys`{oxdR`jg`vf8=<7601{~biPftno56=wzfmTjxbc_ujqavn/8 ;87}|`g^dvhiYs`{oxd%?&129svjaXn|fgSyf}erj+6,743yxdkRhzlm]wlwct`!9"=>5rne\bpjkW}byi~f'4(30?uthoVl~`aQ{hsgpl-3.9:1{~biPftno[qnumzb#:$?<;qplcZ`rdeUdk|h)5*56=wzfmTjxbc_ujqavn/0 ;>7}|`g^dvhiYs`{oxd1650?3b?uthoVl~`aQ{hsgplZgt{lx$='>a:rqkbYa}efTxe|jsi]bwvcu|!;"=l5rne\bpjkW}byi~fParqfvq.5!8k0|ah_gwohZrozlycSl}|esv+7,7f3yxdkRhzlm]wlwct`Vkxh|{(5+2e>vugnUmyabPtipfwmYf{zoyx%;&1`9svjaXn|fgSyf}erj\evubz}"=%<o4psmd[cskdV~c~h}g_`qpawr/? ;j7}|`g^dvhiYs`{oxdRo|sdpw,=/6k2zycjQiumn\pmtb{aUj~k}t=:94;7f3yxdkRhzlm]wlwct`Vdnklzj(1+2e>vugnUmyabPtipfwmYimnki%?&1`9svjaXn|fgSyf}erj\j`af|l"9%<o4psmd[cskdV~c~h}g_ogdeqc/; ;j7}|`g^dvhiYs`{oxdR`jg`vf,1/6i2zycjQiumn\pmtb{aUeijo{e)7*5d=wzfmTjxbc_ujqavnXflmjxh&9)0c8twi`Wog`Rzgrdqk[kc`i}o#;$?n;qplcZ`rdeUdk|h^lfcdrb 1#:o6~}of]eqijX|axneQaefcwa9>=87<0~iQllj33?wbXlh~jSnaznu*3-46<zmUomyoPcnwmp-7.991yhRjnt`]`kphs ;#:<6|k_ecweZeh}g~#?$??;sf\`drfWje~by&;)028vaYci}kTob{at)7*55=ulVnjxlQlotlw,3/682xoSio{a^alqkr/? ;;7jPd`vb[firf}"3%<>4re]geqgXkfex1>1139q`Zbf|hUhcx`{<983:0=ulVoe:6|k_sqw7>tt|>1xndzjrs68wwus:k1a}!Pcf-emciXpedsS8?=x24\6fjlWyxdkRhzlm,mcj2<|{n56{addpehjq23kgei84ws]bgn0<{Uh`f??;vp\`drfWje~by&?)028swYci}kTob{at)3*55=pzVnjxlQlotlw,7/682}ySio{a^alqkr/; ;;7z|Pd`vb[firf}"?%<>4ws]geqgXkfex%;&119tvZbf|hUhcx`{(7+24>quWmkmRm`uov+3,773~xThlzn_bmvjq.?!880{Qkauc\gjsi|521<3;4ws]fj3=pzVxxxpNOpbd2?EF=021J7:51zQ7b?34k3<1=><m7g596d4>mrd?554>;o6:=?0<,=3=697?;|Q7`?34k3<1=><m7g596d4>m2Y:8i4:4683>455j>l<6?o=9d9P0a<2<>0;6<==b6d4>7g51o1o9>h50;395~U3n3?8o785120a3c1=:h82i6x[1cf94?7=93;h8v];f;70g?0=9:8i;k952`0:a>"3000:8h5Y48596~s6=>0:7x?:8;28y!7e93l0n8=i:1865?5==8qC8594Z5796~c=l3w/=n<552d8 1?22<9n7d;63;29?j2>j3:17b;98;29?l3f03:17b;;3;29?j34l3:17d;6d;29?l3>=3:17b;>0;29 4d42<987c?m2;28?j37n3:1(<l<:410?k7e:3;07b;?e;29 4d42<987c?m2;08?j37l3:1(<l<:410?k7e:3907b;?c;29 4d42<987c?m2;68?j37j3:1(<l<:410?k7e:3?07b;?9;29 4d42<987c?m2;48?j3703:1(<l<:410?k7e:3=07b;?7;29 4d42<987c?m2;:8?j37>3:1(<l<:410?k7e:3307b;?5;29 4d42<987c?m2;c8?j37<3:1(<l<:410?k7e:3h07b;?3;29 4d42<987c?m2;a8?j37:3:1(<l<:410?k7e:3n07b;?1;29 4d42<987c?m2;g8?j3783:1(<l<:410?k7e:3l07b:ie;29 4d42<987c?m2;33?>i3nm0;6)?m3;707>h6j;0:=65`4ga94?"6j:0>?>5a1c0957=<g=li6=4+1c19165<f8h96<=4;n6ee?6=,8h868=<;o3a6?7332e?j44?:%3a7?34;2d:n?4>5:9l0c>=83.:n>4:329m5g4=9?10c9h8:18'5g5==:90b<l=:058?j2a>3:1(<l<:410?k7e:3;376a;f483>!7e;3?8?6`>b382=>=h=8<1<7*>b28676=i9k81=l54o436>5<#9k919>=4n0`1>4d<3f?:87>5$0`0>0543g;i>7?l;:m656<72-;i?7;<3:l2f7<6l21d9<<50;&2f6<2;:1e=o<51d98k076290/=o=55218j4d528l07b;?a;29 4d42<987c?m2;03?>i3no0;6)?m3;707>h6j;09=65`4g694?"6j:0>?>5a1c0967=<g=l86=4+1c19165<f8h96?=4;h6`3?6=,8h869kn;o3a6?6<3`>h:7>5$0`0>1cf3g;i>7?4;h6`1?6=,8h869kn;o3a6?4<3`>h87>5$0`0>1cf3g;i>7=4;h6`7?6=,8h869kn;o3a6?2<3`>h>7>5$0`0>1cf3g;i>7;4;h6`4?6=,8h869kn;o3a6?0<3`>ij7>5$0`0>1cf3g;i>794;h6aa?6=,8h869kn;o3a6?><3`>ih7>5$0`0>1cf3g;i>774;h6ag?6=,8h869kn;o3a6?g<3`>in7>5$0`0>1cf3g;i>7l4;h6ae?6=,8h869kn;o3a6?e<3`>i57>5$0`0>1cf3g;i>7j4;h6a<?6=,8h869kn;o3a6?c<3`>i;7>5$0`0>1cf3g;i>7h4;h6a1?6=,8h869kn;o3a6?7732c?n94?:%3a7?2bi2d:n?4>1:9j0g5=83.:n>4;e`9m5g4=9;10e9l=:18'5g5=<lk0b<l=:018?l2e93:1(<l<:5gb?k7e:3;?76g;b183>!7e;3>nm6`>b3821>=n<hl1<7*>b287ad=i9k81=;54i5cf>5<#9k918ho4n0`1>41<3`>jh7>5$0`0>1cf3g;i>7?7;:k7ef<72-;i?7:ja:l2f7<6121b8nj50;&2f6<3mh1e=o<51`98m1ed290/=o=54dc8j4d528h07d:lb;29 4d42=oj7c?m2;3`?>o3kh0;6)?m3;6fe>h6j;0:h65f4b;94?"6j:0?il5a1c095`=<a=i36=4+1c190`g<f8h96<h4;h6`5?6=,8h869kn;o3a6?4732c?n;4?:%3a7?2bi2d:n?4=1:9j0dd=83.:n>4;e`9m5g4=:;10e9on:18'5g5=<lk0b<l=:318?l3??3:17o:78;295?6=8rB?4:5+1b090=><g8h;6=44}cda>5<6290;wE:77:&2g7<aj2emm7>5;|`70?6=j:0:;;4>c5yK0=1<R=?1=;u=4;00>73=:009:7<8:3:9a?b=:h09n7<6:3`9a?4f2;>1h7<7:35963<5=3886p*>c38607=#<10>8=5+4d8604=#9hi1=lh4i47`>5<#9k9198j4n0`1>5=<a<?i6=4+1c1910b<f8h96<54i47b>5<#9k9198j4n0`1>7=<a<?26=4+1c1910b<f8h96>54i47;>5<#9k9198j4n0`1>1=<a<?<6=4+1c1910b<f8h96854i475>5<#9k9198j4n0`1>3=<a<?>6=4+1c1910b<f8h96:54i477>5<#9k9198j4n0`1>==<a<>>6=44i4;7>5<<a<3<6=44o4;a>5<<a<?96=4+1c19105<f8h96=54i472>5<#9k9198=4n0`1>4=<a<?;6=4+1c19105<f8h96?54i46e>5<#9k9198=4n0`1>6=<a<>n6=4+1c19105<f8h96954i46g>5<#9k9198=4n0`1>0=<a<>h6=4+1c19105<f8h96;54i46a>5<#9k9198=4n0`1>2=<a<>j6=4+1c19105<f8h96554i4;0>5<<g<>36=44i445>5<#9k919;94n0`1>5=<a<<>6=4+1c19131<f8h96<54i447>5<#9k919;94n0`1>7=<a<<86=4+1c19131<f8h96>54i441>5<#9k919;94n0`1>1=<a<<:6=4+1c19131<f8h96854i443>5<#9k919;94n0`1>3=<a<?m6=4+1c19131<f8h96:54i47f>5<#9k919;94n0`1>==<g=3i6=44o5c4>5<#9k918l64n0`1>5=<g=k=6=4+1c190d><f8h96<54o5c6>5<#9k918l64n0`1>7=<g=k?6=4+1c190d><f8h96>54o5c0>5<#9k918l64n0`1>1=<g=k96=4+1c190d><f8h96854o5c2>5<#9k918l64n0`1>3=<g=k;6=4+1c190d><f8h96:54o5;e>5<#9k918l64n0`1>==<g<<36=44i4c;>5<<a<=:6=4+1c19124<f8h96=54i453>5<#9k919:<4n0`1>4=<a<<m6=4+1c19124<f8h96?54i44f>5<#9k919:<4n0`1>6=<a<<o6=4+1c19124<f8h96954i44`>5<#9k919:<4n0`1>0=<a<<i6=4+1c19124<f8h96;54i44b>5<#9k919:<4n0`1>2=<a<<26=4+1c19124<f8h96554o460>5<<g<9o6=44i4;g>5<<a=3o6=44i45a>5<#9k919:m4n0`1>5=<a<=j6=4+1c1912e<f8h96<54i45:>5<#9k919:m4n0`1>7=<a<=36=4+1c1912e<f8h96>54i454>5<#9k919:m4n0`1>1=<a<==6=4+1c1912e<f8h96854i456>5<#9k919:m4n0`1>3=<a<=?6=4+1c1912e<f8h96:54i450>5<#9k919:m4n0`1>==<a<2>6=4+1c191=0<f8h96=54i4:7>5<#9k919584n0`1>4=<a<286=4+1c191=0<f8h96?54i4:1>5<#9k919584n0`1>6=<a<2:6=4+1c191=0<f8h96954i4:3>5<#9k919584n0`1>0=<a<=m6=4+1c191=0<f8h96;54i45f>5<#9k919584n0`1>2=<a<=o6=4+1c191=0<f8h96554o5;b>5<<a<>=6=44i5;f>5<<a<k26=44o4;5>5<<g<3h6=44i4;6>5<<g<;;6=4+1c19165<f8h96=54o42e>5<#9k919>=4n0`1>4=<g<:n6=4+1c19165<f8h96?54o42g>5<#9k919>=4n0`1>6=<g<:h6=4+1c19165<f8h96954o42a>5<#9k919>=4n0`1>0=<g<:26=4+1c19165<f8h96;54o42;>5<#9k919>=4n0`1>2=<g<:<6=4+1c19165<f8h96554o425>5<#9k919>=4n0`1><=<g<:>6=4+1c19165<f8h96l54o427>5<#9k919>=4n0`1>g=<g<:86=4+1c19165<f8h96n54o421>5<#9k919>=4n0`1>a=<g<::6=4+1c19165<f8h96h54o423>5<#9k919>=4n0`1>c=<g=ln6=4+1c19165<f8h96<>4;n6e`?6=,8h868=<;o3a6?7632e?jn4?:%3a7?34;2d:n?4>2:9l0cd=83.:n>4:329m5g4=9:10c9hn:18'5g5==:90b<l=:068?j2a13:1(<l<:410?k7e:3;>76a;f983>!7e;3?8?6`>b3822>=h<o=1<7*>b28676=i9k81=:54o5d5>5<#9k919>=4n0`1>4><3f>m97>5$0`0>0543g;i>7?6;:m653<72-;i?7;<3:l2f7<6i21d9<;50;&2f6<2;:1e=o<51c98k073290/=o=55218j4d528i07b;>3;29 4d42<987c?m2;3g?>i29;0;6)?m3;707>h6j;0:i65`50394?"6j:0>?>5a1c095c=<g<:j6=4+1c19165<f8h96?>4;n6eb?6=,8h868=<;o3a6?4632e?j94?:%3a7?34;2d:n?4=2:9l0c5=83.:n>4:329m5g4=::10e9m8:18'5g5=<lk0b<l=:198m1e1290/=o=54dc8j4d52810e9m::18'5g5=<lk0b<l=:398m1e3290/=o=54dc8j4d52:10e9m<:18'5g5=<lk0b<l=:598m1e5290/=o=54dc8j4d52<10e9m?:18'5g5=<lk0b<l=:798m1da290/=o=54dc8j4d52>10e9lj:18'5g5=<lk0b<l=:998m1dc290/=o=54dc8j4d52010e9ll:18'5g5=<lk0b<l=:`98m1de290/=o=54dc8j4d52k10e9ln:18'5g5=<lk0b<l=:b98m1d>290/=o=54dc8j4d52m10e9l7:18'5g5=<lk0b<l=:d98m1d0290/=o=54dc8j4d52o10e9l::18'5g5=<lk0b<l=:028?l2e<3:1(<l<:5gb?k7e:3;:76g;b283>!7e;3>nm6`>b3826>=n<k81<7*>b287ad=i9k81=>54i5`2>5<#9k918ho4n0`1>42<3`>i<7>5$0`0>1cf3g;i>7?:;:k7ec<72-;i?7:ja:l2f7<6>21b8lk50;&2f6<3mh1e=o<51698m1gc290/=o=54dc8j4d528207d:nc;29 4d42=oj7c?m2;3:?>o3km0;6)?m3;6fe>h6j;0:m65f4ba94?"6j:0?il5a1c095g=<a=ii6=4+1c190`g<f8h96<m4;h6`e?6=,8h869kn;o3a6?7c32c?o44?:%3a7?2bi2d:n?4>e:9j0f>=83.:n>4;e`9m5g4=9o10e9m>:18'5g5=<lk0b<l=:328?l2e>3:1(<l<:5gb?k7e:38:76g;ac83>!7e;3>nm6`>b3816>=n<hk1<7*>b287ad=i9k81>>54i5;`>5<<g<3;6=4+1c191<4<f8h96=54o4:e>5<#9k9194<4n0`1>4=<g<2n6=4+1c191<4<f8h96?54o4:g>5<#9k9194<4n0`1>6=<g<2h6=4+1c191<4<f8h96954o4:a>5<#9k9194<4n0`1>0=<g<2j6=4+1c191<4<f8h96;54o4::>5<#9k9194<4n0`1>2=<g<236=4+1c191<4<f8h96554o4c5>5<#9k919l94n0`1>5=<g<k>6=4+1c191d1<f8h96<54o4c7>5<#9k919l94n0`1>7=<g<k86=4+1c191d1<f8h96>54o4c1>5<#9k919l94n0`1>1=<g<k:6=4+1c191d1<f8h96854o4c3>5<#9k919l94n0`1>3=<g<3m6=4+1c191d1<f8h96:54o4;f>5<#9k919l94n0`1>==<g<>26=44i467>5<<g=k26=44i4:4>5<<g<3j6=44b5;0>5<6290;w)?l2;da?M2>:2B?4:5`f`83>>{e<0>1<7?50;2x 4e52=237E:62:J7<2=h9k:1<75rb3ag>5<3290;w)?l2;d4?M2>:2B?4:5+11:91>o3>3:17d;?:188m4d32900c<l::188yg21m3:187>50z&2g7<a=2B?5?5G4958 46?281b8;4?::k7g?6=3`?;6=44o0`6>5<<uk><o7>54;294~"6k;0m;6F;939K0=1<@=80(<;::4;:?!7703?0e9850;9j15<722c:n94?::m2f0<722wi8:?50;194?6|,8i96k:4H5;1?M2??2B?>6*>5486=<=#9921=6g;6;29?l372900c<l::188yg20n3:1?7>50z&2g7<a<2B?5?5G4958L14<,8?>6876;%33<?7<a=<1<75f5183>>i6j<0;66sm46`94?2=83:p(<m=:g58L1?53A>3;6F;2:&210<2101/==655:k72?6=3`?;6=44i0`7>5<<g8h>6=44}c644?6=;3:1<v*>c38e0>N31;1C8594H508 4322<327)??8;38m10=831b9=4?::m2f0<722wi8:j50;794?6|,8i96k64H5;1?M2??2B?>6*>5486=<=n<?0;66g;7;29?l372900e<l;:188k4d22900qo:8e;297?6=8r.:o?4i4:J7=7=O<1=0D9<4$076>0?>3-;;47?4i5494?=n=90;66a>b483>>{e<?l1<7;50;2x 4e52o20D97=;I6;3>N3:2.:984:989j03<722c?;7>5;h73>5<<a8h?6=44o0`6>5<<uk><m7>54;294~"6k;0m;6F;939K0=1<@=80(<;::4;:?!7703?0e9850;9j15<722c:n94?::m2f0<722wi8:750;694?6|,8i96k94H5;1?M2??2.:<54:;h65>5<<a<:1<75f1c694?=h9k?1<75rb55;>5<3290;w)?l2;d4?M2>:2B?4:5+11:91>o3>3:17d;?:188m4d32900c<l::188yg20?3:187>50z&2g7<a?2B?5?5G4958 46?2<1b8;4?::k64?6=3`;i87>5;n3a1?6=3th?484?:583>5}#9j81j:5G4808L1>03-;;47;4i5494?=n=90;66g>b583>>i6j<0;66sm49694?2=83:p(<m=:g58L1?53A>3;6*>0986?l212900e8>50;9j5g2=831d=o;50;9~f4c3290?6=4?{%3`6?`23A>2>6F;869'55>=92c?:7>5;h6`>5<<a<:1<75`1c794?=zj8o86=4;:183!7d:3l>7E:62:J7<2=#9921=6g;6;29?l2d2900e8>50;9l5g3=831vn<k=:187>5<7s-;h>7h:;I6:6>N30>1/==651:k72?6=3`>h6=44i4294?=h9k?1<75rb0g2>5<3290;w)?l2;d6?M2>:2B?4:5+11:95>o3>3:17d:l:188m06=831d=o;50;9~f4c7290?6=4?{%3`6?`23A>2>6F;869'55>=92c?:7>5;h6`>5<<a<:1<75`1c794?=zj8nm6=4;:183!7d:3l>7E:62:J7<2=#9921=6g;6;29?l2d2900e8>50;9l5g3=831vn<jj:187>5<7s-;h>7h:;I6:6>N30>1/==651:k72?6=3`>h6=44i4294?=h9k?1<75rb0fg>5<3290;w)?l2;d6?M2>:2B?4:5+11:95>o3>3:17d:l:188m06=831d=o;50;9~f4bd290?6=4?{%3`6?`23A>2>6F;869'55>=92c?:7>5;h6`>5<<a<:1<75`1c794?=zj;>=6=4;:183!7d:3l>7E:62:J7<2=#9921=6g;6;29?l2d2900e8>50;9l5g3=831vn?:::187>5<7s-;h>7h:;I6:6>N30>1/==651:k72?6=3`>h6=44i4294?=h9k?1<75rb367>5<3290;w)?l2;d6?M2>:2B?4:5+11:95>o3>3:17d:l:188m06=831d=o;50;9~f724290?6=4?{%3`6?`23A>2>6F;869'55>=92c?:7>5;h6`>5<<a<:1<75`1c794?=zj;>96=4;:183!7d:3l>7E:62:J7<2=#9921=6g;6;29?l2d2900e8>50;9l5g3=831vn?:>:187>5<7s-;h>7h:;I6:6>N30>1/==651:k72?6=3`>h6=44i4294?=h9k?1<75rb363>5<3290;w)?l2;d6?M2>:2B?4:5+11:95>o3>3:17d:l:188m06=831d=o;50;9~f75a290?6=4?{%3`6?`23A>2>6F;869'55>=92c?:7>5;h6`>5<<a<:1<75`1c794?=zj;9n6=4;:183!7d:3l>7E:62:J7<2=#9921=6g;6;29?l2d2900e8>50;9l5g3=831vn?6j:187>5<7s-;h>7h:;I6:6>N30>1/==651:k72?6=3`>h6=44i4294?=h9k?1<75rb3:g>5<3290;w)?l2;d6?M2>:2B?4:5+11:95>o3>3:17d:l:188m06=831d=o;50;9~f7>d290?6=4?{%3`6?`23A>2>6F;869'55>=92c?:7>5;h6`>5<<a<:1<75`1c794?=zj;2i6=4;:183!7d:3l>7E:62:J7<2=#9921=6g;6;29?l2d2900e8>50;9l5g3=831vn?6n:187>5<7s-;h>7h:;I6:6>N30>1/==651:k72?6=3`>h6=44i4294?=h9k?1<75rb3::>5<3290;w)?l2;d6?M2>:2B?4:5+11:95>o3>3:17d:l:188m06=831d=o;50;9~f7>?290?6=4?{%3`6?`23A>2>6F;869'55>=92c?:7>5;h6`>5<<a<:1<75`1c794?=zj;2<6=4;:183!7d:3l>7E:62:J7<2=#9921=6g;6;29?l2d2900e8>50;9l5g3=831vn?69:187>5<7s-;h>7h:;I6:6>N30>1/==651:k72?6=3`>h6=44i4294?=h9k?1<75rb30`>5<3290;w)?l2;d6?M2>:2B?4:5+11:95>o3>3:17d:l:188m06=831d=o;50;9~f74e290?6=4?{%3`6?`23A>2>6F;869'55>=92c?:7>5;h6`>5<<a<:1<75`1c794?=zj;8j6=4;:183!7d:3l>7E:62:J7<2=#9921=6g;6;29?l2d2900e8>50;9l5g3=831vn?<6:187>5<7s-;h>7h:;I6:6>N30>1/==651:k72?6=3`>h6=44i4294?=h9k?1<75rb30;>5<3290;w)?l2;d6?M2>:2B?4:5+11:95>o3>3:17d:l:188m06=831d=o;50;9~f740290?6=4?{%3`6?`23A>2>6F;869'55>=92c?:7>5;h6`>5<<a<:1<75`1c794?=zj;8=6=4;:183!7d:3l>7E:62:J7<2=#9921=6g;6;29?l2d2900e8>50;9l5g3=831vn?<::187>5<7s-;h>7h:;I6:6>N30>1/==651:k72?6=3`>h6=44i4294?=h9k?1<75rb307>5<3290;w)?l2;d6?M2>:2B?4:5+11:95>o3>3:17d:l:188m06=831d=o;50;9~f71d290?6=4?{%3`6?`23A>2>6F;869K07=#9<?19474$02;>4=n<?0;66g;c;29?l372900c<l::188yg40j3:187>50z&2g7<a=2B?5?5G4958L14<,8?>6876;%33<?7<a=<1<75f4b83>>o283:17b?m5;29?xd5?h0;694?:1y'5f4=n<1C84<4H5:4?M253-;>97;69:&24=<63`>=6=44i5a94?=n=90;66a>b483>>{e:>31<7:50;2x 4e52o?0D97=;I6;3>N3:2.:984:989'55>=92c?:7>5;h6`>5<<a<:1<75`1c794?=zj;=36=4;:183!7d:3l>7E:62:J7<2=O<;1/=8;558;8 46?281b8;4?::k7g?6=3`?;6=44o0`6>5<<uk8<;7>54;294~"6k;0m96F;939K0=1<@=80(<;::4;:?!7703;0e9850;9j0f<722c><7>5;n3a1?6=3th9;;4?:583>5}#9j81j85G4808L1>03A>97)?:5;7:=>"6810:7d:9:188m1e=831b9=4?::m2f0<722wi>:;50;694?6|,8i96k;4H5;1?M2??2B?>6*>5486=<=#9921=6g;6;29?l2d2900e8>50;9l5g3=831vn?9;:187>5<7s-;h>7h:;I6:6>N30>1C8?5+14791<?<,8:36<5f4783>>o3k3:17d;?:188k4d22900qo<>a;290?6=8r.:o?4i5:J7=7=O<1=0D9<4$076>0?>3-;;47?4i5494?=n<j0;66g:0;29?j7e=3:17pl=1883>1<729q/=n<5f49K0<4<@=2<7E:=;%361?3>12.:<54>;h65>5<<a=i1<75f5183>>i6j<0;66sm20:94?2=83:p(<m=:g78L1?53A>3;6F;2:&210<2101/==651:k72?6=3`>h6=44i4294?=h9k?1<75rb334>5<3290;w)?l2;d6?M2>:2B?4:5G439'503==030(<>7:09j03<722c?o7>5;h73>5<<g8h>6=44}c022?6=<3:1<v*>c38e1>N31;1C8594H508 4322<327)??8;38m10=831b8n4?::k64?6=3f;i97>5;|`150<72=0;6=u+1b09b0=O<080D968;I61?!72=3?256*>0982?l212900e9m50;9j15<722e:n84?::a642=83>1<7>t$0a1>c3<@=397E:77:J76>"6=<0>545+11:95>o3>3:17d:l:188m06=831d=o;50;9~f774290?6=4?{%3`6?`23A>2>6F;869K07=#9<?19474$02;>4=n<?0;66g;c;29?l372900c<l::188yg46:3:187>50z&2g7<a=2B?5?5G4958L14<,8?>6876;%33<?7<a=<1<75f4b83>>o283:17b?m5;29?xd5810;694?:1y'5f4=n<1C84<4H5:4?!7703;0e9850;9j0f<722c><7>5;n3a1?6=3th9<:4?:583>5}#9j81j85G4808L1>03-;;47?4i5494?=n<j0;66g:0;29?j7e=3:17pl=0783>1<729q/=n<5f49K0<4<@=2<7)??8;38m10=831b8n4?::k64?6=3f;i97>5;|`140<72=0;6=u+1b09b0=O<080D968;%33<?7<a=<1<75f4b83>>o283:17b?m5;29?xd58=0;694?:1y'5f4=n<1C84<4H5:4?!7703;0e9850;9j0f<722c><7>5;n3a1?6=3th9<>4?:583>5}#9j81j85G4808L1>03-;;47?4i5494?=n<j0;66g:0;29?j7e=3:17pl=0383>1<729q/=n<5f49K0<4<@=2<7)??8;38m10=831b8n4?::k64?6=3f;i97>5;|`144<72=0;6=u+1b09b0=O<080D968;%33<?7<a=<1<75f4b83>>o283:17b?m5;29?xd5890;694?:1y'5f4=n<1C84<4H5:4?!7703;0e9850;9j0f<722c><7>5;n3a1?6=3th9:l4?:583>5}#9j81j85G4808L1>03-;;47?4i5494?=n<j0;66g:0;29?j7e=3:17pl=6883>1<729q/=n<5f49K0<4<@=2<7)??8;38m10=831b8n4?::k64?6=3f;i97>5;|`12=<72=0;6=u+1b09b0=O<080D968;%33<?7<a=<1<75f4b83>>o283:17b?m5;29?xd5>>0;694?:1y'5f4=n<1C84<4H5:4?!7703;0e9850;9j0f<722c><7>5;n3a1?6=3th9:;4?:583>5}#9j81j85G4808L1>03-;;47?4i5494?=n<j0;66g:0;29?j7e=3:17pl=6483>1<729q/=n<5f49K0<4<@=2<7)??8;38m10=831b8n4?::k64?6=3f;i97>5;|`121<72=0;6=u+1b09b0=O<080D968;%33<?7<a=<1<75f4b83>>o283:17b?m5;29?xd5>:0;694?:1y'5f4=n<1C84<4H5:4?!7703;0e9850;9j0f<722c><7>5;n3a1?6=3th9:?4?:583>5}#9j81j85G4808L1>03-;;47?4i5494?=n<j0;66g:0;29?j7e=3:17pl<0583>0<729q/=n<5f79K0<4<@=2<7)??8;38m10=831b8:4?::k7g?6=3`?;6=44o0`6>5<<uk9;?7>55;294~"6k;0m:6F;939K0=1<,8:36<5f4783>>o3?3:17d:l:188m06=831d=o;50;9~f665290>6=4?{%3`6?`13A>2>6F;869'55>=92c?:7>5;h64>5<<a=i1<75f5183>>i6j<0;66sm31394?3=83:p(<m=:g48L1?53A>3;6*>0982?l212900e9950;9j0f<722c><7>5;n3a1?6=3th8<=4?:483>5}#9j81j;5G4808L1>03-;;47?4i5494?=n<>0;66g;c;29?l372900c<l::188yg4an3:197>50z&2g7<a>2B?5?5G4958 46?281b8;4?::k73?6=3`>h6=44i4294?=h9k?1<75rb3dg>5<2290;w)?l2;d5?M2>:2B?4:5+11:95>o3>3:17d:8:188m1e=831b9=4?::m2f0<722wi>km50;794?6|,8i96k64H5;1?M2??2.:<54:;h65>5<<a==1<75f5183>>o6j=0;66a>b483>>{e:oo1<7;50;2x 4e52o<0D97=;I6;3>"6810:7d:9:188m11=831b8n4?::k64?6=3f;i97>5;|`1b4<72:0;6=u+1b090<7<@=397E:77:k7=?6=3`;?n7>5;n3ba?6=3th9j=4?:283>5}#9j8184?4H5;1?M2??2c?57>5;h37f?6=3f;ji7>5;|`1a2<72=0;6=u+1b09500<@=397E:77:k7=?6=3`?96=44i0`a>5<<g8kn6=44}c0fb?6=;3:1<v*>c387=4=O<080D968;h6:>5<<a8>i6=44o0cf>5<<uk8n97>54;294~"6k;0:9;5G4808L1>03`>26=44i4094?=n9kh1<75`1`g94?=zj;on6=4<:183!7d:3>2=6F;939K0=1<a=31<75f15`94?=h9ho1<75rb3g0>5<3290;w)?l2;362>N31;1C8594i5;94?=n=;0;66g>bc83>>i6il0;66sm2df94?5=83:p(<m=:5;2?M2>:2B?4:5f4883>>o6<k0;66a>ad83>>{e:l;1<7:50;2x 4e528?=7E:62:J7<2=n<00;66g:2;29?l7ej3:17b?ne;29?xd5mj0;6>4?:1y'5f4=<0;0D97=;I6;3>o313:17d?;b;29?j7fm3:17pl=dg83>1<729q/=n<51448L1?53A>3;6g;9;29?l352900e<lm:188k4gb2900qo<jb;297?6=8r.:o?4;909K0<4<@=2<7d:6:188m42e2900c<oj:188yg4cl3:187>50z&2g7<6=?1C84<4H5:4?l2>2900e8<50;9j5gd=831d=lk50;9~f7cf29086=4?{%3`6?2>92B?5?5G4958m1?=831b=9l50;9l5dc=831vn?jm:187>5<7s-;h>7?:6:J7=7=O<1=0e9750;9j17<722c:no4?::m2e`<722wi>h750;194?6|,8i9697>;I6:6>N30>1b844?::k20g<722e:mh4?::a6a?=83>1<7>t$0a1>4313A>2>6F;869j0<<722c>>7>5;h3af?6=3f;ji7>5;|`053<72<0;6=u+1b09b3=O<080D968;%33<?7<a=<1<75f4683>>o3k3:17d;?:188k4d22900qo=>5;291?6=8r.:o?4i6:J7=7=O<1=0(<>7:09j03<722c?;7>5;h6`>5<<a<:1<75`1c794?=zj:;?6=4::183!7d:3l=7E:62:J7<2=#9921=6g;6;29?l202900e9m50;9j15<722e:n84?::a745=83?1<7>t$0a1>c0<@=397E:77:&24=<63`>=6=44i5594?=n<j0;66g:0;29?j7e=3:17pl<1383>0<729q/=n<5f79K0<4<@=2<7)??8;38m10=831b8:4?::k7g?6=3`?;6=44o0`6>5<<uk9:=7>55;294~"6k;0m:6F;939K0=1<,8:36<5f4783>>o3?3:17d:l:188m06=831d=o;50;9~f677290>6=4?{%3`6?`13A>2>6F;869'55>=92c?:7>5;h64>5<<a=i1<75f5183>>i6j<0;66sm31d94?3=83:p(<m=:g48L1?53A>3;6*>0982?l212900e9950;9j0f<722c><7>5;n3a1?6=3th8<h4?:483>5}#9j81j;5G4808L1>03-;;47?4i5494?=n<>0;66g;c;29?l372900c<l::188yg4f93:187>50z&2g7<a?2B?5?5G4958 46?2<1b8;4?::k64?6=3`;i87>5;n3a1?6=3th9m?4?:583>5}#9j81j:5G4808L1>03-;;47;4i5494?=n=90;66g>b583>>i6j<0;66sm28a94?2=83:p(<m=:g78L1?53A>3;6*>0982?l212900e9m50;9j15<722e:n84?::a6<d=83>1<7>t$0a1>c3<@=397E:77:&24=<63`>=6=44i5a94?=n=90;66a>b483>>{e;::1<7=50;2x 4e52=3:7E:62:J7<2=n<00;66g>4c83>>i6il0;66sm33d94?5=83:p(<m=:5;2?M2>:2B?4:5f4883>>o6<k0;66a>ad83>>{e;;:1<7:50;2x 4e528?=7E:62:J7<2=n<00;66g:2;29?l7ej3:17b?ne;29?xd4:l0;6>4?:1y'5f4=<0;0D97=;I6;3>o313:17d?;b;29?j7fm3:17pl<1g83>1<729q/=n<51448L1?53A>3;6g;9;29?l352900e<lm:188k4gb2900qo==d;297?6=8r.:o?4;909K0<4<@=2<7d:6:188m42e2900c<oj:188yg56m3:187>50z&2g7<6=?1C84<4H5:4?l2>2900e8<50;9j5gd=831d=lk50;9~f64d29086=4?{%3`6?2>92B?5?5G4958m1?=831b=9l50;9l5dc=831vn>?k:187>5<7s-;h>7?:6:J7=7=O<1=0e9750;9j17<722c:no4?::m2e`<722wi??l50;194?6|,8i9697>;I6:6>N30>1b844?::k20g<722e:mh4?::a74e=83>1<7>t$0a1>4313A>2>6F;869j0<<722c>>7>5;h3af?6=3f;ji7>5;|`06d<72:0;6=u+1b090<7<@=397E:77:k7=?6=3`;?n7>5;n3ba?6=3th8=o4?:583>5}#9j81=884H5;1?M2??2c?57>5;h71>5<<a8hi6=44o0cf>5<<uk9:m7>54;294~"6k;0:9;5G4808L1>03`>26=44i4094?=n9kh1<75`1`g94?=zj:;26=4;:183!7d:3;>:6F;939K0=1<a=31<75f5383>>o6jk0;66a>ad83>>{e;821<7:50;2x 4e528?=7E:62:J7<2=n<00;66g:2;29?l7ej3:17b?ne;29?xd4;l0;694?:1y'5f4=n<1C84<4H5:4?!7703;0e9850;9j0f<722c><7>5;n3a1?6=3th8?i4?:583>5}#9j81j85G4808L1>03-;;47?4i5494?=n<j0;66g:0;29?j7e=3:17pl<3b83>1<729q/=n<5f49K0<4<@=2<7)??8;38m10=831b8n4?::k64?6=3f;i97>5;|`07g<72=0;6=u+1b09b0=O<080D968;%33<?7<a=<1<75f4b83>>o283:17b?m5;29?xd4;h0;694?:1y'5f4=n<1C84<4H5:4?!7703;0e9850;9j0f<722c><7>5;n3a1?6=3th8?44?:583>5}#9j81j85G4808L1>03-;;47?4i5494?=n<j0;66g:0;29?j7e=3:17pl<3983>1<729q/=n<5f49K0<4<@=2<7)??8;38m10=831b8n4?::k64?6=3f;i97>5;|`003<72<0;6=u+1b09b==O<080D968;%33<?3<a=<1<75f4683>>o283:17d?m4;29?j7e=3:17pl=c183>1<729q/=n<51448L1?53A>3;6g;9;29?l352900e<lm:188k4gb2900qo<mf;290?6=8r.:o?4>579K0<4<@=2<7d:6:188m04=831b=ol50;9l5dc=831vn?lj:187>5<7s-;h>7?:6:J7=7=O<1=0e9750;9j17<722c:no4?::m2e`<722wi>oj50;694?6|,8i96<;9;I6:6>N30>1b844?::k66?6=3`;in7>5;n3ba?6=3th9nn4?:583>5}#9j81=884H5;1?M2??2c?57>5;h71>5<<a8hi6=44o0cf>5<<uk8jh7>54;294~"6k;0:9;5G4808L1>03`>26=44i4094?=n9kh1<75`1`g94?=zj;kh6=4;:183!7d:3;>:6F;939K0=1<a=31<75f5383>>o6jk0;66a>ad83>>{e:hh1<7:50;2x 4e528?=7E:62:J7<2=n<00;66g:2;29?l7ej3:17b?ne;29?xd5ih0;694?:1y'5f4=9<<0D97=;I6;3>o313:17d;=:188m4de2900c<oj:188yg4f13:187>50z&2g7<6=?1C84<4H5:4?l2>2900e8<50;9j5gd=831d=lk50;9~f6b5290>6=4?{%3`6?`13A>2>6F;869'55>=92c?:7>5;h64>5<<a=i1<75f5183>>i6j<0;66sm3e294?3=83:p(<m=:g48L1?53A>3;6*>0982?l212900e9950;9j0f<722c><7>5;n3a1?6=3th8h<4?:483>5}#9j81j55G4808L1>03-;;47;4i5494?=n<>0;66g:0;29?l7e<3:17b?m5;29?xd4l:0;684?:1y'5f4=n?1C84<4H5:4?!7703;0e9850;9j02<722c?o7>5;h73>5<<g8h>6=44}c1g0?6==3:1<v*>c38e2>N31;1C8594$02;>4=n<?0;66g;7;29?l2d2900e8>50;9l5g3=831vn>j::186>5<7s-;h>7h9;I6:6>N30>1/==651:k72?6=3`><6=44i5a94?=n=90;66a>b483>>{e;m<1<7;50;2x 4e52o<0D97=;I6;3>"6810:7d:9:188m11=831b8n4?::k64?6=3f;i97>5;|`0`2<72<0;6=u+1b09b3=O<080D968;%33<?7<a=<1<75f4683>>o3k3:17d;?:188k4d22900qo=k8;291?6=8r.:o?4i6:J7=7=O<1=0(<>7:09j03<722c?;7>5;h6`>5<<a<:1<75`1c794?=zj:o?6=4::183!7d:3l=7E:62:J7<2=#9921=6g;6;29?l202900e9m50;9j15<722e:n84?::a7`4=83?1<7>t$0a1>c><@=397E:77:&24=<23`>=6=44i5594?=n=90;66g>b583>>i6j<0;66sm3d194?3=83:p(<m=:g48L1?53A>3;6*>0982?l212900e9950;9j0f<722c><7>5;n3a1?6=3th8i84?:483>5}#9j81j;5G4808L1>03-;;47?4i5494?=n<>0;66g;c;29?l372900c<l::188yg5b>3:197>50z&2g7<a>2B?5?5G4958 46?281b8;4?::k73?6=3`>h6=44i4294?=h9k?1<75rb2g4>5<2290;w)?l2;d5?M2>:2B?4:5+11:95>o3>3:17d:8:188m1e=831b9=4?::m2f0<722wi?h650;794?6|,8i96k84H5;1?M2??2.:<54>;h65>5<<a==1<75f4b83>>o283:17b?m5;29?xd4m00;684?:1y'5f4=n?1C84<4H5:4?!7703;0e9850;9j02<722c?o7>5;h73>5<<g8h>6=44}c1fe?6==3:1<v*>c38e2>N31;1C8594$02;>4=n<?0;66g;7;29?l2d2900e8>50;9l5g3=831vn>m9:186>5<7s-;h>7h9;I6:6>N30>1/==651:k72?6=3`><6=44i5a94?=n=90;66a>b483>>{e;j?1<7;50;2x 4e52o<0D97=;I6;3>"6810:7d:9:188m11=831b8n4?::k64?6=3f;i97>5;|`0g6<72<0;6=u+1b09b3=O<080D968;%33<?7<a=<1<75f4683>>o3k3:17d;?:188k4d22900qo=l2;291?6=8r.:o?4i6:J7=7=O<1=0(<>7:09j03<722c?;7>5;h6`>5<<a<:1<75`1c794?=zj:i?6=4::183!7d:3l=7E:62:J7<2=#9921=6g;6;29?l202900e9m50;9j15<722e:n84?::a7f6=83?1<7>t$0a1>c0<@=397E:77:&24=<63`>=6=44i5594?=n<j0;66g:0;29?j7e=3:17pl<bg83>0<729q/=n<5f99K0<4<@=2<7)??8;78m10=831b8:4?::k64?6=3`;i87>5;n3a1?6=3th8o<4?:483>5}#9j81j;5G4808L1>03-;;47?4i5494?=n<>0;66g;c;29?l372900c<l::188yg5em3:197>50z&2g7<a02B?5?5G4958 46?2<1b8;4?::k73?6=3`?;6=44i0`7>5<<g8h>6=44}c1a7?6=;3:1<v*>c387=4=O<080D968;h6:>5<<a8>i6=44o0cf>5<<uk9i>7>53;294~"6k;0?5<5G4808L1>03`>26=44i06a>5<<g8kn6=44}c1b=?6=<3:1<v*>c38213=O<080D968;h6:>5<<a<81<75f1c`94?=h9ho1<75rb2`2>5<4290;w)?l2;6:5>N31;1C8594i5;94?=n9=h1<75`1`g94?=zj:k<6=4;:183!7d:3;>:6F;939K0=1<a=31<75f5383>>o6jk0;66a>ad83>>{e;k:1<7=50;2x 4e52=3:7E:62:J7<2=n<00;66g>4c83>>i6il0;66sm3`794?2=83:p(<m=:075?M2>:2B?4:5f4883>>o2:3:17d?mb;29?j7fm3:17pl<ag83>6<729q/=n<54838L1?53A>3;6g;9;29?l73j3:17b?ne;29?xd4i:0;694?:1y'5f4=9<<0D97=;I6;3>o313:17d;=:188m4de2900c<oj:188yg5fm3:1?7>50z&2g7<3181C84<4H5:4?l2>2900e<:m:188k4gb2900qo=n1;290?6=8r.:o?4>579K0<4<@=2<7d:6:188m04=831b=ol50;9l5dc=831vn>ok:180>5<7s-;h>7:61:J7=7=O<1=0e9750;9j51d=831d=lk50;9~f6?a290?6=4?{%3`6?72>2B?5?5G4958m1?=831b9?4?::k2fg<722e:mh4?::a7de=8391<7>t$0a1>1?63A>2>6F;869j0<<722c:8o4?::m2e`<722wi?4j50;694?6|,8i96<;9;I6:6>N30>1b844?::k66?6=3`;in7>5;n3ba?6=3th8mo4?:283>5}#9j8184?4H5;1?M2??2c?57>5;h37f?6=3f;ji7>5;|`0=g<72=0;6=u+1b09500<@=397E:77:k7=?6=3`?96=44i0`a>5<<g8kn6=44}c1eg?6==3:1<v*>c38e2>N31;1C8594$02;>4=n<?0;66g;7;29?l2d2900e8>50;9l5g3=831vn>hm:186>5<7s-;h>7h9;I6:6>N30>1/==651:k72?6=3`><6=44i5a94?=n=90;66a>b483>>{e;ok1<7;50;2x 4e52o<0D97=;I6;3>"6810:7d:9:188m11=831b8n4?::k64?6=3f;i97>5;|`0b<<72<0;6=u+1b09b3=O<080D968;%33<?7<a=<1<75f4683>>o3k3:17d;?:188k4d22900qo=i8;291?6=8r.:o?4i6:J7=7=O<1=0(<>7:09j03<722c?;7>5;h6`>5<<a<:1<75`1c794?=zj:l<6=4::183!7d:3l=7E:62:J7<2=#9921=6g;6;29?l202900e9m50;9j15<722e:n84?::a7c0=83?1<7>t$0a1>c0<@=397E:77:&24=<63`>=6=44i5594?=n<j0;66g:0;29?j7e=3:17pl<f483>0<729q/=n<5f79K0<4<@=2<7)??8;38m10=831b8:4?::k7g?6=3`?;6=44o0`6>5<<uk9m87>55;294~"6k;0m:6F;939K0=1<,8:36<5f4783>>o3?3:17d:l:188m06=831d=o;50;9~f637290?6=4?{%3`6?72>2B?5?5G4958m1?=831b9?4?::k2fg<722e:mh4?::a707=83>1<7>t$0a1>4313A>2>6F;869j0<<722c>>7>5;h3af?6=3f;ji7>5;|`017<72=0;6=u+1b09500<@=397E:77:k7=?6=3`?96=44i0`a>5<<g8kn6=44}c167?6=<3:1<v*>c38213=O<080D968;h6:>5<<a<81<75f1c`94?=h9ho1<75rb277>5<3290;w)?l2;362>N31;1C8594i5;94?=n=;0;66g>bc83>>i6il0;66sm37194?2=83:p(<m=:075?M2>:2B?4:5f4883>>o2:3:17d?mb;29?j7fm3:17pl<6583>1<729q/=n<51448L1?53A>3;6g;9;29?l352900e<lm:188k4gb2900qo=95;290?6=8r.:o?4>579K0<4<@=2<7d:6:188m04=831b=ol50;9l5dc=831vn>89:187>5<7s-;h>7?:6:J7=7=O<1=0e9750;9j17<722c:no4?::m2e`<722wi?;950;694?6|,8i96<;9;I6:6>N30>1b844?::k66?6=3`;in7>5;n3ba?6=3th8;44?:583>5}#9j81=884H5;1?M2??2c?57>5;h71>5<<a8hi6=44o0cf>5<<uk9<m7>54;294~"6k;0:9;5G4808L1>03`>26=44i4094?=n9kh1<75`1`g94?=zj:=i6=4;:183!7d:3;>:6F;939K0=1<a=31<75f5383>>o6jk0;66a>ad83>>{e;>i1<7:50;2x 4e528?=7E:62:J7<2=n<00;66g:2;29?l7ej3:17b?ne;29?xd4?m0;694?:1y'5f4=9<<0D97=;I6;3>o313:17d;=:188m4de2900c<oj:188yg5?k3:187>50z&2g7<a?2B?5?5G4958 46?2<1b8;4?::k64?6=3`;i87>5;n3a1?6=3th84i4?:583>5}#9j81j:5G4808L1>03-;;47;4i5494?=n=90;66g>b583>>i6j<0;66sm39:94?3=83:p(<m=:g:8L1?53A>3;6*>0986?l212900e9950;9j15<722c:n94?::m2f0<722wi8>h50;794?6|,8i96k74H5;1?M2??2.:<54>;h65>5<<a==1<75f5183>>o6j?0;66a>b483>>{e<:o1<7;50;2x 4e52o30D97=;I6;3>"6810:7d:9:188m11=831b9=4?::k2f3<722e:n84?::a06b=83?1<7>t$0a1>c?<@=397E:77:&24=<63`>=6=44i5594?=n=90;66g>b783>>i6j<0;66sm42a94?3=83:p(<m=:g;8L1?53A>3;6*>0982?l212900e9950;9j15<722c:n;4?::m2f0<722wi8>l50;794?6|,8i96k74H5;1?M2??2.:<54>;h65>5<<a==1<75f5183>>o6j?0;66a>b483>>{e<:k1<7;50;2x 4e52o30D97=;I6;3>"6810:7d:9:188m11=831b9=4?::k2f3<722e:n84?::a06>=83?1<7>t$0a1>c?<@=397E:77:&24=<63`>=6=44i5594?=n=90;66g>b783>>i6j<0;66sm42594?3=83:p(<m=:g;8L1?53A>3;6*>0982?l212900e9950;9j15<722c:n;4?::m2f0<722wi8>850;794?6|,8i96k74H5;1?M2??2.:<54>;h65>5<<a==1<75f5183>>o6j?0;66a>b483>>{e<:?1<7;50;2x 4e52o30D97=;I6;3>"6810:7d:9:188m11=831b9=4?::k2f3<722e:n84?::a062=83?1<7>t$0a1>c?<@=397E:77:&24=<63`>=6=44i5594?=n=90;66g>b783>>i6j<0;66sm42194?3=83:p(<m=:g;8L1?53A>3;6*>0982?l212900e9950;9j15<722c:n;4?::m2f0<722wi8><50;794?6|,8i96k74H5;1?M2??2.:<54>;h65>5<<a==1<75f5183>>o6j?0;66a>b483>>{e<:;1<7;50;2x 4e52o30D97=;I6;3>"6810:7d:9:188m11=831b9=4?::k2f3<722e:n84?::a066=83?1<7>t$0a1>c?<@=397E:77:&24=<63`>=6=44i5594?=n=90;66g>b783>>i6j<0;66sm43d94?3=83:p(<m=:g;8L1?53A>3;6*>0982?l212900e9950;9j15<722c:n;4?::m2f0<722wi8?j50;794?6|,8i96k74H5;1?M2??2.:<54>;h65>5<<a==1<75f5183>>o6j?0;66a>b483>>{e<;i1<7;50;2x 4e52o30D97=;I6;3>"6810:7d:9:188m11=831b9=4?::k2f3<722e:n84?::a07d=83?1<7>t$0a1>c?<@=397E:77:&24=<63`>=6=44i5594?=n=90;66g>b783>>i6j<0;66sm43c94?3=83:p(<m=:g;8L1?53A>3;6*>0982?l212900e9950;9j15<722c:n;4?::m2f0<722wi8?750;794?6|,8i96k74H5;1?M2??2.:<54>;h65>5<<a==1<75f5183>>o6j?0;66a>b483>>{e<;21<7;50;2x 4e52o30D97=;I6;3>"6810:7d:9:188m11=831b9=4?::k2f3<722e:n84?::a071=83?1<7>t$0a1>c?<@=397E:77:&24=<63`>=6=44i5594?=n=90;66g>b783>>i6j<0;66sm43494?3=83:p(<m=:g;8L1?53A>3;6*>0982?l212900e9950;9j15<722c:n;4?::m2f0<722wi8?;50;794?6|,8i96k74H5;1?M2??2.:<54>;h65>5<<a==1<75f5183>>o6j?0;66a>b483>>{e<;>1<7;50;2x 4e52o30D97=;I6;3>"6810:7d:9:188m11=831b9=4?::k2f3<722e:n84?::a013=83?1<7>t$0a1>c?<@=397E:77:&24=<63`>=6=44i5594?=n=90;66g>b783>>i6j<0;66sm45694?3=83:p(<m=:g;8L1?53A>3;6*>0982?l212900e9950;9j15<722c:n;4?::m2f0<722wi89=50;794?6|,8i96k74H5;1?M2??2.:<54>;h65>5<<a==1<75f5183>>o6j?0;66a>b483>>{e<=81<7;50;2x 4e52o30D97=;I6;3>"6810:7d:9:188m11=831b9=4?::k2f3<722e:n84?::a017=83?1<7>t$0a1>c?<@=397E:77:&24=<63`>=6=44i5594?=n=90;66g>b783>>i6j<0;66sm45294?3=83:p(<m=:g;8L1?53A>3;6*>0982?l212900e9950;9j15<722c:n;4?::m2f0<722wi8>750;794?6|,8i96k74H5;1?M2??2.:<54>;h65>5<<a==1<75f5183>>o6j?0;66a>b483>>{e<;o1<7;50;2x 4e52o30D97=;I6;3>"6810:7d:9:188m11=831b9=4?::k2f3<722e:n84?::a075=83?1<7>t$0a1>c?<@=397E:77:&24=<63`>=6=44i5594?=n=90;66g>b783>>i6j<0;66sm43094?3=83:p(<m=:g;8L1?53A>3;6*>0982?l212900e9950;9j15<722c:n;4?::m2f0<722wi85?50;194?6|,8i96<;?;I6:6>N30>1/==65119jbf<722cmh7>5;n3ba?6=3th?;>4?:283>5}#9j81=8>4H5;1?M2??2.:<54>0:keg?6=3`lo6=44o0cf>5<<uk8?47>53;294~"6k;0:9=5G4808L1>03-;;47?8;hd`>5<<aon1<75`1`g94?=zj8o=6=4<:183!7d:3;><6F;939K0=1<,8:36<94iga94?=nnm0;66a>ad83>>{e9m81<7=50;2x 4e528?;7E:62:J7<2=#9921=:5ffb83>>oal3:17b?ne;29?xd6l80;6>4?:1y'5f4=9<:0D97=;I6;3>"6810:;6gic;29?l`c2900c<oj:188yg7c83:1?7>50z&2g7<6=91C84<4H5:4?!7703;<7dhl:188mcb=831d=lk50;9~f4ea29086=4?{%3`6?7282B?5?5G4958 46?28=0ekm50;9jba<722e:mh4?::a5fc=8391<7>t$0a1>4373A>2>6F;869'55>=9>1bjn4?::ke`?6=3f;ji7>5;|`2ga<72:0;6=u+1b09506<@=397E:77:&24=<6?2cmo7>5;hdg>5<<g8kn6=44}c3`g?6=;3:1<v*>c38215=O<080D968;%33<?703`lh6=44igf94?=h9ho1<75rb0aa>5<4290;w)?l2;364>N31;1C8594$02;>41<aoi1<75ffe83>>i6il0;66sm1bc94?5=83:p(<m=:073?M2>:2B?4:5+11:952=nnj0;66gid;29?j7fm3:17pl>c883>6<729q/=n<51428L1?53A>3;6*>09823>oak3:17dhk:188k4gb2900qo?l8;297?6=8r.:o?4>519K0<4<@=2<7)??8;34?l`d2900ekj50;9l5dc=831vn<m8:180>5<7s-;h>7?:0:J7=7=O<1=0(<>7:058mce=831bji4?::m2e`<722wi=n850;194?6|,8i96<;?;I6:6>N30>1/==65169jbf<722cmh7>5;n3ba?6=3th:o84?:283>5}#9j81=8>4H5;1?M2??2.:<54>7:keg?6=3`lo6=44o0cf>5<<uk;h87>53;294~"6k;0:9=5G4808L1>03-;;47?8;hd`>5<<aon1<75`1`g94?=zj8i86=4<:183!7d:3;><6F;939K0=1<,8:36<94iga94?=nnm0;66a>ad83>>{e:h:1<7:50;2x 4e528?:7E:62:J7<2=#9921j<5ffb83>>oal3:17dhj:188k4gb2900qo<;a;290?6=8r.:o?4>509K0<4<@=2<7)??8;3e?l`d2900ekj50;9jb`<722e:mh4?::a5`>=83>1<7>t$0a1>4363A>2>6F;869'55>=9o1bjn4?::ke`?6=3`ln6=44o0cf>5<<uk82i7>55;294~"6k;0:9?5G4808L1>03-;;47?>;hd`>5<<aon1<75ffd83>>oan3:17b?ne;29?xd5<j0;684?:1y'5f4=9<80D97=;I6;3>"6810:56gic;29?l`c2900ekk50;9jbc<722e:mh4?::a5`g=83?1<7>t$0a1>4353A>2>6F;869'55>=901bjn4?::ke`?6=3`ln6=44igd94?=h9ho1<75rb3c7>5<2290;w)?l2;366>N31;1C8594$02;>4e<aoi1<75ffe83>>oam3:17dhi:188k4gb2900qo=7b;297?6=8r.:o?4>519K0<4<@=2<7)??8;60?l`d2900ekj50;9l5dc=831vn?77:187>5<7s-;h>7?:1:J7=7=O<1=0(<>7:3a8mce=831bji4?::kea?6=3f;ji7>5;|`00=<72<0;6=u+1b09504<@=397E:77:&24=<6j2cmo7>5;hdg>5<<aoo1<75ffg83>>i6il0;66sm35;94?5=83:p(<m=:073?M2>:2B?4:5+11:95d=nnj0;66gid;29?j7fm3:17pl=4d83>6<729q/=n<51428L1?53A>3;6*>09823>oak3:17dhk:188k4gb2900qo?jc;297?6=8r.:o?4>519K0<4<@=2<7)??8;34?l`d2900ekj50;9l5dc=831vn?;?:187>5<7s-;h>7?:1:J7=7=O<1=0(<>7:0d8mce=831bji4?::kea?6=3f;ji7>5;|`2a`<72=0;6=u+1b09507<@=397E:77:&24=<6n2cmo7>5;hdg>5<<aoo1<75`1`g94?=zj;?96=4::183!7d:3;>>6F;939K0=1<,8:36<74iga94?=nnm0;66gie;29?l`a2900c<oj:188yg7a83:197>50z&2g7<6=;1C84<4H5:4?!7703;27dhl:188mcb=831bjh4?::keb?6=3f;ji7>5;|`72f<72=0;6=u+1b09507<@=397E:77:&24=<292cmo7>5;hdg>5<<aoo1<75`1`g94?=zj;3<6=4::183!7d:3;>>6F;939K0=1<,8:3655ffb83>>oal3:17dhj:188mc`=831d=lk50;9~f6>029086=4?{%3`6?7282B?5?5G4958 46?28n0ekm50;9jba<722e:mh4?::a727=8391<7>t$0a1>4373A>2>6F;869'55>=9m1bjn4?::ke`?6=3f;ji7>5;|`01`<72:0;6=u+1b09506<@=397E:77:&24=<6l2cmo7>5;hdg>5<<g8kn6=44}c0`e?6=;3:1<v*>c38215=O<080D968;%33<?7c3`lh6=44igf94?=h9ho1<75rb3`4>5<4290;w)?l2;364>N31;1C8594$02;>4b<aoi1<75ffe83>>i6il0;66sm39494?3=83:p(<m=:071?M2>:2B?4:5+11:95`=nnj0;66gid;29?l`b2900ekh50;9l5dc=831vn>9?:186>5<7s-;h>7?:2:J7=7=O<1=0(<>7:0g8mce=831bji4?::kea?6=3`lm6=44o0cf>5<<uk9>h7>55;294~"6k;0:9?5G4808L1>03-;;47?j;hd`>5<<aon1<75ffd83>>oan3:17b?ne;29?xd5k00;684?:1y'5f4=9<80D97=;I6;3>"6810:i6gic;29?l`c2900ekk50;9jbc<722e:mh4?::a6g0=83?1<7>t$0a1>4353A>2>6F;869'55>=9l1bjn4?::ke`?6=3`ln6=44igd94?=h9ho1<75rb2:6>5<2290;w)?l2;366>N31;1C8594$02;>4c<aoi1<75ffe83>>oam3:17dhi:188k4gb2900qo=9f;291?6=8r.:o?4>539K0<4<@=2<7)??8;3f?l`d2900ekj50;9jb`<722cmj7>5;n3ba?6=3th89n4?:483>5}#9j81=8<4H5;1?M2??2.:<54>e:keg?6=3`lo6=44igg94?=nno0;66a>ad83>>{e:j21<7;50;2x 4e528?97E:62:J7<2=#9921=h5ffb83>>oal3:17dhj:188mc`=831d=lk50;9~f7d2290>6=4?{%3`6?72:2B?5?5G4958 46?28o0ekm50;9jba<722cmi7>5;hde>5<<g8kn6=44}c1;0?6==3:1<v*>c38217=O<080D968;%33<?7b3`lh6=44igf94?=nnl0;66gif;29?j7fm3:17pl<6d83>0<729q/=n<51408L1?53A>3;6*>0982a>oak3:17dhk:188mcc=831bjk4?::m2e`<722wi?8l50;794?6|,8i96<;=;I6:6>N30>1/==651d9jbf<722cmh7>5;hdf>5<<aol1<75`1`g94?=zj;i<6=4::183!7d:3;>>6F;939K0=1<,8:36<k4iga94?=nnm0;66gie;29?l`a2900c<oj:188yg4e<3:197>50z&2g7<6=;1C84<4H5:4?!7703;n7dhl:188mcb=831bjh4?::keb?6=3f;ji7>5;|`1gc<72=0;6=u+1b09507<@=397E:77:&24=<a:2cmo7>5;hdg>5<<aoo1<75`1`g94?=zj:2m6=4::183!7d:3;>>6F;939K0=1<,8:36<84iga94?=nnm0;66gie;29?l`a2900c<oj:188yg5?i3:197>50z&2g7<6=;1C84<4H5:4?!7703;=7dhl:188mcb=831bjh4?::keb?6=3f;ji7>5;|`0<6<72<0;6=u+1b09504<@=397E:77:&24=<6m2cmo7>5;hdg>5<<aoo1<75ffg83>>i6il0;66sm37f94?3=83:p(<m=:071?M2>:2B?4:5+11:95`=nnj0;66gid;29?l`b2900ekh50;9l5dc=831vn>;n:186>5<7s-;h>7?:2:J7=7=O<1=0(<>7:0g8mce=831bji4?::kea?6=3`lm6=44o0cf>5<<uk8h:7>55;294~"6k;0:9?5G4808L1>03-;;47?j;hd`>5<<aon1<75ffd83>>oan3:17b?ne;29?xd5j:0;684?:1y'5f4=9<80D97=;I6;3>"6810:i6gic;29?l`c2900ekk50;9jbc<722e:mh4?::a603=8391<7>t$0a1>4373A>2>6F;869'55>=9m1bjn4?::ke`?6=3f;ji7>5;|`2b6<72:0;6=u+1b09506<@=397E:77:&24=<6l2cmo7>5;hdg>5<<g8kn6=44}c06<?6=<3:1<v*>c38214=O<080D968;%33<?7?3`lh6=44igf94?=nnl0;66a>ad83>>{e9o<1<7:50;2x 4e528?:7E:62:J7<2=#9921=55ffb83>>oal3:17dhj:188k4gb2900qo=60;297?6=8r.:o?4>519K0<4<@=2<7)??8;58mce=831bji4?::m2e`<722wi>h650;094?6|,8i96<:i;I6:6>N30>1/==657:keg?6=3f;ji7>5;|`1a3<72;0;6=u+1b0951`<@=397E:77:&24=<03`lh6=44o0cf>5<<uk8n87>52;294~"6k;0:8k5G4808L1>03-;;4794iga94?=h9ho1<75rb3g1>5<5290;w)?l2;37b>N31;1C8594$02;>2=nnj0;66a>ad83>>{e:l:1<7<50;2x 4e528>m7E:62:J7<2=#9921;6gic;29?j7fm3:17pl=dd83>7<729q/=n<515d8L1?53A>3;6*>0984?l`d2900c<oj:188yg4ck3:1>7>50z&2g7<6<o1C84<4H5:4?!7703=0ekm50;9l5dc=831vn?jn:181>5<7s-;h>7?;f:J7=7=O<1=0(<>7:69jbf<722e:mh4?::a7dg=8381<7>t$0a1>42a3A>2>6F;869'55>=?2cmo7>5;n3ba?6=3th8m54?:383>5}#9j81=9h4H5;1?M2??2.:<548;hd`>5<<g8kn6=44}c1b2?6=:3:1<v*>c3820c=O<080D968;%33<?1<aoi1<75`1`g94?=zj:k?6=4=:183!7d:3;?j6F;939K0=1<,8:36:5ffb83>>i6il0;66sm3`094?4=83:p(<m=:06e?M2>:2B?4:5+11:93>oak3:17b?ne;29?xd4i90;6?4?:1y'5f4=9=l0D97=;I6;3>"6810<7dhl:188k4gb2900qo=6e;296?6=8r.:o?4>4g9K0<4<@=2<7)??8;58mce=831d=lk50;9~f6?d29096=4?{%3`6?73n2B?5?5G4958 46?2>1bjn4?::m2e`<722wi>k<50;094?6|,8i96<:i;I6:6>N30>1/==657:keg?6=3f;ji7>5;|`0f1<72;0;6=u+1b0951`<@=397E:77:&24=<03`lh6=44o0cf>5<<uk99=7>53;294~"6k;0:9=5G4808L1>03-;;47?k;hd`>5<<aon1<75`1`g94?=zj:896=4<:183!7d:3;><6F;939K0=1<,8:36<j4iga94?=nnm0;66a>ad83>>{e;;91<7=50;2x 4e528?;7E:62:J7<2=#9921=i5ffb83>>oal3:17b?ne;29?xd4:=0;6>4?:1y'5f4=9<:0D97=;I6;3>"6810:h6gic;29?l`c2900c<oj:188yg55=3:1?7>50z&2g7<6=91C84<4H5:4?!7703;o7dhl:188mcb=831d=lk50;9~f64129086=4?{%3`6?7282B?5?5G4958 46?28n0ekm50;9jba<722e:mh4?::a771=8391<7>t$0a1>4373A>2>6F;869'55>=9m1bjn4?::ke`?6=3f;ji7>5;|`06=<72:0;6=u+1b09506<@=397E:77:&24=<6l2cmo7>5;hdg>5<<g8kn6=44}c11=?6=;3:1<v*>c38215=O<080D968;%33<?7c3`lh6=44igf94?=h9ho1<75rb2;2>5<4290;w)?l2;364>N31;1C8594$02;>2=nnj0;66gid;29?j7fm3:17pl<4`83>0<729q/=n<51468L1?53A>3;6*>0987?l`d2900ekj50;9jb`<722cmj7>5;n37g?6=3th9994?:783>5}#9j81=8=4H5;1?M2??2.:<54=0:keg?6=3`lo6=44igg94?=nno0;66a>4b83>>i6il0;66sm1g094?0=83:p(<m=:070?M2>:2B?4:5+11:965=nnj0;66gid;29?l`b2900ekh50;9l51e=831d=lk50;9~f10f290jm7>50zJ7<2=#9j81=o94Z579e~462;8157o513827?d=k3;?6<;5}%37e?4<,8:;6>5+11397>"68;087)??3;18 4632:1/==;53:&243<43-om6k=4$02:>6=#99k1?6*>0c80?!77k390(<>k:29'55c=;2.:<k4<;%324?5<,8;:6>5+10097>"69:087)?>4;18 4722:1/=<853:&252<43-;:47=4$03:>6=#98k1?6*>1c80?!76k390(<?k:29'54c=;2.:=k4<;%314?5<,88:6>5+13097>"6::087)?=4;18 4422:1/=?853:&262<43-;947=4$00:>6=#9;k1?6*>2c80?!75k390(<<k:29'57c=;2.:>k4<;%304?5<,89:6>5+12097>"6;:087)?<4;18 4522:1/=>853:&272<43-;847=4$01:>6=#9:k1?6*>3c80?!74k390(<=k:29'56c=;2.:?k4<;%374?5<,8>:6>5+15097>"6<:087)?;4;18 4222:1/=9853:&202<43-;?47=4$06:>7=#9ki18<5+11597>"6jl097):7c;3a<>"30m0:n55ac183?kc5291e=o75259m5gg=:=1e85k5259m0=`=:=1/j=4i3:&2fc<53`>j6=44i5`94?=n<1k1<75fed83>>o>i3:1(<l<:8f8j4d52:10e<m>:188m60=83.:n>4<5:l2f7<732c887>5$0`0>63<f8h96<54i2194?"6j:0896`>b381?>o4:3:1(<l<:278j4d52:10e>?50;&2f6<4=2d:n?4;;:k04?6=,8h86>;4n0`1>0=<a;l1<7*>b2801>h6j;0=76g=e;29 4d42:?0b<l=:698m7b=83.:n>4<5:l2f7<?32c?<7>5$0`0>6`<f8h96=54i2g94?"6j:08j6`>b382?>o4l3:1(<l<:2d8j4d52;10e>m50;&2f6<4n2d:n?4<;:k0f?6=,8h86>h4n0`1>1=<a:k1<7*>b280b>h6j;0>76g<9;29 4d42:l0b<l=:798m6>=83.:n>4<f:l2f7<032c8;7>5$0`0>6`<f8h96554i7a94?"6j:0=n6`>b383?>o1i3:1(<l<:7`8j4d52810e;650;&2f6<1j2d:n?4=;:k53?6=,8h86;l4n0`1>6=<a?<1<7*>b285f>h6j;0?76g95;29 4d42?h0b<l=:498m32=83.:n>49b:l2f7<132c=?7>5$0`0>3d<f8h96:54i7094?"6j:0=n6`>b38;?>o193:1(<l<:7`8j4d52010e;>50;&2f6<1j2d:n?4n;:k6b?6=,8h86;l4n0`1>g=<a<n1<7*>b285f>h6j;0h76g:c;29 4d42?h0b<l=:e98m0d=83.:n>49b:l2f7<b32c>m7>5$0`0>3d<f8h96k54i4;94?"6j:0=n6`>b3824>=n=10;6)?m3;4a?k7e:3;:76g:7;29 4d42?h0b<l=:008?l31290/=o=56c9m5g4=9:10e8;50;&2f6<1j2d:n?4>4:9j11<72-;i?78m;o3a6?7232c<?7>5$0`0>3d<f8h96<84;h51>5<#9k91:o5a1c0952=<a>;1<7*>b285f>h6j;0:465f7183>!7e;3<i7c?m2;3:?>o1n3:1(<l<:7`8j4d528k07d8j:18'5g5=>k1e=o<51c98m3b=83.:n>49b:l2f7<6k21b:44?:%3a7?0e3g;i>7?k;:k6a?6=,8h86;l4n0`1>4c<3`?86=4+1c192g=i9k81=k54i8;94?"6j:0246`>b383?>o>?3:1(<l<:8:8j4d52810e4850;&2f6<>02d:n?4=;:k:1?6=,8h86464n0`1>6=<gmk1<7*>b28g=>h6j;0;76ak8;29 4d42m30b<l=:098ka0=83.:n>4k9:l2f7<532eo97>5$0`0>a?<f8h96>54oe694?"6j:0o56`>b387?>ic;3:1(<l<:e;8j4d52<10ci<50;&2f6<c12d:n?49;:mg5?6=,8h86i74n0`1>2=<gm:1<7*>b28g=>h6j;0376alf;29 4d42m30b<l=:898kfc=83.:n>4k9:l2f7<f32ehh7>5$0`0>a?<f8h96o54ob`94?"6j:0o56`>b38`?>idi3:1(<l<:e;8j4d52m10cn750;&2f6<c12d:n?4j;:m`<?6=,8h86i74n0`1>c=<gj=1<7*>b28g=>h6j;0:<65`c783>!7e;3n27c?m2;32?>id=3:1(<l<:e;8j4d528807bm;:18'5g5=l01e=o<51298kf5=83.:n>4k9:l2f7<6<21do?4?:%3a7?b>3g;i>7?:;:mf5?6=,8h86i74n0`1>40<3fo;6=4+1c19`<=i9k81=:54oed94?"6j:0o56`>b382<>=hll0;6)?m3;f:?k7e:3;276akd;29 4d42m30b<l=:0c8?jbd290/=o=5d89m5g4=9k10cil50;&2f6<c12d:n?4>c:9l`2<72-;i?7j6;o3a6?7c32eho7>5$0`0>a?<f8h96<k4;na2>5<#9k91h45a1c095c=<gli1<7*>b28ff>h6j;0;76aja;29 4d42lh0b<l=:098k`?=83.:n>4jb:l2f7<532en47>5$0`0>`d<f8h96>54idf94?=n9j:1<75f49`94?=n0m0;6)?m3;:`?k7e:3:07d6m:18'5g5=0j1e=o<51:9j<<<72-;i?76l;o3a6?4<3`236=4+1c19<f=i9k81?65f8683>!7e;32h7c?m2;68?l>1290/=o=58b9m5g4==21b484?:%3a7?>d3g;i>784;h:7>5<#9k914n5a1c093>=n0:0;6)?m3;:`?k7e:3207d6=:18'5g5=0j1e=o<59:9j<4<72-;i?76l;o3a6?g<3`2;6=4+1c19<f=i9k81n65f7d83>!7e;32h7c?m2;a8?l1c290/=o=58b9m5g4=l21b;n4?:%3a7?>d3g;i>7k4;h5a>5<#9k914n5a1c09b>=n?h0;6)?m3;:`?k7e:3;;76g89;29 4d421i0b<l=:038?l1?290/=o=58b9m5g4=9;10e:950;&2f6<?k2d:n?4>3:9j33<72-;i?76l;o3a6?7332c<97>5$0`0>=e<f8h96<;4;h;7>5<#9k914n5a1c0953=<a091<7*>b28;g>h6j;0:;65f9383>!7e;32h7c?m2;3;?>o>93:1(<l<:9a8j4d528307d7?:18'5g5=0j1e=o<51`98m=`=83.:n>47c:l2f7<6j21b4h4?:%3a7?>d3g;i>7?l;:k;e?6=,8h865m4n0`1>4b<3`=m6=4+1c19<f=i9k81=h54i6694?"6j:03o6`>b382b>=n1l0;6)?m3;;g?k7e:3:07d7l:18'5g5=1m1e=o<51:9j=g<72-;i?77k;o3a6?4<3fh36=4+1c19f2=i9k81<65`b783>!7e;3h<7c?m2;38?jd3290/=o=5b69m5g4=:21dn>4?:%3a7?d03g;i>7=4;n`1>5<#9k91n:5a1c090>=hj80;6)?m3;`4?k7e:3?07bl?:18'5g5=j>1e=o<56:9lec<72-;i?7l8;o3a6?1<3fkn6=4+1c19f2=i9k81465`ae83>!7e;3h<7c?m2;;8?jgd290/=o=5b69m5g4=i21dmo4?:%3a7?d03g;i>7l4;nc:>5<#9k91n:5a1c09g>=hi10;6)?m3;`4?k7e:3n07bo8:18'5g5=j>1e=o<5e:9le3<72-;i?7l8;o3a6?`<3fk>6=4+1c19f2=i9k81==54o`694?"6j:0i;6`>b3825>=hi:0;6)?m3;`4?k7e:3;976an2;29 4d42k=0b<l=:018?jg6290/=o=5b69m5g4=9=10cl>50;&2f6<e?2d:n?4>5:9lfc<72-;i?7l8;o3a6?7132eii7>5$0`0>g1<f8h96<94;n`g>5<#9k91n:5a1c095==<gki1<7*>b28a3>h6j;0:565`bc83>!7e;3h<7c?m2;3b?>iei3:1(<l<:c58j4d528h07bl6:18'5g5=j>1e=o<51b98kg3=83.:n>4m7:l2f7<6l21dml4?:%3a7?d03g;i>7?j;:m:b?6=,8h86o94n0`1>4`<3fo<6=4+1c19a3=i9k81<65`e483>!7e;3o=7c?m2;38?jc3290/=o=5e79m5g4=:21di>4?:%3a7?c13g;i>7=4;|q6=6<72?qU94=4=3c3>cb<5;3n6km4=3c7>c`<5;336kk4=3;4>ce<uz?2=7>57by]0d?<V<3h7S;6a:\7=d=Y=0<0R8:7;_7:f>X2<01U8l94^5c5?[2f=2T?m95Q4`18Z1g53W>j=6P;a19]0<`<V<k=7S;n5:\6e1=Y=h90R8o=;_7b5>X2i91U94h4^4;f?[3>82T>4k5Q59g8Z0>c3W?3o6P:8c9]1=g<V<227S;78:?7=6<ai27?;i4:0:?72c<2827?;l4:0:?73<<2827?;54:0:?732<2827?484:0:?7<1<28279i:4:2:?1a0<2:279i>4:2:?1a4<2:279hk4:2:?1`a<2:279ho4:2:?1`<<2:278=54>bc9>6f6==;16>oh5539>6gc==;16>oj5539>6ge==;16>lj5539>6de==;16>ll5539>6dg==;16>l75539>7d?==;16?l95539>7d3==;16?l=5539>7d7==;16?4h5539>7<b==;16?4l5539>706==;16?8?5539>704==;16?8=5539>702==;16?;=5539>732==;16?;;5539>730==;16?;95539>72?==;16?:o5539>72d==;16?:m5539>72b==;168;o59`9>03g=9j:0198n:5:a?821i32o70:9a;:a?821i32270:9a;:;?821i32<70:9a;:5?821i32>70:9a;:7?821i32870:9a;:1?821i32:70:9a;:3?821i3=n70:9a;5g?821i3=h70:9a;5a?821i3=j70:9a;5:?821i3=370:9a;54?821i3==70:9a;56?821i33?70:9a;;0?821i33970:9a;;2?821i33;70:9a;:e?821i32n70:9a;:b?821i3=m70:9a;57?821i33n70:9a;;`?821i33i7p}<8983>7}Y<0h01>67:0`6?xu21<0;6:uQ5878910b2=i0199l:0`7?820j3;i863;7e82f1=:<?l1=o:4=55b>4d33ty9m?4?:3y]16b<5;k96<l:;|q6e=<72:qU9l64=2;3>ce<5:3:6km4}r7;3?6=>>qU9594=3ag>10<5==:6984=553>10<5=<m6984=55:>10<5==36984=554>10<5;>=6984=366>10<5;>?6984=360>10<5;>96984=362>10<5;>;6984=31e>10<5;9n6984=3:f>10<5;2o6984=3:`>10<5;2i6984=3:b>10<5;226984=3:;>10<5;2<6984=3:5>10<5;=h6984=35a>10<5;=j6984=35:>10<5;=36984=354>10<5;==6984=356>10<5;=?6984=32;>10<5;:<6984=325>10<5;:>6984=327>10<5;:86984=321>10<5;::6984=323>10<5::?6984=220>10<5::96984=222>10<5::;6984=3de>10<5;lo6984=3d`>10<5;ln6984=235>10<5:;>6984=237>10<5:;86984=231>10<5:;:6984=233>10<5::m6984=22f>10<5;k:6984=3c1>10<5;3h6984=3;a>10<5=9m6984=51f>10<5=9o6984=51`>10<5=9i6984=51b>10<5=936984=514>10<5=9=6984=516>10<5=9?6984=510>10<5=996984=512>10<5=9;6984=50e>10<5=8o6984=50`>10<5=8i6984=50b>10<5=826984=50;>10<5=8<6984=505>10<5=8>6984=507>10<5=>>6984=567>10<5=>86984=561>10<5=>:6984=563>10<5=926984=50f>10<5=886984=501>10<5=<j69l4}r1;`?6=:rT>8>5239f95g3<uz?2h7>55dy]1<b<5=<n6984=55`>10<5==m6984=55a>10<5==o6984=55f>10<5==j6984=5:6>10<5=2?6984=0g7>10<58o86984=0g1>10<58o:6984=0g3>10<58nm6984=0ff>10<58no6984=0f`>10<5;8h6984=30a>10<5;8j6984=30:>10<5;836984=304>10<5;8=6984=306>10<5;8?6984=33b>10<5;;26984=33;>10<5;;<6984=335>10<5;;>6984=337>10<5;;86984=331>10<5;<j6984=34:>10<5;<36984=344>10<5;<=6984=346>10<5;<?6984=340>10<5;<96984=21f>10<5:9o6984=21`>10<5:9i6984=21b>10<5:926984=21;>10<5:>=6984=2f1>10<5:n;6984=2f2>10<5:n86984=2f7>10<5:n>6984=2f5>10<5:n<6984=2f;>10<5:o?6984=2g1>10<5:o86984=2g6>10<5:o=6984=2g4>10<5:o36984=2g:>10<5:oj6984=2a5>10<5:i>6984=2a0>10<5:i96984=2a7>10<5:i;6984=2`e>10<5:i:6984=2`f>10<5:lh6984=2da>10<5:lj6984=2d:>10<5:l36984=2d4>10<5:l=6984=2d6>10<5:l?6984=2:`>10<5:2o6984=2:;>10<5=<j69o4}r172?6=:rT>:55235495g3<uz>:m7>52z\655=:<:l1=o;4}r62=?6=:rT><k5242g95g3<uz>:47>52z\64`=:<:n1=o;4}r623?6=:rT><i5242a95g3<uz>::7>52z\64f=:<:h1=o;4}r621?6=:rT><o5242c95g3<uz>:?7>52z\64<=:<:21=o;4}r626?6=:rT><55242595g3<uz>:=7>52z\642=:<:<1=o;4}r624?6=:rT><;5242795g3<uz>;j7>52z\640=:<:>1=o;4}r63a?6=:rT><95242195g3<uz>;h7>52z\646=:<:81=o;4}r63g?6=:rT><?5242395g3<uz>;n7>52z\644=:<::1=o;4}r63e?6=:rT><=5243d95g3<uz>;47>52z\7b`=:<;n1=o;4}r633?6=:rT?ji5243a95g3<uz>;:7>52z\7bf=:<;h1=o;4}r631?6=:rT?jo5243c95g3<uz>;87>52z\7bd=:<;31=o;4}r637?6=:rT?j45243:95g3<uz>;>7>52z\7b==:<;=1=o;4}r635?6=:rT?j:5243495g3<uz>;<7>52z\7b3=:<;?1=o;4}r1eb?6=:rT?j85243695g3<uz>9=7>52z\653=:<=?1=o;4}r614?6=:rT>=85245695g3<uz>:j7>52z\651=:<=91=o;4}r62a?6=:rT>=>5245095g3<uz>:h7>52z\657=:<=;1=o;4}r62g?6=:rT>=<5245295g3<uz>:n7>52z\64d=:<:31=o;4}r620?6=:rT?jk5243g95g3<uz>;57>52z\7b1=:<;91=o;4}r1ea?6=:rT?j>5243095g3<uz>nn7>52z\7g2=:<?k1545rs5g:>5<5sW>h:63;6`85g>{t<l21<7<t^5a6?821i3<j7p};e683>7}Y<j>0198n:7:8yv2b>3:1>vP;c29>03g=>>1v9k::181[2d:27?:l496:p0`5=838pR9m?;<65e?023ty?i?4?:3y]0g`<5=<j6;:4}r6f5?6=:rT?nh5247c926=z{=o;6=4={_6a`>;3>h02;6s|4ed94?4|V=hh70:9a;41?xu3ll0;6?uQ4c`8910f2?;0q~:kd;296~X3jh168;o5619~w1bd2909wS:m9:?72d<2n2wx8il50;0xZ1d?34>=m7;k;|q7`d<72;qU8o94=54b>0e<uz>o47>52z\7f0=:<?k19o5rs5f4>5<5sW>i863;6`86e>{t<m<1<7<t^5`0?821i33=7p};d483>7}Y<k80198n:4;8yv2c<3:1>vP;b09>03g==11v9j<:181[2e827?:l4:7:p0a4=838pR9oi;<65e?313ty?h<4?:3y]0dc<5=<j68;4}r6g4?6=:rT?mi5247c911=z{=im6=4={_6bg>;3>h0<?6s|4g094?4|V=io70:9a;51?xu3n80;6?uQ4ba8910f20?0q~:i0;296~X3kk168;o5709~w1ca2909wS:la:?72d<082wx8hk50;0xZ1e>34>=m78i;|q7aa<72;qU8n64=54b>3c<uz>no7>52z\7g4=:<?k1:i5rs5g7>5<5sW>i:63;6`85=>{t<m31<7<t^5ca?821i3?n7p};cd83>7}Y<hk0198n:418yv72i3:1nv3;9582f5=::l3184522e;90<=:;82184522ca90<=::h3184523``90<=:;0h1845234290<=:;?91845236;90<=z{;in6=4={<0``?37348hj7?ne:p020=83;3w0<ld;3a0>;3?00:n85231690f=:;9918n5231090f=:;9;18n5231290f=::ol18n522gf90f=::oi1=o:4=3df>1e<5:;=69m4=236>1e<5:;?69m4=230>1e<5:;969m4=232>1e<5:;;69m4=22e>1e<5::n69m4=3c2>4d3348j>7?m4:?1=f<3k2795o4;c:p6fb=83>p1?mk:0`6?84>m3lm70:9c;d`?84>?3lo7p};7b83>7}:<?o19=5246a95g3<uz>=i7>55z?72`<6j<16?5l5fb9>7=`=nj16?5o5fb9>71g=nl1v99m:185820k3?;70:8b;3a1>;4<?0:n95239a95g2<5:2o6<l;;<1;<?7e<2wx8:>50;1x91162<:0199?:0`6?821n3><7p};7083>7}:<>;1=o;4=550>ce<uz><i7>53z?73c<2827?;i4;7:?73`<6j<1v99i:181820n3;i963;808eg>{t<>k1<7<t=55a>06<5==j6<l:;|q72c<72:q68:>5519>03`=9k?0199<:gf8yv20l3:1?v3;7e82f0=:<>o19=524939ba=z{==96=4;{<64=?7e<27?;54>b59>021=9k>0199<:0cf?xu3?<0;6?;t=55;>4d2348?:7:l;<071?2d348?87:l;<077?2d348?>7:l;<075?2d348?<7:l;<00b?2d3488i7:l;<0;a?2d3483h7:l;<0;g?2d3483n7:l;<0;e?2d348357:l;<0;<?2d3483;7:l;<0;2?2d348<o7:l;<04f?2d348<m7:l;<04=?2d348<47:l;<043?2d348<:7:l;<041?2d348<87:l;<03<?2d348;;7:l;<032?2d348;97:l;<030?2d348;?7:l;<036?2d348;=7:l;<034?2d3ty?;94?:35x911028h>70:<f;3a2>;3;l0:n;5242f95g0<5=9h6<l9;<60f?7e>27??l4>b79>06>=9k<019=8:0`5?824>3;i:63;3482f3=:<:>1=o84=510>4d134>8>7?m6:?774<6j?168>>51c48914a28h=70:=d;3a2>;3:j0:n;5243`95g0<5=8j6<l9;<61=?7e>27?>54>b79>071=9k<019<9:0`5?825=3;i:63;2582f3=:<=?1=o84=567>4d134>??7?m6:?707<6j?1689?51c48912728h=70:<9;3a2>;3:l0:n;5243195g0<5=896<l9;<65g?`c34>=m7?l1:p0=6=839p196::0`7?82?<3;i863;8082e`=z{=286=4=cz?7<0<6j<16?>k54b9>76b=<j16?>m54b9>76d=<j16?>o54b9>76?=<j16?>654b9>7a4=<j16?i>54b9>7a7=9k>01>j<:5a896b32=i01>j::5a896b12=i01>j8:5a896b?2=i01>k;:5a896c528h?70=j3;6`?85b=3>h70=j6;6`?85b?3>h70=j8;6`?85b13>h70=ja;6`?85d>3>h70=l5;6`?85d;3>h70=l2;6`?85d<3>h70=l0;6`?85en3;i863<c087g>;4jl0:n9523ga90f=:;oh18n523gc90f=:;o318n523g:90f=:;o=18n523g490f=:;o?18n523g690f=z{=296=4=5z?7<1<6j<16=h:54b9>5`5=<j16=h<54b9>5`7=<j16=h>54b9>5a`=<j16=ik54b9>5ab=<j16=im54b9>67e=<j16>?l54b9>67g=<j16>?754b9>67>=<j16>?954b9>670=<j16>?;54b9>672=<j16><o54b9>64?=<j16><654b9>641=<j16><854b9>643=<j16><:54b9>645=<j16><<54b9>63g=<j16>;754b9>63>=<j16>;954b9>630=<j16>;;54b9>632=<j16>;=54b9>634=<j1v?<<:18687b<3?;70<=c;3a1>;6m?0mh63>e98eg>;6mh0mj6s|1e`94?3|58o?6<l:;<1;3?`c349<=7hk;<16a?`c349957hk;|q2a0<72;q6=h=5519>5`0=9ho0q~?ka;291~;6m:0:n8523949bf=:;>:1jn5234f9bf=:;;21ji5rs0g4>5<5s4;n>7;?;<3f<?7fm2wx=i750;7x94c528h>70=76;df?85083ln70=:d;df?855?3lo7p}>e883>3}:9l;19=521dc95dc<58oh6kj4=0gf>ce<58l;6kk4=0d1>c`<uz;o47>55z?2a4<6j<16?5;5fb9>73`=nj16?8m5fb9>770=nm1v<km:18187b83?;70?jc;3ba>{t9m=1<7;t=0g3>4d2349397hj;<15b?`b349>o7hj;<111?`c3ty:ii4?:3y>5a`==916=hk51`g8yv7c>3:19v3>dg82f0=:;1>1jn5237g9bf=:;<h1jn523369ba=z{8om6=4={<3ga?3734;m<7?ne:p5a3=83?p1<jj:0`6?85?<3ln70=9e;df?852j3ln70==3;dg?xu6n80;6?u21ef915=:9o91=lk4}r3g0?6==r7:hi4>b49>7=5=nj16?;j5fb9>70g=nj16??<5fe9~w4`22909w0?kc;73?87a>3;ji6s|1e194?3|58nh6<l:;<1;7?`b349=h7hj;<16e?`b3499=7hk;|q1<0<72<q6>985519>6=c=9k?01?:7:gf8972f2oi01?:l:gd8yv44l3:1?v3=4782f0=::jk1jn522c59bf=z{;><6=4={<071?37348?47?ne:p66e=839p1?:::0`6?84d13lo70<m6;dg?xu5<00;6?u2256915=::=k1=lk4}r00f?6=;r79894>b49>6f?=no16>o85fg9~w72e290=w0<;3;73?843k3;ji63=4d8e`>;5=90mo63=538ea>;5==0mj6s|22c94?5|5;>86<l:;<0`<?`c348i97hk;|q10a<72;q6>9<5519>61c=9ho0q~<<9;297~;5<;0:n8522b:9bc=::k?1jk5rs36e>5<5s48?=7;?;<064?7fm2wx>>650;1x972628h>70<l7;dg?84e<3lo7p}=5083>7}::=:19=5224095dc<uz88;7>53z?105<6j<16>n95fg9>6g2=no1v?;<:181844n3?;70<:5;3ba>{t::<1<7=t=31e>4d2348h:7hk;<0a7?`c3ty99:4?:3y>66c==916>8651`g8yv44=3:1?v3=3d82f0=::j<1jk522c19bc=z{;=86=4={<0;a?37348<o7?m5:p624=838p1?6k:428971e28h>7p}=8583>1}::1n1=o;4=36;>ce<5;>j6kj4=36`>cc<uz8<=7>52z?1<f<28279;l4>b49~w7>42908w0<7c;3a1>;5<h0mi63=4b8e`>{t:>:1<7<t=3:a>06<5;=26<l:;|q1<7<72;q6>5l51c78972d2oi0q~<9f;296~;50h0><63=7982f0=z{;2:6=4:{<0;e?7e=2798h4ic:?115<al2799?4if:?111<am2wx>;k50;0x97>>2<:01?98:0`6?xu5090;69u229;95g3<5;?;6kk4=371>ce<5;??6kj4}r05`?6=:r79454:0:?133<6j<1v?9i:18084?03;i963=538e`>;5==0mo6s|27a94?4|5;2<68>4=356>4d23ty9;h4?:2y>6=1=9k?01?;::ga8973?2on0q~<9b;296~;50?0><63=7582f0=z{;=o6=4={<0;2?7e=279954ic:p647=838p1?<l:428977f28h>7p}=1183>7}::;h19=5220;95g3<uz89>7>54z?16g<6j<16=h85fb9>5`>=nm16=ho5fd9~w76a2909w0<=a;73?84603;i96s|23394?5|5;8j6<l:;<3f<?`b34;nm7hk;|q14`<72;q6>?75519>641=9k?0q~<=0;296~;5:00:n8521dc9bf=z{;:o6=4={<01<?37348::7?m5:p64`=83?p1?<7:0`6?87bk3lh70?je;dg?87a83lm70?i2;df?xu58j0;6?u2235915=::8?1=o;4}r02a?6=<r79>:4>b49>5`c=nl16=k>5fb9>5c4=nm1v?>m:181845>3?;70<>4;3a1>{t:8n1<7=t=305>4d234;m<7hk;<3e6?`d3ty9<l4?:3y>673==916><=51c78yv46k3:1?v3=2482f0=:9o91jn521g49ba=z{;:26=4={<010?37348:>7?m5:p64d=838p1?<;:0`6?87a>3lh7p}=6083>7}::>i19=5227c95g3<uz8=<7>52z?13g<28279:44>b49~w73a2909w0<8a;73?84103;i96s|24g94?4|5;=268>4=344>4d23ty99i4?:3y>62>==916>;851c78yv42k3:1>v3=76864>;5><0:n85rs37a>5<5s48<:7;?;<050?7e=2wx>8o50;0x97122<:01?8<:0`6?xu5=00;6?u2266915=::?81=o;4}r3eb?6=:r79=l4:0:?14=<6j<1v<hj:18184613?;70<?7;3a1>{t9on1<7<t=33;>06<5;:=6<l:;|q2bf<72;q6><95519>653=9k?0q~?ib;296~;59?0><63=0582f0=z{8lj6=4={<021?37348;?7?m5:p5c?=838p1??;:428976528h>7p}>f983>7}::8919=5221395g3<uz;m;7>52z?157<28279<=4>b49~w66c290>w0<?8;73?856>3;i963>c28eg>;5j>0mh63;6`874>{t:;n1<7<t=324>06<58i86<oj;|q16`<72;q6>=85519>5f2=9ho0q~<=f;296~;58<0><63>c482e`=z{;9;6=4={<030?3734;h:7?ne:p667=838p1?><:42894e028kn7p}=3383>7}::9819=521b:95dc<uz88?7>52z?144<2827:o44>ad9~w7532909w0<?0;73?87di3;ji6s|3g194?2|5;<j68>4=2d`>4d234;hn7hl;<65e?513ty94k4?:3y>63?==916=nl51`g8yv4>83:1>v3=69864>;6kj0:mh5rs3;2>5<5s48=;7;?;<3``?7fm2wx>4<50;0x97012<:01<mj:0cf?xu51:0;6?u2277915=:9jl1=lk4}r0:0?6=:r79:94:0:?2`5<6il1v?7::181841;3?;70?k1;3ba>{t:0<1<7<t=341>06<58n96<oj;|q052<728?p1>>;:55896642==01>>=:55896662==01>>?:55897`a2==01?hk:55897`d2==01?hj:55896712==01>?::55896732==01>?<:55896752==01>?>:55896772==01>>i:558966b2==0198l:gg897?028kn70<lf;dg?xu5l10;6?u2316915=::o;1=lk4}r0ef?6=<r78<94>b49>740==916>no5fe9>6c4=nj1v?j8:181857;3?;70<i0;3ba>{t:ok1<7:t=220>4d2349:97;?;<0`=?`d348n47hl;|q1`3<72;q6?=<5519>6``=9ho0q~<i9;290~;48;0:n852306915=::j31jh522d49bf=z{;n>6=4={<135?37348ni7?ne:p6c>=83>p1>>>:0`6?856;3?;70<l8;d`?84b<3lh7p}=d583>7}:;9:19=522df95dc<uz8m;7>54z?045<6j<16?<<5519>6f>=nl16>h<5fb9~w7b42909w0<if;73?84bk3;ji6s|2g494?2|5;lm6<l:;<125?37348h;7hl;<0f4?`d3ty9h<4?:3y>6cb==916>ho51`g8yv4a<3:18v3=fe82f0=:;9l19=522b49bf=::mi1jn5rs3f3>5<5s48mo7;?;<0f=?7fm2wx>k=50;6x97`d28h>70=?e;73?84d>3ln70<ka;d`?xu5l;0;6?u22gg915=::lh1=lk4}r0e1?6=<r79jh4>b49>746==916>n95fd9>6ac=nj1v?k8:18184a93>270<j7;3ba>{t:o81<7<t=3d2>42e348m>7?ne:p6`3=839p1?h?:5;897c02=301?k::0cf?xu5m10;6>u22g2951d<5;o<6<lm;<0f<?7fm2wx>h=50;1x97ca2=301?k::5;897c428kn7p}=e783>6}::ll1=9l4=3g6>4de348n:7?ne:p6`7=839p1?kj:5;897c42=301?k>:0cf?xu5m=0;6>u22dg951d<5;o86<lm;<0f0?7fm2wx>ih50;1x97cc2=301?k>:5;897ba28kn7p}=e383>6}::ln1=9l4=3g2>4de348n>7?ne:p6ab=839p1?kl:5;897ba2=301?jk:0cf?xu5m90;6>u22da951d<5;nm6<lm;<0f4?7fm2wx>il50;1x97ce2=301?jk:5;897be28kn7p}=dd83>6}::lh1=9l4=3fg>4de348oi7?ne:p6a?=839p1?kn:5;897be2=301?j6:0cf?xu5lj0;6>u22dc951d<5;ni6<lm;<0gg?7fm2wx>io50;1x97c>28>i70<k9;3af>;5lh0:mh5rs22`>5<2s49:97?m5:?2g1<ak27:o>4id:?1f3<ak27?:l4<e:p75d=83?p1>?;:0`6?87d=3lh70?l4;dg?84e>3ln70:9a;1g?xu48h0;68u230195g3<58i=6km4=0a6>cb<5;h>6km4=54b>6e<uz9;57>55z?057<6j<16=n95fb9>5f0=nm16>o;5fd9>03g=;k1v>>7:18685693;i963>c98eg>;6k>0mh63=b58eg>;3>h08m6s|31594?3|5:;;6<l:;<3`=?`d34;h47hk;<0a0?`b34>=m7=6;|q043<72<q6?=h51c7894ef2oi01<m6:gf897d42oi0198n:2:8yv57=3:18v3<0d82f0=:9jk1ji522c19b`=:<?k1?:5rs3c0>5<4s48j=7;?;<0b6?37348j87?ne:p6d7=838p1?o>:0`6?84f<3lh7p}=9e83>7}::0i19=5228g95dc<uz82m7>56z?1=f<6j<16>l>5fd9>6<c=nl16>l:5fd9>6<>=nj16>495fg9~w7?a2909w0<6b;73?84f83;ji6s|28;94?0|5;3i6<l:;<0b4?`d3482i7hk;<0b0?`c348247hk;<0:3?`b3ty8>=4?:3y>766=<016??>51`g8yv5513:1>v3<31820g=:;;31=lk4}r171?6=:r78?=4>ad9>76c==91v>?i:180855n3>270==0;6:?856n3;ji6s|33:94?5|5:8m6<:m;<114?7ej278>54>ad9~w6232909w0==f;3ba>;4;m0><6s|3d294?3|5:8;68<4=2g:>4d2349mn7;?;<16`?`c349947hl;|q05`<72:q6??k5489>74`=<016?<k51`g8yv55?3:1?v3<2d820g=:;8l1=ol4=204>4gb3ty88>4?:3y>77c=9ho01>=l:428yv5cn3:19v3<1g866>;4m10:n8523gc915=:;<n1jk523359bf=z{:;o6=4<{<11`?2>349:i7:6;<12`?7fm2wx??850;1x964c28>i70=>e;3af>;4:?0:mh5rs261>5<5s499h7?ne:?07g<282wx?ik50;7x967b2<801>k8:0`6?85a13?;70=:c;dg?855>3lh7p}<1b83>6}:;;i1845230f90<=:;8i1=lk4}r111?6=;r78>n4>4c9>74b=9kh01><::0cf?xu4<80;6?u233a95dc<5:9j68>4}r1g`?6==r78=i4:2:?0a3<6j<16?k65519>70e=no16??;5fb9~w67e2908w0==b;6:?856k3>270=>b;3ba>{t;;>1<7=t=20a>42e349:o7?mb:?061<6il1v>:?:181855j3;ji63<38864>{t;mi1<7;t=23`>04<5:o>6<l:;<1e3?37349>n7hk;<110?`d3ty8=l4?:2y>77g=<016?<l5489>74g=9ho0q~==3;297~;4:h0:8o5230`95gd<5:886<oj;|q07c<72;q6??o51`g8965?2<:0q~=kb;291~;49k0>>63<e582f0=:;o<19=5234`9bc=:;;91jn5rs23:>5<5s49:m7:6;<12=?7fm2wx?io50;7x967f2<801>k<:0`6?85a=3?;70=:a;dg?855:3lh7p}<2383>7}:;8k1=ol4=201>4gb3ty8=54?:3y>74?=<016?<651`g8yv5c13:19v3<18866>;4m;0:n8523g6915=:;<k1jk523339bf=z{:8:6=4={<12=?7ej278><4>ad9~w6?72909:v3<19866>;4l;0?;63<d1873>;4l80?;63<d2873>;4l=0?;63<d4873>;4l?0?;63<d6873>;4l10?;63<e5873>;4m;0?;63<e2873>;4m<0?;63<e7873>;4m>0?;63<e9873>;4m00?;63<e`873>;4k?0?;63<c4873>;4k:0?;63<c3873>;4k=0?;63<c1873>;4jo0?;63<c0873>;4jl0?;63<fb873>;4nk0?;63<f`873>;4n00?;63<f9873>;4n>0?;63<f7873>;4n<0?;63<f5873>;4180:mh5rs214>5<5s498i7?m5:?00d<al2wx?>850;0x965c28h>70=;8;de?xu4;<0;6?u232a95g3<5:>36kk4}r100?6=:r78?o4>b49>71>=nj1v>=<:181854i3;i963<498e`>{t;:81<7<t=21:>4d2349?m7hl;|q074<72;q6?>651c78962f2ol0q~=;b;297~;4<?0?;63<89873>;40k0:mh5rs264>5<5s49?:7;?;<17=?7fm2wx>ol50;0x97e72=301?li:0cf?xu5k<0;6?u22b295gd<5;ij6<oj;|q1gf<72;q6>n>51`g897ea2oi0q~<ma;296~;5jo0?563=bd82e`=z{;i?6=4={<0ab?7ej279o44>ad9~w7d>2909w0<me;6:?84el3;ji6s|2b194?4|5;hn6<lm;<0`<?7fm2wx>o650;0x97dc2=301?ll:0cf?xu5k;0;6?u22cf95gd<5;i<6<oj;|q1g4<72;q6>om51c`897e128kn7p}=a983>7}::hn184522`a95dc<uz8i>7>52z?1ea<6jk16>o951`g8yv4dj3:1>v3=ae82e`=::jl1jh5rs3c4>5<5s48jo7:6;<0bf?7fm2wx>o?50;0x97gd28hi70<m6;3ba>{t:h<1<7<t=3ca>1?<5;kj6<oj;|q1f5<72;q6>ll51c`897d228kn7p}=a483>7}::hk184522`;95dc<uz8jj7>52z?1ed<6jk16>o:51`g8yv4fm3:1>v3=a882fg=::k91=lk4}r1a3?6=<r78h?4:0:?0g5<6j<16?5:5fg9>7d6=nj1v>m6:18085c:3;i963<e5864>;4>l0mj6s|3c794?2|5:n;68>4=2`f>4d23493?7hi;<1:g?`d3ty8o:4?:2y>7a6=9k?01>k=:428960c2ol0q~=m6;290~;4l80><63<bg82f0=:;191ji5238g9bf=z{:i36=4<{<1g5?7e=278i>4:0:?02a<al2wx?o650;6x96b42<:01>m>:0`6?85?<3lo70=n2;d`?xu4kh0;6>u23e195g3<5:o>68>4=24f>cb<uz9i57>54z?0`1<28278o?4>b49>7=3=no16?l:5fb9~w6ee2908w0=k4;3a1>;4m?0><63<6g8eb>{t;kk1<7:t=2f6>06<5:i86<l:;<1;1?`c349j:7hl;|q0gf<72:q6?i;51c7896c02<:01>8i:gf8yv5ej3:18v3<d7864>;4k=0:n8523949bc=:;h21jn5rs2ag>5<4s49o:7?m5:?0a=<28278;=4if:p7ge=83>p1>j8:42896e228h>70=76;dg?85fi3lh7p}<cd83>6}:;m=1=o;4=2g:>06<5:=;6kj4}r1a`?6=<r78h54:0:?0g3<6j<16?595fb9>7g2=nj1v>mi:18085c03;i963<e`864>;4?80mo6s|3d394?2|5:oj6<l:;<1eg?37349>i7hl;<11=?`d3ty85l4?:3y>7f0==916?o=51`g8yv5>13:1>v3<c4864>;4j;0:mh5rs2;4>5<5s49h?7;?;<1a4?7fm2wx?4850;0x96e52<:01>oi:0cf?xu4110;6?u23b6915=:;k;1=lk4}r1:0?6=:r78o=4:0:?0ea<6il1v>7<:18185en3?;70=nc;3ba>{t;0?1<7<t=2a2>06<5:kn6<oj;|q0=7<72;q6?ok5519>7dd=9ho0q~=n9;296~;4j:0?563<a882e`=z{:h?6=4={<1a7?73j278n94>ad9~w6g02908w0=m2;6:?85f13>270=n7;3ba>{t;hk1<7=t=2`1>42e349j57?mb:?0ed<6il1v>o::18085e93>270=n7;6:?85f=3;ji6s|3`:94?5|5:h:6<:m;<1b3?7ej278m54>ad9~w6g42908w0=m0;6:?85f=3>270=n3;3ba>{t;h<1<7=t=2`3>42e349j97?mb:?0e3<6il1v>o>:18085fn3>270=n3;6:?85f93;ji6s|3`694?5|5:km6<:m;<1b7?7ej278m94>ad9~w6?a2908w0=ne;6:?85f93>270=6f;3ba>{t;h81<7=t=2cf>42e349j=7?mb:?0e7<6il1v>7k:18085fl3>270=6f;6:?85>l3;ji6s|3`294?5|5:ko6<:m;<1:b?7ej278m=4>ad9~w6?e2908w0=nc;6:?85>l3>270=6b;3ba>{t;0o1<7=t=2c`>42e3492h7?mb:?0=`<6il1v>7l:18085fj3;?n63<9c82fg=:;0i1=lk4}r1e6?6=<r78jo4>b49>5fe=nj16=nl5fe9>03g=;=1v>h>:18785ai3;i963>ce8eg>;6kj0mh63;6`807>{t;o:1<7:t=2d:>4d234;hi7hl;<3``?`c34>=m7==;|q0ac<72=q6?k651c7894ea2oi01<mj:gf8910f2:;0q~=je;290~;4n>0:n8521e29bf=:9jl1ji5247c975=z{:oo6=4;{<1e2?7e=27:h<4ic:?2`5<al27?:l4=f:p7`e=83>p1>h::0`6?87c:3lh70?k1;dg?821i38n7p}<ec83>6}:;o>1=o;4=0f1>cb<5=<j6?j4}r161?6=:r789=4>bc9>70g=9ho0q~=;c;296~;4=90:mh5234390<=z{:?=6=4={<165?7ej2789o4>ad9~w62c2909w0=:1;3ba>;4=;0?56s|34594?4|5:?96<lm;<16g?7fm2wx?9k50;0x963528kn70=:3;6:?xu4=10;6?u234195gd<5:?o6<oj;|q00c<72;q6?8=51`g896332=30q~=:9;296~;4==0:no5234g95dc<uz9<>7>52z?011<6il16?5h5fg9~w60?2909w0=93;3af>;4>m0:mh5rs27e>5<5s49=?7?ne:?021<312wx?;750;0x960328hi70=9e;3ba>{t;?:1<7<t=247>4gb349=97:6;|q02d<72;q6?;;51c`8960a28kn7p}<6083>7}:;??1=lk4=245>1?<uz9=n7>52z?023<6jk16?:>51`g8yv51:3:1>v3<6782e`=:;?=1845rs24`>5<5s49=;7?mb:?034<6il1v>9<:180851?3;ji63<8g8e`>;40h0mj6s|36g94?4|5:=26<lm;<1;7?7fm2wx?:;50;0x961>28kn70=8a;6:?xu4?o0;6?u236c95gd<5:2?6<oj;|q033<72;q6?:o51`g8961e2=30q~=70;296~;4?k0:no5239795dc<uz9<;7>52z?03g<6il16?:m5489~w6>62909w0=8c;3af>;40?0:mh5rs25;>5<5s49<o7?ne:?03a<312wx?5<50;0x961c28hi70=77;3ba>{t;>>1<7<t=25g>4gb3493m7hk;|q0<`<72:q6?5m5519>7=b==916?5h51`g8yv5?k3:18v3<8b82f0=:;1h1ji523829ba=:;0;1ji5rs2::>5<5s49347;?;<1;e?7fm2wx8;j50;06824n3><70:<e;64?824l3><70:<c;64?824j3><70:<a;64?82403><70:<7;64?824>3><70:<5;64?824<3><70:<3;64?824:3><70:<1;64?82483><70:=f;64?825l3><70:=c;64?825j3><70:=a;64?82513><70:=8;64?825?3><70:=6;64?825=3><70:=4;64?823=3><70:;4;64?823;3><70:;2;64?82393><70:;0;64?82413><70:=e;64?825;3><70:=2;64?84>03;ji6s|47094?4|5=9m68>4=54b>`e<uz>==7>52z?77`<2827?:l4ka:p036=838p19=k:428910f2m20q~::f;296~;3;j0><63;6`8g2>{t<<o1<7<t=51a>06<5=<j6i;4}r66`?6=:r7??l4:0:?72d<c<2wx88l50;0x915?2<:0198n:e18yv22i3:1>v3;36864>;3>h0o>6s|44;94?4|5=9=68>4=54b>a7<uz>>47>52z?770<2827?:l4ja:p001=838p19=;:428910f2m:0q~::6;296~;3;:0><63;6`8`b>{t<<?1<7<t=511>06<5=<j6nk4}r660?6=:r7??<4:0:?72d<dl2wx88=50;0x91572<:0198n:b`8yv22:3:1>v3;2g864>;3>h0hm6s|44294?4|5=8o68>4=54b>f?<uz>?j7>52z?76f<2827?:l4l8:p01c=838p19<m:428910f2l30q~:;d;296~;3:h0><63;6`8`3>{t<=i1<7<t=50:>06<5=<j6n84}r67f?6=:r7?>54:0:?72d<d=2wx89o50;0x91402<:0198n:b68yv2313:1>v3;27864>;3>h0h?6s|45:94?4|5=8>68>4=54b>f4<uz>?;7>52z?761<2827?:l4j1:p03?=838p19:::428910f2l:0q~:98;296~;3<=0><63;6`8f<>{t<?=1<7<t=560>06<5=<j6ih4}r652?6=:r7?8?4:0:?72d<cm2wx8;;50;0x91262<:0198n:ef8yv21<3:1>v3;41864>;3>h0oo6s|47194?4|5=9268>4=54b>ad<uz>>o7>52z?76`<2827?:l4k7:p007=838p19<<:428910f2ji0q~:;6;296~;3:;0><63;6`8`5>{t;=21<7<t=26;>4gb349?57hk;|q00d<72;q6?975fb9>71g=9=i0q~:9b;296~;3>j0:mh5247c9a`=z{:lo6=4:{<1;b?`b3493m7hj;<1:4?7fm27?:l4;8`9>03g=mm1v<;6:181842=3lo70<:4;37g>{t9<l1<7<t=0d0>cb<58l96<:l;|q113<72;q6>865fd9>602=9ho0q~?i4;296~;6n?0mi63>f382e`=zuz?297>52z\6=0=:<=0>585+49495d?<uz?2h7>52z\6=a=:<=0>5i5+49495dg<uz?3;7>52z\6<2=:<=0>4:5+49495dd<uz>nn7>52z\7g2=:<=0?o:5+494950`<uz>n57>52z\7g3=:<=0?o;5+494953g<uz>n47>52z\7g0=:<=0?o85+4949523<uz>n;7>52z\7g1=:<=0?o95+49495=6<uz>n:7>52z\7g6=:<=0?o>5+49495=0<uz>n97>52z\7g7=:<=0?o?5+49495=1<uz>n?7>52z\7g5=:<=0?o=5+49495=><uz>n>7>52z\7fc=:<=0?nk5+49495=g<uz>n=7>52z\7f`=:<=0?nh5+49495=d<uz>n<7>52z\7fa=:<=0?ni5+49495=e<uz>oj7>52z\7ff=:<=0?nn5+49495=b<uz>oi7>52z\7fg=:<=0?no5+49495=c<uz>oh7>52z\7fd=:<=0?nl5+49495=`<uz>oo7>52z\7f<=:<=0?n45+49495<6<uz>on7>52z\7f==:<=0?n55+49495<7<uz>om7>52z\7f2=:<=0?n:5+49495<4<uz>o47>52z\7f0=:<=0?n85+49495<5<uz>o;7>52z\7f1=:<=0?n95+49495<2<uz>o:7>52z\7f6=:<=0?n>5+49495<3<uz>o97>52z\7f7=:<=0?n?5+49495<0<uz>o87>52z\7f4=:<=0?n<5+49495<1<uz>o?7>52z\7f5=:<=0?n=5+49495<><uz>o>7>52z\7ec=:<=0?mk5+49495<?<uz>o=7>52z\7e`=:<=0?mh5+49495<g<uz>o<7>52z\7ea=:<=0?mi5+49495<d<uz>hj7>52z\7ef=:<=0?mn5+49495<e<uz>m>7>52z\7ga=:<=0?oi5+49495<b<uz>m=7>52z\7gf=:<=0?on5+49495<c<uz>m<7>52z\7gg=:<=0?oo5+49495<`<uz>nj7>52z\7gd=:<=0?ol5+49495d6<uz>ni7>52z\7g<=:<=0?o45+49495d7<uz>nh7>52z\7g==:<=0?o55+49495d4<uz>no7>52z\7g4=:<=0?o<5+49495d5<uz>n87>52z\7f3=:<=0?n;5+49495d2<uz>o57>52z\7eg=:<=0?mo5+49495d3<uz>hi7>52z\7ed=:<=0?ml5+49495d0<uz?j47>52z\6e==:<=0>m55+49495d1<uz?2?7>52z\6=6=:<=0>5>5+49495d><uz?887>52z\655=:<=0>==5+494950d<uz?8>7>52z\64c=:<=0><k5+494950e<uz?8=7>52z\64`=:<=0><h5+494950b<uz?8<7>52z\64a=:<=0><i5+494950c<uz?9j7>52z\64f=:<=0><n5+4949536<uz?9i7>52z\64g=:<=0><o5+4949537<uz?9o7>52z\64<=:<=0><45+4949534<uz?9n7>52z\64==:<=0><55+4949535<uz?9m7>52z\642=:<=0><:5+4949532<uz?957>52z\643=:<=0><;5+4949533<uz?947>52z\640=:<=0><85+4949530<uz?9;7>52z\641=:<=0><95+4949531<uz?9:7>52z\646=:<=0><>5+494953><uz?997>52z\647=:<=0><?5+494953?<uz?987>52z\644=:<=0><<5+494953d<uz?9?7>52z\645=:<=0><=5+494953e<uz?9=7>52z\7b`=:<=0?jh5+494953b<uz?9<7>52z\7ba=:<=0?ji5+494953c<uz?:j7>52z\7bf=:<=0?jn5+494953`<uz?:i7>52z\7bg=:<=0?jo5+4949526<uz?:h7>52z\7bd=:<=0?jl5+4949527<uz?:o7>52z\7b<=:<=0?j45+4949524<uz?:n7>52z\7b==:<=0?j55+4949525<uz?:m7>52z\7b2=:<=0?j:5+4949522<uz?:57>52z\7b3=:<=0?j;5+4949520<uz?:47>52z\7b0=:<=0?j85+4949521<uz?8n7>52z\653=:<=0>=;5+494952><uz?8m7>52z\650=:<=0>=85+494952?<uz?857>52z\651=:<=0>=95+494952g<uz?847>52z\656=:<=0>=>5+494952d<uz?8;7>52z\657=:<=0>=?5+494952e<uz?8:7>52z\654=:<=0>=<5+494952b<uz?897>52z\64d=:<=0><l5+494952c<uz?9h7>52z\7bc=:<=0?jk5+494952`<uz?9>7>52z\7b1=:<=0?j95+49495=7<uz?:;7>52z\7b6=:<=0?j>5+49495=4<uz???7>52z\606=:<=0>8>5+49495=5<uz>2n7>52z\7=g=:<=0?5o5+49495=2<uz?8h7>52z\67a=:<=0>?i5+49495=3<uz?=47>52z\62==:<=0>:55+49495=?<utdjhn4?:3yK0=1<ugkoh7>52zJ7<2=zfhnn6=4={I6;3>{iiml1<7<tH5:4?xhfm90;6?uG4958ykgb93:1>vF;869~jdc52909wE:77:me`5=838pD968;|lba1<72;qC8594}ocf1?6=:rB?4:5rn`g5>5<5sA>3;6saad594?4|@=2<7p`ne983>7}O<1=0qcoj9;296~N30>1vblkn:181M2??2wemhl50;0xL1>03tdjin4?:3yK0=1<ugknh7>52zJ7<2=zfhon6=4={I6;3>{iill1<7<tH5:4?xhfn90;6?uG4958ykga93:1>vF;869~jd`52909wE:77:mec5=838pD968;|lbb1<72;qC8594}oce1?6=:rB?4:5rn`d5>5<5sA>3;6saag594?4|@=2<7p`nf983>7}O<1=0qcoi9;296~N30>1vblhn:181M2??2wemkl50;0xL1>03tdjjn4?:3yK0=1<ugkmh7>52zJ7<2=zfhln6=4={I6;3>{iiol1<7<tH5:4?xhe890;6?uG4958ykd793:1>vF;869~jg652909wE:77:mf55=838pD968;|la41<72;qC8594}o`31?6=:rB?4:5rnc25>5<5sA>3;6sab1594?4|@=2<7p`m0983>7}O<1=0qcl?9;296~N30>1vbo>n:181M2??2wen=l50;0xL1>03tdi<n4?:3yK0=1<ugh;h7>52zJ7<2=zfk:n6=4={I6;3>{ij9l1<7<tH5:4?xhe990;6?uG4958ykd693:1>vF;869~jg752909wE:77:mf45=838pD968;|la51<72;qC8594}o`21?6=:rB?4:5rnc35>5<5sA>3;6sab0594?4|@=2<7p`m1983>7}O<1=0qcl>9;296~N30>1vbo?n:181M2??2wen<l50;0xL1>03tdi=n4?:3yK0=1<ugh:h7>52zJ7<2=zfk;n6=4={I6;3>{ij8l1<7<tH5:4?xhe:90;6?uG4958ykd593:1>vF;869~jg452909wE:77:mf75=838pD968;|la61<72;qC8594}o`11?6=:rB?4:5rnc05>5<5sA>3;6sab3594?4|@=2<7p`m2983>7}O<1=0qcl=9;296~N30>1vbo<n:181M2??2wen?l50;0xL1>03tdi>n4?:3yK0=1<ug3:57>51zJ7<2=zf0<j6=4>{I6;3>{i1?h1<7?tH5:4?xh>>j0;6<uG4958yk?1l3:1=vF;869~j<0b290:wE:77:m=3`=83;pD968;|l:35<728qC8594}o;45?6=9rB?4:5rn851>5<6sA>3;6sa96194?7|@=2<7p`67583>4}O<1=0qc785;295~N30>1vb499:182M2??2we5:950;3xL1>03td2;54?:0yK0=1<ug3<57>51zJ7<2=zf0=j6=4>{I6;3>{i1>h1<7?tH5:4?xh>?j0;6<uG4958yk?0l3:1=vF;869~j<1b290:wE:77:m=2`=83;pD968;|l:<5<728qC8594}o;;5?6=9rB?4:5rn8:1>5<6sA>3;6sa99194?7|@=2<7p`68583>4}O<1=0qc775;295~N30>1vb469:182M2??2we55950;3xL1>03td2454?:0yK0=1<ug3357>51zJ7<2=zf02j6=4>{I6;3>{i11h1<7?tH5:4?xh>0j0;6<uG4958yk??l3:1=vF;869~j<>b290:wE:77:m==`=83;pD968;|l:=5<728qC8594}o;:5?6=9rB?4:5rn8;1>5<6sA>3;6sa98194?7|@=2<7p`69583>4}O<1=0qc765;295~N30>1vb479:182M2??2we54950;3xL1>03td2554?:0yK0=1<ug3257>51zJ7<2=zf03j6=4>{I6;3>{i10h1<7?tH5:4?xh>1j0;6<uG4958yk?>l3:1=vF;869~j<?b290:wE:77:m=<`=83;pD968;|l:e5<728qC8594}o;b5?6=9rB?4:5rn8c1>5<6sA>3;6sa9`194?7|@=2<7p`6a583>4}O<1=0qc7n5;295~N30>1vb4o9:182M2??2we5l950;3xL1>03td2m54?:0yK0=1<ug3j57>51zJ7<2=zf0kj6=4>{I6;3>{i1hh1<7?tH5:4?xh>ij0;6<uG4958yk?fl3:1=vF;869~j<gb290:wE:77:m=d`=83;pD968;|l:f5<728qC8594}o;a5?6=9rB?4:5rn8`1>5<6sA>3;6sa9c194?7|@=2<7p`6b583>4}O<1=0qc7m5;295~N30>1vb4l9:182M2??2we5o950;3xL1>03td2n54?:0yK0=1<ug3i57>51zJ7<2=zf0hj6=4>{I6;3>{i1kh1<7?tH5:4?xh>jj0;6<uG4958yk?el3:1=vF;869~j<db290:wE:77:m=g`=83;pD968;|l:g5<728qC8594}o;`5?6=9rB?4:5rn8a1>5<6sA>3;6sa9b194?7|@=2<7p`6c583>4}O<1=0qc7l5;295~N30>1vb4m9:182M2??2we5n950;3xL1>03td2o54?:0yK0=1<ug3h57>51zJ7<2=zf0ij6=4>{I6;3>{i1jh1<7?tH5:4?xh>kj0;6<uG4958yk?dl3:1=vF;869~j<eb290:wE:77:m=f`=83;pD968;|l:`5<728qC8594}o;g5?6=9rB?4:5rn8f1>5<6sA>3;6sa9e194?7|@=2<7p`6d583>4}O<1=0qc7k5;295~N30>1vb4j9:182M2??2we5i950;3xL1>03td2h54?:0yK0=1<ug3o57>51zJ7<2=zf0nj6=4>{I6;3>{i1mh1<7?tH5:4?xh>lj0;6<uG4958yk?cl3:1=vF;869~j<bb290:wE:77:m=a`=83;pD968;|l:a5<728qC8594}o;f5?6=9rB?4:5rn8g1>5<6sA>3;6sa9d194?7|@=2<7p`6e583>4}O<1=0qc7j5;295~N30>1vb4k9:182M2??2we5h950;3xL1>03td2i54?:0yK0=1<ug3n57>51zJ7<2=zf0oj6=4>{I6;3>{i1lh1<7?tH5:4?xh>mj0;6<uG4958yk?bl3:1=vF;869~j<cb290:wE:77:m=``=83;pD968;|l:b5<728qC8594}o;e5?6=9rB?4:5rn8d1>5<6sA>3;6sa9g194?7|@=2<7p`6f583>4}O<1=0qc7i5;295~N30>1vb4h9:182M2??2we5k950;3xL1>03td2j54?:0yK0=1<ug3m57>51zJ7<2=zf0lj6=4>{I6;3>{i1oh1<7?tH5:4?xh>nj0;6<uG4958yk?al3:1=vF;869~j<`b290:wE:77:m=c`=83;pD968;|lb45<728qC8594}oc35?6=9rB?4:5rn`21>5<6sA>3;6saa1194?7|@=2<7p`n0583>4}O<1=0qco?5;295~N30>1vbl>9:182M2??2wem=950;3xL1>03tdj<54?:0yK0=1<ugk;57>51zJ7<2=zfh:j6=4>{I6;3>{ii9h1<7?tH5:4?xhf8j0;6<uG4958ykg7l3:1=vF;869~jd6b290:wE:77:me5`=83;pD968;|lb55<728qC8594}oc25?6=9rB?4:5rn`31>5<6sA>3;6saa0194?7|@=2<7p`n1583>4}O<1=0qco>5;295~N30>1vbl?9:182M2??2wem<950;3xL1>03tdj=54?:0yK0=1<ugk:57>51zJ7<2=zfh;j6=4>{I6;3>{ii8h1<7?tH5:4?xhf9j0;6<uG4958ykg6l3:1=vF;869~jd7b290:wE:77:me4`=83;pD968;|lb65<728qC8594}oc15?6=9rB?4:5rn`01>5<6sA>3;6saa3194?7|@=2<7p`n2583>4}O<1=0qco=5;295~N30>1vbl<9:182M2??2wem?950;3xL1>03tdj>54?:0yK0=1<ugk957>51zJ7<2=zfh8j6=4>{I6;3>{ii;h1<7?tH5:4?xhf:j0;6<uG4958ykg5l3:1=vF;869~jd4b290:wE:77:me7`=83;pD968;|lb75<728qC8594}oc05?6=9rB?4:5rn`11>5<6sA>3;6saa2194?7|@=2<7p`n3583>4}O<1=0qco<5;295~N30>1vbl=9:182M2??2wem>950;3xL1>03tdj?54?:0yK0=1<ugk857>51zJ7<2=zfh9j6=4>{I6;3>{ii:h1<7?tH5:4?xhf;j0;6<uG4958ykg4l3:1=vF;869~jd5b290:wE:77:me6`=83;pD968;|lb05<728qC8594}oc75?6=9rB?4:5rn`61>5<6sA>3;6saa5194?7|@=2<7p`n4583>4}O<1=0qco;5;295~N30>1vbl:9:182M2??2wem9950;3xL1>03tdj854?:0yK0=1<ugk?57>51zJ7<2=zfh>j6=4>{I6;3>{ii=h1<7?tH5:4?xhf<j0;6<uG4958ykg3l3:1=vF;869~jd2b290:wE:77:me1`=83;pD968;|lb15<728qC8594}oc65?6=9rB?4:5rn`71>5<6sA>3;6saa4194?7|@=2<7p`n5583>4}O<1=0qco:5;295~N30>1vbl;9:182M2??2wem8950;3xL1>03tdj954?:0yK0=1<ugk>57>51zJ7<2=zfh?j6=4>{I6;3>{ii<h1<7?tH5:4?xhf=j0;6<uG4958ykg2l3:1=vF;869~jd3b290:wE:77:me0`=83;pD968;|lb25<728qC8594}oc55?6=9rB?4:5rn`41>5<6sA>3;6saa7194?7|@=2<7p`n6583>4}O<1=0qco95;295~N30>1vbl89:182M2??2wem;950;3xL1>03tdj:54?:0yK0=1<ugk=57>51zJ7<2=zfh<j6=4>{I6;3>{ii?h1<7?tH5:4?xhf>j0;6<uG4958ykg1l3:1=vF;869~jd0b290:wE:77:me3`=83;pD968;|lb35<728qC8594}oc45?6=9rB?4:5rn`51>5<6sA>3;6saa6194?7|@=2<7p`n7583>4}O<1=0qco85;295~N30>1vbl99:182M2??2wem:950;3xL1>03tdj;54?:0yK0=1<ugk<57>51zJ7<2=zfh=j6=4>{I6;3>{ii>h1<7?tH5:4?xhf?j0;6<uG4958ykg0l3:1=vF;869~jd1b290:wE:77:me2`=83;pD968;|lb<5<728qC8594}oc;5?6=9rB?4:5rn`:1>5<6sA>3;6saa9194?7|@=2<7p`n8583>4}O<1=0qco75;295~N30>1vbl69:182M2??2wem5950;3xL1>03tdj454?:0yK0=1<ugk357>51zJ7<2=zfh2j6=4>{I6;3>{ii1h1<7?tH5:4?xhf0j0;6<uG4958ykg?l3:1=vF;869~jd>b290:wE:77:me=`=83;pD968;|lb=5<728qC8594}oc:5?6=9rB?4:5rn`;1>5<6sA>3;6saa8194?7|@=2<7p`n9583>4}O<1=0qco65;295~N30>1vbl79:182M2??2wem4950;3xL1>03tdj554?:0yK0=1<ugk257>51zJ7<2=zfh3j6=4>{I6;3>{ii0h1<7?tH5:4?xhf1j0;6<uG4958ykg>l3:1=vF;869~jd?b290:wE:77:me<`=83;pD968;|lbe5<728qC8594}ocb5?6=9rB?4:5rn`c1>5<6sA>3;6saa`194?7|@=2<7p`na583>4}O<1=0qcon5;295~N30>1vblo9:182M2??2weml950;3xL1>03tdjm54?:0yK0=1<ugkj57>51zJ7<2=zfhkj6=4>{I6;3>{iihh1<7?tH5:4?xhfij0;6<uG4958ykgfl3:1=vF;869~jdgb290:wE:77:med`=83;pD968;|lbf5<728qC8594}oca5?6=9rB?4:5rn``1>5<6sA>3;6saac194?7|@=2<7p`nb583>4}O<1=0qcom5;295~N30>1vbll9:182M2??2wemo950;3xL1>03tdjn54?:0yK0=1<ugki57>51zJ7<2=zfhhj6=4>{I6;3>{iikh1<7?tH5:4?xhfjj0;6<uG4958ykgel3:1=vF;869~jddb290:wE:77:meg`=83;pD968;|lbg5<728qC8594}oc`5?6=9rB?4:5rn`a1>5<6sA>3;6saab194?7|@=2<7p`nc583>4}O<1=0qcol5;295~N30>1vblm9:182M2??2wemn950;3xL1>03tdjo54?:0yK0=1<ugkh57>51zJ7<2=zfhij6=4>{I6;3>{iijh1<7?tH5:4?xhfkj0;6<uG4958ykgdl3:1=vF;869~jdeb290:wE:77:mef`=83;pD968;|lb`5<728qC8594}ocg5?6=9rB?4:5rn`f1>5<6sA>3;6saae194?7|@=2<7p`nd583>4}O<1=0qcok5;295~N30>1vblj9:182M2??2wemi950;3xL1>03tdjh54?:0yK0=1<ugko57>51zJ7<2=zfhnj6=4>{I6;3>{iimh1<7?tH5:4?x{zuIJHwnh>:85;ac640tJKNv>r@ARxyEF \ No newline at end of file
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.v b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.v
new file mode 100644
index 000000000..6ec1e3f88
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.v
@@ -0,0 +1,173 @@
+/*******************************************************************************
+* This file is owned and controlled by Xilinx and must be used *
+* solely for design, simulation, implementation and creation of *
+* design files limited to Xilinx devices or technologies. Use *
+* with non-Xilinx devices or technologies is expressly prohibited *
+* and immediately terminates your license. *
+* *
+* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" *
+* SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR *
+* XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION *
+* AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION *
+* OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS *
+* IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, *
+* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE *
+* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY *
+* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE *
+* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR *
+* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF *
+* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *
+* FOR A PARTICULAR PURPOSE. *
+* *
+* Xilinx products are not intended for use in life support *
+* appliances, devices, or systems. Use in such applications are *
+* expressly prohibited. *
+* *
+* (c) Copyright 1995-2009 Xilinx, Inc. *
+* All rights reserved. *
+*******************************************************************************/
+// The synthesis directives "translate_off/translate_on" specified below are
+// supported by Xilinx, Mentor Graphics and Synplicity synthesis
+// tools. Ensure they are correct for your synthesis tool(s).
+
+// You must compile the wrapper file fifo_xlnx_512x36_2clk_prog_full.v when simulating
+// the core, fifo_xlnx_512x36_2clk_prog_full. When compiling the wrapper file, be sure to
+// reference the XilinxCoreLib Verilog simulation library. For detailed
+// instructions, please refer to the "CORE Generator Help".
+
+`timescale 1ns/1ps
+
+module fifo_xlnx_512x36_2clk_prog_full(
+ rst,
+ wr_clk,
+ rd_clk,
+ din,
+ wr_en,
+ rd_en,
+ dout,
+ full,
+ almost_full,
+ empty,
+ prog_full);
+
+
+input rst;
+input wr_clk;
+input rd_clk;
+input [35 : 0] din;
+input wr_en;
+input rd_en;
+output [35 : 0] dout;
+output full;
+output almost_full;
+output empty;
+output prog_full;
+
+// synthesis translate_off
+
+ FIFO_GENERATOR_V6_1 #(
+ .C_COMMON_CLOCK(0),
+ .C_COUNT_TYPE(0),
+ .C_DATA_COUNT_WIDTH(9),
+ .C_DEFAULT_VALUE("BlankString"),
+ .C_DIN_WIDTH(36),
+ .C_DOUT_RST_VAL("0"),
+ .C_DOUT_WIDTH(36),
+ .C_ENABLE_RLOCS(0),
+ .C_ENABLE_RST_SYNC(1),
+ .C_ERROR_INJECTION_TYPE(0),
+ .C_FAMILY("spartan3"),
+ .C_FULL_FLAGS_RST_VAL(1),
+ .C_HAS_ALMOST_EMPTY(0),
+ .C_HAS_ALMOST_FULL(1),
+ .C_HAS_BACKUP(0),
+ .C_HAS_DATA_COUNT(0),
+ .C_HAS_INT_CLK(0),
+ .C_HAS_MEMINIT_FILE(0),
+ .C_HAS_OVERFLOW(0),
+ .C_HAS_RD_DATA_COUNT(0),
+ .C_HAS_RD_RST(0),
+ .C_HAS_RST(1),
+ .C_HAS_SRST(0),
+ .C_HAS_UNDERFLOW(0),
+ .C_HAS_VALID(0),
+ .C_HAS_WR_ACK(0),
+ .C_HAS_WR_DATA_COUNT(0),
+ .C_HAS_WR_RST(0),
+ .C_IMPLEMENTATION_TYPE(2),
+ .C_INIT_WR_PNTR_VAL(0),
+ .C_MEMORY_TYPE(1),
+ .C_MIF_FILE_NAME("BlankString"),
+ .C_MSGON_VAL(1),
+ .C_OPTIMIZATION_MODE(0),
+ .C_OVERFLOW_LOW(0),
+ .C_PRELOAD_LATENCY(0),
+ .C_PRELOAD_REGS(1),
+ .C_PRIM_FIFO_TYPE("512x36"),
+ .C_PROG_EMPTY_THRESH_ASSERT_VAL(4),
+ .C_PROG_EMPTY_THRESH_NEGATE_VAL(5),
+ .C_PROG_EMPTY_TYPE(0),
+ .C_PROG_FULL_THRESH_ASSERT_VAL(500),
+ .C_PROG_FULL_THRESH_NEGATE_VAL(499),
+ .C_PROG_FULL_TYPE(1),
+ .C_RD_DATA_COUNT_WIDTH(9),
+ .C_RD_DEPTH(512),
+ .C_RD_FREQ(1),
+ .C_RD_PNTR_WIDTH(9),
+ .C_UNDERFLOW_LOW(0),
+ .C_USE_DOUT_RST(1),
+ .C_USE_ECC(0),
+ .C_USE_EMBEDDED_REG(0),
+ .C_USE_FIFO16_FLAGS(0),
+ .C_USE_FWFT_DATA_COUNT(0),
+ .C_VALID_LOW(0),
+ .C_WR_ACK_LOW(0),
+ .C_WR_DATA_COUNT_WIDTH(9),
+ .C_WR_DEPTH(512),
+ .C_WR_FREQ(1),
+ .C_WR_PNTR_WIDTH(9),
+ .C_WR_RESPONSE_LATENCY(1))
+ inst (
+ .RST(rst),
+ .WR_CLK(wr_clk),
+ .RD_CLK(rd_clk),
+ .DIN(din),
+ .WR_EN(wr_en),
+ .RD_EN(rd_en),
+ .DOUT(dout),
+ .FULL(full),
+ .ALMOST_FULL(almost_full),
+ .EMPTY(empty),
+ .PROG_FULL(prog_full),
+ .BACKUP(),
+ .BACKUP_MARKER(),
+ .CLK(),
+ .SRST(),
+ .WR_RST(),
+ .RD_RST(),
+ .PROG_EMPTY_THRESH(),
+ .PROG_EMPTY_THRESH_ASSERT(),
+ .PROG_EMPTY_THRESH_NEGATE(),
+ .PROG_FULL_THRESH(),
+ .PROG_FULL_THRESH_ASSERT(),
+ .PROG_FULL_THRESH_NEGATE(),
+ .INT_CLK(),
+ .INJECTDBITERR(),
+ .INJECTSBITERR(),
+ .WR_ACK(),
+ .OVERFLOW(),
+ .ALMOST_EMPTY(),
+ .VALID(),
+ .UNDERFLOW(),
+ .DATA_COUNT(),
+ .RD_DATA_COUNT(),
+ .WR_DATA_COUNT(),
+ .PROG_EMPTY(),
+ .SBITERR(),
+ .DBITERR());
+
+
+// synthesis translate_on
+
+endmodule
+
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.veo b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.veo
new file mode 100644
index 000000000..64e6769d6
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.veo
@@ -0,0 +1,53 @@
+/*******************************************************************************
+* This file is owned and controlled by Xilinx and must be used *
+* solely for design, simulation, implementation and creation of *
+* design files limited to Xilinx devices or technologies. Use *
+* with non-Xilinx devices or technologies is expressly prohibited *
+* and immediately terminates your license. *
+* *
+* XILINX IS PROVIDING THIS DESIGN, CODE, OR INFORMATION "AS IS" *
+* SOLELY FOR USE IN DEVELOPING PROGRAMS AND SOLUTIONS FOR *
+* XILINX DEVICES. BY PROVIDING THIS DESIGN, CODE, OR INFORMATION *
+* AS ONE POSSIBLE IMPLEMENTATION OF THIS FEATURE, APPLICATION *
+* OR STANDARD, XILINX IS MAKING NO REPRESENTATION THAT THIS *
+* IMPLEMENTATION IS FREE FROM ANY CLAIMS OF INFRINGEMENT, *
+* AND YOU ARE RESPONSIBLE FOR OBTAINING ANY RIGHTS YOU MAY REQUIRE *
+* FOR YOUR IMPLEMENTATION. XILINX EXPRESSLY DISCLAIMS ANY *
+* WARRANTY WHATSOEVER WITH RESPECT TO THE ADEQUACY OF THE *
+* IMPLEMENTATION, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OR *
+* REPRESENTATIONS THAT THIS IMPLEMENTATION IS FREE FROM CLAIMS OF *
+* INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS *
+* FOR A PARTICULAR PURPOSE. *
+* *
+* Xilinx products are not intended for use in life support *
+* appliances, devices, or systems. Use in such applications are *
+* expressly prohibited. *
+* *
+* (c) Copyright 1995-2009 Xilinx, Inc. *
+* All rights reserved. *
+*******************************************************************************/
+// The following must be inserted into your Verilog file for this
+// core to be instantiated. Change the instance name and port connections
+// (in parentheses) to your own signal names.
+
+//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
+fifo_xlnx_512x36_2clk_prog_full YourInstanceName (
+ .rst(rst),
+ .wr_clk(wr_clk),
+ .rd_clk(rd_clk),
+ .din(din), // Bus [35 : 0]
+ .wr_en(wr_en),
+ .rd_en(rd_en),
+ .dout(dout), // Bus [35 : 0]
+ .full(full),
+ .almost_full(almost_full),
+ .empty(empty),
+ .prog_full(prog_full));
+
+// INST_TAG_END ------ End INSTANTIATION Template ---------
+
+// You must compile the wrapper file fifo_xlnx_512x36_2clk_prog_full.v when simulating
+// the core, fifo_xlnx_512x36_2clk_prog_full. When compiling the wrapper file, be sure to
+// reference the XilinxCoreLib Verilog simulation library. For detailed
+// instructions, please refer to the "CORE Generator Help".
+
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.xco b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.xco
new file mode 100644
index 000000000..f99c3c6fb
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.xco
@@ -0,0 +1,84 @@
+##############################################################
+#
+# Xilinx Core Generator version 12.2
+# Date: Thu Nov 11 17:27:10 2010
+#
+##############################################################
+#
+# This file contains the customisation parameters for a
+# Xilinx CORE Generator IP GUI. It is strongly recommended
+# that you do not manually alter this file as it may cause
+# unexpected and unsupported behavior.
+#
+##############################################################
+#
+# BEGIN Project Options
+SET addpads = false
+SET asysymbol = false
+SET busformat = BusFormatAngleBracketNotRipped
+SET createndf = false
+SET designentry = Verilog
+SET device = xc3s2000
+SET devicefamily = spartan3
+SET flowvendor = Other
+SET formalverification = false
+SET foundationsym = false
+SET implementationfiletype = Ngc
+SET package = fg456
+SET removerpms = false
+SET simulationfiles = Behavioral
+SET speedgrade = -5
+SET verilogsim = true
+SET vhdlsim = false
+# END Project Options
+# BEGIN Select
+SELECT Fifo_Generator family Xilinx,_Inc. 6.1
+# END Select
+# BEGIN Parameters
+CSET almost_empty_flag=false
+CSET almost_full_flag=true
+CSET component_name=fifo_xlnx_512x36_2clk_prog_full
+CSET data_count=false
+CSET data_count_width=9
+CSET disable_timing_violations=false
+CSET dout_reset_value=0
+CSET empty_threshold_assert_value=4
+CSET empty_threshold_negate_value=5
+CSET enable_ecc=false
+CSET enable_int_clk=false
+CSET enable_reset_synchronization=true
+CSET fifo_implementation=Independent_Clocks_Block_RAM
+CSET full_flags_reset_value=1
+CSET full_threshold_assert_value=500
+CSET full_threshold_negate_value=499
+CSET inject_dbit_error=false
+CSET inject_sbit_error=false
+CSET input_data_width=36
+CSET input_depth=512
+CSET output_data_width=36
+CSET output_depth=512
+CSET overflow_flag=false
+CSET overflow_sense=Active_High
+CSET performance_options=First_Word_Fall_Through
+CSET programmable_empty_type=No_Programmable_Empty_Threshold
+CSET programmable_full_type=Single_Programmable_Full_Threshold_Constant
+CSET read_clock_frequency=1
+CSET read_data_count=false
+CSET read_data_count_width=9
+CSET reset_pin=true
+CSET reset_type=Asynchronous_Reset
+CSET underflow_flag=false
+CSET underflow_sense=Active_High
+CSET use_dout_reset=true
+CSET use_embedded_registers=false
+CSET use_extra_logic=false
+CSET valid_flag=false
+CSET valid_sense=Active_High
+CSET write_acknowledge_flag=false
+CSET write_acknowledge_sense=Active_High
+CSET write_clock_frequency=1
+CSET write_data_count=false
+CSET write_data_count_width=9
+# END Parameters
+GENERATE
+# CRC: 6b9f6232
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.xise b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.xise
new file mode 100644
index 000000000..91dbf5819
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full.xise
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
+<project xmlns="http://www.xilinx.com/XMLSchema" xmlns:xil_pn="http://www.xilinx.com/XMLSchema">
+
+ <header>
+ <!-- ISE source project file created by Project Navigator. -->
+ <!-- -->
+ <!-- This file contains project source information including a list of -->
+ <!-- project source files, project and process properties. This file, -->
+ <!-- along with the project source files, is sufficient to open and -->
+ <!-- implement in ISE Project Navigator. -->
+ <!-- -->
+ <!-- Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved. -->
+ </header>
+
+ <version xil_pn:ise_version="12.1" xil_pn:schema_version="2"/>
+
+ <files>
+ <file xil_pn:name="fifo_xlnx_512x36_2clk_prog_full.ngc" xil_pn:type="FILE_NGC">
+ <association xil_pn:name="BehavioralSimulation"/>
+ <association xil_pn:name="Implementation"/>
+ </file>
+ <file xil_pn:name="fifo_xlnx_512x36_2clk_prog_full.v" xil_pn:type="FILE_VERILOG">
+ <association xil_pn:name="BehavioralSimulation"/>
+ <association xil_pn:name="Implementation"/>
+ <association xil_pn:name="PostMapSimulation"/>
+ <association xil_pn:name="PostRouteSimulation"/>
+ <association xil_pn:name="PostTranslateSimulation"/>
+ </file>
+ </files>
+
+ <properties>
+ <property xil_pn:name="Auto Implementation Top" xil_pn:value="false" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Device" xil_pn:value="xc3s2000" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Device Family" xil_pn:value="Spartan3" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Stop View" xil_pn:value="PreSynthesis" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Top" xil_pn:value="Module|fifo_xlnx_512x36_2clk_prog_full" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Top File" xil_pn:value="fifo_xlnx_512x36_2clk_prog_full.ngc" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Implementation Top Instance Path" xil_pn:value="/fifo_xlnx_512x36_2clk_prog_full" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Package" xil_pn:value="fg456" xil_pn:valueState="default"/>
+ <property xil_pn:name="Preferred Language" xil_pn:value="Verilog" xil_pn:valueState="default"/>
+ <property xil_pn:name="Project Generator" xil_pn:value="CoreGen" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="Property Specification in Project File" xil_pn:value="Store all values" xil_pn:valueState="default"/>
+ <property xil_pn:name="Simulator" xil_pn:value="ISim (VHDL/Verilog)" xil_pn:valueState="default"/>
+ <property xil_pn:name="Speed Grade" xil_pn:value="-5" xil_pn:valueState="default"/>
+ <property xil_pn:name="Synthesis Tool" xil_pn:value="XST (VHDL/Verilog)" xil_pn:valueState="default"/>
+ <property xil_pn:name="Top-Level Source Type" xil_pn:value="HDL" xil_pn:valueState="default"/>
+ <property xil_pn:name="Working Directory" xil_pn:value="." xil_pn:valueState="non-default"/>
+ <!-- -->
+ <!-- The following properties are for internal use only. These should not be modified.-->
+ <!-- -->
+ <property xil_pn:name="PROP_DesignName" xil_pn:value="fifo_xlnx_512x36_2clk_prog_full" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_DevFamilyPMName" xil_pn:value="spartan3" xil_pn:valueState="default"/>
+ <property xil_pn:name="PROP_intProjectCreationTimestamp" xil_pn:value="2010-11-11T09:27:12" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_intWbtProjectID" xil_pn:value="96435AE73456681FC0EF5839C85C4C97" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_intWorkingDirLocWRTProjDir" xil_pn:value="Same" xil_pn:valueState="non-default"/>
+ <property xil_pn:name="PROP_intWorkingDirUsed" xil_pn:value="No" xil_pn:valueState="non-default"/>
+ </properties>
+
+ <bindings/>
+
+ <libraries/>
+
+ <autoManagedFiles>
+ <!-- The following files are identified by `include statements in verilog -->
+ <!-- source files and are automatically managed by Project Navigator. -->
+ <!-- -->
+ <!-- Do not hand-edit this section, as it will be overwritten when the -->
+ <!-- project is analyzed based on files automatically identified as -->
+ <!-- include files. -->
+ </autoManagedFiles>
+
+</project>
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full_flist.txt b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full_flist.txt
new file mode 100644
index 000000000..2eb837a3f
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full_flist.txt
@@ -0,0 +1,12 @@
+# Output products list for <fifo_xlnx_512x36_2clk_prog_full>
+_xmsgs/pn_parser.xmsgs
+fifo_generator_ug175.pdf
+fifo_xlnx_512x36_2clk_prog_full.gise
+fifo_xlnx_512x36_2clk_prog_full.ngc
+fifo_xlnx_512x36_2clk_prog_full.v
+fifo_xlnx_512x36_2clk_prog_full.veo
+fifo_xlnx_512x36_2clk_prog_full.xco
+fifo_xlnx_512x36_2clk_prog_full.xise
+fifo_xlnx_512x36_2clk_prog_full_flist.txt
+fifo_xlnx_512x36_2clk_prog_full_readme.txt
+fifo_xlnx_512x36_2clk_prog_full_xmdf.tcl
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full_readme.txt b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full_readme.txt
new file mode 100644
index 000000000..33d50a91d
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full_readme.txt
@@ -0,0 +1,47 @@
+The following files were generated for 'fifo_xlnx_512x36_2clk_prog_full' in directory
+/home/ianb/ettus/sram_fifo/fpgapriv/usrp2/coregen/
+
+fifo_generator_ug175.pdf:
+ Please see the core data sheet.
+
+fifo_xlnx_512x36_2clk_prog_full.gise:
+ ISE Project Navigator support file. This is a generated file and should
+ not be edited directly.
+
+fifo_xlnx_512x36_2clk_prog_full.ngc:
+ Binary Xilinx implementation netlist file containing the information
+ required to implement the module in a Xilinx (R) FPGA.
+
+fifo_xlnx_512x36_2clk_prog_full.v:
+ Verilog wrapper file provided to support functional simulation.
+ This file contains simulation model customization data that is
+ passed to a parameterized simulation model for the core.
+
+fifo_xlnx_512x36_2clk_prog_full.veo:
+ VEO template file containing code that can be used as a model for
+ instantiating a CORE Generator module in a Verilog design.
+
+fifo_xlnx_512x36_2clk_prog_full.xco:
+ CORE Generator input file containing the parameters used to
+ regenerate a core.
+
+fifo_xlnx_512x36_2clk_prog_full.xise:
+ ISE Project Navigator support file. This is a generated file and should
+ not be edited directly.
+
+fifo_xlnx_512x36_2clk_prog_full_readme.txt:
+ Text file indicating the files generated and how they are used.
+
+fifo_xlnx_512x36_2clk_prog_full_xmdf.tcl:
+ ISE Project Navigator interface file. ISE uses this file to determine
+ how the files output by CORE Generator for the core can be integrated
+ into your ISE project.
+
+fifo_xlnx_512x36_2clk_prog_full_flist.txt:
+ Text file listing all of the output files produced when a customized
+ core was generated in the CORE Generator.
+
+
+Please see the Xilinx CORE Generator online help for further details on
+generated files and how to use them.
+
diff --git a/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full_xmdf.tcl b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full_xmdf.tcl
new file mode 100644
index 000000000..e1aecccff
--- /dev/null
+++ b/fpga/usrp2/coregen/fifo_xlnx_512x36_2clk_prog_full_xmdf.tcl
@@ -0,0 +1,68 @@
+# The package naming convention is <core_name>_xmdf
+package provide fifo_xlnx_512x36_2clk_prog_full_xmdf 1.0
+
+# This includes some utilities that support common XMDF operations
+package require utilities_xmdf
+
+# Define a namespace for this package. The name of the name space
+# is <core_name>_xmdf
+namespace eval ::fifo_xlnx_512x36_2clk_prog_full_xmdf {
+# Use this to define any statics
+}
+
+# Function called by client to rebuild the params and port arrays
+# Optional when the use context does not require the param or ports
+# arrays to be available.
+proc ::fifo_xlnx_512x36_2clk_prog_full_xmdf::xmdfInit { instance } {
+# Variable containg name of library into which module is compiled
+# Recommendation: <module_name>
+# Required
+utilities_xmdf::xmdfSetData $instance Module Attributes Name fifo_xlnx_512x36_2clk_prog_full
+}
+# ::fifo_xlnx_512x36_2clk_prog_full_xmdf::xmdfInit
+
+# Function called by client to fill in all the xmdf* data variables
+# based on the current settings of the parameters
+proc ::fifo_xlnx_512x36_2clk_prog_full_xmdf::xmdfApplyParams { instance } {
+
+set fcount 0
+# Array containing libraries that are assumed to exist
+# Examples include unisim and xilinxcorelib
+# Optional
+# In this example, we assume that the unisim library will
+# be magically
+# available to the simulation and synthesis tool
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type logical_library
+utilities_xmdf::xmdfSetData $instance FileSet $fcount logical_library unisim
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_generator_ug175.pdf
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type AnyView
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_prog_full.ngc
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type ngc
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_prog_full.v
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type verilog
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_prog_full.veo
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type verilog_template
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_prog_full.xco
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type coregen_ip
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount relative_path fifo_xlnx_512x36_2clk_prog_full_xmdf.tcl
+utilities_xmdf::xmdfSetData $instance FileSet $fcount type AnyView
+incr fcount
+
+utilities_xmdf::xmdfSetData $instance FileSet $fcount associated_module fifo_xlnx_512x36_2clk_prog_full
+incr fcount
+
+}
+
+# ::gen_comp_name_xmdf::xmdfApplyParams
diff --git a/fpga/usrp2/extramfifo/.gitignore b/fpga/usrp2/extramfifo/.gitignore
new file mode 100644
index 000000000..94bbf6dcc
--- /dev/null
+++ b/fpga/usrp2/extramfifo/.gitignore
@@ -0,0 +1,3 @@
+fifo_extram36_tb
+fifo_extram_tb
+*.vcd
diff --git a/fpga/usrp2/extramfifo/Makefile.srcs b/fpga/usrp2/extramfifo/Makefile.srcs
new file mode 100644
index 000000000..b255ef916
--- /dev/null
+++ b/fpga/usrp2/extramfifo/Makefile.srcs
@@ -0,0 +1,17 @@
+#
+# Copyright 2010 Ettus Research LLC
+#
+
+##################################################
+# Extram Sources
+##################################################
+EXTRAM_SRCS = $(abspath $(addprefix $(BASE_DIR)/../extramfifo/, \
+ext_fifo.v \
+nobl_if.v \
+nobl_fifo.v \
+icon.v \
+icon.xco \
+ila.v \
+ila.xco \
+refill_randomizer.v \
+))
diff --git a/fpga/usrp2/extramfifo/ext_fifo.v b/fpga/usrp2/extramfifo/ext_fifo.v
new file mode 100644
index 000000000..80f82fc63
--- /dev/null
+++ b/fpga/usrp2/extramfifo/ext_fifo.v
@@ -0,0 +1,171 @@
+//
+// FIFO backed by an off chip ZBT/NoBL SRAM.
+//
+// This module and its sub-hierarchy implment a FIFO capable of sustaining
+// a data throughput rate of at least int_clk/2 * 36bits and bursts of int_clk * 36bits.
+//
+// This has been designed and tested for an int_clk of 100MHz and an ext_clk of 125MHz,
+// your milage may vary with other clock ratio's especially those where int_clk < ext_clk.
+// Testing has also exclusively used a rst signal synchronized to int_clk.
+//
+// Interface operation mimics a Xilinx FIFO configured as "First Word Fall Through",
+// though signal naming differs.
+//
+// For FPGA use registers interfacing directly with signals prefixed "RAM_*" should be
+// packed into the IO ring.
+//
+
+ //`define NO_EXT_FIFO
+
+module ext_fifo
+ #(parameter INT_WIDTH=36,EXT_WIDTH=18,RAM_DEPTH=19,FIFO_DEPTH=19)
+ (
+ input int_clk,
+ input ext_clk,
+ input rst,
+ input [EXT_WIDTH-1:0] RAM_D_pi,
+ output [EXT_WIDTH-1:0] RAM_D_po,
+ output RAM_D_poe,
+ output [RAM_DEPTH-1:0] RAM_A,
+ output RAM_WEn,
+ output RAM_CENn,
+ output RAM_LDn,
+ output RAM_OEn,
+ output RAM_CE1n,
+ input [INT_WIDTH-1:0] datain,
+ input src_rdy_i, // WRITE
+ output dst_rdy_o, // not FULL
+ output [INT_WIDTH-1:0] dataout,
+ output src_rdy_o, // not EMPTY
+ input dst_rdy_i, // READ
+ output reg [31:0] debug,
+ output reg [31:0] debug2
+ );
+
+ wire [EXT_WIDTH-1:0] write_data;
+ wire [EXT_WIDTH-1:0] read_data;
+ wire full1, empty1;
+ wire almost_full2, almost_full2_spread, full2, empty2;
+ wire [FIFO_DEPTH-1:0] capacity;
+ wire space_avail;
+ wire data_avail;
+
+ // These next 2 lines here purely because ICARUS is crap at handling generate statements.
+ // Empirically this has been determined to make simulations work.
+ wire read_input_fifo = space_avail & ~empty1;
+ wire write_output_fifo = data_avail;
+
+ assign src_rdy_o = ~empty2;
+ assign dst_rdy_o = ~full1;
+
+`ifdef NO_EXT_FIFO
+ assign space_avail = ~full2;
+ assign data_avail = ~empty1;
+ assign read_data = write_data;
+`else
+
+ // External FIFO running at ext clock rate and 18 or 36 bit width.
+ nobl_fifo #(.WIDTH(EXT_WIDTH),.RAM_DEPTH(RAM_DEPTH),.FIFO_DEPTH(FIFO_DEPTH))
+ nobl_fifo_i1
+ (
+ .clk(ext_clk),
+ .rst(rst),
+ .RAM_D_pi(RAM_D_pi),
+ .RAM_D_po(RAM_D_po),
+ .RAM_D_poe(RAM_D_poe),
+ .RAM_A(RAM_A),
+ .RAM_WEn(RAM_WEn),
+ .RAM_CENn(RAM_CENn),
+ .RAM_LDn(RAM_LDn),
+ .RAM_OEn(RAM_OEn),
+ .RAM_CE1n(RAM_CE1n),
+ .write_data(write_data),
+ .write_strobe(~empty1 ),
+ .space_avail(space_avail),
+ .read_data(read_data),
+ .read_strobe(~almost_full2_spread),
+ .data_avail(data_avail),
+ .capacity(capacity)
+ );
+`endif // !`ifdef NO_EXT_FIFO
+
+
+ generate
+ if (EXT_WIDTH == 18 && INT_WIDTH == 36) begin: fifo_g1
+ // FIFO buffers data from UDP engine into external FIFO clock domain.
+ fifo_xlnx_512x36_2clk_36to18 fifo_xlnx_512x36_2clk_36to18_i1 (
+ .rst(rst),
+ .wr_clk(int_clk),
+ .rd_clk(ext_clk),
+ .din(datain), // Bus [35 : 0]
+ .wr_en(src_rdy_i),
+ .rd_en(read_input_fifo),
+ .dout(write_data), // Bus [17 : 0]
+ .full(full1),
+ .empty(empty1));
+
+
+ // FIFO buffers data read from external FIFO into DSP clk domain and to TX DSP.
+ fifo_xlnx_512x36_2clk_18to36 fifo_xlnx_512x36_2clk_18to36_i1 (
+ .rst(rst),
+ .wr_clk(ext_clk),
+ .rd_clk(int_clk),
+ .din(read_data), // Bus [17 : 0]
+ .wr_en(write_output_fifo),
+ .rd_en(dst_rdy_i),
+ .dout(dataout), // Bus [35 : 0]
+ .full(full2),
+ .prog_full(almost_full2),
+ .empty(empty2));
+ end // block: fifo_g1
+ else if (EXT_WIDTH == 36 && INT_WIDTH == 36) begin: fifo_g1
+ // FIFO buffers data from UDP engine into external FIFO clock domain.
+ fifo_xlnx_32x36_2clk fifo_xlnx_32x36_2clk_i1 (
+ .rst(rst),
+ .wr_clk(int_clk),
+ .rd_clk(ext_clk),
+ .din(datain), // Bus [35 : 0]
+ .wr_en(src_rdy_i),
+ .rd_en(read_input_fifo),
+ .dout(write_data), // Bus [35 : 0]
+ .full(full1),
+ .empty(empty1));
+
+ // FIFO buffers data read from external FIFO into DSP clk domain and to TX DSP.
+ fifo_xlnx_512x36_2clk_prog_full fifo_xlnx_32x36_2clk_prog_full_i1 (
+ .rst(rst),
+ .wr_clk(ext_clk),
+ .rd_clk(int_clk),
+ .din(read_data), // Bus [35 : 0]
+ .wr_en(write_output_fifo),
+ .rd_en(dst_rdy_i),
+ .dout(dataout), // Bus [35 : 0]
+ .full(full2),
+ .empty(empty2),
+ .prog_full(almost_full2));
+
+ end
+ endgenerate
+
+
+ refill_randomizer #(.BITS(7))
+ refill_randomizer_i1 (
+ .clk(ext_clk),
+ .rst(rst),
+ .full_in(almost_full2),
+ .full_out(almost_full2_spread)
+ );
+
+// always @ (posedge int_clk)
+// debug[31:28] <= {empty2,full1,dst_rdy_i,src_rdy_i };
+
+ always @ (posedge ext_clk)
+ // debug[27:0] <= {RAM_WEn,RAM_CE1n,RAM_A[3:0],read_data[17:0],empty1,space_avail,data_avail,almost_full2 };
+ debug[31:0] <= {7'h0,src_rdy_i,read_input_fifo,write_output_fifo,dst_rdy_i,full2,almost_full2,empty2,full1,empty1,write_data[7:0],read_data[7:0]};
+
+
+ always@ (posedge ext_clk)
+ // debug2[31:0] <= {write_data[15:0],read_data[15:0]};
+ debug2[31:0] <= 0;
+
+endmodule // ext_fifo
diff --git a/fpga/usrp2/extramfifo/ext_fifo_tb.cmd b/fpga/usrp2/extramfifo/ext_fifo_tb.cmd
new file mode 100644
index 000000000..521f88f21
--- /dev/null
+++ b/fpga/usrp2/extramfifo/ext_fifo_tb.cmd
@@ -0,0 +1,12 @@
+/opt/Xilinx/12.1/ISE_DS/ISE/verilog/src/glbl.v
+-y .
+-y ../coregen/
+-y ../fifo
+-y ../models
+-y /home/ianb/usrp-fpga/usrp2/sdr_lib
+-y /home/ianb/usrp-fpga/usrp2/control_lib
+-y /home/ianb/usrp-fpga/usrp2/models
+-y /opt/Xilinx/12.1/ISE_DS/ISE/verilog/src/unisims
+-y /opt/Xilinx/12.1/ISE_DS/ISE/verilog/src
+-y /opt/Xilinx/12.1/ISE_DS/ISE/verilog/src/XilinxCoreLib
+
diff --git a/fpga/usrp2/extramfifo/ext_fifo_tb.prj b/fpga/usrp2/extramfifo/ext_fifo_tb.prj
new file mode 100644
index 000000000..a11a15b2f
--- /dev/null
+++ b/fpga/usrp2/extramfifo/ext_fifo_tb.prj
@@ -0,0 +1,9 @@
+verilog work "./ext_fifo_tb.v"
+verilog work "./ext_fifo.v"
+verilog work "./nobl_fifo.v"
+verilog work "./nobl_if.v"
+verilog work "../coregen/fifo_xlnx_512x36_2clk_36to18.v"
+verilog work "../coregen/fifo_xlnx_512x36_2clk_18to36.v"
+verilog work "../models/CY7C1356C/cy1356.v"
+verilog work "../models/idt71v65603s150.v"
+verilog work "$XILINX/verilog/src/glbl.v"
diff --git a/fpga/usrp2/extramfifo/ext_fifo_tb.sav b/fpga/usrp2/extramfifo/ext_fifo_tb.sav
new file mode 100644
index 000000000..a54b40fc5
--- /dev/null
+++ b/fpga/usrp2/extramfifo/ext_fifo_tb.sav
@@ -0,0 +1,30 @@
+[timestart] 0
+[size] 1523 832
+[pos] -1 -1
+*-15.000000 66300 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1
+[treeopen] ext_fifo_tb.
+[treeopen] ext_fifo_tb.ext_fifo_i1.
+[treeopen] ext_fifo_tb.ext_fifo_i1.nobl_fifo_i1.
+@28
+ext_fifo_tb.ext_fifo_i1.src_rdy_i
+ext_fifo_tb.ext_fifo_i1.dst_rdy_o
+@22
+ext_fifo_tb.ext_fifo_i1.datain[35:0]
+@28
+ext_fifo_tb.ext_fifo_i1.src_rdy_o
+ext_fifo_tb.ext_fifo_i1.dst_rdy_i
+@22
+ext_fifo_tb.ext_fifo_i1.dataout[35:0]
+ext_fifo_tb.ext_fifo_i1.RAM_A[17:0]
+@28
+ext_fifo_tb.ext_fifo_i1.RAM_WEn
+ext_fifo_tb.ext_fifo_i1.RAM_CE1n
+@22
+ext_fifo_tb.ext_fifo_i1.RAM_D_pi[35:0]
+ext_fifo_tb.ext_fifo_i1.RAM_D_po[35:0]
+ext_fifo_tb.ext_fifo_i1.write_data[35:0]
+@28
+ext_fifo_tb.ext_fifo_i1.full1
+ext_fifo_tb.ext_fifo_i1.empty1
+@29
+ext_fifo_tb.ext_fifo_i1.space_avail
diff --git a/fpga/usrp2/extramfifo/ext_fifo_tb.sh b/fpga/usrp2/extramfifo/ext_fifo_tb.sh
new file mode 100755
index 000000000..dcfede37a
--- /dev/null
+++ b/fpga/usrp2/extramfifo/ext_fifo_tb.sh
@@ -0,0 +1,2 @@
+#fuse -prj ext_fifo_tb.prj -t work.glbl -t work.ext_fifo_tb -L unisims_ver -L xilinxcorelib_ver -o ext_fifo_tb
+iverilog -c ext_fifo_tb.cmd -o ext_fifo_tb ext_fifo_tb.v
diff --git a/fpga/usrp2/extramfifo/ext_fifo_tb.v b/fpga/usrp2/extramfifo/ext_fifo_tb.v
new file mode 100644
index 000000000..395ad2884
--- /dev/null
+++ b/fpga/usrp2/extramfifo/ext_fifo_tb.v
@@ -0,0 +1,415 @@
+`timescale 1ns / 1ps
+`define USRP2
+//`define USRP2PLUS
+
+`ifdef USRP2
+ `define INT_WIDTH 36
+ `define EXT_WIDTH 18
+ `define RAM_DEPTH 19
+ `define FIFO_DEPTH 8
+ `define DUMP_VCD_FULL
+ `define INT_CLK_PERIOD 5
+ `define EXT_CLK_PERIOD 4
+`elsif USRP2PLUS
+ `define INT_WIDTH 36
+ `define EXT_WIDTH 36
+ `define RAM_DEPTH 18
+ `define FIFO_DEPTH 8
+ `define DUMP_VCD_FULL
+ `define INT_CLK_PERIOD 5
+ `define EXT_CLK_PERIOD 5
+`endif // `ifdef USRP2
+
+
+module ext_fifo_tb();
+
+ reg int_clk;
+ reg ext_clk;
+ reg rst;
+
+ wire [`EXT_WIDTH-1:0] RAM_D_pi;
+ wire [`EXT_WIDTH-1:0] RAM_D_po;
+ wire [`EXT_WIDTH-1:0] RAM_D;
+ wire RAM_D_poe;
+ wire [`RAM_DEPTH-1:0] RAM_A;
+ wire RAM_WEn;
+ wire RAM_CENn;
+ wire RAM_LDn;
+ wire RAM_OEn;
+ wire RAM_CE1n;
+ reg [`INT_WIDTH-1:0] datain;
+ reg src_rdy_i; // WRITE
+ wire dst_rdy_o; // not FULL
+ wire [`INT_WIDTH-1:0] dataout;
+ reg [`INT_WIDTH-1:0] ref_dataout;
+ wire src_rdy_o; // not EMPTY
+ reg dst_rdy_i;
+ integer ether_frame;
+
+ // Clocks
+ // Int clock is 100MHz
+ // Ext clock is 125MHz
+ initial
+ begin
+ int_clk <= 0;
+ ext_clk <= 0;
+ ref_dataout <= 1;
+ src_rdy_i <= 0;
+ dst_rdy_i <= 0;
+ end
+
+ always
+ #(`INT_CLK_PERIOD/2) int_clk <= ~int_clk;
+
+ always
+ #(`EXT_CLK_PERIOD/2) ext_clk <= ~ext_clk;
+
+ initial
+ begin
+ datain <= 0;
+ ether_frame <= 0;
+
+ rst <= 1;
+ repeat (5) @(negedge int_clk);
+ rst <= 0;
+ @(negedge int_clk);
+ while (datain < 10000)
+ begin
+ @(negedge int_clk);
+ datain <= datain + dst_rdy_o;
+ src_rdy_i <= dst_rdy_o;
+ // Simulate inter-frame time
+ if (ether_frame == 1500)
+ begin
+ ether_frame <= 0;
+ repeat(1600)
+ begin
+ @(negedge int_clk);
+ src_rdy_i <= 0;
+ end
+ end
+ else
+ ether_frame <= ether_frame + dst_rdy_o;
+ end
+ end // initial begin
+
+
+ initial
+ begin
+ repeat (5) @(negedge int_clk);
+ dst_rdy_i <= 1;
+
+ while (src_rdy_o !== 1)
+ @(negedge int_clk);
+
+ // Fall through fifo, first output already valid
+ if (dataout !== ref_dataout)
+ $display("Error: Expected %x, got %x @%d",ref_dataout, dataout, $time);
+ ref_dataout <= ref_dataout + src_rdy_o ;
+
+ // Decimate by 16 rate
+ while (ref_dataout < 2000)
+ begin
+ @(negedge int_clk);
+ ref_dataout <= ref_dataout + src_rdy_o ;
+ dst_rdy_i <= src_rdy_o;
+ if ((dataout !== ref_dataout) && src_rdy_o)
+ $display("Error: Expected %x, got %x @%d",ref_dataout, dataout, $time);
+ @(negedge int_clk);
+ dst_rdy_i <= 0;
+ repeat(14) @(negedge int_clk);
+ end // while (ref_dataout < 10000)
+ // Decimate by 8 rate
+ while (ref_dataout < 4000)
+ begin
+ @(negedge int_clk);
+ ref_dataout <= ref_dataout + src_rdy_o ;
+ dst_rdy_i <= src_rdy_o;
+ if ((dataout !== ref_dataout) && src_rdy_o)
+ $display("Error: Expected %x, got %x @%d",ref_dataout, dataout, $time);
+ @(negedge int_clk);
+ dst_rdy_i <= 0;
+ repeat(6) @(negedge int_clk);
+ end // while (ref_dataout < 10000)
+ // Decimate by 4 rate
+ while (ref_dataout < 6000)
+ begin
+ @(negedge int_clk);
+ ref_dataout <= ref_dataout + src_rdy_o ;
+ dst_rdy_i <= src_rdy_o;
+ if ((dataout !== ref_dataout) && src_rdy_o)
+ $display("Error: Expected %x, got %x @%d",ref_dataout, dataout, $time);
+ @(negedge int_clk);
+ dst_rdy_i <= 0;
+ repeat(2) @(negedge int_clk);
+ end // while (ref_dataout < 10000)
+ // Max rate
+ while (ref_dataout < 10000)
+ begin
+ @(negedge int_clk);
+ ref_dataout <= ref_dataout + src_rdy_o ;
+ dst_rdy_i <= src_rdy_o;
+ if ((dataout !== ref_dataout) && src_rdy_o)
+ $display("Error: Expected %x, got %x @%d",ref_dataout, dataout, $time);
+
+ end // while (ref_dataout < 10000)
+
+ @(negedge int_clk);
+ $finish;
+
+ end
+
+
+/* -----\/----- EXCLUDED -----\/-----
+
+ initial
+ begin
+ rst <= 1;
+ repeat (5) @(negedge int_clk);
+ rst <= 0;
+ @(negedge int_clk);
+ repeat (4000)
+ begin
+ @(negedge int_clk);
+ datain <= datain + dst_rdy_o;
+ src_rdy_i <= dst_rdy_o;
+// @(negedge int_clk);
+// src_rdy_i <= 0;
+// @(negedge int_clk);
+// dst_rdy_i <= src_rdy_o;
+// @(negedge int_clk);
+// dst_rdy_i <= 0;
+// repeat (2) @(negedge int_clk);
+ end // repeat (1000)
+ // Fall through fifo, first output already valid
+ if (dataout !== ref_dataout)
+ $display("Error: Expected %x, got %x",ref_dataout, dataout);
+ repeat (1000)
+ begin
+ @(negedge int_clk);
+ datain <= datain + dst_rdy_o ;
+ src_rdy_i <= dst_rdy_o;
+ @(negedge int_clk);
+ src_rdy_i <= 0;
+ @(negedge int_clk);
+ ref_dataout <= ref_dataout + src_rdy_o ;
+ dst_rdy_i <= src_rdy_o;
+ if ((dataout !== ref_dataout) && src_rdy_o)
+ $display("Error: Expected %x, got %x",ref_dataout, dataout);
+ @(negedge int_clk);
+ dst_rdy_i <= 0;
+// repeat (2) @(negedge int_clk);
+ end // repeat (1000)
+ repeat (1000)
+ begin
+// @(negedge int_clk);
+// datain <= datain + 1;
+// src_rdy_i <= 1;
+// @(negedge int_clk);
+// src_rdy_i <= 0;
+ @(negedge int_clk);
+ ref_dataout <= ref_dataout + src_rdy_o;
+ dst_rdy_i <= src_rdy_o;
+ if ((dataout !== ref_dataout) && src_rdy_o)
+ $display("Error: Expected %x, got %x",ref_dataout, dataout);
+ @(negedge int_clk);
+ dst_rdy_i <= 0;
+// repeat (2) @(negedge int_clk);
+ end // repeat (1000)
+
+ $finish;
+
+ end // initial begin
+
+
+ -----/\----- EXCLUDED -----/\----- */
+ ///////////////////////////////////////////////////////////////////////////////////
+ // Simulation control //
+ ///////////////////////////////////////////////////////////////////////////////////
+ `ifdef DUMP_LX2_TOP
+ // Set up output files
+ initial begin
+ $dumpfile("ext_fifo_tb.lx2");
+ $dumpvars(1,ext_fifo_tb);
+ end
+ `endif
+
+ `ifdef DUMP_LX2_FULL
+ // Set up output files
+ initial begin
+ $dumpfile("ext_fifo_tb.lx2");
+ $dumpvars(0,ext_fifo_tb);
+ end
+ `endif
+
+ `ifdef DUMP_VCD_TOP
+ // Set up output files
+ initial begin
+ $dumpfile("ext_fifo_tb.vcd");
+ $dumpvars(1,ext_fifo_tb);
+ end
+ `endif
+
+ `ifdef DUMP_VCD_TOP_PLUS_NEXT
+ // Set up output files
+ initial begin
+ $dumpfile("ext_fifo_tb.vcd");
+ $dumpvars(2,ext_fifo_tb);
+ end
+ `endif
+
+
+ `ifdef DUMP_VCD_FULL
+ // Set up output files
+ initial begin
+ $dumpfile("ext_fifo_tb.vcd");
+ $dumpvars(0,ext_fifo_tb);
+ end
+ `endif
+
+ // Update display every 10 us
+ always #10000 $monitor("Time in uS ",$time/1000);
+
+ wire [`EXT_WIDTH-1:0] RAM_D_pi_ext;
+ wire [`EXT_WIDTH-1:0] RAM_D_po_ext;
+ wire [`EXT_WIDTH-1:0] RAM_D_ext;
+ wire RAM_D_poe_ext;
+
+ genvar i;
+
+ //
+ // Instantiate IO for Bidirectional bus to SRAM
+ //
+
+ generate
+ for (i=0;i<`EXT_WIDTH;i=i+1)
+ begin : gen_RAM_D_IO
+
+ IOBUF #(
+ .DRIVE(12),
+ .IOSTANDARD("LVCMOS25"),
+ .SLEW("FAST")
+ )
+ RAM_D_i (
+ .O(RAM_D_pi_ext[i]),
+ .I(RAM_D_po_ext[i]),
+ .IO(RAM_D[i]),
+ .T(RAM_D_poe_ext)
+ );
+ end // block: gen_RAM_D_IO
+
+ endgenerate
+
+ wire [`RAM_DEPTH-1:0] RAM_A_ext;
+ wire RAM_WEn_ext,RAM_LDn_ext,RAM_CE1n_ext,RAM_OEn_ext,RAM_CENn_ext;
+
+ assign #1 RAM_D_pi = RAM_D_pi_ext;
+
+ assign #1 RAM_D_po_ext = RAM_D_po;
+
+ assign #1 RAM_D_poe_ext = RAM_D_poe;
+
+ assign #2 RAM_WEn_ext = RAM_WEn;
+
+ assign #2 RAM_LDn_ext = RAM_LDn;
+
+ assign #2 RAM_CE1n_ext = RAM_CE1n;
+
+ assign #2 RAM_OEn_ext = RAM_OEn;
+
+ assign #2 RAM_CENn_ext = RAM_CENn;
+
+ assign #2 RAM_A_ext = RAM_A;
+
+
+ generate
+ if (`EXT_WIDTH==18) begin: ram_tb_g1
+ idt71v65603s150 idt71v65603s150_i1
+ (
+ .A(RAM_A_ext[17:0]),
+ .adv_ld_(RAM_LDn_ext), // advance (high) / load (low)
+ .bw1_(1'b0),
+ .bw2_(1'b0),
+ .bw3_(1'b1),
+ .bw4_(1'b1), // byte write enables (low)
+ .ce1_(RAM_CE1n_ext),
+ .ce2(1'b1),
+ .ce2_(1'b0), // chip enables
+ .cen_(RAM_CENn_ext), // clock enable (low)
+ .clk(ext_clk), // clock
+ .IO({RAM_D[16:9],RAM_D[7:0]}),
+ .IOP({RAM_D[17],RAM_D[8]}), // data bus
+ .lbo_(1'b0), // linear burst order (low)
+ .oe_(RAM_OEn_ext), // output enable (low)
+ .r_w_(RAM_WEn_ext)
+ ); // read (high) / write (low)
+ end // block: ram_tb_g1
+ else if (`EXT_WIDTH==36) begin: ram_tb_g1
+ idt71v65603s150 idt71v65603s150_i1
+ (
+ .A(RAM_A_ext[17:0]),
+ .adv_ld_(RAM_LDn_ext), // advance (high) / load (low)
+ .bw1_(1'b0),
+ .bw2_(1'b0),
+ .bw3_(1'b0),
+ .bw4_(1'b0), // byte write enables (low)
+ .ce1_(RAM_CE1n_ext),
+ .ce2(1'b1),
+ .ce2_(1'b0), // chip enables
+ .cen_(RAM_CENn_ext), // clock enable (low)
+ .clk(ext_clk), // clock
+ .IO(RAM_D[31:0]),
+ .IOP(RAM_D[35:32]), // data bus
+ .lbo_(1'b0), // linear burst order (low)
+ .oe_(RAM_OEn_ext), // output enable (low)
+ .r_w_(RAM_WEn_ext)
+ ); // read (high) / write (low)
+ end // block: ram_tb_g1
+
+ endgenerate
+
+/* -----\/----- EXCLUDED -----\/-----
+
+
+ cy1356 cy1356_i1
+ ( .d(RAM_D),
+ .clk(ext_clk),
+ .a(RAM_A_ext),
+ .bws(2'b00),
+ .we_b(RAM_WEn_ext),
+ .adv_lb(RAM_LDn_ext),
+ .ce1b(RAM_CE1n_ext),
+ .ce2(1'b1),
+ .ce3b(1'b0),
+ .oeb(RAM_OEn_ext),
+ .cenb(RAM_CENn_ext),
+ .mode(1'b0)
+ );
+ -----/\----- EXCLUDED -----/\----- */
+
+
+ ext_fifo
+ #(.INT_WIDTH(`INT_WIDTH),.EXT_WIDTH(`EXT_WIDTH),.RAM_DEPTH(`RAM_DEPTH),.FIFO_DEPTH(`FIFO_DEPTH))
+ ext_fifo_i1
+ (
+ .int_clk(int_clk),
+ .ext_clk(ext_clk),
+ .rst(rst),
+ .RAM_D_pi(RAM_D_pi),
+ .RAM_D_po(RAM_D_po),
+ .RAM_D_poe(RAM_D_poe),
+ .RAM_A(RAM_A),
+ .RAM_WEn(RAM_WEn),
+ .RAM_CENn(RAM_CENn),
+ .RAM_LDn(RAM_LDn),
+ .RAM_OEn(RAM_OEn),
+ .RAM_CE1n(RAM_CE1n),
+ .datain(datain),
+ .src_rdy_i(src_rdy_i), // WRITE
+ .dst_rdy_o(dst_rdy_o), // not FULL
+ .dataout(dataout),
+ .src_rdy_o(src_rdy_o), // not EMPTY
+ .dst_rdy_i(dst_rdy_i)
+ );
+
+endmodule // ext_fifo_tb
diff --git a/fpga/usrp2/extramfifo/fifo_extram.v b/fpga/usrp2/extramfifo/fifo_extram.v
new file mode 100644
index 000000000..4e1f40371
--- /dev/null
+++ b/fpga/usrp2/extramfifo/fifo_extram.v
@@ -0,0 +1,188 @@
+
+// Everything on sram_clk
+
+module fifo_extram
+ (input reset, input clear,
+ input [17:0] datain, input src_rdy_i, output dst_rdy_o, output [15:0] space, input [15:0] occ_in,
+ output [17:0] dataout, output src_rdy_o, input dst_rdy_i, output [15:0] occupied, input [15:0] space_in,
+ input sram_clk, output [18:0] sram_a, inout [17:0] sram_d, output sram_we,
+ output [1:0] sram_bw, output sram_adv, output sram_ce, output sram_oe,
+ output sram_mode, output sram_zz);
+
+ localparam AWIDTH = 19; // 1 MB in x18
+ localparam RAMSIZE = ((1<<AWIDTH) - 1);
+
+ wire do_store, do_retrieve;
+ reg [1:0] do_store_del, do_retr_del;
+
+ reg [AWIDTH-1:0] addr_retrieve, addr_store;
+ always @(posedge sram_clk)
+ if(reset | clear)
+ addr_retrieve <= 0;
+ else if (do_retrieve)
+ addr_retrieve <= addr_retrieve + 1;
+
+ always @(posedge sram_clk)
+ if(reset | clear)
+ addr_store <= 0;
+ else if(do_store)
+ addr_store <= addr_store + 1;
+
+ //wire [AWIDTH-1:0] fullness = (addr_store - addr_retrieve);
+ reg [AWIDTH-1:0] fullness;
+ always @(posedge sram_clk)
+ if(reset | clear)
+ fullness <= 0;
+ else if(do_store)
+ fullness <= fullness + 1;
+ else if(do_retrieve)
+ fullness <= fullness - 1;
+
+ // wire empty = (fullness == 0);
+ //wire full = (fullness == RAMSIZE); // 19'h7FF);
+ reg empty, full;
+
+ // The math in the following functions is 'AWIDTH wide. Use
+ // continuous assignments to prevent the numbers from being
+ // promoted to 32-bit (which would make it wrap wrong).
+ //
+ wire [AWIDTH-1:0] addr_retrieve_p1, addr_store_p2;
+ assign addr_retrieve_p1 = addr_retrieve + 1;
+ assign addr_store_p2 = addr_store + 2;
+
+ always @(posedge sram_clk)
+ if(reset | clear)
+ empty <= 1;
+ else if(do_store)
+ empty <= 0;
+ else if(do_retrieve & (/*(addr_retrieve + 1)*/ addr_retrieve_p1 == addr_store))
+ empty <= 1;
+
+ always @(posedge sram_clk)
+ if(reset | clear)
+ full <= 0;
+ else if(do_retrieve)
+ full <= 0;
+ else if(do_store & (/*(addr_store+2)*/ addr_store_p2 == addr_retrieve))
+ full <= 1;
+
+ reg can_store;
+ always @*
+ if(full | ~src_rdy_i)
+ can_store <= 0;
+ else if(do_store_del == 0)
+ can_store <= 1;
+ else if((do_store_del == 1) || (do_store_del == 2))
+ can_store <= (occ_in > 1);
+ else
+ can_store <= (occ_in > 2);
+
+ reg can_retrieve;
+ always @*
+ if(empty | ~dst_rdy_i)
+ can_retrieve <= 0;
+ else if(do_retr_del == 0)
+ can_retrieve <= 1;
+ else if((do_retr_del == 1) || (do_retr_del == 2))
+ can_retrieve <= (space_in > 1);
+ else
+ can_retrieve <= (space_in > 2);
+
+ reg [1:0] state;
+ localparam IDLE_STORE_NEXT = 0;
+ localparam STORE = 1;
+ localparam IDLE_RETR_NEXT = 2;
+ localparam RETRIEVE = 3;
+
+ reg [7:0] countdown;
+ wire countdown_done = (countdown == 0);
+
+ localparam CYCLE_SIZE = 6;
+
+ assign do_store = can_store & (state == STORE);
+ assign do_retrieve = can_retrieve & (state == RETRIEVE);
+ always @(posedge sram_clk)
+ if(reset)
+ do_store_del <= 0;
+ else
+ do_store_del <= {do_store_del[0],do_store};
+
+ always @(posedge sram_clk)
+ if(reset)
+ do_retr_del <= 0;
+ else
+ do_retr_del <= {do_retr_del[0],do_retrieve};
+
+ always @(posedge sram_clk)
+ if(reset | clear)
+ begin
+ state <= IDLE_STORE_NEXT;
+ countdown <= 0;
+ end
+ else
+ case(state)
+ IDLE_STORE_NEXT :
+ if(can_store)
+ begin
+ state <= STORE;
+ countdown <= CYCLE_SIZE;
+ end
+ else if(can_retrieve)
+ begin
+ state <= RETRIEVE;
+ countdown <= CYCLE_SIZE;
+ end
+ STORE :
+ if(~can_store | (can_retrieve & countdown_done))
+ state <= IDLE_RETR_NEXT;
+ else if(~countdown_done)
+ countdown <= countdown - 1;
+ IDLE_RETR_NEXT :
+ if(can_retrieve)
+ begin
+ state <= RETRIEVE;
+ countdown <= CYCLE_SIZE;
+ end
+ else if(can_store)
+ begin
+ state <= STORE;
+ countdown <= CYCLE_SIZE;
+ end
+ RETRIEVE :
+ if(~can_retrieve | (can_store & countdown_done))
+ state <= IDLE_STORE_NEXT;
+ else if(~countdown_done)
+ countdown <= countdown - 1;
+ endcase // case (state)
+
+ // RAM wires
+ assign sram_bw = 0;
+ assign sram_adv = 0;
+ assign sram_mode = 0;
+ assign sram_zz = 0;
+ assign sram_ce = 0;
+
+ assign sram_a = (state==STORE) ? addr_store : addr_retrieve;
+ assign sram_we = ~do_store;
+ assign sram_oe = ~do_retr_del[1];
+ assign my_oe = do_store_del[1] & sram_oe;
+ assign sram_d = my_oe ? datain : 18'bz;
+
+ // FIFO wires
+ assign dataout = sram_d;
+ assign src_rdy_o = do_retr_del[1];
+ assign dst_rdy_o = do_store_del[1];
+
+endmodule // fifo_extram
+
+
+ //wire have_1 = (fullness == 1);
+ //wire have_2 = (fullness == 2);
+ //wire have_atleast_1 = ~empty;
+ //wire have_atleast_2 = ~(empty | have_1);
+ //wire have_atleast_3 = ~(empty | have_1 | have_2);
+ //wire full_minus_1 = (fullness == (RAMSIZE-1)); // 19'h7FE);
+ //wire full_minus_2 = (fullness == (RAMSIZE-2)); // 19'h7FD);
+ //wire spacefor_atleast_1 = ~full;
+ //wire spacefor_atleast_2 = ~(full | full_minus_1);
+ //wire spacefor_atleast_3 = ~(full | full_minus_1 | full_minus_2);
diff --git a/fpga/usrp2/extramfifo/fifo_extram36.v b/fpga/usrp2/extramfifo/fifo_extram36.v
new file mode 100644
index 000000000..29342fdc4
--- /dev/null
+++ b/fpga/usrp2/extramfifo/fifo_extram36.v
@@ -0,0 +1,47 @@
+
+// 18 bit interface means we either can't handle errors or can't handle odd lengths
+// unless we go to heroic measures
+
+module fifo_extram36
+ (input clk, input reset, input clear,
+ input [35:0] datain, input src_rdy_i, output dst_rdy_o, output [15:0] space,
+ output [35:0] dataout, output src_rdy_o, input dst_rdy_i, output [15:0] occupied,
+ input sram_clk, output [18:0] sram_a, inout [17:0] sram_d, output sram_we,
+ output [1:0] sram_bw, output sram_adv, output sram_ce, output sram_oe, output sram_mode,
+ output sram_zz);
+
+ wire [17:0] f18_data_1, f18_data_2, f18_data_3, f18_data_4;
+ wire f18_src_rdy_1, f18_dst_rdy_1, f18_src_rdy_2, f18_dst_rdy_2;
+ wire f18_src_rdy_3, f18_dst_rdy_3, f18_src_rdy_4, f18_dst_rdy_4;
+
+ fifo36_to_fifo18 f36_to_f18
+ (.clk(clk), .reset(reset), .clear(clear),
+ .f36_datain(datain), .f36_src_rdy_i(src_rdy_i), .f36_dst_rdy_o(dst_rdy_o),
+ .f18_dataout(f18_data_1), .f18_src_rdy_o(f18_src_rdy_1), .f18_dst_rdy_i(f18_dst_rdy_1) );
+
+ wire [15:0] f1_occ, f2_space;
+
+ fifo_2clock_cascade #(.WIDTH(18), .SIZE(4)) fifo_2clock_in
+ (.wclk(clk), .datain(f18_data_1), .src_rdy_i(f18_src_rdy_1), .dst_rdy_o(f18_dst_rdy_1), .space(),
+ .rclk(sram_clk), .dataout(f18_data_2), .src_rdy_o(f18_src_rdy_2), .dst_rdy_i(f18_dst_rdy_2), .short_occupied(f1_occ),
+ .arst(reset) );
+
+ fifo_extram fifo_extram
+ (.reset(reset), .clear(clear),
+ .datain(f18_data_2), .src_rdy_i(f18_src_rdy_2), .dst_rdy_o(f18_dst_rdy_2), .space(), .occ_in(f1_occ),
+ .dataout(f18_data_3), .src_rdy_o(f18_src_rdy_3), .dst_rdy_i(f18_dst_rdy_3), .occupied(), .space_in(f2_space),
+ .sram_clk(sram_clk), .sram_a(sram_a), .sram_d(sram_d), .sram_we(sram_we),
+ .sram_bw(sram_bw), .sram_adv(sram_adv), .sram_ce(sram_ce), .sram_oe(sram_oe),
+ .sram_mode(sram_mode), .sram_zz(sram_zz));
+
+ fifo_2clock_cascade #(.WIDTH(18), .SIZE(4)) fifo_2clock_out
+ (.wclk(sram_clk), .datain(f18_data_3), .src_rdy_i(f18_src_rdy_3), .dst_rdy_o(f18_dst_rdy_3), .short_space(f2_space),
+ .rclk(clk), .dataout(f18_data_4), .src_rdy_o(f18_src_rdy_4), .dst_rdy_i(f18_dst_rdy_4), .occupied(),
+ .arst(reset) );
+
+ fifo18_to_fifo36 f18_to_f36
+ (.clk(clk), .reset(reset), .clear(clear),
+ .f18_datain(f18_data_4), .f18_src_rdy_i(f18_src_rdy_4), .f18_dst_rdy_o(f18_dst_rdy_4),
+ .f36_dataout(dataout), .f36_src_rdy_o(src_rdy_o), .f36_dst_rdy_i(dst_rdy_i) );
+
+endmodule // fifo_extram36
diff --git a/fpga/usrp2/extramfifo/fifo_extram36_tb.build b/fpga/usrp2/extramfifo/fifo_extram36_tb.build
new file mode 100755
index 000000000..ac9369758
--- /dev/null
+++ b/fpga/usrp2/extramfifo/fifo_extram36_tb.build
@@ -0,0 +1 @@
+iverilog -y ../models -y . -y ../control_lib/ -y ../coregen -y ../fifo -y /opt/Xilinx/10.1/ISE/verilog/src/XilinxCoreLib -y /opt/Xilinx/10.1/ISE/verilog/src/unisims/ -o fifo_extram36_tb fifo_extram36_tb.v
diff --git a/fpga/usrp2/extramfifo/fifo_extram36_tb.v b/fpga/usrp2/extramfifo/fifo_extram36_tb.v
new file mode 100644
index 000000000..e5f8cef4c
--- /dev/null
+++ b/fpga/usrp2/extramfifo/fifo_extram36_tb.v
@@ -0,0 +1,475 @@
+`timescale 1ns/1ns
+
+module fifo_extram36_tb();
+
+ reg clk = 0;
+ reg sram_clk = 0;
+ reg rst = 1;
+ reg clear = 0;
+
+ reg Verbose = 0; //
+ integer ErrorCount = 0;
+
+ initial #1000 rst = 0;
+// always #125 clk = ~clk;
+ task task_CLK;
+ reg [7:0] ran;
+ begin
+ while (1) begin
+ ran = $random;
+ if (ran[1])
+ #62 clk = ~clk;
+ else
+ #63 clk = !clk;
+ end
+ end
+ endtask // task_CLK
+ initial task_CLK;
+
+// always #100 sram_clk = ~sram_clk;
+ task task_SSRAM_clk;
+ reg [7:0] ran;
+ begin
+ while (1) begin
+ ran = $random;
+ if (ran[0])
+ #49 sram_clk = ~sram_clk;
+ else
+ #51 sram_clk = ~sram_clk;
+ end
+ end
+ endtask // task_SSRAM_clk
+ initial task_SSRAM_clk;
+
+ reg [31:0] f36_data = 32'hX;
+ reg [1:0] f36_occ = 0;
+ reg f36_sof = 0, f36_eof = 0;
+
+ wire [35:0] f36_in = {1'b0,f36_occ,f36_eof,f36_sof,f36_data};
+ reg src_rdy_f36i = 0;
+ wire dst_rdy_f36i;
+
+ wire [35:0] f36_out;
+ wire src_rdy_f36o;
+ reg dst_rdy_f36o = 0;
+
+ wire [17:0] sram_d;
+ wire [18:0] sram_a;
+ wire [1:0] sram_bw;
+ wire sram_we, sram_adv, sram_ce, sram_oe, sram_mode, sram_zz;
+
+ reg [31:0] ScoreBoard [524288:0];
+ reg [18:0] put_index = 0;
+ reg [18:0] get_index = 0;
+
+// integer put_index = 0;
+// integer get_index = 0;
+
+ wire [15:0] DUT_space, DUT_occupied;
+
+ fifo_extram36 fifo_extram36
+ (.clk(clk), .reset(rst), .clear(clear),
+ .datain(f36_in), .src_rdy_i(src_rdy_f36i), .dst_rdy_o(dst_rdy_f36i), .space(DUT_space),
+ .dataout(f36_out), .src_rdy_o(src_rdy_f36o), .dst_rdy_i(dst_rdy_f36o), .occupied(DUT_occupied),
+ .sram_clk(sram_clk), .sram_a(sram_a), .sram_d(sram_d), .sram_we(sram_we),
+ .sram_bw(sram_bw), .sram_adv(sram_adv), .sram_ce(sram_ce), .sram_oe(sram_oe),
+ .sram_mode(sram_mode), .sram_zz(sram_zz));
+
+`define idt 1
+`ifdef idt
+ wire [15:0] dummy16;
+ wire [1:0] dummy2;
+
+ idt71v65603s150
+ ram_model(.A(sram_a[17:0]),
+ .adv_ld_(sram_adv), // advance (high) / load (low)
+ .bw1_(0), .bw2_(0), .bw3_(0), .bw4_(0), // byte write enables (low)
+ .ce1_(0), .ce2(1), .ce2_(0), // chip enables
+ .cen_(sram_ce), // clock enable (low)
+ .clk(sram_clk), // clock
+ .IO({dummy16,sram_d[15:0]}),
+ .IOP({dummy2,sram_d[17:16]}), // data bus
+ .lbo_(sram_mode), // linear burst order (low)
+ .oe_(sram_oe), // output enable (low)
+ .r_w_(sram_we)); // read (high) / write (low)
+`else
+ cy1356 ram_model(.d(sram_d),.clk(~sram_clk),.a(sram_a),
+ .bws(2'b00),.we_b(sram_we),.adv_lb(sram_adv),
+ .ce1b(0),.ce2(1),.ce3b(0),
+ .oeb(sram_oe),.cenb(sram_ce),.mode(sram_mode) );
+`endif
+
+ task task_SSRAMMonitor;
+ reg last_mode;
+ reg last_clock;
+ reg last_load;
+ reg [18:0] sram_addr;
+
+ begin
+ last_mode = 1'bX;
+ last_clock = 1'bX;
+ last_load = 1'bX;
+
+ @ (posedge Verbose);
+ $dumpvars(0,fifo_extram36_tb);
+
+ $display("%t:%m\t*** Task Started",$time);
+ while (1) @ (posedge sram_clk) begin
+ if (sram_mode !== last_mode) begin
+ $display("%t:%m\tSSRAM mode: %b",$time,sram_mode);
+ last_mode = sram_mode;
+ end
+ if (sram_adv !== last_load) begin
+ $display("%t:%m\tSSRAM adv/load: %b",$time,sram_adv);
+ last_load = sram_adv;
+ end
+ if (sram_ce !== last_clock) begin
+ $display("%t:%m\tSSRAM clock enable: %b",$time,sram_ce);
+ last_clock = sram_ce;
+ end
+ if (sram_ce == 1'b0) begin
+ if (sram_adv == 1'b0) begin
+// $display("%t:%m\tSSRAM Address Load A=%h",$time,sram_a);
+ sram_addr = sram_a;
+ end else begin
+ sram_addr = sram_addr + 1;
+ end
+ if (sram_oe == 1'b0) begin
+ $display("%t:%m\tSSRAM Read Cycle A=%h(%h), D=%o",$time,sram_addr-2,sram_a,sram_d);
+ end
+ if (sram_we == 1'b0) begin
+ $display("%t:%m\tSSRAM Write Cycle A=%h(%h), D=%o",$time,sram_addr-2,sram_a,sram_d);
+ end
+ if ((sram_we == 1'b0) && (sram_oe == 1'b0)) begin
+ $display("%t:%m\t*** ERROR: _oe and _we both active",$time);
+ end
+
+ end // if (sram_ce == 1'b0)
+
+ end // always @ (posedge sram_clk)
+ end
+ endtask // task_SSRAMMonitor
+
+ task ReadFromFIFO36;
+ begin
+ $display("%t: Read from FIFO36",$time);
+ #1 dst_rdy_f36o <= 1;
+ while(1)
+ begin
+ while(~src_rdy_f36o)
+ @(posedge clk);
+ $display("%t: Read: %h>",$time,f36_out);
+ @(posedge clk);
+ end
+ end
+ endtask // ReadFromFIFO36
+
+ initial dst_rdy_f36o = 0;
+
+ task task_ReadFIFO36;
+ reg [7:0] ran;
+ begin
+ $display("%t:%m\t*** Task Started",$time);
+ while (1) begin
+ // Read on one of four clocks
+ #5 dst_rdy_f36o <= 1;
+ @(posedge clk);
+ if (src_rdy_f36o) begin
+ if (f36_out[31:0] != ScoreBoard[get_index]) begin
+ $display("%t:%m\tFIFO Get Error: R:%h, E:%h (%h)",$time,f36_out[31:0],ScoreBoard[get_index],get_index);
+ ErrorCount = ErrorCount + 1;
+ end else begin
+ if (Verbose)
+ $display("%t:%m\t(%5h) %o>",$time,get_index,f36_out);
+ end
+ get_index = get_index+1;
+ end else begin
+ if (ErrorCount >= 192)
+ $finish;
+ end // else: !if(src_rdy_f36o)
+
+ #10;
+ ran = $random;
+ if (ran[2:0] != 3'b000) begin
+ dst_rdy_f36o <= 0;
+ if (ran[2] != 1'b0) begin
+ @(posedge clk);
+ @(posedge clk);
+ @(posedge clk);
+ end
+ if (ran[1] != 1'b0) begin
+ @(posedge clk);
+ @(posedge clk);
+ end
+ if (ran[0] != 1'b0) begin
+ @(posedge clk);
+ end
+ end
+ end // while (1)
+ end
+
+ endtask // task_ReadFIFO36
+
+
+ reg [15:0] count;
+
+ task PutPacketInFIFO36;
+ input [31:0] data_start;
+ input [31:0] data_len;
+
+ begin
+ count = 4;
+ src_rdy_f36i = 1;
+ f36_data = data_start;
+ f36_sof = 1;
+ f36_eof = 0;
+ f36_occ = 0;
+
+ $display("%t: Put Packet in FIFO36",$time);
+ while(~dst_rdy_f36i)
+ #1; //@(posedge clk);
+ @(posedge clk);
+
+ $display("%t: <%h PPI_FIFO36: Entered First Line",$time,f36_data);
+ f36_sof <= 0;
+ while(count+4 < data_len)
+ begin
+ f36_data = f36_data + 32'h01010101;
+ count = count + 4;
+ while(~dst_rdy_f36i)
+ #1; //@(posedge clk);
+ @(posedge clk);
+ $display("%t: <%h PPI_FIFO36: Entered New Line",$time,f36_data);
+ end
+ f36_data <= f36_data + 32'h01010101;
+ f36_eof <= 1;
+ if(count + 4 == data_len)
+ f36_occ <= 0;
+ else if(count + 3 == data_len)
+ f36_occ <= 3;
+ else if(count + 2 == data_len)
+ f36_occ <= 2;
+ else
+ f36_occ <= 1;
+ while(~dst_rdy_f36i)
+ @(posedge clk);
+ @(posedge clk);
+ f36_occ <= 0;
+ f36_eof <= 0;
+ f36_data <= 0;
+ src_rdy_f36i <= 0;
+ $display("%t: <%h PPI_FIFO36: Entered Last Line",$time,f36_data);
+ end
+ endtask // PutPacketInFIFO36
+
+ task task_WriteFIFO36;
+ integer i;
+ reg [7:0] ran;
+
+ begin
+ f36_data = 32'bX;
+ if (rst != 1'b0)
+ @ (negedge rst);
+ $display("%t:%m\t*** Task Started",$time);
+ #10;
+ src_rdy_f36i = 1;
+ f36_data = $random;
+ for (i=0; i<64; i=i+0 ) begin
+ @ (posedge clk) ;
+ if (dst_rdy_f36i) begin
+ if (Verbose)
+ $display("%t:%m\t(%5h) %o<",$time,put_index,f36_in);
+ ScoreBoard[put_index] = f36_in[31:0];
+ put_index = put_index + 1;
+ #5;
+ f36_data = $random;
+ i = i + 1;
+ end
+ ran = $random;
+ if (ran[1:0] != 2'b00) begin
+ @ (negedge clk);
+ src_rdy_f36i = 0;
+ #5;
+ @ (negedge clk) ;
+ src_rdy_f36i = 1;
+ end
+ end
+ src_rdy_f36i = 0;
+ f36_data = 32'bX;
+// if (put_index > 19'h3ff00)
+// Verbose = 1'b1;
+
+ end
+ endtask // task_WriteFIFO36
+
+ initial $dumpfile("fifo_extram36_tb.vcd");
+// initial $dumpvars(0,fifo_extram36_tb);
+ initial $timeformat(-9, 0, " ns", 10);
+ initial task_SSRAMMonitor;
+
+ initial
+ begin
+ @(negedge rst);
+ #40000;
+ @(posedge clk);
+ @(posedge clk);
+ @(posedge clk);
+ @(posedge clk);
+// ReadFromFIFO36;
+ task_ReadFIFO36;
+
+ end
+
+ integer i;
+
+ initial
+ begin
+ @(negedge rst);
+ @(posedge clk);
+ @(posedge clk);
+ @(posedge clk);
+ task_WriteFIFO36;
+ @(posedge clk);
+ @(posedge clk);
+ @(posedge clk);
+// PutPacketInFIFO36(32'hA0B0C0D0,12);
+ @(posedge clk);
+ @(posedge clk);
+ #10000;
+ @(posedge clk);
+// PutPacketInFIFO36(32'hE0F0A0B0,36);
+ @(posedge clk);
+ @(posedge clk);
+ task_WriteFIFO36;
+ @(posedge clk);
+ @(posedge clk);
+ #10000;
+ @(posedge clk);
+ @(posedge clk);
+ task_WriteFIFO36;
+// @(posedge clk);
+// #30000;
+// @(posedge clk);
+// @(posedge clk);
+ task_WriteFIFO36;
+// @(posedge clk);
+// #30000;
+// @(posedge clk);
+// @(posedge clk);
+ task_WriteFIFO36;
+// @(posedge clk);
+// #30000;
+// @(posedge clk);
+// @(posedge clk);
+ task_WriteFIFO36;
+ @(posedge clk);
+ #10000;
+ @(posedge clk);
+ @(posedge clk);
+ task_WriteFIFO36;
+ for (i=0; i<8192; i = i+1) begin
+ @(posedge clk);
+ #10000;
+ @(posedge clk);
+ @(posedge clk);
+ task_WriteFIFO36;
+ @(posedge clk);
+ end
+
+// $dumpvars(0,fifo_extram36_tb);
+ @(posedge clk);
+ task_WriteFIFO36;
+ @(posedge clk);
+
+ #100000000;
+ $finish;
+
+ end
+
+
+ initial
+ begin
+ @(negedge rst);
+ f36_occ <= 0;
+ repeat (100)
+ @(posedge clk);
+ src_rdy_f36i <= 1;
+ f36_data <= 32'h10203040;
+ f36_sof <= 1;
+ f36_eof <= 0;
+ @(posedge clk);
+ @(posedge clk);
+ src_rdy_f36i <= 1;
+ f36_data <= f36_data + 32'h01010101;
+ f36_sof <= 0;
+ f36_eof <= 0;
+ @(posedge clk);
+ @(posedge clk);
+ src_rdy_f36i <= 1;
+ f36_data <= f36_data + 32'h01010101;
+ f36_sof <= 0;
+ f36_eof <= 0;
+ @(posedge clk);
+ @(posedge clk);
+ src_rdy_f36i <= 1;
+ f36_data <= f36_data + 32'h01010101;
+ f36_sof <= 0;
+ f36_eof <= 0;
+ @(posedge clk);
+ @(posedge clk);
+ src_rdy_f36i <= 1;
+ f36_data <= f36_data + 32'h01010101;
+ f36_sof <= 0;
+ f36_eof <= 0;
+ @(posedge clk);
+ @(posedge clk);
+ src_rdy_f36i <= 1;
+ f36_data <= f36_data + 32'h01010101;
+ f36_sof <= 0;
+ f36_eof <= 0;
+ @(posedge clk);
+ @(posedge clk);
+ src_rdy_f36i <= 1;
+ f36_data <= f36_data + 32'h01010101;
+ f36_sof <= 0;
+ f36_eof <= 0;
+ @(posedge clk);
+ @(posedge clk);
+ src_rdy_f36i <= 1;
+ f36_data <= f36_data + 32'h01010101;
+ f36_sof <= 0;
+ f36_eof <= 0;
+ @(posedge clk);
+ @(posedge clk);
+ src_rdy_f36i <= 1;
+ f36_data <= f36_data + 32'h01010101;
+ f36_sof <= 0;
+ f36_eof <= 0;
+ @(posedge clk);
+ @(posedge clk);
+ src_rdy_f36i <= 1;
+ f36_data <= f36_data + 32'h01010101;
+ f36_sof <= 0;
+ f36_eof <= 0;
+ @(posedge clk);
+ @(posedge clk);
+ src_rdy_f36i <= 1;
+ f36_data <= f36_data + 32'h01010101;
+ f36_sof <= 0;
+ f36_eof <= 0;
+ @(posedge clk);
+ @(posedge clk);
+ src_rdy_f36i <= 1;
+ f36_data <= 32'h1F2F3F4F;
+ f36_sof <= 0;
+ f36_eof <= 1;
+ @(posedge clk);
+ @(posedge clk);
+ src_rdy_f36i <= 0;
+
+
+
+ end
+
+// initial #500000 $finish;
+endmodule // fifo_extram_tb
diff --git a/fpga/usrp2/extramfifo/fifo_extram_tb.build b/fpga/usrp2/extramfifo/fifo_extram_tb.build
new file mode 100755
index 000000000..5607c8691
--- /dev/null
+++ b/fpga/usrp2/extramfifo/fifo_extram_tb.build
@@ -0,0 +1 @@
+iverilog -y ../models -y . -y ../control_lib/ -y ../coregen -y ../fifo -y /opt/Xilinx/10.1/ISE/verilog/src/XilinxCoreLib -y /opt/Xilinx/10.1/ISE/verilog/src/unisims/ -o fifo_extram_tb fifo_extram_tb.v
diff --git a/fpga/usrp2/extramfifo/fifo_extram_tb.v b/fpga/usrp2/extramfifo/fifo_extram_tb.v
new file mode 100644
index 000000000..73550d9ca
--- /dev/null
+++ b/fpga/usrp2/extramfifo/fifo_extram_tb.v
@@ -0,0 +1,134 @@
+module fifo_extram_tb();
+
+ reg clk = 0;
+ reg sram_clk = 0;
+ reg reset = 1;
+ reg clear = 0;
+
+ initial #1000 reset = 0;
+ always #125 clk = ~clk;
+ always #100 sram_clk = ~sram_clk;
+
+ reg [15:0] f18_data = 0;
+ reg f18_sof = 0, f18_eof = 0;
+
+ wire [17:0] f18_in = {f18_eof,f18_sof,f18_data};
+ reg src_rdy_f18i = 0;
+ wire dst_rdy_f18i;
+
+ wire [17:0] f18_out;
+ wire src_rdy_f18o;
+ reg dst_rdy_f18o = 0;
+
+ wire [17:0] f18_int;
+ wire src_rdy_f18int, dst_rdy_f18int;
+
+ wire [17:0] sram_d;
+ wire [18:0] sram_a;
+ wire [1:0] sram_bw;
+ wire sram_we, sram_adv, sram_ce, sram_oe, sram_mode, sram_zz;
+ wire [15:0] f1_occ;
+
+ fifo_short #(.WIDTH(18)) fifo_short
+ (.clk(sram_clk), .reset(reset), .clear(clear),
+ .datain(f18_in), .src_rdy_i(src_rdy_f18i), .dst_rdy_o(dst_rdy_f18i), .space(),
+ .dataout(f18_int), .src_rdy_o(src_rdy_f18int), .dst_rdy_i(dst_rdy_f18int), .occupied(f1_occ[4:0]) );
+
+ assign f1_occ[15:5] = 0;
+
+ fifo_extram fifo_extram
+ (.reset(reset), .clear(clear),
+ .datain(f18_int), .src_rdy_i(src_rdy_f18int), .dst_rdy_o(dst_rdy_f18int), .space(), .occ_in(f1_occ),
+ .dataout(f18_out), .src_rdy_o(src_rdy_f18o), .dst_rdy_i(dst_rdy_f18o), .occupied(), .space_in(7),
+ .sram_clk(sram_clk), .sram_a(sram_a), .sram_d(sram_d), .sram_we(sram_we),
+ .sram_bw(sram_bw), .sram_adv(sram_adv), .sram_ce(sram_ce), .sram_oe(sram_oe),
+ .sram_mode(sram_mode), .sram_zz(sram_zz));
+
+`define idt 1
+`ifdef idt
+ wire [15:0] dummy16;
+ wire [1:0] dummy2;
+
+ idt71v65603s150
+ ram_model(.A(sram_a[17:0]),
+ .adv_ld_(sram_adv), // advance (high) / load (low)
+ .bw1_(0), .bw2_(0), .bw3_(0), .bw4_(0), // byte write enables (low)
+ .ce1_(0), .ce2(1), .ce2_(0), // chip enables
+ .cen_(sram_ce), // clock enable (low)
+ .clk(sram_clk), // clock
+ .IO({dummy16,sram_d[15:0]}),
+ .IOP({dummy2,sram_d[17:16]}), // data bus
+ .lbo_(sram_mode), // linear burst order (low)
+ .oe_(sram_oe), // output enable (low)
+ .r_w_(sram_we)); // read (high) / write (low)
+`else
+ cy1356 ram_model(.d(sram_d),.clk(sram_clk),.a(sram_a),
+ .bws(2'b00),.we_b(sram_we),.adv_lb(sram_adv),
+ .ce1b(0),.ce2(1),.ce3b(0),
+ .oeb(sram_oe),.cenb(sram_ce),.mode(sram_mode) );
+`endif // !`ifdef idt
+
+ always @(posedge sram_clk)
+ if(dst_rdy_f18o & src_rdy_f18o)
+ $display("Read: %h",f18_out);
+
+ always @(posedge sram_clk)
+ if(dst_rdy_f18int & src_rdy_f18int)
+ $display("Write: %h",f18_int);
+
+ initial $dumpfile("fifo_extram_tb.vcd");
+ initial $dumpvars(0,fifo_extram_tb);
+
+ task SendPkt;
+ input [15:0] data_start;
+ input [31:0] data_len;
+ begin
+ @(posedge sram_clk);
+ f18_data = data_start;
+ f18_sof = 1;
+ f18_eof = 0;
+ src_rdy_f18i = 1;
+ while(~dst_rdy_f18i)
+ #1;
+ @(posedge sram_clk);
+ repeat(data_len - 2)
+ begin
+ f18_data = f18_data + 16'h0101;
+ f18_sof = 0;
+ while(~dst_rdy_f18i)
+ @(posedge sram_clk);
+
+ @(posedge sram_clk);
+ end
+ f18_data = f18_data + 16'h0101;
+ f18_eof = 1;
+ while(~dst_rdy_f18i)
+ #1;
+ @(posedge sram_clk);
+ src_rdy_f18i = 0;
+ f18_data = 0;
+ f18_eof = 0;
+ end
+ endtask // SendPkt
+
+ initial
+ begin
+ @(negedge reset);
+ @(posedge sram_clk);
+ @(posedge sram_clk);
+ #10000;
+ @(posedge sram_clk);
+ SendPkt(16'hA0B0, 100);
+ #10000;
+ //SendPkt(16'hC0D0, 220);
+ end
+
+ initial
+ begin
+ #20000;
+ dst_rdy_f18o = 1;
+ end
+
+ initial #200000 $finish;
+endmodule // fifo_extram_tb
+
diff --git a/fpga/usrp2/extramfifo/icon.v b/fpga/usrp2/extramfifo/icon.v
new file mode 100644
index 000000000..6537e9340
--- /dev/null
+++ b/fpga/usrp2/extramfifo/icon.v
@@ -0,0 +1,1286 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved.
+////////////////////////////////////////////////////////////////////////////////
+// ____ ____
+// / /\/ /
+// /___/ \ / Vendor: Xilinx
+// \ \ \/ Version: M.53d
+// \ \ Application: netgen
+// / / Filename: icon.v
+// /___/ /\ Timestamp: Tue Jul 20 20:31:15 2010
+// \ \ / \
+// \___\/\___\
+//
+// Command : -w -sim -ofmt verilog /home/ianb/ettus/sram_fifo/fpgapriv/usrp2/extramfifo/tmp/_cg/icon.ngc /home/ianb/ettus/sram_fifo/fpgapriv/usrp2/extramfifo/tmp/_cg/icon.v
+// Device : xc3s2000-fg456-5
+// Input file : /home/ianb/ettus/sram_fifo/fpgapriv/usrp2/extramfifo/tmp/_cg/icon.ngc
+// Output file : /home/ianb/ettus/sram_fifo/fpgapriv/usrp2/extramfifo/tmp/_cg/icon.v
+// # of Modules : 1
+// Design Name : icon
+// Xilinx : /opt/Xilinx/12.1/ISE_DS/ISE
+//
+// Purpose:
+// This verilog netlist is a verification model and uses simulation
+// primitives which may not represent the true implementation of the
+// device, however the netlist is functionally correct and should not
+// be modified. This file cannot be synthesized and should only be used
+// with supported simulation tools.
+//
+// Reference:
+// Command Line Tools User Guide, Chapter 23 and Synthesis and Simulation Design Guide, Chapter 6
+//
+////////////////////////////////////////////////////////////////////////////////
+
+`timescale 1 ns/1 ps
+
+module icon (
+CONTROL0
+)/* synthesis syn_black_box syn_noprune=1 */;
+ inout [35 : 0] CONTROL0;
+
+ // synthesis translate_off
+
+ wire N1;
+ wire \U0/U_ICON/I_YES_BSCAN.U_BS/DRCK1 ;
+ wire \U0/U_ICON/U_CMD/iSEL_n ;
+ wire \U0/U_ICON/U_CMD/iTARGET_CE ;
+ wire \U0/U_ICON/U_CTRL_OUT/iDATA_VALID ;
+ wire \U0/U_ICON/U_STAT/iCMD_GRP0_SEL ;
+ wire \U0/U_ICON/U_STAT/iDATA_VALID ;
+ wire \U0/U_ICON/U_STAT/iSTATCMD_CE ;
+ wire \U0/U_ICON/U_STAT/iSTATCMD_CE_n ;
+ wire \U0/U_ICON/U_STAT/iSTAT_HIGH ;
+ wire \U0/U_ICON/U_STAT/iSTAT_LOW ;
+ wire \U0/U_ICON/U_STAT/iTDO_next ;
+ wire \U0/U_ICON/U_SYNC/iDATA_CMD_n ;
+ wire \U0/U_ICON/U_SYNC/iGOT_SYNC ;
+ wire \U0/U_ICON/U_SYNC/iGOT_SYNC_HIGH ;
+ wire \U0/U_ICON/U_SYNC/iGOT_SYNC_LOW ;
+ wire \U0/U_ICON/U_TDO_MUX/U_CS_MUX/I4.U_MUX16/Mmux_O_3_91 ;
+ wire \U0/U_ICON/U_TDO_MUX/U_CS_MUX/I4.U_MUX16/Mmux_O_4_92 ;
+ wire \U0/U_ICON/iCORE_ID_SEL[0] ;
+ wire \U0/U_ICON/iCORE_ID_SEL[15] ;
+ wire \U0/U_ICON/iDATA_CMD ;
+ wire \U0/U_ICON/iDATA_CMD_n ;
+ wire \U0/U_ICON/iSEL ;
+ wire \U0/U_ICON/iSEL_n ;
+ wire \U0/U_ICON/iSYNC ;
+ wire \U0/U_ICON/iTDI ;
+ wire \U0/U_ICON/iTDO ;
+ wire \U0/U_ICON/iTDO_next ;
+ wire \U0/iSHIFT_OUT ;
+ wire \U0/iUPDATE_OUT ;
+ wire \NLW_U0/U_ICON/I_YES_BSCAN.U_BS/I_SPARTAN3.ISYN.I_USE_SOFTBSCAN_EQ0.I_3.U_BS_DRCK2_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/I_YES_BSCAN.U_BS/I_SPARTAN3.ISYN.I_USE_SOFTBSCAN_EQ0.I_3.U_BS_RESET_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/I_YES_BSCAN.U_BS/I_SPARTAN3.ISYN.I_USE_SOFTBSCAN_EQ0.I_3.U_BS_CAPTURE_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/I_YES_BSCAN.U_BS/I_SPARTAN3.ISYN.I_USE_SOFTBSCAN_EQ0.I_3.U_BS_SEL2_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[1].U_LUT_O_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[2].U_LUT_O_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[3].U_LUT_O_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[4].U_LUT_O_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[5].U_LUT_O_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[6].U_LUT_O_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[7].U_LUT_O_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[8].U_LUT_O_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[9].U_LUT_O_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[10].U_LUT_O_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[11].U_LUT_O_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[12].U_LUT_O_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[13].U_LUT_O_UNCONNECTED ;
+ wire \NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[14].U_LUT_O_UNCONNECTED ;
+ wire [11 : 8] \U0/U_ICON/U_CMD/iTARGET ;
+ wire [1 : 0] \U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL ;
+ wire [5 : 1] \U0/U_ICON/U_STAT/U_STAT_CNT/CI ;
+ wire [5 : 0] \U0/U_ICON/U_STAT/U_STAT_CNT/D ;
+ wire [5 : 0] \U0/U_ICON/U_STAT/U_STAT_CNT/S ;
+ wire [3 : 0] \U0/U_ICON/U_STAT/iSTAT ;
+ wire [5 : 0] \U0/U_ICON/U_STAT/iSTAT_CNT ;
+ wire [6 : 0] \U0/U_ICON/U_SYNC/iSYNC_WORD ;
+ wire [1 : 0] \U0/U_ICON/iCOMMAND_GRP ;
+ wire [15 : 0] \U0/U_ICON/iCOMMAND_SEL ;
+ wire [3 : 0] \U0/U_ICON/iCORE_ID ;
+ wire [15 : 15] \U0/U_ICON/iTDO_VEC ;
+ GND XST_GND (
+ .G(CONTROL0[2])
+ );
+ VCC XST_VCC (
+ .P(N1)
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_TDI_reg (
+ .C(CONTROL0[0]),
+ .CE(N1),
+ .D(\U0/U_ICON/iTDI ),
+ .Q(CONTROL0[1])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_TDO_reg (
+ .C(CONTROL0[0]),
+ .CE(N1),
+ .D(\U0/U_ICON/iTDO_next ),
+ .Q(\U0/U_ICON/iTDO )
+ );
+ FDC #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_iDATA_CMD (
+ .C(\U0/iUPDATE_OUT ),
+ .CLR(\U0/U_ICON/iSEL_n ),
+ .D(\U0/U_ICON/iDATA_CMD_n ),
+ .Q(\U0/U_ICON/iDATA_CMD )
+ );
+ MUXF5 \U0/U_ICON/U_TDO_MUX/U_CS_MUX/I4.U_MUX16/Mmux_O_2_f5 (
+ .I0(\U0/U_ICON/U_TDO_MUX/U_CS_MUX/I4.U_MUX16/Mmux_O_4_92 ),
+ .I1(\U0/U_ICON/U_TDO_MUX/U_CS_MUX/I4.U_MUX16/Mmux_O_3_91 ),
+ .S(\U0/U_ICON/iCORE_ID [3]),
+ .O(\U0/U_ICON/iTDO_next )
+ );
+ LUT4 #(
+ .INIT ( 16'h0002 ))
+ \U0/U_ICON/U_TDO_MUX/U_CS_MUX/I4.U_MUX16/Mmux_O_4 (
+ .I0(CONTROL0[3]),
+ .I1(\U0/U_ICON/iCORE_ID [0]),
+ .I2(\U0/U_ICON/iCORE_ID [1]),
+ .I3(\U0/U_ICON/iCORE_ID [2]),
+ .O(\U0/U_ICON/U_TDO_MUX/U_CS_MUX/I4.U_MUX16/Mmux_O_4_92 )
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_TDO_MUX/U_CS_MUX/I4.U_MUX16/Mmux_O_3 (
+ .I0(\U0/U_ICON/iTDO_VEC [15]),
+ .I1(\U0/U_ICON/iCORE_ID [0]),
+ .I2(\U0/U_ICON/iCORE_ID [1]),
+ .I3(\U0/U_ICON/iCORE_ID [2]),
+ .O(\U0/U_ICON/U_TDO_MUX/U_CS_MUX/I4.U_MUX16/Mmux_O_3_91 )
+ );
+ INV \U0/U_ICON/U_iSEL_n (
+ .I(\U0/U_ICON/iSEL ),
+ .O(\U0/U_ICON/iSEL_n )
+ );
+ INV \U0/U_ICON/U_iDATA_CMD_n (
+ .I(\U0/U_ICON/iDATA_CMD ),
+ .O(\U0/U_ICON/iDATA_CMD_n )
+ );
+ BSCAN_SPARTAN3 \U0/U_ICON/I_YES_BSCAN.U_BS/I_SPARTAN3.ISYN.I_USE_SOFTBSCAN_EQ0.I_3.U_BS (
+ .TDI(\U0/U_ICON/iTDI ),
+ .SHIFT(\U0/iSHIFT_OUT ),
+ .DRCK1(\U0/U_ICON/I_YES_BSCAN.U_BS/DRCK1 ),
+ .DRCK2(\NLW_U0/U_ICON/I_YES_BSCAN.U_BS/I_SPARTAN3.ISYN.I_USE_SOFTBSCAN_EQ0.I_3.U_BS_DRCK2_UNCONNECTED ),
+ .RESET(\NLW_U0/U_ICON/I_YES_BSCAN.U_BS/I_SPARTAN3.ISYN.I_USE_SOFTBSCAN_EQ0.I_3.U_BS_RESET_UNCONNECTED ),
+ .UPDATE(\U0/iUPDATE_OUT ),
+ .TDO1(\U0/U_ICON/iTDO ),
+ .TDO2(CONTROL0[2]),
+ .CAPTURE(\NLW_U0/U_ICON/I_YES_BSCAN.U_BS/I_SPARTAN3.ISYN.I_USE_SOFTBSCAN_EQ0.I_3.U_BS_CAPTURE_UNCONNECTED ),
+ .SEL1(\U0/U_ICON/iSEL ),
+ .SEL2(\NLW_U0/U_ICON/I_YES_BSCAN.U_BS/I_SPARTAN3.ISYN.I_USE_SOFTBSCAN_EQ0.I_3.U_BS_SEL2_UNCONNECTED )
+ );
+ icon_bscan_bufg \U0/U_ICON/I_YES_BSCAN.U_BS/I_USE_SOFTBSCAN_EQ0.I_USE_XST_TCK_WORKAROUND_EQ1.U_ICON_BSCAN_BUFG (
+ .DRCK_LOCAL_I(\U0/U_ICON/I_YES_BSCAN.U_BS/DRCK1 ),
+ .DRCK_LOCAL_O(CONTROL0[0])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/U_ICON/U_SYNC/U_GOT_SYNC (
+ .I0(\U0/U_ICON/U_SYNC/iGOT_SYNC_LOW ),
+ .I1(\U0/U_ICON/U_SYNC/iGOT_SYNC_HIGH ),
+ .O(\U0/U_ICON/U_SYNC/iGOT_SYNC )
+ );
+ LUT4 #(
+ .INIT ( 16'h0200 ))
+ \U0/U_ICON/U_SYNC/U_GOT_SYNC_L (
+ .I0(\U0/U_ICON/U_SYNC/iSYNC_WORD [0]),
+ .I1(\U0/U_ICON/U_SYNC/iSYNC_WORD [1]),
+ .I2(\U0/U_ICON/U_SYNC/iSYNC_WORD [2]),
+ .I3(\U0/U_ICON/U_SYNC/iSYNC_WORD [3]),
+ .O(\U0/U_ICON/U_SYNC/iGOT_SYNC_LOW )
+ );
+ LUT4 #(
+ .INIT ( 16'h0400 ))
+ \U0/U_ICON/U_SYNC/U_GOT_SYNC_H (
+ .I0(\U0/U_ICON/U_SYNC/iSYNC_WORD [4]),
+ .I1(\U0/U_ICON/U_SYNC/iSYNC_WORD [5]),
+ .I2(\U0/U_ICON/U_SYNC/iSYNC_WORD [6]),
+ .I3(CONTROL0[1]),
+ .O(\U0/U_ICON/U_SYNC/iGOT_SYNC_HIGH )
+ );
+ INV \U0/U_ICON/U_SYNC/U_iDATA_CMD_n (
+ .I(\U0/U_ICON/iDATA_CMD ),
+ .O(\U0/U_ICON/U_SYNC/iDATA_CMD_n )
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_SYNC/U_SYNC (
+ .C(CONTROL0[0]),
+ .CE(\U0/U_ICON/U_SYNC/iGOT_SYNC ),
+ .D(N1),
+ .R(\U0/U_ICON/U_SYNC/iDATA_CMD_n ),
+ .Q(\U0/U_ICON/iSYNC )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_SYNC/G_SYNC_WORD[0].I_NE0.U_FDR (
+ .C(CONTROL0[0]),
+ .D(\U0/U_ICON/U_SYNC/iSYNC_WORD [1]),
+ .R(\U0/U_ICON/U_SYNC/iDATA_CMD_n ),
+ .Q(\U0/U_ICON/U_SYNC/iSYNC_WORD [0])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_SYNC/G_SYNC_WORD[1].I_NE0.U_FDR (
+ .C(CONTROL0[0]),
+ .D(\U0/U_ICON/U_SYNC/iSYNC_WORD [2]),
+ .R(\U0/U_ICON/U_SYNC/iDATA_CMD_n ),
+ .Q(\U0/U_ICON/U_SYNC/iSYNC_WORD [1])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_SYNC/G_SYNC_WORD[2].I_NE0.U_FDR (
+ .C(CONTROL0[0]),
+ .D(\U0/U_ICON/U_SYNC/iSYNC_WORD [3]),
+ .R(\U0/U_ICON/U_SYNC/iDATA_CMD_n ),
+ .Q(\U0/U_ICON/U_SYNC/iSYNC_WORD [2])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_SYNC/G_SYNC_WORD[3].I_NE0.U_FDR (
+ .C(CONTROL0[0]),
+ .D(\U0/U_ICON/U_SYNC/iSYNC_WORD [4]),
+ .R(\U0/U_ICON/U_SYNC/iDATA_CMD_n ),
+ .Q(\U0/U_ICON/U_SYNC/iSYNC_WORD [3])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_SYNC/G_SYNC_WORD[4].I_NE0.U_FDR (
+ .C(CONTROL0[0]),
+ .D(\U0/U_ICON/U_SYNC/iSYNC_WORD [5]),
+ .R(\U0/U_ICON/U_SYNC/iDATA_CMD_n ),
+ .Q(\U0/U_ICON/U_SYNC/iSYNC_WORD [4])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_SYNC/G_SYNC_WORD[5].I_NE0.U_FDR (
+ .C(CONTROL0[0]),
+ .D(\U0/U_ICON/U_SYNC/iSYNC_WORD [6]),
+ .R(\U0/U_ICON/U_SYNC/iDATA_CMD_n ),
+ .Q(\U0/U_ICON/U_SYNC/iSYNC_WORD [5])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_SYNC/G_SYNC_WORD[6].I_EQ0.U_FDR (
+ .C(CONTROL0[0]),
+ .D(CONTROL0[1]),
+ .R(\U0/U_ICON/U_SYNC/iDATA_CMD_n ),
+ .Q(\U0/U_ICON/U_SYNC/iSYNC_WORD [6])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[0].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [0]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[20])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[0].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [0]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[4])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[1].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [1]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[21])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[1].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [1]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[5])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[2].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [2]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[22])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[2].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [2]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[6])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[3].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [3]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[23])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[3].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [3]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[7])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[4].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [4]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[24])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[4].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [4]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[8])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[5].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [5]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[25])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[5].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [5]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[9])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[6].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [6]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[26])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[6].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [6]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[10])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[7].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [7]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[27])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[7].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [7]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[11])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[8].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [8]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[28])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[8].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [8]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[12])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[9].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [9]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[29])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[9].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [9]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[13])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[10].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [10]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[30])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[10].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [10]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[14])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[11].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [11]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[31])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[11].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [11]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[15])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[12].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [12]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[32])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[12].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [12]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[16])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[13].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [13]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[33])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[13].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [13]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[17])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[14].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [14]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[34])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[14].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [14]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[18])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[15].U_HCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [15]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1]),
+ .O(CONTROL0[35])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CTRL_OUT/F_NCP[0].F_CMD[15].U_LCE (
+ .I0(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [15]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[0] ),
+ .I3(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0]),
+ .O(CONTROL0[19])
+ );
+ LUT2 #(
+ .INIT ( 4'h2 ))
+ \U0/U_ICON/U_CTRL_OUT/U_CMDGRP1 (
+ .I0(\U0/U_ICON/iCOMMAND_GRP [0]),
+ .I1(\U0/U_ICON/iCOMMAND_GRP [1]),
+ .O(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [1])
+ );
+ LUT2 #(
+ .INIT ( 4'h1 ))
+ \U0/U_ICON/U_CTRL_OUT/U_CMDGRP0 (
+ .I0(\U0/U_ICON/iCOMMAND_GRP [0]),
+ .I1(\U0/U_ICON/iCOMMAND_GRP [1]),
+ .O(\U0/U_ICON/U_CTRL_OUT/iCOMMAND_GRP_SEL [0])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/U_ICON/U_CTRL_OUT/U_DATA_VALID (
+ .I0(\U0/U_ICON/iSYNC ),
+ .I1(\U0/iSHIFT_OUT ),
+ .O(\U0/U_ICON/U_CTRL_OUT/iDATA_VALID )
+ );
+ LUT4 #(
+ .INIT ( 16'h0001 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[0].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\U0/U_ICON/iCORE_ID_SEL[0] )
+ );
+ LUT4 #(
+ .INIT ( 16'h0002 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[1].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[1].U_LUT_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h0004 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[2].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[2].U_LUT_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h0008 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[3].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[3].U_LUT_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h0010 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[4].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[4].U_LUT_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h0020 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[5].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[5].U_LUT_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h0040 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[6].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[6].U_LUT_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h0080 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[7].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[7].U_LUT_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h0100 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[8].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[8].U_LUT_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h0200 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[9].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[9].U_LUT_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h0400 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[10].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[10].U_LUT_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h0800 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[11].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[11].U_LUT_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h1000 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[12].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[12].U_LUT_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h2000 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[13].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[13].U_LUT_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h4000 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[14].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\NLW_U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[14].U_LUT_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CMD/U_CORE_ID_SEL/I4.FI[15].U_LUT (
+ .I0(\U0/U_ICON/iCORE_ID [0]),
+ .I1(\U0/U_ICON/iCORE_ID [1]),
+ .I2(\U0/U_ICON/iCORE_ID [2]),
+ .I3(\U0/U_ICON/iCORE_ID [3]),
+ .O(\U0/U_ICON/iCORE_ID_SEL[15] )
+ );
+ LUT4 #(
+ .INIT ( 16'h0001 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[0].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [0])
+ );
+ LUT4 #(
+ .INIT ( 16'h0002 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[1].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [1])
+ );
+ LUT4 #(
+ .INIT ( 16'h0004 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[2].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [2])
+ );
+ LUT4 #(
+ .INIT ( 16'h0008 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[3].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [3])
+ );
+ LUT4 #(
+ .INIT ( 16'h0010 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[4].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [4])
+ );
+ LUT4 #(
+ .INIT ( 16'h0020 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[5].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [5])
+ );
+ LUT4 #(
+ .INIT ( 16'h0040 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[6].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [6])
+ );
+ LUT4 #(
+ .INIT ( 16'h0080 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[7].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [7])
+ );
+ LUT4 #(
+ .INIT ( 16'h0100 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[8].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [8])
+ );
+ LUT4 #(
+ .INIT ( 16'h0200 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[9].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [9])
+ );
+ LUT4 #(
+ .INIT ( 16'h0400 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[10].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [10])
+ );
+ LUT4 #(
+ .INIT ( 16'h0800 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[11].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [11])
+ );
+ LUT4 #(
+ .INIT ( 16'h1000 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[12].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [12])
+ );
+ LUT4 #(
+ .INIT ( 16'h2000 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[13].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [13])
+ );
+ LUT4 #(
+ .INIT ( 16'h4000 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[14].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [14])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_CMD/U_COMMAND_SEL/I4.FI[15].U_LUT (
+ .I0(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .I1(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .I2(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .I3(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .O(\U0/U_ICON/iCOMMAND_SEL [15])
+ );
+ LUT2 #(
+ .INIT ( 4'h4 ))
+ \U0/U_ICON/U_CMD/U_TARGET_CE (
+ .I0(\U0/U_ICON/iDATA_CMD ),
+ .I1(\U0/iSHIFT_OUT ),
+ .O(\U0/U_ICON/U_CMD/iTARGET_CE )
+ );
+ INV \U0/U_ICON/U_CMD/U_SEL_n (
+ .I(\U0/U_ICON/iSEL ),
+ .O(\U0/U_ICON/U_CMD/iSEL_n )
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_CMD/G_TARGET[6].I_NE0.U_TARGET (
+ .C(CONTROL0[0]),
+ .CE(\U0/U_ICON/U_CMD/iTARGET_CE ),
+ .CLR(\U0/U_ICON/U_CMD/iSEL_n ),
+ .D(\U0/U_ICON/iCOMMAND_GRP [1]),
+ .Q(\U0/U_ICON/iCOMMAND_GRP [0])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_CMD/G_TARGET[7].I_NE0.U_TARGET (
+ .C(CONTROL0[0]),
+ .CE(\U0/U_ICON/U_CMD/iTARGET_CE ),
+ .CLR(\U0/U_ICON/U_CMD/iSEL_n ),
+ .D(\U0/U_ICON/U_CMD/iTARGET [8]),
+ .Q(\U0/U_ICON/iCOMMAND_GRP [1])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_CMD/G_TARGET[8].I_NE0.U_TARGET (
+ .C(CONTROL0[0]),
+ .CE(\U0/U_ICON/U_CMD/iTARGET_CE ),
+ .CLR(\U0/U_ICON/U_CMD/iSEL_n ),
+ .D(\U0/U_ICON/U_CMD/iTARGET [9]),
+ .Q(\U0/U_ICON/U_CMD/iTARGET [8])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_CMD/G_TARGET[9].I_NE0.U_TARGET (
+ .C(CONTROL0[0]),
+ .CE(\U0/U_ICON/U_CMD/iTARGET_CE ),
+ .CLR(\U0/U_ICON/U_CMD/iSEL_n ),
+ .D(\U0/U_ICON/U_CMD/iTARGET [10]),
+ .Q(\U0/U_ICON/U_CMD/iTARGET [9])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_CMD/G_TARGET[10].I_NE0.U_TARGET (
+ .C(CONTROL0[0]),
+ .CE(\U0/U_ICON/U_CMD/iTARGET_CE ),
+ .CLR(\U0/U_ICON/U_CMD/iSEL_n ),
+ .D(\U0/U_ICON/U_CMD/iTARGET [11]),
+ .Q(\U0/U_ICON/U_CMD/iTARGET [10])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_CMD/G_TARGET[11].I_NE0.U_TARGET (
+ .C(CONTROL0[0]),
+ .CE(\U0/U_ICON/U_CMD/iTARGET_CE ),
+ .CLR(\U0/U_ICON/U_CMD/iSEL_n ),
+ .D(\U0/U_ICON/iCORE_ID [0]),
+ .Q(\U0/U_ICON/U_CMD/iTARGET [11])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_CMD/G_TARGET[12].I_NE0.U_TARGET (
+ .C(CONTROL0[0]),
+ .CE(\U0/U_ICON/U_CMD/iTARGET_CE ),
+ .CLR(\U0/U_ICON/U_CMD/iSEL_n ),
+ .D(\U0/U_ICON/iCORE_ID [1]),
+ .Q(\U0/U_ICON/iCORE_ID [0])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_CMD/G_TARGET[13].I_NE0.U_TARGET (
+ .C(CONTROL0[0]),
+ .CE(\U0/U_ICON/U_CMD/iTARGET_CE ),
+ .CLR(\U0/U_ICON/U_CMD/iSEL_n ),
+ .D(\U0/U_ICON/iCORE_ID [2]),
+ .Q(\U0/U_ICON/iCORE_ID [1])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_CMD/G_TARGET[14].I_NE0.U_TARGET (
+ .C(CONTROL0[0]),
+ .CE(\U0/U_ICON/U_CMD/iTARGET_CE ),
+ .CLR(\U0/U_ICON/U_CMD/iSEL_n ),
+ .D(\U0/U_ICON/iCORE_ID [3]),
+ .Q(\U0/U_ICON/iCORE_ID [2])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_CMD/G_TARGET[15].I_EQ0.U_TARGET (
+ .C(CONTROL0[0]),
+ .CE(\U0/U_ICON/U_CMD/iTARGET_CE ),
+ .CLR(\U0/U_ICON/U_CMD/iSEL_n ),
+ .D(CONTROL0[1]),
+ .Q(\U0/U_ICON/iCORE_ID [3])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_STAT/U_STAT_CNT/G[5].U_FDRE (
+ .C(CONTROL0[0]),
+ .CE(N1),
+ .D(\U0/U_ICON/U_STAT/U_STAT_CNT/D [5]),
+ .R(\U0/U_ICON/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/U_ICON/U_STAT/iSTAT_CNT [5])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_STAT/U_STAT_CNT/G[4].U_FDRE (
+ .C(CONTROL0[0]),
+ .CE(N1),
+ .D(\U0/U_ICON/U_STAT/U_STAT_CNT/D [4]),
+ .R(\U0/U_ICON/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/U_ICON/U_STAT/iSTAT_CNT [4])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_STAT/U_STAT_CNT/G[3].U_FDRE (
+ .C(CONTROL0[0]),
+ .CE(N1),
+ .D(\U0/U_ICON/U_STAT/U_STAT_CNT/D [3]),
+ .R(\U0/U_ICON/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/U_ICON/U_STAT/iSTAT_CNT [3])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_STAT/U_STAT_CNT/G[2].U_FDRE (
+ .C(CONTROL0[0]),
+ .CE(N1),
+ .D(\U0/U_ICON/U_STAT/U_STAT_CNT/D [2]),
+ .R(\U0/U_ICON/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/U_ICON/U_STAT/iSTAT_CNT [2])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_STAT/U_STAT_CNT/G[1].U_FDRE (
+ .C(CONTROL0[0]),
+ .CE(N1),
+ .D(\U0/U_ICON/U_STAT/U_STAT_CNT/D [1]),
+ .R(\U0/U_ICON/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/U_ICON/U_STAT/iSTAT_CNT [1])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_STAT/U_STAT_CNT/G[0].U_FDRE (
+ .C(CONTROL0[0]),
+ .CE(N1),
+ .D(\U0/U_ICON/U_STAT/U_STAT_CNT/D [0]),
+ .R(\U0/U_ICON/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/U_ICON/U_STAT/iSTAT_CNT [0])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/U_ICON/U_STAT/U_STAT_CNT/G[5].U_LUT (
+ .I0(\U0/U_ICON/U_STAT/iSTAT_CNT [5]),
+ .O(\U0/U_ICON/U_STAT/U_STAT_CNT/S [5])
+ );
+ XORCY \U0/U_ICON/U_STAT/U_STAT_CNT/G[5].U_XORCY (
+ .CI(\U0/U_ICON/U_STAT/U_STAT_CNT/CI [5]),
+ .LI(\U0/U_ICON/U_STAT/U_STAT_CNT/S [5]),
+ .O(\U0/U_ICON/U_STAT/U_STAT_CNT/D [5])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/U_ICON/U_STAT/U_STAT_CNT/G[4].U_LUT (
+ .I0(\U0/U_ICON/U_STAT/iSTAT_CNT [4]),
+ .O(\U0/U_ICON/U_STAT/U_STAT_CNT/S [4])
+ );
+ MUXCY_L \U0/U_ICON/U_STAT/U_STAT_CNT/G[4].GnH.U_MUXCY (
+ .CI(\U0/U_ICON/U_STAT/U_STAT_CNT/CI [4]),
+ .DI(CONTROL0[2]),
+ .S(\U0/U_ICON/U_STAT/U_STAT_CNT/S [4]),
+ .LO(\U0/U_ICON/U_STAT/U_STAT_CNT/CI [5])
+ );
+ XORCY \U0/U_ICON/U_STAT/U_STAT_CNT/G[4].U_XORCY (
+ .CI(\U0/U_ICON/U_STAT/U_STAT_CNT/CI [4]),
+ .LI(\U0/U_ICON/U_STAT/U_STAT_CNT/S [4]),
+ .O(\U0/U_ICON/U_STAT/U_STAT_CNT/D [4])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/U_ICON/U_STAT/U_STAT_CNT/G[3].U_LUT (
+ .I0(\U0/U_ICON/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/U_ICON/U_STAT/U_STAT_CNT/S [3])
+ );
+ MUXCY_L \U0/U_ICON/U_STAT/U_STAT_CNT/G[3].GnH.U_MUXCY (
+ .CI(\U0/U_ICON/U_STAT/U_STAT_CNT/CI [3]),
+ .DI(CONTROL0[2]),
+ .S(\U0/U_ICON/U_STAT/U_STAT_CNT/S [3]),
+ .LO(\U0/U_ICON/U_STAT/U_STAT_CNT/CI [4])
+ );
+ XORCY \U0/U_ICON/U_STAT/U_STAT_CNT/G[3].U_XORCY (
+ .CI(\U0/U_ICON/U_STAT/U_STAT_CNT/CI [3]),
+ .LI(\U0/U_ICON/U_STAT/U_STAT_CNT/S [3]),
+ .O(\U0/U_ICON/U_STAT/U_STAT_CNT/D [3])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/U_ICON/U_STAT/U_STAT_CNT/G[2].U_LUT (
+ .I0(\U0/U_ICON/U_STAT/iSTAT_CNT [2]),
+ .O(\U0/U_ICON/U_STAT/U_STAT_CNT/S [2])
+ );
+ MUXCY_L \U0/U_ICON/U_STAT/U_STAT_CNT/G[2].GnH.U_MUXCY (
+ .CI(\U0/U_ICON/U_STAT/U_STAT_CNT/CI [2]),
+ .DI(CONTROL0[2]),
+ .S(\U0/U_ICON/U_STAT/U_STAT_CNT/S [2]),
+ .LO(\U0/U_ICON/U_STAT/U_STAT_CNT/CI [3])
+ );
+ XORCY \U0/U_ICON/U_STAT/U_STAT_CNT/G[2].U_XORCY (
+ .CI(\U0/U_ICON/U_STAT/U_STAT_CNT/CI [2]),
+ .LI(\U0/U_ICON/U_STAT/U_STAT_CNT/S [2]),
+ .O(\U0/U_ICON/U_STAT/U_STAT_CNT/D [2])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/U_ICON/U_STAT/U_STAT_CNT/G[1].U_LUT (
+ .I0(\U0/U_ICON/U_STAT/iSTAT_CNT [1]),
+ .O(\U0/U_ICON/U_STAT/U_STAT_CNT/S [1])
+ );
+ MUXCY_L \U0/U_ICON/U_STAT/U_STAT_CNT/G[1].GnH.U_MUXCY (
+ .CI(\U0/U_ICON/U_STAT/U_STAT_CNT/CI [1]),
+ .DI(CONTROL0[2]),
+ .S(\U0/U_ICON/U_STAT/U_STAT_CNT/S [1]),
+ .LO(\U0/U_ICON/U_STAT/U_STAT_CNT/CI [2])
+ );
+ XORCY \U0/U_ICON/U_STAT/U_STAT_CNT/G[1].U_XORCY (
+ .CI(\U0/U_ICON/U_STAT/U_STAT_CNT/CI [1]),
+ .LI(\U0/U_ICON/U_STAT/U_STAT_CNT/S [1]),
+ .O(\U0/U_ICON/U_STAT/U_STAT_CNT/D [1])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/U_ICON/U_STAT/U_STAT_CNT/G[0].U_LUT (
+ .I0(\U0/U_ICON/U_STAT/iSTAT_CNT [0]),
+ .O(\U0/U_ICON/U_STAT/U_STAT_CNT/S [0])
+ );
+ MUXCY_L \U0/U_ICON/U_STAT/U_STAT_CNT/G[0].GnH.U_MUXCY (
+ .CI(N1),
+ .DI(CONTROL0[2]),
+ .S(\U0/U_ICON/U_STAT/U_STAT_CNT/S [0]),
+ .LO(\U0/U_ICON/U_STAT/U_STAT_CNT/CI [1])
+ );
+ XORCY \U0/U_ICON/U_STAT/U_STAT_CNT/G[0].U_XORCY (
+ .CI(N1),
+ .LI(\U0/U_ICON/U_STAT/U_STAT_CNT/S [0]),
+ .O(\U0/U_ICON/U_STAT/U_STAT_CNT/D [0])
+ );
+ MUXF6 \U0/U_ICON/U_STAT/U_TDO_next (
+ .I0(\U0/U_ICON/U_STAT/iSTAT_LOW ),
+ .I1(\U0/U_ICON/U_STAT/iSTAT_HIGH ),
+ .S(\U0/U_ICON/U_STAT/iSTAT_CNT [5]),
+ .O(\U0/U_ICON/U_STAT/iTDO_next )
+ );
+ MUXF5 \U0/U_ICON/U_STAT/U_STAT_LOW (
+ .I0(\U0/U_ICON/U_STAT/iSTAT [0]),
+ .I1(\U0/U_ICON/U_STAT/iSTAT [1]),
+ .S(\U0/U_ICON/U_STAT/iSTAT_CNT [4]),
+ .O(\U0/U_ICON/U_STAT/iSTAT_LOW )
+ );
+ MUXF5 \U0/U_ICON/U_STAT/U_STAT_HIGH (
+ .I0(\U0/U_ICON/U_STAT/iSTAT [2]),
+ .I1(\U0/U_ICON/U_STAT/iSTAT [3]),
+ .S(\U0/U_ICON/U_STAT/iSTAT_CNT [4]),
+ .O(\U0/U_ICON/U_STAT/iSTAT_HIGH )
+ );
+ LUT4 #(
+ .INIT ( 16'h0101 ))
+ \U0/U_ICON/U_STAT/F_STAT[0].U_STAT (
+ .I0(\U0/U_ICON/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/U_ICON/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/U_ICON/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/U_ICON/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/U_ICON/U_STAT/iSTAT [0])
+ );
+ LUT4 #(
+ .INIT ( 16'hC101 ))
+ \U0/U_ICON/U_STAT/F_STAT[1].U_STAT (
+ .I0(\U0/U_ICON/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/U_ICON/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/U_ICON/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/U_ICON/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/U_ICON/U_STAT/iSTAT [1])
+ );
+ LUT4 #(
+ .INIT ( 16'h2100 ))
+ \U0/U_ICON/U_STAT/F_STAT[2].U_STAT (
+ .I0(\U0/U_ICON/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/U_ICON/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/U_ICON/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/U_ICON/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/U_ICON/U_STAT/iSTAT [2])
+ );
+ LUT4 #(
+ .INIT ( 16'h1610 ))
+ \U0/U_ICON/U_STAT/F_STAT[3].U_STAT (
+ .I0(\U0/U_ICON/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/U_ICON/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/U_ICON/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/U_ICON/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/U_ICON/U_STAT/iSTAT [3])
+ );
+ INV \U0/U_ICON/U_STAT/U_STATCMD_n (
+ .I(\U0/U_ICON/U_STAT/iSTATCMD_CE ),
+ .O(\U0/U_ICON/U_STAT/iSTATCMD_CE_n )
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_ICON/U_STAT/U_STATCMD (
+ .I0(\U0/U_ICON/U_STAT/iDATA_VALID ),
+ .I1(\U0/U_ICON/iCOMMAND_SEL [0]),
+ .I2(\U0/U_ICON/iCORE_ID_SEL[15] ),
+ .I3(\U0/U_ICON/U_STAT/iCMD_GRP0_SEL ),
+ .O(\U0/U_ICON/U_STAT/iSTATCMD_CE )
+ );
+ LUT2 #(
+ .INIT ( 4'h1 ))
+ \U0/U_ICON/U_STAT/U_CMDGRP0 (
+ .I0(\U0/U_ICON/iCOMMAND_GRP [0]),
+ .I1(\U0/U_ICON/iCOMMAND_GRP [1]),
+ .O(\U0/U_ICON/U_STAT/iCMD_GRP0_SEL )
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/U_ICON/U_STAT/U_DATA_VALID (
+ .I0(\U0/U_ICON/iSYNC ),
+ .I1(\U0/iSHIFT_OUT ),
+ .O(\U0/U_ICON/U_STAT/iDATA_VALID )
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/U_ICON/U_STAT/U_TDO (
+ .C(CONTROL0[0]),
+ .CE(N1),
+ .D(\U0/U_ICON/U_STAT/iTDO_next ),
+ .Q(\U0/U_ICON/iTDO_VEC [15])
+ );
+
+// synthesis translate_on
+
+endmodule
+
+// synthesis translate_off
+
+`ifndef GLBL
+`define GLBL
+
+`timescale 1 ps / 1 ps
+
+module glbl ();
+
+ parameter ROC_WIDTH = 100000;
+ parameter TOC_WIDTH = 0;
+
+ wire GSR;
+ wire GTS;
+ wire GWE;
+ wire PRLD;
+ tri1 p_up_tmp;
+ tri (weak1, strong0) PLL_LOCKG = p_up_tmp;
+
+ reg GSR_int;
+ reg GTS_int;
+ reg PRLD_int;
+
+//-------- JTAG Globals --------------
+ wire JTAG_TDO_GLBL;
+ wire JTAG_TCK_GLBL;
+ wire JTAG_TDI_GLBL;
+ wire JTAG_TMS_GLBL;
+ wire JTAG_TRST_GLBL;
+
+ reg JTAG_CAPTURE_GLBL;
+ reg JTAG_RESET_GLBL;
+ reg JTAG_SHIFT_GLBL;
+ reg JTAG_UPDATE_GLBL;
+ reg JTAG_RUNTEST_GLBL;
+
+ reg JTAG_SEL1_GLBL = 0;
+ reg JTAG_SEL2_GLBL = 0 ;
+ reg JTAG_SEL3_GLBL = 0;
+ reg JTAG_SEL4_GLBL = 0;
+
+ reg JTAG_USER_TDO1_GLBL = 1'bz;
+ reg JTAG_USER_TDO2_GLBL = 1'bz;
+ reg JTAG_USER_TDO3_GLBL = 1'bz;
+ reg JTAG_USER_TDO4_GLBL = 1'bz;
+
+ assign (weak1, weak0) GSR = GSR_int;
+ assign (weak1, weak0) GTS = GTS_int;
+ assign (weak1, weak0) PRLD = PRLD_int;
+
+ initial begin
+ GSR_int = 1'b1;
+ PRLD_int = 1'b1;
+ #(ROC_WIDTH)
+ GSR_int = 1'b0;
+ PRLD_int = 1'b0;
+ end
+
+ initial begin
+ GTS_int = 1'b1;
+ #(TOC_WIDTH)
+ GTS_int = 1'b0;
+ end
+
+endmodule
+
+`endif
+
+// synthesis translate_on
diff --git a/fpga/usrp2/extramfifo/icon.xco b/fpga/usrp2/extramfifo/icon.xco
new file mode 100644
index 000000000..fda273149
--- /dev/null
+++ b/fpga/usrp2/extramfifo/icon.xco
@@ -0,0 +1,47 @@
+##############################################################
+#
+# Xilinx Core Generator version 12.1
+# Date: Wed Jul 21 03:31:19 2010
+#
+##############################################################
+#
+# This file contains the customisation parameters for a
+# Xilinx CORE Generator IP GUI. It is strongly recommended
+# that you do not manually alter this file as it may cause
+# unexpected and unsupported behavior.
+#
+##############################################################
+#
+# BEGIN Project Options
+SET addpads = false
+SET asysymbol = true
+SET busformat = BusFormatAngleBracketNotRipped
+SET createndf = false
+SET designentry = Verilog
+SET device = xc3s2000
+SET devicefamily = spartan3
+SET flowvendor = Other
+SET formalverification = false
+SET foundationsym = false
+SET implementationfiletype = Ngc
+SET package = fg456
+SET removerpms = false
+SET simulationfiles = Structural
+SET speedgrade = -5
+SET verilogsim = true
+SET vhdlsim = false
+# END Project Options
+# BEGIN Select
+SELECT ICON_(ChipScope_Pro_-_Integrated_Controller) family Xilinx,_Inc. 1.04.a
+# END Select
+# BEGIN Parameters
+CSET component_name=icon
+CSET enable_jtag_bufg=true
+CSET number_control_ports=1
+CSET use_ext_bscan=false
+CSET use_softbscan=false
+CSET use_unused_bscan=false
+CSET user_scan_chain=USER1
+# END Parameters
+GENERATE
+# CRC: 799ba5a1
diff --git a/fpga/usrp2/extramfifo/ila.v b/fpga/usrp2/extramfifo/ila.v
new file mode 100644
index 000000000..b0d8f8d0c
--- /dev/null
+++ b/fpga/usrp2/extramfifo/ila.v
@@ -0,0 +1,5544 @@
+////////////////////////////////////////////////////////////////////////////////
+// Copyright (c) 1995-2010 Xilinx, Inc. All rights reserved.
+////////////////////////////////////////////////////////////////////////////////
+// ____ ____
+// / /\/ /
+// /___/ \ / Vendor: Xilinx
+// \ \ \/ Version: M.53d
+// \ \ Application: netgen
+// / / Filename: ila.v
+// /___/ /\ Timestamp: Wed Jul 21 11:51:09 2010
+// \ \ / \
+// \___\/\___\
+//
+// Command : -w -sim -ofmt verilog /home/ianb/ettus/sram_fifo/fpgapriv/usrp2/extramfifo/tmp/_cg/ila.ngc /home/ianb/ettus/sram_fifo/fpgapriv/usrp2/extramfifo/tmp/_cg/ila.v
+// Device : xc3s2000-fg456-5
+// Input file : /home/ianb/ettus/sram_fifo/fpgapriv/usrp2/extramfifo/tmp/_cg/ila.ngc
+// Output file : /home/ianb/ettus/sram_fifo/fpgapriv/usrp2/extramfifo/tmp/_cg/ila.v
+// # of Modules : 1
+// Design Name : ila
+// Xilinx : /opt/Xilinx/12.1/ISE_DS/ISE
+//
+// Purpose:
+// This verilog netlist is a verification model and uses simulation
+// primitives which may not represent the true implementation of the
+// device, however the netlist is functionally correct and should not
+// be modified. This file cannot be synthesized and should only be used
+// with supported simulation tools.
+//
+// Reference:
+// Command Line Tools User Guide, Chapter 23 and Synthesis and Simulation Design Guide, Chapter 6
+//
+////////////////////////////////////////////////////////////////////////////////
+
+`timescale 1 ns/1 ps
+
+module ila (
+ CLK, CONTROL, TRIG0, TRIG1, TRIG2, TRIG3
+)/* synthesis syn_black_box syn_noprune=1 */;
+ input CLK;
+ inout [35 : 0] CONTROL;
+ input [7 : 0] TRIG0;
+ input [7 : 0] TRIG1;
+ input [7 : 0] TRIG2;
+ input [3 : 0] TRIG3;
+
+ // synthesis translate_off
+
+ wire N0;
+ wire N1;
+ wire N38;
+ wire N39;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/CMP_RESET ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iCFG_DIN ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iOUT ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iCFG_DIN ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DIN ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iOUT ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DIN ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iOUT ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCE/iCFG_DIN ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/iCFG_DIN ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iCFG_DIN ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WCE/iCFG_DIN ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/iCFG_DIN ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/iCFG_DIN ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CE ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_CE ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_Q ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_RESET ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/sel[0] ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/sel[1] ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/sel[8] ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/tmpCfgData ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/tmpCfgData0 ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/sel[0] ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/sel[1] ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/sel[8] ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/tmpCfgData ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/tmpCfgData0 ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/sel[0] ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/sel[1] ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/sel[8] ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/tmpCfgData ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/tmpCfgData0 ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_CE ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_HCMP ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_HCMP_CE ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_HCMP_Q ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_CE ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_Q ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/iCAP_WR_EN ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/iTRIGGER_IN ;
+ wire \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/iTRIGGER_OUT ;
+ wire \U0/I_NO_D.U_ILA/U_RST/HALT_pulse ;
+ wire \U0/I_NO_D.U_ILA/U_RST/POR ;
+ wire \U0/I_NO_D.U_ILA/U_RST/PRE_RESET0 ;
+ wire \U0/I_NO_D.U_ILA/U_RST/PRE_RESET1 ;
+ wire \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/din_latched ;
+ wire \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iCLR ;
+ wire \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT ;
+ wire \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT_dly[0] ;
+ wire \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT_dly[1] ;
+ wire \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT_dly[2] ;
+ wire \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT_dly[4] ;
+ wire \U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/din_latched ;
+ wire \U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iCLR ;
+ wire \U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDOUT ;
+ wire \U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDOUT_dly[0] ;
+ wire \U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDOUT_dly[2] ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/ACTRESET_pulse ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/ACT_dstat ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/ARM_dstat ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/CAP_RESET_dly1 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/DIRTY_D0 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/DIRTY_D1 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/DIRTY_SEL ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/DIRTY_dstat ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly1 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly2 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly3 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/DSTAT_load ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/EXTCAP_READY_dstat ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/FULL_dstat ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/NS_load ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/TDO_mux_in<0>1 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/TDO_next ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/TRIGGER_dstat ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_10_443 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_101_444 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_11_445 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_12_f5_446 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_13_447 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_14_448 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_3_449 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_4_450 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_7_f6_451 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_8_452 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_8_f5_453 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_9_454 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_91_455 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_9_f5_456 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DSL1/din_latched ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iCLR ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O15_463 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O2_464 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O26_465 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O36_466 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O82_467 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_10_f5_470 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_10_f6_471 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_11_472 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_11_f5_473 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_11_f51 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_12_475 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_121_476 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_122_477 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_12_f5_478 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_13_479 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_131_480 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_132_481 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_14_482 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_8_f7_483 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_9_f6_484 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE_n ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT<1>1_535 ;
+ wire \U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT<2>1_537 ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/I_NMU_EQ4.U_iDOUT/iCFG_DIN ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/iDOUT ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/iTRIGGER ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_TSEQ_NEQ2.U_TC_EQUATION/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/I_NMU_EQ4.U_iDOUT/iCFG_DIN ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_TSEQ_NEQ2.U_TC_EQUATION/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/iDOUT ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_TSEQ_NEQ2.U_TC_EQUATION/iTRIGGER ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TC/iCAPTURE ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/DOUT_tmp ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<0> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<1> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<2> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<3> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<4> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<5> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<6> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<7> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<0> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<1> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCfgData ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<0> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<1> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<2> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/dout_tmp ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/DOUT_tmp ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<0> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<1> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<2> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<3> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<4> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<5> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<6> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<7> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<0> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<1> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCfgData ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<0> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<1> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<2> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/dout_tmp ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/DOUT_tmp ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<0> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<1> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<2> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<3> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<4> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<5> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<6> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<7> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<0> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<1> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCfgData ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<0> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<1> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<2> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/dout_tmp ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/DOUT_tmp ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<0> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<1> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<2> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<3> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<3> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<4> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCfgData ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<0> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<2> ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/dout_tmp ;
+ wire \U0/I_NO_D.U_ILA/U_TRIG/trigCondOut ;
+ wire \U0/I_NO_D.U_ILA/iARM ;
+ wire \U0/I_NO_D.U_ILA/iCAPTURE ;
+ wire \U0/I_NO_D.U_ILA/iCAP_DONE ;
+ wire \U0/I_NO_D.U_ILA/iCAP_TRIGGER_OUT ;
+ wire \U0/I_NO_D.U_ILA/iCAP_WR_EN ;
+ wire \U0/I_NO_D.U_ILA/iDATA_DOUT ;
+ wire \U0/I_NO_D.U_ILA/iSTAT_DOUT ;
+ wire \U0/I_NO_D.U_ILA/iTRIGGER ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/I_NOLUT6.I_SRL_T2.I_YES_RPM.UF_cs_cfglut4_Q15_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLH_Q_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLH_Q_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLH_Q_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_STAT/U_DSR_O_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLL_Q15_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLL_Q15_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLL_Q15_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLL_Q15_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_CAP_B_O_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/I_NMU_EQ4.U_iDOUT/I_NOLUT6.I_SRL_T2.U_SRLC16E_Q15_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<31>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<30>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<29>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<28>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<27>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<26>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<25>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<24>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<23>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<22>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<21>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<20>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<19>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<18>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<17>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<16>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<15>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<14>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<13>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<12>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<11>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<10>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<9>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<8>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<7>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<6>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<5>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<4>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<3>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<2>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<1>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<0>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOPB<3>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOPB<2>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOPB<1>_UNCONNECTED ;
+ wire \NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOPB<0>_UNCONNECTED ;
+ wire [27 : 0] \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp ;
+ wire [13 : 1] \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI ;
+ wire [13 : 0] \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D ;
+ wire [13 : 0] \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S ;
+ wire [13 : 0] \U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR ;
+ wire [3 : 1] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iCFG_DATA ;
+ wire [3 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iO ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/jO ;
+ wire [3 : 1] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iCFG_DATA ;
+ wire [3 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iO ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/jO ;
+ wire [7 : 1] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA ;
+ wire [7 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO ;
+ wire [3 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/jO ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/kO ;
+ wire [7 : 1] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA ;
+ wire [7 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO ;
+ wire [3 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/jO ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/kO ;
+ wire [1 : 1] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/iCFG_DATA ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/iO ;
+ wire [3 : 1] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iCFG_DATA ;
+ wire [3 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iO ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/jO ;
+ wire [1 : 1] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/iCFG_DATA ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/iO ;
+ wire [1 : 1] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/iCFG_DATA ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/iO ;
+ wire [8 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next ;
+ wire [8 : 1] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI ;
+ wire [8 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D ;
+ wire [8 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S ;
+ wire [8 : 1] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI ;
+ wire [8 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D ;
+ wire [8 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S ;
+ wire [1 : 1] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/cfg_data ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/tmpCompData ;
+ wire [1 : 1] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/cfg_data ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/tmpCompData ;
+ wire [1 : 1] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/cfg_data ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/tmpCompData ;
+ wire [4 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data ;
+ wire [16 : 1] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec ;
+ wire [8 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR ;
+ wire [8 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT ;
+ wire [9 : 0] \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDIN ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDIN ;
+ wire [0 : 0] \U0/I_NO_D.U_ILA/U_RST/iRESET ;
+ wire [8 : 0] \U0/I_NO_D.U_ILA/U_STAT/NS_dstat ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_STAT/STATE_dstat ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iDIN ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iDOUT_dly ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/U_STAT/U_RESET_EDGE/iDOUT ;
+ wire [9 : 1] \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI ;
+ wire [9 : 0] \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D ;
+ wire [9 : 0] \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S ;
+ wire [16 : 0] \U0/I_NO_D.U_ILA/U_STAT/iSTAT ;
+ wire [9 : 0] \U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT ;
+ wire [1 : 1] \U0/I_NO_D.U_ILA/U_TRIG/U_TC/iCFG_DATA ;
+ wire [3 : 0] \U0/I_NO_D.U_ILA/U_TRIG/trigCondIn ;
+ wire [8 : 0] \U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES ;
+ wire [1 : 0] \U0/I_NO_D.U_ILA/iCAP_STATE ;
+ wire [8 : 0] \U0/I_NO_D.U_ILA/iCAP_WR_ADDR ;
+ wire [27 : 0] \U0/I_NO_D.U_ILA/iDATA ;
+ wire [7 : 0] \U0/I_NO_D.U_ILA/iRESET ;
+ wire [8 : 0] \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy ;
+ wire [8 : 0] \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut ;
+ wire [27 : 0] \U0/iTRIG_IN ;
+ GND XST_GND (
+ .G(N0)
+ );
+ VCC XST_VCC (
+ .P(N1)
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_WCNT_HCMP_Q (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_HCMP_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_HCMP ),
+ .R(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/CMP_RESET ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_HCMP_Q )
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_WCNT_LCMP_Q (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP ),
+ .R(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/CMP_RESET ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_Q )
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_SCNT_CMP_Q (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP ),
+ .R(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/CMP_RESET ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_Q )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_INTCAP_F.U_CAPWE0 (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CE ),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/iCAP_WR_EN )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_INTCAP_F.U_CAPWE1 (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/iCAP_WR_EN ),
+ .R(\U0/I_NO_D.U_ILA/iRESET [7]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_WR_EN )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_TRIG0 (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/iTRIGGER_IN ),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/iTRIGGER_OUT )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_TRIG1 (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/iTRIGGER_OUT ),
+ .R(\U0/I_NO_D.U_ILA/iRESET [7]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_TRIGGER_OUT )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_YES_OREG.OUT_REG (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iOUT ),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_STATE [0])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_YES_OREG.OUT_REG (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iOUT ),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_STATE [1])
+ );
+ LUT3 #(
+ .INIT ( 8'h20 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_TRIG (
+ .I0(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .I1(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .I2(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/iTRIGGER_IN )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCE/I_NOLUT6.I_SRL_T2.U_SRLC16E (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCE/iCFG_DIN ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CE ),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [5])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCE/I_NOLUT6.I_SRL_T2.U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [4]),
+ .I1(CONTROL[9]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCE/iCFG_DIN )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WCE/I_NOLUT6.I_SRL_T2.U_SRLC16E (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WCE/iCFG_DIN ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_CE ),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [4])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WCE/I_NOLUT6.I_SRL_T2.U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [3]),
+ .I1(CONTROL[9]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WCE/iCFG_DIN )
+ );
+ LUT3 #(
+ .INIT ( 8'hCA ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_YES_OREG.U_MUXF7 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/kO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/kO [0]),
+ .I2(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_HCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iOUT )
+ );
+ MUXF6 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.U0_MUXF6 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/jO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/jO [0]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/kO [0])
+ );
+ MUXF6 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.U1_MUXF6 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/jO [3]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/jO [2]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/kO [1])
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.U0_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [0]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/jO [0])
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.U1_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [3]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [2]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/jO [1])
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.U2_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [5]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [4]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/jO [2])
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.U3_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [7]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [6]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/jO [3])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UF0_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [0]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [2])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UG0_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA [2]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [1]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UF1_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA [3]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [2]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA [2])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UG1_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA [4]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [3]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA [3])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UF2_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA [5]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [4]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA [4])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UG2_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA [6]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [5]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA [5])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UF3_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA [7]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [6]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA [6])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UG3_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DIN ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iO [7]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DATA [7])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/I_NOLUT6.I_SRL_T2.U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [1]),
+ .I1(CONTROL[9]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS0/iCFG_DIN )
+ );
+ LUT3 #(
+ .INIT ( 8'hCA ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_YES_OREG.U_MUXF7 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/kO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/kO [0]),
+ .I2(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_HCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iOUT )
+ );
+ MUXF6 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.U0_MUXF6 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/jO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/jO [0]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/kO [0])
+ );
+ MUXF6 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.U1_MUXF6 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/jO [3]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/jO [2]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/kO [1])
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.U0_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [0]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/jO [0])
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.U1_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [3]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [2]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/jO [1])
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.U2_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [5]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [4]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/jO [2])
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.U3_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [7]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [6]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/jO [3])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UF0_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [0]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UG0_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA [2]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [1]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UF1_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA [3]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [2]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA [2])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UG1_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA [4]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [3]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA [3])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UF2_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA [5]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [4]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA [4])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UG2_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA [6]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [5]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA [5])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UF3_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA [7]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [6]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA [6])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_S3.UG3_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DIN ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iO [7]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DATA [7])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/I_NOLUT6.I_SRL_T2.U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [0]),
+ .I1(CONTROL[9]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_NS1/iCFG_DIN )
+ );
+ MUXF6 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_NO_OREG.U_MUXF6 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/jO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/jO [0]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/CMP_RESET )
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/I_NOLUT6.I_SRL_T2.I_YES_RPM.U0_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iO [0]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/jO [0])
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/I_NOLUT6.I_SRL_T2.I_YES_RPM.U1_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iO [3]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iO [2]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/jO [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/I_NOLUT6.I_SRL_T2.I_YES_RPM.UF0_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iCFG_DATA [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iO [0]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [6])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/I_NOLUT6.I_SRL_T2.I_YES_RPM.UG0_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iCFG_DATA [2]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iO [1]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iCFG_DATA [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/I_NOLUT6.I_SRL_T2.I_YES_RPM.UF1_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iCFG_DATA [3]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iO [2]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iCFG_DATA [2])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/I_NOLUT6.I_SRL_T2.I_YES_RPM.UG1_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iCFG_DIN ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iO [3]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iCFG_DATA [3])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/I_NOLUT6.I_SRL_T2.U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [5]),
+ .I1(CONTROL[9]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CMPRESET/iCFG_DIN )
+ );
+ MUXF6 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_NO_OREG.U_MUXF6 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/jO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/jO [0]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_RESET )
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/I_NOLUT6.I_SRL_T2.I_YES_RPM.U0_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iO [0]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/jO [0])
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/I_NOLUT6.I_SRL_T2.I_YES_RPM.U1_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iO [3]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iO [2]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/jO [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/I_NOLUT6.I_SRL_T2.I_YES_RPM.UF0_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iCFG_DATA [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iO [0]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [3])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/I_NOLUT6.I_SRL_T2.I_YES_RPM.UG0_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iCFG_DATA [2]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iO [1]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iCFG_DATA [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/I_NOLUT6.I_SRL_T2.I_YES_RPM.UF1_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iCFG_DATA [3]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iO [2]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iCFG_DATA [2])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/I_NOLUT6.I_SRL_T2.I_YES_RPM.UG1_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iCFG_DIN ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iO [3]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iCFG_DATA [3])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/I_NOLUT6.I_SRL_T2.U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [2]),
+ .I1(CONTROL[9]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCRST/iCFG_DIN )
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_NO_OREG.U_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/iO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/iO [0]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_HCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_HCMP_CE )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/I_NOLUT6.I_SRL_T2.I_YES_RPM.UF_cs_cfglut4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/iCFG_DATA [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/iO [0]),
+ .Q15(\NLW_U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/I_NOLUT6.I_SRL_T2.I_YES_RPM.UF_cs_cfglut4_Q15_UNCONNECTED )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/I_NOLUT6.I_SRL_T2.I_YES_RPM.UG_cs_cfglut4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/iCFG_DIN ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/iO [1]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/iCFG_DATA [1])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/I_NOLUT6.I_SRL_T2.U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [9]),
+ .I1(CONTROL[9]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WHCMPCE/iCFG_DIN )
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_NO_OREG.U_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/iO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/iO [0]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_CE )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/I_NOLUT6.I_SRL_T2.I_YES_RPM.UF_cs_cfglut4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/iCFG_DATA [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/iO [0]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [9])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/I_NOLUT6.I_SRL_T2.I_YES_RPM.UG_cs_cfglut4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/iCFG_DIN ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/iO [1]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/iCFG_DATA [1])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/I_NOLUT6.I_SRL_T2.U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [8]),
+ .I1(CONTROL[9]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_WLCMPCE/iCFG_DIN )
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_NO_OREG.U_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/iO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/iO [0]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP_CE )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/I_NOLUT6.I_SRL_T2.I_YES_RPM.UF_cs_cfglut4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/iCFG_DATA [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/iO [0]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [8])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/I_NOLUT6.I_SRL_T2.I_YES_RPM.UG_cs_cfglut4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/iCFG_DIN ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/iO [1]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/iCFG_DATA [1])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/I_NOLUT6.I_SRL_T2.U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [7]),
+ .I1(CONTROL[9]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_SCMPCE/iCFG_DIN )
+ );
+ LUT3 #(
+ .INIT ( 8'hCA ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_YES_OREG.U_MUXF6 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/jO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/jO [0]),
+ .I2(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_HCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iOUT )
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/I_NOLUT6.I_SRL_T2.I_YES_RPM.U0_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iO [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iO [0]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/jO [0])
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/I_NOLUT6.I_SRL_T2.I_YES_RPM.U1_MUXF5 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iO [3]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iO [2]),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP_Q ),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/jO [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/I_NOLUT6.I_SRL_T2.I_YES_RPM.UF0_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iCFG_DATA [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iO [0]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [7])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/I_NOLUT6.I_SRL_T2.I_YES_RPM.UG0_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iCFG_DATA [2]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iO [1]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iCFG_DATA [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/I_NOLUT6.I_SRL_T2.I_YES_RPM.UF1_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iCFG_DATA [3]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iO [2]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iCFG_DATA [2])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/I_NOLUT6.I_SRL_T2.I_YES_RPM.UG1_CFGLUT4 (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .A2(\U0/I_NO_D.U_ILA/iTRIGGER ),
+ .A3(\U0/I_NO_D.U_ILA/iCAPTURE ),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iCFG_DIN ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iO [3]),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iCFG_DATA [3])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/I_NOLUT6.I_SRL_T2.U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [6]),
+ .I1(CONTROL[9]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iCFG_DIN )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/I_NOLUT6.I_SRL_T2.I_YES_RPM.I_YES_OREG.OUT_REG (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/I_SRLT_NE_1.U_CDONE/iOUT ),
+ .R(N0),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_DONE )
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[8].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [8]),
+ .R(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_RESET ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [8])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[7].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [7]),
+ .R(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_RESET ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [7])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[6].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [6]),
+ .R(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_RESET ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [6])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[5].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [5]),
+ .R(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_RESET ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [5])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[4].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [4]),
+ .R(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_RESET ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [4])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[3].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [3]),
+ .R(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_RESET ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [3])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[2].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [2]),
+ .R(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_RESET ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [2])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[1].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [1]),
+ .R(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_RESET ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [1])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[0].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [0]),
+ .R(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_RESET ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [0])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[8].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [8]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [8])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[8].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [8]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [8]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [8])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[7].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [7]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [7])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[7].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [7]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [7]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [8])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[7].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [7]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [7]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [7])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[6].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [6]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [6])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[6].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [6]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [6]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [7])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[6].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [6]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [6]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [6])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[5].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [5]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [5])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[5].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [5]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [5]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [6])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[5].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [5]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [5]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [5])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[4].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [4]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [4])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[4].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [4]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [4]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [5])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[4].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [4]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [4]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [4])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[3].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [3])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[3].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [3]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [3]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [4])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[3].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [3]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [3]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [3])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[2].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [2]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [2])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[2].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [2]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [2]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [3])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[2].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [2]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [2]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [2])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[1].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [1]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [1])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[1].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [1]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [1]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [2])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[1].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [1]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [1]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [1])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[0].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [0]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [0])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[0].GnH.U_MUXCY (
+ .CI(N1),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [0]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/CI [1])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/G[0].U_XORCY (
+ .CI(N1),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/S [0]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_NO_TSEQ.I_SRLT_NE_1.U_SCNT/D [0])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[8].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [8]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [8])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[7].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [7]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [7])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[6].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [6]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [6])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[5].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [5]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [5])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[4].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [4]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [4])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[3].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [3]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [3])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[2].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [2]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [2])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[1].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [1]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [1])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[0].U_FDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_CE ),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [0]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [0])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[8].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [8]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [8])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[8].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [8]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [8]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [8])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[7].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [7]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [7])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[7].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [7]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [7]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [8])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[7].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [7]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [7]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [7])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[6].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [6]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [6])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[6].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [6]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [6]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [7])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[6].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [6]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [6]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [6])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[5].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [5]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [5])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[5].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [5]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [5]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [6])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[5].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [5]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [5]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [5])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[4].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [4]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [4])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[4].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [4]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [4]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [5])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[4].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [4]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [4]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [4])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[3].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [3]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [3])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[3].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [3]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [3]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [4])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[3].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [3]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [3]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [3])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[2].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [2]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [2])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[2].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [2]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [2]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [3])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[2].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [2]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [2]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [2])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[1].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [1]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [1])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[1].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [1]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [1]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [2])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[1].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [1]),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [1]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [1])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[0].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [0]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [0])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[0].GnH.U_MUXCY (
+ .CI(N1),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [0]),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/CI [1])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/G[0].U_XORCY (
+ .CI(N1),
+ .LI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/S [0]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_SRLT_NE_1.U_WCNT/D [0])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.U_MUXL (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/tmpCompData [1]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/sel[8] ),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/SCNT_CMP )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLL (
+ .A0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [8]),
+ .A1(N1),
+ .A2(N1),
+ .A3(N1),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/tmpCfgData0 ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/sel[8] ),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/cfg_data [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLH (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N1),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data [0]),
+ .Q(\NLW_U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLH_Q_UNCONNECTED ),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/tmpCfgData0 )
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.U_MUXL (
+ .CI(N1),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/sel[0] ),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/tmpCompData [0])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.U_MUXH (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/tmpCompData [0]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/sel[1] ),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/tmpCompData [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLL (
+ .A0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [0]),
+ .A1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [1]),
+ .A2(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [2]),
+ .A3(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [3]),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/tmpCfgData ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/sel[0] ),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLH (
+ .A0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [4]),
+ .A1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [5]),
+ .A2(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [6]),
+ .A3(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [7]),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/cfg_data [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/sel[1] ),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_SCNT_CMP/I_SRL16.U_GAND_SRL16/tmpCfgData )
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.U_MUXL (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/tmpCompData [1]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/sel[8] ),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_HCMP )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLL (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [8]),
+ .A1(N1),
+ .A2(N1),
+ .A3(N1),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/tmpCfgData0 ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/sel[8] ),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/cfg_data [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLH (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N1),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data [2]),
+ .Q(\NLW_U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLH_Q_UNCONNECTED )
+,
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/tmpCfgData0 )
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.U_MUXL (
+ .CI(N1),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/sel[0] ),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/tmpCompData [0])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.U_MUXH (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/tmpCompData [0]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/sel[1] ),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/tmpCompData [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLL (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [1]),
+ .A2(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [2]),
+ .A3(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [3]),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/tmpCfgData ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/sel[0] ),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data [3])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLH (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [4]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [5]),
+ .A2(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [6]),
+ .A3(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [7]),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/cfg_data [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/sel[1] ),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_HCMP/I_SRL16.U_GAND_SRL16/tmpCfgData )
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.U_MUXL (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/tmpCompData [1]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/sel[8] ),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/WCNT_LCMP )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLL (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [8]),
+ .A1(N1),
+ .A2(N1),
+ .A3(N1),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/tmpCfgData0 ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/sel[8] ),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/cfg_data [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLH (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N1),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data [4]),
+ .Q(\NLW_U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLH_Q_UNCONNECTED )
+,
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/tmpCfgData0 )
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.U_MUXL (
+ .CI(N1),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/sel[0] ),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/tmpCompData [0])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.U_MUXH (
+ .CI(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/tmpCompData [0]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/sel[1] ),
+ .LO(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/tmpCompData [1])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLL (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [0]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [1]),
+ .A2(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [2]),
+ .A3(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [3]),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/tmpCfgData ),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/sel[0] ),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/cfg_data [0])
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLH (
+ .A0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [4]),
+ .A1(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [5]),
+ .A2(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [6]),
+ .A3(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [7]),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/cfg_data [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/sel[1] ),
+ .Q15(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_WCNT_LCMP/I_SRL16.U_GAND_SRL16/tmpCfgData )
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_BRK1 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data [3]),
+ .I1(CONTROL[9]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data [4])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/U_BRK0 (
+ .I0(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data [1]),
+ .I1(CONTROL[9]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data [2])
+ );
+ LUT3 #(
+ .INIT ( 8'hCA ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[8].U_CAP_ADDR_MUX (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [8]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [8]),
+ .I2(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [9]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [8])
+ );
+ LUT3 #(
+ .INIT ( 8'hCA ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[7].U_CAP_ADDR_MUX (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [7]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [7]),
+ .I2(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [8]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [7])
+ );
+ LUT3 #(
+ .INIT ( 8'hCA ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[6].U_CAP_ADDR_MUX (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [6]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [6]),
+ .I2(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [7]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [6])
+ );
+ LUT3 #(
+ .INIT ( 8'hCA ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[5].U_CAP_ADDR_MUX (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [5]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [5]),
+ .I2(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [6]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [5])
+ );
+ LUT3 #(
+ .INIT ( 8'hCA ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[4].U_CAP_ADDR_MUX (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [4]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [4]),
+ .I2(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [5]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [4])
+ );
+ LUT3 #(
+ .INIT ( 8'hCA ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[3].U_CAP_ADDR_MUX (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [3]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [3]),
+ .I2(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [4]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [3])
+ );
+ LUT3 #(
+ .INIT ( 8'hCA ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[2].U_CAP_ADDR_MUX (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [2]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [2]),
+ .I2(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [3]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [2])
+ );
+ LUT3 #(
+ .INIT ( 8'hCA ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[1].U_CAP_ADDR_MUX (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [2]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [1])
+ );
+ LUT3 #(
+ .INIT ( 8'hCA ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[0].U_CAP_ADDR_MUX (
+ .I0(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iSCNT [0]),
+ .I2(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [1]),
+ .O(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [0])
+ );
+ SRL16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.I_SRL.U_SELX (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N1),
+ .CE(CONTROL[9]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [16]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data [0])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[8].U_CAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [8]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_WR_ADDR [8])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[8].U_iCAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [8]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [8])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[7].U_CAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [7]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_WR_ADDR [7])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[7].U_iCAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [7]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [7])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[6].U_CAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [6]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_WR_ADDR [6])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[6].U_iCAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [6]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [6])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[5].U_CAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [5]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_WR_ADDR [5])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[5].U_iCAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [5]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [5])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[4].U_CAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [4]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_WR_ADDR [4])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[4].U_iCAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [4]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [4])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[3].U_CAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [3]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_WR_ADDR [3])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[3].U_iCAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [3]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [3])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[2].U_CAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [2]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_WR_ADDR [2])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[2].U_iCAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [2]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [2])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[1].U_CAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [1]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_WR_ADDR [1])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[1].U_iCAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [1]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [1])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[0].U_CAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [0]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/iCAP_WR_ADDR [0])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_INTCAP.F_CAP_ADDR[0].U_iCAP_ADDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/CAP_ADDR_next [0]),
+ .R(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/iCAP_ADDR [0])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[15].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [15]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [16])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[14].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [14]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [15])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[13].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [13]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [14])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[12].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [12]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [13])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[11].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [11]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [12])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[10].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [10]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [11])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[9].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [9]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [10])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[8].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [8]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [9])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[7].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [7]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [8])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[6].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [6]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [7])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[5].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [5]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [6])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[4].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [4]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [5])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[3].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [3]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [4])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[2].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [2]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [3])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[1].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [2])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/I_0_TO_64K.F_SEL[0].U_SEL (
+ .C(CONTROL[0]),
+ .CE(CONTROL[9]),
+ .D(CONTROL[1]),
+ .Q(\U0/I_NO_D.U_ILA/U_G2_SQ.U_CAPCTRL/U_CAP_ADDRGEN/cfg_data_vec [1])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DSL2 (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly1 ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly2 )
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DSL3 (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly2 ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly3 )
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_CR (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/iRESET [0]),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/CAP_RESET_dly1 )
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/G_NS[8].U_NSQ (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_STAT/NS_load ),
+ .D(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [8]),
+ .R(\U0/I_NO_D.U_ILA/iARM ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [8])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/G_NS[7].U_NSQ (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_STAT/NS_load ),
+ .D(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [7]),
+ .R(\U0/I_NO_D.U_ILA/iARM ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [7])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/G_NS[6].U_NSQ (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_STAT/NS_load ),
+ .D(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [6]),
+ .R(\U0/I_NO_D.U_ILA/iARM ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [6])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/G_NS[5].U_NSQ (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_STAT/NS_load ),
+ .D(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [5]),
+ .R(\U0/I_NO_D.U_ILA/iARM ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [5])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/G_NS[4].U_NSQ (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_STAT/NS_load ),
+ .D(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [4]),
+ .R(\U0/I_NO_D.U_ILA/iARM ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [4])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/G_NS[3].U_NSQ (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_STAT/NS_load ),
+ .D(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [3]),
+ .R(\U0/I_NO_D.U_ILA/iARM ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [3])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/G_NS[2].U_NSQ (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_STAT/NS_load ),
+ .D(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [2]),
+ .R(\U0/I_NO_D.U_ILA/iARM ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [2])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/G_NS[1].U_NSQ (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_STAT/NS_load ),
+ .D(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [1]),
+ .R(\U0/I_NO_D.U_ILA/iARM ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [1])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/G_NS[0].U_NSQ (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_STAT/NS_load ),
+ .D(\U0/I_NO_D.U_ILA/iCAP_NUM_SAMPLES [0]),
+ .R(\U0/I_NO_D.U_ILA/iARM ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [0])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STATE1 (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_load ),
+ .D(\U0/I_NO_D.U_ILA/iCAP_STATE [1]),
+ .R(\U0/I_NO_D.U_ILA/iARM ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/STATE_dstat [1])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STATE0 (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_load ),
+ .D(\U0/I_NO_D.U_ILA/iCAP_STATE [0]),
+ .R(\U0/I_NO_D.U_ILA/iARM ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/STATE_dstat [0])
+ );
+ FDRS #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_ARM (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/ARM_dstat ),
+ .R(\U0/I_NO_D.U_ILA/iRESET [0]),
+ .S(\U0/I_NO_D.U_ILA/iARM ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/ARM_dstat )
+ );
+ FDRS #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_TRIGGER (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/TRIGGER_dstat ),
+ .R(\U0/I_NO_D.U_ILA/iRESET [0]),
+ .S(\U0/I_NO_D.U_ILA/iCAP_TRIGGER_OUT ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/TRIGGER_dstat )
+ );
+ FDRS #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_FULL (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/FULL_dstat ),
+ .R(\U0/I_NO_D.U_ILA/iARM ),
+ .S(\U0/I_NO_D.U_ILA/iCAP_DONE ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/FULL_dstat )
+ );
+ FDRS #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_ECR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/EXTCAP_READY_dstat ),
+ .R(\U0/I_NO_D.U_ILA/iARM ),
+ .S(N1),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/EXTCAP_READY_dstat )
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DIRTY_FDCE (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .CLR(\U0/I_NO_D.U_ILA/iARM ),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/DIRTY_dstat ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/DIRTY_D0 )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DIRTY_FDPE (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/DIRTY_dstat ),
+ .PRE(CONTROL[13]),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/DIRTY_D1 )
+ );
+ LDC #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DIRTY_LDC (
+ .CLR(\U0/I_NO_D.U_ILA/iARM ),
+ .D(N1),
+ .G(CONTROL[13]),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/DIRTY_SEL )
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_RISING (
+ .C(CLK),
+ .CE(N1),
+ .CLR(\U0/I_NO_D.U_ILA/U_STAT/ACTRESET_pulse ),
+ .D(N1),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/ACT_dstat )
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_TDO (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/TDO_next ),
+ .Q(\U0/I_NO_D.U_ILA/iSTAT_DOUT )
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DSL1/U_GEN_DELAY[1].U_FD (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iDOUT_dly [0]),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iDOUT_dly [1])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DSL1/U_RFDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly1 ),
+ .CLR(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iCLR ),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly1 ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iDOUT_dly [0])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DSL1/U_DOUT (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iDIN [0]),
+ .R(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iDIN [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly1 )
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DSL1/U_DOUT1 (
+ .C(CLK),
+ .CE(N1),
+ .CLR(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iCLR ),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iDIN [0]),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iDIN [1])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DSL1/U_DOUT0 (
+ .C(CLK),
+ .CE(N1),
+ .CLR(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iCLR ),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/din_latched ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iDIN [0])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DSL1/U_TFDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[5]),
+ .CLR(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iCLR ),
+ .D(CONTROL[5]),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/din_latched )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_RESET_EDGE/I_H2L.U_DOUT (
+ .C(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_RESET_EDGE/iDOUT [1]),
+ .R(\U0/I_NO_D.U_ILA/U_STAT/U_RESET_EDGE/iDOUT [0]),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/ACTRESET_pulse )
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_RESET_EDGE/U_DOUT1 (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_RESET_EDGE/iDOUT [0]),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/U_RESET_EDGE/iDOUT [1])
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_RESET_EDGE/U_DOUT0 (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .D(CONTROL[5]),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/U_RESET_EDGE/iDOUT [0])
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_2_f5 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_4_450 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_3_449 ),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [5]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/TDO_mux_in<0>1 )
+ );
+ LUT4 #(
+ .INIT ( 16'h5140 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_4 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [4]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_91_455 ),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_8_452 ),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_4_450 )
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_8 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT<1>1_535 ),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_12_f5_446 ),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_8_452 )
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_12_f5 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_14_448 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_13_447 ),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_12_f5_446 )
+ );
+ LUT2 #(
+ .INIT ( 4'hD ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_14 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/FULL_dstat ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_14_448 )
+ );
+ LUT3 #(
+ .INIT ( 8'h53 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_13 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/STATE_dstat [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/STATE_dstat [0]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_13_447 )
+ );
+ LUT4 #(
+ .INIT ( 16'hFBEA ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_3 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [4]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT<2>1_537 ),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_7_f6_451 ),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_3_449 )
+ );
+ MUXF6 \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_7_f6 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_9_f5_456 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_8_f5_453 ),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_7_f6_451 )
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_9_f5 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_11_445 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_101_444 ),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_9_f5_456 )
+ );
+ LUT3 #(
+ .INIT ( 8'h53 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_11 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [1]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [0]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_11_445 )
+ );
+ LUT3 #(
+ .INIT ( 8'h53 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_101 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [3]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [2]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_101_444 )
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_8_f5 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_10_443 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_9_454 ),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_8_f5_453 )
+ );
+ LUT3 #(
+ .INIT ( 8'h53 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_10 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [5]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [4]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_10_443 )
+ );
+ LUT3 #(
+ .INIT ( 8'h53 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_9 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [7]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [6]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_9_454 )
+ );
+ MUXF7 \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_8_f7 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_10_f6_471 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_9_f6_484 ),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [7]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_8_f7_483 )
+ );
+ MUXF6 \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_10_f6 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_12_f5_478 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_11_f51 ),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [6]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_10_f6_471 )
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_12_f5 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_14_482 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_132_481 ),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [5]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_12_f5_478 )
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_14 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [4]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [0]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [1]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_14_482 )
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_132 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [4]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [2]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_132_481 )
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_11_f5_0 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_131_480 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_122_477 ),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [5]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_11_f51 )
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_131 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [4]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [4]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [5]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_131_480 )
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_122 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [4]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [6]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [7]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_122_477 )
+ );
+ MUXF6 \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_9_f6 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_11_f5_473 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_10_f5_470 ),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [6]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_9_f6_484 )
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_11_f5 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_13_479 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_121_476 ),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [5]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_11_f5_473 )
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_13 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [4]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [8]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [9]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_13_479 )
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_121 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [4]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [10]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [11]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_121_476 )
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_10_f5 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_12_475 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_11_472 ),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [5]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_10_f5_470 )
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_12 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [4]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [12]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [13]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_12_475 )
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_11 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [4]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [14]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [15]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_11_472 )
+ );
+ LUT2 #(
+ .INIT ( 4'hE ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STATCMD (
+ .I0(CONTROL[4]),
+ .I1(CONTROL[5]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE )
+ );
+ INV \U0/I_NO_D.U_ILA/U_STAT/U_STATCMD_n (
+ .I(\U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE ),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE_n )
+ );
+ LUT2 #(
+ .INIT ( 4'h4 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DSL (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly3 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly2 ),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_load )
+ );
+ LUT2 #(
+ .INIT ( 4'h2 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DSR (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly3 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly2 ),
+ .O(\NLW_U0/I_NO_D.U_ILA/U_STAT/U_DSR_O_UNCONNECTED )
+ );
+ LUT4 #(
+ .INIT ( 16'h0F22 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_NSL (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly3 ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/DSTAT_en_dly2 ),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/CAP_RESET_dly1 ),
+ .I3(\U0/I_NO_D.U_ILA/iRESET [0]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/NS_load )
+ );
+ LUT4 #(
+ .INIT ( 16'h0030 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[16].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [16])
+ );
+ LUT4 #(
+ .INIT ( 16'h1030 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[15].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [15])
+ );
+ LUT4 #(
+ .INIT ( 16'h0070 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[14].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [14])
+ );
+ LUT4 #(
+ .INIT ( 16'h1020 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[13].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [13])
+ );
+ LUT4 #(
+ .INIT ( 16'h0070 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[12].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [12])
+ );
+ LUT4 #(
+ .INIT ( 16'h1010 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[11].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [11])
+ );
+ LUT4 #(
+ .INIT ( 16'h0070 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[10].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [10])
+ );
+ LUT4 #(
+ .INIT ( 16'h100F ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[9].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [9])
+ );
+ LUT4 #(
+ .INIT ( 16'hFFF0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[8].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [8])
+ );
+ LUT4 #(
+ .INIT ( 16'h0004 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[7].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [7])
+ );
+ LUT4 #(
+ .INIT ( 16'h3000 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[6].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [6])
+ );
+ LUT4 #(
+ .INIT ( 16'h001F ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[5].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [5])
+ );
+ LUT4 #(
+ .INIT ( 16'hF001 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[4].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [4])
+ );
+ LUT4 #(
+ .INIT ( 16'hB610 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[3].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [3])
+ );
+ LUT4 #(
+ .INIT ( 16'h2100 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[2].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [2])
+ );
+ LUT4 #(
+ .INIT ( 16'hC102 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[1].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [1])
+ );
+ LUT4 #(
+ .INIT ( 16'h0101 ))
+ \U0/I_NO_D.U_ILA/U_STAT/F_SSTAT[0].I_STAT.U_STAT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [0])
+ );
+ LUT2 #(
+ .INIT ( 4'h2 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DSL1/U_CLEAR (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iDOUT_dly [1]),
+ .I1(CONTROL[5]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DSL1/iCLR )
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[0].U_XORCY (
+ .CI(N1),
+ .LI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [0]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [0])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[0].GnH.U_MUXCY (
+ .CI(N1),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [0]),
+ .LO(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [1])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[0].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [0])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[1].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [1]),
+ .LI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [1]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [1])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[1].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [1]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [1]),
+ .LO(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [2])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[1].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [1])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[2].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [2]),
+ .LI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [2]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [2])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[2].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [2]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [2]),
+ .LO(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [3])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[2].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [2])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[3].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [3]),
+ .LI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [3])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[3].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [3]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [3]),
+ .LO(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [4])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[3].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [3])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[4].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [4]),
+ .LI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [4]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [4])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[4].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [4]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [4]),
+ .LO(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [5])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[4].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [4]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [4])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[5].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [5]),
+ .LI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [5]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [5])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[5].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [5]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [5]),
+ .LO(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [6])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[5].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [5]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [5])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[6].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [6]),
+ .LI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [6]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [6])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[6].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [6]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [6]),
+ .LO(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [7])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[6].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [6]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [6])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[7].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [7]),
+ .LI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [7]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [7])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[7].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [7]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [7]),
+ .LO(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [8])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[7].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [7]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [7])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[8].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [8]),
+ .LI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [8]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [8])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[8].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [8]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [8]),
+ .LO(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [9])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[8].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [8]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [8])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[9].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/CI [9]),
+ .LI(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [9]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [9])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[9].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [9]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/S [9])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[0].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [0]),
+ .R(\U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[1].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [1]),
+ .R(\U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[2].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [2]),
+ .R(\U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[3].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [3]),
+ .R(\U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [3])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[4].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [4]),
+ .R(\U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [4])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[5].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [5]),
+ .R(\U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [5])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[6].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [6]),
+ .R(\U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [6])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[7].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [7]),
+ .R(\U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [7])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[8].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [8]),
+ .R(\U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [8])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/G[9].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_STAT/U_STAT_CNT/D [9]),
+ .R(\U0/I_NO_D.U_ILA/U_STAT/iSTATCMD_CE_n ),
+ .Q(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [9])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_POR (
+ .C(CLK),
+ .D(N0),
+ .PRE(N0),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/POR )
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_RST/G_RST[0].U_RST (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_RST/iRESET [0]),
+ .S(\U0/I_NO_D.U_ILA/U_RST/PRE_RESET0 ),
+ .Q(\U0/I_NO_D.U_ILA/iRESET [0])
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_RST/G_RST[1].U_RST (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/iRESET [0]),
+ .S(\U0/I_NO_D.U_ILA/U_RST/PRE_RESET0 ),
+ .Q(\U0/I_NO_D.U_ILA/iRESET [1])
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_RST/G_RST[2].U_RST (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/iRESET [1]),
+ .S(\U0/I_NO_D.U_ILA/U_RST/PRE_RESET0 ),
+ .Q(\U0/I_NO_D.U_ILA/iRESET [2])
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_RST/G_RST[3].U_RST (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/iRESET [2]),
+ .S(\U0/I_NO_D.U_ILA/U_RST/PRE_RESET0 ),
+ .Q(\U0/I_NO_D.U_ILA/iRESET [3])
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_RST/G_RST[4].U_RST (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/iRESET [3]),
+ .S(\U0/I_NO_D.U_ILA/U_RST/PRE_RESET0 ),
+ .Q(\U0/I_NO_D.U_ILA/iRESET [4])
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_RST/G_RST[5].U_RST (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/iRESET [4]),
+ .S(\U0/I_NO_D.U_ILA/U_RST/PRE_RESET0 ),
+ .Q(\U0/I_NO_D.U_ILA/iRESET [5])
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_RST/G_RST[6].U_RST (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/iRESET [5]),
+ .S(\U0/I_NO_D.U_ILA/U_RST/PRE_RESET0 ),
+ .Q(\U0/I_NO_D.U_ILA/iRESET [6])
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_RST/G_RST[7].U_RST (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/iRESET [6]),
+ .S(\U0/I_NO_D.U_ILA/U_RST/PRE_RESET0 ),
+ .Q(\U0/I_NO_D.U_ILA/iRESET [7])
+ );
+ LUT3 #(
+ .INIT ( 8'hEF ))
+ \U0/I_NO_D.U_ILA/U_RST/U_PRST1 (
+ .I0(\U0/I_NO_D.U_ILA/U_RST/HALT_pulse ),
+ .I1(\U0/I_NO_D.U_ILA/U_RST/POR ),
+ .I2(N1),
+ .O(\U0/I_NO_D.U_ILA/U_RST/PRE_RESET1 )
+ );
+ LUT4 #(
+ .INIT ( 16'hFFFE ))
+ \U0/I_NO_D.U_ILA/U_RST/U_PRST0 (
+ .I0(N0),
+ .I1(\U0/I_NO_D.U_ILA/iCAP_DONE ),
+ .I2(N0),
+ .I3(\U0/I_NO_D.U_ILA/U_RST/PRE_RESET1 ),
+ .O(\U0/I_NO_D.U_ILA/U_RST/PRE_RESET0 )
+ );
+ LUT2 #(
+ .INIT ( 4'h4 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_RST0 (
+ .I0(\U0/I_NO_D.U_ILA/iARM ),
+ .I1(\U0/I_NO_D.U_ILA/iRESET [0]),
+ .O(\U0/I_NO_D.U_ILA/U_RST/iRESET [0])
+ );
+ LUT2 #(
+ .INIT ( 4'h2 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/U_CLEAR (
+ .I0(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDOUT_dly[2] ),
+ .I1(CONTROL[13]),
+ .O(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iCLR )
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/U_GEN_DELAY[2].U_FD (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_RST/HALT_pulse ),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDOUT_dly[2] )
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/U_GEN_DELAY[1].U_FD (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDOUT_dly[0] ),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/HALT_pulse )
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/U_RFDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDOUT ),
+ .CLR(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iCLR ),
+ .D(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDOUT ),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDOUT_dly[0] )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/U_DOUT (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDIN [0]),
+ .R(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDIN [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDOUT )
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/U_DOUT1 (
+ .C(CLK),
+ .CE(N1),
+ .CLR(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iCLR ),
+ .D(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDIN [0]),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDIN [1])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/U_DOUT0 (
+ .C(CLK),
+ .CE(N1),
+ .CLR(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iCLR ),
+ .D(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/din_latched ),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iDIN [0])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/U_TFDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[13]),
+ .CLR(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/iCLR ),
+ .D(CONTROL[13]),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/U_HALT_XFER/din_latched )
+ );
+ LUT2 #(
+ .INIT ( 4'h2 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/U_CLEAR (
+ .I0(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT_dly[4] ),
+ .I1(CONTROL[12]),
+ .O(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iCLR )
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/U_GEN_DELAY[4].U_FD (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/iARM ),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT_dly[4] )
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/U_GEN_DELAY[3].U_FD (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT_dly[2] ),
+ .Q(\U0/I_NO_D.U_ILA/iARM )
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/U_GEN_DELAY[2].U_FD (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT_dly[1] ),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT_dly[2] )
+ );
+ FDE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/U_GEN_DELAY[1].U_FD (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT_dly[0] ),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT_dly[1] )
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/U_RFDRE (
+ .C(CLK),
+ .CE(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT ),
+ .CLR(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iCLR ),
+ .D(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT ),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT_dly[0] )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/U_DOUT (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDIN [0]),
+ .R(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDIN [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDOUT )
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/U_DOUT1 (
+ .C(CLK),
+ .CE(N1),
+ .CLR(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iCLR ),
+ .D(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDIN [0]),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDIN [1])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/U_DOUT0 (
+ .C(CLK),
+ .CE(N1),
+ .CLR(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iCLR ),
+ .D(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/din_latched ),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iDIN [0])
+ );
+ FDCE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/U_TFDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[12]),
+ .CLR(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/iCLR ),
+ .D(CONTROL[12]),
+ .Q(\U0/I_NO_D.U_ILA/U_RST/U_ARM_XFER/din_latched )
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[13].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[6]),
+ .D(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [13]),
+ .R(CONTROL[14]),
+ .Q(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [13])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[12].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[6]),
+ .D(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [12]),
+ .R(CONTROL[14]),
+ .Q(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [12])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[11].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[6]),
+ .D(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [11]),
+ .R(CONTROL[14]),
+ .Q(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [11])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[10].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[6]),
+ .D(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [10]),
+ .R(CONTROL[14]),
+ .Q(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [10])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[9].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[6]),
+ .D(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [9]),
+ .R(CONTROL[14]),
+ .Q(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [9])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[8].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[6]),
+ .D(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [8]),
+ .R(CONTROL[14]),
+ .Q(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [8])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[7].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[6]),
+ .D(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [7]),
+ .R(CONTROL[14]),
+ .Q(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [7])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[6].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[6]),
+ .D(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [6]),
+ .R(CONTROL[14]),
+ .Q(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [6])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[5].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[6]),
+ .D(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [5]),
+ .R(CONTROL[14]),
+ .Q(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [5])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[4].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[6]),
+ .D(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [4]),
+ .R(CONTROL[14]),
+ .Q(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [4])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[3].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[6]),
+ .D(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [3]),
+ .R(CONTROL[14]),
+ .Q(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [3])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[2].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[6]),
+ .D(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [2]),
+ .R(CONTROL[14]),
+ .Q(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [2])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[1].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[6]),
+ .D(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [1]),
+ .R(CONTROL[14]),
+ .Q(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [1])
+ );
+ FDRE #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[0].U_FDRE (
+ .C(CONTROL[0]),
+ .CE(CONTROL[6]),
+ .D(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [0]),
+ .R(CONTROL[14]),
+ .Q(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [0])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[13].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [13]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [13])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[13].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [13]),
+ .LI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [13]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [13])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[12].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [12]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [12])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[12].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [12]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [12]),
+ .LO(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [13])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[12].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [12]),
+ .LI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [12]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [12])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[11].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [11]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [11])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[11].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [11]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [11]),
+ .LO(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [12])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[11].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [11]),
+ .LI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [11]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [11])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[10].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [10]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [10])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[10].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [10]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [10]),
+ .LO(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [11])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[10].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [10]),
+ .LI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [10]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [10])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[9].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [9]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [9])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[9].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [9]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [9]),
+ .LO(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [10])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[9].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [9]),
+ .LI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [9]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [9])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[8].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [8]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [8])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[8].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [8]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [8]),
+ .LO(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [9])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[8].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [8]),
+ .LI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [8]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [8])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[7].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [7]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [7])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[7].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [7]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [7]),
+ .LO(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [8])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[7].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [7]),
+ .LI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [7]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [7])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[6].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [6]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [6])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[6].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [6]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [6]),
+ .LO(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [7])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[6].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [6]),
+ .LI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [6]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [6])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[5].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [5]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [5])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[5].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [5]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [5]),
+ .LO(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [6])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[5].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [5]),
+ .LI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [5]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [5])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[4].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [4]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [4])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[4].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [4]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [4]),
+ .LO(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [5])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[4].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [4]),
+ .LI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [4]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [4])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[3].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [3]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [3])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[3].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [3]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [3]),
+ .LO(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [4])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[3].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [3]),
+ .LI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [3]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [3])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[2].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [2]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [2])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[2].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [2]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [2]),
+ .LO(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [3])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[2].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [2]),
+ .LI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [2]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [2])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[1].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [1]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [1])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[1].GnH.U_MUXCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [1]),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [1]),
+ .LO(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [2])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[1].U_XORCY (
+ .CI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [1]),
+ .LI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [1]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [1])
+ );
+ LUT1 #(
+ .INIT ( 2'h2 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[0].U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [0]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [0])
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[0].GnH.U_MUXCY (
+ .CI(N1),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [0]),
+ .LO(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/CI [1])
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/G[0].U_XORCY (
+ .CI(N1),
+ .LI(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/S [0]),
+ .O(\U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.I_RDADDR/U_HC/D [0])
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[0].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [24]),
+ .PRE(CONTROL[23]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<0> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[1].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [25]),
+ .PRE(CONTROL[23]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<1> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[2].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [26]),
+ .PRE(CONTROL[23]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<2> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[3].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [27]),
+ .PRE(CONTROL[23]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<3> )
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_OREG.U_OREG (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<2> ),
+ .S(\U0/I_NO_D.U_ILA/iRESET [0]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/DOUT_tmp )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLH (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N1),
+ .CE(CONTROL[23]),
+ .CLK(CONTROL[0]),
+ .D(CONTROL[1]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<4> ),
+ .Q15(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCfgData )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLL (
+ .A0(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<0> ),
+ .A1(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<1> ),
+ .A2(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<2> ),
+ .A3(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<3> ),
+ .CE(CONTROL[23]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCfgData ),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<3> ),
+ .Q15
+(\NLW_U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_SRLT_EQ_2.U_SRLL_Q15_UNCONNECTED )
+
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.I_YES_MUXH.U_MUXH (
+ .CI(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<0> ),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<4> ),
+ .LO(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<2> )
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TWMOD8_NE0.I_YES_RPM.U_MUXL (
+ .CI(N1),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<3> ),
+ .LO(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<0> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[0].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [0]),
+ .PRE(CONTROL[20]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<0> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[1].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [1]),
+ .PRE(CONTROL[20]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<1> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[2].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [2]),
+ .PRE(CONTROL[20]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<2> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[3].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [3]),
+ .PRE(CONTROL[20]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<3> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[4].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [4]),
+ .PRE(CONTROL[20]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<4> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[5].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [5]),
+ .PRE(CONTROL[20]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<5> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[6].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [6]),
+ .PRE(CONTROL[20]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<6> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[7].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [7]),
+ .PRE(CONTROL[20]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<7> )
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_OREG.U_OREG (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<2> ),
+ .S(\U0/I_NO_D.U_ILA/iRESET [0]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/DOUT_tmp )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLH (
+ .A0(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<4> ),
+ .A1(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<5> ),
+ .A2(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<6> ),
+ .A3(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<7> ),
+ .CE(CONTROL[20]),
+ .CLK(CONTROL[0]),
+ .D(CONTROL[1]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<1> ),
+ .Q15(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCfgData )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLL (
+ .A0(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<0> ),
+ .A1(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<1> ),
+ .A2(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<2> ),
+ .A3(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<3> ),
+ .CE(CONTROL[20]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCfgData ),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<0> ),
+ .Q15
+(\NLW_U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLL_Q15_UNCONNECTED )
+
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.U_MUXH (
+ .CI(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<0> ),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<1> ),
+ .LO(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<1> )
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.U_MUXL (
+ .CI(N1),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<0> ),
+ .LO(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<0> )
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_OREG.U_XORH (
+ .CI(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<1> ),
+ .LI(N0),
+ .O(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<2> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[0].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [8]),
+ .PRE(CONTROL[21]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<0> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[1].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [9]),
+ .PRE(CONTROL[21]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<1> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[2].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [10]),
+ .PRE(CONTROL[21]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<2> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[3].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [11]),
+ .PRE(CONTROL[21]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<3> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[4].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [12]),
+ .PRE(CONTROL[21]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<4> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[5].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [13]),
+ .PRE(CONTROL[21]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<5> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[6].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [14]),
+ .PRE(CONTROL[21]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<6> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[7].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [15]),
+ .PRE(CONTROL[21]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<7> )
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_OREG.U_OREG (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<2> ),
+ .S(\U0/I_NO_D.U_ILA/iRESET [0]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/DOUT_tmp )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLH (
+ .A0(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<4> ),
+ .A1(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<5> ),
+ .A2(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<6> ),
+ .A3(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<7> ),
+ .CE(CONTROL[21]),
+ .CLK(CONTROL[0]),
+ .D(CONTROL[1]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<1> ),
+ .Q15(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCfgData )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLL (
+ .A0(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<0> ),
+ .A1(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<1> ),
+ .A2(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<2> ),
+ .A3(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<3> ),
+ .CE(CONTROL[21]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCfgData ),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<0> ),
+ .Q15
+(\NLW_U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLL_Q15_UNCONNECTED )
+
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.U_MUXH (
+ .CI(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<0> ),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<1> ),
+ .LO(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<1> )
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.U_MUXL (
+ .CI(N1),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<0> ),
+ .LO(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<0> )
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_OREG.U_XORH (
+ .CI(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<1> ),
+ .LI(N0),
+ .O(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<2> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[0].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [16]),
+ .PRE(CONTROL[22]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<0> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[1].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [17]),
+ .PRE(CONTROL[22]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<1> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[2].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [18]),
+ .PRE(CONTROL[22]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<2> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[3].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [19]),
+ .PRE(CONTROL[22]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<3> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[4].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [20]),
+ .PRE(CONTROL[22]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<4> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[5].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [21]),
+ .PRE(CONTROL[22]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<5> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[6].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [22]),
+ .PRE(CONTROL[22]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<6> )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_YES_IREG.F_TW[7].U_IREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/iTRIG_IN [23]),
+ .PRE(CONTROL[22]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<7> )
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_OREG.U_OREG (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<2> ),
+ .S(\U0/I_NO_D.U_ILA/iRESET [0]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/DOUT_tmp )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLH (
+ .A0(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<4> ),
+ .A1(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<5> ),
+ .A2(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<6> ),
+ .A3(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<7> ),
+ .CE(CONTROL[22]),
+ .CLK(CONTROL[0]),
+ .D(CONTROL[1]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<1> ),
+ .Q15(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCfgData )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLL (
+ .A0(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<0> ),
+ .A1(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<1> ),
+ .A2(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<2> ),
+ .A3(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/din_dly1<3> ),
+ .CE(CONTROL[22]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCfgData ),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<0> ),
+ .Q15
+(\NLW_U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_SRLT_EQ_2.U_SRLL_Q15_UNCONNECTED )
+
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.U_MUXH (
+ .CI(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<0> ),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<1> ),
+ .LO(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<1> )
+ );
+ MUXCY_L \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.U_MUXL (
+ .CI(N1),
+ .DI(N0),
+ .S(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/sel<0> ),
+ .LO(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<0> )
+ );
+ XORCY \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/I_TW_GTE8.F_TW[0].I_YES_RPM.I_OREG.U_XORH (
+ .CI(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<1> ),
+ .LI(N0),
+ .O(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_MUT_GAND.U_match/I_SRL16.U_GAND_SRL16/tmpCompData<2> )
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[0].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [0]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [0])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[1].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [1]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [1])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[2].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [2]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [2])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[3].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [3]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [3])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[4].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [4]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [4])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[5].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [5]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [5])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[6].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [6]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [6])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[7].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [7]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [7])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[8].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [8]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [8])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[9].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [9]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [9])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[10].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [10]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [10])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[11].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [11]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [11])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[12].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [12]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [12])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[13].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [13]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [13])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[14].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [14]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [14])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[15].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [15]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [15])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[16].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [16]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [16])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[17].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [17]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [17])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[18].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [18]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [18])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[19].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [19]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [19])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[20].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [20]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [20])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[21].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [21]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [21])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[22].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [22]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [22])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[23].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [23]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [23])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[24].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [24]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [24])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[25].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [25]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [25])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[26].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [26]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [26])
+ );
+ FD #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[27].I_SRLT_NE_0.FF (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [27]),
+ .Q(\U0/I_NO_D.U_ILA/iDATA [27])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[0].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [0]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [0])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[1].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [1]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [1])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[2].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [2]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [2])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[3].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [3]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [3])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[4].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [4]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [4])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[5].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [5]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [5])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[6].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [6]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [6])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[7].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [7]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [7])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[8].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [8]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [8])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[9].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [9]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [9])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[10].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [10]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [10])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[11].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [11]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [11])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[12].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [12]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [12])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[13].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [13]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [13])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[14].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [14]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [14])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[15].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [15]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [15])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[16].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [16]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [16])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[17].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [17]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [17])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[18].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [18]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [18])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[19].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [19]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [19])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[20].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [20]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [20])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[21].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [21]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [21])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[22].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [22]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [22])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[23].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [23]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [23])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[24].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [24]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [24])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[25].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [25]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [25])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[26].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [26]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [26])
+ );
+ SRL16 #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/I_DQ.U_DQQ/DLY_9.DLY_9_GEN[27].I_SRLT_NE_0.DLY9 (
+ .A0(N1),
+ .A1(N1),
+ .A2(N1),
+ .A3(N0),
+ .CLK(CLK),
+ .D(\U0/iTRIG_IN [27]),
+ .Q(\U0/I_NO_D.U_ILA/I_DQ.U_DQQ/temp [27])
+ );
+ LUT3 #(
+ .INIT ( 8'hCA ))
+ \U0/I_NO_D.U_ILA/U_DOUT (
+ .I0(\U0/I_NO_D.U_ILA/iSTAT_DOUT ),
+ .I1(\U0/I_NO_D.U_ILA/iDATA_DOUT ),
+ .I2(CONTROL[6]),
+ .O(CONTROL[3])
+ );
+ LUT1 #(
+ .INIT ( 2'h1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_CAP_B (
+ .I0(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/iCAPTURE ),
+ .O(\NLW_U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_CAP_B_O_UNCONNECTED )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/I_NMU_EQ4.U_iDOUT/I_NOLUT6.I_SRL_T2.U_SRLC16E (
+ .A0(\U0/I_NO_D.U_ILA/U_TRIG/trigCondIn [0]),
+ .A1(\U0/I_NO_D.U_ILA/U_TRIG/trigCondIn [1]),
+ .A2(\U0/I_NO_D.U_ILA/U_TRIG/trigCondIn [2]),
+ .A3(\U0/I_NO_D.U_ILA/U_TRIG/trigCondIn [3]),
+ .CE(CONTROL[8]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/I_NMU_EQ4.U_iDOUT/iCFG_DIN ),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/iDOUT ),
+ .Q15
+(\NLW_U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/I_NMU_EQ4.U_iDOUT/I_NOLUT6.I_SRL_T2.U_SRLC16E_Q15_UNCONNECTED )
+
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/I_NMU_EQ4.U_iDOUT/I_NOLUT6.I_SRL_T2.U_LUT (
+ .I0(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/iCFG_DATA [1]),
+ .I1(CONTROL[8]),
+ .O(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/I_NMU_EQ4.U_iDOUT/iCFG_DIN )
+ );
+ SRLC16E #(
+ .INIT ( 16'h0000 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_TSEQ_NEQ2.U_TC_EQUATION/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/I_NMU_EQ4.U_iDOUT/I_NOLUT6.I_SRL_T2.U_SRLC16E (
+ .A0(\U0/I_NO_D.U_ILA/U_TRIG/trigCondIn [0]),
+ .A1(\U0/I_NO_D.U_ILA/U_TRIG/trigCondIn [1]),
+ .A2(\U0/I_NO_D.U_ILA/U_TRIG/trigCondIn [2]),
+ .A3(\U0/I_NO_D.U_ILA/U_TRIG/trigCondIn [3]),
+ .CE(CONTROL[8]),
+ .CLK(CONTROL[0]),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_TSEQ_NEQ2.U_TC_EQUATION/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/I_NMU_EQ4.U_iDOUT/iCFG_DIN ),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_TSEQ_NEQ2.U_TC_EQUATION/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/iDOUT ),
+ .Q15(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/iCFG_DATA [1])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_TSEQ_NEQ2.U_TC_EQUATION/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/I_NMU_EQ4.U_iDOUT/I_NOLUT6.I_SRL_T2.U_LUT (
+ .I0(CONTROL[1]),
+ .I1(CONTROL[8]),
+ .O(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_TSEQ_NEQ2.U_TC_EQUATION/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/I_NMU_EQ4.U_iDOUT/iCFG_DIN )
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/I_OREG.I_YES_OREG.U_OREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/U_MU/DOUT_tmp ),
+ .PRE(\U0/I_NO_D.U_ILA/iRESET [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/dout_tmp )
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/I_MC_NO.U_NO_MC_REG (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[2].U_M/dout_tmp ),
+ .S(\U0/I_NO_D.U_ILA/iRESET [2]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/trigCondIn [2])
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/I_OREG.I_YES_OREG.U_OREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/U_MU/DOUT_tmp ),
+ .PRE(\U0/I_NO_D.U_ILA/iRESET [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/dout_tmp )
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/I_MC_NO.U_NO_MC_REG (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[1].U_M/dout_tmp ),
+ .S(\U0/I_NO_D.U_ILA/iRESET [2]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/trigCondIn [1])
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/I_OREG.I_YES_OREG.U_OREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/U_MU/DOUT_tmp ),
+ .PRE(\U0/I_NO_D.U_ILA/iRESET [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/dout_tmp )
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/I_MC_NO.U_NO_MC_REG (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[0].U_M/dout_tmp ),
+ .S(\U0/I_NO_D.U_ILA/iRESET [2]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/trigCondIn [0])
+ );
+ FDPE #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/I_OREG.I_YES_OREG.U_OREG (
+ .C(CLK),
+ .CE(N1),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/U_MU/DOUT_tmp ),
+ .PRE(\U0/I_NO_D.U_ILA/iRESET [1]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/dout_tmp )
+ );
+ FDS #(
+ .INIT ( 1'b1 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/I_MC_NO.U_NO_MC_REG (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TM/G_NMU[3].U_M/dout_tmp ),
+ .S(\U0/I_NO_D.U_ILA/iRESET [2]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/trigCondIn [3])
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_CAP_DLY (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/iCAPTURE ),
+ .R(\U0/I_NO_D.U_ILA/iRESET [3]),
+ .Q(\U0/I_NO_D.U_ILA/iCAPTURE )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/I_OUTREG.U_DOUT (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/iDOUT ),
+ .R(\U0/I_NO_D.U_ILA/iRESET [3]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/iTRIGGER )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/I_SRLT_NE_1.I_NMU_1_TO_4.U_TRIGQ (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_STORAGE_QUAL.U_STORAGE_QUAL/iTRIGGER ),
+ .R(\U0/I_NO_D.U_ILA/iRESET [4]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/iCAPTURE )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_TSEQ_NEQ2.U_TC_EQUATION/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/I_OUTREG.U_DOUT (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_TSEQ_NEQ2.U_TC_EQUATION/I_SRLT_NE_1.I_NMU_1_TO_4.U_TCL/iDOUT ),
+ .R(\U0/I_NO_D.U_ILA/iRESET [3]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_TSEQ_NEQ2.U_TC_EQUATION/iTRIGGER )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_TSEQ_NEQ2.U_TC_EQUATION/I_SRLT_NE_1.I_NMU_1_TO_4.U_TRIGQ (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/U_TC/I_TSEQ_NEQ2.U_TC_EQUATION/iTRIGGER ),
+ .R(\U0/I_NO_D.U_ILA/iRESET [4]),
+ .Q(\U0/I_NO_D.U_ILA/U_TRIG/trigCondOut )
+ );
+ FDR #(
+ .INIT ( 1'b0 ))
+ \U0/I_NO_D.U_ILA/U_TRIG/F_NO_TCMC.U_FDR (
+ .C(CLK),
+ .D(\U0/I_NO_D.U_ILA/U_TRIG/trigCondOut ),
+ .R(\U0/I_NO_D.U_ILA/iRESET [5]),
+ .Q(\U0/I_NO_D.U_ILA/iTRIGGER )
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ3.G_TW[3].U_TQ (
+ .C(CLK),
+ .D(TRIG3[3]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [27])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ3.G_TW[2].U_TQ (
+ .C(CLK),
+ .D(TRIG3[2]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [26])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ3.G_TW[1].U_TQ (
+ .C(CLK),
+ .D(TRIG3[1]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [25])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ3.G_TW[0].U_TQ (
+ .C(CLK),
+ .D(TRIG3[0]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [24])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ2.G_TW[7].U_TQ (
+ .C(CLK),
+ .D(TRIG2[7]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [23])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ2.G_TW[6].U_TQ (
+ .C(CLK),
+ .D(TRIG2[6]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [22])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ2.G_TW[5].U_TQ (
+ .C(CLK),
+ .D(TRIG2[5]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [21])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ2.G_TW[4].U_TQ (
+ .C(CLK),
+ .D(TRIG2[4]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [20])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ2.G_TW[3].U_TQ (
+ .C(CLK),
+ .D(TRIG2[3]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [19])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ2.G_TW[2].U_TQ (
+ .C(CLK),
+ .D(TRIG2[2]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [18])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ2.G_TW[1].U_TQ (
+ .C(CLK),
+ .D(TRIG2[1]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [17])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ2.G_TW[0].U_TQ (
+ .C(CLK),
+ .D(TRIG2[0]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [16])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ1.G_TW[7].U_TQ (
+ .C(CLK),
+ .D(TRIG1[7]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [15])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ1.G_TW[6].U_TQ (
+ .C(CLK),
+ .D(TRIG1[6]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [14])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ1.G_TW[5].U_TQ (
+ .C(CLK),
+ .D(TRIG1[5]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [13])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ1.G_TW[4].U_TQ (
+ .C(CLK),
+ .D(TRIG1[4]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [12])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ1.G_TW[3].U_TQ (
+ .C(CLK),
+ .D(TRIG1[3]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [11])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ1.G_TW[2].U_TQ (
+ .C(CLK),
+ .D(TRIG1[2]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [10])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ1.G_TW[1].U_TQ (
+ .C(CLK),
+ .D(TRIG1[1]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [9])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ1.G_TW[0].U_TQ (
+ .C(CLK),
+ .D(TRIG1[0]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [8])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ0.G_TW[7].U_TQ (
+ .C(CLK),
+ .D(TRIG0[7]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [7])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ0.G_TW[6].U_TQ (
+ .C(CLK),
+ .D(TRIG0[6]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [6])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ0.G_TW[5].U_TQ (
+ .C(CLK),
+ .D(TRIG0[5]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [5])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ0.G_TW[4].U_TQ (
+ .C(CLK),
+ .D(TRIG0[4]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [4])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ0.G_TW[3].U_TQ (
+ .C(CLK),
+ .D(TRIG0[3]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [3])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ0.G_TW[2].U_TQ (
+ .C(CLK),
+ .D(TRIG0[2]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [2])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ0.G_TW[1].U_TQ (
+ .C(CLK),
+ .D(TRIG0[1]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [1])
+ );
+ FDP #(
+ .INIT ( 1'b1 ))
+ \U0/I_TQ0.G_TW[0].U_TQ (
+ .C(CLK),
+ .D(TRIG0[0]),
+ .PRE(N0),
+ .Q(\U0/iTRIG_IN [0])
+ );
+ LUT2 #(
+ .INIT ( 4'h8 ))
+ \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut<0> (
+ .I0(CONTROL[10]),
+ .I1(CONTROL[11]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [0])
+ );
+ MUXCY \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy<0> (
+ .CI(N1),
+ .DI(N0),
+ .S(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [0]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [0])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut<1> (
+ .I0(CONTROL[12]),
+ .I1(CONTROL[13]),
+ .I2(CONTROL[9]),
+ .I3(CONTROL[14]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [1])
+ );
+ MUXCY \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy<1> (
+ .CI(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [0]),
+ .DI(N0),
+ .S(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [1]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [1])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut<2> (
+ .I0(CONTROL[15]),
+ .I1(CONTROL[16]),
+ .I2(CONTROL[8]),
+ .I3(CONTROL[17]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [2])
+ );
+ MUXCY \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy<2> (
+ .CI(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [1]),
+ .DI(N0),
+ .S(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [2]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [2])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut<3> (
+ .I0(CONTROL[18]),
+ .I1(CONTROL[21]),
+ .I2(CONTROL[7]),
+ .I3(CONTROL[19]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [3])
+ );
+ MUXCY \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy<3> (
+ .CI(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [2]),
+ .DI(N0),
+ .S(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [3]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [3])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut<4> (
+ .I0(CONTROL[20]),
+ .I1(CONTROL[22]),
+ .I2(CONTROL[6]),
+ .I3(CONTROL[23]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [4])
+ );
+ MUXCY \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy<4> (
+ .CI(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [3]),
+ .DI(N0),
+ .S(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [4]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [4])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut<5> (
+ .I0(CONTROL[24]),
+ .I1(CONTROL[25]),
+ .I2(CONTROL[5]),
+ .I3(CONTROL[26]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [5])
+ );
+ MUXCY \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy<5> (
+ .CI(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [4]),
+ .DI(N0),
+ .S(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [5]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [5])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut<6> (
+ .I0(CONTROL[27]),
+ .I1(CONTROL[28]),
+ .I2(CONTROL[2]),
+ .I3(CONTROL[29]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [6])
+ );
+ MUXCY \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy<6> (
+ .CI(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [5]),
+ .DI(N0),
+ .S(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [6]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [6])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut<7> (
+ .I0(CONTROL[30]),
+ .I1(CONTROL[31]),
+ .I2(CONTROL[1]),
+ .I3(CONTROL[32]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [7])
+ );
+ MUXCY \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy<7> (
+ .CI(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [6]),
+ .DI(N0),
+ .S(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [7]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [7])
+ );
+ LUT4 #(
+ .INIT ( 16'h8000 ))
+ \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut<8> (
+ .I0(CONTROL[33]),
+ .I1(CONTROL[34]),
+ .I2(CONTROL[4]),
+ .I3(CONTROL[35]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [8])
+ );
+ MUXCY \U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy<8> (
+ .CI(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [7]),
+ .DI(N0),
+ .S(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_lut [8]),
+ .O(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [8])
+ );
+ LUT4 #(
+ .INIT ( 16'hFEFF ))
+ \U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT<2>1 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/NS_dstat [8]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT<2>1_537 )
+ );
+ LUT3 #(
+ .INIT ( 8'hE4 ))
+ \U0/I_NO_D.U_ILA/U_STAT/DIRTY_dstat1 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/DIRTY_SEL ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/DIRTY_D0 ),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/DIRTY_D1 ),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/DIRTY_dstat )
+ );
+ LUT2 #(
+ .INIT ( 4'h2 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O2 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [9]),
+ .I1(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [8]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O2_464 )
+ );
+ LUT4 #(
+ .INIT ( 16'h0001 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O15 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [7]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [6]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [5]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [4]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O15_463 )
+ );
+ LUT4 #(
+ .INIT ( 16'hFFFE ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O26 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [7]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [6]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [5]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [4]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O26_465 )
+ );
+ LUT4 #(
+ .INIT ( 16'hF222 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O36 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O26_465 ),
+ .I1(\U0/U_XST_CONTROLBUS_WORKAROUND/CONTROL_XST_WORKAROUND_O_cmp_eq0000_wg_cy [8]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O15_463 ),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT [16]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O36_466 )
+ );
+ LUT4 #(
+ .INIT ( 16'hAF8D ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O129 (
+ .I0(CONTROL[4]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O2_464 ),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/TDO_mux_in<0>1 ),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O82_467 ),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/TDO_next )
+ );
+ MUXF5 \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_91 (
+ .I0(N38),
+ .I1(N39),
+ .S(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .O(\U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_91_455 )
+ );
+ LUT3 #(
+ .INIT ( 8'h15 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_91_F (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/DIRTY_dstat ),
+ .O(N38)
+ );
+ LUT4 #(
+ .INIT ( 16'h0145 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_DMUX/U_CS_MUX/I3.U_MUX8/Mmux_O_91_G (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [2]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/EXTCAP_READY_dstat ),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/ACT_dstat ),
+ .O(N39)
+ );
+ LUT4_L #(
+ .INIT ( 16'h3F50 ))
+ \U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT<1>1 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/ARM_dstat ),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/TRIGGER_dstat ),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [1]),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [0]),
+ .LO(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT<1>1_535 )
+ );
+ LUT4_L #(
+ .INIT ( 16'h3120 ))
+ \U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O82 (
+ .I0(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [8]),
+ .I1(\U0/I_NO_D.U_ILA/U_STAT/iSTAT_CNT [9]),
+ .I2(\U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O36_466 ),
+ .I3(\U0/I_NO_D.U_ILA/U_STAT/U_SMUX/U_CS_MUX/I6.U_MUX64/Mmux_O_8_f7_483 ),
+ .LO(\U0/I_NO_D.U_ILA/U_STAT/U_MUX/U_CS_MUX/I1.U_MUX2/O82_467 )
+ );
+ RAMB16_S1_S36 #(
+ .INIT_B ( 36'h000000000 ),
+ .INITP_00 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INITP_01 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INITP_02 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INITP_03 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INITP_04 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INITP_05 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INITP_06 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_00 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_01 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_02 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_03 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_04 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_05 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_06 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_07 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_08 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_09 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_0A ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_0B ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_0C ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_0D ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_0E ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_0F ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_10 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_11 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_12 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_13 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_14 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_15 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_16 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_17 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_18 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_19 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_1A ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_1B ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_1C ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_1D ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_1E ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_1F ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_20 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_21 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_22 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_23 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_24 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_25 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_26 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_27 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_28 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_29 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_2A ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_2B ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_2C ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_2D ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_2E ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_2F ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_30 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_31 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_32 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_33 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_34 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_35 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_36 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_37 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_38 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_39 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_3A ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_3B ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_3C ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_3D ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_3E ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_3F ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .INIT_A ( 1'h0 ),
+ .SIM_COLLISION_CHECK ( "ALL" ),
+ .INITP_07 ( 256'h0000000000000000000000000000000000000000000000000000000000000000 ),
+ .SRVAL_A ( 1'h0 ),
+ .WRITE_MODE_A ( "WRITE_FIRST" ),
+ .WRITE_MODE_B ( "WRITE_FIRST" ),
+ .SRVAL_B ( 36'h000000000 ))
+ \U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i (
+ .CLKA(CONTROL[0]),
+ .CLKB(CLK),
+ .ENA(CONTROL[6]),
+ .ENB(N1),
+ .WEB(\U0/I_NO_D.U_ILA/iCAP_WR_EN ),
+ .SSRA(N0),
+ .SSRB(N0),
+ .WEA(N0),
+ .DIPB({N0, N0, N0, N0}),
+ .ADDRA({\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [13], \U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [12], \U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [11],
+\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [10], \U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [9], \U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [8],
+\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [7], \U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [6], \U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [5],
+\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [4], \U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [3], \U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [2],
+\U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [1], \U0/I_NO_D.U_ILA/U_CAPSTOR/RD_ADDR [0]}),
+ .ADDRB({\U0/I_NO_D.U_ILA/iCAP_WR_ADDR [8], \U0/I_NO_D.U_ILA/iCAP_WR_ADDR [7], \U0/I_NO_D.U_ILA/iCAP_WR_ADDR [6], \U0/I_NO_D.U_ILA/iCAP_WR_ADDR [5]
+, \U0/I_NO_D.U_ILA/iCAP_WR_ADDR [4], \U0/I_NO_D.U_ILA/iCAP_WR_ADDR [3], \U0/I_NO_D.U_ILA/iCAP_WR_ADDR [2], \U0/I_NO_D.U_ILA/iCAP_WR_ADDR [1],
+\U0/I_NO_D.U_ILA/iCAP_WR_ADDR [0]}),
+ .DIB({N0, N0, N0, \U0/I_NO_D.U_ILA/iDATA [27], \U0/I_NO_D.U_ILA/iDATA [26], \U0/I_NO_D.U_ILA/iDATA [25], \U0/I_NO_D.U_ILA/iDATA [24],
+\U0/I_NO_D.U_ILA/iDATA [23], \U0/I_NO_D.U_ILA/iDATA [22], \U0/I_NO_D.U_ILA/iDATA [21], \U0/I_NO_D.U_ILA/iDATA [20], \U0/I_NO_D.U_ILA/iDATA [19],
+\U0/I_NO_D.U_ILA/iDATA [18], \U0/I_NO_D.U_ILA/iDATA [17], \U0/I_NO_D.U_ILA/iDATA [16], \U0/I_NO_D.U_ILA/iDATA [15], \U0/I_NO_D.U_ILA/iDATA [14],
+\U0/I_NO_D.U_ILA/iDATA [13], \U0/I_NO_D.U_ILA/iDATA [12], \U0/I_NO_D.U_ILA/iDATA [11], \U0/I_NO_D.U_ILA/iDATA [10], \U0/I_NO_D.U_ILA/iDATA [9],
+\U0/I_NO_D.U_ILA/iDATA [8], \U0/I_NO_D.U_ILA/iDATA [7], \U0/I_NO_D.U_ILA/iDATA [6], \U0/I_NO_D.U_ILA/iDATA [5], \U0/I_NO_D.U_ILA/iDATA [4],
+\U0/I_NO_D.U_ILA/iDATA [3], \U0/I_NO_D.U_ILA/iDATA [2], \U0/I_NO_D.U_ILA/iDATA [1], \U0/I_NO_D.U_ILA/iDATA [0], \U0/I_NO_D.U_ILA/iCAP_TRIGGER_OUT }),
+ .DOA({\U0/I_NO_D.U_ILA/iDATA_DOUT }),
+ .DIA({N0}),
+ .DOB({\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<31>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<30>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<29>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<28>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<27>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<26>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<25>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<24>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<23>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<22>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<21>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<20>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<19>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<18>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<17>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<16>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<15>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<14>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<13>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<12>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<11>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<10>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<9>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<8>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<7>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<6>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<5>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<4>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<3>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<2>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<1>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOB<0>_UNCONNECTED }),
+ .DOPB({\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOPB<3>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOPB<2>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOPB<1>_UNCONNECTED ,
+\NLW_U0/I_NO_D.U_ILA/U_CAPSTOR/I_CASE1.I_NO_TB.I_RT1.U_RAM/G_BRAM[0].U_BRAM/ram_rt1_s1_s32_if.ram_rt1_s1_s32_i_DOPB<0>_UNCONNECTED })
+ );
+
+// synthesis translate_on
+
+endmodule
+
+// synthesis translate_off
+
+`ifndef GLBL
+`define GLBL
+
+`timescale 1 ps / 1 ps
+
+module glbl ();
+
+ parameter ROC_WIDTH = 100000;
+ parameter TOC_WIDTH = 0;
+
+ wire GSR;
+ wire GTS;
+ wire GWE;
+ wire PRLD;
+ tri1 p_up_tmp;
+ tri (weak1, strong0) PLL_LOCKG = p_up_tmp;
+
+ reg GSR_int;
+ reg GTS_int;
+ reg PRLD_int;
+
+//-------- JTAG Globals --------------
+ wire JTAG_TDO_GLBL;
+ wire JTAG_TCK_GLBL;
+ wire JTAG_TDI_GLBL;
+ wire JTAG_TMS_GLBL;
+ wire JTAG_TRST_GLBL;
+
+ reg JTAG_CAPTURE_GLBL;
+ reg JTAG_RESET_GLBL;
+ reg JTAG_SHIFT_GLBL;
+ reg JTAG_UPDATE_GLBL;
+ reg JTAG_RUNTEST_GLBL;
+
+ reg JTAG_SEL1_GLBL = 0;
+ reg JTAG_SEL2_GLBL = 0 ;
+ reg JTAG_SEL3_GLBL = 0;
+ reg JTAG_SEL4_GLBL = 0;
+
+ reg JTAG_USER_TDO1_GLBL = 1'bz;
+ reg JTAG_USER_TDO2_GLBL = 1'bz;
+ reg JTAG_USER_TDO3_GLBL = 1'bz;
+ reg JTAG_USER_TDO4_GLBL = 1'bz;
+
+ assign (weak1, weak0) GSR = GSR_int;
+ assign (weak1, weak0) GTS = GTS_int;
+ assign (weak1, weak0) PRLD = PRLD_int;
+
+ initial begin
+ GSR_int = 1'b1;
+ PRLD_int = 1'b1;
+ #(ROC_WIDTH)
+ GSR_int = 1'b0;
+ PRLD_int = 1'b0;
+ end
+
+ initial begin
+ GTS_int = 1'b1;
+ #(TOC_WIDTH)
+ GTS_int = 1'b0;
+ end
+
+endmodule
+
+`endif
+
+// synthesis translate_on
diff --git a/fpga/usrp2/extramfifo/ila.xco b/fpga/usrp2/extramfifo/ila.xco
new file mode 100644
index 000000000..c8d4d2f75
--- /dev/null
+++ b/fpga/usrp2/extramfifo/ila.xco
@@ -0,0 +1,130 @@
+##############################################################
+#
+# Xilinx Core Generator version 12.1
+# Date: Wed Jul 21 18:51:14 2010
+#
+##############################################################
+#
+# This file contains the customisation parameters for a
+# Xilinx CORE Generator IP GUI. It is strongly recommended
+# that you do not manually alter this file as it may cause
+# unexpected and unsupported behavior.
+#
+##############################################################
+#
+# BEGIN Project Options
+SET addpads = false
+SET asysymbol = true
+SET busformat = BusFormatAngleBracketNotRipped
+SET createndf = false
+SET designentry = Verilog
+SET device = xc3s2000
+SET devicefamily = spartan3
+SET flowvendor = Other
+SET formalverification = false
+SET foundationsym = false
+SET implementationfiletype = Ngc
+SET package = fg456
+SET removerpms = false
+SET simulationfiles = Structural
+SET speedgrade = -5
+SET verilogsim = true
+SET vhdlsim = false
+# END Project Options
+# BEGIN Select
+SELECT ILA_(ChipScope_Pro_-_Integrated_Logic_Analyzer) family Xilinx,_Inc. 1.03.a
+# END Select
+# BEGIN Parameters
+CSET component_name=ila
+CSET counter_width_1=Disabled
+CSET counter_width_10=Disabled
+CSET counter_width_11=Disabled
+CSET counter_width_12=Disabled
+CSET counter_width_13=Disabled
+CSET counter_width_14=Disabled
+CSET counter_width_15=Disabled
+CSET counter_width_16=Disabled
+CSET counter_width_2=Disabled
+CSET counter_width_3=Disabled
+CSET counter_width_4=Disabled
+CSET counter_width_5=Disabled
+CSET counter_width_6=Disabled
+CSET counter_width_7=Disabled
+CSET counter_width_8=Disabled
+CSET counter_width_9=Disabled
+CSET data_port_width=0
+CSET data_same_as_trigger=true
+CSET enable_storage_qualification=true
+CSET enable_trigger_output_port=false
+CSET exclude_from_data_storage_1=false
+CSET exclude_from_data_storage_10=false
+CSET exclude_from_data_storage_11=false
+CSET exclude_from_data_storage_12=false
+CSET exclude_from_data_storage_13=false
+CSET exclude_from_data_storage_14=false
+CSET exclude_from_data_storage_15=false
+CSET exclude_from_data_storage_16=false
+CSET exclude_from_data_storage_2=false
+CSET exclude_from_data_storage_3=false
+CSET exclude_from_data_storage_4=false
+CSET exclude_from_data_storage_5=false
+CSET exclude_from_data_storage_6=false
+CSET exclude_from_data_storage_7=false
+CSET exclude_from_data_storage_8=false
+CSET exclude_from_data_storage_9=false
+CSET match_type_1=basic
+CSET match_type_10=basic
+CSET match_type_11=basic
+CSET match_type_12=basic
+CSET match_type_13=basic
+CSET match_type_14=basic
+CSET match_type_15=basic
+CSET match_type_16=basic
+CSET match_type_2=basic
+CSET match_type_3=basic
+CSET match_type_4=basic
+CSET match_type_5=basic
+CSET match_type_6=basic
+CSET match_type_7=basic
+CSET match_type_8=basic
+CSET match_type_9=basic
+CSET match_units_1=1
+CSET match_units_10=1
+CSET match_units_11=1
+CSET match_units_12=1
+CSET match_units_13=1
+CSET match_units_14=1
+CSET match_units_15=1
+CSET match_units_16=1
+CSET match_units_2=1
+CSET match_units_3=1
+CSET match_units_4=1
+CSET match_units_5=1
+CSET match_units_6=1
+CSET match_units_7=1
+CSET match_units_8=1
+CSET match_units_9=1
+CSET max_sequence_levels=1
+CSET number_of_trigger_ports=4
+CSET sample_data_depth=512
+CSET sample_on=Rising
+CSET trigger_port_width_1=8
+CSET trigger_port_width_10=8
+CSET trigger_port_width_11=8
+CSET trigger_port_width_12=8
+CSET trigger_port_width_13=8
+CSET trigger_port_width_14=8
+CSET trigger_port_width_15=8
+CSET trigger_port_width_16=8
+CSET trigger_port_width_2=8
+CSET trigger_port_width_3=8
+CSET trigger_port_width_4=4
+CSET trigger_port_width_5=8
+CSET trigger_port_width_6=8
+CSET trigger_port_width_7=8
+CSET trigger_port_width_8=8
+CSET trigger_port_width_9=8
+CSET use_rpms=true
+# END Parameters
+GENERATE
+# CRC: 66151c7c
diff --git a/fpga/usrp2/extramfifo/nobl_fifo.v b/fpga/usrp2/extramfifo/nobl_fifo.v
new file mode 100644
index 000000000..0b63768fc
--- /dev/null
+++ b/fpga/usrp2/extramfifo/nobl_fifo.v
@@ -0,0 +1,97 @@
+// Since this FIFO uses a ZBT/NoBL SRAM for its storage which is a since port
+// device it can only sustain data throughput at half the RAM clock rate.
+// Fair arbitration to ensure this occurs is included in this logic and
+// requests for transactions that can not be completed are held off.
+// This FIFO requires a an external signal driving read_strobe that assures space for at least 6
+// reads since this the theopretical maximum number in flight due to pipeling.
+
+module nobl_fifo
+ #(parameter WIDTH=18,RAM_DEPTH=19,FIFO_DEPTH=19)
+ (
+ input clk,
+ input rst,
+ input [WIDTH-1:0] RAM_D_pi,
+ output [WIDTH-1:0] RAM_D_po,
+ output RAM_D_poe,
+ output [RAM_DEPTH-1:0] RAM_A,
+ output RAM_WEn,
+ output RAM_CENn,
+ output RAM_LDn,
+ output RAM_OEn,
+ output RAM_CE1n,
+ input [WIDTH-1:0] write_data,
+ input write_strobe,
+ output reg space_avail,
+ output [WIDTH-1:0] read_data,
+ input read_strobe, // Triggers a read, result in approximately 6 cycles.
+ output data_avail, // Qulaifys read data available this cycle on read_data.
+ output reg [FIFO_DEPTH-1:0] capacity
+ );
+
+ //reg [FIFO_DEPTH-1:0] capacity;
+ reg [FIFO_DEPTH-1:0] wr_pointer;
+ reg [FIFO_DEPTH-1:0] rd_pointer;
+ wire [RAM_DEPTH-1:0] address;
+ reg data_avail_int; // Internal not empty flag.
+
+ assign read = read_strobe && data_avail_int;
+ assign write = write_strobe && space_avail;
+
+ // When a read and write collision occur, supress the space_avail flag next cycle
+ // and complete write followed by read over 2 cycles. This forces balanced arbitration
+ // and makes for a simple logic design.
+
+ always @(posedge clk)
+ if (rst)
+ begin
+ capacity <= (1 << FIFO_DEPTH) - 1;
+ wr_pointer <= 0;
+ rd_pointer <= 0;
+ space_avail <= 1;
+ data_avail_int <= 0;
+ end
+ else
+ begin
+ // No space available if:
+ // Capacity is already zero; Capacity is 1 and write is asserted (lookahead); both read and write are asserted (collision)
+ space_avail <= ~((capacity == 0) || (read&&write) || ((capacity == 1) && write) );
+ // Capacity has 1 cycle delay so look ahead here for corner case of read of last item in FIFO.
+ data_avail_int <= ~((capacity == ((1 << FIFO_DEPTH)-1)) || ((capacity == ((1 << FIFO_DEPTH)-2)) && (~write && read)) );
+ wr_pointer <= wr_pointer + write;
+ rd_pointer <= rd_pointer + (~write && read);
+ capacity <= capacity - write + (~write && read) ;
+ end // else: !if(rst)
+
+ assign address = write ? wr_pointer : rd_pointer;
+ assign enable = write || read;
+
+
+ //
+ // Simple NoBL SRAM interface, 4 cycle read latency.
+ // Read/Write arbitration via temprary application of empty/full flags.
+ //
+ nobl_if #(.WIDTH(WIDTH),.DEPTH(RAM_DEPTH))
+ nobl_if_i1
+ (
+ .clk(clk),
+ .rst(rst),
+ .RAM_D_pi(RAM_D_pi),
+ .RAM_D_po(RAM_D_po),
+ .RAM_D_poe(RAM_D_poe),
+ .RAM_A(RAM_A),
+ .RAM_WEn(RAM_WEn),
+ .RAM_CENn(RAM_CENn),
+ .RAM_LDn(RAM_LDn),
+ .RAM_OEn(RAM_OEn),
+ .RAM_CE1n(RAM_CE1n),
+ .address(address),
+ .data_out(write_data),
+ .data_in(read_data),
+ .data_in_valid(data_avail),
+ .write(write),
+ .enable(enable)
+ );
+
+
+
+endmodule // nobl_fifo
diff --git a/fpga/usrp2/extramfifo/nobl_if.v b/fpga/usrp2/extramfifo/nobl_if.v
new file mode 100644
index 000000000..b5ebe9c6b
--- /dev/null
+++ b/fpga/usrp2/extramfifo/nobl_if.v
@@ -0,0 +1,148 @@
+// Tested against an IDT 71v65603s150 in simulation and a Cypress 7C1356C in the real world.
+
+module nobl_if
+ #(parameter WIDTH=18,DEPTH=19)
+ (
+ input clk,
+ input rst,
+ input [WIDTH-1:0] RAM_D_pi,
+ output [WIDTH-1:0] RAM_D_po,
+ output reg RAM_D_poe,
+ output [DEPTH-1:0] RAM_A,
+ output reg RAM_WEn,
+ output RAM_CENn,
+ output RAM_LDn,
+ output RAM_OEn,
+ output reg RAM_CE1n,
+ input [DEPTH-1:0] address,
+ input [WIDTH-1:0] data_out,
+ output reg [WIDTH-1:0] data_in,
+ output reg data_in_valid,
+ input write,
+ input enable
+ );
+
+
+ reg enable_pipe1;
+ reg [DEPTH-1:0] address_pipe1;
+ reg write_pipe1;
+ reg [WIDTH-1:0] data_out_pipe1;
+
+ reg enable_pipe2;
+ reg write_pipe2;
+ reg [WIDTH-1:0] data_out_pipe2;
+
+ reg enable_pipe3;
+ reg write_pipe3;
+ reg [WIDTH-1:0] data_out_pipe3;
+
+ assign RAM_LDn = 0;
+ // ZBT/NoBL RAM actually manages its own output enables very well.
+ assign RAM_OEn = 0;
+
+ // gray code the address to reduce EMI
+ wire [DEPTH-1:0] address_gray;
+
+ bin2gray #(.WIDTH(DEPTH)) bin2gray (.bin(address),.gray(address_gray));
+
+
+ //
+ // Pipeline stage 1
+ //
+ always @(posedge clk)
+ if (rst)
+ begin
+ enable_pipe1 <= 0;
+ address_pipe1 <= 0;
+ write_pipe1 <= 0;
+ data_out_pipe1 <= 0;
+ RAM_WEn <= 1;
+ RAM_CE1n <= 1;
+
+ end
+ else
+ begin
+ enable_pipe1 <= enable;
+ RAM_CE1n <= ~enable; // Creates IOB flop
+ RAM_WEn <= ~write; // Creates IOB flop
+
+ if (enable)
+ begin
+ address_pipe1 <= address_gray;
+ write_pipe1 <= write;
+// RAM_WEn <= ~write; // Creates IOB flop
+
+
+ if (write)
+ data_out_pipe1 <= data_out;
+ end
+ end // always @ (posedge clk)
+
+ // Pipeline 1 drives address, write_enable, chip_select on NoBL SRAM
+ assign RAM_A = address_pipe1;
+ assign RAM_CENn = 1'b0;
+ // assign RAM_WEn = ~write_pipe1;
+// assign RAM_CE1n = ~enable_pipe1;
+
+ //
+ // Pipeline stage2
+ //
+ always @(posedge clk)
+ if (rst)
+ begin
+ enable_pipe2 <= 0;
+ data_out_pipe2 <= 0;
+ write_pipe2 <= 0;
+ end
+ else
+ begin
+ data_out_pipe2 <= data_out_pipe1;
+ write_pipe2 <= write_pipe1;
+ enable_pipe2 <= enable_pipe1;
+ end
+
+ //
+ // Pipeline stage3
+ //
+ always @(posedge clk)
+ if (rst)
+ begin
+ enable_pipe3 <= 0;
+ data_out_pipe3 <= 0;
+ write_pipe3 <= 0;
+ RAM_D_poe <= 0;
+ end
+ else
+ begin
+ data_out_pipe3 <= data_out_pipe2;
+ write_pipe3 <= write_pipe2;
+ enable_pipe3 <= enable_pipe2;
+ RAM_D_poe <= ~(write_pipe2 & enable_pipe2); // Active low driver enable in Xilinx.
+ end
+
+ // Pipeline 3 drives write data on NoBL SRAM
+ assign RAM_D_po = data_out_pipe3;
+
+
+ //
+ // Pipeline stage4
+ //
+ always @(posedge clk)
+ if (rst)
+ begin
+ data_in_valid <= 0;
+ data_in <= 0;
+ end
+ else
+ begin
+ data_in <= RAM_D_pi;
+ if (enable_pipe3 & ~write_pipe3)
+ begin
+ // Read data now available to be registered.
+ data_in_valid <= 1'b1;
+ end
+ else
+ data_in_valid <= 1'b0;
+ end // always @ (posedge clk)
+
+endmodule // nobl_if
diff --git a/fpga/usrp2/extramfifo/refill_randomizer.v b/fpga/usrp2/extramfifo/refill_randomizer.v
new file mode 100644
index 000000000..0b30f4049
--- /dev/null
+++ b/fpga/usrp2/extramfifo/refill_randomizer.v
@@ -0,0 +1,66 @@
+//
+// EMI mitigation.
+// Process FULL flag from FIFO so that de-assertion
+// (FIFO now not FULL) is delayed by a pseudo random
+// value, but assertion is passed straight through.
+//
+
+
+module refill_randomizer
+ #(parameter BITS=7)
+ (
+ input clk,
+ input rst,
+ input full_in,
+ output full_out
+ );
+
+ wire feedback;
+ reg full_last;
+ wire full_deasserts;
+ reg [6:0] shift_reg;
+ reg [6:0] count;
+ reg delayed_fall;
+
+
+ always @(posedge clk)
+ full_last <= full_in;
+
+ assign full_deasserts = full_last & ~full_in;
+
+ // 7 bit LFSR
+ always @(posedge clk)
+ if (rst)
+ shift_reg <= 7'b1;
+ else
+ if (full_deasserts)
+ shift_reg <= {shift_reg[5:0],feedback};
+
+ assign feedback = ^(shift_reg & 7'h41);
+
+ always @(posedge clk)
+ if (rst)
+ begin
+ count <= 1;
+ delayed_fall <= 1;
+ end
+ else if (full_deasserts)
+ begin
+ count <= shift_reg;
+ delayed_fall <= 1;
+ end
+ else if (count == 1)
+ begin
+ count <= 1;
+ delayed_fall <= 0;
+ end
+ else
+ begin
+ count <= count - 1;
+ delayed_fall <= 1;
+ end
+
+ // Full_out goes instantly high if full_in does. However its fall is delayed.
+ assign full_out = (full_in == 1) || (full_last == 1) || delayed_fall;
+
+endmodule \ No newline at end of file
diff --git a/fpga/usrp2/extramfifo/test_sram_if.v b/fpga/usrp2/extramfifo/test_sram_if.v
new file mode 100644
index 000000000..0e74b49eb
--- /dev/null
+++ b/fpga/usrp2/extramfifo/test_sram_if.v
@@ -0,0 +1,175 @@
+// Instantiate this block at the core level to conduct closed
+// loop testing of the AC performance of the USRP2 SRAM interface
+
+
+`define WIDTH 18
+`define DEPTH 19
+
+module test_sram_if
+ (
+ input clk,
+ input rst,
+ input [`WIDTH-1:0] RAM_D_pi,
+ output [`WIDTH-1:0] RAM_D_po,
+ output RAM_D_poe,
+ output [`DEPTH-1:0] RAM_A,
+ output RAM_WEn,
+ output RAM_CENn,
+ output RAM_LDn,
+ output RAM_OEn,
+ output RAM_CE1n,
+ output reg correct
+ );
+
+ reg [`DEPTH-1:0] write_count;
+ reg [`DEPTH-1:0] read_count;
+ reg enable;
+ reg write;
+ reg write_cycle;
+ reg read_cycle;
+ reg enable_reads;
+ reg [18:0] address;
+ reg [17:0] data_out;
+ wire [17:0] data_in;
+ wire data_in_valid;
+
+ reg [17:0] check_data;
+ reg [17:0] check_data_old;
+ reg [17:0] check_data_old2;
+
+ //
+ // Create counter that generates both external modulo 2^19 address and modulo 2^18 data to test RAM.
+ //
+
+ always @(posedge clk)
+ if (rst)
+ begin
+ write_count <= 19'h0;
+ read_count <= 19'h0;
+ end
+ else if (write_cycle) // Write cycle
+ if (write_count == 19'h7FFFF)
+ begin
+ write_count <= 19'h0;
+ end
+ else
+ begin
+ write_count <= write_count + 1'b1;
+ end
+ else if (read_cycle) // Read cycle
+ if (read_count == 19'h7FFFF)
+ begin
+ read_count <= 19'h0;
+ end
+ else
+ begin
+ read_count <= read_count + 1'b1;
+ end
+
+ always @(posedge clk)
+ if (rst)
+ begin
+ enable_reads <= 0;
+ read_cycle <= 0;
+ write_cycle <= 0;
+ end
+ else
+ begin
+ write_cycle <= ~write_cycle;
+ if (enable_reads)
+ read_cycle <= write_cycle;
+ if (write_count == 15) // Enable reads 15 writes after reset terminates.
+ enable_reads <= 1;
+ end // else: !if(rst)
+
+ always @(posedge clk)
+ if (rst)
+ begin
+ enable <= 0;
+ end
+ else if (write_cycle)
+ begin
+ address <= write_count;
+ data_out <= write_count[17:0];
+ enable <= 1;
+ write <= 1;
+ end
+ else if (read_cycle)
+ begin
+ address <= read_count;
+ check_data <= read_count[17:0];
+ check_data_old <= check_data;
+ check_data_old2 <= check_data_old;
+ enable <= 1;
+ write <= 0;
+ end
+ else
+ enable <= 0;
+
+ always @(posedge clk)
+ if (data_in_valid)
+ begin
+ correct <= (data_in == check_data_old2);
+ end
+
+
+ nobl_if nobl_if_i1
+ (
+ .clk(clk),
+ .rst(rst),
+ .RAM_D_pi(RAM_D_pi),
+ .RAM_D_po(RAM_D_po),
+ .RAM_D_poe(RAM_D_poe),
+ .RAM_A(RAM_A),
+ .RAM_WEn(RAM_WEn),
+ .RAM_CENn(RAM_CENn),
+ .RAM_LDn(RAM_LDn),
+ .RAM_OEn(RAM_OEn),
+ .RAM_CE1n(RAM_CE1n),
+ .address(address),
+ .data_out(data_out),
+ .data_in(data_in),
+ .data_in_valid(data_in_valid),
+ .write(write),
+ .enable(enable)
+ );
+
+
+ wire [35:0] CONTROL0;
+ reg [7:0] data_in_reg, data_out_reg, address_reg;
+ reg data_in_valid_reg,write_reg,enable_reg,correct_reg;
+
+ always @(posedge clk)
+ begin
+ data_in_reg <= data_in[7:0];
+ data_out_reg <= data_out[7:0];
+ data_in_valid_reg <= data_in_valid;
+ write_reg <= write;
+ enable_reg <= enable;
+ correct_reg <= correct;
+ address_reg <= address;
+
+ end
+
+
+ icon icon_i1
+ (
+ .CONTROL0(CONTROL0)
+ );
+
+ ila ila_i1
+ (
+ .CLK(clk),
+ .CONTROL(CONTROL0),
+ // .TRIG0(address_reg),
+ .TRIG0(data_in_reg[7:0]),
+ .TRIG1(data_out_reg[7:0]),
+ .TRIG2(address_reg[7:0]),
+ .TRIG3({data_in_valid_reg,write_reg,enable_reg,correct_reg})
+ );
+
+
+
+endmodule // test_sram_if
+
+ \ No newline at end of file
diff --git a/fpga/usrp2/fifo/.gitignore b/fpga/usrp2/fifo/.gitignore
index cba7efc8e..866f1faad 100644
--- a/fpga/usrp2/fifo/.gitignore
+++ b/fpga/usrp2/fifo/.gitignore
@@ -1 +1,3 @@
+*.vcd
+*.lxt
a.out
diff --git a/fpga/usrp2/fifo/fifo18_to_fifo36.v b/fpga/usrp2/fifo/fifo18_to_fifo36.v
new file mode 100644
index 000000000..25bb215a1
--- /dev/null
+++ b/fpga/usrp2/fifo/fifo18_to_fifo36.v
@@ -0,0 +1,20 @@
+
+// For now just assume FIFO18 is same as FIFO19 without occupancy bit
+
+module fifo18_to_fifo36
+ (input clk, input reset, input clear,
+ input [17:0] f18_datain,
+ input f18_src_rdy_i,
+ output f18_dst_rdy_o,
+
+ output [35:0] f36_dataout,
+ output f36_src_rdy_o,
+ input f36_dst_rdy_i
+ );
+
+ fifo19_to_fifo36 fifo19_to_fifo36
+ (.clk(clk), .reset(reset), .clear(clear),
+ .f19_datain({1'b0,f18_datain}), .f19_src_rdy_i(f18_src_rdy_i), .f19_dst_rdy_o(f18_dst_rdy_o),
+ .f36_dataout(f36_dataout), .f36_src_rdy_o(f36_src_rdy_o), .f36_dst_rdy_i(f36_dst_rdy_i) );
+
+endmodule // fifo18_to_fifo36
diff --git a/fpga/usrp2/fifo/fifo19_to_fifo36.v b/fpga/usrp2/fifo/fifo19_to_fifo36.v
index 5f9aeff9b..2f530109f 100644
--- a/fpga/usrp2/fifo/fifo19_to_fifo36.v
+++ b/fpga/usrp2/fifo/fifo19_to_fifo36.v
@@ -1,26 +1,32 @@
+// Parameter LE tells us if we are little-endian.
+// Little-endian means send lower 16 bits first.
+// Default is big endian (network order), send upper bits first.
+
module fifo19_to_fifo36
- (input clk, input reset, input clear,
- input [18:0] f19_datain,
- input f19_src_rdy_i,
- output f19_dst_rdy_o,
+ #(parameter LE=0)
+ (input clk, input reset, input clear,
+ input [18:0] f19_datain,
+ input f19_src_rdy_i,
+ output f19_dst_rdy_o,
- output [35:0] f36_dataout,
- output f36_src_rdy_o,
- input f36_dst_rdy_i,
- output [31:0] debug
- );
+ output [35:0] f36_dataout,
+ output f36_src_rdy_o,
+ input f36_dst_rdy_i,
+ output [31:0] debug
+ );
- reg f36_sof, f36_eof, f36_occ;
+ reg f36_sof, f36_eof;
+ reg [1:0] f36_occ;
- reg [1:0] state;
- reg [15:0] dat0, dat1;
+ reg [1:0] state;
+ reg [15:0] dat0, dat1;
- wire f19_sof = f19_datain[16];
- wire f19_eof = f19_datain[17];
- wire f19_occ = f19_datain[18];
+ wire f19_sof = f19_datain[16];
+ wire f19_eof = f19_datain[17];
+ wire f19_occ = f19_datain[18];
- wire xfer_out = f36_src_rdy_o & f36_dst_rdy_i;
+ wire xfer_out = f36_src_rdy_o & f36_dst_rdy_i;
always @(posedge clk)
if(f19_src_rdy_i & ((state==0)|xfer_out))
@@ -68,7 +74,8 @@ module fifo19_to_fifo36
dat0 <= f19_datain;
assign f19_dst_rdy_o = xfer_out | (state != 2);
- assign f36_dataout = {f36_occ,f36_eof,f36_sof,dat0,dat1};
+ assign f36_dataout = LE ? {f36_occ,f36_eof,f36_sof,dat1,dat0} :
+ {f36_occ,f36_eof,f36_sof,dat0,dat1};
assign f36_src_rdy_o = (state == 2);
assign debug = state;
diff --git a/fpga/usrp2/fifo/fifo36_mux.v b/fpga/usrp2/fifo/fifo36_mux.v
index 92bf13ff9..c6fd40f27 100644
--- a/fpga/usrp2/fifo/fifo36_mux.v
+++ b/fpga/usrp2/fifo/fifo36_mux.v
@@ -20,6 +20,9 @@ module fifo36_mux
wire eof0 = data0_i[33];
wire eof1 = data1_i[33];
+ wire [35:0] data_int;
+ wire src_rdy_int, dst_rdy_int;
+
always @(posedge clk)
if(reset | clear)
state <= MUX_IDLE0;
@@ -32,7 +35,7 @@ module fifo36_mux
state <= MUX_DATA1;
MUX_DATA0 :
- if(src0_rdy_i & dst_rdy_i & eof0)
+ if(src0_rdy_i & dst_rdy_int & eof0)
state <= prio ? MUX_IDLE0 : MUX_IDLE1;
MUX_IDLE1 :
@@ -42,16 +45,20 @@ module fifo36_mux
state <= MUX_DATA0;
MUX_DATA1 :
- if(src1_rdy_i & dst_rdy_i & eof1)
+ if(src1_rdy_i & dst_rdy_int & eof1)
state <= MUX_IDLE0;
default :
state <= MUX_IDLE0;
endcase // case (state)
- assign dst0_rdy_o = (state==MUX_DATA0) ? dst_rdy_i : 0;
- assign dst1_rdy_o = (state==MUX_DATA1) ? dst_rdy_i : 0;
- assign src_rdy_o = (state==MUX_DATA0) ? src0_rdy_i : (state==MUX_DATA1) ? src1_rdy_i : 0;
- assign data_o = (state==MUX_DATA0) ? data0_i : data1_i;
+ assign dst0_rdy_o = (state==MUX_DATA0) ? dst_rdy_int : 0;
+ assign dst1_rdy_o = (state==MUX_DATA1) ? dst_rdy_int : 0;
+ assign src_rdy_int = (state==MUX_DATA0) ? src0_rdy_i : (state==MUX_DATA1) ? src1_rdy_i : 0;
+ assign data_int = (state==MUX_DATA0) ? data0_i : data1_i;
+ fifo_short #(.WIDTH(36)) mux_fifo
+ (.clk(clk), .reset(reset), .clear(clear),
+ .datain(data_int), .src_rdy_i(src_rdy_int), .dst_rdy_o(dst_rdy_int),
+ .dataout(data_o), .src_rdy_o(src_rdy_o), .dst_rdy_i(dst_rdy_i));
endmodule // fifo36_demux
diff --git a/fpga/usrp2/fifo/fifo36_to_fifo18.v b/fpga/usrp2/fifo/fifo36_to_fifo18.v
deleted file mode 100644
index b636ab9ca..000000000
--- a/fpga/usrp2/fifo/fifo36_to_fifo18.v
+++ /dev/null
@@ -1,40 +0,0 @@
-
-module fifo36_to_fifo18
- (input clk, input reset, input clear,
- input [35:0] f36_datain,
- input f36_src_rdy_i,
- output f36_dst_rdy_o,
-
- output [17:0] f18_dataout,
- output f18_src_rdy_o,
- input f18_dst_rdy_i );
-
- wire f36_sof = f36_datain[32];
- wire f36_eof = f36_datain[33];
- wire f36_occ = f36_datain[35:34];
-
- reg phase;
-
- wire half_line = f36_eof & ((f36_occ==1)|(f36_occ==2));
-
- assign f18_dataout[15:0] = phase ? f36_datain[15:0] : f36_datain[31:16];
- assign f18_dataout[16] = phase ? 0 : f36_sof;
- assign f18_dataout[17] = phase ? f36_eof : half_line;
-
- assign f18_src_rdy_o = f36_src_rdy_i;
- assign f36_dst_rdy_o = (phase | half_line) & f18_dst_rdy_i;
-
- wire f18_xfer = f18_src_rdy_o & f18_dst_rdy_i;
- wire f36_xfer = f36_src_rdy_i & f36_dst_rdy_o;
-
- always @(posedge clk)
- if(reset)
- phase <= 0;
- else if(f36_xfer)
- phase <= 0;
- else if(f18_xfer)
- phase <= 1;
-
-
-endmodule // fifo36_to_fifo18
-
diff --git a/fpga/usrp2/fifo/fifo36_to_fifo19.v b/fpga/usrp2/fifo/fifo36_to_fifo19.v
index de249aaeb..517a2a476 100644
--- a/fpga/usrp2/fifo/fifo36_to_fifo19.v
+++ b/fpga/usrp2/fifo/fifo36_to_fifo19.v
@@ -1,33 +1,38 @@
-module fifo36_to_fifo19
- (input clk, input reset, input clear,
- input [35:0] f36_datain,
- input f36_src_rdy_i,
- output f36_dst_rdy_o,
-
- output [18:0] f19_dataout,
- output f19_src_rdy_o,
- input f19_dst_rdy_i );
+// Parameter LE tells us if we are little-endian.
+// Little-endian means send lower 16 bits first.
+// Default is big endian (network order), send upper bits first.
+module fifo36_to_fifo19
+ #(parameter LE=0)
+ (input clk, input reset, input clear,
+ input [35:0] f36_datain,
+ input f36_src_rdy_i,
+ output f36_dst_rdy_o,
+
+ output [18:0] f19_dataout,
+ output f19_src_rdy_o,
+ input f19_dst_rdy_i );
+
wire f36_sof = f36_datain[32];
wire f36_eof = f36_datain[33];
wire f36_occ = f36_datain[35:34];
-
- reg phase;
-
- wire half_line = f36_eof & ((f36_occ==1)|(f36_occ==2));
- assign f19_dataout[15:0] = phase ? f36_datain[15:0] : f36_datain[31:16];
+ reg phase;
+
+ wire half_line = f36_eof & ((f36_occ==1)|(f36_occ==2));
+
+ assign f19_dataout[15:0] = (LE ^ phase) ? f36_datain[15:0] : f36_datain[31:16];
assign f19_dataout[16] = phase ? 0 : f36_sof;
assign f19_dataout[17] = phase ? f36_eof : half_line;
assign f19_dataout[18] = f19_dataout[17] & ((f36_occ==1)|(f36_occ==3));
assign f19_src_rdy_o = f36_src_rdy_i;
assign f36_dst_rdy_o = (phase | half_line) & f19_dst_rdy_i;
-
- wire f19_xfer = f19_src_rdy_o & f19_dst_rdy_i;
- wire f36_xfer = f36_src_rdy_i & f36_dst_rdy_o;
-
+
+ wire f19_xfer = f19_src_rdy_o & f19_dst_rdy_i;
+ wire f36_xfer = f36_src_rdy_i & f36_dst_rdy_o;
+
always @(posedge clk)
if(reset)
phase <= 0;
@@ -36,6 +41,5 @@ module fifo36_to_fifo19
else if(f19_xfer)
phase <= 1;
-
+
endmodule // fifo36_to_fifo19
-
diff --git a/fpga/usrp2/fifo/fifo36_to_ll8.v b/fpga/usrp2/fifo/fifo36_to_ll8.v
index 0dee1dfc6..9604d0e38 100644
--- a/fpga/usrp2/fifo/fifo36_to_ll8.v
+++ b/fpga/usrp2/fifo/fifo36_to_ll8.v
@@ -55,6 +55,5 @@ module fifo36_to_ll8
assign advance = ll_src_rdy & ll_dst_rdy;
assign f36_dst_rdy_o = advance & ((state==3)|ll_eof);
- assign debug = state;
endmodule // ll8_to_fifo36
diff --git a/fpga/usrp2/fifo/fifo_2clock_cascade.v b/fpga/usrp2/fifo/fifo_2clock_cascade.v
index 5ce726977..4e8c244c2 100644
--- a/fpga/usrp2/fifo/fifo_2clock_cascade.v
+++ b/fpga/usrp2/fifo/fifo_2clock_cascade.v
@@ -1,8 +1,10 @@
module fifo_2clock_cascade
#(parameter WIDTH=32, SIZE=9)
- (input wclk, input [WIDTH-1:0] datain, input src_rdy_i, output dst_rdy_o, output [15:0] space,
- input rclk, output [WIDTH-1:0] dataout, output src_rdy_o, input dst_rdy_i, output [15:0] occupied,
+ (input wclk, input [WIDTH-1:0] datain, input src_rdy_i, output dst_rdy_o,
+ output [15:0] space, output [15:0] short_space,
+ input rclk, output [WIDTH-1:0] dataout, output src_rdy_o, input dst_rdy_i,
+ output [15:0] occupied, output [15:0] short_occupied,
input arst);
wire [WIDTH-1:0] data_int1, data_int2;
@@ -29,7 +31,11 @@ module fifo_2clock_cascade
.space(s2_space), .occupied(s2_occupied));
// Be conservative -- Only advertise space from input side of fifo, occupied from output side
- assign space = {11'b0,s1_space} + l_space;
- assign occupied = {11'b0,s2_occupied} + l_occupied;
+ assign space = {11'b0,s1_space} + l_space;
+ assign occupied = {11'b0,s2_occupied} + l_occupied;
+
+ // For the fifo_extram, we only want to know the immediately adjacent space
+ assign short_space = {11'b0,s1_space};
+ assign short_occupied = {11'b0,s2_occupied};
endmodule // fifo_2clock_cascade
diff --git a/fpga/usrp2/gpmc/.gitignore b/fpga/usrp2/gpmc/.gitignore
new file mode 100644
index 000000000..3e14fa4f7
--- /dev/null
+++ b/fpga/usrp2/gpmc/.gitignore
@@ -0,0 +1,2 @@
+*.gif
+
diff --git a/fpga/usrp2/gpmc/Makefile.srcs b/fpga/usrp2/gpmc/Makefile.srcs
new file mode 100644
index 000000000..bff6ae3e0
--- /dev/null
+++ b/fpga/usrp2/gpmc/Makefile.srcs
@@ -0,0 +1,20 @@
+#
+# Copyright 2010 Ettus Research LLC
+#
+
+##################################################
+# SERDES Sources
+##################################################
+GPMC_SRCS = $(abspath $(addprefix $(BASE_DIR)/../gpmc/, \
+dbsm.v \
+edge_sync.v \
+fifo_to_gpmc_async.v \
+fifo_to_gpmc_sync.v \
+fifo_watcher.v \
+gpmc_async.v \
+gpmc_sync.v \
+gpmc_to_fifo_async.v \
+gpmc_to_fifo_sync.v \
+gpmc_wb.v \
+ram_to_fifo.v \
+))
diff --git a/fpga/usrp2/gpmc/burst_data_write.txt b/fpga/usrp2/gpmc/burst_data_write.txt
new file mode 100644
index 000000000..3b5dfc785
--- /dev/null
+++ b/fpga/usrp2/gpmc/burst_data_write.txt
@@ -0,0 +1,16 @@
+# OMAP burst writes to FPGA
+
+CLK=0,nWE=1,nCS=1,nOE=1,DATA=Z.
+CLK=1.
+CLK=0,nWE=0,nCS=0,DATA=WR_DATA1.
+CLK=1.
+CLK=0,nWE=0,nCS=0,DATA=WR_DATA2.
+CLK=1.
+CLK=0,nWE=0,nCS=0,DATA=WR_DATA3.
+CLK=1.
+CLK=0,nWE=0,nCS=0,DATA=WR_DATA4.
+CLK=1.
+CLK=0,nWE=1,nCS=1,DATA=Z.
+CLK=1.
+
+
diff --git a/fpga/usrp2/gpmc/dbsm.v b/fpga/usrp2/gpmc/dbsm.v
new file mode 100644
index 000000000..530af7205
--- /dev/null
+++ b/fpga/usrp2/gpmc/dbsm.v
@@ -0,0 +1,80 @@
+
+module bsm
+ (input clk, input reset, input clear,
+ input write_done,
+ input read_done,
+ output readable,
+ output writeable);
+
+ reg state;
+ localparam ST_WRITEABLE = 0;
+ localparam ST_READABLE = 1;
+
+ always @(posedge clk)
+ if(reset | clear)
+ state <= ST_WRITEABLE;
+ else
+ case(state)
+ ST_WRITEABLE :
+ if(write_done)
+ state <= ST_READABLE;
+ ST_READABLE :
+ if(read_done)
+ state <= ST_WRITEABLE;
+ endcase // case (state)
+
+ assign readable = (state == ST_READABLE);
+ assign writeable = (state == ST_WRITEABLE);
+
+endmodule // bsm
+
+module dbsm
+ (input clk, input reset, input clear,
+ output reg read_sel, output read_ready, input read_done,
+ output reg write_sel, output write_ready, input write_done);
+
+ localparam NUM_BUFS = 2;
+
+ wire [NUM_BUFS-1:0] readable, writeable, read_done_buf, write_done_buf;
+
+ // Two of these buffer state machines
+ genvar i;
+ generate
+ for(i=0;i<NUM_BUFS;i=i+1)
+ begin : BSMS
+ bsm bsm(.clk(clk), .reset(reset), .clear(clear),
+ .write_done((write_sel == i) & write_done),
+ .read_done((read_sel == i) & read_done),
+ .readable(readable[i]), .writeable(writeable[i]));
+ end
+ endgenerate
+
+ reg full;
+
+ always @(posedge clk)
+ if(reset | clear)
+ begin
+ write_sel <= 0;
+ full <= 0;
+ end
+ else
+ if(write_done & writeable[write_sel])
+ if(write_sel ==(NUM_BUFS-1))
+ write_sel <= 0;
+ else
+ write_sel <= write_sel + 1;
+
+ always @(posedge clk)
+ if(reset | clear)
+ read_sel <= 0;
+ else
+ if(read_done & readable[read_sel])
+ if(read_sel==(NUM_BUFS-1))
+ read_sel <= 0;
+ else
+ read_sel <= read_sel + 1;
+
+ assign write_ready = writeable[write_sel];
+ assign read_ready = readable[read_sel];
+
+endmodule // dbsm
diff --git a/fpga/usrp2/gpmc/edge_sync.v b/fpga/usrp2/gpmc/edge_sync.v
new file mode 100644
index 000000000..5d9417c08
--- /dev/null
+++ b/fpga/usrp2/gpmc/edge_sync.v
@@ -0,0 +1,22 @@
+
+
+module edge_sync
+ #(parameter POSEDGE = 1)
+ (input clk,
+ input rst,
+ input sig,
+ output trig);
+
+ reg [1:0] delay;
+
+ always @(posedge clk)
+ if(rst)
+ delay <= 2'b00;
+ else
+ delay <= {delay[0],sig};
+
+ assign trig = POSEDGE ? (delay==2'b01) : (delay==2'b10);
+
+endmodule // edge_sync
+
+
diff --git a/fpga/usrp2/gpmc/fifo_to_gpmc_async.v b/fpga/usrp2/gpmc/fifo_to_gpmc_async.v
new file mode 100644
index 000000000..cf8b6e861
--- /dev/null
+++ b/fpga/usrp2/gpmc/fifo_to_gpmc_async.v
@@ -0,0 +1,37 @@
+
+// Assumes an asynchronous GPMC cycle
+// If a packet bigger or smaller than we are told is sent, behavior is undefined.
+// If dst_rdy_i is low when we get data, behavior is undefined and we signal bus error.
+// If there is a bus error, we should be reset
+
+module fifo_to_gpmc_async
+ (input clk, input reset, input clear,
+ input [17:0] data_i, input src_rdy_i, output dst_rdy_o,
+ output [15:0] EM_D, input EM_NCS, input EM_NOE,
+ input [15:0] frame_len);
+
+ // Synchronize the async control signals
+ reg [2:0] cs_del, oe_del;
+ reg [15:0] counter;
+
+ always @(posedge clk)
+ if(reset)
+ begin
+ cs_del <= 3'b11;
+ oe_del <= 3'b11;
+ end
+ else
+ begin
+ cs_del <= { cs_del[1:0], EM_NCS };
+ oe_del <= { oe_del[1:0], EM_NOE };
+ end
+
+ wire do_read = ( (~cs_del[1] | ~cs_del[2]) & (oe_del[1:0] == 2'b01)); // change output on trailing edge
+ wire first_read = (counter == 0);
+ wire last_read = ((counter+1) == frame_len);
+
+ assign EM_D = data_i[15:0];
+
+ assign dst_rdy_o = do_read;
+
+endmodule // fifo_to_gpmc_async
diff --git a/fpga/usrp2/gpmc/fifo_to_gpmc_sync.v b/fpga/usrp2/gpmc/fifo_to_gpmc_sync.v
new file mode 100644
index 000000000..ef59d7137
--- /dev/null
+++ b/fpga/usrp2/gpmc/fifo_to_gpmc_sync.v
@@ -0,0 +1,26 @@
+
+// Assumes a GPMC cycle with GPMC clock, as in the timing diagrams
+// If a packet bigger or smaller than we are told is sent, behavior is undefined.
+// If dst_rdy_i is low when we get data, behavior is undefined and we signal bus error.
+// If there is a bus error, we should be reset
+
+module fifo_to_gpmc_sync
+ (input arst,
+ input [17:0] data_i, input src_rdy_i, output dst_rdy_o,
+ input EM_CLK, output [15:0] EM_D, input EM_NCS, input EM_NOE,
+ output fifo_ready,
+ output reg bus_error);
+
+ assign EM_D = data_i[15:0];
+ wire read_access = ~EM_NCS & ~EM_NOE;
+
+ assign dst_rdy_o = read_access;
+
+ always @(posedge EM_CLK or posedge arst)
+ if(arst)
+ bus_error <= 0;
+ else if(dst_rdy_o & ~src_rdy_i)
+ bus_error <= 1;
+
+
+endmodule // fifo_to_gpmc_sync
diff --git a/fpga/usrp2/gpmc/fifo_watcher.v b/fpga/usrp2/gpmc/fifo_watcher.v
new file mode 100644
index 000000000..fe4e35de3
--- /dev/null
+++ b/fpga/usrp2/gpmc/fifo_watcher.v
@@ -0,0 +1,56 @@
+
+
+module fifo_watcher
+ (input clk, input reset, input clear,
+ input src_rdy1, input dst_rdy1, input sof1, input eof1,
+ input src_rdy2, input dst_rdy2, input sof2, input eof2,
+ output reg have_packet, output [15:0] length, output reg bus_error,
+ output [31:0] debug);
+
+ wire write = src_rdy1 & dst_rdy1 & eof1;
+ wire read = src_rdy2 & dst_rdy2 & eof2;
+ wire have_packet_int;
+ reg [15:0] counter;
+ wire [4:0] pkt_count;
+ assign debug = pkt_count;
+
+ fifo_short #(.WIDTH(16)) frame_lengths
+ (.clk(clk), .reset(reset), .clear(clear),
+ .datain(counter), .src_rdy_i(write), .dst_rdy_o(),
+ .dataout(length), .src_rdy_o(have_packet_int), .dst_rdy_i(read),
+ .occupied(pkt_count), .space());
+
+ always @(posedge clk)
+ if(reset | clear)
+ counter <= 1; // Start at 1
+ else if(src_rdy1 & dst_rdy1)
+ if(eof1)
+ counter <= 1;
+ else
+ counter <= counter + 1;
+
+ always @(posedge clk)
+ if(reset | clear)
+ bus_error <= 0;
+ else if(dst_rdy2 & ~src_rdy2)
+ bus_error <= 1;
+ else if(read & ~have_packet_int)
+ bus_error <= 1;
+
+ reg in_packet;
+ always @(posedge clk)
+ if(reset | clear)
+ have_packet <= 0;
+ else
+ have_packet <= (have_packet_int & ~in_packet) | (pkt_count>1) ;
+
+ always @(posedge clk)
+ if(reset | clear)
+ in_packet <= 0;
+ else if(src_rdy2 & dst_rdy2)
+ if(eof2)
+ in_packet <= 0;
+ else
+ in_packet <= 1;
+
+endmodule // fifo_watcher
diff --git a/fpga/usrp2/gpmc/gpmc_async.v b/fpga/usrp2/gpmc/gpmc_async.v
new file mode 100644
index 000000000..23bad56ae
--- /dev/null
+++ b/fpga/usrp2/gpmc/gpmc_async.v
@@ -0,0 +1,130 @@
+//////////////////////////////////////////////////////////////////////////////////
+
+module gpmc_async
+ #(parameter TXFIFOSIZE = 11, parameter RXFIFOSIZE = 11)
+ (// GPMC signals
+ input arst,
+ input EM_CLK, inout [15:0] EM_D, input [10:1] EM_A, input [1:0] EM_NBE,
+ input EM_WAIT0, input EM_NCS4, input EM_NCS6, input EM_NWE, input EM_NOE,
+
+ // GPIOs for FIFO signalling
+ output rx_have_data, output tx_have_space, output reg bus_error, input bus_reset,
+
+ // Wishbone signals
+ input wb_clk, input wb_rst,
+ output [10:0] wb_adr_o, output [15:0] wb_dat_mosi, input [15:0] wb_dat_miso,
+ output [1:0] wb_sel_o, output wb_cyc_o, output wb_stb_o, output wb_we_o, input wb_ack_i,
+
+ // FIFO interface
+ input fifo_clk, input fifo_rst, input clear_tx, input clear_rx,
+ output [35:0] tx_data_o, output tx_src_rdy_o, input tx_dst_rdy_i,
+ input [35:0] rx_data_i, input rx_src_rdy_i, output rx_dst_rdy_o,
+
+ input [15:0] tx_frame_len, output [15:0] rx_frame_len,
+
+ output [31:0] debug
+ );
+
+ wire EM_output_enable = (~EM_NOE & (~EM_NCS4 | ~EM_NCS6));
+ wire [15:0] EM_D_fifo;
+ wire [15:0] EM_D_wb;
+
+ assign EM_D = ~EM_output_enable ? 16'bz : ~EM_NCS4 ? EM_D_fifo : EM_D_wb;
+
+ wire bus_error_tx, bus_error_rx;
+
+ always @(posedge fifo_clk)
+ if(fifo_rst | clear_tx | clear_rx)
+ bus_error <= 0;
+ else
+ bus_error <= bus_error_tx | bus_error_rx;
+
+ // CS4 is RAM_2PORT for DATA PATH (high-speed data)
+ // Writes go into one RAM, reads come from the other
+ // CS6 is for CONTROL PATH (wishbone)
+
+ // ////////////////////////////////////////////
+ // TX Data Path
+
+ wire [17:0] tx18_data, tx18b_data;
+ wire tx18_src_rdy, tx18_dst_rdy, tx18b_src_rdy, tx18b_dst_rdy;
+ wire [15:0] tx_fifo_space;
+ wire [35:0] tx36_data;
+ wire tx36_src_rdy, tx36_dst_rdy;
+
+ gpmc_to_fifo_async gpmc_to_fifo_async
+ (.EM_D(EM_D), .EM_NBE(EM_NBE), .EM_NCS(EM_NCS4), .EM_NWE(EM_NWE),
+ .fifo_clk(fifo_clk), .fifo_rst(fifo_rst), .clear(clear_tx),
+ .data_o(tx18_data), .src_rdy_o(tx18_src_rdy), .dst_rdy_i(tx18_dst_rdy),
+ .frame_len(tx_frame_len), .fifo_space(tx_fifo_space), .fifo_ready(tx_have_space),
+ .bus_error(bus_error_tx) );
+
+ fifo_cascade #(.WIDTH(18), .SIZE(10)) tx_fifo
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx),
+ .datain(tx18_data), .src_rdy_i(tx18_src_rdy), .dst_rdy_o(tx18_dst_rdy), .space(tx_fifo_space),
+ .dataout(tx18b_data), .src_rdy_o(tx18b_src_rdy), .dst_rdy_i(tx18b_dst_rdy), .occupied());
+
+ fifo19_to_fifo36 #(.LE(1)) f19_to_f36 // Little endian because ARM is LE
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_tx),
+ .f19_datain({1'b0,tx18b_data}), .f19_src_rdy_i(tx18b_src_rdy), .f19_dst_rdy_o(tx18b_dst_rdy),
+ .f36_dataout(tx36_data), .f36_src_rdy_o(tx36_src_rdy), .f36_dst_rdy_i(tx36_dst_rdy));
+
+ fifo_cascade #(.WIDTH(36), .SIZE(TXFIFOSIZE)) tx_fifo36
+ (.clk(wb_clk), .reset(wb_rst), .clear(clear_tx),
+ .datain(tx36_data), .src_rdy_i(tx36_src_rdy), .dst_rdy_o(tx36_dst_rdy),
+ .dataout(tx_data_o), .src_rdy_o(tx_src_rdy_o), .dst_rdy_i(tx_dst_rdy_i));
+
+ // ////////////////////////////////////////////
+ // RX Data Path
+
+ wire [17:0] rx18_data, rx18b_data;
+ wire rx18_src_rdy, rx18_dst_rdy, rx18b_src_rdy, rx18b_dst_rdy;
+ wire [15:0] rx_fifo_space;
+ wire [35:0] rx36_data;
+ wire rx36_src_rdy, rx36_dst_rdy;
+ wire dummy;
+
+ fifo_cascade #(.WIDTH(36), .SIZE(RXFIFOSIZE)) rx_fifo36
+ (.clk(wb_clk), .reset(wb_rst), .clear(clear_rx),
+ .datain(rx_data_i), .src_rdy_i(rx_src_rdy_i), .dst_rdy_o(rx_dst_rdy_o),
+ .dataout(rx36_data), .src_rdy_o(rx36_src_rdy), .dst_rdy_i(rx36_dst_rdy));
+
+ fifo36_to_fifo19 #(.LE(1)) f36_to_f19 // Little endian because ARM is LE
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
+ .f36_datain(rx36_data), .f36_src_rdy_i(rx36_src_rdy), .f36_dst_rdy_o(rx36_dst_rdy),
+ .f19_dataout({dummy,rx18_data}), .f19_src_rdy_o(rx18_src_rdy), .f19_dst_rdy_i(rx18_dst_rdy) );
+
+ fifo_cascade #(.WIDTH(18), .SIZE(12)) rx_fifo
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
+ .datain(rx18_data), .src_rdy_i(rx18_src_rdy), .dst_rdy_o(rx18_dst_rdy), .space(rx_fifo_space),
+ .dataout(rx18b_data), .src_rdy_o(rx18b_src_rdy), .dst_rdy_i(rx18b_dst_rdy), .occupied());
+
+ fifo_to_gpmc_async fifo_to_gpmc_async
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
+ .data_i(rx18b_data), .src_rdy_i(rx18b_src_rdy), .dst_rdy_o(rx18b_dst_rdy),
+ .EM_D(EM_D_fifo), .EM_NCS(EM_NCS4), .EM_NOE(EM_NOE),
+ .frame_len(rx_frame_len) );
+
+ wire [31:0] pkt_count;
+
+ fifo_watcher fifo_watcher
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(clear_rx),
+ .src_rdy1(rx18_src_rdy), .dst_rdy1(rx18_dst_rdy), .sof1(rx18_data[16]), .eof1(rx18_data[17]),
+ .src_rdy2(rx18b_src_rdy), .dst_rdy2(rx18b_dst_rdy), .sof2(rx18b_data[16]), .eof2(rx18b_data[17]),
+ .have_packet(rx_have_data), .length(rx_frame_len), .bus_error(bus_error_rx),
+ .debug(pkt_count));
+
+ // ////////////////////////////////////////////
+ // Control path on CS6
+
+ gpmc_wb gpmc_wb
+ (.EM_CLK(EM_CLK), .EM_D_in(EM_D), .EM_D_out(EM_D_wb), .EM_A(EM_A), .EM_NBE(EM_NBE),
+ .EM_NCS(EM_NCS6), .EM_NWE(EM_NWE), .EM_NOE(EM_NOE),
+ .wb_clk(wb_clk), .wb_rst(wb_rst),
+ .wb_adr_o(wb_adr_o), .wb_dat_mosi(wb_dat_mosi), .wb_dat_miso(wb_dat_miso),
+ .wb_sel_o(wb_sel_o), .wb_cyc_o(wb_cyc_o), .wb_stb_o(wb_stb_o), .wb_we_o(wb_we_o),
+ .wb_ack_i(wb_ack_i) );
+
+ assign debug = pkt_count;
+
+endmodule // gpmc_async
diff --git a/fpga/usrp2/gpmc/gpmc_sync.v b/fpga/usrp2/gpmc/gpmc_sync.v
new file mode 100644
index 000000000..61c54a793
--- /dev/null
+++ b/fpga/usrp2/gpmc/gpmc_sync.v
@@ -0,0 +1,108 @@
+//////////////////////////////////////////////////////////////////////////////////
+
+module gpmc_sync
+ (// GPMC signals
+ input arst,
+ input EM_CLK, inout [15:0] EM_D, input [10:1] EM_A, input [1:0] EM_NBE,
+ input EM_WAIT0, input EM_NCS4, input EM_NCS6, input EM_NWE, input EM_NOE,
+
+ // GPIOs for FIFO signalling
+ output rx_have_data, output tx_have_space, output bus_error, input bus_reset,
+
+ // Wishbone signals
+ input wb_clk, input wb_rst,
+ output [10:0] wb_adr_o, output [15:0] wb_dat_mosi, input [15:0] wb_dat_miso,
+ output [1:0] wb_sel_o, output wb_cyc_o, output wb_stb_o, output wb_we_o, input wb_ack_i,
+
+ // FIFO interface
+ input fifo_clk, input fifo_rst,
+ output [35:0] tx_data_o, output tx_src_rdy_o, input tx_dst_rdy_i,
+ input [35:0] rx_data_i, input rx_src_rdy_i, output rx_dst_rdy_o,
+
+ output [31:0] debug
+ );
+
+ wire EM_output_enable = (~EM_NOE & (~EM_NCS4 | ~EM_NCS6));
+ wire [15:0] EM_D_fifo;
+ wire [15:0] EM_D_wb;
+
+ assign EM_D = ~EM_output_enable ? 16'bz : ~EM_NCS4 ? EM_D_fifo : EM_D_wb;
+
+ wire bus_error_tx, bus_error_rx;
+ assign bus_error = bus_error_tx | bus_error_rx;
+
+ // CS4 is RAM_2PORT for DATA PATH (high-speed data)
+ // Writes go into one RAM, reads come from the other
+ // CS6 is for CONTROL PATH (wishbone)
+
+ // ////////////////////////////////////////////
+ // TX Data Path
+
+ wire [17:0] tx18_data, tx18b_data;
+ wire tx18_src_rdy, tx18_dst_rdy, tx18b_src_rdy, tx18b_dst_rdy;
+ wire [15:0] tx_fifo_space, tx_frame_len;
+
+ assign tx_frame_len = 10;
+
+ gpmc_to_fifo_sync gpmc_to_fifo_sync
+ (.arst(arst),
+ .EM_CLK(EM_CLK), .EM_D(EM_D), .EM_NBE(EM_NBE), .EM_NCS(EM_NCS4), .EM_NWE(EM_NWE),
+ .data_o(tx18_data), .src_rdy_o(tx18_src_rdy), .dst_rdy_i(tx18_dst_rdy),
+ .frame_len(tx_frame_len), .fifo_space(tx_fifo_space), .fifo_ready(tx_have_space),
+ .bus_error(bus_error_tx) );
+
+ fifo_2clock_cascade #(.WIDTH(18), .SIZE(4)) tx_fifo
+ (.wclk(EM_CLK), .datain(tx18_data),
+ .src_rdy_i(tx18_src_rdy), .dst_rdy_o(tx18_dst_rdy), .space(tx_fifo_space),
+ .rclk(fifo_clk), .dataout(tx18b_data),
+ .src_rdy_o(tx18b_src_rdy), .dst_rdy_i(tx18b_dst_rdy), .occupied(), .arst(arst));
+
+ fifo19_to_fifo36 #(.LE(1)) f19_to_f36 // Little endian because ARM is LE
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(0),
+ .f19_datain({1'b0,tx18b_data}), .f19_src_rdy_i(tx18b_src_rdy), .f19_dst_rdy_o(tx18b_dst_rdy),
+ .f36_dataout(tx_data_o), .f36_src_rdy_o(tx_src_rdy_o), .f36_dst_rdy_i(tx_dst_rdy_i));
+
+ // ////////////////////////////////////////////
+ // RX Data Path
+
+ wire [17:0] rx18_data, rx18b_data;
+ wire rx18_src_rdy, rx18_dst_rdy, rx18b_src_rdy, rx18b_dst_rdy;
+ wire [15:0] rx_fifo_space, rx_frame_len;
+ wire dummy;
+
+ fifo36_to_fifo19 #(.LE(1)) f36_to_f19 // Little endian because ARM is LE
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(0),
+ .f36_datain(rx_data_i), .f36_src_rdy_i(rx_src_rdy_i), .f36_dst_rdy_o(rx_dst_rdy_o),
+ .f19_dataout({dummy,rx18_data}), .f19_src_rdy_o(rx18_src_rdy), .f19_dst_rdy_i(rx18_dst_rdy) );
+
+ fifo_2clock_cascade #(.WIDTH(18), .SIZE(10)) rx_fifo
+ (.wclk(fifo_clk), .datain(rx18_data),
+ .src_rdy_i(rx18_src_rdy), .dst_rdy_o(rx18_dst_rdy), .space(rx_fifo_space),
+ .rclk(EM_CLK), .dataout(rx18b_data),
+ .src_rdy_o(rx18b_src_rdy), .dst_rdy_i(rx18b_dst_rdy), .occupied(), .arst(arst));
+
+ fifo_to_gpmc_sync fifo_to_gpmc_sync
+ (.arst(arst),
+ .data_i(rx18b_data), .src_rdy_i(rx18b_src_rdy), .dst_rdy_o(rx18b_dst_rdy),
+ .EM_CLK(EM_CLK), .EM_D(EM_D_fifo), .EM_NCS(EM_NCS4), .EM_NOE(EM_NOE),
+ .fifo_ready(rx_have_data) );
+
+ fifo_watcher fifo_watcher
+ (.clk(fifo_clk), .reset(fifo_rst), .clear(0),
+ .src_rdy(rx18_src_rdy), .dst_rdy(rx18_dst_rdy), .sof(rx18_data[16]), .eof(rx18_data[17]),
+ .have_packet(), .length(), .next() );
+
+ // ////////////////////////////////////////////
+ // Control path on CS6
+
+ gpmc_wb gpmc_wb
+ (.EM_CLK(EM_CLK), .EM_D_in(EM_D), .EM_D_out(EM_D_wb), .EM_A(EM_A), .EM_NBE(EM_NBE),
+ .EM_NCS(EM_NCS6), .EM_NWE(EM_NWE), .EM_NOE(EM_NOE),
+ .wb_clk(wb_clk), .wb_rst(wb_rst),
+ .wb_adr_o(wb_adr_o), .wb_dat_mosi(wb_dat_mosi), .wb_dat_miso(wb_dat_miso),
+ .wb_sel_o(wb_sel_o), .wb_cyc_o(wb_cyc_o), .wb_stb_o(wb_stb_o), .wb_we_o(wb_we_o),
+ .wb_ack_i(wb_ack_i) );
+
+ assign debug = 0;
+
+endmodule // gpmc_sync
diff --git a/fpga/usrp2/gpmc/gpmc_to_fifo_async.v b/fpga/usrp2/gpmc/gpmc_to_fifo_async.v
new file mode 100644
index 000000000..55c0cef50
--- /dev/null
+++ b/fpga/usrp2/gpmc/gpmc_to_fifo_async.v
@@ -0,0 +1,68 @@
+
+module gpmc_to_fifo_async
+ (input [15:0] EM_D, input [1:0] EM_NBE, input EM_NCS, input EM_NWE,
+
+ input fifo_clk, input fifo_rst, input clear,
+ output reg [17:0] data_o, output reg src_rdy_o, input dst_rdy_i,
+
+ input [15:0] frame_len, input [15:0] fifo_space, output reg fifo_ready,
+ output reg bus_error );
+
+ reg [15:0] counter;
+ // Synchronize the async control signals
+ reg [1:0] cs_del, we_del;
+ always @(posedge fifo_clk)
+ if(fifo_rst)
+ begin
+ cs_del <= 2'b11;
+ we_del <= 2'b11;
+ end
+ else
+ begin
+ cs_del <= { cs_del[0], EM_NCS };
+ we_del <= { we_del[0], EM_NWE };
+ end
+
+ wire do_write = (~cs_del[0] & (we_del == 2'b10));
+ wire first_write = (counter == 0);
+ wire last_write = ((counter+1) == frame_len);
+
+ always @(posedge fifo_clk)
+ if(do_write)
+ begin
+ data_o[15:0] <= EM_D;
+ data_o[16] <= first_write;
+ data_o[17] <= last_write;
+ // no byte writes data_o[18] <= |EM_NBE; // mark half full if either is not enabled FIXME
+ end
+
+ always @(posedge fifo_clk)
+ if(fifo_rst | clear)
+ src_rdy_o <= 0;
+ else if(do_write)
+ src_rdy_o <= 1;
+ else
+ src_rdy_o <= 0; // Assume it was taken
+
+ always @(posedge fifo_clk)
+ if(fifo_rst | clear)
+ counter <= 0;
+ else if(do_write)
+ if(last_write)
+ counter <= 0;
+ else
+ counter <= counter + 1;
+
+ always @(posedge fifo_clk)
+ if(fifo_rst | clear)
+ fifo_ready <= 0;
+ else
+ fifo_ready <= /* first_write & */ (fifo_space > 16'd1023);
+
+ always @(posedge fifo_clk)
+ if(fifo_rst | clear)
+ bus_error <= 0;
+ else if(src_rdy_o & ~dst_rdy_i)
+ bus_error <= 1;
+
+endmodule // gpmc_to_fifo_async
diff --git a/fpga/usrp2/gpmc/gpmc_to_fifo_sync.v b/fpga/usrp2/gpmc/gpmc_to_fifo_sync.v
new file mode 100644
index 000000000..688de0e17
--- /dev/null
+++ b/fpga/usrp2/gpmc/gpmc_to_fifo_sync.v
@@ -0,0 +1,57 @@
+
+// Assumes a GPMC cycle with GPMC clock, as in the timing diagrams
+// If a packet bigger or smaller than we are told is sent, behavior is undefined.
+// If dst_rdy_i is low when we get data, behavior is undefined and we signal bus error.
+// If there is a bus error, we should be reset
+
+module gpmc_to_fifo_sync
+ (input arst,
+ input EM_CLK, input [15:0] EM_D, input [1:0] EM_NBE,
+ input EM_NCS, input EM_NWE,
+ output reg [17:0] data_o, output reg src_rdy_o, input dst_rdy_i,
+ input [15:0] frame_len, input [15:0] fifo_space, output fifo_ready,
+ output reg bus_error);
+
+ reg [10:0] counter;
+ wire first_write = (counter == 0);
+ wire last_write = ((counter+1) == frame_len);
+ wire do_write = ~EM_NCS & ~EM_NWE;
+
+ always @(posedge EM_CLK or posedge arst)
+ if(arst)
+ data_o <= 0;
+ else if(do_write)
+ begin
+ data_o[15:0] <= EM_D;
+ data_o[16] <= first_write;
+ data_o[17] <= last_write;
+ // no byte writes data_o[18] <= |EM_NBE; // mark half full if either is not enabled FIXME
+ end
+
+ always @(posedge EM_CLK or posedge arst)
+ if(arst)
+ src_rdy_o <= 0;
+ else if(do_write & ~bus_error) // Don't put junk in if there is a bus error
+ src_rdy_o <= 1;
+ else
+ src_rdy_o <= 0; // Assume it was taken, ignore dst_rdy_i
+
+ always @(posedge EM_CLK or posedge arst)
+ if(arst)
+ counter <= 0;
+ else if(do_write)
+ if(last_write)
+ counter <= 0;
+ else
+ counter <= counter + 1;
+
+ assign fifo_ready = first_write & (fifo_space > frame_len);
+
+ always @(posedge EM_CLK or posedge arst)
+ if(arst)
+ bus_error <= 0;
+ else if(src_rdy_o & ~dst_rdy_i)
+ bus_error <= 1;
+ // must be reset to make the error go away
+
+endmodule // gpmc_to_fifo_sync
diff --git a/fpga/usrp2/gpmc/gpmc_wb.v b/fpga/usrp2/gpmc/gpmc_wb.v
new file mode 100644
index 000000000..db6fbc6e9
--- /dev/null
+++ b/fpga/usrp2/gpmc/gpmc_wb.v
@@ -0,0 +1,57 @@
+
+
+module gpmc_wb
+ (input EM_CLK, input [15:0] EM_D_in, output [15:0] EM_D_out, input [10:1] EM_A, input [1:0] EM_NBE,
+ input EM_NCS, input EM_NWE, input EM_NOE,
+
+ input wb_clk, input wb_rst,
+ output reg [10:0] wb_adr_o, output reg [15:0] wb_dat_mosi, input [15:0] wb_dat_miso,
+ output reg [1:0] wb_sel_o, output wb_cyc_o, output reg wb_stb_o, output reg wb_we_o, input wb_ack_i);
+
+ // ////////////////////////////////////////////
+ // Control Path, Wishbone bus bridge (wb master)
+ reg [1:0] cs_del, we_del, oe_del;
+
+ // Synchronize the async control signals
+ always @(posedge wb_clk)
+ begin
+ cs_del <= { cs_del[0], EM_NCS };
+ we_del <= { we_del[0], EM_NWE };
+ oe_del <= { oe_del[0], EM_NOE };
+ end
+
+ always @(posedge wb_clk)
+ if(cs_del == 2'b10) // Falling Edge
+ wb_adr_o <= { EM_A, 1'b0 };
+
+ always @(posedge wb_clk)
+ if(we_del == 2'b10) // Falling Edge
+ begin
+ wb_dat_mosi <= EM_D_in;
+ wb_sel_o <= ~EM_NBE;
+ end
+
+ reg [15:0] EM_D_hold;
+
+ always @(posedge wb_clk)
+ if(wb_ack_i)
+ EM_D_hold <= wb_dat_miso;
+
+ assign EM_D_out = wb_ack_i ? wb_dat_miso : EM_D_hold;
+
+ assign wb_cyc_o = wb_stb_o;
+
+ always @(posedge wb_clk)
+ if(~cs_del[0] & (we_del == 2'b10) )
+ wb_we_o <= 1;
+ else if(wb_ack_i) // Turn off we when done. Could also use we_del[0], others...
+ wb_we_o <= 0;
+
+ // FIXME should this look at cs_del[1]?
+ always @(posedge wb_clk)
+ if(~cs_del[0] & ((we_del == 2'b10) | (oe_del == 2'b10)))
+ wb_stb_o <= 1;
+ else if(wb_ack_i)
+ wb_stb_o <= 0;
+
+endmodule // gpmc_wb
diff --git a/fpga/usrp2/gpmc/make_timing_diag b/fpga/usrp2/gpmc/make_timing_diag
new file mode 100755
index 000000000..03166ad35
--- /dev/null
+++ b/fpga/usrp2/gpmc/make_timing_diag
@@ -0,0 +1,6 @@
+#!/bin/sh
+drawtiming -o single_data_write.gif single_data_write.txt
+drawtiming -o single_data_read.gif single_data_read.txt
+drawtiming -o burst_data_write.gif burst_data_write.txt
+#drawtiming -o burst_data_read.gif burst_data_read.txt
+
diff --git a/fpga/usrp2/gpmc/ram_to_fifo.v b/fpga/usrp2/gpmc/ram_to_fifo.v
new file mode 100644
index 000000000..8549dcc35
--- /dev/null
+++ b/fpga/usrp2/gpmc/ram_to_fifo.v
@@ -0,0 +1,46 @@
+
+
+module ram_to_fifo
+ (input clk, input reset,
+ input [10:0] read_length, // From the dbsm (?)
+ output read_en, output reg [8:0] read_addr, input [31:0] read_data, input read_ready, output read_done,
+ output [35:0] data_o, output src_rdy_o, input dst_rdy_i);
+
+ // read_length/2 = number of 32 bit lines, numbered 0 through read_length/2-1
+ wire [8:0] last_line = (read_length[10:1]-1);
+
+ reg read_phase, sop;
+
+ assign read_en = (read_phase == 0) | dst_rdy_i;
+ assign src_rdy_o = (read_phase == 1);
+
+ always @(posedge clk)
+ if(reset)
+ begin
+ read_addr <= 0;
+ read_phase <= 0;
+ sop <= 1;
+ end
+ else
+ if(read_phase == 0)
+ begin
+ read_addr <= read_ready;
+ read_phase <= read_ready;
+ end
+ else if(dst_rdy_i)
+ begin
+ sop <= 0;
+ if(read_addr == last_line)
+ begin
+ read_addr <= 0;
+ read_phase <= 0;
+ end
+ else
+ read_addr <= read_addr + 1;
+ end
+
+ assign read_done = (read_phase == 1) & (read_addr == last_line) & dst_rdy_i;
+ wire eop = (read_addr == last_line);
+ assign data_o = { 2'b00, eop, sop, read_data };
+
+endmodule // ram_to_fifo
diff --git a/fpga/usrp2/gpmc/single_data_read.txt b/fpga/usrp2/gpmc/single_data_read.txt
new file mode 100644
index 000000000..1dc0e3a78
--- /dev/null
+++ b/fpga/usrp2/gpmc/single_data_read.txt
@@ -0,0 +1,12 @@
+# OMAP writes to FPGA
+# initialize the signals
+CLK=0,nWE=1,nCS=1,nOE=1,DATA=Z.
+CLK=1.
+CLK=0,nOE=0,nCS=0,DATA=RD_DATA.
+CLK=1.
+CLK=0.
+CLK=1.
+CLK=0,nOE=1,nCS=1,DATA=Z.
+CLK=1.
+
+
diff --git a/fpga/usrp2/gpmc/single_data_write.txt b/fpga/usrp2/gpmc/single_data_write.txt
new file mode 100644
index 000000000..287e3e2c1
--- /dev/null
+++ b/fpga/usrp2/gpmc/single_data_write.txt
@@ -0,0 +1,10 @@
+# OMAP writes to FPGA
+# initialize the signals
+CLK=0,nWE=1,nCS=1,nOE=1,DATA=Z.
+CLK=1.
+CLK=0,nWE=0,nCS=0,DATA=WR_DATA.
+CLK=1.
+CLK=0,nWE=1,nCS=1,DATA=Z.
+CLK=1.
+
+
diff --git a/fpga/usrp2/models/gpmc_model_async.v b/fpga/usrp2/models/gpmc_model_async.v
new file mode 100644
index 000000000..beeaee028
--- /dev/null
+++ b/fpga/usrp2/models/gpmc_model_async.v
@@ -0,0 +1,130 @@
+`timescale 1ps/1ps
+
+module gpmc_model_async
+ (output EM_CLK, inout [15:0] EM_D, output reg [10:1] EM_A, output reg [1:0] EM_NBE,
+ output reg EM_WAIT0, output reg EM_NCS4, output reg EM_NCS6,
+ output reg EM_NWE, output reg EM_NOE );
+
+ assign EM_CLK = 0;
+ reg [15:0] EM_D_int;
+ assign EM_D = EM_D_int;
+
+ initial
+ begin
+ EM_A <= 10'bz;
+ EM_NBE <= 2'b11;
+ EM_NWE <= 1;
+ EM_NOE <= 1;
+ EM_NCS4 <= 1;
+ EM_NCS6 <= 1;
+ EM_D_int <= 16'bz;
+ EM_WAIT0 <= 0; // FIXME this is actually an input
+ end
+
+ task GPMC_Write;
+ input ctrl;
+ input [10:0] addr;
+ input [15:0] data;
+ begin
+ #23000;
+ EM_A <= addr[10:1];
+ EM_D_int <= data;
+ #20100;
+ if(ctrl)
+ EM_NCS6 <= 0;
+ else
+ EM_NCS4 <= 0;
+ #14000;
+ EM_NWE <= 0;
+ #77500;
+ EM_NCS4 <= 1;
+ EM_NCS6 <= 1;
+ //#1.5;
+ EM_NWE <= 1;
+ #60000;
+ EM_A <= 10'bz;
+ EM_D_int <= 16'bz;
+ end
+ endtask // GPMC_Write
+
+ task GPMC_Read;
+ input ctrl;
+ input [10:0] addr;
+ begin
+ #13000;
+ EM_A <= addr[10:1];
+ #3000;
+ if(ctrl)
+ EM_NCS6 <= 0;
+ else
+ EM_NCS4 <= 0;
+ #14000;
+ EM_NOE <= 0;
+ #77500;
+ EM_NCS4 <= 1;
+ EM_NCS6 <= 1;
+ //#1.5;
+ $display("Data Read from GPMC: %X",EM_D);
+ EM_NOE <= 1;
+ #254000;
+ EM_A <= 10'bz;
+ end
+ endtask // GPMC_Read
+
+ initial
+ begin
+ #1000000;
+ GPMC_Write(1,36,16'hF00D);
+ #1000000;
+ GPMC_Read(1,36);
+ #1000000;
+ GPMC_Write(0,0,16'h1234);
+ GPMC_Write(0,0,16'h5678);
+ GPMC_Write(0,0,16'h9abc);
+ GPMC_Write(0,0,16'hF00D);
+ GPMC_Write(0,0,16'hDEAD);
+ GPMC_Write(0,0,16'hDEAD);
+ GPMC_Write(0,0,16'hDEAD);
+ GPMC_Write(0,0,16'hDEAD);
+ GPMC_Write(0,0,16'hDEAD);
+ GPMC_Write(0,0,16'hDEAD);
+ #1000000;
+ GPMC_Write(0,0,16'h1234);
+ GPMC_Write(0,0,16'h5678);
+ GPMC_Write(0,0,16'h9abc);
+ GPMC_Write(0,0,16'hF00D);
+ GPMC_Write(0,0,16'hDEAD);
+ GPMC_Write(0,0,16'hDEAD);
+ GPMC_Write(0,0,16'hDEAD);
+ GPMC_Write(0,0,16'hDEAD);
+ GPMC_Write(0,0,16'hDEAD);
+ GPMC_Write(0,0,16'h9876);
+ #1000000;
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ #1000000;
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ GPMC_Read(0,0);
+ #1000000;
+ GPMC_Read(0,0);
+ #100000000;
+ $finish;
+ end
+
+endmodule // gpmc_model_async
diff --git a/fpga/usrp2/models/gpmc_model_sync.v b/fpga/usrp2/models/gpmc_model_sync.v
new file mode 100644
index 000000000..641720c15
--- /dev/null
+++ b/fpga/usrp2/models/gpmc_model_sync.v
@@ -0,0 +1,97 @@
+
+
+module gpmc_model_sync
+ (output reg EM_CLK, inout [15:0] EM_D, output reg [10:1] EM_A, output reg [1:0] EM_NBE,
+ output reg EM_WAIT0, output reg EM_NCS4, output reg EM_NCS6,
+ output reg EM_NWE, output reg EM_NOE );
+
+ reg [15:0] EM_D_int;
+ assign EM_D = EM_D_int;
+
+ initial
+ begin
+ EM_CLK <= 0;
+ EM_A <= 10'bz;
+ EM_NBE <= 2'b11;
+ EM_NWE <= 1;
+ EM_NOE <= 1;
+ EM_NCS4 <= 1;
+ EM_NCS6 <= 1;
+ EM_D_int <= 16'bz;
+ EM_WAIT0 <= 0; // FIXME this is actually an input
+ end
+
+ task GPMC_Write;
+ input ctrl;
+ input [10:0] addr;
+ input [15:0] data;
+ begin
+ EM_CLK <= 1;
+ #10;
+ EM_CLK <= 0;
+ EM_NWE <= 0;
+ if(ctrl)
+ EM_NCS6 <= 0;
+ else
+ EM_NCS4 <= 0;
+ EM_A <= addr[10:1];
+ EM_D_int <= data;
+ #10;
+ EM_CLK <= 1;
+ #10;
+ EM_CLK <= 0;
+ EM_NWE <= 1;
+ EM_NCS4 <= 1;
+ EM_NCS6 <= 1;
+ EM_A <= 10'bz;
+ EM_D_int <= 16'bz;
+ #100;
+ end
+ endtask // GPMC_Write
+
+ task GPMC_Read;
+ input ctrl;
+ input [10:0] addr;
+ begin
+ #1.3;
+ EM_A <= addr[10:1];
+ #3;
+ if(ctrl)
+ EM_NCS6 <= 0;
+ else
+ EM_NCS4 <= 0;
+ #14;
+ EM_NOE <= 0;
+ #77.5;
+ EM_NCS4 <= 1;
+ EM_NCS6 <= 1;
+ //#1.5;
+ $display("Data Read from GPMC: %X",EM_D);
+ EM_NOE <= 1;
+ #254;
+ EM_A <= 10'bz;
+ end
+ endtask // GPMC_Read
+
+ initial
+ begin
+ #1000;
+ GPMC_Write(1,36,16'hF00D);
+ #1000;
+ GPMC_Read(1,36);
+ #1000;
+ GPMC_Write(0,36,16'h1234);
+ GPMC_Write(0,38,16'h5678);
+ GPMC_Write(0,40,16'h9abc);
+ GPMC_Write(0,11'h2F4,16'hF00D);
+ GPMC_Write(0,11'h7FE,16'hDEAD);
+ GPMC_Write(0,11'h7FE,16'hDEAD);
+ GPMC_Write(0,11'h7FE,16'hDEAD);
+ GPMC_Write(0,11'h7FE,16'hDEAD);
+ GPMC_Write(0,11'h7FE,16'hDEAD);
+ GPMC_Write(0,11'h7FE,16'hDEAD);
+ #100000;
+ $finish;
+ end
+
+endmodule // gpmc_model
diff --git a/fpga/usrp2/models/idt71v65603s150.v b/fpga/usrp2/models/idt71v65603s150.v
new file mode 100755
index 000000000..457dfa6dd
--- /dev/null
+++ b/fpga/usrp2/models/idt71v65603s150.v
@@ -0,0 +1,301 @@
+/*******************************************************************************
+ *
+ * File Name : idt71v65603s150.v
+ * Product : IDT71V65603
+ * Function : 256K x 36 pipeline ZBT Static RAM
+ * Simulation Tool/Version : Verilog-XL 2.5
+ * Date : 07/19/00
+ *
+ * Copyright 1999 Integrated Device Technology, Inc.
+ *
+ * Revision Notes: 07/19/00 Rev00
+ *
+ ******************************************************************************/
+/*******************************************************************************
+ * Module Name: idt71v65603s150
+ *
+ * Notes : This model is believed to be functionally
+ * accurate. Please direct any inquiries to
+ * IDT SRAM Applications at: sramhelp@idt.com
+ *
+ *******************************************************************************/
+
+ /***************************************************************
+ *
+ * Integrated Device Technology, Inc. ("IDT") hereby grants the
+ * user of this Verilog/VCS model a non-exclusive, nontransferable
+ * license to use this Verilog/VCS model under the following terms.
+ * The user is granted this license only to use the Verilog/VCS
+ * model and is not granted rights to sell, copy (except as needed
+ * to run the IBIS model), rent, lease or sub-license the Verilog/VCS
+ * model in whole or in part, or in modified form to anyone. The User
+ * may modify the Verilog/VCS model to suit its specific applications,
+ * but rights to derivative works and such modifications shall belong
+ * to IDT.
+ *
+ * This Verilog/VCS model is provided on an "AS IS" basis and
+ * IDT makes absolutely no warranty with respect to the information
+ * contained herein. IDT DISCLAIMS AND CUSTOMER WAIVES ALL
+ * WARRANTIES, EXPRESS AND IMPLIED, INCLUDING WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
+ * ENTIRE RISK AS TO QUALITY AND PERFORMANCE IS WITH THE
+ * USER ACCORDINGLY, IN NO EVENT SHALL IDT BE LIABLE
+ * FOR ANY DIRECT OR INDIRECT DAMAGES, WHETHER IN CONTRACT OR
+ * TORT, INCLUDING ANY LOST PROFITS OR OTHER INCIDENTAL,
+ * CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES ARISING OUT OF
+ * THE USE OR APPLICATION OF THE VERILOG/VCS model. Further,
+ * IDT reserves the right to make changes without notice to any
+ * product herein to improve reliability, function, or design.
+ * IDT does not convey any license under patent rights or
+ * any other intellectual property rights, including those of
+ * third parties. IDT is not obligated to provide maintenance
+ * or support for the licensed Verilog/VCS model.
+ *
+ ***************************************************************/
+
+ `timescale 1ns/100ps
+
+module idt71v65603s150 (A,
+ adv_ld_, // advance (high) / load (low)
+ bw1_, bw2_, bw3_, bw4_, // byte write enables (low)
+ ce1_, ce2, ce2_, // chip enables
+ cen_, // clock enable (low)
+ clk, // clock
+ IO, IOP, // data bus
+ lbo_, // linear burst order (low)
+ oe_, // output enable (low)
+ r_w_); // read (high) / write (low)
+
+initial
+begin
+ $write("\n********************************************************\n");
+ $write(" idt71v65603s150, 256K x 36 Pipelined burst ZBT SRAM \n");
+ $write(" Rev: 00 July 2000 \n");
+ $write(" copyright 1997,1998,1999,2000 by IDT, Inc. \n");
+ $write("********************************************************\n\n");
+end
+
+input [17:0] A;
+inout [31:0] IO;
+inout [4:1] IOP;
+input adv_ld_, bw1_, bw2_, bw3_, bw4_, ce1_, ce2, ce2_,
+ cen_, clk, lbo_, oe_, r_w_;
+
+
+//internal registers for data, address, etc
+reg [8:0] mem1[0:262143]; //memory array
+reg [8:0] mem2[0:262143]; //memory array
+reg [8:0] mem3[0:262143]; //memory array
+reg [8:0] mem4[0:262143]; //memory array
+
+reg [35:0] dout;
+reg [17:0] addr_a,
+ addr_b;
+reg wren_a, wren_b;
+reg cs_a, cs_b;
+reg bw_a1, bw_b1;
+reg bw_a2, bw_b2;
+reg bw_a3, bw_b3;
+reg bw_a4, bw_b4;
+reg [1:0] brst_cnt;
+
+wire[35:0] data_out;
+wire doe;
+wire cs = (~ce1_ & ce2 & ~ce2_);
+wire baddr0, baddr1;
+
+
+parameter regdelay = 0.2;
+parameter outdly = 0.2;
+
+specify
+specparam
+//Clock Parameters
+ tCYC = 6.7, //clock cycle time
+ tCH = 2.0, //clock high time
+ tCL = 2.0, //clock low time
+
+//Output Parameters
+ tCD = 3.8, //clk to data valid
+ tCLZ = 1.5, //clk to output Low-Z
+ tCHZ = 3.0, //clk to data Hi-Z
+ tOE = 3.8, //OE to output valid
+ tOLZ = 0.0, //OE to output Hi-Z
+ tOHZ = 3.8, //OE to output Hi-Z
+
+//Set up times
+ tSE = 1.5, //clock enable set-up
+ tSA = 1.5, //address set-up
+ tSD = 1.5, //data set-up
+ tSW = 1.5, //Read/Write set-up
+ tSADV = 1.5, //Advance/Load set-up
+ tSC = 1.5, //Chip enable set-up
+ tSB = 1.5, //Byte write enable set-up
+
+//Hold times
+ tHE = 0.5, //clock enable hold
+ tHA = 0.5, //address hold
+ tHD = 0.5, //data hold
+ tHW = 0.5, //Read/Write hold
+ tHADV = 0.5, //Advance/Load hold
+ tHC = 0.5, //Chip enable hold
+ tHB = 0.5; //Byte write enable hold
+
+
+ (oe_ *> IO) = (tOE,tOE,tOHZ,tOLZ,tOHZ,tOLZ); //(01,10,0z,z1,1z,z0)
+ (clk *> IO) = (tCD,tCD,tCHZ,tCLZ,tCHZ,tCLZ); //(01,10,0z,z1,1z,z0)
+
+ (oe_ *> IOP) = (tOE,tOE,tOHZ,tOLZ,tOHZ,tOLZ); //(01,10,0z,z1,1z,z0)
+ (clk *> IOP) = (tCD,tCD,tCHZ,tCLZ,tCHZ,tCLZ); //(01,10,0z,z1,1z,z0)
+
+//timing checks
+
+ $period(posedge clk, tCYC );
+ $width (posedge clk, tCH );
+ $width (negedge clk, tCL );
+
+
+ $setuphold(posedge clk, A, tSA, tHA);
+ $setuphold(posedge clk, IO, tSD, tHD);
+ $setuphold(posedge clk, IOP, tSD, tHD);
+ $setuphold(posedge clk, adv_ld_, tSADV, tHADV);
+ $setuphold(posedge clk, bw1_, tSB, tHB);
+ $setuphold(posedge clk, bw2_, tSB, tHB);
+ $setuphold(posedge clk, bw3_, tSB, tHB);
+ $setuphold(posedge clk, bw4_, tSB, tHB);
+ $setuphold(posedge clk, ce1_, tSC, tHC);
+ $setuphold(posedge clk, ce2, tSC, tHC);
+ $setuphold(posedge clk, ce2_, tSC, tHC);
+ $setuphold(posedge clk, cen_, tSE, tHE);
+ $setuphold(posedge clk, r_w_, tSW, tHW);
+
+endspecify
+
+initial begin
+ cs_a = 0;
+ cs_b = 0;
+end
+
+
+/////////////////////////////////////////////////////////////////////////
+//input registers
+//--------------------
+always @(posedge clk)
+begin
+ if ( ~cen_ & ~adv_ld_ ) cs_a <= #regdelay cs;
+ if ( ~cen_ ) cs_b <= #regdelay cs_a;
+
+ if ( ~cen_ & ~adv_ld_ ) wren_a <= #regdelay (cs & ~r_w_);
+ if ( ~cen_ ) wren_b <= #regdelay wren_a;
+
+ if ( ~cen_ ) bw_a1 <= #regdelay ~bw1_;
+ if ( ~cen_ ) bw_a2 <= #regdelay ~bw2_;
+ if ( ~cen_ ) bw_a3 <= #regdelay ~bw3_;
+ if ( ~cen_ ) bw_a4 <= #regdelay ~bw4_;
+
+ if ( ~cen_ ) bw_b1 <= #regdelay bw_a1;
+ if ( ~cen_ ) bw_b2 <= #regdelay bw_a2;
+ if ( ~cen_ ) bw_b3 <= #regdelay bw_a3;
+ if ( ~cen_ ) bw_b4 <= #regdelay bw_a4;
+
+ if ( ~cen_ & ~adv_ld_ ) addr_a[17:0] <= #regdelay A[17:0];
+ if ( ~cen_ ) addr_b[17:0] <= #regdelay {addr_a[17:2], baddr1, baddr0};
+end
+
+
+/////////////////////////////////////////////////////////////////////////
+//burst counter
+//--------------------
+always @(posedge clk)
+begin
+ if ( lbo_ & ~cen_ & ~adv_ld_) brst_cnt <= #regdelay 0;
+ else if (~lbo_ & ~cen_ & ~adv_ld_) brst_cnt <= #regdelay A[1:0];
+ else if ( ~cen_ & adv_ld_) brst_cnt <= #regdelay brst_cnt + 1;
+end
+
+
+/////////////////////////////////////////////////////////////////////////
+//address logic
+//--------------------
+assign baddr1 = lbo_ ? (brst_cnt[1] ^ addr_a[1]) : brst_cnt[1];
+assign baddr0 = lbo_ ? (brst_cnt[0] ^ addr_a[0]) : brst_cnt[0];
+
+
+/////////////////////////////////////////////////////////////////////////
+//data output register
+//--------------------
+always @(posedge clk)
+begin
+ #regdelay;
+ #regdelay;
+ dout[8:0] = mem1[addr_b];
+ dout[17:9] = mem2[addr_b];
+ dout[26:18] = mem3[addr_b];
+ dout[35:27] = mem4[addr_b];
+end
+
+assign data_out = dout;
+
+
+/////////////////////////////////////////////////////////////////////////
+//Output buffers: using a bufif1 has the same effect as...
+//
+// assign D = doe ? data_out : 36'hz;
+//
+//It was coded this way to support SPECIFY delays in the specparam section.
+//--------------------
+bufif1 #outdly (IO[0],data_out[0],doe);
+bufif1 #outdly (IO[1],data_out[1],doe);
+bufif1 #outdly (IO[2],data_out[2],doe);
+bufif1 #outdly (IO[3],data_out[3],doe);
+bufif1 #outdly (IO[4],data_out[4],doe);
+bufif1 #outdly (IO[5],data_out[5],doe);
+bufif1 #outdly (IO[6],data_out[6],doe);
+bufif1 #outdly (IO[7],data_out[7],doe);
+bufif1 #outdly (IOP[1],data_out[8],doe);
+
+bufif1 #outdly (IO[8],data_out[9],doe);
+bufif1 #outdly (IO[9],data_out[10],doe);
+bufif1 #outdly (IO[10],data_out[11],doe);
+bufif1 #outdly (IO[11],data_out[12],doe);
+bufif1 #outdly (IO[12],data_out[13],doe);
+bufif1 #outdly (IO[13],data_out[14],doe);
+bufif1 #outdly (IO[14],data_out[15],doe);
+bufif1 #outdly (IO[15],data_out[16],doe);
+bufif1 #outdly (IOP[2],data_out[17],doe);
+
+bufif1 #outdly (IO[16],data_out[18],doe);
+bufif1 #outdly (IO[17],data_out[19],doe);
+bufif1 #outdly (IO[18],data_out[20],doe);
+bufif1 #outdly (IO[19],data_out[21],doe);
+bufif1 #outdly (IO[20],data_out[22],doe);
+bufif1 #outdly (IO[21],data_out[23],doe);
+bufif1 #outdly (IO[22],data_out[24],doe);
+bufif1 #outdly (IO[23],data_out[25],doe);
+bufif1 #outdly (IOP[3],data_out[26],doe);
+
+bufif1 #outdly (IO[24],data_out[27],doe);
+bufif1 #outdly (IO[25],data_out[28],doe);
+bufif1 #outdly (IO[26],data_out[29],doe);
+bufif1 #outdly (IO[27],data_out[30],doe);
+bufif1 #outdly (IO[28],data_out[31],doe);
+bufif1 #outdly (IO[29],data_out[32],doe);
+bufif1 #outdly (IO[30],data_out[33],doe);
+bufif1 #outdly (IO[31],data_out[34],doe);
+bufif1 #outdly (IOP[4],data_out[35],doe);
+
+assign doe = cs_b & ~wren_b & ~oe_ ;
+
+
+/////////////////////////////////////////////////////////////////////////
+// write to ram
+//-------------
+always @(posedge clk)
+begin
+ if (wren_b & bw_b1 & ~cen_) mem1[addr_b] = {IOP[1], IO[7:0]};
+ if (wren_b & bw_b2 & ~cen_) mem2[addr_b] = {IOP[2], IO[15:8]};
+ if (wren_b & bw_b3 & ~cen_) mem3[addr_b] = {IOP[3], IO[23:16]};
+ if (wren_b & bw_b4 & ~cen_) mem4[addr_b] = {IOP[4], IO[31:24]};
+end
+
+endmodule
diff --git a/fpga/usrp2/opencores/Makefile.srcs b/fpga/usrp2/opencores/Makefile.srcs
index 30360a17d..284578b39 100644
--- a/fpga/usrp2/opencores/Makefile.srcs
+++ b/fpga/usrp2/opencores/Makefile.srcs
@@ -24,5 +24,5 @@ spi/rtl/verilog/spi_clgen.v \
spi/rtl/verilog/spi_defines.v \
spi/rtl/verilog/spi_shift.v \
spi/rtl/verilog/spi_top.v \
-spi/rtl/verilog/timescale.v \
+spi/rtl/verilog/spi_top16.v \
))
diff --git a/fpga/usrp2/opencores/aemb/rtl/verilog/aeMB_core_BE.v b/fpga/usrp2/opencores/aemb/rtl/verilog/aeMB_core_BE.v
index 38ca3a023..6c066d5d9 100644
--- a/fpga/usrp2/opencores/aemb/rtl/verilog/aeMB_core_BE.v
+++ b/fpga/usrp2/opencores/aemb/rtl/verilog/aeMB_core_BE.v
@@ -11,7 +11,7 @@ module aeMB_core_BE
(input sys_clk_i,
input sys_rst_i,
// Instruction port
- output [14:0] if_adr,
+ output [ISIZ-1:0] if_adr,
input [31:0] if_dat,
// Data port
output dwb_we_o,
@@ -34,7 +34,7 @@ module aeMB_core_BE
assign dwb_cyc_o = dwb_stb_o;
assign iwb_ack_i = 1'b1;
- assign if_adr = iwb_adr_o[14:0];
+ assign if_adr = iwb_adr_o[ISIZ-1:0];
assign iwb_dat_i = if_dat;
// Note some "wishbone" instruction fetch signals pruned on external interface
diff --git a/fpga/usrp2/opencores/spi/rtl/verilog/spi_clgen.v b/fpga/usrp2/opencores/spi/rtl/verilog/spi_clgen.v
index 7bc4f6e5e..2d9c34f40 100644
--- a/fpga/usrp2/opencores/spi/rtl/verilog/spi_clgen.v
+++ b/fpga/usrp2/opencores/spi/rtl/verilog/spi_clgen.v
@@ -39,12 +39,9 @@
//////////////////////////////////////////////////////////////////////
`include "spi_defines.v"
-`include "timescale.v"
module spi_clgen (clk_in, rst, go, enable, last_clk, divider, clk_out, pos_edge, neg_edge);
- parameter Tp = 1;
-
input clk_in; // input clock (system clock)
input rst; // reset
input enable; // clock enable
@@ -68,40 +65,40 @@ module spi_clgen (clk_in, rst, go, enable, last_clk, divider, clk_out, pos_edge,
assign cnt_one = cnt == {{`SPI_DIVIDER_LEN-1{1'b0}}, 1'b1};
// Counter counts half period
- always @(posedge clk_in or posedge rst)
+ always @(posedge clk_in)
begin
if(rst)
- cnt <= #Tp {`SPI_DIVIDER_LEN{1'b1}};
+ cnt <= {`SPI_DIVIDER_LEN{1'b1}};
else
begin
if(!enable || cnt_zero)
- cnt <= #Tp divider;
+ cnt <= divider;
else
- cnt <= #Tp cnt - {{`SPI_DIVIDER_LEN-1{1'b0}}, 1'b1};
+ cnt <= cnt - {{`SPI_DIVIDER_LEN-1{1'b0}}, 1'b1};
end
end
// clk_out is asserted every other half period
- always @(posedge clk_in or posedge rst)
+ always @(posedge clk_in)
begin
if(rst)
- clk_out <= #Tp 1'b0;
+ clk_out <= 1'b0;
else
- clk_out <= #Tp (enable && cnt_zero && (!last_clk || clk_out)) ? ~clk_out : clk_out;
+ clk_out <= (enable && cnt_zero && (!last_clk || clk_out)) ? ~clk_out : clk_out;
end
// Pos and neg edge signals
- always @(posedge clk_in or posedge rst)
+ always @(posedge clk_in)
begin
if(rst)
begin
- pos_edge <= #Tp 1'b0;
- neg_edge <= #Tp 1'b0;
+ pos_edge <= 1'b0;
+ neg_edge <= 1'b0;
end
else
begin
- pos_edge <= #Tp (enable && !clk_out && cnt_one) || (!(|divider) && clk_out) || (!(|divider) && go && !enable);
- neg_edge <= #Tp (enable && clk_out && cnt_one) || (!(|divider) && !clk_out && enable);
+ pos_edge <= (enable && !clk_out && cnt_one) || (!(|divider) && clk_out) || (!(|divider) && go && !enable);
+ neg_edge <= (enable && clk_out && cnt_one) || (!(|divider) && !clk_out && enable);
end
end
endmodule
diff --git a/fpga/usrp2/opencores/spi/rtl/verilog/spi_defines.v b/fpga/usrp2/opencores/spi/rtl/verilog/spi_defines.v
index a6925918e..3e4dd0e3c 100644
--- a/fpga/usrp2/opencores/spi/rtl/verilog/spi_defines.v
+++ b/fpga/usrp2/opencores/spi/rtl/verilog/spi_defines.v
@@ -43,8 +43,8 @@
// low frequency of system clock this can be reduced.
// Use SPI_DIVIDER_LEN for fine tuning theexact number.
//
-//`define SPI_DIVIDER_LEN_8
-`define SPI_DIVIDER_LEN_16
+`define SPI_DIVIDER_LEN_8
+//`define SPI_DIVIDER_LEN_16
//`define SPI_DIVIDER_LEN_24
//`define SPI_DIVIDER_LEN_32
@@ -102,8 +102,8 @@
// Number of device select signals. Use SPI_SS_NB for fine tuning the
// exact number.
//
-`define SPI_SS_NB_8
-//`define SPI_SS_NB_16
+//`define SPI_SS_NB_8
+`define SPI_SS_NB_16
//`define SPI_SS_NB_24
//`define SPI_SS_NB_32
@@ -137,7 +137,7 @@
`define SPI_TX_2 2
`define SPI_TX_3 3
`define SPI_CTRL 4
-`define SPI_DEVIDE 5
+`define SPI_DIVIDE 5
`define SPI_SS 6
//
diff --git a/fpga/usrp2/opencores/spi/rtl/verilog/spi_shift.v b/fpga/usrp2/opencores/spi/rtl/verilog/spi_shift.v
index b17ac8b1f..ac3bb3f48 100644
--- a/fpga/usrp2/opencores/spi/rtl/verilog/spi_shift.v
+++ b/fpga/usrp2/opencores/spi/rtl/verilog/spi_shift.v
@@ -39,15 +39,12 @@
//////////////////////////////////////////////////////////////////////
`include "spi_defines.v"
-`include "timescale.v"
module spi_shift (clk, rst, latch, byte_sel, len, lsb, go,
pos_edge, neg_edge, rx_negedge, tx_negedge,
tip, last,
p_in, p_out, s_clk, s_in, s_out);
- parameter Tp = 1;
-
input clk; // system clock
input rst; // reset
input [3:0] latch; // latch signal for storing the data in shift register
@@ -89,149 +86,149 @@ module spi_shift (clk, rst, latch, byte_sel, len, lsb, go,
assign tx_clk = (tx_negedge ? neg_edge : pos_edge) && !last;
// Character bit counter
- always @(posedge clk or posedge rst)
+ always @(posedge clk)
begin
if(rst)
- cnt <= #Tp {`SPI_CHAR_LEN_BITS+1{1'b0}};
+ cnt <= {`SPI_CHAR_LEN_BITS+1{1'b0}};
else
begin
if(tip)
- cnt <= #Tp pos_edge ? (cnt - {{`SPI_CHAR_LEN_BITS{1'b0}}, 1'b1}) : cnt;
+ cnt <= pos_edge ? (cnt - {{`SPI_CHAR_LEN_BITS{1'b0}}, 1'b1}) : cnt;
else
- cnt <= #Tp !(|len) ? {1'b1, {`SPI_CHAR_LEN_BITS{1'b0}}} : {1'b0, len};
+ cnt <= !(|len) ? {1'b1, {`SPI_CHAR_LEN_BITS{1'b0}}} : {1'b0, len};
end
end
// Transfer in progress
- always @(posedge clk or posedge rst)
+ always @(posedge clk)
begin
if(rst)
- tip <= #Tp 1'b0;
+ tip <= 1'b0;
else if(go && ~tip)
- tip <= #Tp 1'b1;
+ tip <= 1'b1;
else if(tip && last && pos_edge)
- tip <= #Tp 1'b0;
+ tip <= 1'b0;
end
// Sending bits to the line
- always @(posedge clk or posedge rst)
+ always @(posedge clk)
begin
if (rst)
- s_out <= #Tp 1'b0;
+ s_out <= 1'b0;
else
- s_out <= #Tp (tx_clk || !tip) ? data[tx_bit_pos[`SPI_CHAR_LEN_BITS-1:0]] : s_out;
+ s_out <= (tx_clk || !tip) ? data[tx_bit_pos[`SPI_CHAR_LEN_BITS-1:0]] : s_out;
end
// Receiving bits from the line
- always @(posedge clk or posedge rst)
+ always @(posedge clk)
begin
if (rst)
- data <= #Tp {`SPI_MAX_CHAR{1'b0}};
+ data <= {`SPI_MAX_CHAR{1'b0}};
`ifdef SPI_MAX_CHAR_128
else if (latch[0] && !tip)
begin
if (byte_sel[3])
- data[31:24] <= #Tp p_in[31:24];
+ data[31:24] <= p_in[31:24];
if (byte_sel[2])
- data[23:16] <= #Tp p_in[23:16];
+ data[23:16] <= p_in[23:16];
if (byte_sel[1])
- data[15:8] <= #Tp p_in[15:8];
+ data[15:8] <= p_in[15:8];
if (byte_sel[0])
- data[7:0] <= #Tp p_in[7:0];
+ data[7:0] <= p_in[7:0];
end
else if (latch[1] && !tip)
begin
if (byte_sel[3])
- data[63:56] <= #Tp p_in[31:24];
+ data[63:56] <= p_in[31:24];
if (byte_sel[2])
- data[55:48] <= #Tp p_in[23:16];
+ data[55:48] <= p_in[23:16];
if (byte_sel[1])
- data[47:40] <= #Tp p_in[15:8];
+ data[47:40] <= p_in[15:8];
if (byte_sel[0])
- data[39:32] <= #Tp p_in[7:0];
+ data[39:32] <= p_in[7:0];
end
else if (latch[2] && !tip)
begin
if (byte_sel[3])
- data[95:88] <= #Tp p_in[31:24];
+ data[95:88] <= p_in[31:24];
if (byte_sel[2])
- data[87:80] <= #Tp p_in[23:16];
+ data[87:80] <= p_in[23:16];
if (byte_sel[1])
- data[79:72] <= #Tp p_in[15:8];
+ data[79:72] <= p_in[15:8];
if (byte_sel[0])
- data[71:64] <= #Tp p_in[7:0];
+ data[71:64] <= p_in[7:0];
end
else if (latch[3] && !tip)
begin
if (byte_sel[3])
- data[127:120] <= #Tp p_in[31:24];
+ data[127:120] <= p_in[31:24];
if (byte_sel[2])
- data[119:112] <= #Tp p_in[23:16];
+ data[119:112] <= p_in[23:16];
if (byte_sel[1])
- data[111:104] <= #Tp p_in[15:8];
+ data[111:104] <= p_in[15:8];
if (byte_sel[0])
- data[103:96] <= #Tp p_in[7:0];
+ data[103:96] <= p_in[7:0];
end
`else
`ifdef SPI_MAX_CHAR_64
else if (latch[0] && !tip)
begin
if (byte_sel[3])
- data[31:24] <= #Tp p_in[31:24];
+ data[31:24] <= p_in[31:24];
if (byte_sel[2])
- data[23:16] <= #Tp p_in[23:16];
+ data[23:16] <= p_in[23:16];
if (byte_sel[1])
- data[15:8] <= #Tp p_in[15:8];
+ data[15:8] <= p_in[15:8];
if (byte_sel[0])
- data[7:0] <= #Tp p_in[7:0];
+ data[7:0] <= p_in[7:0];
end
else if (latch[1] && !tip)
begin
if (byte_sel[3])
- data[63:56] <= #Tp p_in[31:24];
+ data[63:56] <= p_in[31:24];
if (byte_sel[2])
- data[55:48] <= #Tp p_in[23:16];
+ data[55:48] <= p_in[23:16];
if (byte_sel[1])
- data[47:40] <= #Tp p_in[15:8];
+ data[47:40] <= p_in[15:8];
if (byte_sel[0])
- data[39:32] <= #Tp p_in[7:0];
+ data[39:32] <= p_in[7:0];
end
`else
else if (latch[0] && !tip)
begin
`ifdef SPI_MAX_CHAR_8
if (byte_sel[0])
- data[`SPI_MAX_CHAR-1:0] <= #Tp p_in[`SPI_MAX_CHAR-1:0];
+ data[`SPI_MAX_CHAR-1:0] <= p_in[`SPI_MAX_CHAR-1:0];
`endif
`ifdef SPI_MAX_CHAR_16
if (byte_sel[0])
- data[7:0] <= #Tp p_in[7:0];
+ data[7:0] <= p_in[7:0];
if (byte_sel[1])
- data[`SPI_MAX_CHAR-1:8] <= #Tp p_in[`SPI_MAX_CHAR-1:8];
+ data[`SPI_MAX_CHAR-1:8] <= p_in[`SPI_MAX_CHAR-1:8];
`endif
`ifdef SPI_MAX_CHAR_24
if (byte_sel[0])
- data[7:0] <= #Tp p_in[7:0];
+ data[7:0] <= p_in[7:0];
if (byte_sel[1])
- data[15:8] <= #Tp p_in[15:8];
+ data[15:8] <= p_in[15:8];
if (byte_sel[2])
- data[`SPI_MAX_CHAR-1:16] <= #Tp p_in[`SPI_MAX_CHAR-1:16];
+ data[`SPI_MAX_CHAR-1:16] <= p_in[`SPI_MAX_CHAR-1:16];
`endif
`ifdef SPI_MAX_CHAR_32
if (byte_sel[0])
- data[7:0] <= #Tp p_in[7:0];
+ data[7:0] <= p_in[7:0];
if (byte_sel[1])
- data[15:8] <= #Tp p_in[15:8];
+ data[15:8] <= p_in[15:8];
if (byte_sel[2])
- data[23:16] <= #Tp p_in[23:16];
+ data[23:16] <= p_in[23:16];
if (byte_sel[3])
- data[`SPI_MAX_CHAR-1:24] <= #Tp p_in[`SPI_MAX_CHAR-1:24];
+ data[`SPI_MAX_CHAR-1:24] <= p_in[`SPI_MAX_CHAR-1:24];
`endif
end
`endif
`endif
else
- data[rx_bit_pos[`SPI_CHAR_LEN_BITS-1:0]] <= #Tp rx_clk ? s_in : data[rx_bit_pos[`SPI_CHAR_LEN_BITS-1:0]];
+ data[rx_bit_pos[`SPI_CHAR_LEN_BITS-1:0]] <= rx_clk ? s_in : data[rx_bit_pos[`SPI_CHAR_LEN_BITS-1:0]];
end
endmodule
diff --git a/fpga/usrp2/opencores/spi/rtl/verilog/spi_top.v b/fpga/usrp2/opencores/spi/rtl/verilog/spi_top.v
index 09b2e50e1..8289449a9 100644
--- a/fpga/usrp2/opencores/spi/rtl/verilog/spi_top.v
+++ b/fpga/usrp2/opencores/spi/rtl/verilog/spi_top.v
@@ -1,3 +1,6 @@
+
+// Modified 2010 by Matt Ettus to remove old verilog style
+
//////////////////////////////////////////////////////////////////////
//// ////
//// spi_top.v ////
@@ -40,7 +43,6 @@
`include "spi_defines.v"
-`include "timescale.v"
module spi_top
(
@@ -52,8 +54,6 @@ module spi_top
ss_pad_o, sclk_pad_o, mosi_pad_o, miso_pad_i
);
- parameter Tp = 1;
-
// Wishbone signals
input wb_clk_i; // master clock input
input wb_rst_i; // synchronous active high reset
@@ -101,7 +101,7 @@ module spi_top
wire last_bit; // marks last character bit
// Address decoder
- assign spi_divider_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`SPI_OFS_BITS] == `SPI_DEVIDE);
+ assign spi_divider_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`SPI_OFS_BITS] == `SPI_DIVIDE);
assign spi_ctrl_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[`SPI_OFS_BITS] == `SPI_CTRL);
assign spi_tx_sel[0] = wb_cyc_i & wb_stb_i & (wb_adr_i[`SPI_OFS_BITS] == `SPI_TX_0);
assign spi_tx_sel[1] = wb_cyc_i & wb_stb_i & (wb_adr_i[`SPI_OFS_BITS] == `SPI_TX_1);
@@ -132,96 +132,96 @@ module spi_top
`endif
`endif
`SPI_CTRL: wb_dat = {{32-`SPI_CTRL_BIT_NB{1'b0}}, ctrl};
- `SPI_DEVIDE: wb_dat = {{32-`SPI_DIVIDER_LEN{1'b0}}, divider};
+ `SPI_DIVIDE: wb_dat = {{32-`SPI_DIVIDER_LEN{1'b0}}, divider};
`SPI_SS: wb_dat = {{32-`SPI_SS_NB{1'b0}}, ss};
default: wb_dat = 32'bx;
endcase
end
// Wb data out
- always @(posedge wb_clk_i or posedge wb_rst_i)
+ always @(posedge wb_clk_i)
begin
if (wb_rst_i)
- wb_dat_o <= #Tp 32'b0;
+ wb_dat_o <= 32'b0;
else
- wb_dat_o <= #Tp wb_dat;
+ wb_dat_o <= wb_dat;
end
// Wb acknowledge
- always @(posedge wb_clk_i or posedge wb_rst_i)
+ always @(posedge wb_clk_i)
begin
if (wb_rst_i)
- wb_ack_o <= #Tp 1'b0;
+ wb_ack_o <= 1'b0;
else
- wb_ack_o <= #Tp wb_cyc_i & wb_stb_i & ~wb_ack_o;
+ wb_ack_o <= wb_cyc_i & wb_stb_i & ~wb_ack_o;
end
// Wb error
assign wb_err_o = 1'b0;
// Interrupt
- always @(posedge wb_clk_i or posedge wb_rst_i)
+ always @(posedge wb_clk_i)
begin
if (wb_rst_i)
- wb_int_o <= #Tp 1'b0;
+ wb_int_o <= 1'b0;
else if (ie && tip && last_bit && pos_edge)
- wb_int_o <= #Tp 1'b1;
+ wb_int_o <= 1'b1;
else if (wb_ack_o)
- wb_int_o <= #Tp 1'b0;
+ wb_int_o <= 1'b0;
end
// Divider register
- always @(posedge wb_clk_i or posedge wb_rst_i)
+ always @(posedge wb_clk_i)
begin
if (wb_rst_i)
- divider <= #Tp {`SPI_DIVIDER_LEN{1'b0}};
+ divider <= {`SPI_DIVIDER_LEN{1'b0}};
else if (spi_divider_sel && wb_we_i && !tip)
begin
`ifdef SPI_DIVIDER_LEN_8
if (wb_sel_i[0])
- divider <= #Tp wb_dat_i[`SPI_DIVIDER_LEN-1:0];
+ divider <= wb_dat_i[`SPI_DIVIDER_LEN-1:0];
`endif
`ifdef SPI_DIVIDER_LEN_16
if (wb_sel_i[0])
- divider[7:0] <= #Tp wb_dat_i[7:0];
+ divider[7:0] <= wb_dat_i[7:0];
if (wb_sel_i[1])
- divider[`SPI_DIVIDER_LEN-1:8] <= #Tp wb_dat_i[`SPI_DIVIDER_LEN-1:8];
+ divider[`SPI_DIVIDER_LEN-1:8] <= wb_dat_i[`SPI_DIVIDER_LEN-1:8];
`endif
`ifdef SPI_DIVIDER_LEN_24
if (wb_sel_i[0])
- divider[7:0] <= #Tp wb_dat_i[7:0];
+ divider[7:0] <= wb_dat_i[7:0];
if (wb_sel_i[1])
- divider[15:8] <= #Tp wb_dat_i[15:8];
+ divider[15:8] <= wb_dat_i[15:8];
if (wb_sel_i[2])
- divider[`SPI_DIVIDER_LEN-1:16] <= #Tp wb_dat_i[`SPI_DIVIDER_LEN-1:16];
+ divider[`SPI_DIVIDER_LEN-1:16] <= wb_dat_i[`SPI_DIVIDER_LEN-1:16];
`endif
`ifdef SPI_DIVIDER_LEN_32
if (wb_sel_i[0])
- divider[7:0] <= #Tp wb_dat_i[7:0];
+ divider[7:0] <= wb_dat_i[7:0];
if (wb_sel_i[1])
- divider[15:8] <= #Tp wb_dat_i[15:8];
+ divider[15:8] <= wb_dat_i[15:8];
if (wb_sel_i[2])
- divider[23:16] <= #Tp wb_dat_i[23:16];
+ divider[23:16] <= wb_dat_i[23:16];
if (wb_sel_i[3])
- divider[`SPI_DIVIDER_LEN-1:24] <= #Tp wb_dat_i[`SPI_DIVIDER_LEN-1:24];
+ divider[`SPI_DIVIDER_LEN-1:24] <= wb_dat_i[`SPI_DIVIDER_LEN-1:24];
`endif
end
end
// Ctrl register
- always @(posedge wb_clk_i or posedge wb_rst_i)
+ always @(posedge wb_clk_i)
begin
if (wb_rst_i)
- ctrl <= #Tp {`SPI_CTRL_BIT_NB{1'b0}};
+ ctrl <= {`SPI_CTRL_BIT_NB{1'b0}};
else if(spi_ctrl_sel && wb_we_i && !tip)
begin
if (wb_sel_i[0])
- ctrl[7:0] <= #Tp wb_dat_i[7:0] | {7'b0, ctrl[0]};
+ ctrl[7:0] <= wb_dat_i[7:0] | {7'b0, ctrl[0]};
if (wb_sel_i[1])
- ctrl[`SPI_CTRL_BIT_NB-1:8] <= #Tp wb_dat_i[`SPI_CTRL_BIT_NB-1:8];
+ ctrl[`SPI_CTRL_BIT_NB-1:8] <= wb_dat_i[`SPI_CTRL_BIT_NB-1:8];
end
else if(tip && last_bit && pos_edge)
- ctrl[`SPI_CTRL_GO] <= #Tp 1'b0;
+ ctrl[`SPI_CTRL_GO] <= 1'b0;
end
assign rx_negedge = ctrl[`SPI_CTRL_RX_NEGEDGE];
@@ -233,39 +233,39 @@ module spi_top
assign ass = ctrl[`SPI_CTRL_ASS];
// Slave select register
- always @(posedge wb_clk_i or posedge wb_rst_i)
+ always @(posedge wb_clk_i)
begin
if (wb_rst_i)
- ss <= #Tp {`SPI_SS_NB{1'b0}};
+ ss <= {`SPI_SS_NB{1'b0}};
else if(spi_ss_sel && wb_we_i && !tip)
begin
`ifdef SPI_SS_NB_8
if (wb_sel_i[0])
- ss <= #Tp wb_dat_i[`SPI_SS_NB-1:0];
+ ss <= wb_dat_i[`SPI_SS_NB-1:0];
`endif
`ifdef SPI_SS_NB_16
if (wb_sel_i[0])
- ss[7:0] <= #Tp wb_dat_i[7:0];
+ ss[7:0] <= wb_dat_i[7:0];
if (wb_sel_i[1])
- ss[`SPI_SS_NB-1:8] <= #Tp wb_dat_i[`SPI_SS_NB-1:8];
+ ss[`SPI_SS_NB-1:8] <= wb_dat_i[`SPI_SS_NB-1:8];
`endif
`ifdef SPI_SS_NB_24
if (wb_sel_i[0])
- ss[7:0] <= #Tp wb_dat_i[7:0];
+ ss[7:0] <= wb_dat_i[7:0];
if (wb_sel_i[1])
- ss[15:8] <= #Tp wb_dat_i[15:8];
+ ss[15:8] <= wb_dat_i[15:8];
if (wb_sel_i[2])
- ss[`SPI_SS_NB-1:16] <= #Tp wb_dat_i[`SPI_SS_NB-1:16];
+ ss[`SPI_SS_NB-1:16] <= wb_dat_i[`SPI_SS_NB-1:16];
`endif
`ifdef SPI_SS_NB_32
if (wb_sel_i[0])
- ss[7:0] <= #Tp wb_dat_i[7:0];
+ ss[7:0] <= wb_dat_i[7:0];
if (wb_sel_i[1])
- ss[15:8] <= #Tp wb_dat_i[15:8];
+ ss[15:8] <= wb_dat_i[15:8];
if (wb_sel_i[2])
- ss[23:16] <= #Tp wb_dat_i[23:16];
+ ss[23:16] <= wb_dat_i[23:16];
if (wb_sel_i[3])
- ss[`SPI_SS_NB-1:24] <= #Tp wb_dat_i[`SPI_SS_NB-1:24];
+ ss[`SPI_SS_NB-1:24] <= wb_dat_i[`SPI_SS_NB-1:24];
`endif
end
end
diff --git a/fpga/usrp2/opencores/spi/rtl/verilog/spi_top16.v b/fpga/usrp2/opencores/spi/rtl/verilog/spi_top16.v
new file mode 100644
index 000000000..ee808a8ab
--- /dev/null
+++ b/fpga/usrp2/opencores/spi/rtl/verilog/spi_top16.v
@@ -0,0 +1,182 @@
+
+// Modified 2010 by Matt Ettus to remove old verilog style and
+// allow 16-bit operation
+
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// spi_top.v ////
+//// ////
+//// This file is part of the SPI IP core project ////
+//// http://www.opencores.org/projects/spi/ ////
+//// ////
+//// Author(s): ////
+//// - Simon Srot (simons@opencores.org) ////
+//// ////
+//// All additional information is avaliable in the Readme.txt ////
+//// file. ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+//// ////
+//// Copyright (C) 2002 Authors ////
+//// ////
+//// This source file may be used and distributed without ////
+//// restriction provided that this copyright statement is not ////
+//// removed from the file and that any derivative work contains ////
+//// the original copyright notice and the associated disclaimer. ////
+//// ////
+//// This source file is free software; you can redistribute it ////
+//// and/or modify it under the terms of the GNU Lesser General ////
+//// Public License as published by the Free Software Foundation; ////
+//// either version 2.1 of the License, or (at your option) any ////
+//// later version. ////
+//// ////
+//// This source is distributed in the hope that it will be ////
+//// useful, but WITHOUT ANY WARRANTY; without even the implied ////
+//// warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR ////
+//// PURPOSE. See the GNU Lesser General Public License for more ////
+//// details. ////
+//// ////
+//// You should have received a copy of the GNU Lesser General ////
+//// Public License along with this source; if not, download it ////
+//// from http://www.opencores.org/lgpl.shtml ////
+//// ////
+//////////////////////////////////////////////////////////////////////
+
+
+`include "spi_defines.v"
+
+module spi_top16
+ (input wb_clk_i, input wb_rst_i,
+ input [4:0] wb_adr_i,
+ input [15:0] wb_dat_i,
+ output reg [15:0] wb_dat_o,
+ input [1:0] wb_sel_i,
+ input wb_we_i, input wb_stb_i, input wb_cyc_i,
+ output reg wb_ack_o, output wb_err_o, output reg wb_int_o,
+
+ // SPI signals
+ output [15:0] ss_pad_o, output sclk_pad_o, output mosi_pad_o, input miso_pad_i);
+
+ // Internal signals
+ reg [15:0] divider; // Divider register
+ reg [`SPI_CTRL_BIT_NB-1:0] ctrl; // Control and status register
+ reg [15:0] ss; // Slave select register
+ reg [31:0] wb_dat; // wb data out
+ wire [31:0] rx; // Rx register
+ wire rx_negedge; // miso is sampled on negative edge
+ wire tx_negedge; // mosi is driven on negative edge
+ wire [`SPI_CHAR_LEN_BITS-1:0] char_len; // char len
+ wire go; // go
+ wire lsb; // lsb first on line
+ wire ie; // interrupt enable
+ wire ass; // automatic slave select
+ wire spi_divider_sel; // divider register select
+ wire spi_ctrl_sel; // ctrl register select
+ wire [3:0] spi_tx_sel; // tx_l register select
+ wire spi_ss_sel; // ss register select
+ wire tip; // transfer in progress
+ wire pos_edge; // recognize posedge of sclk
+ wire neg_edge; // recognize negedge of sclk
+ wire last_bit; // marks last character bit
+
+ // Address decoder
+ assign spi_divider_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[4:2] == `SPI_DIVIDE);
+ assign spi_ctrl_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[4:2] == `SPI_CTRL);
+ assign spi_tx_sel[0] = wb_cyc_i & wb_stb_i & (wb_adr_i[4:2] == `SPI_TX_0);
+ assign spi_tx_sel[1] = wb_cyc_i & wb_stb_i & (wb_adr_i[4:2] == `SPI_TX_1);
+ assign spi_tx_sel[2] = wb_cyc_i & wb_stb_i & (wb_adr_i[4:2] == `SPI_TX_2);
+ assign spi_tx_sel[3] = wb_cyc_i & wb_stb_i & (wb_adr_i[4:2] == `SPI_TX_3);
+ assign spi_ss_sel = wb_cyc_i & wb_stb_i & (wb_adr_i[4:2] == `SPI_SS);
+
+ always @(wb_adr_i or rx or ctrl or divider or ss)
+ case (wb_adr_i[4:2])
+ `SPI_RX_0: wb_dat = rx[31:0];
+ `SPI_CTRL: wb_dat = {{32-`SPI_CTRL_BIT_NB{1'b0}}, ctrl};
+ `SPI_DIVIDE: wb_dat = {16'b0, divider};
+ `SPI_SS: wb_dat = {16'b0, ss};
+ default : wb_dat = 32'd0;
+ endcase // case (wb_adr_i[4:2])
+
+ always @(posedge wb_clk_i)
+ if (wb_rst_i)
+ wb_dat_o <= 32'b0;
+ else
+ wb_dat_o <= wb_adr_i[1] ? wb_dat[31:16] : wb_dat[15:0];
+
+ always @(posedge wb_clk_i)
+ if (wb_rst_i)
+ wb_ack_o <= 1'b0;
+ else
+ wb_ack_o <= wb_cyc_i & wb_stb_i & ~wb_ack_o;
+
+ assign wb_err_o = 1'b0;
+
+ // Interrupt
+ always @(posedge wb_clk_i)
+ if (wb_rst_i)
+ wb_int_o <= 1'b0;
+ else if (ie && tip && last_bit && pos_edge)
+ wb_int_o <= 1'b1;
+ else if (wb_ack_o)
+ wb_int_o <= 1'b0;
+
+ // Divider register
+ always @(posedge wb_clk_i)
+ if (wb_rst_i)
+ divider <= 16'b0;
+ else if (spi_divider_sel && wb_we_i && !tip && ~wb_adr_i[1])
+ divider <= wb_dat_i;
+
+ // Ctrl register
+ always @(posedge wb_clk_i)
+ if (wb_rst_i)
+ ctrl <= {`SPI_CTRL_BIT_NB{1'b0}};
+ else if(spi_ctrl_sel && wb_we_i && !tip && ~wb_adr_i[1])
+ begin
+ if (wb_sel_i[0])
+ ctrl[7:0] <= wb_dat_i[7:0] | {7'b0, ctrl[0]};
+ if (wb_sel_i[1])
+ ctrl[`SPI_CTRL_BIT_NB-1:8] <= wb_dat_i[`SPI_CTRL_BIT_NB-1:8];
+ end
+ else if(tip && last_bit && pos_edge)
+ ctrl[`SPI_CTRL_GO] <= 1'b0;
+
+ assign rx_negedge = ctrl[`SPI_CTRL_RX_NEGEDGE];
+ assign tx_negedge = ctrl[`SPI_CTRL_TX_NEGEDGE];
+ assign go = ctrl[`SPI_CTRL_GO];
+ assign char_len = ctrl[`SPI_CTRL_CHAR_LEN];
+ assign lsb = ctrl[`SPI_CTRL_LSB];
+ assign ie = ctrl[`SPI_CTRL_IE];
+ assign ass = ctrl[`SPI_CTRL_ASS];
+
+ // Slave select register
+ always @(posedge wb_clk_i)
+ if (wb_rst_i)
+ ss <= 16'b0;
+ else if(spi_ss_sel && wb_we_i && !tip & ~wb_adr_i[1])
+ begin
+ if (wb_sel_i[0])
+ ss[7:0] <= wb_dat_i[7:0];
+ if (wb_sel_i[1])
+ ss[15:8] <= wb_dat_i[15:8];
+ end
+
+ assign ss_pad_o = ~((ss & {16{tip & ass}}) | (ss & {16{!ass}}));
+
+ spi_clgen clgen (.clk_in(wb_clk_i), .rst(wb_rst_i), .go(go), .enable(tip), .last_clk(last_bit),
+ .divider(divider[`SPI_DIVIDER_LEN-1:0]), .clk_out(sclk_pad_o), .pos_edge(pos_edge),
+ .neg_edge(neg_edge));
+
+ wire [3:0] new_sels = { (wb_adr_i[1] & wb_sel_i[1]), (wb_adr_i[1] & wb_sel_i[0]),
+ (~wb_adr_i[1] & wb_sel_i[1]), (~wb_adr_i[1] & wb_sel_i[0]) };
+
+
+ spi_shift shift (.clk(wb_clk_i), .rst(wb_rst_i), .len(char_len[`SPI_CHAR_LEN_BITS-1:0]),
+ .latch(spi_tx_sel[3:0] & {4{wb_we_i}}), .byte_sel(new_sels), .lsb(lsb),
+ .go(go), .pos_edge(pos_edge), .neg_edge(neg_edge),
+ .rx_negedge(rx_negedge), .tx_negedge(tx_negedge),
+ .tip(tip), .last(last_bit),
+ .p_in({wb_dat_i,wb_dat_i}), .p_out(rx),
+ .s_clk(sclk_pad_o), .s_in(miso_pad_i), .s_out(mosi_pad_o));
+
+endmodule // spi_top16
diff --git a/fpga/usrp2/opencores/spi/rtl/verilog/timescale.v b/fpga/usrp2/opencores/spi/rtl/verilog/timescale.v
deleted file mode 100644
index 60d4ecbd1..000000000
--- a/fpga/usrp2/opencores/spi/rtl/verilog/timescale.v
+++ /dev/null
@@ -1,2 +0,0 @@
-`timescale 1ns / 10ps
-
diff --git a/fpga/usrp2/timing/time_compare.v b/fpga/usrp2/timing/time_compare.v
index a21c9f8e0..cb2b6d860 100644
--- a/fpga/usrp2/timing/time_compare.v
+++ b/fpga/usrp2/timing/time_compare.v
@@ -14,10 +14,34 @@ module time_compare
wire tick_match = (time_now[31:0] == trigger_time[31:0]);
wire tick_late = (time_now[31:0] > trigger_time[31:0]);
-
+/*
assign now = sec_match & tick_match;
assign late = sec_late | (sec_match & tick_late);
assign early = ~now & ~late;
+*/
+
+ /*
+ assign now = (time_now == trigger_time);
+ assign late = (time_now > trigger_time);
+ assign early = (time_now < trigger_time);
+ */
+
+ // Compare fewer bits instead of 64 to speed up logic
+ // Unused bits are not significant
+ // Top bit of seconds would put us in year 2038, long after
+ // the warranty has run out :)
+ // Top 5 bits of ticks are always zero for clocks less than 134MHz
+ // "late" can drop bottom few bits of ticks, and just delay signaling
+ // of late.
+ // "now" cannot drop those bits, it needs to be exact.
+
+ wire [57:0] short_now = {time_now[62:32],time_now[26:0]};
+ wire [57:0] short_trig = {trigger_time[62:32],trigger_time[26:0]};
+
+ assign now = (short_now == short_trig);
+ assign late = (short_now[57:5] > short_trig[57:5]);
+ assign early = (short_now < short_trig);
+
assign too_early = (trigger_time[63:32] > (time_now[63:32] + 4)); // Don't wait too long
endmodule // time_compare
diff --git a/fpga/usrp2/top/.gitignore b/fpga/usrp2/top/.gitignore
index bf1b77066..0d90f1698 100644
--- a/fpga/usrp2/top/.gitignore
+++ b/fpga/usrp2/top/.gitignore
@@ -1 +1,2 @@
/*.sav
+build*
diff --git a/fpga/usrp2/top/Makefile.common b/fpga/usrp2/top/Makefile.common
index 4da64ac28..6f855a070 100644
--- a/fpga/usrp2/top/Makefile.common
+++ b/fpga/usrp2/top/Makefile.common
@@ -13,8 +13,10 @@ else
endif
BASE_DIR = $(abspath ..)
ISE_HELPER = xtclsh $(BASE_DIR)/tcl/ise_helper.tcl
+SANITY_CHECKER = python $(BASE_DIR)/python/check_inout.py
ISE_FILE = $(BUILD_DIR)/$(TOP_MODULE).$(ISE_EXT)
BIN_FILE = $(BUILD_DIR)/$(TOP_MODULE).bin
+BIT_FILE = $(BUILD_DIR)/$(TOP_MODULE).bit
MCS_FILE = $(BUILD_DIR)/$(TOP_MODULE).mcs
##################################################
@@ -25,12 +27,14 @@ all: bin
proj: $(ISE_FILE)
check: $(ISE_FILE)
+ $(SANITY_CHECKER) $(TOP_MODULE).v $(TOP_MODULE).ucf
$(ISE_HELPER) "Check Syntax"
synth: $(ISE_FILE)
$(ISE_HELPER) "Synthesize - XST"
-bin: $(BIN_FILE)
+bin: check $(BIN_FILE)
+ $(ISE_HELPER) "Generate Programming File"
mcs: $(MCS_FILE)
@@ -53,6 +57,6 @@ $(BIN_FILE): $(ISE_FILE) $$(SOURCES) $$(MAKEFILE_LIST)
touch $@
$(MCS_FILE): $(BIN_FILE)
- promgen -w -spi -p mcs -o $(MCS_FILE) -s 4096 -u 0 $(BIN_FILE)
+ promgen -w -spi -p mcs -o $(MCS_FILE) -s 4096 -u 0 $(BIT_FILE)
.EXPORT_ALL_VARIABLES:
diff --git a/fpga/usrp2/top/python/check_inout.py b/fpga/usrp2/top/python/check_inout.py
new file mode 100755
index 000000000..ff371d378
--- /dev/null
+++ b/fpga/usrp2/top/python/check_inout.py
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+#
+# Copyright 2010 Ettus Research LLC
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+# Description:
+# generates a list of inputs and outputs from the top-level Verilog file and cross-references them to the .ucf.
+# outputs errors for pins that aren't found in the UCF, checks for capitalization errors and other common mistakes
+
+import sys
+import re
+
+if __name__=='__main__':
+ if len(sys.argv) == 2:
+ print "Usage: %s <top level Verilog file> <pin definition UCF>"
+ sys.exit(-1)
+
+ verilog_filename = sys.argv[1]
+ ucf_filename = sys.argv[2]
+
+ verilog_file = open(verilog_filename, 'r')
+ ucf_file = open(ucf_filename, 'r')
+
+ verilog_iolist = list()
+ ucf_iolist = list()
+
+ #read in all input, inout, and output declarations and compile a list
+ for line in verilog_file:
+ for match in re.findall(r"(?:input|inout|output) (?:reg )*(?:\[.*\] )*(\w+)", line.split("//")[0]):
+ verilog_iolist.append(match)
+
+ for line in ucf_file:
+ m = re.search(r"""NET "(\w+).*" """, line.split("#")[0])
+ if m is not None:
+ ucf_iolist.append(m.group(1))
+
+ #now find corresponding matches and error when you don't find one
+ #we search for .v defs without matching .ucf defs since the reverse isn't necessarily a problem
+ err = False
+
+ for item in verilog_iolist:
+ if item not in ucf_iolist:
+ print "Error: %s appears in the top-level Verilog file, but is not in the UCF definition file!" % item
+ err = True
+
+ if err:
+ sys.exit(-1)
+
+ print "No errors found."
+ sys.exit(0)
diff --git a/fpga/usrp2/top/safe_u2plus/.gitignore b/fpga/usrp2/top/safe_u2plus/.gitignore
new file mode 100644
index 000000000..a96f0be92
--- /dev/null
+++ b/fpga/usrp2/top/safe_u2plus/.gitignore
@@ -0,0 +1,2 @@
+build*
+*impact*
diff --git a/fpga/usrp2/top/safe_u2plus/Makefile b/fpga/usrp2/top/safe_u2plus/Makefile
new file mode 100644
index 000000000..62a02ff40
--- /dev/null
+++ b/fpga/usrp2/top/safe_u2plus/Makefile
@@ -0,0 +1,246 @@
+#
+# Copyright 2008 Ettus Research LLC
+#
+# This file is part of GNU Radio
+#
+# GNU Radio is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GNU Radio is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GNU Radio; see the file COPYING. If not, write to
+# the Free Software Foundation, Inc., 51 Franklin Street,
+# Boston, MA 02110-1301, USA.
+#
+
+##################################################
+# xtclsh Shell and tcl Script Path
+##################################################
+#XTCLSH := /opt/Xilinx/10.1/ISE/bin/lin/xtclsh
+XTCLSH := xtclsh
+ISE_HELPER := ../tcl/ise_helper.tcl
+
+##################################################
+# Project Setup
+##################################################
+BUILD_DIR := build/
+export TOP_MODULE := safe_u2plus
+export PROJ_FILE := $(BUILD_DIR)$(TOP_MODULE).ise
+
+##################################################
+# Project Properties
+##################################################
+export PROJECT_PROPERTIES := \
+family "Spartan-3A DSP" \
+device xc3sd3400a \
+package fg676 \
+speed -5 \
+top_level_module_type "HDL" \
+synthesis_tool "XST (VHDL/Verilog)" \
+simulator "ISE Simulator (VHDL/Verilog)" \
+"Preferred Language" "Verilog" \
+"Enable Message Filtering" FALSE \
+"Display Incremental Messages" FALSE
+
+##################################################
+# Sources
+##################################################
+export SOURCE_ROOT := ../../../
+export SOURCES := \
+control_lib/CRC16_D16.v \
+control_lib/atr_controller.v \
+control_lib/bin2gray.v \
+control_lib/dcache.v \
+control_lib/decoder_3_8.v \
+control_lib/dpram32.v \
+control_lib/gray2bin.v \
+control_lib/gray_send.v \
+control_lib/icache.v \
+control_lib/mux4.v \
+control_lib/mux8.v \
+control_lib/nsgpio.v \
+control_lib/ram_2port.v \
+control_lib/ram_harv_cache.v \
+control_lib/ram_loader.v \
+control_lib/setting_reg.v \
+control_lib/settings_bus.v \
+control_lib/srl.v \
+control_lib/system_control.v \
+control_lib/wb_1master.v \
+control_lib/wb_readback_mux.v \
+control_lib/simple_uart.v \
+control_lib/simple_uart_tx.v \
+control_lib/simple_uart_rx.v \
+control_lib/oneshot_2clk.v \
+control_lib/sd_spi.v \
+control_lib/sd_spi_wb.v \
+control_lib/wb_bridge_16_32.v \
+control_lib/reset_sync.v \
+simple_gemac/simple_gemac_wrapper.v \
+simple_gemac/simple_gemac.v \
+simple_gemac/simple_gemac_wb.v \
+simple_gemac/simple_gemac_tx.v \
+simple_gemac/simple_gemac_rx.v \
+simple_gemac/crc.v \
+simple_gemac/delay_line.v \
+simple_gemac/flow_ctrl_tx.v \
+simple_gemac/flow_ctrl_rx.v \
+simple_gemac/address_filter.v \
+simple_gemac/ll8_to_txmac.v \
+simple_gemac/rxmac_to_ll8.v \
+simple_gemac/miim/eth_miim.v \
+simple_gemac/miim/eth_clockgen.v \
+simple_gemac/miim/eth_outputcontrol.v \
+simple_gemac/miim/eth_shiftreg.v \
+control_lib/newfifo/buffer_int.v \
+control_lib/newfifo/buffer_pool.v \
+control_lib/newfifo/fifo_2clock.v \
+control_lib/newfifo/fifo_2clock_cascade.v \
+control_lib/newfifo/ll8_shortfifo.v \
+control_lib/newfifo/ll8_to_fifo36.v \
+control_lib/newfifo/fifo_short.v \
+control_lib/newfifo/fifo_long.v \
+control_lib/newfifo/fifo_cascade.v \
+control_lib/newfifo/fifo36_to_ll8.v \
+control_lib/longfifo.v \
+control_lib/shortfifo.v \
+control_lib/medfifo.v \
+coregen/fifo_xlnx_2Kx36_2clk.v \
+coregen/fifo_xlnx_2Kx36_2clk.xco \
+coregen/fifo_xlnx_512x36_2clk.v \
+coregen/fifo_xlnx_512x36_2clk.xco \
+coregen/fifo_xlnx_64x36_2clk.v \
+coregen/fifo_xlnx_64x36_2clk.xco \
+extram/wb_zbt16_b.v \
+opencores/8b10b/decode_8b10b.v \
+opencores/8b10b/encode_8b10b.v \
+opencores/aemb/rtl/verilog/aeMB_bpcu.v \
+opencores/aemb/rtl/verilog/aeMB_core_BE.v \
+opencores/aemb/rtl/verilog/aeMB_ctrl.v \
+opencores/aemb/rtl/verilog/aeMB_edk32.v \
+opencores/aemb/rtl/verilog/aeMB_ibuf.v \
+opencores/aemb/rtl/verilog/aeMB_regf.v \
+opencores/aemb/rtl/verilog/aeMB_xecu.v \
+opencores/i2c/rtl/verilog/i2c_master_bit_ctrl.v \
+opencores/i2c/rtl/verilog/i2c_master_byte_ctrl.v \
+opencores/i2c/rtl/verilog/i2c_master_defines.v \
+opencores/i2c/rtl/verilog/i2c_master_top.v \
+opencores/i2c/rtl/verilog/timescale.v \
+opencores/simple_pic/rtl/simple_pic.v \
+opencores/spi/rtl/verilog/spi_clgen.v \
+opencores/spi/rtl/verilog/spi_defines.v \
+opencores/spi/rtl/verilog/spi_shift.v \
+opencores/spi/rtl/verilog/spi_top.v \
+opencores/spi/rtl/verilog/timescale.v \
+sdr_lib/acc.v \
+sdr_lib/add2.v \
+sdr_lib/add2_and_round.v \
+sdr_lib/add2_and_round_reg.v \
+sdr_lib/add2_reg.v \
+sdr_lib/cic_dec_shifter.v \
+sdr_lib/cic_decim.v \
+sdr_lib/cic_int_shifter.v \
+sdr_lib/cic_interp.v \
+sdr_lib/cic_strober.v \
+sdr_lib/clip.v \
+sdr_lib/clip_reg.v \
+sdr_lib/cordic.v \
+sdr_lib/cordic_z24.v \
+sdr_lib/cordic_stage.v \
+sdr_lib/dsp_core_rx.v \
+sdr_lib/dsp_core_tx.v \
+sdr_lib/hb_dec.v \
+sdr_lib/hb_interp.v \
+sdr_lib/round.v \
+sdr_lib/round_reg.v \
+sdr_lib/rx_control.v \
+sdr_lib/rx_dcoffset.v \
+sdr_lib/sign_extend.v \
+sdr_lib/small_hb_dec.v \
+sdr_lib/small_hb_int.v \
+sdr_lib/tx_control.v \
+serdes/serdes.v \
+serdes/serdes_fc_rx.v \
+serdes/serdes_fc_tx.v \
+serdes/serdes_rx.v \
+serdes/serdes_tx.v \
+timing/time_receiver.v \
+timing/time_sender.v \
+timing/time_sync.v \
+timing/timer.v \
+top/u2_core/u2_core.v \
+top/u2plus/capture_ddrlvds.v \
+top/safe_u2plus/u2plus.ucf \
+top/safe_u2plus/safe_u2plus.v
+
+##################################################
+# Process Properties
+##################################################
+export SYNTHESIZE_PROPERTIES := \
+"Number of Clock Buffers" 6 \
+"Pack I/O Registers into IOBs" Yes \
+"Optimization Effort" High \
+"Optimize Instantiated Primitives" TRUE \
+"Register Balancing" Yes \
+"Use Clock Enable" Auto \
+"Use Synchronous Reset" Auto \
+"Use Synchronous Set" Auto
+
+export TRANSLATE_PROPERTIES := \
+"Macro Search Path" "$(shell pwd)/../../coregen/"
+
+export MAP_PROPERTIES := \
+"Allow Logic Optimization Across Hierarchy" TRUE \
+"Map to Input Functions" 4 \
+"Optimization Strategy (Cover Mode)" Speed \
+"Pack I/O Registers/Latches into IOBs" "For Inputs and Outputs" \
+"Perform Timing-Driven Packing and Placement" TRUE \
+"Map Effort Level" High \
+"Extra Effort" Normal \
+"Combinatorial Logic Optimization" TRUE \
+"Register Duplication" TRUE
+
+export PLACE_ROUTE_PROPERTIES := \
+"Place & Route Effort Level (Overall)" High
+
+export STATIC_TIMING_PROPERTIES := \
+"Number of Paths in Error/Verbose Report" 10 \
+"Report Type" "Error Report"
+
+export GEN_PROG_FILE_PROPERTIES := \
+"Configuration Rate" 6 \
+"Create Binary Configuration File" TRUE \
+"Done (Output Events)" 5 \
+"Enable Bitstream Compression" TRUE \
+"Enable Outputs (Output Events)" 6
+
+export SIM_MODEL_PROPERTIES := ""
+
+##################################################
+# Make Options
+##################################################
+all:
+ @echo make proj, check, synth, bin, or clean
+
+proj:
+ PROCESS_RUN="" $(XTCLSH) $(ISE_HELPER)
+
+check:
+ PROCESS_RUN="Check Syntax" $(XTCLSH) $(ISE_HELPER)
+
+synth:
+ PROCESS_RUN="Synthesize - XST" $(XTCLSH) $(ISE_HELPER)
+
+bin:
+ PROCESS_RUN="Generate Programming File" $(XTCLSH) $(ISE_HELPER)
+
+clean:
+ rm -rf $(BUILD_DIR)
+
+
diff --git a/fpga/usrp2/top/safe_u2plus/safe_u2plus.v b/fpga/usrp2/top/safe_u2plus/safe_u2plus.v
new file mode 100644
index 000000000..dca9688c5
--- /dev/null
+++ b/fpga/usrp2/top/safe_u2plus/safe_u2plus.v
@@ -0,0 +1,23 @@
+`timescale 1ns / 1ps
+//////////////////////////////////////////////////////////////////////////////////
+
+module safe_u2plus
+ (
+ input CLK_FPGA_P, input CLK_FPGA_N, // Diff
+ output [5:1] leds, // LED4 is shared w/INIT_B
+ output ETH_LED
+ );
+
+ wire clk_fpga;
+
+ IBUFGDS clk_fpga_pin (.O(clk_fpga),.I(CLK_FPGA_P),.IB(CLK_FPGA_N));
+ defparam clk_fpga_pin.IOSTANDARD = "LVPECL_25";
+
+ reg [31:0] ctr;
+
+ always @(posedge clk_fpga)
+ ctr <= ctr + 1;
+
+ assign {leds,ETH_LED} = ~ctr[29:24];
+
+endmodule // safe_u2plus
diff --git a/fpga/usrp2/top/safe_u2plus/u2plus.ucf b/fpga/usrp2/top/safe_u2plus/u2plus.ucf
new file mode 100755
index 000000000..0a9460d86
--- /dev/null
+++ b/fpga/usrp2/top/safe_u2plus/u2plus.ucf
@@ -0,0 +1,401 @@
+## Main 100 MHz Clock
+NET "CLK_FPGA_P" LOC = "AA13" ;
+NET "CLK_FPGA_N" LOC = "Y13" ;
+
+## ADC
+#NET "ADC_clkout_p" LOC = "P1" ;
+#NET "ADC_clkout_n" LOC = "P2" ;
+#NET "ADCA_12_p" LOC = "Y1" ;
+#NET "ADCA_12_n" LOC = "Y2" ;
+#NET "ADCA_10_p" LOC = "W3" ;
+#NET "ADCA_10_n" LOC = "W4" ;
+#NET "ADCA_8_p" LOC = "T7" ;
+#NET "ADCA_8_n" LOC = "U6" ;
+#NET "ADCA_6_p" LOC = "U5" ;
+#NET "ADCA_6_n" LOC = "V5" ;
+#NET "ADCA_4_p" LOC = "T10" ;
+#NET "ADCA_4_n" LOC = "T9" ;
+#NET "ADCA_2_p" LOC = "V1" ;
+#NET "ADCA_2_n" LOC = "V2" ;
+#NET "ADCA_0_p" LOC = "R8" ;
+#NET "ADCA_0_n" LOC = "R7" ;
+#NET "ADCB_2_p" LOC = "U7" ;
+#NET "ADCB_2_n" LOC = "U8" ;
+#NET "ADCB_0_p" LOC = "AA2" ;
+#NET "ADCB_0_n" LOC = "AA3" ;
+#NET "ADCB_4_p" LOC = "AE1" ;
+#NET "ADCB_4_n" LOC = "AE2" ;
+#NET "ADCB_6_p" LOC = "W1" ;
+#NET "ADCB_6_n" LOC = "W2" ;
+#NET "ADCB_8_p" LOC = "U3" ;
+#NET "ADCB_8_n" LOC = "V4" ;
+#NET "ADCB_10_p" LOC = "J1" ;
+#NET "ADCB_10_n" LOC = "K1" ;
+#NET "ADCB_12_p" LOC = "J3" ;
+#NET "ADCB_12_n" LOC = "J2" ;
+
+## DAC
+#NET "DAC_LOCK" LOC = "P4" ;
+#NET "DACA<0>" LOC = "P8" ;
+#NET "DACA<1>" LOC = "P9" ;
+#NET "DACA<2>" LOC = "R5" ;
+#NET "DACA<3>" LOC = "R6" ;
+#NET "DACA<4>" LOC = "P7" ;
+#NET "DACA<5>" LOC = "P6" ;
+#NET "DACA<6>" LOC = "T3" ;
+#NET "DACA<7>" LOC = "T4" ;
+#NET "DACA<8>" LOC = "R3" ;
+#NET "DACA<9>" LOC = "R4" ;
+#NET "DACA<10>" LOC = "R2" ;
+#NET "DACA<11>" LOC = "N1" ;
+#NET "DACA<12>" LOC = "N2" ;
+#NET "DACA<13>" LOC = "N5" ;
+#NET "DACA<14>" LOC = "N4" ;
+#NET "DACA<15>" LOC = "M2" ;
+#NET "DACB<0>" LOC = "M5" ;
+#NET "DACB<1>" LOC = "M6" ;
+#NET "DACB<2>" LOC = "M4" ;
+#NET "DACB<3>" LOC = "M3" ;
+#NET "DACB<4>" LOC = "M8" ;
+#NET "DACB<5>" LOC = "M7" ;
+#NET "DACB<6>" LOC = "L4" ;
+#NET "DACB<7>" LOC = "L3" ;
+#NET "DACB<8>" LOC = "K3" ;
+#NET "DACB<9>" LOC = "K2" ;
+#NET "DACB<10>" LOC = "K5" ;
+#NET "DACB<11>" LOC = "K4" ;
+#NET "DACB<12>" LOC = "M10" ;
+#NET "DACB<13>" LOC = "M9" ;
+#NET "DACB<14>" LOC = "J5" ;
+#NET "DACB<15>" LOC = "J4" ;
+
+## TX DB GPIO
+#NET "io_tx<15>" LOC = "K6" ;
+#NET "io_tx<14>" LOC = "L7" ;
+#NET "io_tx<13>" LOC = "H2" ;
+#NET "io_tx<12>" LOC = "H1" ;
+#NET "io_tx<11>" LOC = "L10" ;
+#NET "io_tx<10>" LOC = "L9" ;
+#NET "io_tx<9>" LOC = "G3" ;
+#NET "io_tx<8>" LOC = "F3" ;
+#NET "io_tx<7>" LOC = "K7" ;
+#NET "io_tx<6>" LOC = "J6" ;
+#NET "io_tx<5>" LOC = "E1" ;
+#NET "io_tx<4>" LOC = "F2" ;
+#NET "io_tx<3>" LOC = "J7" ;
+#NET "io_tx<2>" LOC = "H6" ;
+#NET "io_tx<1>" LOC = "F5" ;
+#NET "io_tx<0>" LOC = "G4" ;
+
+## RX DB GPIO
+#NET "io_rx<15>" LOC = "AD1" ;
+#NET "io_rx<14>" LOC = "AD2" ;
+#NET "io_rx<13>" LOC = "AC2" ;
+#NET "io_rx<12>" LOC = "AC3" ;
+#NET "io_rx<11>" LOC = "W7" ;
+#NET "io_rx<10>" LOC = "W6" ;
+#NET "io_rx<9>" LOC = "U9" ;
+#NET "io_rx<8>" LOC = "V8" ;
+#NET "io_rx<7>" LOC = "AB1" ;
+#NET "io_rx<6>" LOC = "AC1" ;
+#NET "io_rx<5>" LOC = "V7" ;
+#NET "io_rx<4>" LOC = "V6" ;
+#NET "io_rx<3>" LOC = "Y5" ;
+#NET "io_rx<2>" LOC = "R10" ;
+#NET "io_rx<1>" LOC = "R1" ;
+#NET "io_rx<0>" LOC = "M1" ;
+
+## MISC
+NET "leds<5>" LOC = "AF25" ;
+NET "leds<4>" LOC = "AE25" ;
+NET "leds<3>" LOC = "AF23" ;
+NET "leds<2>" LOC = "AE23" ;
+NET "leds<1>" LOC = "AB18" ;
+#NET "FPGA_RESET" LOC = "K24" ;
+
+## Debug
+#NET "debug_clk<0>" LOC = "AA10" ;
+#NET "debug_clk<1>" LOC = "AD11" ;
+#NET "debug<0>" LOC = "AC19" ;
+#NET "debug<1>" LOC = "AF20" ;
+#NET "debug<2>" LOC = "AE20" ;
+#NET "debug<3>" LOC = "AC16" ;
+#NET "debug<4>" LOC = "AB16" ;
+#NET "debug<5>" LOC = "AF19" ;
+#NET "debug<6>" LOC = "AE19" ;
+#NET "debug<7>" LOC = "V15" ;
+#NET "debug<8>" LOC = "U15" ;
+#NET "debug<9>" LOC = "AE17" ;
+#NET "debug<10>" LOC = "AD17" ;
+#NET "debug<11>" LOC = "V14" ;
+#NET "debug<12>" LOC = "W15" ;
+#NET "debug<13>" LOC = "AC15" ;
+#NET "debug<14>" LOC = "AD14" ;
+#NET "debug<15>" LOC = "AC14" ;
+#NET "debug<16>" LOC = "AC11" ;
+#NET "debug<17>" LOC = "AB12" ;
+#NET "debug<18>" LOC = "AC12" ;
+#NET "debug<19>" LOC = "V13" ;
+#NET "debug<20>" LOC = "W13" ;
+#NET "debug<21>" LOC = "AE8" ;
+#NET "debug<22>" LOC = "AF8" ;
+#NET "debug<23>" LOC = "V12" ;
+#NET "debug<24>" LOC = "W12" ;
+#NET "debug<25>" LOC = "AB9" ;
+#NET "debug<26>" LOC = "AC9" ;
+#NET "debug<27>" LOC = "AC8" ;
+#NET "debug<28>" LOC = "AB7" ;
+#NET "debug<29>" LOC = "V11" ;
+#NET "debug<30>" LOC = "U11" ;
+#NET "debug<31>" LOC = "Y10" ;
+
+## UARTS
+#NET "TXD<3>" LOC = "AD20" ;
+#NET "TXD<2>" LOC = "AC20" ;
+#NET "TXD<1>" LOC = "AD19" ;
+#NET "RXD<3>" LOC = "AF17" ;
+#NET "RXD<2>" LOC = "AF15" ;
+#NET "RXD<1>" LOC = "AD12" ;
+
+## AD9510
+#NET "CLK_STATUS" LOC = "AD22" ;
+#NET "CLK_FUNC" LOC = "AC21" ;
+#NET "clk_sel<0>" LOC = "AE21" ;
+#NET "clk_sel<1>" LOC = "AD21" ;
+#NET "clk_en<1>" LOC = "AA17" ;
+#NET "clk_en<0>" LOC = "Y17" ;
+
+## I2C
+#NET "SDA" LOC = "V16" ;
+#NET "SCL" LOC = "U16" ;
+
+## Timing
+#NET "PPS_IN" LOC = "AB6" ;
+#NET "PPS2_IN" LOC = "AA20" ;
+
+## SPI
+#NET "SEN_CLK" LOC = "AA18" ;
+#NET "MOSI_CLK" LOC = "W17" ;
+#NET "SCLK_CLK" LOC = "V17" ;
+#NET "MISO_CLK" LOC = "AC10" ;
+
+#NET "SEN_DAC" LOC = "AE7" ;
+#NET "SCLK_DAC" LOC = "AF5" ;
+#NET "MOSI_DAC" LOC = "AE6" ;
+#NET "MISO_DAC" LOC = "Y3" ;
+
+#NET "SCLK_ADC" LOC = "B1" ;
+#NET "MOSI_ADC" LOC = "J8" ;
+#NET "SEN_ADC" LOC = "J9" ;
+
+#NET "MOSI_TX_ADC" LOC = "V10" ;
+#NET "SEN_TX_ADC" LOC = "W10" ;
+#NET "SCLK_TX_ADC" LOC = "AC6" ;
+#NET "MISO_TX_ADC" LOC = "G1" ;
+
+#NET "MOSI_TX_DAC" LOC = "AD6" ;
+#NET "SEN_TX_DAC" LOC = "AE4" ;
+#NET "SCLK_TX_DAC" LOC = "AF4" ;
+
+#NET "SCLK_TX_DB" LOC = "AE3" ;
+#NET "MOSI_TX_DB" LOC = "AF3" ;
+#NET "SEN_TX_DB" LOC = "W9" ;
+#NET "MISO_TX_DB" LOC = "AA5" ;
+
+#NET "MOSI_RX_ADC" LOC = "E3" ;
+#NET "SCLK_RX_ADC" LOC = "F4" ;
+#NET "SEN_RX_ADC" LOC = "D3" ;
+#NET "MISO_RX_ADC" LOC = "C1" ;
+
+#NET "SCLK_RX_DAC" LOC = "E4" ;
+#NET "SEN_RX_DAC" LOC = "K9" ;
+#NET "MOSI_RX_DAC" LOC = "K8" ;
+
+#NET "SCLK_RX_DB" LOC = "G6" ;
+#NET "MOSI_RX_DB" LOC = "H7" ;
+#NET "SEN_RX_DB" LOC = "B2" ;
+#NET "MISO_RX_DB" LOC = "H4" ;
+
+## ETH PHY
+#NET "CLK_TO_MAC" LOC = "P26" ;
+
+#NET "GMII_TXD<7>" LOC = "G21" ;
+#NET "GMII_TXD<6>" LOC = "C26" ;
+#NET "GMII_TXD<5>" LOC = "C25" ;
+#NET "GMII_TXD<4>" LOC = "J21" ;
+#NET "GMII_TXD<3>" LOC = "H21" ;
+#NET "GMII_TXD<2>" LOC = "D25" ;
+#NET "GMII_TXD<1>" LOC = "D24" ;
+#NET "GMII_TXD<0>" LOC = "E26" ;
+#NET "GMII_TX_EN" LOC = "D26" ;
+#NET "GMII_TX_ER" LOC = "J19" ;
+#NET "GMII_GTX_CLK" LOC = "J20" ;
+#NET "GMII_TX_CLK" LOC = "P25" ;
+
+#NET "GMII_RX_CLK" LOC = "P21" ;
+#NET "GMII_RXD<7>" LOC = "G22" ;
+#NET "GMII_RXD<6>" LOC = "K19" ;
+#NET "GMII_RXD<5>" LOC = "K18" ;
+#NET "GMII_RXD<4>" LOC = "E24" ;
+#NET "GMII_RXD<3>" LOC = "F23" ;
+#NET "GMII_RXD<2>" LOC = "L18" ;
+#NET "GMII_RXD<1>" LOC = "L17" ;
+#NET "GMII_RXD<0>" LOC = "F25" ;
+#NET "GMII_RX_DV" LOC = "F24" ;
+#NET "GMII_RX_ER" LOC = "L20" ;
+#NET "GMII_CRS" LOC = "K20" ;
+#NET "GMII_COL" LOC = "G23" ;
+
+#NET "PHY_INTn" LOC = "L22" ;
+#NET "MDIO" LOC = "K21" ;
+#NET "MDC" LOC = "J23" ;
+#NET "PHY_RESETn" LOC = "J22" ;
+NET "ETH_LED" LOC = "H20" ;
+
+## MIMO Interface
+#NET "exp_time_out_p" LOC = "Y14" ;
+#NET "exp_time_out_n" LOC = "AA14" ;
+#NET "exp_time_in_p" LOC = "N18" ;
+#NET "exp_time_in_n" LOC = "N17" ;
+#NET "exp_user_out_p" LOC = "AF14" ;
+#NET "exp_user_out_n" LOC = "AE14" ;
+#NET "exp_user_in_p" LOC = "L24" ;
+#NET "exp_user_in_n" LOC = "M23" ;
+
+## SERDES
+#NET "ser_enable" LOC = "R20" ;
+#NET "ser_prbsen" LOC = "U23" ;
+#NET "ser_loopen" LOC = "R19" ;
+#NET "ser_rx_en" LOC = "Y21" ;
+#NET "ser_tx_clk" LOC = "P23" ; # SERDES TX CLK
+#NET "ser_t<15>" LOC = "V23" ;
+#NET "ser_t<14>" LOC = "U22" ;
+#NET "ser_t<13>" LOC = "V24" ;
+#NET "ser_t<12>" LOC = "V25" ;
+#NET "ser_t<11>" LOC = "W23" ;
+#NET "ser_t<10>" LOC = "V22" ;
+#NET "ser_t<9>" LOC = "T18" ;
+#NET "ser_t<8>" LOC = "T17" ;
+#NET "ser_t<7>" LOC = "Y24" ;
+#NET "ser_t<6>" LOC = "Y25" ;
+#NET "ser_t<5>" LOC = "U21" ;
+#NET "ser_t<4>" LOC = "T20" ;
+#NET "ser_t<3>" LOC = "Y22" ;
+#NET "ser_t<2>" LOC = "Y23" ;
+#NET "ser_t<1>" LOC = "U19" ;
+#NET "ser_t<0>" LOC = "U18" ;
+#NET "ser_tkmsb" LOC = "AA24" ;
+#NET "ser_tklsb" LOC = "AA25" ;
+#NET "ser_rx_clk" LOC = "P18" ;
+#NET "ser_r<15>" LOC = "V21" ;
+#NET "ser_r<14>" LOC = "U20" ;
+#NET "ser_r<13>" LOC = "AA22" ;
+#NET "ser_r<12>" LOC = "AA23" ;
+#NET "ser_r<11>" LOC = "V18" ;
+#NET "ser_r<10>" LOC = "V19" ;
+#NET "ser_r<9>" LOC = "AB23" ;
+#NET "ser_r<8>" LOC = "AC26" ;
+#NET "ser_r<7>" LOC = "AB26" ;
+#NET "ser_r<6>" LOC = "AD26" ;
+#NET "ser_r<5>" LOC = "AC25" ;
+#NET "ser_r<4>" LOC = "W20" ;
+#NET "ser_r<3>" LOC = "W21" ;
+#NET "ser_r<2>" LOC = "AC23" ;
+#NET "ser_r<1>" LOC = "AC24" ;
+#NET "ser_r<0>" LOC = "AE26" ;
+#NET "ser_rkmsb" LOC = "AD25" ;
+#NET "ser_rklsb" LOC = "Y20" ;
+
+## SRAM
+#NET "RAM_D<35>" LOC = "K16" ;
+#NET "RAM_D<34>" LOC = "D20" ;
+#NET "RAM_D<33>" LOC = "C20" ;
+#NET "RAM_D<32>" LOC = "E21" ;
+#NET "RAM_D<31>" LOC = "D21" ;
+#NET "RAM_D<30>" LOC = "C21" ;
+#NET "RAM_D<29>" LOC = "B21" ;
+#NET "RAM_D<28>" LOC = "H17" ;
+#NET "RAM_D<27>" LOC = "G17" ;
+#NET "RAM_D<26>" LOC = "B23" ;
+#NET "RAM_D<25>" LOC = "A22" ;
+#NET "RAM_D<24>" LOC = "D23" ;
+#NET "RAM_D<23>" LOC = "C23" ;
+#NET "RAM_D<22>" LOC = "D22" ;
+#NET "RAM_D<21>" LOC = "C22" ;
+#NET "RAM_D<20>" LOC = "F19" ;
+#NET "RAM_D<19>" LOC = "G20" ;
+#NET "RAM_D<18>" LOC = "F20" ;
+#NET "RAM_D<17>" LOC = "F7" ;
+#NET "RAM_D<16>" LOC = "E7" ;
+#NET "RAM_D<15>" LOC = "G9" ;
+#NET "RAM_D<14>" LOC = "H9" ;
+#NET "RAM_D<13>" LOC = "G10" ;
+#NET "RAM_D<12>" LOC = "H10" ;
+#NET "RAM_D<11>" LOC = "A4" ;
+#NET "RAM_D<10>" LOC = "B4" ;
+#NET "RAM_D<9>" LOC = "C5" ;
+#NET "RAM_D<8>" LOC = "D6" ;
+#NET "RAM_D<7>" LOC = "J11" ;
+#NET "RAM_D<6>" LOC = "K11" ;
+#NET "RAM_D<5>" LOC = "B7" ;
+#NET "RAM_D<4>" LOC = "C7" ;
+#NET "RAM_D<3>" LOC = "B6" ;
+#NET "RAM_D<2>" LOC = "C6" ;
+#NET "RAM_D<1>" LOC = "C8" ;
+#NET "RAM_D<0>" LOC = "D8" ;
+#NET "RAM_A<0>" LOC = "C11" ;
+#NET "RAM_A<1>" LOC = "E12" ;
+#NET "RAM_A<2>" LOC = "F12" ;
+#NET "RAM_A<3>" LOC = "D13" ;
+#NET "RAM_A<4>" LOC = "C12" ;
+#NET "RAM_A<5>" LOC = "A12" ;
+#NET "RAM_A<6>" LOC = "B12" ;
+#NET "RAM_A<7>" LOC = "E14" ;
+#NET "RAM_A<8>" LOC = "F14" ;
+#NET "RAM_A<9>" LOC = "B15" ;
+#NET "RAM_A<10>" LOC = "A15" ;
+#NET "RAM_A<11>" LOC = "D16" ;
+#NET "RAM_A<12>" LOC = "C15" ;
+#NET "RAM_A<13>" LOC = "D17" ;
+#NET "RAM_A<14>" LOC = "C16" ;
+#NET "RAM_A<15>" LOC = "F15" ;
+#NET "RAM_A<16>" LOC = "C17" ;
+#NET "RAM_A<17>" LOC = "B17" ;
+#NET "RAM_A<18>" LOC = "B18" ;
+#NET "RAM_A<19>" LOC = "A18" ;
+#NET "RAM_A<20>" LOC = "D18" ;
+#NET "RAM_BWn<3>" LOC = "D9" ;
+#NET "RAM_BWn<2>" LOC = "A9" ;
+#NET "RAM_BWn<1>" LOC = "B9" ;
+#NET "RAM_BWn<0>" LOC = "G12" ;
+#NET "RAM_ZZ" LOC = "J12" ;
+#NET "RAM_LDn" LOC = "H12" ;
+#NET "RAM_OEn" LOC = "C10" ;
+#NET "RAM_WEn" LOC = "D10" ;
+#NET "RAM_CENn" LOC = "B10" ;
+#NET "RAM_CLK" LOC = "A10" ;
+
+## SPI Flash
+#NET "flash_miso" LOC = "AF24" ;
+#NET "flash_clk" LOC = "AE24" ;
+#NET "flash_mosi" LOC = "AB15" ;
+#NET "flash_cs" LOC = "AA7" ;
+
+## MISC FPGA, unused for now
+##NET "PROG_B" LOC = "A2" ;
+##NET "PUDC_B" LOC = "G8" ;
+##NET "DONE" LOC = "AB21" ;
+##NET "INIT_B" LOC = "AA15" ;
+
+
+##NET "unnamed_net19" LOC = "AE9" ; # VS1
+##NET "unnamed_net18" LOC = "AF9" ; # VS0
+##NET "unnamed_net17" LOC = "AA12" ; # VS2
+##NET "unnamed_net16" LOC = "Y7" ; # M2
+##NET "unnamed_net15" LOC = "AC4" ; # M1
+##NET "unnamed_net14" LOC = "AD4" ; # M0
+##NET "unnamed_net13" LOC = "D4" ; # TMS
+##NET "unnamed_net12" LOC = "E23" ; # TDO
+##NET "unnamed_net11" LOC = "G7" ; # TDI
+##NET "unnamed_net10" LOC = "A25" ; # TCK
+##NET "unnamed_net20" LOC = "V20" ; # SUSPEND
diff --git a/fpga/usrp2/top/u1e/.gitignore b/fpga/usrp2/top/u1e/.gitignore
new file mode 100644
index 000000000..8d872713e
--- /dev/null
+++ b/fpga/usrp2/top/u1e/.gitignore
@@ -0,0 +1,6 @@
+*~
+build
+*.log
+*.cmd
+tb_u1e
+*.lxt
diff --git a/fpga/usrp2/top/u1e/Makefile b/fpga/usrp2/top/u1e/Makefile
new file mode 100644
index 000000000..3cb9fd8f3
--- /dev/null
+++ b/fpga/usrp2/top/u1e/Makefile
@@ -0,0 +1,101 @@
+#
+# Copyright 2008 Ettus Research LLC
+#
+
+##################################################
+# Project Setup
+##################################################
+TOP_MODULE = u1e
+BUILD_DIR = $(abspath build$(ISE))
+
+##################################################
+# Include other makefiles
+##################################################
+
+include ../Makefile.common
+include ../../fifo/Makefile.srcs
+include ../../control_lib/Makefile.srcs
+include ../../sdr_lib/Makefile.srcs
+include ../../serdes/Makefile.srcs
+include ../../simple_gemac/Makefile.srcs
+include ../../timing/Makefile.srcs
+include ../../opencores/Makefile.srcs
+include ../../vrt/Makefile.srcs
+include ../../udp/Makefile.srcs
+include ../../coregen/Makefile.srcs
+include ../../extram/Makefile.srcs
+include ../../gpmc/Makefile.srcs
+
+##################################################
+# Project Properties
+##################################################
+export PROJECT_PROPERTIES := \
+family "Spartan-3A DSP" \
+device xc3sd1800a \
+package cs484 \
+speed -4 \
+top_level_module_type "HDL" \
+synthesis_tool "XST (VHDL/Verilog)" \
+simulator "ISE Simulator (VHDL/Verilog)" \
+"Preferred Language" "Verilog" \
+"Enable Message Filtering" FALSE \
+"Display Incremental Messages" FALSE
+
+##################################################
+# Sources
+##################################################
+TOP_SRCS = \
+u1e_core.v \
+u1e.v \
+u1e.ucf \
+timing.ucf
+
+SOURCES = $(abspath $(TOP_SRCS)) $(FIFO_SRCS) \
+$(CONTROL_LIB_SRCS) $(SDR_LIB_SRCS) $(SERDES_SRCS) \
+$(SIMPLE_GEMAC_SRCS) $(TIMING_SRCS) $(OPENCORES_SRCS) \
+$(VRT_SRCS) $(UDP_SRCS) $(COREGEN_SRCS) $(EXTRAM_SRCS) \
+$(GPMC_SRCS)
+
+##################################################
+# Process Properties
+##################################################
+SYNTHESIZE_PROPERTIES = \
+"Number of Clock Buffers" 8 \
+"Pack I/O Registers into IOBs" Yes \
+"Optimization Effort" High \
+"Optimize Instantiated Primitives" TRUE \
+"Register Balancing" Yes \
+"Use Clock Enable" Auto \
+"Use Synchronous Reset" Auto \
+"Use Synchronous Set" Auto
+
+TRANSLATE_PROPERTIES = \
+"Macro Search Path" "$(shell pwd)/../../coregen/"
+
+MAP_PROPERTIES = \
+"Allow Logic Optimization Across Hierarchy" TRUE \
+"Map to Input Functions" 4 \
+"Optimization Strategy (Cover Mode)" Speed \
+"Pack I/O Registers/Latches into IOBs" "For Inputs and Outputs" \
+"Perform Timing-Driven Packing and Placement" TRUE \
+"Map Effort Level" High \
+"Extra Effort" Normal \
+"Combinatorial Logic Optimization" TRUE \
+"Register Duplication" TRUE
+
+PLACE_ROUTE_PROPERTIES = \
+"Place & Route Effort Level (Overall)" High
+
+STATIC_TIMING_PROPERTIES = \
+"Number of Paths in Error/Verbose Report" 10 \
+"Report Type" "Error Report"
+
+GEN_PROG_FILE_PROPERTIES = \
+"Configuration Rate" 6 \
+"Create Binary Configuration File" TRUE \
+"Done (Output Events)" 5 \
+"Enable Bitstream Compression" TRUE \
+"Enable Outputs (Output Events)" 6 \
+"Unused IOB Pins" "Pull Up"
+
+SIM_MODEL_PROPERTIES = ""
diff --git a/fpga/usrp2/top/u1e/README b/fpga/usrp2/top/u1e/README
new file mode 100644
index 000000000..14c7a4955
--- /dev/null
+++ b/fpga/usrp2/top/u1e/README
@@ -0,0 +1,4 @@
+
+make clean
+make sim
+./tb_u1e -lxt2
diff --git a/fpga/usrp2/top/u1e/cmdfile b/fpga/usrp2/top/u1e/cmdfile
new file mode 100644
index 000000000..291c723b8
--- /dev/null
+++ b/fpga/usrp2/top/u1e/cmdfile
@@ -0,0 +1,20 @@
+
+# My stuff
+-y .
+-y ../../control_lib
+-y ../../control_lib/newfifo
+-y ../../sdr_lib
+-y ../../timing
+-y ../../coregen
+-y ../../gpmc
+
+# Models
+-y ../../models
+-y /opt/Xilinx/10.1/ISE/verilog/src/unisims
+
+# Open Cores
+-y ../../opencores/spi/rtl/verilog
++incdir+../../opencores/spi/rtl/verilog
+-y ../../opencores/i2c/rtl/verilog
++incdir+../../opencores/i2c/rtl/verilog
+
diff --git a/fpga/usrp2/top/u1e/make.sim b/fpga/usrp2/top/u1e/make.sim
new file mode 100644
index 000000000..1c163884c
--- /dev/null
+++ b/fpga/usrp2/top/u1e/make.sim
@@ -0,0 +1,7 @@
+all: sim
+
+sim:
+ iverilog -Wimplicit -Wportbind -c cmdfile tb_u1e.v -o tb_u1e
+
+clean:
+ rm -f tb_u1e *.vcd *.lxt a.out
diff --git a/fpga/usrp2/top/u1e/tb_u1e.v b/fpga/usrp2/top/u1e/tb_u1e.v
new file mode 100644
index 000000000..5fc8134fb
--- /dev/null
+++ b/fpga/usrp2/top/u1e/tb_u1e.v
@@ -0,0 +1,41 @@
+`timescale 1ps / 1ps
+//////////////////////////////////////////////////////////////////////////////////
+
+module tb_u1e();
+
+ wire [2:0] debug_led;
+ wire [31:0] debug;
+ wire [1:0] debug_clk;
+
+ xlnx_glbl glbl (.GSR(),.GTS());
+
+ initial begin
+ $dumpfile("tb_u1e.lxt");
+ $dumpvars(0,tb_u1e);
+ end
+
+ // GPMC
+ wire EM_CLK, EM_WAIT0, EM_NCS4, EM_NCS6, EM_NWE, EM_NOE;
+ wire [15:0] EM_D;
+ wire [10:1] EM_A;
+ wire [1:0] EM_NBE;
+
+ reg clk_fpga = 0, rst_fpga = 1;
+ always #15625 clk_fpga = ~clk_fpga;
+
+ initial #200000
+ @(posedge clk_fpga)
+ rst_fpga <= 0;
+
+ u1e_core u1e_core(.clk_fpga(clk_fpga), .rst_fpga(rst_fpga),
+ .debug_led(debug_led), .debug(debug), .debug_clk(debug_clk),
+ .EM_CLK(EM_CLK), .EM_D(EM_D), .EM_A(EM_A), .EM_NBE(EM_NBE),
+ .EM_WAIT0(EM_WAIT0), .EM_NCS4(EM_NCS4), .EM_NCS6(EM_NCS6),
+ .EM_NWE(EM_NWE), .EM_NOE(EM_NOE) );
+
+ gpmc_model_async gpmc_model_async
+ (.EM_CLK(EM_CLK), .EM_D(EM_D), .EM_A(EM_A), .EM_NBE(EM_NBE),
+ .EM_WAIT0(EM_WAIT0), .EM_NCS4(EM_NCS4), .EM_NCS6(EM_NCS6),
+ .EM_NWE(EM_NWE), .EM_NOE(EM_NOE) );
+
+endmodule // tb_u1e
diff --git a/fpga/usrp2/top/u1e/timing.ucf b/fpga/usrp2/top/u1e/timing.ucf
new file mode 100644
index 000000000..8df28c9d3
--- /dev/null
+++ b/fpga/usrp2/top/u1e/timing.ucf
@@ -0,0 +1,13 @@
+
+NET "CLK_FPGA_P" TNM_NET = "CLK_FPGA_P";
+TIMESPEC "TS_clk_fpga_p" = PERIOD "CLK_FPGA_P" 15625 ps HIGH 50 %;
+
+
+
+
+#NET "adc_a<*>" TNM_NET = ADC_DATA_GRP;
+#NET "adc_b<*>" TNM_NET = ADC_DATA_GRP;
+#TIMEGRP "ADC_DATA_GRP" OFFSET = IN 1 ns VALID 5 ns BEFORE "clk_fpga_p" RISING;
+
+#NET "adc_a<*>" OFFSET = IN 1 ns VALID 5 ns BEFORE "clk_fpga_p" RISING;
+#NET "adc_b<*>" OFFSET = IN 1 ns VALID 5 ns BEFORE "clk_fpga_p" RISING;
diff --git a/fpga/usrp2/top/u1e/u1e.ucf b/fpga/usrp2/top/u1e/u1e.ucf
new file mode 100644
index 000000000..0c487a601
--- /dev/null
+++ b/fpga/usrp2/top/u1e/u1e.ucf
@@ -0,0 +1,259 @@
+
+NET "CLK_FPGA_P" LOC = "Y11" ;
+NET "CLK_FPGA_N" LOC = "Y10" ;
+
+## GPMC
+NET "EM_D<15>" LOC = "D13" ;
+NET "EM_D<14>" LOC = "D15" ;
+NET "EM_D<13>" LOC = "C16" ;
+NET "EM_D<12>" LOC = "B20" ;
+NET "EM_D<11>" LOC = "A19" ;
+NET "EM_D<10>" LOC = "A17" ;
+NET "EM_D<9>" LOC = "E15" ;
+NET "EM_D<8>" LOC = "F15" ;
+NET "EM_D<7>" LOC = "E16" ;
+NET "EM_D<6>" LOC = "F16" ;
+NET "EM_D<5>" LOC = "B17" ;
+NET "EM_D<4>" LOC = "C17" ;
+NET "EM_D<3>" LOC = "B19" ;
+NET "EM_D<2>" LOC = "D19" ;
+NET "EM_D<1>" LOC = "C19" ;
+NET "EM_D<0>" LOC = "A20" ;
+
+NET "EM_A<10>" LOC = "C14" ;
+NET "EM_A<9>" LOC = "C10" ;
+NET "EM_A<8>" LOC = "C5" ;
+NET "EM_A<7>" LOC = "A18" ;
+NET "EM_A<6>" LOC = "A15" ;
+NET "EM_A<5>" LOC = "A12" ;
+NET "EM_A<4>" LOC = "A10" ;
+NET "EM_A<3>" LOC = "E7" ;
+NET "EM_A<2>" LOC = "A7" ;
+NET "EM_A<1>" LOC = "C15" ;
+
+NET "EM_NCS6" LOC = "E17" ;
+NET "EM_NCS5" LOC = "E10" ;
+NET "EM_NCS4" LOC = "E6" ;
+#NET "EM_NCS1" LOC = "D18" ;
+#NET "EM_NCS0" LOC = "D17" ;
+
+NET "EM_CLK" LOC = "F11" ;
+NET "EM_WAIT0" LOC = "F14" ;
+NET "EM_NBE<1>" LOC = "D14" ;
+NET "EM_NBE<0>" LOC = "A13" ;
+NET "EM_NWE" LOC = "B13" ;
+NET "EM_NOE" LOC = "A14" ;
+#NET "EM_NADV_ALE" LOC = "B15" ;
+#NET "EM_NWP" LOC = "F13" ;
+
+## Overo GPIO
+NET "overo_gpio0" LOC = "F9" ; # MISC GPIO for debug
+NET "overo_gpio14" LOC = "C4" ; # MISC GPIO for debug
+NET "overo_gpio21" LOC = "D5" ; # MISC GPIO for debug
+NET "overo_gpio22" LOC = "A3" ; # MISC GPIO for debug
+NET "overo_gpio23" LOC = "B3" ; # MISC GPIO for debug
+NET "overo_gpio64" LOC = "A4" ; # MISC GPIO for debug
+NET "overo_gpio65" LOC = "F8" ; # MISC GPIO for debug
+
+NET "overo_gpio127" LOC = "C8" ; # Changed name to gpio10
+NET "overo_gpio128" LOC = "G8" ; # Changed name to gpio186
+
+NET "overo_gpio144" LOC = "A5" ; # tx_have_space
+NET "overo_gpio145" LOC = "C7" ; # tx_underrun
+NET "overo_gpio146" LOC = "A6" ; # rx_have_data
+NET "overo_gpio147" LOC = "B6" ; # rx_overrun
+NET "overo_gpio163" LOC = "D7" ; # MISC GPIO for debug
+NET "overo_gpio170" LOC = "E8" ; # MISC GPIO for debug
+NET "overo_gpio176" LOC = "B4" ; # MISC GPIO for debug
+
+## Overo UART
+#NET "overo_txd1" LOC = "C6" ;
+#NET "overo_rxd1" LOC = "D6" ;
+
+## FTDI UART to USB converter
+NET "FPGA_TXD" LOC = "G19" ;
+NET "FPGA_RXD" LOC = "F20" ;
+
+#NET "SYSEN" LOC = "C11" ;
+
+## I2C
+NET "db_scl" LOC = "F19" ;
+NET "db_sda" LOC = "F18" ;
+
+## SPI
+### DBoard SPI
+NET "db_sclk_rx" LOC = "D21" ;
+NET "db_miso_rx" LOC = "D22" ;
+NET "db_mosi_rx" LOC = "D20" ;
+NET "db_sen_rx" LOC = "E19" ;
+NET "db_sclk_tx" LOC = "F21" ;
+NET "db_miso_tx" LOC = "E20" ;
+NET "db_mosi_tx" LOC = "G17" ;
+NET "db_sen_tx" LOC = "G18" ;
+
+### AD9862 SPI and aux SPI Interfaces
+#NET "aux_sdi_codec" LOC = "G3" ;
+#NET "aux_sdo_codec" LOC = "F3" ;
+#NET "aux_sclk_codec" LOC = "C1" ;
+NET "sen_codec" LOC = "F5" |IOSTANDARD = LVCMOS33;
+NET "mosi_codec" LOC = "F4" |IOSTANDARD = LVCMOS33;
+NET "miso_codec" LOC = "H4" ;
+NET "sclk_codec" LOC = "H3" |IOSTANDARD = LVCMOS33;
+
+### Clock Gen SPI
+NET "cgen_miso" LOC = "F22" ;
+NET "cgen_mosi" LOC = "E22" ;
+NET "cgen_sclk" LOC = "J19" ;
+NET "cgen_sen_b" LOC = "H20" ;
+
+## Clock gen control
+NET "cgen_st_status" LOC = "P20" ;
+NET "cgen_st_ld" LOC = "R17" ;
+NET "cgen_st_refmon" LOC = "P17" ;
+NET "cgen_sync_b" LOC = "U18" ;
+NET "cgen_ref_sel" LOC = "U19" ;
+
+## Debug pins
+NET "debug_led<3>" LOC = "Y15" ;
+NET "debug_led<2>" LOC = "K16" ;
+NET "debug_led<1>" LOC = "J17" ;
+NET "debug_led<0>" LOC = "H22" ;
+NET "debug<0>" LOC = "G22" ;
+NET "debug<1>" LOC = "H17" ;
+NET "debug<2>" LOC = "H18" ;
+NET "debug<3>" LOC = "K20" ;
+NET "debug<4>" LOC = "J20" ;
+NET "debug<5>" LOC = "K19" ;
+NET "debug<6>" LOC = "K18" ;
+NET "debug<7>" LOC = "L22" ;
+NET "debug<8>" LOC = "K22" ;
+NET "debug<9>" LOC = "N22" ;
+NET "debug<10>" LOC = "M22" ;
+NET "debug<11>" LOC = "N20" ;
+NET "debug<12>" LOC = "N19" ;
+NET "debug<13>" LOC = "R22" ;
+NET "debug<14>" LOC = "P22" ;
+NET "debug<15>" LOC = "N17" ;
+NET "debug<16>" LOC = "P16" ;
+NET "debug<17>" LOC = "U22" ;
+NET "debug<18>" LOC = "P19" ;
+NET "debug<19>" LOC = "R18" ;
+NET "debug<20>" LOC = "U20" ;
+NET "debug<21>" LOC = "T20" ;
+NET "debug<22>" LOC = "R19" ;
+NET "debug<23>" LOC = "R20" ;
+NET "debug<24>" LOC = "W22" ;
+NET "debug<25>" LOC = "Y22" ;
+NET "debug<26>" LOC = "T18" ;
+NET "debug<27>" LOC = "T17" ;
+NET "debug<28>" LOC = "W19" ;
+NET "debug<29>" LOC = "V20" ;
+NET "debug<30>" LOC = "Y21" ;
+NET "debug<31>" LOC = "AA22" ;
+NET "debug_clk<0>" LOC = "N18" ;
+NET "debug_clk<1>" LOC = "M17" ;
+
+NET "debug_pb" LOC = "C22" ;
+
+#NET "reset_codec" LOC = "C2" ;
+
+NET "RXSYNC" LOC = "F2" ;
+NET "DB<11>" LOC = "G6" ;
+NET "DB<10>" LOC = "G5" ;
+NET "DB<9>" LOC = "E4" ;
+NET "DB<8>" LOC = "E3" ;
+NET "DB<7>" LOC = "H6" ;
+NET "DB<6>" LOC = "H5" ;
+NET "DB<5>" LOC = "H1" ;
+NET "DB<4>" LOC = "G1" ;
+NET "DB<3>" LOC = "K5" ;
+NET "DB<2>" LOC = "K4" ;
+NET "DB<1>" LOC = "H2" ;
+NET "DB<0>" LOC = "L5" ;
+
+NET "DA<11>" LOC = "K6" ;
+NET "DA<10>" LOC = "K3" ;
+NET "DA<9>" LOC = "K2" ;
+NET "DA<8>" LOC = "N1" ;
+NET "DA<7>" LOC = "N5" ;
+NET "DA<6>" LOC = "N6" ;
+NET "DA<5>" LOC = "P2" ;
+NET "DA<4>" LOC = "P1" ;
+NET "DA<3>" LOC = "R6" ;
+NET "DA<2>" LOC = "P6" ;
+NET "DA<1>" LOC = "R1" ;
+NET "DA<0>" LOC = "R2" ;
+
+NET "TX<13>" LOC = "T6" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TX<12>" LOC = "U1" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TX<11>" LOC = "T1" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TX<10>" LOC = "R5" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TX<9>" LOC = "V1" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TX<8>" LOC = "U2" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TX<7>" LOC = "T4" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TX<6>" LOC = "R3" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TX<5>" LOC = "W1" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TX<4>" LOC = "Y1" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TX<3>" LOC = "V3" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TX<2>" LOC = "V4" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TX<1>" LOC = "W2" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TX<0>" LOC = "W3" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TXSYNC" LOC = "U5" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+NET "TXBLANK" LOC = "U4" |IOSTANDARD = LVCMOS33 |DRIVE = 12 |SLEW = FAST ;
+
+NET "PPS_IN" LOC = "M5" ;
+
+NET "io_tx<0>" LOC = "AB20" ;
+NET "io_tx<1>" LOC = "Y17" ;
+NET "io_tx<2>" LOC = "Y16" ;
+NET "io_tx<3>" LOC = "U16" ;
+NET "io_tx<4>" LOC = "V16" ;
+NET "io_tx<5>" LOC = "AB19" ;
+NET "io_tx<6>" LOC = "AA19" ;
+NET "io_tx<7>" LOC = "U14" ;
+NET "io_tx<8>" LOC = "U15" ;
+NET "io_tx<9>" LOC = "AB17" ;
+NET "io_tx<10>" LOC = "AB18" ;
+NET "io_tx<11>" LOC = "Y13" ;
+NET "io_tx<12>" LOC = "W14" ;
+NET "io_tx<13>" LOC = "U13" ;
+NET "io_tx<14>" LOC = "AA15" ;
+NET "io_tx<15>" LOC = "AB14" ;
+
+NET "io_rx<0>" LOC = "Y8" ;
+NET "io_rx<1>" LOC = "Y9" ;
+NET "io_rx<2>" LOC = "V7" ;
+NET "io_rx<3>" LOC = "U8" ;
+NET "io_rx<4>" LOC = "V10" ;
+NET "io_rx<5>" LOC = "U9" ;
+NET "io_rx<6>" LOC = "AB7" ;
+NET "io_rx<7>" LOC = "AA8" ;
+NET "io_rx<8>" LOC = "W8" ;
+NET "io_rx<9>" LOC = "V8" ;
+NET "io_rx<10>" LOC = "AB5" ;
+NET "io_rx<11>" LOC = "AB6" ;
+NET "io_rx<12>" LOC = "AB4" ;
+NET "io_rx<13>" LOC = "AA4" ;
+NET "io_rx<14>" LOC = "W5" ;
+NET "io_rx<15>" LOC = "Y4" ;
+
+#NET "CLKOUT2_CODEC" LOC = "U12" ;
+#NET "CLKOUT1_CODEC" LOC = "V12" ;
+
+## FPGA Config Pins
+#NET "fpga_cfg_prog_b" LOC = "A2" ;
+#NET "fpga_cfg_done" LOC = "AB21" ;
+#NET "fpga_cfg_din" LOC = "W17" ;
+#NET "fpga_cfg_cclk" LOC = "V17" ;
+#NET "fpga_cfg_init_b" LOC = "W15" ;
+
+## Unused
+#NET "unnamed_net53" LOC = "B1" ; # TMS
+#NET "unnamed_net52" LOC = "B22" ; # TDO
+#NET "unnamed_net51" LOC = "D2" ; # TDI
+#NET "unnamed_net50" LOC = "A21" ; # TCK
+#NET "unnamed_net59" LOC = "F7" ; # PUDC_B
+#NET "unnamed_net58" LOC = "V6" ; # M2
+#NET "unnamed_net57" LOC = "AA3" ; # M1
+#NET "unnamed_net56" LOC = "AB3" ; # M0
+#NET "GND" LOC = "V19" ; # Suspend, unused
diff --git a/fpga/usrp2/top/u1e/u1e.v b/fpga/usrp2/top/u1e/u1e.v
new file mode 100644
index 000000000..445b14a03
--- /dev/null
+++ b/fpga/usrp2/top/u1e/u1e.v
@@ -0,0 +1,141 @@
+`timescale 1ns / 1ps
+//////////////////////////////////////////////////////////////////////////////////
+
+module u1e
+ (input CLK_FPGA_P, input CLK_FPGA_N, // Diff
+ output [3:0] debug_led, output [31:0] debug, output [1:0] debug_clk,
+ input debug_pb, output FPGA_TXD, input FPGA_RXD,
+
+ // GPMC
+ input EM_CLK, inout [15:0] EM_D, input [10:1] EM_A, input [1:0] EM_NBE,
+ input EM_WAIT0, input EM_NCS4, input EM_NCS5, input EM_NCS6,
+ input EM_NWE, input EM_NOE,
+
+ inout db_sda, inout db_scl, // I2C
+
+ output db_sclk_tx, output db_sen_tx, output db_mosi_tx, input db_miso_tx, // DB TX SPI
+ output db_sclk_rx, output db_sen_rx, output db_mosi_rx, input db_miso_rx, // DB TX SPI
+ output sclk_codec, output sen_codec, output mosi_codec, input miso_codec, // AD9862 main SPI
+ output cgen_sclk, output cgen_sen_b, output cgen_mosi, input cgen_miso, // Clock gen SPI
+
+ input cgen_st_status, input cgen_st_ld, input cgen_st_refmon, output cgen_sync_b, output cgen_ref_sel,
+
+ output overo_gpio144, output overo_gpio145, output overo_gpio146, output overo_gpio147, // Fifo controls
+ input overo_gpio0, input overo_gpio14, input overo_gpio21, input overo_gpio22, // Misc GPIO
+ input overo_gpio23, input overo_gpio64, input overo_gpio65, input overo_gpio127, // Misc GPIO
+ input overo_gpio128, input overo_gpio163, input overo_gpio170, input overo_gpio176, // Misc GPIO
+
+ inout [15:0] io_tx, inout [15:0] io_rx,
+
+ output [13:0] TX, output TXSYNC, output TXBLANK,
+ input [11:0] DA, input [11:0] DB, input RXSYNC,
+
+ input PPS_IN
+ );
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Clocking
+ wire clk_fpga, clk_fpga_in;
+
+ IBUFGDS #(.IOSTANDARD("LVDS_33"), .DIFF_TERM("TRUE"))
+ clk_fpga_pin (.O(clk_fpga_in),.I(CLK_FPGA_P),.IB(CLK_FPGA_N));
+
+ wire clk_2x, dcm_rst, dcm_locked, clk_fb;
+ DCM #(.CLK_FEEDBACK ( "1X" ),
+ .CLKDV_DIVIDE ( 2 ),
+ .CLKFX_DIVIDE ( 2 ),
+ .CLKFX_MULTIPLY ( 2 ),
+ .CLKIN_DIVIDE_BY_2 ( "FALSE" ),
+ .CLKIN_PERIOD ( 15.625 ),
+ .CLKOUT_PHASE_SHIFT ( "NONE" ),
+ .DESKEW_ADJUST ( "SYSTEM_SYNCHRONOUS" ),
+ .DFS_FREQUENCY_MODE ( "LOW" ),
+ .DLL_FREQUENCY_MODE ( "LOW" ),
+ .DUTY_CYCLE_CORRECTION ( "TRUE" ),
+ .FACTORY_JF ( 16'h8080 ),
+ .PHASE_SHIFT ( 0 ),
+ .STARTUP_WAIT ( "FALSE" ))
+ clk_doubler (.CLKFB(clk_fb), .CLKIN(clk_fpga_in), .RST(dcm_rst),
+ .DSSEN(0), .PSCLK(0), .PSEN(0), .PSINCDEC(0), .PSDONE(),
+ .CLKDV(), .CLKFX(), .CLKFX180(),
+ .CLK2X(), .CLK2X180(),
+ .CLK0(clk_fb), .CLK90(clk_fpga), .CLK180(), .CLK270(),
+ .LOCKED(dcm_locked), .STATUS());
+
+ // /////////////////////////////////////////////////////////////////////////
+ // SPI
+ wire mosi, sclk, miso;
+ assign { db_sclk_tx, db_mosi_tx } = ~db_sen_tx ? {sclk,mosi} : 2'b0;
+ assign { db_sclk_rx, db_mosi_rx } = ~db_sen_rx ? {sclk,mosi} : 2'b0;
+ assign { sclk_codec, mosi_codec } = ~sen_codec ? {sclk,mosi} : 2'b0;
+ assign { cgen_sclk, cgen_mosi } = ~cgen_sen_b ? {sclk,mosi} : 2'b0;
+ assign miso = (~db_sen_tx & db_miso_tx) | (~db_sen_rx & db_miso_rx) |
+ (~sen_codec & miso_codec) | (~cgen_sen_b & cgen_miso);
+
+ // /////////////////////////////////////////////////////////////////////////
+ // TX DAC -- handle the interleaved data bus to DAC, with clock doubling DLL
+
+ assign TXBLANK = 0;
+ wire [13:0] tx_i, tx_q;
+
+ reg[13:0] delay_q;
+ always @(posedge clk_fpga)
+ delay_q <= tx_q;
+
+ genvar i;
+ generate
+ for(i=0;i<14;i=i+1)
+ begin : gen_dacout
+ ODDR2 #(.DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1"
+ .INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1
+ .SRTYPE("SYNC")) // Specifies "SYNC" or "ASYNC" set/reset
+ ODDR2_inst (.Q(TX[i]), // 1-bit DDR output data
+ .C0(clk_fpga), // 1-bit clock input
+ .C1(~clk_fpga), // 1-bit clock input
+ .CE(1'b1), // 1-bit clock enable input
+ .D0(tx_i[i]), // 1-bit data input (associated with C0)
+ .D1(delay_q[i]), // 1-bit data input (associated with C1)
+ .R(1'b0), // 1-bit reset input
+ .S(1'b0)); // 1-bit set input
+ end // block: gen_dacout
+ endgenerate
+ ODDR2 #(.DDR_ALIGNMENT("NONE"), // Sets output alignment to "NONE", "C0" or "C1"
+ .INIT(1'b0), // Sets initial state of the Q output to 1'b0 or 1'b1
+ .SRTYPE("SYNC")) // Specifies "SYNC" or "ASYNC" set/reset
+ ODDR2_txsnc (.Q(TXSYNC), // 1-bit DDR output data
+ .C0(clk_fpga), // 1-bit clock input
+ .C1(~clk_fpga), // 1-bit clock input
+ .CE(1'b1), // 1-bit clock enable input
+ .D0(1'b0), // 1-bit data input (associated with C0)
+ .D1(1'b1), // 1-bit data input (associated with C1)
+ .R(1'b0), // 1-bit reset input
+ .S(1'b0)); // 1-bit set input
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Main U1E Core
+ u1e_core u1e_core(.clk_fpga(clk_fpga), .rst_fpga(~debug_pb),
+ .debug_led(debug_led), .debug(debug), .debug_clk(debug_clk),
+ .debug_txd(FPGA_TXD), .debug_rxd(FPGA_RXD),
+ .EM_CLK(EM_CLK), .EM_D(EM_D), .EM_A(EM_A), .EM_NBE(EM_NBE),
+ .EM_WAIT0(EM_WAIT0), .EM_NCS4(EM_NCS4), .EM_NCS5(EM_NCS5),
+ .EM_NCS6(EM_NCS6), .EM_NWE(EM_NWE), .EM_NOE(EM_NOE),
+ .db_sda(db_sda), .db_scl(db_scl),
+ .sclk(sclk), .sen({cgen_sen_b,sen_codec,db_sen_tx,db_sen_rx}), .mosi(mosi), .miso(miso),
+ .cgen_st_status(cgen_st_status), .cgen_st_ld(cgen_st_ld),.cgen_st_refmon(cgen_st_refmon),
+ .cgen_sync_b(cgen_sync_b), .cgen_ref_sel(cgen_ref_sel),
+ .tx_have_space(overo_gpio144), .tx_underrun(overo_gpio145),
+ .rx_have_data(overo_gpio146), .rx_overrun(overo_gpio147),
+ .io_tx(io_tx), .io_rx(io_rx),
+ .tx_i(tx_i), .tx_q(tx_q),
+ .rx_i(DA), .rx_q(DB),
+ .misc_gpio( {{overo_gpio128,overo_gpio163,overo_gpio170,overo_gpio176},
+ {overo_gpio0,overo_gpio14,overo_gpio21,overo_gpio22},
+ {overo_gpio23,overo_gpio64,overo_gpio65,overo_gpio127}}),
+ .pps_in(PPS_IN) );
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Local Debug
+ // assign debug_clk = {clk_fpga, clk_2x };
+ // assign debug = { TXSYNC, TXBLANK, TX };
+
+endmodule // u1e
diff --git a/fpga/usrp2/top/u1e/u1e_core.v b/fpga/usrp2/top/u1e/u1e_core.v
new file mode 100644
index 000000000..e7e798b34
--- /dev/null
+++ b/fpga/usrp2/top/u1e/u1e_core.v
@@ -0,0 +1,459 @@
+
+
+//`define LOOPBACK 1
+//`define TIMED 1
+`define DSP 1
+
+module u1e_core
+ (input clk_fpga, input rst_fpga,
+ output [3:0] debug_led, output [31:0] debug, output [1:0] debug_clk,
+ output debug_txd, input debug_rxd,
+
+ // GPMC
+ input EM_CLK, inout [15:0] EM_D, input [10:1] EM_A, input [1:0] EM_NBE,
+ input EM_WAIT0, input EM_NCS4, input EM_NCS5, input EM_NCS6,
+ input EM_NWE, input EM_NOE,
+
+ inout db_sda, inout db_scl,
+ output sclk, output [7:0] sen, output mosi, input miso,
+
+ input cgen_st_status, input cgen_st_ld, input cgen_st_refmon, output cgen_sync_b, output cgen_ref_sel,
+ output tx_have_space, output tx_underrun, output rx_have_data, output rx_overrun,
+ inout [15:0] io_tx, inout [15:0] io_rx,
+ output [13:0] tx_i, output [13:0] tx_q,
+ input [11:0] rx_i, input [11:0] rx_q,
+
+ input [11:0] misc_gpio, input pps_in
+ );
+
+ localparam TXFIFOSIZE = 13;
+ localparam RXFIFOSIZE = 13;
+
+ localparam SR_RX_DSP = 0; // 5 regs
+ localparam SR_CLEAR_FIFO = 6; // 1 reg
+ localparam SR_RX_CTRL = 8; // 9 regs
+ localparam SR_TX_DSP = 17; // 5 regs
+ localparam SR_TX_CTRL = 24; // 2 regs
+ localparam SR_TIME64 = 28; // 4 regs
+
+ wire [7:0] COMPAT_NUM = 8'd2;
+
+ wire wb_clk = clk_fpga;
+ wire wb_rst = rst_fpga;
+
+ wire pps_int;
+ wire [63:0] vita_time;
+ reg [15:0] reg_leds, reg_cgen_ctrl, reg_test, xfer_rate;
+
+ wire [7:0] set_addr;
+ wire [31:0] set_data;
+ wire set_stb;
+
+ wire [31:0] debug_vt;
+
+ // /////////////////////////////////////////////////////////////////////////////////////
+ // GPMC Slave to Wishbone Master
+ localparam dw = 16;
+ localparam aw = 11;
+ localparam sw = 2;
+
+ wire [dw-1:0] m0_dat_mosi, m0_dat_miso;
+ wire [aw-1:0] m0_adr;
+ wire [sw-1:0] m0_sel;
+ wire m0_cyc, m0_stb, m0_we, m0_ack, m0_err, m0_rty;
+
+ wire [31:0] debug_gpmc;
+
+ wire [35:0] tx_data, rx_data, tx_err_data;
+ wire tx_src_rdy, tx_dst_rdy, rx_src_rdy, rx_dst_rdy,
+ tx_err_src_rdy, tx_err_dst_rdy;
+ reg [15:0] tx_frame_len;
+ wire [15:0] rx_frame_len;
+ wire [7:0] rate;
+
+ wire bus_error;
+
+ wire clear_rx_int, clear_tx_int, clear_tx, clear_rx, do_clear;
+
+ setting_reg #(.my_addr(SR_CLEAR_FIFO), .width(2)) sr_clear
+ (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr),
+ .in(set_data),.out({clear_tx_int,clear_rx_int}),.changed(do_clear));
+ assign clear_tx = clear_tx_int & do_clear;
+ assign clear_rx = clear_rx_int & do_clear;
+
+ gpmc_async #(.TXFIFOSIZE(TXFIFOSIZE), .RXFIFOSIZE(RXFIFOSIZE))
+ gpmc (.arst(wb_rst),
+ .EM_CLK(EM_CLK), .EM_D(EM_D), .EM_A(EM_A), .EM_NBE(EM_NBE),
+ .EM_WAIT0(EM_WAIT0), .EM_NCS4(EM_NCS4), .EM_NCS6(EM_NCS6), .EM_NWE(EM_NWE),
+ .EM_NOE(EM_NOE),
+
+ .rx_have_data(rx_have_data), .tx_have_space(tx_have_space),
+ .bus_error(bus_error), .bus_reset(0),
+
+ .wb_clk(wb_clk), .wb_rst(wb_rst),
+ .wb_adr_o(m0_adr), .wb_dat_mosi(m0_dat_mosi), .wb_dat_miso(m0_dat_miso),
+ .wb_sel_o(m0_sel), .wb_cyc_o(m0_cyc), .wb_stb_o(m0_stb), .wb_we_o(m0_we),
+ .wb_ack_i(m0_ack),
+
+ .fifo_clk(wb_clk), .fifo_rst(wb_rst), .clear_tx(clear_tx), .clear_rx(clear_rx),
+ .tx_data_o(tx_data), .tx_src_rdy_o(tx_src_rdy), .tx_dst_rdy_i(tx_dst_rdy),
+ .rx_data_i(rx_data), .rx_src_rdy_i(rx_src_rdy), .rx_dst_rdy_o(rx_dst_rdy),
+
+ .tx_frame_len(tx_frame_len), .rx_frame_len(rx_frame_len),
+ .debug(debug_gpmc));
+
+ wire rx_sof = rx_data[32];
+ wire rx_eof = rx_data[33];
+ wire rx_src_rdy_int, rx_dst_rdy_int, tx_src_rdy_int, tx_dst_rdy_int;
+
+`ifdef LOOPBACK
+ wire [7:0] WHOAMI = 1;
+
+ fifo_cascade #(.WIDTH(36), .SIZE(12)) loopback_fifo
+ (.clk(wb_clk), .reset(wb_rst), .clear(clear_tx | clear_rx),
+ .datain(tx_data), .src_rdy_i(tx_src_rdy), .dst_rdy_o(tx_dst_rdy),
+ .dataout(rx_data), .src_rdy_o(rx_src_rdy), .dst_rdy_i(rx_dst_rdy));
+
+ assign tx_underrun = 0;
+ assign rx_overrun = 0;
+
+ wire run_tx, run_rx, strobe_tx, strobe_rx;
+`endif // LOOPBACK
+
+`ifdef TIMED
+ wire [7:0] WHOAMI = 2;
+
+ // TX side
+ wire tx_enable;
+
+ fifo_pacer tx_pacer
+ (.clk(wb_clk), .reset(wb_rst), .rate(rate), .enable(tx_enable),
+ .src1_rdy_i(tx_src_rdy), .dst1_rdy_o(tx_dst_rdy),
+ .src2_rdy_o(tx_src_rdy_int), .dst2_rdy_i(tx_dst_rdy_int),
+ .underrun(tx_underrun), .overrun());
+
+ packet_verifier32 pktver32
+ (.clk(wb_clk), .reset(wb_rst), .clear(clear_tx),
+ .data_i(tx_data), .src_rdy_i(tx_src_rdy_int), .dst_rdy_o(tx_dst_rdy_int),
+ .total(total), .crc_err(crc_err), .seq_err(seq_err), .len_err(len_err));
+
+ // RX side
+ wire rx_enable;
+
+ packet_generator32 pktgen32
+ (.clk(wb_clk), .reset(wb_rst), .clear(clear_rx),
+ .data_o(rx_data), .src_rdy_o(rx_src_rdy_int), .dst_rdy_i(rx_dst_rdy_int));
+
+ fifo_pacer rx_pacer
+ (.clk(wb_clk), .reset(wb_rst), .rate(rate), .enable(rx_enable),
+ .src1_rdy_i(rx_src_rdy_int), .dst1_rdy_o(rx_dst_rdy_int),
+ .src2_rdy_o(rx_src_rdy), .dst2_rdy_i(rx_dst_rdy),
+ .underrun(), .overrun(rx_overrun));
+
+`endif // `ifdef TIMED
+
+`ifdef DSP
+ wire [7:0] WHOAMI = 0;
+
+ wire [31:0] debug_rx_dsp, vrc_debug, vrf_debug;
+
+ // /////////////////////////////////////////////////////////////////////////
+ // DSP RX
+ wire [31:0] sample_rx, sample_tx;
+ wire strobe_rx, strobe_tx;
+ wire rx1_dst_rdy, rx1_src_rdy;
+ wire [99:0] rx1_data;
+ wire run_rx;
+ wire [35:0] vita_rx_data;
+ wire vita_rx_src_rdy, vita_rx_dst_rdy;
+
+ dsp_core_rx #(.BASE(SR_RX_DSP)) dsp_core_rx
+ (.clk(wb_clk),.rst(wb_rst),
+ .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
+ .adc_a({rx_i,2'b0}),.adc_ovf_a(0),.adc_b({rx_q,2'b0}),.adc_ovf_b(0),
+ .sample(sample_rx), .run(run_rx), .strobe(strobe_rx),
+ .debug(debug_rx_dsp) );
+
+ vita_rx_control #(.BASE(SR_RX_CTRL), .WIDTH(32)) vita_rx_control
+ (.clk(wb_clk), .reset(wb_rst), .clear(clear_rx),
+ .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
+ .vita_time(vita_time), .overrun(rx_overrun),
+ .sample(sample_rx), .run(run_rx), .strobe(strobe_rx),
+ .sample_fifo_o(rx1_data), .sample_fifo_dst_rdy_i(rx1_dst_rdy), .sample_fifo_src_rdy_o(rx1_src_rdy),
+ .debug_rx(vrc_debug));
+
+ vita_rx_framer #(.BASE(SR_RX_CTRL), .MAXCHAN(1)) vita_rx_framer
+ (.clk(wb_clk), .reset(wb_rst), .clear(clear_rx),
+ .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
+ .sample_fifo_i(rx1_data), .sample_fifo_dst_rdy_o(rx1_dst_rdy), .sample_fifo_src_rdy_i(rx1_src_rdy),
+ .data_o(vita_rx_data), .dst_rdy_i(vita_rx_dst_rdy), .src_rdy_o(vita_rx_src_rdy),
+ .fifo_occupied(), .fifo_full(), .fifo_empty(),
+ .debug_rx(vrf_debug) );
+
+ fifo36_mux #(.prio(0)) mux_err_stream
+ (.clk(wb_clk), .reset(wb_rst), .clear(0),
+ .data0_i(vita_rx_data), .src0_rdy_i(vita_rx_src_rdy), .dst0_rdy_o(vita_rx_dst_rdy),
+ .data1_i(tx_err_data), .src1_rdy_i(tx_err_src_rdy), .dst1_rdy_o(tx_err_dst_rdy),
+ .data_o(rx_data), .src_rdy_o(rx_src_rdy), .dst_rdy_i(rx_dst_rdy));
+
+ // ///////////////////////////////////////////////////////////////////////////////////
+ // DSP TX
+
+ wire [15:0] tx_i_int, tx_q_int;
+ wire run_tx;
+
+ vita_tx_chain #(.BASE_CTRL(SR_TX_CTRL), .BASE_DSP(SR_TX_DSP),
+ .REPORT_ERROR(1), .PROT_ENG_FLAGS(0))
+ vita_tx_chain
+ (.clk(wb_clk), .reset(wb_rst),
+ .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
+ .vita_time(vita_time),
+ .tx_data_i(tx_data), .tx_src_rdy_i(tx_src_rdy), .tx_dst_rdy_o(tx_dst_rdy),
+ .err_data_o(tx_err_data), .err_src_rdy_o(tx_err_src_rdy), .err_dst_rdy_i(tx_err_dst_rdy),
+ .dac_a(tx_i_int),.dac_b(tx_q_int),
+ .underrun(underrun), .run(run_tx),
+ .debug(debug_vt));
+
+ assign tx_i = tx_i_int[15:2];
+ assign tx_q = tx_q_int[15:2];
+
+`else // !`ifdef DSP
+ // Dummy DSP signal generator for test purposes
+ wire [23:0] tx_i_int, tx_q_int;
+ wire [23:0] freq = {reg_test,8'd0};
+ reg [23:0] phase;
+
+ always @(posedge wb_clk)
+ phase <= phase + freq;
+
+ cordic_z24 #(.bitwidth(24)) tx_cordic
+ (.clock(wb_clk), .reset(wb_rst), .enable(1),
+ .xi(24'd2500000), .yi(24'd0), .zi(phase), .xo(tx_i_int), .yo(tx_q_int), .zo());
+
+ assign tx_i = tx_i_int[23:10];
+ assign tx_q = tx_q_int[23:10];
+`endif // !`ifdef DSP
+
+ // /////////////////////////////////////////////////////////////////////////////////////
+ // Wishbone Intercon, single master
+ wire [dw-1:0] s0_dat_mosi, s1_dat_mosi, s0_dat_miso, s1_dat_miso, s2_dat_mosi, s3_dat_mosi, s2_dat_miso, s3_dat_miso,
+ s4_dat_mosi, s5_dat_mosi, s4_dat_miso, s5_dat_miso, s6_dat_mosi, s7_dat_mosi, s6_dat_miso, s7_dat_miso,
+ s8_dat_mosi, s9_dat_mosi, s8_dat_miso, s9_dat_miso, sa_dat_mosi, sb_dat_mosi, sa_dat_miso, sb_dat_miso,
+ sc_dat_mosi, sd_dat_mosi, sc_dat_miso, sd_dat_miso, se_dat_mosi, sf_dat_mosi, se_dat_miso, sf_dat_miso;
+ wire [aw-1:0] s0_adr,s1_adr,s2_adr,s3_adr,s4_adr,s5_adr,s6_adr,s7_adr;
+ wire [aw-1:0] s8_adr,s9_adr,sa_adr,sb_adr,sc_adr, sd_adr, se_adr, sf_adr;
+ wire [sw-1:0] s0_sel,s1_sel,s2_sel,s3_sel,s4_sel,s5_sel,s6_sel,s7_sel;
+ wire [sw-1:0] s8_sel,s9_sel,sa_sel,sb_sel,sc_sel, sd_sel, se_sel, sf_sel;
+ wire s0_ack,s1_ack,s2_ack,s3_ack,s4_ack,s5_ack,s6_ack,s7_ack;
+ wire s8_ack,s9_ack,sa_ack,sb_ack,sc_ack, sd_ack, se_ack, sf_ack;
+ wire s0_stb,s1_stb,s2_stb,s3_stb,s4_stb,s5_stb,s6_stb,s7_stb;
+ wire s8_stb,s9_stb,sa_stb,sb_stb,sc_stb, sd_stb, se_stb, sf_stb;
+ wire s0_cyc,s1_cyc,s2_cyc,s3_cyc,s4_cyc,s5_cyc,s6_cyc,s7_cyc;
+ wire s8_cyc,s9_cyc,sa_cyc,sb_cyc,sc_cyc, sd_cyc, se_cyc, sf_cyc;
+ wire s0_we,s1_we,s2_we,s3_we,s4_we,s5_we,s6_we,s7_we;
+ wire s8_we,s9_we,sa_we,sb_we,sc_we,sd_we, se_we, sf_we;
+
+ wb_1master #(.dw(dw), .aw(aw), .sw(sw), .decode_w(4),
+ .s0_addr(4'h0), .s0_mask(4'hF), .s1_addr(4'h1), .s1_mask(4'hF),
+ .s2_addr(4'h2), .s2_mask(4'hF), .s3_addr(4'h3), .s3_mask(4'hF),
+ .s4_addr(4'h4), .s4_mask(4'hF), .s5_addr(4'h5), .s5_mask(4'hF),
+ .s6_addr(4'h6), .s6_mask(4'hF), .s7_addr(4'h7), .s7_mask(4'hF),
+ .s8_addr(4'h8), .s8_mask(4'hF), .s9_addr(4'h9), .s9_mask(4'hF),
+ .sa_addr(4'ha), .sa_mask(4'hF), .sb_addr(4'hb), .sb_mask(4'hF),
+ .sc_addr(4'hc), .sc_mask(4'hF), .sd_addr(4'hd), .sd_mask(4'hF),
+ .se_addr(4'he), .se_mask(4'hF), .sf_addr(4'hf), .sf_mask(4'hF))
+ wb_1master
+ (.clk_i(wb_clk),.rst_i(wb_rst),
+ .m0_dat_o(m0_dat_miso),.m0_ack_o(m0_ack),.m0_err_o(m0_err),.m0_rty_o(m0_rty),.m0_dat_i(m0_dat_mosi),
+ .m0_adr_i(m0_adr),.m0_sel_i(m0_sel),.m0_we_i(m0_we),.m0_cyc_i(m0_cyc),.m0_stb_i(m0_stb),
+ .s0_dat_o(s0_dat_mosi),.s0_adr_o(s0_adr),.s0_sel_o(s0_sel),.s0_we_o(s0_we),.s0_cyc_o(s0_cyc),.s0_stb_o(s0_stb),
+ .s0_dat_i(s0_dat_miso),.s0_ack_i(s0_ack),.s0_err_i(0),.s0_rty_i(0),
+ .s1_dat_o(s1_dat_mosi),.s1_adr_o(s1_adr),.s1_sel_o(s1_sel),.s1_we_o(s1_we),.s1_cyc_o(s1_cyc),.s1_stb_o(s1_stb),
+ .s1_dat_i(s1_dat_miso),.s1_ack_i(s1_ack),.s1_err_i(0),.s1_rty_i(0),
+ .s2_dat_o(s2_dat_mosi),.s2_adr_o(s2_adr),.s2_sel_o(s2_sel),.s2_we_o(s2_we),.s2_cyc_o(s2_cyc),.s2_stb_o(s2_stb),
+ .s2_dat_i(s2_dat_miso),.s2_ack_i(s2_ack),.s2_err_i(0),.s2_rty_i(0),
+ .s3_dat_o(s3_dat_mosi),.s3_adr_o(s3_adr),.s3_sel_o(s3_sel),.s3_we_o(s3_we),.s3_cyc_o(s3_cyc),.s3_stb_o(s3_stb),
+ .s3_dat_i(s3_dat_miso),.s3_ack_i(s3_ack),.s3_err_i(0),.s3_rty_i(0),
+ .s4_dat_o(s4_dat_mosi),.s4_adr_o(s4_adr),.s4_sel_o(s4_sel),.s4_we_o(s4_we),.s4_cyc_o(s4_cyc),.s4_stb_o(s4_stb),
+ .s4_dat_i(s4_dat_miso),.s4_ack_i(s4_ack),.s4_err_i(0),.s4_rty_i(0),
+ .s5_dat_o(s5_dat_mosi),.s5_adr_o(s5_adr),.s5_sel_o(s5_sel),.s5_we_o(s5_we),.s5_cyc_o(s5_cyc),.s5_stb_o(s5_stb),
+ .s5_dat_i(s5_dat_miso),.s5_ack_i(s5_ack),.s5_err_i(0),.s5_rty_i(0),
+ .s6_dat_o(s6_dat_mosi),.s6_adr_o(s6_adr),.s6_sel_o(s6_sel),.s6_we_o(s6_we),.s6_cyc_o(s6_cyc),.s6_stb_o(s6_stb),
+ .s6_dat_i(s6_dat_miso),.s6_ack_i(s6_ack),.s6_err_i(0),.s6_rty_i(0),
+ .s7_dat_o(s7_dat_mosi),.s7_adr_o(s7_adr),.s7_sel_o(s7_sel),.s7_we_o(s7_we),.s7_cyc_o(s7_cyc),.s7_stb_o(s7_stb),
+ .s7_dat_i(s7_dat_miso),.s7_ack_i(s7_ack),.s7_err_i(0),.s7_rty_i(0),
+ .s8_dat_o(s8_dat_mosi),.s8_adr_o(s8_adr),.s8_sel_o(s8_sel),.s8_we_o(s8_we),.s8_cyc_o(s8_cyc),.s8_stb_o(s8_stb),
+ .s8_dat_i(s8_dat_miso),.s8_ack_i(s8_ack),.s8_err_i(0),.s8_rty_i(0),
+ .s9_dat_o(s9_dat_mosi),.s9_adr_o(s9_adr),.s9_sel_o(s9_sel),.s9_we_o(s9_we),.s9_cyc_o(s9_cyc),.s9_stb_o(s9_stb),
+ .s9_dat_i(s9_dat_miso),.s9_ack_i(s9_ack),.s9_err_i(0),.s9_rty_i(0),
+ .sa_dat_o(sa_dat_mosi),.sa_adr_o(sa_adr),.sa_sel_o(sa_sel),.sa_we_o(sa_we),.sa_cyc_o(sa_cyc),.sa_stb_o(sa_stb),
+ .sa_dat_i(sa_dat_miso),.sa_ack_i(sa_ack),.sa_err_i(0),.sa_rty_i(0),
+ .sb_dat_o(sb_dat_mosi),.sb_adr_o(sb_adr),.sb_sel_o(sb_sel),.sb_we_o(sb_we),.sb_cyc_o(sb_cyc),.sb_stb_o(sb_stb),
+ .sb_dat_i(sb_dat_miso),.sb_ack_i(sb_ack),.sb_err_i(0),.sb_rty_i(0),
+ .sc_dat_o(sc_dat_mosi),.sc_adr_o(sc_adr),.sc_sel_o(sc_sel),.sc_we_o(sc_we),.sc_cyc_o(sc_cyc),.sc_stb_o(sc_stb),
+ .sc_dat_i(sc_dat_miso),.sc_ack_i(sc_ack),.sc_err_i(0),.sc_rty_i(0),
+ .sd_dat_o(sd_dat_mosi),.sd_adr_o(sd_adr),.sd_sel_o(sd_sel),.sd_we_o(sd_we),.sd_cyc_o(sd_cyc),.sd_stb_o(sd_stb),
+ .sd_dat_i(sd_dat_miso),.sd_ack_i(sd_ack),.sd_err_i(0),.sd_rty_i(0),
+ .se_dat_o(se_dat_mosi),.se_adr_o(se_adr),.se_sel_o(se_sel),.se_we_o(se_we),.se_cyc_o(se_cyc),.se_stb_o(se_stb),
+ .se_dat_i(se_dat_miso),.se_ack_i(se_ack),.se_err_i(0),.se_rty_i(0),
+ .sf_dat_o(sf_dat_mosi),.sf_adr_o(sf_adr),.sf_sel_o(sf_sel),.sf_we_o(sf_we),.sf_cyc_o(sf_cyc),.sf_stb_o(sf_stb),
+ .sf_dat_i(sf_dat_miso),.sf_ack_i(sf_ack),.sf_err_i(0),.sf_rty_i(0) );
+
+ assign s7_ack = 0;
+ assign s8_ack = 0; assign s9_ack = 0; assign sa_ack = 0; assign sb_ack = 0;
+ assign sc_ack = 0; assign sd_ack = 0; assign se_ack = 0; assign sf_ack = 0;
+
+ // /////////////////////////////////////////////////////////////////////////////////////
+ // Slave 0, Misc LEDs, Switches, controls
+
+ localparam REG_LEDS = 7'd0; // out
+ localparam REG_SWITCHES = 7'd2; // in
+ localparam REG_CGEN_CTRL = 7'd4; // out
+ localparam REG_CGEN_ST = 7'd6; // in
+ localparam REG_TEST = 7'd8; // out
+ localparam REG_RX_FRAMELEN = 7'd10; // in
+ localparam REG_TX_FRAMELEN = 7'd12; // out
+ localparam REG_XFER_RATE = 7'd14; // out
+ localparam REG_COMPAT = 7'd16; // in
+
+ always @(posedge wb_clk)
+ if(wb_rst)
+ begin
+ reg_leds <= 0;
+ reg_cgen_ctrl <= 2'b11;
+ reg_test <= 0;
+ tx_frame_len <= 0;
+ xfer_rate <= 0;
+ end
+ else
+ if(s0_cyc & s0_stb & s0_we)
+ case(s0_adr[6:0])
+ REG_LEDS :
+ reg_leds <= s0_dat_mosi;
+ REG_CGEN_CTRL :
+ reg_cgen_ctrl <= s0_dat_mosi;
+ REG_TEST :
+ reg_test <= s0_dat_mosi;
+ REG_TX_FRAMELEN :
+ tx_frame_len <= s0_dat_mosi;
+ REG_XFER_RATE :
+ xfer_rate <= s0_dat_mosi;
+ endcase // case (s0_adr[6:0])
+
+ assign tx_enable = xfer_rate[15];
+ assign rx_enable = xfer_rate[14];
+ assign rate = xfer_rate[7:0];
+
+ assign { debug_led[3:0] } = ~{run_rx,run_tx,reg_leds[1:0]};
+ assign { cgen_sync_b, cgen_ref_sel } = reg_cgen_ctrl;
+
+ assign s0_dat_miso = (s0_adr[6:0] == REG_LEDS) ? reg_leds :
+ (s0_adr[6:0] == REG_SWITCHES) ? { 16'd0 } :
+ (s0_adr[6:0] == REG_CGEN_CTRL) ? reg_cgen_ctrl :
+ (s0_adr[6:0] == REG_CGEN_ST) ? {13'b0,cgen_st_status,cgen_st_ld,cgen_st_refmon} :
+ (s0_adr[6:0] == REG_TEST) ? reg_test :
+ (s0_adr[6:0] == REG_RX_FRAMELEN) ? rx_frame_len :
+ (s0_adr[6:0] == REG_COMPAT) ? { WHOAMI, COMPAT_NUM } :
+ 16'hBEEF;
+
+ assign s0_ack = s0_stb & s0_cyc;
+
+ // /////////////////////////////////////////////////////////////////////////////////////
+ // Slave 1, UART
+ // depth of 3 is 128 entries, clkdiv of 278 gives 230.4k with a 64 MHz system clock
+
+ simple_uart #(.TXDEPTH(3),.RXDEPTH(3), .CLKDIV_DEFAULT(278)) uart
+ (.clk_i(wb_clk),.rst_i(wb_rst),
+ .we_i(s1_we),.stb_i(s1_stb),.cyc_i(s1_cyc),.ack_o(s1_ack),
+ .adr_i(s1_adr[3:1]),.dat_i({16'd0,s1_dat_mosi}),.dat_o(s1_dat_miso),
+ .rx_int_o(),.tx_int_o(),
+ .tx_o(debug_txd),.rx_i(debug_rxd),.baud_o());
+
+ // /////////////////////////////////////////////////////////////////////////////////////
+ // Slave 2, SPI
+
+ spi_top16 shared_spi
+ (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),.wb_adr_i(s2_adr[4:0]),.wb_dat_i(s2_dat_mosi),
+ .wb_dat_o(s2_dat_miso),.wb_sel_i(s2_sel),.wb_we_i(s2_we),.wb_stb_i(s2_stb),
+ .wb_cyc_i(s2_cyc),.wb_ack_o(s2_ack),.wb_err_o(),.wb_int_o(),
+ .ss_pad_o(sen), .sclk_pad_o(sclk), .mosi_pad_o(mosi), .miso_pad_i(miso) );
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Slave 3, I2C
+
+ wire scl_pad_i, scl_pad_o, scl_pad_oen_o, sda_pad_i, sda_pad_o, sda_pad_oen_o;
+ i2c_master_top #(.ARST_LVL(1)) i2c
+ (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),.arst_i(1'b0),
+ .wb_adr_i(s3_adr[4:2]),.wb_dat_i(s3_dat_mosi[7:0]),.wb_dat_o(s3_dat_miso[7:0]),
+ .wb_we_i(s3_we),.wb_stb_i(s3_stb),.wb_cyc_i(s3_cyc),
+ .wb_ack_o(s3_ack),.wb_inta_o(),
+ .scl_pad_i(scl_pad_i),.scl_pad_o(scl_pad_o),.scl_padoen_o(scl_pad_oen_o),
+ .sda_pad_i(sda_pad_i),.sda_pad_o(sda_pad_o),.sda_padoen_o(sda_pad_oen_o) );
+
+ assign s3_dat_miso[15:8] = 8'd0;
+
+ // I2C -- Don't use external transistors for open drain, the FPGA implements this
+ IOBUF scl_pin(.O(scl_pad_i), .IO(db_scl), .I(scl_pad_o), .T(scl_pad_oen_o));
+ IOBUF sda_pin(.O(sda_pad_i), .IO(db_sda), .I(sda_pad_o), .T(sda_pad_oen_o));
+
+ // /////////////////////////////////////////////////////////////////////////
+ // GPIOs -- Slave #4
+
+ wire [31:0] atr_lines;
+ wire [31:0] debug_gpio_0, debug_gpio_1;
+
+ nsgpio16LE
+ nsgpio16LE(.clk_i(wb_clk),.rst_i(wb_rst),
+ .cyc_i(s4_cyc),.stb_i(s4_stb),.adr_i(s4_adr[3:0]),.we_i(s4_we),
+ .dat_i(s4_dat_mosi),.dat_o(s4_dat_miso),.ack_o(s4_ack),
+ .atr(atr_lines),.debug_0(debug_gpio_0),.debug_1(debug_gpio_1),
+ .gpio( {io_tx,io_rx} ) );
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Settings Bus -- Slave #5
+
+ // only have 32 regs, 32 bits each with current setup...
+ settings_bus_16LE #(.AWIDTH(11),.RWIDTH(11-4-2)) settings_bus_16LE
+ (.wb_clk(wb_clk),.wb_rst(wb_rst),.wb_adr_i(s5_adr),.wb_dat_i(s5_dat_mosi),
+ .wb_stb_i(s5_stb),.wb_we_i(s5_we),.wb_ack_o(s5_ack),
+ .strobe(set_stb),.addr(set_addr),.data(set_data) );
+
+ // /////////////////////////////////////////////////////////////////////////
+ // ATR Controller -- Slave #6
+
+ atr_controller16 atr_controller16
+ (.clk_i(wb_clk), .rst_i(wb_rst),
+ .adr_i(s6_adr), .sel_i(s6_sel), .dat_i(s6_dat_mosi), .dat_o(s6_dat_miso),
+ .we_i(s6_we), .stb_i(s6_stb), .cyc_i(s6_cyc), .ack_o(s6_ack),
+ .run_rx(run_rx), .run_tx(run_tx), .ctrl_lines(atr_lines));
+
+
+ // /////////////////////////////////////////////////////////////////////////
+ // VITA Timing
+
+ time_64bit #(.TICKS_PER_SEC(32'd64000000),.BASE(SR_TIME64)) time_64bit
+ (.clk(wb_clk), .rst(wb_rst), .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data),
+ .pps(pps_in), .vita_time(vita_time), .pps_int(pps_int));
+
+ // /////////////////////////////////////////////////////////////////////////////////////
+ // Debug circuitry
+
+ assign debug_clk = { EM_CLK, clk_fpga };
+
+ assign debug = { { rx_have_data, tx_have_space, EM_NCS6, EM_NCS5, EM_NCS4, EM_NWE, EM_NOE, rx_overrun },
+ { tx_src_rdy, tx_src_rdy_int, tx_dst_rdy, tx_dst_rdy_int, rx_src_rdy, rx_src_rdy_int, rx_dst_rdy, rx_dst_rdy_int },
+ { EM_D } };
+
+ assign debug_gpio_0 = { {run_tx, strobe_tx, run_rx, strobe_rx, tx_i[11:0]},
+ {2'b00, tx_src_rdy, tx_dst_rdy, tx_q[11:0]} };
+
+ assign debug_gpio_1 = debug_vt;
+
+/*
+ assign debug_gpio_1 = { {rx_enable, rx_src_rdy, rx_dst_rdy, rx_src_rdy & ~rx_dst_rdy},
+ {tx_enable, tx_src_rdy, tx_dst_rdy, tx_dst_rdy & ~tx_src_rdy},
+ {rx_sof, rx_eof, rx_src_rdy, rx_dst_rdy, rx_data[33:32],2'b0},
+ {2'b0, bus_error, debug_gpmc[4:0] },
+ {misc_gpio[7:0]} };
+ */
+endmodule // u1e_core
diff --git a/fpga/usrp2/top/u1e_ethdebug/.gitignore b/fpga/usrp2/top/u1e_ethdebug/.gitignore
new file mode 100644
index 000000000..8d872713e
--- /dev/null
+++ b/fpga/usrp2/top/u1e_ethdebug/.gitignore
@@ -0,0 +1,6 @@
+*~
+build
+*.log
+*.cmd
+tb_u1e
+*.lxt
diff --git a/fpga/usrp2/top/u1e_ethdebug/Makefile b/fpga/usrp2/top/u1e_ethdebug/Makefile
new file mode 100644
index 000000000..751b52970
--- /dev/null
+++ b/fpga/usrp2/top/u1e_ethdebug/Makefile
@@ -0,0 +1,83 @@
+#
+# Copyright 2008 Ettus Research LLC
+#
+
+##################################################
+# Project Setup
+##################################################
+TOP_MODULE = u1e
+BUILD_DIR = $(abspath build$(ISE))
+
+##################################################
+# Include other makefiles
+##################################################
+
+include ../Makefile.common
+
+##################################################
+# Project Properties
+##################################################
+export PROJECT_PROPERTIES := \
+family "Spartan-3A DSP" \
+device xc3sd1800a \
+package cs484 \
+speed -4 \
+top_level_module_type "HDL" \
+synthesis_tool "XST (VHDL/Verilog)" \
+simulator "ISE Simulator (VHDL/Verilog)" \
+"Preferred Language" "Verilog" \
+"Enable Message Filtering" FALSE \
+"Display Incremental Messages" FALSE
+
+##################################################
+# Sources
+##################################################
+TOP_SRCS = \
+u1e.v \
+u1e.ucf
+
+SOURCES = $(abspath $(TOP_SRCS))
+
+##################################################
+# Process Properties
+##################################################
+SYNTHESIZE_PROPERTIES = \
+"Number of Clock Buffers" 8 \
+"Pack I/O Registers into IOBs" Yes \
+"Optimization Effort" High \
+"Optimize Instantiated Primitives" TRUE \
+"Register Balancing" Yes \
+"Use Clock Enable" Auto \
+"Use Synchronous Reset" Auto \
+"Use Synchronous Set" Auto
+
+TRANSLATE_PROPERTIES = \
+"Macro Search Path" "$(shell pwd)/../../coregen/"
+
+MAP_PROPERTIES = \
+"Allow Logic Optimization Across Hierarchy" TRUE \
+"Map to Input Functions" 4 \
+"Optimization Strategy (Cover Mode)" Speed \
+"Pack I/O Registers/Latches into IOBs" "For Inputs and Outputs" \
+"Perform Timing-Driven Packing and Placement" TRUE \
+"Map Effort Level" High \
+"Extra Effort" Normal \
+"Combinatorial Logic Optimization" TRUE \
+"Register Duplication" TRUE
+
+PLACE_ROUTE_PROPERTIES = \
+"Place & Route Effort Level (Overall)" High
+
+STATIC_TIMING_PROPERTIES = \
+"Number of Paths in Error/Verbose Report" 10 \
+"Report Type" "Error Report"
+
+GEN_PROG_FILE_PROPERTIES = \
+"Configuration Rate" 6 \
+"Create Binary Configuration File" TRUE \
+"Done (Output Events)" 5 \
+"Enable Bitstream Compression" TRUE \
+"Enable Outputs (Output Events)" 6 \
+"Unused IOB Pins" "Pull Up"
+
+SIM_MODEL_PROPERTIES = ""
diff --git a/fpga/usrp2/top/u1e_ethdebug/u1e.ucf b/fpga/usrp2/top/u1e_ethdebug/u1e.ucf
new file mode 100644
index 000000000..d6a2ea4ed
--- /dev/null
+++ b/fpga/usrp2/top/u1e_ethdebug/u1e.ucf
@@ -0,0 +1,88 @@
+
+## GPMC
+NET "EM_D<15>" LOC = "D13" ;
+NET "EM_D<14>" LOC = "D15" ;
+NET "EM_D<13>" LOC = "C16" ;
+NET "EM_D<12>" LOC = "B20" ;
+NET "EM_D<11>" LOC = "A19" ;
+NET "EM_D<10>" LOC = "A17" ;
+NET "EM_D<9>" LOC = "E15" ;
+NET "EM_D<8>" LOC = "F15" ;
+NET "EM_D<7>" LOC = "E16" ;
+NET "EM_D<6>" LOC = "F16" ;
+NET "EM_D<5>" LOC = "B17" ;
+NET "EM_D<4>" LOC = "C17" ;
+NET "EM_D<3>" LOC = "B19" ;
+NET "EM_D<2>" LOC = "D19" ;
+NET "EM_D<1>" LOC = "C19" ;
+NET "EM_D<0>" LOC = "A20" ;
+
+NET "EM_A<10>" LOC = "C14" ;
+NET "EM_A<9>" LOC = "C10" ;
+NET "EM_A<8>" LOC = "C5" ;
+NET "EM_A<7>" LOC = "A18" ;
+NET "EM_A<6>" LOC = "A15" ;
+NET "EM_A<5>" LOC = "A12" ;
+NET "EM_A<4>" LOC = "A10" ;
+NET "EM_A<3>" LOC = "E7" ;
+NET "EM_A<2>" LOC = "A7" ;
+NET "EM_A<1>" LOC = "C15" ;
+
+NET "EM_NCS6" LOC = "E17" ;
+NET "EM_NCS5" LOC = "E10" ;
+NET "EM_NCS4" LOC = "E6" ;
+#NET "EM_NCS1" LOC = "D18" ;
+#NET "EM_NCS0" LOC = "D17" ;
+
+NET "EM_CLK" LOC = "F11" ;
+NET "EM_WAIT0" LOC = "F14" ;
+#NET "EM_NBE<1>" LOC = "D14" ;
+#NET "EM_NBE<0>" LOC = "A13" ;
+NET "EM_NWE" LOC = "B13" ;
+NET "EM_NOE" LOC = "A14" ;
+NET "EM_NADV_ALE" LOC = "B15" ;
+#NET "EM_NWP" LOC = "F13" ;
+NET "overo_gpio64" LOC = "A4" ; # nRESET
+NET "overo_gpio176" LOC = "B4" ; # IRQ
+
+## Debug pins
+NET "debug_led<3>" LOC = "Y15" ;
+NET "debug_led<2>" LOC = "K16" ;
+NET "debug_led<1>" LOC = "J17" ;
+NET "debug_led<0>" LOC = "H22" ;
+NET "debug<0>" LOC = "G22" ;
+NET "debug<1>" LOC = "H17" ;
+NET "debug<2>" LOC = "H18" ;
+NET "debug<3>" LOC = "K20" ;
+NET "debug<4>" LOC = "J20" ;
+NET "debug<5>" LOC = "K19" ;
+NET "debug<6>" LOC = "K18" ;
+NET "debug<7>" LOC = "L22" ;
+NET "debug<8>" LOC = "K22" ;
+NET "debug<9>" LOC = "N22" ;
+NET "debug<10>" LOC = "M22" ;
+NET "debug<11>" LOC = "N20" ;
+NET "debug<12>" LOC = "N19" ;
+NET "debug<13>" LOC = "R22" ;
+NET "debug<14>" LOC = "P22" ;
+NET "debug<15>" LOC = "N17" ;
+NET "debug<16>" LOC = "P16" ;
+NET "debug<17>" LOC = "U22" ;
+NET "debug<18>" LOC = "P19" ;
+NET "debug<19>" LOC = "R18" ;
+NET "debug<20>" LOC = "U20" ;
+NET "debug<21>" LOC = "T20" ;
+NET "debug<22>" LOC = "R19" ;
+NET "debug<23>" LOC = "R20" ;
+NET "debug<24>" LOC = "W22" ;
+NET "debug<25>" LOC = "Y22" ;
+NET "debug<26>" LOC = "T18" ;
+NET "debug<27>" LOC = "T17" ;
+NET "debug<28>" LOC = "W19" ;
+NET "debug<29>" LOC = "V20" ;
+NET "debug<30>" LOC = "Y21" ;
+NET "debug<31>" LOC = "AA22" ;
+NET "debug_clk<0>" LOC = "N18" ;
+NET "debug_clk<1>" LOC = "M17" ;
+
+NET "debug_pb" LOC = "C22" ;
diff --git a/fpga/usrp2/top/u1e_ethdebug/u1e.v b/fpga/usrp2/top/u1e_ethdebug/u1e.v
new file mode 100644
index 000000000..2a543a313
--- /dev/null
+++ b/fpga/usrp2/top/u1e_ethdebug/u1e.v
@@ -0,0 +1,28 @@
+`timescale 1ns / 1ps
+//////////////////////////////////////////////////////////////////////////////////
+
+//`define DCM 1
+
+module u1e
+ (output [3:0] debug_led, output [31:0] debug, output [1:0] debug_clk,
+ input debug_pb,
+
+ // GPMC
+ input EM_CLK, input [15:0] EM_D, input [10:1] EM_A,
+ input EM_WAIT0, input EM_NCS4, input EM_NCS5, input EM_NCS6, input EM_NWE, input EM_NOE,
+ input EM_NADV_ALE,
+
+ input overo_gpio64, input overo_gpio176
+ );
+
+ assign debug_clk = {EM_CLK, EM_NADV_ALE};
+
+ assign debug_led = {1'b0, EM_A[9], EM_A[8], debug_pb};
+
+ assign debug = { {overo_gpio64, overo_gpio176, EM_WAIT0, EM_NCS4, EM_NCS5, EM_NCS6, EM_NWE, EM_NOE },
+ { EM_A[10], EM_A[7:1] },
+ { EM_D[15:8] },
+ { EM_D[7:0] } };
+
+
+endmodule // u1e
diff --git a/fpga/usrp2/top/u1e_passthru/.gitignore b/fpga/usrp2/top/u1e_passthru/.gitignore
new file mode 100644
index 000000000..1b2211df0
--- /dev/null
+++ b/fpga/usrp2/top/u1e_passthru/.gitignore
@@ -0,0 +1 @@
+build*
diff --git a/fpga/usrp2/top/u1e_passthru/Makefile b/fpga/usrp2/top/u1e_passthru/Makefile
new file mode 100644
index 000000000..d1950629b
--- /dev/null
+++ b/fpga/usrp2/top/u1e_passthru/Makefile
@@ -0,0 +1,99 @@
+#
+# Copyright 2008 Ettus Research LLC
+#
+
+##################################################
+# Project Setup
+##################################################
+TOP_MODULE = passthru
+BUILD_DIR = $(abspath build$(ISE))
+
+##################################################
+# Include other makefiles
+##################################################
+
+include ../Makefile.common
+include ../../fifo/Makefile.srcs
+include ../../control_lib/Makefile.srcs
+include ../../sdr_lib/Makefile.srcs
+include ../../serdes/Makefile.srcs
+include ../../simple_gemac/Makefile.srcs
+include ../../timing/Makefile.srcs
+include ../../opencores/Makefile.srcs
+include ../../vrt/Makefile.srcs
+include ../../udp/Makefile.srcs
+include ../../coregen/Makefile.srcs
+include ../../extram/Makefile.srcs
+include ../../gpmc/Makefile.srcs
+
+##################################################
+# Project Properties
+##################################################
+export PROJECT_PROPERTIES := \
+family "Spartan-3A DSP" \
+device xc3sd1800a \
+package cs484 \
+speed -4 \
+top_level_module_type "HDL" \
+synthesis_tool "XST (VHDL/Verilog)" \
+simulator "ISE Simulator (VHDL/Verilog)" \
+"Preferred Language" "Verilog" \
+"Enable Message Filtering" FALSE \
+"Display Incremental Messages" FALSE
+
+##################################################
+# Sources
+##################################################
+TOP_SRCS = \
+passthru.v \
+passthru.ucf
+
+SOURCES = $(abspath $(TOP_SRCS)) $(FIFO_SRCS) \
+$(CONTROL_LIB_SRCS) $(SDR_LIB_SRCS) $(SERDES_SRCS) \
+$(SIMPLE_GEMAC_SRCS) $(TIMING_SRCS) $(OPENCORES_SRCS) \
+$(VRT_SRCS) $(UDP_SRCS) $(COREGEN_SRCS) $(EXTRAM_SRCS) \
+$(GPMC_SRCS)
+
+##################################################
+# Process Properties
+##################################################
+SYNTHESIZE_PROPERTIES = \
+"Number of Clock Buffers" 8 \
+"Pack I/O Registers into IOBs" Yes \
+"Optimization Effort" High \
+"Optimize Instantiated Primitives" TRUE \
+"Register Balancing" Yes \
+"Use Clock Enable" Auto \
+"Use Synchronous Reset" Auto \
+"Use Synchronous Set" Auto
+
+TRANSLATE_PROPERTIES = \
+"Macro Search Path" "$(shell pwd)/../../coregen/"
+
+MAP_PROPERTIES = \
+"Allow Logic Optimization Across Hierarchy" TRUE \
+"Map to Input Functions" 4 \
+"Optimization Strategy (Cover Mode)" Speed \
+"Pack I/O Registers/Latches into IOBs" "For Inputs and Outputs" \
+"Perform Timing-Driven Packing and Placement" TRUE \
+"Map Effort Level" High \
+"Extra Effort" Normal \
+"Combinatorial Logic Optimization" TRUE \
+"Register Duplication" TRUE
+
+PLACE_ROUTE_PROPERTIES = \
+"Place & Route Effort Level (Overall)" High
+
+STATIC_TIMING_PROPERTIES = \
+"Number of Paths in Error/Verbose Report" 10 \
+"Report Type" "Error Report"
+
+GEN_PROG_FILE_PROPERTIES = \
+"Configuration Rate" 6 \
+"Create Binary Configuration File" TRUE \
+"Done (Output Events)" 5 \
+"Enable Bitstream Compression" TRUE \
+"Enable Outputs (Output Events)" 6 \
+"Unused IOB Pins" "Pull Up"
+
+SIM_MODEL_PROPERTIES = ""
diff --git a/fpga/usrp2/top/u1e_passthru/passthru.ucf b/fpga/usrp2/top/u1e_passthru/passthru.ucf
new file mode 100644
index 000000000..64e6f0440
--- /dev/null
+++ b/fpga/usrp2/top/u1e_passthru/passthru.ucf
@@ -0,0 +1,6 @@
+NET "overo_gpio145" LOC = "C7" ;
+NET "cgen_mosi" LOC = "E22" ;
+NET "cgen_sclk" LOC = "J19" ;
+NET "cgen_sen_b" LOC = "H20" ;
+NET "fpga_cfg_din" LOC = "W17" ;
+NET "fpga_cfg_cclk" LOC = "V17" ;
diff --git a/fpga/usrp2/top/u1e_passthru/passthru.v b/fpga/usrp2/top/u1e_passthru/passthru.v
new file mode 100644
index 000000000..12e4db017
--- /dev/null
+++ b/fpga/usrp2/top/u1e_passthru/passthru.v
@@ -0,0 +1,18 @@
+`timescale 1ns / 1ps
+//////////////////////////////////////////////////////////////////////////////////
+
+module passthru
+ (input overo_gpio145,
+ output cgen_sclk,
+ output cgen_sen_b,
+ output cgen_mosi,
+ input fpga_cfg_din,
+ input fpga_cfg_cclk
+ );
+
+ assign cgen_sclk = fpga_cfg_cclk;
+ assign cgen_sen_b = overo_gpio145;
+ assign cgen_mosi = fpga_cfg_din;
+
+
+endmodule // passthru
diff --git a/fpga/usrp2/top/u2_rev3/Makefile.udp b/fpga/usrp2/top/u2_rev3/Makefile.udp
index 9962887d4..99effb038 100644
--- a/fpga/usrp2/top/u2_rev3/Makefile.udp
+++ b/fpga/usrp2/top/u2_rev3/Makefile.udp
@@ -24,6 +24,8 @@ include ../../vrt/Makefile.srcs
include ../../udp/Makefile.srcs
include ../../coregen/Makefile.srcs
include ../../extram/Makefile.srcs
+include ../../extramfifo/Makefile.srcs
+
##################################################
# Project Properties
diff --git a/fpga/usrp2/top/u2_rev3/u2_core.v b/fpga/usrp2/top/u2_rev3/u2_core.v
index 9ba3cc136..a5963f6b1 100755..100644
--- a/fpga/usrp2/top/u2_rev3/u2_core.v
+++ b/fpga/usrp2/top/u2_rev3/u2_core.v
@@ -123,7 +123,7 @@ module u2_core
output [18:0] RAM_A,
output RAM_CE1n,
output RAM_CENn,
- output RAM_CLK,
+ // output RAM_CLK,
output RAM_WEn,
output RAM_OEn,
output RAM_LDn,
diff --git a/fpga/usrp2/top/u2_rev3/u2_core_udp.v b/fpga/usrp2/top/u2_rev3/u2_core_udp.v
index c9502898b..9e62ee1cc 100644
--- a/fpga/usrp2/top/u2_rev3/u2_core_udp.v
+++ b/fpga/usrp2/top/u2_rev3/u2_core_udp.v
@@ -119,11 +119,12 @@ module u2_core
inout [15:0] io_rx,
// External RAM
- inout [17:0] RAM_D,
+ input [17:0] RAM_D_pi,
+ output [17:0] RAM_D_po,
+ output RAM_D_poe,
output [18:0] RAM_A,
output RAM_CE1n,
output RAM_CENn,
- output RAM_CLK,
output RAM_WEn,
output RAM_OEn,
output RAM_LDn,
@@ -160,6 +161,7 @@ module u2_core
wire ram_loader_done;
wire ram_loader_rst, wb_rst, dsp_rst;
+ assign dsp_rst = wb_rst;
wire [31:0] status, status_b0, status_b1, status_b2, status_b3, status_b4, status_b5, status_b6, status_b7;
wire bus_error, spi_int, i2c_int, pps_int, onetime_int, periodic_int, buffer_int;
@@ -169,7 +171,7 @@ module u2_core
wire [31:0] atr_lines;
wire [31:0] debug_rx, debug_mac, debug_mac0, debug_mac1, debug_tx_dsp, debug_txc,
- debug_serdes0, debug_serdes1, debug_serdes2, debug_rx_dsp, debug_udp;
+ debug_serdes0, debug_serdes1, debug_serdes2, debug_rx_dsp, debug_udp, debug_extfifo, debug_extfifo2;
wire [15:0] ser_rx_occ, ser_tx_occ, dsp_rx_occ, dsp_tx_occ, eth_rx_occ, eth_tx_occ, eth_rx_occ2;
wire ser_rx_full, ser_tx_full, dsp_rx_full, dsp_tx_full, eth_rx_full, eth_tx_full, eth_rx_full2;
@@ -412,7 +414,7 @@ module u2_core
.cyc_i(s4_cyc),.stb_i(s4_stb),.adr_i(s4_adr[3:0]),.we_i(s4_we),
.dat_i(s4_dat_o),.dat_o(s4_dat_i),.ack_o(s4_ack),
.atr(atr_lines),.debug_0(debug_gpio_0),.debug_1(debug_gpio_1),
- .gpio( {io_tx,io_rx} ) );
+ .gpio({io_tx,io_rx}) );
// /////////////////////////////////////////////////////////////////////////
// Buffer Pool Status -- Slave #5
@@ -425,7 +427,7 @@ module u2_core
cycle_count <= cycle_count + 1;
//compatibility number -> increment when the fpga has been sufficiently altered
- localparam compat_num = 32'd2;
+ localparam compat_num = 32'd3;
wb_readback_mux buff_pool_status
(.wb_clk_i(wb_clk), .wb_rst_i(wb_rst), .wb_stb_i(s5_stb),
@@ -539,10 +541,17 @@ module u2_core
// /////////////////////////////////////////////////////////////////////////
// Interrupt Controller, Slave #8
+ // Pass interrupts on dsp_clk to wb_clk. These need edge triggering in the pic
+ wire underrun_wb, overrun_wb, pps_wb;
+
+ oneshot_2clk underrun_1s (.clk_in(dsp_clk), .in(underrun), .clk_out(wb_clk), .out(underrun_wb));
+ oneshot_2clk overrun_1s (.clk_in(dsp_clk), .in(overrun), .clk_out(wb_clk), .out(overrun_wb));
+ oneshot_2clk pps_1s (.clk_in(dsp_clk), .in(pps_int), .clk_out(wb_clk), .out(pps_wb));
+
assign irq= {{8'b0},
{8'b0},
{3'b0, periodic_int, clk_status, serdes_link_up, uart_tx_int, uart_rx_int},
- {pps_int,overrun,underrun,PHY_INTn,i2c_int,spi_int,onetime_int,buffer_int}};
+ {pps_wb,overrun_wb,underrun_wb,PHY_INTn,i2c_int,spi_int,onetime_int,buffer_int}};
pic pic(.clk_i(wb_clk),.rst_i(wb_rst),.cyc_i(s8_cyc),.stb_i(s8_stb),.adr_i(s8_adr[4:2]),
.we_i(s8_we),.dat_i(s8_dat_o),.dat_o(s8_dat_i),.ack_o(s8_ack),.int_o(proc_int),
@@ -552,14 +561,6 @@ module u2_core
// Master Timer, Slave #9
// No longer used, replaced with simple_timer below
- /*
- wire [31:0] master_time;
- timer timer
- (.wb_clk_i(wb_clk),.rst_i(wb_rst),
- .cyc_i(s9_cyc),.stb_i(s9_stb),.adr_i(s9_adr[4:2]),
- .we_i(s9_we),.dat_i(s9_dat_o),.dat_o(s9_dat_i),.ack_o(s9_ack),
- .sys_clk_i(dsp_clk),.master_time_i(master_time),.int_o(timer_int) );
- */
assign s9_ack = 0;
// /////////////////////////////////////////////////////////////////////////
@@ -623,9 +624,15 @@ module u2_core
.debug(debug_rx_dsp) );
wire [31:0] vrc_debug;
+ wire clear_rx;
+ setting_reg #(.my_addr(SR_RX_CTRL+3)) sr_clear
+ (.clk(dsp_clk),.rst(dsp_rst),
+ .strobe(set_stb_dsp),.addr(set_addr_dsp),.in(set_data_dsp),
+ .out(),.changed(clear_rx));
+
vita_rx_control #(.BASE(SR_RX_CTRL), .WIDTH(32)) vita_rx_control
- (.clk(dsp_clk), .reset(dsp_rst), .clear(0),
+ (.clk(dsp_clk), .reset(dsp_rst), .clear(clear_rx),
.set_stb(set_stb_dsp),.set_addr(set_addr_dsp),.set_data(set_data_dsp),
.vita_time(vita_time), .overrun(overrun),
.sample(sample_rx), .run(run_rx), .strobe(strobe_rx),
@@ -635,7 +642,7 @@ module u2_core
wire [3:0] vita_state;
vita_rx_framer #(.BASE(SR_RX_CTRL), .MAXCHAN(1)) vita_rx_framer
- (.clk(dsp_clk), .reset(dsp_rst), .clear(0),
+ (.clk(dsp_clk), .reset(dsp_rst), .clear(clear_rx),
.set_stb(set_stb_dsp),.set_addr(set_addr_dsp),.set_data(set_data_dsp),
.sample_fifo_i(rx_data), .sample_fifo_dst_rdy_o(rx_dst_rdy), .sample_fifo_src_rdy_i(rx_src_rdy),
.data_o(rx1_data), .dst_rdy_i(rx1_dst_rdy), .src_rdy_o(rx1_src_rdy),
@@ -643,7 +650,7 @@ module u2_core
.debug_rx(vita_state) );
fifo_cascade #(.WIDTH(36), .SIZE(DSP_RX_FIFOSIZE)) rx_fifo_cascade
- (.clk(dsp_clk), .reset(dsp_rst), .clear(0),
+ (.clk(dsp_clk), .reset(dsp_rst), .clear(clear_rx),
.datain(rx1_data), .src_rdy_i(rx1_src_rdy), .dst_rdy_o(rx1_dst_rdy),
.dataout({wr1_flags,wr1_dat}), .src_rdy_o(wr1_ready_i), .dst_rdy_i(wr1_ready_o));
@@ -653,14 +660,38 @@ module u2_core
wire [35:0] tx_data;
wire tx_src_rdy, tx_dst_rdy;
wire [31:0] debug_vt;
-
- fifo_cascade #(.WIDTH(36), .SIZE(DSP_TX_FIFOSIZE)) tx_fifo_cascade
- (.clk(dsp_clk), .reset(dsp_rst), .clear(0),
- .datain({rd1_flags,rd1_dat}), .src_rdy_i(rd1_ready_o), .dst_rdy_o(rd1_ready_i),
- .dataout(tx_data), .src_rdy_o(tx_src_rdy), .dst_rdy_i(tx_dst_rdy) );
+ wire clear_tx;
+
+ setting_reg #(.my_addr(SR_TX_CTRL+1)) sr_clear_tx
+ (.clk(clk),.rst(rst),.strobe(set_stb),.addr(set_addr),
+ .in(set_data),.out(),.changed(clear_tx));
+
+ ext_fifo #(.EXT_WIDTH(18),.INT_WIDTH(36),.RAM_DEPTH(19),.FIFO_DEPTH(19))
+ ext_fifo_i1
+ (.int_clk(dsp_clk),
+ .ext_clk(clk_to_mac),
+ .rst(dsp_rst | clear_tx),
+ .RAM_D_pi(RAM_D_pi),
+ .RAM_D_po(RAM_D_po),
+ .RAM_D_poe(RAM_D_poe),
+ .RAM_A(RAM_A),
+ .RAM_WEn(RAM_WEn),
+ .RAM_CENn(RAM_CENn),
+ .RAM_LDn(RAM_LDn),
+ .RAM_OEn(RAM_OEn),
+ .RAM_CE1n(RAM_CE1n),
+ .datain({rd1_flags[3:2],rd1_dat[31:16],rd1_flags[1:0],rd1_dat[15:0]}),
+ .src_rdy_i(rd1_ready_o),
+ .dst_rdy_o(rd1_ready_i),
+ .dataout({tx_data[35:34],tx_data[31:16],tx_data[33:32],tx_data[15:0]}),
+ .src_rdy_o(tx_src_rdy),
+ .dst_rdy_i(tx_dst_rdy),
+ .debug(debug_extfifo),
+ .debug2(debug_extfifo2) );
vita_tx_chain #(.BASE_CTRL(SR_TX_CTRL), .BASE_DSP(SR_TX_DSP),
- .REPORT_ERROR(1), .PROT_ENG_FLAGS(1))
+ .REPORT_ERROR(1), .DO_FLOW_CONTROL(1),
+ .PROT_ENG_FLAGS(1), .USE_TRANS_HEADER(1))
vita_tx_chain
(.clk(dsp_clk), .reset(dsp_rst),
.set_stb(set_stb_dsp),.set_addr(set_addr_dsp),.set_data(set_data_dsp),
@@ -671,8 +702,6 @@ module u2_core
.underrun(underrun), .run(run_tx),
.debug(debug_vt));
- assign dsp_rst = wb_rst;
-
// ///////////////////////////////////////////////////////////////////////////////////
// SERDES
@@ -686,40 +715,7 @@ module u2_core
.rx_occupied(ser_rx_occ),.rx_full(ser_rx_full),.rx_empty(ser_rx_empty),
.serdes_link_up(serdes_link_up),.debug0(debug_serdes0), .debug1(debug_serdes1) );
- // ///////////////////////////////////////////////////////////////////////////////////
- // External RAM Interface
-
- /*
- localparam PAGE_SIZE = 10; // PAGE SIZE is in bytes, 10 = 1024 bytes
-
- wire [15:0] bus2ram, ram2bus;
- wire [15:0] bridge_adr;
- wire [1:0] bridge_sel;
- wire bridge_stb, bridge_cyc, bridge_we, bridge_ack;
-
- wire [19:0] page;
- wire [19:0] wb_ram_adr = {page[19:PAGE_SIZE],bridge_adr[PAGE_SIZE-1:0]};
- setting_reg #(.my_addr(6),.width(20)) sr_page (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr),
- .in(set_data),.out(page),.changed());
-
- wb_bridge_16_32 bridge
- (.wb_clk(wb_clk),.wb_rst(wb_rst),
- .A_cyc_i(se_cyc),.A_stb_i(se_stb),.A_we_i(se_we),.A_sel_i(se_sel),
- .A_adr_i(se_adr),.A_dat_i(se_dat_o),.A_dat_o(se_dat_i),.A_ack_o(se_ack),
- .B_cyc_o(bridge_cyc),.B_stb_o(bridge_stb),.B_we_o(bridge_we),.B_sel_o(bridge_sel),
- .B_adr_o(bridge_adr),.B_dat_o(bus2ram),.B_dat_i(ram2bus),.B_ack_i(bridge_ack));
-
- wb_zbt16_b wb_zbt16_b
- (.clk(wb_clk),.rst(wb_rst),
- .wb_adr_i(wb_ram_adr),.wb_dat_i(bus2ram),.wb_dat_o(ram2bus),.wb_sel_i(bridge_sel),
- .wb_cyc_i(bridge_cyc),.wb_stb_i(bridge_stb),.wb_ack_o(bridge_ack),.wb_we_i(bridge_we),
- .sram_clk(RAM_CLK),.sram_a(RAM_A),.sram_d(RAM_D[15:0]),.sram_we(RAM_WEn),
- .sram_bw(),.sram_adv(RAM_LDn),.sram_ce(RAM_CENn),.sram_oe(RAM_OEn),
- .sram_mode(),.sram_zz() );
-
- assign RAM_CE1n = 0;
- assign RAM_D[17:16] = 2'bzz;
- */
+ assign RAM_CLK = clk_to_mac;
// /////////////////////////////////////////////////////////////////////////
// VITA Timing
@@ -731,146 +727,9 @@ module u2_core
// /////////////////////////////////////////////////////////////////////////////////////////
// Debug Pins
- assign debug_clk = 2'b00;
- assign debug = 32'd0;
+ assign debug_clk = 2'b00; // {dsp_clk, clk_to_mac};
+ assign debug = 32'd0; // debug_extfifo;
assign debug_gpio_0 = 32'd0;
assign debug_gpio_1 = 32'd0;
endmodule // u2_core
-
-/*
- // FIFO Level Debugging
- reg [31:0] host_to_dsp_fifo,dsp_to_host_fifo,eth_mac_debug,serdes_to_dsp_fifo,dsp_to_serdes_fifo;
-
- always @(posedge dsp_clk)
- serdes_to_dsp_fifo <= { {ser_rx_full,ser_rx_empty,ser_rx_occ[13:0]},
- {dsp_tx_full,dsp_tx_empty,dsp_tx_occ[13:0]} };
-
- always @(posedge dsp_clk)
- dsp_to_serdes_fifo <= { {ser_tx_full,ser_tx_empty,ser_tx_occ[13:0]},
- {dsp_rx_full,dsp_rx_empty,dsp_rx_occ[13:0]} };
-
- always @(posedge dsp_clk)
- host_to_dsp_fifo <= { {eth_rx_full,eth_rx_empty,eth_rx_occ[13:0]},
- {dsp_tx_full,dsp_tx_empty,dsp_tx_occ[13:0]} };
-
- always @(posedge dsp_clk)
- dsp_to_host_fifo <= { {eth_tx_full,eth_tx_empty,eth_tx_occ[13:0]},
- {dsp_rx_full,dsp_rx_empty,dsp_rx_occ[13:0]} };
-
- always @(posedge dsp_clk)
- eth_mac_debug <= { { 6'd0, GMII_TX_EN, GMII_RX_DV, debug_mac0[7:0]},
- {eth_rx_full2, eth_rx_empty2, eth_rx_occ2[13:0]} };
-
- assign debug_clk[0] = GMII_RX_CLK; // wb_clk;
- assign debug_clk[1] = dsp_clk;
-*/
-/*
-
- wire mdio_cpy = MDIO;
- assign debug = { { 1'b0, s6_stb, s6_ack, s6_we, s6_sel[3:0] },
- { s6_adr[15:8] },
- { s6_adr[7:0] },
- { 6'd0, mdio_cpy, MDC } };
-
- assign debug = { { GMII_TXD },
- { 5'd0, GMII_TX_EN, GMII_TX_ER, GMII_GTX_CLK },
- { wr2_flags, rd2_flags },
- { 4'd0, wr2_ready_i, wr2_ready_o, rd2_ready_i, rd2_ready_o } };
- assign debug = { { GMII_RXD },
- { 5'd0, GMII_RX_DV, GMII_RX_ER, GMII_RX_CLK },
- { wr2_flags, rd2_flags },
- { GMII_TX_EN,3'd0, wr2_ready_i, wr2_ready_o, rd2_ready_i, rd2_ready_o } };
-
-// assign debug = debug_udp;
- // assign debug = vrc_debug;
-/*
- assign debug_gpio_0 = { {pps_in, pps_int, 2'd0, vita_state},
- {2'd0, rx_dst_rdy, rx_src_rdy, rx_data[99:96]},
- {run_rx_d1, run_rx, strobe_rx, overrun, wr1_flags[3:0]} ,
- {wr1_ready_i, wr1_ready_o, rx1_src_rdy, rx1_dst_rdy, rx1_data[35:32]}};
-*/
-// assign debug_gpio_1 = {vita_time[63:32] };
-/*
- assign debug_gpio_1 = { { tx_f19_data[15:8] },
- { tx_f19_data[7:0] },
- { 3'd0, tx_f19_src_rdy, tx_f19_dst_rdy, tx_f19_data[18:16] },
- { 2'b0, rd2_ready_i, rd2_ready_o, rd2_flags } };
- */
-
-// wire debug_mux;
-// setting_reg #(.my_addr(5)) sr_debug (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr),
-// .in(set_data),.out(debug_mux),.changed());
-
-//assign debug = debug_mux ? host_to_dsp_fifo : dsp_to_host_fifo;
-//assign debug = debug_mux ? serdes_to_dsp_fifo : dsp_to_serdes_fifo;
-
-//assign debug = {{strobe_rx,/*adc_ovf_a*/ 1'b0,adc_a},
-// {run_rx,/*adc_ovf_b*/ 1'b0,adc_b}};
-
-//assign debug = debug_tx_dsp;
-//assign debug = debug_serdes0;
-
-//assign debug_gpio_0 = 0; //debug_serdes0;
-//assign debug_gpio_1 = 0; //debug_serdes1;
-
-// assign debug={{3'b0, wb_clk, wb_rst, dsp_rst, por, config_success},
-// {8'b0},
-// {3'b0,ram_loader_ack, ram_loader_stb, ram_loader_we,ram_loader_rst,ram_loader_done },
-// {cpld_start,cpld_mode,cpld_done,cpld_din,cpld_clk,cpld_detached,cpld_misc,cpld_init_b} };
-
-//assign debug = {dac_a,dac_b};
-
-/*
- assign debug = {{ram_loader_done, takeover, 6'd0},
- {1'b0, cpld_start_int, cpld_mode_int, cpld_done_int, sd_clk, sd_csn, sd_miso, sd_mosi},
- {8'd0},
- {cpld_start, cpld_mode, cpld_done, cpld_din, cpld_misc, cpld_detached, cpld_clk, cpld_init_b}}; */
-
-/*assign debug = host_to_dsp_fifo;
- assign debug_gpio_0 = eth_mac_debug;
- assign debug_gpio_1 = 0;
- */
-// Assign various commonly used debug buses.
-/*
- wire [31:0] debug_rx_1 = {uart_tx_o,GMII_TX_EN,strobe_rx,overrun,proc_int,buffer_int,timer_int,GMII_RX_DV,
- irq[7:0],
- GMII_RXD,
- GMII_TXD};
-
- wire [31:0] debug_rx_2 = { 5'd0, s8_we, s8_stb, s8_ack, debug_rx[23:0] };
-
- wire [31:0] debug_time = {uart_tx_o, 7'b0,
- irq[7:0],
- 6'b0, GMII_RX_DV, GMII_TX_EN,
- 4'b0, exp_pps_in, exp_pps_out, pps_in, pps_int};
-
- wire [31:0] debug_irq = {uart_tx_o, iwb_adr, iwb_ack,
- irq[7:0],
- proc_int, 7'b0 };
-
- wire [31:0] debug_eth =
- {{uart_tx_o,proc_int,underrun,buffer_int,wr2_ready,wr2_error,wr2_done,wr2_write},
- {8'd0},
- {8'd0},
- {GMII_TX_EN,GMII_RX_DV,Rx_mac_empty,Rx_mac_rd,Rx_mac_err,Rx_mac_sop,Rx_mac_eop,wr2_full} };
-
- assign debug_serdes0 = { { rd0_dat[7:0] },
- { ser_tx_clk, ser_tkmsb, ser_tklsb, rd0_sop, rd0_eop, rd0_read, rd0_error, rd0_done },
- { ser_t[15:8] },
- { ser_t[7:0] } };
-
- assign debug_serdes1 = { {1'b0,proc_int,underrun,buffer_int,wr0_ready,wr0_error,wr0_done,wr0_write},
- { 1'b0, ser_rx_clk, ser_rkmsb, ser_rklsb, ser_enable, ser_prbsen, ser_loopen, ser_rx_en },
- { ser_r[15:8] },
- { ser_r[7:0] } };
-
- assign debug_gpio_1 = {uart_tx_o,7'd0,
- 3'd0,rd1_sop,rd1_eop,rd1_read,rd1_done,rd1_error,
- debug_txc[15:0]};
- assign debug_gpio_1 = debug_rx;
- assign debug_gpio_1 = debug_serdes1;
- assign debug_gpio_1 = debug_eth;
-
- */
-
diff --git a/fpga/usrp2/top/u2_rev3/u2_rev3.ucf b/fpga/usrp2/top/u2_rev3/u2_rev3.ucf
index 6aa699d2a..6e0caedd5 100644
--- a/fpga/usrp2/top/u2_rev3/u2_rev3.ucf
+++ b/fpga/usrp2/top/u2_rev3/u2_rev3.ucf
@@ -74,49 +74,49 @@ NET "MDC" LOC = "V18" ;
NET "PHY_INTn" LOC = "AB13" ;
NET "PHY_RESETn" LOC = "AA19" ;
NET "PHY_CLK" LOC = "V15" ;
-NET "RAM_D[0]" LOC = "N20" ;
-NET "RAM_D[1]" LOC = "N21" ;
-NET "RAM_D[2]" LOC = "N22" ;
-NET "RAM_D[3]" LOC = "M17" ;
-NET "RAM_D[4]" LOC = "M18" ;
-NET "RAM_D[5]" LOC = "M19" ;
-NET "RAM_D[6]" LOC = "M20" ;
-NET "RAM_D[7]" LOC = "M21" ;
-NET "RAM_D[8]" LOC = "M22" ;
-NET "RAM_D[9]" LOC = "Y22" ;
-NET "RAM_D[10]" LOC = "Y21" ;
-NET "RAM_D[11]" LOC = "Y20" ;
-NET "RAM_D[12]" LOC = "Y19" ;
-NET "RAM_D[13]" LOC = "W22" ;
-NET "RAM_D[14]" LOC = "W21" ;
-NET "RAM_D[15]" LOC = "W20" ;
-NET "RAM_D[16]" LOC = "W19" ;
-NET "RAM_D[17]" LOC = "V22" ;
-NET "RAM_A[0]" LOC = "U21" ;
-NET "RAM_A[1]" LOC = "T19" ;
-NET "RAM_A[2]" LOC = "V21" ;
-NET "RAM_A[3]" LOC = "V20" ;
-NET "RAM_A[4]" LOC = "T20" ;
-NET "RAM_A[5]" LOC = "T21" ;
-NET "RAM_A[6]" LOC = "T22" ;
-NET "RAM_A[7]" LOC = "T18" ;
-NET "RAM_A[8]" LOC = "R18" ;
-NET "RAM_A[9]" LOC = "P19" ;
-NET "RAM_A[10]" LOC = "P21" ;
-NET "RAM_A[11]" LOC = "P22" ;
-NET "RAM_A[12]" LOC = "N19" ;
-NET "RAM_A[13]" LOC = "N17" ;
-NET "RAM_A[14]" LOC = "N18" ;
-NET "RAM_A[15]" LOC = "T17" ;
-NET "RAM_A[16]" LOC = "U19" ;
-NET "RAM_A[17]" LOC = "U18" ;
-NET "RAM_A[18]" LOC = "V19" ;
-NET "RAM_CE1n" LOC = "U20" ;
-NET "RAM_CENn" LOC = "P18" ;
-NET "RAM_CLK" LOC = "P17" ;
-NET "RAM_WEn" LOC = "R22" ;
-NET "RAM_OEn" LOC = "R21" ;
-NET "RAM_LDn" LOC = "R19" ;
+NET "RAM_D[0]" LOC = "N20" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[1]" LOC = "N21" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[2]" LOC = "N22" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[3]" LOC = "M17" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[4]" LOC = "M18" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[5]" LOC = "M19" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[6]" LOC = "M20" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[7]" LOC = "M21" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[8]" LOC = "M22" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[9]" LOC = "Y22" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[10]" LOC = "Y21" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[11]" LOC = "Y20" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[12]" LOC = "Y19" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[13]" LOC = "W22" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[14]" LOC = "W21" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[15]" LOC = "W20" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[16]" LOC = "W19" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_D[17]" LOC = "V22" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[0]" LOC = "U21" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[1]" LOC = "T19" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[2]" LOC = "V21" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[3]" LOC = "V20" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[4]" LOC = "T20" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[5]" LOC = "T21" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[6]" LOC = "T22" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[7]" LOC = "T18" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[8]" LOC = "R18" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[9]" LOC = "P19" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[10]" LOC = "P21" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[11]" LOC = "P22" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[12]" LOC = "N19" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[13]" LOC = "N17" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[14]" LOC = "N18" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[15]" LOC = "T17" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[16]" LOC = "U19" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[17]" LOC = "U18" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_A[18]" LOC = "V19" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_CE1n" LOC = "U20" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_CENn" LOC = "P18" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_CLK" LOC = "P17" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_WEn" LOC = "R22" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_OEn" LOC = "R21" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+NET "RAM_LDn" LOC = "R19" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
NET "ser_enable" LOC = "W11" ;
NET "ser_prbsen" LOC = "AA3" ;
NET "ser_loopen" LOC = "Y4" ;
@@ -264,22 +264,22 @@ NET "sdi_tx_adc" LOC = "J4" ;
NET "sen_tx_dac" LOC = "H4" ;
NET "sclk_tx_dac" LOC = "J5" ;
NET "sdi_tx_dac" LOC = "J6" ;
-NET "io_tx[0]" LOC = "K4" ;
-NET "io_tx[1]" LOC = "K3" ;
-NET "io_tx[2]" LOC = "G1" ;
-NET "io_tx[3]" LOC = "G5" ;
-NET "io_tx[4]" LOC = "H5" ;
-NET "io_tx[5]" LOC = "F3" ;
-NET "io_tx[6]" LOC = "F2" ;
-NET "io_tx[7]" LOC = "F5" ;
-NET "io_tx[8]" LOC = "G6" ;
-NET "io_tx[9]" LOC = "E2" ;
-NET "io_tx[10]" LOC = "E1" ;
-NET "io_tx[11]" LOC = "E3" ;
-NET "io_tx[12]" LOC = "F4" ;
-NET "io_tx[13]" LOC = "D2" ;
-NET "io_tx[14]" LOC = "D4" ;
-NET "io_tx[15]" LOC = "E4" ;
+NET "io_tx[0]" LOC = "K4" ;
+NET "io_tx[1]" LOC = "K3" ;
+NET "io_tx[2]" LOC = "G1" ;
+NET "io_tx[3]" LOC = "G5" ;
+NET "io_tx[4]" LOC = "H5" ;
+NET "io_tx[5]" LOC = "F3" ;
+NET "io_tx[6]" LOC = "F2" ;
+NET "io_tx[7]" LOC = "F5" ;
+NET "io_tx[8]" LOC = "G6" ;
+NET "io_tx[9]" LOC = "E2" ;
+NET "io_tx[10]" LOC = "E1" ;
+NET "io_tx[11]" LOC = "E3" ;
+NET "io_tx[12]" LOC = "F4" ;
+NET "io_tx[13]" LOC = "D2" ;
+NET "io_tx[14]" LOC = "D4" ;
+NET "io_tx[15]" LOC = "E4" ;
NET "sen_rx_db" LOC = "D22" ;
NET "sclk_rx_db" LOC = "F19" ;
NET "sdo_rx_db" LOC = "G20" ;
@@ -291,22 +291,22 @@ NET "sdi_rx_adc" LOC = "H22" ;
NET "sen_rx_dac" LOC = "J18" ;
NET "sclk_rx_dac" LOC = "J19" ;
NET "sdi_rx_dac" LOC = "J21" ;
-NET "io_rx[0]" LOC = "L21" ;
-NET "io_rx[1]" LOC = "L20" ;
-NET "io_rx[2]" LOC = "L19" ;
-NET "io_rx[3]" LOC = "L18" ;
-NET "io_rx[4]" LOC = "L17" ;
-NET "io_rx[5]" LOC = "K22" ;
-NET "io_rx[6]" LOC = "K21" ;
-NET "io_rx[7]" LOC = "K20" ;
-NET "io_rx[8]" LOC = "G22" ;
-NET "io_rx[9]" LOC = "G21" ;
-NET "io_rx[10]" LOC = "F21" ;
-NET "io_rx[11]" LOC = "F20" ;
-NET "io_rx[12]" LOC = "G19" ;
-NET "io_rx[13]" LOC = "G18" ;
-NET "io_rx[14]" LOC = "G17" ;
-NET "io_rx[15]" LOC = "E22" ;
+NET "io_rx[0]" LOC = "L21" ;
+NET "io_rx[1]" LOC = "L20" ;
+NET "io_rx[2]" LOC = "L19" ;
+NET "io_rx[3]" LOC = "L18" ;
+NET "io_rx[4]" LOC = "L17" ;
+NET "io_rx[5]" LOC = "K22" ;
+NET "io_rx[6]" LOC = "K21" ;
+NET "io_rx[7]" LOC = "K20" ;
+NET "io_rx[8]" LOC = "G22" ;
+NET "io_rx[9]" LOC = "G21" ;
+NET "io_rx[10]" LOC = "F21" ;
+NET "io_rx[11]" LOC = "F20" ;
+NET "io_rx[12]" LOC = "G19" ;
+NET "io_rx[13]" LOC = "G18" ;
+NET "io_rx[14]" LOC = "G17" ;
+NET "io_rx[15]" LOC = "E22" ;
NET "clk_to_mac" TNM_NET = "clk_to_mac";
TIMESPEC "TS_clk_to_mac" = PERIOD "clk_to_mac" 8 ns HIGH 50 %;
@@ -324,6 +324,7 @@ NET "ser_rx_clk" TNM_NET = "ser_rx_clk";
TIMESPEC "TS_ser_rx_clk" = PERIOD "ser_rx_clk" 10 ns HIGH 50 %;
NET "cpld_clk" CLOCK_DEDICATED_ROUTE = FALSE;
+NET "GMII_RX_CLK" CLOCK_DEDICATED_ROUTE = FALSE;
#NET "adc_a<*>" TNM_NET = ADC_DATA_GRP;
#NET "adc_b<*>" TNM_NET = ADC_DATA_GRP;
diff --git a/fpga/usrp2/top/u2_rev3/u2_rev3.v b/fpga/usrp2/top/u2_rev3/u2_rev3.v
index 4daa66212..4f7f9bf1a 100644
--- a/fpga/usrp2/top/u2_rev3/u2_rev3.v
+++ b/fpga/usrp2/top/u2_rev3/u2_rev3.v
@@ -330,8 +330,8 @@ module u2_rev3
wire [15:0] dac_a_int, dac_b_int;
// DAC A and B are swapped in schematic to facilitate clean layout
// DAC A is also inverted in schematic to facilitate clean layout
- always @(negedge dsp_clk) dac_a <= ~dac_b_int;
- always @(negedge dsp_clk) dac_b <= dac_a_int;
+ always @(posedge dsp_clk) dac_a <= ~dac_b_int;
+ always @(posedge dsp_clk) dac_b <= dac_a_int;
/*
OFDDRRSE OFDDRRSE_serdes_inst
@@ -345,100 +345,228 @@ module u2_rev3
.S(0) // Synchronous preset input
);
*/
+
+ wire [17:0] RAM_D_pi;
+ wire [17:0] RAM_D_po;
+ wire RAM_D_poe;
+
+ genvar i;
+
+ //
+ // Instantiate IO for Bidirectional bus to SRAM
+ //
+
+ generate
+ for (i=0;i<18;i=i+1)
+ begin : gen_RAM_D_IO
+
+ IOBUF #(
+ .DRIVE(12),
+ .IOSTANDARD("LVCMOS25"),
+ .SLEW("FAST")
+ )
+ RAM_D_i (
+ .O(RAM_D_pi[i]),
+ .I(RAM_D_po[i]),
+ .IO(RAM_D[i]),
+ .T(RAM_D_poe)
+ );
+ end // block: gen_RAM_D_IO
+ endgenerate
+
+ //
+ // DCM edits start here
+ //
+
+
+ wire RAM_CLK_buf;
+ wire clk_to_mac_buf;
+ wire clk125_ext_clk0;
+ wire clk125_ext_clk180;
+ wire clk125_ext_clk0_buf;
+ wire clk125_ext_clk180_buf;
+ wire clk125_int_buf;
+ wire clk125_int;
+
+ IBUFG clk_to_mac_buf_i1 (.I(clk_to_mac),
+ .O(clk_to_mac_buf));
+
+ DCM DCM_INST1 (.CLKFB(RAM_CLK_buf),
+ .CLKIN(clk_to_mac_buf),
+ .DSSEN(1'b0),
+ .PSCLK(1'b0),
+ .PSEN(1'b0),
+ .PSINCDEC(1'b0),
+ .RST(1'b0),
+ .CLK0(clk125_ext_clk0),
+ .CLK180(clk125_ext_clk180) );
+ defparam DCM_INST1.CLK_FEEDBACK = "1X";
+ defparam DCM_INST1.CLKDV_DIVIDE = 2.0;
+ defparam DCM_INST1.CLKFX_DIVIDE = 1;
+ defparam DCM_INST1.CLKFX_MULTIPLY = 4;
+ defparam DCM_INST1.CLKIN_DIVIDE_BY_2 = "FALSE";
+ defparam DCM_INST1.CLKIN_PERIOD = 8.000;
+ defparam DCM_INST1.CLKOUT_PHASE_SHIFT = "FIXED";
+ defparam DCM_INST1.DESKEW_ADJUST = "SYSTEM_SYNCHRONOUS";
+ defparam DCM_INST1.DFS_FREQUENCY_MODE = "LOW";
+ defparam DCM_INST1.DLL_FREQUENCY_MODE = "LOW";
+ defparam DCM_INST1.DUTY_CYCLE_CORRECTION = "TRUE";
+ defparam DCM_INST1.FACTORY_JF = 16'h8080;
+ defparam DCM_INST1.PHASE_SHIFT = -64;
+ defparam DCM_INST1.STARTUP_WAIT = "FALSE";
+
+ IBUFG RAM_CLK_buf_i1 (.I(RAM_CLK),
+ .O(RAM_CLK_buf));
+ BUFG clk125_ext_clk0_buf_i1 (.I(clk125_ext_clk0),
+ .O(clk125_ext_clk0_buf));
+ BUFG clk125_ext_clk180_buf_i1 (.I(clk125_ext_clk180),
+ .O(clk125_ext_clk180_buf));
+
+ OFDDRRSE RAM_CLK_i1 (.Q(RAM_CLK),
+ .C0(clk125_ext_clk0_buf),
+ .C1(clk125_ext_clk180_buf),
+ .CE(1'b1),
+ .D0(1'b1),
+ .D1(1'b0),
+ .R(1'b0),
+ .S(1'b0));
+
+// SRL16 dcm2_rst_i1 (.D(1'b0),
+// .CLK(clk_to_mac_buf),
+// .Q(dcm2_rst),
+// .A0(1'b1),
+// .A1(1'b1),
+// .A2(1'b1),
+// .A3(1'b1));
+ // synthesis attribute init of dcm2_rst_i1 is "000F";
+
+ DCM DCM_INST2 (.CLKFB(clk125_int_buf),
+ .CLKIN(clk_to_mac_buf),
+ .DSSEN(1'b0),
+ .PSCLK(1'b0),
+ .PSEN(1'b0),
+ .PSINCDEC(1'b0),
+ .RST(1'b0),
+ .CLK0(clk125_int));
+ defparam DCM_INST2.CLK_FEEDBACK = "1X";
+ defparam DCM_INST2.CLKDV_DIVIDE = 2.0;
+ defparam DCM_INST2.CLKFX_DIVIDE = 1;
+ defparam DCM_INST2.CLKFX_MULTIPLY = 4;
+ defparam DCM_INST2.CLKIN_DIVIDE_BY_2 = "FALSE";
+ defparam DCM_INST2.CLKIN_PERIOD = 8.000;
+ defparam DCM_INST2.CLKOUT_PHASE_SHIFT = "NONE";
+ defparam DCM_INST2.DESKEW_ADJUST = "SYSTEM_SYNCHRONOUS";
+ defparam DCM_INST2.DFS_FREQUENCY_MODE = "LOW";
+ defparam DCM_INST2.DLL_FREQUENCY_MODE = "LOW";
+ defparam DCM_INST2.DUTY_CYCLE_CORRECTION = "TRUE";
+ defparam DCM_INST2.FACTORY_JF = 16'h8080;
+ defparam DCM_INST2.PHASE_SHIFT = 0;
+ defparam DCM_INST2.STARTUP_WAIT = "FALSE";
+
+ BUFG clk125_int_buf_i1 (.I(clk125_int),
+ .O(clk125_int_buf));
+
+ //
+ // DCM edits end here
+ //
+
+
u2_core #(.RAM_SIZE(32768))
- u2_core(.dsp_clk (dsp_clk),
- .wb_clk (wb_clk),
- .clock_ready (clock_ready),
- .clk_to_mac (clk_to_mac),
- .pps_in (pps_in),
- .leds (leds_int),
- .debug (debug[31:0]),
- .debug_clk (debug_clk[1:0]),
- .exp_pps_in (exp_pps_in),
- .exp_pps_out (exp_pps_out),
- .GMII_COL (GMII_COL),
- .GMII_CRS (GMII_CRS),
- .GMII_TXD (GMII_TXD_unreg[7:0]),
- .GMII_TX_EN (GMII_TX_EN_unreg),
- .GMII_TX_ER (GMII_TX_ER_unreg),
- .GMII_GTX_CLK (GMII_GTX_CLK_int),
- .GMII_TX_CLK (GMII_TX_CLK),
- .GMII_RXD (GMII_RXD[7:0]),
- .GMII_RX_CLK (GMII_RX_CLK),
- .GMII_RX_DV (GMII_RX_DV),
- .GMII_RX_ER (GMII_RX_ER),
- .MDIO (MDIO),
- .MDC (MDC),
- .PHY_INTn (PHY_INTn),
- .PHY_RESETn (PHY_RESETn),
- .ser_enable (ser_enable),
- .ser_prbsen (ser_prbsen),
- .ser_loopen (ser_loopen),
- .ser_rx_en (ser_rx_en),
- .ser_tx_clk (ser_tx_clk_int),
- .ser_t (ser_t_unreg[15:0]),
- .ser_tklsb (ser_tklsb_unreg),
- .ser_tkmsb (ser_tkmsb_unreg),
- .ser_rx_clk (ser_rx_clk_buf),
- .ser_r (ser_r_int[15:0]),
- .ser_rklsb (ser_rklsb_int),
- .ser_rkmsb (ser_rkmsb_int),
- .cpld_start (cpld_start),
- .cpld_mode (cpld_mode),
- .cpld_done (cpld_done),
- .cpld_din (cpld_din),
- .cpld_clk (cpld_clk),
- .cpld_detached (cpld_detached),
- .cpld_misc (cpld_misc),
- .cpld_init_b (cpld_init_b),
- .por (~POR),
- .config_success (config_success),
- .adc_a (adc_a_reg2),
- .adc_ovf_a (adc_ovf_a_reg2),
- .adc_on_a (adc_on_a),
- .adc_oe_a (adc_oe_a),
- .adc_b (adc_b_reg2),
- .adc_ovf_b (adc_ovf_b_reg2),
- .adc_on_b (adc_on_b),
- .adc_oe_b (adc_oe_b),
- .dac_a (dac_a_int),
- .dac_b (dac_b_int),
- .scl_pad_i (scl_pad_i),
- .scl_pad_o (scl_pad_o),
- .scl_pad_oen_o (scl_pad_oen_o),
- .sda_pad_i (sda_pad_i),
- .sda_pad_o (sda_pad_o),
- .sda_pad_oen_o (sda_pad_oen_o),
- .clk_en (clk_en[1:0]),
- .clk_sel (clk_sel[1:0]),
- .clk_func (clk_func),
- .clk_status (clk_status),
- .sclk (sclk_int),
- .mosi (mosi),
- .miso (miso),
- .sen_clk (sen_clk),
- .sen_dac (sen_dac),
- .sen_tx_db (sen_tx_db),
- .sen_tx_adc (sen_tx_adc),
- .sen_tx_dac (sen_tx_dac),
- .sen_rx_db (sen_rx_db),
- .sen_rx_adc (sen_rx_adc),
- .sen_rx_dac (sen_rx_dac),
- .io_tx (io_tx[15:0]),
- .io_rx (io_rx[15:0]),
- .RAM_D (RAM_D),
- .RAM_A (RAM_A),
- .RAM_CE1n (RAM_CE1n),
- .RAM_CENn (RAM_CENn),
- .RAM_CLK (RAM_CLK),
- .RAM_WEn (RAM_WEn),
- .RAM_OEn (RAM_OEn),
- .RAM_LDn (RAM_LDn),
- .uart_tx_o (uart_tx_o),
- .uart_rx_i (uart_rx_i),
- .uart_baud_o (),
- .sim_mode (1'b0),
- .clock_divider (2)
- );
+ u2_core(.dsp_clk (dsp_clk),
+ .wb_clk (wb_clk),
+ .clock_ready (clock_ready),
+ .clk_to_mac (clk125_int_buf),
+ .pps_in (pps_in),
+ .leds (leds_int),
+ .debug (debug[31:0]),
+ .debug_clk (debug_clk[1:0]),
+ .exp_pps_in (exp_pps_in),
+ .exp_pps_out (exp_pps_out),
+ .GMII_COL (GMII_COL),
+ .GMII_CRS (GMII_CRS),
+ .GMII_TXD (GMII_TXD_unreg[7:0]),
+ .GMII_TX_EN (GMII_TX_EN_unreg),
+ .GMII_TX_ER (GMII_TX_ER_unreg),
+ .GMII_GTX_CLK (GMII_GTX_CLK_int),
+ .GMII_TX_CLK (GMII_TX_CLK),
+ .GMII_RXD (GMII_RXD[7:0]),
+ .GMII_RX_CLK (GMII_RX_CLK),
+ .GMII_RX_DV (GMII_RX_DV),
+ .GMII_RX_ER (GMII_RX_ER),
+ .MDIO (MDIO),
+ .MDC (MDC),
+ .PHY_INTn (PHY_INTn),
+ .PHY_RESETn (PHY_RESETn),
+ .ser_enable (ser_enable),
+ .ser_prbsen (ser_prbsen),
+ .ser_loopen (ser_loopen),
+ .ser_rx_en (ser_rx_en),
+ .ser_tx_clk (ser_tx_clk_int),
+ .ser_t (ser_t_unreg[15:0]),
+ .ser_tklsb (ser_tklsb_unreg),
+ .ser_tkmsb (ser_tkmsb_unreg),
+ .ser_rx_clk (ser_rx_clk_buf),
+ .ser_r (ser_r_int[15:0]),
+ .ser_rklsb (ser_rklsb_int),
+ .ser_rkmsb (ser_rkmsb_int),
+ .cpld_start (cpld_start),
+ .cpld_mode (cpld_mode),
+ .cpld_done (cpld_done),
+ .cpld_din (cpld_din),
+ .cpld_clk (cpld_clk),
+ .cpld_detached (cpld_detached),
+ .cpld_misc (cpld_misc),
+ .cpld_init_b (cpld_init_b),
+ .por (~POR),
+ .config_success (config_success),
+ .adc_a (adc_a_reg2),
+ .adc_ovf_a (adc_ovf_a_reg2),
+ .adc_on_a (adc_on_a),
+ .adc_oe_a (adc_oe_a),
+ .adc_b (adc_b_reg2),
+ .adc_ovf_b (adc_ovf_b_reg2),
+ .adc_on_b (adc_on_b),
+ .adc_oe_b (adc_oe_b),
+ .dac_a (dac_a_int),
+ .dac_b (dac_b_int),
+ .scl_pad_i (scl_pad_i),
+ .scl_pad_o (scl_pad_o),
+ .scl_pad_oen_o (scl_pad_oen_o),
+ .sda_pad_i (sda_pad_i),
+ .sda_pad_o (sda_pad_o),
+ .sda_pad_oen_o (sda_pad_oen_o),
+ .clk_en (clk_en[1:0]),
+ .clk_sel (clk_sel[1:0]),
+ .clk_func (clk_func),
+ .clk_status (clk_status),
+ .sclk (sclk_int),
+ .mosi (mosi),
+ .miso (miso),
+ .sen_clk (sen_clk),
+ .sen_dac (sen_dac),
+ .sen_tx_db (sen_tx_db),
+ .sen_tx_adc (sen_tx_adc),
+ .sen_tx_dac (sen_tx_dac),
+ .sen_rx_db (sen_rx_db),
+ .sen_rx_adc (sen_rx_adc),
+ .sen_rx_dac (sen_rx_dac),
+ .io_tx (io_tx[15:0]),
+ .io_rx (io_rx[15:0]),
+ .RAM_D_pi (RAM_D_pi),
+ .RAM_D_po (RAM_D_po),
+ .RAM_D_poe (RAM_D_poe),
+ .RAM_A (RAM_A),
+ .RAM_CE1n (RAM_CE1n),
+ .RAM_CENn (RAM_CENn),
+ // .RAM_CLK (RAM_CLK),
+ .RAM_WEn (RAM_WEn),
+ .RAM_OEn (RAM_OEn),
+ .RAM_LDn (RAM_LDn),
+ .uart_tx_o (uart_tx_o),
+ .uart_rx_i (uart_rx_i),
+ .uart_baud_o (),
+ .sim_mode (1'b0),
+ .clock_divider (2)
+ );
endmodule // u2_rev2
diff --git a/fpga/usrp2/top/u2plus/.gitignore b/fpga/usrp2/top/u2plus/.gitignore
new file mode 100644
index 000000000..1b2211df0
--- /dev/null
+++ b/fpga/usrp2/top/u2plus/.gitignore
@@ -0,0 +1 @@
+build*
diff --git a/fpga/usrp2/top/u2plus/Makefile b/fpga/usrp2/top/u2plus/Makefile
new file mode 100644
index 000000000..c38bd3ec1
--- /dev/null
+++ b/fpga/usrp2/top/u2plus/Makefile
@@ -0,0 +1,99 @@
+#
+# Copyright 2008 Ettus Research LLC
+#
+
+##################################################
+# Project Setup
+##################################################
+TOP_MODULE = u2plus
+BUILD_DIR = $(abspath build$(ISE))
+
+##################################################
+# Include other makefiles
+##################################################
+
+include ../Makefile.common
+include ../../fifo/Makefile.srcs
+include ../../control_lib/Makefile.srcs
+include ../../sdr_lib/Makefile.srcs
+include ../../serdes/Makefile.srcs
+include ../../simple_gemac/Makefile.srcs
+include ../../timing/Makefile.srcs
+include ../../opencores/Makefile.srcs
+include ../../vrt/Makefile.srcs
+include ../../udp/Makefile.srcs
+include ../../coregen/Makefile.srcs
+include ../../extram/Makefile.srcs
+include ../../extramfifo/Makefile.srcs
+
+
+##################################################
+# Project Properties
+##################################################
+export PROJECT_PROPERTIES := \
+family "Spartan-3A DSP" \
+device xc3sd3400a \
+package fg676 \
+speed -5 \
+top_level_module_type "HDL" \
+synthesis_tool "XST (VHDL/Verilog)" \
+simulator "ISE Simulator (VHDL/Verilog)" \
+"Preferred Language" "Verilog" \
+"Enable Message Filtering" FALSE \
+"Display Incremental Messages" FALSE
+
+##################################################
+# Sources
+##################################################
+TOP_SRCS = \
+u2plus_core.v \
+u2plus.v \
+u2plus.ucf
+
+SOURCES = $(abspath $(TOP_SRCS)) $(FIFO_SRCS) \
+$(CONTROL_LIB_SRCS) $(SDR_LIB_SRCS) $(SERDES_SRCS) \
+$(SIMPLE_GEMAC_SRCS) $(TIMING_SRCS) $(OPENCORES_SRCS) \
+$(VRT_SRCS) $(UDP_SRCS) $(COREGEN_SRCS) $(EXTRAM_SRCS)
+
+##################################################
+# Process Properties
+##################################################
+SYNTHESIZE_PROPERTIES = \
+"Number of Clock Buffers" 8 \
+"Pack I/O Registers into IOBs" Yes \
+"Optimization Effort" High \
+"Optimize Instantiated Primitives" TRUE \
+"Register Balancing" Yes \
+"Use Clock Enable" Auto \
+"Use Synchronous Reset" Auto \
+"Use Synchronous Set" Auto
+
+TRANSLATE_PROPERTIES = \
+"Macro Search Path" "$(shell pwd)/../../coregen/"
+
+MAP_PROPERTIES = \
+"Allow Logic Optimization Across Hierarchy" TRUE \
+"Map to Input Functions" 4 \
+"Optimization Strategy (Cover Mode)" Speed \
+"Pack I/O Registers/Latches into IOBs" "For Inputs and Outputs" \
+"Perform Timing-Driven Packing and Placement" TRUE \
+"Map Effort Level" High \
+"Extra Effort" Normal \
+"Combinatorial Logic Optimization" TRUE \
+"Register Duplication" TRUE
+
+PLACE_ROUTE_PROPERTIES = \
+"Place & Route Effort Level (Overall)" High
+
+STATIC_TIMING_PROPERTIES = \
+"Number of Paths in Error/Verbose Report" 10 \
+"Report Type" "Error Report"
+
+GEN_PROG_FILE_PROPERTIES = \
+"Configuration Rate" 6 \
+"Create Binary Configuration File" TRUE \
+"Done (Output Events)" 5 \
+"Enable Bitstream Compression" TRUE \
+"Enable Outputs (Output Events)" 6
+
+SIM_MODEL_PROPERTIES = ""
diff --git a/fpga/usrp2/top/u2plus/bootloader.rmi b/fpga/usrp2/top/u2plus/bootloader.rmi
new file mode 100644
index 000000000..7c15699db
--- /dev/null
+++ b/fpga/usrp2/top/u2plus/bootloader.rmi
@@ -0,0 +1,245 @@
+defparam bootram.RAM0.INIT_00=256'h00000000_00000000_00000000_b80801c0_00000000_b808175c_00000000_b8080050;
+defparam bootram.RAM0.INIT_01=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_b8081764;
+defparam bootram.RAM0.INIT_02=256'h3020ffe0_b0000000_30401e70_31a01e98_00000000_00000000_00000000_00000000;
+defparam bootram.RAM0.INIT_03=256'h3021ffe4_e060f800_b0000000_b8000000_30a30000_b9f40668_80000000_b9f400cc;
+defparam bootram.RAM0.INIT_04=256'he8830000_e8601e78_80000000_99fc2000_f8601e78_b8000044_bc030014_f9e10000;
+defparam bootram.RAM0.INIT_05=256'h80000000_99fc1800_30a01e8c_bc030010_30600000_b0000000_30630004_be24ffec;
+defparam bootram.RAM0.INIT_06=256'h30600000_b0000000_3021001c_b60f0008_e9e10000_f060f800_b0000000_30600001;
+defparam bootram.RAM0.INIT_07=256'h80000000_99fc1800_bc03000c_30c0f804_b0000000_30a01e8c_f9e10000_3021ffe4;
+defparam bootram.RAM0.INIT_08=256'h80000000_99fc2000_bc04000c_30a01e90_bc030014_30800000_b0000000_e8601e90;
+defparam bootram.RAM0.INIT_09=256'h06463800_20e01e98_20c01e98_f9e10000_2021ffec_3021001c_b60f0008_e9e10000;
+defparam bootram.RAM0.INIT_0A=256'hb0000000_20c0f800_b0000000_bc92fff4_06463800_20c60004_f8060000_bc720014;
+defparam bootram.RAM0.INIT_0B=256'hb9f415f8_bc92fff4_06463800_20c60004_f8060000_bc720014_06463800_20e0f82c;
+defparam bootram.RAM0.INIT_0C=256'h32630000_20a00000_b9f401c8_20e00000_20c00000_80000000_b9f41778_80000000;
+defparam bootram.RAM0.INIT_0D=256'h20210014_b60f0008_30730000_c9e10000_80000000_b9f415c4_80000000_b9f41780;
+defparam bootram.RAM0.INIT_0E=256'he9e10000_f9610004_fa410010_95608001_fa21000c_f9610008_f9e10000_3021ffec;
+defparam bootram.RAM0.INIT_0F=256'hbc050018_30210014_b62e0000_ea410010_ea21000c_e9610008_940bc001_e9610004;
+defparam bootram.RAM0.INIT_10=256'h3021ff2c_80000000_b60f0008_bc32fff4_16432800_30630001_80000000_10600000;
+defparam bootram.RAM0.INIT_11=256'hb9f4062c_32c1001c_3261004c_f8610028_f9e10000_fac100d0_fa6100cc_3061002c;
+defparam bootram.RAM0.INIT_12=256'h22407fff_e8610024_bc230038_30a01984_10b30000_b9f40da4_10d60000_10b30000;
+defparam bootram.RAM0.INIT_13=256'h30a01984_bc120040_aa430001_30a0194c_e061001c_10a30000_be520034_16439003;
+defparam bootram.RAM0.INIT_14=256'he8e10020_e8c10028_b800ffa8_80000000_b9f406c0_b800ffb4_80000000_b9f406cc;
+defparam bootram.RAM0.INIT_15=256'h80000000_b9f40694_b800ff88_80000000_b9f406a0_30a0194c_80000000_b9f4155c;
+defparam bootram.RAM0.INIT_16=256'hb800ff60_80000000_b9f40678_30a01950_80000000_b9f411e8_30a08000_b0000000;
+defparam bootram.RAM0.INIT_17=256'hbe030020_30a00050_31000001_30e1001c_30c000f7_f9e10000_a46500ff_3021ffe0;
+defparam bootram.RAM0.INIT_18=256'hb810ffe8_30210020_b60f0008_e9e10000_80000000_b9f40330_f081001c_3080005e;
+defparam bootram.RAM0.INIT_19=256'h31000001_b9f40280_f9e10000_30e1001c_30c000f7_30a00050_3021ffe0_308000dc;
+defparam bootram.RAM0.INIT_1A=256'h3021ffdc_30210020_b60f0008_6463001f_3063ffff_a863005e_e9e10000_e061001c;
+defparam bootram.RAM0.INIT_1B=256'h30a0a120_b0000007_9403c001_ac640002_94808001_fac10020_fa61001c_f9e10000;
+defparam bootram.RAM0.INIT_1C=256'hb9f40ea8_80000000_b9f4082c_f800200c_80000000_b9f4fe74_f860200c_306000ff;
+defparam bootram.RAM0.INIT_1D=256'h80000000_b9f4ff6c_80000000_b9f4059c_30a01988_80000000_b9f409ec_80000000;
+defparam bootram.RAM0.INIT_1E=256'h30a00000_b0000030_bc160100_bc130134_a6632000_e8603334_12c30000_be23017c;
+defparam bootram.RAM0.INIT_1F=256'hb0000000_80000000_b9f40558_30a01b04_12c30000_be030068_80000000_b9f41180;
+defparam bootram.RAM0.INIT_20=256'hb9f41094_30a08000_b0000000_30c07c00_b9f40e70_30a00000_b0000030_30e08000;
+defparam bootram.RAM0.INIT_21=256'he9e10000_30600001_10a00000_b9f41244_80000000_b9f40524_30a01b30_80000000;
+defparam bootram.RAM0.INIT_22=256'hb000003f_80000000_b9f404f8_30a01b6c_30210024_b60f0008_eac10020_ea61001c;
+defparam bootram.RAM0.INIT_23=256'h80000000_b9f404d4_30a019f8_12630000_be230024_80000000_b9f410fc_30a00000;
+defparam bootram.RAM0.INIT_24=256'h30a00000_b000003f_30e08000_b0000000_10730000_b810ffb4_80000000_b9f4fd9c;
+defparam bootram.RAM0.INIT_25=256'hb9f40490_30a019bc_80000000_b9f41000_30a08000_b0000000_30c07c00_b9f40ddc;
+defparam bootram.RAM0.INIT_26=256'h80000000_b9f40474_30a01a50_30600001_b810ff70_10b60000_b9f411b0_80000000;
+defparam bootram.RAM0.INIT_27=256'h80000000_b9f40454_30a01ab4_bc230098_80000000_b9f41000_30a00000_b0000018;
+defparam bootram.RAM0.INIT_28=256'h80000000_b9f41048_30a00000_b000003f_80000000_b9f40444_30a0199c_b800fed8;
+defparam bootram.RAM0.INIT_29=256'hb9f4fda4_b800fe9c_80000000_b9f4fcec_80000000_b9f40424_30a019f8_bc230028;
+defparam bootram.RAM0.INIT_2A=256'h30c07c00_b9f40d24_30a00000_b000003f_30e08000_b0000000_b800fe84_10a00000;
+defparam bootram.RAM0.INIT_2B=256'hb9f410f8_80000000_b9f403d8_30a019bc_80000000_b9f40f48_30a08000_b0000000;
+defparam bootram.RAM0.INIT_2C=256'hb9f4fc60_30a00001_b9f4fd4c_80000000_b9f403c0_30a01a7c_b800fe50_10b30000;
+defparam bootram.RAM0.INIT_2D=256'hfa610020_3021ffd4_b800ff40_80000000_b9f410c8_30a00000_b0000018_30a07530;
+defparam bootram.RAM0.INIT_2E=256'hfac10024_30e00001_30c1001c_12e70000_f0c1001c_fae10028_10b30000_a66500ff;
+defparam bootram.RAM0.INIT_2F=256'h10b30000_10f60000_10d70000_10830000_be030030_12c80000_b9f40898_f9e10000;
+defparam bootram.RAM0.INIT_30=256'h10640000_a8830001_6463001f_3063ffff_80000000_b9f407d0_30800001_be76001c;
+defparam bootram.RAM0.INIT_31=256'hfac10024_3021ffcc_3021002c_b60f0008_eae10028_eac10024_ea610020_e9e10000;
+defparam bootram.RAM0.INIT_32=256'hf9e10000_12c80000_12e70000_13250000_13060000_fb210030_fb01002c_fae10028;
+defparam bootram.RAM0.INIT_33=256'h32d6ffff_e0770000_f301001c_30e00002_be76005c_30c1001c_10b90000_fa610020;
+defparam bootram.RAM0.INIT_34=256'hbe33ffcc_32f70001_b9f4089c_30a0000a_12630000_33180001_b9f407f8_f061001d;
+defparam bootram.RAM0.INIT_35=256'heb210030_eb01002c_eae10028_eac10024_ea610020_e9e10000_10730000_10b90000;
+defparam bootram.RAM0.INIT_36=256'h80000000_b9f4f998_f9e10000_3021ffe4_30600001_b810ffe0_30210034_b60f0008;
+defparam bootram.RAM0.INIT_37=256'h12660000_fb21002c_fb010028_fae10024_fa61001c_3021ffd0_80000000_b60f0008;
+defparam bootram.RAM0.INIT_38=256'haa43ffff_12c00000_b810001c_f9e10000_fac10020_13260000_12e70000_13050000;
+defparam bootram.RAM0.INIT_39=256'h10960000_90630060_10b80000_b9f405ec_32730001_bcb2002c_16572001_bc120030;
+defparam bootram.RAM0.INIT_3A=256'he9e10000_10640000_f0130000_14999800_32d60001_be32ffd4_aa43000a_f0730000;
+defparam bootram.RAM0.INIT_3B=256'h3021ffd0_30210030_b60f0008_eb21002c_eb010028_eae10024_eac10020_ea61001c;
+defparam bootram.RAM0.INIT_3C=256'h13260000_12e70000_13050000_12660000_fb21002c_fb010028_fae10024_fa61001c;
+defparam bootram.RAM0.INIT_3D=256'hb9f4051c_32730001_bcb2002c_16572001_12c00000_b8100014_f9e10000_fac10020;
+defparam bootram.RAM0.INIT_3E=256'h14999800_32d60001_be32ffdc_aa43000a_f0730000_10960000_90630060_10b80000;
+defparam bootram.RAM0.INIT_3F=256'heb21002c_eb010028_eae10024_eac10020_ea61001c_e9e10000_10640000_f0130000;
+defparam bootram.RAM1.INIT_00=256'h12e60000_12c50000_fae10024_fac10020_fa61001c_3021ffd8_30210030_b60f0008;
+defparam bootram.RAM1.INIT_01=256'hbe32ffec_aa43000a_f0730000_90630060_10b60000_b9f404b0_12660000_f9e10000;
+defparam bootram.RAM1.INIT_02=256'heae10024_eac10020_ea61001c_e9e10000_10770000_f0130000_3273ffff_32730001;
+defparam bootram.RAM1.INIT_03=256'he9e10000_10a00000_b9f4ff94_f9e10000_3021ffe4_10c50000_30210028_b60f0008;
+defparam bootram.RAM1.INIT_04=256'hb60f0008_e9e10000_80000000_b9f40448_f9e10000_3021ffe4_3021001c_b60f0008;
+defparam bootram.RAM1.INIT_05=256'h3021001c_b60f0008_e9e10000_10a00000_b9f4ffdc_f9e10000_3021ffe4_3021001c;
+defparam bootram.RAM1.INIT_06=256'hbe060024_90c30060_12660000_e0660000_f9e10000_fac10020_fa61001c_3021ffdc;
+defparam bootram.RAM1.INIT_07=256'h10b60000_be26fff0_90c30060_e0730000_32730001_b9f40324_10b60000_12c50000;
+defparam bootram.RAM1.INIT_08=256'hfac1001c_3021ffe0_30210024_b60f0008_10600000_eac10020_ea61001c_e9e10000;
+defparam bootram.RAM1.INIT_09=256'heac1001c_e9e10000_30c0000a_b9f402dc_10b60000_12c50000_b9f4ff9c_f9e10000;
+defparam bootram.RAM1.INIT_0A=256'h10a00000_b9f4ffc0_f9e10000_3021ffe4_10c50000_30210020_b60f0008_10600000;
+defparam bootram.RAM1.INIT_0B=256'h10a00000_b9f4ff48_f9e10000_3021ffe4_10c50000_3021001c_b60f0008_e9e10000;
+defparam bootram.RAM1.INIT_0C=256'he9e10000_30c0000a_b9f40278_f9e10000_3021ffe4_3021001c_b60f0008_e9e10000;
+defparam bootram.RAM1.INIT_0D=256'hb9f40250_f9e10000_10a00000_12c50000_fac1001c_3021ffe0_3021001c_b60f0008;
+defparam bootram.RAM1.INIT_0E=256'hfac1001c_3021ffe0_30210020_b60f0008_eac1001c_e9e10000_10760000_10d60000;
+defparam bootram.RAM1.INIT_0F=256'h30210020_b60f0008_eac1001c_e9e10000_10760000_12c60000_b9f40228_f9e10000;
+defparam bootram.RAM1.INIT_10=256'h94e08001_3021001c_b60f0008_e9e10000_80000000_b9f401b8_f9e10000_3021ffe4;
+defparam bootram.RAM1.INIT_11=256'h80633000_84632000_84c62800_a866ffff_e880f81c_b0000000_9404c001_ac870002;
+defparam bootram.RAM1.INIT_12=256'h9404c001_80843800_ac840002_94808001_a4e70002_f860f81c_b0000000_f860200c;
+defparam bootram.RAM1.INIT_13=256'h88a52000_e880f81c_b0000000_9406c001_acc30002_94608001_80000000_b60f0008;
+defparam bootram.RAM1.INIT_14=256'h9404c001_80841800_ac840002_94808001_a4630002_f8a0f81c_b0000000_f8a0200c;
+defparam bootram.RAM1.INIT_15=256'ha866ffff_e880f820_b0000000_9404c001_ac870002_94e08001_80000000_b60f0008;
+defparam bootram.RAM1.INIT_16=256'h94808001_a4e70002_f860f820_b0000000_f8602020_80633000_84632000_84c62800;
+defparam bootram.RAM1.INIT_17=256'hfae10024_fa61001c_3021ffd4_80000000_b60f0008_9404c001_80843800_ac840002;
+defparam bootram.RAM1.INIT_18=256'hbe060040_90c30060_13050000_12e60000_e0660000_fac10020_f9e10000_fb010028;
+defparam bootram.RAM1.INIT_19=256'h10730000_be120028_16569800_32c70001_b8100014_32600001_be670038_12660000;
+defparam bootram.RAM1.INIT_1A=256'h10730000_3273ffff_32730001_be26ffe4_90c30060_c0779800_10b80000_b9f400cc;
+defparam bootram.RAM1.INIT_1B=256'h3021ffe4_3021002c_b60f0008_eb010028_eae10024_eac10020_ea61001c_e9e10000;
+defparam bootram.RAM1.INIT_1C=256'hf0c51e7c_3021001c_b60f0008_e9e10000_30c0000a_b9f40084_f9e10000_10a00000;
+defparam bootram.RAM1.INIT_1D=256'h80000000_b60f0008_f8653700_64a50405_e4661bac_10c63000_80000000_b60f0008;
+defparam bootram.RAM1.INIT_1E=256'h90c60060_b9f4ffc4_10b30000_e0d31e7c_12600000_f9e10000_fa61001c_3021ffe0;
+defparam bootram.RAM1.INIT_1F=256'he9e10000_bc32ffd8_aa530003_90c60060_b9f4ffbc_32730001_10b30000_e0d31ba8;
+defparam bootram.RAM1.INIT_20=256'h12c60000_f9e10000_fac10020_fa61001c_3021ffdc_30210020_b60f0008_ea61001c;
+defparam bootram.RAM1.INIT_21=256'hfac5000c_bc03fffc_e8650004_30a33700_64730405_12650000_be120030_aa46000a;
+defparam bootram.RAM1.INIT_22=256'hbc32ffd0_aa430001_e0651e7c_30210024_b60f0008_eac10020_ea61001c_e9e10000;
+defparam bootram.RAM1.INIT_23=256'hf9e10000_fac10020_fa61001c_3021ffdc_64730405_b810ffc8_30c0000d_b9f4ffac;
+defparam bootram.RAM1.INIT_24=256'hbc040008_e8830004_30633700_64730405_12650000_be120030_aa46000a_12c60000;
+defparam bootram.RAM1.INIT_25=256'haa430001_e0651e7c_30210024_b60f0008_eac10020_ea61001c_e9e10000_fac3000c;
+defparam bootram.RAM1.INIT_26=256'h30a53700_64a50405_64730405_b810ffc4_80000000_b9f4ff44_30c0000d_be32ffd0;
+defparam bootram.RAM1.INIT_27=256'he8650008_30a53700_64a50405_80000000_b60f0008_e8650010_bc03fffc_e8650008;
+defparam bootram.RAM1.INIT_28=256'h64a50405_80000000_b60f0008_90630060_be24fff8_e8850008_e8650010_bc030014;
+defparam bootram.RAM1.INIT_29=256'h32600001_be230040_e8760008_32c53700_fa61001c_f9e10000_fac10020_3021ffdc;
+defparam bootram.RAM1.INIT_2A=256'hbe03ffe8_e8760008_30a00001_b9f401e0_3060ffff_be120034_aa53012d_b8000010;
+defparam bootram.RAM1.INIT_2B=256'he9e10000_e8760010_3060ffff_be52000c_16539001_3240012b_3273ffff_32730001;
+defparam bootram.RAM1.INIT_2C=256'h32400004_a463000f_e8603324_f8003108_30210024_b60f0008_eac10020_ea61001c;
+defparam bootram.RAM1.INIT_2D=256'ha46300ff_64a30008_e4641bb8_10831800_30600004_10831800_beb20010_16439001;
+defparam bootram.RAM1.INIT_2E=256'ha4a500ff_be070088_80000000_b60f0008_f8603108_30600080_f8a03104_f8603100;
+defparam bootram.RAM1.INIT_2F=256'hf8803110_30800090_f860310c_a0630001_10652800_be23fff8_a4630040_e8603110;
+defparam bootram.RAM1.INIT_30=256'haa470001_10800000_be230058_a4630080_e8603110_bc23fff8_a4630002_e8603110;
+defparam bootram.RAM1.INIT_31=256'h30e7ffff_e860310c_bc23fff8_a4630002_e8603110_f8603110_30600020_be120038;
+defparam bootram.RAM1.INIT_32=256'h30600068_b810ffd0_30600020_be32ffd8_aa470001_30c60001_be07001c_f0660000;
+defparam bootram.RAM1.INIT_33=256'ha4a500ff_10640000_b60f0008_f8603110_30600040_10640000_b60f0008_30800001;
+defparam bootram.RAM1.INIT_34=256'h306000d0_30600090_be27000c_f860310c_10652800_be23fff8_a4630040_e8603110;
+defparam bootram.RAM1.INIT_35=256'h10800000_be23005c_a4630080_e8603110_bc23fff8_a4630002_e8603110_f8603110;
+defparam bootram.RAM1.INIT_36=256'hf8803110_bc120030_aa470001_f860310c_30800010_e0660000_30800001_be070068;
+defparam bootram.RAM1.INIT_37=256'hbe070028_30e7ffff_be23001c_a4630080_e8603110_bc23fff8_a4630002_e8603110;
+defparam bootram.RAM1.INIT_38=256'hb60f0008_f8603110_30600040_10800000_30800050_b810ffd4_b800ffc4_30c60001;
+defparam bootram.RAM1.INIT_39=256'hbc260054_a4c30000_b0008000_e8603324_10640000_b60f0008_30800001_10640000;
+defparam bootram.RAM1.INIT_3A=256'h80000000_10800000_bc660030_e8c01e80_10660000_be650048_bc430054_e8601e80;
+defparam bootram.RAM1.INIT_3B=256'h16443000_30840001_80000000_80000000_80000000_80000000_80000000_80000000;
+defparam bootram.RAM1.INIT_3C=256'ha4630007_e8603324_80000000_b60f0008_bc32ffc8_16432800_30630001_bc32ffdc;
+defparam bootram.RAM1.INIT_3D=256'h16459001_3240005a_3065ffa9_90a50060_b800ff9c_f8801e80_e4831bc4_10631800;
+defparam bootram.RAM1.INIT_3E=256'h3085ffd0_be52000c_16459001_32400039_a46300ff_3065ffc9_a46300ff_be520024;
+defparam bootram.RAM1.INIT_3F=256'hf9e10000_fb610034_13250000_fb21002c_3021ffc8_80000000_b60f0008_a46400ff;
+defparam bootram.RAM2.INIT_00=256'haa43003a_13660000_e0790000_fb410030_fb010028_fae10024_fac10020_fa61001c;
+defparam bootram.RAM2.INIT_01=256'heb010028_eae10024_eac10020_ea61001c_e9e10000_10650000_30a0ffff_be120034;
+defparam bootram.RAM2.INIT_02=256'hc085c800_30a00001_e8c01e84_30210038_b60f0008_eb610034_eb410030_eb21002c;
+defparam bootram.RAM2.INIT_03=256'hb810ffac_bc23ffe4_a4630044_c0662000_a4a300ff_be04001c_90840060_30650001;
+defparam bootram.RAM2.INIT_04=256'h12761800_66c30404_b9f4ff1c_e0b90002_80000000_b9f4ff28_e0b90001_30a0fffe;
+defparam bootram.RAM2.INIT_05=256'he0b90005_30a0fffd_be38ff74_93040060_e083000b_10791800_fa7b0004_10739800;
+defparam bootram.RAM2.INIT_06=256'h66c3040c_b9f4fed8_e0b90004_66e30404_b9f4fee4_e0b90003_13530000_b9f4fef0;
+defparam bootram.RAM2.INIT_07=256'he0b90007_fafb0008_12f7b000_12d61800_12d61800_b9f4fec8_64630408_e0b90006;
+defparam bootram.RAM2.INIT_08=256'hbe130060_f07b0000_1063b000_66c30404_b9f4fea4_e0b90008_80000000_b9f4feb0;
+defparam bootram.RAM2.INIT_09=256'hb9f4fe74_c0b6c800_a6d600ff_32d60009_12d8c000_ea7b000c_13580000_10f30000;
+defparam bootram.RAM2.INIT_0A=256'he8fb0004_ea7b000c_d0789800_1063b800_66e30404_b9f4fe68_e0b60001_12d9b000;
+defparam bootram.RAM2.INIT_0B=256'headb0008_a74300ff_be52ffb8_1647c003_107a1800_a70400ff_c073c000_30980001;
+defparam bootram.RAM2.INIT_0C=256'h107a1800_12c7b000_10632000_e0b70009_12f9b800_64760008_12e73800_e09b0000;
+defparam bootram.RAM2.INIT_0D=256'ha6d600ff_1063c000_16d60000_67030404_b9f4fe04_e0b7000a_12d61800_b9f4fe10;
+defparam bootram.RAM2.INIT_0E=256'ha4630100_e8603b10_10a00000_b810fe58_30a0fffb_be32fe60_1643b000_a46300ff;
+defparam bootram.RAM2.INIT_0F=256'ha4a500ff_80884800_a1292000_a508007f_a5290600_80000000_b60f0008_bc23fff8;
+defparam bootram.RAM2.INIT_10=256'ha0840100_f8603b18_a46600ff_f8803b10_f8e03b00_bc23fff8_a4630100_e8603b10;
+defparam bootram.RAM2.INIT_11=256'hb60f0008_e8603b00_bc23fff8_a4630100_e8603b10_10650000_be050018_f8803b10;
+defparam bootram.RAM2.INIT_12=256'h31200400_31000008_10a00000_f9e10000_3021ffe4_10e60000_10c00000_80000000;
+defparam bootram.RAM2.INIT_13=256'h3021ffc4_3021001c_b60f0008_e9e10000_80000000_b9f4ff84_f8603b14_30600001;
+defparam bootram.RAM2.INIT_14=256'hb9f4ff3c_fae10034_13060000_f9e10000_fb010038_fa61002c_12c50000_fac10030;
+defparam bootram.RAM2.INIT_15=256'hfac03b00_f8603b04_3060000b_66d60408_f8603b10_f8003b18_30600400_12670000;
+defparam bootram.RAM2.INIT_16=256'h80000000_b9f4ff00_f8603b10_30600528_f8803b10_30800428_f8603b18_30600001;
+defparam bootram.RAM2.INIT_17=256'hf8803b10_30800500_f8603b10_30600400_3261001c_12e00000_12d30000_be18009c;
+defparam bootram.RAM2.INIT_18=256'he8803b04_f8610020_e8603b08_f881001c_14b7c000_e8803b0c_80000000_b9f4fed8;
+defparam bootram.RAM2.INIT_19=256'h30a00010_10800000_beb20034_16459003_22400010_f8610028_e8603b00_f8810024;
+defparam bootram.RAM2.INIT_1A=256'hbeb20020_1658b803_12f72800_bc32fff0_16442800_30840001_d0762000_c0732000;
+defparam bootram.RAM2.INIT_1B=256'hf8003b18_12d62800_be52ff7c_1658b803_12f72800_bc25ffd8_b800ff8c_12d62800;
+defparam bootram.RAM2.INIT_1C=256'hb0009f00_3021003c_b60f0008_eb010038_eae10034_eac10030_ea61002c_e9e10000;
+defparam bootram.RAM2.INIT_1D=256'h31200400_b9f4fe34_f9e10000_31000020_30c00001_30a00001_3021ffe4_30e00000;
+defparam bootram.RAM2.INIT_1E=256'h3021ffe4_e860f828_b0000000_3021001c_b60f0008_a463ffff_b00000ff_e9e10000;
+defparam bootram.RAM2.INIT_1F=256'h64830008_80000000_b9f4ffa8_3021001c_b60f0008_e9e10000_bc030010_f9e10000;
+defparam bootram.RAM2.INIT_20=256'h16439001_32400015_80000000_b9f40330_a46300ff_be120010_aa440020_a48400ff;
+defparam bootram.RAM2.INIT_21=256'hb0000000_b800ffb0_f860f828_b0000000_bc52ffe4_16439001_32400018_bcb2fff0;
+defparam bootram.RAM2.INIT_22=256'hb9f4ff40_3021001c_b60f0008_e9e10000_bc030010_f9e10000_3021ffe4_e860f824;
+defparam bootram.RAM2.INIT_23=256'h80000000_b9f402c8_a4a300ff_be120010_aa440020_a48400ff_64830008_80000000;
+defparam bootram.RAM2.INIT_24=256'hb0000000_e0651bbe_bc52ffe4_16459001_32400018_bcb2fff0_16459001_32400015;
+defparam bootram.RAM2.INIT_25=256'h10c50000_12c00000_fac1001c_3021ffe0_b800ffa4_f860f824_b0000000_f8a0f828;
+defparam bootram.RAM2.INIT_26=256'heac1001c_e9e10000_80000000_99fcb000_30e00024_b9f40334_f9e10000_10b60000;
+defparam bootram.RAM2.INIT_27=256'hb810001c_30e1001c_b9f4fd88_f9e10000_30c00040_3021ffa4_30210020_b60f0008;
+defparam bootram.RAM2.INIT_28=256'he063001c_10612800_10600000_be520044_16459001_3240003e_30a50001_10a00000;
+defparam bootram.RAM2.INIT_29=256'haa440099_e083001c_10612800_30a50001_bc32ffd8_aa4300aa_bc12ffe0_aa4300ff;
+defparam bootram.RAM2.INIT_2A=256'h3021005c_b60f0008_e9e10000_3021005c_b60f0008_e9e10000_30600001_be32ffc8;
+defparam bootram.RAM2.INIT_2B=256'h10b60000_30c00006_b9f4fd08_f9e10000_10f60000_32c1001c_fac10028_3021ffd4;
+defparam bootram.RAM2.INIT_2C=256'heac10028_e9e10000_a884ffff_80841800_14830000_30e00006_b9f401f8_30c01bd8;
+defparam bootram.RAM2.INIT_2D=256'h65040403_64e40003_64a40007_64c40005_e0803a03_3021002c_b60f0008_6464001f;
+defparam bootram.RAM2.INIT_2E=256'ha4a50008_80e73000_90a40041_a4e70004_80c62800_a4c60002_64640407_65240405;
+defparam bootram.RAM2.INIT_2F=256'h81294000_a5290040_81082000_a5080020_80842800_a4840010_80a53800_10842000;
+defparam bootram.RAM2.INIT_30=256'h64e50403_64c50003_64650007_64850005_a4a500ff_a46300ff_b60f0008_80634800;
+defparam bootram.RAM2.INIT_31=256'ha4630008_80c62000_90650041_a4c60004_80841800_a4840002_65250407_65050405;
+defparam bootram.RAM2.INIT_32=256'h81083800_a5080040_80e72800_a4e70020_80a51800_a4a50010_80633000_10a52800;
+defparam bootram.RAM2.INIT_33=256'hb00000ff_fac1001c_3021ffe0_80000000_b60f0008_f9203a00_a52900ff_81294000;
+defparam bootram.RAM2.INIT_34=256'h30a0ffaa_b9f4ff74_30a0ffff_b9f4ff7c_30a0ffff_b9f4ff84_f9e10000_a6c5ffff;
+defparam bootram.RAM2.INIT_35=256'h30a00061_b9f4ff54_30a00032_b9f4ff5c_a2d60000_b0000b00_30a0ff99_b9f4ff6c;
+defparam bootram.RAM2.INIT_36=256'h30a0ff81_b9f4ff34_30a00032_b9f4ff3c_10b60000_b9f4ff44_64b60008_b9f4ff4c;
+defparam bootram.RAM2.INIT_37=256'h30a0ffa1_b9f4ff14_30a00030_b9f4ff1c_64b60010_b9f4ff24_30a0000b_b9f4ff2c;
+defparam bootram.RAM2.INIT_38=256'h10a00000_b9f4fef4_30a00020_b9f4fefc_30a0000e_b9f4ff04_10a00000_b9f4ff0c;
+defparam bootram.RAM2.INIT_39=256'h30210020_b60f0008_eac1001c_e9e10000_10a00000_b9f4fee4_30a00020_b9f4feec;
+defparam bootram.RAM2.INIT_3A=256'hb6110000_30a0ffff_b9f4e91c_80000000_b9f4f220_f9e10000_3021ffe4_30a01be0;
+defparam bootram.RAM2.INIT_3B=256'h22400003_80000000_b60f0008_80000000_b60f0008_80000000_b6910000_80000000;
+defparam bootram.RAM2.INIT_3C=256'h16432000_e8660000_e8850000_bc230050_a4630003_80653000_beb2005c_16479003;
+defparam bootram.RAM2.INIT_3D=256'h30e7ffff_30c60004_be52ffe0_16479003_22400003_30a50004_30e7fffc_bc320040;
+defparam bootram.RAM2.INIT_3E=256'h30c60001_30a50001_be320020_16434000_e0660000_e1050000_bc120028_aa47ffff;
+defparam bootram.RAM2.INIT_3F=256'h2240000f_14634000_b60f0008_10600000_b60f0008_bc32ffe0_aa47ffff_30e7ffff;
+defparam bootram.RAM3.INIT_00=256'hbc070024_11050000_be030034_a4630003_80662800_10850000_beb20018_16479003;
+defparam bootram.RAM3.INIT_01=256'h30c60001_be32fff0_16474000_31080001_f0680000_e0660000_10e72000_11040000;
+defparam bootram.RAM3.INIT_02=256'he8860008_f8680004_e8660004_f8880000_30e7fff0_e8860000_10650000_b60f0008;
+defparam bootram.RAM3.INIT_03=256'h31080010_be52ffd0_16479003_2240000f_f868000c_30c60010_e866000c_f8880008;
+defparam bootram.RAM3.INIT_04=256'h22400003_d8682000_30e7fffc_c8662000_10800000_bcb2002c_16479003_22400003;
+defparam bootram.RAM3.INIT_05=256'he860193c_10880000_b810ff68_11044000_10c43000_30840004_be52ffec_16479003;
+defparam bootram.RAM3.INIT_06=256'h3273fffc_99fc1800_bc120018_aa43ffff_3260193c_f9e10000_fa61001c_3021ffe0;
+defparam bootram.RAM3.INIT_07=256'h3021fff8_30210020_b60f0008_ea61001c_e9e10000_bc32fff0_aa43ffff_e8730000;
+defparam bootram.RAM3.INIT_08=256'h30210008_b60f0008_c9e00800_80000000_b9f4ffb0_80000000_b9f4e7d4_d9e00800;
+defparam bootram.RAM3.INIT_09=256'hffffffff_30210008_b60f0008_c9e00800_80000000_b9f4e74c_d9e00800_3021fff8;
+defparam bootram.RAM3.INIT_0A=256'h696d6167_61696e20_523a206d_4552524f_4f4b0000_00000000_ffffffff_00000000;
+defparam bootram.RAM3.INIT_0B=256'h64206d6f_206c6f61_49484558_20696e20_4261636b_65642120_7475726e_65207265;
+defparam bootram.RAM3.INIT_0C=256'h53746172_720a0000_6f616465_6f6f746c_322b2062_55535250_4e4f4b00_64652e00;
+defparam bootram.RAM3.INIT_0D=256'h4552524f_2e000000_6d6f6465_61666520_696e2073_50322b20_20555352_74696e67;
+defparam bootram.RAM3.INIT_0E=256'h20546869_72616d21_70726f67_61696e20_6f6d206d_6e206672_65747572_523a2072;
+defparam bootram.RAM3.INIT_0F=256'h523a206e_4552524f_6e210000_61707065_65722068_206e6576_6f756c64_73207368;
+defparam bootram.RAM3.INIT_10=256'h626c652e_61696c61_65206176_696d6167_61726520_69726d77_66652066_6f207361;
+defparam bootram.RAM3.INIT_11=256'h6c6f6164_20746f20_66726565_65656c20_6b2e2046_62726963_6d206120_20492061;
+defparam bootram.RAM3.INIT_12=256'h2076616c_20666f72_6b696e67_43686563_2e000000_2052414d_5820746f_20494845;
+defparam bootram.RAM3.INIT_13=256'h56616c69_2e2e2e00_6d616765_47412069_6e204650_6374696f_726f6475_69642070;
+defparam bootram.RAM3.INIT_14=256'h642e2041_666f756e_61676520_4120696d_20465047_74696f6e_6f647563_64207072;
+defparam bootram.RAM3.INIT_15=256'h2070726f_616c6964_4e6f2076_742e0000_20626f6f_6720746f_7074696e_7474656d;
+defparam bootram.RAM3.INIT_16=256'h74656d70_2e0a4174_6f756e64_67652066_20696d61_46504741_696f6e20_64756374;
+defparam bootram.RAM3.INIT_17=256'h77617265_6669726d_696f6e20_64756374_2070726f_6c6f6164_20746f20_74696e67;
+defparam bootram.RAM3.INIT_18=256'h6520666f_6d776172_20666972_74696f6e_6f647563_64207072_56616c69_2e2e2e00;
+defparam bootram.RAM3.INIT_19=256'h6e206672_65747572_523a2052_4552524f_2e2e2e00_64696e67_204c6f61_756e642e;
+defparam bootram.RAM3.INIT_1A=256'h206e6576_6f756c64_73207368_20546869_72616d21_70726f67_61696e20_6f6d206d;
+defparam bootram.RAM3.INIT_1B=256'h696f6e20_64756374_2070726f_616c6964_4e6f2076_6e210000_61707065_65722068;
+defparam bootram.RAM3.INIT_1C=256'h6669726d_61666520_6e672073_54727969_6e642e20_20666f75_77617265_6669726d;
+defparam bootram.RAM3.INIT_1D=256'h0018000f_ffff0031_01b200d9_05160364_14580a2c_05050400_2e2e2e00_77617265;
+defparam bootram.RAM3.INIT_1E=256'hb8080000_b0000000_10101200_06820594_09c407d0_13880d05_00002710_000b0000;
+defparam bootram.RAM3.INIT_1F=256'h20202020_28282820_20202828_20202020_00202020_00000000_6f72740a_0a0a6162;
+defparam bootram.RAM3.INIT_20=256'h10040404_10101010_10101010_10101010_20881010_20202020_20202020_20202020;
+defparam bootram.RAM3.INIT_21=256'h01010101_01010101_01010101_41414141_10104141_10101010_04040410_04040404;
+defparam bootram.RAM3.INIT_22=256'h02020202_02020202_02020202_42424242_10104242_10101010_01010101_01010101;
+defparam bootram.RAM3.INIT_23=256'h00000000_00000000_00000000_00000000_20000000_10101010_02020202_02020202;
+defparam bootram.RAM3.INIT_24=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
+defparam bootram.RAM3.INIT_25=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
+defparam bootram.RAM3.INIT_26=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
+defparam bootram.RAM3.INIT_27=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
+defparam bootram.RAM3.INIT_28=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
+defparam bootram.RAM3.INIT_29=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
+defparam bootram.RAM3.INIT_2A=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
+defparam bootram.RAM3.INIT_2B=256'h28282020_20282828_20202020_20202020_00000000_00000000_00000000_00000000;
+defparam bootram.RAM3.INIT_2C=256'h10101010_10101010_10101010_88101010_20202020_20202020_20202020_20202020;
+defparam bootram.RAM3.INIT_2D=256'h01010101_01010101_41414101_10414141_10101010_04041010_04040404_04040404;
+defparam bootram.RAM3.INIT_2E=256'h02020202_02020202_42424202_10424242_10101010_01010110_01010101_01010101;
+defparam bootram.RAM3.INIT_2F=256'h00000000_00000000_00000000_00000000_10101020_02020210_02020202_02020202;
+defparam bootram.RAM3.INIT_30=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
+defparam bootram.RAM3.INIT_31=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
+defparam bootram.RAM3.INIT_32=256'h00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000;
+defparam bootram.RAM3.INIT_33=256'h01010100_00001948_00000000_00000000_00000000_00000000_00000000_00000000;
+defparam bootram.RAM3.INIT_34=256'h00000000_00000000_00000000_00000000_00000000_00000000_00001d70_ffffffff;
diff --git a/fpga/usrp2/top/u2plus/capture_ddrlvds.v b/fpga/usrp2/top/u2plus/capture_ddrlvds.v
new file mode 100644
index 000000000..b9f53ff8c
--- /dev/null
+++ b/fpga/usrp2/top/u2plus/capture_ddrlvds.v
@@ -0,0 +1,39 @@
+
+
+module capture_ddrlvds
+ #(parameter WIDTH=7)
+ (input clk,
+ input ssclk_p,
+ input ssclk_n,
+ input [WIDTH-1:0] in_p,
+ input [WIDTH-1:0] in_n,
+ output reg [(2*WIDTH)-1:0] out);
+
+ wire [WIDTH-1:0] ddr_dat;
+ wire ssclk_regional;
+ wire ssclk_io;
+ wire ssclk;
+ wire [(2*WIDTH)-1:0] out_pre1;
+ reg [(2*WIDTH)-1:0] out_pre2;
+
+ IBUFGDS #(.IOSTANDARD("LVDS_25"),.DIFF_TERM("TRUE")) clkbuf (.O(ssclk), .I(ssclk_p), .IB(ssclk_n));
+
+ genvar i;
+ generate
+ for(i = 0; i < WIDTH; i = i + 1)
+ begin : gen_lvds_pins
+ IBUFDS #(.IOSTANDARD("LVDS_25"),.DIFF_TERM("TRUE")) ibufds
+ (.O(ddr_dat[i]), .I(in_p[i]), .IB(in_n[i]) );
+ IDDR2 #(.DDR_ALIGNMENT("C1")) iddr2
+ (.Q0(out_pre1[2*i]), .Q1(out_pre1[(2*i)+1]), .C0(ssclk), .C1(~ssclk),
+ .CE(1'b1), .D(ddr_dat[i]), .R(1'b0), .S(1'b0));
+ end
+ endgenerate
+
+ always @(negedge clk)
+ out_pre2 <= out_pre1;
+
+ always @(posedge clk)
+ out <= out_pre2;
+
+endmodule // capture_ddrlvds
diff --git a/fpga/usrp2/top/u2plus/u2plus.ucf b/fpga/usrp2/top/u2plus/u2plus.ucf
index 091eb2005..25267a67e 100755
--- a/fpga/usrp2/top/u2plus/u2plus.ucf
+++ b/fpga/usrp2/top/u2plus/u2plus.ucf
@@ -1,157 +1,137 @@
-NET "DAC_LOCK" LOC = "P4" ;
+## Main 100 MHz Clock
+NET "CLK_FPGA_P" LOC = "AA13" ;
+NET "CLK_FPGA_N" LOC = "Y13" ;
+
+## ADC
NET "ADC_clkout_p" LOC = "P1" ;
NET "ADC_clkout_n" LOC = "P2" ;
-NET "io_rx<15>" LOC = "AD1" ;
-NET "io_rx<14>" LOC = "AD2" ;
-NET "io_rx<13>" LOC = "AC2" ;
-NET "io_rx<12>" LOC = "AC3" ;
-NET "io_rx<11>" LOC = "W7" ;
-NET "io_rx<10>" LOC = "W6" ;
-NET "io_rx<09>" LOC = "U9" ;
-NET "io_rx<08>" LOC = "V8" ;
-NET "io_rx<07>" LOC = "AB1" ;
-NET "io_rx<06>" LOC = "AC1" ;
-NET "io_rx<05>" LOC = "V7" ;
-NET "io_rx<04>" LOC = "V6" ;
-NET "io_rx<03>" LOC = "Y5" ;
-NET "ADCB_2_3_p" LOC = "U7" ;
-NET "ADCB_2_3_n" LOC = "U8" ;
-NET "ADCB_0_1_p" LOC = "AA2" ;
-NET "ADCB_0_1_n" LOC = "AA3" ;
-NET "ADCA_12_13_p" LOC = "Y1" ;
-NET "ADCA_12_13_n" LOC = "Y2" ;
-NET "ADCA_10_11_p" LOC = "W3" ;
-NET "ADCA_10_11_n" LOC = "W4" ;
-NET "ADCA_8_9_p" LOC = "T7" ;
-NET "ADCA_8_9_n" LOC = "U6" ;
-NET "ADCA_6_7_p" LOC = "U5" ;
-NET "ADCA_6_7_n" LOC = "V5" ;
-NET "ADCA_4_5_p" LOC = "T10" ;
-NET "ADCA_4_5_n" LOC = "T9" ;
-NET "ADCA_2_3_p" LOC = "V1" ;
-NET "ADCA_2_3_n" LOC = "V2" ;
-NET "ADCA_0_1_p" LOC = "R8" ;
-NET "ADCA_0_1_n" LOC = "R7" ;
-NET "TX00_A" LOC = "P8" ;
-NET "TX01_A" LOC = "P9" ;
-NET "TX02_A" LOC = "R5" ;
-NET "TX03_A" LOC = "R6" ;
-NET "TX04_A" LOC = "P7" ;
-NET "TX05_A" LOC = "P6" ;
-NET "TX06_A" LOC = "T3" ;
-NET "TX07_A" LOC = "T4" ;
-NET "TX08_A" LOC = "R3" ;
-NET "TX09_A" LOC = "R4" ;
-NET "TX10_A" LOC = "R2" ;
-NET "TX11_A" LOC = "N1" ;
-NET "TX12_A" LOC = "N2" ;
-NET "TX13_A" LOC = "N5" ;
-NET "TX14_A" LOC = "N4" ;
-NET "TX15_A" LOC = "M2" ;
-NET "TX00_B" LOC = "M5" ;
-NET "TX01_B" LOC = "M6" ;
-NET "TX02_B" LOC = "M4" ;
-NET "TX03_B" LOC = "M3" ;
-NET "TX04_B" LOC = "M8" ;
-NET "TX05_B" LOC = "M7" ;
-NET "TX06_B" LOC = "L4" ;
-NET "TX07_B" LOC = "L3" ;
-NET "TX08_B" LOC = "K3" ;
-NET "TX09_B" LOC = "K2" ;
-NET "TX10_B" LOC = "K5" ;
-NET "TX11_B" LOC = "K4" ;
-NET "TX12_B" LOC = "M10" ;
-NET "TX13_B" LOC = "M9" ;
-NET "TX14_B" LOC = "J5" ;
-NET "TX15_B" LOC = "J4" ;
+NET "ADCA_12_p" LOC = "Y1" ;
+NET "ADCA_12_n" LOC = "Y2" ;
+NET "ADCA_10_p" LOC = "W3" ;
+NET "ADCA_10_n" LOC = "W4" ;
+NET "ADCA_8_p" LOC = "T7" ;
+NET "ADCA_8_n" LOC = "U6" ;
+NET "ADCA_6_p" LOC = "U5" ;
+NET "ADCA_6_n" LOC = "V5" ;
+NET "ADCA_4_p" LOC = "T10" ;
+NET "ADCA_4_n" LOC = "T9" ;
+NET "ADCA_2_p" LOC = "V1" ;
+NET "ADCA_2_n" LOC = "V2" ;
+NET "ADCA_0_p" LOC = "R8" ;
+NET "ADCA_0_n" LOC = "R7" ;
+NET "ADCB_2_p" LOC = "U7" ;
+NET "ADCB_2_n" LOC = "U8" ;
+NET "ADCB_0_p" LOC = "AA2" ;
+NET "ADCB_0_n" LOC = "AA3" ;
+NET "ADCB_4_p" LOC = "AE1" ;
+NET "ADCB_4_n" LOC = "AE2" ;
+NET "ADCB_6_p" LOC = "W1" ;
+NET "ADCB_6_n" LOC = "W2" ;
+NET "ADCB_8_p" LOC = "U3" ;
+NET "ADCB_8_n" LOC = "V4" ;
+NET "ADCB_10_p" LOC = "J1" ;
+NET "ADCB_10_n" LOC = "K1" ;
+NET "ADCB_12_p" LOC = "J3" ;
+NET "ADCB_12_n" LOC = "J2" ;
+
+## DAC
+NET "DAC_LOCK" LOC = "P4" ;
+NET "DACA<0>" LOC = "P8" ;
+NET "DACA<1>" LOC = "P9" ;
+NET "DACA<2>" LOC = "R5" ;
+NET "DACA<3>" LOC = "R6" ;
+NET "DACA<4>" LOC = "P7" ;
+NET "DACA<5>" LOC = "P6" ;
+NET "DACA<6>" LOC = "T3" ;
+NET "DACA<7>" LOC = "T4" ;
+NET "DACA<8>" LOC = "R3" ;
+NET "DACA<9>" LOC = "R4" ;
+NET "DACA<10>" LOC = "R2" ;
+NET "DACA<11>" LOC = "N1" ;
+NET "DACA<12>" LOC = "N2" ;
+NET "DACA<13>" LOC = "N5" ;
+NET "DACA<14>" LOC = "N4" ;
+NET "DACA<15>" LOC = "M2" ;
+NET "DACB<0>" LOC = "M5" ;
+NET "DACB<1>" LOC = "M6" ;
+NET "DACB<2>" LOC = "M4" ;
+NET "DACB<3>" LOC = "M3" ;
+NET "DACB<4>" LOC = "M8" ;
+NET "DACB<5>" LOC = "M7" ;
+NET "DACB<6>" LOC = "L4" ;
+NET "DACB<7>" LOC = "L3" ;
+NET "DACB<8>" LOC = "K3" ;
+NET "DACB<9>" LOC = "K2" ;
+NET "DACB<10>" LOC = "K5" ;
+NET "DACB<11>" LOC = "K4" ;
+NET "DACB<12>" LOC = "M10" ;
+NET "DACB<13>" LOC = "M9" ;
+NET "DACB<14>" LOC = "J5" ;
+NET "DACB<15>" LOC = "J4" ;
+
+## TX DB GPIO
NET "io_tx<15>" LOC = "K6" ;
NET "io_tx<14>" LOC = "L7" ;
NET "io_tx<13>" LOC = "H2" ;
NET "io_tx<12>" LOC = "H1" ;
NET "io_tx<11>" LOC = "L10" ;
NET "io_tx<10>" LOC = "L9" ;
-NET "io_tx<09>" LOC = "G3" ;
-NET "io_tx<08>" LOC = "F3" ;
-NET "io_tx<07>" LOC = "K7" ;
-NET "io_tx<06>" LOC = "J6" ;
-NET "io_tx<05>" LOC = "E1" ;
-NET "io_tx<04>" LOC = "F2" ;
-NET "io_tx<03>" LOC = "J7" ;
-NET "io_tx<02>" LOC = "H6" ;
-NET "io_tx<01>" LOC = "F5" ;
-NET "io_tx<00>" LOC = "G4" ;
-NET "MOSI_RX_ADC" LOC = "E3" ;
-NET "SCLK_RX_ADC" LOC = "F4" ;
-NET "SEN_RX_ADC" LOC = "D3" ;
-NET "SCLK_RX_DAC" LOC = "E4" ;
-NET "SEN_RX_DAC" LOC = "K9" ;
-NET "MOSI_RX_DAC" LOC = "K8" ;
-NET "SCLK_RX_DB" LOC = "G6" ;
-NET "MOSI_RX_DB" LOC = "H7" ;
-NET "SEN_RX_DB" LOC = "B2" ;
-NET "SCLK_ADC" LOC = "B1" ;
-NET "MOSI_ADC" LOC = "J8" ;
-NET "SEN_ADC" LOC = "J9" ;
-NET "ADCB_4_5_p" LOC = "AE1" ;
-NET "ADCB_4_5_n" LOC = "AE2" ;
-NET "ADCB_6_7_p" LOC = "W1" ;
-NET "ADCB_6_7_n" LOC = "W2" ;
-NET "ADCB_8_9_p" LOC = "U3" ;
-NET "ADCB_8_9_n" LOC = "V4" ;
-NET "ADCB_10_11_p" LOC = "J1" ;
-NET "ADCB_10_11_n" LOC = "K1" ;
-NET "ADCB_12_13_p" LOC = "J3" ;
-NET "ADCB_12_13_n" LOC = "J2" ;
-NET "MISO_RX_DB" LOC = "H4" ;
-NET "MISO_RX_ADC" LOC = "C1" ;
-NET "MISO_TX_DB" LOC = "AA5" ;
-NET "MISO_DAC" LOC = "Y3" ;
-NET "MISO_TX_ADC" LOC = "G1" ;
-NET "io_rx<02>" LOC = "R10" ;
-NET "io_rx<01>" LOC = "R1" ;
-NET "io_rx<00>" LOC = "M1" ;
-NET "exp_user_out_p" LOC = "AF14" ;
-NET "exp_user_out_n" LOC = "AE14" ;
-NET "exp_time_out_p" LOC = "Y14" ;
-NET "exp_time_out_n" LOC = "AA14" ;
-NET "CLK_FPGA_P" LOC = "AA13" ;
-NET "CLK_FPGA_N" LOC = "Y13" ;
+NET "io_tx<9>" LOC = "G3" ;
+NET "io_tx<8>" LOC = "F3" ;
+NET "io_tx<7>" LOC = "K7" ;
+NET "io_tx<6>" LOC = "J6" ;
+NET "io_tx<5>" LOC = "E1" ;
+NET "io_tx<4>" LOC = "F2" ;
+NET "io_tx<3>" LOC = "J7" ;
+NET "io_tx<2>" LOC = "H6" ;
+NET "io_tx<1>" LOC = "F5" ;
+NET "io_tx<0>" LOC = "G4" ;
+
+## RX DB GPIO
+NET "io_rx<15>" LOC = "AD1" ;
+NET "io_rx<14>" LOC = "AD2" ;
+NET "io_rx<13>" LOC = "AC2" ;
+NET "io_rx<12>" LOC = "AC3" ;
+NET "io_rx<11>" LOC = "W7" ;
+NET "io_rx<10>" LOC = "W6" ;
+NET "io_rx<9>" LOC = "U9" ;
+NET "io_rx<8>" LOC = "V8" ;
+NET "io_rx<7>" LOC = "AB1" ;
+NET "io_rx<6>" LOC = "AC1" ;
+NET "io_rx<5>" LOC = "V7" ;
+NET "io_rx<4>" LOC = "V6" ;
+NET "io_rx<3>" LOC = "Y5" ;
+NET "io_rx<2>" LOC = "R10" ;
+NET "io_rx<1>" LOC = "R1" ;
+NET "io_rx<0>" LOC = "M1" ;
+
+## MISC
NET "leds<5>" LOC = "AF25" ;
NET "leds<4>" LOC = "AE25" ;
NET "leds<3>" LOC = "AF23" ;
NET "leds<2>" LOC = "AE23" ;
NET "leds<1>" LOC = "AB18" ;
-NET "SEN_CLK" LOC = "AA18" ;
-NET "MOSI_CLK" LOC = "W17" ;
-NET "SCLK_CLK" LOC = "V17" ;
-NET "CLK_STATUS" LOC = "AD22" ;
-NET "CLK_FUNC" LOC = "AC21" ;
-NET "clk_sel<0>" LOC = "AE21" ;
-NET "clk_sel<1>" LOC = "AD21" ;
-NET "clk_en<1>" LOC = "AA17" ;
-NET "clk_en<0>" LOC = "Y17" ;
-NET "SDA" LOC = "V16" ;
-NET "SCL" LOC = "U16" ;
-NET "TXD3" LOC = "AD20" ;
-NET "TXD2" LOC = "AC20" ;
-NET "TXD1" LOC = "AD19" ;
-NET "debug<00>" LOC = "AC19" ;
-NET "debug<01>" LOC = "AF20" ;
-NET "debug<02>" LOC = "AE20" ;
-NET "debug<03>" LOC = "AC16" ;
-NET "debug<04>" LOC = "AB16" ;
-NET "debug<05>" LOC = "AF19" ;
-NET "debug<06>" LOC = "AE19" ;
-NET "debug<07>" LOC = "V15" ;
-NET "debug<08>" LOC = "U15" ;
-NET "debug<09>" LOC = "AE17" ;
+NET "FPGA_RESET" LOC = "K24" ;
+
+## Debug
+NET "debug_clk<0>" LOC = "AA10" ;
+NET "debug_clk<1>" LOC = "AD11" ;
+NET "debug<0>" LOC = "AC19" ;
+NET "debug<1>" LOC = "AF20" ;
+NET "debug<2>" LOC = "AE20" ;
+NET "debug<3>" LOC = "AC16" ;
+NET "debug<4>" LOC = "AB16" ;
+NET "debug<5>" LOC = "AF19" ;
+NET "debug<6>" LOC = "AE19" ;
+NET "debug<7>" LOC = "V15" ;
+NET "debug<8>" LOC = "U15" ;
+NET "debug<9>" LOC = "AE17" ;
NET "debug<10>" LOC = "AD17" ;
NET "debug<11>" LOC = "V14" ;
NET "debug<12>" LOC = "W15" ;
NET "debug<13>" LOC = "AC15" ;
NET "debug<14>" LOC = "AD14" ;
NET "debug<15>" LOC = "AC14" ;
-NET "debug_clk<1>" LOC = "AD11" ;
NET "debug<16>" LOC = "AC11" ;
NET "debug<17>" LOC = "AB12" ;
NET "debug<18>" LOC = "AC12" ;
@@ -168,187 +148,277 @@ NET "debug<28>" LOC = "AB7" ;
NET "debug<29>" LOC = "V11" ;
NET "debug<30>" LOC = "U11" ;
NET "debug<31>" LOC = "Y10" ;
-NET "debug_clk<0>" LOC = "AA10" ;
+
+## UARTS
+NET "TXD<3>" LOC = "AD20" ;
+NET "TXD<2>" LOC = "AC20" ;
+NET "TXD<1>" LOC = "AD19" ;
+NET "RXD<3>" LOC = "AF17" ;
+NET "RXD<2>" LOC = "AF15" ;
+NET "RXD<1>" LOC = "AD12" ;
+
+## AD9510
+NET "CLK_STATUS" LOC = "AD22" ;
+NET "CLK_FUNC" LOC = "AC21" ;
+NET "clk_sel<0>" LOC = "AE21" ;
+NET "clk_sel<1>" LOC = "AD21" ;
+NET "clk_en<1>" LOC = "AA17" ;
+NET "clk_en<0>" LOC = "Y17" ;
+
+## I2C
+NET "SDA" LOC = "V16" ;
+NET "SCL" LOC = "U16" ;
+
+## Timing
+NET "PPS_IN" LOC = "AB6" ;
+NET "PPS2_IN" LOC = "AA20" ;
+
+## SPI
+NET "SEN_CLK" LOC = "AA18" ;
+NET "MOSI_CLK" LOC = "W17" ;
+NET "SCLK_CLK" LOC = "V17" ;
+NET "MISO_CLK" LOC = "AC10" ;
+
NET "SEN_DAC" LOC = "AE7" ;
NET "SCLK_DAC" LOC = "AF5" ;
NET "MOSI_DAC" LOC = "AE6" ;
+NET "MISO_DAC" LOC = "Y3" ;
+
+NET "SCLK_ADC" LOC = "B1" ;
+NET "MOSI_ADC" LOC = "J8" ;
+NET "SEN_ADC" LOC = "J9" ;
+
NET "MOSI_TX_ADC" LOC = "V10" ;
NET "SEN_TX_ADC" LOC = "W10" ;
NET "SCLK_TX_ADC" LOC = "AC6" ;
+NET "MISO_TX_ADC" LOC = "G1" ;
+
NET "MOSI_TX_DAC" LOC = "AD6" ;
NET "SEN_TX_DAC" LOC = "AE4" ;
NET "SCLK_TX_DAC" LOC = "AF4" ;
+
NET "SCLK_TX_DB" LOC = "AE3" ;
NET "MOSI_TX_DB" LOC = "AF3" ;
NET "SEN_TX_DB" LOC = "W9" ;
-NET "RXD3" LOC = "AF17" ;
-NET "RXD2" LOC = "AF15" ;
-NET "RXD1" LOC = "AD12" ;
-NET "MISO_CLK" LOC = "AC10" ;
-NET "PPS_IN" LOC = "AB6" ;
-NET "PPS2_IN" LOC = "AA20" ;
-NET "ser_rx_clk" LOC = "P18" ;
-NET "ser_tx_clk" LOC = "P23" ; # SERDES TX CLK
+NET "MISO_TX_DB" LOC = "AA5" ;
+
+NET "MOSI_RX_ADC" LOC = "E3" ;
+NET "SCLK_RX_ADC" LOC = "F4" ;
+NET "SEN_RX_ADC" LOC = "D3" ;
+NET "MISO_RX_ADC" LOC = "C1" ;
+
+NET "SCLK_RX_DAC" LOC = "E4" ;
+NET "SEN_RX_DAC" LOC = "K9" ;
+NET "MOSI_RX_DAC" LOC = "K8" ;
+
+NET "SCLK_RX_DB" LOC = "G6" ;
+NET "MOSI_RX_DB" LOC = "H7" ;
+NET "SEN_RX_DB" LOC = "B2" ;
+NET "MISO_RX_DB" LOC = "H4" ;
+
+## ETH PHY
NET "CLK_TO_MAC" LOC = "P26" ;
-NET "GMII_TX_CLK" LOC = "P25" ;
-NET "GMII_RX_CLK" LOC = "P21" ;
-NET "ETH_LED" LOC = "H20" ;
-NET "GMII_TXD7" LOC = "G21" ;
-NET "GMII_TXD6" LOC = "C26" ;
-NET "GMII_TXD5" LOC = "C25" ;
-NET "GMII_TXD4" LOC = "J21" ;
-NET "GMII_TXD3" LOC = "H21" ;
-NET "GMII_TXD2" LOC = "D25" ;
-NET "GMII_TXD1" LOC = "D24" ;
-NET "GMII_TXD0" LOC = "E26" ;
+
+NET "GMII_TXD<7>" LOC = "G21" ;
+NET "GMII_TXD<6>" LOC = "C26" ;
+NET "GMII_TXD<5>" LOC = "C25" ;
+NET "GMII_TXD<4>" LOC = "J21" ;
+NET "GMII_TXD<3>" LOC = "H21" ;
+NET "GMII_TXD<2>" LOC = "D25" ;
+NET "GMII_TXD<1>" LOC = "D24" ;
+NET "GMII_TXD<0>" LOC = "E26" ;
NET "GMII_TX_EN" LOC = "D26" ;
NET "GMII_TX_ER" LOC = "J19" ;
NET "GMII_GTX_CLK" LOC = "J20" ;
-NET "GMII_RXD7" LOC = "G22" ;
-NET "GMII_RXD6" LOC = "K19" ;
-NET "GMII_RXD5" LOC = "K18" ;
-NET "GMII_RXD4" LOC = "E24" ;
-NET "GMII_RXD3" LOC = "F23" ;
-NET "GMII_RXD2" LOC = "L18" ;
-NET "GMII_RXD1" LOC = "L17" ;
-NET "GMII_RXD0" LOC = "F25" ;
+NET "GMII_TX_CLK" LOC = "P25" ;
+
+NET "GMII_RX_CLK" LOC = "P21" ;
+NET "GMII_RXD<7>" LOC = "G22" ;
+NET "GMII_RXD<6>" LOC = "K19" ;
+NET "GMII_RXD<5>" LOC = "K18" ;
+NET "GMII_RXD<4>" LOC = "E24" ;
+NET "GMII_RXD<3>" LOC = "F23" ;
+NET "GMII_RXD<2>" LOC = "L18" ;
+NET "GMII_RXD<1>" LOC = "L17" ;
+NET "GMII_RXD<0>" LOC = "F25" ;
NET "GMII_RX_DV" LOC = "F24" ;
NET "GMII_RX_ER" LOC = "L20" ;
NET "GMII_CRS" LOC = "K20" ;
NET "GMII_COL" LOC = "G23" ;
+
NET "PHY_INTn" LOC = "L22" ;
NET "MDIO" LOC = "K21" ;
NET "MDC" LOC = "J23" ;
-NET "PHY_RESET" LOC = "J22" ;
+NET "PHY_RESETn" LOC = "J22" ;
+NET "ETH_LED" LOC = "H20" |IOSTANDARD = LVCMOS25 |DRIVE = 12 |SLEW = FAST ;
+
+## MIMO Interface
+NET "exp_time_out_p" LOC = "Y14" ;
+NET "exp_time_out_n" LOC = "AA14" ;
NET "exp_time_in_p" LOC = "N18" ;
NET "exp_time_in_n" LOC = "N17" ;
+NET "exp_user_out_p" LOC = "AF14" ;
+NET "exp_user_out_n" LOC = "AE14" ;
NET "exp_user_in_p" LOC = "L24" ;
NET "exp_user_in_n" LOC = "M23" ;
+
+## SERDES
+NET "ser_enable" LOC = "R20" ;
NET "ser_prbsen" LOC = "U23" ;
NET "ser_loopen" LOC = "R19" ;
-NET "ser_enable" LOC = "R20" ;
+NET "ser_rx_en" LOC = "Y21" ;
+NET "ser_tx_clk" LOC = "P23" ; # SERDES TX CLK
NET "ser_t<15>" LOC = "V23" ;
NET "ser_t<14>" LOC = "U22" ;
NET "ser_t<13>" LOC = "V24" ;
NET "ser_t<12>" LOC = "V25" ;
NET "ser_t<11>" LOC = "W23" ;
NET "ser_t<10>" LOC = "V22" ;
-NET "ser_t<09>" LOC = "T18" ;
-NET "ser_t<08>" LOC = "T17" ;
-NET "ser_t<07>" LOC = "Y24" ;
-NET "ser_t<06>" LOC = "Y25" ;
-NET "ser_t<05>" LOC = "U21" ;
-NET "ser_t<04>" LOC = "T20" ;
-NET "ser_t<03>" LOC = "Y22" ;
-NET "ser_t<02>" LOC = "Y23" ;
-NET "ser_t<01>" LOC = "U19" ;
-NET "ser_t<00>" LOC = "U18" ;
+NET "ser_t<9>" LOC = "T18" ;
+NET "ser_t<8>" LOC = "T17" ;
+NET "ser_t<7>" LOC = "Y24" ;
+NET "ser_t<6>" LOC = "Y25" ;
+NET "ser_t<5>" LOC = "U21" ;
+NET "ser_t<4>" LOC = "T20" ;
+NET "ser_t<3>" LOC = "Y22" ;
+NET "ser_t<2>" LOC = "Y23" ;
+NET "ser_t<1>" LOC = "U19" ;
+NET "ser_t<0>" LOC = "U18" ;
NET "ser_tkmsb" LOC = "AA24" ;
NET "ser_tklsb" LOC = "AA25" ;
+NET "ser_rx_clk" LOC = "P18" ;
NET "ser_r<15>" LOC = "V21" ;
NET "ser_r<14>" LOC = "U20" ;
NET "ser_r<13>" LOC = "AA22" ;
NET "ser_r<12>" LOC = "AA23" ;
NET "ser_r<11>" LOC = "V18" ;
NET "ser_r<10>" LOC = "V19" ;
-NET "ser_r<09>" LOC = "AB23" ;
-NET "ser_r<08>" LOC = "AC26" ;
-NET "ser_r<07>" LOC = "AB26" ;
-NET "ser_r<06>" LOC = "AD26" ;
-NET "ser_r<05>" LOC = "AC25" ;
-NET "ser_r<04>" LOC = "W20" ;
-NET "ser_r<03>" LOC = "W21" ;
-NET "ser_r<02>" LOC = "AC23" ;
-NET "ser_r<01>" LOC = "AC24" ;
-NET "ser_r<00>" LOC = "AE26" ;
+NET "ser_r<9>" LOC = "AB23" ;
+NET "ser_r<8>" LOC = "AC26" ;
+NET "ser_r<7>" LOC = "AB26" ;
+NET "ser_r<6>" LOC = "AD26" ;
+NET "ser_r<5>" LOC = "AC25" ;
+NET "ser_r<4>" LOC = "W20" ;
+NET "ser_r<3>" LOC = "W21" ;
+NET "ser_r<2>" LOC = "AC23" ;
+NET "ser_r<1>" LOC = "AC24" ;
+NET "ser_r<0>" LOC = "AE26" ;
NET "ser_rkmsb" LOC = "AD25" ;
NET "ser_rklsb" LOC = "Y20" ;
-NET "ser_rx_en" LOC = "Y21" ;
-NET "FPGA_RESET" LOC = "K24" ;
-NET "RAM_D<17>" LOC = "F7" ;
-NET "RAM_D<16>" LOC = "E7" ;
-NET "RAM_D<15>" LOC = "G9" ;
-NET "RAM_D<14>" LOC = "H9" ;
-NET "RAM_D<13>" LOC = "G10" ;
-NET "RAM_D<12>" LOC = "H10" ;
-NET "RAM_D<11>" LOC = "A4" ;
-NET "RAM_D<10>" LOC = "B4" ;
-NET "RAM_D<09>" LOC = "C5" ;
-NET "RAM_D<08>" LOC = "D6" ;
-NET "RAM_D<07>" LOC = "J11" ;
-NET "RAM_D<06>" LOC = "K11" ;
-NET "RAM_D<05>" LOC = "B7" ;
-NET "RAM_D<04>" LOC = "C7" ;
-NET "RAM_D<03>" LOC = "B6" ;
-NET "RAM_D<02>" LOC = "C6" ;
-NET "RAM_D<01>" LOC = "C8" ;
-NET "RAM_D<00>" LOC = "D8" ;
-NET "RAM_ZZ" LOC = "J12" ;
-NET "RAM_BWn<3>" LOC = "D9" ;
-NET "RAM_BWn<2>" LOC = "A9" ;
-NET "RAM_BWn<1>" LOC = "B9" ;
-NET "RAM_BWn<0>" LOC = "G12" ;
-NET "RAM_LDn" LOC = "H12" ;
-NET "RAM_OEn" LOC = "C10" ;
-NET "RAM_WEn" LOC = "D10" ;
-NET "RAM_CLK" LOC = "A10" ;
-NET "RAM_CENn" LOC = "B10" ;
-NET "RAM_A<00>" LOC = "C11" ;
-NET "RAM_A<01>" LOC = "E12" ;
-NET "RAM_A<02>" LOC = "F12" ;
-NET "RAM_A<03>" LOC = "D13" ;
-NET "RAM_A<04>" LOC = "C12" ;
-NET "RAM_A<05>" LOC = "A12" ;
-NET "RAM_A<06>" LOC = "B12" ;
-NET "RAM_A<07>" LOC = "E14" ;
-NET "RAM_A<08>" LOC = "F14" ;
-NET "RAM_A<09>" LOC = "B15" ;
-NET "RAM_A<10>" LOC = "A15" ;
-NET "RAM_A<11>" LOC = "D16" ;
-NET "RAM_A<12>" LOC = "C15" ;
-NET "RAM_A<13>" LOC = "D17" ;
-NET "RAM_A<14>" LOC = "C16" ;
-NET "RAM_A<15>" LOC = "F15" ;
-NET "RAM_A<16>" LOC = "C17" ;
-NET "RAM_A<17>" LOC = "B17" ;
-NET "RAM_A<18>" LOC = "B18" ;
-NET "RAM_A<19>" LOC = "A18" ;
-NET "RAM_A<20>" LOC = "D18" ;
-NET "RAM_D<35>" LOC = "K16" ;
-NET "RAM_D<34>" LOC = "D20" ;
-NET "RAM_D<33>" LOC = "C20" ;
-NET "RAM_D<32>" LOC = "E21" ;
-NET "RAM_D<31>" LOC = "D21" ;
-NET "RAM_D<30>" LOC = "C21" ;
-NET "RAM_D<29>" LOC = "B21" ;
-NET "RAM_D<28>" LOC = "H17" ;
-NET "RAM_D<27>" LOC = "G17" ;
-NET "RAM_D<26>" LOC = "B23" ;
-NET "RAM_D<25>" LOC = "A22" ;
-NET "RAM_D<24>" LOC = "D23" ;
-NET "RAM_D<23>" LOC = "C23" ;
-NET "RAM_D<22>" LOC = "D22" ;
-NET "RAM_D<21>" LOC = "C22" ;
-NET "RAM_D<20>" LOC = "F19" ;
-NET "RAM_D<19>" LOC = "G20" ;
-NET "RAM_D<18>" LOC = "F20" ;
-#NET "unnamed_net20" LOC = "V20" ; # SUSPEND
-NET "PROG_B" LOC = "A2" ;
-NET "PUDC_B" LOC = "G8" ;
-NET "DONE" LOC = "AB21" ;
+
+## SRAM
+NET "RAM_D<35>" LOC = "K16" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<34>" LOC = "D20" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<33>" LOC = "C20" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<32>" LOC = "E21" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<31>" LOC = "D21" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<30>" LOC = "C21" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<29>" LOC = "B21" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<28>" LOC = "H17" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<27>" LOC = "G17" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<26>" LOC = "B23" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<25>" LOC = "A22" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<24>" LOC = "D23" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<23>" LOC = "C23" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<22>" LOC = "D22" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<21>" LOC = "C22" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<20>" LOC = "F19" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<19>" LOC = "G20" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<18>" LOC = "F20" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<17>" LOC = "F7" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<16>" LOC = "E7" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<15>" LOC = "G9" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<14>" LOC = "H9" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<13>" LOC = "G10" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<12>" LOC = "H10" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<11>" LOC = "A4" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<10>" LOC = "B4" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<9>" LOC = "C5" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<8>" LOC = "D6" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<7>" LOC = "J11" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<6>" LOC = "K11" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<5>" LOC = "B7" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<4>" LOC = "C7" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<3>" LOC = "B6" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<2>" LOC = "C6" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<1>" LOC = "C8" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_D<0>" LOC = "D8" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<0>" LOC = "C11" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<1>" LOC = "E12" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<2>" LOC = "F12" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<3>" LOC = "D13" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<4>" LOC = "C12" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<5>" LOC = "A12" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<6>" LOC = "B12" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<7>" LOC = "E14" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<8>" LOC = "F14" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<9>" LOC = "B15" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<10>" LOC = "A15" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<11>" LOC = "D16" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<12>" LOC = "C15" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<13>" LOC = "D17" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<14>" LOC = "C16" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<15>" LOC = "F15" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<16>" LOC = "C17" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<17>" LOC = "B17" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<18>" LOC = "B18" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<19>" LOC = "A18" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_A<20>" LOC = "D18" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_BWn<3>" LOC = "D9" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_BWn<2>" LOC = "A9" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_BWn<1>" LOC = "B9" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_BWn<0>" LOC = "G12" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_ZZ" LOC = "J12" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_LDn" LOC = "H12" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_OEn" LOC = "C10" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_WEn" LOC = "D10" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_CENn" LOC = "B10" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+NET "RAM_CLK" LOC = "A10" |IOSTANDARD = LVCMOS25 |DRIVE = 8 |SLEW = FAST ;
+
+## SPI Flash
NET "flash_miso" LOC = "AF24" ;
NET "flash_clk" LOC = "AE24" ;
-NET "INIT_B" LOC = "AA15" ;
NET "flash_mosi" LOC = "AB15" ;
+NET "flash_cs" LOC = "AA7" ;
+
+## MISC FPGA, unused for now
+#NET "PROG_B" LOC = "A2" ;
+#NET "PUDC_B" LOC = "G8" ;
+#NET "DONE" LOC = "AB21" ;
+#NET "INIT_B" LOC = "AA15" ;
+
+
#NET "unnamed_net19" LOC = "AE9" ; # VS1
#NET "unnamed_net18" LOC = "AF9" ; # VS0
#NET "unnamed_net17" LOC = "AA12" ; # VS2
#NET "unnamed_net16" LOC = "Y7" ; # M2
-NET "flash_cs" LOC = "AA7" ;
#NET "unnamed_net15" LOC = "AC4" ; # M1
#NET "unnamed_net14" LOC = "AD4" ; # M0
#NET "unnamed_net13" LOC = "D4" ; # TMS
#NET "unnamed_net12" LOC = "E23" ; # TDO
#NET "unnamed_net11" LOC = "G7" ; # TDI
#NET "unnamed_net10" LOC = "A25" ; # TCK
+#NET "unnamed_net20" LOC = "V20" ; # SUSPEND
+
+
+NET "clk_to_mac" TNM_NET = "clk_to_mac";
+TIMESPEC "TS_clk_to_mac" = PERIOD "clk_to_mac" 8 ns HIGH 50 %;
+
+NET "clk_fpga_p" TNM_NET = "clk_fpga_p";
+TIMESPEC "TS_clk_fpga_p" = PERIOD "clk_fpga_p" 10 ns HIGH 50 %;
+
+NET "GMII_RX_CLK" TNM_NET = "GMII_RX_CLK";
+TIMESPEC "TS_GMII_RX_CLK" = PERIOD "GMII_RX_CLK" 8 ns HIGH 50 %;
+
+NET "ser_rx_clk" TNM_NET = "ser_rx_clk";
+TIMESPEC "TS_ser_rx_clk" = PERIOD "ser_rx_clk" 10 ns HIGH 50 %;
+
+TIMESPEC "TS_clk_div_to_dsp_clk" = FROM "clk_div" TO "dcm_out" 10 ns;
+
+#NET "CLK_FPGA_P" CLOCK_DEDICATED_ROUTE = FALSE;
+#PIN "DCM_INST/DCM_SP.CLKIN" CLOCK_DEDICATED_ROUTE = FALSE;
+
+#NET "RAM_CLK" CLOCK_DEDICATED_ROUTE = FALSE;
+#PIN "DCM_INST1/DCM_SP.CLKFB" CLOCK_DEDICATED_ROUTE = FALSE;
+
diff --git a/fpga/usrp2/top/u2plus/u2plus.v b/fpga/usrp2/top/u2plus/u2plus.v
index e95445867..270655a8d 100644
--- a/fpga/usrp2/top/u2plus/u2plus.v
+++ b/fpga/usrp2/top/u2plus/u2plus.v
@@ -1,48 +1,96 @@
`timescale 1ns / 1ps
+//`define DCM_FOR_RAMCLK
//////////////////////////////////////////////////////////////////////////////////
module u2plus
(
+ input CLK_FPGA_P, input CLK_FPGA_N, // Diff
+
+ // ADC
+ input ADC_clkout_p, input ADC_clkout_n,
+ input ADCA_12_p, input ADCA_12_n,
+ input ADCA_10_p, input ADCA_10_n,
+ input ADCA_8_p, input ADCA_8_n,
+ input ADCA_6_p, input ADCA_6_n,
+ input ADCA_4_p, input ADCA_4_n,
+ input ADCA_2_p, input ADCA_2_n,
+ input ADCA_0_p, input ADCA_0_n,
+ input ADCB_12_p, input ADCB_12_n,
+ input ADCB_10_p, input ADCB_10_n,
+ input ADCB_8_p, input ADCB_8_n,
+ input ADCB_6_p, input ADCB_6_n,
+ input ADCB_4_p, input ADCB_4_n,
+ input ADCB_2_p, input ADCB_2_n,
+ input ADCB_0_p, input ADCB_0_n,
+
+ // DAC
+ output reg [15:0] DACA,
+ output reg [15:0] DACB,
+ input DAC_LOCK, // unused for now
+
+ // DB IO Pins
+ inout [15:0] io_tx,
+ inout [15:0] io_rx,
+
// Misc, debug
- output [4:0] leds, // LED4 is shared w/INIT_B
- input [3:0] dipsw,
- output [31:0] debug,
+ output [5:1] leds, // LED4 is shared w/INIT_B
+ input FPGA_RESET,
output [1:0] debug_clk,
- output uart_tx_o,
- input uart_rx_i,
-
- // Expansion
- input exp_pps_in_p, // Diff
- input exp_pps_in_n, // Diff
- output exp_pps_out_p, // Diff
- output exp_pps_out_n, // Diff
+ output [31:0] debug,
+ output [3:1] TXD, input [3:1] RXD, // UARTs
+ //input [3:0] dipsw, // Forgot DIP Switches...
- // GMII
- // GMII-CTRL
- input GMII_COL,
- input GMII_CRS,
+ // Clock Gen Control
+ output [1:0] clk_en,
+ output [1:0] clk_sel,
+ input CLK_FUNC, // FIXME is an input to control the 9510
+ input CLK_STATUS,
+
+ inout SCL, inout SDA, // I2C
+
+ // PPS
+ input PPS_IN, input PPS2_IN,
+
+ // SPI
+ output SEN_CLK, output SCLK_CLK, output MOSI_CLK, input MISO_CLK,
+ output SEN_DAC, output SCLK_DAC, output MOSI_DAC, input MISO_DAC,
+ output SEN_ADC, output SCLK_ADC, output MOSI_ADC,
+ output SEN_TX_DB, output SCLK_TX_DB, output MOSI_TX_DB, input MISO_TX_DB,
+ output SEN_TX_DAC, output SCLK_TX_DAC, output MOSI_TX_DAC,
+ output SEN_TX_ADC, output SCLK_TX_ADC, output MOSI_TX_ADC, input MISO_TX_ADC,
+ output SEN_RX_DB, output SCLK_RX_DB, output MOSI_RX_DB, input MISO_RX_DB,
+ output SEN_RX_DAC, output SCLK_RX_DAC, output MOSI_RX_DAC,
+ output SEN_RX_ADC, output SCLK_RX_ADC, output MOSI_RX_ADC, input MISO_RX_ADC,
+
+ // GigE PHY
+ input CLK_TO_MAC,
- // GMII-TX
output reg [7:0] GMII_TXD,
output reg GMII_TX_EN,
output reg GMII_TX_ER,
output GMII_GTX_CLK,
input GMII_TX_CLK, // 100mbps clk
- // GMII-RX
- input [7:0] GMII_RXD,
input GMII_RX_CLK,
+ input [7:0] GMII_RXD,
input GMII_RX_DV,
input GMII_RX_ER,
+ input GMII_COL,
+ input GMII_CRS,
- // GMII-Management
+ input PHY_INTn, // open drain
inout MDIO,
output MDC,
- input PHY_INTn, // open drain
output PHY_RESETn,
- input PHY_CLK, // possibly use on-board osc
- input clk_to_mac,
- output eth_led,
+ output ETH_LED,
+
+// input POR,
+
+ // Expansion
+ input exp_time_in_p, input exp_time_in_n, // Diff
+ output exp_time_out_p, output exp_time_out_n, // Diff
+ input exp_user_in_p, input exp_user_in_n, // Diff
+ output exp_user_out_p, output exp_user_out_n, // Diff
// SERDES
output ser_enable,
@@ -59,75 +107,18 @@ module u2plus
input [15:0] ser_r,
input ser_rklsb,
input ser_rkmsb,
-
- // ADC
- input [13:0] adc_a,
- input adc_ovf_a,
- output adc_oen_a,
- output adc_pdn_a,
-
- input [13:0] adc_b,
- input adc_ovf_b,
- output adc_oen_b,
- output adc_pdn_b,
-
- // DAC
- output [15:0] dac_a,
- output [15:0] dac_b,
- input dac_lock, // unused for now
-
- // I2C
- inout SCL,
- inout SDA,
- // Clock Gen Control
- output [1:0] clk_en,
- output [1:0] clk_sel,
- input clk_func, // FIXME is an input to control the 9510
- input clk_status,
-
- // Clocks
- input clk_fpga_p, // Diff
- input clk_fpga_n, // Diff
- input pps_in,
- input POR,
+ // SRAM
+ inout [35:0] RAM_D,
+ output [20:0] RAM_A,
+ output [3:0] RAM_BWn,
+ output RAM_ZZ,
+ output RAM_LDn,
+ output RAM_OEn,
+ output RAM_WEn,
+ output RAM_CENn,
+ output RAM_CLK,
- // AD9510 SPI
- output sclk,
- output sen_clk,
- output sdi,
- input sdo,
-
- // TX side SPI -- tx_db, tx_adc, tx_dac, 9777
- output sen_dac,
- output sen_tx_db,
- output sen_tx_adc,
- output sen_tx_dac,
- output mosi_tx,
- input miso_dac,
- input miso_tx_db,
- input miso_tx_adc,
- output sclk_tx,
-
- // RX side SPI
- output sen_rx_db,
- output sclk_rx_db,
- input sdo_rx_db,
- output sdi_rx_db,
-
- output sen_rx_adc,
- output sclk_rx_adc,
- input sdo_rx_adc,
- output sdi_rx_adc,
-
- output sen_rx_dac,
- output sclk_rx_dac,
- output sdi_rx_dac,
-
- // DB IO Pins
- inout [15:0] io_tx,
- inout [15:0] io_rx,
-
// SPI Flash
output flash_cs,
output flash_clk,
@@ -135,38 +126,63 @@ module u2plus
input flash_miso
);
+ wire CLK_TO_MAC_int, CLK_TO_MAC_int2;
+ IBUFG phyclk (.O(CLK_TO_MAC_int), .I(CLK_TO_MAC));
+ BUFG phyclk2 (.O(CLK_TO_MAC_int2), .I(CLK_TO_MAC_int));
+
// FPGA-specific pins connections
- wire aux_clk = PHY_CLK;
-
wire clk_fpga, dsp_clk, clk_div, dcm_out, wb_clk, clock_ready;
- IBUFGDS clk_fpga_pin (.O(clk_fpga),.I(clk_fpga_p),.IB(clk_fpga_n));
+ IBUFGDS clk_fpga_pin (.O(clk_fpga),.I(CLK_FPGA_P),.IB(CLK_FPGA_N));
defparam clk_fpga_pin.IOSTANDARD = "LVPECL_25";
- wire exp_pps_in;
- IBUFDS exp_pps_in_pin (.O(exp_pps_in),.I(exp_pps_in_p),.IB(exp_pps_in_n));
- defparam exp_pps_in_pin.IOSTANDARD = "LVDS_25";
+ wire exp_time_in;
+ IBUFDS exp_time_in_pin (.O(exp_time_in),.I(exp_time_in_p),.IB(exp_time_in_n));
+ defparam exp_time_in_pin.IOSTANDARD = "LVDS_25";
+
+ wire exp_time_out;
+ OBUFDS exp_time_out_pin (.O(exp_time_out_p),.OB(exp_time_out_n),.I(exp_time_out));
+ defparam exp_time_out_pin.IOSTANDARD = "LVDS_25";
+
+ wire exp_user_in;
+ IBUFDS exp_user_in_pin (.O(exp_user_in),.I(exp_user_in_p),.IB(exp_user_in_n));
+ defparam exp_user_in_pin.IOSTANDARD = "LVDS_25";
- wire exp_pps_out;
- OBUFDS exp_pps_out_pin (.O(exp_pps_out_p),.OB(exp_pps_out_n),.I(exp_pps_out));
- defparam exp_pps_out_pin.IOSTANDARD = "LVDS_25";
+ wire exp_user_out;
+ OBUFDS exp_user_out_pin (.O(exp_user_out_p),.OB(exp_user_out_n),.I(exp_user_out));
+ defparam exp_user_out_pin.IOSTANDARD = "LVDS_25";
reg [5:0] clock_ready_d;
- always @(posedge aux_clk)
+ always @(posedge clk_fpga)
clock_ready_d[5:0] <= {clock_ready_d[4:0],clock_ready};
-
wire dcm_rst = ~&clock_ready_d & |clock_ready_d;
- wire clk_muxed = clock_ready ? clk_fpga : aux_clk;
-
- wire adc_on_a, adc_on_b, adc_oe_a, adc_oe_b;
- assign adc_oen_a = ~adc_oe_a;
- assign adc_oen_b = ~adc_oe_b;
- assign adc_pdn_a = ~adc_on_a;
- assign adc_pdn_b = ~adc_on_b;
+ // ADC A is inverted on the schematic to facilitate a clean layout
+ // We account for that here by inverting it
+`ifdef LVDS
+ wire [13:0] adc_a, adc_a_inv, adc_b;
+ capture_ddrlvds #(.WIDTH(14)) capture_ddrlvds
+ (.clk(dsp_clk), .ssclk_p(ADC_clkout_p), .ssclk_n(ADC_clkout_n),
+ .in_p({{ADCA_12_p, ADCA_10_p, ADCA_8_p, ADCA_6_p, ADCA_4_p, ADCA_2_p, ADCA_0_p},
+ {ADCB_12_p, ADCB_10_p, ADCB_8_p, ADCB_6_p, ADCB_4_p, ADCB_2_p, ADCB_0_p}}),
+ .in_n({{ADCA_12_n, ADCA_10_n, ADCA_8_n, ADCA_6_n, ADCA_4_n, ADCA_2_n, ADCA_0_n},
+ {ADCB_12_n, ADCB_10_n, ADCB_8_n, ADCB_6_n, ADCB_4_n, ADCB_2_n, ADCB_0_n}}),
+ .out({adc_a_inv,adc_b}));
+ assign adc_a = ~adc_a_inv;
+`else
+ reg [13:0] adc_a, adc_b;
+ always @(posedge dsp_clk)
+ begin
+ adc_a <= ~{ADCA_12_p,ADCA_12_n, ADCA_10_p,ADCA_10_n, ADCA_8_p,ADCA_8_n, ADCA_6_p,ADCA_6_n,
+ ADCA_4_p,ADCA_4_n, ADCA_2_p,ADCA_2_n, ADCA_0_p,ADCA_0_n };
+ adc_b <= {ADCB_12_p,ADCB_12_n, ADCB_10_p,ADCB_10_n, ADCB_8_p,ADCB_8_n, ADCB_6_p,ADCB_6_n,
+ ADCB_4_p,ADCB_4_n, ADCB_2_p,ADCB_2_n, ADCB_0_p,ADCB_0_n };
+ end
+`endif // !`ifdef LVDS
+
// Handle Clocks
DCM DCM_INST (.CLKFB(dsp_clk),
- .CLKIN(clk_muxed),
+ .CLKIN(clk_fpga),
.DSSEN(0),
.PSCLK(0),
.PSEN(0),
@@ -180,7 +196,7 @@ module u2plus
.CLK2X180(),
.CLK90(),
.CLK180(),
- .CLK270(),
+ .CLK270(clk270_100),
.LOCKED(LOCKED_OUT),
.PSDONE(),
.STATUS());
@@ -202,28 +218,43 @@ module u2plus
BUFG dspclk_BUFG (.I(dcm_out), .O(dsp_clk));
BUFG wbclk_BUFG (.I(clk_div), .O(wb_clk));
+ // Create clock for external SRAM thats -90degree phase to DSPCLK (i.e) 2nS earlier at 100MHz.
+ BUFG clk270_100_buf_i1 (.I(clk270_100),
+ .O(clk270_100_buf));
+ OFDDRRSE RAM_CLK_i1 (.Q(RAM_CLK),
+ .C0(clk270_100_buf),
+ .C1(~clk270_100_buf),
+ .CE(1'b1),
+ .D0(1'b1),
+ .D1(1'b0),
+ .R(1'b0),
+ .S(1'b0));
+
// I2C -- Don't use external transistors for open drain, the FPGA implements this
IOBUF scl_pin(.O(scl_pad_i), .IO(SCL), .I(scl_pad_o), .T(scl_pad_oen_o));
IOBUF sda_pin(.O(sda_pad_i), .IO(SDA), .I(sda_pad_o), .T(sda_pad_oen_o));
// LEDs are active low outputs
- wire [4:0] leds_int;
- assign leds = ~leds_int; // drive low to turn on leds
+ wire [5:0] leds_int;
+ assign {ETH_LED,leds} = {6'b011111 ^ leds_int}; // drive low to turn on leds
// SPI
- wire miso, mosi, sclk_int;
- assign {sclk,sdi} = (~sen_clk | ~sen_dac) ? {sclk_int,mosi} : 2'b0;
- assign {sclk_tx_db,sdi_tx_db} = ~sen_tx_db ? {sclk_int,mosi} : 2'b0;
- assign {sclk_tx_dac,sdi_tx_dac} = ~sen_tx_dac ? {sclk_int,mosi} : 2'b0;
- assign {sclk_tx_adc,sdi_tx_adc} = ~sen_tx_adc ? {sclk_int,mosi} : 2'b0;
- assign {sclk_rx_db,sdi_rx_db} = ~sen_rx_db ? {sclk_int,mosi} : 2'b0;
- assign {sclk_rx_dac,sdi_rx_dac} = ~sen_rx_dac ? {sclk_int,mosi} : 2'b0;
- assign {sclk_rx_adc,sdi_rx_adc} = ~sen_rx_adc ? {sclk_int,mosi} : 2'b0;
-
- assign miso = (~sen_clk & sdo) | (~sen_dac & sdo) |
- (~sen_tx_db & sdo_tx_db) | (~sen_tx_adc & sdo_tx_adc) |
- (~sen_rx_db & sdo_rx_db) | (~sen_rx_adc & sdo_rx_adc);
+ wire miso, mosi, sclk;
+ assign {SCLK_CLK,MOSI_CLK} = ~SEN_CLK ? {sclk,mosi} : 2'B0;
+ assign {SCLK_DAC,MOSI_DAC} = ~SEN_DAC ? {sclk,mosi} : 2'B0;
+ assign {SCLK_ADC,MOSI_ADC} = ~SEN_ADC ? {sclk,mosi} : 2'B0;
+ assign {SCLK_TX_DB,MOSI_TX_DB} = ~SEN_TX_DB ? {sclk,mosi} : 2'B0;
+ assign {SCLK_TX_DAC,MOSI_TX_DAC} = ~SEN_TX_DAC ? {sclk,mosi} : 2'B0;
+ assign {SCLK_TX_ADC,MOSI_TX_ADC} = ~SEN_TX_ADC ? {sclk,mosi} : 2'B0;
+ assign {SCLK_RX_DB,MOSI_RX_DB} = ~SEN_RX_DB ? {sclk,mosi} : 2'B0;
+ assign {SCLK_RX_DAC,MOSI_RX_DAC} = ~SEN_RX_DAC ? {sclk,mosi} : 2'B0;
+ assign {SCLK_RX_ADC,MOSI_RX_ADC} = ~SEN_RX_ADC ? {sclk,mosi} : 2'B0;
+
+ assign miso = (~SEN_CLK & MISO_CLK) | (~SEN_DAC & MISO_DAC) |
+ (~SEN_TX_DB & MISO_TX_DB) | (~SEN_TX_ADC & MISO_TX_ADC) |
+ (~SEN_RX_DB & MISO_RX_DB) | (~SEN_RX_ADC & MISO_RX_ADC);
+
wire GMII_TX_EN_unreg, GMII_TX_ER_unreg;
wire [7:0] GMII_TXD_unreg;
wire GMII_GTX_CLK_int;
@@ -281,16 +312,53 @@ module u2plus
.S(0) // Synchronous preset input
);
*/
- u2_core u2_core(.dsp_clk (dsp_clk),
+
+
+ //
+ // Instantiate IO for Bidirectional bus to SRAM
+ //
+ wire [35:0] RAM_D_pi;
+ wire [35:0] RAM_D_po;
+ wire RAM_D_poe;
+
+ genvar i;
+
+ generate
+ for (i=0;i<36;i=i+1)
+ begin : gen_RAM_D_IO
+
+ IOBUF #(
+ .DRIVE(12),
+ .IOSTANDARD("LVCMOS25"),
+ .SLEW("FAST")
+ )
+ RAM_D_i (
+ .O(RAM_D_pi[i]),
+ .I(RAM_D_po[i]),
+ .IO(RAM_D[i]),
+ .T(RAM_D_poe)
+ );
+ end // block: gen_RAM_D_IO
+ endgenerate
+
+
+
+ wire [15:0] dac_a_int, dac_b_int;
+ // DAC A and B are swapped in schematic to facilitate clean layout
+ // DAC A is also inverted in schematic to facilitate clean layout
+ always @(negedge dsp_clk) DACA <= ~dac_b_int;
+ always @(negedge dsp_clk) DACB <= dac_a_int;
+
+ u2plus_core u2p_c(.dsp_clk (dsp_clk),
.wb_clk (wb_clk),
.clock_ready (clock_ready),
- .clk_to_mac (clk_to_mac),
- .pps_in (pps_in),
+ .clk_to_mac (CLK_TO_MAC_int2),
+ .pps_in (PPS_IN),
.leds (leds_int),
.debug (debug[31:0]),
.debug_clk (debug_clk[1:0]),
- .exp_pps_in (exp_pps_in),
- .exp_pps_out (exp_pps_out),
+ .exp_pps_in (exp_time_in),
+ .exp_pps_out (exp_time_out),
.GMII_COL (GMII_COL),
.GMII_CRS (GMII_CRS),
.GMII_TXD (GMII_TXD_unreg[7:0]),
@@ -306,7 +374,6 @@ module u2plus
.MDC (MDC),
.PHY_INTn (PHY_INTn),
.PHY_RESETn (PHY_RESETn),
- .PHY_CLK (PHY_CLK),
.ser_enable (ser_enable),
.ser_prbsen (ser_prbsen),
.ser_loopen (ser_loopen),
@@ -319,22 +386,16 @@ module u2plus
.ser_r (ser_r_int[15:0]),
.ser_rklsb (ser_rklsb_int),
.ser_rkmsb (ser_rkmsb_int),
- .cpld_start (cpld_start),
- .cpld_mode (cpld_mode),
- .cpld_done (cpld_done),
- .cpld_din (cpld_din),
- .cpld_clk (cpld_clk),
- .cpld_detached (cpld_detached),
.adc_a (adc_a[13:0]),
- .adc_ovf_a (adc_ovf_a),
- .adc_on_a (adc_on_a),
- .adc_oe_a (adc_oe_a),
+ .adc_ovf_a (1'b0),
+ .adc_on_a (),
+ .adc_oe_a (),
.adc_b (adc_b[13:0]),
- .adc_ovf_b (adc_ovf_b),
- .adc_on_b (adc_on_b),
- .adc_oe_b (adc_oe_b),
- .dac_a (dac_a[15:0]),
- .dac_b (dac_b[15:0]),
+ .adc_ovf_b (1'b0),
+ .adc_on_b (),
+ .adc_oe_b (),
+ .dac_a (dac_a_int[15:0]),
+ .dac_b (dac_b_int[15:0]),
.scl_pad_i (scl_pad_i),
.scl_pad_o (scl_pad_o),
.scl_pad_oen_o (scl_pad_oen_o),
@@ -345,33 +406,45 @@ module u2plus
.clk_sel (clk_sel[1:0]),
.clk_func (clk_func),
.clk_status (clk_status),
- .sclk (sclk_int),
+ .sclk (sclk),
.mosi (mosi),
.miso (miso),
- .sen_clk (sen_clk),
- .sen_dac (sen_dac),
- .sen_tx_db (sen_tx_db),
- .sen_tx_adc (sen_tx_adc),
- .sen_tx_dac (sen_tx_dac),
- .sen_rx_db (sen_rx_db),
- .sen_rx_adc (sen_rx_adc),
- .sen_rx_dac (sen_rx_dac),
+ .sen_clk (SEN_CLK),
+ .sen_dac (SEN_DAC),
+ .sen_adc (SEN_ADC),
+ .sen_tx_db (SEN_TX_DB),
+ .sen_tx_adc (SEN_TX_ADC),
+ .sen_tx_dac (SEN_TX_DAC),
+ .sen_rx_db (SEN_RX_DB),
+ .sen_rx_adc (SEN_RX_ADC),
+ .sen_rx_dac (SEN_RX_DAC),
.io_tx (io_tx[15:0]),
.io_rx (io_rx[15:0]),
- .RAM_D (RAM_D),
+ .RAM_D_po (RAM_D_po),
+ .RAM_D_pi (RAM_D_pi),
+ .RAM_D_poe (RAM_D_poe),
.RAM_A (RAM_A),
.RAM_CE1n (RAM_CE1n),
.RAM_CENn (RAM_CENn),
- .RAM_CLK (RAM_CLK),
.RAM_WEn (RAM_WEn),
.RAM_OEn (RAM_OEn),
.RAM_LDn (RAM_LDn),
- .uart_tx_o (uart_tx_o),
- //.uart_rx_i (uart_rx_i),
- .uart_rx_i (),
+ .uart_tx_o (TXD[3:1]),
+ .uart_rx_i ({1'b1,RXD[3:1]}),
.uart_baud_o (),
.sim_mode (1'b0),
- .clock_divider (2)
+ .clock_divider (2),
+ .button (FPGA_RESET),
+ .spiflash_cs (flash_cs),
+ .spiflash_clk (flash_clk),
+ .spiflash_miso (flash_miso),
+ .spiflash_mosi (flash_mosi)
);
+
+ // Drive low so that RAM does not sleep.
+ assign RAM_ZZ = 0;
+ // Byte Writes are qualified by the global write enable
+ // Always do 36bit operations to extram.
+ assign RAM_BWn = 4'b0000;
endmodule // u2plus
diff --git a/fpga/usrp2/top/u2plus/u2plus_core.v b/fpga/usrp2/top/u2plus/u2plus_core.v
new file mode 100644
index 000000000..8426826e2
--- /dev/null
+++ b/fpga/usrp2/top/u2plus/u2plus_core.v
@@ -0,0 +1,696 @@
+// ////////////////////////////////////////////////////////////////////////////////
+// Module Name: u2_core
+// ////////////////////////////////////////////////////////////////////////////////
+
+module u2plus_core
+ (// Clocks
+ input dsp_clk,
+ input wb_clk,
+ output clock_ready,
+ input clk_to_mac,
+ input pps_in,
+
+ // Misc, debug
+ output [7:0] leds,
+ output [31:0] debug,
+ output [1:0] debug_clk,
+
+ // Expansion
+ input exp_pps_in,
+ output exp_pps_out,
+
+ // GMII
+ // GMII-CTRL
+ input GMII_COL,
+ input GMII_CRS,
+
+ // GMII-TX
+ output [7:0] GMII_TXD,
+ output GMII_TX_EN,
+ output GMII_TX_ER,
+ output GMII_GTX_CLK,
+ input GMII_TX_CLK, // 100mbps clk
+
+ // GMII-RX
+ input [7:0] GMII_RXD,
+ input GMII_RX_CLK,
+ input GMII_RX_DV,
+ input GMII_RX_ER,
+
+ // GMII-Management
+ inout MDIO,
+ output MDC,
+ input PHY_INTn, // open drain
+ output PHY_RESETn,
+
+ // SERDES
+ output ser_enable,
+ output ser_prbsen,
+ output ser_loopen,
+ output ser_rx_en,
+
+ output ser_tx_clk,
+ output [15:0] ser_t,
+ output ser_tklsb,
+ output ser_tkmsb,
+
+ input ser_rx_clk,
+ input [15:0] ser_r,
+ input ser_rklsb,
+ input ser_rkmsb,
+
+ input por,
+ output config_success,
+
+ // ADC
+ input [13:0] adc_a,
+ input adc_ovf_a,
+ output adc_on_a,
+ output adc_oe_a,
+
+ input [13:0] adc_b,
+ input adc_ovf_b,
+ output adc_on_b,
+ output adc_oe_b,
+
+ // DAC
+ output [15:0] dac_a,
+ output [15:0] dac_b,
+
+ // I2C
+ input scl_pad_i,
+ output scl_pad_o,
+ output scl_pad_oen_o,
+ input sda_pad_i,
+ output sda_pad_o,
+ output sda_pad_oen_o,
+
+ // Clock Gen Control
+ output [1:0] clk_en,
+ output [1:0] clk_sel,
+ input clk_func, // FIXME is an input to control the 9510
+ input clk_status,
+
+ // Generic SPI
+ output sclk,
+ output mosi,
+ input miso,
+ output sen_clk,
+ output sen_dac,
+ output sen_adc,
+ output sen_tx_db,
+ output sen_tx_adc,
+ output sen_tx_dac,
+ output sen_rx_db,
+ output sen_rx_adc,
+ output sen_rx_dac,
+
+ // GPIO to DBoards
+ inout [15:0] io_tx,
+ inout [15:0] io_rx,
+
+ // External RAM
+ input [35:0] RAM_D_pi,
+ output [35:0] RAM_D_po,
+ output RAM_D_poe,
+ output [20:0] RAM_A,
+ output RAM_CE1n,
+ output RAM_CENn,
+ output RAM_WEn,
+ output RAM_OEn,
+ output RAM_LDn,
+
+ // Debug stuff
+ output [3:0] uart_tx_o,
+ input [3:0] uart_rx_i,
+ output [3:0] uart_baud_o,
+ input sim_mode,
+ input [3:0] clock_divider,
+ input button,
+
+ output spiflash_cs, output spiflash_clk, input spiflash_miso, output spiflash_mosi
+ );
+
+ localparam SR_BUF_POOL = 64; // Uses 1 reg
+ localparam SR_UDP_SM = 96; // 64 regs
+ localparam SR_RX_DSP = 160; // 16
+ localparam SR_RX_CTRL = 176; // 16
+ localparam SR_TIME64 = 192; // 3
+ localparam SR_SIMTIMER = 198; // 2
+ localparam SR_TX_DSP = 208; // 16
+ localparam SR_TX_CTRL = 224; // 16
+
+ // FIFO Sizes, 9 = 512 lines, 10 = 1024, 11 = 2048
+ // all (most?) are 36 bits wide, so 9 is 1 BRAM, 10 is 2, 11 is 4 BRAMs
+ localparam DSP_TX_FIFOSIZE = 10;
+ localparam DSP_RX_FIFOSIZE = 10;
+ localparam ETH_TX_FIFOSIZE = 10;
+ localparam ETH_RX_FIFOSIZE = 11;
+ localparam SERDES_TX_FIFOSIZE = 9;
+ localparam SERDES_RX_FIFOSIZE = 9; // RX currently doesn't use a fifo?
+
+ wire [7:0] set_addr, set_addr_dsp;
+ wire [31:0] set_data, set_data_dsp;
+ wire set_stb, set_stb_dsp;
+
+ wire wb_rst, dsp_rst;
+
+ wire [31:0] status, status_b0, status_b1, status_b2, status_b3, status_b4, status_b5, status_b6, status_b7;
+ wire bus_error, spi_int, i2c_int, pps_int, onetime_int, periodic_int, buffer_int;
+ wire proc_int, overrun, underrun;
+ wire [3:0] uart_tx_int, uart_rx_int;
+
+ wire [31:0] debug_gpio_0, debug_gpio_1;
+ wire [31:0] atr_lines;
+
+ wire [31:0] debug_rx, debug_mac, debug_mac0, debug_mac1, debug_tx_dsp, debug_txc,
+ debug_serdes0, debug_serdes1, debug_serdes2, debug_rx_dsp, debug_udp;
+
+ wire [15:0] ser_rx_occ, ser_tx_occ, dsp_rx_occ, dsp_tx_occ, eth_rx_occ, eth_tx_occ, eth_rx_occ2;
+ wire ser_rx_full, ser_tx_full, dsp_rx_full, dsp_tx_full, eth_rx_full, eth_tx_full, eth_rx_full2;
+ wire ser_rx_empty, ser_tx_empty, dsp_rx_empty, dsp_tx_empty, eth_rx_empty, eth_tx_empty, eth_rx_empty2;
+
+ wire serdes_link_up;
+ wire epoch;
+ wire [31:0] irq;
+ wire [63:0] vita_time;
+ wire run_rx, run_tx;
+
+ // ///////////////////////////////////////////////////////////////////////////////////////////////
+ // Wishbone Single Master INTERCON
+ localparam dw = 32; // Data bus width
+ localparam aw = 16; // Address bus width, for byte addressibility, 16 = 64K byte memory space
+ localparam sw = 4; // Select width -- 32-bit data bus with 8-bit granularity.
+
+ wire [dw-1:0] m0_dat_o, m0_dat_i;
+ wire [dw-1:0] s0_dat_o, s1_dat_o, s0_dat_i, s1_dat_i, s2_dat_o, s3_dat_o, s2_dat_i, s3_dat_i,
+ s4_dat_o, s5_dat_o, s4_dat_i, s5_dat_i, s6_dat_o, s7_dat_o, s6_dat_i, s7_dat_i,
+ s8_dat_o, s9_dat_o, s8_dat_i, s9_dat_i, sa_dat_o, sa_dat_i, sb_dat_i, sb_dat_o,
+ sc_dat_i, sc_dat_o, sd_dat_i, sd_dat_o, se_dat_i, se_dat_o, sf_dat_i, sf_dat_o;
+ wire [aw-1:0] m0_adr,s0_adr,s1_adr,s2_adr,s3_adr,s4_adr,s5_adr,s6_adr,s7_adr,s8_adr,s9_adr,sa_adr,sb_adr,sc_adr, sd_adr, se_adr, sf_adr;
+ wire [sw-1:0] m0_sel,s0_sel,s1_sel,s2_sel,s3_sel,s4_sel,s5_sel,s6_sel,s7_sel,s8_sel,s9_sel,sa_sel,sb_sel,sc_sel, sd_sel, se_sel, sf_sel;
+ wire m0_ack,s0_ack,s1_ack,s2_ack,s3_ack,s4_ack,s5_ack,s6_ack,s7_ack,s8_ack,s9_ack,sa_ack,sb_ack,sc_ack, sd_ack, se_ack, sf_ack;
+ wire m0_stb,s0_stb,s1_stb,s2_stb,s3_stb,s4_stb,s5_stb,s6_stb,s7_stb,s8_stb,s9_stb,sa_stb,sb_stb,sc_stb, sd_stb, se_stb, sf_stb;
+ wire m0_cyc,s0_cyc,s1_cyc,s2_cyc,s3_cyc,s4_cyc,s5_cyc,s6_cyc,s7_cyc,s8_cyc,s9_cyc,sa_cyc,sb_cyc,sc_cyc, sd_cyc, se_cyc, sf_cyc;
+ wire m0_err, m0_rty;
+ wire m0_we,s0_we,s1_we,s2_we,s3_we,s4_we,s5_we,s6_we,s7_we,s8_we,s9_we,sa_we,sb_we,sc_we,sd_we,se_we,sf_we;
+
+ wb_1master #(.decode_w(8),
+ .s0_addr(8'b0000_0000),.s0_mask(8'b1110_0000), // 0-8K, Boot RAM
+ .s1_addr(8'b0100_0000),.s1_mask(8'b1100_0000), // 16K-32K, Buffer Pool
+ .s2_addr(8'b0011_0000),.s2_mask(8'b1111_1111), // SPI
+ .s3_addr(8'b0011_0001),.s3_mask(8'b1111_1111), // I2C
+ .s4_addr(8'b0011_0010),.s4_mask(8'b1111_1111), // GPIO
+ .s5_addr(8'b0011_0011),.s5_mask(8'b1111_1111), // Readback
+ .s6_addr(8'b0011_0100),.s6_mask(8'b1111_1111), // Ethernet MAC
+ .s7_addr(8'b0010_0000),.s7_mask(8'b1111_0000), // 8-12K, Settings Bus (only uses 1K)
+ .s8_addr(8'b0011_0101),.s8_mask(8'b1111_1111), // PIC
+ .s9_addr(8'b0011_0110),.s9_mask(8'b1111_1111), // Unused
+ .sa_addr(8'b0011_0111),.sa_mask(8'b1111_1111), // UART
+ .sb_addr(8'b0011_1000),.sb_mask(8'b1111_1111), // ATR
+ .sc_addr(8'b0011_1001),.sc_mask(8'b1111_1111), // Unused
+ .sd_addr(8'b0011_1010),.sd_mask(8'b1111_1111), // ICAP
+ .se_addr(8'b0011_1011),.se_mask(8'b1111_1111), // SPI Flash
+ .sf_addr(8'b1000_0000),.sf_mask(8'b1000_0000), // 32-64K, Main RAM
+ .dw(dw),.aw(aw),.sw(sw)) wb_1master
+ (.clk_i(wb_clk),.rst_i(wb_rst),
+ .m0_dat_o(m0_dat_o),.m0_ack_o(m0_ack),.m0_err_o(m0_err),.m0_rty_o(m0_rty),.m0_dat_i(m0_dat_i),
+ .m0_adr_i(m0_adr),.m0_sel_i(m0_sel),.m0_we_i(m0_we),.m0_cyc_i(m0_cyc),.m0_stb_i(m0_stb),
+ .s0_dat_o(s0_dat_o),.s0_adr_o(s0_adr),.s0_sel_o(s0_sel),.s0_we_o (s0_we),.s0_cyc_o(s0_cyc),.s0_stb_o(s0_stb),
+ .s0_dat_i(s0_dat_i),.s0_ack_i(s0_ack),.s0_err_i(0),.s0_rty_i(0),
+ .s1_dat_o(s1_dat_o),.s1_adr_o(s1_adr),.s1_sel_o(s1_sel),.s1_we_o (s1_we),.s1_cyc_o(s1_cyc),.s1_stb_o(s1_stb),
+ .s1_dat_i(s1_dat_i),.s1_ack_i(s1_ack),.s1_err_i(0),.s1_rty_i(0),
+ .s2_dat_o(s2_dat_o),.s2_adr_o(s2_adr),.s2_sel_o(s2_sel),.s2_we_o (s2_we),.s2_cyc_o(s2_cyc),.s2_stb_o(s2_stb),
+ .s2_dat_i(s2_dat_i),.s2_ack_i(s2_ack),.s2_err_i(0),.s2_rty_i(0),
+ .s3_dat_o(s3_dat_o),.s3_adr_o(s3_adr),.s3_sel_o(s3_sel),.s3_we_o (s3_we),.s3_cyc_o(s3_cyc),.s3_stb_o(s3_stb),
+ .s3_dat_i(s3_dat_i),.s3_ack_i(s3_ack),.s3_err_i(0),.s3_rty_i(0),
+ .s4_dat_o(s4_dat_o),.s4_adr_o(s4_adr),.s4_sel_o(s4_sel),.s4_we_o (s4_we),.s4_cyc_o(s4_cyc),.s4_stb_o(s4_stb),
+ .s4_dat_i(s4_dat_i),.s4_ack_i(s4_ack),.s4_err_i(0),.s4_rty_i(0),
+ .s5_dat_o(s5_dat_o),.s5_adr_o(s5_adr),.s5_sel_o(s5_sel),.s5_we_o (s5_we),.s5_cyc_o(s5_cyc),.s5_stb_o(s5_stb),
+ .s5_dat_i(s5_dat_i),.s5_ack_i(s5_ack),.s5_err_i(0),.s5_rty_i(0),
+ .s6_dat_o(s6_dat_o),.s6_adr_o(s6_adr),.s6_sel_o(s6_sel),.s6_we_o (s6_we),.s6_cyc_o(s6_cyc),.s6_stb_o(s6_stb),
+ .s6_dat_i(s6_dat_i),.s6_ack_i(s6_ack),.s6_err_i(0),.s6_rty_i(0),
+ .s7_dat_o(s7_dat_o),.s7_adr_o(s7_adr),.s7_sel_o(s7_sel),.s7_we_o (s7_we),.s7_cyc_o(s7_cyc),.s7_stb_o(s7_stb),
+ .s7_dat_i(s7_dat_i),.s7_ack_i(s7_ack),.s7_err_i(0),.s7_rty_i(0),
+ .s8_dat_o(s8_dat_o),.s8_adr_o(s8_adr),.s8_sel_o(s8_sel),.s8_we_o (s8_we),.s8_cyc_o(s8_cyc),.s8_stb_o(s8_stb),
+ .s8_dat_i(s8_dat_i),.s8_ack_i(s8_ack),.s8_err_i(0),.s8_rty_i(0),
+ .s9_dat_o(s9_dat_o),.s9_adr_o(s9_adr),.s9_sel_o(s9_sel),.s9_we_o (s9_we),.s9_cyc_o(s9_cyc),.s9_stb_o(s9_stb),
+ .s9_dat_i(s9_dat_i),.s9_ack_i(s9_ack),.s9_err_i(0),.s9_rty_i(0),
+ .sa_dat_o(sa_dat_o),.sa_adr_o(sa_adr),.sa_sel_o(sa_sel),.sa_we_o(sa_we),.sa_cyc_o(sa_cyc),.sa_stb_o(sa_stb),
+ .sa_dat_i(sa_dat_i),.sa_ack_i(sa_ack),.sa_err_i(0),.sa_rty_i(0),
+ .sb_dat_o(sb_dat_o),.sb_adr_o(sb_adr),.sb_sel_o(sb_sel),.sb_we_o(sb_we),.sb_cyc_o(sb_cyc),.sb_stb_o(sb_stb),
+ .sb_dat_i(sb_dat_i),.sb_ack_i(sb_ack),.sb_err_i(0),.sb_rty_i(0),
+ .sc_dat_o(sc_dat_o),.sc_adr_o(sc_adr),.sc_sel_o(sc_sel),.sc_we_o(sc_we),.sc_cyc_o(sc_cyc),.sc_stb_o(sc_stb),
+ .sc_dat_i(sc_dat_i),.sc_ack_i(sc_ack),.sc_err_i(0),.sc_rty_i(0),
+ .sd_dat_o(sd_dat_o),.sd_adr_o(sd_adr),.sd_sel_o(sd_sel),.sd_we_o(sd_we),.sd_cyc_o(sd_cyc),.sd_stb_o(sd_stb),
+ .sd_dat_i(sd_dat_i),.sd_ack_i(sd_ack),.sd_err_i(0),.sd_rty_i(0),
+ .se_dat_o(se_dat_o),.se_adr_o(se_adr),.se_sel_o(se_sel),.se_we_o(se_we),.se_cyc_o(se_cyc),.se_stb_o(se_stb),
+ .se_dat_i(se_dat_i),.se_ack_i(se_ack),.se_err_i(0),.se_rty_i(0),
+ .sf_dat_o(sf_dat_o),.sf_adr_o(sf_adr),.sf_sel_o(sf_sel),.sf_we_o(sf_we),.sf_cyc_o(sf_cyc),.sf_stb_o(sf_stb),
+ .sf_dat_i(sf_dat_i),.sf_ack_i(sf_ack),.sf_err_i(0),.sf_rty_i(0));
+
+ //////////////////////////////////////////////////////////////////////////////////////////
+ // Reset Controller
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Processor
+ wire [31:0] if_dat;
+ wire [15:0] if_adr;
+
+ aeMB_core_BE #(.ISIZ(16),.DSIZ(16),.MUL(0),.BSF(1))
+ aeMB (.sys_clk_i(wb_clk), .sys_rst_i(wb_rst),
+ // Instruction Wishbone bus to I-RAM
+ .if_adr(if_adr),
+ .if_dat(if_dat),
+ // Data Wishbone bus to system bus fabric
+ .dwb_we_o(m0_we),.dwb_stb_o(m0_stb),.dwb_dat_o(m0_dat_i),.dwb_adr_o(m0_adr),
+ .dwb_dat_i(m0_dat_o),.dwb_ack_i(m0_ack),.dwb_sel_o(m0_sel),.dwb_cyc_o(m0_cyc),
+ // Interrupts and exceptions
+ .sys_int_i(proc_int),.sys_exc_i(bus_error) );
+
+ assign bus_error = m0_err | m0_rty;
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Dual Ported Boot RAM -- D-Port is Slave #0 on main Wishbone
+ // Dual Ported Main RAM -- D-Port is Slave #F on main Wishbone
+ // I-port connects directly to processor
+
+ wire [31:0] if_dat_boot, if_dat_main;
+ assign if_dat = if_adr[15] ? if_dat_main : if_dat_boot;
+
+ bootram bootram(.clk(wb_clk), .reset(wb_rst),
+ .if_adr(if_adr[12:0]), .if_data(if_dat_boot),
+ .dwb_adr_i(s0_adr[12:0]), .dwb_dat_i(s0_dat_o), .dwb_dat_o(s0_dat_i),
+ .dwb_we_i(s0_we), .dwb_ack_o(s0_ack), .dwb_stb_i(s0_stb), .dwb_sel_i(s0_sel));
+
+////blinkenlights v0.1
+//defparam bootram.RAM0.INIT_00=256'hbc32fff0_aa43502b_b00000fe_30630001_80000000_10600000_a48500ff_10a00000;
+//defparam bootram.RAM0.INIT_01=256'ha48500ff_b810ffd0_f880200c_30a50001_10830000_308000ff_be23000c_a4640001;
+
+`include "bootloader.rmi"
+
+ ram_harvard2 #(.AWIDTH(15),.RAM_SIZE(32768))
+ sys_ram(.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),
+ .if_adr(if_adr[14:0]), .if_data(if_dat_main),
+ .dwb_adr_i(sf_adr[14:0]), .dwb_dat_i(sf_dat_o), .dwb_dat_o(sf_dat_i),
+ .dwb_we_i(sf_we), .dwb_ack_o(sf_ack), .dwb_stb_i(sf_stb), .dwb_sel_i(sf_sel));
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Buffer Pool, slave #1
+ wire rd0_ready_i, rd0_ready_o;
+ wire rd1_ready_i, rd1_ready_o;
+ wire rd2_ready_i, rd2_ready_o;
+ wire rd3_ready_i, rd3_ready_o;
+ wire [3:0] rd0_flags, rd1_flags, rd2_flags, rd3_flags;
+ wire [31:0] rd0_dat, rd1_dat, rd2_dat, rd3_dat;
+
+ wire wr0_ready_i, wr0_ready_o;
+ wire wr1_ready_i, wr1_ready_o;
+ wire wr2_ready_i, wr2_ready_o;
+ wire wr3_ready_i, wr3_ready_o;
+ wire [3:0] wr0_flags, wr1_flags, wr2_flags, wr3_flags;
+ wire [31:0] wr0_dat, wr1_dat, wr2_dat, wr3_dat;
+
+ buffer_pool #(.BUF_SIZE(9), .SET_ADDR(SR_BUF_POOL)) buffer_pool
+ (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),
+ .wb_we_i(s1_we),.wb_stb_i(s1_stb),.wb_adr_i(s1_adr),.wb_dat_i(s1_dat_o),
+ .wb_dat_o(s1_dat_i),.wb_ack_o(s1_ack),.wb_err_o(),.wb_rty_o(),
+
+ .stream_clk(dsp_clk), .stream_rst(dsp_rst),
+ .set_stb(set_stb_dsp), .set_addr(set_addr_dsp), .set_data(set_data_dsp),
+ .status(status),.sys_int_o(buffer_int),
+
+ .s0(status_b0),.s1(status_b1),.s2(status_b2),.s3(status_b3),
+ .s4(status_b4),.s5(status_b5),.s6(status_b6),.s7(status_b7),
+
+ // Write Interfaces
+ .wr0_data_i(wr0_dat), .wr0_flags_i(wr0_flags), .wr0_ready_i(wr0_ready_i), .wr0_ready_o(wr0_ready_o),
+ .wr1_data_i(wr1_dat), .wr1_flags_i(wr1_flags), .wr1_ready_i(wr1_ready_i), .wr1_ready_o(wr1_ready_o),
+ .wr2_data_i(wr2_dat), .wr2_flags_i(wr2_flags), .wr2_ready_i(wr2_ready_i), .wr2_ready_o(wr2_ready_o),
+ .wr3_data_i(wr3_dat), .wr3_flags_i(wr3_flags), .wr3_ready_i(wr3_ready_i), .wr3_ready_o(wr3_ready_o),
+ // Read Interfaces
+ .rd0_data_o(rd0_dat), .rd0_flags_o(rd0_flags), .rd0_ready_i(rd0_ready_i), .rd0_ready_o(rd0_ready_o),
+ .rd1_data_o(rd1_dat), .rd1_flags_o(rd1_flags), .rd1_ready_i(rd1_ready_i), .rd1_ready_o(rd1_ready_o),
+ .rd2_data_o(rd2_dat), .rd2_flags_o(rd2_flags), .rd2_ready_i(rd2_ready_i), .rd2_ready_o(rd2_ready_o),
+ .rd3_data_o(rd3_dat), .rd3_flags_o(rd3_flags), .rd3_ready_i(rd3_ready_i), .rd3_ready_o(rd3_ready_o)
+ );
+
+ wire [31:0] status_enc;
+ priority_enc priority_enc (.in({16'b0,status[15:0]}), .out(status_enc));
+
+ // /////////////////////////////////////////////////////////////////////////
+ // SPI -- Slave #2
+ spi_top shared_spi
+ (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),.wb_adr_i(s2_adr[4:0]),.wb_dat_i(s2_dat_o),
+ .wb_dat_o(s2_dat_i),.wb_sel_i(s2_sel),.wb_we_i(s2_we),.wb_stb_i(s2_stb),
+ .wb_cyc_i(s2_cyc),.wb_ack_o(s2_ack),.wb_err_o(),.wb_int_o(spi_int),
+ .ss_pad_o({sen_adc, sen_tx_db,sen_tx_adc,sen_tx_dac,sen_rx_db,sen_rx_adc,sen_rx_dac,sen_dac,sen_clk}),
+ .sclk_pad_o(sclk),.mosi_pad_o(mosi),.miso_pad_i(miso) );
+
+ // /////////////////////////////////////////////////////////////////////////
+ // I2C -- Slave #3
+ i2c_master_top #(.ARST_LVL(1))
+ i2c (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),.arst_i(1'b0),
+ .wb_adr_i(s3_adr[4:2]),.wb_dat_i(s3_dat_o[7:0]),.wb_dat_o(s3_dat_i[7:0]),
+ .wb_we_i(s3_we),.wb_stb_i(s3_stb),.wb_cyc_i(s3_cyc),
+ .wb_ack_o(s3_ack),.wb_inta_o(i2c_int),
+ .scl_pad_i(scl_pad_i),.scl_pad_o(scl_pad_o),.scl_padoen_o(scl_pad_oen_o),
+ .sda_pad_i(sda_pad_i),.sda_pad_o(sda_pad_o),.sda_padoen_o(sda_pad_oen_o) );
+
+ assign s3_dat_i[31:8] = 24'd0;
+
+ // /////////////////////////////////////////////////////////////////////////
+ // GPIOs -- Slave #4
+ nsgpio nsgpio(.clk_i(wb_clk),.rst_i(wb_rst),
+ .cyc_i(s4_cyc),.stb_i(s4_stb),.adr_i(s4_adr[3:0]),.we_i(s4_we),
+ .dat_i(s4_dat_o),.dat_o(s4_dat_i),.ack_o(s4_ack),
+ .atr(atr_lines),.debug_0(debug_gpio_0),.debug_1(debug_gpio_1),
+ .gpio({io_tx,io_rx}) );
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Buffer Pool Status -- Slave #5
+
+ reg [31:0] cycle_count;
+ always @(posedge wb_clk)
+ if(wb_rst)
+ cycle_count <= 0;
+ else
+ cycle_count <= cycle_count + 1;
+
+ //compatibility number -> increment when the fpga has been sufficiently altered
+ localparam compat_num = 32'd3;
+
+ wb_readback_mux buff_pool_status
+ (.wb_clk_i(wb_clk), .wb_rst_i(wb_rst), .wb_stb_i(s5_stb),
+ .wb_adr_i(s5_adr), .wb_dat_o(s5_dat_i), .wb_ack_o(s5_ack),
+
+ .word00(status_b0),.word01(status_b1),.word02(status_b2),.word03(status_b3),
+ .word04(status_b4),.word05(status_b5),.word06(status_b6),.word07(status_b7),
+ .word08(status),.word09({sim_mode,27'b0,clock_divider[3:0]}),.word10(vita_time[63:32]),
+ .word11(vita_time[31:0]),.word12(compat_num),.word13(irq),.word14(status_enc),.word15(cycle_count)
+ );
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Ethernet MAC Slave #6
+
+ wire [18:0] rx_f19_data, tx_f19_data;
+ wire rx_f19_src_rdy, rx_f19_dst_rdy, rx_f36_src_rdy, rx_f36_dst_rdy;
+
+ simple_gemac_wrapper19 #(.RXFIFOSIZE(11), .TXFIFOSIZE(6)) simple_gemac_wrapper19
+ (.clk125(clk_to_mac), .reset(wb_rst),
+ .GMII_GTX_CLK(GMII_GTX_CLK), .GMII_TX_EN(GMII_TX_EN),
+ .GMII_TX_ER(GMII_TX_ER), .GMII_TXD(GMII_TXD),
+ .GMII_RX_CLK(GMII_RX_CLK), .GMII_RX_DV(GMII_RX_DV),
+ .GMII_RX_ER(GMII_RX_ER), .GMII_RXD(GMII_RXD),
+ .sys_clk(dsp_clk),
+ .rx_f19_data(rx_f19_data), .rx_f19_src_rdy(rx_f19_src_rdy), .rx_f19_dst_rdy(rx_f19_dst_rdy),
+ .tx_f19_data(tx_f19_data), .tx_f19_src_rdy(tx_f19_src_rdy), .tx_f19_dst_rdy(tx_f19_dst_rdy),
+ .wb_clk(wb_clk), .wb_rst(wb_rst), .wb_stb(s6_stb), .wb_cyc(s6_cyc), .wb_ack(s6_ack),
+ .wb_we(s6_we), .wb_adr(s6_adr), .wb_dat_i(s6_dat_o), .wb_dat_o(s6_dat_i),
+ .mdio(MDIO), .mdc(MDC),
+ .debug(debug_mac));
+
+ wire [35:0] udp_tx_data, udp_rx_data;
+ wire udp_tx_src_rdy, udp_tx_dst_rdy, udp_rx_src_rdy, udp_rx_dst_rdy;
+
+ udp_wrapper #(.BASE(SR_UDP_SM)) udp_wrapper
+ (.clk(dsp_clk), .reset(dsp_rst), .clear(0),
+ .set_stb(set_stb_dsp), .set_addr(set_addr_dsp), .set_data(set_data_dsp),
+ .rx_f19_data(rx_f19_data), .rx_f19_src_rdy_i(rx_f19_src_rdy), .rx_f19_dst_rdy_o(rx_f19_dst_rdy),
+ .tx_f19_data(tx_f19_data), .tx_f19_src_rdy_o(tx_f19_src_rdy), .tx_f19_dst_rdy_i(tx_f19_dst_rdy),
+ .rx_f36_data(udp_rx_data), .rx_f36_src_rdy_o(udp_rx_src_rdy), .rx_f36_dst_rdy_i(udp_rx_dst_rdy),
+ .tx_f36_data(udp_tx_data), .tx_f36_src_rdy_i(udp_tx_src_rdy), .tx_f36_dst_rdy_o(udp_tx_dst_rdy),
+ .debug(debug_udp) );
+
+ wire [35:0] tx_err_data, udp1_tx_data;
+ wire tx_err_src_rdy, tx_err_dst_rdy, udp1_tx_src_rdy, udp1_tx_dst_rdy;
+
+ fifo_cascade #(.WIDTH(36), .SIZE(ETH_TX_FIFOSIZE)) tx_eth_fifo
+ (.clk(dsp_clk), .reset(dsp_rst), .clear(0),
+ .datain({rd2_flags,rd2_dat}), .src_rdy_i(rd2_ready_o), .dst_rdy_o(rd2_ready_i),
+ .dataout(udp1_tx_data), .src_rdy_o(udp1_tx_src_rdy), .dst_rdy_i(udp1_tx_dst_rdy));
+
+ fifo36_mux #(.prio(0)) mux_err_stream
+ (.clk(dsp_clk), .reset(dsp_reset), .clear(0),
+ .data0_i(udp1_tx_data), .src0_rdy_i(udp1_tx_src_rdy), .dst0_rdy_o(udp1_tx_dst_rdy),
+ .data1_i(tx_err_data), .src1_rdy_i(tx_err_src_rdy), .dst1_rdy_o(tx_err_dst_rdy),
+ .data_o(udp_tx_data), .src_rdy_o(udp_tx_src_rdy), .dst_rdy_i(udp_tx_dst_rdy));
+
+ fifo_cascade #(.WIDTH(36), .SIZE(ETH_RX_FIFOSIZE)) rx_eth_fifo
+ (.clk(dsp_clk), .reset(dsp_rst), .clear(0),
+ .datain(udp_rx_data), .src_rdy_i(udp_rx_src_rdy), .dst_rdy_o(udp_rx_dst_rdy),
+ .dataout({wr2_flags,wr2_dat}), .src_rdy_o(wr2_ready_i), .dst_rdy_i(wr2_ready_o));
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Settings Bus -- Slave #7
+ settings_bus settings_bus
+ (.wb_clk(wb_clk),.wb_rst(wb_rst),.wb_adr_i(s7_adr),.wb_dat_i(s7_dat_o),
+ .wb_stb_i(s7_stb),.wb_we_i(s7_we),.wb_ack_o(s7_ack),
+ .strobe(set_stb),.addr(set_addr),.data(set_data));
+
+ assign s7_dat_i = 32'd0;
+
+ settings_bus_crossclock settings_bus_crossclock
+ (.clk_i(wb_clk), .rst_i(wb_rst), .set_stb_i(set_stb), .set_addr_i(set_addr), .set_data_i(set_data),
+ .clk_o(dsp_clk), .rst_o(dsp_rst), .set_stb_o(set_stb_dsp), .set_addr_o(set_addr_dsp), .set_data_o(set_data_dsp));
+
+ // Output control lines
+ wire [7:0] clock_outs, serdes_outs, adc_outs;
+ assign {clock_ready, clk_en[1:0], clk_sel[1:0]} = clock_outs[4:0];
+ assign {ser_enable, ser_prbsen, ser_loopen, ser_rx_en} = serdes_outs[3:0];
+ assign {adc_oe_a, adc_on_a, adc_oe_b, adc_on_b } = adc_outs[3:0];
+
+ wire phy_reset;
+ assign PHY_RESETn = ~phy_reset;
+
+ setting_reg #(.my_addr(0),.width(8)) sr_clk (.clk(wb_clk),.rst(wb_rst),.strobe(s7_ack),.addr(set_addr),
+ .in(set_data),.out(clock_outs),.changed());
+ setting_reg #(.my_addr(1),.width(8)) sr_ser (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr),
+ .in(set_data),.out(serdes_outs),.changed());
+ setting_reg #(.my_addr(2),.width(8)) sr_adc (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr),
+ .in(set_data),.out(adc_outs),.changed());
+ setting_reg #(.my_addr(4),.width(1)) sr_phy (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr),
+ .in(set_data),.out(phy_reset),.changed());
+
+ // /////////////////////////////////////////////////////////////////////////
+ // LEDS
+ // register 8 determines whether leds are controlled by SW or not
+ // 1 = controlled by HW, 0 = by SW
+ // In Rev3 there are only 6 leds, and the highest one is on the ETH connector
+
+ wire [7:0] led_src, led_sw;
+ wire [7:0] led_hw = {run_tx, run_rx, clk_status, serdes_link_up, 1'b0};
+
+ setting_reg #(.my_addr(3),.width(8)) sr_led (.clk(wb_clk),.rst(wb_rst),.strobe(set_stb),.addr(set_addr),
+ .in(set_data),.out(led_sw),.changed());
+
+ setting_reg #(.my_addr(8),.width(8), .at_reset(8'b0001_1110))
+ sr_led_src (.clk(wb_clk),.rst(wb_rst), .strobe(set_stb),.addr(set_addr), .in(set_data),.out(led_src),.changed());
+
+ assign leds = (led_src & led_hw) | (~led_src & led_sw);
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Interrupt Controller, Slave #8
+
+ // Pass interrupts on dsp_clk to wb_clk. These need edge triggering in the pic
+ wire underrun_wb, overrun_wb, pps_wb;
+
+ oneshot_2clk underrun_1s (.clk_in(dsp_clk), .in(underrun), .clk_out(wb_clk), .out(underrun_wb));
+ oneshot_2clk overrun_1s (.clk_in(dsp_clk), .in(overrun), .clk_out(wb_clk), .out(overrun_wb));
+ oneshot_2clk pps_1s (.clk_in(dsp_clk), .in(pps_int), .clk_out(wb_clk), .out(pps_wb));
+
+ assign irq= {{8'b0},
+ {uart_tx_int[3:0], uart_rx_int[3:0]},
+ {2'b0, button, periodic_int, clk_status, serdes_link_up, 2'b00},
+ {pps_wb,overrun_wb,underrun_wb,PHY_INTn,i2c_int,spi_int,onetime_int,buffer_int}};
+
+ pic pic(.clk_i(wb_clk),.rst_i(wb_rst),.cyc_i(s8_cyc),.stb_i(s8_stb),.adr_i(s8_adr[4:2]),
+ .we_i(s8_we),.dat_i(s8_dat_o),.dat_o(s8_dat_i),.ack_o(s8_ack),.int_o(proc_int),
+ .irq(irq) );
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Master Timer, Slave #9
+
+ // No longer used, replaced with simple_timer below
+ assign s9_ack = 0;
+
+ // /////////////////////////////////////////////////////////////////////////
+ // Simple Timer interrupts
+
+ simple_timer #(.BASE(SR_SIMTIMER)) simple_timer
+ (.clk(wb_clk), .reset(wb_rst),
+ .set_stb(set_stb), .set_addr(set_addr), .set_data(set_data),
+ .onetime_int(onetime_int), .periodic_int(periodic_int));
+
+ // /////////////////////////////////////////////////////////////////////////
+ // UART, Slave #10
+
+ quad_uart #(.TXDEPTH(3),.RXDEPTH(3)) uart // depth of 3 is 128 entries
+ (.clk_i(wb_clk),.rst_i(wb_rst),
+ .we_i(sa_we),.stb_i(sa_stb),.cyc_i(sa_cyc),.ack_o(sa_ack),
+ .adr_i(sa_adr[6:2]),.dat_i(sa_dat_o),.dat_o(sa_dat_i),
+ .rx_int_o(uart_rx_int),.tx_int_o(uart_tx_int),
+ .tx_o(uart_tx_o),.rx_i(uart_rx_i),.baud_o(uart_baud_o));
+
+ // /////////////////////////////////////////////////////////////////////////
+ // ATR Controller, Slave #11
+
+ reg run_rx_d1;
+ always @(posedge dsp_clk)
+ run_rx_d1 <= run_rx;
+
+ atr_controller atr_controller
+ (.clk_i(wb_clk),.rst_i(wb_rst),
+ .adr_i(sb_adr[5:0]),.sel_i(sb_sel),.dat_i(sb_dat_o),.dat_o(sb_dat_i),
+ .we_i(sb_we),.stb_i(sb_stb),.cyc_i(sb_cyc),.ack_o(sb_ack),
+ .run_rx(run_rx_d1),.run_tx(run_tx),.ctrl_lines(atr_lines) );
+
+ // //////////////////////////////////////////////////////////////////////////
+ // Time Sync, Slave #12
+
+ // No longer used, see time_64bit. Still need to handle mimo time, though
+ assign sc_ack = 0;
+
+ // /////////////////////////////////////////////////////////////////////////
+ // ICAP for reprogramming the FPGA, Slave #13 (D)
+
+ s3a_icap_wb s3a_icap_wb
+ (.clk(wb_clk), .reset(wb_rst), .cyc_i(sd_cyc), .stb_i(sd_stb),
+ .we_i(sd_we), .ack_o(sd_ack), .dat_i(sd_dat_o), .dat_o(sd_dat_i));
+
+ // /////////////////////////////////////////////////////////////////////////
+ // SPI for Flash -- Slave #14 (E)
+ spi_top flash_spi
+ (.wb_clk_i(wb_clk),.wb_rst_i(wb_rst),.wb_adr_i(se_adr[4:0]),.wb_dat_i(se_dat_o),
+ .wb_dat_o(se_dat_i),.wb_sel_i(se_sel),.wb_we_i(se_we),.wb_stb_i(se_stb),
+ .wb_cyc_i(se_cyc),.wb_ack_o(se_ack),.wb_err_o(se_err),.wb_int_o(spiflash_int),
+ .ss_pad_o(spiflash_cs),
+ .sclk_pad_o(spiflash_clk),.mosi_pad_o(spiflash_mosi),.miso_pad_i(spiflash_miso) );
+
+ // /////////////////////////////////////////////////////////////////////////
+ // DSP RX
+ wire [31:0] sample_rx, sample_tx;
+ wire strobe_rx, strobe_tx;
+ wire rx_dst_rdy, rx_src_rdy, rx1_dst_rdy, rx1_src_rdy;
+ wire [99:0] rx_data;
+ wire [35:0] rx1_data;
+
+ dsp_core_rx #(.BASE(SR_RX_DSP)) dsp_core_rx
+ (.clk(dsp_clk),.rst(dsp_rst),
+ .set_stb(set_stb_dsp),.set_addr(set_addr_dsp),.set_data(set_data_dsp),
+ .adc_a(adc_a),.adc_ovf_a(adc_ovf_a),.adc_b(adc_b),.adc_ovf_b(adc_ovf_b),
+ .sample(sample_rx), .run(run_rx_d1), .strobe(strobe_rx),
+ .debug(debug_rx_dsp) );
+
+ wire [31:0] vrc_debug;
+ wire clear_rx;
+
+ setting_reg #(.my_addr(SR_RX_CTRL+3)) sr_clear
+ (.clk(dsp_clk),.rst(dsp_rst),
+ .strobe(set_stb_dsp),.addr(set_addr_dsp),.in(set_data_dsp),
+ .out(),.changed(clear_rx));
+
+ vita_rx_control #(.BASE(SR_RX_CTRL), .WIDTH(32)) vita_rx_control
+ (.clk(dsp_clk), .reset(dsp_rst), .clear(clear_rx),
+ .set_stb(set_stb_dsp),.set_addr(set_addr_dsp),.set_data(set_data_dsp),
+ .vita_time(vita_time), .overrun(overrun),
+ .sample(sample_rx), .run(run_rx), .strobe(strobe_rx),
+ .sample_fifo_o(rx_data), .sample_fifo_dst_rdy_i(rx_dst_rdy), .sample_fifo_src_rdy_o(rx_src_rdy),
+ .debug_rx(vrc_debug));
+
+ wire [3:0] vita_state;
+
+ vita_rx_framer #(.BASE(SR_RX_CTRL), .MAXCHAN(1)) vita_rx_framer
+ (.clk(dsp_clk), .reset(dsp_rst), .clear(clear_rx),
+ .set_stb(set_stb_dsp),.set_addr(set_addr_dsp),.set_data(set_data_dsp),
+ .sample_fifo_i(rx_data), .sample_fifo_dst_rdy_o(rx_dst_rdy), .sample_fifo_src_rdy_i(rx_src_rdy),
+ .data_o(rx1_data), .dst_rdy_i(rx1_dst_rdy), .src_rdy_o(rx1_src_rdy),
+ .fifo_occupied(), .fifo_full(), .fifo_empty(),
+ .debug_rx(vita_state) );
+
+ fifo_cascade #(.WIDTH(36), .SIZE(DSP_RX_FIFOSIZE)) rx_fifo_cascade
+ (.clk(dsp_clk), .reset(dsp_rst), .clear(clear_rx),
+ .datain(rx1_data), .src_rdy_i(rx1_src_rdy), .dst_rdy_o(rx1_dst_rdy),
+ .dataout({wr1_flags,wr1_dat}), .src_rdy_o(wr1_ready_i), .dst_rdy_i(wr1_ready_o));
+
+ // ///////////////////////////////////////////////////////////////////////////////////
+ // DSP TX
+
+ wire [35:0] tx_data;
+ wire tx_src_rdy, tx_dst_rdy;
+ wire [31:0] debug_vt;
+ wire clear_tx;
+
+ setting_reg #(.my_addr(SR_TX_CTRL+1)) sr_clear_tx
+ (.clk(clk),.rst(rst),.strobe(set_stb),.addr(set_addr),
+ .in(set_data),.out(),.changed(clear_tx));
+
+ assign RAM_A[20:18] = 3'b0;
+
+ ext_fifo #(.EXT_WIDTH(36),.INT_WIDTH(36),.RAM_DEPTH(18),.FIFO_DEPTH(18))
+ ext_fifo_i1
+ (.int_clk(dsp_clk),
+ .ext_clk(dsp_clk),
+ .rst(dsp_rst | clear_tx),
+ .RAM_D_pi(RAM_D_pi),
+ .RAM_D_po(RAM_D_po),
+ .RAM_D_poe(RAM_D_poe),
+ .RAM_A(RAM_A[17:0]),
+ .RAM_WEn(RAM_WEn),
+ .RAM_CENn(RAM_CENn),
+ .RAM_LDn(RAM_LDn),
+ .RAM_OEn(RAM_OEn),
+ .RAM_CE1n(RAM_CE1n),
+ .datain({rd1_flags[3:2],rd1_dat[31:16],rd1_flags[1:0],rd1_dat[15:0]}),
+ .src_rdy_i(rd1_ready_o),
+ .dst_rdy_o(rd1_ready_i),
+ .dataout({tx_data[35:34],tx_data[31:16],tx_data[33:32],tx_data[15:0]}),
+ .src_rdy_o(tx_src_rdy),
+ .dst_rdy_i(tx_dst_rdy),
+ .debug(debug_extfifo),
+ .debug2(debug_extfifo2) );
+
+ vita_tx_chain #(.BASE_CTRL(SR_TX_CTRL), .BASE_DSP(SR_TX_DSP),
+ .REPORT_ERROR(1), .DO_FLOW_CONTROL(1),
+ .PROT_ENG_FLAGS(1), .USE_TRANS_HEADER(1))
+ vita_tx_chain
+ (.clk(dsp_clk), .reset(dsp_rst),
+ .set_stb(set_stb_dsp),.set_addr(set_addr_dsp),.set_data(set_data_dsp),
+ .vita_time(vita_time),
+ .tx_data_i(tx_data), .tx_src_rdy_i(tx_src_rdy), .tx_dst_rdy_o(tx_dst_rdy),
+ .err_data_o(tx_err_data), .err_src_rdy_o(tx_err_src_rdy), .err_dst_rdy_i(tx_err_dst_rdy),
+ .dac_a(dac_a),.dac_b(dac_b),
+ .underrun(underrun), .run(run_tx),
+ .debug(debug_vt));
+
+ assign dsp_rst = wb_rst;
+
+ // ///////////////////////////////////////////////////////////////////////////////////
+ // SERDES
+
+ serdes #(.TXFIFOSIZE(SERDES_TX_FIFOSIZE),.RXFIFOSIZE(SERDES_RX_FIFOSIZE)) serdes
+ (.clk(dsp_clk),.rst(dsp_rst),
+ .ser_tx_clk(ser_tx_clk),.ser_t(ser_t),.ser_tklsb(ser_tklsb),.ser_tkmsb(ser_tkmsb),
+ .rd_dat_i(rd0_dat),.rd_flags_i(rd0_flags),.rd_ready_o(rd0_ready_i),.rd_ready_i(rd0_ready_o),
+ .ser_rx_clk(ser_rx_clk),.ser_r(ser_r),.ser_rklsb(ser_rklsb),.ser_rkmsb(ser_rkmsb),
+ .wr_dat_o(wr0_dat),.wr_flags_o(wr0_flags),.wr_ready_o(wr0_ready_i),.wr_ready_i(wr0_ready_o),
+ .tx_occupied(ser_tx_occ),.tx_full(ser_tx_full),.tx_empty(ser_tx_empty),
+ .rx_occupied(ser_rx_occ),.rx_full(ser_rx_full),.rx_empty(ser_rx_empty),
+ .serdes_link_up(serdes_link_up),.debug0(debug_serdes0), .debug1(debug_serdes1) );
+
+ // /////////////////////////////////////////////////////////////////////////
+ // VITA Timing
+
+ time_64bit #(.TICKS_PER_SEC(32'd100000000),.BASE(SR_TIME64)) time_64bit
+ (.clk(dsp_clk), .rst(dsp_rst), .set_stb(set_stb_dsp), .set_addr(set_addr_dsp), .set_data(set_data_dsp),
+ .pps(pps_in), .vita_time(vita_time), .pps_int(pps_int));
+
+ // /////////////////////////////////////////////////////////////////////////////////////////
+ // Debug Pins
+
+ assign debug_clk = 2'b00; // {dsp_clk, clk_to_mac};
+ assign debug = 32'd0; // debug_extfifo;
+ assign debug_gpio_0 = 32'd0;
+ assign debug_gpio_1 = 32'd0;
+
+endmodule // u2_core
diff --git a/fpga/usrp2/vrt/Makefile.srcs b/fpga/usrp2/vrt/Makefile.srcs
index dc4bd8c96..aa1356d82 100644
--- a/fpga/usrp2/vrt/Makefile.srcs
+++ b/fpga/usrp2/vrt/Makefile.srcs
@@ -12,4 +12,5 @@ vita_tx_control.v \
vita_tx_deframer.v \
vita_tx_chain.v \
gen_context_pkt.v \
+trigger_context_pkt.v \
))
diff --git a/fpga/usrp2/vrt/gen_context_pkt.v b/fpga/usrp2/vrt/gen_context_pkt.v
index 780a027ba..bf83aeae5 100644
--- a/fpga/usrp2/vrt/gen_context_pkt.v
+++ b/fpga/usrp2/vrt/gen_context_pkt.v
@@ -7,6 +7,7 @@ module gen_context_pkt
input [31:0] streamid,
input [63:0] vita_time,
input [31:0] message,
+ input [31:0] seqnum,
output [35:0] data_o, output src_rdy_o, input dst_rdy_i);
localparam CTXT_IDLE = 0;
@@ -17,17 +18,32 @@ module gen_context_pkt
localparam CTXT_TICS = 5;
localparam CTXT_TICS2 = 6;
localparam CTXT_MESSAGE = 7;
- localparam CTXT_DONE = 8;
+ localparam CTXT_FLOWCTRL = 8;
+ localparam CTXT_DONE = 9;
reg [33:0] data_int;
wire src_rdy_int, dst_rdy_int;
- wire [3:0] seqno = 0;
+ reg [3:0] seqno;
reg [3:0] ctxt_state;
reg [63:0] err_time;
+ reg [31:0] stored_message;
always @(posedge clk)
if(reset | clear)
- ctxt_state <= CTXT_IDLE;
+ stored_message <= 0;
+ else
+ if(trigger)
+ stored_message <= message;
+ else if(ctxt_state == CTXT_DONE)
+ stored_message <= 0;
+
+ // Don't want to clear most of this to avoid getting stuck with a half packet in the pipe
+ always @(posedge clk)
+ if(reset)
+ begin
+ ctxt_state <= CTXT_IDLE;
+ seqno <= 0;
+ end
else
case(ctxt_state)
CTXT_IDLE :
@@ -41,9 +57,10 @@ module gen_context_pkt
end
CTXT_DONE :
- if(~trigger)
- ctxt_state <= CTXT_IDLE;
-
+ begin
+ ctxt_state <= CTXT_IDLE;
+ seqno <= seqno + 4'd1;
+ end
default :
if(dst_rdy_int)
ctxt_state <= ctxt_state + 1;
@@ -53,18 +70,19 @@ module gen_context_pkt
always @*
case(ctxt_state)
- CTXT_PROT_ENG : data_int <= { 2'b01, 16'd1, 16'd24 };
- CTXT_HEADER : data_int <= { 1'b0, (PROT_ENG_FLAGS ? 1'b0 : 1'b1), 12'b010100001101, seqno, 16'd6 };
+ CTXT_PROT_ENG : data_int <= { 2'b01, 16'd1, 16'd32 };
+ CTXT_HEADER : data_int <= { 1'b0, (PROT_ENG_FLAGS ? 1'b0 : 1'b1), 12'b010100001101, seqno, 16'd7 };
CTXT_STREAMID : data_int <= { 2'b00, streamid };
CTXT_SECS : data_int <= { 2'b00, err_time[63:32] };
CTXT_TICS : data_int <= { 2'b00, 32'd0 };
CTXT_TICS2 : data_int <= { 2'b00, err_time[31:0] };
- CTXT_MESSAGE : data_int <= { 2'b10, message };
+ CTXT_MESSAGE : data_int <= { 2'b00, message };
+ CTXT_FLOWCTRL : data_int <= { 2'b10, seqnum };
default : data_int <= {2'b00, 32'b00};
endcase // case (ctxt_state)
fifo_short #(.WIDTH(34)) ctxt_fifo
- (.clk(clk), .reset(reset), .clear(clear),
+ (.clk(clk), .reset(reset), .clear(0),
.datain(data_int), .src_rdy_i(src_rdy_int), .dst_rdy_o(dst_rdy_int),
.dataout(data_o[33:0]), .src_rdy_o(src_rdy_o), .dst_rdy_i(dst_rdy_i));
assign data_o[35:34] = 2'b00;
diff --git a/fpga/usrp2/vrt/trigger_context_pkt.v b/fpga/usrp2/vrt/trigger_context_pkt.v
new file mode 100644
index 000000000..226ec45f2
--- /dev/null
+++ b/fpga/usrp2/vrt/trigger_context_pkt.v
@@ -0,0 +1,52 @@
+
+
+module trigger_context_pkt
+ #(parameter BASE=0)
+ (input clk, input reset, input clear,
+ input set_stb, input [7:0] set_addr, input [31:0] set_data,
+ input packet_consumed, output reg trigger);
+
+ wire [23:0] cycles;
+ wire [15:0] packets;
+ wire [6:0] dummy1;
+ wire [14:0] dummy2;
+ wire enable_timed, enable_consumed;
+ reg [30:0] cycle_count, packet_count;
+
+
+ setting_reg #(.my_addr(BASE+4), .at_reset(0)) sr_cycles
+ (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),
+ .in(set_data),.out({enable_cycle,dummy1,cycles}),.changed());
+
+ setting_reg #(.my_addr(BASE+5), .at_reset(0)) sr_packets
+ (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),
+ .in(set_data),.out({enable_consumed,dummy2,packets}),.changed());
+
+ always @(posedge clk)
+ if(reset | clear)
+ cycle_count <= 0;
+ else
+ if(trigger)
+ cycle_count <= 0;
+ else if(enable_cycle)
+ cycle_count <= cycle_count + 1;
+
+ always @(posedge clk)
+ if(reset | clear)
+ packet_count <= 0;
+ else
+ if(trigger)
+ packet_count <= 0;
+ else if(packet_consumed & enable_consumed)
+ packet_count <= packet_count + 1;
+
+ always @(posedge clk)
+ if(reset | clear)
+ trigger <= 0;
+ else
+ if((cycle_count > cycles)|(packet_count > packets))
+ trigger <= 1;
+ else
+ trigger <= 0;
+
+endmodule // trigger_context_pkt
diff --git a/fpga/usrp2/vrt/vita_rx_control.v b/fpga/usrp2/vrt/vita_rx_control.v
index 93673d292..0769f3a24 100644
--- a/fpga/usrp2/vrt/vita_rx_control.v
+++ b/fpga/usrp2/vrt/vita_rx_control.v
@@ -9,7 +9,7 @@ module vita_rx_control
output overrun,
// To vita_rx_framer
- output [4+64+WIDTH-1:0] sample_fifo_o,
+ output [5+64+WIDTH-1:0] sample_fifo_o,
output sample_fifo_src_rdy_o,
input sample_fifo_dst_rdy_i,
@@ -25,16 +25,14 @@ module vita_rx_control
wire [63:0] new_time;
wire [31:0] new_command;
- wire sc_pre1, clear_int, clear_reg;
+ wire sc_pre1;
- assign clear_int = clear | clear_reg;
-
wire [63:0] rcvtime_pre;
reg [63:0] rcvtime;
wire [28:0] numlines_pre;
wire send_imm_pre, chain_pre, reload_pre;
reg send_imm, chain, reload;
- wire full_ctrl, read_ctrl, empty_ctrl, write_ctrl;
+ wire read_ctrl, not_empty_ctrl, write_ctrl;
reg sc_pre2;
wire [33:0] fifo_line;
reg [28:0] lines_left, lines_total;
@@ -54,21 +52,22 @@ module vita_rx_control
(.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),
.in(set_data),.out(new_time[31:0]),.changed(sc_pre1));
- setting_reg #(.my_addr(BASE+3)) sr_clear
- (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),
- .in(set_data),.out(),.changed(clear_reg));
-
// FIFO to store commands sent from the settings bus
always @(posedge clk)
- sc_pre2 <= sc_pre1;
+ if(reset | clear)
+ sc_pre2 <= 0;
+ else
+ sc_pre2 <= sc_pre1;
+
assign write_ctrl = sc_pre1 & ~sc_pre2;
wire [4:0] command_queue_len;
- shortfifo #(.WIDTH(96)) commandfifo
- (.clk(clk),.rst(reset),.clear(clear_int),
- .datain({new_command,new_time}), .write(write_ctrl&~full_ctrl), .full(full_ctrl),
+
+ fifo_short #(.WIDTH(96)) commandfifo
+ (.clk(clk),.reset(reset),.clear(clear),
+ .datain({new_command,new_time}), .src_rdy_i(write_ctrl), .dst_rdy_o(),
.dataout({send_imm_pre,chain_pre,reload_pre,numlines_pre,rcvtime_pre}),
- .read(read_ctrl), .empty(empty_ctrl),
+ .src_rdy_o(not_empty_ctrl), .dst_rdy_i(read_ctrl),
.occupied(command_queue_len), .space() );
reg [33:0] pkt_fifo_line;
@@ -79,20 +78,23 @@ module vita_rx_control
localparam IBS_OVERRUN = 4;
localparam IBS_BROKENCHAIN = 5;
localparam IBS_LATECMD = 6;
-
- wire signal_cmd_done = (lines_left == 1) & (~chain | (~empty_ctrl & (numlines_pre==0)));
+ localparam IBS_ZEROLEN = 7;
+
+ wire signal_cmd_done = (lines_left == 1) & (~chain | (not_empty_ctrl & (numlines_pre==0)));
wire signal_overrun = (ibs_state == IBS_OVERRUN);
wire signal_brokenchain = (ibs_state == IBS_BROKENCHAIN);
wire signal_latecmd = (ibs_state == IBS_LATECMD);
+ wire signal_zerolen = (ibs_state == IBS_ZEROLEN);
// Buffer of samples for while we're writing the packet headers
- wire [3:0] flags = {signal_overrun,signal_brokenchain,signal_latecmd,signal_cmd_done};
+ wire [4:0] flags = {signal_zerolen,signal_overrun,signal_brokenchain,signal_latecmd,signal_cmd_done};
wire attempt_sample_write = ((run & strobe) | (ibs_state==IBS_OVERRUN) |
- (ibs_state==IBS_BROKENCHAIN) | (ibs_state==IBS_LATECMD));
+ (ibs_state==IBS_BROKENCHAIN) | (ibs_state==IBS_LATECMD) |
+ (ibs_state==IBS_ZEROLEN));
- fifo_short #(.WIDTH(4+64+WIDTH)) rx_sample_fifo
- (.clk(clk),.reset(reset),.clear(clear_int),
+ fifo_short #(.WIDTH(5+64+WIDTH)) rx_sample_fifo
+ (.clk(clk),.reset(reset),.clear(clear),
.datain({flags,vita_time,sample}), .src_rdy_i(attempt_sample_write), .dst_rdy_o(sample_fifo_in_rdy),
.dataout(sample_fifo_o),
.src_rdy_o(sample_fifo_src_rdy_o), .dst_rdy_i(sample_fifo_dst_rdy_i),
@@ -107,7 +109,7 @@ module vita_rx_control
wire full = ~sample_fifo_in_rdy;
always @(posedge clk)
- if(reset | clear_int)
+ if(reset | clear)
begin
ibs_state <= IBS_IDLE;
lines_left <= 0;
@@ -120,12 +122,15 @@ module vita_rx_control
else
case(ibs_state)
IBS_IDLE :
- if(~empty_ctrl)
+ if(not_empty_ctrl)
begin
lines_left <= numlines_pre;
lines_total <= numlines_pre;
rcvtime <= rcvtime_pre;
- ibs_state <= IBS_WAITING;
+ if(numlines_pre == 0)
+ ibs_state <= IBS_ZEROLEN;
+ else
+ ibs_state <= IBS_WAITING;
send_imm <= send_imm_pre;
chain <= chain_pre;
reload <= reload_pre;
@@ -145,12 +150,12 @@ module vita_rx_control
if(lines_left == 1)
if(~chain)
ibs_state <= IBS_IDLE;
- else if(empty_ctrl & reload)
+ else if(~not_empty_ctrl & reload)
begin
ibs_state <= IBS_RUNNING;
lines_left <= lines_total;
end
- else if(empty_ctrl)
+ else if(~not_empty_ctrl)
ibs_state <= IBS_BROKENCHAIN;
else
begin
@@ -175,17 +180,20 @@ module vita_rx_control
IBS_BROKENCHAIN :
if(sample_fifo_in_rdy)
ibs_state <= IBS_IDLE;
+ IBS_ZEROLEN :
+ if(sample_fifo_in_rdy)
+ ibs_state <= IBS_IDLE;
endcase // case(ibs_state)
assign overrun = (ibs_state == IBS_OVERRUN);
assign run = (ibs_state == IBS_RUNNING);
assign read_ctrl = ( (ibs_state == IBS_IDLE) | ((ibs_state == IBS_RUNNING) & strobe & ~full & (lines_left==1) & chain) )
- & ~empty_ctrl;
+ & not_empty_ctrl;
assign debug_rx = { { ibs_state[2:0], command_queue_len },
{ 8'd0 },
- { go_now, too_late, run, strobe, read_ctrl, write_ctrl, full_ctrl, empty_ctrl },
+ { go_now, too_late, run, strobe, read_ctrl, write_ctrl, 1'b0, ~not_empty_ctrl },
{ 2'b0, overrun, chain_pre, sample_fifo_in_rdy, attempt_sample_write, sample_fifo_src_rdy_o,sample_fifo_dst_rdy_i} };
endmodule // rx_control
diff --git a/fpga/usrp2/vrt/vita_rx_framer.v b/fpga/usrp2/vrt/vita_rx_framer.v
index 235817941..bce8fe334 100644
--- a/fpga/usrp2/vrt/vita_rx_framer.v
+++ b/fpga/usrp2/vrt/vita_rx_framer.v
@@ -11,7 +11,7 @@ module vita_rx_framer
output src_rdy_o,
// From vita_rx_control
- input [4+64+(32*MAXCHAN)-1:0] sample_fifo_i,
+ input [5+64+(32*MAXCHAN)-1:0] sample_fifo_i,
input sample_fifo_src_rdy_i,
output sample_fifo_dst_rdy_o,
@@ -23,11 +23,11 @@ module vita_rx_framer
output [31:0] debug_rx
);
- localparam SAMP_WIDTH = 4+64+(32*MAXCHAN);
+ localparam SAMP_WIDTH = 5+64+(32*MAXCHAN);
reg [3:0] sample_phase;
wire [3:0] numchan;
- wire [3:0] flags_fifo_o = sample_fifo_i[SAMP_WIDTH-1:SAMP_WIDTH-4];
- wire [63:0] vita_time_fifo_o = sample_fifo_i[SAMP_WIDTH-5:SAMP_WIDTH-68];
+ wire [4:0] flags_fifo_o = sample_fifo_i[SAMP_WIDTH-1:SAMP_WIDTH-5];
+ wire [63:0] vita_time_fifo_o = sample_fifo_i[SAMP_WIDTH-6:SAMP_WIDTH-69];
reg [31:0] data_fifo_o;
@@ -55,14 +55,7 @@ module vita_rx_framer
reg [3:0] pkt_count;
wire [15:0] vita_pkt_len = samples_per_packet + 6;
- //wire [3:0] flags = {signal_overrun,signal_brokenchain,signal_latecmd,signal_cmd_done};
-
- wire clear_reg;
- wire clear_int = clear | clear_reg;
-
- setting_reg #(.my_addr(BASE+3)) sr_clear
- (.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),
- .in(set_data),.out(),.changed(clear_reg));
+ //wire [4:0] flags = {signal_zerolen,signal_overrun,signal_brokenchain,signal_latecmd,signal_cmd_done};
setting_reg #(.my_addr(BASE+4)) sr_header
(.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),
@@ -76,11 +69,11 @@ module vita_rx_framer
(.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),
.in(set_data),.out(vita_trailer),.changed());
- setting_reg #(.my_addr(BASE+7)) sr_samples_per_pkt
+ setting_reg #(.my_addr(BASE+7),.width(16)) sr_samples_per_pkt
(.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),
.in(set_data),.out(samples_per_packet),.changed());
- setting_reg #(.my_addr(BASE+8), .at_reset(1)) sr_numchan
+ setting_reg #(.my_addr(BASE+8),.width(4), .at_reset(1)) sr_numchan
(.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),
.in(set_data),.out(numchan),.changed());
@@ -102,7 +95,7 @@ module vita_rx_framer
localparam VITA_ERR_TRAILER = 15; // Extension context packets have no trailer
always @(posedge clk)
- if(reset | clear_pkt_count)
+ if(reset | clear | clear_pkt_count)
pkt_count <= 0;
else if((vita_state == VITA_TRAILER) & pkt_fifo_rdy)
pkt_count <= pkt_count + 1;
@@ -114,7 +107,8 @@ module vita_rx_framer
always @*
case(vita_state)
// Data packets are IF Data packets with or w/o streamid, no classid, with trailer
- VITA_HEADER : pkt_fifo_line <= {2'b01,3'b000,vita_header[28],2'b01,vita_header[25:20],pkt_count,vita_pkt_len};
+ VITA_HEADER : pkt_fifo_line <= {2'b01,3'b000,vita_header[28],2'b01,vita_header[25:24],
+ vita_header[23:20],pkt_count[3:0],vita_pkt_len[15:0]};
VITA_STREAMID : pkt_fifo_line <= {2'b00,vita_streamid};
VITA_SECS : pkt_fifo_line <= {2'b00,vita_time_fifo_o[63:32]};
VITA_TICS : pkt_fifo_line <= {2'b00,32'd0};
@@ -128,14 +122,14 @@ module vita_rx_framer
VITA_ERR_SECS : pkt_fifo_line <= {2'b00,vita_time_fifo_o[63:32]};
VITA_ERR_TICS : pkt_fifo_line <= {2'b00,32'd0};
VITA_ERR_TICS2 : pkt_fifo_line <= {2'b00,vita_time_fifo_o[31:0]};
- VITA_ERR_PAYLOAD : pkt_fifo_line <= {2'b10,28'd0,flags_fifo_o};
+ VITA_ERR_PAYLOAD : pkt_fifo_line <= {2'b10,27'd0,flags_fifo_o};
//VITA_ERR_TRAILER : pkt_fifo_line <= {2'b11,vita_trailer};
default : pkt_fifo_line <= 34'h0_FFFF_FFFF;
endcase // case (vita_state)
always @(posedge clk)
- if(reset)
+ if(reset | clear)
begin
vita_state <= VITA_IDLE;
sample_ctr <= 0;
@@ -147,7 +141,7 @@ module vita_rx_framer
sample_ctr <= 1;
sample_phase <= 0;
if(sample_fifo_src_rdy_i)
- if(|flags_fifo_o[3:1])
+ if(|flags_fifo_o[4:1])
vita_state <= VITA_ERR_HEADER;
else
vita_state <= VITA_HEADER;
@@ -192,7 +186,7 @@ module vita_rx_framer
req_write_pkt_fifo <= 1;
VITA_PAYLOAD :
// Write if sample ready and no error flags
- req_write_pkt_fifo <= (sample_fifo_src_rdy_i & ~|flags_fifo_o[3:1]);
+ req_write_pkt_fifo <= (sample_fifo_src_rdy_i & ~|flags_fifo_o[4:1]);
VITA_ERR_HEADER, VITA_ERR_STREAMID, VITA_ERR_SECS, VITA_ERR_TICS, VITA_ERR_TICS2, VITA_ERR_PAYLOAD :
req_write_pkt_fifo <= 1;
default :
@@ -203,7 +197,7 @@ module vita_rx_framer
// Short FIFO to buffer between us and the FIFOs outside
fifo_short #(.WIDTH(34)) rx_pkt_fifo
- (.clk(clk), .reset(reset), .clear(clear_int),
+ (.clk(clk), .reset(reset), .clear(clear),
.datain(pkt_fifo_line), .src_rdy_i(req_write_pkt_fifo), .dst_rdy_o(pkt_fifo_rdy),
.dataout(data_o[33:0]), .src_rdy_o(src_rdy_o), .dst_rdy_i(dst_rdy_i),
.space(),.occupied(fifo_occupied[4:0]) );
@@ -212,7 +206,7 @@ module vita_rx_framer
assign sample_fifo_dst_rdy_o = pkt_fifo_rdy &
( ((vita_state==VITA_PAYLOAD) &
(sample_phase == (numchan-4'd1)) &
- ~|flags_fifo_o[3:1]) |
+ ~|flags_fifo_o[4:1]) |
(vita_state==VITA_ERR_PAYLOAD));
assign debug_rx = vita_state;
diff --git a/fpga/usrp2/vrt/vita_rx_tb.v b/fpga/usrp2/vrt/vita_rx_tb.v
index 3e01e2ee2..023934f39 100644
--- a/fpga/usrp2/vrt/vita_rx_tb.v
+++ b/fpga/usrp2/vrt/vita_rx_tb.v
@@ -37,7 +37,7 @@ module vita_rx_tb;
wire sample_dst_rdy, sample_src_rdy;
//wire [99:0] sample_data_o;
- wire [64+4+(MAXCHAN*32)-1:0] sample_data_o;
+ wire [64+5+(MAXCHAN*32)-1:0] sample_data_o;
vita_rx_control #(.BASE(0), .WIDTH(32*MAXCHAN)) vita_rx_control
(.clk(clk), .reset(reset), .clear(0),
@@ -92,58 +92,68 @@ module vita_rx_tb;
begin
@(negedge reset);
@(posedge clk);
- write_setting(4,32'hDEADBEEF); // VITA header
+ write_setting(4,32'h15F00000); // VITA header
write_setting(5,32'hF00D1234); // VITA streamid
- write_setting(6,32'hF0000000); // VITA trailer
+ write_setting(6,32'hE0000000); // VITA trailer
write_setting(7,8); // Samples per VITA packet
- write_setting(8,NUMCHAN); // Samples per VITA packet
- queue_rx_cmd(1,0,8,32'h0,32'h0); // send imm, single packet
- queue_rx_cmd(1,0,16,32'h0,32'h0); // send imm, 2 packets worth
- queue_rx_cmd(1,0,7,32'h0,32'h0); // send imm, 1 short packet worth
- queue_rx_cmd(1,0,9,32'h0,32'h0); // send imm, just longer than 1 packet
+ write_setting(8,NUMCHAN); // Vector length
+
+ queue_rx_cmd(1,1,0,10,32'h0,32'h0); // send imm, single packet
+ #10000;
+
+ queue_rx_cmd(1,0,0,0,32'h0,32'h0); // send imm, single packet
+ //queue_rx_cmd(1,1,0,0,32'h0,32'h0); // send imm, single packet
+
+ //queue_rx_cmd(1,0,0,0,32'h0,32'h0); // send imm, single packet
+
+ /*
+ queue_rx_cmd(1,0,0,8,32'h0,32'h0); // send imm, single packet
+ queue_rx_cmd(1,0,0,16,32'h0,32'h0); // send imm, 2 packets worth
+ queue_rx_cmd(1,0,0,7,32'h0,32'h0); // send imm, 1 short packet worth
+ queue_rx_cmd(1,0,0,9,32'h0,32'h0); // send imm, just longer than 1 packet
- queue_rx_cmd(1,1,16,32'h0,32'h0); // chained
- queue_rx_cmd(0,0,8,32'h0,32'h0); // 2nd in chain
+ queue_rx_cmd(1,1,0,16,32'h0,32'h0); // chained
+ queue_rx_cmd(0,0,0,8,32'h0,32'h0); // 2nd in chain
- queue_rx_cmd(1,1,17,32'h0,32'h0); // chained, odd length
- queue_rx_cmd(0,0,9,32'h0,32'h0); // 2nd in chain, also odd length
+ queue_rx_cmd(1,1,0,17,32'h0,32'h0); // chained, odd length
+ queue_rx_cmd(0,0,0,9,32'h0,32'h0); // 2nd in chain, also odd length
- queue_rx_cmd(0,0,8,32'h0,32'h340); // send at, on time
- queue_rx_cmd(0,0,8,32'h0,32'h100); // send at, but late
+ queue_rx_cmd(0,0,0,8,32'h0,32'h340); // send at, on time
+ queue_rx_cmd(0,0,0,8,32'h0,32'h100); // send at, but late
#100000;
$display("\nChained, break chain\n");
- queue_rx_cmd(1,1,8,32'h0,32'h0); // chained, but break chain
+ queue_rx_cmd(1,1,0,8,32'h0,32'h0); // chained, but break chain
#100000;
$display("\nSingle packet\n");
- queue_rx_cmd(1,0,8,32'h0,32'h0); // send imm, single packet
+ queue_rx_cmd(1,0,0,8,32'h0,32'h0); // send imm, single packet
#100000;
$display("\nEnd chain with zero samples, shouldn't error\n");
- queue_rx_cmd(1,1,8,32'h0,32'h0); // chained
- queue_rx_cmd(0,0,0,32'h0,32'h0); // end chain with zero samples, should keep us out of error
+ queue_rx_cmd(1,1,0,8,32'h0,32'h0); // chained
+ queue_rx_cmd(0,0,0,0,32'h0,32'h0); // end chain with zero samples, should keep us out of error
#100000;
$display("\nEnd chain with zero samples on odd-length, shouldn't error\n");
- queue_rx_cmd(1,1,14,32'h0,32'h0); // chained
- queue_rx_cmd(0,0,0,32'h0,32'h0); // end chain with zero samples, should keep us out of error
+ queue_rx_cmd(1,1,0,14,32'h0,32'h0); // chained
+ queue_rx_cmd(0,0,0,0,32'h0,32'h0); // end chain with zero samples, should keep us out of error
#100000;
$display("Should have gotten 14 samples and EOF by now\n");
- queue_rx_cmd(1,1,9,32'h0,32'h0); // chained, but break chain, odd length
+ queue_rx_cmd(1,1,0,9,32'h0,32'h0); // chained, but break chain, odd length
#100000;
dst_rdy <= 0; // stop pulling out of fifo so we can get an overrun
- queue_rx_cmd(1,0,100,32'h0,32'h0); // long enough to fill the fifos
- queue_rx_cmd(1,0,5,32'h0,32'h0); // this command waits until the previous error packet is sent
+ queue_rx_cmd(1,0,0,100,32'h0,32'h0); // long enough to fill the fifos
+ queue_rx_cmd(1,0,0,5,32'h0,32'h0); // this command waits until the previous error packet is sent
#100000;
dst_rdy <= 1; // restart the reads so we can see what we got
#100000;
dst_rdy <= 0; // stop pulling out of fifo so we can get an overrun
- queue_rx_cmd(1,1,100,32'h0,32'h0); // long enough to fill the fifos
- //queue_rx_cmd(1,0,5,32'h0,32'h0); // this command waits until the previous error packet is sent
+ queue_rx_cmd(1,1,0,100,32'h0,32'h0); // long enough to fill the fifos
+ //queue_rx_cmd(1,0,0,5,32'h0,32'h0); // this command waits until the previous error packet is sent
#100000;
@(posedge clk);
dst_rdy <= 1;
-
+ */
#100000 $finish;
end
@@ -164,11 +174,12 @@ module vita_rx_tb;
task queue_rx_cmd;
input send_imm;
input chain;
- input [29:0] lines;
+ input reload;
+ input [28:0] lines;
input [31:0] secs;
input [31:0] tics;
begin
- write_setting(0,{send_imm,chain,lines});
+ write_setting(0,{send_imm,chain,reload,lines});
write_setting(1,secs);
write_setting(2,tics);
end
diff --git a/fpga/usrp2/vrt/vita_tx.build b/fpga/usrp2/vrt/vita_tx.build
index 902929c08..e7106aa10 100755
--- a/fpga/usrp2/vrt/vita_tx.build
+++ b/fpga/usrp2/vrt/vita_tx.build
@@ -1 +1 @@
-iverilog -Wimplict -Wportbind -y ../sdr_lib -y ../models -y . -y ../control_lib/ -y ../control_lib/newfifo -y ../coregen -y /opt/Xilinx/10.1/ISE/verilog/src/XilinxCoreLib -y /opt/Xilinx/10.1/ISE/verilog/src/unisims/ -y ../timing -o vita_tx_tb vita_tx_tb.v
+iverilog -Wimplict -Wportbind -y ../sdr_lib -y ../models -y . -y ../control_lib/ -y ../fifo -y ../coregen -y /opt/Xilinx/10.1/ISE/verilog/src/XilinxCoreLib -y /opt/Xilinx/10.1/ISE/verilog/src/unisims/ -y ../timing -o vita_tx_tb vita_tx_tb.v
diff --git a/fpga/usrp2/vrt/vita_tx_chain.v b/fpga/usrp2/vrt/vita_tx_chain.v
index 662cdca62..2ec78189b 100644
--- a/fpga/usrp2/vrt/vita_tx_chain.v
+++ b/fpga/usrp2/vrt/vita_tx_chain.v
@@ -3,7 +3,9 @@ module vita_tx_chain
#(parameter BASE_CTRL=0,
parameter BASE_DSP=0,
parameter REPORT_ERROR=0,
- parameter PROT_ENG_FLAGS=0)
+ parameter DO_FLOW_CONTROL=0,
+ parameter PROT_ENG_FLAGS=0,
+ parameter USE_TRANS_HEADER=0)
(input clk, input reset,
input set_stb, input [7:0] set_addr, input [31:0] set_data,
input [63:0] vita_time,
@@ -24,30 +26,39 @@ module vita_tx_chain
wire trigger, sent;
wire [31:0] debug_vtc, debug_vtd, debug_tx_dsp;
- wire error;
+ wire error, packet_consumed;
wire [31:0] error_code;
wire clear_seqnum;
+ wire [31:0] current_seqnum;
assign underrun = error;
assign message = error_code;
-
+
+ setting_reg #(.my_addr(BASE_CTRL+1)) sr
+ (.clk(clk),.rst(rst),.strobe(set_stb),.addr(set_addr),
+ .in(set_data),.out(),.changed(clear_vita));
+
setting_reg #(.my_addr(BASE_CTRL+2), .at_reset(0)) sr_streamid
(.clk(clk),.rst(reset),.strobe(set_stb),.addr(set_addr),
.in(set_data),.out(streamid),.changed(clear_seqnum));
- vita_tx_deframer #(.BASE(BASE_CTRL), .MAXCHAN(MAXCHAN)) vita_tx_deframer
+ vita_tx_deframer #(.BASE(BASE_CTRL),
+ .MAXCHAN(MAXCHAN),
+ .USE_TRANS_HEADER(USE_TRANS_HEADER))
+ vita_tx_deframer
(.clk(clk), .reset(reset), .clear(clear_vita), .clear_seqnum(clear_seqnum),
.set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
.data_i(tx_data_i), .src_rdy_i(tx_src_rdy_i), .dst_rdy_o(tx_dst_rdy_o),
.sample_fifo_o(tx1_data), .sample_fifo_src_rdy_o(tx1_src_rdy), .sample_fifo_dst_rdy_i(tx1_dst_rdy),
+ .current_seqnum(current_seqnum),
.debug(debug_vtd) );
vita_tx_control #(.BASE(BASE_CTRL), .WIDTH(32*MAXCHAN)) vita_tx_control
(.clk(clk), .reset(reset), .clear(clear_vita),
.set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
- .vita_time(vita_time),.error(error),.error_code(error_code),
+ .vita_time(vita_time), .error(error), .ack(ack), .error_code(error_code),
.sample_fifo_i(tx1_data), .sample_fifo_src_rdy_i(tx1_src_rdy), .sample_fifo_dst_rdy_o(tx1_dst_rdy),
- .sample(sample_tx), .run(run), .strobe(strobe_tx),
+ .sample(sample_tx), .run(run), .strobe(strobe_tx), .packet_consumed(packet_consumed),
.debug(debug_vtc) );
dsp_core_tx #(.BASE(BASE_DSP)) dsp_core_tx
@@ -57,15 +68,33 @@ module vita_tx_chain
.dac_a(dac_a),.dac_b(dac_b),
.debug(debug_tx_dsp) );
- generate
- if(REPORT_ERROR==1)
- gen_context_pkt #(.PROT_ENG_FLAGS(PROT_ENG_FLAGS)) gen_tx_err_pkt
- (.clk(clk), .reset(reset), .clear(clear_vita),
- .trigger(error), .sent(),
- .streamid(streamid), .vita_time(vita_time), .message(message),
- .data_o(err_data_o), .src_rdy_o(err_src_rdy_o), .dst_rdy_i(err_dst_rdy_i));
- endgenerate
+ wire [35:0] flow_data, err_data_int;
+ wire flow_src_rdy, flow_dst_rdy, err_src_rdy_int, err_dst_rdy_int;
+ gen_context_pkt #(.PROT_ENG_FLAGS(PROT_ENG_FLAGS)) gen_flow_pkt
+ (.clk(clk), .reset(reset), .clear(clear_vita),
+ .trigger(trigger & (DO_FLOW_CONTROL==1)), .sent(),
+ .streamid(streamid), .vita_time(vita_time), .message(32'd0),
+ .seqnum(current_seqnum),
+ .data_o(flow_data), .src_rdy_o(flow_src_rdy), .dst_rdy_i(flow_dst_rdy));
+ trigger_context_pkt #(.BASE(BASE_CTRL)) trigger_context_pkt
+ (.clk(clk), .reset(reset), .clear(clear_vita),
+ .set_stb(set_stb),.set_addr(set_addr),.set_data(set_data),
+ .packet_consumed(packet_consumed), .trigger(trigger));
+
+ gen_context_pkt #(.PROT_ENG_FLAGS(PROT_ENG_FLAGS)) gen_tx_err_pkt
+ (.clk(clk), .reset(reset), .clear(clear_vita),
+ .trigger((error|ack) & (REPORT_ERROR==1)), .sent(),
+ .streamid(streamid), .vita_time(vita_time), .message(message),
+ .seqnum(current_seqnum),
+ .data_o(err_data_int), .src_rdy_o(err_src_rdy_int), .dst_rdy_i(err_dst_rdy_int));
+
assign debug = debug_vtc | debug_vtd;
+ fifo36_mux #(.prio(1)) mux_err_and_flow // Priority to err messages
+ (.clk(clk), .reset(reset), .clear(0), // Don't clear this or it could get clogged
+ .data0_i(err_data_int), .src0_rdy_i(err_src_rdy_int), .dst0_rdy_o(err_dst_rdy_int),
+ .data1_i(flow_data), .src1_rdy_i(flow_src_rdy), .dst1_rdy_o(flow_dst_rdy),
+ .data_o(err_data_o), .src_rdy_o(err_src_rdy_o), .dst_rdy_i(err_dst_rdy_i));
+
endmodule // vita_tx_chain
diff --git a/fpga/usrp2/vrt/vita_tx_control.v b/fpga/usrp2/vrt/vita_tx_control.v
index d0516bec8..20ad6b995 100644
--- a/fpga/usrp2/vrt/vita_tx_control.v
+++ b/fpga/usrp2/vrt/vita_tx_control.v
@@ -6,9 +6,10 @@ module vita_tx_control
input set_stb, input [7:0] set_addr, input [31:0] set_data,
input [63:0] vita_time,
- output error,
+ output error, output ack,
output reg [31:0] error_code,
-
+ output reg packet_consumed,
+
// From vita_tx_deframer
input [5+64+16+WIDTH-1:0] sample_fifo_i,
input sample_fifo_src_rdy_i,
@@ -37,9 +38,8 @@ module vita_tx_control
// FIXME ignore too_early for now for timing reasons
assign too_early = 0;
time_compare
- time_compare (.time_now(vita_time), .trigger_time(send_time), .now(now), .early(early),
- .late(late), .too_early());
-// .late(late), .too_early(too_early));
+ time_compare (.time_now(vita_time), .trigger_time(send_time),
+ .now(now), .early(early), .late(late), .too_early());
localparam IBS_IDLE = 0;
localparam IBS_RUN = 1; // FIXME do we need this?
@@ -48,6 +48,7 @@ module vita_tx_control
localparam IBS_ERROR_DONE = 4;
localparam IBS_ERROR_WAIT = 5;
+ wire [31:0] CODE_EOB_ACK = {seqnum,16'd1};
wire [31:0] CODE_UNDERRUN = {seqnum,16'd2};
wire [31:0] CODE_SEQ_ERROR = {seqnum,16'd4};
wire [31:0] CODE_TIME_ERROR = {seqnum,16'd8};
@@ -56,11 +57,6 @@ module vita_tx_control
reg [2:0] ibs_state;
- wire clear_state;
- setting_reg #(.my_addr(BASE+1)) sr
- (.clk(clk),.rst(rst),.strobe(set_stb),.addr(set_addr),
- .in(set_data),.out(),.changed(clear_state));
-
wire [31:0] error_policy;
setting_reg #(.my_addr(BASE+3)) sr_error_policy
(.clk(clk),.rst(rst),.strobe(set_stb),.addr(set_addr),
@@ -69,13 +65,15 @@ module vita_tx_control
wire policy_wait = error_policy[0];
wire policy_next_packet = error_policy[1];
wire policy_next_burst = error_policy[2];
- reg send_error;
+ reg send_error, send_ack;
always @(posedge clk)
- if(reset | clear_state)
+ if(reset | clear)
begin
ibs_state <= IBS_IDLE;
send_error <= 0;
+ send_ack <= 0;
+ error_code <= 0;
end
else
case(ibs_state)
@@ -106,7 +104,11 @@ module vita_tx_control
end
else if(eop)
if(eob)
- ibs_state <= IBS_IDLE;
+ begin
+ ibs_state <= IBS_ERROR_DONE; // Not really an error
+ error_code <= CODE_EOB_ACK;
+ send_ack <= 1;
+ end
else
ibs_state <= IBS_CONT_BURST;
@@ -145,6 +147,7 @@ module vita_tx_control
IBS_ERROR_DONE :
begin
send_error <= 0;
+ send_ack <= 0;
ibs_state <= IBS_IDLE;
end
@@ -154,10 +157,16 @@ module vita_tx_control
assign sample_fifo_dst_rdy_o = (ibs_state == IBS_ERROR) | (strobe & (ibs_state == IBS_RUN)); // FIXME also cleanout
assign run = (ibs_state == IBS_RUN) | (ibs_state == IBS_CONT_BURST);
- //assign error = (ibs_state == IBS_ERROR_DONE);
assign error = send_error;
+ assign ack = send_ack;
- assign debug = { { now,early,late,too_early,eop,eob,sob,send_at },
+ always @(posedge clk)
+ if(reset | clear)
+ packet_consumed <= 0;
+ else
+ packet_consumed <= eop & sample_fifo_src_rdy_i & sample_fifo_dst_rdy_o;
+
+ assign debug = { { now,early,late,ack,eop,eob,sob,send_at },
{ sample_fifo_src_rdy_i, sample_fifo_dst_rdy_o, strobe, run, error, ibs_state[2:0] },
{ 8'b0 },
{ 8'b0 } };
diff --git a/fpga/usrp2/vrt/vita_tx_deframer.v b/fpga/usrp2/vrt/vita_tx_deframer.v
index f9cd7d00d..eb39feaec 100644
--- a/fpga/usrp2/vrt/vita_tx_deframer.v
+++ b/fpga/usrp2/vrt/vita_tx_deframer.v
@@ -1,7 +1,8 @@
module vita_tx_deframer
#(parameter BASE=0,
- parameter MAXCHAN=1)
+ parameter MAXCHAN=1,
+ parameter USE_TRANS_HEADER=0)
(input clk, input reset, input clear, input clear_seqnum,
input set_stb, input [7:0] set_addr, input [31:0] set_data,
@@ -13,6 +14,8 @@ module vita_tx_deframer
output [5+64+16+(32*MAXCHAN)-1:0] sample_fifo_o,
output sample_fifo_src_rdy_o,
input sample_fifo_dst_rdy_i,
+
+ output [31:0] current_seqnum,
// FIFO Levels
output [15:0] fifo_occupied,
@@ -45,58 +48,80 @@ module vita_tx_deframer
reg [1:0] vector_phase;
wire line_done;
- reg seqnum_err;
- reg [3:0] seqnum_reg;
- wire [3:0] seqnum = data_i[19:16];
- wire [3:0] next_seqnum = seqnum_reg + 4'd1;
+ wire [31:0] seqnum = data_i;
+ reg [31:0] seqnum_reg;
+ wire [31:0] next_seqnum = seqnum_reg + 32'd1;
+ wire [3:0] vita_seqnum = data_i[19:16];
+ reg [3:0] vita_seqnum_reg;
+ wire [3:0] next_vita_seqnum = vita_seqnum_reg[3:0] + 4'd1;
+ reg seqnum_err;
+
+ assign current_seqnum = seqnum_reg;
// Output FIFO for packetized data
- localparam VITA_HEADER = 0;
- localparam VITA_STREAMID = 1;
- localparam VITA_CLASSID = 2;
- localparam VITA_CLASSID2 = 3;
- localparam VITA_SECS = 4;
- localparam VITA_TICS = 5;
- localparam VITA_TICS2 = 6;
- localparam VITA_PAYLOAD = 7;
- localparam VITA_STORE = 8;
- localparam VITA_TRAILER = 9;
-
+ localparam VITA_TRANS_HEADER = 0;
+ localparam VITA_HEADER = 1;
+ localparam VITA_STREAMID = 2;
+ localparam VITA_CLASSID = 3;
+ localparam VITA_CLASSID2 = 4;
+ localparam VITA_SECS = 5;
+ localparam VITA_TICS = 6;
+ localparam VITA_TICS2 = 7;
+ localparam VITA_PAYLOAD = 8;
+ localparam VITA_STORE = 9;
+ localparam VITA_TRAILER = 10;
+ localparam VITA_DUMP = 11;
+
wire [15:0] hdr_len = 2 + has_streamid_reg + has_classid_reg + has_classid_reg + has_secs_reg +
has_tics_reg + has_tics_reg + has_trailer_reg;
- wire eop = eof | (pkt_len==hdr_len); // FIXME would ignoring eof allow larger VITA packets?
+ wire vita_eof = (pkt_len==hdr_len);
+ wire eop = eof | vita_eof; // FIXME would ignoring eof allow larger VITA packets?
wire fifo_space;
always @(posedge clk)
- if(reset | clear_seqnum)
- seqnum_reg <= 4'hF;
+ if(reset | clear | clear_seqnum)
+ begin
+ seqnum_reg <= 32'hFFFF_FFFF;
+ vita_seqnum_reg <= 4'hF;
+ end
else
- if((vita_state==VITA_HEADER) & src_rdy_i)
- seqnum_reg <= seqnum;
+ begin
+ if((vita_state==VITA_TRANS_HEADER) & src_rdy_i)
+ seqnum_reg <= seqnum;
+ if((vita_state==VITA_HEADER) & src_rdy_i)
+ vita_seqnum_reg <= vita_seqnum;
+ end // else: !if(reset | clear_seqnum)
always @(posedge clk)
if(reset | clear)
begin
- vita_state <= VITA_HEADER;
+ vita_state <= (USE_TRANS_HEADER==1) ? VITA_TRANS_HEADER : VITA_HEADER;
{has_streamid_reg, has_classid_reg, has_secs_reg, has_tics_reg, has_trailer_reg, is_sob_reg, is_eob_reg}
<= 0;
seqnum_err <= 0;
end
else
if((vita_state == VITA_STORE) & fifo_space)
- if(eop)
- if(has_trailer_reg)
+ if(vita_eof)
+ if(eof)
+ vita_state <= (USE_TRANS_HEADER==1) ? VITA_TRANS_HEADER : VITA_HEADER;
+ else if(has_trailer_reg)
vita_state <= VITA_TRAILER;
else
- vita_state <= VITA_HEADER;
- else
+ vita_state <= VITA_DUMP;
+ else
begin
vita_state <= VITA_PAYLOAD;
pkt_len <= pkt_len - 1;
end
else if(src_rdy_i)
case(vita_state)
+ VITA_TRANS_HEADER :
+ begin
+ seqnum_err <= ~(seqnum == next_seqnum);
+ vita_state <= VITA_HEADER;
+ end
VITA_HEADER :
begin
{has_streamid_reg, has_classid_reg, has_secs_reg, has_tics_reg, has_trailer_reg, is_sob_reg, is_eob_reg}
@@ -113,7 +138,7 @@ module vita_tx_deframer
vita_state <= VITA_TICS;
else
vita_state <= VITA_PAYLOAD;
- seqnum_err <= ~(seqnum == next_seqnum);
+ seqnum_err <= seqnum_err | ~(vita_seqnum == next_vita_seqnum);
end // case: VITA_HEADER
VITA_STREAMID :
if(has_classid_reg)
@@ -151,11 +176,17 @@ module vita_tx_deframer
else
vector_phase <= vector_phase + 1;
VITA_TRAILER :
- vita_state <= VITA_HEADER;
+ if(eof)
+ vita_state <= (USE_TRANS_HEADER==1) ? VITA_TRANS_HEADER : VITA_HEADER;
+ else
+ vita_state <= VITA_DUMP;
+ VITA_DUMP :
+ if(eof)
+ vita_state <= (USE_TRANS_HEADER==1) ? VITA_TRANS_HEADER : VITA_HEADER;
VITA_STORE :
;
default :
- vita_state <= VITA_HEADER;
+ vita_state <= (USE_TRANS_HEADER==1) ? VITA_TRANS_HEADER : VITA_HEADER;
endcase // case (vita_state)
assign line_done = (vector_phase == numchan);
@@ -170,8 +201,6 @@ module vita_tx_deframer
send_time[63:32] <= data_i[31:0];
VITA_TICS2 :
send_time[31:0] <= data_i[31:0];
- VITA_STORE, VITA_HEADER :
- send_time[63:0] <= 64'd0;
endcase // case (vita_state)
always @(posedge clk)
@@ -191,7 +220,7 @@ module vita_tx_deframer
// sob, eob, has_secs (send_at) ignored on all lines except first
assign fifo_i = {sample_d,sample_c,sample_b,sample_a,seqnum_err,has_secs_reg,is_sob_reg,is_eob_reg,eop,
- 12'd0,seqnum_reg,send_time};
+ 12'd0,seqnum_reg[3:0],send_time};
assign dst_rdy_o = ~(vita_state == VITA_PAYLOAD) & ~((vita_state==VITA_STORE)& ~fifo_space) ;
diff --git a/fpga/usrp2/vrt/vita_tx_tb.v b/fpga/usrp2/vrt/vita_tx_tb.v
index 0223d6850..a118ffd4e 100644
--- a/fpga/usrp2/vrt/vita_tx_tb.v
+++ b/fpga/usrp2/vrt/vita_tx_tb.v
@@ -33,7 +33,7 @@ module vita_tx_tb;
wire [31:0] set_data_dsp;
wire sample_dst_rdy, sample_src_rdy;
- wire [64+4+(MAXCHAN*32)-1:0] sample_data_o, sample_data_tx;
+ wire [5+64+16+(MAXCHAN*32)-1:0] sample_data_o, sample_data_tx;
time_64bit #(.TICKS_PER_SEC(100000000), .BASE(0)) time_64bit
(.clk(clk), .rst(reset),
@@ -49,8 +49,8 @@ module vita_tx_tb;
.datain(data_o), .src_rdy_i(src_rdy), .dst_rdy_o(dst_rdy),
.dataout(data_tx), .src_rdy_o(src_rdy_tx), .dst_rdy_i(dst_rdy_tx));
- vita_tx_deframer #(.BASE(16), .MAXCHAN(MAXCHAN)) vita_tx_deframer
- (.clk(clk), .reset(reset), .clear(0),
+ vita_tx_deframer #(.BASE(16), .MAXCHAN(MAXCHAN), .USE_TRANS_HEADER(0)) vita_tx_deframer
+ (.clk(clk), .reset(reset), .clear(0), .clear_seqnum(0),
.set_stb(set_stb), .set_addr(set_addr), .set_data(set_data),
.data_i(data_tx), .dst_rdy_o(dst_rdy_tx), .src_rdy_i(src_rdy_tx),
.sample_fifo_o(sample_data_tx),
@@ -60,7 +60,7 @@ module vita_tx_tb;
vita_tx_control #(.BASE(16), .WIDTH(MAXCHAN*32)) vita_tx_control
(.clk(clk), .reset(reset), .clear(0),
.set_stb(set_stb), .set_addr(set_addr), .set_data(set_data),
- .vita_time(vita_time), .underrun(underrun),
+ .vita_time(vita_time), .error(underrun), .error_code(),
.sample_fifo_i(sample_data_tx),
.sample_fifo_dst_rdy_o(sample_dst_rdy_tx), .sample_fifo_src_rdy_i(sample_src_rdy_tx),
.sample(sample_tx), .run(run_tx), .strobe(strobe_tx));
@@ -92,35 +92,47 @@ module vita_tx_tb;
write_setting(7,8); // Samples per VITA packet
write_setting(8,NUMCHAN); // Samples per VITA packet
#10000;
- queue_vita_packets(32'h300, 106, 32'hF00D_1234, 32'h55AA_AA55);
- //queue_vita_packets(32'h300, 6, 32'hF00D_1234, 32'h0);
- queue_vita_packets(32'h600, 9, 32'h9876_ABCD, 32'h0);
-
+ queue_vita_packets(0, 32'h300, 5, 32'h0000_1000, 32'h0, 4'h0, 1, 0, 1);
+ queue_vita_packets(0, 32'h0, 5, 32'h0000_2000, 32'h0, 4'h1, 0, 0, 0);
+ queue_vita_packets(0, 32'h0, 5, 32'h0000_3000, 32'h0, 4'h2, 0, 0, 0);
+
+ queue_vita_packets(0, 32'h400, 3, 32'h0000_4000, 32'h0, 4'h3, 1, 0, 1);
+ queue_vita_packets(0, 32'h0, 3, 32'h0000_5000, 32'h0, 4'h4, 0, 0, 0);
+ queue_vita_packets(0, 32'h0, 3, 32'h0000_6000, 32'h0, 4'h5, 0, 1, 0);
+
#300000 $finish;
end
task queue_vita_packets;
+ input [31:0] send_secs;
input [31:0] sendtime;
input [15:0] samples;
input [15:0] word;
input [31:0] trailer;
+ input [3:0] seqnum;
+ input sob;
+ input eob;
+ input sendat;
reg [15:0] i;
begin
+ src_rdy <= 0;
@(posedge clk);
src_rdy <= 1;
- data_o <= {4'b0001,4'h1,1'b0,|trailer,2'h3,8'hF0,(16'd5+samples+|trailer)}; // header
- @(posedge clk);
- data_o <= {4'b0000,32'h0}; // streamid
- @(posedge clk);
- data_o <= {4'b0000,32'h0}; // SECS
- @(posedge clk);
- data_o <= {4'b0000,32'h0}; // TICS
+ data_o <= {4'b0001,4'h0,1'b0,|trailer,sob,eob,{2{sendat}},1'b0,sendat,seqnum,(16'd1+samples+|trailer+sendat+sendat+sendat)}; // header
@(posedge clk);
- data_o <= {4'b0000,sendtime}; // TICS
- @(posedge clk);
-
+ //data_o <= {4'b0000,32'h0}; // streamid
+ //@(posedge clk);
+ if(sendat)
+ begin
+ data_o <= {4'b0000,send_secs}; // SECS
+ @(posedge clk);
+ data_o <= {4'b0000,32'h0}; // TICS
+ @(posedge clk);
+ data_o <= {4'b0000,sendtime}; // TICS
+ @(posedge clk);
+ end
for(i=0;i<samples-1;i=i+1)
begin
data_o <= {4'b0000,i,word}; // Payload
diff --git a/host/CMakeLists.txt b/host/CMakeLists.txt
index a60eed0a5..e5ce78782 100644
--- a/host/CMakeLists.txt
+++ b/host/CMakeLists.txt
@@ -16,7 +16,7 @@
#
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
-PROJECT(UHD CXX)
+PROJECT(UHD CXX C)
ENABLE_TESTING()
########################################################################
@@ -64,7 +64,7 @@ IF(CMAKE_COMPILER_IS_GNUCXX)
#causes trouble when compiling libusb1.0 on macintosh
#comment out until mac ports libusb gets its act together
#ADD_DEFINITIONS(-pedantic)
- ADD_DEFINITIONS(-ansi)
+ #ADD_DEFINITIONS(-ansi)
#only export symbols that are declared to be part of the uhd api:
UHD_ADD_OPTIONAL_CXX_COMPILER_FLAG(-fvisibility=hidden HAVE_VISIBILITY_HIDDEN)
ENDIF(CMAKE_COMPILER_IS_GNUCXX)
diff --git a/host/README b/host/README
index c4a72cd83..f3dcde53d 100644
--- a/host/README
+++ b/host/README
@@ -8,7 +8,9 @@ The hardware driver for Ettus Research products.
########################################################################
USRP1
USRP2
-USRP-N2XX
+USRP-N200
+USRP-N210
+USRP-E100
########################################################################
# Supported USRP Daughterboards
diff --git a/host/apps/omap_debug/.gitignore b/host/apps/omap_debug/.gitignore
new file mode 100644
index 000000000..008a23138
--- /dev/null
+++ b/host/apps/omap_debug/.gitignore
@@ -0,0 +1,20 @@
+.gitignore
+clkgen-config
+fpga-downloader
+usrp-e-button
+usrp-e-crc-rw
+usrp-e-ctl
+usrp-e-debug-pins
+usrp-e-fpga-rw
+usrp-e-gpio
+usrp-e-i2c
+usrp-e-lb-test
+usrp-e-led
+usrp-e-loopback
+usrp-e-random-loopback
+usrp-e-rw
+usrp-e-spi
+usrp-e-timed
+usrp-e-uart
+usrp-e-uart-rx
+usrp-e-mm-loopback
diff --git a/host/apps/omap_debug/Makefile b/host/apps/omap_debug/Makefile
new file mode 100644
index 000000000..46d4714a8
--- /dev/null
+++ b/host/apps/omap_debug/Makefile
@@ -0,0 +1,61 @@
+CFLAGS=-Wall -I../../lib/usrp/usrp_e/ -march=armv7-a -mtune=cortex-a8 -mfpu=neon -O3
+CXXFLAGS=-Wall -I../../lib/usrp/usrp_e/ -march=armv7-a -mtune=cortex-a8 -mfpu=neon -O3
+
+all : usrp-e-spi usrp-e-i2c usrp-e-loopback usrp-e-mm-loopback usrp-e-uart usrp-e-led usrp-e-ctl usrp-e-button usrp-e-uart-rx fpga-downloader usrp-e-gpio usrp-e-debug-pins usrp-e-random-loopback usrp-e-timed usrp-e-lb-test usrp-e-crc-rw clkgen-config
+
+usrp-e-spi : usrp-e-spi.c
+
+usrp-e-i2c : usrp-e-i2c.c
+
+usrp-e-loopback : usrp-e-loopback.c
+ gcc -o $@ $< -lpthread ${CFLAGS}
+
+usrp-e-mm-loopback : usrp-e-mm-loopback.c
+ gcc -o $@ $< -lpthread ${CFLAGS}
+
+usrp-e-timed : usrp-e-timed.c
+ gcc -o $@ $< -lpthread ${CFLAGS}
+
+usrp-e-random-loopback : usrp-e-random-loopback.c
+ gcc -o $@ $< -lpthread ${CFLAGS}
+
+usrp-e-crc-rw : usrp-e-crc-rw.c
+ gcc -o $@ $< -lpthread ${CFLAGS}
+
+usrp-e-uart : usrp-e-uart.c
+
+usrp-e-uart-rx : usrp-e-uart-rx.c
+
+usrp-e-led : usrp-e-led.c
+
+usrp-e-ctl : usrp-e-ctl.c
+
+usrp-e-button : usrp-e-button.c
+
+fpga-downloader : fpga-downloader.cc
+
+clkgen-config : clkgen-config.cc
+
+usrp-e-gpio : usrp-e-gpio.c
+
+usrp-e-lb-test : usrp-e-lb-test.c
+
+usrp-e-debug-pins : usrp-e-debug-pins.c
+clean :
+ rm -f usrp-e-spi
+ rm -f usrp-e-i2c
+ rm -f usrp-e-loopback
+ rm -f usrp-e-mm-loopback
+ rm -f usrp-e-timed
+ rm -f usrp-e-rw-random
+ rm -f usrp-e-uart
+ rm -f usrp-e-uart-rx
+ rm -f usrp-e-led
+ rm -f usrp-e-ctl
+ rm -f usrp-e-button
+ rm -f fpga-downloader
+ rm -f usrp-e-gpio
+ rm -f usrp-e-debug-pins
+ rm -f usrp-e-lb-test
+ rm -f usrp-e-crc-rw
+ rm -f clkgen-config
diff --git a/host/apps/omap_debug/README b/host/apps/omap_debug/README
new file mode 100644
index 000000000..bbe0c2cc4
--- /dev/null
+++ b/host/apps/omap_debug/README
@@ -0,0 +1 @@
+OMAP development tools go here
diff --git a/host/apps/omap_debug/clkgen-config.cc b/host/apps/omap_debug/clkgen-config.cc
new file mode 100644
index 000000000..e8279b4ae
--- /dev/null
+++ b/host/apps/omap_debug/clkgen-config.cc
@@ -0,0 +1,296 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2003,2004,2008,2009 Free Software Foundation, Inc.
+ *
+ * This file is part of UHD
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <string>
+#include <cstdlib>
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+
+#include <linux/spi/spidev.h>
+
+
+// Programming data for clock gen chip
+static const unsigned int config_data[] = {
+ 0x000024,
+ 0x023201,
+ 0x000081,
+ 0x000400,
+ 0x00104c,
+ 0x001101,
+ 0x001200,
+ 0x001300,
+ 0x001414,
+ 0x001500,
+ 0x001604,
+ 0x001704,
+ 0x001807,
+ 0x001900,
+ //0x001a00,//for debug
+ 0x001a32,
+ 0x001b12,
+ 0x001c44,
+ 0x001d00,
+ 0x001e00,
+ 0x00f062,
+ 0x00f162,
+ 0x00f262,
+ 0x00f362,
+ 0x00f462,
+ 0x00f562,
+ 0x00f662,
+ 0x00f762,
+ 0x00f862,
+ 0x00f962,
+ 0x00fa62,
+ 0x00fb62,
+ 0x00fc00,
+ 0x00fd00,
+ 0x019021,
+ 0x019100,
+ 0x019200,
+ 0x019333,
+ 0x019400,
+ 0x019500,
+ 0x019611,
+ 0x019700,
+ 0x019800,
+ 0x019900,
+ 0x019a00,
+ 0x019b00,
+ 0x01e003,
+ 0x01e102,
+ 0x023000,
+ 0x023201,
+ 0x0b0201,
+ 0x0b0300,
+ 0x001fff,
+ 0x0a0000,
+ 0x0a0100,
+ 0x0a0200,
+ 0x0a0302,
+ 0x0a0400,
+ 0x0a0504,
+ 0x0a060e,
+ 0x0a0700,
+ 0x0a0810,
+ 0x0a090e,
+ 0x0a0a00,
+ 0x0a0bf0,
+ 0x0a0c0b,
+ 0x0a0d01,
+ 0x0a0e90,
+ 0x0a0f01,
+ 0x0a1001,
+ 0x0a11e0,
+ 0x0a1201,
+ 0x0a1302,
+ 0x0a1430,
+ 0x0a1580,
+ 0x0a16ff,
+ 0x023201,
+ 0x0b0301,
+ 0x023201,
+};
+
+
+const unsigned int CLKGEN_SELECT = 145;
+
+
+enum gpio_direction {IN, OUT};
+
+class gpio {
+ public:
+
+ gpio(unsigned int gpio_num, gpio_direction pin_direction, bool close_action);
+ ~gpio();
+
+ bool get_value();
+ void set_value(bool state);
+
+ private:
+
+ unsigned int gpio_num;
+
+ std::stringstream base_path;
+ std::fstream value_file;
+ std::fstream direction_file;
+ bool close_action; // True set to input and release, false do nothing
+};
+
+class spidev {
+ public:
+
+ spidev(std::string dev_name);
+ ~spidev();
+
+ void send(char *wbuf, char *rbuf, unsigned int nbytes);
+
+ private:
+
+ int fd;
+
+};
+
+gpio::gpio(unsigned int _gpio_num, gpio_direction pin_direction, bool close_action)
+{
+ std::fstream export_file;
+
+ gpio_num = _gpio_num;
+
+ export_file.open("/sys/class/gpio/export", std::ios::out);
+ if (!export_file.is_open()) ///\todo Poor error handling
+ std::cout << "Failed to open gpio export file." << std::endl;
+
+ export_file << gpio_num << std::endl;
+
+ base_path << "/sys/class/gpio/gpio" << gpio_num << std::flush;
+
+ std::string direction_file_name;
+
+ direction_file_name = base_path.str() + "/direction";
+
+ direction_file.open(direction_file_name.c_str());
+ if (!direction_file.is_open())
+ std::cout << "Failed to open direction file." << std::endl;
+ if (pin_direction == OUT)
+ direction_file << "out" << std::endl;
+ else
+ direction_file << "in" << std::endl;
+
+ std::string value_file_name;
+
+ value_file_name = base_path.str() + "/value";
+
+ value_file.open(value_file_name.c_str(), std::ios_base::in | std::ios_base::out);
+ if (!value_file.is_open())
+ std::cout << "Failed to open value file." << std::endl;
+}
+
+bool gpio::get_value()
+{
+
+ std::string val;
+
+ std::getline(value_file, val);
+ value_file.seekg(0);
+
+ if (val == "0")
+ return false;
+ else if (val == "1")
+ return true;
+ else
+ std::cout << "Data read from value file|" << val << "|" << std::endl;
+
+ return false;
+}
+
+void gpio::set_value(bool state)
+{
+
+ if (state)
+ value_file << "1" << std::endl;
+ else
+ value_file << "0" << std::endl;
+}
+
+gpio::~gpio()
+{
+ if (close_action) {
+ std::fstream unexport_file;
+
+ direction_file << "in" << std::endl;
+
+ unexport_file.open("/sys/class/gpio/unexport", std::ios::out);
+ if (!unexport_file.is_open()) ///\todo Poor error handling
+ std::cout << "Failed to open gpio export file." << std::endl;
+
+ unexport_file << gpio_num << std::endl;
+
+ }
+
+}
+
+spidev::spidev(std::string fname)
+{
+ int ret;
+ int mode = 0;
+ int speed = 12000;
+ int bits = 24;
+
+ fd = open(fname.c_str(), O_RDWR);
+
+ ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
+ ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
+ ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
+}
+
+
+spidev::~spidev()
+{
+ close(fd);
+}
+
+void spidev::send(char *buf, char *rbuf, unsigned int nbytes)
+{
+ int ret;
+
+ struct spi_ioc_transfer tr;
+ tr.tx_buf = (unsigned long) buf;
+ tr.rx_buf = (unsigned long) rbuf;
+ tr.len = nbytes;
+ tr.delay_usecs = 0;
+ tr.speed_hz = 12000000;
+ tr.bits_per_word = 24;
+
+ ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
+
+}
+
+static void send_config_to_clkgen(gpio &chip_select, const unsigned int data[], unsigned int data_size)
+{
+ spidev spi("/dev/spidev1.0");
+ unsigned int rbuf;
+
+ for (unsigned int i = 0; i < data_size; i++) {
+
+ std::cout << "sending " << std::hex << data[i] << std::endl;
+ chip_select.set_value(0);
+ spi.send((char *)&data[i], (char *)&rbuf, 4);
+ chip_select.set_value(1);
+
+ };
+}
+
+int main(int argc, char *argv[])
+{
+
+ gpio clkgen_select(CLKGEN_SELECT, OUT, true);
+
+ send_config_to_clkgen(clkgen_select, config_data, sizeof(config_data)/sizeof(unsigned int));
+}
+
diff --git a/host/apps/omap_debug/fetch-bin.sh b/host/apps/omap_debug/fetch-bin.sh
new file mode 100755
index 000000000..019ddaaf2
--- /dev/null
+++ b/host/apps/omap_debug/fetch-bin.sh
@@ -0,0 +1,6 @@
+if [ $GHQ ]; then
+ scp $GHQ_USER@astro:/workspace/usrp1-e-dev/u1e.bin /home/root
+else
+ scp -P 8822 balister@192.168.1.10:src/git/fpgapriv/usrp2/top/u1e/build/u1e.bin /home/root
+fi
+sync
diff --git a/host/apps/omap_debug/fetch-kernel.sh b/host/apps/omap_debug/fetch-kernel.sh
new file mode 100755
index 000000000..ce420f3d2
--- /dev/null
+++ b/host/apps/omap_debug/fetch-kernel.sh
@@ -0,0 +1,7 @@
+if [ $GHQ ]; then
+ scp $GHQ_USER@astro:/workspace/usrp1-e-dev/kernel_usrp/arch/arm/boot/uImage /media/mmcblk0p1/uImage
+else
+ scp balister@192.168.1.10:src/git/kernel_usrp/arch/arm/boot/uImage /media/mmcblk0p1/uImage
+fi
+sync
+
diff --git a/host/apps/omap_debug/fetch-module.sh b/host/apps/omap_debug/fetch-module.sh
new file mode 100755
index 000000000..ec28989bd
--- /dev/null
+++ b/host/apps/omap_debug/fetch-module.sh
@@ -0,0 +1,6 @@
+if [ $GHQ ]; then
+ scp $GHQ_USER@astro:/workspace/usrp1-e-dev/kernel_usrp/drivers/misc/usrp_e.ko /lib/modules/2.6.33/kernel/drivers/misc
+else
+ scp balister@192.168.1.10:src/git/kernel_usrp/drivers/misc/usrp_e.ko /lib/modules/2.6.33/kernel/drivers/misc
+fi
+sync
diff --git a/host/apps/omap_debug/fetch-u-boot.sh b/host/apps/omap_debug/fetch-u-boot.sh
new file mode 100755
index 000000000..5309364b8
--- /dev/null
+++ b/host/apps/omap_debug/fetch-u-boot.sh
@@ -0,0 +1,7 @@
+if [ $GHQ ]; then
+ scp $GHQ_USER@astro:/workspace/usrp1-e-dev/u-boot-overo/u-boot.bin /media/mmcblk0p1/
+else
+ scp balister@192.168.1.167:src/git/u-boot/u-boot.bin /media/mmcblk0p1/
+fi
+sync
+
diff --git a/host/apps/omap_debug/fpga-downloader.cc b/host/apps/omap_debug/fpga-downloader.cc
new file mode 100644
index 000000000..4e475b5c1
--- /dev/null
+++ b/host/apps/omap_debug/fpga-downloader.cc
@@ -0,0 +1,253 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2003,2004,2008,2009 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <string>
+#include <cstdlib>
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+
+#include <linux/spi/spidev.h>
+
+/*
+ * Configuration connections
+ *
+ * CCK - MCSPI1_CLK
+ * DIN - MCSPI1_MOSI
+ * PROG_B - GPIO_175 - output (change mux)
+ * DONE - GPIO_173 - input (change mux)
+ * INIT_B - GPIO_114 - input (change mux)
+ *
+*/
+
+const unsigned int PROG_B = 175;
+const unsigned int DONE = 173;
+const unsigned int INIT_B = 114;
+
+static std::string bit_file = "safe_u1e.bin";
+
+const int BUF_SIZE = 4096;
+
+enum gpio_direction {IN, OUT};
+
+class gpio {
+ public:
+
+ gpio(unsigned int gpio_num, gpio_direction pin_direction);
+
+ bool get_value();
+ void set_value(bool state);
+
+ private:
+
+ std::stringstream base_path;
+ std::fstream value_file;
+};
+
+class spidev {
+ public:
+
+ spidev(std::string dev_name);
+ ~spidev();
+
+ void send(char *wbuf, char *rbuf, unsigned int nbytes);
+
+ private:
+
+ int fd;
+
+};
+
+gpio::gpio(unsigned int gpio_num, gpio_direction pin_direction)
+{
+ std::fstream export_file;
+
+ export_file.open("/sys/class/gpio/export", std::ios::out);
+ if (!export_file.is_open()) ///\todo Poor error handling
+ std::cout << "Failed to open gpio export file." << std::endl;
+
+ export_file << gpio_num << std::endl;
+
+ base_path << "/sys/class/gpio/gpio" << gpio_num << std::flush;
+
+ std::fstream direction_file;
+ std::string direction_file_name;
+
+ if (gpio_num != 114) {
+ direction_file_name = base_path.str() + "/direction";
+
+ direction_file.open(direction_file_name.c_str());
+ if (!direction_file.is_open())
+ std::cout << "Failed to open direction file." << std::endl;
+ if (pin_direction == OUT)
+ direction_file << "out" << std::endl;
+ else
+ direction_file << "in" << std::endl;
+ }
+
+ std::string value_file_name;
+
+ value_file_name = base_path.str() + "/value";
+
+ value_file.open(value_file_name.c_str(), std::ios_base::in | std::ios_base::out);
+ if (!value_file.is_open())
+ std::cout << "Failed to open value file." << std::endl;
+}
+
+bool gpio::get_value()
+{
+
+ std::string val;
+
+ std::getline(value_file, val);
+ value_file.seekg(0);
+
+ if (val == "0")
+ return false;
+ else if (val == "1")
+ return true;
+ else
+ std::cout << "Data read from value file|" << val << "|" << std::endl;
+
+ return false;
+}
+
+void gpio::set_value(bool state)
+{
+
+ if (state)
+ value_file << "1" << std::endl;
+ else
+ value_file << "0" << std::endl;
+}
+
+static void prepare_fpga_for_configuration(gpio &prog, gpio &init)
+{
+
+ prog.set_value(true);
+ prog.set_value(false);
+ prog.set_value(true);
+
+#if 0
+ bool ready_to_program(false);
+ unsigned int count(0);
+ do {
+ ready_to_program = init.get_value();
+ count++;
+
+ sleep(1);
+ } while (count < 10 && !ready_to_program);
+
+ if (count == 10) {
+ std::cout << "FPGA not ready for programming." << std::endl;
+ exit(-1);
+ }
+#endif
+}
+
+spidev::spidev(std::string fname)
+{
+ int ret;
+ int mode = 0;
+ int speed = 12000000;
+ int bits = 8;
+
+ fd = open(fname.c_str(), O_RDWR);
+
+ ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
+ ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
+ ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
+}
+
+
+spidev::~spidev()
+{
+ close(fd);
+}
+
+void spidev::send(char *buf, char *rbuf, unsigned int nbytes)
+{
+ int ret;
+
+ struct spi_ioc_transfer tr;
+ tr.tx_buf = (unsigned long) buf;
+ tr.rx_buf = (unsigned long) rbuf;
+ tr.len = nbytes;
+ tr.delay_usecs = 0;
+ tr.speed_hz = 48000000;
+ tr.bits_per_word = 8;
+
+ ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
+
+}
+
+static void send_file_to_fpga(std::string &file_name, gpio &error, gpio &done)
+{
+ std::ifstream bitstream;
+
+ std::cout << "File name - " << file_name.c_str() << std::endl;
+
+ bitstream.open(file_name.c_str(), std::ios::binary);
+ if (!bitstream.is_open())
+ std::cout << "File " << file_name << " not opened succesfully." << std::endl;
+
+ spidev spi("/dev/spidev1.0");
+ char buf[BUF_SIZE];
+ char rbuf[BUF_SIZE];
+
+ do {
+ bitstream.read(buf, BUF_SIZE);
+ spi.send(buf, rbuf, bitstream.gcount());
+
+ if (error.get_value())
+ std::cout << "INIT_B went high, error occured." << std::endl;
+
+ if (!done.get_value())
+ std::cout << "Configuration complete." << std::endl;
+
+ } while (bitstream.gcount() == BUF_SIZE);
+}
+
+int main(int argc, char *argv[])
+{
+
+ gpio gpio_prog_b(PROG_B, OUT);
+ gpio gpio_init_b(INIT_B, IN);
+ gpio gpio_done (DONE, IN);
+
+ if (argc == 2)
+ bit_file = argv[1];
+
+ std::cout << "FPGA config file: " << bit_file << std::endl;
+
+ prepare_fpga_for_configuration(gpio_prog_b, gpio_init_b);
+
+ std::cout << "Done = " << gpio_done.get_value() << std::endl;
+
+ send_file_to_fpga(bit_file, gpio_init_b, gpio_done);
+}
+
diff --git a/host/apps/omap_debug/read_board_id.sh b/host/apps/omap_debug/read_board_id.sh
new file mode 100755
index 000000000..96081f219
--- /dev/null
+++ b/host/apps/omap_debug/read_board_id.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+i2cget -y 3 0x51 0x00 b
+i2cget -y 3 0x51 0x01 b
+i2cget -y 3 0x51 0x02 b
+i2cget -y 3 0x51 0x03 b
+i2cget -y 3 0x51 0x04 b
+i2cget -y 3 0x51 0x05 b
+
+
diff --git a/host/apps/omap_debug/reload-fpga.sh b/host/apps/omap_debug/reload-fpga.sh
new file mode 100755
index 000000000..2754718a4
--- /dev/null
+++ b/host/apps/omap_debug/reload-fpga.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+
+rmmod usrp_e
+fpga-downloader /home/root/u1e.bin
+modprobe usrp_e
+usrp-e-debug-pins 1
+
diff --git a/host/apps/omap_debug/set_debug_pins.py b/host/apps/omap_debug/set_debug_pins.py
new file mode 100755
index 000000000..0f9ecd7b9
--- /dev/null
+++ b/host/apps/omap_debug/set_debug_pins.py
@@ -0,0 +1,35 @@
+#!/usr/bin/python
+
+import os
+
+# Memory Map
+misc_base = 0
+uart_base = 1
+spi_base = 2
+i2c_base = 3
+gpio_base = 4 * 128
+settings_base = 5
+
+# GPIO offset
+gpio_pins = 0
+gpio_ddr = 4
+gpio_ctrl_lo = 8
+gpio_ctrl_hi = 12
+
+def set_reg(reg, val):
+ os.system("./usrp1-e-ctl w %d 1 %d" % (reg,val))
+
+def get_reg(reg):
+ fin,fout = os.popen4("./usrp1-e-ctl r %d 1" % (reg,))
+ print fout.read()
+
+# Set DDRs to output
+set_reg(gpio_base+gpio_ddr, 0xFFFF)
+set_reg(gpio_base+gpio_ddr+2, 0xFFFF)
+
+# Set CTRL to Debug #0 ( A is for debug 0, F is for debug 1 )
+set_reg(gpio_base+gpio_ctrl_lo, 0xAAAA)
+set_reg(gpio_base+gpio_ctrl_lo+2, 0xAAAA)
+set_reg(gpio_base+gpio_ctrl_hi, 0xAAAA)
+set_reg(gpio_base+gpio_ctrl_hi+2, 0xAAAA)
+
diff --git a/host/apps/omap_debug/setup-board-id-eeprom.sh b/host/apps/omap_debug/setup-board-id-eeprom.sh
new file mode 100755
index 000000000..4dba1cce5
--- /dev/null
+++ b/host/apps/omap_debug/setup-board-id-eeprom.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+i2cset -y 3 0x51 0x00 0x00
+i2cset -y 3 0x51 0x01 0x03
+i2cset -y 3 0x51 0x02 0x00
+i2cset -y 3 0x51 0x03 0x01
+i2cset -y 3 0x51 0x04 0x01
+i2cset -y 3 0x51 0x05 0x00
+i2cset -y 3 0x51 0x06 0x00
+
+i2cget -y 3 0x51 0 b
+i2cget -y 3 0x51 1 b
+i2cget -y 3 0x51 2 b
+i2cget -y 3 0x51 3 b
+i2cget -y 3 0x51 4 b
+i2cget -y 3 0x51 5 b
+i2cget -y 3 0x51 6 b
diff --git a/host/apps/omap_debug/test.c b/host/apps/omap_debug/test.c
new file mode 100644
index 000000000..36f4d700a
--- /dev/null
+++ b/host/apps/omap_debug/test.c
@@ -0,0 +1,34 @@
+#include <stdio.h>
+
+void
+main()
+{
+ int x;
+ char *y;
+ long long z;
+
+ x = 0x01020304;
+ z = 0x0102030405060708LL;
+
+ printf("%x\n",x);
+ y = (char *)&x;
+ printf("%x\n",y[0]);
+ printf("%x\n",y[1]);
+ printf("%x\n",y[2]);
+ printf("%x\n",y[3]);
+
+ printf("Printing z ...\n");
+ printf("%llx\n",z);
+ printf("Printing z done\n");
+
+ y = (char *)&z;
+ printf("%x\n",y[0]);
+ printf("%x\n",y[1]);
+ printf("%x\n",y[2]);
+ printf("%x\n",y[3]);
+ printf("%x\n",y[4]);
+ printf("%x\n",y[5]);
+ printf("%x\n",y[6]);
+ printf("%x\n",y[7]);
+}
+
diff --git a/host/apps/omap_debug/u1e-read-stream.c b/host/apps/omap_debug/u1e-read-stream.c
new file mode 100644
index 000000000..4e4c21d9e
--- /dev/null
+++ b/host/apps/omap_debug/u1e-read-stream.c
@@ -0,0 +1,21 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+int main(int rgc, char *argv[])
+{
+ int fp, cnt, n;
+ short buf[1024];
+
+ n = 0;
+
+ fp = open("/dev/usrp1_e0", O_RDONLY);
+ printf("fp = %d\n", fp);
+
+ do {
+ cnt = read(fp, buf, 2048);
+ n++;
+// printf("Bytes read - %d\n", cnt);
+ } while(n < 10*512);
+ printf("Data - %hX\n", buf[0]);
+}
diff --git a/host/apps/omap_debug/usrp-e-button.c b/host/apps/omap_debug/usrp-e-button.c
new file mode 100644
index 000000000..f13291491
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-button.c
@@ -0,0 +1,56 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+#include "usrp_e.h"
+#include "usrp_e_regs.hpp"
+
+// Usage: usrp_e_uart <string>
+
+#define PB1 (1<<8)
+#define PB2 (1<<9)
+#define PB3 (1<<10)
+#define P1 (0)
+#define P2 (0xFF)
+#define P3 (0xAA)
+#define P4 (0x55)
+
+int main(int argc, char *argv[])
+{
+ int fp, ret;
+ struct usrp_e_ctl16 d;
+ int pb1=0, pb2=0, pb3=0, p1=0, p2=0, p3=0, p4=0;
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+
+ d.offset = UE_REG_MISC_SW;
+ d.count = 1;
+
+ do {
+ ret = ioctl(fp, USRP_E_READ_CTL16, &d);
+ if (d.buf[0] & PB1) {
+ pb1 = 1;
+ printf("Pushbutton 1 hit\n");
+ }
+
+ if (d.buf[0] & PB2) {
+ pb2 = 1;
+ printf("Pushbutton 2 hit\n");
+ }
+
+ if (d.buf[0] & PB3) {
+ pb3 = 1;
+ printf("Pushbutton 3 hit\n");
+ }
+
+ sleep(1);
+
+ } while (!(pb1 && pb2 && pb3));
+
+ return 0;
+}
diff --git a/host/apps/omap_debug/usrp-e-crc-rw.c b/host/apps/omap_debug/usrp-e-crc-rw.c
new file mode 100644
index 000000000..c3ae45cc1
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-crc-rw.c
@@ -0,0 +1,274 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/ioctl.h>
+#include <string.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stddef.h>
+#include "usrp_e.h"
+
+// max length #define PKT_DATA_LENGTH 1016
+static int packet_data_length;
+
+static int fp;
+static u_int32_t crc_tab[256];
+
+// CRC code from http://www.koders.com/c/fid699AFE0A656F0022C9D6B9D1743E697B69CE5815.aspx
+// GPLv2
+
+static u_int32_t chksum_crc32_gentab(void)
+{
+ unsigned long crc, poly;
+ unsigned long i, j;
+
+ poly = 0xEDB88320L;
+
+ for (i = 0; i < 256; i++) {
+ crc = i;
+ for (j = 8; j > 0; j--) {
+ if (crc & 1) {
+ crc = (crc >> 1) ^ poly;
+ } else {
+ crc >>= 1;
+ }
+ }
+ crc_tab[i] = crc;
+ }
+
+ return 0;
+}
+
+static void *read_thread(void *threadid)
+{
+ int cnt;
+ struct usrp_transfer_frame *rx_data;
+ int rx_pkt_cnt;
+ int i;
+ unsigned long crc;
+ unsigned int rx_crc;
+ unsigned long bytes_transfered, elapsed_seconds;
+ struct timeval start_time, finish_time;
+
+ __u8 *p;
+ __u32 *pi;
+
+ printf("Greetings from the reading thread!\n");
+
+ // IMPORTANT: must assume max length packet from fpga
+ rx_data = malloc(2048);
+
+ rx_pkt_cnt = 0;
+
+ bytes_transfered = 0;
+ gettimeofday(&start_time, NULL);
+
+ while (1) {
+
+ cnt = read(fp, rx_data, 2048);
+ if (cnt < 0)
+ printf("Error returned from read: %d\n", cnt);
+
+ rx_pkt_cnt++;
+
+#if 0
+ if (rx_pkt_cnt == 512) {
+ printf(".");
+ fflush(stdout);
+ rx_pkt_cnt = 0;
+ }
+#endif
+
+ if (rx_data->status & RB_OVERRUN)
+ printf("O");
+
+ printf("rx_data->len = %d\n", rx_data->len);
+
+
+ crc = 0xFFFFFFFF;
+ for (i = 0; i < rx_data->len - 4; i+=2) {
+ crc = ((crc >> 8) & 0x00FFFFFF) ^
+ crc_tab[(crc ^ rx_data->buf[i+1]) & 0xFF];
+printf("idx = %d, data = %X, crc = %X\n", i, rx_data->buf[i+1],crc);
+ crc = ((crc >> 8) & 0x00FFFFFF) ^
+ crc_tab[(crc ^ rx_data->buf[i]) & 0xFF];
+printf("idx = %d, data = %X, crc = %X\n", i, rx_data->buf[i],crc);
+ }
+
+ p = &rx_data->buf[rx_data->len - 4];
+ pi = (__u32 *) p;
+ rx_crc = *pi;
+
+#if 1
+ printf("rx_data->len = %d\n", rx_data->len);
+ printf("rx_data->status = %d\n", rx_data->status);
+ for (i = 0; i < rx_data->len; i++)
+ printf("idx = %d, data = %X\n", i, rx_data->buf[i]);
+ printf("calc crc = %lX, rx crc = %X\n", crc, rx_crc);
+ fflush(stdout);
+ break;
+#endif
+
+ if (rx_crc != (crc & 0xFFFFFFFF)) {
+ printf("CRC Error, calc crc: %X, rx_crc: %X\n",
+ (crc & 0xFFFFFFFF), rx_crc);
+ }
+
+ bytes_transfered += rx_data->len;
+
+ if (bytes_transfered > (100 * 1000000)) {
+ gettimeofday(&finish_time, NULL);
+ elapsed_seconds = finish_time.tv_sec - start_time.tv_sec;
+
+ printf("Bytes transfered = %ld, elapsed seconds = %ld\n", bytes_transfered, elapsed_seconds);
+ printf("RX data transfer rate = %f K Samples/second\n",
+ (float) bytes_transfered / (float) elapsed_seconds / 250);
+
+
+ start_time = finish_time;
+ bytes_transfered = 0;
+ }
+ }
+}
+
+static void *write_thread(void *threadid)
+{
+ int seq_number, i, cnt, tx_pkt_cnt;
+ int tx_len;
+ unsigned long crc;
+ struct usrp_transfer_frame *tx_data;
+ unsigned long bytes_transfered, elapsed_seconds;
+ struct timeval start_time, finish_time;
+
+ printf("Greetings from the write thread!\n");
+
+ tx_pkt_cnt = 0;
+ tx_data = malloc(2048);
+
+ bytes_transfered = 0;
+ gettimeofday(&start_time, NULL);
+
+ while (1) {
+
+ tx_pkt_cnt++;
+
+#if 0
+ if (tx_pkt_cnt == 512) {
+ printf(".");
+ fflush(stdout);
+ }
+ if (tx_pkt_cnt == 1024) {
+ printf("'");
+ fflush(stdout);
+ }
+ if (tx_pkt_cnt == 1536) {
+ printf(":");
+ fflush(stdout);
+ tx_pkt_cnt = 0;
+ }
+#endif
+
+ tx_len = 2048 - sizeof(struct usrp_transfer_frame) - sizeof(int);
+ tx_data->len = tx_len + sizeof(int);
+
+ crc = 0xFFFFFFFF;
+ for (i = 0; i < tx_len; i++) {
+ tx_data->buf[i] = i & 0xFF;
+
+ crc = ((crc >> 8) & 0x00FFFFFF) ^
+ crc_tab[(crc ^ tx_data->buf[i]) & 0xFF];
+
+ }
+ *((int *) &tx_data[tx_len]) = crc;
+
+ cnt = write(fp, tx_data, 2048);
+ if (cnt < 0)
+ printf("Error returned from write: %d\n", cnt);
+
+
+ bytes_transfered += tx_data->len;
+
+ if (bytes_transfered > (100 * 1000000)) {
+ gettimeofday(&finish_time, NULL);
+ elapsed_seconds = finish_time.tv_sec - start_time.tv_sec;
+
+ printf("Bytes transfered = %d, elapsed seconds = %d\n", bytes_transfered, elapsed_seconds);
+ printf("TX data transfer rate = %f K Samples/second\n",
+ (float) bytes_transfered / (float) elapsed_seconds / 250);
+
+
+ start_time = finish_time;
+ bytes_transfered = 0;
+ }
+
+// sleep(1);
+ }
+}
+
+
+int main(int argc, char *argv[])
+{
+ pthread_t tx, rx;
+ long int t;
+ int fpga_config_flag ,decimation;
+ struct usrp_e_ctl16 d;
+ struct sched_param s = {
+ .sched_priority = 1
+ };
+
+ if (argc < 4) {
+ printf("%s t|w|rw decimation data_size\n", argv[0]);
+ return -1;
+ }
+
+ chksum_crc32_gentab();
+
+ decimation = atoi(argv[2]);
+ packet_data_length = atoi(argv[3]);
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+
+ fpga_config_flag = 0;
+ if (strcmp(argv[1], "w") == 0)
+ fpga_config_flag |= (1 << 15);
+ else if (strcmp(argv[1], "r") == 0)
+ fpga_config_flag |= (1 << 14);
+ else if (strcmp(argv[1], "rw") == 0)
+ fpga_config_flag |= ((1 << 15) | (1 << 14));
+
+ fpga_config_flag |= decimation;
+
+ d.offset = 14;
+ d.count = 1;
+ d.buf[0] = fpga_config_flag;
+ ioctl(fp, USRP_E_WRITE_CTL16, &d);
+
+ sleep(1); // in case the kernel threads need time to start. FIXME if so
+
+ sched_setscheduler(0, SCHED_RR, &s);
+
+ if (fpga_config_flag & (1 << 14)) {
+ if (pthread_create(&rx, NULL, read_thread, (void *) t)) {
+ printf("Failed to create rx thread\n");
+ exit(-1);
+ }
+ }
+
+ sleep(1);
+
+ if (fpga_config_flag & (1 << 15)) {
+ if (pthread_create(&tx, NULL, write_thread, (void *) t)) {
+ printf("Failed to create tx thread\n");
+ exit(-1);
+ }
+ }
+
+ sleep(10000);
+
+ printf("Done sleeping\n");
+
+ return 0;
+}
diff --git a/host/apps/omap_debug/usrp-e-ctl.c b/host/apps/omap_debug/usrp-e-ctl.c
new file mode 100644
index 000000000..69c48ee6f
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-ctl.c
@@ -0,0 +1,48 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
+#include "usrp_e.h"
+
+// Usage: usrp_e_ctl w|r offset number_of_values val1 val2 ....
+
+int main(int argc, char *argv[])
+{
+ int fp, i, cnt, ret;
+ struct usrp_e_ctl16 ctl_data;
+
+ if (argc < 4) {
+ printf("Usage: usrp_e_ctl w|r offset number_of_values val1 val2 ....\n");
+ exit(-1);
+ }
+
+ cnt = atoi(argv[3]);
+
+ ctl_data.offset = atoi(argv[2]);
+ ctl_data.count = cnt;
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+
+ if (*argv[1] == 'w') {
+ for (i=0; i<cnt; i++)
+ ctl_data.buf[i] = atoi(argv[4+i]);
+
+ ret = ioctl(fp, USRP_E_WRITE_CTL16, &ctl_data);
+ printf("Return value from write ioctl = %d\n", ret);
+ }
+
+ if (*argv[1] == 'r') {
+ ret = ioctl(fp, USRP_E_READ_CTL16, &ctl_data);
+ printf("Return value from write ioctl = %d\n", ret);
+
+ for (i=0; i<ctl_data.count; i++) {
+ if (!(i%8))
+ printf("\nData at %4d :", i);
+ printf(" %5d", ctl_data.buf[i]);
+ }
+ printf("\n");
+ }
+}
diff --git a/host/apps/omap_debug/usrp-e-debug-pins.c b/host/apps/omap_debug/usrp-e-debug-pins.c
new file mode 100644
index 000000000..d18bbf990
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-debug-pins.c
@@ -0,0 +1,77 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/ioctl.h>
+
+#include "usrp_e.h"
+#include "usrp_e_regs.hpp"
+
+// Usage: usrp_e_gpio <string>
+
+static int fp;
+
+static int read_reg(__u16 reg)
+{
+ int ret;
+ struct usrp_e_ctl16 d;
+
+ d.offset = reg;
+ d.count = 1;
+ ret = ioctl(fp, USRP_E_READ_CTL16, &d);
+ return d.buf[0];
+}
+
+static void write_reg(__u16 reg, __u16 val)
+{
+ int ret;
+ struct usrp_e_ctl16 d;
+
+ d.offset = reg;
+ d.count = 1;
+ d.buf[0] = val;
+ ret = ioctl(fp, USRP_E_WRITE_CTL16, &d);
+}
+
+int main(int argc, char *argv[])
+{
+ int test;
+
+ test = 0;
+ if (argc < 2) {
+ printf("%s 0|1|off\n", argv[0]);
+ }
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+ if (fp < 0) {
+ perror("Open failed");
+ return -1;
+ }
+
+ if (strcmp(argv[1], "0") == 0) {
+ printf("Selected 0 based on %s\n", argv[1]);
+ write_reg(UE_REG_GPIO_TX_DDR, 0xFFFF);
+ write_reg(UE_REG_GPIO_RX_DDR, 0xFFFF);
+ write_reg(UE_REG_GPIO_TX_SEL, 0x0);
+ write_reg(UE_REG_GPIO_RX_SEL, 0x0);
+ write_reg(UE_REG_GPIO_TX_DBG, 0xFFFF);
+ write_reg(UE_REG_GPIO_RX_DBG, 0xFFFF);
+ } else if (strcmp(argv[1], "1") == 0) {
+ printf("Selected 1 based on %s\n", argv[1]);
+ write_reg(UE_REG_GPIO_TX_DDR, 0xFFFF);
+ write_reg(UE_REG_GPIO_RX_DDR, 0xFFFF);
+ write_reg(UE_REG_GPIO_TX_SEL, 0xFFFF);
+ write_reg(UE_REG_GPIO_RX_SEL, 0xFFFF);
+ write_reg(UE_REG_GPIO_TX_DBG, 0xFFFF);
+ write_reg(UE_REG_GPIO_RX_DBG, 0xFFFF);
+ } else {
+ printf("Selected off based on %s\n", argv[1]);
+ write_reg(UE_REG_GPIO_TX_DDR, 0x0);
+ write_reg(UE_REG_GPIO_RX_DDR, 0x0);
+ }
+
+ return 0;
+}
diff --git a/host/apps/omap_debug/usrp-e-gpio.c b/host/apps/omap_debug/usrp-e-gpio.c
new file mode 100644
index 000000000..adef877d3
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-gpio.c
@@ -0,0 +1,83 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/ioctl.h>
+
+#include "usrp_e.h"
+#include "usrp_e_regs.hpp"
+
+// Usage: usrp_e_gpio <string>
+
+static int fp;
+
+static int read_reg(__u16 reg)
+{
+ int ret;
+ struct usrp_e_ctl16 d;
+
+ d.offset = reg;
+ d.count = 1;
+ ret = ioctl(fp, USRP_E_READ_CTL16, &d);
+ return d.buf[0];
+}
+
+static void write_reg(__u16 reg, __u16 val)
+{
+ int ret;
+ struct usrp_e_ctl16 d;
+
+ d.offset = reg;
+ d.count = 1;
+ d.buf[0] = val;
+ ret = ioctl(fp, USRP_E_WRITE_CTL16, &d);
+}
+
+int main(int argc, char *argv[])
+{
+ int i, test, data_in;
+
+ test = 0;
+ if (argc > 1)
+ test = 1;
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+
+ write_reg(UE_REG_GPIO_TX_DDR, 0x0);
+ write_reg(UE_REG_GPIO_RX_DDR, 0xFFFF);
+
+ for (i=0; i < 16; i++) {
+ write_reg(UE_REG_GPIO_RX_IO, 1 << i);
+ sleep(1);
+ if (test) {
+ data_in = read_reg(UE_REG_GPIO_TX_IO);
+ if (data_in != (1 << i))
+ printf("Read failed, wrote: %X read: %X\n", \
+ 1 << i, data_in);
+ }
+ }
+
+ write_reg(UE_REG_GPIO_RX_DDR, 0x0);
+ write_reg(UE_REG_GPIO_TX_DDR, 0xFFFF);
+
+ sleep(1);
+
+ for (i=0; i < 16; i++) {
+ write_reg(UE_REG_GPIO_TX_IO, 1 << i);
+ sleep(1);
+ if (test) {
+ data_in = read_reg(UE_REG_GPIO_RX_IO);
+ if (data_in != (1 << i))
+ printf("Read failed, wrote: %X read: %X\n", \
+ 1 << i, data_in);
+ }
+ }
+
+ write_reg(UE_REG_GPIO_RX_DDR, 0x0);
+ write_reg(UE_REG_GPIO_TX_DDR, 0x0);
+
+ return 0;
+}
diff --git a/host/apps/omap_debug/usrp-e-i2c.c b/host/apps/omap_debug/usrp-e-i2c.c
new file mode 100644
index 000000000..da8709ae1
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-i2c.c
@@ -0,0 +1,87 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
+#include "usrp_e.h"
+
+// Usage: usrp_e_i2c w address data0 data1 data 2 ....
+// Usage: usrp_e_i2c r address count
+
+int main(int argc, char *argv[])
+{
+ int fp, ret, i, tmp;
+ struct usrp_e_i2c *i2c_msg;
+ int direction, address, count;
+
+ if (argc < 3) {
+ printf("Usage: usrp-e-i2c w address data0 data1 data2 ...\n");
+ printf("Usage: usrp-e-i2c r address count\n");
+ printf("All addresses and data in hex.\n");
+ exit(-1);
+ }
+
+ if (strcmp(argv[1], "r") == 0) {
+ direction = 0;
+ } else if (strcmp(argv[1], "w") == 0) {
+ direction = 1;
+ } else {
+ return -1;
+ }
+
+ sscanf(argv[2], "%X", &address);
+ printf("Address = %X\n", address);
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+ if (fp < 0) {
+ perror("Open failed");
+ return -1;
+ }
+
+// sleep(1);
+
+ if (direction) {
+ count = argc - 3;
+ } else {
+ sscanf(argv[3], "%X", &count);
+ }
+ printf("Count = %X\n", count);
+
+ i2c_msg = malloc(sizeof(i2c_msg) + count * sizeof(char));
+
+ i2c_msg->addr = address;
+ i2c_msg->len = count;
+
+ for (i = 0; i < count; i++) {
+ i2c_msg->data[i] = i;
+ }
+
+ if (direction) {
+ // Write
+
+ for (i=0; i<count; i++) {
+ sscanf(argv[3+i], "%X", &tmp);
+ i2c_msg->data[i] = tmp;
+ }
+
+ ret = ioctl(fp, USRP_E_I2C_WRITE, i2c_msg);
+ printf("Return value from i2c_write ioctl: %d\n", ret);
+ } else {
+ // Read
+
+ ret = ioctl(fp, USRP_E_I2C_READ, i2c_msg);
+ printf("Return value from i2c_read ioctl: %d\n", ret);
+
+ printf("Ioctl: %d Data read :", ret);
+ for (i=0; i<count; i++) {
+ printf(" %X", i2c_msg->data[i]);
+ }
+ printf("\n");
+
+ }
+ return 0;
+}
diff --git a/host/apps/omap_debug/usrp-e-lb-test.c b/host/apps/omap_debug/usrp-e-lb-test.c
new file mode 100644
index 000000000..68848064e
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-lb-test.c
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stddef.h>
+#include "usrp_e.h"
+
+// max length #define PKT_DATA_LENGTH 1016
+
+int main(int argc, char *argv[])
+{
+ struct usrp_transfer_frame *tx_data, *rx_data;
+ int i, fp, packet_data_length, cnt;
+ struct usrp_e_ctl16 d;
+
+ if (argc < 2) {
+ printf("%s data_size (in bytes < 2040)\n", argv[0]);
+ return -1;
+ }
+
+ packet_data_length = atoi(argv[1]);
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+
+ d.offset = 14;
+ d.count = 1;
+ d.buf[0] = (1 << 13);
+ ioctl(fp, USRP_E_WRITE_CTL16, &d);
+
+ tx_data = malloc(2048);
+ rx_data = malloc(2048);
+
+ tx_data->status = 0;
+ tx_data->len = sizeof(struct usrp_transfer_frame) + packet_data_length;
+
+ while (1) {
+
+ for (i = 0; i < packet_data_length; i++) {
+ tx_data->buf[i] = random() >> 24;
+
+ }
+
+ cnt = write(fp, tx_data, 2048);
+ cnt = read(fp, rx_data, 2048);
+
+ if (tx_data->len != rx_data->len)
+ printf("Bad frame length sent %d, read %d\n", tx_data->len, rx_data->len);
+
+ for (i = 0; i < packet_data_length; i++) {
+ if (tx_data->buf[i] != rx_data->buf[i])
+ printf("Bad data at %d, sent %d, received %d\n", i, tx_data->buf[i], rx_data->buf[i]);
+ }
+ printf("---------------------------------------------------\n");
+ sleep(1);
+ }
+}
diff --git a/host/apps/omap_debug/usrp-e-led.c b/host/apps/omap_debug/usrp-e-led.c
new file mode 100644
index 000000000..d1b6c8996
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-led.c
@@ -0,0 +1,35 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+
+#include "usrp_e.h"
+#include "usrp_e_regs.hpp"
+
+// Usage: usrp_e_uart <string>
+
+
+int main(int argc, char *argv[])
+{
+ int fp, i, ret;
+ struct usrp_e_ctl16 d;
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+
+ d.offset = UE_REG_MISC_BASE;
+ d.count = 1;
+
+ while (1) {
+ for (i=0; i<8; i++) {
+ d.buf[0] = i;
+ ret = ioctl(fp, USRP_E_WRITE_CTL16, &d);
+ sleep(1);
+ }
+ }
+
+ return 0;
+}
diff --git a/host/apps/omap_debug/usrp-e-loopback.c b/host/apps/omap_debug/usrp-e-loopback.c
new file mode 100644
index 000000000..d11cf7d09
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-loopback.c
@@ -0,0 +1,194 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stddef.h>
+#include <sys/mman.h>
+#include "usrp_e.h"
+
+// max length #define PKT_DATA_LENGTH 1016
+static int packet_data_length;
+static int error;
+
+struct pkt {
+ int len;
+ int checksum;
+ int seq_num;
+ short data[];
+};
+
+static int fp;
+
+static int calc_checksum(struct pkt *p)
+{
+ int i, sum;
+
+ i = 0;
+ sum = 0;
+
+ for (i=0; i < p->len; i++)
+ sum += p->data[i];
+
+ sum += p->seq_num;
+ sum += p->len;
+
+ return sum;
+}
+
+static void *read_thread(void *threadid)
+{
+ char *rx_data;
+ int cnt, prev_seq_num, pkt_count, seq_num_failure;
+ struct pkt *p;
+ unsigned long bytes_transfered, elapsed_seconds;
+ struct timeval start_time, finish_time;
+
+ printf("Greetings from the reading thread!\n");
+
+ bytes_transfered = 0;
+ gettimeofday(&start_time, NULL);
+
+ // IMPORTANT: must assume max length packet from fpga
+ rx_data = malloc(2048);
+ p = (struct pkt *) ((void *)rx_data);
+
+ prev_seq_num = 0;
+ pkt_count = 0;
+ seq_num_failure = 0;
+
+ while (1) {
+
+ cnt = read(fp, rx_data, 2048);
+ if (cnt < 0)
+ printf("Error returned from read: %d, sequence number = %d\n", cnt, p->seq_num);
+
+// printf("p->seq_num = %d\n", p->seq_num);
+
+
+ pkt_count++;
+
+ if (p->seq_num != prev_seq_num + 1) {
+ printf("Sequence number fail, current = %d, previous = %d, pkt_count = %d\n",
+ p->seq_num, prev_seq_num, pkt_count);
+
+ seq_num_failure ++;
+ if (seq_num_failure > 2)
+ error = 1;
+ }
+
+ prev_seq_num = p->seq_num;
+
+ if (calc_checksum(p) != p->checksum) {
+ printf("Checksum fail packet = %X, expected = %X, pkt_count = %d\n",
+ calc_checksum(p), p->checksum, pkt_count);
+ error = 1;
+ }
+
+ bytes_transfered += cnt;
+
+ if (bytes_transfered > (100 * 1000000)) {
+ gettimeofday(&finish_time, NULL);
+ elapsed_seconds = finish_time.tv_sec - start_time.tv_sec;
+
+ printf("RX data transfer rate = %f K Samples/second\n",
+ (float) bytes_transfered / (float) elapsed_seconds / 4000);
+
+
+ start_time = finish_time;
+ bytes_transfered = 0;
+ }
+
+
+// printf(".");
+// fflush(stdout);
+// printf("\n");
+ }
+
+}
+
+static void *write_thread(void *threadid)
+{
+ int seq_number, i, cnt;
+ void *tx_data;
+ struct pkt *p;
+
+ printf("Greetings from the write thread!\n");
+
+ tx_data = malloc(2048);
+ p = (struct pkt *) ((void *)tx_data);
+
+ for (i=0; i < packet_data_length; i++)
+// p->data[i] = random() >> 16;
+ p->data[i] = i;
+
+ seq_number = 1;
+
+ while (1) {
+ p->seq_num = seq_number++;
+
+ if (packet_data_length > 0)
+ p->len = packet_data_length;
+ else
+ p->len = (random() & 0x1ff) + (1004 - 512);
+
+ p->checksum = calc_checksum(p);
+
+ cnt = write(fp, tx_data, p->len * 2 + 12);
+ if (cnt < 0)
+ printf("Error returned from write: %d\n", cnt);
+// sleep(1);
+ }
+}
+
+
+int main(int argc, char *argv[])
+{
+ pthread_t tx, rx;
+ long int t;
+ struct sched_param s = {
+ .sched_priority = 1
+ };
+ void *rb;
+ struct usrp_transfer_frame *tx_rb, *rx_rb;
+
+ if (argc < 2) {
+ printf("%s data_size\n", argv[0]);
+ return -1;
+ }
+
+ packet_data_length = atoi(argv[1]);
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+
+ rb = mmap(0, 202 * 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fp, 0);
+ if (!rb) {
+ printf("mmap failed\n");
+ exit;
+ }
+
+
+ sched_setscheduler(0, SCHED_RR, &s);
+ error = 0;
+
+#if 1
+ if (pthread_create(&rx, NULL, read_thread, (void *) t)) {
+ printf("Failed to create rx thread\n");
+ exit(-1);
+ }
+
+ sleep(1);
+#endif
+
+ if (pthread_create(&tx, NULL, write_thread, (void *) t)) {
+ printf("Failed to create tx thread\n");
+ exit(-1);
+ }
+
+// while (!error)
+ sleep(1000000000);
+
+ printf("Done sleeping\n");
+}
diff --git a/host/apps/omap_debug/usrp-e-mm-loopback.c b/host/apps/omap_debug/usrp-e-mm-loopback.c
new file mode 100644
index 000000000..f5fc83c87
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-mm-loopback.c
@@ -0,0 +1,258 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stddef.h>
+#include <sys/mman.h>
+#include <poll.h>
+#include "usrp_e.h"
+
+// max length #define PKT_DATA_LENGTH 1016
+static int packet_data_length;
+static int error;
+
+struct pkt {
+ int len;
+ int checksum;
+ int seq_num;
+ short data[1024-6];
+};
+
+struct ring_buffer_info (*rxi)[];
+struct ring_buffer_info (*txi)[];
+struct pkt (*rx_buf)[200];
+struct pkt (*tx_buf)[200];
+
+static int fp;
+static struct usrp_e_ring_buffer_size_t rb_size;
+
+static int calc_checksum(struct pkt *p)
+{
+ int i, sum;
+
+ i = 0;
+ sum = 0;
+
+ for (i=0; i < p->len; i++)
+ sum += p->data[i];
+
+ sum += p->seq_num;
+ sum += p->len;
+
+ return sum;
+}
+
+static void *read_thread(void *threadid)
+{
+ int cnt, prev_seq_num, pkt_count, seq_num_failure;
+ struct pkt *p;
+ unsigned long bytes_transfered, elapsed_seconds;
+ struct timeval start_time, finish_time;
+ int rb_read;
+
+ printf("Greetings from the reading thread!\n");
+ printf("sizeof pkt = %d\n", sizeof(struct pkt));
+
+ rb_read = 0;
+
+ bytes_transfered = 0;
+ gettimeofday(&start_time, NULL);
+
+ prev_seq_num = 0;
+ pkt_count = 0;
+ seq_num_failure = 0;
+
+ while (1) {
+
+ if (!((*rxi)[rb_read].flags & RB_USER)) {
+// printf("Waiting for data\n");
+ struct pollfd pfd;
+ pfd.fd = fp;
+ pfd.events = POLLIN;
+ ssize_t ret = poll(&pfd, 1, -1);
+ }
+
+// printf("pkt received, rb_read = %d\n", rb_read);
+
+ cnt = (*rxi)[rb_read].len;
+ p = &(*rx_buf)[rb_read];
+
+// cnt = read(fp, rx_data, 2048);
+// if (cnt < 0)
+// printf("Error returned from read: %d, sequence number = %d\n", cnt, p->seq_num);
+
+// printf("p = %X, p->seq_num = %d p->len = %d\n", p, p->seq_num, p->len);
+
+
+ pkt_count++;
+
+ if (p->seq_num != prev_seq_num + 1) {
+ printf("Sequence number fail, current = %d, previous = %d, pkt_count = %d\n",
+ p->seq_num, prev_seq_num, pkt_count);
+ printf("pkt received, rb_read = %d\n", rb_read);
+ printf("p = %X, p->seq_num = %d p->len = %d\n", p, p->seq_num, p->len);
+
+ seq_num_failure ++;
+ if (seq_num_failure > 2)
+ error = 1;
+ }
+
+ prev_seq_num = p->seq_num;
+
+ if (calc_checksum(p) != p->checksum) {
+ printf("Checksum fail packet = %X, expected = %X, pkt_count = %d\n",
+ calc_checksum(p), p->checksum, pkt_count);
+ error = 1;
+ }
+
+ (*rxi)[rb_read].flags = RB_KERNEL;
+
+ rb_read++;
+ if (rb_read == rb_size.num_rx_frames)
+ rb_read = 0;
+
+ bytes_transfered += cnt;
+
+ if (bytes_transfered > (100 * 1000000)) {
+ gettimeofday(&finish_time, NULL);
+ elapsed_seconds = finish_time.tv_sec - start_time.tv_sec;
+
+ printf("RX data transfer rate = %f K Samples/second\n",
+ (float) bytes_transfered / (float) elapsed_seconds / 4000);
+
+
+ start_time = finish_time;
+ bytes_transfered = 0;
+ }
+
+
+// printf(".");
+// fflush(stdout);
+// printf("\n");
+ }
+
+}
+
+static void *write_thread(void *threadid)
+{
+ int seq_number, i, cnt, rb_write;
+ void *tx_data;
+ struct pkt *p;
+
+ printf("Greetings from the write thread!\n");
+
+ tx_data = malloc(2048);
+ p = (struct pkt *) ((void *)tx_data);
+
+ for (i=0; i < packet_data_length; i++)
+// p->data[i] = random() >> 16;
+ p->data[i] = i;
+
+ seq_number = 1;
+ rb_write = 0;
+
+ while (1) {
+ p->seq_num = seq_number++;
+
+ if (packet_data_length > 0)
+ p->len = packet_data_length;
+ else
+ p->len = (random() & 0x1ff) + (1004 - 512);
+
+ p->checksum = calc_checksum(p);
+
+ if (!((*txi)[rb_write].flags & RB_KERNEL)) {
+// printf("Waiting for space\n");
+ struct pollfd pfd;
+ pfd.fd = fp;
+ pfd.events = POLLOUT;
+ ssize_t ret = poll(&pfd, 1, -1);
+ }
+
+ memcpy(&(*tx_buf)[rb_write], tx_data, p->len * 2 + 12);
+
+ (*txi)[rb_write].len = p->len * 2 + 12;
+ (*txi)[rb_write].flags = RB_USER;
+
+ rb_write++;
+ if (rb_write == rb_size.num_tx_frames)
+ rb_write = 0;
+
+ cnt = write(fp, NULL, 0);
+// if (cnt < 0)
+// printf("Error returned from write: %d\n", cnt);
+// sleep(1);
+ }
+}
+
+
+int main(int argc, char *argv[])
+{
+ pthread_t tx, rx;
+ long int t;
+ struct sched_param s = {
+ .sched_priority = 1
+ };
+ int ret, map_size, page_size;
+ void *rb;
+
+ if (argc < 2) {
+ printf("%s data_size\n", argv[0]);
+ return -1;
+ }
+
+ packet_data_length = atoi(argv[1]);
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+
+ page_size = getpagesize();
+
+ ret = ioctl(fp, USRP_E_GET_RB_INFO, &rb_size);
+
+ map_size = (rb_size.num_pages_rx_flags + rb_size.num_pages_tx_flags) * page_size +
+ (rb_size.num_rx_frames + rb_size.num_tx_frames) * (page_size >> 1);
+
+ rb = mmap(0, map_size, PROT_READ|PROT_WRITE, MAP_SHARED, fp, 0);
+ if (rb == MAP_FAILED) {
+ perror("mmap failed");
+ return -1;
+ }
+
+ printf("rb = %X\n", rb);
+
+ rxi = rb;
+ rx_buf = rb + (rb_size.num_pages_rx_flags * page_size);
+ txi = rb + (rb_size.num_pages_rx_flags * page_size) +
+ (rb_size.num_rx_frames * page_size >> 1);
+ tx_buf = rb + (rb_size.num_pages_rx_flags * page_size) +
+ (rb_size.num_rx_frames * page_size >> 1) +
+ (rb_size.num_pages_tx_flags * page_size);
+
+ printf("rxi = %X, rx_buf = %X, txi = %X, tx_buf = %X\n", rxi, rx_buf, txi, tx_buf);
+
+ sched_setscheduler(0, SCHED_RR, &s);
+ error = 0;
+
+#if 1
+ if (pthread_create(&rx, NULL, read_thread, (void *) t)) {
+ printf("Failed to create rx thread\n");
+ exit(-1);
+ }
+
+ sleep(1);
+#endif
+
+ if (pthread_create(&tx, NULL, write_thread, (void *) t)) {
+ printf("Failed to create tx thread\n");
+ exit(-1);
+ }
+
+// while (!error)
+ sleep(1000000000);
+
+ printf("Done sleeping\n");
+}
diff --git a/host/apps/omap_debug/usrp-e-ram.c b/host/apps/omap_debug/usrp-e-ram.c
new file mode 100644
index 000000000..d548f7ccd
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-ram.c
@@ -0,0 +1,25 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+int main(int rgc, char *argv[])
+{
+ int fp, i, cnt;
+ unsigned short buf[1024];
+ unsigned short buf_rb[1024];
+
+ fp = open("/dev/usrp1_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+
+ for (i=0; i<1024; i++)
+ buf[i] = i*256;
+ write(fp, buf, 2048);
+ read(fp, buf_rb, 2048);
+
+ printf("Read back %hX %hX\n", buf_rb[0], buf_rb[1]);
+
+ for (i=0; i<1024; i++) {
+ if (buf[i] != buf_rb[i])
+ printf("Read - %hX, expected - %hX\n", buf_rb[i], buf[i]);
+ }
+}
diff --git a/host/apps/omap_debug/usrp-e-random-loopback.c b/host/apps/omap_debug/usrp-e-random-loopback.c
new file mode 100644
index 000000000..5960b8fbd
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-random-loopback.c
@@ -0,0 +1,149 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stddef.h>
+#include "usrp_e.h"
+
+// max length #define PKT_DATA_LENGTH 1014
+static int packet_data_length;
+
+struct pkt {
+ int checksum;
+ int seq_num;
+ int len;
+ short data[];
+};
+
+static int fp;
+
+static int calc_checksum(struct pkt *p)
+{
+ int i, sum;
+
+ i = 0;
+ sum = 0;
+
+ for (i=0; i < p->len; i++)
+ sum += p->data[i];
+
+ sum += p->seq_num;
+
+ return sum;
+}
+
+int randN(int n)
+{
+ long tmp;
+
+ tmp = rand() % n;
+
+ return tmp;
+}
+
+static void *read_thread(void *threadid)
+{
+ int cnt, prev_seq_num;
+ struct usrp_transfer_frame *rx_data;
+ struct pkt *p;
+
+ printf("Greetings from the reading thread!\n");
+
+ // IMPORTANT: must assume max length packet from fpga
+ rx_data = malloc(sizeof(struct usrp_transfer_frame) + sizeof(struct pkt) + (1014 * 2));
+ rx_data = malloc(2048);
+ p = (struct pkt *) ((void *)rx_data + offsetof(struct usrp_transfer_frame, buf));
+ //p = &(rx_data->buf[0]);
+ printf("Address of rx_data = %p, p = %p\n", rx_data, p);
+ printf("offsetof = %d\n", offsetof(struct usrp_transfer_frame, buf));
+ printf("sizeof rx data = %d\n", sizeof(struct usrp_transfer_frame) + sizeof(struct pkt));
+
+ prev_seq_num = 0;
+
+ while (1) {
+
+ cnt = read(fp, rx_data, 2048);
+// printf("Packet received, status = %X, len = %d\n", rx_data->status, rx_data->len);
+// printf("p->seq_num = %d\n", p->seq_num);
+
+ if (p->seq_num != prev_seq_num + 1)
+ printf("Sequence number fail, current = %d, previous = %d\n",
+ p->seq_num, prev_seq_num);
+ prev_seq_num = p->seq_num;
+
+ if (calc_checksum(p) != p->checksum)
+ printf("Checksum fail packet = %d, expected = %d\n",
+ calc_checksum(p), p->checksum);
+ printf(".");
+ fflush(stdout);
+// printf("\n");
+ }
+
+}
+
+static void *write_thread(void *threadid)
+{
+ int seq_number, i, cnt, pkt_cnt;
+ struct usrp_transfer_frame *tx_data;
+ struct pkt *p;
+
+ printf("Greetings from the write thread!\n");
+
+ // Allocate max length buffer for frame
+ tx_data = malloc(2048);
+ p = (struct pkt *) ((void *)tx_data + offsetof(struct usrp_transfer_frame, buf));
+ printf("Address of tx_data = %p, p = %p\n", tx_data, p);
+
+ printf("sizeof rp_transfer_frame = %d, sizeof pkt = %d\n", sizeof(struct usrp_transfer_frame), sizeof(struct pkt));
+
+ for (i=0; i < 1014; i++)
+// p->data[i] = random() >> 16;
+ p->data[i] = i;
+
+ tx_data->status = 0xdeadbeef;
+ tx_data->len = 8 + packet_data_length * 2;
+
+ printf("tx_data->len = %d\n", tx_data->len);
+
+ seq_number = 1;
+
+ while (1) {
+ pkt_cnt = randN(16);
+ for (i = 0; i < pkt_cnt; i++) {
+ p->seq_num = seq_number++;
+ p->len = randN(1013) + 1;
+ p->checksum = calc_checksum(p);
+ tx_data->len = 12 + p->len * 2;
+ cnt = write(fp, tx_data, tx_data->len + 8);
+ }
+ sleep(random() >> 31);
+ }
+}
+
+
+int main(int argc, char *argv[])
+{
+ pthread_t tx, rx;
+ long int t;
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+
+ if (pthread_create(&rx, NULL, read_thread, (void *) t)) {
+ printf("Failed to create rx thread\n");
+ exit(-1);
+ }
+
+ sleep(1);
+
+ if (pthread_create(&tx, NULL, write_thread, (void *) t)) {
+ printf("Failed to create tx thread\n");
+ exit(-1);
+ }
+
+ sleep(1000000000);
+
+ printf("Done sleeping\n");
+}
diff --git a/host/apps/omap_debug/usrp-e-read.c b/host/apps/omap_debug/usrp-e-read.c
new file mode 100644
index 000000000..c28f018d5
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-read.c
@@ -0,0 +1,18 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+int main(int rgc, char *argv[])
+{
+ int fp, cnt;
+ short buf[1024];
+
+ fp = open("/dev/usrp1_e0", O_RDONLY);
+ printf("fp = %d\n", fp);
+
+ do {
+ cnt = read(fp, buf, 2048);
+// printf("Bytes read - %d\n", cnt);
+ } while(1);
+ printf("Data - %hX\n", buf[0]);
+}
diff --git a/host/apps/omap_debug/usrp-e-spi.c b/host/apps/omap_debug/usrp-e-spi.c
new file mode 100644
index 000000000..c353c409b
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-spi.c
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
+#include "usrp_e.h"
+
+// Usage: usrp_e_spi w|rb slave data
+
+int main(int argc, char *argv[])
+{
+ int fp, slave, length, ret;
+ unsigned int data;
+ struct usrp_e_spi spi_dat;
+
+ if (argc < 5) {
+ printf("Usage: usrp_e_spi w|rb slave transfer_length data\n");
+ exit(-1);
+ }
+
+ slave = atoi(argv[2]);
+ length = atoi(argv[3]);
+ data = atoll(argv[4]);
+
+ printf("Data = %X\n", data);
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+ if (fp < 0) {
+ perror("Open failed");
+ return -1;
+ }
+
+// sleep(1);
+
+
+ spi_dat.slave = slave;
+ spi_dat.data = data;
+ spi_dat.length = length;
+ spi_dat.flags = UE_SPI_PUSH_FALL | UE_SPI_LATCH_RISE;
+
+ if (*argv[1] == 'r') {
+ spi_dat.readback = 1;
+ ret = ioctl(fp, USRP_E_SPI, &spi_dat);
+ printf("Ioctl returns: %d, Data returned = %d\n", ret, spi_dat.data);
+ } else {
+ spi_dat.readback = 0;
+ ioctl(fp, USRP_E_SPI, &spi_dat);
+ }
+
+ return 0;
+}
diff --git a/host/apps/omap_debug/usrp-e-timed.c b/host/apps/omap_debug/usrp-e-timed.c
new file mode 100644
index 000000000..3cb33ce2d
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-timed.c
@@ -0,0 +1,233 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stddef.h>
+#include "usrp_e.h"
+
+// max length #define PKT_DATA_LENGTH 1016
+static int packet_data_length;
+
+struct pkt {
+ int checksum;
+ int seq_num;
+ short data[];
+};
+
+static int fp;
+
+static int calc_checksum(struct pkt *p)
+{
+ int i, sum;
+
+ i = 0;
+ sum = 0;
+
+ for (i=0; i < packet_data_length; i++)
+ sum += p->data[i];
+
+ sum += p->seq_num;
+
+ return sum;
+}
+
+static void *read_thread(void *threadid)
+{
+ int cnt, prev_seq_num;
+ struct usrp_transfer_frame *rx_data;
+ struct pkt *p;
+ int rx_pkt_cnt;
+ int i;
+ unsigned long bytes_transfered, elapsed_seconds;
+ struct timeval start_time, finish_time;
+
+ printf("Greetings from the reading thread!\n");
+
+ bytes_transfered = 0;
+ gettimeofday(&start_time, NULL);
+
+ // IMPORTANT: must assume max length packet from fpga
+ rx_data = malloc(sizeof(struct usrp_transfer_frame) + sizeof(struct pkt) + (1016 * 2));
+ p = (struct pkt *) ((void *)rx_data + offsetof(struct usrp_transfer_frame, buf));
+ //p = &(rx_data->buf[0]);
+ printf("Address of rx_data = %p, p = %p\n", rx_data, p);
+ printf("offsetof = %d\n", offsetof(struct usrp_transfer_frame, buf));
+ printf("sizeof rx data = %d\n", sizeof(struct usrp_transfer_frame) + sizeof(struct pkt));
+
+ prev_seq_num = 0;
+
+ rx_pkt_cnt = 0;
+
+ while (1) {
+
+ cnt = read(fp, rx_data, 2048);
+ if (cnt < 0)
+ printf("Error returned from read: %d\n", cnt);
+ rx_pkt_cnt++;
+
+#if 0
+ if (rx_pkt_cnt == 512) {
+ printf(".");
+ fflush(stdout);
+ rx_pkt_cnt = 0;
+ }
+#endif
+
+ if (rx_data->status & RB_OVERRUN)
+ printf("O");
+
+ bytes_transfered += rx_data->len;
+
+ if (bytes_transfered > (100 * 1000000)) {
+ gettimeofday(&finish_time, NULL);
+ elapsed_seconds = finish_time.tv_sec - start_time.tv_sec;
+
+ printf("RX data transfer rate = %f K Samples/second\n",
+ (float) bytes_transfered / (float) elapsed_seconds / 4000);
+
+
+ start_time = finish_time;
+ bytes_transfered = 0;
+ }
+ }
+
+}
+
+static void *write_thread(void *threadid)
+{
+ int seq_number, i, cnt, tx_pkt_cnt;
+ struct usrp_transfer_frame *tx_data;
+ struct pkt *p;
+ unsigned long bytes_transfered, elapsed_seconds;
+ struct timeval start_time, finish_time;
+
+ printf("Greetings from the write thread!\n");
+
+ bytes_transfered = 0;
+ gettimeofday(&start_time, NULL);
+
+ tx_data = malloc(sizeof(struct usrp_transfer_frame) + sizeof(struct pkt) + (packet_data_length * 2));
+ p = (struct pkt *) ((void *)tx_data + offsetof(struct usrp_transfer_frame, buf));
+ printf("Address of tx_data = %p, p = %p\n", tx_data, p);
+
+ printf("sizeof rp_transfer_frame = %d, sizeof pkt = %d\n", sizeof(struct usrp_transfer_frame), sizeof(struct pkt));
+
+ for (i=0; i < packet_data_length; i++)
+// p->data[i] = random() >> 16;
+ p->data[i] = i;
+
+ tx_data->status = 0;
+ tx_data->len = 8 + packet_data_length * 2;
+
+ printf("tx_data->len = %d\n", tx_data->len);
+
+ seq_number = 1;
+ tx_pkt_cnt = 0;
+
+ while (1) {
+
+ tx_pkt_cnt++;
+
+#if 0
+ if (tx_pkt_cnt == 512) {
+ printf(".");
+ fflush(stdout);
+ }
+ if (tx_pkt_cnt == 1024) {
+ printf("'");
+ fflush(stdout);
+ }
+ if (tx_pkt_cnt == 1536) {
+ printf(":");
+ fflush(stdout);
+ tx_pkt_cnt = 0;
+ }
+#endif
+
+// printf("tx status = %X, len = %d\n", tx_data->status, tx_data->len);
+ p->seq_num = seq_number++;
+ p->checksum = calc_checksum(p);
+ cnt = write(fp, tx_data, 2048);
+ if (cnt < 0)
+ printf("Error returned from write: %d\n", cnt);
+
+ bytes_transfered += tx_data->len;
+
+ if (bytes_transfered > (100 * 1000000)) {
+ gettimeofday(&finish_time, NULL);
+ elapsed_seconds = finish_time.tv_sec - start_time.tv_sec;
+
+ printf("TX data transfer rate = %f K Samples/second\n",
+ (float) bytes_transfered / (float) elapsed_seconds / 4000);
+
+
+ start_time = finish_time;
+ bytes_transfered = 0;
+ }
+// sleep(1);
+ }
+}
+
+
+int main(int argc, char *argv[])
+{
+ pthread_t tx, rx;
+ long int t;
+ int fpga_config_flag ,decimation;
+ struct usrp_e_ctl16 d;
+ struct sched_param s = {
+ .sched_priority = 1
+ };
+
+ if (argc < 4) {
+ printf("%s r|w|rw decimation data_size\n", argv[0]);
+ return -1;
+ }
+
+ decimation = atoi(argv[2]);
+ packet_data_length = atoi(argv[3]);
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+
+ fpga_config_flag = 0;
+ if (strcmp(argv[1], "w") == 0)
+ fpga_config_flag |= (1 << 15);
+ else if (strcmp(argv[1], "r") == 0)
+ fpga_config_flag |= (1 << 14);
+ else if (strcmp(argv[1], "rw") == 0)
+ fpga_config_flag |= ((1 << 15) | (1 << 14));
+
+ fpga_config_flag |= decimation;
+
+ d.offset = 14;
+ d.count = 1;
+ d.buf[0] = fpga_config_flag;
+ ioctl(fp, USRP_E_WRITE_CTL16, &d);
+
+ sleep(1); // in case the kernel threads need time to start. FIXME if so
+
+ sched_setscheduler(0, SCHED_RR, &s);
+
+ if (fpga_config_flag & (1 << 14)) {
+ if (pthread_create(&rx, NULL, read_thread, (void *) t)) {
+ printf("Failed to create rx thread\n");
+ exit(-1);
+ }
+ }
+
+ sleep(1);
+
+ if (fpga_config_flag & (1 << 15)) {
+ if (pthread_create(&tx, NULL, write_thread, (void *) t)) {
+ printf("Failed to create tx thread\n");
+ exit(-1);
+ }
+ }
+
+ sleep(10000);
+
+ printf("Done sleeping\n");
+}
diff --git a/host/apps/omap_debug/usrp-e-uart-rx.c b/host/apps/omap_debug/usrp-e-uart-rx.c
new file mode 100644
index 000000000..24b417980
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-uart-rx.c
@@ -0,0 +1,53 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/ioctl.h>
+
+#include "usrp_e.h"
+#include "usrp_e_regs.hpp"
+
+// Usage: usrp_e_uart <string>
+
+
+int main(int argc, char *argv[])
+{
+ int fp, ret;
+ struct usrp_e_ctl16 d;
+ __u16 clkdiv;
+
+ if (argc == 0) {
+ printf("Usage: usrp-e-uart-rx <opt clkdiv>\n");
+ printf("clkdiv = 278 is 230.4k \n");
+ printf("clkdiv = 556 is 115.2k \n");
+ exit(-1);
+ }
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+
+ if (argc == 2) {
+ clkdiv = atoi(argv[1]);
+ d.offset = UE_REG_UART_CLKDIV;
+ d.count = 1;
+ d.buf[0] = clkdiv;
+ ret = ioctl(fp, USRP_E_WRITE_CTL16, &d);
+ }
+
+ while(1) {
+ d.offset = UE_REG_UART_RXLEVEL;
+ d.count = 1;
+ ret = ioctl(fp, USRP_E_READ_CTL16, &d);
+
+ if (d.buf[0] > 0) {
+ d.offset = UE_REG_UART_RXCHAR;
+ d.count = 1;
+ ret = ioctl(fp, USRP_E_READ_CTL16, &d);
+ printf("%c", d.buf[0]);
+ fflush(stdout);
+ }
+ }
+
+ return 0;
+}
diff --git a/host/apps/omap_debug/usrp-e-uart.c b/host/apps/omap_debug/usrp-e-uart.c
new file mode 100644
index 000000000..2956c407f
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-uart.c
@@ -0,0 +1,48 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/ioctl.h>
+
+#include "usrp_e.h"
+#include "usrp_e_regs.hpp"
+
+// Usage: usrp_e_uart <string>
+
+
+int main(int argc, char *argv[])
+{
+ int fp, i, ret;
+ struct usrp_e_ctl16 d;
+ char *str = argv[1];
+ __u16 clkdiv;
+
+ if (argc < 2) {
+ printf("Usage: usrp_e_uart <string> <opt clkdiv>\n");
+ printf("clkdiv = 278 is 230.4k \n");
+ printf("clkdiv = 556 is 115.2k \n");
+ exit(-1);
+ }
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+
+ if (argc == 3) {
+ clkdiv = atoi(argv[2]);
+ d.offset = UE_REG_UART_CLKDIV;
+ d.count = 1;
+ d.buf[0] = clkdiv;
+ ret = ioctl(fp, USRP_E_WRITE_CTL16, &d);
+ }
+
+ for (i=0; i<strlen(str); i++) {
+ d.offset = UE_REG_UART_TXCHAR;
+ d.count = 1;
+ d.buf[0] = str[i];
+ ret = ioctl(fp, USRP_E_WRITE_CTL16, &d);
+ printf("Wrote %X, to %X, ret = %d\n", d.buf[0], d.offset, ret);
+ }
+
+ return 0;
+}
diff --git a/host/apps/omap_debug/usrp-e-write.c b/host/apps/omap_debug/usrp-e-write.c
new file mode 100644
index 000000000..903c0071f
--- /dev/null
+++ b/host/apps/omap_debug/usrp-e-write.c
@@ -0,0 +1,21 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+int main(int rgc, char *argv[])
+{
+ int fp, i, cnt;
+ short buf[1024];
+
+ fp = open("/dev/usrp1_e0", O_WRONLY);
+ printf("fp = %d\n", fp);
+
+ for (i=0; i<1024; i++) {
+ buf[i] = i;
+ }
+
+// do {
+ cnt = write(fp, buf, 2048);
+ printf("Bytes written - %d\n", cnt);
+// } while (1);
+}
diff --git a/host/apps/omap_debug/usrp_e.h b/host/apps/omap_debug/usrp_e.h
new file mode 100644
index 000000000..f96706c4a
--- /dev/null
+++ b/host/apps/omap_debug/usrp_e.h
@@ -0,0 +1,90 @@
+
+/*
+ * Copyright (C) 2010 Ettus Research, LLC
+ *
+ * Written by Philip Balister <philip@opensdr.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef __USRP_E_H
+#define __USRP_E_H
+
+#include <linux/types.h>
+#include <linux/ioctl.h>
+
+struct usrp_e_ctl16 {
+ __u32 offset;
+ __u32 count;
+ __u16 buf[20];
+};
+
+struct usrp_e_ctl32 {
+ __u32 offset;
+ __u32 count;
+ __u32 buf[10];
+};
+
+/* SPI interface */
+
+#define UE_SPI_TXONLY 0
+#define UE_SPI_TXRX 1
+
+/* Defines for spi ctrl register */
+#define UE_SPI_CTRL_TXNEG (BIT(10))
+#define UE_SPI_CTRL_RXNEG (BIT(9))
+
+#define UE_SPI_PUSH_RISE 0
+#define UE_SPI_PUSH_FALL UE_SPI_CTRL_TXNEG
+#define UE_SPI_LATCH_RISE 0
+#define UE_SPI_LATCH_FALL UE_SPI_CTRL_RXNEG
+#define USRP_E_GET_COMPAT_NUMBER _IO(USRP_E_IOC_MAGIC, 0x28)
+
+#define USRP_E_COMPAT_NUMBER 1
+
+struct usrp_e_spi {
+ __u8 readback;
+ __u32 slave;
+ __u32 data;
+ __u32 length;
+ __u32 flags;
+};
+
+struct usrp_e_i2c {
+ __u8 addr;
+ __u32 len;
+ __u8 data[];
+};
+
+#define USRP_E_IOC_MAGIC 'u'
+#define USRP_E_WRITE_CTL16 _IOW(USRP_E_IOC_MAGIC, 0x20, struct usrp_e_ctl16)
+#define USRP_E_READ_CTL16 _IOWR(USRP_E_IOC_MAGIC, 0x21, struct usrp_e_ctl16)
+#define USRP_E_WRITE_CTL32 _IOW(USRP_E_IOC_MAGIC, 0x22, struct usrp_e_ctl32)
+#define USRP_E_READ_CTL32 _IOWR(USRP_E_IOC_MAGIC, 0x23, struct usrp_e_ctl32)
+#define USRP_E_SPI _IOWR(USRP_E_IOC_MAGIC, 0x24, struct usrp_e_spi)
+#define USRP_E_I2C_READ _IOWR(USRP_E_IOC_MAGIC, 0x25, struct usrp_e_i2c)
+#define USRP_E_I2C_WRITE _IOW(USRP_E_IOC_MAGIC, 0x26, struct usrp_e_i2c)
+#define USRP_E_GET_RB_INFO _IOR(USRP_E_IOC_MAGIC, 0x27, struct usrp_e_ring_buffer_size_t)
+
+/* Flag defines */
+#define RB_USER (1<<0)
+#define RB_KERNEL (1<<1)
+#define RB_OVERRUN (1<<2)
+#define RB_DMA_ACTIVE (1<<3)
+
+struct ring_buffer_info {
+ int flags;
+ int len;
+};
+
+struct usrp_e_ring_buffer_size_t {
+ int num_pages_rx_flags;
+ int num_rx_frames;
+ int num_pages_tx_flags;
+ int num_tx_frames;
+};
+
+#endif
diff --git a/host/apps/omap_debug/write-eeprom.sh b/host/apps/omap_debug/write-eeprom.sh
new file mode 100755
index 000000000..301b06f07
--- /dev/null
+++ b/host/apps/omap_debug/write-eeprom.sh
@@ -0,0 +1,92 @@
+#!/bin/bash
+
+if [ $# -ne 3 ] && [ $# -ne 5 ];
+then
+ echo "Usage:"
+ echo ""
+ echo "writeprom.sh deviceid rev fab_rev [envvar envsetting]"
+ echo
+ echo " deviceid - expansion board device number from table:"
+ echo
+ echo " Summit 0x01"
+ echo " Tobi 0x02"
+ echo " Tobi Duo 0x03"
+ echo " Palo35 0x04"
+ echo " Palo43 0x05"
+ echo " Chestnut43 0x06"
+ echo " Pinto 0x07"
+ echo
+ echo " rev - board revision (e.g. 0x00)"
+ echo " fab_rev - revision marking from pcb (e.g. R2411)"
+ echo " envvar - optional u-boot env variable name"
+ echo " (e.g. dvimode)"
+ echo " envsetting - optional u-boot env variable setting"
+ echo " (e.g. 1024x768MR-16@60)"
+ exit 1
+fi
+
+fabrevision=$3
+if [ ${#fabrevision} -ge 8 ]; then
+ echo "Error: fab revision string must less than 8 characters"
+ exit 1
+fi
+
+envvar=$4
+if [ ${#envar} -ge 16 ]; then
+ echo "Error: environment variable name string must less than 16 characters"
+ exit 1
+fi
+
+envsetting=$5
+if [ ${#ensetting} -ge 64 ]; then
+ echo "Error: environment setting string must less than 64 characters"
+ exit 1
+fi
+
+bus=3
+device=0x51
+vendorid=0x03
+
+i2cset -y $bus $device 0x00 0x00
+i2cset -y $bus $device 0x01 $vendorid
+i2cset -y $bus $device 0x02 0x00
+i2cset -y $bus $device 0x03 $1
+i2cset -y $bus $device 0x04 $2
+i2cset -y $bus $device 0x05 00
+
+let i=6
+hexdumpargs="'${#fabrevision}/1 \"0x%02x \"'"
+command="echo -n \"$fabrevision\" | hexdump -e $hexdumpargs"
+hex=$(eval $command)
+for character in $hex; do
+ i2cset -y $bus $device $i $character
+ let i=$i+1
+done
+i2cset -y $bus $device $i 0x00
+
+if [ $# -eq 5 ]
+then
+ i2cset -y $bus $device 0x05 0x01
+
+ let i=14
+ hexdumpargs="'${#envvar}/1 \"0x%02x \"'"
+ command="echo -n \"$envvar\" | hexdump -e $hexdumpargs"
+ hex=$(eval $command)
+ for character in $hex; do
+ i2cset -y $bus $device $i $character
+ let i=$i+1
+ done
+ i2cset -y $bus $device $i 0x00
+
+ let i=30
+ hexdumpargs="'${#envsetting}/1 \"0x%02x \"'"
+ command="echo -n \"$envsetting\" | hexdump -e $hexdumpargs"
+ hex=$(eval $command)
+ for character in $hex; do
+ i2cset -y $bus $device $i $character
+ let i=$i+1
+ done
+ i2cset -y $bus $device $i 0x00
+fi
+
+
diff --git a/host/apps/omap_debug/write_board_id.sh b/host/apps/omap_debug/write_board_id.sh
new file mode 100755
index 000000000..067269c64
--- /dev/null
+++ b/host/apps/omap_debug/write_board_id.sh
@@ -0,0 +1,10 @@
+#!/bin/sh
+
+i2cset -y 3 0x51 0x00 0x00
+i2cset -y 3 0x51 0x01 0x03
+i2cset -y 3 0x51 0x02 0x00
+i2cset -y 3 0x51 0x03 0x01
+i2cset -y 3 0x51 0x04 0x00
+i2cset -y 3 0x51 0x05 0x00
+
+
diff --git a/host/docs/transport.rst b/host/docs/transport.rst
index 432db4bb5..2f730f8e4 100644
--- a/host/docs/transport.rst
+++ b/host/docs/transport.rst
@@ -40,6 +40,17 @@ The following parameters can be used to alter the transport's default behavior:
as the asynchronous send implementation is currently disabled.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+Flow control parameters
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+The host-based flow control expects periodic update packets from the device.
+These update packets inform the host of the last packet consumed by the device,
+which allows the host to determine throttling conditions for the transmission of packets.
+The following mechanisms affect the transmission of periodic update packets:
+
+* **ups_per_fifo:** The number of update packets for each FIFO's worth of bytes sent into the device
+* **ups_per_sec:** The number of update packets per second
+
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Resize socket buffers
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
It may be useful increase the size of the socket buffers to
diff --git a/host/docs/usrp_nxxx.rst b/host/docs/usrp_nxxx.rst
index 617555b56..1c270df08 100644
--- a/host/docs/usrp_nxxx.rst
+++ b/host/docs/usrp_nxxx.rst
@@ -81,12 +81,10 @@ The reset button is a pushbutton switch (S2) located inside the enclosure.
------------------------------------------------------------------------
Setup networking
------------------------------------------------------------------------
-The USRP2 only supports gigabit ethernet, and
-will not work with a 10/100 Mbps interface.
-Because the USRP2 uses gigabit ethernet pause frames for flow control,
-you cannot use multiple USRP2s with a switch or a hub.
-It is recommended that each USRP2 be plugged directly into its own
-dedicated gigabit ethernet interface on the host computer.
+The USRP2 only supports gigabit ethernet,
+and will not work with a 10/100 Mbps interface.
+However, a 10/100 Mbps interface can be connected indirectly
+to a USRP2 through a gigabit ethernet switch.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Setup the host interface
@@ -105,8 +103,9 @@ It is recommended that you change or disable your firewall settings.
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Multiple device configuration
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-As described above, you will need one ethernet interface per USRP2.
-Each ethernet interface should have its own subnet,
+For maximum throughput, one ethernet interface per USRP2 is recommended,
+although multiple devices may be connected via a gigabit ethernet switch.
+In any case, each ethernet interface should have its own subnet,
and the corresponding USRP2 device should be assigned an address in that subnet.
Example:
diff --git a/host/examples/ascii_art_dft.hpp b/host/examples/ascii_art_dft.hpp
index 92fb77596..ee2267c2d 100644
--- a/host/examples/ascii_art_dft.hpp
+++ b/host/examples/ascii_art_dft.hpp
@@ -28,7 +28,7 @@ namespace acsii_art_dft{
);
/*!
- * Convert a DFT to a printable ascii plot.
+ * Convert a DFT to a piroundable ascii plot.
* \param dft the log power dft bins
* \param width the frame width in characters
* \param height the frame height in characters
diff --git a/host/examples/test_async_messages.cpp b/host/examples/test_async_messages.cpp
index e4a996ef5..b1d9d56d4 100644
--- a/host/examples/test_async_messages.cpp
+++ b/host/examples/test_async_messages.cpp
@@ -19,21 +19,25 @@
#include <uhd/utils/safe_main.hpp>
#include <uhd/utils/static.hpp>
#include <uhd/usrp/single_usrp.hpp>
+#include <boost/assign/list_of.hpp>
#include <boost/program_options.hpp>
+#include <boost/foreach.hpp>
+#include <boost/bind.hpp>
#include <boost/format.hpp>
+#include <cstdlib>
#include <complex>
#include <iostream>
namespace po = boost::program_options;
/*!
- * Test that no messages are received:
+ * Test the burst ack message:
* Send a burst of many samples that will fragment internally.
- * We expect to not get any async messages.
+ * We expect to get an burst ack async message.
*/
-void test_no_async_message(uhd::usrp::single_usrp::sptr sdev){
+bool test_burst_ack_message(uhd::usrp::single_usrp::sptr sdev){
uhd::device::sptr dev = sdev->get_device();
- std::cout << "Test no async message... " << std::flush;
+ std::cout << "Test burst ack message... " << std::flush;
uhd::tx_metadata_t md;
md.start_of_burst = true;
@@ -50,19 +54,28 @@ void test_no_async_message(uhd::usrp::single_usrp::sptr sdev){
);
uhd::async_metadata_t async_md;
- if (dev->recv_async_msg(async_md)){
+ if (not dev->recv_async_msg(async_md)){
std::cout << boost::format(
"failed:\n"
- " Got unexpected event code 0x%x.\n"
- ) % async_md.event_code << std::endl;
- //clear the async messages
- while (dev->recv_async_msg(async_md, 0)){};
+ " Async message recv timed out.\n"
+ ) << std::endl;
+ return false;
}
- else{
+
+ switch(async_md.event_code){
+ case uhd::async_metadata_t::EVENT_CODE_BURST_ACK:
std::cout << boost::format(
"success:\n"
- " Did not get an async message.\n"
+ " Got event code burst ack message.\n"
) << std::endl;
+ return true;
+
+ default:
+ std::cout << boost::format(
+ "failed:\n"
+ " Got unexpected event code 0x%x.\n"
+ ) % async_md.event_code << std::endl;
+ return false;
}
}
@@ -71,7 +84,7 @@ void test_no_async_message(uhd::usrp::single_usrp::sptr sdev){
* Send a start of burst packet with no following end of burst.
* We expect to get an underflow(within a burst) async message.
*/
-void test_underflow_message(uhd::usrp::single_usrp::sptr sdev){
+bool test_underflow_message(uhd::usrp::single_usrp::sptr sdev){
uhd::device::sptr dev = sdev->get_device();
std::cout << "Test underflow message... " << std::flush;
@@ -80,18 +93,19 @@ void test_underflow_message(uhd::usrp::single_usrp::sptr sdev){
md.end_of_burst = false;
md.has_time_spec = false;
- dev->send(NULL, 0, md,
+ dev->send(
+ NULL, 0, md,
uhd::io_type_t::COMPLEX_FLOAT32,
uhd::device::SEND_MODE_FULL_BUFF
);
uhd::async_metadata_t async_md;
- if (not dev->recv_async_msg(async_md)){
+ if (not dev->recv_async_msg(async_md, 1)){
std::cout << boost::format(
"failed:\n"
" Async message recv timed out.\n"
) << std::endl;
- return;
+ return false;
}
switch(async_md.event_code){
@@ -100,13 +114,14 @@ void test_underflow_message(uhd::usrp::single_usrp::sptr sdev){
"success:\n"
" Got event code underflow message.\n"
) << std::endl;
- break;
+ return true;
default:
std::cout << boost::format(
"failed:\n"
" Got unexpected event code 0x%x.\n"
) % async_md.event_code << std::endl;
+ return false;
}
}
@@ -115,7 +130,7 @@ void test_underflow_message(uhd::usrp::single_usrp::sptr sdev){
* Send a burst packet that occurs at a time in the past.
* We expect to get a time error async message.
*/
-void test_time_error_message(uhd::usrp::single_usrp::sptr sdev){
+bool test_time_error_message(uhd::usrp::single_usrp::sptr sdev){
uhd::device::sptr dev = sdev->get_device();
std::cout << "Test time error message... " << std::flush;
@@ -127,7 +142,8 @@ void test_time_error_message(uhd::usrp::single_usrp::sptr sdev){
sdev->set_time_now(uhd::time_spec_t(200.0)); //time at 200s
- dev->send(NULL, 0, md,
+ dev->send(
+ NULL, 0, md,
uhd::io_type_t::COMPLEX_FLOAT32,
uhd::device::SEND_MODE_FULL_BUFF
);
@@ -138,7 +154,7 @@ void test_time_error_message(uhd::usrp::single_usrp::sptr sdev){
"failed:\n"
" Async message recv timed out.\n"
) << std::endl;
- return;
+ return false;
}
switch(async_md.event_code){
@@ -147,29 +163,38 @@ void test_time_error_message(uhd::usrp::single_usrp::sptr sdev){
"success:\n"
" Got event code time error message.\n"
) << std::endl;
- break;
+ return true;
default:
std::cout << boost::format(
"failed:\n"
" Got unexpected event code 0x%x.\n"
) % async_md.event_code << std::endl;
+ return false;
}
}
+void flush_async_md(uhd::usrp::single_usrp::sptr sdev){
+ uhd::device::sptr dev = sdev->get_device();
+ uhd::async_metadata_t async_md;
+ while (dev->recv_async_msg(async_md, 1.0)){}
+}
+
int UHD_SAFE_MAIN(int argc, char *argv[]){
uhd::set_thread_priority_safe();
//variables to be set by po
std::string args;
double rate;
+ size_t ntests;
//setup the program options
po::options_description desc("Allowed options");
desc.add_options()
("help", "help message")
- ("args", po::value<std::string>(&args)->default_value(""), "single uhd device address args")
- ("rate", po::value<double>(&rate)->default_value(1.5e6), "rate of outgoing samples")
+ ("args", po::value<std::string>(&args)->default_value(""), "single uhd device address args")
+ ("rate", po::value<double>(&rate)->default_value(1.5e6), "rate of outgoing samples")
+ ("ntests", po::value<size_t>(&ntests)->default_value(10), "number of tests to run")
;
po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
@@ -195,9 +220,38 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){
//------------------------------------------------------------------
// begin asyc messages test
//------------------------------------------------------------------
- test_no_async_message(sdev);
- test_underflow_message(sdev);
- test_time_error_message(sdev);
+ static const uhd::dict<std::string, boost::function<bool(uhd::usrp::single_usrp::sptr)> >
+ tests = boost::assign::map_list_of
+ ("Test Burst ACK ", &test_burst_ack_message)
+ ("Test Underflow ", &test_underflow_message)
+ ("Test Time Error", &test_time_error_message)
+ ;
+
+ //init result counts
+ uhd::dict<std::string, size_t> failures, successes;
+ BOOST_FOREACH(const std::string &key, tests.keys()){
+ failures[key] = 0;
+ successes[key] = 0;
+ }
+
+ //run the tests, pick at random
+ for (size_t n = 0; n < ntests; n++){
+ std::string key = tests.keys()[std::rand() % tests.size()];
+ bool pass = tests[key](sdev);
+ flush_async_md(sdev);
+
+ //store result
+ if (pass) successes[key]++;
+ else failures[key]++;
+ }
+
+ //print the result summary
+ std::cout << std::endl << "Summary:" << std::endl << std::endl;
+ BOOST_FOREACH(const std::string &key, tests.keys()){
+ std::cout << boost::format(
+ "%s -> %3d successes, %3d failures"
+ ) % key % successes[key] % failures[key] << std::endl;
+ }
//finished
std::cout << std::endl << "Done!" << std::endl << std::endl;
diff --git a/host/examples/tx_from_file.cpp b/host/examples/tx_from_file.cpp
new file mode 100644
index 000000000..9611cf47c
--- /dev/null
+++ b/host/examples/tx_from_file.cpp
@@ -0,0 +1,125 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include <uhd/utils/thread_priority.hpp>
+#include <uhd/utils/safe_main.hpp>
+#include <uhd/usrp/simple_usrp.hpp>
+#include <boost/program_options.hpp>
+#include <boost/format.hpp>
+#include <iostream>
+#include <complex>
+#include <fstream>
+
+namespace po = boost::program_options;
+
+int UHD_SAFE_MAIN(int argc, char *argv[]){
+ uhd::set_thread_priority_safe();
+
+ //variables to be set by po
+ std::string args;
+ time_t seconds_in_future;
+ size_t total_num_samps;
+ size_t samps_per_packet;
+ double tx_rate, freq;
+ float ampl;
+ float tx_gain;
+
+ //setup the program options
+ po::options_description desc("Allowed options");
+ desc.add_options()
+ ("help", "help message")
+ ("args", po::value<std::string>(&args)->default_value(""), "simple uhd device address args")
+ ("secs", po::value<time_t>(&seconds_in_future)->default_value(3), "number of seconds in the future to transmit")
+ ("nsamps", po::value<size_t>(&total_num_samps)->default_value(1000), "total number of samples to transmit")
+ ("txrate", po::value<double>(&tx_rate)->default_value(100e6/16), "rate of outgoing samples")
+ ("freq", po::value<double>(&freq)->default_value(0), "rf center frequency in Hz")
+ ("ampl", po::value<float>(&ampl)->default_value(float(0.3)), "amplitude of each sample")
+ ("gain", po::value<float>(&tx_gain)->default_value(float(0)), "amplitude of each sample")
+ ("dilv", "specify to disable inner-loop verbose")
+ ;
+ po::variables_map vm;
+ po::store(po::parse_command_line(argc, argv, desc), vm);
+ po::notify(vm);
+
+ //print the help message
+ if (vm.count("help")){
+ std::cout << boost::format("UHD TX Timed Samples %s") % desc << std::endl;
+ return ~0;
+ }
+
+ bool verbose = vm.count("dilv") == 0;
+
+ //create a usrp device
+ std::cout << std::endl;
+ std::cout << boost::format("Creating the usrp device with: %s...") % args << std::endl;
+ uhd::usrp::simple_usrp::sptr sdev = uhd::usrp::simple_usrp::make(args);
+ uhd::device::sptr dev = sdev->get_device();
+ std::cout << boost::format("Using Device: %s") % sdev->get_pp_string() << std::endl;
+
+ //set properties on the device
+ std::cout << boost::format("Setting TX Rate: %f Msps...") % (tx_rate/1e6) << std::endl;
+ sdev->set_tx_rate(tx_rate);
+ std::cout << boost::format("Actual TX Rate: %f Msps...") % (sdev->get_tx_rate()/1e6) << std::endl;
+ std::cout << boost::format("Setting device timestamp to 0...") << std::endl;
+ sdev->set_tx_freq(freq);
+ sdev->set_time_now(uhd::time_spec_t(0.0));
+
+ sdev->set_tx_gain(tx_gain);
+
+ //allocate data to send
+ std::vector<std::complex<short> > buff;
+ uhd::tx_metadata_t md;
+
+ std::cout << "Read data to send from file: in.dat" << std::endl;
+ std::ifstream infile("in.dat", std::ifstream::binary);
+ while (!infile.eof()) {
+ std::complex<short> c;
+ infile.read((char *)&c, sizeof(std::complex<short>));
+ if (!((c.real() == 0) && (c.imag() == 0))) {
+ buff.push_back(c);
+//std::cout << "C = " << c << std::endl;
+ }
+ }
+ samps_per_packet = buff.size();
+ infile.close();
+ std::cout << "Number of samples in file: " << samps_per_packet << std::endl;
+
+ //send the data in multiple packets
+ size_t num_packets = (total_num_samps+samps_per_packet-1)/samps_per_packet;
+ for (size_t i = 0; i < num_packets; i++){
+ //setup the metadata flags and time spec
+ md.start_of_burst = true; //always SOB (good for continuous streaming)
+ md.end_of_burst = (i == num_packets-1); //only last packet has EOB
+ md.has_time_spec = (i == 0); //only first packet has time
+ md.time_spec = uhd::time_spec_t(seconds_in_future);
+
+ size_t samps_to_send = std::min(total_num_samps - samps_per_packet*i, samps_per_packet);
+
+ //send the entire packet (driver fragments internally)
+ size_t num_tx_samps = dev->send(
+ &buff.front(), samps_to_send, md,
+ uhd::io_type_t::COMPLEX_INT16,
+ uhd::device::SEND_MODE_FULL_BUFF
+ );
+ if(verbose) std::cout << std::endl << boost::format("Sent %d samples") % num_tx_samps << std::endl;
+ }
+
+ //finished
+ std::cout << std::endl << "Done!" << std::endl << std::endl;
+
+ return 0;
+}
diff --git a/host/include/uhd/types/metadata.hpp b/host/include/uhd/types/metadata.hpp
index 3f250d13e..f4e084430 100644
--- a/host/include/uhd/types/metadata.hpp
+++ b/host/include/uhd/types/metadata.hpp
@@ -132,8 +132,8 @@ namespace uhd{
* The type of event for a receive async message call.
*/
enum event_code_t {
- //! A packet was successfully transmitted.
- EVENT_CODE_SUCCESS = 0x1,
+ //! A burst was successfully transmitted.
+ EVENT_CODE_BURST_ACK = 0x1,
//! An internal send buffer has emptied.
EVENT_CODE_UNDERFLOW = 0x2,
//! Packet loss between host and device.
diff --git a/host/include/uhd/usrp/dsp_utils.hpp b/host/include/uhd/usrp/dsp_utils.hpp
index 8ec04dd2f..5b81ce322 100644
--- a/host/include/uhd/usrp/dsp_utils.hpp
+++ b/host/include/uhd/usrp/dsp_utils.hpp
@@ -85,12 +85,9 @@ namespace dsp_type1{
/*!
* Calculate the stream command word from the stream command struct.
* \param stream_cmd the requested stream command with mode, flags, timestamp
- * \param num_samps_continuous number of samples to request in continuous mode
* \return the 32-bit stream command word
*/
- UHD_API boost::uint32_t calc_stream_cmd_word(
- const stream_cmd_t &stream_cmd, size_t num_samps_continuous
- );
+ UHD_API boost::uint32_t calc_stream_cmd_word(const stream_cmd_t &stream_cmd);
} //namespace dsp_type1
diff --git a/host/include/uhd/usrp/mboard_eeprom.hpp b/host/include/uhd/usrp/mboard_eeprom.hpp
index 530b177be..52363b95c 100644
--- a/host/include/uhd/usrp/mboard_eeprom.hpp
+++ b/host/include/uhd/usrp/mboard_eeprom.hpp
@@ -37,7 +37,8 @@ namespace uhd{ namespace usrp{
//! Possible EEPROM maps types
enum map_type{
MAP_N100,
- MAP_B000
+ MAP_B000,
+ MAP_E100
};
//! Make a new empty mboard eeprom
diff --git a/host/include/uhd/utils/pimpl.hpp b/host/include/uhd/utils/pimpl.hpp
index 18454f0c4..09bf0c0a2 100644
--- a/host/include/uhd/utils/pimpl.hpp
+++ b/host/include/uhd/utils/pimpl.hpp
@@ -20,7 +20,6 @@
#include <uhd/config.hpp>
#include <boost/shared_ptr.hpp>
-#include <boost/make_shared.hpp>
/*! \file pimpl.hpp
* "Pimpl idiom" (pointer to implementation idiom).
@@ -51,6 +50,6 @@
* \param _args the constructor args for the pimpl
*/
#define UHD_PIMPL_MAKE(_name, _args) \
- boost::make_shared<_name> _args
+ boost::shared_ptr<_name>(new _name _args)
#endif /* INCLUDED_UHD_UTILS_PIMPL_HPP */
diff --git a/host/lib/ic_reg_maps/gen_ad9522_regs.py b/host/lib/ic_reg_maps/gen_ad9522_regs.py
index ed6b5f48d..a5debe568 100755
--- a/host/lib/ic_reg_maps/gen_ad9522_regs.py
+++ b/host/lib/ic_reg_maps/gen_ad9522_regs.py
@@ -134,8 +134,8 @@ reg2eeprom 0xB03[0] 0
# Template for methods in the body of the struct
########################################################################
BODY_TMPL="""\
-boost::uint8_t get_reg(boost::uint16_t addr){
- boost::uint8_t reg = 0;
+boost::uint32_t get_reg(boost::uint16_t addr){
+ boost::uint32_t reg = 0;
switch(addr){
#for $addr in sorted(set(map(lambda r: r.get_addr(), $regs)))
case $addr:
@@ -154,7 +154,7 @@ boost::uint8_t get_reg(boost::uint16_t addr){
return reg;
}
-void set_reg(boost::uint8_t addr, boost::uint32_t reg){
+void set_reg(boost::uint16_t addr, boost::uint32_t reg){
switch(addr){
#for $addr in sorted(set(map(lambda r: r.get_addr(), $regs)))
case $addr:
diff --git a/host/lib/transport/CMakeLists.txt b/host/lib/transport/CMakeLists.txt
index b9ec7a6ad..b95d46381 100644
--- a/host/lib/transport/CMakeLists.txt
+++ b/host/lib/transport/CMakeLists.txt
@@ -58,6 +58,12 @@ IF(HAVE_EMMINTRIN_H)
ADD_DEFINITIONS(-DHAVE_EMMINTRIN_H)
ENDIF(HAVE_EMMINTRIN_H)
+INCLUDE(CheckIncludeFileCXX)
+CHECK_INCLUDE_FILE_CXX(arm_neon.h HAVE_ARM_NEON_H)
+
+IF(HAVE_ARM_NEON_H)
+ ADD_DEFINITIONS(-DHAVE_ARM_NEON_H)
+ENDIF(HAVE_ARM_NEON_H)
########################################################################
# Setup defines for interface address discovery
########################################################################
diff --git a/host/lib/transport/convert_types_impl.hpp b/host/lib/transport/convert_types_impl.hpp
index 90618dec6..48ff99725 100644
--- a/host/lib/transport/convert_types_impl.hpp
+++ b/host/lib/transport/convert_types_impl.hpp
@@ -32,6 +32,14 @@
#include <emmintrin.h>
#endif
+#ifdef HAVE_ARM_NEON_H
+ #define USE_ARM_NEON_H
+#endif
+
+#if defined(USE_ARM_NEON_H)
+ #include <arm_neon.h>
+#endif
+
/***********************************************************************
* Typedefs
**********************************************************************/
@@ -135,6 +143,26 @@ static UHD_INLINE void fc32_to_item32_nswap(
}
}
+#elif defined(USE_ARM_NEON_H)
+static UHD_INLINE void fc32_to_item32_nswap(
+ const fc32_t *input, item32_t *output, size_t nsamps)
+{
+ size_t i;
+
+ float32x4_t Q0 = vdupq_n_f32(shorts_per_float);
+ for (i=0; i < (nsamps & ~0x03); i+=2) {
+ float32x4_t Q1 = vld1q_f32(reinterpret_cast<const float *>(&input[i]));
+ float32x4_t Q2 = vmulq_f32(Q1, Q0);
+ int32x4_t Q3 = vcvtq_s32_f32(Q2);
+ int16x4_t D8 = vmovn_s32(Q3);
+ int16x4_t D9 = vrev32_s16(D8);
+ vst1_s16((reinterpret_cast<int16_t *>(&output[i])), D9);
+ }
+
+ for (; i < nsamps; i++)
+ output[i] = fc32_to_item32(input[i]);
+}
+
#else
static UHD_INLINE void fc32_to_item32_nswap(
const fc32_t *input, item32_t *output, size_t nsamps
@@ -238,6 +266,26 @@ static UHD_INLINE void item32_to_fc32_nswap(
}
}
+#elif defined(USE_ARM_NEON_H)
+static UHD_INLINE void item32_to_fc32_nswap(
+ const item32_t *input, fc32_t *output, size_t nsamps)
+{
+ size_t i;
+
+ float32x4_t Q1 = vdupq_n_f32(floats_per_short);
+ for (i=0; i < (nsamps & ~0x03); i+=2) {
+ int16x4_t D0 = vld1_s16(reinterpret_cast<const int16_t *>(&input[i]));
+ int16x4_t D1 = vrev32_s16(D0);
+ int32x4_t Q2 = vmovl_s16(D1);
+ float32x4_t Q3 = vcvtq_f32_s32(Q2);
+ float32x4_t Q4 = vmulq_f32(Q3, Q1);
+ vst1q_f32((reinterpret_cast<float *>(&output[i])), Q4);
+ }
+
+ for (; i < nsamps; i++)
+ output[i] = item32_to_fc32(input[i]);
+}
+
#else
static UHD_INLINE void item32_to_fc32_nswap(
const item32_t *input, fc32_t *output, size_t nsamps
diff --git a/host/lib/usrp/CMakeLists.txt b/host/lib/usrp/CMakeLists.txt
index 3d832c356..073b3c80b 100644
--- a/host/lib/usrp/CMakeLists.txt
+++ b/host/lib/usrp/CMakeLists.txt
@@ -35,3 +35,4 @@ LIBUHD_APPEND_SOURCES(
INCLUDE(${CMAKE_SOURCE_DIR}/lib/usrp/dboard/CMakeLists.txt)
INCLUDE(${CMAKE_SOURCE_DIR}/lib/usrp/usrp1/CMakeLists.txt)
INCLUDE(${CMAKE_SOURCE_DIR}/lib/usrp/usrp2/CMakeLists.txt)
+INCLUDE(${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/CMakeLists.txt)
diff --git a/host/lib/usrp/README b/host/lib/usrp/README
index c125d1dad..344209179 100644
--- a/host/lib/usrp/README
+++ b/host/lib/usrp/README
@@ -9,4 +9,7 @@ usrp1:
Implementation code for the USB-based USRP Classic motherboard.
usrp2:
- Implementation code for USRP2 and USRP-N2XX.
+ Implementation code for USRP2, USRP-N200, and USRP-N210.
+
+usrp_e100:
+ Implementation code for USRP-E100.
diff --git a/host/lib/usrp/dsp_utils.cpp b/host/lib/usrp/dsp_utils.cpp
index 10ae9a086..2553e4a25 100644
--- a/host/lib/usrp/dsp_utils.cpp
+++ b/host/lib/usrp/dsp_utils.cpp
@@ -109,9 +109,7 @@ boost::uint32_t dsp_type1::calc_iq_scale_word(unsigned rate){
return calc_iq_scale_word(scale, scale);
}
-boost::uint32_t dsp_type1::calc_stream_cmd_word(
- const stream_cmd_t &stream_cmd, size_t num_samps_continuous
-){
+boost::uint32_t dsp_type1::calc_stream_cmd_word(const stream_cmd_t &stream_cmd){
UHD_ASSERT_THROW(stream_cmd.num_samps <= 0x3fffffff);
//setup the mode to instruction flags
@@ -133,6 +131,6 @@ boost::uint32_t dsp_type1::calc_stream_cmd_word(
word |= boost::uint32_t((stream_cmd.stream_now)? 1 : 0) << 31;
word |= boost::uint32_t((inst_chain)? 1 : 0) << 30;
word |= boost::uint32_t((inst_reload)? 1 : 0) << 29;
- word |= (inst_samps)? stream_cmd.num_samps : ((inst_chain)? num_samps_continuous : 1);
+ word |= (inst_samps)? stream_cmd.num_samps : ((inst_chain)? 1 : 0);
return word;
}
diff --git a/host/lib/usrp/mboard_eeprom.cpp b/host/lib/usrp/mboard_eeprom.cpp
index e7470944c..a9270cda6 100644
--- a/host/lib/usrp/mboard_eeprom.cpp
+++ b/host/lib/usrp/mboard_eeprom.cpp
@@ -18,10 +18,12 @@
#include <uhd/usrp/mboard_eeprom.hpp>
#include <uhd/types/mac_addr.hpp>
#include <uhd/utils/algorithm.hpp>
+#include <uhd/utils/byteswap.hpp>
#include <boost/asio/ip/address_v4.hpp>
#include <boost/assign/list_of.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/foreach.hpp>
+#include <cstddef>
using namespace uhd;
using namespace uhd::usrp;
@@ -171,6 +173,85 @@ static void store_b000(const mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
string_to_bytes(mb_eeprom["name"], NAME_MAX_LEN)
);
}
+/***********************************************************************
+ * Implementation of E100 load/store
+ **********************************************************************/
+static const boost::uint8_t E100_EEPROM_ADDR = 0x51;
+
+struct e100_eeprom_map{
+ boost::uint16_t vendor;
+ boost::uint16_t device;
+ unsigned char revision;
+ unsigned char content;
+ unsigned char model[8];
+ unsigned char env_var[16];
+ unsigned char env_setting[64];
+ unsigned char serial[10];
+ unsigned char name[NAME_MAX_LEN];
+};
+
+template <typename T> static const byte_vector_t to_bytes(const T &item){
+ return byte_vector_t(
+ reinterpret_cast<const byte_vector_t::value_type *>(&item),
+ reinterpret_cast<const byte_vector_t::value_type *>(&item)+sizeof(item)
+ );
+}
+
+static void load_e100(mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
+ const size_t num_bytes = offsetof(e100_eeprom_map, model);
+ byte_vector_t map_bytes = iface.read_eeprom(E100_EEPROM_ADDR, 0, num_bytes);
+ e100_eeprom_map map; std::memcpy(&map, &map_bytes[0], map_bytes.size());
+
+ mb_eeprom["vendor"] = boost::lexical_cast<std::string>(uhd::ntohx(map.vendor));
+ mb_eeprom["device"] = boost::lexical_cast<std::string>(uhd::ntohx(map.device));
+ mb_eeprom["revision"] = boost::lexical_cast<std::string>(unsigned(map.revision));
+ mb_eeprom["content"] = boost::lexical_cast<std::string>(unsigned(map.content));
+
+ #define load_e100_string_xx(key) mb_eeprom[#key] = bytes_to_string(iface.read_eeprom( \
+ E100_EEPROM_ADDR, offsetof(e100_eeprom_map, key), sizeof(e100_eeprom_map::key) \
+ ));
+
+ load_e100_string_xx(model);
+ load_e100_string_xx(env_var);
+ load_e100_string_xx(env_setting);
+ load_e100_string_xx(serial);
+ load_e100_string_xx(name);
+}
+
+static void store_e100(const mboard_eeprom_t &mb_eeprom, i2c_iface &iface){
+
+ if (mb_eeprom.has_key("vendor")) iface.write_eeprom(
+ E100_EEPROM_ADDR, offsetof(e100_eeprom_map, vendor),
+ to_bytes(uhd::htonx(boost::lexical_cast<boost::uint16_t>(mb_eeprom["vendor"])))
+ );
+
+ if (mb_eeprom.has_key("device")) iface.write_eeprom(
+ E100_EEPROM_ADDR, offsetof(e100_eeprom_map, device),
+ to_bytes(uhd::htonx(boost::lexical_cast<boost::uint16_t>(mb_eeprom["device"])))
+ );
+
+ if (mb_eeprom.has_key("revision")) iface.write_eeprom(
+ E100_EEPROM_ADDR, offsetof(e100_eeprom_map, revision),
+ byte_vector_t(1, boost::lexical_cast<unsigned>(mb_eeprom["revision"]))
+ );
+
+ if (mb_eeprom.has_key("content")) iface.write_eeprom(
+ E100_EEPROM_ADDR, offsetof(e100_eeprom_map, content),
+ byte_vector_t(1, boost::lexical_cast<unsigned>(mb_eeprom["content"]))
+ );
+
+ #define store_e100_string_xx(key) if (mb_eeprom.has_key(#key)) iface.write_eeprom( \
+ E100_EEPROM_ADDR, offsetof(e100_eeprom_map, key), \
+ string_to_bytes(mb_eeprom[#key], sizeof(e100_eeprom_map::key)) \
+ );
+
+ store_e100_string_xx(model);
+ store_e100_string_xx(env_var);
+ store_e100_string_xx(env_setting);
+ store_e100_string_xx(serial);
+ store_e100_string_xx(name);
+
+}
/***********************************************************************
* Implementation of mboard eeprom
@@ -183,6 +264,7 @@ mboard_eeprom_t::mboard_eeprom_t(i2c_iface &iface, map_type map){
switch(map){
case MAP_N100: load_n100(*this, iface); break;
case MAP_B000: load_b000(*this, iface); break;
+ case MAP_E100: load_e100(*this, iface); break;
}
}
@@ -190,5 +272,6 @@ void mboard_eeprom_t::commit(i2c_iface &iface, map_type map){
switch(map){
case MAP_N100: store_n100(*this, iface); break;
case MAP_B000: store_b000(*this, iface); break;
+ case MAP_E100: store_e100(*this, iface); break;
}
}
diff --git a/host/lib/usrp/usrp2/fw_common.h b/host/lib/usrp/usrp2/fw_common.h
index 6c9596092..a9c39e650 100644
--- a/host/lib/usrp/usrp2/fw_common.h
+++ b/host/lib/usrp/usrp2/fw_common.h
@@ -33,8 +33,8 @@ extern "C" {
#endif
//fpga and firmware compatibility numbers
-#define USRP2_FPGA_COMPAT_NUM 2
-#define USRP2_FW_COMPAT_NUM 6
+#define USRP2_FPGA_COMPAT_NUM 3
+#define USRP2_FW_COMPAT_NUM 7
//used to differentiate control packets over data port
#define USRP2_INVALID_VRT_HEADER 0
diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp
index 4d9528f66..f903a80f6 100644
--- a/host/lib/usrp/usrp2/io_impl.cpp
+++ b/host/lib/usrp/usrp2/io_impl.cpp
@@ -18,11 +18,11 @@
#include "../../transport/vrt_packet_handler.hpp"
#include "usrp2_impl.hpp"
#include "usrp2_regs.hpp"
+#include <uhd/utils/byteswap.hpp>
#include <uhd/utils/thread_priority.hpp>
#include <uhd/transport/convert_types.hpp>
#include <uhd/transport/alignment_buffer.hpp>
#include <boost/format.hpp>
-#include <boost/asio.hpp> //htonl and ntohl
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <iostream>
@@ -32,7 +32,73 @@ using namespace uhd::usrp;
using namespace uhd::transport;
namespace asio = boost::asio;
-static const int underflow_flags = async_metadata_t::EVENT_CODE_UNDERFLOW | async_metadata_t::EVENT_CODE_UNDERFLOW_IN_PACKET;
+/***********************************************************************
+ * constants
+ **********************************************************************/
+static const int underflow_flags = 0
+ | async_metadata_t::EVENT_CODE_UNDERFLOW
+ | async_metadata_t::EVENT_CODE_UNDERFLOW_IN_PACKET
+;
+
+static const size_t vrt_send_header_offset_words32 = 1;
+
+/***********************************************************************
+ * flow control monitor for a single tx channel
+ * - the pirate thread calls update
+ * - the get send buffer calls check
+ **********************************************************************/
+class flow_control_monitor{
+public:
+ typedef boost::uint32_t seq_type;
+ typedef boost::shared_ptr<flow_control_monitor> sptr;
+
+ /*!
+ * Make a new flow control monitor.
+ * \param max_seqs_out num seqs before throttling
+ */
+ flow_control_monitor(seq_type max_seqs_out){
+ _last_seq_out = 0;
+ _last_seq_ack = 0;
+ _max_seqs_out = max_seqs_out;
+ }
+
+ /*!
+ * Check the flow control condition.
+ * \param seq the sequence to go out
+ * \param timeout the timeout in seconds
+ * \return false on timeout
+ */
+ UHD_INLINE bool check_fc_condition(seq_type seq, double timeout){
+ boost::this_thread::disable_interruption di; //disable because the wait can throw
+ boost::unique_lock<boost::mutex> lock(_fc_mutex);
+ _last_seq_out = seq;
+ return _fc_cond.timed_wait(
+ lock,
+ boost::posix_time::microseconds(long(timeout*1e6)),
+ boost::bind(&flow_control_monitor::ready, this)
+ );
+ }
+
+ /*!
+ * Update the flow control condition.
+ * \param seq the last sequence number to be ACK'd
+ */
+ UHD_INLINE void update_fc_condition(seq_type seq){
+ boost::unique_lock<boost::mutex> lock(_fc_mutex);
+ _last_seq_ack = seq;
+ lock.unlock();
+ _fc_cond.notify_one();
+ }
+
+private:
+ bool ready(void){
+ return seq_type(_last_seq_out -_last_seq_ack) < _max_seqs_out;
+ }
+
+ boost::mutex _fc_mutex;
+ boost::condition _fc_cond;
+ seq_type _last_seq_out, _last_seq_ack, _max_seqs_out;
+};
/***********************************************************************
* io impl details (internal to this file)
@@ -44,12 +110,14 @@ static const int underflow_flags = async_metadata_t::EVENT_CODE_UNDERFLOW | asyn
struct usrp2_impl::io_impl{
typedef alignment_buffer<managed_recv_buffer::sptr, time_spec_t> alignment_buffer_type;
- io_impl(size_t num_frames, size_t width):
+ io_impl(size_t num_recv_frames, size_t send_frame_size, size_t width):
packet_handler_recv_state(width),
- recv_pirate_booty(alignment_buffer_type::make(num_frames-3, width)),
+ recv_pirate_booty(alignment_buffer_type::make(num_recv_frames-3, width)),
async_msg_fifo(bounded_buffer<async_metadata_t>::make(100/*messages deep*/))
{
- /* NOP */
+ for (size_t i = 0; i < width; i++) fc_mons.push_back(
+ flow_control_monitor::sptr(new flow_control_monitor(usrp2_impl::sram_bytes/send_frame_size))
+ );
}
~io_impl(void){
@@ -63,6 +131,29 @@ struct usrp2_impl::io_impl{
return recv_pirate_booty->pop_elems_with_timed_wait(buffs, timeout);
}
+ bool get_send_buffs(
+ const std::vector<zero_copy_if::sptr> &trans,
+ vrt_packet_handler::managed_send_buffs_t &buffs,
+ double timeout
+ ){
+ UHD_ASSERT_THROW(trans.size() == buffs.size());
+
+ //calculate the flow control word
+ const boost::uint32_t fc_word32 = packet_handler_send_state.next_packet_seq;
+
+ //grab a managed buffer for each index
+ for (size_t i = 0; i < buffs.size(); i++){
+ if (not fc_mons[i]->check_fc_condition(fc_word32, timeout)) return false;
+ buffs[i] = trans[i]->get_send_buff(timeout);
+ if (not buffs[i].get()) return false;
+ buffs[i]->cast<boost::uint32_t *>()[0] = uhd::htonx(fc_word32);
+ }
+ return true;
+ }
+
+ //flow control monitors
+ std::vector<flow_control_monitor::sptr> fc_mons;
+
//state management for the vrt packet handler code
vrt_packet_handler::recv_state packet_handler_recv_state;
vrt_packet_handler::send_state packet_handler_send_state;
@@ -103,8 +194,27 @@ void usrp2_impl::io_impl::recv_pirate_loop(
const boost::uint32_t *vrt_hdr = buff->cast<const boost::uint32_t *>();
vrt::if_hdr_unpack_be(vrt_hdr, if_packet_info);
+ //handle the rx data stream
+ if (if_packet_info.sid == usrp2_impl::RECV_SID and if_packet_info.packet_type == vrt::if_packet_info_t::PACKET_TYPE_DATA){
+ //handle the packet count / sequence number
+ if (if_packet_info.packet_count != next_packet_seq){
+ //std::cerr << "S" << (if_packet_info.packet_count - next_packet_seq)%16;
+ std::cerr << "O" << std::flush; //report overflow (drops in the kernel)
+ }
+ next_packet_seq = (if_packet_info.packet_count+1)%16;
+
+ //extract the timespec and round to the nearest packet
+ UHD_ASSERT_THROW(if_packet_info.has_tsi and if_packet_info.has_tsf);
+ time_spec_t time(
+ time_t(if_packet_info.tsi), size_t(if_packet_info.tsf), mboard->get_master_clock_freq()
+ );
+
+ //push the packet into the buffer with the new time
+ recv_pirate_booty->push_with_pop_on_full(buff, time, index);
+ }
+
//handle a tx async report message
- if (if_packet_info.sid == 1 and if_packet_info.packet_type != vrt::if_packet_info_t::PACKET_TYPE_DATA){
+ else if (if_packet_info.sid == usrp2_impl::ASYNC_SID and if_packet_info.packet_type != vrt::if_packet_info_t::PACKET_TYPE_DATA){
//fill in the async metadata
async_metadata_t metadata;
@@ -115,27 +225,21 @@ void usrp2_impl::io_impl::recv_pirate_loop(
);
metadata.event_code = vrt_packet_handler::get_context_code<async_metadata_t::event_code_t>(vrt_hdr, if_packet_info);
+ //catch the flow control packets and react
+ if (metadata.event_code == 0){
+ boost::uint32_t fc_word32 = (vrt_hdr + if_packet_info.num_header_words32)[1];
+ this->fc_mons[index]->update_fc_condition(uhd::ntohx(fc_word32));
+ continue;
+ }
+
//print the famous U, and push the metadata into the message queue
if (metadata.event_code & underflow_flags) std::cerr << "U" << std::flush;
+ //else std::cout << "metadata.event_code " << metadata.event_code << std::endl;
async_msg_fifo->push_with_pop_on_full(metadata);
- continue;
}
-
- //handle the packet count / sequence number
- if (if_packet_info.packet_count != next_packet_seq){
- //std::cerr << "S" << (if_packet_info.packet_count - next_packet_seq)%16;
- std::cerr << "O" << std::flush; //report overflow (drops in the kernel)
+ else{
+ //TODO unknown received packet, may want to print error...
}
- next_packet_seq = (if_packet_info.packet_count+1)%16;
-
- //extract the timespec and round to the nearest packet
- UHD_ASSERT_THROW(if_packet_info.has_tsi and if_packet_info.has_tsf);
- time_spec_t time(
- time_t(if_packet_info.tsi), size_t(if_packet_info.tsf), mboard->get_master_clock_freq()
- );
-
- //push the packet into the buffer with the new time
- recv_pirate_booty->push_with_pop_on_full(buff, time, index);
}catch(const std::exception &e){
std::cerr << "Error (usrp2 recv pirate loop): " << e.what() << std::endl;
}
@@ -146,27 +250,27 @@ void usrp2_impl::io_impl::recv_pirate_loop(
* Helper Functions
**********************************************************************/
void usrp2_impl::io_init(void){
- //send a small data packet so the usrp2 knows the udp source port
- BOOST_FOREACH(zero_copy_if::sptr data_transport, _data_transports){
- managed_send_buffer::sptr send_buff = data_transport->get_send_buff();
- static const boost::uint32_t data = htonl(USRP2_INVALID_VRT_HEADER);
- std::memcpy(send_buff->cast<void*>(), &data, sizeof(data));
- send_buff->commit(sizeof(data));
- //drain the recv buffers (may have junk)
- while (data_transport->get_recv_buff().get()){};
- }
- //the number of recv frames is the number for the first transport
//the assumption is that all data transports should be identical
- size_t num_frames = _data_transports.front()->get_num_recv_frames();
+ const size_t num_recv_frames = _data_transports.front()->get_num_recv_frames();
+ const size_t send_frame_size = _data_transports.front()->get_send_frame_size();
//create new io impl
- _io_impl = UHD_PIMPL_MAKE(io_impl, (num_frames, _data_transports.size()));
+ _io_impl = UHD_PIMPL_MAKE(io_impl, (num_recv_frames, send_frame_size, _data_transports.size()));
+
+ //TODO temporary fix for weird power up state, remove when FPGA fixed
+ {
+ //send an initial packet to all transports
+ tx_metadata_t md; md.end_of_burst = true;
+ this->send(
+ std::vector<const void *>(_data_transports.size(), NULL), 0, md,
+ io_type_t::COMPLEX_FLOAT32, device::SEND_MODE_ONE_PACKET, 0
+ );
+ }
//create a new pirate thread for each zc if (yarr!!)
for (size_t i = 0; i < _data_transports.size(); i++){
- //ensure a non-blocking mutex lock
- _io_impl->spawn_mutex.unlock();
+ //lock the unlocked mutex (non-blocking)
_io_impl->spawn_mutex.lock();
//spawn a new pirate to plunder the recv booty
_io_impl->recv_pirate_crew.create_thread(boost::bind(
@@ -174,8 +278,10 @@ void usrp2_impl::io_init(void){
_io_impl.get(), _data_transports.at(i),
_mboards.at(i), i
));
- //will block here until the thread unlocks
+ //block here until the spawned thread unlocks
_io_impl->spawn_mutex.lock();
+ //exit loop iteration in an unlocked condition
+ _io_impl->spawn_mutex.unlock();
}
}
@@ -192,23 +298,10 @@ bool usrp2_impl::recv_async_msg(
/***********************************************************************
* Send Data
**********************************************************************/
-static bool get_send_buffs(
- const std::vector<udp_zero_copy::sptr> &trans,
- vrt_packet_handler::managed_send_buffs_t &buffs,
- double timeout
-){
- UHD_ASSERT_THROW(trans.size() == buffs.size());
- bool good = true;
- for (size_t i = 0; i < buffs.size(); i++){
- buffs[i] = trans[i]->get_send_buff(timeout);
- good = good and (buffs[i].get() != NULL);
- }
- return good;
-}
-
size_t usrp2_impl::get_max_send_samps_per_packet(void) const{
static const size_t hdr_size = 0
+ vrt::max_if_hdr_words32*sizeof(boost::uint32_t)
+ + vrt_send_header_offset_words32*sizeof(boost::uint32_t)
- sizeof(vrt::if_packet_info_t().cid) //no class id ever used
;
const size_t bpp = _data_transports.front()->get_send_frame_size() - hdr_size;
@@ -227,8 +320,9 @@ size_t usrp2_impl::send(
io_type, _tx_otw_type, //input and output types to convert
_mboards.front()->get_master_clock_freq(), //master clock tick rate
uhd::transport::vrt::if_hdr_pack_be,
- boost::bind(&get_send_buffs, _data_transports, _1, timeout),
- get_max_send_samps_per_packet()
+ boost::bind(&usrp2_impl::io_impl::get_send_buffs, _io_impl.get(), _data_transports, _1, timeout),
+ get_max_send_samps_per_packet(),
+ vrt_send_header_offset_words32
);
}
diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp
index 3df89d327..13d8b9856 100644
--- a/host/lib/usrp/usrp2/mboard_impl.cpp
+++ b/host/lib/usrp/usrp2/mboard_impl.cpp
@@ -21,6 +21,7 @@
#include <uhd/usrp/dsp_utils.hpp>
#include <uhd/usrp/mboard_props.hpp>
#include <uhd/utils/assert.hpp>
+#include <uhd/utils/byteswap.hpp>
#include <uhd/utils/algorithm.hpp>
#include <boost/bind.hpp>
#include <iostream>
@@ -36,12 +37,24 @@ using namespace boost::posix_time;
usrp2_mboard_impl::usrp2_mboard_impl(
size_t index,
transport::udp_simple::sptr ctrl_transport,
- size_t recv_frame_size
+ transport::zero_copy_if::sptr data_transport,
+ size_t recv_samps_per_packet,
+ const device_addr_t &flow_control_hints
):
_index(index),
- _recv_frame_size(recv_frame_size),
_iface(usrp2_iface::make(ctrl_transport))
{
+ //Send a small data packet so the usrp2 knows the udp source port.
+ //This setup must happen before further initialization occurs
+ //or the async update packets will cause ICMP destination unreachable.
+ transport::managed_send_buffer::sptr send_buff = data_transport->get_send_buff();
+ static const boost::uint32_t data[2] = {
+ uhd::htonx(boost::uint32_t(0 /* don't care seq num */)),
+ uhd::htonx(boost::uint32_t(USRP2_INVALID_VRT_HEADER))
+ };
+ std::memcpy(send_buff->cast<void*>(), &data, sizeof(data));
+ send_buff->commit(sizeof(data));
+
//contruct the interfaces to mboard perifs
_clock_ctrl = usrp2_clock_ctrl::make(_iface);
_codec_ctrl = usrp2_codec_ctrl::make(_iface);
@@ -64,31 +77,43 @@ usrp2_mboard_impl::usrp2_mboard_impl(
_allowed_decim_and_interp_rates.push_back(i);
}
+
//Issue a stop streaming command (in case it was left running).
//Since this command is issued before the networking is setup,
//most if not all junk packets will never make it to the socket.
this->issue_ddc_stream_cmd(stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
//setup the vrt rx registers
- _iface->poke32(_iface->regs.rx_ctrl_nsamps_per_pkt, _recv_frame_size);
- _iface->poke32(_iface->regs.rx_ctrl_nchannels, 1);
_iface->poke32(_iface->regs.rx_ctrl_clear_overrun, 1); //reset
+ _iface->poke32(_iface->regs.rx_ctrl_nsamps_per_pkt, recv_samps_per_packet);
+ _iface->poke32(_iface->regs.rx_ctrl_nchannels, 1);
_iface->poke32(_iface->regs.rx_ctrl_vrt_header, 0
| (0x1 << 28) //if data with stream id
| (0x1 << 26) //has trailer
| (0x3 << 22) //integer time other
| (0x1 << 20) //fractional time sample count
);
- _iface->poke32(_iface->regs.rx_ctrl_vrt_stream_id, 0);
+ _iface->poke32(_iface->regs.rx_ctrl_vrt_stream_id, usrp2_impl::RECV_SID);
_iface->poke32(_iface->regs.rx_ctrl_vrt_trailer, 0);
_iface->poke32(_iface->regs.time64_tps, size_t(get_master_clock_freq()));
//init the tx control registers
- _iface->poke32(_iface->regs.tx_ctrl_num_chan, 0); //1 channel
_iface->poke32(_iface->regs.tx_ctrl_clear_state, 1); //reset
- _iface->poke32(_iface->regs.tx_ctrl_report_sid, 1); //sid 1 (different from rx)
+ _iface->poke32(_iface->regs.tx_ctrl_num_chan, 0); //1 channel
+ _iface->poke32(_iface->regs.tx_ctrl_report_sid, usrp2_impl::ASYNC_SID);
_iface->poke32(_iface->regs.tx_ctrl_policy, U2_FLAG_TX_CTRL_POLICY_NEXT_PACKET);
+ //setting the cycles per update
+ const double ups_per_sec = flow_control_hints.cast<double>("ups_per_sec", 100);
+ const size_t cycles_per_up = size_t(_clock_ctrl->get_master_clock_rate()/ups_per_sec);
+ _iface->poke32(_iface->regs.tx_ctrl_cycles_per_up, U2_FLAG_TX_CTRL_UP_ENB | cycles_per_up);
+ _iface->poke32(_iface->regs.tx_ctrl_cycles_per_up, 0); //cycles per update is disabled
+
+ //setting the packets per update
+ const double ups_per_fifo = flow_control_hints.cast<double>("ups_per_fifo", 8);
+ const size_t packets_per_up = size_t(usrp2_impl::sram_bytes/ups_per_fifo/data_transport->get_send_frame_size());
+ _iface->poke32(_iface->regs.tx_ctrl_packets_per_up, U2_FLAG_TX_CTRL_UP_ENB | packets_per_up);
+
//init the ddc
init_ddc_config();
@@ -110,7 +135,8 @@ usrp2_mboard_impl::usrp2_mboard_impl(
}
usrp2_mboard_impl::~usrp2_mboard_impl(void){
- /* NOP */
+ _iface->poke32(_iface->regs.tx_ctrl_cycles_per_up, 0);
+ _iface->poke32(_iface->regs.tx_ctrl_packets_per_up, 0);
}
/***********************************************************************
@@ -187,7 +213,6 @@ void usrp2_mboard_impl::set_time_spec(const time_spec_t &time_spec, bool now){
}
void usrp2_mboard_impl::handle_overflow(void){
- _iface->poke32(_iface->regs.rx_ctrl_clear_overrun, 1);
if (_continuous_streaming){ //re-issue the stream command if already continuous
this->issue_ddc_stream_cmd(stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
}
@@ -195,9 +220,7 @@ void usrp2_mboard_impl::handle_overflow(void){
void usrp2_mboard_impl::issue_ddc_stream_cmd(const stream_cmd_t &stream_cmd){
_continuous_streaming = stream_cmd.stream_mode == stream_cmd_t::STREAM_MODE_START_CONTINUOUS;
- _iface->poke32(_iface->regs.rx_ctrl_stream_cmd, dsp_type1::calc_stream_cmd_word(
- stream_cmd, _recv_frame_size
- ));
+ _iface->poke32(_iface->regs.rx_ctrl_stream_cmd, dsp_type1::calc_stream_cmd_word(stream_cmd));
_iface->poke32(_iface->regs.rx_ctrl_time_secs, boost::uint32_t(stream_cmd.time_spec.get_full_secs()));
_iface->poke32(_iface->regs.rx_ctrl_time_ticks, stream_cmd.time_spec.get_tick_count(get_master_clock_freq()));
}
diff --git a/host/lib/usrp/usrp2/usrp2_iface.cpp b/host/lib/usrp/usrp2/usrp2_iface.cpp
index 2b32faffb..81bc80c88 100644
--- a/host/lib/usrp/usrp2/usrp2_iface.cpp
+++ b/host/lib/usrp/usrp2/usrp2_iface.cpp
@@ -33,18 +33,6 @@ using namespace uhd;
using namespace uhd::usrp;
using namespace uhd::transport;
-/*!
- * FIXME: large timeout, ethernet pause frames...
- *
- * Use a large timeout to work-around the fact that
- * flow-control may throttle outgoing control packets
- * due to its use of ethernet pause frames.
- *
- * This will be fixed when host-based flow control is implemented,
- * along with larger incoming send buffers using the on-board SRAM.
- */
-static const double CONTROL_TIMEOUT = 3.0; //seconds
-
class usrp2_iface_impl : public usrp2_iface{
public:
/***********************************************************************
@@ -256,7 +244,7 @@ public:
boost::uint8_t usrp2_ctrl_data_in_mem[udp_simple::mtu]; //allocate max bytes for recv
const usrp2_ctrl_data_t *ctrl_data_in = reinterpret_cast<const usrp2_ctrl_data_t *>(usrp2_ctrl_data_in_mem);
while(true){
- size_t len = _ctrl_transport->recv(boost::asio::buffer(usrp2_ctrl_data_in_mem), CONTROL_TIMEOUT);
+ size_t len = _ctrl_transport->recv(boost::asio::buffer(usrp2_ctrl_data_in_mem));
if(len >= sizeof(boost::uint32_t) and ntohl(ctrl_data_in->proto_ver) != USRP2_FW_COMPAT_NUM){
throw std::runtime_error(str(boost::format(
"Expected protocol compatibility number %d, but got %d:\n"
diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp
index 42fe9c018..610e2f404 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.cpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.cpp
@@ -17,7 +17,7 @@
#include "usrp2_impl.hpp"
#include <uhd/transport/if_addrs.hpp>
-#include <uhd/transport/udp_simple.hpp>
+#include <uhd/transport/udp_zero_copy.hpp>
#include <uhd/usrp/device_props.hpp>
#include <uhd/utils/assert.hpp>
#include <uhd/utils/static.hpp>
@@ -144,7 +144,7 @@ static device::sptr usrp2_make(const device_addr_t &device_addr){
//create a ctrl and data transport for each address
std::vector<udp_simple::sptr> ctrl_transports;
- std::vector<udp_zero_copy::sptr> data_transports;
+ std::vector<zero_copy_if::sptr> data_transports;
BOOST_FOREACH(const std::string &addr, std::split_string(device_addr["addr"])){
ctrl_transports.push_back(udp_simple::make_connected(
@@ -157,7 +157,7 @@ static device::sptr usrp2_make(const device_addr_t &device_addr){
//create the usrp2 implementation guts
return device::sptr(
- new usrp2_impl(ctrl_transports, data_transports)
+ new usrp2_impl(ctrl_transports, data_transports, device_addr)
);
}
@@ -170,7 +170,8 @@ UHD_STATIC_BLOCK(register_usrp2_device){
**********************************************************************/
usrp2_impl::usrp2_impl(
std::vector<udp_simple::sptr> ctrl_transports,
- std::vector<udp_zero_copy::sptr> data_transports
+ std::vector<zero_copy_if::sptr> data_transports,
+ const device_addr_t &flow_control_hints
):
_data_transports(data_transports)
{
@@ -189,7 +190,9 @@ usrp2_impl::usrp2_impl(
//create a new mboard handler for each control transport
for(size_t i = 0; i < ctrl_transports.size(); i++){
_mboards.push_back(usrp2_mboard_impl::sptr(new usrp2_mboard_impl(
- i, ctrl_transports[i], this->get_max_recv_samps_per_packet()
+ i, ctrl_transports[i], data_transports[i],
+ this->get_max_recv_samps_per_packet(),
+ flow_control_hints
)));
//use an empty name when there is only one mboard
std::string name = (ctrl_transports.size() > 1)? boost::lexical_cast<std::string>(i) : "";
diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp
index 738c398d9..aa8eb0155 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.hpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.hpp
@@ -85,7 +85,9 @@ public:
usrp2_mboard_impl(
size_t index,
uhd::transport::udp_simple::sptr,
- size_t recv_frame_size
+ uhd::transport::zero_copy_if::sptr,
+ size_t recv_samps_per_packet,
+ const uhd::device_addr_t &flow_control_hints
);
~usrp2_mboard_impl(void);
@@ -97,7 +99,6 @@ public:
private:
size_t _index;
- const size_t _recv_frame_size;
bool _continuous_streaming;
//interfaces
@@ -178,14 +179,20 @@ private:
*/
class usrp2_impl : public uhd::device{
public:
+ static const size_t sram_bytes = size_t(1 << 20);
+ static const boost::uint32_t RECV_SID = 1;
+ static const boost::uint32_t ASYNC_SID = 2;
+
/*!
* Create a new usrp2 impl base.
* \param ctrl_transports the udp transports for control
* \param data_transports the udp transports for data
+ * \param flow_control_hints optional flow control params
*/
usrp2_impl(
std::vector<uhd::transport::udp_simple::sptr> ctrl_transports,
- std::vector<uhd::transport::udp_zero_copy::sptr> data_transports
+ std::vector<uhd::transport::zero_copy_if::sptr> data_transports,
+ const uhd::device_addr_t &flow_control_hints
);
~usrp2_impl(void);
@@ -215,7 +222,7 @@ private:
uhd::dict<std::string, usrp2_mboard_impl::sptr> _mboard_dict;
//io impl methods and members
- std::vector<uhd::transport::udp_zero_copy::sptr> _data_transports;
+ std::vector<uhd::transport::zero_copy_if::sptr> _data_transports;
uhd::otw_type_t _rx_otw_type, _tx_otw_type;
UHD_PIMPL_DECL(io_impl) _io_impl;
void io_init(void);
diff --git a/host/lib/usrp/usrp2/usrp2_regs.cpp b/host/lib/usrp/usrp2/usrp2_regs.cpp
index b24082edb..dd0433816 100644
--- a/host/lib/usrp/usrp2/usrp2_regs.cpp
+++ b/host/lib/usrp/usrp2/usrp2_regs.cpp
@@ -95,6 +95,8 @@ usrp2_regs_t usrp2_get_regs(bool use_n2xx_map) {
x.tx_ctrl_clear_state = sr_addr(misc_output_base, x.sr_tx_ctrl + 1);
x.tx_ctrl_report_sid = sr_addr(misc_output_base, x.sr_tx_ctrl + 2);
x.tx_ctrl_policy = sr_addr(misc_output_base, x.sr_tx_ctrl + 3);
+ x.tx_ctrl_cycles_per_up = sr_addr(misc_output_base, x.sr_tx_ctrl + 4);
+ x.tx_ctrl_packets_per_up = sr_addr(misc_output_base, x.sr_tx_ctrl + 5);
return x;
}
diff --git a/host/lib/usrp/usrp2/usrp2_regs.hpp b/host/lib/usrp/usrp2/usrp2_regs.hpp
index 1081ff159..9936d634a 100644
--- a/host/lib/usrp/usrp2/usrp2_regs.hpp
+++ b/host/lib/usrp/usrp2/usrp2_regs.hpp
@@ -97,6 +97,8 @@ typedef struct {
int tx_ctrl_clear_state;
int tx_ctrl_report_sid;
int tx_ctrl_policy;
+ int tx_ctrl_cycles_per_up;
+ int tx_ctrl_packets_per_up;
} usrp2_regs_t;
extern const usrp2_regs_t usrp2_regs; //the register definitions, set in usrp2_regs.cpp and usrp2p_regs.cpp
@@ -254,7 +256,18 @@ usrp2_regs_t usrp2_get_regs(bool);
///////////////////////////////////////////////////
// RX CTRL regs
///////////////////////////////////////////////////
+// The following 3 are logically a single command register.
+// They are clocked into the underlying fifo when time_ticks is written.
+//#define U2_REG_RX_CTRL_STREAM_CMD _SR_ADDR(SR_RX_CTRL + 0) // {now, chain, num_samples(30)
+//#define U2_REG_RX_CTRL_TIME_SECS _SR_ADDR(SR_RX_CTRL + 1)
+//#define U2_REG_RX_CTRL_TIME_TICKS _SR_ADDR(SR_RX_CTRL + 2)
+//#define U2_REG_RX_CTRL_CLEAR_STATE _SR_ADDR(SR_RX_CTRL + 3)
+//#define U2_REG_RX_CTRL_VRT_HEADER _SR_ADDR(SR_RX_CTRL + 4) // word 0 of packet. FPGA fills in packet counter
+//#define U2_REG_RX_CTRL_VRT_STREAM_ID _SR_ADDR(SR_RX_CTRL + 5) // word 1 of packet.
+//#define U2_REG_RX_CTRL_VRT_TRAILER _SR_ADDR(SR_RX_CTRL + 6)
+//#define U2_REG_RX_CTRL_NSAMPS_PER_PKT _SR_ADDR(SR_RX_CTRL + 7)
+//#define U2_REG_RX_CTRL_NCHANNELS _SR_ADDR(SR_RX_CTRL + 8) // 1 in basic case, up to 4 for vector sources
///////////////////////////////////////////////////
// TX CTRL regs
@@ -263,9 +276,14 @@ usrp2_regs_t usrp2_get_regs(bool);
//#define U2_REG_TX_CTRL_CLEAR_STATE _SR_ADDR(SR_TX_CTRL + 1)
//#define U2_REG_TX_CTRL_REPORT_SID _SR_ADDR(SR_TX_CTRL + 2)
//#define U2_REG_TX_CTRL_POLICY _SR_ADDR(SR_TX_CTRL + 3)
+//#define U2_REG_TX_CTRL_CYCLES_PER_UP _SR_ADDR(SR_TX_CTRL + 4)
+//#define U2_REG_TX_CTRL_PACKETS_PER_UP _SR_ADDR(SR_TX_CTRL + 5)
#define U2_FLAG_TX_CTRL_POLICY_WAIT (0x1 << 0)
#define U2_FLAG_TX_CTRL_POLICY_NEXT_PACKET (0x1 << 1)
#define U2_FLAG_TX_CTRL_POLICY_NEXT_BURST (0x1 << 2)
+//enable flag for registers: cycles and packets per update packet
+#define U2_FLAG_TX_CTRL_UP_ENB (1ul << 31)
+
#endif /* INCLUDED_USRP2_REGS_HPP */
diff --git a/host/lib/usrp/usrp_e100/CMakeLists.txt b/host/lib/usrp/usrp_e100/CMakeLists.txt
new file mode 100644
index 000000000..66c87e0d8
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/CMakeLists.txt
@@ -0,0 +1,60 @@
+#
+# Copyright 2010 Ettus Research LLC
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+#This file will be included by cmake, use absolute paths!
+
+########################################################################
+# Conditionally configure the USRP-E100 support
+########################################################################
+MESSAGE(STATUS "Configuring USRP-E100 support...")
+
+IF(DEFINED ENABLE_USRP_E100)
+ IF(ENABLE_USRP_E100)
+ MESSAGE(STATUS "USRP-E100 support enabled by configure flag")
+ ELSE(ENABLE_USRP_E100)
+ MESSAGE(STATUS "USRP-E100 support disabled by configure flag")
+ ENDIF(ENABLE_USRP_E100)
+ELSE(DEFINED ENABLE_USRP_E100) #not defined: automatic disabling of component
+ SET(ENABLE_USRP_E100 FALSE)
+ENDIF(DEFINED ENABLE_USRP_E100)
+SET(ENABLE_USRP_E100 ${ENABLE_USRP_E100} CACHE BOOL "enable USRP-E100 support")
+
+IF(ENABLE_USRP_E100)
+ MESSAGE(STATUS " Building USRP-E100 support.")
+ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/include)
+ LIBUHD_APPEND_SOURCES(
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/clock_ctrl.cpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/clock_ctrl.hpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/codec_ctrl.cpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/codec_ctrl.hpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/codec_impl.cpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/dboard_impl.cpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/dboard_iface.cpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/dsp_impl.cpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/fpga-downloader.cc
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/io_impl.cpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/mboard_impl.cpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/usrp_e100_impl.cpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/usrp_e100_impl.hpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/usrp_e100_iface.cpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/usrp_e100_iface.hpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/usrp_e100_mmap_zero_copy.cpp
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/usrp_e100_regs.hpp
+ )
+ELSE(ENABLE_USRP_E100)
+ MESSAGE(STATUS " Skipping USRP-E100 support.")
+ENDIF(ENABLE_USRP_E100)
diff --git a/host/lib/usrp/usrp_e100/clock_ctrl.cpp b/host/lib/usrp/usrp_e100/clock_ctrl.cpp
new file mode 100644
index 000000000..1fb1a7125
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/clock_ctrl.cpp
@@ -0,0 +1,263 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include "clock_ctrl.hpp"
+#include "ad9522_regs.hpp"
+#include <uhd/utils/assert.hpp>
+#include <boost/cstdint.hpp>
+#include "usrp_e100_regs.hpp" //spi slave constants
+#include <boost/assign/list_of.hpp>
+#include <boost/foreach.hpp>
+#include <utility>
+#include <iostream>
+
+using namespace uhd;
+
+template <typename div_type, typename bypass_type> static void set_clock_divider(
+ size_t divider, div_type &low, div_type &high, bypass_type &bypass
+){
+ high = divider/2 - 1;
+ low = divider - high - 2;
+ bypass = (divider == 1)? 1 : 0;
+}
+
+/***********************************************************************
+ * Constants
+ **********************************************************************/
+static const bool enable_test_clock = false;
+static const size_t ref_clock_doubler = 2; //enabled below
+static const double ref_clock_rate = 10e6 * ref_clock_doubler;
+
+static const size_t r_counter = 1;
+static const size_t a_counter = 0;
+static const size_t b_counter = 20 / ref_clock_doubler;
+static const size_t prescaler = 8; //set below with enum, set to 8 when input is under 2400 MHz
+static const size_t vco_divider = 5; //set below with enum
+
+static const size_t n_counter = prescaler * b_counter + a_counter;
+static const size_t vco_clock_rate = ref_clock_rate/r_counter * n_counter; //between 1400 and 1800 MHz
+static const double master_clock_rate = vco_clock_rate/vco_divider;
+
+static const size_t fpga_clock_divider = size_t(master_clock_rate/64e6);
+static const size_t codec_clock_divider = size_t(master_clock_rate/64e6);
+
+/***********************************************************************
+ * Clock Control Implementation
+ **********************************************************************/
+class usrp_e100_clock_ctrl_impl : public usrp_e100_clock_ctrl{
+public:
+ usrp_e100_clock_ctrl_impl(usrp_e100_iface::sptr iface){
+ _iface = iface;
+
+ //init the clock gen registers
+ //Note: out0 should already be clocking the FPGA or this isnt going to work
+ _ad9522_regs.sdo_active = ad9522_regs_t::SDO_ACTIVE_SDO_SDIO;
+ _ad9522_regs.enable_clock_doubler = 1; //enable ref clock doubler
+ _ad9522_regs.enb_stat_eeprom_at_stat_pin = 0; //use status pin
+ _ad9522_regs.status_pin_control = 0x1; //n divider
+ _ad9522_regs.ld_pin_control = 0x00; //dld
+ _ad9522_regs.refmon_pin_control = 0x12; //show ref2
+
+ _ad9522_regs.enable_ref2 = 1;
+ _ad9522_regs.enable_ref1 = 0;
+ _ad9522_regs.select_ref = ad9522_regs_t::SELECT_REF_REF2;
+
+ _ad9522_regs.set_r_counter(r_counter);
+ _ad9522_regs.a_counter = a_counter;
+ _ad9522_regs.set_b_counter(b_counter);
+ _ad9522_regs.prescaler_p = ad9522_regs_t::PRESCALER_P_DIV8_9;
+
+ _ad9522_regs.pll_power_down = ad9522_regs_t::PLL_POWER_DOWN_NORMAL;
+ _ad9522_regs.cp_current = ad9522_regs_t::CP_CURRENT_1_2MA;
+
+ _ad9522_regs.vco_calibration_now = 1; //calibrate it!
+ _ad9522_regs.vco_divider = ad9522_regs_t::VCO_DIVIDER_DIV5;
+ _ad9522_regs.select_vco_or_clock = ad9522_regs_t::SELECT_VCO_OR_CLOCK_VCO;
+
+ //setup fpga master clock
+ _ad9522_regs.out0_format = ad9522_regs_t::OUT0_FORMAT_LVDS;
+ set_clock_divider(fpga_clock_divider,
+ _ad9522_regs.divider0_low_cycles,
+ _ad9522_regs.divider0_high_cycles,
+ _ad9522_regs.divider0_bypass
+ );
+
+ //setup codec clock
+ _ad9522_regs.out3_format = ad9522_regs_t::OUT3_FORMAT_LVDS;
+ set_clock_divider(codec_clock_divider,
+ _ad9522_regs.divider1_low_cycles,
+ _ad9522_regs.divider1_high_cycles,
+ _ad9522_regs.divider1_bypass
+ );
+
+ //setup test clock (same divider as codec clock)
+ _ad9522_regs.out4_format = ad9522_regs_t::OUT4_FORMAT_CMOS;
+ _ad9522_regs.out4_cmos_configuration = (enable_test_clock)?
+ ad9522_regs_t::OUT4_CMOS_CONFIGURATION_A_ON :
+ ad9522_regs_t::OUT4_CMOS_CONFIGURATION_OFF;
+
+ //setup a list of register ranges to write
+ typedef std::pair<boost::uint16_t, boost::uint16_t> range_t;
+ static const std::vector<range_t> ranges = boost::assign::list_of
+ (range_t(0x000, 0x000)) (range_t(0x010, 0x01F))
+ (range_t(0x0F0, 0x0FD)) (range_t(0x190, 0x19B))
+ (range_t(0x1E0, 0x1E1)) (range_t(0x230, 0x230))
+ ;
+
+ //write initial register values and latch/update
+ BOOST_FOREACH(const range_t &range, ranges){
+ for(boost::uint16_t addr = range.first; addr <= range.second; addr++){
+ this->send_reg(addr);
+ }
+ }
+ this->latch_regs();
+ //test read:
+ //boost::uint32_t reg = _ad9522_regs.get_read_reg(0x01b);
+ //boost::uint32_t result = _iface->transact_spi(
+ // UE_SPI_SS_AD9522,
+ // spi_config_t::EDGE_RISE,
+ // reg, 24, true /*no*/
+ //);
+ //std::cout << "result " << std::hex << result << std::endl;
+ this->enable_rx_dboard_clock(false);
+ this->enable_tx_dboard_clock(false);
+ }
+
+ ~usrp_e100_clock_ctrl_impl(void){
+ this->enable_rx_dboard_clock(false);
+ this->enable_tx_dboard_clock(false);
+ }
+
+ double get_fpga_clock_rate(void){
+ return master_clock_rate/fpga_clock_divider;
+ }
+
+ /***********************************************************************
+ * RX Dboard Clock Control (output 9, divider 3)
+ **********************************************************************/
+ void enable_rx_dboard_clock(bool enb){
+ _ad9522_regs.out9_format = ad9522_regs_t::OUT9_FORMAT_CMOS;
+ _ad9522_regs.out9_cmos_configuration = (enb)?
+ ad9522_regs_t::OUT9_CMOS_CONFIGURATION_B_ON :
+ ad9522_regs_t::OUT9_CMOS_CONFIGURATION_OFF;
+ this->send_reg(0x0F9);
+ this->latch_regs();
+ }
+
+ std::vector<double> get_rx_dboard_clock_rates(void){
+ std::vector<double> rates;
+ for(size_t div = 1; div <= 16+16; div++)
+ rates.push_back(master_clock_rate/div);
+ return rates;
+ }
+
+ void set_rx_dboard_clock_rate(double rate){
+ assert_has(get_rx_dboard_clock_rates(), rate, "rx dboard clock rate");
+ size_t divider = size_t(master_clock_rate/rate);
+ //set the divider registers
+ set_clock_divider(divider,
+ _ad9522_regs.divider3_low_cycles,
+ _ad9522_regs.divider3_high_cycles,
+ _ad9522_regs.divider3_bypass
+ );
+ this->send_reg(0x199);
+ this->send_reg(0x19a);
+ this->latch_regs();
+ }
+
+ /***********************************************************************
+ * TX Dboard Clock Control (output 6, divider 2)
+ **********************************************************************/
+ void enable_tx_dboard_clock(bool enb){
+ _ad9522_regs.out6_format = ad9522_regs_t::OUT6_FORMAT_CMOS;
+ _ad9522_regs.out6_cmos_configuration = (enb)?
+ ad9522_regs_t::OUT6_CMOS_CONFIGURATION_B_ON :
+ ad9522_regs_t::OUT6_CMOS_CONFIGURATION_OFF;
+ this->send_reg(0x0F6);
+ this->latch_regs();
+ }
+
+ std::vector<double> get_tx_dboard_clock_rates(void){
+ return get_rx_dboard_clock_rates(); //same master clock, same dividers...
+ }
+
+ void set_tx_dboard_clock_rate(double rate){
+ assert_has(get_tx_dboard_clock_rates(), rate, "tx dboard clock rate");
+ size_t divider = size_t(master_clock_rate/rate);
+ //set the divider registers
+ set_clock_divider(divider,
+ _ad9522_regs.divider2_low_cycles,
+ _ad9522_regs.divider2_high_cycles,
+ _ad9522_regs.divider2_bypass
+ );
+ this->send_reg(0x196);
+ this->send_reg(0x197);
+ this->latch_regs();
+ }
+
+ /***********************************************************************
+ * Clock reference control
+ **********************************************************************/
+ void use_internal_ref(void) {
+ _ad9522_regs.enable_ref2 = 1;
+ _ad9522_regs.enable_ref1 = 0;
+ _ad9522_regs.select_ref = ad9522_regs_t::SELECT_REF_REF2;
+ _ad9522_regs.enb_auto_ref_switchover = ad9522_regs_t::ENB_AUTO_REF_SWITCHOVER_MANUAL;
+ this->send_reg(0x01C);
+ }
+
+ void use_external_ref(void) {
+ _ad9522_regs.enable_ref2 = 0;
+ _ad9522_regs.enable_ref1 = 1;
+ _ad9522_regs.select_ref = ad9522_regs_t::SELECT_REF_REF1;
+ _ad9522_regs.enb_auto_ref_switchover = ad9522_regs_t::ENB_AUTO_REF_SWITCHOVER_MANUAL;
+ this->send_reg(0x01C);
+ }
+
+ void use_auto_ref(void) {
+ _ad9522_regs.enable_ref2 = 1;
+ _ad9522_regs.enable_ref1 = 1;
+ _ad9522_regs.select_ref = ad9522_regs_t::SELECT_REF_REF1;
+ _ad9522_regs.enb_auto_ref_switchover = ad9522_regs_t::ENB_AUTO_REF_SWITCHOVER_AUTO;
+ }
+
+private:
+ usrp_e100_iface::sptr _iface;
+ ad9522_regs_t _ad9522_regs;
+
+ void latch_regs(void){
+ _ad9522_regs.io_update = 1;
+ this->send_reg(0x232);
+ }
+
+ void send_reg(boost::uint16_t addr){
+ boost::uint32_t reg = _ad9522_regs.get_write_reg(addr);
+ //std::cout << "clock control write reg: " << std::hex << reg << std::endl;
+ _iface->transact_spi(
+ UE_SPI_SS_AD9522,
+ spi_config_t::EDGE_RISE,
+ reg, 24, false /*no rb*/
+ );
+ }
+};
+
+/***********************************************************************
+ * Clock Control Make
+ **********************************************************************/
+usrp_e100_clock_ctrl::sptr usrp_e100_clock_ctrl::make(usrp_e100_iface::sptr iface){
+ return sptr(new usrp_e100_clock_ctrl_impl(iface));
+}
diff --git a/host/lib/usrp/usrp_e100/clock_ctrl.hpp b/host/lib/usrp/usrp_e100/clock_ctrl.hpp
new file mode 100644
index 000000000..d613d1473
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/clock_ctrl.hpp
@@ -0,0 +1,103 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#ifndef INCLUDED_USRP_E100_CLOCK_CTRL_HPP
+#define INCLUDED_USRP_E100_CLOCK_CTRL_HPP
+
+#include "usrp_e100_iface.hpp"
+#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
+#include <vector>
+
+/*!
+ * The usrp-e clock control:
+ * - Setup system clocks.
+ * - Disable/enable clock lines.
+ */
+class usrp_e100_clock_ctrl : boost::noncopyable{
+public:
+ typedef boost::shared_ptr<usrp_e100_clock_ctrl> sptr;
+
+ /*!
+ * Make a new clock control object.
+ * \param iface the usrp_e100 iface object
+ * \return the clock control object
+ */
+ static sptr make(usrp_e100_iface::sptr iface);
+
+ /*!
+ * Get the rate of the fpga clock line.
+ * \return the fpga clock rate in Hz
+ */
+ virtual double get_fpga_clock_rate(void) = 0;
+
+ /*!
+ * Get the possible rates of the rx dboard clock.
+ * \return a vector of clock rates in Hz
+ */
+ virtual std::vector<double> get_rx_dboard_clock_rates(void) = 0;
+
+ /*!
+ * Get the possible rates of the tx dboard clock.
+ * \return a vector of clock rates in Hz
+ */
+ virtual std::vector<double> get_tx_dboard_clock_rates(void) = 0;
+
+ /*!
+ * Set the rx dboard clock rate to a possible rate.
+ * \param rate the new clock rate in Hz
+ * \throw exception when rate cannot be achieved
+ */
+ virtual void set_rx_dboard_clock_rate(double rate) = 0;
+
+ /*!
+ * Set the tx dboard clock rate to a possible rate.
+ * \param rate the new clock rate in Hz
+ * \throw exception when rate cannot be achieved
+ */
+ virtual void set_tx_dboard_clock_rate(double rate) = 0;
+
+ /*!
+ * Enable/disable the rx dboard clock.
+ * \param enb true to enable
+ */
+ virtual void enable_rx_dboard_clock(bool enb) = 0;
+
+ /*!
+ * Enable/disable the tx dboard clock.
+ * \param enb true to enable
+ */
+ virtual void enable_tx_dboard_clock(bool enb) = 0;
+
+ /*!
+ * Use the internal TCXO reference
+ */
+ virtual void use_internal_ref(void) = 0;
+
+ /*!
+ * Use the external SMA reference
+ */
+ virtual void use_external_ref(void) = 0;
+
+ /*!
+ * Use external if available, internal otherwise
+ */
+ virtual void use_auto_ref(void) = 0;
+
+};
+
+#endif /* INCLUDED_USRP_E100_CLOCK_CTRL_HPP */
diff --git a/host/lib/usrp/usrp_e100/codec_ctrl.cpp b/host/lib/usrp/usrp_e100/codec_ctrl.cpp
new file mode 100644
index 000000000..e7fd9792e
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/codec_ctrl.cpp
@@ -0,0 +1,296 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include "codec_ctrl.hpp"
+#include "ad9862_regs.hpp"
+#include <uhd/types/dict.hpp>
+#include <uhd/utils/assert.hpp>
+#include <uhd/utils/algorithm.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/tuple/tuple.hpp>
+#include <boost/math/special_functions/round.hpp>
+#include "usrp_e100_regs.hpp" //spi slave constants
+#include <boost/assign/list_of.hpp>
+#include <iostream>
+
+using namespace uhd;
+
+static const bool codec_debug = false;
+
+const gain_range_t usrp_e100_codec_ctrl::tx_pga_gain_range(-20, 0, float(0.1));
+const gain_range_t usrp_e100_codec_ctrl::rx_pga_gain_range(0, 20, 1);
+
+/***********************************************************************
+ * Codec Control Implementation
+ **********************************************************************/
+class usrp_e100_codec_ctrl_impl : public usrp_e100_codec_ctrl{
+public:
+ //structors
+ usrp_e100_codec_ctrl_impl(usrp_e100_iface::sptr iface);
+ ~usrp_e100_codec_ctrl_impl(void);
+
+ //aux adc and dac control
+ float read_aux_adc(aux_adc_t which);
+ void write_aux_dac(aux_dac_t which, float volts);
+
+ //pga gain control
+ void set_tx_pga_gain(float);
+ float get_tx_pga_gain(void);
+ void set_rx_pga_gain(float, char);
+ float get_rx_pga_gain(char);
+
+private:
+ usrp_e100_iface::sptr _iface;
+ ad9862_regs_t _ad9862_regs;
+ aux_adc_t _last_aux_adc_a, _last_aux_adc_b;
+ void send_reg(boost::uint8_t addr);
+ void recv_reg(boost::uint8_t addr);
+};
+
+/***********************************************************************
+ * Codec Control Structors
+ **********************************************************************/
+usrp_e100_codec_ctrl_impl::usrp_e100_codec_ctrl_impl(usrp_e100_iface::sptr iface){
+ _iface = iface;
+
+ //soft reset
+ _ad9862_regs.soft_reset = 1;
+ this->send_reg(0);
+
+ //initialize the codec register settings
+ _ad9862_regs.sdio_bidir = ad9862_regs_t::SDIO_BIDIR_SDIO_SDO;
+ _ad9862_regs.lsb_first = ad9862_regs_t::LSB_FIRST_MSB;
+ _ad9862_regs.soft_reset = 0;
+
+ //setup rx side of codec
+ _ad9862_regs.byp_buffer_a = 1;
+ _ad9862_regs.byp_buffer_b = 1;
+ _ad9862_regs.buffer_a_pd = 1;
+ _ad9862_regs.buffer_b_pd = 1;
+ _ad9862_regs.rx_pga_a = 0;//0x1f; //TODO bring under api control
+ _ad9862_regs.rx_pga_b = 0;//0x1f; //TODO bring under api control
+ _ad9862_regs.rx_twos_comp = 1;
+ _ad9862_regs.rx_hilbert = ad9862_regs_t::RX_HILBERT_DIS;
+
+ //setup tx side of codec
+ _ad9862_regs.two_data_paths = ad9862_regs_t::TWO_DATA_PATHS_BOTH;
+ _ad9862_regs.interleaved = ad9862_regs_t::INTERLEAVED_INTERLEAVED;
+ _ad9862_regs.tx_retime = ad9862_regs_t::TX_RETIME_CLKOUT2;
+ _ad9862_regs.tx_pga_gain = 199; //TODO bring under api control
+ _ad9862_regs.tx_hilbert = ad9862_regs_t::TX_HILBERT_DIS;
+ _ad9862_regs.interp = ad9862_regs_t::INTERP_2;
+ _ad9862_regs.tx_twos_comp = 1;
+ _ad9862_regs.fine_mode = ad9862_regs_t::FINE_MODE_BYPASS;
+ _ad9862_regs.coarse_mod = ad9862_regs_t::COARSE_MOD_BYPASS;
+ _ad9862_regs.dac_a_coarse_gain = 0x3;
+ _ad9862_regs.dac_b_coarse_gain = 0x3;
+ _ad9862_regs.edges = ad9862_regs_t::EDGES_NORMAL;
+
+ //setup the dll
+ _ad9862_regs.input_clk_ctrl = ad9862_regs_t::INPUT_CLK_CTRL_EXTERNAL;
+ _ad9862_regs.dll_mult = ad9862_regs_t::DLL_MULT_2;
+ _ad9862_regs.dll_mode = ad9862_regs_t::DLL_MODE_FAST;
+
+ //write the register settings to the codec
+ for (uint8_t addr = 0; addr <= 25; addr++){
+ this->send_reg(addr);
+ }
+
+ //aux adc clock
+ _ad9862_regs.clk_4 = ad9862_regs_t::CLK_4_1_4;
+ this->send_reg(34);
+}
+
+usrp_e100_codec_ctrl_impl::~usrp_e100_codec_ctrl_impl(void){
+ //set aux dacs to zero
+ this->write_aux_dac(AUX_DAC_A, 0);
+ this->write_aux_dac(AUX_DAC_B, 0);
+ this->write_aux_dac(AUX_DAC_C, 0);
+ this->write_aux_dac(AUX_DAC_D, 0);
+
+ //power down
+ _ad9862_regs.all_rx_pd = 1;
+ this->send_reg(1);
+ _ad9862_regs.tx_digital_pd = 1;
+ _ad9862_regs.tx_analog_pd = ad9862_regs_t::TX_ANALOG_PD_BOTH;
+ this->send_reg(8);
+}
+
+/***********************************************************************
+ * Codec Control Gain Control Methods
+ **********************************************************************/
+static const int mtpgw = 255; //maximum tx pga gain word
+
+void usrp_e100_codec_ctrl_impl::set_tx_pga_gain(float gain){
+ int gain_word = int(mtpgw*(gain - tx_pga_gain_range.min)/(tx_pga_gain_range.max - tx_pga_gain_range.min));
+ _ad9862_regs.tx_pga_gain = std::clip(gain_word, 0, mtpgw);
+ this->send_reg(16);
+}
+
+float usrp_e100_codec_ctrl_impl::get_tx_pga_gain(void){
+ return (_ad9862_regs.tx_pga_gain*(tx_pga_gain_range.max - tx_pga_gain_range.min)/mtpgw) + tx_pga_gain_range.min;
+}
+
+static const int mrpgw = 0x14; //maximum rx pga gain word
+
+void usrp_e100_codec_ctrl_impl::set_rx_pga_gain(float gain, char which){
+ int gain_word = int(mrpgw*(gain - rx_pga_gain_range.min)/(rx_pga_gain_range.max - rx_pga_gain_range.min));
+ gain_word = std::clip(gain_word, 0, mrpgw);
+ switch(which){
+ case 'A':
+ _ad9862_regs.rx_pga_a = gain_word;
+ this->send_reg(2);
+ return;
+ case 'B':
+ _ad9862_regs.rx_pga_b = gain_word;
+ this->send_reg(3);
+ return;
+ default: UHD_THROW_INVALID_CODE_PATH();
+ }
+}
+
+float usrp_e100_codec_ctrl_impl::get_rx_pga_gain(char which){
+ int gain_word;
+ switch(which){
+ case 'A': gain_word = _ad9862_regs.rx_pga_a; break;
+ case 'B': gain_word = _ad9862_regs.rx_pga_b; break;
+ default: UHD_THROW_INVALID_CODE_PATH();
+ }
+ return (gain_word*(rx_pga_gain_range.max - rx_pga_gain_range.min)/mrpgw) + rx_pga_gain_range.min;
+}
+
+/***********************************************************************
+ * Codec Control AUX ADC Methods
+ **********************************************************************/
+static float aux_adc_to_volts(boost::uint8_t high, boost::uint8_t low){
+ return float((boost::uint16_t(high) << 2) | low)*3.3/0x3ff;
+}
+
+float usrp_e100_codec_ctrl_impl::read_aux_adc(aux_adc_t which){
+ //check to see if the switch needs to be set
+ bool write_switch = false;
+ switch(which){
+
+ case AUX_ADC_A1:
+ case AUX_ADC_A2:
+ if (which != _last_aux_adc_a){
+ _ad9862_regs.select_a = (which == AUX_ADC_A1)?
+ ad9862_regs_t::SELECT_A_AUX_ADC1: ad9862_regs_t::SELECT_A_AUX_ADC2;
+ _last_aux_adc_a = which;
+ write_switch = true;
+ }
+ break;
+
+ case AUX_ADC_B1:
+ case AUX_ADC_B2:
+ if (which != _last_aux_adc_b){
+ _ad9862_regs.select_b = (which == AUX_ADC_B1)?
+ ad9862_regs_t::SELECT_B_AUX_ADC1: ad9862_regs_t::SELECT_B_AUX_ADC2;
+ _last_aux_adc_b = which;
+ write_switch = true;
+ }
+ break;
+
+ }
+
+ //write the switch if it changed
+ if(write_switch) this->send_reg(34);
+
+ //map aux adcs to register values to read
+ static const uhd::dict<aux_adc_t, boost::uint8_t> aux_dac_to_addr = boost::assign::map_list_of
+ (AUX_ADC_A2, 26) (AUX_ADC_A1, 28)
+ (AUX_ADC_B2, 30) (AUX_ADC_B1, 32)
+ ;
+
+ //read the value
+ this->recv_reg(aux_dac_to_addr[which]+0);
+ this->recv_reg(aux_dac_to_addr[which]+1);
+
+ //return the value scaled to volts
+ switch(which){
+ case AUX_ADC_A1: return aux_adc_to_volts(_ad9862_regs.aux_adc_a1_9_2, _ad9862_regs.aux_adc_a1_1_0);
+ case AUX_ADC_A2: return aux_adc_to_volts(_ad9862_regs.aux_adc_a2_9_2, _ad9862_regs.aux_adc_a2_1_0);
+ case AUX_ADC_B1: return aux_adc_to_volts(_ad9862_regs.aux_adc_b1_9_2, _ad9862_regs.aux_adc_b1_1_0);
+ case AUX_ADC_B2: return aux_adc_to_volts(_ad9862_regs.aux_adc_b2_9_2, _ad9862_regs.aux_adc_b2_1_0);
+ }
+ UHD_ASSERT_THROW(false);
+}
+
+/***********************************************************************
+ * Codec Control AUX DAC Methods
+ **********************************************************************/
+void usrp_e100_codec_ctrl_impl::write_aux_dac(aux_dac_t which, float volts){
+ //special case for aux dac d (aka sigma delta word)
+ if (which == AUX_DAC_D){
+ boost::uint16_t dac_word = std::clip(boost::math::iround(volts*0xfff/3.3), 0, 0xfff);
+ _ad9862_regs.sig_delt_11_4 = boost::uint8_t(dac_word >> 4);
+ _ad9862_regs.sig_delt_3_0 = boost::uint8_t(dac_word & 0xf);
+ this->send_reg(42);
+ this->send_reg(43);
+ return;
+ }
+
+ //calculate the dac word for aux dac a, b, c
+ boost::uint8_t dac_word = std::clip(boost::math::iround(volts*0xff/3.3), 0, 0xff);
+
+ //setup a lookup table for the aux dac params (reg ref, reg addr)
+ typedef boost::tuple<boost::uint8_t*, boost::uint8_t> dac_params_t;
+ uhd::dict<aux_dac_t, dac_params_t> aux_dac_to_params = boost::assign::map_list_of
+ (AUX_DAC_A, dac_params_t(&_ad9862_regs.aux_dac_a, 36))
+ (AUX_DAC_B, dac_params_t(&_ad9862_regs.aux_dac_b, 37))
+ (AUX_DAC_C, dac_params_t(&_ad9862_regs.aux_dac_c, 38))
+ ;
+
+ //set the aux dac register
+ UHD_ASSERT_THROW(aux_dac_to_params.has_key(which));
+ boost::uint8_t *reg_ref, reg_addr;
+ boost::tie(reg_ref, reg_addr) = aux_dac_to_params[which];
+ *reg_ref = dac_word;
+ this->send_reg(reg_addr);
+}
+
+/***********************************************************************
+ * Codec Control SPI Methods
+ **********************************************************************/
+void usrp_e100_codec_ctrl_impl::send_reg(boost::uint8_t addr){
+ boost::uint32_t reg = _ad9862_regs.get_write_reg(addr);
+ if (codec_debug) std::cout << "codec control write reg: " << std::hex << reg << std::endl;
+ _iface->transact_spi(
+ UE_SPI_SS_AD9862,
+ spi_config_t::EDGE_RISE,
+ reg, 16, false /*no rb*/
+ );
+}
+
+void usrp_e100_codec_ctrl_impl::recv_reg(boost::uint8_t addr){
+ boost::uint32_t reg = _ad9862_regs.get_read_reg(addr);
+ if (codec_debug) std::cout << "codec control read reg: " << std::hex << reg << std::endl;
+ boost::uint32_t ret = _iface->transact_spi(
+ UE_SPI_SS_AD9862,
+ spi_config_t::EDGE_RISE,
+ reg, 16, true /*rb*/
+ );
+ if (codec_debug) std::cout << "codec control read ret: " << std::hex << ret << std::endl;
+ _ad9862_regs.set_reg(addr, boost::uint16_t(ret));
+}
+
+/***********************************************************************
+ * Codec Control Make
+ **********************************************************************/
+usrp_e100_codec_ctrl::sptr usrp_e100_codec_ctrl::make(usrp_e100_iface::sptr iface){
+ return sptr(new usrp_e100_codec_ctrl_impl(iface));
+}
diff --git a/host/lib/usrp/usrp_e100/codec_ctrl.hpp b/host/lib/usrp/usrp_e100/codec_ctrl.hpp
new file mode 100644
index 000000000..74ce9bd9a
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/codec_ctrl.hpp
@@ -0,0 +1,90 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#ifndef INCLUDED_USRP_E100_CODEC_CTRL_HPP
+#define INCLUDED_USRP_E100_CODEC_CTRL_HPP
+
+#include "usrp_e100_iface.hpp"
+#include <uhd/types/ranges.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
+
+/*!
+ * The usrp-e codec control:
+ * - Init/power down codec.
+ * - Read aux adc, write aux dac.
+ */
+class usrp_e100_codec_ctrl : boost::noncopyable{
+public:
+ typedef boost::shared_ptr<usrp_e100_codec_ctrl> sptr;
+
+ static const uhd::gain_range_t tx_pga_gain_range;
+ static const uhd::gain_range_t rx_pga_gain_range;
+
+ /*!
+ * Make a new codec control object.
+ * \param iface the usrp_e100 iface object
+ * \return the codec control object
+ */
+ static sptr make(usrp_e100_iface::sptr iface);
+
+ //! aux adc identifier constants
+ enum aux_adc_t{
+ AUX_ADC_A2 = 0xA2,
+ AUX_ADC_A1 = 0xA1,
+ AUX_ADC_B2 = 0xB2,
+ AUX_ADC_B1 = 0xB1
+ };
+
+ /*!
+ * Read an auxiliary adc:
+ * The internals remember which aux adc was read last.
+ * Therefore, the aux adc switch is only changed as needed.
+ * \param which which of the 4 adcs
+ * \return a value in volts
+ */
+ virtual float read_aux_adc(aux_adc_t which) = 0;
+
+ //! aux dac identifier constants
+ enum aux_dac_t{
+ AUX_DAC_A = 0xA,
+ AUX_DAC_B = 0xB,
+ AUX_DAC_C = 0xC,
+ AUX_DAC_D = 0xD //really the sigma delta output
+ };
+
+ /*!
+ * Write an auxiliary dac.
+ * \param which which of the 4 dacs
+ * \param volts the level in in volts
+ */
+ virtual void write_aux_dac(aux_dac_t which, float volts) = 0;
+
+ //! Set the TX PGA gain
+ virtual void set_tx_pga_gain(float gain) = 0;
+
+ //! Get the TX PGA gain
+ virtual float get_tx_pga_gain(void) = 0;
+
+ //! Set the RX PGA gain ('A' or 'B')
+ virtual void set_rx_pga_gain(float gain, char which) = 0;
+
+ //! Get the RX PGA gain ('A' or 'B')
+ virtual float get_rx_pga_gain(char which) = 0;
+};
+
+#endif /* INCLUDED_USRP_E100_CODEC_CTRL_HPP */
diff --git a/host/lib/usrp/usrp_e100/codec_impl.cpp b/host/lib/usrp/usrp_e100/codec_impl.cpp
new file mode 100644
index 000000000..6fd44bad3
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/codec_impl.cpp
@@ -0,0 +1,149 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include "usrp_e100_impl.hpp"
+#include <uhd/utils/assert.hpp>
+#include <uhd/usrp/codec_props.hpp>
+#include <boost/bind.hpp>
+
+using namespace uhd;
+using namespace uhd::usrp;
+
+/***********************************************************************
+ * Helper Methods
+ **********************************************************************/
+void usrp_e100_impl::codec_init(void){
+ //make proxies
+ _rx_codec_proxy = wax_obj_proxy::make(
+ boost::bind(&usrp_e100_impl::rx_codec_get, this, _1, _2),
+ boost::bind(&usrp_e100_impl::rx_codec_set, this, _1, _2)
+ );
+ _tx_codec_proxy = wax_obj_proxy::make(
+ boost::bind(&usrp_e100_impl::tx_codec_get, this, _1, _2),
+ boost::bind(&usrp_e100_impl::tx_codec_set, this, _1, _2)
+ );
+}
+
+/***********************************************************************
+ * RX Codec Properties
+ **********************************************************************/
+static const std::string ad9862_pga_gain_name = "ad9862 pga";
+
+void usrp_e100_impl::rx_codec_get(const wax::obj &key_, wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
+ //handle the get request conditioned on the key
+ switch(key.as<codec_prop_t>()){
+ case CODEC_PROP_NAME:
+ val = std::string("usrp-e adc - ad9522");
+ return;
+
+ case CODEC_PROP_OTHERS:
+ val = prop_names_t();
+ return;
+
+ case CODEC_PROP_GAIN_NAMES:
+ val = prop_names_t(1, ad9862_pga_gain_name);
+ return;
+
+ case CODEC_PROP_GAIN_RANGE:
+ UHD_ASSERT_THROW(key.name == ad9862_pga_gain_name);
+ val = usrp_e100_codec_ctrl::rx_pga_gain_range;
+ return;
+
+ case CODEC_PROP_GAIN_I:
+ UHD_ASSERT_THROW(key.name == ad9862_pga_gain_name);
+ val = _codec_ctrl->get_rx_pga_gain('A');
+ return;
+
+ case CODEC_PROP_GAIN_Q:
+ UHD_ASSERT_THROW(key.name == ad9862_pga_gain_name);
+ val = _codec_ctrl->get_rx_pga_gain('B');
+ return;
+
+ default: UHD_THROW_PROP_GET_ERROR();
+ }
+}
+
+void usrp_e100_impl::rx_codec_set(const wax::obj &key_, const wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
+ //handle the set request conditioned on the key
+ switch(key.as<codec_prop_t>()){
+ case CODEC_PROP_GAIN_I:
+ UHD_ASSERT_THROW(key.name == ad9862_pga_gain_name);
+ _codec_ctrl->set_rx_pga_gain(val.as<float>(), 'A');
+ return;
+
+ case CODEC_PROP_GAIN_Q:
+ UHD_ASSERT_THROW(key.name == ad9862_pga_gain_name);
+ _codec_ctrl->set_rx_pga_gain(val.as<float>(), 'B');
+ return;
+
+ default: UHD_THROW_PROP_SET_ERROR();
+ }
+}
+
+/***********************************************************************
+ * TX Codec Properties
+ **********************************************************************/
+void usrp_e100_impl::tx_codec_get(const wax::obj &key_, wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
+ //handle the get request conditioned on the key
+ switch(key.as<codec_prop_t>()){
+ case CODEC_PROP_NAME:
+ val = std::string("usrp-e dac - ad9522");
+ return;
+
+ case CODEC_PROP_OTHERS:
+ val = prop_names_t();
+ return;
+
+ case CODEC_PROP_GAIN_NAMES:
+ val = prop_names_t(1, ad9862_pga_gain_name);
+ return;
+
+ case CODEC_PROP_GAIN_RANGE:
+ UHD_ASSERT_THROW(key.name == ad9862_pga_gain_name);
+ val = usrp_e100_codec_ctrl::tx_pga_gain_range;
+ return;
+
+ case CODEC_PROP_GAIN_I: //only one gain for I and Q
+ case CODEC_PROP_GAIN_Q:
+ UHD_ASSERT_THROW(key.name == ad9862_pga_gain_name);
+ val = _codec_ctrl->get_tx_pga_gain();
+ return;
+
+ default: UHD_THROW_PROP_GET_ERROR();
+ }
+}
+
+void usrp_e100_impl::tx_codec_set(const wax::obj &key_, const wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
+ //handle the set request conditioned on the key
+ switch(key.as<codec_prop_t>()){
+ case CODEC_PROP_GAIN_I: //only one gain for I and Q
+ case CODEC_PROP_GAIN_Q:
+ UHD_ASSERT_THROW(key.name == ad9862_pga_gain_name);
+ _codec_ctrl->set_tx_pga_gain(val.as<float>());
+ return;
+
+ default: UHD_THROW_PROP_SET_ERROR();
+ }
+}
diff --git a/host/lib/usrp/usrp_e100/dboard_iface.cpp b/host/lib/usrp/usrp_e100/dboard_iface.cpp
new file mode 100644
index 000000000..aa96171d6
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/dboard_iface.cpp
@@ -0,0 +1,298 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include "usrp_e100_iface.hpp"
+#include "usrp_e100_regs.hpp"
+#include "clock_ctrl.hpp"
+#include "codec_ctrl.hpp"
+#include <uhd/usrp/dboard_iface.hpp>
+#include <uhd/types/dict.hpp>
+#include <uhd/utils/assert.hpp>
+#include <boost/assign/list_of.hpp>
+#include <linux/usrp_e.h> //i2c and spi constants
+
+using namespace uhd;
+using namespace uhd::usrp;
+using namespace boost::assign;
+
+class usrp_e100_dboard_iface : public dboard_iface{
+public:
+
+ usrp_e100_dboard_iface(
+ usrp_e100_iface::sptr iface,
+ usrp_e100_clock_ctrl::sptr clock,
+ usrp_e100_codec_ctrl::sptr codec
+ ){
+ _iface = iface;
+ _clock = clock;
+ _codec = codec;
+
+ //init the clock rate shadows
+ this->set_clock_rate(UNIT_RX, _clock->get_fpga_clock_rate());
+ this->set_clock_rate(UNIT_TX, _clock->get_fpga_clock_rate());
+
+ _iface->poke16(UE_REG_GPIO_RX_DBG, 0);
+ _iface->poke16(UE_REG_GPIO_TX_DBG, 0);
+ }
+
+ ~usrp_e100_dboard_iface(void){
+ /* NOP */
+ }
+
+ special_props_t get_special_props(void){
+ special_props_t props;
+ props.soft_clock_divider = false;
+ props.mangle_i2c_addrs = false;
+ return props;
+ }
+
+ void write_aux_dac(unit_t, aux_dac_t, float);
+ float read_aux_adc(unit_t, aux_adc_t);
+
+ void set_pin_ctrl(unit_t, boost::uint16_t);
+ void set_atr_reg(unit_t, atr_reg_t, boost::uint16_t);
+ void set_gpio_ddr(unit_t, boost::uint16_t);
+ void write_gpio(unit_t, boost::uint16_t);
+ void set_gpio_debug(unit_t, int);
+ boost::uint16_t read_gpio(unit_t);
+
+ void write_i2c(boost::uint8_t, const byte_vector_t &);
+ byte_vector_t read_i2c(boost::uint8_t, size_t);
+
+ void write_spi(
+ unit_t unit,
+ const spi_config_t &config,
+ boost::uint32_t data,
+ size_t num_bits
+ );
+
+ boost::uint32_t read_write_spi(
+ unit_t unit,
+ const spi_config_t &config,
+ boost::uint32_t data,
+ size_t num_bits
+ );
+
+ void set_clock_rate(unit_t, double);
+ std::vector<double> get_clock_rates(unit_t);
+ double get_clock_rate(unit_t);
+ void set_clock_enabled(unit_t, bool);
+ double get_codec_rate(unit_t);
+
+private:
+ usrp_e100_iface::sptr _iface;
+ usrp_e100_clock_ctrl::sptr _clock;
+ usrp_e100_codec_ctrl::sptr _codec;
+ uhd::dict<unit_t, double> _clock_rates;
+};
+
+/***********************************************************************
+ * Make Function
+ **********************************************************************/
+dboard_iface::sptr make_usrp_e100_dboard_iface(
+ usrp_e100_iface::sptr iface,
+ usrp_e100_clock_ctrl::sptr clock,
+ usrp_e100_codec_ctrl::sptr codec
+){
+ return dboard_iface::sptr(new usrp_e100_dboard_iface(iface, clock, codec));
+}
+
+/***********************************************************************
+ * Clock Rates
+ **********************************************************************/
+void usrp_e100_dboard_iface::set_clock_rate(unit_t unit, double rate){
+ _clock_rates[unit] = rate;
+ switch(unit){
+ case UNIT_RX: return _clock->set_rx_dboard_clock_rate(rate);
+ case UNIT_TX: return _clock->set_tx_dboard_clock_rate(rate);
+ }
+}
+
+std::vector<double> usrp_e100_dboard_iface::get_clock_rates(unit_t unit){
+ switch(unit){
+ case UNIT_RX: return _clock->get_rx_dboard_clock_rates();
+ case UNIT_TX: return _clock->get_tx_dboard_clock_rates();
+ default: UHD_THROW_INVALID_CODE_PATH();
+ }
+}
+
+double usrp_e100_dboard_iface::get_clock_rate(unit_t unit){
+ return _clock_rates[unit];
+}
+
+void usrp_e100_dboard_iface::set_clock_enabled(unit_t unit, bool enb){
+ switch(unit){
+ case UNIT_RX: return _clock->enable_rx_dboard_clock(enb);
+ case UNIT_TX: return _clock->enable_tx_dboard_clock(enb);
+ }
+}
+
+double usrp_e100_dboard_iface::get_codec_rate(unit_t){
+ return _clock->get_fpga_clock_rate();
+}
+
+/***********************************************************************
+ * GPIO
+ **********************************************************************/
+void usrp_e100_dboard_iface::set_pin_ctrl(unit_t unit, boost::uint16_t value){
+ UHD_ASSERT_THROW(GPIO_SEL_ATR == 1); //make this assumption
+ switch(unit){
+ case UNIT_RX: _iface->poke16(UE_REG_GPIO_RX_SEL, value); return;
+ case UNIT_TX: _iface->poke16(UE_REG_GPIO_TX_SEL, value); return;
+ }
+}
+
+void usrp_e100_dboard_iface::set_gpio_ddr(unit_t unit, boost::uint16_t value){
+ switch(unit){
+ case UNIT_RX: _iface->poke16(UE_REG_GPIO_RX_DDR, value); return;
+ case UNIT_TX: _iface->poke16(UE_REG_GPIO_TX_DDR, value); return;
+ }
+}
+
+void usrp_e100_dboard_iface::write_gpio(unit_t unit, boost::uint16_t value){
+ switch(unit){
+ case UNIT_RX: _iface->poke16(UE_REG_GPIO_RX_IO, value); return;
+ case UNIT_TX: _iface->poke16(UE_REG_GPIO_TX_IO, value); return;
+ }
+}
+
+boost::uint16_t usrp_e100_dboard_iface::read_gpio(unit_t unit){
+ switch(unit){
+ case UNIT_RX: return _iface->peek16(UE_REG_GPIO_RX_IO);
+ case UNIT_TX: return _iface->peek16(UE_REG_GPIO_TX_IO);
+ default: UHD_THROW_INVALID_CODE_PATH();
+ }
+}
+
+void usrp_e100_dboard_iface::set_atr_reg(unit_t unit, atr_reg_t atr, boost::uint16_t value){
+ //define mapping of unit to atr regs to register address
+ static const uhd::dict<
+ unit_t, uhd::dict<atr_reg_t, boost::uint32_t>
+ > unit_to_atr_to_addr = map_list_of
+ (UNIT_RX, map_list_of
+ (ATR_REG_IDLE, UE_REG_ATR_IDLE_RXSIDE)
+ (ATR_REG_TX_ONLY, UE_REG_ATR_INTX_RXSIDE)
+ (ATR_REG_RX_ONLY, UE_REG_ATR_INRX_RXSIDE)
+ (ATR_REG_FULL_DUPLEX, UE_REG_ATR_FULL_RXSIDE)
+ )
+ (UNIT_TX, map_list_of
+ (ATR_REG_IDLE, UE_REG_ATR_IDLE_TXSIDE)
+ (ATR_REG_TX_ONLY, UE_REG_ATR_INTX_TXSIDE)
+ (ATR_REG_RX_ONLY, UE_REG_ATR_INRX_TXSIDE)
+ (ATR_REG_FULL_DUPLEX, UE_REG_ATR_FULL_TXSIDE)
+ )
+ ;
+ _iface->poke16(unit_to_atr_to_addr[unit][atr], value);
+}
+
+void usrp_e100_dboard_iface::set_gpio_debug(unit_t unit, int which){
+ //set this unit to all outputs
+ this->set_gpio_ddr(unit, 0xffff);
+
+ //calculate the debug selections
+ boost::uint32_t dbg_sels = 0x0;
+ int sel = (which == 0)? GPIO_SEL_DEBUG_0 : GPIO_SEL_DEBUG_1;
+ for(size_t i = 0; i < 16; i++) dbg_sels |= sel << i;
+
+ //set the debug on and which debug selection
+ switch(unit){
+ case UNIT_RX:
+ _iface->poke16(UE_REG_GPIO_RX_DBG, 0xffff);
+ _iface->poke16(UE_REG_GPIO_RX_SEL, dbg_sels);
+ return;
+
+ case UNIT_TX:
+ _iface->poke16(UE_REG_GPIO_TX_DBG, 0xffff);
+ _iface->poke16(UE_REG_GPIO_TX_SEL, dbg_sels);
+ return;
+ }
+}
+
+/***********************************************************************
+ * SPI
+ **********************************************************************/
+/*!
+ * Static function to convert a unit type to a spi slave device number.
+ * \param unit the dboard interface unit type enum
+ * \return the slave device number
+ */
+static boost::uint32_t unit_to_otw_spi_dev(dboard_iface::unit_t unit){
+ switch(unit){
+ case dboard_iface::UNIT_TX: return UE_SPI_SS_TX_DB;
+ case dboard_iface::UNIT_RX: return UE_SPI_SS_RX_DB;
+ }
+ throw std::invalid_argument("unknown unit type");
+}
+
+void usrp_e100_dboard_iface::write_spi(
+ unit_t unit,
+ const spi_config_t &config,
+ boost::uint32_t data,
+ size_t num_bits
+){
+ _iface->transact_spi(unit_to_otw_spi_dev(unit), config, data, num_bits, false /*no rb*/);
+}
+
+boost::uint32_t usrp_e100_dboard_iface::read_write_spi(
+ unit_t unit,
+ const spi_config_t &config,
+ boost::uint32_t data,
+ size_t num_bits
+){
+ return _iface->transact_spi(unit_to_otw_spi_dev(unit), config, data, num_bits, true /*rb*/);
+}
+
+/***********************************************************************
+ * I2C
+ **********************************************************************/
+void usrp_e100_dboard_iface::write_i2c(boost::uint8_t addr, const byte_vector_t &bytes){
+ return _iface->write_i2c(addr, bytes);
+}
+
+byte_vector_t usrp_e100_dboard_iface::read_i2c(boost::uint8_t addr, size_t num_bytes){
+ return _iface->read_i2c(addr, num_bytes);
+}
+
+/***********************************************************************
+ * Aux DAX/ADC
+ **********************************************************************/
+void usrp_e100_dboard_iface::write_aux_dac(dboard_iface::unit_t, aux_dac_t which, float value){
+ //same aux dacs for each unit
+ static const uhd::dict<aux_dac_t, usrp_e100_codec_ctrl::aux_dac_t> which_to_aux_dac = map_list_of
+ (AUX_DAC_A, usrp_e100_codec_ctrl::AUX_DAC_A)
+ (AUX_DAC_B, usrp_e100_codec_ctrl::AUX_DAC_B)
+ (AUX_DAC_C, usrp_e100_codec_ctrl::AUX_DAC_C)
+ (AUX_DAC_D, usrp_e100_codec_ctrl::AUX_DAC_D)
+ ;
+ _codec->write_aux_dac(which_to_aux_dac[which], value);
+}
+
+float usrp_e100_dboard_iface::read_aux_adc(dboard_iface::unit_t unit, aux_adc_t which){
+ static const uhd::dict<
+ unit_t, uhd::dict<aux_adc_t, usrp_e100_codec_ctrl::aux_adc_t>
+ > unit_to_which_to_aux_adc = map_list_of
+ (UNIT_RX, map_list_of
+ (AUX_ADC_A, usrp_e100_codec_ctrl::AUX_ADC_A1)
+ (AUX_ADC_B, usrp_e100_codec_ctrl::AUX_ADC_B1)
+ )
+ (UNIT_TX, map_list_of
+ (AUX_ADC_A, usrp_e100_codec_ctrl::AUX_ADC_A2)
+ (AUX_ADC_B, usrp_e100_codec_ctrl::AUX_ADC_B2)
+ )
+ ;
+ return _codec->read_aux_adc(unit_to_which_to_aux_adc[unit][which]);
+}
diff --git a/host/lib/usrp/usrp_e100/dboard_impl.cpp b/host/lib/usrp/usrp_e100/dboard_impl.cpp
new file mode 100644
index 000000000..9f2bfb8ae
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/dboard_impl.cpp
@@ -0,0 +1,172 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include "usrp_e100_impl.hpp"
+#include "usrp_e100_regs.hpp"
+#include <uhd/utils/assert.hpp>
+#include <uhd/usrp/dboard_props.hpp>
+#include <uhd/usrp/subdev_props.hpp>
+#include <uhd/usrp/misc_utils.hpp>
+#include <boost/bind.hpp>
+#include <iostream>
+
+using namespace uhd;
+using namespace uhd::usrp;
+
+/***********************************************************************
+ * Dboard Initialization
+ **********************************************************************/
+void usrp_e100_impl::dboard_init(void){
+ _rx_db_eeprom = dboard_eeprom_t(_iface->read_eeprom(I2C_ADDR_RX_DB, 0, dboard_eeprom_t::num_bytes()));
+ _tx_db_eeprom = dboard_eeprom_t(_iface->read_eeprom(I2C_ADDR_TX_DB, 0, dboard_eeprom_t::num_bytes()));
+
+ //create a new dboard interface and manager
+ _dboard_iface = make_usrp_e100_dboard_iface(
+ _iface, _clock_ctrl, _codec_ctrl
+ );
+ _dboard_manager = dboard_manager::make(
+ _rx_db_eeprom.id, _tx_db_eeprom.id, _dboard_iface
+ );
+
+ //setup the dboard proxies
+ _rx_dboard_proxy = wax_obj_proxy::make(
+ boost::bind(&usrp_e100_impl::rx_dboard_get, this, _1, _2),
+ boost::bind(&usrp_e100_impl::rx_dboard_set, this, _1, _2)
+ );
+ _tx_dboard_proxy = wax_obj_proxy::make(
+ boost::bind(&usrp_e100_impl::tx_dboard_get, this, _1, _2),
+ boost::bind(&usrp_e100_impl::tx_dboard_set, this, _1, _2)
+ );
+}
+
+/***********************************************************************
+ * RX Dboard Get
+ **********************************************************************/
+void usrp_e100_impl::rx_dboard_get(const wax::obj &key_, wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
+ //handle the get request conditioned on the key
+ switch(key.as<dboard_prop_t>()){
+ case DBOARD_PROP_NAME:
+ val = std::string("usrp-e dboard (rx unit)");
+ return;
+
+ case DBOARD_PROP_SUBDEV:
+ val = _dboard_manager->get_rx_subdev(key.name);
+ return;
+
+ case DBOARD_PROP_SUBDEV_NAMES:
+ val = _dboard_manager->get_rx_subdev_names();
+ return;
+
+ case DBOARD_PROP_DBOARD_ID:
+ val = _rx_db_eeprom.id;
+ return;
+
+ case DBOARD_PROP_DBOARD_IFACE:
+ val = _dboard_iface;
+ return;
+
+ case DBOARD_PROP_CODEC:
+ val = _rx_codec_proxy->get_link();
+ return;
+
+ case DBOARD_PROP_GAIN_GROUP:
+ val = make_gain_group(
+ _rx_db_eeprom.id,
+ _dboard_manager->get_rx_subdev(key.name),
+ _rx_codec_proxy->get_link(),
+ GAIN_GROUP_POLICY_RX
+ );
+ return;
+
+ default: UHD_THROW_PROP_GET_ERROR();
+ }
+}
+
+/***********************************************************************
+ * RX Dboard Set
+ **********************************************************************/
+void usrp_e100_impl::rx_dboard_set(const wax::obj &key, const wax::obj &val){
+ switch(key.as<dboard_prop_t>()){
+ case DBOARD_PROP_DBOARD_ID:
+ _rx_db_eeprom.id = val.as<dboard_id_t>();
+ _iface->write_eeprom(I2C_ADDR_RX_DB, 0, _rx_db_eeprom.get_eeprom_bytes());
+ return;
+
+ default: UHD_THROW_PROP_SET_ERROR();
+ }
+}
+
+/***********************************************************************
+ * TX Dboard Get
+ **********************************************************************/
+void usrp_e100_impl::tx_dboard_get(const wax::obj &key_, wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
+ //handle the get request conditioned on the key
+ switch(key.as<dboard_prop_t>()){
+ case DBOARD_PROP_NAME:
+ val = std::string("usrp-e dboard (tx unit)");
+ return;
+
+ case DBOARD_PROP_SUBDEV:
+ val = _dboard_manager->get_tx_subdev(key.name);
+ return;
+
+ case DBOARD_PROP_SUBDEV_NAMES:
+ val = _dboard_manager->get_tx_subdev_names();
+ return;
+
+ case DBOARD_PROP_DBOARD_ID:
+ val = _tx_db_eeprom.id;
+ return;
+
+ case DBOARD_PROP_DBOARD_IFACE:
+ val = _dboard_iface;
+ return;
+
+ case DBOARD_PROP_CODEC:
+ val = _tx_codec_proxy->get_link();
+ return;
+
+ case DBOARD_PROP_GAIN_GROUP:
+ val = make_gain_group(
+ _tx_db_eeprom.id,
+ _dboard_manager->get_tx_subdev(key.name),
+ _tx_codec_proxy->get_link(),
+ GAIN_GROUP_POLICY_TX
+ );
+ return;
+
+ default: UHD_THROW_PROP_GET_ERROR();
+ }
+}
+
+/***********************************************************************
+ * TX Dboard Set
+ **********************************************************************/
+void usrp_e100_impl::tx_dboard_set(const wax::obj &key, const wax::obj &val){
+ switch(key.as<dboard_prop_t>()){
+ case DBOARD_PROP_DBOARD_ID:
+ _tx_db_eeprom.id = val.as<dboard_id_t>();
+ _iface->write_eeprom(I2C_ADDR_TX_DB, 0, _tx_db_eeprom.get_eeprom_bytes());
+ return;
+
+ default: UHD_THROW_PROP_SET_ERROR();
+ }
+}
diff --git a/host/lib/usrp/usrp_e100/dsp_impl.cpp b/host/lib/usrp/usrp_e100/dsp_impl.cpp
new file mode 100644
index 000000000..43a3bd3be
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/dsp_impl.cpp
@@ -0,0 +1,192 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include "usrp_e100_impl.hpp"
+#include "usrp_e100_regs.hpp"
+#include <uhd/usrp/dsp_utils.hpp>
+#include <uhd/usrp/dsp_props.hpp>
+#include <boost/math/special_functions/round.hpp>
+#include <boost/bind.hpp>
+
+#define rint boost::math::iround
+
+using namespace uhd;
+using namespace uhd::usrp;
+
+/***********************************************************************
+ * RX DDC Initialization
+ **********************************************************************/
+void usrp_e100_impl::rx_ddc_init(void){
+ _rx_ddc_proxy = wax_obj_proxy::make(
+ boost::bind(&usrp_e100_impl::rx_ddc_get, this, _1, _2),
+ boost::bind(&usrp_e100_impl::rx_ddc_set, this, _1, _2)
+ );
+
+ //initial config and update
+ rx_ddc_set(DSP_PROP_FREQ_SHIFT, double(0));
+ rx_ddc_set(DSP_PROP_HOST_RATE, double(64e6/10));
+}
+
+/***********************************************************************
+ * RX DDC Get
+ **********************************************************************/
+void usrp_e100_impl::rx_ddc_get(const wax::obj &key_, wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
+ switch(key.as<dsp_prop_t>()){
+ case DSP_PROP_NAME:
+ val = std::string("usrp-e ddc0");
+ return;
+
+ case DSP_PROP_OTHERS:
+ val = prop_names_t(); //empty
+ return;
+
+ case DSP_PROP_FREQ_SHIFT:
+ val = _ddc_freq;
+ return;
+
+ case DSP_PROP_FREQ_SHIFT_NAMES:
+ val = prop_names_t(1, "");
+ return;
+
+ case DSP_PROP_CODEC_RATE:
+ val = _clock_ctrl->get_fpga_clock_rate();
+ return;
+
+ case DSP_PROP_HOST_RATE:
+ val = _clock_ctrl->get_fpga_clock_rate()/_ddc_decim;
+ return;
+
+ default: UHD_THROW_PROP_GET_ERROR();
+ }
+}
+
+/***********************************************************************
+ * RX DDC Set
+ **********************************************************************/
+void usrp_e100_impl::rx_ddc_set(const wax::obj &key_, const wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
+ switch(key.as<dsp_prop_t>()){
+
+ case DSP_PROP_FREQ_SHIFT:{
+ double new_freq = val.as<double>();
+ _iface->poke32(UE_REG_DSP_RX_FREQ,
+ dsp_type1::calc_cordic_word_and_update(new_freq, _clock_ctrl->get_fpga_clock_rate())
+ );
+ _ddc_freq = new_freq; //shadow
+ }
+ return;
+
+ case DSP_PROP_HOST_RATE:{
+ //set the decimation
+ _ddc_decim = rint(_clock_ctrl->get_fpga_clock_rate()/val.as<double>());
+ _iface->poke32(UE_REG_DSP_RX_DECIM_RATE, dsp_type1::calc_cic_filter_word(_ddc_decim));
+
+ //set the scaling
+ static const boost::int16_t default_rx_scale_iq = 1024;
+ _iface->poke32(UE_REG_DSP_RX_SCALE_IQ,
+ dsp_type1::calc_iq_scale_word(default_rx_scale_iq, default_rx_scale_iq)
+ );
+ }
+ return;
+
+ default: UHD_THROW_PROP_SET_ERROR();
+ }
+}
+
+/***********************************************************************
+ * TX DUC Initialization
+ **********************************************************************/
+void usrp_e100_impl::tx_duc_init(void){
+ _tx_duc_proxy = wax_obj_proxy::make(
+ boost::bind(&usrp_e100_impl::tx_duc_get, this, _1, _2),
+ boost::bind(&usrp_e100_impl::tx_duc_set, this, _1, _2)
+ );
+
+ //initial config and update
+ tx_duc_set(DSP_PROP_FREQ_SHIFT, double(0));
+ tx_duc_set(DSP_PROP_HOST_RATE, double(64e6/10));
+}
+
+/***********************************************************************
+ * TX DUC Get
+ **********************************************************************/
+void usrp_e100_impl::tx_duc_get(const wax::obj &key_, wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
+ switch(key.as<dsp_prop_t>()){
+ case DSP_PROP_NAME:
+ val = std::string("usrp-e duc0");
+ return;
+
+ case DSP_PROP_OTHERS:
+ val = prop_names_t(); //empty
+ return;
+
+ case DSP_PROP_FREQ_SHIFT:
+ val = _duc_freq;
+ return;
+
+ case DSP_PROP_FREQ_SHIFT_NAMES:
+ val = prop_names_t(1, "");
+ return;
+
+ case DSP_PROP_CODEC_RATE:
+ val = _clock_ctrl->get_fpga_clock_rate();
+ return;
+
+ case DSP_PROP_HOST_RATE:
+ val = _clock_ctrl->get_fpga_clock_rate()/_duc_interp;
+ return;
+
+ default: UHD_THROW_PROP_GET_ERROR();
+ }
+}
+
+/***********************************************************************
+ * TX DUC Set
+ **********************************************************************/
+void usrp_e100_impl::tx_duc_set(const wax::obj &key_, const wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
+ switch(key.as<dsp_prop_t>()){
+
+ case DSP_PROP_FREQ_SHIFT:{
+ double new_freq = val.as<double>();
+ _iface->poke32(UE_REG_DSP_TX_FREQ,
+ dsp_type1::calc_cordic_word_and_update(new_freq, _clock_ctrl->get_fpga_clock_rate())
+ );
+ _duc_freq = new_freq; //shadow
+ }
+ return;
+
+ case DSP_PROP_HOST_RATE:{
+ _duc_interp = rint(_clock_ctrl->get_fpga_clock_rate()/val.as<double>());
+
+ //set the interpolation
+ _iface->poke32(UE_REG_DSP_TX_INTERP_RATE, dsp_type1::calc_cic_filter_word(_duc_interp));
+
+ //set the scaling
+ _iface->poke32(UE_REG_DSP_TX_SCALE_IQ, dsp_type1::calc_iq_scale_word(_duc_interp));
+ }
+ return;
+
+ default: UHD_THROW_PROP_SET_ERROR();
+ }
+}
diff --git a/host/lib/usrp/usrp_e100/fpga-downloader.cc b/host/lib/usrp/usrp_e100/fpga-downloader.cc
new file mode 100644
index 000000000..4a3d3b9af
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/fpga-downloader.cc
@@ -0,0 +1,274 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include <uhd/config.hpp>
+#include <uhd/utils/assert.hpp>
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <string>
+#include <cstdlib>
+#include <stdexcept>
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+
+#include <linux/spi/spidev.h>
+
+/*
+ * Configuration connections
+ *
+ * CCK - MCSPI1_CLK
+ * DIN - MCSPI1_MOSI
+ * PROG_B - GPIO_175 - output (change mux)
+ * DONE - GPIO_173 - input (change mux)
+ * INIT_B - GPIO_114 - input (change mux)
+ *
+*/
+
+const unsigned int PROG_B = 175;
+const unsigned int DONE = 173;
+const unsigned int INIT_B = 114;
+
+//static std::string bit_file = "safe_u1e.bin";
+
+const int BUF_SIZE = 4096;
+
+enum gpio_direction {IN, OUT};
+
+class gpio {
+ public:
+
+ gpio(unsigned int gpio_num, gpio_direction pin_direction);
+
+ bool get_value();
+ void set_value(bool state);
+
+ private:
+
+ std::stringstream base_path;
+ std::fstream value_file;
+};
+
+class spidev {
+ public:
+
+ spidev(std::string dev_name);
+ ~spidev();
+
+ void send(char *wbuf, char *rbuf, unsigned int nbytes);
+
+ private:
+
+ int fd;
+
+};
+
+gpio::gpio(unsigned int gpio_num, gpio_direction pin_direction)
+{
+ std::fstream export_file;
+
+ export_file.open("/sys/class/gpio/export", std::ios::out);
+ if (not export_file.is_open()) throw std::runtime_error(
+ "Failed to open gpio export file."
+ );
+
+ export_file << gpio_num << std::endl;
+
+ base_path << "/sys/class/gpio/gpio" << gpio_num << std::flush;
+
+ std::fstream direction_file;
+ std::string direction_file_name;
+
+ if (gpio_num != 114) {
+ direction_file_name = base_path.str() + "/direction";
+
+ direction_file.open(direction_file_name.c_str());
+ if (!direction_file.is_open())
+ std::cout << "Failed to open direction file." << std::endl;
+ if (pin_direction == OUT)
+ direction_file << "out" << std::endl;
+ else
+ direction_file << "in" << std::endl;
+ }
+
+ std::string value_file_name;
+
+ value_file_name = base_path.str() + "/value";
+
+ value_file.open(value_file_name.c_str(), std::ios_base::in | std::ios_base::out);
+ if (!value_file.is_open())
+ std::cout << "Failed to open value file." << std::endl;
+}
+
+bool gpio::get_value()
+{
+
+ std::string val;
+
+ std::getline(value_file, val);
+ value_file.seekg(0);
+
+ if (val == "0")
+ return false;
+ else if (val == "1")
+ return true;
+ else
+ std::cout << "Data read from value file|" << val << "|" << std::endl;
+
+ return false;
+}
+
+void gpio::set_value(bool state)
+{
+
+ if (state)
+ value_file << "1" << std::endl;
+ else
+ value_file << "0" << std::endl;
+}
+
+static void prepare_fpga_for_configuration(gpio &prog, gpio &)//init)
+{
+
+ prog.set_value(true);
+ prog.set_value(false);
+ prog.set_value(true);
+
+#if 0
+ bool ready_to_program(false);
+ unsigned int count(0);
+ do {
+ ready_to_program = init.get_value();
+ count++;
+
+ sleep(1);
+ } while (count < 10 && !ready_to_program);
+
+ if (count == 10) {
+ std::cout << "FPGA not ready for programming." << std::endl;
+ exit(-1);
+ }
+#endif
+}
+
+spidev::spidev(std::string fname)
+{
+ int ret;
+ int mode = 0;
+ int speed = 12000000;
+ int bits = 8;
+
+ fd = open(fname.c_str(), O_RDWR);
+
+ ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
+ ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
+ ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
+}
+
+
+spidev::~spidev()
+{
+ close(fd);
+}
+
+void spidev::send(char *buf, char *rbuf, unsigned int nbytes)
+{
+ int ret;
+
+ struct spi_ioc_transfer tr;
+ tr.tx_buf = (unsigned long) buf;
+ tr.rx_buf = (unsigned long) rbuf;
+ tr.len = nbytes;
+ tr.delay_usecs = 0;
+ tr.speed_hz = 48000000;
+ tr.bits_per_word = 8;
+
+ ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
+
+}
+
+static void send_file_to_fpga(const std::string &file_name, gpio &error, gpio &done)
+{
+ std::ifstream bitstream;
+
+ std::cout << "File name - " << file_name.c_str() << std::endl;
+
+ bitstream.open(file_name.c_str(), std::ios::binary);
+ if (!bitstream.is_open())
+ std::cout << "File " << file_name << " not opened succesfully." << std::endl;
+
+ spidev spi("/dev/spidev1.0");
+ char buf[BUF_SIZE];
+ char rbuf[BUF_SIZE];
+
+ do {
+ bitstream.read(buf, BUF_SIZE);
+ spi.send(buf, rbuf, bitstream.gcount());
+
+ if (error.get_value())
+ std::cout << "INIT_B went high, error occured." << std::endl;
+
+ if (!done.get_value())
+ std::cout << "Configuration complete." << std::endl;
+
+ } while (bitstream.gcount() == BUF_SIZE);
+}
+
+/*
+int main(int argc, char *argv[])
+{
+
+ gpio gpio_prog_b(PROG_B, OUT);
+ gpio gpio_init_b(INIT_B, IN);
+ gpio gpio_done (DONE, IN);
+
+ if (argc == 2)
+ bit_file = argv[1];
+
+ std::cout << "FPGA config file: " << bit_file << std::endl;
+
+ prepare_fpga_for_configuration(gpio_prog_b, gpio_init_b);
+
+ std::cout << "Done = " << gpio_done.get_value() << std::endl;
+
+ send_file_to_fpga(bit_file, gpio_init_b, gpio_done);
+}
+*/
+
+void usrp_e100_load_fpga(const std::string &bin_file){
+ gpio gpio_prog_b(PROG_B, OUT);
+ gpio gpio_init_b(INIT_B, IN);
+ gpio gpio_done (DONE, IN);
+
+ std::cout << "Loading FPGA image: " << bin_file << "... " << std::flush;
+
+ UHD_ASSERT_THROW(std::system("/sbin/rmmod usrp_e") == 0);
+
+ prepare_fpga_for_configuration(gpio_prog_b, gpio_init_b);
+
+ std::cout << "done = " << gpio_done.get_value() << std::endl;
+
+ send_file_to_fpga(bin_file, gpio_init_b, gpio_done);
+
+ UHD_ASSERT_THROW(std::system("/sbin/modprobe usrp_e") == 0);
+
+}
+
diff --git a/host/lib/usrp/usrp_e100/include/linux/usrp_e.h b/host/lib/usrp/usrp_e100/include/linux/usrp_e.h
new file mode 100644
index 000000000..4c6a5dd89
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/include/linux/usrp_e.h
@@ -0,0 +1,91 @@
+
+/*
+ * Copyright (C) 2010 Ettus Research, LLC
+ *
+ * Written by Philip Balister <philip@opensdr.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#ifndef __USRP_E_H
+#define __USRP_E_H
+
+#include <linux/types.h>
+#include <linux/ioctl.h>
+
+struct usrp_e_ctl16 {
+ __u32 offset;
+ __u32 count;
+ __u16 buf[20];
+};
+
+struct usrp_e_ctl32 {
+ __u32 offset;
+ __u32 count;
+ __u32 buf[10];
+};
+
+/* SPI interface */
+
+#define UE_SPI_TXONLY 0
+#define UE_SPI_TXRX 1
+
+/* Defines for spi ctrl register */
+#define UE_SPI_CTRL_TXNEG (1<<10)
+#define UE_SPI_CTRL_RXNEG (1<<9)
+
+#define UE_SPI_PUSH_RISE 0
+#define UE_SPI_PUSH_FALL UE_SPI_CTRL_TXNEG
+#define UE_SPI_LATCH_RISE 0
+#define UE_SPI_LATCH_FALL UE_SPI_CTRL_RXNEG
+
+struct usrp_e_spi {
+ __u8 readback;
+ __u32 slave;
+ __u32 data;
+ __u32 length;
+ __u32 flags;
+};
+
+struct usrp_e_i2c {
+ __u8 addr;
+ __u32 len;
+ __u8 data[];
+};
+
+#define USRP_E_IOC_MAGIC 'u'
+#define USRP_E_WRITE_CTL16 _IOW(USRP_E_IOC_MAGIC, 0x20, struct usrp_e_ctl16)
+#define USRP_E_READ_CTL16 _IOWR(USRP_E_IOC_MAGIC, 0x21, struct usrp_e_ctl16)
+#define USRP_E_WRITE_CTL32 _IOW(USRP_E_IOC_MAGIC, 0x22, struct usrp_e_ctl32)
+#define USRP_E_READ_CTL32 _IOWR(USRP_E_IOC_MAGIC, 0x23, struct usrp_e_ctl32)
+#define USRP_E_SPI _IOWR(USRP_E_IOC_MAGIC, 0x24, struct usrp_e_spi)
+#define USRP_E_I2C_READ _IOWR(USRP_E_IOC_MAGIC, 0x25, struct usrp_e_i2c)
+#define USRP_E_I2C_WRITE _IOW(USRP_E_IOC_MAGIC, 0x26, struct usrp_e_i2c)
+#define USRP_E_GET_RB_INFO _IOR(USRP_E_IOC_MAGIC, 0x27, struct usrp_e_ring_buffer_size_t)
+#define USRP_E_GET_COMPAT_NUMBER _IO(USRP_E_IOC_MAGIC, 0x28)
+
+#define USRP_E_COMPAT_NUMBER 1
+
+/* Flag defines */
+#define RB_USER (1<<0)
+#define RB_KERNEL (1<<1)
+#define RB_OVERRUN (1<<2)
+#define RB_DMA_ACTIVE (1<<3)
+#define RB_USER_PROCESS (1<<4)
+
+struct ring_buffer_info {
+ int flags;
+ int len;
+};
+
+struct usrp_e_ring_buffer_size_t {
+ int num_pages_rx_flags;
+ int num_rx_frames;
+ int num_pages_tx_flags;
+ int num_tx_frames;
+};
+
+#endif
diff --git a/host/lib/usrp/usrp_e100/io_impl.cpp b/host/lib/usrp/usrp_e100/io_impl.cpp
new file mode 100644
index 000000000..7cb3e25e5
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/io_impl.cpp
@@ -0,0 +1,272 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include "usrp_e100_impl.hpp"
+#include "usrp_e100_regs.hpp"
+#include <uhd/usrp/dsp_utils.hpp>
+#include <uhd/utils/thread_priority.hpp>
+#include <uhd/transport/bounded_buffer.hpp>
+#include "../../transport/vrt_packet_handler.hpp"
+#include <boost/bind.hpp>
+#include <boost/format.hpp>
+#include <boost/thread.hpp>
+#include <iostream>
+
+using namespace uhd;
+using namespace uhd::usrp;
+using namespace uhd::transport;
+
+zero_copy_if::sptr usrp_e100_make_mmap_zero_copy(usrp_e100_iface::sptr iface);
+
+/***********************************************************************
+ * Constants
+ **********************************************************************/
+static const size_t tx_async_report_sid = 1;
+static const int underflow_flags = async_metadata_t::EVENT_CODE_UNDERFLOW | async_metadata_t::EVENT_CODE_UNDERFLOW_IN_PACKET;
+static const bool recv_debug = false;
+
+/***********************************************************************
+ * io impl details (internal to this file)
+ * - pirate crew of 1
+ * - bounded buffer
+ * - thread loop
+ * - vrt packet handler states
+ **********************************************************************/
+struct usrp_e100_impl::io_impl{
+ //state management for the vrt packet handler code
+ vrt_packet_handler::recv_state packet_handler_recv_state;
+ vrt_packet_handler::send_state packet_handler_send_state;
+ zero_copy_if::sptr data_xport;
+ bool continuous_streaming;
+ io_impl(usrp_e100_iface::sptr iface):
+ data_xport(usrp_e100_make_mmap_zero_copy(iface)),
+ recv_pirate_booty(recv_booty_type::make(data_xport->get_num_recv_frames())),
+ async_msg_fifo(bounded_buffer<async_metadata_t>::make(100/*messages deep*/))
+ {
+ /* NOP */
+ }
+
+ ~io_impl(void){
+ recv_pirate_crew_raiding = false;
+ recv_pirate_crew.interrupt_all();
+ recv_pirate_crew.join_all();
+ }
+
+ bool get_recv_buffs(vrt_packet_handler::managed_recv_buffs_t &buffs, double timeout){
+ UHD_ASSERT_THROW(buffs.size() == 1);
+ boost::this_thread::disable_interruption di; //disable because the wait can throw
+ return recv_pirate_booty->pop_with_timed_wait(buffs.front(), timeout);
+ }
+
+ //a pirate's life is the life for me!
+ void recv_pirate_loop(usrp_e100_clock_ctrl::sptr);
+ typedef bounded_buffer<managed_recv_buffer::sptr> recv_booty_type;
+ recv_booty_type::sptr recv_pirate_booty;
+ bounded_buffer<async_metadata_t>::sptr async_msg_fifo;
+ boost::thread_group recv_pirate_crew;
+ bool recv_pirate_crew_raiding;
+};
+
+/***********************************************************************
+ * Receive Pirate Loop
+ * - while raiding, loot for recv buffers
+ * - put booty into the alignment buffer
+ **********************************************************************/
+void usrp_e100_impl::io_impl::recv_pirate_loop(usrp_e100_clock_ctrl::sptr clock_ctrl)
+{
+ set_thread_priority_safe();
+ recv_pirate_crew_raiding = true;
+
+ while(recv_pirate_crew_raiding){
+ managed_recv_buffer::sptr buff = this->data_xport->get_recv_buff();
+ if (not buff.get()) continue; //ignore timeout/error buffers
+
+ if (recv_debug){
+ std::cout << "len " << buff->size() << std::endl;
+ for (size_t i = 0; i < 9; i++){
+ std::cout << boost::format(" 0x%08x") % buff->cast<const boost::uint32_t *>()[i] << std::endl;
+ }
+ std::cout << std::endl << std::endl;
+ }
+
+ try{
+ //extract the vrt header packet info
+ vrt::if_packet_info_t if_packet_info;
+ if_packet_info.num_packet_words32 = buff->size()/sizeof(boost::uint32_t);
+ const boost::uint32_t *vrt_hdr = buff->cast<const boost::uint32_t *>();
+ vrt::if_hdr_unpack_le(vrt_hdr, if_packet_info);
+
+ //handle a tx async report message
+ if (if_packet_info.sid == tx_async_report_sid and if_packet_info.packet_type != vrt::if_packet_info_t::PACKET_TYPE_DATA){
+
+ //fill in the async metadata
+ async_metadata_t metadata;
+ metadata.channel = 0;
+ metadata.has_time_spec = if_packet_info.has_tsi and if_packet_info.has_tsf;
+ metadata.time_spec = time_spec_t(
+ time_t(if_packet_info.tsi), size_t(if_packet_info.tsf), clock_ctrl->get_fpga_clock_rate()
+ );
+ metadata.event_code = vrt_packet_handler::get_context_code<async_metadata_t::event_code_t>(vrt_hdr, if_packet_info);
+
+ //print the famous U, and push the metadata into the message queue
+ if (metadata.event_code & underflow_flags) std::cerr << "U" << std::flush;
+ async_msg_fifo->push_with_pop_on_full(metadata);
+ continue;
+ }
+
+ //same number of frames as the data transport -> always immediate
+ recv_pirate_booty->push_with_wait(buff);
+
+ }catch(const std::exception &e){
+ std::cerr << "Error (usrp-e recv pirate loop): " << e.what() << std::endl;
+ }
+ }
+}
+
+/***********************************************************************
+ * Helper Functions
+ **********************************************************************/
+void usrp_e100_impl::io_init(void){
+ //setup otw types
+ _send_otw_type.width = 16;
+ _send_otw_type.shift = 0;
+ _send_otw_type.byteorder = otw_type_t::BO_LITTLE_ENDIAN;
+
+ _recv_otw_type.width = 16;
+ _recv_otw_type.shift = 0;
+ _recv_otw_type.byteorder = otw_type_t::BO_LITTLE_ENDIAN;
+
+ //setup before the registers (transport called to calculate max spp)
+ _io_impl = UHD_PIMPL_MAKE(io_impl, (_iface));
+
+ //setup rx data path
+ _iface->poke32(UE_REG_CTRL_RX_NSAMPS_PER_PKT, get_max_recv_samps_per_packet());
+ _iface->poke32(UE_REG_CTRL_RX_NCHANNELS, 1);
+ _iface->poke32(UE_REG_CTRL_RX_CLEAR_OVERRUN, 1); //reset
+ _iface->poke32(UE_REG_CTRL_RX_VRT_HEADER, 0
+ | (0x1 << 28) //if data with stream id
+ | (0x1 << 26) //has trailer
+ | (0x3 << 22) //integer time other
+ | (0x1 << 20) //fractional time sample count
+ );
+ _iface->poke32(UE_REG_CTRL_RX_VRT_STREAM_ID, 0);
+ _iface->poke32(UE_REG_CTRL_RX_VRT_TRAILER, 0);
+
+ //setup the tx policy
+ _iface->poke32(UE_REG_CTRL_TX_REPORT_SID, tx_async_report_sid);
+ _iface->poke32(UE_REG_CTRL_TX_POLICY, UE_FLAG_CTRL_TX_POLICY_NEXT_PACKET);
+
+ //spawn a pirate, yarrr!
+ _io_impl->recv_pirate_crew.create_thread(boost::bind(
+ &usrp_e100_impl::io_impl::recv_pirate_loop, _io_impl.get(), _clock_ctrl
+ ));
+}
+
+void usrp_e100_impl::issue_stream_cmd(const stream_cmd_t &stream_cmd){
+ _io_impl->continuous_streaming = (stream_cmd.stream_mode == stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
+ _iface->poke32(UE_REG_CTRL_RX_STREAM_CMD, dsp_type1::calc_stream_cmd_word(
+ stream_cmd, get_max_recv_samps_per_packet()
+ ));
+ _iface->poke32(UE_REG_CTRL_RX_TIME_SECS, boost::uint32_t(stream_cmd.time_spec.get_full_secs()));
+ _iface->poke32(UE_REG_CTRL_RX_TIME_TICKS, stream_cmd.time_spec.get_tick_count(_clock_ctrl->get_fpga_clock_rate()));
+}
+
+void usrp_e100_impl::handle_overrun(size_t){
+ std::cerr << "O"; //the famous OOOOOOOOOOO
+ _iface->poke32(UE_REG_CTRL_RX_CLEAR_OVERRUN, 0);
+ if (_io_impl->continuous_streaming){
+ this->issue_stream_cmd(stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
+ }
+}
+
+/***********************************************************************
+ * Data Send
+ **********************************************************************/
+bool get_send_buffs(
+ zero_copy_if::sptr trans, double timeout,
+ vrt_packet_handler::managed_send_buffs_t &buffs
+){
+ UHD_ASSERT_THROW(buffs.size() == 1);
+ buffs[0] = trans->get_send_buff(timeout);
+ return buffs[0].get() != NULL;
+}
+
+size_t usrp_e100_impl::get_max_send_samps_per_packet(void) const{
+ static const size_t hdr_size = 0
+ + vrt::max_if_hdr_words32*sizeof(boost::uint32_t)
+ - sizeof(vrt::if_packet_info_t().cid) //no class id ever used
+ ;
+ size_t bpp = _io_impl->data_xport->get_send_frame_size() - hdr_size;
+ return bpp/_send_otw_type.get_sample_size();
+}
+
+size_t usrp_e100_impl::send(
+ const std::vector<const void *> &buffs, size_t num_samps,
+ const tx_metadata_t &metadata, const io_type_t &io_type,
+ send_mode_t send_mode, double timeout
+){
+ return vrt_packet_handler::send(
+ _io_impl->packet_handler_send_state, //last state of the send handler
+ buffs, num_samps, //buffer to fill
+ metadata, send_mode, //samples metadata
+ io_type, _send_otw_type, //input and output types to convert
+ _clock_ctrl->get_fpga_clock_rate(), //master clock tick rate
+ uhd::transport::vrt::if_hdr_pack_le,
+ boost::bind(&get_send_buffs, _io_impl->data_xport, timeout, _1),
+ get_max_send_samps_per_packet()
+ );
+}
+
+/***********************************************************************
+ * Data Recv
+ **********************************************************************/
+size_t usrp_e100_impl::get_max_recv_samps_per_packet(void) const{
+ static const size_t hdr_size = 0
+ + vrt::max_if_hdr_words32*sizeof(boost::uint32_t)
+ + sizeof(vrt::if_packet_info_t().tlr) //forced to have trailer
+ - sizeof(vrt::if_packet_info_t().cid) //no class id ever used
+ ;
+ size_t bpp = _io_impl->data_xport->get_recv_frame_size() - hdr_size;
+ return bpp/_recv_otw_type.get_sample_size();
+}
+
+size_t usrp_e100_impl::recv(
+ const std::vector<void *> &buffs, size_t num_samps,
+ rx_metadata_t &metadata, const io_type_t &io_type,
+ recv_mode_t recv_mode, double timeout
+){
+ return vrt_packet_handler::recv(
+ _io_impl->packet_handler_recv_state, //last state of the recv handler
+ buffs, num_samps, //buffer to fill
+ metadata, recv_mode, //samples metadata
+ io_type, _recv_otw_type, //input and output types to convert
+ _clock_ctrl->get_fpga_clock_rate(), //master clock tick rate
+ uhd::transport::vrt::if_hdr_unpack_le,
+ boost::bind(&usrp_e100_impl::io_impl::get_recv_buffs, _io_impl.get(), _1, timeout),
+ boost::bind(&usrp_e100_impl::handle_overrun, this, _1)
+ );
+}
+
+/***********************************************************************
+ * Async Recv
+ **********************************************************************/
+bool usrp_e100_impl::recv_async_msg(
+ async_metadata_t &async_metadata, double timeout
+){
+ boost::this_thread::disable_interruption di; //disable because the wait can throw
+ return _io_impl->async_msg_fifo->pop_with_timed_wait(async_metadata, timeout);
+}
diff --git a/host/lib/usrp/usrp_e100/mboard_impl.cpp b/host/lib/usrp/usrp_e100/mboard_impl.cpp
new file mode 100644
index 000000000..03c4385aa
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/mboard_impl.cpp
@@ -0,0 +1,198 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include "usrp_e100_impl.hpp"
+#include "usrp_e100_regs.hpp"
+#include <uhd/usrp/dsp_utils.hpp>
+#include <uhd/usrp/misc_utils.hpp>
+#include <uhd/utils/assert.hpp>
+#include <uhd/usrp/mboard_props.hpp>
+#include <boost/bind.hpp>
+#include <iostream>
+
+using namespace uhd;
+using namespace uhd::usrp;
+
+/***********************************************************************
+ * Mboard Initialization
+ **********************************************************************/
+void usrp_e100_impl::mboard_init(void){
+ _mboard_proxy = wax_obj_proxy::make(
+ boost::bind(&usrp_e100_impl::mboard_get, this, _1, _2),
+ boost::bind(&usrp_e100_impl::mboard_set, this, _1, _2)
+ );
+
+ //init the clock config
+ _clock_config.ref_source = clock_config_t::REF_AUTO;
+ _clock_config.pps_source = clock_config_t::PPS_SMA;
+ _clock_config.pps_polarity = clock_config_t::PPS_NEG;
+
+ update_clock_config();
+}
+
+void usrp_e100_impl::update_clock_config(void){
+ boost::uint32_t pps_flags = 0;
+
+ //translate pps polarity enums
+ switch(_clock_config.pps_polarity){
+ case clock_config_t::PPS_POS: pps_flags |= UE_FLAG_TIME64_PPS_POSEDGE; break;
+ case clock_config_t::PPS_NEG: pps_flags |= UE_FLAG_TIME64_PPS_NEGEDGE; break;
+ default: throw std::runtime_error("unhandled clock configuration pps polarity");
+ }
+
+ //set the pps flags
+ _iface->poke32(UE_REG_TIME64_FLAGS, pps_flags);
+
+ //clock source ref 10mhz
+ switch(_clock_config.ref_source){
+ case clock_config_t::REF_AUTO: _clock_ctrl->use_auto_ref();
+ case clock_config_t::REF_INT: _clock_ctrl->use_internal_ref();
+ case clock_config_t::REF_SMA: _clock_ctrl->use_external_ref();
+ default: throw std::runtime_error("unhandled clock configuration ref source");
+ }
+}
+
+/***********************************************************************
+ * Mboard Get
+ **********************************************************************/
+void usrp_e100_impl::mboard_get(const wax::obj &key_, wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
+ //handle the get request conditioned on the key
+ switch(key.as<mboard_prop_t>()){
+ case MBOARD_PROP_NAME:
+ val = std::string("usrp-e mboard");
+ return;
+
+ case MBOARD_PROP_OTHERS:
+ val = prop_names_t();
+ return;
+
+ case MBOARD_PROP_RX_DBOARD:
+ UHD_ASSERT_THROW(key.name == "");
+ val = _rx_dboard_proxy->get_link();
+ return;
+
+ case MBOARD_PROP_RX_DBOARD_NAMES:
+ val = prop_names_t(1, ""); //vector of size 1 with empty string
+ return;
+
+ case MBOARD_PROP_TX_DBOARD:
+ UHD_ASSERT_THROW(key.name == "");
+ val = _tx_dboard_proxy->get_link();
+ return;
+
+ case MBOARD_PROP_TX_DBOARD_NAMES:
+ val = prop_names_t(1, ""); //vector of size 1 with empty string
+ return;
+
+ case MBOARD_PROP_RX_DSP:
+ UHD_ASSERT_THROW(key.name == "");
+ val = _rx_ddc_proxy->get_link();
+ return;
+
+ case MBOARD_PROP_RX_DSP_NAMES:
+ val = prop_names_t(1, "");
+ return;
+
+ case MBOARD_PROP_TX_DSP:
+ UHD_ASSERT_THROW(key.name == "");
+ val = _tx_duc_proxy->get_link();
+ return;
+
+ case MBOARD_PROP_TX_DSP_NAMES:
+ val = prop_names_t(1, "");
+ return;
+
+ case MBOARD_PROP_CLOCK_CONFIG:
+ val = _clock_config;
+ return;
+
+ case MBOARD_PROP_RX_SUBDEV_SPEC:
+ val = _rx_subdev_spec;
+ return;
+
+ case MBOARD_PROP_TX_SUBDEV_SPEC:
+ val = _tx_subdev_spec;
+ return;
+
+ case MBOARD_PROP_EEPROM_MAP:
+ val = _iface->mb_eeprom;
+ return;
+
+ default: UHD_THROW_PROP_GET_ERROR();
+ }
+}
+
+/***********************************************************************
+ * Mboard Set
+ **********************************************************************/
+void usrp_e100_impl::mboard_set(const wax::obj &key, const wax::obj &val){
+ //handle the get request conditioned on the key
+ switch(key.as<mboard_prop_t>()){
+
+ case MBOARD_PROP_STREAM_CMD:
+ issue_stream_cmd(val.as<stream_cmd_t>());
+ return;
+
+ case MBOARD_PROP_TIME_NOW:
+ case MBOARD_PROP_TIME_NEXT_PPS:{
+ time_spec_t time_spec = val.as<time_spec_t>();
+ _iface->poke32(UE_REG_TIME64_TICKS, time_spec.get_tick_count(_clock_ctrl->get_fpga_clock_rate()));
+ boost::uint32_t imm_flags = (key.as<mboard_prop_t>() == MBOARD_PROP_TIME_NOW)? 1 : 0;
+ _iface->poke32(UE_REG_TIME64_IMM, imm_flags);
+ _iface->poke32(UE_REG_TIME64_SECS, time_spec.get_full_secs());
+ }
+ return;
+
+ case MBOARD_PROP_RX_SUBDEV_SPEC:
+ _rx_subdev_spec = val.as<subdev_spec_t>();
+ verify_rx_subdev_spec(_rx_subdev_spec, _mboard_proxy->get_link());
+ //sanity check
+ UHD_ASSERT_THROW(_rx_subdev_spec.size() == 1);
+ //set the mux
+ _iface->poke32(UE_REG_DSP_RX_MUX, dsp_type1::calc_rx_mux_word(
+ _dboard_manager->get_rx_subdev(_rx_subdev_spec.front().sd_name)[SUBDEV_PROP_CONNECTION].as<subdev_conn_t>()
+ ));
+ return;
+
+ case MBOARD_PROP_TX_SUBDEV_SPEC:
+ _tx_subdev_spec = val.as<subdev_spec_t>();
+ verify_tx_subdev_spec(_tx_subdev_spec, _mboard_proxy->get_link());
+ //sanity check
+ UHD_ASSERT_THROW(_tx_subdev_spec.size() == 1);
+ //set the mux
+ _iface->poke32(UE_REG_DSP_TX_MUX, dsp_type1::calc_tx_mux_word(
+ _dboard_manager->get_tx_subdev(_tx_subdev_spec.front().sd_name)[SUBDEV_PROP_CONNECTION].as<subdev_conn_t>()
+ ));
+ return;
+
+ case MBOARD_PROP_EEPROM_MAP:
+ // Step1: commit the map, writing only those values set.
+ // Step2: readback the entire eeprom map into the iface.
+ val.as<mboard_eeprom_t>().commit(_iface->get_i2c_dev_iface(), mboard_eeprom_t::MAP_E100);
+ _iface->mb_eeprom = mboard_eeprom_t(_iface->get_i2c_dev_iface(), mboard_eeprom_t::MAP_E100);
+ return;
+
+ case MBOARD_PROP_CLOCK_CONFIG:
+ _clock_config = val.as<clock_config_t>();
+ update_clock_config();
+ return;
+
+ default: UHD_THROW_PROP_SET_ERROR();
+ }
+}
diff --git a/host/lib/usrp/usrp_e100/usrp_e100_iface.cpp b/host/lib/usrp/usrp_e100/usrp_e100_iface.cpp
new file mode 100644
index 000000000..40c7afabb
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/usrp_e100_iface.cpp
@@ -0,0 +1,268 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include "usrp_e100_iface.hpp"
+#include <uhd/utils/assert.hpp>
+#include <sys/ioctl.h> //ioctl
+#include <fcntl.h> //open, close
+#include <linux/usrp_e.h> //ioctl structures and constants
+#include <boost/format.hpp>
+#include <boost/thread.hpp> //mutex
+#include <linux/i2c-dev.h>
+#include <linux/i2c.h>
+#include <stdexcept>
+
+using namespace uhd;
+using namespace uhd::usrp;
+
+/***********************************************************************
+ * I2C device node implementation wrapper
+ **********************************************************************/
+class i2c_dev_iface : public i2c_iface{
+public:
+ i2c_dev_iface(const std::string &node){
+ if ((_node_fd = ::open(node.c_str(), O_RDWR)) < 0){
+ throw std::runtime_error("Failed to open " + node);
+ }
+ }
+
+ ~i2c_dev_iface(void){
+ ::close(_node_fd);
+ }
+
+ void write_i2c(boost::uint8_t addr, const byte_vector_t &bytes){
+ byte_vector_t rw_bytes(bytes);
+
+ //setup the message
+ i2c_msg msg;
+ msg.addr = addr;
+ msg.flags = 0;
+ msg.len = bytes.size();
+ msg.buf = &rw_bytes.front();
+
+ //setup the data
+ i2c_rdwr_ioctl_data data;
+ data.msgs = &msg;
+ data.nmsgs = 1;
+
+ //call the ioctl
+ UHD_ASSERT_THROW(::ioctl(_node_fd, I2C_RDWR, &data) >= 0);
+ }
+
+ byte_vector_t read_i2c(boost::uint8_t addr, size_t num_bytes){
+ byte_vector_t bytes(num_bytes);
+
+ //setup the message
+ i2c_msg msg;
+ msg.addr = addr;
+ msg.flags = I2C_M_RD;
+ msg.len = bytes.size();
+ msg.buf = &bytes.front();
+
+ //setup the data
+ i2c_rdwr_ioctl_data data;
+ data.msgs = &msg;
+ data.nmsgs = 1;
+
+ //call the ioctl
+ UHD_ASSERT_THROW(::ioctl(_node_fd, I2C_RDWR, &data) >= 0);
+
+ return bytes;
+ }
+
+private: int _node_fd;
+};
+
+/***********************************************************************
+ * USRP-E100 interface implementation
+ **********************************************************************/
+class usrp_e100_iface_impl : public usrp_e100_iface{
+public:
+
+ int get_file_descriptor(void){
+ return _node_fd;
+ }
+
+ /*******************************************************************
+ * Structors
+ ******************************************************************/
+ usrp_e100_iface_impl(const std::string &node):
+ _i2c_dev_iface(i2c_dev_iface("/dev/i2c-3"))
+ {
+ //open the device node and check file descriptor
+ if ((_node_fd = ::open(node.c_str(), O_RDWR)) < 0){
+ throw std::runtime_error("Failed to open " + node);
+ }
+
+ mb_eeprom = mboard_eeprom_t(get_i2c_dev_iface(), mboard_eeprom_t::MAP_E100);
+ }
+
+ ~usrp_e100_iface_impl(void){
+ //close the device node file descriptor
+ ::close(_node_fd);
+ }
+
+ /*******************************************************************
+ * IOCTL: provides the communication base for all other calls
+ ******************************************************************/
+ void ioctl(int request, void *mem){
+ boost::mutex::scoped_lock lock(_ctrl_mutex);
+
+ if (::ioctl(_node_fd, request, mem) < 0){
+ throw std::runtime_error(str(
+ boost::format("ioctl failed with request %d") % request
+ ));
+ }
+ }
+
+ /*******************************************************************
+ * I2C device node interface
+ ******************************************************************/
+ i2c_iface &get_i2c_dev_iface(void){
+ return _i2c_dev_iface;
+ }
+
+ /*******************************************************************
+ * Peek and Poke
+ ******************************************************************/
+ void poke32(boost::uint32_t addr, boost::uint32_t value){
+ //load the data struct
+ usrp_e_ctl32 data;
+ data.offset = addr;
+ data.count = 1;
+ data.buf[0] = value;
+
+ //call the ioctl
+ this->ioctl(USRP_E_WRITE_CTL32, &data);
+ }
+
+ void poke16(boost::uint32_t addr, boost::uint16_t value){
+ //load the data struct
+ usrp_e_ctl16 data;
+ data.offset = addr;
+ data.count = 1;
+ data.buf[0] = value;
+
+ //call the ioctl
+ this->ioctl(USRP_E_WRITE_CTL16, &data);
+ }
+
+ boost::uint32_t peek32(boost::uint32_t addr){
+ //load the data struct
+ usrp_e_ctl32 data;
+ data.offset = addr;
+ data.count = 1;
+
+ //call the ioctl
+ this->ioctl(USRP_E_READ_CTL32, &data);
+
+ return data.buf[0];
+ }
+
+ boost::uint16_t peek16(boost::uint32_t addr){
+ //load the data struct
+ usrp_e_ctl16 data;
+ data.offset = addr;
+ data.count = 1;
+
+ //call the ioctl
+ this->ioctl(USRP_E_READ_CTL16, &data);
+
+ return data.buf[0];
+ }
+
+ /*******************************************************************
+ * I2C
+ ******************************************************************/
+ static const size_t max_i2c_data_bytes = 10;
+
+ void write_i2c(boost::uint8_t addr, const byte_vector_t &bytes){
+ //allocate some memory for this transaction
+ UHD_ASSERT_THROW(bytes.size() <= max_i2c_data_bytes);
+ boost::uint8_t mem[sizeof(usrp_e_i2c) + max_i2c_data_bytes];
+
+ //load the data struct
+ usrp_e_i2c *data = reinterpret_cast<usrp_e_i2c*>(mem);
+ data->addr = addr;
+ data->len = bytes.size();
+ std::copy(bytes.begin(), bytes.end(), data->data);
+
+ //call the spi ioctl
+ this->ioctl(USRP_E_I2C_WRITE, data);
+ }
+
+ byte_vector_t read_i2c(boost::uint8_t addr, size_t num_bytes){
+ //allocate some memory for this transaction
+ UHD_ASSERT_THROW(num_bytes <= max_i2c_data_bytes);
+ boost::uint8_t mem[sizeof(usrp_e_i2c) + max_i2c_data_bytes];
+
+ //load the data struct
+ usrp_e_i2c *data = reinterpret_cast<usrp_e_i2c*>(mem);
+ data->addr = addr;
+ data->len = num_bytes;
+
+ //call the spi ioctl
+ this->ioctl(USRP_E_I2C_READ, data);
+
+ //unload the data
+ byte_vector_t bytes(data->len);
+ UHD_ASSERT_THROW(bytes.size() == num_bytes);
+ std::copy(data->data, data->data+bytes.size(), bytes.begin());
+ return bytes;
+ }
+
+ /*******************************************************************
+ * SPI
+ ******************************************************************/
+ boost::uint32_t transact_spi(
+ int which_slave,
+ const spi_config_t &config,
+ boost::uint32_t bits,
+ size_t num_bits,
+ bool readback
+ ){
+ //load data struct
+ usrp_e_spi data;
+ data.readback = (readback)? UE_SPI_TXRX : UE_SPI_TXONLY;
+ data.slave = which_slave;
+ data.length = num_bits;
+ data.data = bits;
+
+ //load the flags
+ data.flags = 0;
+ data.flags |= (config.miso_edge == spi_config_t::EDGE_RISE)? UE_SPI_LATCH_RISE : UE_SPI_LATCH_FALL;
+ data.flags |= (config.mosi_edge == spi_config_t::EDGE_RISE)? UE_SPI_PUSH_FALL : UE_SPI_PUSH_RISE;
+
+ //call the spi ioctl
+ this->ioctl(USRP_E_SPI, &data);
+
+ //unload the data
+ return data.data;
+ }
+
+private:
+ int _node_fd;
+ i2c_dev_iface _i2c_dev_iface;
+ boost::mutex _ctrl_mutex;
+};
+
+/***********************************************************************
+ * Public Make Function
+ **********************************************************************/
+usrp_e100_iface::sptr usrp_e100_iface::make(const std::string &node){
+ return sptr(new usrp_e100_iface_impl(node));
+}
diff --git a/host/lib/usrp/usrp_e100/usrp_e100_iface.hpp b/host/lib/usrp/usrp_e100/usrp_e100_iface.hpp
new file mode 100644
index 000000000..12283fb52
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/usrp_e100_iface.hpp
@@ -0,0 +1,119 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#ifndef INCLUDED_USRP_E100_IFACE_HPP
+#define INCLUDED_USRP_E100_IFACE_HPP
+
+#include <uhd/transport/udp_simple.hpp>
+#include <uhd/usrp/mboard_eeprom.hpp>
+#include <uhd/types/serial.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/utility.hpp>
+#include <boost/cstdint.hpp>
+
+////////////////////////////////////////////////////////////////////////
+// I2C addresses
+////////////////////////////////////////////////////////////////////////
+#define I2C_DEV_EEPROM 0x50 // 24LC02[45]: 7-bits 1010xxx
+#define I2C_ADDR_MBOARD (I2C_DEV_EEPROM | 0x0)
+#define I2C_ADDR_TX_DB (I2C_DEV_EEPROM | 0x4)
+#define I2C_ADDR_RX_DB (I2C_DEV_EEPROM | 0x5)
+////////////////////////////////////////////////////////////////////////
+
+/*!
+ * The usrp-e interface class:
+ * Provides a set of functions to implementation layer.
+ * Including spi, peek, poke, control...
+ */
+class usrp_e100_iface : boost::noncopyable, public uhd::i2c_iface{
+public:
+ typedef boost::shared_ptr<usrp_e100_iface> sptr;
+
+ /*!
+ * Make a new usrp-e interface with the control transport.
+ * \param node the device node name
+ * \return a new usrp-e interface object
+ */
+ static sptr make(const std::string &node);
+
+ /*!
+ * Get the underlying file descriptor.
+ * \return the file descriptor
+ */
+ virtual int get_file_descriptor(void) = 0;
+
+ /*!
+ * Perform an ioctl call on the device node file descriptor.
+ * This will throw when the internal ioctl call fails.
+ * \param request the control word
+ * \param mem pointer to some memory
+ */
+ virtual void ioctl(int request, void *mem) = 0;
+
+ //! Get the I2C interface for the I2C device node
+ virtual uhd::i2c_iface &get_i2c_dev_iface(void) = 0;
+
+ /*!
+ * Write a register (32 bits)
+ * \param addr the address
+ * \param data the 32bit data
+ */
+ virtual void poke32(boost::uint32_t addr, boost::uint32_t data) = 0;
+
+ /*!
+ * Read a register (32 bits)
+ * \param addr the address
+ * \return the 32bit data
+ */
+ virtual boost::uint32_t peek32(boost::uint32_t addr) = 0;
+
+ /*!
+ * Write a register (16 bits)
+ * \param addr the address
+ * \param data the 16bit data
+ */
+ virtual void poke16(boost::uint32_t addr, boost::uint16_t data) = 0;
+
+ /*!
+ * Read a register (16 bits)
+ * \param addr the address
+ * \return the 16bit data
+ */
+ virtual boost::uint16_t peek16(boost::uint32_t addr) = 0;
+
+ /*!
+ * Perform an spi transaction.
+ * \param which_slave the slave device number
+ * \param config spi config args
+ * \param data the bits to write
+ * \param num_bits how many bits in data
+ * \param readback true to readback a value
+ * \return spi data if readback set
+ */
+ virtual boost::uint32_t transact_spi(
+ int which_slave,
+ const uhd::spi_config_t &config,
+ boost::uint32_t data,
+ size_t num_bits,
+ bool readback
+ ) = 0;
+
+ //motherboard eeprom map structure
+ uhd::usrp::mboard_eeprom_t mb_eeprom;
+};
+
+#endif /* INCLUDED_USRP_E100_IFACE_HPP */
diff --git a/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp b/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp
new file mode 100644
index 000000000..40ea56466
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/usrp_e100_impl.cpp
@@ -0,0 +1,212 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include "usrp_e100_impl.hpp"
+#include "usrp_e100_regs.hpp"
+#include <uhd/usrp/device_props.hpp>
+#include <uhd/usrp/mboard_props.hpp>
+#include <uhd/utils/assert.hpp>
+#include <uhd/utils/static.hpp>
+#include <uhd/utils/images.hpp>
+#include <uhd/utils/warning.hpp>
+#include <boost/format.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/functional/hash.hpp>
+#include <iostream>
+#include <fstream>
+
+using namespace uhd;
+using namespace uhd::usrp;
+namespace fs = boost::filesystem;
+
+/***********************************************************************
+ * Discovery
+ **********************************************************************/
+static device_addrs_t usrp_e100_find(const device_addr_t &hint){
+ device_addrs_t usrp_e100_addrs;
+
+ //return an empty list of addresses when type is set to non-usrp-e
+ if (hint.has_key("type") and hint["type"] != "usrp-e") return usrp_e100_addrs;
+
+ //device node not provided, assume its 0
+ if (not hint.has_key("node")){
+ device_addr_t new_addr = hint;
+ new_addr["node"] = "/dev/usrp_e0";
+ return usrp_e100_find(new_addr);
+ }
+
+ //use the given device node name
+ if (fs::exists(hint["node"])){
+ device_addr_t new_addr;
+ new_addr["type"] = "usrp-e";
+ new_addr["node"] = fs::system_complete(fs::path(hint["node"])).file_string();
+ try{
+ usrp_e100_iface::sptr iface = usrp_e100_iface::make(new_addr["node"]);
+ new_addr["name"] = iface->mb_eeprom["name"];
+ new_addr["serial"] = iface->mb_eeprom["serial"];
+ if (
+ (not hint.has_key("name") or hint["name"] == new_addr["name"]) and
+ (not hint.has_key("serial") or hint["serial"] == new_addr["serial"])
+ ){
+ usrp_e100_addrs.push_back(new_addr);
+ }
+ }
+ catch(const std::exception &e){
+ uhd::warning::post(
+ std::string("Ignoring discovered device\n")
+ + e.what()
+ );
+ }
+ }
+
+ return usrp_e100_addrs;
+}
+
+/***********************************************************************
+ * Make
+ **********************************************************************/
+static device::sptr usrp_e100_make(const device_addr_t &device_addr){
+
+ //setup the main interface into fpga
+ std::string node = device_addr["node"];
+ std::cout << boost::format("Opening USRP-E on %s") % node << std::endl;
+ usrp_e100_iface::sptr iface = usrp_e100_iface::make(node);
+
+ //------------------------------------------------------------------
+ //-- Handle the FPGA loading...
+ //-- The image can be confimed as already loaded when:
+ //-- 1) The compatibility number matches.
+ //-- 2) The hash in the hash-file matches.
+ //------------------------------------------------------------------
+ static const char *hash_file_path = "/tmp/usrp_e100_hash";
+
+ //extract the fpga path for usrp-e
+ std::string usrp_e100_fpga_image = find_image_path(
+ device_addr.has_key("fpga")? device_addr["fpga"] : "usrp_e100_fpga.bin"
+ );
+
+ //calculate a hash of the fpga file
+ size_t fpga_hash = 0;
+ {
+ std::ifstream file(usrp_e100_fpga_image.c_str());
+ if (not file.good()) throw std::runtime_error(
+ "cannot open fpga file for read: " + usrp_e100_fpga_image
+ );
+ do{
+ boost::hash_combine(fpga_hash, file.get());
+ } while (file.good());
+ file.close();
+ }
+
+ //read the compatibility number
+ boost::uint16_t fpga_compat_num = iface->peek16(UE_REG_MISC_COMPAT);
+
+ //read the hash in the hash-file
+ size_t loaded_hash = 0;
+ try{std::ifstream(hash_file_path) >> loaded_hash;}catch(...){}
+
+ //if not loaded: load the fpga image and write the hash-file
+ if (fpga_compat_num != USRP_E_COMPAT_NUM or loaded_hash != fpga_hash){
+ iface.reset();
+ usrp_e100_load_fpga(usrp_e100_fpga_image);
+ sleep(1); ///\todo do this better one day.
+ std::cout << boost::format("re-Opening USRP-E on %s") % node << std::endl;
+ iface = usrp_e100_iface::make(node);
+ try{std::ofstream(hash_file_path) << fpga_hash;}catch(...){}
+ }
+
+ //check that the compatibility is correct
+ fpga_compat_num = iface->peek16(UE_REG_MISC_COMPAT);
+ if (fpga_compat_num != USRP_E_COMPAT_NUM){
+ throw std::runtime_error(str(boost::format(
+ "Expected fpga compatibility number 0x%x, but got 0x%x:\n"
+ "The fpga build is not compatible with the host code build."
+ ) % USRP_E_COMPAT_NUM % fpga_compat_num));
+ }
+
+ return device::sptr(new usrp_e100_impl(iface));
+}
+
+UHD_STATIC_BLOCK(register_usrp_e100_device){
+ device::register_device(&usrp_e100_find, &usrp_e100_make);
+}
+
+/***********************************************************************
+ * Structors
+ **********************************************************************/
+usrp_e100_impl::usrp_e100_impl(usrp_e100_iface::sptr iface): _iface(iface){
+
+ //setup interfaces into hardware
+ _clock_ctrl = usrp_e100_clock_ctrl::make(_iface);
+ _codec_ctrl = usrp_e100_codec_ctrl::make(_iface);
+
+ //initialize the mboard
+ mboard_init();
+
+ //initialize the dboards
+ dboard_init();
+
+ //initialize the dsps
+ rx_ddc_init();
+ tx_duc_init();
+
+ //init the codec properties
+ codec_init();
+
+ //init the io send/recv
+ io_init();
+
+ //set default subdev specs
+ this->mboard_set(MBOARD_PROP_RX_SUBDEV_SPEC, subdev_spec_t());
+ this->mboard_set(MBOARD_PROP_TX_SUBDEV_SPEC, subdev_spec_t());
+}
+
+usrp_e100_impl::~usrp_e100_impl(void){
+ /* NOP */
+}
+
+/***********************************************************************
+ * Device Get
+ **********************************************************************/
+void usrp_e100_impl::get(const wax::obj &key_, wax::obj &val){
+ named_prop_t key = named_prop_t::extract(key_);
+
+ //handle the get request conditioned on the key
+ switch(key.as<device_prop_t>()){
+ case DEVICE_PROP_NAME:
+ val = std::string("usrp-e device");
+ return;
+
+ case DEVICE_PROP_MBOARD:
+ UHD_ASSERT_THROW(key.name == "");
+ val = _mboard_proxy->get_link();
+ return;
+
+ case DEVICE_PROP_MBOARD_NAMES:
+ val = prop_names_t(1, ""); //vector of size 1 with empty string
+ return;
+
+ default: UHD_THROW_PROP_GET_ERROR();
+ }
+}
+
+/***********************************************************************
+ * Device Set
+ **********************************************************************/
+void usrp_e100_impl::set(const wax::obj &, const wax::obj &){
+ UHD_THROW_PROP_SET_ERROR();
+}
diff --git a/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp b/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp
new file mode 100644
index 000000000..de158ea5e
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp
@@ -0,0 +1,167 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include "usrp_e100_iface.hpp"
+#include "clock_ctrl.hpp"
+#include "codec_ctrl.hpp"
+#include <uhd/device.hpp>
+#include <uhd/utils/pimpl.hpp>
+#include <uhd/usrp/subdev_spec.hpp>
+#include <uhd/usrp/dboard_eeprom.hpp>
+#include <uhd/types/otw_type.hpp>
+#include <uhd/types/clock_config.hpp>
+#include <uhd/types/stream_cmd.hpp>
+#include <uhd/usrp/dboard_manager.hpp>
+
+#ifndef INCLUDED_USRP_E100_IMPL_HPP
+#define INCLUDED_USRP_E100_IMPL_HPP
+
+static const boost::uint16_t USRP_E_COMPAT_NUM = 0x02;
+
+//! load an fpga image from a bin file into the usrp-e fpga
+extern void usrp_e100_load_fpga(const std::string &bin_file);
+
+/*!
+ * Make a usrp-e dboard interface.
+ * \param iface the usrp-e interface object
+ * \param clock the clock control interface
+ * \param codec the codec control interface
+ * \return a sptr to a new dboard interface
+ */
+uhd::usrp::dboard_iface::sptr make_usrp_e100_dboard_iface(
+ usrp_e100_iface::sptr iface,
+ usrp_e100_clock_ctrl::sptr clock,
+ usrp_e100_codec_ctrl::sptr codec
+);
+
+/*!
+ * Simple wax obj proxy class:
+ * Provides a wax obj interface for a set and a get function.
+ * This allows us to create nested properties structures
+ * while maintaining flattened code within the implementation.
+ */
+class wax_obj_proxy : public wax::obj{
+public:
+ typedef boost::function<void(const wax::obj &, wax::obj &)> get_t;
+ typedef boost::function<void(const wax::obj &, const wax::obj &)> set_t;
+ typedef boost::shared_ptr<wax_obj_proxy> sptr;
+
+ static sptr make(const get_t &get, const set_t &set){
+ return sptr(new wax_obj_proxy(get, set));
+ }
+
+private:
+ get_t _get; set_t _set;
+ wax_obj_proxy(const get_t &get, const set_t &set): _get(get), _set(set){};
+ void get(const wax::obj &key, wax::obj &val){return _get(key, val);}
+ void set(const wax::obj &key, const wax::obj &val){return _set(key, val);}
+};
+
+/*!
+ * USRP-E100 implementation guts:
+ * The implementation details are encapsulated here.
+ * Handles properties on the mboard, dboard, dsps...
+ */
+class usrp_e100_impl : public uhd::device{
+public:
+ //structors
+ usrp_e100_impl(usrp_e100_iface::sptr);
+ ~usrp_e100_impl(void);
+
+ //the io interface
+ size_t send(const std::vector<const void *> &, size_t, const uhd::tx_metadata_t &, const uhd::io_type_t &, send_mode_t, double);
+ size_t recv(const std::vector<void *> &, size_t, uhd::rx_metadata_t &, const uhd::io_type_t &, recv_mode_t, double);
+ bool recv_async_msg(uhd::async_metadata_t &, double);
+ size_t get_max_send_samps_per_packet(void) const;
+ size_t get_max_recv_samps_per_packet(void) const;
+
+private:
+ //interface to ioctls and file descriptor
+ usrp_e100_iface::sptr _iface;
+
+ //handle io stuff
+ UHD_PIMPL_DECL(io_impl) _io_impl;
+ uhd::otw_type_t _send_otw_type, _recv_otw_type;
+ void io_init(void);
+ void issue_stream_cmd(const uhd::stream_cmd_t &stream_cmd);
+ void handle_overrun(size_t);
+
+ //configuration shadows
+ uhd::clock_config_t _clock_config;
+
+ //ad9522 clock control
+ usrp_e100_clock_ctrl::sptr _clock_ctrl;
+
+ //ad9862 codec control
+ usrp_e100_codec_ctrl::sptr _codec_ctrl;
+
+ //device functions and settings
+ void get(const wax::obj &, wax::obj &);
+ void set(const wax::obj &, const wax::obj &);
+
+ //mboard functions and settings
+ void mboard_init(void);
+ void mboard_get(const wax::obj &, wax::obj &);
+ void mboard_set(const wax::obj &, const wax::obj &);
+ wax_obj_proxy::sptr _mboard_proxy;
+ uhd::usrp::subdev_spec_t _rx_subdev_spec, _tx_subdev_spec;
+
+ //xx dboard functions and settings
+ void dboard_init(void);
+ uhd::usrp::dboard_manager::sptr _dboard_manager;
+ uhd::usrp::dboard_iface::sptr _dboard_iface;
+
+ //rx dboard functions and settings
+ uhd::usrp::dboard_eeprom_t _rx_db_eeprom;
+ void rx_dboard_get(const wax::obj &, wax::obj &);
+ void rx_dboard_set(const wax::obj &, const wax::obj &);
+ wax_obj_proxy::sptr _rx_dboard_proxy;
+
+ //tx dboard functions and settings
+ uhd::usrp::dboard_eeprom_t _tx_db_eeprom;
+ void tx_dboard_get(const wax::obj &, wax::obj &);
+ void tx_dboard_set(const wax::obj &, const wax::obj &);
+ wax_obj_proxy::sptr _tx_dboard_proxy;
+
+ //rx ddc functions and settings
+ void rx_ddc_init(void);
+ void rx_ddc_get(const wax::obj &, wax::obj &);
+ void rx_ddc_set(const wax::obj &, const wax::obj &);
+ double _ddc_freq; size_t _ddc_decim;
+ wax_obj_proxy::sptr _rx_ddc_proxy;
+
+ //tx duc functions and settings
+ void tx_duc_init(void);
+ void tx_duc_get(const wax::obj &, wax::obj &);
+ void tx_duc_set(const wax::obj &, const wax::obj &);
+ double _duc_freq; size_t _duc_interp;
+ wax_obj_proxy::sptr _tx_duc_proxy;
+
+ //codec functions and settings
+ void codec_init(void);
+ void rx_codec_get(const wax::obj &, wax::obj &);
+ void rx_codec_set(const wax::obj &, const wax::obj &);
+ void tx_codec_get(const wax::obj &, wax::obj &);
+ void tx_codec_set(const wax::obj &, const wax::obj &);
+ wax_obj_proxy::sptr _rx_codec_proxy, _tx_codec_proxy;
+
+ //clock control functions and settings
+ void init_clock_config(void);
+ void update_clock_config(void);
+};
+
+#endif /* INCLUDED_USRP_E100_IMPL_HPP */
diff --git a/host/lib/usrp/usrp_e100/usrp_e100_mmap_zero_copy.cpp b/host/lib/usrp/usrp_e100/usrp_e100_mmap_zero_copy.cpp
new file mode 100644
index 000000000..bf378a9b1
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/usrp_e100_mmap_zero_copy.cpp
@@ -0,0 +1,215 @@
+//
+// Copyright 2010 Ettus Research LLC
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see <http://www.gnu.org/licenses/>.
+//
+
+#include "usrp_e100_iface.hpp"
+#include <uhd/transport/zero_copy.hpp>
+#include <uhd/utils/assert.hpp>
+#include <linux/usrp_e.h>
+#include <sys/mman.h> //mmap
+#include <unistd.h> //getpagesize
+#include <poll.h> //poll
+#include <boost/bind.hpp>
+#include <boost/enable_shared_from_this.hpp>
+#include <iostream>
+
+using namespace uhd;
+using namespace uhd::transport;
+
+static const bool fp_verbose = false; //fast-path verbose
+static const bool sp_verbose = false; //slow-path verbose
+static const size_t poll_breakout = 10; //how many poll timeouts constitute a full timeout
+
+/***********************************************************************
+ * The zero copy interface implementation
+ **********************************************************************/
+class usrp_e100_mmap_zero_copy_impl : public zero_copy_if, public boost::enable_shared_from_this<usrp_e100_mmap_zero_copy_impl> {
+public:
+ usrp_e100_mmap_zero_copy_impl(usrp_e100_iface::sptr iface):
+ _fd(iface->get_file_descriptor()), _recv_index(0), _send_index(0)
+ {
+ //get system sizes
+ iface->ioctl(USRP_E_GET_RB_INFO, &_rb_size);
+ size_t page_size = getpagesize();
+ _frame_size = page_size/2;
+
+ //calculate the memory size
+ _map_size =
+ (_rb_size.num_pages_rx_flags + _rb_size.num_pages_tx_flags) * page_size +
+ (_rb_size.num_rx_frames + _rb_size.num_tx_frames) * _frame_size;
+
+ //print sizes summary
+ if (sp_verbose){
+ std::cout << "page_size: " << page_size << std::endl;
+ std::cout << "frame_size: " << _frame_size << std::endl;
+ std::cout << "num_pages_rx_flags: " << _rb_size.num_pages_rx_flags << std::endl;
+ std::cout << "num_rx_frames: " << _rb_size.num_rx_frames << std::endl;
+ std::cout << "num_pages_tx_flags: " << _rb_size.num_pages_tx_flags << std::endl;
+ std::cout << "num_tx_frames: " << _rb_size.num_tx_frames << std::endl;
+ std::cout << "map_size: " << _map_size << std::endl;
+ }
+
+ //call mmap to get the memory
+ _mapped_mem = ::mmap(
+ NULL, _map_size, PROT_READ | PROT_WRITE, MAP_SHARED, _fd, 0
+ );
+ UHD_ASSERT_THROW(_mapped_mem != MAP_FAILED);
+
+ //calculate the memory offsets for info and buffers
+ size_t recv_info_off = 0;
+ size_t recv_buff_off = recv_info_off + (_rb_size.num_pages_rx_flags * page_size);
+ size_t send_info_off = recv_buff_off + (_rb_size.num_rx_frames * _frame_size);
+ size_t send_buff_off = send_info_off + (_rb_size.num_pages_tx_flags * page_size);
+
+ //print offset summary
+ if (sp_verbose){
+ std::cout << "recv_info_off: " << recv_info_off << std::endl;
+ std::cout << "recv_buff_off: " << recv_buff_off << std::endl;
+ std::cout << "send_info_off: " << send_info_off << std::endl;
+ std::cout << "send_buff_off: " << send_buff_off << std::endl;
+ }
+
+ //set the internal pointers for info and buffers
+ typedef ring_buffer_info (*rbi_pta)[];
+ char *rb_ptr = reinterpret_cast<char *>(_mapped_mem);
+ _recv_info = reinterpret_cast<rbi_pta>(rb_ptr + recv_info_off);
+ _recv_buff = rb_ptr + recv_buff_off;
+ _send_info = reinterpret_cast<rbi_pta>(rb_ptr + send_info_off);
+ _send_buff = rb_ptr + send_buff_off;
+ }
+
+ ~usrp_e100_mmap_zero_copy_impl(void){
+ if (sp_verbose) std::cout << "cleanup: munmap" << std::endl;
+ ::munmap(_mapped_mem, _map_size);
+ }
+
+ managed_recv_buffer::sptr get_recv_buff(double timeout){
+ if (fp_verbose) std::cout << "get_recv_buff: " << _recv_index << std::endl;
+
+ //grab pointers to the info and buffer
+ ring_buffer_info *info = (*_recv_info) + _recv_index;
+ void *mem = _recv_buff + _frame_size*_recv_index;
+
+ //poll/wait for a ready frame
+ if (not (info->flags & RB_USER)){
+ for (size_t i = 0; i < poll_breakout; i++){
+ pollfd pfd;
+ pfd.fd = _fd;
+ pfd.events = POLLIN;
+ ssize_t poll_ret = ::poll(&pfd, 1, size_t(timeout*1e3/poll_breakout));
+ if (fp_verbose) std::cout << " POLLIN: " << poll_ret << std::endl;
+ if (poll_ret > 0) goto found_user_frame; //good poll, continue on
+ }
+ return managed_recv_buffer::sptr(); //timed-out for real
+ } found_user_frame:
+
+ //the process has claimed the frame
+ info->flags = RB_USER_PROCESS;
+
+ //increment the index for the next call
+ if (++_recv_index == size_t(_rb_size.num_rx_frames)) _recv_index = 0;
+
+ //return the managed buffer for this frame
+ if (fp_verbose) std::cout << " make_recv_buff: " << info->len << std::endl;
+ return managed_recv_buffer::make_safe(
+ boost::asio::const_buffer(mem, info->len),
+ boost::bind(&usrp_e100_mmap_zero_copy_impl::release, shared_from_this(), info)
+ );
+ }
+
+ size_t get_num_recv_frames(void) const{
+ return _rb_size.num_rx_frames;
+ }
+
+ size_t get_recv_frame_size(void) const{
+ return _frame_size;
+ }
+
+ managed_send_buffer::sptr get_send_buff(double timeout){
+ if (fp_verbose) std::cout << "get_send_buff: " << _send_index << std::endl;
+
+ //grab pointers to the info and buffer
+ ring_buffer_info *info = (*_send_info) + _send_index;
+ void *mem = _send_buff + _frame_size*_send_index;
+
+ //poll/wait for a ready frame
+ if (not (info->flags & RB_KERNEL)){
+ pollfd pfd;
+ pfd.fd = _fd;
+ pfd.events = POLLOUT;
+ ssize_t poll_ret = ::poll(&pfd, 1, size_t(timeout*1e3));
+ if (fp_verbose) std::cout << " POLLOUT: " << poll_ret << std::endl;
+ if (poll_ret <= 0) return managed_send_buffer::sptr();
+ }
+
+ //increment the index for the next call
+ if (++_send_index == size_t(_rb_size.num_tx_frames)) _send_index = 0;
+
+ //return the managed buffer for this frame
+ if (fp_verbose) std::cout << " make_send_buff: " << _frame_size << std::endl;
+ return managed_send_buffer::make_safe(
+ boost::asio::mutable_buffer(mem, _frame_size),
+ boost::bind(&usrp_e100_mmap_zero_copy_impl::commit, shared_from_this(), info, _1)
+ );
+ }
+
+ size_t get_num_send_frames(void) const{
+ return _rb_size.num_tx_frames;
+ }
+
+ size_t get_send_frame_size(void) const{
+ return _frame_size;
+ }
+
+private:
+
+ void release(ring_buffer_info *info){
+ if (fp_verbose) std::cout << "recv buff: release" << std::endl;
+ info->flags = RB_KERNEL;
+ }
+
+ void commit(ring_buffer_info *info, size_t len){
+ if (fp_verbose) std::cout << "send buff: commit " << len << std::endl;
+ info->len = len;
+ info->flags = RB_USER;
+ if (::write(_fd, NULL, 0) < 0){
+ std::cerr << UHD_THROW_SITE_INFO("write error") << std::endl;
+ }
+ }
+
+ int _fd;
+
+ //the mapped memory itself
+ void *_mapped_mem;
+
+ //mapped memory sizes
+ usrp_e_ring_buffer_size_t _rb_size;
+ size_t _frame_size, _map_size;
+
+ //pointers to sections in the mapped memory
+ ring_buffer_info (*_recv_info)[], (*_send_info)[];
+ char *_recv_buff, *_send_buff;
+
+ //indexes into sub-sections of mapped memory
+ size_t _recv_index, _send_index;
+};
+
+/***********************************************************************
+ * The zero copy interface make function
+ **********************************************************************/
+zero_copy_if::sptr usrp_e100_make_mmap_zero_copy(usrp_e100_iface::sptr iface){
+ return zero_copy_if::sptr(new usrp_e100_mmap_zero_copy_impl(iface));
+}
diff --git a/host/lib/usrp/usrp_e100/usrp_e100_regs.hpp b/host/lib/usrp/usrp_e100/usrp_e100_regs.hpp
new file mode 100644
index 000000000..625fb2c35
--- /dev/null
+++ b/host/lib/usrp/usrp_e100/usrp_e100_regs.hpp
@@ -0,0 +1,198 @@
+
+
+////////////////////////////////////////////////////////////////
+//
+// Memory map for embedded wishbone bus
+//
+////////////////////////////////////////////////////////////////
+
+// All addresses are byte addresses. All accesses are word (16-bit) accesses.
+// This means that address bit 0 is usually 0.
+// There are 11 bits of address for the control.
+
+#ifndef INCLUDED_USRP_E100_REGS_HPP
+#define INCLUDED_USRP_E100_REGS_HPP
+
+/////////////////////////////////////////////////////
+// Slave pointers
+
+#define UE_REG_SLAVE(n) ((n)<<7)
+#define UE_REG_SR_ADDR(n) ((UE_REG_SLAVE(5)) + (4*(n)))
+
+/////////////////////////////////////////////////////
+// Slave 0 -- Misc Regs
+
+#define UE_REG_MISC_BASE UE_REG_SLAVE(0)
+
+#define UE_REG_MISC_LED UE_REG_MISC_BASE + 0
+#define UE_REG_MISC_SW UE_REG_MISC_BASE + 2
+#define UE_REG_MISC_CGEN_CTRL UE_REG_MISC_BASE + 4
+#define UE_REG_MISC_CGEN_ST UE_REG_MISC_BASE + 6
+#define UE_REG_MISC_TEST UE_REG_MISC_BASE + 8
+#define UE_REG_MISC_RX_LEN UE_REG_MISC_BASE + 10
+#define UE_REG_MISC_TX_LEN UE_REG_MISC_BASE + 12
+#define UE_REG_MISC_XFER_RATE UE_REG_MISC_BASE + 14
+#define UE_REG_MISC_COMPAT UE_REG_MISC_BASE + 16
+
+/////////////////////////////////////////////////////
+// Slave 1 -- UART
+// CLKDIV is 16 bits, others are only 8
+
+#define UE_REG_UART_BASE UE_REG_SLAVE(1)
+
+#define UE_REG_UART_CLKDIV UE_REG_UART_BASE + 0
+#define UE_REG_UART_TXLEVEL UE_REG_UART_BASE + 2
+#define UE_REG_UART_RXLEVEL UE_REG_UART_BASE + 4
+#define UE_REG_UART_TXCHAR UE_REG_UART_BASE + 6
+#define UE_REG_UART_RXCHAR UE_REG_UART_BASE + 8
+
+/////////////////////////////////////////////////////
+// Slave 2 -- SPI Core
+// This should be accessed through the IOCTL
+// Users should not touch directly
+
+#define UE_REG_SPI_BASE UE_REG_SLAVE(2)
+
+//spi slave constants
+#define UE_SPI_SS_AD9522 (1 << 3)
+#define UE_SPI_SS_AD9862 (1 << 2)
+#define UE_SPI_SS_TX_DB (1 << 1)
+#define UE_SPI_SS_RX_DB (1 << 0)
+
+////////////////////////////////////////////////
+// Slave 3 -- I2C Core
+// This should be accessed through the IOCTL
+// Users should not touch directly
+
+#define UE_REG_I2C_BASE UE_REG_SLAVE(3)
+
+
+////////////////////////////////////////////////
+// Slave 4 -- GPIO
+
+#define UE_REG_GPIO_BASE UE_REG_SLAVE(4)
+
+#define UE_REG_GPIO_RX_IO UE_REG_GPIO_BASE + 0
+#define UE_REG_GPIO_TX_IO UE_REG_GPIO_BASE + 2
+#define UE_REG_GPIO_RX_DDR UE_REG_GPIO_BASE + 4
+#define UE_REG_GPIO_TX_DDR UE_REG_GPIO_BASE + 6
+#define UE_REG_GPIO_RX_SEL UE_REG_GPIO_BASE + 8
+#define UE_REG_GPIO_TX_SEL UE_REG_GPIO_BASE + 10
+#define UE_REG_GPIO_RX_DBG UE_REG_GPIO_BASE + 12
+#define UE_REG_GPIO_TX_DBG UE_REG_GPIO_BASE + 14
+
+//possible bit values for sel when dbg is 0:
+#define GPIO_SEL_SW 0 // if pin is an output, set by software in the io reg
+#define GPIO_SEL_ATR 1 // if pin is an output, set by ATR logic
+
+//possible bit values for sel when dbg is 1:
+#define GPIO_SEL_DEBUG_0 0 // if pin is an output, debug lines from FPGA fabric
+#define GPIO_SEL_DEBUG_1 1 // if pin is an output, debug lines from FPGA fabric
+
+
+////////////////////////////////////////////////////
+// Slave 5 -- Settings Bus
+//
+// Output-only, no readback, 32 registers total
+// Each register must be written 32 bits at a time
+// First the address xxx_xx00 and then xxx_xx10
+
+#define UE_REG_SETTINGS_BASE UE_REG_SLAVE(5)
+
+///////////////////////////////////////////////////
+// Slave 6 -- ATR Controller
+// 16 regs
+
+#define UE_REG_ATR_BASE UE_REG_SLAVE(6)
+
+#define UE_REG_ATR_IDLE_RXSIDE UE_REG_ATR_BASE + 0
+#define UE_REG_ATR_IDLE_TXSIDE UE_REG_ATR_BASE + 2
+#define UE_REG_ATR_INTX_RXSIDE UE_REG_ATR_BASE + 4
+#define UE_REG_ATR_INTX_TXSIDE UE_REG_ATR_BASE + 6
+#define UE_REG_ATR_INRX_RXSIDE UE_REG_ATR_BASE + 8
+#define UE_REG_ATR_INRX_TXSIDE UE_REG_ATR_BASE + 10
+#define UE_REG_ATR_FULL_RXSIDE UE_REG_ATR_BASE + 12
+#define UE_REG_ATR_FULL_TXSIDE UE_REG_ATR_BASE + 14
+
+/////////////////////////////////////////////////
+// DSP RX Regs
+////////////////////////////////////////////////
+#define UE_REG_DSP_RX_FREQ UE_REG_SR_ADDR(0)
+#define UE_REG_DSP_RX_SCALE_IQ UE_REG_SR_ADDR(1) // {scale_i,scale_q}
+#define UE_REG_DSP_RX_DECIM_RATE UE_REG_SR_ADDR(2) // hb and decim rate
+#define UE_REG_DSP_RX_DCOFFSET_I UE_REG_SR_ADDR(3) // Bit 31 high sets fixed offset mode, using lower 14 bits, // otherwise it is automatic
+#define UE_REG_DSP_RX_DCOFFSET_Q UE_REG_SR_ADDR(4) // Bit 31 high sets fixed offset mode, using lower 14 bits
+#define UE_REG_DSP_RX_MUX UE_REG_SR_ADDR(5)
+
+///////////////////////////////////////////////////
+// VITA RX CTRL regs
+///////////////////////////////////////////////////
+// The following 3 are logically a single command register.
+// They are clocked into the underlying fifo when time_ticks is written.
+#define UE_REG_CTRL_RX_STREAM_CMD UE_REG_SR_ADDR(8) // {now, chain, num_samples(30)
+#define UE_REG_CTRL_RX_TIME_SECS UE_REG_SR_ADDR(9)
+#define UE_REG_CTRL_RX_TIME_TICKS UE_REG_SR_ADDR(10)
+#define UE_REG_CTRL_RX_CLEAR_OVERRUN UE_REG_SR_ADDR(11) // write anything to clear overrun
+#define UE_REG_CTRL_RX_VRT_HEADER UE_REG_SR_ADDR(12) // word 0 of packet. FPGA fills in packet counter
+#define UE_REG_CTRL_RX_VRT_STREAM_ID UE_REG_SR_ADDR(13) // word 1 of packet.
+#define UE_REG_CTRL_RX_VRT_TRAILER UE_REG_SR_ADDR(14)
+#define UE_REG_CTRL_RX_NSAMPS_PER_PKT UE_REG_SR_ADDR(15)
+#define UE_REG_CTRL_RX_NCHANNELS UE_REG_SR_ADDR(16) // 1 in basic case, up to 4 for vector sources
+
+/////////////////////////////////////////////////
+// DSP TX Regs
+////////////////////////////////////////////////
+#define UE_REG_DSP_TX_FREQ UE_REG_SR_ADDR(17)
+#define UE_REG_DSP_TX_SCALE_IQ UE_REG_SR_ADDR(18) // {scale_i,scale_q}
+#define UE_REG_DSP_TX_INTERP_RATE UE_REG_SR_ADDR(19)
+#define UE_REG_DSP_TX_UNUSED UE_REG_SR_ADDR(20)
+#define UE_REG_DSP_TX_MUX UE_REG_SR_ADDR(21)
+
+/////////////////////////////////////////////////
+// VITA TX CTRL regs
+////////////////////////////////////////////////
+#define UE_REG_CTRL_TX_NCHANNELS UE_REG_SR_ADDR(24)
+#define UE_REG_CTRL_TX_CLEAR_UNDERRUN UE_REG_SR_ADDR(25)
+#define UE_REG_CTRL_TX_REPORT_SID UE_REG_SR_ADDR(26)
+#define UE_REG_CTRL_TX_POLICY UE_REG_SR_ADDR(27)
+
+#define UE_FLAG_CTRL_TX_POLICY_WAIT (0x1 << 0)
+#define UE_FLAG_CTRL_TX_POLICY_NEXT_PACKET (0x1 << 1)
+#define UE_FLAG_CTRL_TX_POLICY_NEXT_BURST (0x1 << 2)
+
+/////////////////////////////////////////////////
+// VITA49 64 bit time (write only)
+////////////////////////////////////////////////
+ /*!
+ * \brief Time 64 flags
+ *
+ * <pre>
+ *
+ * 3 2 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-----------------------------------------------------------+-+-+
+ * | |S|P|
+ * +-----------------------------------------------------------+-+-+
+ *
+ * P - PPS edge selection (0=negedge, 1=posedge, default=0)
+ * S - Source (0=sma, 1=mimo, 0=default)
+ *
+ * </pre>
+ */
+#define UE_REG_TIME64_SECS UE_REG_SR_ADDR(28) // value to set absolute secs to on next PPS
+#define UE_REG_TIME64_TICKS UE_REG_SR_ADDR(29) // value to set absolute ticks to on next PPS
+#define UE_REG_TIME64_FLAGS UE_REG_SR_ADDR(30) // flags - see chart above
+#define UE_REG_TIME64_IMM UE_REG_SR_ADDR(31) // set immediate (0=latch on next pps, 1=latch immediate, default=0)
+#define UE_REG_TIME64_TPS UE_REG_SR_ADDR(31) // clock ticks per second (counter rollover)
+
+//pps flags (see above)
+#define UE_FLAG_TIME64_PPS_NEGEDGE (0 << 0)
+#define UE_FLAG_TIME64_PPS_POSEDGE (1 << 0)
+#define UE_FLAG_TIME64_PPS_SMA (0 << 1)
+#define UE_FLAG_TIME64_PPS_MIMO (1 << 1)
+
+#define UE_FLAG_TIME64_LATCH_NOW 1
+#define UE_FLAG_TIME64_LATCH_NEXT_PPS 0
+
+#endif
+
diff --git a/host/test/CMakeLists.txt b/host/test/CMakeLists.txt
index 5d7433c67..bdbde4b2c 100644
--- a/host/test/CMakeLists.txt
+++ b/host/test/CMakeLists.txt
@@ -51,3 +51,7 @@ ENDFOREACH(test_source)
# demo of a loadable module
########################################################################
ADD_LIBRARY(module_test MODULE module_test.cpp)
+
+INSTALL(TARGETS
+ RUNTIME DESTINATION ${PKG_DATA_DIR}/tests
+)
diff --git a/host/utils/CMakeLists.txt b/host/utils/CMakeLists.txt
index 38e21c753..0edf5a78c 100644
--- a/host/utils/CMakeLists.txt
+++ b/host/utils/CMakeLists.txt
@@ -45,6 +45,18 @@ IF(ENABLE_USRP1)
)
ENDIF(ENABLE_USRP1)
+IF(ENABLE_USRP_E100)
+ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e100/include)
+ LIST(APPEND util_share_sources
+ fpga-downloader.cpp
+ clkgen-config.cpp
+ usrp-e-loopback.c
+ usrp-e-debug-pins.c
+ usrp-e-i2c.c
+ usrp-e-spi.c
+ )
+ENDIF(ENABLE_USRP_E100)
+
#for each source: build an executable and install
FOREACH(util_source ${util_share_sources})
GET_FILENAME_COMPONENT(util_name ${util_source} NAME_WE)
diff --git a/host/utils/clkgen-config.cpp b/host/utils/clkgen-config.cpp
new file mode 100644
index 000000000..e8279b4ae
--- /dev/null
+++ b/host/utils/clkgen-config.cpp
@@ -0,0 +1,296 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2003,2004,2008,2009 Free Software Foundation, Inc.
+ *
+ * This file is part of UHD
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <string>
+#include <cstdlib>
+
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+
+#include <linux/spi/spidev.h>
+
+
+// Programming data for clock gen chip
+static const unsigned int config_data[] = {
+ 0x000024,
+ 0x023201,
+ 0x000081,
+ 0x000400,
+ 0x00104c,
+ 0x001101,
+ 0x001200,
+ 0x001300,
+ 0x001414,
+ 0x001500,
+ 0x001604,
+ 0x001704,
+ 0x001807,
+ 0x001900,
+ //0x001a00,//for debug
+ 0x001a32,
+ 0x001b12,
+ 0x001c44,
+ 0x001d00,
+ 0x001e00,
+ 0x00f062,
+ 0x00f162,
+ 0x00f262,
+ 0x00f362,
+ 0x00f462,
+ 0x00f562,
+ 0x00f662,
+ 0x00f762,
+ 0x00f862,
+ 0x00f962,
+ 0x00fa62,
+ 0x00fb62,
+ 0x00fc00,
+ 0x00fd00,
+ 0x019021,
+ 0x019100,
+ 0x019200,
+ 0x019333,
+ 0x019400,
+ 0x019500,
+ 0x019611,
+ 0x019700,
+ 0x019800,
+ 0x019900,
+ 0x019a00,
+ 0x019b00,
+ 0x01e003,
+ 0x01e102,
+ 0x023000,
+ 0x023201,
+ 0x0b0201,
+ 0x0b0300,
+ 0x001fff,
+ 0x0a0000,
+ 0x0a0100,
+ 0x0a0200,
+ 0x0a0302,
+ 0x0a0400,
+ 0x0a0504,
+ 0x0a060e,
+ 0x0a0700,
+ 0x0a0810,
+ 0x0a090e,
+ 0x0a0a00,
+ 0x0a0bf0,
+ 0x0a0c0b,
+ 0x0a0d01,
+ 0x0a0e90,
+ 0x0a0f01,
+ 0x0a1001,
+ 0x0a11e0,
+ 0x0a1201,
+ 0x0a1302,
+ 0x0a1430,
+ 0x0a1580,
+ 0x0a16ff,
+ 0x023201,
+ 0x0b0301,
+ 0x023201,
+};
+
+
+const unsigned int CLKGEN_SELECT = 145;
+
+
+enum gpio_direction {IN, OUT};
+
+class gpio {
+ public:
+
+ gpio(unsigned int gpio_num, gpio_direction pin_direction, bool close_action);
+ ~gpio();
+
+ bool get_value();
+ void set_value(bool state);
+
+ private:
+
+ unsigned int gpio_num;
+
+ std::stringstream base_path;
+ std::fstream value_file;
+ std::fstream direction_file;
+ bool close_action; // True set to input and release, false do nothing
+};
+
+class spidev {
+ public:
+
+ spidev(std::string dev_name);
+ ~spidev();
+
+ void send(char *wbuf, char *rbuf, unsigned int nbytes);
+
+ private:
+
+ int fd;
+
+};
+
+gpio::gpio(unsigned int _gpio_num, gpio_direction pin_direction, bool close_action)
+{
+ std::fstream export_file;
+
+ gpio_num = _gpio_num;
+
+ export_file.open("/sys/class/gpio/export", std::ios::out);
+ if (!export_file.is_open()) ///\todo Poor error handling
+ std::cout << "Failed to open gpio export file." << std::endl;
+
+ export_file << gpio_num << std::endl;
+
+ base_path << "/sys/class/gpio/gpio" << gpio_num << std::flush;
+
+ std::string direction_file_name;
+
+ direction_file_name = base_path.str() + "/direction";
+
+ direction_file.open(direction_file_name.c_str());
+ if (!direction_file.is_open())
+ std::cout << "Failed to open direction file." << std::endl;
+ if (pin_direction == OUT)
+ direction_file << "out" << std::endl;
+ else
+ direction_file << "in" << std::endl;
+
+ std::string value_file_name;
+
+ value_file_name = base_path.str() + "/value";
+
+ value_file.open(value_file_name.c_str(), std::ios_base::in | std::ios_base::out);
+ if (!value_file.is_open())
+ std::cout << "Failed to open value file." << std::endl;
+}
+
+bool gpio::get_value()
+{
+
+ std::string val;
+
+ std::getline(value_file, val);
+ value_file.seekg(0);
+
+ if (val == "0")
+ return false;
+ else if (val == "1")
+ return true;
+ else
+ std::cout << "Data read from value file|" << val << "|" << std::endl;
+
+ return false;
+}
+
+void gpio::set_value(bool state)
+{
+
+ if (state)
+ value_file << "1" << std::endl;
+ else
+ value_file << "0" << std::endl;
+}
+
+gpio::~gpio()
+{
+ if (close_action) {
+ std::fstream unexport_file;
+
+ direction_file << "in" << std::endl;
+
+ unexport_file.open("/sys/class/gpio/unexport", std::ios::out);
+ if (!unexport_file.is_open()) ///\todo Poor error handling
+ std::cout << "Failed to open gpio export file." << std::endl;
+
+ unexport_file << gpio_num << std::endl;
+
+ }
+
+}
+
+spidev::spidev(std::string fname)
+{
+ int ret;
+ int mode = 0;
+ int speed = 12000;
+ int bits = 24;
+
+ fd = open(fname.c_str(), O_RDWR);
+
+ ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
+ ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
+ ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
+}
+
+
+spidev::~spidev()
+{
+ close(fd);
+}
+
+void spidev::send(char *buf, char *rbuf, unsigned int nbytes)
+{
+ int ret;
+
+ struct spi_ioc_transfer tr;
+ tr.tx_buf = (unsigned long) buf;
+ tr.rx_buf = (unsigned long) rbuf;
+ tr.len = nbytes;
+ tr.delay_usecs = 0;
+ tr.speed_hz = 12000000;
+ tr.bits_per_word = 24;
+
+ ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
+
+}
+
+static void send_config_to_clkgen(gpio &chip_select, const unsigned int data[], unsigned int data_size)
+{
+ spidev spi("/dev/spidev1.0");
+ unsigned int rbuf;
+
+ for (unsigned int i = 0; i < data_size; i++) {
+
+ std::cout << "sending " << std::hex << data[i] << std::endl;
+ chip_select.set_value(0);
+ spi.send((char *)&data[i], (char *)&rbuf, 4);
+ chip_select.set_value(1);
+
+ };
+}
+
+int main(int argc, char *argv[])
+{
+
+ gpio clkgen_select(CLKGEN_SELECT, OUT, true);
+
+ send_config_to_clkgen(clkgen_select, config_data, sizeof(config_data)/sizeof(unsigned int));
+}
+
diff --git a/host/utils/fpga-downloader.cpp b/host/utils/fpga-downloader.cpp
new file mode 100644
index 000000000..80ee71600
--- /dev/null
+++ b/host/utils/fpga-downloader.cpp
@@ -0,0 +1,267 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2003,2004,2008,2009 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+*/
+
+#include <iostream>
+#include <sstream>
+#include <fstream>
+#include <string>
+#include <cstdlib>
+
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+
+#include <linux/spi/spidev.h>
+
+/*
+ * Configuration connections
+ *
+ * CCK - MCSPI1_CLK
+ * DIN - MCSPI1_MOSI
+ * PROG_B - GPIO_175 - output (change mux)
+ * DONE - GPIO_173 - input (change mux)
+ * INIT_B - GPIO_114 - input (change mux)
+ *
+*/
+
+const unsigned int PROG_B = 175;
+const unsigned int DONE = 173;
+const unsigned int INIT_B = 114;
+
+static std::string bit_file = "safe_u1e.bin";
+
+const int BUF_SIZE = 4096;
+
+enum gpio_direction {IN, OUT};
+
+class gpio {
+ public:
+
+ gpio(unsigned int gpio_num, gpio_direction pin_direction);
+
+ bool get_value();
+ void set_value(bool state);
+
+ private:
+
+ std::stringstream base_path;
+ std::fstream value_file;
+};
+
+class spidev {
+ public:
+
+ spidev(std::string dev_name);
+ ~spidev();
+
+ void send(char *wbuf, char *rbuf, unsigned int nbytes);
+
+ private:
+
+ int fd;
+
+};
+
+gpio::gpio(unsigned int gpio_num, gpio_direction pin_direction)
+{
+ std::fstream export_file;
+
+ export_file.open("/sys/class/gpio/export", std::ios::out);
+ if (!export_file.is_open()) ///\todo Poor error handling
+ std::cout << "Failed to open gpio export file." << std::endl;
+
+ export_file << gpio_num << std::endl;
+
+ base_path << "/sys/class/gpio/gpio" << gpio_num << std::flush;
+
+ std::fstream direction_file;
+ std::string direction_file_name;
+
+ direction_file_name = base_path.str() + "/direction";
+
+ direction_file.open(direction_file_name.c_str());
+ if (!direction_file.is_open())
+ std::cout << "Failed to open direction file." << std::endl;
+ if (pin_direction == OUT)
+ direction_file << "out" << std::endl;
+ else
+ direction_file << "in" << std::endl;
+
+ std::string value_file_name;
+
+ value_file_name = base_path.str() + "/value";
+
+ value_file.open(value_file_name.c_str(), std::ios_base::in | std::ios_base::out);
+ if (!value_file.is_open())
+ std::cout << "Failed to open value file." << std::endl;
+}
+
+bool gpio::get_value()
+{
+
+ std::string val;
+
+ std::getline(value_file, val);
+ value_file.seekg(0);
+
+ if (val == "0")
+ return false;
+ else if (val == "1")
+ return true;
+ else
+ std::cout << "Data read from value file|" << val << "|" << std::endl;
+
+ return false;
+}
+
+void gpio::set_value(bool state)
+{
+
+ if (state)
+ value_file << "1" << std::endl;
+ else
+ value_file << "0" << std::endl;
+}
+
+static void prepare_fpga_for_configuration(gpio &prog, gpio &init)
+{
+
+ prog.set_value(true);
+ prog.set_value(false);
+ prog.set_value(true);
+
+#if 0
+ bool ready_to_program(false);
+ unsigned int count(0);
+ do {
+ ready_to_program = init.get_value();
+ count++;
+
+ sleep(1);
+ } while (count < 10 && !ready_to_program);
+
+ if (count == 10) {
+ std::cout << "FPGA not ready for programming." << std::endl;
+ exit(-1);
+ }
+#endif
+}
+
+spidev::spidev(std::string fname)
+{
+ int ret;
+ int mode = 0;
+ int speed = 12000000;
+ int bits = 8;
+
+ fd = open(fname.c_str(), O_RDWR);
+
+ ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
+ ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
+ ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
+}
+
+
+spidev::~spidev()
+{
+ close(fd);
+}
+
+void spidev::send(char *buf, char *rbuf, unsigned int nbytes)
+{
+ int ret;
+
+ struct spi_ioc_transfer tr;
+ tr.tx_buf = (unsigned long) buf;
+ tr.rx_buf = (unsigned long) rbuf;
+ tr.len = nbytes;
+ tr.delay_usecs = 0;
+ tr.speed_hz = 48000000;
+ tr.bits_per_word = 8;
+
+ ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
+
+}
+
+static void send_file_to_fpga(std::string &file_name, gpio &error, gpio &done)
+{
+ std::ifstream bitstream;
+
+ std::cout << "File name - " << file_name.c_str() << std::endl;
+
+ bitstream.open(file_name.c_str(), std::ios::binary);
+ if (!bitstream.is_open())
+ std::cout << "File " << file_name << " not opened succesfully." << std::endl;
+
+ spidev spi("/dev/spidev1.0");
+ char buf[BUF_SIZE];
+ char rbuf[BUF_SIZE];
+
+ do {
+ bitstream.read(buf, BUF_SIZE);
+ spi.send(buf, rbuf, bitstream.gcount());
+
+ if (error.get_value())
+ std::cout << "INIT_B went high, error occured." << std::endl;
+
+ if (!done.get_value())
+ std::cout << "Configuration complete." << std::endl;
+
+ } while (bitstream.gcount() == BUF_SIZE);
+}
+
+int main(int argc, char *argv[])
+{
+
+ gpio gpio_prog_b(PROG_B, OUT);
+ gpio gpio_init_b(INIT_B, IN);
+ gpio gpio_done (DONE, IN);
+
+ if (argc == 2)
+ bit_file = argv[1];
+
+ bool module_found(false);
+ std::ifstream mod_file("/proc/modules");
+ while (!mod_file.eof()) {
+ std::string line;
+ getline(mod_file, line);
+ if (line.find("usrp_e") != std::string::npos)
+ module_found = true;
+ }
+ mod_file.close();
+
+ if (module_found) {
+ std::cout << "USRP Embedded kernel module loaded, not loading FPGA." << std::endl;
+ return -1;
+ }
+
+ std::cout << "FPGA config file: " << bit_file << std::endl;
+
+ prepare_fpga_for_configuration(gpio_prog_b, gpio_init_b);
+
+ std::cout << "Done = " << gpio_done.get_value() << std::endl;
+
+ send_file_to_fpga(bit_file, gpio_init_b, gpio_done);
+}
+
diff --git a/host/utils/usrp-e-debug-pins.c b/host/utils/usrp-e-debug-pins.c
new file mode 100644
index 000000000..1ed2c8983
--- /dev/null
+++ b/host/utils/usrp-e-debug-pins.c
@@ -0,0 +1,77 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <string.h>
+#include <sys/ioctl.h>
+
+#include <linux/usrp_e.h>
+#include "usrp_e_regs.hpp"
+
+// Usage: usrp_e_gpio <string>
+
+static int fp;
+
+static int read_reg(__u16 reg)
+{
+ int ret;
+ struct usrp_e_ctl16 d;
+
+ d.offset = reg;
+ d.count = 1;
+ ret = ioctl(fp, USRP_E_READ_CTL16, &d);
+ return d.buf[0];
+}
+
+static void write_reg(__u16 reg, __u16 val)
+{
+ int ret;
+ struct usrp_e_ctl16 d;
+
+ d.offset = reg;
+ d.count = 1;
+ d.buf[0] = val;
+ ret = ioctl(fp, USRP_E_WRITE_CTL16, &d);
+}
+
+int main(int argc, char *argv[])
+{
+ int test;
+
+ test = 0;
+ if (argc < 2) {
+ printf("%s 0|1|off\n", argv[0]);
+ }
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+ if (fp < 0) {
+ perror("Open failed");
+ return -1;
+ }
+
+ if (strcmp(argv[1], "0") == 0) {
+ printf("Selected 0 based on %s\n", argv[1]);
+ write_reg(UE_REG_GPIO_TX_DDR, 0xFFFF);
+ write_reg(UE_REG_GPIO_RX_DDR, 0xFFFF);
+ write_reg(UE_REG_GPIO_TX_SEL, 0x0);
+ write_reg(UE_REG_GPIO_RX_SEL, 0x0);
+ write_reg(UE_REG_GPIO_TX_DBG, 0xFFFF);
+ write_reg(UE_REG_GPIO_RX_DBG, 0xFFFF);
+ } else if (strcmp(argv[1], "1") == 0) {
+ printf("Selected 1 based on %s\n", argv[1]);
+ write_reg(UE_REG_GPIO_TX_DDR, 0xFFFF);
+ write_reg(UE_REG_GPIO_RX_DDR, 0xFFFF);
+ write_reg(UE_REG_GPIO_TX_SEL, 0xFFFF);
+ write_reg(UE_REG_GPIO_RX_SEL, 0xFFFF);
+ write_reg(UE_REG_GPIO_TX_DBG, 0xFFFF);
+ write_reg(UE_REG_GPIO_RX_DBG, 0xFFFF);
+ } else {
+ printf("Selected off based on %s\n", argv[1]);
+ write_reg(UE_REG_GPIO_TX_DDR, 0x0);
+ write_reg(UE_REG_GPIO_RX_DDR, 0x0);
+ }
+
+ return 0;
+}
diff --git a/host/utils/usrp-e-i2c.c b/host/utils/usrp-e-i2c.c
new file mode 100644
index 000000000..c6fd4c632
--- /dev/null
+++ b/host/utils/usrp-e-i2c.c
@@ -0,0 +1,87 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
+#include <linux/usrp_e.h>
+
+// Usage: usrp_e_i2c w address data0 data1 data 2 ....
+// Usage: usrp_e_i2c r address count
+
+int main(int argc, char *argv[])
+{
+ int fp, ret, i, tmp;
+ struct usrp_e_i2c *i2c_msg;
+ int direction, address, count;
+
+ if (argc < 3) {
+ printf("Usage: usrp-e-i2c w address data0 data1 data2 ...\n");
+ printf("Usage: usrp-e-i2c r address count\n");
+ printf("All addresses and data in hex.\n");
+ exit(-1);
+ }
+
+ if (strcmp(argv[1], "r") == 0) {
+ direction = 0;
+ } else if (strcmp(argv[1], "w") == 0) {
+ direction = 1;
+ } else {
+ return -1;
+ }
+
+ sscanf(argv[2], "%X", &address);
+ printf("Address = %X\n", address);
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+ if (fp < 0) {
+ perror("Open failed");
+ return -1;
+ }
+
+// sleep(1);
+
+ if (direction) {
+ count = argc - 3;
+ } else {
+ sscanf(argv[3], "%X", &count);
+ }
+ printf("Count = %X\n", count);
+
+ i2c_msg = malloc(sizeof(i2c_msg) + count * sizeof(char));
+
+ i2c_msg->addr = address;
+ i2c_msg->len = count;
+
+ for (i = 0; i < count; i++) {
+ i2c_msg->data[i] = i;
+ }
+
+ if (direction) {
+ // Write
+
+ for (i=0; i<count; i++) {
+ sscanf(argv[3+i], "%X", &tmp);
+ i2c_msg->data[i] = tmp;
+ }
+
+ ret = ioctl(fp, USRP_E_I2C_WRITE, i2c_msg);
+ printf("Return value from i2c_write ioctl: %d\n", ret);
+ } else {
+ // Read
+
+ ret = ioctl(fp, USRP_E_I2C_READ, i2c_msg);
+ printf("Return value from i2c_read ioctl: %d\n", ret);
+
+ printf("Ioctl: %d Data read :", ret);
+ for (i=0; i<count; i++) {
+ printf(" %X", i2c_msg->data[i]);
+ }
+ printf("\n");
+
+ }
+ return 0;
+}
diff --git a/host/utils/usrp-e-loopback.c b/host/utils/usrp-e-loopback.c
new file mode 100644
index 000000000..454d81ba7
--- /dev/null
+++ b/host/utils/usrp-e-loopback.c
@@ -0,0 +1,231 @@
+#include <stdio.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <stddef.h>
+#include <sys/mman.h>
+#include <linux/usrp_e.h>
+
+#define MAX_PACKET_SIZE 1016
+static int packet_data_length;
+static int error;
+
+struct pkt {
+ int len;
+ int checksum;
+ int seq_num;
+ short data[];
+};
+
+static int length_array[2048];
+static int length_array_tail = 0;
+static int length_array_head = 0;
+
+pthread_mutex_t length_array_mutex; //gotta lock the index to keep it from getting hosed
+
+//yes this is a circular buffer that does not check empty
+//no i don't want to hear about it
+void push_length_array(int length) {
+ pthread_mutex_lock(&length_array_mutex);
+ if(length_array_tail > 2047) length_array_tail = 0;
+ length_array[length_array_tail++] = length;
+ pthread_mutex_unlock(&length_array_mutex);
+}
+
+int pop_length_array(void) {
+ int retval;
+ pthread_mutex_lock(&length_array_mutex);
+ if(length_array_head > 2047) length_array_head = 0;
+ retval = length_array[length_array_head++];
+ pthread_mutex_unlock(&length_array_mutex);
+ return retval;
+}
+
+static int fp;
+
+static int calc_checksum(struct pkt *p)
+{
+ int i, sum;
+
+ i = 0;
+ sum = 0;
+
+ for (i=0; i < p->len; i++)
+ sum ^= p->data[i];
+
+ sum ^= p->seq_num;
+ sum ^= p->len;
+
+ return sum;
+}
+
+static void *read_thread(void *threadid)
+{
+ char *rx_data;
+ int cnt, prev_seq_num, pkt_count, seq_num_failure;
+ struct pkt *p;
+ unsigned long bytes_transfered, elapsed_seconds;
+ struct timeval start_time, finish_time;
+ int expected_count;
+
+ printf("Greetings from the reading thread!\n");
+
+ bytes_transfered = 0;
+ gettimeofday(&start_time, NULL);
+
+ // IMPORTANT: must assume max length packet from fpga
+ rx_data = malloc(2048);
+ p = (struct pkt *) ((void *)rx_data);
+
+ prev_seq_num = 0;
+ pkt_count = 0;
+ seq_num_failure = 0;
+
+ while (1) {
+
+ cnt = read(fp, rx_data, 2048);
+ if (cnt < 0)
+ printf("Error returned from read: %d, sequence number = %d\n", cnt, p->seq_num);
+
+// printf("p->seq_num = %d\n", p->seq_num);
+
+
+ pkt_count++;
+
+ if (p->seq_num != prev_seq_num + 1) {
+ printf("Sequence number fail, current = %d, previous = %d, pkt_count = %d\n",
+ p->seq_num, prev_seq_num, pkt_count);
+
+ seq_num_failure ++;
+ if (seq_num_failure > 2)
+ error = 1;
+ }
+
+ expected_count = pop_length_array()*2+12;
+ if(cnt != expected_count) {
+ printf("Received %d bytes, expected %d\n", cnt, expected_count);
+ }
+
+ prev_seq_num = p->seq_num;
+
+ if (calc_checksum(p) != p->checksum) {
+ printf("Checksum fail packet = %X, expected = %X, pkt_count = %d\n",
+ calc_checksum(p), p->checksum, pkt_count);
+ error = 1;
+ }
+
+ bytes_transfered += cnt;
+
+ if (bytes_transfered > (100 * 1000000)) {
+ gettimeofday(&finish_time, NULL);
+ elapsed_seconds = finish_time.tv_sec - start_time.tv_sec;
+
+ printf("RX data transfer rate = %f K Samples/second\n",
+ (float) bytes_transfered / (float) elapsed_seconds / 4000);
+
+
+ start_time = finish_time;
+ bytes_transfered = 0;
+ }
+
+
+// printf(".");
+// fflush(stdout);
+// printf("\n");
+ }
+
+}
+
+static void *write_thread(void *threadid)
+{
+ int seq_number, i, cnt;
+ void *tx_data;
+ struct pkt *p;
+
+ printf("Greetings from the write thread!\n");
+
+ tx_data = malloc(2048);
+ p = (struct pkt *) ((void *)tx_data);
+
+ for (i=0; i < packet_data_length; i++)
+// p->data[i] = random() >> 16;
+ p->data[i] = i;
+
+ seq_number = 1;
+
+ while (1) {
+ p->seq_num = seq_number++;
+
+ if (packet_data_length > 0)
+ p->len = packet_data_length;
+ else
+ p->len = (random()<<1 & 0x1ff) + (1004 - 512);
+
+ push_length_array(p->len);
+
+ p->checksum = calc_checksum(p);
+
+ cnt = write(fp, tx_data, p->len * 2 + 12);
+ if (cnt < 0)
+ printf("Error returned from write: %d\n", cnt);
+// sleep(1);
+ }
+}
+
+
+int main(int argc, char *argv[])
+{
+ pthread_t tx, rx;
+ pthread_mutex_init(&length_array_mutex, 0);
+ long int t;
+ struct sched_param s = {
+ .sched_priority = 1
+ };
+ void *rb;
+ struct usrp_transfer_frame *tx_rb, *rx_rb;
+
+ if (argc < 2) {
+ printf("%s data_size\n", argv[0]);
+ return -1;
+ }
+
+ packet_data_length = atoi(argv[1]);
+ if(packet_data_length > MAX_PACKET_SIZE) {
+ printf("Packet size must be smaller than %i\n", MAX_PACKET_SIZE);
+ exit(-1);
+ }
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+
+ rb = mmap(0, 202 * 4096, PROT_READ|PROT_WRITE, MAP_SHARED, fp, 0);
+ if (!rb) {
+ printf("mmap failed\n");
+ exit;
+ }
+
+
+ sched_setscheduler(0, SCHED_RR, &s);
+ error = 0;
+
+#if 1
+ if (pthread_create(&rx, NULL, read_thread, (void *) t)) {
+ printf("Failed to create rx thread\n");
+ exit(-1);
+ }
+
+ sleep(1);
+#endif
+
+ if (pthread_create(&tx, NULL, write_thread, (void *) t)) {
+ printf("Failed to create tx thread\n");
+ exit(-1);
+ }
+
+// while (!error)
+ sleep(1000000000);
+
+ printf("Done sleeping\n");
+}
diff --git a/host/utils/usrp-e-spi.c b/host/utils/usrp-e-spi.c
new file mode 100644
index 000000000..5203f56a8
--- /dev/null
+++ b/host/utils/usrp-e-spi.c
@@ -0,0 +1,54 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
+#include <linux/usrp_e.h>
+
+// Usage: usrp_e_spi w|rb slave data
+
+int main(int argc, char *argv[])
+{
+ int fp, slave, length, ret;
+ unsigned int data;
+ struct usrp_e_spi spi_dat;
+
+ if (argc < 5) {
+ printf("Usage: usrp_e_spi w|rb slave transfer_length data\n");
+ exit(-1);
+ }
+
+ slave = atoi(argv[2]);
+ length = atoi(argv[3]);
+ data = atoll(argv[4]);
+
+ printf("Data = %X\n", data);
+
+ fp = open("/dev/usrp_e0", O_RDWR);
+ printf("fp = %d\n", fp);
+ if (fp < 0) {
+ perror("Open failed");
+ return -1;
+ }
+
+// sleep(1);
+
+
+ spi_dat.slave = slave;
+ spi_dat.data = data;
+ spi_dat.length = length;
+ spi_dat.flags = UE_SPI_PUSH_FALL | UE_SPI_LATCH_RISE;
+
+ if (*argv[1] == 'r') {
+ spi_dat.readback = 1;
+ ret = ioctl(fp, USRP_E_SPI, &spi_dat);
+ printf("Ioctl returns: %d, Data returned = %d\n", ret, spi_dat.data);
+ } else {
+ spi_dat.readback = 0;
+ ioctl(fp, USRP_E_SPI, &spi_dat);
+ }
+
+ return 0;
+}
diff --git a/host/utils/usrp_e_regs.hpp b/host/utils/usrp_e_regs.hpp
new file mode 100644
index 000000000..a4f42093e
--- /dev/null
+++ b/host/utils/usrp_e_regs.hpp
@@ -0,0 +1,196 @@
+
+
+////////////////////////////////////////////////////////////////
+//
+// Memory map for embedded wishbone bus
+//
+////////////////////////////////////////////////////////////////
+
+// All addresses are byte addresses. All accesses are word (16-bit) accesses.
+// This means that address bit 0 is usually 0.
+// There are 11 bits of address for the control.
+
+#ifndef __USRP_E_REGS_H
+#define __USRP_E_REGS_H
+
+/////////////////////////////////////////////////////
+// Slave pointers
+
+#define UE_REG_SLAVE(n) ((n)<<7)
+#define UE_REG_SR_ADDR(n) ((UE_REG_SLAVE(5)) + (4*(n)))
+
+/////////////////////////////////////////////////////
+// Slave 0 -- Misc Regs
+
+#define UE_REG_MISC_BASE UE_REG_SLAVE(0)
+
+#define UE_REG_MISC_LED UE_REG_MISC_BASE + 0
+#define UE_REG_MISC_SW UE_REG_MISC_BASE + 2
+#define UE_REG_MISC_CGEN_CTRL UE_REG_MISC_BASE + 4
+#define UE_REG_MISC_CGEN_ST UE_REG_MISC_BASE + 6
+#define UE_REG_MISC_TEST UE_REG_MISC_BASE + 8
+#define UE_REG_MISC_RX_LEN UE_REG_MISC_BASE + 10
+#define UE_REG_MISC_TX_LEN UE_REG_MISC_BASE + 12
+
+/////////////////////////////////////////////////////
+// Slave 1 -- UART
+// CLKDIV is 16 bits, others are only 8
+
+#define UE_REG_UART_BASE UE_REG_SLAVE(1)
+
+#define UE_REG_UART_CLKDIV UE_REG_UART_BASE + 0
+#define UE_REG_UART_TXLEVEL UE_REG_UART_BASE + 2
+#define UE_REG_UART_RXLEVEL UE_REG_UART_BASE + 4
+#define UE_REG_UART_TXCHAR UE_REG_UART_BASE + 6
+#define UE_REG_UART_RXCHAR UE_REG_UART_BASE + 8
+
+/////////////////////////////////////////////////////
+// Slave 2 -- SPI Core
+// This should be accessed through the IOCTL
+// Users should not touch directly
+
+#define UE_REG_SPI_BASE UE_REG_SLAVE(2)
+
+//spi slave constants
+#define UE_SPI_SS_AD9522 (1 << 3)
+#define UE_SPI_SS_AD9862 (1 << 2)
+#define UE_SPI_SS_TX_DB (1 << 1)
+#define UE_SPI_SS_RX_DB (1 << 0)
+
+////////////////////////////////////////////////
+// Slave 3 -- I2C Core
+// This should be accessed through the IOCTL
+// Users should not touch directly
+
+#define UE_REG_I2C_BASE UE_REG_SLAVE(3)
+
+
+////////////////////////////////////////////////
+// Slave 4 -- GPIO
+
+#define UE_REG_GPIO_BASE UE_REG_SLAVE(4)
+
+#define UE_REG_GPIO_RX_IO UE_REG_GPIO_BASE + 0
+#define UE_REG_GPIO_TX_IO UE_REG_GPIO_BASE + 2
+#define UE_REG_GPIO_RX_DDR UE_REG_GPIO_BASE + 4
+#define UE_REG_GPIO_TX_DDR UE_REG_GPIO_BASE + 6
+#define UE_REG_GPIO_RX_SEL UE_REG_GPIO_BASE + 8
+#define UE_REG_GPIO_TX_SEL UE_REG_GPIO_BASE + 10
+#define UE_REG_GPIO_RX_DBG UE_REG_GPIO_BASE + 12
+#define UE_REG_GPIO_TX_DBG UE_REG_GPIO_BASE + 14
+
+//possible bit values for sel when dbg is 0:
+#define GPIO_SEL_SW 0 // if pin is an output, set by software in the io reg
+#define GPIO_SEL_ATR 1 // if pin is an output, set by ATR logic
+
+//possible bit values for sel when dbg is 1:
+#define GPIO_SEL_DEBUG_0 0 // if pin is an output, debug lines from FPGA fabric
+#define GPIO_SEL_DEBUG_1 1 // if pin is an output, debug lines from FPGA fabric
+
+
+////////////////////////////////////////////////////
+// Slave 5 -- Settings Bus
+//
+// Output-only, no readback, 32 registers total
+// Each register must be written 32 bits at a time
+// First the address xxx_xx00 and then xxx_xx10
+
+#define UE_REG_SETTINGS_BASE UE_REG_SLAVE(5)
+
+///////////////////////////////////////////////////
+// Slave 6 -- ATR Controller
+// 16 regs
+
+#define UE_REG_ATR_BASE UE_REG_SLAVE(6)
+
+#define UE_REG_ATR_IDLE_RXSIDE UE_REG_ATR_BASE + 0
+#define UE_REG_ATR_IDLE_TXSIDE UE_REG_ATR_BASE + 2
+#define UE_REG_ATR_INTX_RXSIDE UE_REG_ATR_BASE + 4
+#define UE_REG_ATR_INTX_TXSIDE UE_REG_ATR_BASE + 6
+#define UE_REG_ATR_INRX_RXSIDE UE_REG_ATR_BASE + 8
+#define UE_REG_ATR_INRX_TXSIDE UE_REG_ATR_BASE + 10
+#define UE_REG_ATR_FULL_RXSIDE UE_REG_ATR_BASE + 12
+#define UE_REG_ATR_FULL_TXSIDE UE_REG_ATR_BASE + 14
+
+/////////////////////////////////////////////////
+// DSP RX Regs
+////////////////////////////////////////////////
+#define UE_REG_DSP_RX_FREQ UE_REG_SR_ADDR(0)
+#define UE_REG_DSP_RX_SCALE_IQ UE_REG_SR_ADDR(1) // {scale_i,scale_q}
+#define UE_REG_DSP_RX_DECIM_RATE UE_REG_SR_ADDR(2) // hb and decim rate
+#define UE_REG_DSP_RX_DCOFFSET_I UE_REG_SR_ADDR(3) // Bit 31 high sets fixed offset mode, using lower 14 bits, // otherwise it is automatic
+#define UE_REG_DSP_RX_DCOFFSET_Q UE_REG_SR_ADDR(4) // Bit 31 high sets fixed offset mode, using lower 14 bits
+#define UE_REG_DSP_RX_MUX UE_REG_SR_ADDR(5)
+
+///////////////////////////////////////////////////
+// VITA RX CTRL regs
+///////////////////////////////////////////////////
+// The following 3 are logically a single command register.
+// They are clocked into the underlying fifo when time_ticks is written.
+#define UE_REG_CTRL_RX_STREAM_CMD UE_REG_SR_ADDR(8) // {now, chain, num_samples(30)
+#define UE_REG_CTRL_RX_TIME_SECS UE_REG_SR_ADDR(9)
+#define UE_REG_CTRL_RX_TIME_TICKS UE_REG_SR_ADDR(10)
+#define UE_REG_CTRL_RX_CLEAR_OVERRUN UE_REG_SR_ADDR(11) // write anything to clear overrun
+#define UE_REG_CTRL_RX_VRT_HEADER UE_REG_SR_ADDR(12) // word 0 of packet. FPGA fills in packet counter
+#define UE_REG_CTRL_RX_VRT_STREAM_ID UE_REG_SR_ADDR(13) // word 1 of packet.
+#define UE_REG_CTRL_RX_VRT_TRAILER UE_REG_SR_ADDR(14)
+#define UE_REG_CTRL_RX_NSAMPS_PER_PKT UE_REG_SR_ADDR(15)
+#define UE_REG_CTRL_RX_NCHANNELS UE_REG_SR_ADDR(16) // 1 in basic case, up to 4 for vector sources
+
+/////////////////////////////////////////////////
+// DSP TX Regs
+////////////////////////////////////////////////
+#define UE_REG_DSP_TX_FREQ UE_REG_SR_ADDR(17)
+#define UE_REG_DSP_TX_SCALE_IQ UE_REG_SR_ADDR(18) // {scale_i,scale_q}
+#define UE_REG_DSP_TX_INTERP_RATE UE_REG_SR_ADDR(19)
+#define UE_REG_DSP_TX_UNUSED UE_REG_SR_ADDR(20)
+#define UE_REG_DSP_TX_MUX UE_REG_SR_ADDR(21)
+
+/////////////////////////////////////////////////
+// VITA TX CTRL regs
+////////////////////////////////////////////////
+#define UE_REG_CTRL_TX_NCHANNELS UE_REG_SR_ADDR(24)
+#define UE_REG_CTRL_TX_CLEAR_UNDERRUN UE_REG_SR_ADDR(25)
+#define UE_REG_CTRL_TX_REPORT_SID UE_REG_SR_ADDR(26)
+#define UE_REG_CTRL_TX_POLICY UE_REG_SR_ADDR(27)
+
+#define UE_FLAG_CTRL_TX_POLICY_WAIT (0x1 << 0)
+#define UE_FLAG_CTRL_TX_POLICY_NEXT_PACKET (0x1 << 1)
+#define UE_FLAG_CTRL_TX_POLICY_NEXT_BURST (0x1 << 2)
+
+/////////////////////////////////////////////////
+// VITA49 64 bit time (write only)
+////////////////////////////////////////////////
+ /*!
+ * \brief Time 64 flags
+ *
+ * <pre>
+ *
+ * 3 2 1
+ * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
+ * +-----------------------------------------------------------+-+-+
+ * | |S|P|
+ * +-----------------------------------------------------------+-+-+
+ *
+ * P - PPS edge selection (0=negedge, 1=posedge, default=0)
+ * S - Source (0=sma, 1=mimo, 0=default)
+ *
+ * </pre>
+ */
+#define UE_REG_TIME64_SECS UE_REG_SR_ADDR(28) // value to set absolute secs to on next PPS
+#define UE_REG_TIME64_TICKS UE_REG_SR_ADDR(29) // value to set absolute ticks to on next PPS
+#define UE_REG_TIME64_FLAGS UE_REG_SR_ADDR(30) // flags - see chart above
+#define UE_REG_TIME64_IMM UE_REG_SR_ADDR(31) // set immediate (0=latch on next pps, 1=latch immediate, default=0)
+#define UE_REG_TIME64_TPS UE_REG_SR_ADDR(31) // clock ticks per second (counter rollover)
+
+//pps flags (see above)
+#define UE_FLAG_TIME64_PPS_NEGEDGE (0 << 0)
+#define UE_FLAG_TIME64_PPS_POSEDGE (1 << 0)
+#define UE_FLAG_TIME64_PPS_SMA (0 << 1)
+#define UE_FLAG_TIME64_PPS_MIMO (1 << 1)
+
+#define UE_FLAG_TIME64_LATCH_NOW 1
+#define UE_FLAG_TIME64_LATCH_NEXT_PPS 0
+
+#endif
+
diff --git a/host/utils/usrp_n2xx_net_burner.py b/host/utils/usrp_n2xx_net_burner.py
index 456f273df..21327e0af 100755
--- a/host/utils/usrp_n2xx_net_burner.py
+++ b/host/utils/usrp_n2xx_net_burner.py
@@ -16,7 +16,6 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
-# TODO: make it work
# TODO: make it autodetect UHD devices
# TODO: you should probably watch sequence numbers
@@ -36,7 +35,7 @@ UDP_MAX_XFER_BYTES = 1024
UDP_TIMEOUT = 3
UDP_POLL_INTERVAL = 0.10 #in seconds
-USRP2_FW_PROTO_VERSION = 6
+USRP2_FW_PROTO_VERSION = 7
#from bootloader_utils.h
diff --git a/images/Makefile b/images/Makefile
index 79e7b3362..228b6fb7d 100644
--- a/images/Makefile
+++ b/images/Makefile
@@ -78,22 +78,22 @@ $(_usrp1_fpga_4rx_rbf):
cp $(_usrp1_fpga_dir)/std_4rx_0tx.rbf $@
########################################################################
-# USRP2/2+ firmware
+# USRP2 and USRP-N2XX firmware
########################################################################
ifdef HAS_MB_GCC
_usrp2_fw_dir = $(TOP_FW_DIR)/microblaze
_usrp2_fw_bin = $(BUILT_IMAGES_DIR)/usrp2_fw.bin
-_usrp2p_fw_bin = $(BUILT_IMAGES_DIR)/usrp2p_fw.bin
+_usrp_n2xx_fw_bin = $(BUILT_IMAGES_DIR)/usrp_n2xx_fw.bin
IMAGES_LIST += $(_usrp2_fw_bin)
-$(_usrp2_fw_bin):
+$(_usrp2_fw_bin) $(_usrp_n2xx_fw_bin):
cd $(_usrp2_fw_dir) && ./bootstrap
cd $(_usrp2_fw_dir) && ./configure --host=mb
make -C $(_usrp2_fw_dir) clean
make -C $(_usrp2_fw_dir) all
cp $(_usrp2_fw_dir)/usrp2/usrp2_txrx_uhd.bin $(_usrp2_fw_bin)
- cp $(_usrp2_fw_dir)/usrp2p/usrp2p_txrx_uhd.bin $(_usrp2p_fw_bin)
+ cp $(_usrp2_fw_dir)/usrp2p/usrp2p_txrx_uhd.bin $(_usrp_n2xx_fw_bin)
endif
@@ -114,18 +114,34 @@ $(_usrp2_fpga_bin):
endif
########################################################################
-# USRP2 fpga
+# USRP-N210 fpga
+########################################################################
+ifdef HAS_XTCLSH
+
+_usrp_n210_fpga_dir = $(TOP_FPGA_DIR)/usrp2/top/u2plus
+_usrp_n210_fpga_bin = $(BUILT_IMAGES_DIR)/usrp_n210_fpga.bin
+IMAGES_LIST += $(_usrp_n210_fpga_bin)
+
+$(_usrp_n210_fpga_bin):
+ cd $(_usrp_n210_fpga_dir) && make clean
+ cd $(_usrp_n210_fpga_dir) && make bin
+ cp $(_usrp_n210_fpga_dir)/build/u2plus.bin $@
+
+endif
+
+########################################################################
+# USRP-E100 fpga
########################################################################
ifdef HAS_XTCLSH
-_usrp2p_fpga_dir = $(TOP_FPGA_DIR)/usrp2/top/u2plus
-_usrp2p_fpga_bin = $(BUILT_IMAGES_DIR)/usrp2p_fpga.bin
-IMAGES_LIST += $(_usrp2p_fpga_bin)
+_usrp_e100_fpga_dir = $(TOP_FPGA_DIR)/usrp2/top/u1e
+_usrp_e100_fpga_bin = $(BUILT_IMAGES_DIR)/usrp_e100_fpga.bin
+IMAGES_LIST += $(_usrp_e100_fpga_bin)
-$(_usrp2p_fpga_bin):
- cd $(_usrp2p_fpga_dir) && make -f Makefile.udp clean
- cd $(_usrp2p_fpga_dir) && make -f Makefile.udp bin
- cp $(_usrp2p_fpga_dir)/build-ISE12/u2plus.bin $@
+$(_usrp_e100_fpga_bin):
+ cd $(_usrp_e100_fpga_dir) && make clean
+ cd $(_usrp_e100_fpga_dir) && make bin
+ cp $(_usrp_e100_fpga_dir)/build/u1e.bin $@
endif