From bc616fd3bf217268aaab55de395786cdf7c6a753 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 28 Dec 2023 14:22:29 -0800 Subject: [PATCH 01/89] inital source, imported from splat --- .DS_Store | Bin 0 -> 6148 bytes .github/workflows/build_docs.yml | 4 +- .github/workflows/build_examples.yml | 25 - .github/workflows/functional_simulation.yml | 29 - ...{formal_verification.yml => run_tests.yml} | 22 +- .gitignore | 35 +- Makefile | 121 +--- README.md | 4 +- examples/icestick/io_core/manta.yaml | 16 - examples/icestick/io_core/run_io_core.py | 45 -- examples/icestick/io_core/top_level.pcf | 67 -- examples/icestick/io_core/top_level.sv | 32 - .../nexys_a7/block_mem_uart/api_example.py | 18 - examples/nexys_a7/block_mem_uart/manta.yaml | 11 - .../nexys_a7/block_mem_uart/src/top_level.sv | 24 - .../nexys_a7/block_mem_uart/xdc/top_level.xdc | 254 -------- examples/nexys_a7/build.tcl | 37 -- .../nexys_a7/io_core_ether/api_example.py | 40 -- examples/nexys_a7/io_core_ether/manta.yaml | 25 - .../nexys_a7/io_core_ether/src/divider.sv | 193 ------ .../nexys_a7/io_core_ether/src/top_level.sv | 61 -- .../nexys_a7/io_core_ether/xdc/top_level.xdc | 254 -------- examples/nexys_a7/io_core_uart/api_example.py | 40 -- examples/nexys_a7/io_core_uart/manta.yaml | 26 - .../nexys_a7/io_core_uart/src/top_level.sv | 48 -- .../nexys_a7/io_core_uart/xdc/top_level.xdc | 254 -------- .../nexys_a7/large_io_core_uart/manta.yaml | 23 - .../large_io_core_uart/src/top_level.sv | 32 - examples/nexys_a7/large_io_core_uart/test.py | 26 - .../large_io_core_uart/xdc/top_level.xdc | 254 -------- .../nexys_a7/logic_analyzer_uart/manta.yaml | 20 - .../logic_analyzer_uart/sim/playback.v | 58 -- .../logic_analyzer_uart/sim/playback_tb.sv | 38 -- .../logic_analyzer_uart/src/top_level.sv | 28 - .../logic_analyzer_uart/xdc/top_level.xdc | 254 -------- .../nexys_a7/ps2_logic_analyzer/manta.yaml | 18 - .../ps2_logic_analyzer/sim/playback.v | 52 -- .../ps2_logic_analyzer/sim/playback_tb.sv | 80 --- .../ps2_logic_analyzer/src/top_level.sv | 25 - .../ps2_logic_analyzer/xdc/top_level.xdc | 254 -------- .../video_sprite_ether/img/buff_doge.png | Bin 69692 -> 0 bytes .../video_sprite_ether/img/no_testbenches.png | Bin 94971 -> 0 bytes .../video_sprite_ether/img/pop_cat.png | Bin 59936 -> 0 bytes .../nexys_a7/video_sprite_ether/manta.yaml | 10 - .../nexys_a7/video_sprite_ether/send_image.py | 37 -- .../nexys_a7/video_sprite_ether/src/clk_gen.v | 207 ------- .../video_sprite_ether/src/top_level.sv | 108 ---- .../nexys_a7/video_sprite_ether/src/vga.sv | 68 -- .../video_sprite_ether/xdc/top_level.xdc | 253 -------- .../video_sprite_uart/img/buff_doge.png | Bin 69692 -> 0 bytes .../video_sprite_uart/img/no_testbenches.png | Bin 94971 -> 0 bytes .../video_sprite_uart/img/pop_cat.png | Bin 59936 -> 0 bytes .../nexys_a7/video_sprite_uart/manta.yaml | 11 - .../nexys_a7/video_sprite_uart/send_image.py | 37 -- .../nexys_a7/video_sprite_uart/src/clk_gen.v | 207 ------- .../video_sprite_uart/src/top_level.sv | 96 --- .../nexys_a7/video_sprite_uart/src/vga.sv | 68 -- .../video_sprite_uart/xdc/top_level.xdc | 253 -------- pyproject.toml | 16 +- src/manta/__init__.py | 384 +----------- src/manta/__main__.py | 4 +- src/manta/block_mem_core/__init__.py | 77 --- src/manta/block_mem_core/block_memory.v | 114 ---- .../block_mem_core/block_memory_inst_tmpl.v | 21 - src/manta/block_mem_core/dual_port_bram.v | 60 -- src/manta/cli.py | 126 ++++ src/manta/ether_iface/__init__.py | 208 ------- src/manta/ether_iface/aggregate.v | 46 -- src/manta/ether_iface/bitorder.v | 114 ---- src/manta/ether_iface/cksum.v | 80 --- src/manta/ether_iface/crc32.v | 70 --- src/manta/ether_iface/ether.v | 77 --- src/manta/ether_iface/ethernet_rx.v | 41 -- src/manta/ether_iface/ethernet_rx_inst_tmpl.v | 13 - src/manta/ether_iface/ethernet_tx.v | 40 -- src/manta/ether_iface/ethernet_tx_inst_tmpl.v | 13 - src/manta/ether_iface/firewall.v | 80 --- src/manta/ether_iface/mac_rx.v | 106 ---- src/manta/ether_iface/mac_tx.v | 242 -------- src/manta/io_core.py | 260 ++++++++ src/manta/io_core/__init__.py | 213 ------- src/manta/io_core/io_core_def_tmpl.v | 77 --- src/manta/io_core/io_core_inst_tmpl.v | 18 - src/manta/la_core/__init__.py | 463 -------------- src/manta/la_core/logic_analyzer_controller.v | 92 --- src/manta/la_core/logic_analyzer_def_tmpl.v | 142 ----- .../la_core/logic_analyzer_fsm_registers.v | 75 --- src/manta/la_core/logic_analyzer_inst_tmpl.v | 14 - .../la_core/logic_analyzer_playback_tmpl.v | 50 -- src/manta/la_core/trigger.v | 45 -- src/manta/la_core/trigger_block_def_tmpl.v | 62 -- src/manta/la_core/trigger_block_inst_tmpl.v | 11 - src/manta/logic_analyzer_core.py | 558 +++++++++++++++++ src/manta/manta.py | 170 +++++ src/manta/manta_def_tmpl.v | 34 - src/manta/memory_core.py | 205 ++++++ src/manta/uart.py | 583 ++++++++++++++++++ src/manta/uart_iface/__init__.py | 186 ------ src/manta/uart_iface/bridge_rx.v | 150 ----- src/manta/uart_iface/bridge_tx.v | 70 --- src/manta/uart_iface/uart_rx.v | 62 -- .../uart_iface/uart_rx_bridge_rx_inst_tmpl.v | 20 - src/manta/uart_iface/uart_tx.v | 61 -- .../uart_iface/uart_tx_bridge_tx_inst_tmpl.v | 23 - src/manta/utils.py | 223 +++---- .../invalid_configs/0_mangled_yaml.yaml | 26 - .../invalid_configs/1_mangled_yaml.yaml | 26 - .../invalid_configs/2_mangled_yaml.yaml | 26 - test/auto_gen/run_tests.py | 56 -- test/auto_gen/valid_configs/0_io_core.yaml | 26 - .../valid_configs/1_logic_analyzer.yaml | 19 - test/formal_verification/bridge_rx.sby | 29 - test/functional_sim/block_memory_tb.sv | 182 ------ test/functional_sim/bridge_rx_tb.sv | 185 ------ test/functional_sim/bridge_tx_tb.sv | 116 ---- test/functional_sim/ethernet_rx_tb.sv | 98 --- test/functional_sim/ethernet_tx_tb.sv | 121 ---- test/functional_sim/io_core_tb/io_core.v | 118 ---- test/functional_sim/io_core_tb/io_core_tb.sv | 277 --------- .../logic_analyzer_tb/logic_analyzer_tb.sv | 257 -------- .../logic_analyzer_tb/manta.yaml | 19 - test/functional_sim/mac_tb.sv | 86 --- test/functional_sim/uart_rx_tb.sv | 94 --- test/functional_sim/uart_tx_tb.sv | 99 --- test/test_bridge_rx_sim.py | 120 ++++ test/test_bridge_tx_sim.py | 67 ++ test/test_io_core_hw.py | 129 ++++ test/test_io_core_sim.py | 155 +++++ test/test_logic_analyzer_hw.py | 84 +++ test/test_logic_analyzer_sim.py | 140 +++++ test/test_mem_core_hw.py | 114 ++++ test/test_mem_core_sim.py | 45 ++ test/test_toolchains.py | 15 + test/test_uart_rx_sim.py | 65 ++ test/test_uart_tx_sim.py | 57 ++ test/test_verilog_gen.py | 14 + .../manta.yaml => test_verilog_gen.yaml} | 15 +- 137 files changed, 3071 insertions(+), 9810 deletions(-) create mode 100644 .DS_Store delete mode 100644 .github/workflows/build_examples.yml delete mode 100644 .github/workflows/functional_simulation.yml rename .github/workflows/{formal_verification.yml => run_tests.yml} (53%) delete mode 100644 examples/icestick/io_core/manta.yaml delete mode 100644 examples/icestick/io_core/run_io_core.py delete mode 100644 examples/icestick/io_core/top_level.pcf delete mode 100644 examples/icestick/io_core/top_level.sv delete mode 100644 examples/nexys_a7/block_mem_uart/api_example.py delete mode 100644 examples/nexys_a7/block_mem_uart/manta.yaml delete mode 100644 examples/nexys_a7/block_mem_uart/src/top_level.sv delete mode 100644 examples/nexys_a7/block_mem_uart/xdc/top_level.xdc delete mode 100644 examples/nexys_a7/build.tcl delete mode 100644 examples/nexys_a7/io_core_ether/api_example.py delete mode 100644 examples/nexys_a7/io_core_ether/manta.yaml delete mode 100644 examples/nexys_a7/io_core_ether/src/divider.sv delete mode 100644 examples/nexys_a7/io_core_ether/src/top_level.sv delete mode 100644 examples/nexys_a7/io_core_ether/xdc/top_level.xdc delete mode 100644 examples/nexys_a7/io_core_uart/api_example.py delete mode 100644 examples/nexys_a7/io_core_uart/manta.yaml delete mode 100644 examples/nexys_a7/io_core_uart/src/top_level.sv delete mode 100644 examples/nexys_a7/io_core_uart/xdc/top_level.xdc delete mode 100644 examples/nexys_a7/large_io_core_uart/manta.yaml delete mode 100644 examples/nexys_a7/large_io_core_uart/src/top_level.sv delete mode 100644 examples/nexys_a7/large_io_core_uart/test.py delete mode 100644 examples/nexys_a7/large_io_core_uart/xdc/top_level.xdc delete mode 100644 examples/nexys_a7/logic_analyzer_uart/manta.yaml delete mode 100644 examples/nexys_a7/logic_analyzer_uart/sim/playback.v delete mode 100644 examples/nexys_a7/logic_analyzer_uart/sim/playback_tb.sv delete mode 100644 examples/nexys_a7/logic_analyzer_uart/src/top_level.sv delete mode 100644 examples/nexys_a7/logic_analyzer_uart/xdc/top_level.xdc delete mode 100644 examples/nexys_a7/ps2_logic_analyzer/manta.yaml delete mode 100644 examples/nexys_a7/ps2_logic_analyzer/sim/playback.v delete mode 100644 examples/nexys_a7/ps2_logic_analyzer/sim/playback_tb.sv delete mode 100644 examples/nexys_a7/ps2_logic_analyzer/src/top_level.sv delete mode 100644 examples/nexys_a7/ps2_logic_analyzer/xdc/top_level.xdc delete mode 100644 examples/nexys_a7/video_sprite_ether/img/buff_doge.png delete mode 100644 examples/nexys_a7/video_sprite_ether/img/no_testbenches.png delete mode 100644 examples/nexys_a7/video_sprite_ether/img/pop_cat.png delete mode 100644 examples/nexys_a7/video_sprite_ether/manta.yaml delete mode 100644 examples/nexys_a7/video_sprite_ether/send_image.py delete mode 100644 examples/nexys_a7/video_sprite_ether/src/clk_gen.v delete mode 100644 examples/nexys_a7/video_sprite_ether/src/top_level.sv delete mode 100644 examples/nexys_a7/video_sprite_ether/src/vga.sv delete mode 100644 examples/nexys_a7/video_sprite_ether/xdc/top_level.xdc delete mode 100644 examples/nexys_a7/video_sprite_uart/img/buff_doge.png delete mode 100644 examples/nexys_a7/video_sprite_uart/img/no_testbenches.png delete mode 100644 examples/nexys_a7/video_sprite_uart/img/pop_cat.png delete mode 100644 examples/nexys_a7/video_sprite_uart/manta.yaml delete mode 100644 examples/nexys_a7/video_sprite_uart/send_image.py delete mode 100644 examples/nexys_a7/video_sprite_uart/src/clk_gen.v delete mode 100644 examples/nexys_a7/video_sprite_uart/src/top_level.sv delete mode 100644 examples/nexys_a7/video_sprite_uart/src/vga.sv delete mode 100644 examples/nexys_a7/video_sprite_uart/xdc/top_level.xdc delete mode 100644 src/manta/block_mem_core/__init__.py delete mode 100644 src/manta/block_mem_core/block_memory.v delete mode 100644 src/manta/block_mem_core/block_memory_inst_tmpl.v delete mode 100644 src/manta/block_mem_core/dual_port_bram.v create mode 100644 src/manta/cli.py delete mode 100644 src/manta/ether_iface/__init__.py delete mode 100644 src/manta/ether_iface/aggregate.v delete mode 100644 src/manta/ether_iface/bitorder.v delete mode 100644 src/manta/ether_iface/cksum.v delete mode 100644 src/manta/ether_iface/crc32.v delete mode 100644 src/manta/ether_iface/ether.v delete mode 100644 src/manta/ether_iface/ethernet_rx.v delete mode 100644 src/manta/ether_iface/ethernet_rx_inst_tmpl.v delete mode 100644 src/manta/ether_iface/ethernet_tx.v delete mode 100644 src/manta/ether_iface/ethernet_tx_inst_tmpl.v delete mode 100644 src/manta/ether_iface/firewall.v delete mode 100644 src/manta/ether_iface/mac_rx.v delete mode 100644 src/manta/ether_iface/mac_tx.v create mode 100644 src/manta/io_core.py delete mode 100644 src/manta/io_core/__init__.py delete mode 100644 src/manta/io_core/io_core_def_tmpl.v delete mode 100644 src/manta/io_core/io_core_inst_tmpl.v delete mode 100644 src/manta/la_core/__init__.py delete mode 100644 src/manta/la_core/logic_analyzer_controller.v delete mode 100644 src/manta/la_core/logic_analyzer_def_tmpl.v delete mode 100644 src/manta/la_core/logic_analyzer_fsm_registers.v delete mode 100644 src/manta/la_core/logic_analyzer_inst_tmpl.v delete mode 100644 src/manta/la_core/logic_analyzer_playback_tmpl.v delete mode 100644 src/manta/la_core/trigger.v delete mode 100644 src/manta/la_core/trigger_block_def_tmpl.v delete mode 100644 src/manta/la_core/trigger_block_inst_tmpl.v create mode 100644 src/manta/logic_analyzer_core.py create mode 100644 src/manta/manta.py delete mode 100644 src/manta/manta_def_tmpl.v create mode 100644 src/manta/memory_core.py create mode 100644 src/manta/uart.py delete mode 100644 src/manta/uart_iface/__init__.py delete mode 100644 src/manta/uart_iface/bridge_rx.v delete mode 100644 src/manta/uart_iface/bridge_tx.v delete mode 100644 src/manta/uart_iface/uart_rx.v delete mode 100644 src/manta/uart_iface/uart_rx_bridge_rx_inst_tmpl.v delete mode 100644 src/manta/uart_iface/uart_tx.v delete mode 100644 src/manta/uart_iface/uart_tx_bridge_tx_inst_tmpl.v delete mode 100644 test/auto_gen/invalid_configs/0_mangled_yaml.yaml delete mode 100644 test/auto_gen/invalid_configs/1_mangled_yaml.yaml delete mode 100644 test/auto_gen/invalid_configs/2_mangled_yaml.yaml delete mode 100644 test/auto_gen/run_tests.py delete mode 100644 test/auto_gen/valid_configs/0_io_core.yaml delete mode 100644 test/auto_gen/valid_configs/1_logic_analyzer.yaml delete mode 100644 test/formal_verification/bridge_rx.sby delete mode 100644 test/functional_sim/block_memory_tb.sv delete mode 100644 test/functional_sim/bridge_rx_tb.sv delete mode 100644 test/functional_sim/bridge_tx_tb.sv delete mode 100644 test/functional_sim/ethernet_rx_tb.sv delete mode 100644 test/functional_sim/ethernet_tx_tb.sv delete mode 100644 test/functional_sim/io_core_tb/io_core.v delete mode 100644 test/functional_sim/io_core_tb/io_core_tb.sv delete mode 100644 test/functional_sim/logic_analyzer_tb/logic_analyzer_tb.sv delete mode 100644 test/functional_sim/logic_analyzer_tb/manta.yaml delete mode 100644 test/functional_sim/mac_tb.sv delete mode 100644 test/functional_sim/uart_rx_tb.sv delete mode 100644 test/functional_sim/uart_tx_tb.sv create mode 100644 test/test_bridge_rx_sim.py create mode 100644 test/test_bridge_tx_sim.py create mode 100644 test/test_io_core_hw.py create mode 100644 test/test_io_core_sim.py create mode 100644 test/test_logic_analyzer_hw.py create mode 100644 test/test_logic_analyzer_sim.py create mode 100644 test/test_mem_core_hw.py create mode 100644 test/test_mem_core_sim.py create mode 100644 test/test_toolchains.py create mode 100644 test/test_uart_rx_sim.py create mode 100644 test/test_uart_tx_sim.py create mode 100644 test/test_verilog_gen.py rename test/{functional_sim/io_core_tb/manta.yaml => test_verilog_gen.yaml} (53%) diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..81229e8d26382bd3469cb3d9bb2de3f1954844ac GIT binary patch literal 6148 zcmeH~Jqp4=5QS&dB4Cr!avKle4VIuM@B*S@B?yZB9^E%TjnP_yyn&f-XEsBUS7b9H zqQmpN5$Q#wgBxXSVPuMYE)TiO>2iLYjtb*@FJ*K=2U&T%hcRwa*e@u>x3=Er<$CqZN!+^)bZi z-VT<$t|nVB+C_8t(7dzS6a&*}7cEF&S{)2jfC`Khm`C2*`M-mIoBu~GOsN1B_%j7` zvE6S6yi}g8AFpTiLso6w;GkcQ@b(jc#E#+>+ztE17GO=bASy8a2)GOkRN$uyya2`( B5q1Co literal 0 HcmV?d00001 diff --git a/.github/workflows/build_docs.yml b/.github/workflows/build_docs.yml index 3c0d632..ef4ca38 100644 --- a/.github/workflows/build_docs.yml +++ b/.github/workflows/build_docs.yml @@ -1,4 +1,4 @@ -name: build_docs +name: docs_site on: push: branches: @@ -17,5 +17,5 @@ jobs: with: key: ${{ github.ref }} path: .cache - - run: pip install mkdocs-material + - run: pip install mkdocs-material - run: mkdocs gh-deploy --force diff --git a/.github/workflows/build_examples.yml b/.github/workflows/build_examples.yml deleted file mode 100644 index a9c0598..0000000 --- a/.github/workflows/build_examples.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: build_examples -on: [push] -jobs: - examples: - runs-on: self-hosted - steps: - - uses: actions/checkout@v3 - - name: Install Manta from source - run: | - pip install setuptools --upgrade - - # omitting the following commmand causes the version of setuptools - # used by python to get confused, and it doesn't detect the name - # or version of the package from pyproject.toml - so the following - # workaround is used: - # https://github.com/pypa/setuptools/issues/3269#issuecomment-1254507377 - export DEB_PYTHON_INSTALL_LAYOUT=deb_system - - python3 -m pip install . - - - name: Build Nexys A7 examples - run: make nexys_a7 - - - name: Build Icestick examples - run: make icestick diff --git a/.github/workflows/functional_simulation.yml b/.github/workflows/functional_simulation.yml deleted file mode 100644 index 1232960..0000000 --- a/.github/workflows/functional_simulation.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: functional_simulation -on: [push] -jobs: - all: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - - name: Install Manta from Source - run: | - pip install setuptools --upgrade - - # omitting the following commmand causes the version of setuptools - # used by python to get confused, and it doesn't detect the name - # or version of the package from pyproject.toml - so the following - # workaround is used: - # https://github.com/pypa/setuptools/issues/3269#issuecomment-1254507377 - export DEB_PYTHON_INSTALL_LAYOUT=deb_system - - python3 -m pip install . - - - name: Install oss-cad-suite - run: | - wget --no-verbose https://github.com/YosysHQ/oss-cad-suite-build/releases/download/2023-02-23/oss-cad-suite-linux-x64-20230223.tgz - tar -xzf oss-cad-suite-linux-x64-20230223.tgz - echo "$(pwd)/oss-cad-suite/bin" >> $GITHUB_PATH - - - name: Run functional simulations - run: make sim \ No newline at end of file diff --git a/.github/workflows/formal_verification.yml b/.github/workflows/run_tests.yml similarity index 53% rename from .github/workflows/formal_verification.yml rename to .github/workflows/run_tests.yml index 3b548cc..331fb58 100644 --- a/.github/workflows/formal_verification.yml +++ b/.github/workflows/run_tests.yml @@ -1,4 +1,4 @@ -name: formal_verification +name: run_tests on: [push] jobs: all: @@ -8,7 +8,7 @@ jobs: - name: Install Manta from Source run: | - pip install setuptools --upgrade + python -m pip install -U pip # omitting the following commmand causes the version of setuptools # used by python to get confused, and it doesn't detect the name @@ -17,13 +17,15 @@ jobs: # https://github.com/pypa/setuptools/issues/3269#issuecomment-1254507377 export DEB_PYTHON_INSTALL_LAYOUT=deb_system - python3 -m pip install . + python -m pip install ".[dev]" - - name: Install oss-cad-suite - run: | - wget --no-verbose https://github.com/YosysHQ/oss-cad-suite-build/releases/download/2023-02-23/oss-cad-suite-linux-x64-20230223.tgz - tar -xzf oss-cad-suite-linux-x64-20230223.tgz - echo "$(pwd)/oss-cad-suite/bin" >> $GITHUB_PATH + # export tool paths + export VIVADO=/tools/Xilinx/Vivado/2023.1/bin/vivado + export YOSYS=/tools/oss-cad-suite/bin/yosys + export NEXTPNR_ICE40=/tools/oss-cad-suite/bin/nextpnr_ice40 + export ICEPACK=/tools/oss-cad-suite/bin/icepack + export ICEPROG=/tools/oss-cad-suite/bin/iceprog - - name: Run formal verification - run: make formal \ No newline at end of file + + - name: Run tests + run: make test \ No newline at end of file diff --git a/.gitignore b/.gitignore index 39837fb..8fb17e5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,33 +1,10 @@ -# Hidden files -.DS_Store -*.vscode/ - -# Python outputs venv/ -dist/ -build/ -*.egg-info +manta.egg-info/ +.pytest_cache __pycache__/ +build/ -# Vivado output products -*.Xil/ -*.log -*.jou -*.rpt -*.bit -cpu_impl_netlist.v - -# IceStorm output products -*.bin - -# iVerilog output products +*.v +*.sv *.vcd -*.out - -# Formal outputs -test/formal_verification/*_basic -test/formal_verification/*_cover - -# Manta output products -manta.v -*.mem \ No newline at end of file +*.out \ No newline at end of file diff --git a/Makefile b/Makefile index b0ecfe5..c22f0d1 100644 --- a/Makefile +++ b/Makefile @@ -1,123 +1,12 @@ -# Tool Paths -VIVADO=/tools/Xilinx/Vivado/2023.1/bin/vivado -YOSYS=/tools/oss-cad-suite/bin/yosys -NEXTPNR_ICE40=/tools/oss-cad-suite/bin/nextpnr-ice40 -ICEPACK=/tools/oss-cad-suite/bin/icepack +.PHONY: test format clean serve_docs +test: + pytest -test: auto_gen sim formal - -examples: icestick nexys_a7 +format: + black . clean: - @echo "Deleting everything matched by .gitignore" git clean -Xdf serve_docs: mkdocs serve - -# Python Operations -python_build: - python3 -m build - -pypi_upload: build - python3 -m twine upload --repository testpypi dist/* - -python_lint: - python3 -m black src/manta/__init__.py - python3 -m black src/manta/__main__.py - -# API Generation Tests -auto_gen: - python3 test/auto_gen/run_tests.py - -# Build Examples -NEXYS_A7_EXAMPLES := io_core_ether io_core_uart ps2_logic_analyzer video_sprite_ether video_sprite_uart block_mem_uart logic_analyzer_uart large_io_core_uart - -.PHONY: nexys_a7 $(NEXYS_A7_EXAMPLES) -nexys_a7: $(NEXYS_A7_EXAMPLES) - -$(NEXYS_A7_EXAMPLES): - cd examples/nexys_a7/$@; \ - python3 -m manta gen manta.yaml src/manta.v; \ - rm -rf obj; \ - mkdir -p obj; \ - $(VIVADO) -mode batch \ - -source ../build.tcl \ - -log obj/build.log \ - -jou obj/build.jou; \ - rm -rf .Xil; - -ICESTICK_EXAMPLES := io_core - -.PHONY: icestick $(ICESTICK_EXAMPLES) -icestick: $(ICESTICK_EXAMPLES) - -$(ICESTICK_EXAMPLES): - cd examples/icestick/$@; \ - python3 -m manta gen manta.yaml manta.v; \ - $(YOSYS) -p 'synth_ice40 -top top_level -json top_level.json' top_level.sv; \ - $(NEXTPNR_ICE40) --hx1k --json top_level.json --pcf top_level.pcf --asc top_level.asc; \ - $(ICEPACK) top_level.asc top_level.bin; \ - rm -f *.json; \ - rm -f *.asc; - -# Formal Verification -formal: - sby -f test/formal_verification/bridge_rx.sby - -# Functional Simulation -sim: ethernet_tx_tb ethernet_rx_tb mac_tb block_memory_tb io_core_tb logic_analyzer_tb bridge_rx_tb bridge_tx_tb block_memory_tb - -ethernet_tx_tb: - iverilog -g2012 -o sim.out -y src/manta/ether_iface test/functional_sim/ethernet_tx_tb.sv - vvp sim.out - rm sim.out - -ethernet_rx_tb: - iverilog -g2012 -o sim.out -y src/manta/ether_iface test/functional_sim/ethernet_rx_tb.sv - vvp sim.out - rm sim.out - -mac_tb: - iverilog -g2012 -o sim.out -y src/manta/ether_iface test/functional_sim/mac_tb.sv - vvp sim.out - rm sim.out - -block_memory_tb: - iverilog -g2012 -o sim.out -y src/manta/block_mem_core test/functional_sim/block_memory_tb.sv - vvp sim.out - rm sim.out - -io_core_tb: - iverilog -g2012 -o sim.out \ - test/functional_sim/io_core_tb/io_core_tb.sv \ - test/functional_sim/io_core_tb/io_core.v - vvp sim.out - rm sim.out - -logic_analyzer_tb: - cd test/functional_sim/logic_analyzer_tb; \ - python3 -m manta gen manta.yaml manta.v; \ - iverilog -g2012 -o sim.out logic_analyzer_tb.sv manta.v; \ - vvp sim.out; \ - rm sim.out - -bridge_rx_tb: - iverilog -g2012 -o sim.out -y src/manta/uart_iface test/functional_sim/bridge_rx_tb.sv - vvp sim.out - rm sim.out - -bridge_tx_tb: - iverilog -g2012 -o sim.out -y src/manta/uart_iface test/functional_sim/bridge_tx_tb.sv - vvp sim.out - rm sim.out - -uart_rx_tb: - iverilog -g2012 -o sim.out -y src/manta/uart_iface test/functional_sim/uart_rx_tb.sv - vvp sim.out - rm sim.out - -uart_tx_tb: - iverilog -g2012 -o sim.out -y src/manta/uart_iface test/functional_sim/uart_tx_tb.sv - vvp sim.out - rm sim.out diff --git a/README.md b/README.md index 3a02d2b..e49515c 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,7 @@ ![](doc/assets/logo.png) ## Manta: An In-Situ Debugging Tool for Programmable Hardware -![functional_simulation](https://github.com/fischermoseley/manta/actions/workflows/functional_simulation.yml/badge.svg) -![formal_verification](https://github.com/fischermoseley/manta/actions/workflows/formal_verification.yml/badge.svg) -![build_examples](https://github.com/fischermoseley/manta/actions/workflows/build_examples.yml/badge.svg) +![run_tests](https://github.com/fischermoseley/manta/actions/workflows/run_tests.yml/badge.svg) ![build_docs](https://github.com/fischermoseley/manta/actions/workflows/build_docs.yml/badge.svg) [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) diff --git a/examples/icestick/io_core/manta.yaml b/examples/icestick/io_core/manta.yaml deleted file mode 100644 index 80757ae..0000000 --- a/examples/icestick/io_core/manta.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -cores: - my_io_core: - type: io - - outputs: - LED0: 1 - LED1: 1 - LED2: 1 - LED3: 1 - LED4: 1 - -uart: - port: "auto" - baudrate: 115200 - clock_freq: 12000000 \ No newline at end of file diff --git a/examples/icestick/io_core/run_io_core.py b/examples/icestick/io_core/run_io_core.py deleted file mode 100644 index 36cc4dd..0000000 --- a/examples/icestick/io_core/run_io_core.py +++ /dev/null @@ -1,45 +0,0 @@ -from manta import Manta -from time import sleep - -m = Manta('manta.yaml') - -i = 0 -while True: - i = (i+1) % 5 - - if(i==0): - m.my_io_core.LED0.set(1) - m.my_io_core.LED1.set(0) - m.my_io_core.LED2.set(0) - m.my_io_core.LED3.set(0) - m.my_io_core.LED4.set(0) - - if(i==1): - m.my_io_core.LED0.set(0) - m.my_io_core.LED1.set(1) - m.my_io_core.LED2.set(0) - m.my_io_core.LED3.set(0) - m.my_io_core.LED4.set(0) - - if(i==2): - m.my_io_core.LED0.set(0) - m.my_io_core.LED1.set(0) - m.my_io_core.LED2.set(1) - m.my_io_core.LED3.set(0) - m.my_io_core.LED4.set(0) - - if(i==3): - m.my_io_core.LED0.set(0) - m.my_io_core.LED1.set(0) - m.my_io_core.LED2.set(0) - m.my_io_core.LED3.set(1) - m.my_io_core.LED4.set(0) - - if(i==4): - m.my_io_core.LED0.set(0) - m.my_io_core.LED1.set(0) - m.my_io_core.LED2.set(0) - m.my_io_core.LED3.set(0) - m.my_io_core.LED4.set(1) - - sleep(0.1) \ No newline at end of file diff --git a/examples/icestick/io_core/top_level.pcf b/examples/icestick/io_core/top_level.pcf deleted file mode 100644 index d042aa0..0000000 --- a/examples/icestick/io_core/top_level.pcf +++ /dev/null @@ -1,67 +0,0 @@ -# Generic iCEstick placement constraints file - -# Red LEDs -set_io LED0 99 -set_io LED1 98 -set_io LED2 97 -set_io LED3 96 - -# Green LED -set_io LED4 95 - -# IrDA port -#set_io RXD 106 -#set_io TXD 105 -#set_io SD 107 - -# Pmod connector -#set_io PIO1_02 78 # Pin 1 -#set_io PIO1_03 79 # Pin 2 -#set_io PIO1_04 80 # Pin 3 -#set_io PIO1_05 81 # Pin 4 -#set_io PIO1_06 87 # Pin 7 -#set_io PIO1_07 88 # Pin 8 -#set_io PIO1_08 90 # Pin 9 -#set_io PIO1_09 91 # Pin 10 - -# Connector J1 -#set_io PIO0_02 112 # Pin 3 -#set_io PIO0_03 113 # Pin 4 -#set_io PIO0_04 114 # Pin 5 -#set_io PIO0_05 115 # Pin 6 -#set_io PIO0_06 116 # Pin 7 -#set_io PIO0_07 117 # Pin 8 -#set_io PIO0_08 118 # Pin 9 -#set_io PIO0_09 119 # Pin 10 - -# Connector J3 -#set_io PIO2_17 62 # Pin 3 -#set_io PIO2_16 61 # Pin 4 -#set_io PIO2_15 60 # Pin 5 -#set_io PIO2_14 56 # Pin 6 -#set_io PIO2_13 48 # Pin 7 -#set_io PIO2_12 47 # Pin 8 -#set_io PIO2_11 45 # Pin 9 -#set_io PIO2_10 44 # Pin 10 - -# FTDI Port B UART -#set_io DCDn 1 -#set_io DSRn 2 -#set_io DTRn 3 -#set_io CTSn 4 -#set_io RTSn 7 -set_io rs232_tx_ttl 8 -set_io rs232_rx_ttl 9 - -# SPI -#set_io SPI_SCK 70 -#set_io SPI_SI 68 -#set_io SPI_SO 67 -#set_io SPI_SS_B 71 - -# Configuration pins -#set_io CDONE 65 -#set_io CRESET_B 66 - -# 12 MHz clock -set_io clk 21 diff --git a/examples/icestick/io_core/top_level.sv b/examples/icestick/io_core/top_level.sv deleted file mode 100644 index c8a1711..0000000 --- a/examples/icestick/io_core/top_level.sv +++ /dev/null @@ -1,32 +0,0 @@ -`default_nettype none -`timescale 1ns / 1ps - -`include "manta.v" - -module top_level ( - input wire clk, - - output logic LED0, - output logic LED1, - output logic LED2, - output logic LED3, - output logic LED4, - - input wire rs232_rx_ttl, - output logic rs232_tx_ttl - ); - - manta manta_inst ( - .clk(clk), - - .rx(rs232_rx_ttl), - .tx(rs232_tx_ttl), - - .LED0(LED0), - .LED1(LED1), - .LED2(LED2), - .LED3(LED3), - .LED4(LED4)); -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/examples/nexys_a7/block_mem_uart/api_example.py b/examples/nexys_a7/block_mem_uart/api_example.py deleted file mode 100644 index 6323e75..0000000 --- a/examples/nexys_a7/block_mem_uart/api_example.py +++ /dev/null @@ -1,18 +0,0 @@ -from manta import Manta -from time import sleep -from random import randint - -m = Manta('manta.yaml') - -for addr in range(1024): - number = randint(0,65535) - m.my_block_memory.write(addr, number) - - readback = m.my_block_memory.read(addr) - - if readback == number: - print(f"Success! Wrote and read back {hex(number)} from {hex(addr)}") - - else: - print(f"Failure! Wrote {hex(number)} to {hex(addr)}, but received {hex(readback)}") - exit() diff --git a/examples/nexys_a7/block_mem_uart/manta.yaml b/examples/nexys_a7/block_mem_uart/manta.yaml deleted file mode 100644 index 756dab7..0000000 --- a/examples/nexys_a7/block_mem_uart/manta.yaml +++ /dev/null @@ -1,11 +0,0 @@ ---- -cores: - my_block_memory: - type: block_memory - width: 16 - depth: 1024 - -uart: - port: "/dev/ttyUSB1" - baudrate: 2000000 - clock_freq: 100000000 \ No newline at end of file diff --git a/examples/nexys_a7/block_mem_uart/src/top_level.sv b/examples/nexys_a7/block_mem_uart/src/top_level.sv deleted file mode 100644 index bb5cd1a..0000000 --- a/examples/nexys_a7/block_mem_uart/src/top_level.sv +++ /dev/null @@ -1,24 +0,0 @@ -`default_nettype none -`timescale 1ns / 1ps - -module top_level ( - input wire clk, - - input wire uart_txd_in, - output logic uart_rxd_out); - - manta manta_inst ( - .clk(clk), - - .rx(uart_txd_in), - .tx(uart_rxd_out), - - .my_block_memory_clk(clk), - .my_block_memory_addr(0), - .my_block_memory_din(0), - .my_block_memory_dout(), - .my_block_memory_we(0)); - -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/examples/nexys_a7/block_mem_uart/xdc/top_level.xdc b/examples/nexys_a7/block_mem_uart/xdc/top_level.xdc deleted file mode 100644 index df10467..0000000 --- a/examples/nexys_a7/block_mem_uart/xdc/top_level.xdc +++ /dev/null @@ -1,254 +0,0 @@ -## This file is a general .xdc for the Nexys4 DDR Rev. C -## To use it in a project: -## - uncomment the lines corresponding to used pins -## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project - -## This file has been modified from the default .xdc provided by Digilent for the Nexys A7 - -## Clock signal - uncomment _both_ of these lines to create clk_100mhz -set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk -create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk}]; - -##Switches - -#set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] -#set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] -#set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] -#set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] -#set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] -#set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] -#set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] -#set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] -#set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] -#set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] -#set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] -#set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] -#set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] -#set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] -#set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] -#set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] - - -## LEDs - -#set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] -#set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] -#set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] -#set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] -#set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] -#set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] -#set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] -#set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] -#set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] -#set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] -#set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] -#set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] -#set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] -#set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] -#set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] -#set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] - -#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b -#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g -#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r -#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b -#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g -#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r - - -##7 segment display - -#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca -#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb -#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc -#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd -#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce -#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf -#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg - -#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp - -#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] -#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] -#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] -#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] -#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] -#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] -#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] -#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] - - -##Buttons - -#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn - -#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc -#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu -#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl -#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr -#set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd - - -##Pmod Headers - - -##Pmod Header JA - -#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] -#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] -#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] -#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] -#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] -#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] -#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] -#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] - - -##Pmod Header JB - -#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] -#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] -#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] -#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] -#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] -#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] -#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] -#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] - - -##Pmod Header JC - -#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] -#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] -#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] -#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] -#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] -#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] -#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] -#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] - - -##Pmod Header JD - -#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] -#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] -#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] -#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] -#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] -#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] -#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] -#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] - - -##Pmod Header JXADC - -#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] -#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] -#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] -#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] -#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] -#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] -#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] -#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] - - -##VGA Connector - -#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] -#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] -#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] -#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] -# -#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] -#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] -#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] -#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] -# -#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] -#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] -#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] -#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] - -#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs -#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs - -##Micro SD Connector - -#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset -#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd -#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck -#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd -#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] -#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] -#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] -#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] - - -##Accelerometer - -#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso -#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi -#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk -#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn -#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] -#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] - - -##Temperature Sensor - -#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl -#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda -#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int -#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct - -##Omnidirectional Microphone - -#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk -#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data -#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel - - -##PWM Audio Amplifier - -#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm -#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd - - -##USB-RS232 Interface - -set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in -set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out -#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts -#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts - -##USB HID (PS/2) - -#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk -#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data - - -##SMSC Ethernet PHY - -#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc -#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio -#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn -#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crs/udv -#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr -#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] -#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] -#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen -#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] -#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] -#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk -#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn - - -##Quad SPI Flash - -#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] -#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] -#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] -#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] -#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn - - diff --git a/examples/nexys_a7/build.tcl b/examples/nexys_a7/build.tcl deleted file mode 100644 index 810232a..0000000 --- a/examples/nexys_a7/build.tcl +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/tclsh - -set partNum xc7a100tcsg324-1 -set outputDir obj - -read_verilog -sv [ glob ./src/*.{sv,v,svh,vh} ] -read_xdc ./xdc/top_level.xdc - -set_part $partNum - -# synth -synth_design -top top_level -part $partNum -verbose -report_utilization -file $outputDir/post_synth_util.rpt -report_timing_summary -file $outputDir/post_synth_timing_summary.rpt -report_timing -file $outputDir/post_synth_timing.rpt - -# place -opt_design -place_design -phys_opt_design -report_utilization -file $outputDir/post_place_util.rpt - -report_clock_utilization -file $outputDir/clock_util.rpt -report_timing_summary -file $outputDir/post_place_timing_summary.rpt -report_timing -file $outputDir/post_place_timing.rpt - -# route design and generate bitstream - -route_design -directive Explore -write_bitstream -force $outputDir/out.bit - -report_route_status -file $outputDir/post_route_status.rpt -report_timing_summary -file $outputDir/post_route_timing_summary.rpt -report_timing -file $outputDir/post_route_timing.rpt -report_power -file $outputDir/post_route_power.rpt -report_drc -file $outputDir/post_imp_drc.rpt -write_verilog -force $outputDir/cpu_impl_netlist.v -mode timesim -sdf_anno true diff --git a/examples/nexys_a7/io_core_ether/api_example.py b/examples/nexys_a7/io_core_ether/api_example.py deleted file mode 100644 index d9d03b4..0000000 --- a/examples/nexys_a7/io_core_ether/api_example.py +++ /dev/null @@ -1,40 +0,0 @@ -from manta import Manta -from time import sleep - -m = Manta('manta.yaml') - -i = 0 -direction = "left" - -while True: - if direction == "left": - if i == 15: - direction = "right" - i = i - 1 - m.my_io_core.led16_r.set(1) - m.my_io_core.led16_g.set(0) - m.my_io_core.led16_b.set(1) - else: - i = i + 1 - - if direction == "right": - if i == 0: - direction = "left" - i = i + 1 - m.my_io_core.led16_r.set(0) - m.my_io_core.led16_g.set(1) - m.my_io_core.led16_b.set(0) - - else: - i = i - 1 - - m.my_io_core.led.set(2**i) - print(f"Input Ports:") - print(f" btnu: {m.my_io_core.btnu.get()}") - print(f" btnd: {m.my_io_core.btnd.get()}") - print(f" btnr: {m.my_io_core.btnr.get()}") - print(f" btnl: {m.my_io_core.btnl.get()}") - print(f" btnc: {m.my_io_core.btnc.get()}") - print(f" sw: {m.my_io_core.sw.get()}\n") - sleep(0.5) - diff --git a/examples/nexys_a7/io_core_ether/manta.yaml b/examples/nexys_a7/io_core_ether/manta.yaml deleted file mode 100644 index 4ca285e..0000000 --- a/examples/nexys_a7/io_core_ether/manta.yaml +++ /dev/null @@ -1,25 +0,0 @@ ---- -cores: - my_io_core: - type: io - - inputs: - btnu: 1 - btnd: 1 - btnl: 1 - btnr: 1 - btnc: 1 - sw: 16 - - outputs: - led: 16 - led16_b: 1 - led16_g: 1 - led16_r: 1 - led17_b: 1 - led17_g: 1 - led17_r: 1 - -ethernet: - interface: "en8" - host_mac: "12:34:56:78:90:ab" \ No newline at end of file diff --git a/examples/nexys_a7/io_core_ether/src/divider.sv b/examples/nexys_a7/io_core_ether/src/divider.sv deleted file mode 100644 index 55aada8..0000000 --- a/examples/nexys_a7/io_core_ether/src/divider.sv +++ /dev/null @@ -1,193 +0,0 @@ -`default_nettype wire - -// file: divider.sv -// -// (c) Copyright 2008 - 2013 Xilinx, Inc. All rights reserved. -// -// This file contains confidential and proprietary information -// of Xilinx, Inc. and is protected under U.S. and -// international copyright and other intellectual property -// laws. -// -// DISCLAIMER -// This disclaimer is not a license and does not grant any -// rights to the materials distributed herewith. Except as -// otherwise provided in a valid license issued to you by -// Xilinx, and to the maximum extent permitted by applicable -// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND -// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES -// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING -// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- -// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and -// (2) Xilinx shall not be liable (whether in contract or tort, -// including negligence, or under any other theory of -// liability) for any loss or damage of any kind or nature -// related to, arising under or in connection with these -// materials, including for any direct, or any indirect, -// special, incidental, or consequential loss or damage -// (including loss of data, profits, goodwill, or any type of -// loss or damage suffered as a result of any action brought -// by a third party) even if such damage or loss was -// reasonably foreseeable or Xilinx had been advised of the -// possibility of the same. -// -// CRITICAL APPLICATIONS -// Xilinx products are not designed or intended to be fail- -// safe, or for use in any application requiring fail-safe -// performance, such as life-support or safety devices or -// systems, Class III medical devices, nuclear facilities, -// applications related to the deployment of airbags, or any -// other applications that could lead to death, personal -// injury, or severe property or environmental damage -// (individually and collectively, "Critical -// Applications"). Customer assumes the sole risk and -// liability of any use of Xilinx products in Critical -// Applications, subject only to applicable laws and -// regulations governing limitations on product liability. -// -// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS -// PART OF THIS FILE AT ALL TIMES. -// -//---------------------------------------------------------------------------- -// User entered comments -//---------------------------------------------------------------------------- -// popopopopopopopopopopop -// -//---------------------------------------------------------------------------- -// Output Output Phase Duty Cycle Pk-to-Pk Phase -// Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps) -//---------------------------------------------------------------------------- -// __ethclk__50.00000______0.000______50.0______151.636_____98.575 -// -//---------------------------------------------------------------------------- -// Input Clock Freq (MHz) Input Jitter (UI) -//---------------------------------------------------------------------------- -// __primary_________100.000____________0.010 - -`timescale 1ps/1ps - -module divider - - (// Clock in ports - // Clock out ports - output ethclk, - input clk - ); - // Input buffering - //------------------------------------ -wire clk_divider; -wire clk_in2_divider; - IBUF clkin1_ibufg - (.O (clk_divider), - .I (clk)); - - - - - // Clocking PRIMITIVE - //------------------------------------ - - // Instantiation of the MMCM PRIMITIVE - // * Unused inputs are tied off - // * Unused outputs are labeled unused - - wire ethclk_divider; - wire clk_out2_divider; - wire clk_out3_divider; - wire clk_out4_divider; - wire clk_out5_divider; - wire clk_out6_divider; - wire clk_out7_divider; - - wire [15:0] do_unused; - wire drdy_unused; - wire psdone_unused; - wire locked_int; - wire clkfbout_divider; - wire clkfbout_buf_divider; - wire clkfboutb_unused; - wire clkout0b_unused; - wire clkout1_unused; - wire clkout1b_unused; - wire clkout2_unused; - wire clkout2b_unused; - wire clkout3_unused; - wire clkout3b_unused; - wire clkout4_unused; - wire clkout5_unused; - wire clkout6_unused; - wire clkfbstopped_unused; - wire clkinstopped_unused; - - MMCME2_ADV - #(.BANDWIDTH ("OPTIMIZED"), - .CLKOUT4_CASCADE ("FALSE"), - .COMPENSATION ("ZHOLD"), - .STARTUP_WAIT ("FALSE"), - .DIVCLK_DIVIDE (1), - .CLKFBOUT_MULT_F (10.000), - .CLKFBOUT_PHASE (0.000), - .CLKFBOUT_USE_FINE_PS ("FALSE"), - .CLKOUT0_DIVIDE_F (20.000), - .CLKOUT0_PHASE (0.000), - .CLKOUT0_DUTY_CYCLE (0.500), - .CLKOUT0_USE_FINE_PS ("FALSE"), - .CLKIN1_PERIOD (10.000)) - mmcm_adv_inst - // Output clocks - ( - .CLKFBOUT (clkfbout_divider), - .CLKFBOUTB (clkfboutb_unused), - .CLKOUT0 (ethclk_divider), - .CLKOUT0B (clkout0b_unused), - .CLKOUT1 (clkout1_unused), - .CLKOUT1B (clkout1b_unused), - .CLKOUT2 (clkout2_unused), - .CLKOUT2B (clkout2b_unused), - .CLKOUT3 (clkout3_unused), - .CLKOUT3B (clkout3b_unused), - .CLKOUT4 (clkout4_unused), - .CLKOUT5 (clkout5_unused), - .CLKOUT6 (clkout6_unused), - // Input clock control - .CLKFBIN (clkfbout_buf_divider), - .CLKIN1 (clk_divider), - .CLKIN2 (1'b0), - // Tied to always select the primary input clock - .CLKINSEL (1'b1), - // Ports for dynamic reconfiguration - .DADDR (7'h0), - .DCLK (1'b0), - .DEN (1'b0), - .DI (16'h0), - .DO (do_unused), - .DRDY (drdy_unused), - .DWE (1'b0), - // Ports for dynamic phase shift - .PSCLK (1'b0), - .PSEN (1'b0), - .PSINCDEC (1'b0), - .PSDONE (psdone_unused), - // Other control and status signals - .LOCKED (locked_int), - .CLKINSTOPPED (clkinstopped_unused), - .CLKFBSTOPPED (clkfbstopped_unused), - .PWRDWN (1'b0), - .RST (1'b0)); - -// Clock Monitor clock assigning -//-------------------------------------- - // Output buffering - //----------------------------------- - - BUFG clkf_buf - (.O (clkfbout_buf_divider), - .I (clkfbout_divider)); - - BUFG clkout1_buf - (.O (ethclk), - .I (ethclk_divider)); - -endmodule - -`default_nettype none diff --git a/examples/nexys_a7/io_core_ether/src/top_level.sv b/examples/nexys_a7/io_core_ether/src/top_level.sv deleted file mode 100644 index 913faca..0000000 --- a/examples/nexys_a7/io_core_ether/src/top_level.sv +++ /dev/null @@ -1,61 +0,0 @@ -`default_nettype none -`timescale 1ns / 1ps - -module top_level ( - input wire clk, - - input wire eth_crsdv, - input wire [1:0] eth_rxd, - output logic [1:0] eth_txd, - output logic eth_txen, - output logic eth_refclk, - output logic eth_rstn, - - input wire btnu, - input wire btnd, - input wire btnl, - input wire btnr, - input wire btnc, - input wire [15:0] sw, - output logic [15:0] led, - output logic led16_b, - output logic led16_g, - output logic led16_r, - output logic led17_b, - output logic led17_g, - output logic led17_r); - - // 50MHz clock generation for the RMII - logic ethclk; - divider div ( - .clk(clk), - .ethclk(ethclk)); - - assign eth_rstn = 1; - assign eth_refclk = ethclk; - - manta manta_inst ( - .clk(ethclk), - - .crsdv(eth_crsdv), - .rxd(eth_rxd), - .txen(eth_txen), - .txd(eth_txd), - - .btnu(btnu), - .btnd(btnd), - .btnl(btnl), - .btnr(btnr), - .btnc(btnc), - .sw(sw), - .led(led), - .led16_b(led16_b), - .led16_g(led16_g), - .led16_r(led16_r), - .led17_b(led17_b), - .led17_g(led17_g), - .led17_r(led17_r)); - -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/examples/nexys_a7/io_core_ether/xdc/top_level.xdc b/examples/nexys_a7/io_core_ether/xdc/top_level.xdc deleted file mode 100644 index 119c5d3..0000000 --- a/examples/nexys_a7/io_core_ether/xdc/top_level.xdc +++ /dev/null @@ -1,254 +0,0 @@ -## This file is a general .xdc for the Nexys4 DDR Rev. C -## To use it in a project: -## - uncomment the lines corresponding to used pins -## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project - -## This file has been modified from the default .xdc provided by Digilent for the Nexys A7 - -## Clock signal - uncomment _both_ of these lines to create clk_100mhz -set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk -create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk}]; - -##Switches - -set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] -set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] -set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] -set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] -set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] -set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] -set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] -set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] -set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] -set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] -set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] -set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] -set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] -set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] -set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] -set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] - - -## LEDs - -set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] -set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] -set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] -set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] -set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] -set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] -set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] -set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] -set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] -set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] -set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] -set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] -set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] -set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] -set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] -set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] - -set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b -set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g -set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r -set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b -set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g -set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r - - -##7 segment display - -#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca -#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb -#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc -#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd -#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce -#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf -#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg - -#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp - -#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] -#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] -#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] -#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] -#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] -#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] -#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] -#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] - - -##Buttons - -#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn - -set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc -set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu -set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl -set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr -set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd - - -##Pmod Headers - - -##Pmod Header JA - -#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] -#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] -#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] -#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] -#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] -#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] -#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] -#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] - - -##Pmod Header JB - -#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] -#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] -#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] -#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] -#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] -#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] -#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] -#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] - - -##Pmod Header JC - -#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] -#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] -#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] -#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] -#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] -#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] -#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] -#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] - - -##Pmod Header JD - -#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] -#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] -#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] -#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] -#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] -#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] -#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] -#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] - - -##Pmod Header JXADC - -#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] -#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] -#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] -#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] -#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] -#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] -#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] -#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] - - -##VGA Connector - -#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] -#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] -#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] -#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] -# -#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] -#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] -#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] -#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] -# -#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] -#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] -#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] -#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] - -#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs -#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs - -##Micro SD Connector - -#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset -#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd -#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck -#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd -#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] -#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] -#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] -#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] - - -##Accelerometer - -#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso -#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi -#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk -#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn -#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] -#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] - - -##Temperature Sensor - -#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl -#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda -#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int -#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct - -##Omnidirectional Microphone - -#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk -#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data -#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel - - -##PWM Audio Amplifier - -#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm -#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd - - -##USB-RS232 Interface - -#set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in -#set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out -#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts -#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts - -##USB HID (PS/2) - -#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk -#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data - - -##SMSC Ethernet PHY - -#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc -#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio -set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn -set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crs/udv -#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr -set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] -set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] -set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen -set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] -set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] -set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk -#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn - - -##Quad SPI Flash - -#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] -#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] -#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] -#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] -#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn - - diff --git a/examples/nexys_a7/io_core_uart/api_example.py b/examples/nexys_a7/io_core_uart/api_example.py deleted file mode 100644 index d9d03b4..0000000 --- a/examples/nexys_a7/io_core_uart/api_example.py +++ /dev/null @@ -1,40 +0,0 @@ -from manta import Manta -from time import sleep - -m = Manta('manta.yaml') - -i = 0 -direction = "left" - -while True: - if direction == "left": - if i == 15: - direction = "right" - i = i - 1 - m.my_io_core.led16_r.set(1) - m.my_io_core.led16_g.set(0) - m.my_io_core.led16_b.set(1) - else: - i = i + 1 - - if direction == "right": - if i == 0: - direction = "left" - i = i + 1 - m.my_io_core.led16_r.set(0) - m.my_io_core.led16_g.set(1) - m.my_io_core.led16_b.set(0) - - else: - i = i - 1 - - m.my_io_core.led.set(2**i) - print(f"Input Ports:") - print(f" btnu: {m.my_io_core.btnu.get()}") - print(f" btnd: {m.my_io_core.btnd.get()}") - print(f" btnr: {m.my_io_core.btnr.get()}") - print(f" btnl: {m.my_io_core.btnl.get()}") - print(f" btnc: {m.my_io_core.btnc.get()}") - print(f" sw: {m.my_io_core.sw.get()}\n") - sleep(0.5) - diff --git a/examples/nexys_a7/io_core_uart/manta.yaml b/examples/nexys_a7/io_core_uart/manta.yaml deleted file mode 100644 index 867efbe..0000000 --- a/examples/nexys_a7/io_core_uart/manta.yaml +++ /dev/null @@ -1,26 +0,0 @@ ---- -cores: - my_io_core: - type: io - - inputs: - btnu: 1 - btnd: 1 - btnl: 1 - btnr: 1 - btnc: 1 - sw: 16 - - outputs: - led: 16 - led16_b: 1 - led16_g: 1 - led16_r: 1 - led17_b: 1 - led17_g: 1 - led17_r: 1 - -uart: - port: "auto" - baudrate: 115200 - clock_freq: 100000000 \ No newline at end of file diff --git a/examples/nexys_a7/io_core_uart/src/top_level.sv b/examples/nexys_a7/io_core_uart/src/top_level.sv deleted file mode 100644 index d6e0f8c..0000000 --- a/examples/nexys_a7/io_core_uart/src/top_level.sv +++ /dev/null @@ -1,48 +0,0 @@ -`default_nettype none -`timescale 1ns / 1ps - -module top_level ( - input wire clk, - - input wire uart_txd_in, - output logic uart_rxd_out, - - input wire btnu, - input wire btnd, - input wire btnl, - input wire btnr, - input wire btnc, - - input wire [15:0] sw, - - output logic [15:0] led, - output logic led16_b, - output logic led16_g, - output logic led16_r, - output logic led17_b, - output logic led17_g, - output logic led17_r); - - manta manta_inst ( - .clk(clk), - - .rx(uart_txd_in), - .tx(uart_rxd_out), - - .btnu(btnu), - .btnd(btnd), - .btnl(btnl), - .btnr(btnr), - .btnc(btnc), - .sw(sw), - .led(led), - .led16_b(led16_b), - .led16_g(led16_g), - .led16_r(led16_r), - .led17_b(led17_b), - .led17_g(led17_g), - .led17_r(led17_r)); - -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/examples/nexys_a7/io_core_uart/xdc/top_level.xdc b/examples/nexys_a7/io_core_uart/xdc/top_level.xdc deleted file mode 100644 index 82c04c3..0000000 --- a/examples/nexys_a7/io_core_uart/xdc/top_level.xdc +++ /dev/null @@ -1,254 +0,0 @@ -## This file is a general .xdc for the Nexys4 DDR Rev. C -## To use it in a project: -## - uncomment the lines corresponding to used pins -## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project - -## This file has been modified from the default .xdc provided by Digilent for the Nexys A7 - -## Clock signal - uncomment _both_ of these lines to create clk_100mhz -set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk -create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk}]; - -##Switches - -set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] -set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] -set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] -set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] -set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] -set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] -set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] -set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] -set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] -set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] -set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] -set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] -set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] -set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] -set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] -set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] - - -## LEDs - -set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] -set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] -set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] -set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] -set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] -set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] -set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] -set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] -set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] -set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] -set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] -set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] -set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] -set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] -set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] -set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] - -set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b -set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g -set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r -set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b -set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g -set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r - - -##7 segment display - -#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca -#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb -#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc -#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd -#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce -#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf -#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg - -#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp - -#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] -#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] -#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] -#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] -#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] -#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] -#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] -#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] - - -##Buttons - -#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn - -set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc -set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu -set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl -set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr -set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd - - -##Pmod Headers - - -##Pmod Header JA - -#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] -#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] -#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] -#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] -#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] -#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] -#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] -#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] - - -##Pmod Header JB - -#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] -#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] -#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] -#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] -#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] -#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] -#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] -#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] - - -##Pmod Header JC - -#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] -#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] -#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] -#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] -#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] -#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] -#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] -#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] - - -##Pmod Header JD - -#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] -#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] -#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] -#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] -#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] -#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] -#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] -#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] - - -##Pmod Header JXADC - -#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] -#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] -#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] -#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] -#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] -#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] -#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] -#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] - - -##VGA Connector - -#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] -#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] -#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] -#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] -# -#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] -#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] -#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] -#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] -# -#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] -#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] -#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] -#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] - -#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs -#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs - -##Micro SD Connector - -#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset -#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd -#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck -#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd -#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] -#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] -#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] -#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] - - -##Accelerometer - -#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso -#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi -#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk -#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn -#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] -#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] - - -##Temperature Sensor - -#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl -#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda -#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int -#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct - -##Omnidirectional Microphone - -#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk -#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data -#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel - - -##PWM Audio Amplifier - -#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm -#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd - - -##USB-RS232 Interface - -set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in -set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out -#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts -#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts - -##USB HID (PS/2) - -#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk -#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data - - -##SMSC Ethernet PHY - -#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc -#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio -#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn -#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crs/udv -#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr -#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] -#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] -#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen -#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] -#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] -#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk -#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn - - -##Quad SPI Flash - -#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] -#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] -#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] -#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] -#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn - - diff --git a/examples/nexys_a7/large_io_core_uart/manta.yaml b/examples/nexys_a7/large_io_core_uart/manta.yaml deleted file mode 100644 index 25047eb..0000000 --- a/examples/nexys_a7/large_io_core_uart/manta.yaml +++ /dev/null @@ -1,23 +0,0 @@ ---- -cores: - io_core: - type: io - - inputs: - probe0: 1 - probe1: 2 - probe2: 8 - probe3: 20 - - outputs: - probe4: - width: 1 - initial_value: 1 - probe5: 2 - probe6: 8 - probe7: 20 - -uart: - port: "auto" - baudrate: 3000000 - clock_freq: 100000000 diff --git a/examples/nexys_a7/large_io_core_uart/src/top_level.sv b/examples/nexys_a7/large_io_core_uart/src/top_level.sv deleted file mode 100644 index 1664a41..0000000 --- a/examples/nexys_a7/large_io_core_uart/src/top_level.sv +++ /dev/null @@ -1,32 +0,0 @@ -`default_nettype none -`timescale 1ns / 1ps - -module top_level ( - input wire clk, - - input wire uart_txd_in, - output logic uart_rxd_out); - - logic probe0; - logic [1:0] probe1; - logic [7:0] probe2; - logic [19:0] probe3; - - manta manta_inst ( - .clk(clk), - - .rx(uart_txd_in), - .tx(uart_rxd_out), - - .probe0(probe0), - .probe1(probe1), - .probe2(probe2), - .probe3(probe3), - .probe4(probe0), - .probe5(probe1), - .probe6(probe2), - .probe7(probe3)); - -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/examples/nexys_a7/large_io_core_uart/test.py b/examples/nexys_a7/large_io_core_uart/test.py deleted file mode 100644 index f9bee51..0000000 --- a/examples/nexys_a7/large_io_core_uart/test.py +++ /dev/null @@ -1,26 +0,0 @@ -from manta import Manta -from random import randint -m = Manta('manta.yaml') - -n_tests = 100 -for i in range(n_tests): - print(f"-> Beginning test {i} of {n_tests}") - probe4 = randint(0, 1) - m.io_core.probe4.set(probe4) - assert m.io_core.probe4.get() == probe4 - assert m.io_core.probe0.get() == probe4 - - probe5 = randint(0, 3) - m.io_core.probe5.set(probe5) - assert m.io_core.probe5.get() == probe5 - assert m.io_core.probe1.get() == probe5 - - probe6 = randint(0, 255) - m.io_core.probe6.set(probe6) - assert m.io_core.probe6.get() == probe6 - assert m.io_core.probe2.get() == probe6 - - probe7 = randint(0, (2**20)-1) - m.io_core.probe7.set(probe7) - assert m.io_core.probe7.get() == probe7 - assert m.io_core.probe3.get() == probe7 diff --git a/examples/nexys_a7/large_io_core_uart/xdc/top_level.xdc b/examples/nexys_a7/large_io_core_uart/xdc/top_level.xdc deleted file mode 100644 index c23f104..0000000 --- a/examples/nexys_a7/large_io_core_uart/xdc/top_level.xdc +++ /dev/null @@ -1,254 +0,0 @@ -## This file is a general .xdc for the Nexys4 DDR Rev. C -## To use it in a project: -## - uncomment the lines corresponding to used pins -## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project - -## This file has been modified from the default .xdc provided by Digilent for the Nexys A7 - -## Clock signal - uncomment _both_ of these lines to create clk_100mhz -set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk -create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk}]; - -##Switches - -#set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] -#set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] -#set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] -#set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] -#set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] -#set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] -#set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] -#set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] -#set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] -#set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] -#set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] -#set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] -#set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] -#set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] -#set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] -#set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] - - -## LEDs - -#set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] -#set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] -#set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] -#set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] -#set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] -#set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] -#set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] -#set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] -#set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] -#set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] -#set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] -#set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] -#set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] -#set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] -#set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] -#set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] -# -#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b -#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g -#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r -#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b -#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g -#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r - - -##7 segment display - -#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca -#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb -#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc -#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd -#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce -#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf -#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg - -#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp - -#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] -#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] -#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] -#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] -#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] -#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] -#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] -#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] - - -##Buttons - -#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn - -#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc -#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu -#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl -#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr -#set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd - - -##Pmod Headers - - -##Pmod Header JA - -#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] -#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] -#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] -#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] -#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] -#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] -#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] -#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] - - -##Pmod Header JB - -#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] -#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] -#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] -#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] -#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] -#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] -#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] -#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] - - -##Pmod Header JC - -#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] -#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] -#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] -#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] -#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] -#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] -#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] -#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] - - -##Pmod Header JD - -#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] -#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] -#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] -#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] -#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] -#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] -#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] -#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] - - -##Pmod Header JXADC - -#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] -#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] -#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] -#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] -#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] -#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] -#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] -#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] - - -##VGA Connector - -#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] -#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] -#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] -#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] -# -#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] -#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] -#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] -#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] -# -#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] -#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] -#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] -#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] - -#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs -#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs - -##Micro SD Connector - -#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset -#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd -#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck -#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd -#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] -#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] -#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] -#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] - - -##Accelerometer - -#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso -#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi -#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk -#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn -#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] -#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] - - -##Temperature Sensor - -#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl -#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda -#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int -#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct - -##Omnidirectional Microphone - -#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk -#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data -#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel - - -##PWM Audio Amplifier - -#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm -#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd - - -##USB-RS232 Interface - -set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in -set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out -#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts -#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts - -##USB HID (PS/2) - -#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk -#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data - - -##SMSC Ethernet PHY - -#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc -#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio -#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn -#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crs/udv -#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr -#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] -#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] -#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen -#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] -#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] -#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk -#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn - - -##Quad SPI Flash - -#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] -#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] -#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] -#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] -#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn - - diff --git a/examples/nexys_a7/logic_analyzer_uart/manta.yaml b/examples/nexys_a7/logic_analyzer_uart/manta.yaml deleted file mode 100644 index ccb1bea..0000000 --- a/examples/nexys_a7/logic_analyzer_uart/manta.yaml +++ /dev/null @@ -1,20 +0,0 @@ ---- -cores: - my_logic_analyzer: - type: logic_analyzer - sample_depth: 1024 - - probes: - spike: 1 - jet: 2 - valentine: 3 - ed: 4 - ein: 5 - - triggers: - - ein EQ 3 - -uart: - port: "auto" - baudrate: 115200 - clock_freq: 100000000 \ No newline at end of file diff --git a/examples/nexys_a7/logic_analyzer_uart/sim/playback.v b/examples/nexys_a7/logic_analyzer_uart/sim/playback.v deleted file mode 100644 index 9aa7a47..0000000 --- a/examples/nexys_a7/logic_analyzer_uart/sim/playback.v +++ /dev/null @@ -1,58 +0,0 @@ -/* -This playback module was generated with Manta v0.0.5 on 23 Aug 2023 at 11:25:46 by fischerm - -If this breaks or if you've got dank formal verification memes, contact fischerm [at] mit.edu - -Provided under a GNU GPLv3 license. Go wild. - -Here's an example instantiation of the Manta module you configured, feel free to copy-paste -this into your source! - -my_logic_analyzer_playback #(.MEM_FILE("capture.mem")) my_logic_analyzer_playback_inst ( - .clk(clk), - .enable(1'b1), - - .spike(spike), - .jet(jet), - .valentine(valentine), - .ed(ed), - .ein(ein)); - -*/ - - -module my_logic_analyzer_playback ( - input wire clk, - - input wire enable, - output reg done, - - output reg spike, - output reg [1:0] jet, - output reg [2:0] valentine, - output reg [3:0] ed, - output reg [4:0] ein); - - parameter MEM_FILE = ""; - localparam SAMPLE_DEPTH = 1024; - localparam TOTAL_PROBE_WIDTH = 15; - - reg [TOTAL_PROBE_WIDTH-1:0] capture [SAMPLE_DEPTH-1:0]; - reg [$clog2(SAMPLE_DEPTH)-1:0] addr; - reg [TOTAL_PROBE_WIDTH-1:0] sample; - - assign done = (addr >= SAMPLE_DEPTH); - - initial begin - $readmemb(MEM_FILE, capture, 0, SAMPLE_DEPTH-1); - addr = 0; - end - - always @(posedge clk) begin - if (enable && !done) begin - addr = addr + 1; - sample = capture[addr]; - {ein, ed, valentine, jet, spike} = sample; - end - end -endmodule \ No newline at end of file diff --git a/examples/nexys_a7/logic_analyzer_uart/sim/playback_tb.sv b/examples/nexys_a7/logic_analyzer_uart/sim/playback_tb.sv deleted file mode 100644 index d89ace9..0000000 --- a/examples/nexys_a7/logic_analyzer_uart/sim/playback_tb.sv +++ /dev/null @@ -1,38 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module playback_tb(); - logic clk; - - always begin - #5; - clk = !clk; - end - - logic spike; - logic [1:0] jet; - logic [2:0] valentine; - logic [3:0] ed; - logic [4:0] ein; - - my_logic_analyzer_playback #(.MEM_FILE("capture.mem")) my_logic_analyzer_playback_inst ( - .clk(clk), - .enable(1'b1), - - .spike(spike), - .jet(jet), - .valentine(valentine), - .ed(ed), - .ein(ein)); - - initial begin - clk = 0; - $dumpfile("playback_tb.vcd"); - $dumpvars(0, playback_tb); - - #(450000*5); - $finish(); - end - -endmodule -`default_nettype wire \ No newline at end of file diff --git a/examples/nexys_a7/logic_analyzer_uart/src/top_level.sv b/examples/nexys_a7/logic_analyzer_uart/src/top_level.sv deleted file mode 100644 index 2127b3d..0000000 --- a/examples/nexys_a7/logic_analyzer_uart/src/top_level.sv +++ /dev/null @@ -1,28 +0,0 @@ -`default_nettype none -`timescale 1ns / 1ps - -module top_level ( - input wire clk, - - input wire uart_txd_in, - output logic uart_rxd_out - ); - - logic [4:0] counter = 0; - always @(posedge clk) counter <= counter + 1; - - manta manta_inst ( - .clk(clk), - - .rx(uart_txd_in), - .tx(uart_rxd_out), - - .spike(counter[0]), - .jet(counter[1:0]), - .valentine(counter[2:0]), - .ed(counter[3:0]), - .ein(counter)); - -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/examples/nexys_a7/logic_analyzer_uart/xdc/top_level.xdc b/examples/nexys_a7/logic_analyzer_uart/xdc/top_level.xdc deleted file mode 100644 index 81c1998..0000000 --- a/examples/nexys_a7/logic_analyzer_uart/xdc/top_level.xdc +++ /dev/null @@ -1,254 +0,0 @@ -## This file is a general .xdc for the Nexys4 DDR Rev. C -## To use it in a project: -## - uncomment the lines corresponding to used pins -## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project - -## This file has been modified from the default .xdc provided by Digilent for the Nexys A7 - -## Clock signal - uncomment _both_ of these lines to create clk_100mhz -set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk -create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk}]; - -##Switches - -#set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] -#set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] -#set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] -#set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] -#set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] -#set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] -#set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] -#set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] -#set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] -#set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] -#set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] -#set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] -#set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] -#set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] -#set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] -#set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] - - -## LEDs - -#set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] -#set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] -#set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] -#set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] -#set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] -#set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] -#set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] -#set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] -#set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] -#set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] -#set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] -#set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] -#set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] -#set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] -#set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] -#set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] - -#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b -#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g -#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r -#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b -#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g -#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r - - -##7 segment display - -#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca -#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb -#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc -#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd -#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce -#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf -#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg - -#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp - -#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] -#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] -#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] -#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] -#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] -#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] -#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] -#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] - - -##Buttons - -#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn - -#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc -#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu -#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl -#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr -#set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd - - -##Pmod Headers - - -##Pmod Header JA - -#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] -#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] -#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] -#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] -#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] -#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] -#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] -#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] - - -##Pmod Header JB - -#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] -#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] -#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] -#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] -#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] -#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] -#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] -#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] - - -##Pmod Header JC - -#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] -#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] -#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] -#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] -#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] -#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] -#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] -#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] - - -##Pmod Header JD - -#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] -#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] -#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] -#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] -#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] -#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] -#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] -#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] - - -##Pmod Header JXADC - -#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] -#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] -#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] -#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] -#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] -#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] -#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] -#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] - - -##VGA Connector - -#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] -#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] -#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] -#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] -# -#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] -#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] -#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] -#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] -# -#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] -#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] -#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] -#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] - -#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs -#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs - -##Micro SD Connector - -#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset -#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd -#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck -#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd -#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] -#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] -#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] -#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] - - -##Accelerometer - -#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso -#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi -#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk -#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn -#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] -#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] - - -##Temperature Sensor - -#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl -#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda -#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int -#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct - -##Omnidirectional Microphone - -#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk -#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data -#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel - - -##PWM Audio Amplifier - -#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm -#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd - - -##USB-RS232 Interface - -set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in -set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out -#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts -#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts - -##USB HID (PS/2) - -set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk -set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data - - -##SMSC Ethernet PHY - -#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc -#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio -#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn -#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crs/udv -#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr -#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] -#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] -#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen -#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] -#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] -#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk -#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn - - -##Quad SPI Flash - -#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] -#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] -#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] -#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] -#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn - - diff --git a/examples/nexys_a7/ps2_logic_analyzer/manta.yaml b/examples/nexys_a7/ps2_logic_analyzer/manta.yaml deleted file mode 100644 index c2d1e5f..0000000 --- a/examples/nexys_a7/ps2_logic_analyzer/manta.yaml +++ /dev/null @@ -1,18 +0,0 @@ ---- -cores: - my_logic_analyzer: - type: logic_analyzer - sample_depth: 64000 - trigger_location: 15000 - - probes: - ps2_clk: 1 - ps2_data: 1 - - triggers: - - ps2_data FALLING - -uart: - port: "auto" - baudrate: 115200 - clock_freq: 50000000 \ No newline at end of file diff --git a/examples/nexys_a7/ps2_logic_analyzer/sim/playback.v b/examples/nexys_a7/ps2_logic_analyzer/sim/playback.v deleted file mode 100644 index acf7d73..0000000 --- a/examples/nexys_a7/ps2_logic_analyzer/sim/playback.v +++ /dev/null @@ -1,52 +0,0 @@ -/* -This playback module was generated with Manta v0.0.5 on 19 Jul 2023 at 18:52:11 by fischerm - -If this breaks or if you've got dank formal verification memes, contact fischerm [at] mit.edu - -Provided under a GNU GPLv3 license. Go wild. - -Here's an example instantiation of the Manta module you configured, feel free to copy-paste -this into your source! - -my_logic_analyzer_playback #(.MEM_FILE("capture.mem")) my_logic_analyzer_playback_inst ( - .clk(clk), - .enable(1'b1), - - .ps2_clk(ps2_clk), - .ps2_data(ps2_data)); - -*/ - - -module my_logic_analyzer_playback ( - input wire clk, - - input wire enable, - output reg done, - - output reg ps2_clk, - output reg ps2_data); - - parameter MEM_FILE = ""; - localparam SAMPLE_DEPTH = 64000; - localparam TOTAL_PROBE_WIDTH = 2; - - reg [TOTAL_PROBE_WIDTH-1:0] capture [SAMPLE_DEPTH-1:0]; - reg [$clog2(SAMPLE_DEPTH)-1:0] addr; - reg [TOTAL_PROBE_WIDTH-1:0] sample; - - assign done = (addr >= SAMPLE_DEPTH); - - initial begin - $readmemb(MEM_FILE, capture, 0, SAMPLE_DEPTH-1); - addr = 0; - end - - always @(posedge clk) begin - if (enable && !done) begin - addr = addr + 1; - sample = capture[addr]; - {ps2_data, ps2_clk} = sample; - end - end -endmodule \ No newline at end of file diff --git a/examples/nexys_a7/ps2_logic_analyzer/sim/playback_tb.sv b/examples/nexys_a7/ps2_logic_analyzer/sim/playback_tb.sv deleted file mode 100644 index 7116fb8..0000000 --- a/examples/nexys_a7/ps2_logic_analyzer/sim/playback_tb.sv +++ /dev/null @@ -1,80 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module ps2_decoder( - input wire clk, - - input wire ps2_clk, - input wire ps2_data, - - output logic [7:0] data - ); - - reg prev_clk; - reg [10:0] buffer = 0; - reg [3:0] counter = 0; - - always @(posedge clk) begin - prev_clk <= ps2_clk; - - if (!prev_clk && ps2_clk) begin - buffer <= {buffer[9:0], ps2_data}; - counter <= counter + 1; - end - - if (counter == 11) begin - if (!buffer[10] && buffer[0]) begin - counter <= 0; - data <= {buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7], buffer[8], buffer[9]}; - end - end - - end - -endmodule - -module playback_tb(); - logic clk; - - always begin - #5; - clk = !clk; - end - - logic ps2_clk; - logic ps2_data; - - my_logic_analyzer_playback #(.MEM_FILE("capture.mem")) my_logic_analyzer_playback_inst ( - .clk(clk), - .enable(1'b1), - - .ps2_clk(ps2_clk), - .ps2_data(ps2_data)); - - logic [7:0] data; - - ps2_decoder decoder( - .clk(clk), - - .ps2_clk(ps2_clk), - .ps2_data(ps2_data), - - .data(data) - ); - - initial begin - clk = 0; - $dumpfile("playback_tb.vcd"); - $dumpvars(0, playback_tb); - - #(450000*5); - $finish(); - end - -endmodule - - - - - -`default_nettype wire \ No newline at end of file diff --git a/examples/nexys_a7/ps2_logic_analyzer/src/top_level.sv b/examples/nexys_a7/ps2_logic_analyzer/src/top_level.sv deleted file mode 100644 index b54ef17..0000000 --- a/examples/nexys_a7/ps2_logic_analyzer/src/top_level.sv +++ /dev/null @@ -1,25 +0,0 @@ -`default_nettype none -`timescale 1ns / 1ps - -module top_level ( - input wire clk, - - input wire ps2_clk, - input wire ps2_data, - - input wire uart_txd_in, - output logic uart_rxd_out - ); - - manta manta_inst ( - .clk(clk), - - .rx(uart_txd_in), - .tx(uart_rxd_out), - - .ps2_clk(ps2_clk), - .ps2_data(ps2_data)); - -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/examples/nexys_a7/ps2_logic_analyzer/xdc/top_level.xdc b/examples/nexys_a7/ps2_logic_analyzer/xdc/top_level.xdc deleted file mode 100644 index 81c1998..0000000 --- a/examples/nexys_a7/ps2_logic_analyzer/xdc/top_level.xdc +++ /dev/null @@ -1,254 +0,0 @@ -## This file is a general .xdc for the Nexys4 DDR Rev. C -## To use it in a project: -## - uncomment the lines corresponding to used pins -## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project - -## This file has been modified from the default .xdc provided by Digilent for the Nexys A7 - -## Clock signal - uncomment _both_ of these lines to create clk_100mhz -set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk -create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk}]; - -##Switches - -#set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] -#set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] -#set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] -#set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] -#set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] -#set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] -#set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] -#set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] -#set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] -#set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] -#set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] -#set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] -#set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] -#set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] -#set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] -#set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] - - -## LEDs - -#set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] -#set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] -#set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] -#set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] -#set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] -#set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] -#set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] -#set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] -#set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] -#set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] -#set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] -#set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] -#set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] -#set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] -#set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] -#set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] - -#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b -#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g -#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r -#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b -#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g -#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r - - -##7 segment display - -#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca -#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb -#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc -#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd -#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce -#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf -#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg - -#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp - -#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] -#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] -#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] -#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] -#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] -#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] -#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] -#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] - - -##Buttons - -#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn - -#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc -#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu -#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl -#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr -#set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd - - -##Pmod Headers - - -##Pmod Header JA - -#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] -#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] -#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] -#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] -#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] -#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] -#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] -#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] - - -##Pmod Header JB - -#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] -#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] -#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] -#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] -#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] -#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] -#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] -#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] - - -##Pmod Header JC - -#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] -#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] -#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] -#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] -#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] -#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] -#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] -#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] - - -##Pmod Header JD - -#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] -#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] -#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] -#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] -#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] -#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] -#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] -#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] - - -##Pmod Header JXADC - -#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] -#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] -#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] -#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] -#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] -#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] -#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] -#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] - - -##VGA Connector - -#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] -#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] -#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] -#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] -# -#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] -#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] -#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] -#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] -# -#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] -#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] -#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] -#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] - -#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs -#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs - -##Micro SD Connector - -#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset -#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd -#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck -#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd -#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] -#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] -#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] -#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] - - -##Accelerometer - -#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso -#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi -#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk -#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn -#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] -#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] - - -##Temperature Sensor - -#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl -#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda -#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int -#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct - -##Omnidirectional Microphone - -#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk -#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data -#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel - - -##PWM Audio Amplifier - -#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm -#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd - - -##USB-RS232 Interface - -set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in -set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out -#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts -#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts - -##USB HID (PS/2) - -set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk -set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data - - -##SMSC Ethernet PHY - -#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc -#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio -#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn -#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crs/udv -#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr -#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] -#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] -#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen -#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] -#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] -#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk -#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn - - -##Quad SPI Flash - -#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] -#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] -#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] -#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] -#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn - - diff --git a/examples/nexys_a7/video_sprite_ether/img/buff_doge.png b/examples/nexys_a7/video_sprite_ether/img/buff_doge.png deleted file mode 100644 index d504d022b1fbe9896a43e008ec41ffbad202d00d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69692 zcmeFZWl&t*wl>;0!5at=v}r5^clX9!gS$2E?(PH$Zb5@XaMuJva1HJf++8m3yZ6~= z@A|%~Tc_&Ye}^iHwdNe-8FM^CdabTeL@FsrqN5O^0001VX(@;b008rP2?Iceef=|q zCBy;%kXw1FX}YKwxq}>>?9HJzW*`?&2Q!eF2hB=@%z2qDp?9cvk z$FZ{7vwL%MQ+;}MqqyoW^!)BF<2FN3$nyHC>f|ImmvOUi&0rf7-|FB1>0+1c^6`#v zkqJL4mr0s#vg>9p^nNZ>>VZ~Xdh^YWve5Yt1`OEttE z|2WB*pO$iLmG=7>Y~nK{74c>7apdJxbPN@diQ{>+)K@Pi;882f?{U9k&#LrJ(crS_ z+tm}(jdi2bqnGqO)!_B!L9X9w==m?q$@qtUp%tDcGPCoko9NIdJxL*P1OMaYqfUz* zS_w{3TLa9ir}rlY?RHM6%dI>q=AGvy4w3hM?tWZlUdkwoOhR`ZqL>LT%b)r%D3%;n z=HBAT4xcq^-bu#L72k}cSRFbhbO_JhlGs(4x|T@j&&hf#oDFFAw%OkN>S*IQZii!v z4U9(k+$;2S^!$hDSe-6pZ82W6wu<1bP0E+yKlb_(61`6-R-Q1=&rb(T+Z+i!`R~ic zc>}X^Wrwk!L*f5W@t*be&M9JswRSNIM>M+{v5+Uge8W?DgXa@l8zu}QdP7JrP)tno z4!Nj*1Z<-4b5K6ImBYSty@Nevu!&?9X?PIwrRzh>mlG+C(a`(S7G<%5!bDkG4J&9- zs?pDHZ`sPJm54cJ4y{TxtZf_SCRBb^vRgMa%r5TL(g@eN95ghoJP<57J8bu~Au$n{ z{75&?`7WR7+Bm{@EX3@22`G$L4NrooZ>2P{VL1KH6GuA_>wlAF!=|DD z{RB)-{rXTDD?98SYcY}$c7?sjYm}wx{&f$d3+WHfZa=TAPC1e5^eD#iMs}%2$~zhQ zwnh@gVcUz4gi!Wh72Fk`qh;YkMp}RBS?yx4YU=l@Mrt;>*?zauJC$r$Xh-|crj5RP z8g}#igYK(r#=o!YWhmV8AeMg=B1^IjY_CKc&t5a1A`1B)MAQ2FZghjr14XO>uQeLACMFhRE=*Aqfbn zE-52;Uu$%^mKC33e~PK|va0J7zkwP=EKRjlhZIhBOsya=HH8w1jfGFHbXKYa%CK(7 z)WCi$nnu}}kZgg^fYO81UJ{3%_zad;eb*nfA39vzVG_jz8a)>pK3KxW*p%4>H<%nw z6|X{*1*Z@?eUaoC2Qjp`Usz~t9?oUEia8gex%taXfp^jgMmi0A0!DJ724iU_8971fsu$EBty zPpOrn6^kAtP$CcQq*f%fWmw4#c;ybOOjshNPYcqRtA}{fo;VgMEr_{(=CwvSlw3jt|{13 zL$TZN1eAJDgUGlLC{lGrJ6k9D9`lB%8Tp!uIk~YoZExCblYVBN_X3XAMgH_9%;EXz z<4r14z66oRz}I}XdmnisQqT-Pn1UA|nKwhxew}0kXQQM&)ESxL zm8l_q*C7`|2tY4;Yn`5Vu^>~808xb1^H_2Y#M<KhS=afIT}|(+so|hATl`(;EFOTNh~)c4VnZ_@K`+hdWK;i=t z->A{9D~U3rO~<&F(nyfb!96<$Teo1qGoXHX04|ApNGGN!U(?o09KpA4yitVeK@iFs zK&tDrLne6LWC0LI(S^1KX8!l})ZNVFylOfp?dr|NWiVgrCg>G&Rv26*D#sZJgbHsV z9d7S!TpU$MZOQPN;3gocn-*45=psiz6nxp)Ph=VFM_(Q zDegHFc`My4(OBQkO7I+n_Cqf+7JWCqEy8zQ zG-Ih~1ZaFYWrk5h<=Hgl72HTxj+>A950y|a*~z<li#>RWO6b1?eB zLHPV9R*}wPDGx(fY{5kAu%g*R><%gQ1AXLGpX0i9P@vqYqZmUtVK_4s&WAq2BoA{Y z59v43N*H~Gm7WVdsWru9P5+0%-`NKJb;|L3qxu1O&B5k?d%6Jl^T8Q>UKT5vDGvJN zT%<8TEYG$Amfs!soemR=7$!a${NWm#24HG2!s1N$3sYj}${YdXIl&k9uNKBahlfQK z8Jiq$tbV>vMZr&Glee%W*jK1oxsOYad5ilNZ@FMRpp#ruVTpo18)#6#%}n_C<@cZY zH?4W1RsrsxzV6d_-_wvSAP*Vj^&G1N;EKoPkwuF)oM&Ok@IemAb^_1^(Lh1A=pc@8S8x}7iQueJmu)}!+v zxmcVvBqte3OAmypw8^2LA_z#wi%Cj*h!`Eeg$L+AfB1q-EiPO>Vh)QgmGo^XEf@Gp z9A^4Z0*+^DyZGyyhTv2=pukx#GhS$ZJ~*o9MuO)Xq0GB?fnN~iu1PMf<{sb2fJKDq zc|UH8^2DCiW<|6=C+!lKM(dpt)E}3;CwdEbZ2n&Pk-Z|bver|gtPIKH_6r7odcxa6 ze4UMaGM$ihC_M22b3n}MBmL^f%nOH+eEZVt-J zbSn2xRX`r*RIy@(Eey-heI!Ocj+nwE1<}1N!~lq;G^<^=AIq@F9B#$&CW)0XEOsAp zekN;vv-2S?+CCTnBH;3zlQGCAZ$fO5-^tHEDli{=B*2Tyzi8z^b?i~pC1CHuK368K zCBya8@DMBgT9&ZhMsZlMB@#ua6Er-8<0R>3G16LA;PvO5bd^I&#A=~9x#eE$X}W}N zjDt$)V*agHF?$}P1J5}L_GD?1#_~cE1kBchODjE@&E5u@hM=J5ruxwI{3r-c>I~kN z`oo#W^II3iNfLJv+*z0(i4u3nbWFN-otQoS4#Y>EzajsGl#D%z`rrnK`JofK^(KAz zK>G(=Da|gr?{qK=|Azf4>^v^FvKZ<|40iHN ze;(ZILi7~-^Y6(BBfax!aN;FVoFx?vf#q&4(M z!PbeWS2(&0+*EV*rRndTFNVDkZFF?cgyHVg1-Z{d!E*(;=f=iinK_qn2{W(+;w{Ey zANLrELy-z+#d^)x-()zzv}D(bOuzjcg+C6fNt4~uX0^n0NLFNOx?~{r4${q&I1?_9 zu~szXQTSCdLzDZIpjbFU_>om%5XfvB$Tv*@pUhD{y%v+A#QFhcAOIN4{1uxNRS&b; zl?SwsUj_5#r?kIq#5u}mD>yfH?fhzyMlD`uDGfWvQ`H;m3`+IHr0?V@;I;0N9}&^4 zwAnu!PCpS9z+#P#K_Xy-dO4a&mi1!M5{A{5)Wrhu^i-8XXg#+R90&z^-|J2LIQJlW zwFbazp}zlPqNu^Mc8TU<-S9y`K3*V0#K{FxV189DR@013A9MItO^Mw#kbr1BY8&C3 zfE9f4_6tjzr9>I$7pJ{JE^__LE9%ze(=+kTh#1K-@}2~&BzE(7dQ>MTL5bqLX@Sw( zIzTFN_vR~{Q?+APv7+WyoG`btmA@i3ohXverV-2-7QYj6g*u zwF#up%pn8kegh*+=OnCGK>*7|Vo7L2e$5Zxk2^0meA@gCLB-UPpBcU!x}0Df14Hc| z%wx}%b)^8WF!{KOYKmcX23>+3wS2^$&Qu|xl#tPlI1J#!qbu$;as24vA>XPwMaF{_ zV~ZnTzENUrJsKC5+R0KzSwIQpGcHUgemRfag^0k#77U|2(p0}8GlTzTSdM<0kDB^O zUCxjpwOz;L8=9G|i~JQF3x{xQ&{J@jgrvY62am8@0Z)z2Ew}O_< z&I7HZN|ROjNIy3&Y0i8bfpjRd{`z32~-l33Ijs*%WJ1 zCnU6F@ZSPt6u42@L@op6d9f_Ewqn(L&I#B07wT5j2w5;1hO6XNX;Cl&)fN|H2Xt)>M_bI?-WNjOMLVS%f<0gVofzu zAr9@jLtaO3p%LY)$$iu}Va@__RzG6xej*i8Es0Mby3q_fA{Q6<;A^Z}WGg>ysVB?X z-aC$AfCR`wnXB4K4+85+Vl7>M!et>BVf^?qLxmi0y0<5{LDkS6gcoNYW5|sjE3L!>8!gT7B21e6@9Bd^kQW= zG7Xr}o{uD2D%()OqERSK(*Uj#bD>mJ(*6_TCzQOX|5r66>Z z6W(nczeY-auePIJ)|W4;lZRhp+$Sw$3Yr*|?x8Gvj;QorH}b2957sUmno|GA$%wGQ zuiNjyUa&z<>}N%(FbC8|QgdoDEhlfVgiO-Q9Ad!jNM?EI!?seJcT};!XM58F!O1i( zbrd@2xE@xtTArr2+R?dMEKK$3hQe`lKjvrZd|rI2ux8<1BKc_9cSM*NCL+V6rSlxK zfZjL3!bZ?0uE4tm^wCBK_Q_UMU@by8?xoDJv7+S+jt5wYi->azC!AW(%tdHH<+;+D z9R|(YRx;RJ^WDNXyc7ay|6zM3Qz^ThK(XR3yak)as-H@5P3y8pm^AVH64K)a{WwIm zkR0_H9#jTc6(Jp`jXtu{%?P@^KYutvh`J-`^P{D9m!~TYB&uajEK=YqhhllA*P`0t=r70iqK)RtsM%<;Zgd~;WakX3#Pb}eW@a%L#VS~10N3*vl(&jvC;?101|yjShv z6Q;=D$2^C}C$TM?HEc3v-w-DfHCg6Xj0tv{&H7Q()r<8Uulj@H|Wv!#voy!zhuUP};6vNS0 zL^}0N(o*bbW(KcOa#bMbO!lZ8&^)3W<|4*mw?v%Eb+%AlWrM!gP0YPELSk=E{W$pJXLg21zHJPESywv$a!FRTkS$UN^IE2w( zJY4|!Pzpp1I;!D2ZQ|C*9vy|aAB9aN3JTr)?-rvzv1t*YMOQpWNl2{;=8z9*^dyT- z6XoiZp?Z3Ex>;5AY`-iNh%HnEsVUr%q;a$E&4R2?ABbK0ZSDP{AR&=MDVhDmCM`ir z2--N8bRYC$pC>vI@B}^+=6x=K*WT9;iq8p9mQg<_V%Kl}sr@~2;~V?iZUxFh?^Lvb zC==?y_&1b2zcuFain&fooaCJwIOggUDPLTWsy+uh!N+=wpHF}XGUj%O-)*E1UymC~ znQ;0yVWi51^!E^2cDk?}r(U%bC)Vo1A8Z>3hhKLve|aaIpdK?lCVI}VB_g^Kj6Wa`Mhe1?9v_4GaJK>WIa%t@4!nf5 z#$#v5Qc+hhjn~TG7=-KbimB^Q)F`~rA3tOi;w5+>po7s!SEuiJ(bvDK6Ougn&}KFc zN(EF>;o2XVhB3Qc^onL;FTasiKwY?YE>$X0i|HWe4vMNkB#Xh#nZ`x34 zV)#~2;9GeQQpp1PDRW+W3_o!AiW^*U=T*H0ppZ9#PV*6hd2M-0I2x8c}(LP0Rc8DGbZv=eX1WJmlti4kjrj z0b`0uYWX6+uMUPN4HY8;r7-)U$|*#I_TTo3X{%yzo+yvQ${O%#3zKfoNvdXAaCGze zUDjVa9x+yTIsXu z*Ej{lhSwEwg`Na%DSsPeuq{QLS!h0G6*9_J7n2B(3IFs*lW9?cLf1q+qgI}Spa>J& zB%R~5xkliSj6)vLX?x^pX5zC{rno?y8&=)u9w|w5NDj#(?2lgp$uXQ<9|%{*dD0`e zio`wqpw%TdSn_S+B$b=RcjQ8?5V(?UQ*Fl>?2!e@soFlu)mXtVu#+0aKNd};^^qjl zQNCOM0jLD*^1aiV)IApE%DDc*L@V!FINoA%hcub=ext31ae)p{9*sy3_i;eXYYj#= zZUlfisEydRUM^)%G)A7Obf&_qof0VIAuXm-wQd`Q>e`OlAW+plh^H(vRo;rzQS8W0 zQ#O+E!(LSGvI`?^wjJ38wVE)hQ3l#T@JUO|LW8;m;iCRwe+A=IrFv*Vj6&^AMaVKv z^I=4IKNHoEm(bU+20Lq0A)-{J8F`~smkb7SH(>Y&7dq6%f^mkA)e7z|TF(Xi}AKtpPwcY|v6tBz%(RN1>;b2rJsIfAD#xJu!qJ63K zYF_pzjC-o;OPO|V;rn#FLi{Vo$Z>Xo%kcy^n1uIkjO~fa65T9dobZt&fx7|!Za%?3Xqj4uCE6SqhvJ->s3lr^38jAS7M0KGVm4rtQLwS-+z5G zL5X7(?&~%eFc8@0V2Q!2;?vz*JY~rn#N|2($Bi_|bQq~)JC;RxWIG93I1k5l%_t28 zei|TLL|H(iUno=27PP6JN<^LrEthvaNR;1YWDb;SLL)Sncep6TZ0>g}qR)=^MsmQr zF(Bkwm2V;fV;);dxVfce^g?B&iJt0@btoTIRA;^rYlNt5Rf-MB_Mm5=$yYf~P9+qGlhJ7;DCRhY`5-sk5dRtZ zW_ct=HVK$bH=nGD3Dj9v7YKdXO68m4fCZz{j&%|g8OhF-9`fO1;A96}LifAu>r0Fs z0PssCAXfN*r;!7D1nPYYAu=Uf)^3A(AXkHA9m0~QrX?v8!z?vnuyTSzoISYJkcML0 z5lG4=Ao6VhT+WqmO6{s-qP3;c_}Y*G@7c&dD$c2sz1l6564N4fAdcjU3#BP-eL+!kwVt_>$;pfU#{gwW63Kj|0Iyb~o4tHa zL*=_%495|-8fb5#{!8@wF}^DT5|#`J#%zVK1x$x|;cv@sr9O_jDEcT!^exx%8q!d1 zF%I!72KEDDPZ|5h-YO zl#i~(yaQh;wA7IZ+@@VZ?HC9vCqCE~Pjs@k8a>vR1k_DP6ebidht-pVlqOuL&699$Ha<>x= z2y@KS0qFLWcz-*yY}9}eN1($Z@1>rHL8Btks&U#rIZOUFYEto(|1-8M^-RR1L$TT_ z7dVb@v{!Kq>#_>;O)C1zYhE-}!)yCKhsRY9Z|>$C(mn3C@v=StE%AJLb4 z+tZbzs#ZwSs7}zqnH@S^WjCi4%z9;nkB2D7drG;FBk~v$ew8tF!2Ml4Sc>u4;OOjW z=E>}ZJyDZA8sQ3gdg6T^bv0W;p>)Y8UAC|qnm2LuMMmTwN|=;D6l5zF}dLnKQB9g^jr z{;BVp`(GKq1tN)$>}fuo>xv+Gb|^gH^e3A{jI*^Ga%&pn4L0}-(j=CyblsI=+DVSI zz99IF=nUcxJMg}aV1z)$#FV7P#QtmQ;&s*{%Qrzls!y2syMbzv_6H0+pyQwtpBC0z z$LSBaUqrvY)pliWxkSxir=(?!3$pI%iT_>}99>t1Q56Kbh1uBKD%=B8Ju}hPM_jEn zlbsw39IwELb_}zZTN97FEXq-B7*n@>K-8az7JCj zaK0?%iG~qO@JM-AEZ;7|-vK4cx{2(ocwgSX+iyax_vtp_AZoxq3zZR-pUtLN^`hU% zxOV)93{hQvDNqq8sU~0IL%vx%3k-sq3V=Uy$TQ13 zh?!YJrM#TXRJ|0`OuVd3cuc`Uf++kRysrSZW-dk`4_g~MXI>8h@ZY$+uh)MqGl4;W zi?~<|fHmcnKw|bzW*~M(c1C6faSx~)D_9T(#P4Kk&Z`2E_$S2codDR<#l?Y_iOJpF zozb0*(cZ~|iG_!Uhl!b$iItV%Rf56U)6T`ngTc<3;xCAQU_i{AO`M<(E>L?r&|jEF z#`dl*0$}j#KIp&BXX_v@|1Wqu=YO*B$_JB&kpmM8BQuk&Ez`eiIJ=0uy@LGnK>t?_ zXSLU1A|@3xXM0yC6Ekr)GdmZGe}^zN`Io+ftCP*&?wFb|nc0}xzKS}(T4nhUlakW% zO8?UMivkO%t;641uVnv+qzlyizsdTKv;DR6w>$rSkXQA8;r@s8fBF8m@T-)(JTJuF z#PzS^Nkas{f7$0XwKsv9^8S6v%+11V#A0I1z`@MT#lX&H%F1BG!D+(4X3B16!fIw} zV#aCmZ&1>9&MroFCT4#@y@E4BUvZduxJ*qsxJ((?IE_si*tyM28MxU@Ss0AjxS5TN zP1!hj%((vzLeUBOnw3U2|9+~!piEz(xHwpij5s*B88~@Z%o*6tShyK@OwHLCSXsBR%ET|S%~V~C{$i7blaq~`jfI(+n}d^`hwC4P{>IZVb8>#o#J@0Em>Jnv z|5pDiEWEGIyb^2lSDwBC{Js9_3$K`ynURaVlbXG~jR5#B2+&`e|Js&+EhkeW7bA#~ zi`gqEGb`&WiM*_=YRqiBES$XT+zia@yv+Y5Z*K}U_xyj8{;POE{Qn5K6x8|EzUSXd z|EMTcGsl12{o~dK`gbXTKz|nnuaU_=TyQpWGc*1BoUd5_*fOy+va>LI?H>P3*Z*3F z{$Emo)5yroh|}mb_Uxu64D807uc^SyX2ihF&CSZf$!>1S#%cba=+5@$F78H7W+E1^ zJic=Enx21i1$zH?plJV7+TGIZuPD3{#=y+O@P87<^iPMG{^}Y3a{Qvm#&shBbXyFz5e~tW)`2AnH{+F)*5d;4t;s4F9 z|E24H#K8YZ_uZntf2Tum1%j2+QYrI?MFZ_i{h9UN6`@t#=ohdzbk#bAI|= zhz7AeCrhBUqxCZX`TpfO=|Lg+7I;bCTMFnMhZ~;)^Ri2G{ISZRdltVx9_#} zymxzCN%nkPkl7V~Dikc{dE?#Xy!-GnkdIpM8I|0oY4FvK@ziQv=IU+N1cSCzk)3zF zt;J4)BH3!|)3O1N_vOyZYU_B?V)f%%(=$>mLoEtaBfzw2_*GA|(zdB@$Ff7abmwT^ z!Oy9aXTD~jp5$cJ@8&64 zE$sLZHkqs1C`wFwyezwid9QkJ9~jUrK6K~eqIxb0K0lMa>A2rnpEvAEXsfekdc3Ol((fl(V7L)y zlMUkw3BN$nFHYjC?z}ng$|CJjJz)M^d+<=9^6RT-gU%KSK(M88nHc7WXp6zJ*U1XE zU}yW>jK#gWd&9wbWhSP+HvhxkRW(`1nO^*OXyXFJsSc9WD(>GoKl}6gx}^Ym)Mw@2 zpe1E6Cu37I>$r!1P_m-B2xDlW$bitOagA}!VIghapJ|**Wzgx=@GG*pi;LgK;o$Pl z;+j;@@2F_3L#n_^ak#KUQ?9#Ns$fuUnBBD$XT54yz@pLC^X7;P({%YJdileNQ-ETH z@-en`lH9V&^?iM%D^ZUYdaQct)5_WAru%A#>rv>gJWpcbcR%f_;86HknFdGJdTdvE zF=!G}NzOyZ_WJgi|5-H8)MmK-;jK6y=IPIdr@n*J#=}a(22H8ayPb!D+!nW@DM4c~ z-C3lk)Xv-VZJF2(^2Q<-9ALO)b6ZmC&yLR#(+pDH1hpu#+IrfQb(z(Vqx+Nii~=t> zZNiqjFoKb84$U;Jt5NhRPqDkzhfLmF&p+H(21^tn^IxaYANplV{9~hMBwwAo=*PS%%Y^Z{T}1y= zR6}mDN(NF%a_T~Lp+TLS*2Z@_r^kJvmvyqo0u4nsy1yz`gj3M-qUWH?aWh>u71JJG z!0n2u^LM4|$@%BZ4;Qf3_rYOi$zz_W(&S|{K>ZfV_w&SIfq{W6&!0#V7m zABN|f6OKBidwBYDchhyFgXwo@@siY0Zty!)?6q_rHAcx+9*>3Q+h2zI+M4KEe}xZi zd86K^=lYm8tmstYWtc5u4-)8CdPZxP^TCnCsCMn+XM5XjdR`3KQYOx7v*Z8VF|zyc zjmMt0)OhE-9EQxG0b;QH4SiFmpN@TU|c4_Jw^n zWmR*w8u2A4;pBkDaj2OySlCT&ge=y84%+POYuznHOroJ5GLP=u_%s<*O9z6{+b5r_ zEjBG-&f#~TMvpts4$M5-7elgp~RLxH1FNa1SA7d{2Rjp%^r^An3Yn*179tZfosX4X{F6I2QU(lBx*W91iDy#iB zW0`!$h9o zm!0WHeiqQ;1Vx63Kx?h2D&iIc$>i_+9~Y`SoiFxE{Ev72&Si6-)`gxvzD%s%4$aJP z9`J-7Rbt4NKdD?JXVzUfdf&&|cV)EBxH(_Dzib-t+h-miWp`-Ts2 z2slk3^~+UQ@qAi*0XJ69Uxy4%26^iNZ}O2o^U~mxGvgYABs86cwPqztHeb#a{ck!X zk52FK3x63r4=ING{_%erc-gamxl-)771d_KrPFrvZa~*#DmUwb-cDLvcU|oC{lxRM z-^MKrU((aR`ZdMrCT~bVd33$CYIiQ%bt&7X?x8(foW#|6)`gB~fX9^?#>j#y+eCIZ z-X^Y1Qf$Z2x>1kuN1E;Cpo(u#g{DPE-?M6BW8&xa-rnWJ(*y9Rr0Y@D;9=pVQ?9*w zYFj|-@W{GpG~;K6B>ny4-I(9~6CY;S&uZcwe0yDOdZ%Lz%4}ex8({%)qUwjSz` zV#P{eF9|R|O7w94<$H|xbaxj! zqAmZt<}qFw35PE4lF*XLK3;5E<@@p-KYF-vH=TC4?r^{7@Qa%<(#|8ZO}sexAT9Pf zM}ipM?;0rrZQdMVtVvCV2r-$Np`Omp82bCHyRUNw-8z$RAz3j?k+2^Mvt@S^noLS_ zPI7II+h20DYKDx-4eriU4elQsHq_H9MmWat?E2dnR$$h|1fFgATb@S#oarb_x+8mY z6PISpsN_*N)f$!4>K4`~s*Fu0P#KEC*D^sD`2?=;d-v*L9wGb4-?-Eni|$ed${wt(s`?G-L3j<9{I3?9=>J z^-9~QQh{h9+ou23Xoe?G$IC34oMcmnop!brgB(f%$Q9GsgcBl5i%^(B6xHxUm!Il5 ztH@-+9C^pkNXa@@Y6(sRD3=VN<;X(T8gU^w+NzM!7v%Bn!d*-mqLs}pTR&&x(q=2J z=Mg|93jP{n(#7}knkEr*FLzG^C;qF&G?nsG+!^m8twyEhqt&A6EgNcQmR#2(0(7iL zobq7T2$Q*8^)#xB(mB{b{O_fU4KLD0xyUCG+3ZH;+k8P)`W;zs8@?CGBFVx3{#>5= zGG*`>IyF@gyiLmDw4d%d5c+^)D;fTL5%O}jb^XgCezlReL1lRZ{$-}t1HP^+9zkGWzp7A7;5v0&_Zn)TPmftiXw~^(R8Ot?Vnj`*uUFn zIBk*DhS&xDlnR0?FfnE~*TxLGuAi?SD({}W;}_Hdf9q7~-%m$pUL5`Tc~{@C}CIVCL9^ak)O4aDG_#s2U=u*vBi|Iptr^tDzs3jBq&IQa1ki) zTUMI=d|MP3%mv0Xc2#3zno4O$X+y!MgRt9-DsXZtxa^MFf+^}{kz}oNc>SL5XHK2G z9=UULm~K+_2KvlHPB^WQ0x$;}OHPD3pT7P64O@Y&&?}c1^fpnG!!QFg>?p|`%eiSx|gc~$x6mZ5g2-|);(CS66c6h~fR zOL!lnO+aqZ`;FKzdt;-VrGj*~#OKhL4P7o@6xG)!v@HM*Qd4%kUMQ_b>6u!ecYO z!1`6&84Q5pY8cIlK>Hnu9bAAR4JC4dX$mg=F%WG6k}!FmSAPNJV|-APL{Sfx9AxH( z5uyBWsDF?wUU<;BOJs~yvzIz1;CwXNP~d-sB-HGEbL`Bd`?9nv`1GC0_d1rW<8I&j zq~qfHs5Y|jyOV#%;kj1=_5;4)%jDH=Rba~ub;S0{TWLPbzoL%yBGmF!>Gdr9NghUR z8%>1*juMqJz2!aBnHSTYr^FKONY%^L<`^bcdOmcxVEKbuzu5k(}*n0Gk2UQG!- zr9Zj)-hkyNm?PYr~cs}2?_u1FpZ}_EGKSW!N zQH67qGxqu*1=X2f@^`ukC;nVykDCX;mWsg9Oy`L}cEB1ODLBBG^po4Y`TBV$Q|=A8 z^Z>%)y6n~lZBX*4#0f>xf}|m-y6EwH7frP;Wc`}PK)Wj%)AjUl@vCV%>2H|1xIhPA zYy8T6*vB{U`h)05r$9mz=dd-i;@mc}0JB!Q`t0ZTa@E?Q2;RZi5AjBgkO2jAYo@&$ z9(KUS1HVmiO%{uaMBY&^yfBw`hEmhENz%RrGEiU5>NG2+x>ZA{QsTlgz)yX~p z#xhpjqxM*J?06!Jn4YrytzMg3&2pTc-}U{~L8&4xGFP#oxwYnr0Oo@2@oSdd-8Us6 z2@%BEwP*zh%k&nax^po>D2EMUXd{-btWzj~1pSi?>C3}bnhX?QBh6=tA$qAWU_(Nr zGLtmagiOgiuR5iC;pQmj8tuyvO$JOUwcDuTVfsQDL-zs=^27(%eWs&EYove@8(UsJ z@5dDR0pKV-NaEAhN@fxpFoD{b91mVB-$Y%WbX{0D*y-X+gA}dW?`482$Sh$U{P;G# zrk!t$b_lL02IP}>4do6z7eSC%s5mS}S-*HQj zkW6c#lrs5WvFCh@8$c)(PS-i;(zK95P$+85whAT>=@nkRs{^9Fb&~`1+~o zX9h#-XeBTyy+@2a7~H##r&i)sr%EX=#z_&N3}H5w#F_ zWEcr%I3pkowHqdC-E2feL>f;}Br*g;K`;L}-r#wi5mp(o<*qxLeLV&NKx0>_6eRA(IP&lTU1Q{hbq~wBYo~w437OZfY+!}~)UikRU;Np1bq_#hJD?0FiWsT;AW2vG)*ar2K*C&_$5V-* zJv}H>emw<3wcTm3H4|uUkBye{oTsC=cy##6-iS}L`^zlX+FK}$>kgW+sIVGDb#&$f z3tKc2P$Z3F3rq^8MgYoBajr>AakNM_Xjsetyzl&|LQX0vn*kpQR84!g{XK`d#12Xd z&yEBzB5g`S+0KgKxS~7K_(V(z9){qx%L3d09#I2b9gpEJ#{AyyKeK}wWJF77--$aD zODJ4EqA||LxNujR;CVQ90TCbyEp>>@t78#d+#b1Xb2ASHGs1FjtdAG93PlYd8DAzI zSru$YcS!TR8(Y*?UVnx)mL_t400l9Se(g|y;nK9pkq^KhyVqrB=eL<_x`LeE#xkMX z@g>63sVHSZTMPuYVt`QQLwYOHTy5Yc&;kof8$cVg!^7I;{YJA9UuXC201(REEN2B; zAW(P**biZ4s}P^3kf}5&1)9bIi1R=}Y0l0UUgx*h?!{9&8Vcr^b#;2kmlpMP1ve|+ z+XjrSq9OtF2uR4F8tkBv46$xGNZH0Q5CUonc>UKNm5tirM~x?ZDW*G>4YL^^+Qd{b z;*)vVOw7Z&v-q)k;Eh-$ufiOpWh8(-Xd@)Ok#8u0hhYxkEi5gc`geNxPO?_oe6K>s zb~|?QkeFmvpm0ZkQwt{mP5jC)Cq%4qV6>EmyvQ(lKb8W|RaPp7ePxO<4=P(rTezgA zwJl*7G>hMd=?KZ0L{gdK=AG0C1uXDKpp`0xQ+2;62%PQtmN+7UnFa*_jP0i1!ZQTG zpkU(IJFwuKYmXk^%@;^+OS}L1-f?E?=^=K}xixbr;noP(oeRFojvGDhc(^8ey68vG z3Z54Melau?vBY{!IoVx>^w)~}uI-%D!%Xf|tNC@`sX;WPjmw&r28?(?oQc&p3^P*jv{1f6UtPb2^k5By8t3xsh`k_Mfn4ipYqmY(A$WY%RMTeaNjE5pdhm$}MRo05I zw9oFuj)JP9;TX+~uMEsMsKtQgZ|^Dd=5{oCOYoy0oU6d@ zC3YTW?FHSr0wWXpu(maN(6sXWJimEUzeHt(u_%kJFOUW6tg8^vuyY&$tW9s?jHE1v z$431I3a?0c;JK>AnBvBgWeX22rrhXdN2dS+WtokOB>*GDz+)f?D_n<;Dv>v9sV_<# z2WZr2u7v%?^Er$vfzlC71+H^CHalPIPmdgqF*5T$Sy@y(-&{^KBm2d{c?bF6-v>wvGU<(4v~CJOn|YUx0`el=^_K0G_p{@z}+cx18?X#2~(gHxAnuBL#3 zHxnbKKGsNE*gOph!0t2F4h}*@VMAnk$V^2R>8c*Rnq?2P$oWe!LDoy<+*1utr~CD3 zrMtmH!4w~ps({1?SS>R=>?YIE!rtLZxrpKqY`IBB5K>FIiXjCDMC4;&gXm7$%JRqv zNo=~7YUyX7Xw0dG?3^o45tM);2uccDpz;3zaX^m0s)&Rc5k&-%5S$Pf1UV)TX90p8 zAV7#ogl0Mr@%-;fspex6VnE;oCq}JRHHoU3Lqcq_;r^W;oo>#Kp8fRCwDBzOUtO-Q z{S|*f;}i1b!>vUaA^?wwaD!JX=Wdgm!A5Hp;edzRI1L?-KYH`Ki%u9hT=x&Jbc=mX z{qoXt(qBvcK8uj_h`KpDy8HI)SFf(OPj20Q?duQkyp_0-P3um$lY%}hn8X3j!YQ$+ zNSvM?5rQJz8bZ8Pvvbk~wFX2;$B-a|xrdn*fLm*3MnnW|tyXWfmT*&wGEL?Un);lV z%VjBrh{o+!bEm3q7VZ%d5z{ozPK9Pq1!55aTC2<=k|St-VVj7VMMMbf?o0rJ1I=q4 zwh(4jvq}in1cYOOn8>ClcU~{s?K3xiT+0`uwblN068+%Q2oZ3f!3h?)&6TE$3esP? z4zqr|$KJh`@i@YwPTnT+0$3^A@M3KkPLGvryE(O1!rC-$`o3#roW`wi%{Ij7rG<=y2{b+?=p!P79Lu4|*KD2TV4 zZI|;fZo4j(Qo>q9 z%ySW`S#*mfAS9yQGK^SqK&ad2nQ=`F5QzRFmRTv{<7pOJ9qMpoZHzXSaT{&0vK`Kk zMf~XKj&RttspBbHAu_WNMyrK6C?cXoptUK9xJ7scH4A7`vna(D-O8MavwK_h%V8YP zPM-ilnM6oQh$2E$&P@o8uwYFQ91#j1&W~c+uuTXLWdv)#(A)=QaMIjC`VfV#_AfnW zq=r!KML5EyX|z&6Am)o(+%2U%O;b>e+p$j5YPpDrsg!V^uW@Epm2n(JqfV2xM((O& zaBpL)Q`dEUzZU7L2aDvcPpQwj2eE3Z;fCwe! zQns}fgx6Ln4DN&oQ56vqA~8>rJFrI(D1ii|qA6IJRnr38?d@Lz<@Kc(G%vfwzIJ=0 zed;eU>t7UK@iBM+w=!-|ylmQV)TSeE+wzV{?sYl`NJNNun2O~7%5%@T`?xs`Vi7S1llVN;k~G}ij6lq6 z<8d3##EZ2`BINAK#LAqAGguf1a*zeuIE<86oKl3xOa%p{#R7oUI+fAAF>|RkX*W&V znf zR*QQq77N`!1WRjPn}Y;Q;ch;soI*_QZM!*lH*sfX1F0m*ed<@DT?B(@4*LnvEQ@6q zqVtRx+<_nlymPL1Q7`ZF^#3o zzjgB8PGR7>^$er}s~f?vPhuo+kzYSU6K< z)p@vtNQjFmW^n)jAOJ~3K~xAr0hDn|F=q}=1daf?Rf}*Ya<4OA4dE1+=MjlmQi>2w z8O#7!l4uH&W)Mv?%v!T>cW+oQXR##RA>_$WsF`u(mYl&7jn@!i}^Ye2i(Ufw(Ff$@1kh`;Rgo{WWCwEg}vo^nIK`?I>a3L`H z`F6;;%iWqJsiu^3&fT0K=iEm?bJExhNB6d;$5y6cI1O+3pvD<)Krj=C3Ea#s=+oXJ zf`ZN2NmK4;aj#j~C4yMh+=wp39%r>LB7z4H;RqHeA71O1SMuVSes!5e|H^rQ@%-_$J!<2o4##DCck}q&qxI;FeD-f5pIkiTolwrbAUw{AcRp=R0mOF zg&9~Sbu8R!6AzoB>pOKJ*C6G7rQM42!aabHtN;j15D&nu)q+Gsj35vRQyHgm97-7- zq`6DEU#%sj#6)0rcWcHh%-qaC>}DyaI)%H7aJZ$Ua0D6v^XB0>cU`yiK)4eDh*~FR z6(YCBA`FMuT8CDKI!#2gKt(VR0f`vIN43X73Ry zOoRvuny(cH2Z0*^hI??WEDXv{b8EuX_k9@$B6w?Ng~>fiR<%Iit%Jw{L=Z_SB^F`U zlsjRTXh#pB_No{BRq&Cbx8>ZI3#OM)f`p)0KByVQip(;m?F4=Bq@ssBFL;(c)*Q_0$|J!OV0iQ2pHf2W?>SM&LiAP zIJMxE7n+u=85#~EmW!5k0PJ;~LKaqsRyMV5P>X8P3GQy; zE-HdV0YVb(f`y2jiNOgHpkM^TYlAyriJ2U5^BH}h)p}1v%)MDtRTiIz6`4sz-5nH3 zWtt`y2C)ZN5(`Awth6vvipC(Ml-;IMOUEqiOpS==+Gez3VWL?y3)3{5nzg=LgAk-3 z3Nr!`gqTTm4qPtM4-m5w&x_r|BU%G|9xU@AG##}zP19iG zqwV8&-hcDEzJ0Vz!D-E^oH|G^+Bq?1O0s+zRZw9OY)KWw>BA8{qr2@>7NHpAM`5tp~pDRfWXI2tUAU1PO6hQ&D z*^>)E0RsRAS#yA`)#@#!EJHBoBH~~*Gvbu{6<9>n0Ffl3?qSw|i$>l>L5)HPpl}dKH1);| zC9W)5r(qmV?|B{SWM!(K`>Fp>borMG0HvId!)co)E9WvjesJ@9_ul#DDupaWbP;Jm zqQn{`P6A?gFSV-9ss>Cf?z4uJxX%S2a+>Ru>TU){fF!3*oJ*U^R7d_`EX#v}10aJp zvm}bSk>+9KW+Snvrn&haL~sL$Sw(1mPbeZH;1?C}@GwyFz+4FNY9b&}xA1_Qw+M!G zNg~{831%W87(AHR%)PZ1-fCr$l#{qcAXAXv_hW_Nb$B zZnaW9ogTe)ByIcYpWVCkaRT5eC&6Vp8OQTBjlbrphcLb3OU?=kW@_fRAaNML7H}{HGePx&1S(AMi@;`1mjU)>gjr)WgayP77Uwc; z&yVhPVjyuavl@#7#MDY5!rbY0bBkaESP%pf$q5&;G#7sZ;*>d*JFL!6pTI-=6-f#g z4v5w<*jloZN#hM1>j=*eJpQ@@R>Pgkd7A7pg&ESj0@nuyXX^ zUZN5Ju@IOw5$EO(K!j)A3Q^7dqBeJPQ6&;<^RjV7V^Jc?S&1m%6&V!Ey=R&k2oWF^ zW&tCSgnMZdW^q*FdD96}S`*^ASN(xsn3)smhMC{XJX3kugCup5GN#bhYu8a@p0BvTSMa(4pZ0@S6s>D1;|6uAwbXn@=IHs}B zS#yFgivZ%yBh1X^GDy%2E;u5Z5d|PZ3V(sY^NiKh(WTuV!189W>@+?fso|BOflwU>PJHmXK(G z1#*KX4J>;64SpUyx(H}k!WPKjS5>85RF$hL>t^0(#5w2Nd(Alqjk)$0rwW9TipqO4 z8j+E4BjTKI@3rP*%rVCFG3SvLW?C8AgArk|RGZd@Aek6>|Nh&rCGYxlOLGEa>?Ip9 zZnu#UGwvn^(~4q+n49lvmYGr0%&Jn{rOOu;vMQ@8qDqQv3rLgFWQI~RAW)%7gQ)1T zM~Wz;r~nn`NfuaYEtAli$9Mni5B`t;;qUzC|IH6#()0h% z1<1Ic=iB}MQmbxg^EBqyxy3 z3K}FMGIQHp)v79&a0CC z3NhU@vd3g#mUmrrlZwv8d9z?_kciZJttXi4#K zClM8urK*q#l$#i~Dn=FrWApPkwr%v5$u5=%Rk1!IR`dIBzK-MdwvP_~I(FNh#rHEr zY#YAel#B^b)GHxS0Ijl@hfB3tC)k2yW<*f?)3K_w<4U#zdx@y2il|t}2Z*4m)Vu>) zMTtm8WoEJ=E*ZP6ZS`7xW2(w+u!{1*s1kQX{)_+RzyEjsqrZ3i@bCV%UVyiczn;fO zsn=irtAG6RC;#MG&++^_v3()i2i=~t%xsuoam5IQ0y2h(Xv9gf-9+HpemErEydvE_ zb9PnG7o+dMjLz~9bwWgihhLxqS)5sOHYz72|i znPgiaIX!JkVv5m(pO`>|~s zp=w*iDUd{=C72|D@eb|k-?`uKeG|+FNwP$&3ak`a#XZ}x8U&m|5os`}szkMV*#5a7 zRx@>P$+D@c5DjKDP=uDyDaQVjO%NZy|J{G^-~HXc|K9@JZ{G#TI5Up({_*(sk3W9- zi<_T5o^1axp8p1XFIr{wUI?JFN<ZuJ1!J4XNm}`thY-5C^3;z2ZhOuyxqoe+({X3s!FCS$*L$33P!Xi ze-#J?hP!Rb$~g~#RR#)XK&6?-JOtWAq0O8Xc}7-Bu@E2&X%K@Jvp9#zZepl2S)`ap zl$*Pef`mXtbtIvpL*@SRX}-M-*D;3JD5}s^cftsT%Ghq10T>v7Mg}QV$c5nm=%2Id zJWrCosHSadtt)c^B=Wr5Z~$47MR$jmin35lRaG@W0I6P8Qy^hBY`Cgwugx@D+>_NM z1WEPXAceDX?%T^RfAJ6g{r~j8{Mo<#pZxY+fO&t(xYvCB`j@|l{LXH}zW6!zpQ!C( z8?#iUDj@|h0TZgIxib?`$KF;@svRj-p|7e^RMjeJ3aFX6J0P)aW&5o6w4i(+C<>^m zk)di;OQ=hd5vrP1!@a5iNy<568#lFGH8PVVnK93nwy-kM%SS;<)9XbYVlx6FP`6Ea zLKUdfTC}cONg;0TZJ8*<=9`Epia?$R!Q*(dv5jHvH&;v>8z==;)hbd9BBg>zaW@fV z#{C8JK8E^mh`=0h(a~knJnm+WnpH66HZ*2-@TI_Ybn?X7*VKfccAHZ(i%d~@01q?f zW*+k{*u@MmQIp1DMN5_qu(@YlPY)E)jOn|XdGFDoH1DK(bjTvBx|kaKE#xNJQx^`*Up{pu37e#G0{g3PBgyYSs}5 zDinyhYQz6jNKb9dy=OIxnG4_RnWzFpG80GtYaSZ>TA#W;WR~o1yUDu(ldWov?)_e7Agaqm4?Jfjh`1;YkmWh%foEZl}clR;6 zTPuLl+zC17jF=>aqM`)HzWKJRnw$AHR7_0^jLNziJZX4Z9JF<3)}!2#TthO6WN=6J{ebzPQ~=bk2!N z#(9r(jD|a@WJM6Q$(a;vPapjD;h8>@yl&DiHMNCB?5N0FUB3f)m7wKuR z7624`SI$r~HA4|aGi^c(s+W8#psFTdutd#uD|-r`xAFQ1|KuP2hyU4s{hKsv@xO8g z0C3(vefjdupKfE*v5W5or7UV-$LxscezbvzE)W-8ht+eajLa$lCg&JKfEfu;K!rqP zW73f+B02^Goq00?BJNsM?xyg}VD|*>{Z$AQ;bVYsZ$*{9yu9ex_H8rY=6SEGnB`-r zDWf2gL9kX%mRDt-0x>6xS!gNltp$j|Qs;Of0*%mp$-M8VR=b|Ny0BG_O^W(GynyfT;t%6U$AsCA2)k9@77bIwWb z+g_3tHO59Vz%j-m6m`9ef(Qtxslc{6Y9J$>i{Gzs5!i8sjuQ+(_!{sm=Uu_OyQ-Y$%q$TlF@`r(p8Gg`2Rg{z}&)LG2BI5hL- z4=xIVh`Q~!eT{irWDXJZqQ#5AnA!2HZx@&3MciGA!cs^9QS9Z^=XtV9T3y`X2QtPm z^X38w>VAK1hgw2Jdz>j`YXr9D5)%sXtY%WG>$Z)jZTrIXNo5B{i9t<$F9?|PctK7V zm^7=WPzf?(wq~s&GC~R{C`Ae^7)&dN%4nKWoHfswcT_@^vT;1=?Wg1E=eB)8XjMhb zIcHX_k3h~jTP-ajx7)2-rfW>wWCd~WS6~m2pfmG4&UqdYvo|1A23UfO<1Q6d+1P*c zrbHxTRwS!f9jx5URL$KNyQD)~MiWu{JIt&(XJ&MVVm_!wb&ip5U;X-z{uwi54k`xhynyqM~;_gt12vt+`6zOup0?bTQ9b{CIqGp2C8TX{@ zF@6`d;UFqQWf=fMah~Vc_P!yiZPCLSb04EOjn;Z`md$-=&D6X*%WWImCLts*0TjgT zW)`QN=QMF)HLyby5hbmKvRaWDkRjVoY8LV&^FGsxV|!||^X?iA0thoJDI$TpWSEqS z09JFFIfW`4E0}ji5FsK|*X_CVCeI&|S~DU;MReQLM`hk_H+PQ+R5hB}aUml5`A4t~ zxJ0zMP7&1?;3{RIiej0oKonZkLfZ~RoaeB;fgVvKB<958?UBM6F&wTw%uAAhiS}1F zwM7^0O&>&&DpWyM$(lz9$GC0#AN<}w{F{I0zmVV5ru)C@1(>hj{ptVtPlqUE5M-5B z*)WQM^vPVjva|IGb<}Avuj61QBB-7NEVBkBuw;-Q%xRomaZ>--x_plM_Dvb zO3d?g_Z}CBz{kjl%!ruhah9%k&`=B+4aqgp-+idsJf{eonnkLJ=>QT1sY(RFDpvF0 zGRvih+zR!g>Gpx=M=+NvdYVFZ;3{~hAP&$Q1tTI)55?`x<%JqaP z0%3{B%<$HQRb@m2#bUaR4I-+lkYde@b~-Y5%T(2--SC zk_C4IRHPLgrk4i-No}+WuI81^EAFdh>fQslnMtIIi#mqy+de-@9xsAvf-3sHRe?33 z0E9v;y_HHD5fBASgeuc2DP`PEC1xg4#?8hDZXf*lr^m}no%i8BMT<;|mH>|t9wTCm zF*DnFnyik&03zlXW7|e=Wa=5#iqNK=C9<~`Kq||6xgSg=Mc5?s5}s$65kQepBWatd z+O;8&Sw$3J1t}7$P-*%Q7FI-6A+;m{nmdm}Du6N7>f;~3ef;*r@BFRbf(tN@m+!y% zB_QU*$0#9TV;h+XqWQ^yDWn*Te6(C#4ws7dCFs$5Rp&>N3P8|olvW${vFjed%z~Af zS!HUODOAWBmSwF%MGcj8zrVS=iv9d&eO)j1y zQqmP#x?7&enWZ^&)$d~r0fE|gk4UO^?LM~W-n`T+#^#(kkIYcTdENo+`@TRYh?#fK z)ut@{VY?5m>Y1=4t3y6n5CTZ1GJq5rkMY?WEgLct#mbC+bWM|MtFSho5NS3Su8N?l zpj5M(%lC{dNU8eQfA%kaJ1&4?#{DbPP1LeTHL;;GWj9tj3+ujWA*Wf*;%eWN%yjo{j5AV1BIdsD=Q$(N-AS0))6-M` zv9WFEc@#^<0XgT~Ro{IrzMGPcx7Q;wBdP7pCPILbm8ohXP&0z(3>9;`?LXOG^PVx) zhS)AX1Qfc+WMSJ}L_uQSNu@wtn0JvwMW9~oX(RwkG88nkc^p}F+Xm1HP%~%iDDL;RARj*R{k`@UzUnE~ZK`qv~Hm44jwt3`&YRWyI3ms^&!Fs@QW+=q@KS8;!- zprRtyI~5g$e3nVCU5e@<2J_j_Gb7FEs2R$8u^v01k6*u6;gA?8$5-=cWVC`et1O8>3%JbUPC=3@*( zq06yL)wli0$EG&a2Gk-5F&noK-+uBt6NT_2J;2F` zDeZhF?&?r=AAj)A{~@lq!H+rvynO#9@)Pt{AhQa*>4>fk6@)d5GoxIUMAdp65BRdX zC{^!aS!Ae~s~n0Z-@O>rZob}}NW%$ce$Ht=R5fP?JN8$^R70&Bhk4F- zv@n8retH&>^E}V{-7d05%U}BPu&kuNDd|pwl-un&D_=f+@0*Ks-me)^1<~8~G%~_` z&lFZrWZO4^o#*K;?pvObpqRU9){*l~SY-5h79Aof%#3NQZR{j%47X9_ahzk@hYtYm zPO{k|5#jFO>=poxr4^&46cm7SMnnQ^?C5ctFJ<9V{RM>zV~i1j8zderB!r!-rXS zwQ5G87akhB%&ZEN(KoGs=c1!Fq~_|Lr=VHi%D8_u-@Y2p|JINC0x-_+zx+coM4;vg zG2cafm`fHIOT;8nU8R_bh(EX}01M5gH*Z#t0%~R=l@+MExI+-ti0Czm7xkVR+*<$u zAOJ~3K~!y1?cPzU{p`txTur-VrmA(FV5Y@7kJEjqYGrTgjcwbSD{&n6r>EzxjGv#M z=bRDoxTs`-3F$eMws6@@GENnrImdPbHM5#dbALNTW$c?8U^61kHWA(SEh3~#dC|yZ zdlW)?zyKg4V5U|qs5`VdAF+#iYik4$x$U>(JTHJB>~$DsEir`3Z9qc0EF_&( z88OYgXDNMu8qx*LOjw0#rHtWP-UKKLVv?DcFr)Dz%`4CMoUyXV>^38_{bsOjql$CR z{#u(GOlKqnY8J$d{!dkL&w2mN7{~n;N}&4q^`HJ@&_x95>d&w-BSpkb+lAmlcm=9w zL{_0vSV%}Ox&?cosI?4SK&=#%P?ahf^IliFAR}V-+3j#uf&^jOX_#zpT;`mp+K2bj zlsM;Y?3<6id+vVQwtbBL{(39v+uLikPSTvBqMli*HpXbo9Xy(SnKHiagFYA{)T%>X}tSFi#UGgeaA^i!eyBh@z^sM>Z=(U^-g5 zus=N);A6BZWzO@M_hcqCDcO?Tm1&ce%k_v^nKkG6_QuL$iJO>~;8BY%X}<_iDM;HU zr1!HDRTWj)A*g!;RTH#t9EO>jF_W2#u%01RTIHfZWyYLGRfy0`+Lw-^O#^Aoht?S& zBP!;Py##uD`B=xRLPQO23tw+cgse*9fdk+Ie;Oxn73(!HyefN;5s`%<+pOp%5ZwmG zadI2(9zii{*r+3Sw*>EI@49443m#$9CC>BQ_ubu(h{)`2gg{pd5wY*v>&t7$LZF_W zp5}SZi-WCVXahmCvRsQjRAywDS$F5801k?~w>8l1b`!yVyXB0$=m*y7;C5soOsy!b z_Y_e;+ta^4h=^zb23x@FnyWOmbA3#*iV>kYs@e^Ewl$oYJ$BFFDk-0C&r#erdlc@- z8qJwQb(_VqsuDHPp_CpCRu!taqWf}!h(-e1Go}i~B7NAhm@|_Fu=2egttZk@-OW^x z^Dbg&BS1k$%y&)pkMsh3`|CeP9A%l5vFuDJf|v&cEY`AdmIqs5#>^$^T|d`FUy%!# zn{zgAfh`dPz?>7Tk_7~9W<3R7vm4LR8?g#GtW7mRKco5 zRSHQ~WJAeS)uQZe+f;S9XO@mdScvAXiF63N_Lo7`U^{27rB$RrYMxyPE{dp>Ex@9u ziz{RZ`a7s@j3VOEVfP&<5mRxujG0+#PKHvMfzIJS@(WP;QE{{n6e%hyYoH@&U?+Q4 zx~7coo|T;&d!Sy61M!)(XgB~7wwV>vO<9QZ?7y{bTUDv8F`0;( z0mSWgJC5V=++SW^ZeKi`Sw^VJ+w0ryc2j~G71V*8sbDn3s4A+WIy3jNRc14adJJdo zs%kKbfb8+J`v9`1ORCxfU^eUz9YYJuD_Ay4;`>jzBI|^s0`s0=NipW(qerVIf{Z(u zW_HZEncQDr#uycG9LMc;+n%04nKR5N!ZvY%z|2H2=gdr1sHmw&NIGSpoI64oQpxRf(vU-L-D?B3AIh1X~nfTZD)uIA))sh}mQfqYf=) zl|egU{-}F^?|%J)ZY9&Z0uLF*0Iak>=ZPzjODer<SuA zRZMpK6Z1IF`!G|Lj~_pN`|Yo&s#l_|GjClL>(Z+KTW8Z$h4^=f+4T!R$++0P@^SEqI8oKG# z7`knHQ6SlQme6nS0?Ua}OKgG;>icTHYd)bi#SC7pLWKuA0&tt!t_-((r`x)mFG`T-LJ^65GF|#5SQjsY3$VrHpp`H3w zecO(CW_2@b+3W#iG`@}AWhSQPqM1xG$zt~H9b@0duIdmK-Be74%9A+@6zDLQN>-ZK z*q+Qb)2))j_x3evC-a_7i5RoB(R0QLRaI{_vkx~j1#=#8PG%x6qZDaxfwrnCg4fAZ zQF8_JWJOgLs)SKBv$~I$i|Sm>!r2s1SQhd(!3py5i?ob zw#~%O^N7rr(mxJLHKV;^So4j`%^=puZ#x|=)~dT)+WaN5Csp;rxEAwbbB#GO)6CU9 z?q@Lp6|%j=1k$T%nq^S1b}DL0;p5e8+rYz|t-7X{N&;*SLeDX(D%)`Q2nbBww>_$|N>#RP zYergg*-e{DFfIa8d$pHAz%mmRLE$!rk{Q!fT=aodsu=}p>SL(c!;eSawMt#`H+>*j zknXPY`f~saOcj`lDFh_~(`7MIRn74vX=VT~*8y`IW~QcMn!PwpwU>o;ceIF!i=g#B zhvT84Y2t@k|0(PI+^-Dp4)EWgRMtzBz9B1oRILI0V<6ltQC5H4Dw>TSYaw`!6nSdt`3(I4KGk=G1HqVm1I^$ zWmE(*BWBDqb3w~l)z;4V%w$$POrXG~7b)m!rj|t=J~NKD*W>NZo@TdCe@qcp&PPZa z+vtn>UUs;8K7qUUkO4sCteVnFv`8sRF$5L9_vd&iSh2Zj7mEf*wzV?25CMS* zD$bbqvzJ88Gc%fhc^xcX9X1JOw)JO|y)}cZ*71NuR`np|@#FED9?13e^MlmcZhfmZ zY8#u+oY22;OsaEL=fkYJMwxtY@A}wZZZxf%H>N1fAkSm|7%#x_{U6=G`Nh|N_6v!( zVm7o*04#lH4E7Mty>I*<*W*2nq`R?soSi0Q*$WrRTvJe(x%4zXqX(3NQgF^wfNRUN zlW6ks!#Cye3W*}hOdw^Z4Ow&~W1gs-=W!l)R9X9dRG3mhX58Oi=XsJGV>CCe&!>u1 z#UjC1sA^_JoZIHItQIt{A06|m*6Pv+CFT)uS#=&q57GahGBG z`&(4)N6!aD@yHbothKuG{SOf#gjHanj<3J`!^-o=bpeh~Uw-pvzhB4K-+%Qd?skE_ zO&ZYUgOeJ+~fYH(uuTb z%sm;G=GZ(=SfjD~e(SH>oxpYS-b)?O*K$TYBx4KUS`odE?|O@MCFb^E?UlnF<{lXT zUs^Y@A|TlQ!;c{NJ{ms$V#~$JQ!&5!^IyFD`uE?rH$U(Nm~Y>F{b#?&`OWJ$e}r?XlE)z5mK2kS%yBao>SCfRJ3JSyg9&V z{t&m@&9)upbFNIT>gv`rzB7)9>88mV`)%8wvM?j-VOY0Z*i6+8QklK^SO8m30>u({ zs8J2VWr<>E1>Klo?AsUvy~=7%xdbs-Os^hyu^HX?+(T zLQ{kK%Tf6H=l}fp=8r4mM{xmI`Q2B4g!shx_~kGE2#j8?AlH)+{p67X<$8mpcf>lKLjl@MMbyu_HHLwhHh2W!gUR0lknO5n$ zKIuDr{Nlquc#?dy+Qmh)W5#5@<@x=`um06vcM|yjbOG+4zRb6;5#N6MApd=z+wsuMP{&O z<`mF+;d3{#V8qOMMrI#7QD%i|U)us|xIt>pLoU6DTs12wq%_mGxkIL(Sv1?WH9Nl5 z2%Ygn%v9fAU$b>sxYmC(fAu)K2k>Q#!*|`0EODslwa3l{hLW5C1~T4Zh^wA_jFTUZ z*=A$0NYvWX#nk&G_h)K6s$2OhLozGLigS9~#h7l}-mAnGNkynqWU@di#j1dJ9G1sT zuBw(IHEeYSyU&;@7tE!Pdbk;{kB@<(pceeiV0?P{^sDc`{^N?{2fhHTd3^en@b&)k z)wjR?*Wdw2lm#p(gcPeI-{m_~i|fnJilN8Uy<<45gw!=7v*BA8*_o71>elF@w5KB3 zAk9!w1uH|yRpB$QnObJ1sEo0XvCRk{W83!vO)Mjh_tr49){JOA97UiF z#a8sHCR0;s4n#e$%SUhX{wBP`dH5b6dbA4bnNZM{!;3s!s6ZxQrlTt2_=NcM^4*{Q zz!%_r`RaW8Hsd&6KjwTB@SH_^vhjtCTZu)p8M!_f05b3QduHJs4)9P9eYR+7mIUOT zXH$Pq(p25`Km{y{n!2;4(~PxK6kVD>t0DWD>b8As&VMrsXrklePdCj$>;M(r&XGdPlrnk{~0)bywIL+7Oz*{uab-t zg!ZUI?Ks}N;`QUNGXEMOQU5oE|G0npRi2+def!nR$8Y0&Q;{kgeuEBGstw{{+7m#J zgmH~R*S)7)$x2nT7JxR! zSQxyDyG1kyb8({DmG%NCi-rDgRoNm3tcsijd$o=ft3pVrl3{us?#INlw=6er%1np5 zT)nS8tk~BeqxXeXZ!l@J>rosFSvdvQOi2Cp(|0P2^HZEJ_Vn`~CIhhMeEXj9TIaX- z*RMp=Y}}qcn6|~23yf9T3Or;x1VdCz+aI7J3etump<*J|meHzay^p9M@Xog|TYG^_BPY;Xy8i-4zvs}XVuqlY zDJ1d~23R27AG+@o(J_1* zV%H{&s)roA!(_YU_J$U+hTHJw_lL9)3Az@?Re{TYbe^ZmvRix1bUr(Wjt!zdwzlc^ zHU0U#mDS81IQrtfU`42ELr;MST6KP&$IHu$nYJp;RL2-?OF^tr(Qt19u-fu7J?Ht* zo3Cb(s47z%?z(n>B$+6-dw{79H*>u9`NDV;PEiFEW>_@%D}&`! z8NJYfms;gL^XG9Z9vT1f>-T`#W$hN7B`dQsgu*&2Pa#+Z_gd5=0>&&6LMr0C-G)Hh zkTEi3HEIe`Q!lCFqWG&)RJ)MsZ>{~(9zcz$oO3ojqGGC-j+t;9H6CMBHnUQp?FPO$ zze@>e2Fj3k2+6u^`@Wl5uMS|%oTpT1J5e#g%ACx?`j<+?E@EgtC>~}?RyW9|)=%^8 zAUr;bXj>M zmK`A$Sb4&pR4j{Q=*6H~&nq8flA`H))(wLR&>kcYE=p8^G}U=TsX)n0Whz1O^+Yp8 z6-E&@5j1mVOtU9#=UQRLGEEVcBGo<5s3Ns>n>}Qf_cI!jZByE#TQNqW5*T99I&eGi(|$!n?PY65^o=pb@NL=WaatBtc>G4Uzi1m`vy^BO)9(0hag!^VgWek?Dc~^J6srOPji5_yy`k9 ztK=PU)+LIH_S>2f5HeG+42fHsJ+@mhn*-hEiJ66p^SlF7F2WJ6g<@H2>fRP~eAj(F ztP1-7`WUSpF&!;B>6IAQ8G`%h0U3d}x3{;qw~oY_$;(r*tCPAyKxW#42ffXf$Jn~+ zn{!r%EbEi#8mx`;S=Zz@BU_@oRF+aj$Y(|A177So-P6<4I}WU7L^nE_(Ku31b~94d zRzY&@{Lqe zR_VogsF&JJAn>L@i(#2ls@P>ZxmFEylJ3va6+c#gE}&FVC}Q#$#IDK*sLZ*@n>Hh6 zaS#G+k9||8sS5A+ySIVLd2HJbHGnRfnHlrQ!$7GrK~}9!LWM=ZMNynmUA2@HrJzp( zYEk8`W(sue5tkyP1v+G=xo@ML?M{)@9;dwP-Y7WY%$nv~8~%U9Al;Edz# z`(OR!XaAlk2$3J81ezHt$a$=oBLI?hs#zA)cJndMR25OpDnO3oY(J?nM)U}&vO$u} zSo!qP8l&1Y&dhlElZlF!xw~vIkvUK8S?@ZmXhV@nwiyTLIjvnO+-gnr(X+53 z*OHD)zBK1tF2-Coa#f{n%~`tKd-z__*5h7+3Ntg=w#ze3BD0-$6TQw%E2q1=Xz$Yo z(p^Y=`t;o@`Ff#Urd&9VszrN)vMQ63WG|y`6>bgHhp+!TCD+=A(1MZ&2t!_ut3YHj zxdyuH;}mo4QSL>QnNv{O)YA+TK($DNiYTjZRzFByRMTsQvxvJZMl{ZrwP+*Fj1rOk zw)bJEg248DN6oBg@4W|L6_qv5+ikBZCFQTJ2KqN#fHB4tiFsbr7*%N$dkQviwRBy+ zskn&D^G-Ggc-iH#RyULxZp$*E)xnV$f3V|mv1wlr8RnumkGr64Gx`~m#j$PUHX^d} zG(!6R-CQyzyDCy-Lt5~mI68TvC*7l!V z(+;5?=Xu*UqM$nG>~j#LM6mKv6g7hw4`)n3RoqM)G!O!CLzauGS}&`kcG_$BDAuya z&miM9WiLLQIBI>Xm1`Yx=CYK`GVNu7)v%JRiY0|rkt!_G46FoFyOCA*vCG(`yd_B; z0WzB#yE>dMe$L})##D9CR%w)hq;CVdn1!oUDu@b-(TXT}*g-G$w3z(-XFr{&)=B>W z7l2^0Y-m-pQpL<{?X?3n7p81_ZKW1fZ!udR7adN(+!_RQH)hNV)z-M=He6VY*#?D; z{)en&Xe!6s-8g%YqMd4?Nuqr0PdutA&LX^2UkOU&Yt>NSsCLc(<#xM?NY%_tK$qjg zQV%aRS+|watRGo`{WTo@JdS-#L7P_)GtTH`tUWv}Gs`)*ZBrZUde%T{#F-hY)|Taf zsS;UYFwsN-s=j;Otdb&?^C6e&!77EO(#AyZGC*od=1B^xtrz8CFMfUVFw-6}7J>Cb z7q@{CV6q4)CQzx&Ugp?qPf3Z$MlVH4`ekZ~ho8z{5EHX2)@5Z}Rj#`4`$HL99h1n& zw(wd)sLM^OdmjGkSHJxE-}>8x{PkI-|G#DcA}bwiPKrQPOrRnLWS{9?`j^!b#D#D4 zFv!ei#9EtE*}*unchh=RZJV2~jM-l3YYycmAQ-6H+$yq3x>z<%3Q_S*8OS5&WChAs z5bVHH5LV?m{0YOdQ;>pHJ`89mr7wWAvrW@x%&f`u{fQecd}o@#CH66GSVKj6LkCnV zlUdugANTtMCjU&SI?t-Kru1p+AFD~tO~F@IM5t`d*_lZedUM1zSZq_7Rra`h%;=`M za`uTQAB_Kp*VPi9*D_V55-L}Qa_wP(7^0ZQA?Vu2Nv z)l!FRkN0PkWKe_c^PF2{7L{gt#P(jbkcFUt|yh{T+Tg@w)hk}#y8 z1ar-Hi`&jBt@qxSODK)zR{l~wnMspbBAcnh2z!TW4bQOpyI2?GM(M)YRhXHWw|&bj zqPk&j|DAG*l|1J7tD=N6yjW`*P!XS)CqBB41~mw(pQp&uB{{#8ax!9gSOv+5aX3Ex zP+>SM%k`W6jM%7_d`PFklLeGPfebLsH%Py1kyHw&jEt&iFte8mK{#v_0w5AB!lV}} z1kUHPyOC4ZMocVeInpERr>-!vJ9uOo%NmW^nq$AG@=*&><=`o6LP{C7oxoC>HvuzP zMF6qkkpxi?ZTr@mXEw7b6oSsLiY{B83ktmKV}=aoM#-u=cK6tO>r||1kwlv9%_cAl=Qzp!CV*%1iv=5^B^UsAv;mkz%6YVK4C@%Xnyo z6Ol)hw76bGwP|aeXvUB(Q9TAtXEj}F>Gc4d7&aDFnPWlGdIXBLWnERDYclXzP=wqZuj-71xZHxWPG}6a>`$Q$=DpKO< zR=~21+_vrF&Uk>S2$%L{jCx)nX<9TheHbO#%$VfEJIUCG2v?A{K0LK0^LdsdW(D~1 z)8{H(wSBM)Ky@__%uhgtWH?C(!nOB`ER{$Zbl&-ek}9kIFsFNX0zN#}-HFlOFHF`4 zu4@Y)F-~FId|jKw2Y^C3l$`y{oU$Aoi?)MkqxnZQkX{D{o_vm^^s#LhvQW5L#291u z7zJpn+334X+D%GPR+Xsbn<)VpvjInRX1l8z$Mv`j8)S4Ctqhi%& z0}x?lmP{1kG%1kvYMAE9JVTTo#L~1MQ2DieZv=$dc6Qs`_K8$*C$}m?qXgX%73-r2 zDy&;1hjTdjAUl%}@*TNT4$NlXygkIQ@+~ys)~j$w51ysVXE!p+he86$Ovyw9J$&x} z@Fk&m)S}8N@vadUM9vffYNAAd$gjRYkF{=qzs|}JwNwScvo)!Keck{@i zc|Lq%YR3Nn2#N^E+^{hV2o+A7Bcsb-5$U^yZOEP8QG#m{LQ;nJH1b{bI#k0N_k)DH z2g>M+beg@&^3sMIQ)ufG88Y7s*<%;3c__^wd+lJEW-RDEe)79&pU4G4MPvARv%a*Z zTGgC%H`;mLBLdUa4j|1&M6@PEvF)3MXTox{`JhO*5##Kq`;0-C=D_)MI$Spfv?)_6 z)7Z`)=9FfmT3XYBT_4{f6e2*Lm*z2MMj`6L$Q)tkv~vx$DWj>@Ylg5836UhhtuEt{ z;Y)8($56sUUzh>6Nwf`jcT<(j2#*K4#0-N0#mt|zis@@AvSI*<^!nx#P;TwMUa?k7 z^8;M~($;<7xw7*)X`cxu2-=$5Mc1heQm$uM-OJZy$w*JDHtoLel_MzlHZE;2cdJ>o zs?NtNz(fi*-w~CriR)W1LX#2G>mk6?-+Uk9@Y zw39BZ3m{2c;Z|WTG*!(>Xl~A=uso{DA{30Qd)=sc+j;B{RoV0T99gIKt&qEyAGu_D zSwuR}h&g>vKZWmJ*4@6gzE&)+5Gh_FAfj-Wq69e?Vfj8E|TSN$mOc4Qdz1;#7IaELy9(Jibp_a$>YZV4-j6swhSq+|uBuZ`Clzp6i zocGhI1n%0}vNQoPC~f$5vh%IbF7U9;_ATodLLHPM!^n-3IEgbj9O0Z!Il?V$OCK3~ z`kpb%&^(duEYiVk7LQe{m{CYFWmXY)tHxhux{Zt&`*_IE9u9}zg~&6*eb9UmI1yRd zxi8%YVa}ZQL7MxMyl}%RrpU~!tv`MKW0wBGo&Xdfx~eRrAm5diLEnO!XRWWnXrd9h zG)=ioyD}m#9o(cOY`cjFrIC*qyNF6suvYvYgyYo}M3aIu7%@$?M1)8VVaH?{j#o1njV14WWEqY;*+3bvrNFQOR z99w#d9?%a^orK8NiG^q&g_5gSP8mL&wMk8!!YYfMWb+S;>ZLs*gTi6PWDHJBd05f) z2ujklT}L=^vT#z`#ahP|ry2uGC+^5Vx-uah+?WdSEh2^Oic4NPFF@F&aMWC{o`ImE zSgQzp&soCE1UV7`unJ2;dHvJ6BLBGyfK`_zm>3z-k~;;*z7v9^Bh$k~#K{YP^lu}Zs=<>0w{4CNiP zBxDbAg)pakkT6>7hp?UYk?E-`kzeX#Nr|wr-G^!yX;g<3OG;O1H53#Exe*MIq$C!w zRO5tI_I*!~_Qr(tY)!@($W&1Zvuz_cAynRm(U@BjXHsjjk9`|wRgLffF@#vk5)>2+ zLWbEn&i7$sjFFJG93ahO(xkPuKym2Z(;pJ7nHeKlIBZL^%FR)xi27V;R3Ow5p6)>j znc#9ycMoo>wywHtL0)^;Oy4$&NCYPU_VDyr=4`Xrtj5xoR$m=G0E6D^;!$O@A6}xW zr}n_DVCIZSq+H&VK_t_lmD+kgJmx>;`R89yiqFt>g|0l#!JMKD_U(?CV(i?ZdSK-- zoIz6!^d9qPLY^~=NJH-?aL(}X;U}X_NLDNd8(SB+ZBo*ra8%4JA##wzqpPPsy1IJw z)$jfx{Eg-y41r8K1Ze`6Dd?>q;dk!4#Wpb%K{?$`lwr1qW3-;C4WRT4a)wMXUF?(w zT_%u(g_BA{@9s-q>N+n5a@Y_iq`U8wLpYfJH*+=0) z07Dx{JGX^cA$qofwp@t3a5Iz%W*&ObdR8;5lsPJj8Hz9EbG;muzkWg>EAtmYnIWRv zb{1(lTRfrMXS^${-ZN_>$p!pK^y4##e#i>|+}5k7q({iTN+ZU;6-dB9;pZ~?D zfA-&g`j^|^|IPn=`u1;H?i?o-rPe$}8>b^sGe!4%qqK4_&pKflY3d_LzMVbWBHCHz zH6X&2!PW5e9avaeriUd8PzR)2MtGTQJZ>OlEm0HZoCI zn4iIrzL0y`AV2$dm$p$Ri83{omJ}4u+(h7Mh2EcBz4>lblYfsWIA7Mlf)ErAszwSj zvl8{m>S?}~*N6U4hjN?~qWTZDY1Xxa$dfe1hCx8C}S$cH5*z{Cua<#6-l zlfS(A=o2h2^!ihg_SgUY^S}Qaee?OhReMWukA9SXXsUxfL&qMv+;F&VrwET2bH^U+ zAb^Rra(zCw@FA^p>qKxX4JrgOb{BD?@Ue#{NQH$dYzziwy#`#Klnf8sk?w9D`y7;$ zM944^ZeTP{PfvG2F$$>+xiNx>$hX+fWalu;Bybbyt#^+-B0!O8Ofo~U7bZ_8Rr5XT z0;oa>I3qwj*X&V%Sps=wii;b<+ zW=Vx~4?r)5*&MrN&OY?a?&d?#uy!eOA-SiBxCiUv8BCHCa%^^rS0jSvI3f5N(?uGRP>{EUhi86AO80Ps(>JrlqAVrnnqHPXE?{c zpSB>@-e>zSlZZ+B;pQV=AD_KHfAn!hP4)2XFaMkW>8q=!pa1-S@wnqSk*HaK)e@-- zh*!bchwsIE^4T^DB~YZ7=N&A_Fn8>`wx*3EYl&C)s-%)jdkANQMMhc`tET4J#{j$_ zjTGUwhYuEv2+Z<6t1g&17blR#1*2DDR9yu^KKy+0G0Y;F8A=7Bs!kO$-4Ze9o7E4- z)RY29lv4xmv^x`E81qe(km;E$(g{q$qHA!ANMR-k$yBKdepb4rkU*I}9bVxC53A+- zBBF6ArPZoiwYfWUCCr5=D=C$ks{F7yF7wC(;4$hl>I*{6HYzNg6A{|su^yg(_zNJC z+wnT!+v&cEh^{1Sl0*f%>-2(8me}z<>-T5pAA|d@i!K~zClMLTZ zV>|2d$OM24a(MKE>yQ4TJ^J|i$qyfW^wW1=_wmIK{`!CL^xypQe~o=~@;wRIJ#*WQ z4{PHiFV~9Aw|mU&yGNR8BMM5d@O4ygGs3o!&e{a%l{*TzCR*6zba+^LR-%anLX0nMDXCkVQ zY4|40l$AoC73oaGe94K{l!z!zQ8V8y2?=6eSQ@vZ10zWyn@DCAo4PJN7=Ai8H9p^` zpGMKME;v1A58p(kF_!|xVlYUxn;DV12Ux-!35c?2wFQOCc~!c-OK6f%(67k!5ll`{ zU~`5 zLL>=5!~$|p4v(ExZS3RzuJ;AJE{CVjfB3JT{qV1^pM8S<5zF!i1FC-gZuQx3mGuph&lHkFX2y$ECKg%;Xjsh-67XJf)I3wew>LD9tRx`?3U! zr!b@*f6^C$?b~K<0EG`>1|h42BziemN|Cn;P(OoAz=cH*a1(9X4#cYyU;f-80MgF= zD1GJDgNR(OZq~Oizdpa+847qH=4~z=#1Z?p-RknlGi;2*x;la(^RkC!ju{p90MEsJ zA@oWyUm}&LrD+il`=gvWcuB zJ-LarO29IUyAd?QjVtOQfD#cn!%5n)>w&iO82cPd5MPq^@Ni~QT}9dqVrDWj(f~0V zB8`}j#~bQPknSUi1RzF$hD9p()Foxv1LnqhTn$bG2uI6h zJ@mu6`6dZ?k`JQobb8HLr7xmdf^O#rAa+3sQi?5^wdaovk1^7Xlo^_2(yp$qKK|47 zVE!Lm02sHYyRY2#wk*;Q&cY&+;=l_C$Ezpb+gdpM;Kfh=&F??|59x1(KwS4^4r1;LnGUPr zJR@V+DBfEQs#OSxSq<=<*a+Xut%|`-n_HzjvobTFq&T^|?=H-BQU)$IP3qnT0Nm$lZ)k#_H}7F~v3w4ArH#uBwzIqGqOJ7u5(NmSBKMVuJOG?2zeZo11$b zX_zUMkVNdD2xJIUC&@yRSTYFA=inCH*Hsu@b&Nf1_pv8ACFy!C+7}8M;bKHdZZUSV z0bZ+Q7nx04>xai5{piixk&5f*Ki$ST-;{;eivyC8WS%~fH|RlChC4^t`7M$8*vNyq zrF(KPCjqUs($~^OV^v}EF_KvUKs3Q1h_?3kDFOlcp!;$BfCAl z`p>`phrj#F|LPOg_5Clc_oLecXKO#c_~fT|-~K-RJZuMPZ;OWkZCJErWfkAgL?bg* z8fA~MlZKDGxg5<@Y0OB5dtUNznGxnAgbOLo;3T+Qv2rURJJ8xv@4UhinT5S5Z?R_* z!AYcbh1l2$MCs&_7U@-o4Io8i4x% z2W5rKCmG9qixWliA{03?Hl$bIj+lvwMYJ!Bxe>eg$EMuL%ym%$n{AWoE}W5wP+6aS z^iu#I{sP$Uzkc=2FIR5St`a?>u(py(6sD>+Sw<2O8P39!m^W2|JRt}S23G@5lC(|^ z1rsMJLO{*LD$0V^fMX6x9};&f-R-x(U;pqS0I;_CTFmI{@mXJv``x#`ZA1o6k)8yC zn3KpNo!#z1P6^5&1p_3&e#+R$Yw`^$f|V8HTB3@A+WOVP+_Wv_BaX3$@8sq&XlBUf z;Jsd{V?r$IK9?2|#u$jnRb3d6wF*(vz8iFiT&rpFMx^o0q>9 zvbL;F05>8Kb4Hklo3-kofr3(H2@1kdbRipV!xJpp*W-G;X6P91CAdr3w(aWClQE1L z0@yeuvYdPwne0qlndgUcdZL_j1WGOmvX2bk-H`#xNS9|T1wI<-V8AoCVG95z?F!}quZNr9 z{sZEi;UpE>OW`0o@8`P$R!_L3YVw3{U!M5se&PGR z#|-bw@^Cz^Ahfhj>8EXb{?YY%^^89J6Cl&>U)uQ%QPBc`3&YUEMYSRiB2w`tcX|+@ zUu?`ix8*9BTtDB(-n3U>uFMpdatXT?yjCv|2WL$m+x@Hm{MB#&Z96=^{`kLOJ$`3( zvmc*bJ$|8j$kR8;ptiWDXe%zb+n&TDvgt|@mGrM=4S~3Y5K*FOCzU}6rvO7(L@7nl zE%>yL_yHh2Qmb?dTA#R?@ zS!GNk)`u)leeSCbSDOWzM`%VSSV7%!c8Y$uraxr_`d@khgq_~L`pwwhFb)J}X-P~o z>qZx-j%P+|n&}bg9=)roPF3(F*v&}*Jlt%!hl&)W8O(HHlmipkHtQVVq)3a*9prDm z_|@U~d_6wxkAL=^!-27l`7hqwxg?8jL9pj|?tqdw9Y?B;b+%|B{fyPUG|q z!bCV@+@J25leDp@Xiw3ACP~plXu=0jaFmA$_~i(c`@Z*e@o?s%Br~A}&XKOVO1t{- z7XW44zy1<52uA|fg_=Zv5X22{ttS;5f_Zv`^x_1{3c>2d`Gv_ZERA(MaL$;SatdQ2 zjkyN|)G0$7MQ%Lay!!m#wd3PYu3oTy2PU8&9>v;kKK|+P_rDyspOYm-Qka>^leLLz zaX(?WoIJpD8eJ>0%0UX3rHPm>Ku~2wMC&?i4|h(F@Tz?iKqN)SB%T)T6em!+GYAos z1ALK6KnMU@y}MAN`tK|n0Lh{v!nB>7F2iPey2DvjP zFe4)}#&)`AP``R)=|N;;|K_W&U;N-xKq5nh%{{_E$+|{>1C$&jtcSzRM}IhJz;gI_ zIec`ydhyMAm7p&_`@dxSCd2lzfl1mL)EPZ_A=WGh4r@IGtAPoUO4&X@@+L7U-S&|T z6$!5kqm^X9h6(t?UjV09pWVLxQiY*Qh!7-Vil10H#wco%d!#$3)7|O zud0Y7%805>b@Tb2Obo^B3^Y}K^-NOHCU0JS^T4kAkQc!D?Pufkt@A3( zV4+BIXH`HZ5tgwo%lUjSq!}4eFGCrTf!y~^Tc^y%>N!A8x!c%@c|9EF_WnKpjR%1h zOmGVi=E68|N;BVrd-I?-zy9`jfA{Ru|C-y)cYe(`Pk(m$_RGW5&u_o_kMQ9UO^Muy z*ct35GacrvGDaD`5bj78ZFMBg1W3X|%j!+=Oob#RhZlbWNI?<>GQ8OLS;Mg?9tj>? zx#5*aNce;n0znKp@ZnLvdJ1OVHn4JEN#L1*eth)N>Go@n-S=CJGxpmd&6leP8sjd) zg(WtsbDoH2+BU{|e7qbVWvK?jE9ZT4^N5&&V`hs003ZNKL_t(pT1DgF=k#5d1M#K% z){e)UXIGDZ0{-sL!*+ffb~?X(dHeD=jkSxetSUgHaSGSlvKuEdd=gEFDT^!}$ROKC>;T9I<_?k~ zBO`apU_D$tIbJ_Y7LVQCg#2{6TbJY2lV`5SAYtX!*ZbR74a8t#AtVdSa=g0vSiYY= z^7^Y^eD?SM+v)57MB5vOuy*KyWg#eG+RYQf7bWCF_~qezTknb@{7@UHZ}!7Kd7%li zutb=TvwY|az_-(D3JVesQ!Ecs`+9_V3`&q&YeKW}Efy9|t#!{>mi2tzwJRuW?6vqW zKUlbtTU2W{CMKZ7y7OZMMRQ7e3G>6RBa_?-L#NY9`L`4@nI z0%dnWMT6<$Ds8&fk4Eg<=~hI^Ju4Q*B?TL~-6K6`uqR3{JI?2lXGhelbM?KFMEkNX z$0vkd-Y?`hpKjB3y?VA@J=vidA~3E*jK}X}DhP^5L!@k?-lp=k)KLPlO&mSEAa(d~A391784s zKHa~fFi4Bb)0{5IGyuxV6rR)i$BJQlBm=Frwx3SDqxVKr873K4Z^ccNCI>e}l%cf> zc-R}Ta4iL^W*{QM8cxg-W9M=E?H514`Sh=sCx8COe`d_Q96vfN`r^mm{KHqj@cmZ% zmc)S$q(`b~Qo1=aSGK>9Rm{BCCUp#=T$X;JpHShz0g?+Oq#UP&iNGk-I2Ex4SzM1f z<^l^#L2`%^kSc2d>9)g>VmY`*R>@lFNW^aY9mv7cYEcZH3M14)#v2D}dCR1M&7j8JSq}c?!Mr2UazS}r&+ae9jms1tL z&z;@2jX4%xYhq$PvVMq#l9(H4|Mr_-KYR6Azxni!9|Bd+qxOTx&wujd#m~O_&EH~d zy{}g405hk^BzG6-lu(UR);kYbEK$8Fx zZoOzoKF&(M-Mu;8eoK(U<7e&oD2aq(qQ^6@u5WJNzOF%gBtL%o>DBco(vIKxDcJ75 zJiYqW{j1;jX%ID62FXPPT;skOxh_Lq?^@;QhbnC0051UjiPC)dZkt(Q)62R?q?f7q zhrR&zecaxC%S;R;k=bavWK2>?X*nt4VKrRSeQhm*Y>fJC*M8G&nor$}oo`+qh!VvK ziVa#Rk=`4T7c-+!O7-8Ynr=bFncL~x``2F`-+Zw?`6=PM&x*%KpFIEJU%me7mt=R+ zBT;RXN#v?qPPuDqB^BY9(|?65=Zh_u<3}XjGCbWWE>6V@L$LHwv#uVLnVyzOB-M4* zEU!oZIPz7R+2^oR)CwtZQaB1X(b-gFhWhnB3zLo}$K5+D+C&IpeWeF1RB zvaY9l0;Nn>h7ojG)&zM3$AsleZx8{cNMjaCA7igEu$wX1BeXFBZbMsJmW8Sln#svy z>>^s5es>e$NN{muDDy%YLdn#SWa;tNPp{s7{SUG}X@~D-XSem))w4f8Jbtmg{JEGB zc`^bbkkV@>88|aWBFAumwYBMUPp7OJAr+ZLh43pZ(i! zzxV~PB_U}cI;6DeMW}nZaHe0BaZ-1Bj}d8^N)Q4kWkfKM@Eng)dgYsHWRh73rI`Bp zB#-R_UjW1$^Es&^F~m^m@KHS3 zx*2fwED9@7^O$`*mjeP!^-*+lfK5N{yPOIzw0Z=B9${E(vXup zidhZKOlKm>K_Dj%H0a^@}8nS@nJFhF3{R)d9Ke&U|n%jLm z95AX1Ii1n9IzR*x+^-*hvL2tw;c+DU*zNANfWAx-Zs0Pzc&XUPwsa2^Nx|ICcPD%F z{Dtu zUXvFRg)oS#B3xs%352{n0f4y+>nafg&P;&F%*nEpLU&ynWrSH@9$J3v0gkyh-nab& zUjP#}Fb{h znZ=%#o?u8&Dzon|g$ZOd%BC`wf1hS+_-&v1Sx4U-b0(8L=&IFUdX zKhQhz+vRRKDS!kb9_XU1+K)HS+WLg`ih_onbHAr?)*OHlG1s(&3+1V?+c2*c+wgNH zWysCbPuJt)$aLE%4B9fFB19e;e0eNVRW6CbO_|rj^&juliD=w^`R42Y54ms5F!oJA7s#Ye!P{y!6;lZ_-DMyVLEftEb-=oPw-RA3yt7w_pBZ(H!nM zj7ci+kYi++`(TE7@JwaRkv*`IcK;tFl@Mkg@Y1IV1zq)ag9Fo6QCH* zkiqp@mz0!E*(_?#Sv3H6S8ZlaNb}+DeJNNC!c7Eaztg6>jmV(%ss!*uq(X$D<&dk@ z5;G{tihv2K?_G|aF2)HN=Ln+43q$OC(6O33t)X zXb>sUXe7vzn;|1o%=XMN_AQ8rG%?wR^?N6xfHMiWYrpD;o4y|T@QB-$2l+nk-n{gKbZdVi(kjM4U33Y(8!p3NiO@&1$LJ7 zo8kQA-r&elHL6izde@LZ(baqzIgk^%QZ7a+)f!g6T;GyDI)+DO%Z2F zN+1CDZ~$bdaZ4bJ$l|$!5`fzf)tuY=M6I})RU1R4ExN3L5XpQ=O|x+}+sjo!#0jmQ zR}y)IC?ct`WT0{Ee)jDalunip6pKUI38^(#Un7Kj)CN54_{NlI&F7`K^EsH!9Bu!Xq#+#MpR&5tIF1yb~ z3Z+GEglr8<;3}Xem@}okj!E5FbAcN zP=ScLk7Aou{Ek&9Qka|a=8^VKzb#=oJUu@Co+P z6fvBwdZ82{kPLRa8+JaQP98JooRB)ts2mQ*M~ACNZFvgT1Uw^iM3~ZIdAhy*LUpLF zkqaT_(5bW^_2Dm8Xx8sVh+>TUKf*8Pe)s$1!W(fAn3d|Yo;3EsDk55j@bh_d3%RNw z%oP0Ch?)tV&*#4M3b0h5SG1KMPqdkBrGr}ANmLcJzhU)%Q0e) z7<}QIx>wefAC#udTp^H{QZO~!sglp!0gmvQvW!xr6;8DkB?icc6wn2s!R5y-L3$P2>$|(#rMC*P~Fpx)O~eTARuM&NNKA7(qX)?@)GLyBU;jLZ999qpjpnHyzN zj!YV6i0$p`Zy)?jVD0_T`cc{udT8y6`Wn&+2#+!jsY2rP^5s`c>(}e?{_d0k2&X%N zBD1NMKVz==V`Ng9sZRH=(>H4C`^g{Q-t6bsmx^UJ)k<)Hh|2^Rkx43|tPB($VVYYR z?zC?^3p4Am5NY8_f~n6UYN{TVWR*%376N+fZX?rx1YdUVAMgU`%ke(i2ymjbb4fJ> zovp~JIuvmqaWV6V2%}WN1VRvOcxzom_I)Fo@xU=gwVxQmjAdEOrb16dYIZ)!GHxR8 z!U&k=kRHUhr}OpW=lO2Z@;#5TeyxW`%hluDzTD5}Fi27r-ZPm%ktU=RzBC4VxMdKx zRiy6@kp|(`xgU;{dAfT`$SC{;g0+F9tB(6U(=gwah$3j%7-z6BwAO+l>Rw9OSqVh6 zz~JT}&$O|PZP<$+{u#&q^7p^8^IKt6Q57W!P?}6T$14Dw!o-vodwl!)i>B9CSI@#u zr|q?N&R_=Wi3wIJ>u6e}Z|AK#S#XPSANwm>AHVnFm*?BB-@g2u%%M_ITuMub)-1n5 zPF(Lk7-LlWwO#;fELeTt0z@;jnP2|o_+bmgEH#}fMg? zM_6yk6htH-_Hfmp@gg!GVBS+e}id5Dl@5B6{>!J8n5GVlR ztFOFh{T@4+YLI}LP?1vH9U`a{N^j7x90+g`$V1Yd1kz6_3n7Y3JygV)4~L-)BBG{9 zlukhr!IYc`OyI+{Ggo}q6=8Kcoy%r>a<;$sz+xTM7Ftj9-dh?TWfvbukJjYajN`a0 z-AtLKmO9TfATTkkUb%^*Is`CrU`EJ5o+rKc`EaPUFyR{lgEiMNv(C{yfJLMLa-FVy z&6{MD`LGOBGTrdle!v>xMuoYo5BV^#RIlWdkXU)O60$N1RnVFg)krW0800$Iv zg_SjNh5bAF5hOufM*}$B=9zBuDIr2jGTpj)gV- z?C<~PE(*O7;49a^vFu3*-a3LKsTPL!OEx+l5E~M14*MEFu6A1`@?kr&!0R zD+r;Z=bYIgIjxcMng~aT-e&jAR7KxE@GmDG_ulpJdH^+4 zvH>MBo5MOvsR(Fhn2}8)0N8quRTL9QxUxNvfeMm<17Ny$fqP8TaCvz-PDPs{CaI3h zEcs?(7A+`d(D9v`gZ(imkW}E2>!zEb&NZgI#cWawVU{ilcjgo@gWkYhWJrdfxtSUh z=Ev>emft&Z##3i7$*L(@1@(;U!-ZPbOf~Rq1JaI20FoyM0dII?z4iBRYV%<}uV^CD ztc#Rz?_GznAWC=~<@^qa>WTn;St{+z#DHOK@d#o;B#)AY$41>P93_XFL}JznA)PRg z$URMQ0Mi^QBXE;K0VyY7;&B?bWjx{GL}-9W2MMF&ww;;0;0h}#UER<)6^->Z&EWdhaXGF)R%eTB+KI|B*q+RE^*});0y8*2zfVQnjR1uSz{4$>#;|$?=bUIofwFDt zy(3minIMvfu9>H10YQabi73W#9LL?ln_>DIAtFdZ2;mx`fNTJOjLb!9Ai1lVkpmHj z8zAHm5&>+vtV|y0(F3UP#tm3FlYeC3D~lTdkYV)00&W=V=K?Iug2ae|tKZOh!-p%7B!lg$p8 zgxO7@&1uSR+5wyh+#+1V`_aJVssy?~jAVNQn3)0@bIp8g60+6xgAv)>L}(pcLVD!9 z5hU&&B%F)^Rb`gs3%Q4{Z~V$a5Y61f2^_-5?KS#V@CBMq9@?Hh#JuG=Ah_wmoPgR2 zR$jTjTqPi7C`OKlb2CWUfSI~uE#mG(+?wV54}kor3_99O6g(zu=9T~vm|~JpKxa;p zG&SYZN8eJ)^hb1(nPLxtOcIin2@{d)4B%=?4iF(Cm8+QvaoD0W1fXHmapSHA6y_o& zq6CqQqiJ{d43iDK1yM%5u&gaeaVUoOwdx@vdr1fE7I zUrvKtQk5q{kRBIFM6`%CFOyTVf`nK0ojqfKkGb$y^oKzzQv%$p@@bkT!1P$piG*F* z$RVPey4g7G_$^rO@8|+3!*<+0v^%}i?*Bn}2Wt@{5l1v+E?faZM8ZwAmr{Jqhf7I> zi->`**sxkDC62~XB8-^wUq5m}*Q=D`2`+dCcgm{MI`Z1OSsjY`+MmN&wz1(mLj-A9o<6 zakIOzJ-bCRv}HD1ki0J!7}#S8Qww8|K+QrlJf_{0jVXhJF8hn~wm%0~T@LO&5N@1a z&#vrEsPS0@<`)}&m3IzE6vTwAX4&|XJF#%)8yrmz0au;01C&y-1v1rAgjNK_MbOri z@>Mdg+E-4IbqL&?o^kmWH~|ppt_=l|B#F((Auc5C+a25uEYe#+ zdj|wJ&B`~=NnK~=v>vIeYq zHaC!mX5irv{o?!*gHBGb7l8TlybwWnZygYYg)`Kz%|g_=&uy{3P=vMay#;hA!_7O7 zEQiHi>1c=&5aYBRqR(N(nfjTcehl~SZthZQcu?Ur1=Y;10=FTA$Rk-WVs4eFd&p2T zTb!B96+BkI0OjP)aQbMoU#?Qo#T$5d8Fowz1ikm1WhBSd zQ!ZdR?Q(ZrO>l>SN^x^_gCzZ>={?d>nV#mEA;O3xgbtZw7hwy<0;mWb$h!8h;J{|E zx%TMWyvZ!u%?)Beky!TD=fy6W#UZ#J}bB9(5R_hzJW>=>E{s=2w}Z z%}cx7hb@R2WoI&lYgmKh0w}{!rki&DI!ldk2o|K2a#FD@R8!(eLQ;elL<0MjnOT*ckOfF*bely8XzKr-FD_3Vr8uD!4# zGOk(I771S>9~=1q0zPVgBMgx|BGGy^XJ%wX3?dN`fR#GS$7EHam2D9oh{?4PH3DRh zZatHfnVF1mck_MY>DvuZ;Iga3&^ZEvN$M~h^bpaOdCr6qw=^d#ZJ7}d#b<~Fycg)7$*hJ87BZ$uVufv`J$2w)80H&302$M-z{kxzg8cd_q@CKL+93?>Mq zTE*A7O|;e$2A~Wyuwy{zaU`0>TdX-ZrmC&A%``EyhXJ9R6Laq>!kF$*gwyusxVWEy%x$oUNGcyt=I47IiPk#j7_OMXOgj51tRS_~5v49(Z3L~ZH zVcCm}BuvcVJs=!Pw&iY4#Kdd>06~l!8MBZ}_HRTuaD<%Qdi4A?>WBNQNqU}i5R^$+ z(Yxlk??DLRfQ*3}5y(=Kk*XMn<>KV*_PD(hIGN7N z{&hW^Yu8~M$K8%t%*?t61XI~e&Ajd}001BWNkl%@Oqcw64dxAtV%Y*V4lP_)NN4t9hV)tMULUQo!cFRn? z9|x<<0O)2xB+QviwcFkrcejz~TV(;r=Ip)S@uRQ&{x1?Pfq}pdlzUaSW-QgCo25Yur2w#$ zl!v34b?XEmSWm9so(1R2yMCpaJqDN}Gz7v3h8%5&Mj$ZrP=;L{PLN0U)htlcQ3ipS z0L*m(bTbX$lih8pJ49BU`{8cef5{w%?N;hwz$g{SgldGET3D!cQ*&$9JBAXu47-!F zCqj0>(=hG+X!OqM<0m)Y(_jCj8HgZ6csPS+NHZZNMResqualY7aD$mbL@6c1V2X$v zLL@%|P$WnGX(p1p@;KyG3+;6D9hJdwBGHjqC zcy@qmJ&*=zk(uRdPZ%Jx z;o;#Yp8t`zgMPlz&6kao4Fpkia3QV{7}3j606a`9RKg%s3=05PXRZ)nZAKzN>dS0_ zfLv+;NAo}=w+1L&3K3QoLV;B+NXSxM&&fXbvf_LqWcHBEW^neO6h?j1$hXY=Vh;LL3H#WByu8Rc2nKTg2)YhJ;|IW+r7<##4BwuD8`{OsBW5Kl<%2eePctB(4J% zNr;Y+k_Spe9xDV+h`Ze`aYg{kVlmwUTkCQpKIC{205BuT&C_`l5e>mT5GdVj0Hh3O z=lgqyi+i_kJ^ak`e{Os2nXmIU@uA1wd+)`MW1MR{aM=J!j$eqPw*|w)8ictTl)_vx zM#u$$sEUVVkTiqU=~2p zjWEz0!-<>(3Q9-Wo;^ykg)$ABv+4BqSAb^q?8cL?4L8hQVPfRfz5`q{@XIsG9hrrr z>+03$z5<{Is+}mO#n4*Irl4yp;67^7MEA zwY#r=DlWfdZmLU>foiqB`r0}`ta4_OI%Fx|+QJBGy_957)3n*S8)fKK3O0xkgP7gi z%pH*csPG^|nD^ep{rth@tFOOatn%h$c;x-ppZPxc`l*5^+lR~cA?x=;=hls<9hU+C zs>XGUjMp-)T#PCrn+K7DExvC-09d7rp$j5;7;~X83<|Sa1^_U}2vcq3HVnJ@@~(PM zk~0FJ0}=tCvGXxytT4CU5~W9Aa0Ck|ZV}`JhRns$NhXo845w1IRHi`ocCdN2zVEHk zFwwL#h$)Aq)<$#DHEhv(DHr|Ql3 z9KP@}6vMEv1|H^J>O@h}*B*%hqt-$Qh?K#C$8;`T3V#|B@qivTpqB2Y;;8=^MDu7)~E~ z>V2QN_=3&%!!7}Q>0=oRaq)1eJHz7II|P>s>*j^MS?gUYjbrhMQ1j5tUi8q)#Uol< zlFSQeHWkqL@f<$AVjxh7@%7M z{0Qs(Z=DRx%RzhZOPi)m@20-E_QX80C?cfZEj*6%a8xxCgn-Na{&0DD*zbpN5{P9! zxZ3@@_fBrbH_#ykk2IV<^5pwp_~gg9&ta-X-9{cj>VPaoMg(9+SxX>tfRyPVV^?zr zKolf%Un5XGz!&dJt%ES9xkVOl}TN7!Chtpe6+<5c@^W9HnHea|oXeosYBOe24B2{8Xy7dZb2U57Zsk<4A z^uF@vDFBJm9nn49R0IKCbw*#%7UfeJ-?{qd>skN+$j^WGPyYPxeX^8&sYG=`mem;5 zD8i6QHM2ti5nF4?_#4KNn3*I17y%KRu6;8QQgC3DQZhir-7%uI)>;F^Qmb~=WkHWh z{7e7%@BVu?|IX=+N50DXS?>ze%diXJGHx6w zh)K-*fZkyH;NeDu6$uU`h^Z0j-x1N8iER3s07^jEtJoz1;z5iJ^JuF(rX($`2lY?MTxC!j3)fBUfFcAl=u4r%!*jouX+S8stNsMN8IP90mO8BiCx(sfe>3s(n{ z8IbC3nzjSd{`^asuOY%HxXhR20A?+$j3;H>1QIhsbTfnicXeIJ8-%-cu!dm(SjsSN zPs?;|*jzuo`Rs7|Dk%_xt_fFsC$(h(u%@M`R*lV38`@@$}VK ze&hV!7ry=`z|qXL?+*u-Ds=#a-Vfl7z`z&wPPULW*Ezz6p^}JsAdzbqra{sURtbVI z?I5%-2WvBU3sY@}J|DnZQfKP08>ef;1J|((6U#_aNeW3Vb*kfrr6LvLfn^k~h*Y?2 z&u;9l-K^8uu)Q8KKpkW}Qylh-12Qmlomqxq+61OgYr{~}#eMO~2I2;bEApk@wiG>Rg0S|;UU4Qb{qtC!QdwtytfN1!hANr{WGeNs> zSHNy=&D8pl(1*w(4&mU!l6FaMYF)#OgoB7hNZ3-?5i!q)WjWlxe=ovB@TjLgo~nQ% zECrd1hn-aT^rwEozs?M)`N0?ae2&EKM#xM9b1Ah*WhSF&1U;;~YO-1KXJA6X5D^bR z6c0GehwdHI&@Y*E83&dyfX!wH?FWh=9){g@-d=-Yi)9iyVHuG}mJLuv9=Hs{u#@q$ zY;KIF4-K1}o3q-EaXXDWa1MncW7(WWiaEnwd)v>ZJyg*;Cov5O zs34EQ^{_0je(9zA_g}ia_nP3~s6cPicNS&3xqbK>78 z2d+K+BNs3J?~_bH*Ne7-wePyCiGay|=iwc{z9Gg1(ue=Te~8m_cK-P|ybiF) zQREt$Huoq}N*P%SGp~(5QVPcj))^^yn69Yknx6TlVeoNSMnpK(TFW4H!{ZJhwmg68 zmwx8;mtT0h+yCY3eR)9W)@Rq2?o1AhSP&vT44IgTF{1;tMZ17@VTT88f4?o4eLlD@ z;XMWCp?$2?-MLm7CJWXS!lDpMgqx{{vQ*{?Xrmy`j51IeAmxG{8s4=#Kr^?MGXd`2 zwOe=qOBo}IAbIc0{=5{%GT^vPpXcy!H`A`#-DWo>VlKnDIhDEr8K8_nWtDDq?aTh& z-7mT|3muPpt1)(f1? zTASy~+>IcRiH}K!LBzGz1f(+zI02vBHa45hFbui7WN$#sNR(F6BE>u~Ow}C(xrDXd zfFJw$pYcAw%>{s{1o7bBYi+)4%c34gMTQNR9m&MJAsoXvj2MD!@#S1E@9N=h^a~8t zegN+j3ZdYN5Lw-t2e1UO1po?{F@ge6O-*}mO9Zf#I&2&yr~)!Wg7%JPrHaTJfC!qo@@!4FI9?mY8n-ZB2qpR@$Z>yf8Fc>jC$WYhOl`YB+PpRIC2#pZYMsKLT2ykK5Op?21pbmI1tPLVco-l zkh(S^G*=`x01RX)7${{3kKT>az^W@aI4Y8ejK!h#1A?{rJlcFbN?n(VToENJ#znho zb6vpARl|eHsZ6vxb(C600#xfo7>Ux%lb=-xl|tN--3fAyb?9ARFDp%ej13!F^QS)(j6+p4wwG;Q(>_cx^;r9W;dHQcrL zI*z?7bNXWubMX?;_7|_;fA2^B#>jVL1s6>!K zV5>h36nU0{^gvH&uX6GO>c(|JsAwV@3Da*1<-5s)HJ^JQp-?F5sru=T$tQUn1spQTWbKx=tgEj zKsO~ob7KOw`Q9sEeBbx}_0!wWyju(4Pbxe+yY-%L`~JWA`G5WQPxwKliDiNq3_F0C z#hb+Lc#MJ3^i<4h2N8SIWR^4YFsvxSG01u~Z(EH%0-!={LwiR&4O__eQrd6*%KyB* zcJjdw|NHnBI=XQ>d4O^M^)Fy(DeOjwj3@vCOp<(oWVV=U?-7yNtVkkN9CF73Qgt&V z2n_QGipuN(hr?kQ3IdvY<~FXwBH|=d2&IoS0t(2sP(hw;Idqb155I@Ek6gd?bg5g5 z3`4fp{$RTQ^6#5kaHiD@aP>756^L`5jvf{ff(YTR7J!H$g(I9iV?Gv)EJQ03x@_y_ z=37E%5np)m|M}Rz_=oHVGi|-qT2=K5k-L(=U7BX1+;*bBQ^wnmZ$hC;H{ap-Y7Ulvh0OaY8=nNP{WUgjPfXt||8a74*N)2H5KpqIy z-I$<`ghb4ut&QUdVF1BIS-E8l7&9Sq2A@I1ssTdms@P_LUbnZmHy-2NlP7nc4W2y0 zy!�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".format(sys.argv[0])) - - else: - input_fname = sys.argv[1] - image_in = Image.open(input_fname) - image_in = image_in.convert('RGB') - - # Resize the image - image_in = image_in.resize((128, 128)) - image_out = image_in.copy() - w, h = image_in.size - - # Take input image and divide each color channel's value by 16 - for y in range(h): - for x in range(w): - r, g, b = image_in.getpixel((x, y)) - image_out.putpixel((x,y), (r//16, g//16, b//16)) - - - # Save the image itself - pixels = [] - for y in range(h): - for x in range(w): - (r, g, b) = image_out.getpixel((x,y)) - color = (r*16*16) + (g*16) + (b) - pixels.append(color) - - from manta import Manta - m = Manta('manta.yaml') - - addrs = list(range(len(pixels))) - m.image_mem.write(addrs, pixels) \ No newline at end of file diff --git a/examples/nexys_a7/video_sprite_uart/src/clk_gen.v b/examples/nexys_a7/video_sprite_uart/src/clk_gen.v deleted file mode 100644 index 91d4265..0000000 --- a/examples/nexys_a7/video_sprite_uart/src/clk_gen.v +++ /dev/null @@ -1,207 +0,0 @@ - -// file: clk_gen.v -// -// (c) Copyright 2008 - 2013 Xilinx, Inc. All rights reserved. -// -// This file contains confidential and proprietary information -// of Xilinx, Inc. and is protected under U.S. and -// international copyright and other intellectual property -// laws. -// -// DISCLAIMER -// This disclaimer is not a license and does not grant any -// rights to the materials distributed herewith. Except as -// otherwise provided in a valid license issued to you by -// Xilinx, and to the maximum extent permitted by applicable -// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND -// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES -// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING -// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- -// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and -// (2) Xilinx shall not be liable (whether in contract or tort, -// including negligence, or under any other theory of -// liability) for any loss or damage of any kind or nature -// related to, arising under or in connection with these -// materials, including for any direct, or any indirect, -// special, incidental, or consequential loss or damage -// (including loss of data, profits, goodwill, or any type of -// loss or damage suffered as a result of any action brought -// by a third party) even if such damage or loss was -// reasonably foreseeable or Xilinx had been advised of the -// possibility of the same. -// -// CRITICAL APPLICATIONS -// Xilinx products are not designed or intended to be fail- -// safe, or for use in any application requiring fail-safe -// performance, such as life-support or safety devices or -// systems, Class III medical devices, nuclear facilities, -// applications related to the deployment of airbags, or any -// other applications that could lead to death, personal -// injury, or severe property or environmental damage -// (individually and collectively, "Critical -// Applications"). Customer assumes the sole risk and -// liability of any use of Xilinx products in Critical -// Applications, subject only to applicable laws and -// regulations governing limitations on product liability. -// -// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS -// PART OF THIS FILE AT ALL TIMES. -// -//---------------------------------------------------------------------------- -// User entered comments -//---------------------------------------------------------------------------- -// None -// -//---------------------------------------------------------------------------- -// Output Output Phase Duty Cycle Pk-to-Pk Phase -// Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps) -//---------------------------------------------------------------------------- -// clk_50mhz__50.00000______0.000______50.0______150.541_____99.281 -// clk_65mhz__65.00000______0.000______50.0______142.278_____99.281 -// -//---------------------------------------------------------------------------- -// Input Clock Freq (MHz) Input Jitter (UI) -//---------------------------------------------------------------------------- -// __primary_________100.000____________0.010 - -`timescale 1ps/1ps - -module clk_gen - - (// Clock in ports - // Clock out ports - output clk_50mhz, - output clk_65mhz, - input clk_100mhz - ); - // Input buffering - //------------------------------------ -wire clk_100mhz_clk_gen; -wire clk_in2_clk_gen; - IBUF clkin1_ibufg - (.O (clk_100mhz_clk_gen), - .I (clk_100mhz)); - - - - - // Clocking PRIMITIVE - //------------------------------------ - - // Instantiation of the MMCM PRIMITIVE - // * Unused inputs are tied off - // * Unused outputs are labeled unused - - wire clk_50mhz_clk_gen; - wire clk_65mhz_clk_gen; - wire clk_out3_clk_gen; - wire clk_out4_clk_gen; - wire clk_out5_clk_gen; - wire clk_out6_clk_gen; - wire clk_out7_clk_gen; - - wire [15:0] do_unused; - wire drdy_unused; - wire psdone_unused; - wire locked_int; - wire clkfbout_clk_gen; - wire clkfbout_buf_clk_gen; - wire clkfboutb_unused; - wire clkout0b_unused; - wire clkout1b_unused; - wire clkout2_unused; - wire clkout2b_unused; - wire clkout3_unused; - wire clkout3b_unused; - wire clkout4_unused; - wire clkout5_unused; - wire clkout6_unused; - wire clkfbstopped_unused; - wire clkinstopped_unused; - - MMCME2_ADV - #(.BANDWIDTH ("OPTIMIZED"), - .CLKOUT4_CASCADE ("FALSE"), - .COMPENSATION ("ZHOLD"), - .STARTUP_WAIT ("FALSE"), - .DIVCLK_DIVIDE (1), - .CLKFBOUT_MULT_F (9.750), - .CLKFBOUT_PHASE (0.000), - .CLKFBOUT_USE_FINE_PS ("FALSE"), - .CLKOUT0_DIVIDE_F (19.500), - .CLKOUT0_PHASE (0.000), - .CLKOUT0_DUTY_CYCLE (0.500), - .CLKOUT0_USE_FINE_PS ("FALSE"), - .CLKOUT1_DIVIDE (15), - .CLKOUT1_PHASE (0.000), - .CLKOUT1_DUTY_CYCLE (0.500), - .CLKOUT1_USE_FINE_PS ("FALSE"), - .CLKIN1_PERIOD (10.000)) - mmcm_adv_inst - // Output clocks - ( - .CLKFBOUT (clkfbout_clk_gen), - .CLKFBOUTB (clkfboutb_unused), - .CLKOUT0 (clk_50mhz_clk_gen), - .CLKOUT0B (clkout0b_unused), - .CLKOUT1 (clk_65mhz_clk_gen), - .CLKOUT1B (clkout1b_unused), - .CLKOUT2 (clkout2_unused), - .CLKOUT2B (clkout2b_unused), - .CLKOUT3 (clkout3_unused), - .CLKOUT3B (clkout3b_unused), - .CLKOUT4 (clkout4_unused), - .CLKOUT5 (clkout5_unused), - .CLKOUT6 (clkout6_unused), - // Input clock control - .CLKFBIN (clkfbout_buf_clk_gen), - .CLKIN1 (clk_100mhz_clk_gen), - .CLKIN2 (1'b0), - // Tied to always select the primary input clock - .CLKINSEL (1'b1), - // Ports for dynamic reconfiguration - .DADDR (7'h0), - .DCLK (1'b0), - .DEN (1'b0), - .DI (16'h0), - .DO (do_unused), - .DRDY (drdy_unused), - .DWE (1'b0), - // Ports for dynamic phase shift - .PSCLK (1'b0), - .PSEN (1'b0), - .PSINCDEC (1'b0), - .PSDONE (psdone_unused), - // Other control and status signals - .LOCKED (locked_int), - .CLKINSTOPPED (clkinstopped_unused), - .CLKFBSTOPPED (clkfbstopped_unused), - .PWRDWN (1'b0), - .RST (1'b0)); - -// Clock Monitor clock assigning -//-------------------------------------- - // Output buffering - //----------------------------------- - - BUFG clkf_buf - (.O (clkfbout_buf_clk_gen), - .I (clkfbout_clk_gen)); - - - - - - - BUFG clkout1_buf - (.O (clk_50mhz), - .I (clk_50mhz_clk_gen)); - - - BUFG clkout2_buf - (.O (clk_65mhz), - .I (clk_65mhz_clk_gen)); - - - -endmodule diff --git a/examples/nexys_a7/video_sprite_uart/src/top_level.sv b/examples/nexys_a7/video_sprite_uart/src/top_level.sv deleted file mode 100644 index 01645fd..0000000 --- a/examples/nexys_a7/video_sprite_uart/src/top_level.sv +++ /dev/null @@ -1,96 +0,0 @@ -`timescale 1ns / 1ps -`default_nettype none - -module top_level ( - input wire clk_100mhz, - - input wire uart_txd_in, - output logic uart_rxd_out, - - output logic [3:0] vga_r, vga_g, vga_b, - output logic vga_hs, vga_vs); - - // Clock generation - logic clk_65mhz; - - clk_gen gen( - .clk_100mhz(clk_100mhz), - .clk_50mhz(), - .clk_65mhz(clk_65mhz)); - - // VGA signals - logic [10:0] hcount; - logic [9:0] vcount; - logic hsync, vsync, blank; - - vga vga_gen( - .pixel_clk_in(clk_65mhz), - .hcount_out(hcount), - .vcount_out(vcount), - .hsync_out(hsync), - .vsync_out(vsync), - .blank_out(blank)); - - // VGA Pipelining - reg[1:0][10:0] hcount_pipe; - reg[1:0][10:0] vcount_pipe; - reg[1:0] hsync_pipe; - reg[1:0] vsync_pipe; - reg[1:0] blank_pipe; - - always_ff @(posedge clk_65mhz)begin - hcount_pipe[0] <= hcount; - vcount_pipe[0] <= vcount; - hsync_pipe[0] <= hsync; - vsync_pipe[0] <= vsync; - blank_pipe[0] <= blank; - for (int i=1; i<2; i = i+1)begin - hcount_pipe[i] <= hcount_pipe[i-1]; - vcount_pipe[i] <= vcount_pipe[i-1]; - hsync_pipe[i] <= hsync_pipe[i-1]; - vsync_pipe[i] <= vsync_pipe[i-1]; - blank_pipe[i] <= blank_pipe[i-1]; - end - end - - localparam WIDTH = 128; - localparam HEIGHT = 128; - - localparam X = 0; - localparam Y = 0; - - // calculate rom address - logic [$clog2(WIDTH*HEIGHT)-1:0] image_addr; - assign image_addr = (hcount - X) + ((vcount - Y) * WIDTH); - - logic in_sprite; - assign in_sprite = ((hcount_pipe[1] >= X && hcount_pipe[1] < (X + WIDTH)) && - (vcount_pipe[1] >= Y && vcount_pipe[1] < (Y + HEIGHT))); - - manta manta_inst ( - .clk(clk_65mhz), - - .rx(uart_txd_in), - .tx(uart_rxd_out), - - .image_mem_clk(clk_65mhz), - .image_mem_addr(image_addr), - .image_mem_din(), - .image_mem_dout(sprite_color), - .image_mem_we(1'b0)); - - logic [11:0] sprite_color; - logic [11:0] color; - assign color = in_sprite ? sprite_color : 12'h0; - - // the following lines are required for the Nexys4 VGA circuit - do not change - assign vga_r = ~blank_pipe[1] ? color[11:8]: 0; - assign vga_g = ~blank_pipe[1] ? color[7:4] : 0; - assign vga_b = ~blank_pipe[1] ? color[3:0] : 0; - - assign vga_hs = ~hsync_pipe[1]; - assign vga_vs = ~vsync_pipe[1]; - - -endmodule -`default_nettype wire diff --git a/examples/nexys_a7/video_sprite_uart/src/vga.sv b/examples/nexys_a7/video_sprite_uart/src/vga.sv deleted file mode 100644 index 3fa787f..0000000 --- a/examples/nexys_a7/video_sprite_uart/src/vga.sv +++ /dev/null @@ -1,68 +0,0 @@ - -/* vga: Generate VGA display signals (1024 x 768 @ 60Hz) - * - * ---- HORIZONTAL ----- ------VERTICAL ----- - * Active Active - * Freq Video FP Sync BP Video FP Sync BP - * 640x480, 60Hz 25.175 640 16 96 48 480 11 2 31 - * 800x600, 60Hz 40.000 800 40 128 88 600 1 4 23 - * 1024x768, 60Hz 65.000 1024 24 136 160 768 3 6 29 - * 1280x1024, 60Hz 108.00 1280 48 112 248 768 1 3 38 - * 1280x720p 60Hz 75.25 1280 72 80 216 720 3 5 30 - * 1920x1080 60Hz 148.5 1920 88 44 148 1080 4 5 36 - * - * change the clock frequency, front porches, sync's, and back porches to create - * other screen resolutions - */ - -module vga( - input wire pixel_clk_in, - output logic [10:0] hcount_out, // pixel number on current line - output logic [9:0] vcount_out, // line number - output logic vsync_out, hsync_out, - output logic blank_out); - - parameter DISPLAY_WIDTH = 1024; // display width - parameter DISPLAY_HEIGHT = 768; // number of lines - - parameter H_FP = 24; // horizontal front porch - parameter H_SYNC_PULSE = 136; // horizontal sync - parameter H_BP = 160; // horizontal back porch - - parameter V_FP = 3; // vertical front porch - parameter V_SYNC_PULSE = 6; // vertical sync - parameter V_BP = 29; // vertical back porch - - // horizontal: 1344 pixels total - // display 1024 pixels per line - logic hblank,vblank; - logic hsyncon,hsyncoff,hreset,hblankon; - assign hblankon = (hcount_out == (DISPLAY_WIDTH -1)); - assign hsyncon = (hcount_out == (DISPLAY_WIDTH + H_FP - 1)); //1047 - assign hsyncoff = (hcount_out == (DISPLAY_WIDTH + H_FP + H_SYNC_PULSE - 1)); // 1183 - assign hreset = (hcount_out == (DISPLAY_WIDTH + H_FP + H_SYNC_PULSE + H_BP - 1)); //1343 - - // vertical: 806 lines total - // display 768 lines - logic vsyncon,vsyncoff,vreset,vblankon; - assign vblankon = hreset & (vcount_out == (DISPLAY_HEIGHT - 1)); // 767 - assign vsyncon = hreset & (vcount_out == (DISPLAY_HEIGHT + V_FP - 1)); // 771 - assign vsyncoff = hreset & (vcount_out == (DISPLAY_HEIGHT + V_FP + V_SYNC_PULSE - 1)); // 777 - assign vreset = hreset & (vcount_out == (DISPLAY_HEIGHT + V_FP + V_SYNC_PULSE + V_BP - 1)); // 805 - - // sync and blanking - logic next_hblank,next_vblank; - assign next_hblank = hreset ? 0 : hblankon ? 1 : hblank; - assign next_vblank = vreset ? 0 : vblankon ? 1 : vblank; - always_ff @(posedge pixel_clk_in) begin - hcount_out <= hreset ? 0 : hcount_out + 1; - hblank <= next_hblank; - hsync_out <= hsyncon ? 0 : hsyncoff ? 1 : hsync_out; // active low - - vcount_out <= hreset ? (vreset ? 0 : vcount_out + 1) : vcount_out; - vblank <= next_vblank; - vsync_out <= vsyncon ? 0 : vsyncoff ? 1 : vsync_out; // active low - - blank_out <= next_vblank | (next_hblank & ~hreset); - end -endmodule \ No newline at end of file diff --git a/examples/nexys_a7/video_sprite_uart/xdc/top_level.xdc b/examples/nexys_a7/video_sprite_uart/xdc/top_level.xdc deleted file mode 100644 index 817beb0..0000000 --- a/examples/nexys_a7/video_sprite_uart/xdc/top_level.xdc +++ /dev/null @@ -1,253 +0,0 @@ -## This file is a general .xdc for the Nexys4 DDR Rev. C -## To use it in a project: -## - uncomment the lines corresponding to used pins -## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project - -## This file has been modified from the default .xdc provided by Digilent for the Nexys A7 - -## Clock signal -set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk_100mhz }]; #IO_L12P_T1_MRCC_35 Sch=clk_100mhz -create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk_100mhz}]; - - -##Switches - -#set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] -#set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] -#set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] -#set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] -#set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] -#set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] -#set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] -#set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] -#set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] -#set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] -#set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] -#set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] -#set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] -#set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] -#set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] -#set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] - - -## LEDs - -#set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] -#set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] -#set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] -#set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] -#set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] -#set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] -#set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] -#set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] -#set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] -#set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] -#set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] -#set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] -#set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] -#set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] -#set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] -#set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] - -#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b -#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g -#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r -#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b -#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g -#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r - - -##7 segment display - -#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca -#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb -#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc -#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd -#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce -#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf -#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg - -#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp - -#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] -#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] -#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] -#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] -#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] -#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] -#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] -#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] - - -##Buttons - -#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn - -#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc -#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu -#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl -#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr -#set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd - - -##Pmod Headers - - -##Pmod Header JA - -#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] -#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] -#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] -#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] -#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] -#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] -#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] -#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] - - -##Pmod Header JB - -#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] -#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] -#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] -#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] -#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] -#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] -#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] -#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] - - -##Pmod Header JC - -#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] -#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] -#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] -#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] -#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] -#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] -#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] -#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] - - -##Pmod Header JD - -#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] -#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] -#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] -#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] -#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] -#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] -#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] -#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] - - -##Pmod Header JXADC - -#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] -#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] -#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] -#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] -#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] -#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] -#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] -#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] - - -##VGA Connector - -set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] -set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] -set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] -set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] - -set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] -set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] -set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] -set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] - -set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] -set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] -set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] -set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] - -set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs -set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs - -##Micro SD Connector - -#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset -#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd -#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck -#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd -#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] -#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] -#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] -#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] - - -##Accelerometer - -#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso -#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi -#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk -#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn -#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] -#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] - - -##Temperature Sensor - -#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl -#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda -#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int -#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct - -##Omnidirectional Microphone - -#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk -#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data -#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel - - -##PWM Audio Amplifier - -#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm -#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd - - -##USB-RS232 Interface - -set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in -set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out -#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts -#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts - -##USB HID (PS/2) - -#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk -#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data - - -##SMSC Ethernet PHY - -#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc -#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio -#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn -#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv -#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr -#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] -#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] -#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen -#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] -#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] -#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk -#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn - - -##Quad SPI Flash - -#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] -#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] -#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] -#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] -#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 949089d..8e9b9e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,12 +1,13 @@ [project] -name = "mantaray" -version = "0.0.5" +name = "manta" +version = "0.1.0" authors = [ { name="Fischer Moseley", email="fischerm@mit.edu" }, ] description = "An In-Situ Debugging Tool for Programmable Hardware" readme = "README.md" dependencies = [ + "amaranth[builtin-yosys]@git+https://github.com/amaranth-lang/amaranth", "PyYAML", "pyserial", "pyvcd", @@ -15,6 +16,14 @@ dependencies = [ requires-python = ">=3.7" +[project.optional-dependencies] +dev = [ + "pytest", + "black", + "mkdocs-material", + "amaranth_boards@git+https://github.com/amaranth-lang/amaranth-boards" +] + [project.urls] "Homepage" = "https://github.com/fischermoseley/manta" @@ -24,9 +33,6 @@ manta = "manta:main" [tool.setuptools.packages.find] where = ["src"] -[tool.setuptools.package-data] -manta = ["**/*.v"] - [build-system] requires = ["setuptools"] build-backend = "setuptools.build_meta" \ No newline at end of file diff --git a/src/manta/__init__.py b/src/manta/__init__.py index 587e4d8..60b9f60 100644 --- a/src/manta/__init__.py +++ b/src/manta/__init__.py @@ -1,385 +1,5 @@ -# Internal Dependencies -from .utils import * -from .la_core import * -from .io_core import * -from .block_mem_core import * - -# External Dependencies -from sys import argv -import os -from datetime import datetime -from pkg_resources import get_distribution - -class Manta: - def __init__(self, config_filepath): - config = self.read_config_file(config_filepath) - - # set interface - if "uart" in config: - from .uart_iface import UARTInterface - self.interface = UARTInterface(config["uart"]) - - elif "ethernet" in config: - from .ether_iface import EthernetInterface - self.interface = EthernetInterface(config["ethernet"]) - - else: - raise ValueError("Unrecognized interface specified.") - - # check that cores were provided - assert "cores" in config, "No cores found." - assert len(config["cores"]) > 0, "Must specify at least one core." - - # add cores to self - base_addr = 0 - self.cores = [] - for i, core_name in enumerate(config["cores"]): - core = config["cores"][core_name] - - # make sure a type was specified for this core - assert "type" in core, f"No type specified for core {core_name}." - - # add the core to ourself - if core["type"] == "logic_analyzer": - new_core = LogicAnalyzerCore(core, core_name, base_addr, self.interface) - - elif core["type"] == "io": - new_core = IOCore(core, core_name, base_addr, self.interface) - - elif core["type"] == "block_memory": - new_core = BlockMemoryCore(core, core_name, base_addr, self.interface) - - else: - raise ValueError(f"Unrecognized core type specified for {core_name}.") - - # make sure we're not out of address space - assert new_core.max_addr < (2**16)-1, f"Ran out of address space to allocate to core {core_name}." - - # make the next core's base address start one address after the previous one's - base_addr = new_core.max_addr + 1 - - # add friendly name, so users can do Manta.my_logic_analyzer.read() for example - setattr(self, core_name, new_core) - self.cores.append(new_core) - - def read_config_file(self, path): - """Take path to configuration file, and retun the configuration as a python list/dict object.""" - extension = path.split(".")[-1] - - if "json" in extension: - with open(path, "r") as f: - import json - - config = json.load(f) - - elif "yaml" in extension or "yml" in extension: - with open(path, "r") as f: - import yaml - - config = yaml.safe_load(f) - - else: - raise ValueError("Unable to recognize configuration file extension.") - - return config - - def gen_connections(self): - # generates hdl for registers that connect two modules together - - # make pairwise cores - core_pairs = [(self.cores[i - 1], self.cores[i]) for i in range(1, len(self.cores))] - - conns = [] - for core_pair in core_pairs: - src = core_pair[0].name - dst = core_pair[1].name - - hdl = f"reg [15:0] {src}_{dst}_addr;\n" - hdl += f"reg [15:0] {src}_{dst}_data;\n" - hdl += f"reg {src}_{dst}_rw;\n" - hdl += f"reg {src}_{dst}_valid;\n" - conns.append(hdl) - - return conns - - def gen_instances(self): - # generates hdl for modules that need to be connected together - - insts = [] - for i, core in enumerate(self.cores): - # should probably check if core is LogicAnalyzerCore or IOCore - - hdl = core.hdl_inst() - - # connect input - if (i == 0): - src_name = "brx" - - else: - src_name = self.cores[i-1].name - - hdl = hdl.replace(".addr_i()", f".addr_i({src_name}_{core.name}_addr)") - hdl = hdl.replace(".data_i()", f".data_i({src_name}_{core.name}_data)") - hdl = hdl.replace(".rw_i()", f".rw_i({src_name}_{core.name}_rw)") - hdl = hdl.replace(".valid_i()", f".valid_i({src_name}_{core.name}_valid)") - - - - # connect output - if (i < len(self.cores)-1): - dst_name = self.cores[i+1].name - hdl = hdl.replace(".addr_o()", f".addr_o({core.name}_{dst_name}_addr)") - - else: - dst_name = "btx" - - hdl = hdl.replace(".data_o()", f".data_o({core.name}_{dst_name}_data)") - hdl = hdl.replace(".rw_o()", f".rw_o({core.name}_{dst_name}_rw)") - hdl = hdl.replace(".valid_o()", f".valid_o({core.name}_{dst_name}_valid)") - - insts.append(hdl) - - return insts - - def gen_core_chain(self): - insts = self.gen_instances() - conns = self.gen_connections() - core_chain = [] - for i, inst in enumerate(insts): - core_chain.append(inst) - - if (i != len(insts)-1): - core_chain.append(conns[i]) - - return '\n'.join(core_chain) - - def gen_example_inst_ports(self): - # this is a C-style block comment that contains an instantiation - # of the configured manta instance - the idea is that a user - # can copy-paste that into their design instead of trying to spot - # the difference between their code and the autogenerated code. - - # hopefully this saves time! - - - # this turns a list like ['input wire foo', 'output reg bar'] into - # a nice string like ".foo(foo),\n .bar(bar)" - interface_ports = self.interface.hdl_top_level_ports() - interface_ports = [port.split(',')[0] for port in interface_ports] - interface_ports = [port.split(' ')[-1] for port in interface_ports] - interface_ports = [f".{port}({port}),\n" for port in interface_ports] - interface_ports = "".join(interface_ports) - - core_chain_ports = [] - for core in self.cores: - ports = [port.split(',')[0] for port in core.hdl_top_level_ports()] - ports = [port.split(' ')[-1] for port in ports] - ports = [f".{port}({port}), \n" for port in ports] - ports = "".join(ports) - ports = "\n" + ports - core_chain_ports.append(ports) - - core_chain_ports = "\n".join(core_chain_ports) - - ports = interface_ports + core_chain_ports - - # remove trailing comma - ports = ports.rstrip() - if ports[-1] == ",": - ports = ports[:-1] - - return ports - - def gen_top_level_ports(self): - # get all the top level connections for each module. - - interface_ports = self.interface.hdl_top_level_ports() - interface_ports = [f"{port},\n" for port in interface_ports] - interface_ports = "".join(interface_ports) + "\n" - - core_chain_ports = [] - for core in self.cores: - ports = [f"{port},\n" for port in core.hdl_top_level_ports()] - ports = "".join(ports) - core_chain_ports.append(ports) - - core_chain_ports = "\n".join(core_chain_ports) - - ports = interface_ports + core_chain_ports - - # remove trailing comma - ports = ports.rstrip() - if ports[-1] == ",": - ports = ports[:-1] - - return ports - - def gen_interface_rx(self): - # instantiate interface_rx, substitute in register names - interface_rx_inst = self.interface.rx_hdl_inst() - - interface_rx_inst = interface_rx_inst.replace("addr_o()", f"addr_o(brx_{self.cores[0].name}_addr)") - interface_rx_inst = interface_rx_inst.replace("data_o()", f"data_o(brx_{self.cores[0].name}_data)") - interface_rx_inst = interface_rx_inst.replace("rw_o()", f"rw_o(brx_{self.cores[0].name}_rw)") - interface_rx_inst = interface_rx_inst.replace("valid_o()", f"valid_o(brx_{self.cores[0].name}_valid)") - - # connect interface_rx to core_chain - interface_rx_conn= f""" -reg [15:0] brx_{self.cores[0].name}_addr; -reg [15:0] brx_{self.cores[0].name}_data; -reg brx_{self.cores[0].name}_rw; -reg brx_{self.cores[0].name}_valid;\n""" - - return interface_rx_inst + interface_rx_conn - - def gen_interface_tx(self): - - # connect core_chain to interface_tx - interface_tx_conn = f""" -reg [15:0] {self.cores[-1].name}_btx_data; -reg {self.cores[-1].name}_btx_rw; -reg {self.cores[-1].name}_btx_valid;\n""" - - # instantiate interface_tx, substitute in register names - interface_tx_inst = self.interface.tx_hdl_inst() - - interface_tx_inst = interface_tx_inst.replace("addr_i()", f"addr_i({self.cores[-1].name}_btx_addr)") - interface_tx_inst = interface_tx_inst.replace("data_i()", f"data_i({self.cores[-1].name}_btx_data)") - interface_tx_inst = interface_tx_inst.replace("rw_i()", f"rw_i({self.cores[-1].name}_btx_rw)") - interface_tx_inst = interface_tx_inst.replace("valid_i()", f"valid_i({self.cores[-1].name}_btx_valid)") - - return interface_tx_conn + interface_tx_inst - - def gen_module_defs(self): - # aggregate module definitions and remove duplicates - module_defs_with_dups = [self.interface.rx_hdl_def()] + [core.hdl_def() for core in self.cores] + [self.interface.tx_hdl_def()] - module_defs = [] - module_defs = [m_def for m_def in module_defs_with_dups if m_def not in module_defs] - module_defs = [m_def.strip() for m_def in module_defs] - return '\n\n'.join(module_defs) - - def generate_hdl(self, output_filepath): - manta = VerilogManipulator("manta_def_tmpl.v") - - version = "v" + get_distribution('mantaray').version - manta.sub(version, "/* VERSION */") - - timestamp = datetime.now().strftime("%d %b %Y at %H:%M:%S") - manta.sub(timestamp, "/* TIMESTAMP */") - - user = os.environ.get("USER", os.environ.get("USERNAME")) - manta.sub(user, "/* USER */") - - ex_inst_ports = self.gen_example_inst_ports() - manta.sub(ex_inst_ports, "/* EX_INST_PORTS */") - - top_level_ports = self.gen_top_level_ports() - manta.sub(top_level_ports, "/* TOP_LEVEL_PORTS */") - - interface_rx = self.gen_interface_rx() - manta.sub(interface_rx, "/* INTERFACE_RX */") - - core_chain = self.gen_core_chain() - manta.sub(core_chain, "/* CORE_CHAIN */") - - interface_tx = self.gen_interface_tx() - manta.sub(interface_tx, "/* INTERFACE_TX */") - - module_defs = self.gen_module_defs() - manta.sub(module_defs, "/* MODULE_DEFS */") - - manta.hdl = "`timescale 1ns/1ps\n" + manta.hdl - manta.hdl = "`default_nettype none\n"+ manta.hdl - manta.hdl = manta.hdl + "\n`default_nettype wire" - - return manta.get_hdl() - -def main(): - # print help menu if no args passed or help menu requested - - if len(argv) == 1 or argv[1] == "help" or argv[1] == "ray" or argv[1] == "bae": - version = "v" + get_distribution('mantaray').version - print( - f""" -\033[96m (\.-./) -\033[96m / \\ -\033[96m .' : '. -\033[96m _.-'` ' `'-._ \033[34;49;1m | \033[34;49;1m Manta {version} \033[00m -\033[96m .-' : '-. \033[34;49;1m | \033[34;49;3m An In-Situ Debugging Tool for Programmable Hardware \033[00m -\033[96m ,'_.._ . _.._', \033[34;49;1m | \033[34;49m https://github.com/fischermoseley/manta \033[00m -\033[96m '` `'-. ' .-'` -\033[96m '. : .' \033[34;49;1m | \033[34;49;3m fischerm [at] mit.edu \033[00m -\033[96m \_. ._/ -\033[96m \ |^| -\033[96m | | ; -\033[96m \\'.___.' / -\033[96m '-....-' \033[00m - -Supported commands: - gen [config_file] [verilog_file] generate a verilog file specifying the Manta module from a given configuration file, and save to the provided path - capture [config_file] [LA_core_name] [vcd_file] [mem_file] start a capture on the specified core, and save the results to a .mem or .vcd file at the provided path(s) - playback [config file] [LA_core_name] [verilog_file] generate a verilog module that plays back a capture from a given logic analyzer core, and save to the provided path - ports list all available serial ports - help, ray display this splash screen (hehe...splash screen) -""" - ) - - # list available serial ports - elif argv[1] == "ports": - import serial.tools.list_ports - for port in serial.tools.list_ports.comports(): - print(port) - - # sometimes macOS will enumerate non-serial devices as serial ports, - # in which case the PID/VID/serial/location/etc are all None - pid = f"0x{port.vid:04X}" if port.pid is not None else "None" - vid = f"0x{port.vid:04X}" if port.vid is not None else "None" - - print(f" -> pid: {pid}") - print(f" -> vid: {vid}") - print(f" -> ser: {port.serial_number}") - print(f" -> loc: {port.location}") - print(f" -> mftr: {port.manufacturer}") - print(f" -> prod: {port.product}") - print(f" -> desc: {port.description}\n") - - # generate the specified configuration - elif argv[1] == "gen": - assert len(argv) == 4, "Wrong number of arguments, run 'manta help' for proper usage." - - m = Manta(argv[2]) - hdl = m.generate_hdl(argv[3]) - with open(argv[3], "w") as f: - f.write(hdl) - - # run the specified core - elif argv[1] == "capture": - assert len(argv) >= 5, "Wrong number of arguments, run 'manta help' for proper usage." - - m = Manta(argv[2]) - la = getattr(m, argv[3]) - data = la.capture() - - for path in argv[4:]: - if ".vcd" in path: - la.export_vcd(data, path) - - elif ".mem" in path: - la.export_mem(data, path) - - else: - print(f"Warning: Unknown output file format for {path}, skipping...") - - elif argv[1] == "playback": - assert len(argv) == 5, "Wrong number of arguments, run 'manta help' for proper usage." - - m = Manta(argv[2]) - la = getattr(m, argv[3]) - la.export_playback_module(argv[4]) - - else: - print("Option not recognized, run 'manta help' for proper usage.") - +from .manta import Manta +from .cli import main if __name__ == "__main__": main() diff --git a/src/manta/__main__.py b/src/manta/__main__.py index b23d9a5..4e28416 100644 --- a/src/manta/__main__.py +++ b/src/manta/__main__.py @@ -1,3 +1,3 @@ -import manta +from .cli import main -manta.main() +main() diff --git a/src/manta/block_mem_core/__init__.py b/src/manta/block_mem_core/__init__.py deleted file mode 100644 index dbe841c..0000000 --- a/src/manta/block_mem_core/__init__.py +++ /dev/null @@ -1,77 +0,0 @@ -from ..utils import * - -from math import ceil, log2 - -class BlockMemoryCore: - def __init__(self, config, name, base_addr, interface): - self.name = name - self.base_addr = base_addr - self.interface = interface - - # Warn if unrecognized options have been given - for option in config: - if option not in ["type", "depth", "width", "expose_port"]: - print(f"Warning: Ignoring unrecognized option '{option}' in Block Memory core '{self.name}'") - - # Determine if we expose the BRAM's second port to the top of the module - if "expose_port" in config: - assert isinstance(config["expose_port"], bool), "Configuring BRAM exposure must be done with a boolean." - self.expose_port = config["expose_port"] - - else: - self.expose_port = True - - # Get depth - assert "depth" in config, "Depth not specified for Block Memory core." - assert config["depth"] > 0, "Block Memory core must have positive depth." - assert isinstance(config["depth"], int), "Block Memory core must have integer depth." - self.depth = config["depth"] - - # Get width - assert "width" in config, "Width not specified for Block Memory core." - assert config["width"] > 0, "Block Memory core must have positive width." - assert isinstance(config["width"], int), "Block Memory core must have integer width." - self.width = config["width"] - - self.addr_width = ceil(log2(self.depth)) - self.n_brams = ceil(self.width / 16) - self.max_addr = self.base_addr + (self.depth * self.n_brams) - - def hdl_inst(self): - inst = VerilogManipulator("block_mem_core/block_memory_inst_tmpl.v") - inst.sub(self.name, "/* INST_NAME */") - inst.sub(self.depth, "/* DEPTH */") - inst.sub(self.width, "/* WIDTH */") - return inst.get_hdl() - - def hdl_def(self): - block_memory = VerilogManipulator("block_mem_core/block_memory.v").get_hdl() - dual_port_bram = VerilogManipulator("block_mem_core/dual_port_bram.v").get_hdl() - return block_memory + "\n" + dual_port_bram - - def hdl_top_level_ports(self): - if not self.expose_port: - return "" - - tlp = [] - tlp.append(f"input wire {self.name}_clk") - tlp.append(f"input wire [{self.addr_width-1}:0] {self.name}_addr") - tlp.append(f"input wire [{self.width-1}:0] {self.name}_din") - tlp.append(f"output reg [{self.width-1}:0] {self.name}_dout") - tlp.append(f"input wire {self.name}_we") - return tlp - - def get_physical_addr(self, addr): - if isinstance(addr, int): - return addr + self.base_addr - - elif isinstance(addr, list): - return [a + self.base_addr for a in addr] - - raise ValueError("Read address must be integer or list of integers.") - - def read(self, addr): - return self.interface.read(self.get_physical_addr(addr)) - - def write(self, addr, data): - return self.interface.write(self.get_physical_addr(addr), data) \ No newline at end of file diff --git a/src/manta/block_mem_core/block_memory.v b/src/manta/block_mem_core/block_memory.v deleted file mode 100644 index ae00f17..0000000 --- a/src/manta/block_mem_core/block_memory.v +++ /dev/null @@ -1,114 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module block_memory ( - input wire clk, - - // input port - input wire [15:0] addr_i, - input wire [15:0] data_i, - input wire rw_i, - input wire valid_i, - - // output port - output reg [15:0] addr_o, - output reg [15:0] data_o, - output reg rw_o, - output reg valid_o, - - // BRAM itself - input wire user_clk, - input wire [ADDR_WIDTH-1:0] user_addr, - input wire [WIDTH-1:0] user_din, - output reg [WIDTH-1:0] user_dout, - input wire user_we); - - parameter BASE_ADDR = 0; - parameter WIDTH = 0; - parameter DEPTH = 0; - localparam ADDR_WIDTH = $clog2(DEPTH); - - // ugly typecasting, but just computes ceil(WIDTH / 16) - localparam N_BRAMS = int'($ceil(real'(WIDTH) / 16.0)); - localparam MAX_ADDR = BASE_ADDR + (DEPTH * N_BRAMS); - - // Port A of BRAMs - reg [N_BRAMS-1:0][ADDR_WIDTH-1:0] addra = 0; - reg [N_BRAMS-1:0][15:0] dina = 0; - reg [N_BRAMS-1:0][15:0] douta; - reg [N_BRAMS-1:0] wea = 0; - - // Port B of BRAMs - reg [N_BRAMS-1:0][15:0] dinb; - reg [N_BRAMS-1:0][15:0] doutb; - assign dinb = user_din; - - // kind of a hack to part select from a 2d array that's been flattened to 1d - reg [(N_BRAMS*16)-1:0] doutb_flattened; - assign doutb_flattened = doutb; - assign user_dout = doutb_flattened[WIDTH-1:0]; - - // Pipelining - reg [2:0][15:0] addr_pipe = 0; - reg [2:0][15:0] data_pipe = 0; - reg [2:0] valid_pipe = 0; - reg [2:0] rw_pipe = 0; - - always @(posedge clk) begin - addr_pipe[0] <= addr_i; - data_pipe[0] <= data_i; - valid_pipe[0] <= valid_i; - rw_pipe[0] <= rw_i; - - addr_o <= addr_pipe[2]; - data_o <= data_pipe[2]; - valid_o <= valid_pipe[2]; - rw_o <= rw_pipe[2]; - - for(int i=1; i<3; i=i+1) begin - addr_pipe[i] <= addr_pipe[i-1]; - data_pipe[i] <= data_pipe[i-1]; - valid_pipe[i] <= valid_pipe[i-1]; - rw_pipe[i] <= rw_pipe[i-1]; - end - - // throw BRAM operations into the front of the pipeline - wea <= 0; - if( (valid_i) && (addr_i >= BASE_ADDR) && (addr_i <= MAX_ADDR)) begin - wea[(addr_i - BASE_ADDR) % N_BRAMS] <= rw_i; - addra[(addr_i - BASE_ADDR) % N_BRAMS] <= (addr_i - BASE_ADDR) / N_BRAMS; - dina[(addr_i - BASE_ADDR) % N_BRAMS] <= data_i; - end - - // pull BRAM reads from the back of the pipeline - if( (valid_pipe[2]) && (addr_pipe[2] >= BASE_ADDR) && (addr_pipe[2] <= MAX_ADDR)) begin - data_o <= douta[(addr_pipe[2] - BASE_ADDR) % N_BRAMS]; - end - end - - // generate the BRAMs - genvar i; - generate - for(i=0; i pid: {pid}") + print(f" -> vid: {vid}") + print(f" -> ser: {port.serial_number}") + print(f" -> loc: {port.location}") + print(f" -> mftr: {port.manufacturer}") + print(f" -> prod: {port.product}") + print(f" -> desc: {port.description}\n") + + +def main(): + if len(argv) == 1: + help() + + elif argv[1] in ["help", "-h", "-help", "--help", "ray"]: + help() + + elif argv[1] == "gen": + if len(argv) != 4: + wrong_args() + gen(argv[2], argv[3]) + + elif argv[1] == "capture": + if len(argv) < 5: + wrong_args() + capture(argv[2], argv[3], argv[4]) + + elif argv[1] == "playback": + if len(argv) != 5: + wrong_args() + playback(argv[2], argv[3], argv[4]) + + elif argv[1] == "mmap": + if len(argv) != 3: + wrong_args() + mmap(argv[2]) + + elif argv[1] == "ports": + ports() + + else: + wrong_args() + + +if __name__ == "__main__": + main() diff --git a/src/manta/ether_iface/__init__.py b/src/manta/ether_iface/__init__.py deleted file mode 100644 index 042bffe..0000000 --- a/src/manta/ether_iface/__init__.py +++ /dev/null @@ -1,208 +0,0 @@ -from ..utils import * - -# Lazy and selective imports for quick builds! -from scapy.interfaces import get_if_list -from scapy.arch import get_if_hwaddr -from scapy.layers.l2 import Ether -from scapy.sendrecv import AsyncSniffer, sendp, sendpfast -from time import sleep - -from scapy.all import * - -class EthernetInterface: - def __init__(self, config): - # Warn if unrecognized options have been given - for option in config: - if option not in ["interface", "host_mac", "fpga_mac", "ethertype", "tcpreplay", "verbose"]: - print(f"Warning: Ignoring unrecognized option '{option}' in Ethernet interface.") - - # Obtain interface. - assert "interface" in config, "No interface provided for Ethernet core." - if config["interface"] not in get_if_list(): - print(f"Warning: Interface specified is not detected by the host.") - self.iface = config["interface"] - - # Obtain Host MAC address - if self.iface in get_if_list(): - self.host_mac = get_if_hwaddr(self.iface) - else: - assert "host_mac" in config, \ - "Can't automatically detect host mac address from interface, host_mac must be manually provided" - self.host_mac = config["host_mac"] - - # Obtain FPGA MAC address - # - the default address is a locally administered unicast address, - # which is an important distinction. please refer to: - # https://en.wikipedia.org/wiki/MAC_address#Ranges_of_group_and_locally_administered_addresses - self.fpga_mac = "12:34:56:78:9A:BC" - if "fpga_mac" in config: - self.fpga_mac = config["fpga_mac"] - - # Obtain Ethertype - # - the default ethertype being used is reserved for local - # experimentation by the IEEE - and might not make it beyond - # your NIC as a result. - self.ethertype = 0x88B5 - if "ethertype" in config: - self.ethertype = int(config["ethertype"], 16) - - # Set whether we use tcpreplay for faster packet blasting - if "tcpreplay" in config: - assert isinstance(config["tcpreplay"], bool), \ - "tcpreplay configuration option must be boolean!" - - if config["tcpreplay"]: - self.send_packets = lambda p: sendpfast(p, iface=self.iface) - - else: - self.send_packets = lambda p: sendp(p, iface=self.iface, verbose=0) - - else: - self.send_packets = lambda p: sendp(p, iface=self.iface, verbose=0) - - - self.verbose = False - if "verbose" in config: - assert isinstance(config["verbose"], bool), \ - "verbose configuration option must be boolean!" - self.verbose = config["verbose"] - - def read(self, addr): - # Perform type checks, output list of addresses - if isinstance(addr, int): - addrs = [addr] - - elif isinstance(addr, list): - assert all(isinstance(a, int) for a in addr), \ - "Read addresses must be integer or list of integers." - addrs = addr - - else: - raise ValueError("Read addresses must be integer or list of integers.") - - # Prepare packets with read requests - request_pkts = [] - for a in addrs: - pkt = Ether() - pkt.src = self.host_mac - pkt.dst = self.fpga_mac - pkt.type = self.ethertype - - # one byte of rw, two bytes of address, and 44 of padding - # makes the 46 byte minimum length - msg = b'\x00' + a.to_bytes(2, 'big') + 43*b'\x00' - - pkt = pkt / msg - pkt.load = msg - request_pkts.append(pkt) - - # Start sniffer in another thread, send packets, grab responses - sniffer = AsyncSniffer(iface = self.iface, count = len(addrs), filter=f"ether src {self.fpga_mac}") - sniffer.start() - sleep(0.5) - self.send_packets(request_pkts) - sniffer.join() - response_pkts = sniffer.results - assert len(response_pkts) == len(request_pkts), "Received wrong number of packets!" - - # Get read data by pulling bytes 3 and 4 from the returned packets - # payload, and interpreting it as big endian - get_read_data = lambda x: int.from_bytes(bytes(x.payload)[3:5], 'big') - read_data = [get_read_data(pkt) for pkt in response_pkts] - - if len(read_data) == 1: - return read_data[0] - - else: - return read_data - - def write(self, addr, data): - # Perform type checks, output list of addresses - if isinstance(addr, int): - assert isinstance(data, int), \ - "Data must also be integer if address is integer." - addrs = [addr] - datas = [data] - - elif isinstance(addr, list): - assert all(isinstance(a, int) for a in addr), \ - "Write addresses must be integer or list of integers." - - assert all(isinstance(d, int) for d in data), \ - "Write data must be integer or list of integers." - - assert len(addr) == len(data), \ - "There must be equal number of write addresses and data." - - addrs = addr - datas = data - - else: - raise ValueError("Write addresses and data must be integer or list of integers.") - - # Prepare packets with write requests - request_pkts = [] - for a, d in zip(addrs, datas): - pkt = Ether() - pkt.src = self.host_mac - pkt.dst = self.fpga_mac - pkt.type = self.ethertype - - # one byte of rw, two bytes of address, two bytes of data, and 42 of padding - # makes the 46 byte minimum length - msg = b'\x01' + a.to_bytes(2, 'big') + d.to_bytes(2, 'big') + 41*b'\x00' - - pkt = pkt / msg - pkt.load = msg - request_pkts.append(pkt) - - self.send_packets(request_pkts) - - def hdl_top_level_ports(self): - return ["input wire crsdv", \ - "input wire [1:0] rxd", \ - "output reg txen", \ - "output reg [1:0] txd"] - - def rx_hdl_def(self): - tx = VerilogManipulator("ether_iface/ethernet_rx.v").get_hdl() + "\n" - tx += VerilogManipulator("ether_iface/mac_rx.v").get_hdl() + "\n" - tx += VerilogManipulator("ether_iface/ether.v").get_hdl() + "\n" - tx += VerilogManipulator("ether_iface/bitorder.v").get_hdl() + "\n" - tx += VerilogManipulator("ether_iface/firewall.v").get_hdl() + "\n" - tx += VerilogManipulator("ether_iface/aggregate.v").get_hdl() + "\n" - tx += VerilogManipulator("ether_iface/crc32.v").get_hdl() + "\n" - tx += VerilogManipulator("ether_iface/cksum.v").get_hdl() + "\n" - return tx - - def tx_hdl_def(self): - tx = VerilogManipulator("ether_iface/ethernet_tx.v").get_hdl() + "\n" - tx += VerilogManipulator("ether_iface/mac_tx.v").get_hdl() + "\n" - tx += VerilogManipulator("ether_iface/bitorder.v").get_hdl() + "\n" - tx += VerilogManipulator("ether_iface/crc32.v").get_hdl() + "\n" - return tx - - def rx_hdl_inst(self): - rx = VerilogManipulator("ether_iface/ethernet_rx_inst_tmpl.v") - - fpga_mac_verilog_literal = "48'h" + self.fpga_mac.replace(":", "_").upper() - rx.sub(fpga_mac_verilog_literal, "/* FPGA_MAC */") - - ethertype_verilog_literal = f"16'h{self.ethertype:02X}" - rx.sub(ethertype_verilog_literal, "/* ETHERTYPE */") - - return rx.get_hdl() - - def tx_hdl_inst(self): - tx = VerilogManipulator("ether_iface/ethernet_tx_inst_tmpl.v") - - fpga_mac_verilog_literal = "48'h" + self.fpga_mac.replace(":", "_").upper() - tx.sub(fpga_mac_verilog_literal, "/* FPGA_MAC */") - - host_mac_verilog_literal = "48'h" + self.host_mac.replace(":", "_").upper() - tx.sub(host_mac_verilog_literal, "/* HOST_MAC */") - - ethertype_verilog_literal = f"16'h{self.ethertype:02X}" - tx.sub(ethertype_verilog_literal, "/* ETHERTYPE */") - - return tx.get_hdl() \ No newline at end of file diff --git a/src/manta/ether_iface/aggregate.v b/src/manta/ether_iface/aggregate.v deleted file mode 100644 index aad4e53..0000000 --- a/src/manta/ether_iface/aggregate.v +++ /dev/null @@ -1,46 +0,0 @@ -`default_nettype none -`timescale 1ns / 1ps - -/* Aggregates the first 64 bits of an incoming - * Ethernet transmission (thus shedding the FCS - * and anything else extraneous) and outputs the - * first 32 bits on an AXI bus for a single cycle. - * If the packet is not at least 64 bits long, - * nothing happens - */ - -`define AGR_MAX 56 -`define AGR_SHOW 64 - -module aggregate ( - input wire clk, - input wire [1:0] axiid, - input wire axiiv, - - output reg [55:0] axiod, - output reg axiov); - - /* A quick and dirty counter. As long as this is below - * 32, we'll dump packets into the AXI output data buffer. - * Once the counter gets to AGR_MAX, we'll assert AXI valid. - * Then we'll hang until axiiv drops - */ - - reg [31:0] counter; - - assign axiov = counter == `AGR_SHOW; - - always @(posedge clk) begin: COUNTER - if (!axiiv) counter <= 32'b0; - else counter <= counter + 2; - end - - always @(posedge clk) begin: AXIOD - if (!axiiv) axiod <= 32'b0; - else if (counter < `AGR_MAX && axiiv) - axiod[`AGR_MAX - counter - 2 +: 2] <= axiid; - end - -endmodule - -`default_nettype wire diff --git a/src/manta/ether_iface/bitorder.v b/src/manta/ether_iface/bitorder.v deleted file mode 100644 index e7ca283..0000000 --- a/src/manta/ether_iface/bitorder.v +++ /dev/null @@ -1,114 +0,0 @@ -`default_nettype none -`timescale 1ns / 1ps - -`define BO_SENDA 2'b00 -`define BO_SENDB 2'b01 -`define BO_EMPTYA 2'b10 -`define BO_EMPTYB 2'b11 - -module bitorder ( - input wire clk, - - input wire axiiv, - input wire [1:0] axiid, - - output reg [1:0] axiod, - output reg axiov); - - /* Two registers to hold data coming in off the wire, - * byte by byte. This is where we'll buffer until - * we've received a byte of data, at which point - * we'll start sending out the byte in the correct - * order using one register. Meanwhile, we'll start - * receiving into the other register - dual buffers. - */ - reg [7:0] bufa = 8'b0; - reg [7:0] bufb = 8'b0; - - /* A counter. This indicates what 'stage' we're in, - * and always refers to the index we're reading into - * in the receiving buffer or sending out of in the - * sending buffer - */ - reg [2:0] countera = 3'b0; - reg [2:0] counterb = 3'b0; - - /* Which state we're in - should we be using buffer - * A to send, buffer B to send, or neither because - * we've just come out of reset? - */ - reg [1:0] state = `BO_EMPTYB; - initial axiov = 0; - initial axiod = 0; - - always @(*) begin: AXIOV - if (state == `BO_SENDA || state == `BO_SENDB) axiov = 1'b1; - else axiov = 1'b0; - end - - always @(*) begin: AXIOD - if (state == `BO_SENDA) axiod = bufa[countera +: 2]; - else if (state == `BO_SENDB) axiod = bufb[counterb +: 2]; - else axiod = 1'b0; - end - - always @(posedge clk) begin: BUFFERIN - if (axiiv) begin - case (state) - `BO_EMPTYB, `BO_SENDB: - bufa[countera +: 2] <= axiid; - `BO_EMPTYA, `BO_SENDA: - bufb[counterb +: 2] <= axiid; - endcase - end - - else if (state == `BO_EMPTYB || state == `BO_EMPTYA) begin - bufa <= 8'b0; - bufb <= 8'b0; - end - end - - always @(posedge clk) begin: STATES - case (state) - `BO_EMPTYB: begin - if (axiiv) begin - if (countera == 3'h6) - state <= `BO_SENDA; - else countera <= countera + 2; - end else countera <= 3'b0; - end - - `BO_EMPTYA: begin - if (axiiv) begin - if (counterb == 3'h6) - state <= `BO_SENDB; - else counterb <= counterb + 2; - end else counterb <= 3'b0; - end - - `BO_SENDB: begin - if (counterb == 3'h0) state <= `BO_EMPTYB; - else counterb <= counterb - 2; - - if (axiiv) begin - if (countera == 3'h6) - state <= `BO_SENDA; - else countera <= countera + 2; - end - end - - `BO_SENDA: begin - if (countera == 3'h0) state <= `BO_EMPTYA; - else countera <= countera - 2; - - if (axiiv) begin - if (counterb == 3'h6) - state <= `BO_SENDB; - else counterb <= counterb + 2; - end - end - endcase - end -endmodule - -`default_nettype wire diff --git a/src/manta/ether_iface/cksum.v b/src/manta/ether_iface/cksum.v deleted file mode 100644 index a1b823b..0000000 --- a/src/manta/ether_iface/cksum.v +++ /dev/null @@ -1,80 +0,0 @@ -`default_nettype none -`timescale 1ns / 1ps - -/* Computes the ethernet checksum - * The following combinations of `done` and `kill` - * represent the state of the module: - * - * - done = 0, kill = 0: processing data or freshly reset - * - done = 1, kill = 0: correct ethernet checksum verified - * - done = 1, kill = 1: data valid set to zero before correct - * checksum value computed, therefore bad checksum - * - done = 0, kill = 1: never asserted - * - * the done and/or kill signals are asserted high beginning - * the cycle after input data ceases, and until new data - * is received via the AXI input - */ - -`define CK_FRESH 2'b00 -`define CK_COMPUTING 2'b01 -`define CK_DONE 2'b10 - -`define MAGIC_CHECK 32'h38_fb_22_84 - -module cksum ( - input wire clk, - input wire [1:0] axiid, - input wire axiiv, - - output reg done, - output reg kill); - - reg [31:0] crcd; - reg crcv; - - /* Decoupled logic to reset the CRC module independently - * Used to compute multiple CRCs back to back - */ - reg crcrst; - - reg [1:0] state = `CK_FRESH; - initial done = 0; - initial kill = 0; - initial crcrst = 0; - - crc32 cksum( - .clk(clk), - .rst(crcrst), - .axiiv(axiiv), - .axiid(axiid), - .axiov(crcv), - .axiod(crcd)); - - always @(posedge clk) begin: OUTPUTS - if (axiiv) begin - done <= 1'b0; - kill <= 1'b0; - crcrst <= 1'b0; - end else begin - if (state == `CK_COMPUTING && !axiiv) begin - done <= 1'b1; - crcrst <= 1'b1; - kill <= (crcd != `MAGIC_CHECK); - end - - else crcrst <= 1'b0; - end - end - - always @(posedge clk) begin: FSM - case (state) - `CK_FRESH: if (axiiv) state <= `CK_COMPUTING; - `CK_COMPUTING: if (!axiiv) state <= `CK_DONE; - `CK_DONE: if (axiiv) state <= `CK_COMPUTING; - endcase - end - -endmodule - -`default_nettype wire diff --git a/src/manta/ether_iface/crc32.v b/src/manta/ether_iface/crc32.v deleted file mode 100644 index 51e4397..0000000 --- a/src/manta/ether_iface/crc32.v +++ /dev/null @@ -1,70 +0,0 @@ -`default_nettype none -`timescale 1ns / 1ps - -`define LAGGING_SHIFT_IN (caxiod[30] ^ axiid[1]) -`define LEADING_SHIFT_IN (caxiod[31] ^ axiid[0]) -`define DOUBLED_SHIFT_IN (`LEADING_SHIFT_IN ^ `LAGGING_SHIFT_IN) - -`define LAGGING_TAPS 4, 7, 10, 16, 22, 26 -`define DOUBLED_TAPS 2, 5, 8, 11, 12, 23 -`define LEADING_TAPS 3, 6, 9, 13, 17, 24, 27 - -/* this module implements CRC32-BZIP2, with a two bit input: - * - poly 0x04C11DB7 - * - init 0xFFFFFFFF - * - NEW: XOR outputs - * - * == check: 0xfc891918 == - * - * this is the ethernet checksum!! - */ - -module crc32( - input wire clk, - input wire rst, - input wire axiiv, - input wire [1:0] axiid, - - output reg axiov, - output reg [31:0] axiod); - - reg [31:0] caxiod, saxiod; - initial caxiod = 32'hFFFF_FFFF; - integer i; - - assign axiov = 1; - assign axiod = ~caxiod; - - always @(*) begin - for (i = 0; i < 32; i = i + 1) begin - case (i) - 0: saxiod[i] = `LAGGING_SHIFT_IN; - 1: saxiod[i] = `DOUBLED_SHIFT_IN; - - `LAGGING_TAPS: - saxiod[i] = caxiod[i - 2] ^ `LAGGING_SHIFT_IN; - `DOUBLED_TAPS: - saxiod[i] = caxiod[i - 2] ^ `DOUBLED_SHIFT_IN; - `LEADING_TAPS: - saxiod[i] = caxiod[i - 2] ^ `LEADING_SHIFT_IN; - - default: saxiod[i] = caxiod[i - 2]; - endcase - end - end - - always @(posedge clk) begin - if (rst) caxiod <= 32'hFFFF_FFFF; - - /* our output validity hinges on whether - * we are calculating anything or not - * on this clock cycle. if there is no - * valid input for us, don't do a shift - * this cycle - */ - else caxiod <= (axiiv) ? saxiod : caxiod; - end - -endmodule - -`default_nettype wire diff --git a/src/manta/ether_iface/ether.v b/src/manta/ether_iface/ether.v deleted file mode 100644 index 56ad986..0000000 --- a/src/manta/ether_iface/ether.v +++ /dev/null @@ -1,77 +0,0 @@ -`default_nettype none -`timescale 1ns / 1ps - -`define EF_IDLE 3'b000 -`define EF_PREAM 3'b001 -`define EF_DATA 3'b011 -`define EF_BAD 3'b101 - -`define PREAM_BITS 64 -`define PREAM_SIZE (`PREAM_BITS / 2) - -`define PREAM_FIRST 2'b00 -`define PREAM_EXPECT 2'b01 -`define PREAM_LAST 2'b11 -`define PREAM_BAD 2'b10 - -module ether ( - input wire clk, - input wire [1:0] rxd, - input wire crsdv, - - output reg axiov, - output reg [1:0] axiod); - - reg [4:0] count; - reg [2:0] state; - - reg [1:0] preamex; - reg preamok, start; - - always @(*) begin: PREAM - if (count == `PREAM_SIZE - 1) preamex = `PREAM_LAST; - else preamex = `PREAM_EXPECT; - - preamok = crsdv && rxd == preamex; - end - - always @(*) start = crsdv && rxd != `PREAM_FIRST; - - always @(posedge clk) begin: COUNT - if (state == `EF_PREAM) count <= count + 1; - else if (state == `EF_IDLE && start) count <= count + 1; - else count <= 0; - end - - initial begin - axiod = 2'b0; - axiov = 1'b0; - state = 3'b0; - end - - always @(posedge clk) begin: FSM - case (state) - `EF_BAD: if (!crsdv) state <= `EF_IDLE; - `EF_IDLE: if (start) state <= `EF_PREAM; - - `EF_PREAM: begin - if (!preamok || !crsdv) state <= `EF_BAD; - else if (count == `PREAM_SIZE - 1) - state <= `EF_DATA; - end - - `EF_DATA: begin - if (crsdv) begin - axiov <= 1'b1; - axiod <= rxd; - end else begin - axiov <= 1'b0; - axiod <= 2'b0; - state <= `EF_IDLE; - end - end - endcase - end -endmodule - -`default_nettype wire diff --git a/src/manta/ether_iface/ethernet_rx.v b/src/manta/ether_iface/ethernet_rx.v deleted file mode 100644 index ba36ec7..0000000 --- a/src/manta/ether_iface/ethernet_rx.v +++ /dev/null @@ -1,41 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module ethernet_rx ( - input wire clk, - - input wire crsdv, - input wire [1:0] rxd, - - output reg [15:0] addr_o, - output reg [15:0] data_o, - output reg rw_o, - output reg valid_o - ); - - parameter FPGA_MAC = 0; - parameter ETHERTYPE = 0; - - reg [55:0] payload; - reg valid; - - mac_rx #( - .FPGA_MAC(FPGA_MAC), - .ETHERTYPE(ETHERTYPE) - ) mrx ( - .clk(clk), - - .crsdv(crsdv), - .rxd(rxd), - - .payload(payload), - .valid(valid)); - - assign rw_o = (payload[39:32] == 8'd1); - assign addr_o = payload[31:16]; - assign data_o = payload[15:0]; - assign valid_o = valid && ( payload[39:32] == 8'd0 || payload[39:32] == 8'd1) && (payload[55:40] == 16'h88B5); - -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/src/manta/ether_iface/ethernet_rx_inst_tmpl.v b/src/manta/ether_iface/ethernet_rx_inst_tmpl.v deleted file mode 100644 index 7eae02b..0000000 --- a/src/manta/ether_iface/ethernet_rx_inst_tmpl.v +++ /dev/null @@ -1,13 +0,0 @@ -ethernet_rx #( - .FPGA_MAC(/* FPGA_MAC */), - .ETHERTYPE(/* ETHERTYPE */) -) erx ( - .clk(clk), - - .crsdv(crsdv), - .rxd(rxd), - - .addr_o(), - .data_o(), - .rw_o(), - .valid_o()); \ No newline at end of file diff --git a/src/manta/ether_iface/ethernet_tx.v b/src/manta/ether_iface/ethernet_tx.v deleted file mode 100644 index 318b3ba..0000000 --- a/src/manta/ether_iface/ethernet_tx.v +++ /dev/null @@ -1,40 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module ethernet_tx ( - input wire clk, - - input wire [15:0] data_i, - input wire rw_i, - input wire valid_i, - - output reg txen, - output reg [1:0] txd - ); - - parameter FPGA_MAC = 0; - parameter HOST_MAC = 0; - parameter ETHERTYPE = 0; - - reg [15:0] data_buf = 0; - - always @(posedge clk) - if(~rw_i && valid_i) data_buf <= data_i; - - mac_tx #( - .SRC_MAC(FPGA_MAC), - .DST_MAC(HOST_MAC), - .ETHERTYPE(ETHERTYPE), - .PAYLOAD_LENGTH_BYTES(5) - ) mtx ( - .clk(clk), - - .payload({24'd0, data_buf}), - .start(~rw_i && valid_i), - - .txen(txen), - .txd(txd)); - -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/src/manta/ether_iface/ethernet_tx_inst_tmpl.v b/src/manta/ether_iface/ethernet_tx_inst_tmpl.v deleted file mode 100644 index 6082910..0000000 --- a/src/manta/ether_iface/ethernet_tx_inst_tmpl.v +++ /dev/null @@ -1,13 +0,0 @@ -ethernet_tx #( - .FPGA_MAC(/* FPGA_MAC */), - .HOST_MAC(/* HOST_MAC */), - .ETHERTYPE(/* ETHERTYPE */) -) etx ( - .clk(clk), - - .data_i(), - .rw_i(), - .valid_i(), - - .txen(txen), - .txd(txd)); \ No newline at end of file diff --git a/src/manta/ether_iface/firewall.v b/src/manta/ether_iface/firewall.v deleted file mode 100644 index 611e310..0000000 --- a/src/manta/ether_iface/firewall.v +++ /dev/null @@ -1,80 +0,0 @@ -`default_nettype none -`timescale 1ns / 1ps - -`define FW_DESTSTART 0 -`define FW_DESTEND (`FW_DESTSTART + 48) - -`define FW_DATASTART (48 + 48) - -module firewall ( - input wire clk, - input wire axiiv, - input wire [1:0] axiid, - - output reg axiov, - output reg [1:0] axiod); - - parameter ETHERTYPE = 0; - parameter FPGA_MAC = 0; - - /* Buffers to hold our MAC address in the reverse order, - * to make comparison easier than it otherwise would be - */ - reg [0:47] me; - - /* A counter, to determine whether we should be comparing - * with a MAC address or stripping off data - */ - reg [31:0] counter; - - /* An internal set of flags to mark whether the currently - * traversing packet is valid, i.e we should forward data, - * or not. One of these flags tracks whether the destination - * MAC address matches _our_ (FW_ME) mac address, the other - * tracks whether the destination matches the broadcast - * (FW_BCAST) MAC. If either one of these is high once the - * destination MAC finishes rolling through, the packet - * is forwarded. - */ - reg matchme, matchbcast; - - assign me = FPGA_MAC; - - always @(posedge clk) begin: MATCH - if (counter == 32'b0) begin - matchme <= 1'b1; - matchbcast <= 1'b1; - end - - /* could overwrite the above, which is ideal if - * FW_DESTSTART == 0 (it is) and we have a mismatch - * out the gate - */ - if (counter >= `FW_DESTSTART && counter < `FW_DESTEND) begin - if (axiiv) begin - if (axiid != {me[counter], me[counter + 1]}) - matchme <= 1'b0; - if (axiid != 2'b11) - matchbcast <= 1'b0; - end - end - end - - always @(*) begin: AXIOUT - if (counter >= `FW_DATASTART && (matchme | matchbcast)) begin - axiod = axiid; - axiov = axiiv; - end else begin - axiod = 2'b00; - axiov = 1'b0; - end - end - - always @(posedge clk) begin: COUNTER - if (axiiv) counter <= counter + 2; - else counter <= 32'b0; - end - -endmodule - -`default_nettype wire diff --git a/src/manta/ether_iface/mac_rx.v b/src/manta/ether_iface/mac_rx.v deleted file mode 100644 index 46ff330..0000000 --- a/src/manta/ether_iface/mac_rx.v +++ /dev/null @@ -1,106 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module mac_rx ( - input wire clk, - - input wire crsdv, - input wire [1:0] rxd, - - output reg [55:0] payload, - output reg valid); - - parameter FPGA_MAC = 0; - parameter ETHERTYPE = 0; - - reg [1:0] ether_axiod; - reg ether_axiov; - - ether e ( - .clk(clk), - .rxd(rxd), - .crsdv(crsdv), - .axiov(ether_axiov), - .axiod(ether_axiod)); - - reg [1:0] bitorder_axiod; - reg bitorder_axiov; - - bitorder b ( - .clk(clk), - .axiiv(ether_axiov), - .axiid(ether_axiod), - .axiov(bitorder_axiov), - .axiod(bitorder_axiod)); - - reg [1:0] firewall_axiod; - reg firewall_axiov; - - firewall #( - .FPGA_MAC(FPGA_MAC), - .ETHERTYPE(ETHERTYPE) - ) f ( - .clk(clk), - .axiiv(bitorder_axiov), - .axiid(bitorder_axiod), - .axiov(firewall_axiov), - .axiod(firewall_axiod)); - - reg [55:0] aggregate_axiod; - reg aggregate_axiov; - - aggregate a ( - .clk(clk), - .axiiv(firewall_axiov), - .axiid(firewall_axiod), - .axiov(aggregate_axiov), - .axiod(aggregate_axiod)); - - reg cksum_done; - reg cksum_kill; - - cksum c ( - .clk(clk), - .axiiv(ether_axiov), - .axiid(ether_axiod), - .done(cksum_done), - .kill(cksum_kill)); - - // state machine - localparam IDLE = 0; - localparam WAIT_FOR_DATA = 1; - localparam WAIT_FOR_FCS = 2; - - reg [1:0] state = IDLE; - - initial valid = 0; - initial payload = 0; - - always @(posedge clk) begin - valid <= 0; - - if(state == IDLE) begin - if(crsdv) state <= WAIT_FOR_DATA; - end - - else if(state == WAIT_FOR_DATA) begin - if(aggregate_axiov) begin - state <= WAIT_FOR_FCS; - payload <= aggregate_axiod; - end - - // if aggregate never gives us data, - // go back to idle when the packet ends - else if(cksum_done) state <= IDLE; - end - - else if(state == WAIT_FOR_FCS) begin - if(cksum_done) begin - state <= IDLE; - valid <= ~cksum_kill; - end - end - end -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/src/manta/ether_iface/mac_tx.v b/src/manta/ether_iface/mac_tx.v deleted file mode 100644 index 812c078..0000000 --- a/src/manta/ether_iface/mac_tx.v +++ /dev/null @@ -1,242 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module mac_tx ( - input wire clk, - - input wire [(8 * PAYLOAD_LENGTH_BYTES)-1:0] payload, - input wire start, - - output reg txen, - output reg [1:0] txd); - - // packet magic numbers - localparam PREAMBLE = {7{8'b01010101}}; - localparam SFD = 8'b11010101; - parameter [47:0] SRC_MAC = 0; - parameter [47:0] DST_MAC = 0; - parameter [15:0] ETHERTYPE = 0; - parameter PAYLOAD_LENGTH_BYTES = 0; - - // all lengths are in units of dibits, hence all the mulitplies by four - localparam PREAMBLE_LEN = 7 * 4; - localparam SFD_LEN = 1 * 4; - localparam SRC_MAC_LEN = 6 * 4; - localparam DST_MAC_LEN = 6 * 4; - localparam ETHERTYPE_LEN = 2 * 4; - localparam PAYLOAD_LEN = PAYLOAD_LENGTH_BYTES * 4; - localparam ZERO_PAD_LEN = (46 * 4) - PAYLOAD_LEN + 4; // minimum payload size is 46 bytes - localparam FCS_LEN = 4 * 4; - localparam IPG_LEN = 96 / 2; - - reg [1:0] bitorder_axiid; - reg [1:0] bitorder_axiod; - reg bitorder_axiiv; - reg bitorder_axiov; - - bitorder bitorder ( - .clk(clk), - - .axiiv(bitorder_axiiv), - .axiid(bitorder_axiid), - - .axiov(bitorder_axiov), - .axiod(bitorder_axiod)); - - reg crc_rst = 1; - reg crc_axiiv = 0; - reg [31:0] crc_axiod; - - crc32 crc ( - .clk(clk), - .rst(crc_rst), - - .axiiv(crc_axiiv), - .axiid(bitorder_axiod), - - // TODO: remove axiov from crc32 module, it's always valid - .axiov(), - .axiod(crc_axiod)); - - - // state machine - reg [8:0] counter = 0; - reg [3:0] state = 0; - - localparam IDLE_STATE = 0; - localparam PREAMBLE_STATE = 1; - localparam SFD_STATE = 2; - localparam DST_MAC_STATE = 3; - localparam SRC_MAC_STATE = 4; - localparam ETHERTYPE_STATE = 5; - localparam PAYLOAD_STATE = 6; - localparam ZERO_PAD_STATE = 7; - localparam FCS_STATE = 8; - localparam IPG_STATE = 9; - - - // sequential logic manages the state machine - always @(posedge clk) begin - counter <= counter + 1; - crc_rst <= 0; - - if(state == IDLE_STATE) begin - counter <= 0; - crc_axiiv <= 0; - if(start) state <= PREAMBLE_STATE; - end - - else if(state == PREAMBLE_STATE) begin - if(counter == PREAMBLE_LEN - 1) begin - counter <= 0; - state <= SFD_STATE; - end - end - - else if(state == SFD_STATE) begin - if(counter == SFD_LEN - 1) begin - counter <= 0; - state <= DST_MAC_STATE; - end - end - - else if(state == DST_MAC_STATE) begin - // this is because the crc module lags behind the FSM, - // as it has to go through bitorder first - if(counter == 3) crc_axiiv <= 1; - - if(counter == DST_MAC_LEN - 1) begin - counter <= 0; - state <= SRC_MAC_STATE; - end - end - - else if(state == SRC_MAC_STATE) begin - if(counter == SRC_MAC_LEN - 1) begin - counter <= 0; - state <= ETHERTYPE_STATE; - end - end - - else if(state == ETHERTYPE_STATE) begin - if(counter == ETHERTYPE_LEN - 1) begin - counter <= 0; - state <= PAYLOAD_STATE; - end - end - - else if(state == PAYLOAD_STATE) begin - if(counter == PAYLOAD_LEN - 1) begin - counter <= 0; - state <= ZERO_PAD_STATE; - end - end - - else if(state == ZERO_PAD_STATE) begin - if(counter == ZERO_PAD_LEN - 1) begin - crc_axiiv <= 0; - counter <= 0; - state <= FCS_STATE; - end - end - - else if(state == FCS_STATE) begin - if(counter == FCS_LEN - 1) begin - counter <= 0; - state <= IPG_STATE; - end - end - - else if(state == IPG_STATE) begin - if(counter == IPG_LEN - 1) begin - crc_rst <= 1; - counter <= 0; - state <= IDLE_STATE; - end - end - end - - // combinational logic handles the pipeline - always @(*) begin - case (state) - IDLE_STATE: begin - bitorder_axiiv = 0; - bitorder_axiid = 0; - txen = 0; - txd = 0; - end - - PREAMBLE_STATE: begin - bitorder_axiiv = 1; - bitorder_axiid = PREAMBLE[2*(PREAMBLE_LEN-counter)-1-:2]; - txen = bitorder_axiov; - txd = bitorder_axiod; - end - - SFD_STATE: begin - bitorder_axiiv = 1; - bitorder_axiid = SFD[2*(SFD_LEN-counter)-1-:2]; - txen = bitorder_axiov; - txd = bitorder_axiod; - end - - DST_MAC_STATE: begin - bitorder_axiiv = 1; - bitorder_axiid = DST_MAC[2*(DST_MAC_LEN-counter)-1-:2]; - txen = bitorder_axiov; - txd = bitorder_axiod; - end - - SRC_MAC_STATE: begin - bitorder_axiiv = 1; - bitorder_axiid = SRC_MAC[2*(SRC_MAC_LEN-counter)-1-:2]; - txen = bitorder_axiov; - txd = bitorder_axiod; - end - - ETHERTYPE_STATE: begin - bitorder_axiiv = 1; - bitorder_axiid = ETHERTYPE[2*(ETHERTYPE_LEN-counter)-1-:2]; - txen = bitorder_axiov; - txd = bitorder_axiod; - end - - PAYLOAD_STATE: begin - bitorder_axiiv = 1; - bitorder_axiid = payload[2*(PAYLOAD_LEN-counter)-1-:2]; - txen = bitorder_axiov; - txd = bitorder_axiod; - end - - ZERO_PAD_STATE: begin - bitorder_axiiv = 1; - bitorder_axiid = 0; - txen = bitorder_axiov; - txd = bitorder_axiod; - end - - FCS_STATE: begin - bitorder_axiiv = 0; - bitorder_axiid = 0; - txen = 1; - txd = {crc_axiod[2*(FCS_LEN-counter)-2], crc_axiod[2*(FCS_LEN-counter)-1]}; - end - - IPG_STATE: begin - bitorder_axiiv = 0; - bitorder_axiid = 0; - txen = 0; - txd = 0; - end - - default: begin - bitorder_axiiv = 0; - bitorder_axiid = 0; - txen = 0; - txd = 0; - end - endcase - end -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/src/manta/io_core.py b/src/manta/io_core.py new file mode 100644 index 0000000..97d869f --- /dev/null +++ b/src/manta/io_core.py @@ -0,0 +1,260 @@ +from amaranth import * +from warnings import warn +from .utils import * +from math import ceil + + +class IOCore(Elaboratable): + """ + Contains the HDL to instantiate an IO core on a FPGA, and the functions to interact with it. For + more information on the core itself, check out the IO core documentation. + """ + + def __init__(self, config, base_addr, interface): + self.config = config + self.base_addr = base_addr + self.interface = interface + + self.check_config(self.config) + self.define_signals() + self.mmap, self.max_addr = self.assign_memory() + + def check_config(self, config): + # make sure ports are defined + if "inputs" not in config and "outputs" not in config: + raise ValueError("No input or output ports specified.") + + # check for unrecognized options + valid_options = ["type", "inputs", "outputs", "user_clock"] + for option in config: + if option not in valid_options: + warn(f"Ignoring unrecognized option '{option}' in IO core.'") + + # check that user_clock is a bool + if "user_clock" in config: + if not isinstance(config["user_clock"], bool): + raise ValueError("Option user_clock must be a boolean.") + + # check that inputs is only dicts of format name:width + if "inputs" in config: + for name, attrs in config["inputs"].items(): + if not isinstance(name, str): + raise ValueError( + f'Input probe "{name}" has invalid name, names must be strings.' + ) + + if not isinstance(attrs, int): + raise ValueError(f'Input probe "{name}" must have integer width.') + + if not attrs > 0: + raise ValueError(f'Input probe "{name}" must have positive width.') + + if "outputs" in config: + for name, attrs in config["outputs"].items(): + if not isinstance(name, str): + raise ValueError( + f'Output probe "{name}" has invalid name, names must be strings.' + ) + + if not isinstance(attrs, int) and not isinstance(attrs, dict): + raise ValueError(f'Unrecognized format for output probe "{name}".') + + if isinstance(attrs, int): + if not attrs > 0: + raise ValueError( + f'Output probe "{name}" must have positive width.' + ) + + if isinstance(attrs, dict): + # check that each output probe has only recognized options + valid_options = ["width", "initial_value"] + for option in attrs: + if option not in valid_options: + warn(f'Ignoring unrecognized option "{option}" in IO core.') + + # check that widths are appropriate + if "width" not in attrs: + raise ValueError(f"No width specified for output probe {name}.") + + if not isinstance(attrs["width"], int): + raise ValueError( + f'Output probe "{name}" must have integer width.' + ) + + if not attrs["width"] > 0: + raise ValueError( + f'Input probe "{name}" must have positive width.' + ) + + def define_signals(self): + # Bus Ports + self.addr_i = Signal(16) + self.data_i = Signal(16) + self.rw_i = Signal() + self.valid_i = Signal() + + self.addr_o = Signal(16) + self.data_o = Signal(16) + self.rw_o = Signal() + self.valid_o = Signal() + + # Input Probes (and buffers) + if "inputs" in self.config: + for name, width in self.config["inputs"].items(): + setattr(self, name, Signal(width, name=name)) + setattr(self, name + "_buf", Signal(width, name=name + "_buf")) + + # Output Probes (and buffers) + if "outputs" in self.config: + for name, attrs in self.config["outputs"].items(): + if isinstance(attrs, dict): + width = attrs["width"] + initial_value = attrs["initial_value"] + else: + width = attrs + initial_value = 0 + + setattr(self, name, Signal(width, name=name, reset=initial_value)) + setattr( + self, + name + "_buf", + Signal(width, name=name + "_buf", reset=initial_value), + ) + + # Strobe Register + self.strobe = Signal(reset=0) + + def assign_memory(self): + """ + the memory map is a dict that maps registers (in memory) to their locations (in memory) + as well as their Signals (from Amaranth). This looks like the following: + + { + strobe: + addrs: [0x0000] + signals: [self.strobe] + probe0_buf: + addrs: [0x0001] + signals: [self.probe0_buf] + probe1_buf: + addrs: [0x0002] + signals: [self.probe1_buf] + probe2_buf: + addrs: [0x0003] + signals: [self.probe2_buf] + probe3_buf: + addrs: [0x0004, 0x0005] + signals: [self.probe3_buf[0:15], self.probe3_buf[16:19]] + ... and so on + } + + """ + mmap = {} + + # Add strobe register first + mmap["strobe"] = dict(addrs=[self.base_addr], signals=[self.strobe]) + + # Add all input and output probes + all_probes = {} + if "inputs" in self.config: + all_probes = {**all_probes, **self.config["inputs"]} + + if "outputs" in self.config: + all_probes = {**all_probes, **self.config["outputs"]} + + for name, attrs in all_probes.items(): + # Handle output probes that might have initial value specified in addition to width + if isinstance(attrs, dict): + width = attrs["width"] + else: + width = attrs + + # Assign addresses + last_used_addr = list(mmap.values())[-1]["addrs"][-1] + addrs = [last_used_addr + 1 + i for i in range(ceil(width / 16))] + + # Slice signal into 16-bit chunks + signal = getattr(self, name + "_buf") + signals = [signal[16 * i : 16 * (i + 1)] for i in range(ceil(width / 16))] + + mmap[name + "_buf"] = {"addrs": addrs, "signals": signals} + + # Compute maximum address used by the core + max_addr = list(mmap.values())[-1]["addrs"][-1] + return mmap, max_addr + + def elaborate(self, platform): + m = Module() + + # Shuffle bus transactions along + m.d.sync += self.addr_o.eq(self.addr_i) + m.d.sync += self.data_o.eq(self.data_i) + m.d.sync += self.rw_o.eq(self.rw_i) + m.d.sync += self.valid_o.eq(self.valid_i) + + # Update buffers from probes + with m.If(self.strobe): + # Input buffers + if "inputs" in self.config: + for name in self.config["inputs"]: + input_probe = getattr(self, name) + input_probe_buf = getattr(self, name + "_buf") + m.d.sync += input_probe_buf.eq(input_probe) + + # Output buffers + if "outputs" in self.config: + for name in self.config["outputs"]: + output_probe = getattr(self, name) + output_probe_buf = getattr(self, name + "_buf") + m.d.sync += output_probe.eq(output_probe_buf) + + # Handle register reads and writes + with m.If((self.addr_i >= self.base_addr)): + with m.If((self.addr_o <= self.max_addr)): + for entry in self.mmap.values(): + for addr, signal in zip(entry["addrs"], entry["signals"]): + with m.If(self.rw_i): + with m.If(self.addr_i == addr): + m.d.sync += signal.eq(self.data_i) + + with m.Else(): + with m.If(self.addr_i == addr): + m.d.sync += self.data_o.eq(signal) + + return m + + def get_top_level_ports(self): + ports = [] + for name in self.config["inputs"].keys(): + ports.append(getattr(self, name)) + + for name in self.config["outputs"].keys(): + ports.append(getattr(self, name)) + + return ports + + def get_max_addr(self): + return self.max_addr + + def set_probe(self, probe_name, value): + # set value in buffer + addrs = self.mmap[probe_name + "_buf"]["addrs"] + datas = value_to_words(value, len(addrs)) + self.interface.write(addrs, datas) + + # pulse strobe register + strobe_addr = self.mmap["strobe"]["addrs"][0] + self.interface.write(strobe_addr, 0) + self.interface.write(strobe_addr, 1) + self.interface.write(strobe_addr, 0) + + def get_probe(self, probe_name): + # pulse strobe register + strobe_addr = self.mmap["strobe"]["addrs"][0] + self.interface.write(strobe_addr, 0) + self.interface.write(strobe_addr, 1) + self.interface.write(strobe_addr, 0) + + # get value from buffer + addrs = self.mmap[probe_name + "_buf"]["addrs"] + return words_to_value(self.interface.read(addrs)) diff --git a/src/manta/io_core/__init__.py b/src/manta/io_core/__init__.py deleted file mode 100644 index 8e33562..0000000 --- a/src/manta/io_core/__init__.py +++ /dev/null @@ -1,213 +0,0 @@ -from ..utils import * -from math import ceil - -class InputProbe: - def __init__(self, name, width, base_addr, strobe_addr, interface): - assert isinstance(width, int), f"Probe {name} must have integer width." - assert width > 0, f"Probe {name} must have positive width." - - self.name = name - self.width = width - self.strobe_addr = strobe_addr - self.interface = interface - - n_addrs = ceil(self.width / 16) - self.addrs = list(range(base_addr, base_addr + n_addrs)) - self.brackets = "" if self.width == 1 else f"[{self.width-1}:0] " - - def pulse_strobe_register(self): - # pulse the strobe register - self.interface.write(self.strobe_addr, 1) - self.interface.write(self.strobe_addr, 0) - strobe = self.interface.read(self.strobe_addr) - if strobe != 0: - raise ValueError("Unable to set strobe register to zero!") - - def get(self): - self.pulse_strobe_register() - return pack_16bit_words(self.interface.read(self.addrs)) - -class OutputProbe(InputProbe): - def __init__(self, name, width, base_addr, strobe_addr, interface, initial_value): - super().__init__(name, width, base_addr, strobe_addr, interface) - self.initial_value = initial_value - - def set(self, value): - # check that value is an integer - assert isinstance(value, int), "Value must be an integer." - - # check that value is within range for the width of the probe - if value > 0: - assert value <= (2**self.width) - 1, f"Unsigned value too large for probe of width {self.width}" - - elif value < 0: - assert abs(value) <= (2**(self.width-1))-1, f"Signed value too large for probe of width {self.width}" - - self.interface.write(self.addrs, unpack_16bit_words(value, len(self.addrs))) - self.pulse_strobe_register() - -class IOCore: - def __init__(self, config, name, base_addr, interface): - self.name = name - self.base_addr = base_addr - self.interface = interface - - # make sure we have ports defined - assert ('inputs' in config) or ('outputs' in config), "No input or output ports specified." - - # check for unrecognized options - for option in config: - if option not in ["type", "inputs", "outputs", "user_clock"]: - print(f"Warning: Ignoring unrecognized option '{option}' in IO core '{name}'") - - # add user clock - self.user_clock = False - if "user_clock" in config: - assert isinstance(config["user_clock"], bool), "Option user_clock must be a boolean." - self.user_clock = config["user_clock"] - - # add input probes to core - self.input_probes = [] - last_used_addr = self.base_addr # start at one since strobe register is at BASE_ADDR - if 'inputs' in config: - for name, width in config["inputs"].items(): - probe = InputProbe(name, width, last_used_addr + 1, self.base_addr, interface) - last_used_addr = probe.addrs[-1] - self.input_probes.append(probe) - - # add output probes to core - self.output_probes = [] - if 'outputs' in config: - for name, params in config["outputs"].items(): - # get width and initial value from config - if isinstance(params, int): - width = params - initial_value = 0 - - elif "width" in params and "initial_value" in params: - width = params["width"] - initial_value = params["initial_value"] - - else: - raise ValueError(f"Unable to determine probe width and initial value for {name}") - - # add probe to core - probe = OutputProbe(name, width, last_used_addr + 1, self.base_addr, interface, initial_value) - last_used_addr = probe.addrs[-1] - self.output_probes.append(probe) - - self.max_addr = last_used_addr - - # add friendly names to each probe - # (so users can do io_core.probe.set() and get() for instance) - for probe in self.input_probes + self.output_probes: - setattr(self, probe.name, probe) - - def hdl_top_level_ports(self): - ports = [] - - if self.user_clock: - ports.append(f"input wire {self.name}_user_clock") - - for probe in self.input_probes: - ports.append(f"input wire {probe.brackets}{probe.name}") - - for probe in self.output_probes: - ports.append(f"output reg {probe.brackets}{probe.name}") - - return ports - - def hdl_inst(self): - inst = VerilogManipulator("io_core/io_core_inst_tmpl.v") - inst.sub(self.name, "/* MODULE_NAME */") - inst.sub(self.name + "_inst", "/* INST_NAME */") - - # tie user_clock to bus_clk if external clock is not being used - if not self.user_clock: - inst.sub("clk", "/* USER_CLK */") - - else: - inst.sub(f"{self.name}_user_clk", "/* USER_CLK */") - - probes = {p.name:p.width for p in self.input_probes + self.output_probes} - inst_ports = inst.net_conn(probes, trailing_comma=True) - inst.sub(inst_ports, "/* INST_PORTS */") - - return inst.get_hdl() - - def hdl_def(self): - io_core = VerilogManipulator("io_core/io_core_def_tmpl.v") - io_core.sub(self.name, "/* MODULE_NAME */") - io_core.sub(self.max_addr, "/* MAX_ADDR */") - - # generate declaration - top_level_ports = ',\n'.join(self.hdl_top_level_ports()) - top_level_ports += ',' - io_core.sub(top_level_ports, "/* TOP_LEVEL_PORTS */") - - # generate memory handling - io_core.sub(self.gen_read_case_statement_body(), "/* READ_CASE_STATEMENT_BODY */") - io_core.sub(self.gen_write_case_statement_body(), "/* WRITE_CASE_STATEMENT_BODY */") - - # generate input and output probe buffers with initial values - io_core.sub(self.gen_input_probe_bufs(), "/* INPUT_PROBE_BUFFERS */") - io_core.sub(self.gen_output_probe_bufs(), "/* OUTPUT_PROBE_BUFFERS */") - io_core.sub(self.gen_output_probe_initial_values(), "/* OUTPUT_PROBE_INITIAL_VALUES */") - io_core.sub(self.gen_update_input_buffers(), "/* UPDATE_INPUT_BUFFERS */") - io_core.sub(self.gen_update_output_buffers(), "/* UPDATE_OUTPUT_BUFFERS */") - - return io_core.get_hdl() - - def gen_read_case_statement_body(self): - lines = [] - for probe in self.input_probes + self.output_probes: - if probe.width <= 16: - lines.append(f"BASE_ADDR + {probe.addrs[0]}: data_o <= {probe.name}_buf;") - - # assign 16-bit slices of each probe's buffer to each address taken by the probe - else: - for i in range(ceil(probe.width/16)): - top = ((i + 1) * 16) - 1 - btm = i * 16 - if top > probe.width - 1: - top = probe.width - 1 - lines.append(f"BASE_ADDR + {probe.addrs[i]}: data_o <= {probe.name}_buf[{top}:{btm}];") - - return '\n'.join(lines) - - def gen_write_case_statement_body(self): - lines = [] - for probe in self.output_probes: - if probe.width <= 16: - lines.append(f"BASE_ADDR + {probe.addrs[0]}: {probe.name}_buf <= data_i;") - - else: - for i in range(ceil(probe.width/16)): - top = ((i + 1) * 16) - 1 - btm = i * 16 - if top > probe.width - 1: - top = probe.width - 1 - - lines.append(f"BASE_ADDR + {probe.addrs[i]}: {probe.name}_buf[{top}:{btm}] <= data_i;") - - return '\n'.join(lines) - - def gen_input_probe_bufs(self): - lines = [f"reg {p.brackets}{p.name}_buf = 0;" for p in self.input_probes] - return '\n'.join(lines) - - def gen_output_probe_bufs(self): - lines = [f"reg {p.brackets}{p.name}_buf = {p.initial_value};" for p in self.output_probes] - return '\n'.join(lines) - - def gen_output_probe_initial_values(self): - lines = [f"{p.name} = {p.initial_value};" for p in self.output_probes] - return '\n'.join(lines) - - def gen_update_input_buffers(self): - lines = [f"{p.name}_buf <= {p.name};" for p in self.input_probes] - return '\n'.join(lines) - - def gen_update_output_buffers(self): - lines = [f"{p.name} <= {p.name}_buf;" for p in self.output_probes] - return '\n'.join(lines) diff --git a/src/manta/io_core/io_core_def_tmpl.v b/src/manta/io_core/io_core_def_tmpl.v deleted file mode 100644 index 5803486..0000000 --- a/src/manta/io_core/io_core_def_tmpl.v +++ /dev/null @@ -1,77 +0,0 @@ -module /* MODULE_NAME */ ( - input wire bus_clk, - input wire user_clk, - - // ports - /* TOP_LEVEL_PORTS */ - - // input port - input wire [15:0] addr_i, - input wire [15:0] data_i, - input wire rw_i, - input wire valid_i, - - // output port - output reg [15:0] addr_o, - output reg [15:0] data_o, - output reg rw_o, - output reg valid_o - ); - - parameter BASE_ADDR = 0; - - reg strobe = 0; - - // input probe buffers - /* INPUT_PROBE_BUFFERS */ - - // output probe buffers - /* OUTPUT_PROBE_BUFFERS */ - - // output probe initial values - initial begin - /* OUTPUT_PROBE_INITIAL_VALUES */ - end - - // synchronize buffers and probes on strobe - always @(posedge user_clk) begin - if(strobe) begin - // update input buffers from input probes - /* UPDATE_INPUT_BUFFERS */ - - // update output buffers from output probes - /* UPDATE_OUTPUT_BUFFERS */ - end - end - - // handle bus operations - always @(posedge bus_clk) begin - addr_o <= addr_i; - data_o <= data_i; - rw_o <= rw_i; - valid_o <= valid_i; - - // check if address is valid - if( (valid_i) && (addr_i >= BASE_ADDR) && (addr_i <= BASE_ADDR + /* MAX_ADDR */)) begin - - // reads - if(!rw_i) begin - case (addr_i) - BASE_ADDR + 0: data_o <= strobe; - - /* READ_CASE_STATEMENT_BODY */ - endcase - end - - // writes - else begin - case (addr_i) - BASE_ADDR + 0: strobe <= data_i; - - /* WRITE_CASE_STATEMENT_BODY */ - endcase - end - end - end - -endmodule \ No newline at end of file diff --git a/src/manta/io_core/io_core_inst_tmpl.v b/src/manta/io_core/io_core_inst_tmpl.v deleted file mode 100644 index 4568ef0..0000000 --- a/src/manta/io_core/io_core_inst_tmpl.v +++ /dev/null @@ -1,18 +0,0 @@ -/* MODULE_NAME */ /* INST_NAME */ ( - .bus_clk(clk), - .user_clk(/* USER_CLK */), - - // ports - /* INST_PORTS */ - - // input port - .addr_i(), - .data_i(), - .rw_i(), - .valid_i(), - - // output port - .addr_o(), - .data_o(), - .rw_o(), - .valid_o()); \ No newline at end of file diff --git a/src/manta/la_core/__init__.py b/src/manta/la_core/__init__.py deleted file mode 100644 index a33c307..0000000 --- a/src/manta/la_core/__init__.py +++ /dev/null @@ -1,463 +0,0 @@ -from ..utils import * - -from datetime import datetime -from pkg_resources import get_distribution -import math -import os - -class LogicAnalyzerCore: - def __init__(self, config, name, base_addr, interface): - self.name = name - self.base_addr = base_addr - self.interface = interface - - # Warn if unrecognized options have been given - valid_options = ["type", "sample_depth", "probes", "triggers", "trigger_loc", "trigger_mode"] - for option in config: - if option not in valid_options: - print(f"Warning: Ignoring unrecognized option '{option}' in Logic Analyzer core '{self.name}'") - - # Load sample depth - assert "sample_depth" in config, \ - "Sample depth not found for Logic Analyzer core {self.name}." - - assert isinstance(config["sample_depth"], int), \ - "Sample depth must be an integer." - - self.sample_depth = config["sample_depth"] - - # Add probes - assert "probes" in config, "No probe definitions found." - assert len(config["probes"]) > 0, "Must specify at least one probe." - - for probe_name, probe_width in config["probes"].items(): - assert probe_width > 0, f"Probe {probe_name} is of invalid width - it must be of at least width one." - - self.probes = config["probes"] - - # Add triggers - assert "triggers" in config, "No triggers found." - assert len(config["triggers"]) > 0, "Must specify at least one trigger." - self.triggers = config["triggers"] - - # Add trigger location - self.trigger_loc = self.sample_depth // 2 - if "trigger_loc" in config: - assert isinstance(config["trigger_loc"], int), \ - "Trigger location must be an integer." - - assert config["trigger_loc"] >= 0, \ - "Trigger location cannot be negative." - - assert config["trigger_loc"] <= self.sample_depth, \ - "Trigger location cannot exceed sample depth." - - self.trigger_loc = config["trigger_loc"] - - # Add trigger mode - self.SINGLE_SHOT = 0 - self.INCREMENTAL = 1 - self.IMMEDIATE = 2 - - self.trigger_mode = self.SINGLE_SHOT - if "trigger_mode" in config: - assert config["trigger_mode"] in ["single_shot", "incremental", "immediate"], \ - "Unrecognized trigger mode provided." - - if config["trigger_mode"] == "single_shot": - self.trigger_mode = self.SINGLE_SHOT - - elif config["trigger_mode"] == "incremental": - self.trigger_mode = self.INCREMENTAL - - elif config["trigger_mode"] == "immediate": - self.trigger_mode = self.IMMEDIATE - - # compute base addresses - self.fsm_base_addr = self.base_addr - self.trigger_block_base_addr = self.fsm_base_addr + 7 - - self.total_probe_width = sum(self.probes.values()) - self.n_brams = math.ceil(self.total_probe_width / 16) - self.block_memory_base_addr = self.trigger_block_base_addr + (2*len(self.probes)) - self.max_addr = self.block_memory_base_addr + (self.n_brams * self.sample_depth) - - # build out self register map: - # these are also defined in logic_analyzer_fsm_registers.v, and should match - self.state_reg_addr = self.base_addr - self.trigger_mode_reg_addr = self.base_addr + 1 - self.trigger_loc_reg_addr = self.base_addr + 2 - self.request_start_reg_addr = self.base_addr + 3 - self.request_stop_reg_addr = self.base_addr + 4 - self.read_pointer_reg_addr = self.base_addr + 5 - self.write_pointer_reg_addr = self.base_addr + 6 - - self.IDLE = 0 - self.MOVE_TO_POSITION = 1 - self.IN_POSITION = 2 - self.CAPTURING = 3 - self.CAPTURED = 4 - - def hdl_inst(self): - la_inst = VerilogManipulator("la_core/logic_analyzer_inst_tmpl.v") - - # add module name to instantiation - la_inst.sub(self.name, "/* INST_NAME */") - - # add net connections to instantiation - conns = la_inst.net_conn(self.probes, trailing_comma=True) - la_inst.sub(conns, "/* NET_CONNS */") - return la_inst.get_hdl() - - def gen_trigger_block_def(self): - trigger_block = VerilogManipulator("la_core/trigger_block_def_tmpl.v") - - # add probe ports to module declaration - # these ports belong to the logic analyzer, but - # need to be included in the trigger_block module declaration - probe_ports = trigger_block.net_dec(self.probes, "input wire", trailing_comma=True) - trigger_block.sub(probe_ports, "/* PROBE_PORTS */") - - - # add trigger cores to module definition - # these are instances of the trigger module, of which one gets wired - # into each probe - trigger_module_insts = [] - for name, width in self.probes.items(): - trig_inst = VerilogManipulator("la_core/trigger_block_inst_tmpl.v") - trig_inst.sub(width, "/* INPUT_WIDTH */") - trig_inst.sub(f"{name}_trigger", "/* NAME */") - - trig_inst.sub(f"reg [3:0] {name}_op = 0;", "/* OP_DEC */") - trig_inst.sub(f"reg {name}_trig;", "/* TRIG_DEC */") - - if width == 1: - trig_inst.sub(f"reg {name}_arg = 0;", "/* ARG_DEC */") - - else: - trig_inst.sub(f"reg [{width-1}:0] {name}_arg = 0;", "/* ARG_DEC */") - - trig_inst.sub(name, "/* PROBE */") - trig_inst.sub(f"{name}_op", "/* OP */") - trig_inst.sub(f"{name}_arg", "/* ARG */") - trig_inst.sub(f"{name}_trig", "/* TRIG */") - - trigger_module_insts.append(trig_inst.get_hdl()) - - trigger_module_insts = "\n".join(trigger_module_insts) - trigger_block.sub(trigger_module_insts, "/* TRIGGER_MODULE_INSTS */") - - # add combined individual triggers - cit = [f"{name}_trig" for name in self.probes] - cit = " || ".join(cit) - cit = f"assign trig = {cit};" - trigger_block.sub(cit, " /* COMBINE_INDIV_TRIGGERS */") - - # add read and write block case statement bodies - rcsb = "" # read case statement body - wcsb = "" # write case statement body - addr = 0 - for i, name in enumerate(self.probes): - addr = 2 * i - rcsb += f"BASE_ADDR + {addr}: data_o <= {name}_op;\n" - wcsb += f"BASE_ADDR + {addr}: {name}_op <= data_i;\n" - - addr = (2 * i) + 1 - rcsb += f"BASE_ADDR + {addr}: data_o <= {name}_arg;\n" - wcsb += f"BASE_ADDR + {addr}: {name}_arg <= data_i;\n" - - rcsb = rcsb.strip() - wcsb = wcsb.strip() - - trigger_block.sub(rcsb, "/* READ_CASE_STATEMENT_BODY */") - trigger_block.sub(wcsb, "/* WRITE_CASE_STATEMENT_BODY */") - trigger_block.sub(self.trigger_block_base_addr + addr + 1, "/* MAX_ADDR */") - - return trigger_block.get_hdl() - - def gen_logic_analyzer_def(self): - la = VerilogManipulator("la_core/logic_analyzer_def_tmpl.v") - - # add top level probe ports to module declaration - ports = la.net_dec(self.probes, "input wire", trailing_comma=True) - la.sub(ports, "/* TOP_LEVEL_PROBE_PORTS */") - - # assign base addresses to the FSM, trigger block, and sample mem - la.sub(self.fsm_base_addr, "/* FSM_BASE_ADDR */") - la.sub(self.trigger_block_base_addr, "/* TRIGGER_BLOCK_BASE_ADDR */") - la.sub(self.block_memory_base_addr, "/* BLOCK_MEMORY_BASE_ADDR */") - - # set sample depth - la.sub(self.sample_depth, "/* SAMPLE_DEPTH */") - - # set probe ports for the trigger block and sample mem - probe_ports = la.net_conn(self.probes, trailing_comma=True) - la.sub(probe_ports, "/* TRIGGER_BLOCK_PROBE_PORTS */") - - la.sub(self.total_probe_width, "/* TOTAL_PROBE_WIDTH */") - - # concatenate the probes together to make one big register, - # but do so such that the first probe in the config file - # is at the least-significant position in that big register. - # - # this makes part-selecting out from the memory easier to - # implement in python, and because verilog and python conventions - # are different, we would have had to reverse it somwehere anyway - probes_concat = list(self.probes.keys())[::-1] - probes_concat = '{' + ', '.join(probes_concat) + '}' - la.sub(probes_concat, "/* PROBES_CONCAT */") - - return la.get_hdl() - - def hdl_def(self): - # Return an autogenerated verilog module definition for the core. - # load source files - hdl = self.gen_logic_analyzer_def() + "\n" - hdl += VerilogManipulator("la_core/logic_analyzer_controller.v").get_hdl() + "\n" - hdl += VerilogManipulator("la_core/logic_analyzer_fsm_registers.v").get_hdl() + "\n" - hdl += VerilogManipulator("block_mem_core/block_memory.v").get_hdl() + "\n" - hdl += VerilogManipulator("block_mem_core/dual_port_bram.v").get_hdl() + "\n" - hdl += self.gen_trigger_block_def() + "\n" - hdl += VerilogManipulator("la_core/trigger.v").get_hdl() + "\n" - - return hdl - - def hdl_top_level_ports(self): - # the probes that we want as ports on the top-level manta module - ports = [] - for name, width in self.probes.items(): - if width == 1: - ports.append(f"input wire {name}") - - else: - ports.append(f"input wire [{width-1}:0] {name}") - return ports - #return VerilogManipulator().net_dec(self.probes, "input wire") - - def set_trigger_conditions(self): - - operations = { - "DISABLE" : 0, - "RISING" : 1, - "FALLING" : 2, - "CHANGING" : 3, - "GT" : 4, - "LT" : 5, - "GEQ" : 6, - "LEQ" : 7, - "EQ" : 8, - "NEQ" : 9 - } - - ops_with_no_args = ["DISABLE", "RISING" , "FALLING", "CHANGING"] - - # reset all the other triggers - for addr in range(self.trigger_block_base_addr, self.block_memory_base_addr): - self.interface.write(addr, 0) - - for trigger in self.triggers: - # determine if the trigger is good - - # most triggers will have 3 parts - the trigger, the operation, and the argument - # this is true unless the argument is RISING, FALLING, or CHANGING - - statement = trigger.split(' ') - if len(statement) == 2: - assert statement[1] in ops_with_no_args, "Invalid operation in trigger statement." - probe_name, op = statement - - op_register = 2*(list(self.probes.keys()).index(probe_name)) + self.trigger_block_base_addr - - self.interface.write(op_register, operations[op]) - - else: - assert len(statement) == 3, "Missing information in trigger statement." - probe_name, op, arg = statement - - op_register = 2*(list(self.probes.keys()).index(probe_name)) + self.trigger_block_base_addr - arg_register = op_register + 1 - - self.interface.write(op_register, operations[op]) - self.interface.write(arg_register, int(arg)) - - - - # functions for actually using the core: - def capture(self): - # Check state - if it's in anything other than IDLE, - # request to stop the existing capture - - print(" -> Resetting core...") - state = self.interface.read(self.state_reg_addr) - if state != self.IDLE: - self.interface.write(self.request_stop_reg_addr, 0) - self.interface.write(self.request_stop_reg_addr, 1) - self.interface.write(self.request_stop_reg_addr, 0) - - state = self.interface.read(self.state_reg_addr) - assert state == self.IDLE, "Logic analyzer did not reset to correct state when requested to." - - # Configure trigger conditions - print(" -> Set trigger conditions...") - self.set_trigger_conditions() - - # Configure the trigger_mode - print(" -> Setting trigger mode") - self.interface.write(self.trigger_mode_reg_addr, self.trigger_mode) - - # Configure the trigger_loc - print(" -> Setting trigger location...") - self.interface.write(self.trigger_loc_reg_addr, self.trigger_loc) - - # Start the capture by pulsing request_start - print(" -> Starting capture...") - self.interface.write(self.request_start_reg_addr, 1) - self.interface.write(self.request_start_reg_addr, 0) - - # Wait for core to finish capturing data - print(" -> Waiting for capture to complete...") - state = self.interface.read(self.state_reg_addr) - while(state != self.CAPTURED): - state = self.interface.read(self.state_reg_addr) - - # Read out contents from memory - print(" -> Reading sample memory contents...") - addrs = list(range(self.block_memory_base_addr, self.max_addr)) - block_mem_contents = self.interface.read(addrs) - - # Revolve BRAM contents around so the data pointed to by the read_pointer - # is at the beginning - print(" -> Reading read_pointer and revolving memory...") - read_pointer = self.interface.read(self.read_pointer_reg_addr) - - # when the total probe width is >16 bits and multiple BRAMs are used, - # then a single sample is stored across multiple locations in memory, - # so we must combine the data from n_brams addresses to get the value - # of the sample at that time - - # convert the sample number at read_pointer to memory address - read_address = self.n_brams * read_pointer - sample_mem = block_mem_contents[read_address:] + block_mem_contents[:read_address] - - # split sample memory into chunks of size n_brams - chunks = [sample_mem[i: i + self.n_brams] for i in range(0, len(sample_mem), self.n_brams)] - - # concat them in little-endian order (ie, chunk[0] is LSB) - concat = lambda x: int( ''.join([f'{i:016b}' for i in x[::-1]]), 2) - return [concat(c) for c in chunks] - - - def export_vcd(self, capture_data, path): - from vcd import VCDWriter - vcd_file = open(path, "w") - - # Use the same datetime format that iVerilog uses - timestamp = datetime.now().strftime("%a %b %w %H:%M:%S %Y") - - with VCDWriter(vcd_file, '10 ns', timestamp, "manta") as writer: - - # each probe has a name, width, and writer associated with it - signals = [] - for name, width in self.probes.items(): - signal = { - "name" : name, - "width" : width, - "data" : self.part_select_capture_data(capture_data, name), - "var": writer.register_var("manta", name, "wire", size=width) - } - signals.append(signal) - - clock = writer.register_var("manta", "clk", "wire", size=1) - trigger = writer.register_var("manta", "trigger", "wire", size=1) - - # add the data to each probe in the vcd file - for timestamp in range(0, 2*len(capture_data)): - - # run the clock - writer.change(clock, timestamp, timestamp % 2 == 0) - - # set the trigger - triggered = (timestamp // 2) >= self.trigger_loc - writer.change(trigger, timestamp, triggered) - - # add other signals - for signal in signals: - var = signal["var"] - sample = signal["data"][timestamp // 2] - - writer.change(var, timestamp, sample) - - vcd_file.close() - - def export_mem(self, capture_data, path): - with open(path, "w") as f: - # a wee bit of cursed string formatting, but just - # outputs each sample as binary, padded to a fixed length - w = self.total_probe_width - f.writelines([f'{s:0{w}b}\n' for s in capture_data]) - - def export_playback_module(self, path): - playback = VerilogManipulator("la_core/logic_analyzer_playback_tmpl.v") - - module_name = f"{self.name}_playback" - playback.sub(module_name, "/* MODULE_NAME */") - - version = "v" + get_distribution('mantaray').version - playback.sub(version, "/* VERSION */") - - timestamp = datetime.now().strftime("%d %b %Y at %H:%M:%S") - playback.sub(timestamp, "/* TIMESTAMP */") - - user = os.environ.get("USER", os.environ.get("USERNAME")) - playback.sub(user, "/* USER */") - - ports = [f".{name}({name})" for name in self.probes.keys()] - ports = ",\n".join(ports) - playback.sub(ports, "/* PORTS */") - - playback.sub(self.sample_depth, "/* SAMPLE_DEPTH */") - playback.sub(self.total_probe_width, "/* TOTAL_PROBE_WIDTH */") - - # see the note in generate_logic_analyzer_def about why we do this - probes_concat = list(self.probes.keys())[::-1] - probes_concat = '{' + ', '.join(probes_concat) + '}' - playback.sub(probes_concat, "/* PROBES_CONCAT */") - - - probe_dec = playback.net_dec(self.probes, "output reg") - playback.sub(probe_dec, "/* PROBE_DEC */") - - with open(path, "w") as f: - f.write(playback.get_hdl()) - - - def part_select_capture_data(self, capture_data, probe_name): - """Given the name of the probe, part-select the appropriate bits of capture data, - and return as an integer. Accepts capture_data as an integer or a list of integers.""" - - # sum up the widths of the probes below this one - lower = 0 - for name, width in self.probes.items(): - if name == probe_name: - break - - lower += width - - upper = lower + (self.probes[probe_name] - 1) - - # define the part select - mask = 2 ** (upper - lower + 1) - 1 - part_select = lambda x: (x >> lower) & mask - - # apply the part_select function depending on type - if isinstance(capture_data, int): - return part_select(capture_data) - - elif isinstance(capture_data, list): - for i in capture_data: - assert isinstance(i, int), "Can only part select on integers and list of integers." - - return [part_select(sample) for sample in capture_data] - - else: - raise ValueError("Can only part select on integers and lists of integers.") diff --git a/src/manta/la_core/logic_analyzer_controller.v b/src/manta/la_core/logic_analyzer_controller.v deleted file mode 100644 index 50c90bf..0000000 --- a/src/manta/la_core/logic_analyzer_controller.v +++ /dev/null @@ -1,92 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module logic_analyzer_controller ( - input wire clk, - - // from register file - output reg [3:0] state, - input wire [15:0] trigger_loc, - input wire [1:0] trigger_mode, - input wire request_start, - input wire request_stop, - output reg [ADDR_WIDTH-1:0] read_pointer, - output reg [ADDR_WIDTH-1:0] write_pointer, - - // from trigger block - input wire trig, - - // block memory user port - output reg [ADDR_WIDTH-1:0] bram_addr, - output reg bram_we - ); - - assign bram_addr = write_pointer; - - parameter SAMPLE_DEPTH= 0; - localparam ADDR_WIDTH = $clog2(SAMPLE_DEPTH); - - /* ----- FIFO ----- */ - initial read_pointer = 0; - initial write_pointer = 0; - - /* ----- FSM ----- */ - localparam IDLE = 0; - localparam MOVE_TO_POSITION = 1; - localparam IN_POSITION = 2; - localparam CAPTURING = 3; - localparam CAPTURED = 4; - - initial state = IDLE; - - // rising edge detection for start/stop requests - reg prev_request_start; - always @(posedge clk) prev_request_start <= request_start; - - reg prev_request_stop; - always @(posedge clk) prev_request_stop <= request_stop; - - always @(posedge clk) begin - // don't do anything to the FIFO unless told to - - if(state == IDLE) begin - write_pointer <= 0; - read_pointer <= 0; - bram_we <= 0; - - if(request_start && ~prev_request_start) begin - state <= MOVE_TO_POSITION; - end - end - - else if(state == MOVE_TO_POSITION) begin - write_pointer <= write_pointer + 1; - bram_we <= 1; - - if(write_pointer == trigger_loc) begin - if(trig) state <= CAPTURING; - else state <= IN_POSITION; - end - end - - else if(state == IN_POSITION) begin - write_pointer <= (write_pointer + 1) % SAMPLE_DEPTH; - read_pointer <= (read_pointer + 1) % SAMPLE_DEPTH; - bram_we <= 1; - if(trig) state <= CAPTURING; - end - - else if(state == CAPTURING) begin - if(write_pointer == read_pointer) begin - bram_we <= 0; - state <= CAPTURED; - end - - else write_pointer <= (write_pointer + 1) % SAMPLE_DEPTH; - end - - if(request_stop && ~prev_request_stop) state <= IDLE; - end -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/src/manta/la_core/logic_analyzer_def_tmpl.v b/src/manta/la_core/logic_analyzer_def_tmpl.v deleted file mode 100644 index cbb0ef9..0000000 --- a/src/manta/la_core/logic_analyzer_def_tmpl.v +++ /dev/null @@ -1,142 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module logic_analyzer ( - input wire clk, - - // probes - /* TOP_LEVEL_PROBE_PORTS */ - - // input port - input wire [15:0] addr_i, - input wire [15:0] data_i, - input wire rw_i, - input wire valid_i, - - // output port - output reg [15:0] addr_o, - output reg [15:0] data_o, - output reg rw_o, - output reg valid_o - ); - localparam SAMPLE_DEPTH = /* SAMPLE_DEPTH */; - localparam ADDR_WIDTH = $clog2(SAMPLE_DEPTH); - - reg [3:0] state; - reg [15:0] trigger_loc; - reg [1:0] trigger_mode; - reg request_start; - reg request_stop; - reg [ADDR_WIDTH-1:0] read_pointer; - reg [ADDR_WIDTH-1:0] write_pointer; - - reg trig; - - reg [ADDR_WIDTH-1:0] bram_addr; - reg bram_we; - - localparam TOTAL_PROBE_WIDTH = /* TOTAL_PROBE_WIDTH */; - reg [TOTAL_PROBE_WIDTH-1:0] probes_concat; - assign probes_concat = /* PROBES_CONCAT */; - - logic_analyzer_controller #(.SAMPLE_DEPTH(SAMPLE_DEPTH)) la_controller ( - .clk(clk), - - // from register file - .state(state), - .trigger_loc(trigger_loc), - .trigger_mode(trigger_mode), - .request_start(request_start), - .request_stop(request_stop), - .read_pointer(read_pointer), - .write_pointer(write_pointer), - - // from trigger block - .trig(trig), - - // from block memory user port - .bram_addr(bram_addr), - .bram_we(bram_we) - ); - - logic_analyzer_fsm_registers #( - .BASE_ADDR(/* FSM_BASE_ADDR */), - .SAMPLE_DEPTH(SAMPLE_DEPTH) - ) fsm_registers ( - .clk(clk), - - .addr_i(addr_i), - .data_i(data_i), - .rw_i(rw_i), - .valid_i(valid_i), - - .addr_o(fsm_reg_trig_blk_addr), - .data_o(fsm_reg_trig_blk_data), - .rw_o(fsm_reg_trig_blk_rw), - .valid_o(fsm_reg_trig_blk_valid), - - .state(state), - .trigger_loc(trigger_loc), - .trigger_mode(trigger_mode), - .request_start(request_start), - .request_stop(request_stop), - .read_pointer(read_pointer), - .write_pointer(write_pointer)); - - reg [15:0] fsm_reg_trig_blk_addr; - reg [15:0] fsm_reg_trig_blk_data; - reg fsm_reg_trig_blk_rw; - reg fsm_reg_trig_blk_valid; - - // trigger block - trigger_block #(.BASE_ADDR(/* TRIGGER_BLOCK_BASE_ADDR */)) trig_blk ( - .clk(clk), - - /* TRIGGER_BLOCK_PROBE_PORTS */ - - .trig(trig), - - .addr_i(fsm_reg_trig_blk_addr), - .data_i(fsm_reg_trig_blk_data), - .rw_i(fsm_reg_trig_blk_rw), - .valid_i(fsm_reg_trig_blk_valid), - - .addr_o(trig_blk_block_mem_addr), - .data_o(trig_blk_block_mem_data), - .rw_o(trig_blk_block_mem_rw), - .valid_o(trig_blk_block_mem_valid)); - - reg [15:0] trig_blk_block_mem_addr; - reg [15:0] trig_blk_block_mem_data; - reg trig_blk_block_mem_rw; - reg trig_blk_block_mem_valid; - - // sample memory - block_memory #( - .BASE_ADDR(/* BLOCK_MEMORY_BASE_ADDR */), - .WIDTH(TOTAL_PROBE_WIDTH), - .DEPTH(SAMPLE_DEPTH) - ) block_mem ( - .clk(clk), - - // input port - .addr_i(trig_blk_block_mem_addr), - .data_i(trig_blk_block_mem_data), - .rw_i(trig_blk_block_mem_rw), - .valid_i(trig_blk_block_mem_valid), - - // output port - .addr_o(addr_o), - .data_o(data_o), - .rw_o(rw_o), - .valid_o(valid_o), - - // BRAM itself - .user_clk(clk), - .user_addr(bram_addr), - .user_din(probes_concat), - .user_dout(), - .user_we(bram_we)); -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/src/manta/la_core/logic_analyzer_fsm_registers.v b/src/manta/la_core/logic_analyzer_fsm_registers.v deleted file mode 100644 index d35bcfb..0000000 --- a/src/manta/la_core/logic_analyzer_fsm_registers.v +++ /dev/null @@ -1,75 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module logic_analyzer_fsm_registers( - input wire clk, - - // input port - input wire [15:0] addr_i, - input wire [15:0] data_i, - input wire rw_i, - input wire valid_i, - - // output port - output reg [15:0] addr_o, - output reg [15:0] data_o, - output reg rw_o, - output reg valid_o, - - // registers - input wire [3:0] state, - output reg [15:0] trigger_loc, - output reg [1:0] trigger_mode, - output reg request_start, - output reg request_stop, - input wire [ADDR_WIDTH-1:0] read_pointer, - input wire [ADDR_WIDTH-1:0] write_pointer - ); - - initial trigger_loc = 0; - initial trigger_mode = 0; - initial request_start = 0; - initial request_stop = 0; - - parameter BASE_ADDR = 0; - localparam MAX_ADDR = BASE_ADDR + 5; - parameter SAMPLE_DEPTH = 0; - parameter ADDR_WIDTH = $clog2(SAMPLE_DEPTH); - - always @(posedge clk) begin - addr_o <= addr_i; - data_o <= data_i; - rw_o <= rw_i; - valid_o <= valid_i; - - // check if address is valid - if( (valid_i) && (addr_i >= BASE_ADDR) && (addr_i <= MAX_ADDR)) begin - - // reads - if(!rw_i) begin - case (addr_i) - BASE_ADDR + 0: data_o <= state; - BASE_ADDR + 1: data_o <= trigger_mode; - BASE_ADDR + 2: data_o <= trigger_loc; - BASE_ADDR + 3: data_o <= request_start; - BASE_ADDR + 4: data_o <= request_stop; - BASE_ADDR + 5: data_o <= read_pointer; - BASE_ADDR + 6: data_o <= write_pointer; - endcase - end - - // writes - else begin - case (addr_i) - BASE_ADDR + 1: trigger_mode <= data_i; - BASE_ADDR + 2: trigger_loc <= data_i; - BASE_ADDR + 3: request_start <= data_i; - BASE_ADDR + 4: request_stop <= data_i; - endcase - end - end - end - - -endmodule -`default_nettype wire \ No newline at end of file diff --git a/src/manta/la_core/logic_analyzer_inst_tmpl.v b/src/manta/la_core/logic_analyzer_inst_tmpl.v deleted file mode 100644 index eebb872..0000000 --- a/src/manta/la_core/logic_analyzer_inst_tmpl.v +++ /dev/null @@ -1,14 +0,0 @@ -logic_analyzer /* INST_NAME */ ( - .clk(clk), - - .addr_i(), - .data_i(), - .rw_i(), - .valid_i(), - - /* NET_CONNS */ - - .addr_o(), - .data_o(), - .rw_o(), - .valid_o()); \ No newline at end of file diff --git a/src/manta/la_core/logic_analyzer_playback_tmpl.v b/src/manta/la_core/logic_analyzer_playback_tmpl.v deleted file mode 100644 index e87228f..0000000 --- a/src/manta/la_core/logic_analyzer_playback_tmpl.v +++ /dev/null @@ -1,50 +0,0 @@ -/* -This playback module was generated with Manta /* VERSION */ on /* TIMESTAMP */ by /* USER */ - -If this breaks or if you've got dank formal verification memes, contact fischerm [at] mit.edu - -Provided under a GNU GPLv3 license. Go wild. - -Here's an example instantiation of the Manta module you configured, feel free to copy-paste -this into your source! - -/* MODULE_NAME */ #(.MEM_FILE("capture.mem")) /* MODULE_NAME */_inst ( - .clk(clk), - .enable(1'b1), - - /* PORTS */); - -*/ - - -module /* MODULE_NAME */ ( - input wire clk, - - input wire enable, - output reg done, - - /* PROBE_DEC */); - - parameter MEM_FILE = ""; - localparam SAMPLE_DEPTH = /* SAMPLE_DEPTH */; - localparam TOTAL_PROBE_WIDTH = /* TOTAL_PROBE_WIDTH */; - - reg [TOTAL_PROBE_WIDTH-1:0] capture [SAMPLE_DEPTH-1:0]; - reg [$clog2(SAMPLE_DEPTH)-1:0] addr; - reg [TOTAL_PROBE_WIDTH-1:0] sample; - - assign done = (addr >= SAMPLE_DEPTH); - - initial begin - $readmemb(MEM_FILE, capture, 0, SAMPLE_DEPTH-1); - addr = 0; - end - - always @(posedge clk) begin - if (enable && !done) begin - addr = addr + 1; - sample = capture[addr]; - /* PROBES_CONCAT */ = sample; - end - end -endmodule \ No newline at end of file diff --git a/src/manta/la_core/trigger.v b/src/manta/la_core/trigger.v deleted file mode 100644 index 05939e1..0000000 --- a/src/manta/la_core/trigger.v +++ /dev/null @@ -1,45 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module trigger ( - input wire clk, - - input wire [INPUT_WIDTH-1:0] probe, - input wire [3:0] op, - input wire [INPUT_WIDTH-1:0] arg, - - output reg trig); - - parameter INPUT_WIDTH = 0; - - localparam DISABLE = 0; - localparam RISING = 1; - localparam FALLING = 2; - localparam CHANGING = 3; - localparam GT = 4; - localparam LT = 5; - localparam GEQ = 6; - localparam LEQ = 7; - localparam EQ = 8; - localparam NEQ = 9; - - reg [INPUT_WIDTH-1:0] probe_prev = 0; - always @(posedge clk) probe_prev <= probe; - - always @(*) begin - case (op) - RISING : trig = (probe > probe_prev); - FALLING : trig = (probe < probe_prev); - CHANGING : trig = (probe != probe_prev); - GT: trig = (probe > arg); - LT: trig = (probe < arg); - GEQ: trig = (probe >= arg); - LEQ: trig = (probe <= arg); - EQ: trig = (probe == arg); - NEQ: trig = (probe != arg); - default: trig = 0; - endcase - end -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/src/manta/la_core/trigger_block_def_tmpl.v b/src/manta/la_core/trigger_block_def_tmpl.v deleted file mode 100644 index 39af04f..0000000 --- a/src/manta/la_core/trigger_block_def_tmpl.v +++ /dev/null @@ -1,62 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module trigger_block ( - input wire clk, - - // probes - /* PROBE_PORTS */ - - // trigger - output reg trig, - - // input port - input wire [15:0] addr_i, - input wire [15:0] data_i, - input wire rw_i, - input wire valid_i, - - // output port - output reg [15:0] addr_o, - output reg [15:0] data_o, - output reg rw_o, - output reg valid_o); - - parameter BASE_ADDR = 0; - localparam MAX_ADDR = /* MAX_ADDR */; - - // trigger configuration registers - // - each probe gets an operation and a compare register - // - at the end we OR them all together. along with any custom probes the user specs - - /* TRIGGER_MODULE_INSTS */ - - /* COMBINE_INDIV_TRIGGERS */ - - // perform register operations - always @(posedge clk) begin - addr_o <= addr_i; - data_o <= data_i; - rw_o <= rw_i; - valid_o <= valid_i; - - if( (addr_i >= BASE_ADDR) && (addr_i <= BASE_ADDR + MAX_ADDR) ) begin - - // reads - if(valid_i && !rw_i) begin - case (addr_i) - /* READ_CASE_STATEMENT_BODY */ - endcase - end - - // writes - else if(valid_i && rw_i) begin - case (addr_i) - /* WRITE_CASE_STATEMENT_BODY */ - endcase - end - end - end -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/src/manta/la_core/trigger_block_inst_tmpl.v b/src/manta/la_core/trigger_block_inst_tmpl.v deleted file mode 100644 index f796fa2..0000000 --- a/src/manta/la_core/trigger_block_inst_tmpl.v +++ /dev/null @@ -1,11 +0,0 @@ -/* OP_DEC */ -/* ARG_DEC */ -/* TRIG_DEC */ - -trigger #(.INPUT_WIDTH(/* INPUT_WIDTH */)) /* NAME */ ( - .clk(clk), - - .probe(/* PROBE */), - .op(/* OP */), - .arg(/* ARG */), - .trig(/* TRIG */)); diff --git a/src/manta/logic_analyzer_core.py b/src/manta/logic_analyzer_core.py new file mode 100644 index 0000000..4acedd5 --- /dev/null +++ b/src/manta/logic_analyzer_core.py @@ -0,0 +1,558 @@ +from amaranth import * +from warnings import warn +from .utils import * +from .io_core import IOCore +from .memory_core import ReadOnlyMemoryCore +from math import ceil, log2 + + +class LogicAnalyzerCore(Elaboratable): + """ """ + + def __init__(self, config, base_addr, interface): + self.config = config + self.base_addr = base_addr + self.interface = interface + + self.check_config(config) + + # State Machine Values + self.states = { + "IDLE": 0, + "MOVE_TO_POSITION": 1, + "IN_POSITION": 2, + "CAPTURING": 3, + "CAPTURED": 4, + } + + # Trigger Modes + self.trigger_modes = {"SINGLE_SHOT": 0, "INCREMENTAL": 1, "IMMEDIATE": 2} + + # Trigger operations + self.operations = { + "DISABLE": 0, + "RISING": 1, + "FALLING": 2, + "CHANGING": 3, + "GT": 4, + "LT": 5, + "GEQ": 6, + "LEQ": 7, + "EQ": 8, + "NEQ": 9, + } + + self.registers = self.make_registers(self.base_addr) + self.sample_mem = self.make_sample_mem(self.registers.max_addr) + self.define_signals() + + def check_config(self, config): + # Check for unrecognized options + valid_options = [ + "type", + "sample_depth", + "probes", + "triggers", + "trigger_loc", + "trigger_mode", + ] + for option in config: + if option not in valid_options: + warn(f"Ignoring unrecognized option '{option}' in Logic Analyzer.") + + # Check sample depth is provided and positive + if "sample_depth" not in config: + raise ValueError("Logic Analyzer must have sample_depth specified.") + + if not isinstance(config["sample_depth"], int): + raise ValueError("Logic Analyzer sample_depth must be an integer.") + + if config["sample_depth"] <= 0: + raise ValueError("Logic Analyzer sample_depth must be positive.") + + # Check probes + if "probes" not in config: + raise ValueError("Logic Analyzer must have at least one probe specified.") + + if len(config["probes"]) == 0: + raise ValueError("Logic Analyzer must have at least one probe specified.") + + for name, width in config["probes"].items(): + if width < 0: + raise ValueError(f"Width of probe {name} must be positive.") + + # Check triggers + if "triggers" not in config: + raise ValueError("Logic Analyzer must have at least one trigger specified.") + + if len(config["triggers"]) == 0: + raise ValueError("Logic Analyzer must have at least one trigger specified.") + + # Check trigger location + if "trigger_loc" in config: + if not isinstance(config["trigger_loc"], int): + raise ValueError("Trigger location must be an integer.") + + if config["trigger_loc"] < 0: + raise ValueError("Trigger location must be positive.") + + if config["trigger_loc"] > config["sample_depth"]: + raise ValueError("Trigger location cannot exceed sample depth.") + + # Check trigger mode + if "trigger_mode" in config: + valid_modes = ["single_shot", "incremental", "immediate"] + if config["trigger_mode"] not in valid_modes: + raise ValueError( + f"Unrecognized trigger mode {config['trigger_mode']} provided." + ) + + # Check triggers themselves + for trigger in config["triggers"]: + if not isinstance(trigger, str): + raise ValueError("Trigger must be specified with a string.") + + # Trigger conditions may be composed of either two or three components, + # depending on the operation specified. In the case of operations that + # don't need an argument (like DISABLE, RISING, FALLING, CHANGING) or + # three statements in + + # Check the trigger operations + components = trigger.strip().split(" ") + if len(components) == 2: + name, op = components + if op not in ["DISABLE", "RISING", "FALLING", "CHANGING"]: + raise ValueError( + f"Unable to interpret trigger condition '{trigger}'." + ) + + elif len(components) == 3: + name, op, arg = components + if op not in ["GT", "LT", "GEQ", "LEQ", "EQ", "NEQ"]: + raise ValueError( + f"Unable to interpret trigger condition '{trigger}'." + ) + + else: + raise ValueError(f"Unable to interpret trigger condition '{trigger}'.") + + # Check probe names + if components[0] not in config["probes"]: + raise ValueError(f"Unknown probe name '{components[0]}' specified.") + + def define_signals(self): + # Bus Input + self.addr_i = Signal(16) + self.data_i = Signal(16) + self.rw_i = Signal(1) + self.valid_i = Signal(1) + + # Bus Output + self.addr_o = Signal(16) + self.data_o = Signal(16) + self.rw_o = Signal(1) + self.valid_o = Signal(1) + + # Probes + self.probe_signals = {} + for name, width in self.config["probes"].items(): + self.probe_signals[name] = { + "top_level": Signal(width), + "prev": Signal(width), + "trigger_arg": getattr(self.registers, f"{name}_arg"), + "trigger_op": getattr(self.registers, f"{name}_op"), + "triggered": Signal(1), + } + + # Global trigger. High if any probe is triggered. + self.trig = Signal(1) + + def make_registers(self, base_addr): + # The logic analyzer uses an IO core to handle inputs to the FSM and trigger comparators + register_config = { + "inputs": { + "state": 4, + "read_pointer": ceil(log2(self.config["sample_depth"])), + "write_pointer": ceil(log2(self.config["sample_depth"])), + }, + "outputs": { + "trigger_loc": ceil(log2(self.config["sample_depth"])), + "trigger_mode": 2, + "request_start": 1, + "request_stop": 1, + }, + } + + for name, width in self.config["probes"].items(): + register_config["outputs"][name + "_arg"] = width + register_config["outputs"][name + "_op"] = 4 + + return IOCore(register_config, base_addr, self.interface) + + def make_sample_mem(self, base_addr): + sample_mem_config = { + "width": sum(self.config["probes"].values()), + "depth": self.config["sample_depth"], + } + + return ReadOnlyMemoryCore(sample_mem_config, base_addr, self.interface) + + def run_triggers(self, m): + # Run the trigger for each individual probe + for name, attrs in self.probe_signals.items(): + top_level = attrs["top_level"] + prev = attrs["prev"] + trigger_arg = attrs["trigger_arg"] + trigger_op = attrs["trigger_op"] + triggered = attrs["triggered"] + + # Save the previous value to a register so we can do rising/falling edge detection later! + m.d.sync += prev.eq(top_level) + + with m.If(trigger_op == self.operations["DISABLE"]): + m.d.comb += triggered.eq(0) + + with m.Elif(trigger_op == self.operations["RISING"]): + m.d.comb += triggered.eq((top_level) & (~prev)) + + with m.Elif(trigger_op == self.operations["FALLING"]): + m.d.comb += triggered.eq((~top_level) & (prev)) + + with m.Elif(trigger_op == self.operations["CHANGING"]): + m.d.comb += triggered.eq(top_level != prev) + + with m.Elif(trigger_op == self.operations["GT"]): + m.d.comb += triggered.eq(top_level > trigger_arg) + + with m.Elif(trigger_op == self.operations["LT"]): + m.d.comb += triggered.eq(top_level < trigger_arg) + + with m.Elif(trigger_op == self.operations["GEQ"]): + m.d.comb += triggered.eq(top_level >= trigger_arg) + + with m.Elif(trigger_op == self.operations["LEQ"]): + m.d.comb += triggered.eq(top_level <= trigger_arg) + + with m.Elif(trigger_op == self.operations["EQ"]): + m.d.comb += triggered.eq(top_level == trigger_arg) + + with m.Elif(trigger_op == self.operations["NEQ"]): + m.d.comb += triggered.eq(top_level != trigger_arg) + + with m.Else(): + m.d.comb += triggered.eq(0) + + # Combine all the triggers + m.d.comb += self.trig.eq( + Cat(attrs["triggered"] for attrs in self.probe_signals.values()).any() + ) + + def run_state_machine(self, m): + self.prev_request_start = Signal(1) + self.prev_request_stop = Signal(1) + + # Rising edge detection for start/stop requests + m.d.sync += self.prev_request_start.eq(self.registers.request_start) + m.d.sync += self.prev_request_stop.eq(self.registers.request_stop) + + m.d.comb += self.sample_mem.user_addr.eq(self.registers.write_pointer) + + with m.If(self.registers.state == self.states["IDLE"]): + m.d.sync += self.registers.write_pointer.eq(0) + m.d.sync += self.registers.read_pointer.eq(0) + m.d.sync += self.sample_mem.user_we.eq(0) # or something like this + + with m.If((self.registers.request_start) & (~self.prev_request_start)): + m.d.sync += self.registers.state.eq(self.states["MOVE_TO_POSITION"]) + + with m.Elif(self.registers.state == self.states["MOVE_TO_POSITION"]): + m.d.sync += self.registers.write_pointer.eq( + self.registers.write_pointer + 1 + ) + m.d.sync += self.sample_mem.user_we.eq(1) + + with m.If(self.registers.write_pointer == self.registers.trigger_loc): + with m.If(self.trig): + m.d.sync += self.registers.state.eq(self.states["CAPTURING"]) + + with m.Else(): + m.d.sync += self.registers.state.eq(self.states["IN_POSITION"]) + + with m.Elif(self.registers.state == self.states["IN_POSITION"]): + m.d.sync += self.registers.write_pointer.eq( + (self.registers.write_pointer + 1) % self.config["sample_depth"] + ) + m.d.sync += self.registers.read_pointer.eq( + (self.registers.read_pointer + 1) % self.config["sample_depth"] + ) + m.d.sync += self.sample_mem.user_we.eq(1) + + with m.If(self.trig): + m.d.sync += self.registers.state.eq(self.states["CAPTURING"]) + + with m.Elif(self.registers.state == self.states["CAPTURING"]): + with m.If(self.registers.write_pointer == self.registers.read_pointer): + m.d.sync += self.sample_mem.user_we.eq(0) + m.d.sync += self.registers.state.eq(self.states["CAPTURED"]) + + with m.Else(): + m.d.sync += self.registers.write_pointer.eq( + (self.registers.write_pointer + 1) % self.config["sample_depth"] + ) + + with m.If((self.registers.request_stop) & (~self.prev_request_stop)): + m.d.sync += self.registers.state.eq(self.states["IDLE"]) + + def elaborate(self, platform): + m = Module() + + # Add registers and sample memory as submodules + m.submodules["registers"] = self.registers + m.submodules["sample_mem"] = self.sample_mem + + # Concat all the probes together, and feed to input of sample memory + # (it is necessary to reverse the order such that first probe occupies + # the lowest location in memory) + m.d.comb += self.sample_mem.user_data.eq( + Cat([p["top_level"] for p in self.probe_signals.values()][::-1]) + ) + + self.run_state_machine(m) + self.run_triggers(m) + + # Wire internal modules + m.d.comb += [ + self.registers.addr_i.eq(self.addr_i), + self.registers.data_i.eq(self.data_i), + self.registers.rw_i.eq(self.rw_i), + self.registers.valid_i.eq(self.valid_i), + self.sample_mem.addr_i.eq(self.registers.addr_o), + self.sample_mem.data_i.eq(self.registers.data_o), + self.sample_mem.rw_i.eq(self.registers.rw_o), + self.sample_mem.valid_i.eq(self.registers.valid_o), + self.addr_o.eq(self.sample_mem.addr_o), + self.data_o.eq(self.sample_mem.data_o), + self.rw_o.eq(self.sample_mem.rw_o), + self.valid_o.eq(self.sample_mem.valid_o), + ] + + return m + + def get_top_level_ports(self): + return [p["top_level"] for p in self.probe_signals.values()] + + def get_max_addr(self): + return self.sample_mem.get_max_addr() + + def set_triggers(self): + # reset all triggers to zero + for name in self.probe_signals.keys(): + self.registers.set_probe(name + "_op", 0) + self.registers.set_probe(name + "_arg", 0) + + # set triggers + for trigger in self.config["triggers"]: + components = trigger.strip().split(" ") + + # Handle triggers that don't need an argument + if len(components) == 2: + name, op = components + self.registers.set_probe(name + "_op", self.operations[op]) + + # Handle triggers that do need an argument + elif len(components) == 3: + name, op, arg = components + self.registers.set_probe(name + "_op", self.operations[op]) + self.registers.set_probe(name + "_arg", int(arg)) + + def capture(self, verbose=False): + print_if_verbose = lambda x: print(x) if verbose else None + + # If core is not in IDLE state, request that it return to IDLE + print_if_verbose(" -> Resetting core...") + state = self.registers.get_probe("state") + if state != self.states["IDLE"]: + self.registers.set_probe("request_stop", 0) + self.registers.set_probe("request_stop", 1) + self.registers.set_probe("request_stop", 0) + + if self.registers.get_probe("state") != self.states["IDLE"]: + raise ValueError("Logic analyzer did not reset to IDLE state.") + + # Set triggers + print_if_verbose(" -> Setting triggers...") + self.set_triggers() + + # Set trigger mode, default to single-shot if user didn't specify a mode + print_if_verbose(" -> Setting trigger mode...") + if "trigger_mode" in self.config: + self.registers.set_probe("trigger_mode", self.config["trigger_mode"]) + + else: + self.registers.set_probe("trigger_mode", self.trigger_modes["SINGLE_SHOT"]) + + # Set trigger location + print_if_verbose(" -> Setting trigger location...") + self.registers.set_probe("trigger_loc", self.config["trigger_loc"]) + + # Send a start request to the state machine + print_if_verbose(" -> Starting capture...") + self.registers.set_probe("request_start", 1) + self.registers.set_probe("request_start", 0) + + # Poll the state machine's state, and wait for the capture to complete + print_if_verbose(" -> Waiting for capture to complete...") + while self.registers.get_probe("state") != self.states["CAPTURED"]: + pass + + # Read out the entirety of the sample memory + print_if_verbose(" -> Reading sample memory contents...") + addrs = list(range(self.config["sample_depth"])) + raw_capture = self.sample_mem.read_from_user_addr(addrs) + + # Revolve the memory around the read_pointer, such that all the beginning + # of the caputure is at the first element + print_if_verbose(" -> Checking read pointer and revolving memory...") + read_pointer = self.registers.get_probe("read_pointer") + + data = raw_capture[read_pointer:] + raw_capture[:read_pointer] + return LogicAnalyzerCapture(data, self.config) + + +class LogicAnalyzerCapture: + def __init__(self, data, config): + self.data = data + self.config = config + + def get_trigger_loc(self): + return self.config["trigger_loc"] + + def get_trace(self, probe_name): + # sum up the widths of all the probes below this one + lower = 0 + for name, width in self.config["probes"].items(): + if name == probe_name: + break + + lower += width + + # add the width of the probe we'd like + upper = lower + self.config["probes"][probe_name] + + total_probe_width = sum(self.config["probes"].values()) + binary = [f"{d:0{total_probe_width}b}" for d in self.data] + return [int(b[lower:upper], 2) for b in binary] + + def export_vcd(self, path): + from vcd import VCDWriter + from datetime import datetime + + # Use the same datetime format that iVerilog uses + timestamp = datetime.now().strftime("%a %b %w %H:%M:%S %Y") + vcd_file = open(path, "w") + + with VCDWriter(vcd_file, "10 ns", timestamp, "manta") as writer: + # each probe has a name, width, and writer associated with it + signals = [] + for name, width in self.config["probes"].items(): + signal = { + "name": name, + "width": width, + "data": self.get_trace(name), + "var": writer.register_var("manta", name, "wire", size=width), + } + signals.append(signal) + + clock = writer.register_var("manta", "clk", "wire", size=1) + trigger = writer.register_var("manta", "trigger", "wire", size=1) + + # add the data to each probe in the vcd file + for timestamp in range(0, 2 * len(self.data)): + # run the clock + writer.change(clock, timestamp, timestamp % 2 == 0) + + # set the trigger + triggered = (timestamp // 2) >= self.get_trigger_loc() + writer.change(trigger, timestamp, triggered) + + # add other signals + for signal in signals: + var = signal["var"] + sample = signal["data"][timestamp // 2] + + writer.change(var, timestamp, sample) + + vcd_file.close() + + def export_playback_module(self, path): + return LogicAnalyzerPlayback(self.data, self.config) + + def export_playback_verilog(self, path): + la = LogicAnalyzerPlayback(self.data, self.config) + from amaranth.back import verilog + + with open(path, "w") as f: + f.write( + verilog.convert( + la, + name="logic_analyzer_playback", + ports=la.get_top_level_ports(), + strip_internal_attrs=True, + ) + ) + + +class LogicAnalyzerPlayback(Elaboratable): + def __init__(self, data, config): + self.data = data + self.config = config + + # State Machine + self.enable = Signal(1) + self.done = Signal(1) + + # Top-Level Probe signals + self.top_level_probes = {} + for name, width in self.config["probes"].items(): + self.top_level_probes[name] = Signal(width, name=name) + + # Instantiate memory + self.mem = Memory( + depth=self.config["sample_depth"], + width=sum(self.config["probes"].values()), + init=self.data, + ) + + self.read_port = self.mem.read_port() + + def elaborate(self, platform): + m = Module() + m.submodules["mem"] = self.mem + m.d.comb += self.read_port.en.eq(1) + + # Assign the probe values by part-selecting from the data port + lower = 0 + for name, width in reversed(self.config["probes"].items()): + signal = self.top_level_probes[name] + + # Set output probe to zero if we're not + with m.If(~self.done): + m.d.comb += signal.eq(self.read_port.data[lower : lower + width]) + + with m.Else(): + m.d.comb += signal.eq(0) + + lower += width + + # Iterate through the samples if saved + with m.If((self.enable) & (~self.done)): + with m.If(self.read_port.addr < (self.config["sample_depth"] - 1)): + m.d.sync += self.read_port.addr.eq(self.read_port.addr + 1) + + with m.Else(): + m.d.sync += self.done.eq(1) + + return m + + def get_top_level_ports(self): + return [self.enable, self.done] + list(self.top_level_probes.values()) diff --git a/src/manta/manta.py b/src/manta/manta.py new file mode 100644 index 0000000..073f55a --- /dev/null +++ b/src/manta/manta.py @@ -0,0 +1,170 @@ +from amaranth import * +from warnings import warn +from .uart import UARTInterface + +# from .ethernet import EthernetInterface +from .io_core import IOCore +from .memory_core import ReadOnlyMemoryCore +from .logic_analyzer_core import LogicAnalyzerCore + + +class Manta(Elaboratable): + def __init__(self, config): + # load config from either a configuration file or a dictionary. Users primarily use the + # config file, but the dictionary is included for internal tests. + + if isinstance(config, str): + self.config = self.read_config_file(config) + + if isinstance(config, dict): + self.config = config + + self.check_config() + + self.interface = self.get_interface() + self.cores = self.get_cores() + self.add_friendly_core_names() + + def read_config_file(self, path): + """ + Take path to configuration file, and retun the configuration as a python list/dict object. + """ + + extension = path.split(".")[-1] + + if "json" in extension: + with open(path, "r") as f: + import json + + return json.load(f) + + elif "yaml" in extension or "yml" in extension: + with open(path, "r") as f: + import yaml + + return yaml.safe_load(f) + + else: + raise ValueError("Unable to recognize configuration file extension.") + + def check_config(self): + if "cores" not in self.config: + raise ValueError("No cores specified in configuration file.") + + if not len(self.config["cores"]) > 0: + raise ValueError("Must specify at least one core.") + + for name, attrs in self.config["cores"].items(): + # make sure core type is specified + if "type" not in attrs: + raise ValueError(f"No type specified for core {name}.") + + if attrs["type"] not in ["logic_analyzer", "io", "memory_read_only"]: + raise ValueError(f"Unrecognized core type specified for {name}.") + + def get_interface(self): + if "uart" in self.config: + return UARTInterface(self.config["uart"]) + + elif "ethernet" in self.config: + return EthernetInterface(self.config["ethernet"]) + + else: + raise ValueError("Unrecognized interface specified.") + + def get_cores(self): + """ """ + + cores = {} + base_addr = 0 + for name, attrs in self.config["cores"].items(): + if attrs["type"] == "io": + core = IOCore(attrs, base_addr, self.interface) + + elif attrs["type"] == "logic_analyzer": + core = LogicAnalyzerCore(attrs, base_addr, self.interface) + + elif attrs["type"] == "memory_read_only": + core = ReadOnlyMemoryCore(attrs, base_addr, self.interface) + + # make sure we're not out of address space + if core.get_max_addr() > (2**16) - 1: + raise ValueError( + f"Ran out of address space to allocate to core {name}." + ) + + # Make the next core's base address start one address after the previous one's + base_addr = core.get_max_addr() + 1 + cores[name] = core + + return cores + + def add_friendly_core_names(self): + """ + Add cores to the instance under a friendly name - ie, a core named `my_core` belonging + to a Manta instance `m` could be obtained with `m.cores["my_core"]`, but this allows + it to be obtained with `m.my_core`. Which is way nicer. + """ + + for name, instance in self.cores.items(): + if not hasattr(self, name): + setattr(self, name, instance) + + else: + raise ValueError( + "Cannot add object to Manta instance - name is already taken!" + ) + + def elaborate(self, platform): + # make a module object + # add all the submodules + # connect them together, which consists of: + # connect interface to first core + # connect cores to each other + # connect interface to last core + + m = Module() + + # Add interface as submodule + m.submodules["interface"] = self.interface + + # Add all cores as submodules + for name, instance in self.cores.items(): + m.submodules[name] = instance + + # Connect first/last cores to interface output/input respectively + core_instances = list(self.cores.values()) + first_core = core_instances[0] + last_core = core_instances[-1] + m.d.comb += [ + first_core.addr_i.eq(self.interface.addr_o), + first_core.data_i.eq(self.interface.data_o), + first_core.rw_i.eq(self.interface.rw_o), + first_core.valid_i.eq(self.interface.valid_o), + self.interface.addr_i.eq(last_core.addr_o), + self.interface.data_i.eq(last_core.data_o), + self.interface.rw_i.eq(last_core.rw_o), + self.interface.valid_i.eq(last_core.valid_o), + ] + + # Connect output of ith core to input of (i+1)th core + for i in range(len(core_instances) - 1): + ith_core = core_instances[i] + i_plus_oneth_core = core_instances[i + 1] + + m.d.comb += [ + i_plus_oneth_core.addr_i.eq(ith_core.addr_o), + i_plus_oneth_core.data_i.eq(ith_core.data_o), + i_plus_oneth_core.rw_i.eq(ith_core.rw_o), + i_plus_oneth_core.valid_i.eq(ith_core.valid_o), + ] + + return m + + def get_top_level_ports(self): + ports = self.interface.get_top_level_ports() + + for name, instance in self.cores.items(): + ports += instance.get_top_level_ports() + + return ports diff --git a/src/manta/manta_def_tmpl.v b/src/manta/manta_def_tmpl.v deleted file mode 100644 index 252a858..0000000 --- a/src/manta/manta_def_tmpl.v +++ /dev/null @@ -1,34 +0,0 @@ -/* -This module was generated with Manta /* VERSION */ on /* TIMESTAMP */ by /* USER */ - -If this breaks or if you've got spicy formal verification memes, contact fischerm [at] mit.edu - -Provided under a GNU GPLv3 license. Go wild. - -Here's an example instantiation of the Manta module you configured, feel free to copy-paste -this into your source! - -manta manta_inst ( - .clk(clk), - - /* EX_INST_PORTS */); - -*/ - -module manta ( - input wire clk, - - /* TOP_LEVEL_PORTS */); - - - /* INTERFACE_RX */ - - /* CORE_CHAIN */ - - /* INTERFACE_TX */ - -endmodule - -/* ---- Module Definitions ---- */ - -/* MODULE_DEFS */ \ No newline at end of file diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py new file mode 100644 index 0000000..cf4d9ae --- /dev/null +++ b/src/manta/memory_core.py @@ -0,0 +1,205 @@ +from amaranth import * +from warnings import warn +from .utils import * +from math import ceil + + +class ReadOnlyMemoryCore(Elaboratable): + def __init__(self, config, base_addr, interface): + self.config = config + self.base_addr = base_addr + self.interface = interface + + self.check_config(config) + + self.depth = self.config["depth"] + self.width = self.config["width"] + self.max_addr = self.base_addr + (self.depth * ceil(self.width / 16)) + + self.define_signals() + self.define_mems() + + def check_config(self, config): + # Check for unrecognized options + valid_options = ["type", "depth", "width"] + for option in config: + if option not in valid_options: + warn(f"Ignoring unrecognized option '{option}' in memory core.") + + # Check depth is provided and positive + if "depth" not in config: + raise ValueError("Depth of memory core must be specified.") + + if not isinstance(config["depth"], int): + raise ValueError("Depth of memory core must be an integer.") + + if config["depth"] <= 0: + raise ValueError("Depth of memory core must be positive. ") + + # Check width is provided and positive + if "width" not in config: + raise ValueError("Width of memory core must be specified.") + + if not isinstance(config["width"], int): + raise ValueError("Width of memory core must be an integer.") + + if config["width"] <= 0: + raise ValueError("Width of memory core must be positive. ") + + def define_signals(self): + # Bus Input + self.addr_i = Signal(16) + self.data_i = Signal(16) + self.rw_i = Signal(1) + self.valid_i = Signal(1) + + # Bus Pipelining + self.addr_pipe = [Signal(16) for _ in range(3)] + self.data_pipe = [Signal(16) for _ in range(3)] + self.rw_pipe = [Signal(1) for _ in range(3)] + self.valid_pipe = [Signal(1) for _ in range(3)] + + # Bus Output + self.addr_o = Signal(16, reset=0) + self.data_o = Signal(16, reset=0) + self.rw_o = Signal(1, reset=0) + self.valid_o = Signal(1, reset=0) + + # User Port + self.user_addr = Signal(range(self.depth)) + self.user_data = Signal(self.width) + self.user_we = Signal(1) + + def pipeline_bus(self, m): + # Pipelining + m.d.sync += self.addr_pipe[0].eq(self.addr_i) + m.d.sync += self.data_pipe[0].eq(self.data_i) + m.d.sync += self.rw_pipe[0].eq(self.rw_i) + m.d.sync += self.valid_pipe[0].eq(self.valid_i) + + for i in range(1, 3): + m.d.sync += self.addr_pipe[i].eq(self.addr_pipe[i - 1]) + m.d.sync += self.data_pipe[i].eq(self.data_pipe[i - 1]) + m.d.sync += self.rw_pipe[i].eq(self.rw_pipe[i - 1]) + m.d.sync += self.valid_pipe[i].eq(self.valid_pipe[i - 1]) + + m.d.sync += self.addr_o.eq(self.addr_pipe[2]) + m.d.sync += self.data_o.eq(self.data_pipe[2]) + m.d.sync += self.rw_o.eq(self.rw_pipe[2]) + m.d.sync += self.valid_o.eq(self.valid_pipe[2]) + + def define_mems(self): + # ok there's three cases: + # 1. integer number of 16 bit mems + # 2. integer number of 16 bit mems + partial mem + # 3. just the partial mem (width < 16) + + # Only one, partial-width memory is needed + if self.width < 16: + self.mems = [Memory(depth=self.depth, width=self.width)] + + # Only full-width memories are needed + elif self.width % 16 == 0: + self.mems = [ + Memory(depth=self.depth, width=16) for _ in range(self.width // 16) + ] + + # Both full-width and partial memories are needed + else: + self.mems = [ + Memory(depth=self.depth, width=16) for i in range(self.width // 16) + ] + self.mems += [Memory(depth=self.depth, width=self.width % 16)] + + def handle_read_ports(self, m): + # These are tied to the bus + for i, mem in enumerate(self.mems): + read_port = mem.read_port() + m.d.comb += read_port.en.eq(1) + + start_addr = self.base_addr + (i * self.depth) + stop_addr = start_addr + self.depth - 1 + + # Throw BRAM operations into the front of the pipeline + with m.If( + (self.valid_i) + & (~self.rw_i) + & (self.addr_i >= start_addr) + & (self.addr_i <= stop_addr) + ): + m.d.sync += read_port.addr.eq(self.addr_i - start_addr) + + # Pull BRAM reads from the back of the pipeline + with m.If( + (self.valid_pipe[2]) + & (~self.rw_pipe[2]) + & (self.addr_pipe[2] >= start_addr) + & (self.addr_pipe[2] <= stop_addr) + ): + m.d.sync += self.data_o.eq(read_port.data) + + def handle_write_ports(self, m): + # These are given to the user + for i, mem in enumerate(self.mems): + write_port = mem.write_port() + + m.d.comb += write_port.addr.eq(self.user_addr) + m.d.comb += write_port.data.eq(self.user_data[16 * i : 16 * (i + 1)]) + m.d.comb += write_port.en.eq(self.user_we) + + def elaborate(self, platform): + m = Module() + + # Add memories as submodules + for i, mem in enumerate(self.mems): + m.submodules[f"mem_{i}"] = mem + + self.pipeline_bus(m) + self.handle_read_ports(m) + self.handle_write_ports(m) + return m + + def get_top_level_ports(self): + return [self.user_addr, self.user_data, self.user_we] + + def get_max_addr(self): + return self.max_addr + + def read_from_user_addr(self, addrs): + """ + Read the memory stored at the provided address, as seen from the user side. + """ + + # Convert user address space to bus address space + # (for instance, for a core with base address 10 and width 33, + # reading from address 4 is actually a read from address 14 and address 14 + depth, and address 14 + 2*depth) + + if isinstance(addrs, int): + return self.read_from_user_addr([addrs])[0] + + bus_addrs = [] + for addr in addrs: + bus_addrs += [ + addr + self.base_addr + i * self.depth for i in range(len(self.mems)) + ] + + datas = self.interface.read(bus_addrs) + data_chunks = split_into_chunks(datas, len(self.mems)) + return [words_to_value(chunk) for chunk in data_chunks] + + # def write_to_user_addr(self, addrs, datas): + # """ + # Read from the address + # """ + + # bus_addrs = [] + # for addr in addrs: + # bus_addrs += [ + # addr + self.base_addr + i * self.depth for i in range(len(self.mems)) + # ] + + # bus_datas = [] + # for data in datas: + # bus_datas += value_to_words(data) + + # self.interface.write(bus_addrs, bus_datas) diff --git a/src/manta/uart.py b/src/manta/uart.py new file mode 100644 index 0000000..cba6337 --- /dev/null +++ b/src/manta/uart.py @@ -0,0 +1,583 @@ +from amaranth import * +from amaranth.lib.data import ArrayLayout +from warnings import warn +from .utils import * +from serial import Serial + + +class UARTInterface(Elaboratable): + def __init__(self, config): + self.config = config + self.check_config(self.config) + + self.port = config["port"] + self.clock_freq = config["clock_freq"] + self.baudrate = config["baudrate"] + self.clocks_per_baud = int(self.clock_freq // self.baudrate) + + self.define_signals() + + # Set chunk_size, which is the max amount of bytes that the core will + # dump to the OS driver at a time. Since the FPGA will return bytes + # almost instantaneously, this prevents the OS's input buffer from + # overflowing, and dropping bytes. + self.chunk_size = 256 # in bytes + if "chunk_size" in config: + self.chunk_size = config["chunk_size"] + + def check_config(self, config): + # Warn if unrecognized options have been given + recognized_options = ["port", "clock_freq", "baudrate", "chunk_size"] + for option in config: + if option not in recognized_options: + warn( + f"Ignoring unrecognized option '{option}' in UART interface config." + ) + + # Ensure a serial port has been given + if "port" not in config: + raise ValueError("No serial port provided to UART interface.") + + # Ensure clock frequency is provided and positive + if "clock_freq" not in config: + raise ValueError("No clock frequency provided to UART interface.") + + if config["clock_freq"] <= 0: + raise ValueError("Non-positive clock frequency provided to UART interface.") + + # Check that baudrate is provided and positive + if "baudrate" not in config: + raise ValueError("No baudrate provided to UART interface.") + + if config["baudrate"] <= 0: + raise ValueError("Non-positive baudrate provided to UART interface.") + + # Confirm the actual baudrate is within 5% of the target baudrate + clock_freq = config["clock_freq"] + baudrate = config["baudrate"] + clocks_per_baud = clock_freq // baudrate + actual_baudrate = clock_freq / clocks_per_baud + error = 100 * abs(actual_baudrate - baudrate) / baudrate + + if error > 5: + raise ValueError( + "UART interface is unable to match targeted baudrate with specified clock frequency." + ) + + def get_serial_device(self): + """ + Return an open PySerial serial device if one exists, otherwise, open one. + """ + if hasattr(self, "serial_device"): + return self.serial_device + + else: + if self.port != "auto": + self.serial_device = Serial(self.port, self.baudrate, timeout=1) + return self.serial_device + + else: + # Try to autodetect which port to use based on the PID/VID of the device attached. + # This looks for the PID/VID of the FT2232, the primary chip used on the icestick + # and Digilent dev boards. However, folks will likely want to connect other things + # in the future, so in the future we'll probably want to look for other chips as + # well. + + # The FT2232 exposes two serial ports - and for whatever reason it usually has the + # 0th device used for JTAG programming, and the 1st used for UART. So we'll grab + # the 1st. + + import serial.tools.list_ports + + ports = [] + for port in serial.tools.list_ports.comports(): + if (port.vid == 0x403) and (port.pid == 0x6010): + ports.append(port) + + if len(ports) != 2: + raise ValueError( + f"Expected to see two serial ports for FT2232 device, but instead see {len(ports)}." + ) + + if ports[0].serial_number != ports[1].serial_number: + raise ValueError( + f"Serial numbers should be the same on both FT2232 ports - probably somehow grabbed ports on two different devices." + ) + + if ports[0].location > ports[1].location: + chosen_port = ports[0].device + + else: + chosen_port = ports[1].device + + self.serial_device = Serial(chosen_port, self.baudrate, timeout=1) + return self.serial_device + + def get_top_level_ports(self): + return [self.rx, self.tx] + + def read(self, addrs): + """ + Read the data stored in a set of address on Manta's internal memory. Addresses + must be specified as either integers or a list of integers. + """ + + # Handle a single integer address + if isinstance(addrs, int): + return self.read([addrs])[0] + + # Make sure all list elements are integers + if not all(isinstance(a, int) for a in addrs): + raise ValueError("Read address must be an integer or list of integers.") + + # Send read requests, and get responses + ser = self.get_serial_device() + addr_chunks = split_into_chunks(addrs, self.chunk_size) + datas = [] + + for addr_chunk in addr_chunks: + # Encode addrs into read requests + bytes_out = b"".join([f"R{a:04X}\r\n".encode("ascii") for a in addr_chunk]) + ser.write(bytes_out) + + # Read responses have the same length as read requests + bytes_in = ser.read(len(bytes_out)) + + if len(bytes_in) != len(bytes_out): + raise ValueError( + f"Only got {len(bytes_in)} out of {len(bytes_out)} bytes." + ) + + # Split received bytes into individual responses and decode + responses = split_into_chunks(bytes_in, 7) + data_chunk = [self.decode_read_response(r) for r in responses] + datas += data_chunk + + return datas + + def write(self, addrs, datas): + """ + Write the provided data into the provided addresses in Manta's internal memory. + Addresses and data must be specified as either integers or a list of integers. + """ + + # Handle a single integer address and data + if isinstance(addrs, int) and isinstance(datas, int): + return self.write([addrs], [datas]) + + # Make sure address and datas are all integers + if not isinstance(addrs, list) or not isinstance(datas, list): + raise ValueError( + "Write addresses and data must be an integer or list of integers." + ) + + if not all(isinstance(a, int) for a in addrs): + raise ValueError("Write addresses must be all be integers.") + + if not all(isinstance(d, int) for d in datas): + raise ValueError("Write data must all be integers.") + + # I'm not sure if it's necessary to split outputs into chunks + # I think the output buffer doesn't really drop stuff, just the input buffer + + # Encode addrs and datas into write requests + bytes_out = "".join([f"W{a:04X}{d:04X}\r\n" for a, d in zip(addrs, datas)]) + bytes_out = bytes_out.encode("ascii") + ser = self.get_serial_device() + ser.write(bytes_out) + + def decode_read_response(self, response_bytes): + """ + Check that read response is formatted properly, and extract the encoded data if so. + """ + + # Make sure response is not empty + if response_bytes is None: + raise ValueError("Unable to decode read response - no bytes received.") + + # Make sure response is properly encoded + response_ascii = response_bytes.decode("ascii") + + if len(response_ascii) != 7: + raise ValueError( + "Unable to decode read response - wrong number of bytes received." + ) + + if response_ascii[0] != "D": + raise ValueError("Unable to decode read response - incorrect preamble.") + + for i in range(1, 5): + if response_ascii[i] not in "0123456789ABCDEF": + raise ValueError("Unable to decode read response - invalid data byte.") + + if response_ascii[5] != "\r": + raise ValueError("Unable to decode read response - incorrect EOL.") + + if response_ascii[6] != "\n": + raise ValueError("Unable to decode read response - incorrect EOL.") + + return int(response_ascii[1:5], 16) + + def define_signals(self): + self.rx = Signal() + self.tx = Signal() + + self.addr_o = Signal(16) + self.data_o = Signal(16) + self.rw_o = Signal() + self.valid_o = Signal() + + self.addr_i = Signal(16) + self.data_i = Signal(16) + self.rw_i = Signal() + self.valid_i = Signal() + + def elaborate(self, platform): + # fancy submoduling and such goes in here + m = Module() + + m.submodules["uart_rx"] = uart_rx = UARTReceiver(self.clocks_per_baud) + m.submodules["bridge_rx"] = bridge_rx = RecieveBridge() + m.submodules["bridge_tx"] = bridge_tx = TransmitBridge() + m.submodules["uart_tx"] = uart_tx = UARTTransmitter(self.clocks_per_baud) + + m.d.comb += [ + # UART RX -> Internal Bus + uart_rx.rx.eq(self.rx), + bridge_rx.data_i.eq(uart_rx.data_o), + bridge_rx.valid_i.eq(uart_rx.valid_o), + self.data_o.eq(bridge_rx.data_o), + self.addr_o.eq(bridge_rx.addr_o), + self.rw_o.eq(bridge_rx.rw_o), + self.valid_o.eq(bridge_rx.valid_o), + # Internal Bus -> UART TX + bridge_tx.data_i.eq(self.data_i), + bridge_tx.rw_i.eq(self.rw_i), + bridge_tx.valid_i.eq(self.valid_i), + uart_tx.data_i.eq(bridge_tx.data_o), + uart_tx.start_i.eq(bridge_tx.start_o), + bridge_tx.done_i.eq(uart_tx.done_o), + self.tx.eq(uart_tx.tx), + ] + return m + + +class UARTReceiver(Elaboratable): + def __init__(self, clocks_per_baud): + self.clocks_per_baud = clocks_per_baud + + # Top-Level Ports + self.rx = Signal() + self.data_o = Signal(8, reset=0) + self.valid_o = Signal(1, reset=0) + + # Internal Signals + self.busy = Signal() + self.bit_index = Signal(range(10)) + self.baud_counter = Signal(range(2 * clocks_per_baud)) + + self.rx_d = Signal() + self.rx_q = Signal() + self.rx_q_prev = Signal() + + def elaborate(self, platform): + m = Module() + + # Two Flip-Flop Synchronizer + m.d.sync += [ + self.rx_d.eq(self.rx), + self.rx_q.eq(self.rx_d), + self.rx_q_prev.eq(self.rx_q), + ] + + m.d.sync += self.valid_o.eq(0) + + with m.If(~self.busy): + with m.If((~self.rx_q) & (self.rx_q_prev)): + m.d.sync += self.busy.eq(1) + m.d.sync += self.bit_index.eq(8) + m.d.sync += self.baud_counter.eq( + self.clocks_per_baud + (self.clocks_per_baud // 2) - 2 + ) + + with m.Else(): + with m.If(self.baud_counter == 0): + with m.If(self.bit_index == 0): + m.d.sync += self.valid_o.eq(1) + m.d.sync += self.busy.eq(0) + m.d.sync += self.bit_index.eq(0) + m.d.sync += self.baud_counter.eq(0) + + with m.Else(): + # m.d.sync += self.data_o.eq(Cat(self.rx_q, self.data_o[0:7])) + m.d.sync += self.data_o.eq(Cat(self.data_o[1:8], self.rx_q)) + m.d.sync += self.bit_index.eq(self.bit_index - 1) + m.d.sync += self.baud_counter.eq(self.clocks_per_baud - 1) + + with m.Else(): + m.d.sync += self.baud_counter.eq(self.baud_counter - 1) + + return m + + +class RecieveBridge(Elaboratable): + def __init__(self): + # Top-Level Ports + self.data_i = Signal(8) + self.valid_i = Signal() + + self.addr_o = Signal(16, reset=0) + self.data_o = Signal(16, reset=0) + self.rw_o = Signal(1, reset=0) + self.valid_o = Signal(1, reset=0) + + # State Machine + self.IDLE_STATE = 0 + self.READ_STATE = 1 + self.WRITE_STATE = 2 + + # Internal Signals + self.buffer = Signal(ArrayLayout(4, 8), reset_less=True) + self.state = Signal(2, reset=self.IDLE_STATE) + self.byte_num = Signal(4, reset=0) + self.is_eol = Signal() + self.is_ascii_hex = Signal() + self.from_ascii_hex = Signal(8) + + def drive_ascii_signals(self, m): + # Decode 0-9 + with m.If((self.data_i >= 0x30) & (self.data_i <= 0x39)): + m.d.comb += self.is_ascii_hex.eq(1) + m.d.comb += self.from_ascii_hex.eq(self.data_i - 0x30) + + # Decode A-F + with m.Elif((self.data_i >= 0x41) & (self.data_i <= 0x46)): + m.d.comb += self.is_ascii_hex.eq(1) + m.d.comb += self.from_ascii_hex.eq(self.data_i - 0x41 + 10) + + with m.Else(): + m.d.comb += self.is_ascii_hex.eq(0) + m.d.comb += self.from_ascii_hex.eq(0) + + with m.If((self.data_i == ord("\r")) | (self.data_i == ord("\n"))): + m.d.comb += self.is_eol.eq(1) + + with m.Else(): + m.d.comb += self.is_eol.eq(0) + + def drive_output_bus(self, m): + with m.If( + (self.state == self.READ_STATE) & (self.byte_num == 4) & (self.is_eol) + ): + m.d.comb += self.addr_o.eq( + Cat(self.buffer[3], self.buffer[2], self.buffer[1], self.buffer[0]) + ) + m.d.comb += self.data_o.eq(0) + m.d.comb += self.valid_o.eq(1) + m.d.comb += self.rw_o.eq(0) + + with m.Elif( + (self.state == self.WRITE_STATE) & (self.byte_num == 8) & (self.is_eol) + ): + m.d.comb += self.addr_o.eq( + Cat(self.buffer[3], self.buffer[2], self.buffer[1], self.buffer[0]) + ) + m.d.comb += self.data_o.eq( + Cat(self.buffer[7], self.buffer[6], self.buffer[5], self.buffer[4]) + ) + m.d.comb += self.valid_o.eq(1) + m.d.comb += self.rw_o.eq(1) + + with m.Else(): + m.d.comb += self.addr_o.eq(0) + m.d.comb += self.data_o.eq(0) + m.d.comb += self.rw_o.eq(0) + m.d.comb += self.valid_o.eq(0) + + def drive_fsm(self, m): + with m.If(self.valid_i): + with m.If(self.state == self.IDLE_STATE): + m.d.sync += self.byte_num.eq(0) + + with m.If(self.data_i == ord("R")): + m.d.sync += self.state.eq(self.READ_STATE) + + with m.Elif(self.data_i == ord("W")): + m.d.sync += self.state.eq(self.WRITE_STATE) + + with m.If(self.state == self.READ_STATE): + # buffer bytes if we don't have enough + with m.If(self.byte_num < 4): + # if bytes aren't valid ASCII then return to IDLE state + with m.If(self.is_ascii_hex == 0): + m.d.sync += self.state.eq(self.IDLE_STATE) + + # otherwise buffer them + with m.Else(): + m.d.sync += self.buffer[self.byte_num].eq(self.from_ascii_hex) + m.d.sync += self.byte_num.eq(self.byte_num + 1) + + with m.Else(): + m.d.sync += self.state.eq(self.IDLE_STATE) + + with m.If(self.state == self.WRITE_STATE): + # buffer bytes if we don't have enough + with m.If(self.byte_num < 8): + # if bytes aren't valid ASCII then return to IDLE state + with m.If(self.is_ascii_hex == 0): + m.d.sync += self.state.eq(self.IDLE_STATE) + + # otherwise buffer them + with m.Else(): + m.d.sync += self.buffer[self.byte_num].eq(self.from_ascii_hex) + m.d.sync += self.byte_num.eq(self.byte_num + 1) + + with m.Else(): + m.d.sync += self.state.eq(self.IDLE_STATE) + pass + + def elaborate(self, platform): + m = Module() + + self.drive_ascii_signals(m) + self.drive_output_bus(m) + self.drive_fsm(m) + + return m + + +class UARTTransmitter(Elaboratable): + def __init__(self, clocks_per_baud): + self.clocks_per_baud = clocks_per_baud + + # Top-Level Ports + self.data_i = Signal(8) + self.start_i = Signal() + self.done_o = Signal(reset=1) + + self.tx = Signal(reset=1) + + # Internal Signals + self.baud_counter = Signal(range(clocks_per_baud)) + self.buffer = Signal(9) + self.bit_index = Signal(4) + + def elaborate(self, platform): + m = Module() + + with m.If((self.start_i) & (self.done_o)): + m.d.sync += self.baud_counter.eq(self.clocks_per_baud - 1) + m.d.sync += self.buffer.eq(Cat(self.data_i, 1)) + m.d.sync += self.bit_index.eq(0) + m.d.sync += self.done_o.eq(0) + m.d.sync += self.tx.eq(0) + + with m.Elif(~self.done_o): + m.d.sync += self.baud_counter.eq(self.baud_counter - 1) + m.d.sync += self.done_o.eq((self.baud_counter == 1) & (self.bit_index == 9)) + + # A baud period has elapsed + with m.If(self.baud_counter == 0): + m.d.sync += self.baud_counter.eq(self.clocks_per_baud - 1) + + # Clock out another bit if there are any left + with m.If(self.bit_index < 9): + m.d.sync += self.tx.eq(self.buffer.bit_select(self.bit_index, 1)) + m.d.sync += self.bit_index.eq(self.bit_index + 1) + + # Byte has been sent, send out next one or go to idle + with m.Else(): + with m.If(self.start_i): + m.d.sync += self.buffer.eq(Cat(self.data_i, 1)) + m.d.sync += self.bit_index.eq(0) + m.d.sync += self.tx.eq(0) + + with m.Else(): + m.d.sync += self.done_o.eq(1) + return m + + +class TransmitBridge(Elaboratable): + def __init__(self): + # Top-Level Ports + self.data_i = Signal(16) + self.rw_i = Signal() + self.valid_i = Signal() + + self.data_o = Signal(8, reset=0) + self.start_o = Signal(1) + self.done_i = Signal() + + # Internal Signals + self.buffer = Signal(16, reset=0) + self.count = Signal(4, reset=0) + self.busy = Signal(1, reset=0) + self.to_ascii_hex = Signal(8) + self.n = Signal(4) + + def elaborate(self, platform): + m = Module() + + m.d.comb += self.start_o.eq(self.busy) + + with m.If(~self.busy): + with m.If((self.valid_i) & (~self.rw_i)): + m.d.sync += self.busy.eq(1) + m.d.sync += self.buffer.eq(self.data_i) + + with m.Else(): + # uart_tx is transmitting a byte: + with m.If(self.done_i): + m.d.sync += self.count.eq(self.count + 1) + + # Message has been transmitted + with m.If(self.count > 5): + m.d.sync += self.count.eq(0) + + # Go back to idle, or transmit next message + with m.If((self.valid_i) & (~self.rw_i)): + m.d.sync += self.buffer.eq(self.data_i) + + with m.Else(): + m.d.sync += self.busy.eq(0) + + # define to_ascii_hex + with m.If(self.n < 10): + m.d.comb += self.to_ascii_hex.eq(self.n + 0x30) + with m.Else(): + m.d.comb += self.to_ascii_hex.eq(self.n + 0x41 - 10) + + # run the sequence + with m.If(self.count == 0): + m.d.comb += self.n.eq(0) + m.d.comb += self.data_o.eq(ord("D")) + + with m.Elif(self.count == 1): + m.d.comb += self.n.eq(self.buffer[12:16]) + m.d.comb += self.data_o.eq(self.to_ascii_hex) + + with m.Elif(self.count == 2): + m.d.comb += self.n.eq(self.buffer[8:12]) + m.d.comb += self.data_o.eq(self.to_ascii_hex) + + with m.Elif(self.count == 3): + m.d.comb += self.n.eq(self.buffer[4:8]) + m.d.comb += self.data_o.eq(self.to_ascii_hex) + + with m.Elif(self.count == 4): + m.d.comb += self.n.eq(self.buffer[0:4]) + m.d.comb += self.data_o.eq(self.to_ascii_hex) + + with m.Elif(self.count == 5): + m.d.comb += self.n.eq(0) + m.d.comb += self.data_o.eq(ord("\r")) + + with m.Elif(self.count == 6): + m.d.comb += self.n.eq(0) + m.d.comb += self.data_o.eq(ord("\n")) + + with m.Else(): + m.d.comb += self.n.eq(0) + m.d.comb += self.data_o.eq(0) + + return m diff --git a/src/manta/uart_iface/__init__.py b/src/manta/uart_iface/__init__.py deleted file mode 100644 index 98f2ffc..0000000 --- a/src/manta/uart_iface/__init__.py +++ /dev/null @@ -1,186 +0,0 @@ -from ..utils import * - -class UARTInterface: - def __init__(self, config): - # Warn if unrecognized options have been given - for option in config: - if option not in ["port", "clock_freq", "baudrate", "chunk_size", "verbose"]: - print(f"Warning: Ignoring unrecognized option '{option}' in UART interface.") - - # Obtain port. Try to automatically detect port if "auto" is specified - assert "port" in config, "No serial port provided to UART core." - self.port = config["port"] - - # Check that clock frequency is provided and positive - assert "clock_freq" in config, "Clock frequency not provided to UART core." - assert config["clock_freq"] > 0, "Clock frequency must be positive." - self.clock_freq = config["clock_freq"] - - # Check that baudrate is provided and positive - assert "baudrate" in config, "Baudrate not provided to UART core." - assert config["baudrate"] > 0, "Baudrate must be positive." - self.baudrate = config["baudrate"] - - # Confirm core clock is sufficiently fast - clocks_per_baud = self.clock_freq // self.baudrate - assert clocks_per_baud >= 2 - self.clocks_per_baud = clocks_per_baud - - # Confirm we can match baudrate suffeciently well - actual_baudrate = self.clock_freq / clocks_per_baud - baudrate_error = 100 * abs(actual_baudrate - self.baudrate) / self.baudrate - assert baudrate_error <= 5, \ - "Unable to match target baudrate - they differ by {baudrate_error}%" - - # Set chunk_size, which is the max amount of bytes that get dumped - # to the OS driver at a time - self.chunk_size = 256 - if "chunk_size" in config: - self.chunk_size = config["chunk_size"] - - # Set verbosity - self.verbose = False - if "verbose" in config: - self.verbose = config["verbose"] - - def open_port_if_not_alredy_open(self): - if self.port == "auto": - self.port = self.autodetect_port() - - if not hasattr(self, "ser"): - import serial - self.ser = serial.Serial(self.port, self.baudrate) - - def autodetect_port(self): - # as far as I know the FT2232 is the only chip used on the icestick/digilent boards, so just look for that - import serial.tools.list_ports - - recognized_devices = [] - for port in serial.tools.list_ports.comports(): - if (port.vid == 0x403) and (port.pid == 0x6010): - recognized_devices.append(port) - - # board manufacturers seem to always make the 0th serial - # interface on the FT2232 be for programming over JTAG, - # and then the 1st to be for UART. as a result, we always - # grab the device with the larger location - - rd = recognized_devices - assert len(recognized_devices) == 2, f"Expected to see two serial ports for FT2232 device, but instead see {len(recognized_devices)}." - assert rd[0].serial_number == rd[1].serial_number, "Serial numbers should be the same on both FT2232 ports - probably somehow grabbed ports on two different devices." - return rd[0].device if rd[0].location > rd[1].location else rd[1].device - - def decode_response(self, response): - """Make sure reponse from FPGA has the correct format, and return data contained within if so.""" - assert response is not None, "No reponse received." - - response_str = response.decode('ascii') - assert response_str[0] == 'D', "Bad message recieved, incorrect preamble." - assert response_str[-2] == '\r', "Bad message received, incorrect EOL." - assert response_str[-1] == '\n', "Bad message received, incorrect EOL." - assert len(response_str) == 7, f"Wrong number of bytes received, expecting 7 but got {len(response)}." - - return int(response_str[1:5], 16) - - - def read(self, addr): - # Perform type checks, output list of addresses - if isinstance(addr, int): - addrs = [addr] - - elif isinstance(addr, list): - assert all(isinstance(a, int) for a in addr), \ - "Read addresses must be integer or list of integers." - addrs = addr - - else: - raise ValueError("Read addresses must be integer or list of integers.") - - # send data in chunks because the reponses will fill up the OS's - # input buffer in no time flat - self.open_port_if_not_alredy_open() - - inbound_bytes = b"" - for i in range(0, len(addrs), self.chunk_size): - addr_chunk = addrs[i:i+self.chunk_size] - - outbound_bytes = [f"R{addr:04X}\r\n".encode('ascii') for addr in addr_chunk] - outbound_bytes = b"".join(outbound_bytes) - - self.ser.write(outbound_bytes) - - inbound_bytes += self.ser.read(len(outbound_bytes)) - - data = [] - for i in range(0, len(inbound_bytes), 7): - response = inbound_bytes[i:i+7] - data.append(self.decode_response(response)) - - if isinstance(addr, int): - return data[0] - - else: - return data - - def write(self, addr, data): - # Perform type checks, output list of addresses - if isinstance(addr, int): - assert isinstance(data, int), \ - "Data must also be integer if address is integer." - addrs = [addr] - datas = [data] - - elif isinstance(addr, list): - assert all(isinstance(a, int) for a in addr), \ - "Write addresses must be integer or list of integers." - - assert all(isinstance(d, int) for d in data), \ - "Write data must be integer or list of integers." - - assert len(addr) == len(data), \ - "There must be equal number of write addresses and data." - - addrs = addr - datas = data - - else: - raise ValueError("Write addresses and data must be integer or list of integers.") - - # send data in chunks because the reponses will fill up the OS's - # input buffer in no time flat - self.open_port_if_not_alredy_open() - - for i in range(0, len(addrs), self.chunk_size): - addr_chunk = addrs[i:i+self.chunk_size] - data_chunk = datas[i:i+self.chunk_size] - - - outbound_bytes = [f"W{a:04X}{d:04X}\r\n" for a, d in zip(addr_chunk, data_chunk)] - outbound_bytes = [ob.encode('ascii') for ob in outbound_bytes] - outbound_bytes = b"".join(outbound_bytes) - - self.ser.write(outbound_bytes) - - def hdl_top_level_ports(self): - # this should return the probes that we want to connect to top-level, but like as a string of verilog - return ["input wire rx", "output reg tx"] - - def rx_hdl_def(self): - uart_rx_def = VerilogManipulator("uart_iface/uart_rx.v").get_hdl() - bridge_rx_def = VerilogManipulator("uart_iface/bridge_rx.v").get_hdl() - return uart_rx_def + '\n' + bridge_rx_def - - def tx_hdl_def(self): - uart_tx_def = VerilogManipulator("uart_iface/uart_tx.v").get_hdl() - bridge_tx_def = VerilogManipulator("uart_iface/bridge_tx.v").get_hdl() - return bridge_tx_def + '\n' + uart_tx_def - - def rx_hdl_inst(self): - rx = VerilogManipulator("uart_iface/uart_rx_bridge_rx_inst_tmpl.v") - rx.sub(self.clocks_per_baud, "/* CLOCKS_PER_BAUD */") - return rx.get_hdl() - - def tx_hdl_inst(self): - tx = VerilogManipulator("uart_iface/uart_tx_bridge_tx_inst_tmpl.v") - tx.sub(self.clocks_per_baud, "/* CLOCKS_PER_BAUD */") - return tx.get_hdl() \ No newline at end of file diff --git a/src/manta/uart_iface/bridge_rx.v b/src/manta/uart_iface/bridge_rx.v deleted file mode 100644 index 995b1ab..0000000 --- a/src/manta/uart_iface/bridge_rx.v +++ /dev/null @@ -1,150 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module bridge_rx ( - input wire clk, - - input wire [7:0] data_i, - input wire valid_i, - - output reg [15:0] addr_o, - output reg [15:0] data_o, - output reg rw_o, - output reg valid_o); - - initial addr_o = 0; - initial data_o = 0; - initial rw_o = 0; - initial valid_o = 0; - - function [3:0] from_ascii_hex; - // convert an ascii char encoding a hex value to - // the corresponding hex value - input [7:0] c; - - if ((c >= 8'h30) && (c <= 8'h39)) from_ascii_hex = c - 8'h30; - else if ((c >= 8'h41) && (c <= 8'h46)) from_ascii_hex = c - 8'h41 + 'd10; - else from_ascii_hex = 0; - endfunction - - function is_ascii_hex; - // checks if a byte is an ascii char encoding a hex digit - input [7:0] c; - - if ((c >= 8'h30) && (c <= 8'h39)) is_ascii_hex = 1; // 0-9 - else if ((c >= 8'h41) && (c <= 8'h46)) is_ascii_hex = 1; // A-F - else is_ascii_hex = 0; - endfunction - - reg [7:0] buffer [7:0]; // = 0; // todo: see if sby will tolerate packed arrays? - - localparam IDLE = 0; - localparam READ = 1; - localparam WRITE = 2; - reg [1:0] state = 0; - reg [3:0] byte_num = 0; - - always @(posedge clk) begin - addr_o <= 0; - data_o <= 0; - rw_o <= 0; - valid_o <= 0; - - if (state == IDLE) begin - byte_num <= 0; - if (valid_i) begin - if (data_i == "R") state <= READ; - if (data_i == "W") state <= WRITE; - end - end - - else begin - if (valid_i) begin - // buffer bytes regardless of if they're good - byte_num <= byte_num + 1; - buffer[byte_num] <= data_i; - - // current transaction specifies a read operation - if(state == READ) begin - - // go to idle if anything doesn't make sense - if(byte_num < 4) begin - if(!is_ascii_hex(data_i)) state <= IDLE; - end - - else if(byte_num == 4) begin - state <= IDLE; - - // put data on the bus if the last byte looks good - if((data_i == 8'h0D) || (data_i == 8'h0A)) begin - addr_o <= (from_ascii_hex(buffer[0]) << 12) | - (from_ascii_hex(buffer[1]) << 8) | - (from_ascii_hex(buffer[2]) << 4) | - (from_ascii_hex(buffer[3])); - data_o <= 0; - rw_o <= 0; - valid_o <= 1; - end - end - end - - // current transaction specifies a write transaction - if(state == WRITE) begin - - // go to idle if anything doesn't make sense - if(byte_num < 8) begin - if(!is_ascii_hex(data_i)) state <= IDLE; - end - - else if(byte_num == 8) begin - state <= IDLE; - - // put data on the bus if the last byte looks good - if((data_i == 8'h0A) || (data_i == 8'h0D)) begin - addr_o <= (from_ascii_hex(buffer[0]) << 12) | - (from_ascii_hex(buffer[1]) << 8) | - (from_ascii_hex(buffer[2]) << 4) | - (from_ascii_hex(buffer[3])); - data_o <= (from_ascii_hex(buffer[4]) << 12) | - (from_ascii_hex(buffer[5]) << 8) | - (from_ascii_hex(buffer[6]) << 4) | - (from_ascii_hex(buffer[7])); - rw_o <= 1; - valid_o <= 1; - end - end - end - end - end - end - -`ifdef FORMAL - always @(posedge clk) begin - // covers - find_any_write_transaction: cover(rw_o == 1); - find_any_read_transaction: cover(rw_o == 0); - - find_specific_write_transaction: - cover(data_o == 16'h1234 && addr_o == 16'h5678 && rw_o == 1 && valid_o == 1); - - find_specific_read_transaction: - cover(addr_o == 16'h1234 && rw_o == 0 && valid_o == 1); - - find_spacey_write_transaction: - cover((rw_o == 1) && ($past(valid_i, 3) == 0)); - - // asserts - no_back_to_back_transactions: - assert( ~(valid_o && $past(valid_o)) ); - - no_invalid_states: - assert(state == IDLE || state == READ || state == WRITE); - - byte_counter_only_increases: - assert(byte_num == $past(byte_num) || byte_num == $past(byte_num) + 1 || byte_num == 0); - end -`endif // FORMAL -endmodule - - -`default_nettype wire \ No newline at end of file diff --git a/src/manta/uart_iface/bridge_tx.v b/src/manta/uart_iface/bridge_tx.v deleted file mode 100644 index 70bbf0d..0000000 --- a/src/manta/uart_iface/bridge_tx.v +++ /dev/null @@ -1,70 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module bridge_tx ( - input wire clk, - - input wire [15:0] data_i, - input wire rw_i, - input wire valid_i, - - output reg [7:0] data_o, - output reg start_o, - input wire done_i); - - function [7:0] to_ascii_hex; - // convert a number from 0-15 into the corresponding ascii char - input [3:0] n; - to_ascii_hex = (n < 10) ? (n + 8'h30) : (n + 8'h41 - 'd10); - endfunction - - localparam PREAMBLE = "D"; - localparam CR = 8'h0D; - localparam LF = 8'h0A; - - reg busy = 0; - reg [15:0] buffer = 0; - reg [3:0] count = 0; - - assign start_o = busy; - - always @(posedge clk) begin - // idle until valid read transaction arrives on bus - if (!busy) begin - if (valid_i && !rw_i) begin - busy <= 1; - buffer <= data_i; - end - end - - if (busy) begin - // uart module is done transmitting a byte - if(done_i) begin - count <= count + 1; - - // message has been transmitted - if (count > 5) begin - count <= 0; - - // go back to idle or transmit next message - if (valid_i && !rw_i) buffer <= data_i; - else busy <= 0; - end - end - end - end - - always @(*) begin - case (count) - 0: data_o = PREAMBLE; - 1: data_o = to_ascii_hex(buffer[15:12]); - 2: data_o = to_ascii_hex(buffer[11:8]); - 3: data_o = to_ascii_hex(buffer[7:4]); - 4: data_o = to_ascii_hex(buffer[3:0]); - 5: data_o = CR; - 6: data_o = LF; - default: data_o = 0; - endcase - end -endmodule -`default_nettype wire \ No newline at end of file diff --git a/src/manta/uart_iface/uart_rx.v b/src/manta/uart_iface/uart_rx.v deleted file mode 100644 index a4e8abb..0000000 --- a/src/manta/uart_iface/uart_rx.v +++ /dev/null @@ -1,62 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -// Modified from Dan Gisselquist's rx_uart module, -// available at https://zipcpu.com/tutorial/ex-09-uartrx.zip - -module uart_rx ( - input wire clk, - - input wire rx, - - output reg [7:0] data_o, - output reg valid_o); - - parameter CLOCKS_PER_BAUD = 0; - localparam IDLE = 0; - localparam BIT_ZERO = 1; - localparam STOP_BIT = 9; - - reg [3:0] state = IDLE; - reg [15:0] baud_counter = 0; - reg zero_baud_counter; - assign zero_baud_counter = (baud_counter == 0); - - // 2FF Synchronizer - reg ck_uart = 1; - reg q_uart = 1; - always @(posedge clk) - { ck_uart, q_uart } <= { q_uart, rx }; - - always @(posedge clk) - if (state == IDLE) begin - state <= IDLE; - baud_counter <= 0; - if (!ck_uart) begin - state <= BIT_ZERO; - baud_counter <= CLOCKS_PER_BAUD+CLOCKS_PER_BAUD/2-1'b1; - end - end - - else if (zero_baud_counter) begin - state <= state + 1; - baud_counter <= CLOCKS_PER_BAUD-1'b1; - if (state == STOP_BIT) begin - state <= IDLE; - baud_counter <= 0; - end - end - - else baud_counter <= baud_counter - 1'b1; - - always @(posedge clk) - if ( (zero_baud_counter) && (state != STOP_BIT) ) - data_o <= {ck_uart, data_o[7:1]}; - - initial valid_o = 1'b0; - always @(posedge clk) - valid_o <= ( (zero_baud_counter) && (state == STOP_BIT) ); - -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/src/manta/uart_iface/uart_rx_bridge_rx_inst_tmpl.v b/src/manta/uart_iface/uart_rx_bridge_rx_inst_tmpl.v deleted file mode 100644 index 8ff8dec..0000000 --- a/src/manta/uart_iface/uart_rx_bridge_rx_inst_tmpl.v +++ /dev/null @@ -1,20 +0,0 @@ -uart_rx #(.CLOCKS_PER_BAUD(/* CLOCKS_PER_BAUD */)) urx ( - .clk(clk), - .rx(rx), - - .data_o(urx_brx_data), - .valid_o(urx_brx_valid)); - -reg [7:0] urx_brx_data; -reg urx_brx_valid; - -bridge_rx brx ( - .clk(clk), - - .data_i(urx_brx_data), - .valid_i(urx_brx_valid), - - .addr_o(), - .data_o(), - .rw_o(), - .valid_o()); \ No newline at end of file diff --git a/src/manta/uart_iface/uart_tx.v b/src/manta/uart_iface/uart_tx.v deleted file mode 100644 index ea249a7..0000000 --- a/src/manta/uart_iface/uart_tx.v +++ /dev/null @@ -1,61 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module uart_tx ( - input wire clk, - - input wire [7:0] data_i, - input wire start_i, - output reg done_o, - - output reg tx); - - // this module supports only 8N1 serial at a configurable baudrate - parameter CLOCKS_PER_BAUD = 0; - reg [$clog2(CLOCKS_PER_BAUD)-1:0] baud_counter = 0; - - reg [8:0] buffer = 0; - reg [3:0] bit_index = 0; - - initial done_o = 1; - initial tx = 1; - - always @(posedge clk) begin - if (start_i && done_o) begin - baud_counter <= CLOCKS_PER_BAUD - 1; - buffer <= {1'b1, data_i}; - bit_index <= 0; - done_o <= 0; - tx <= 0; - end - - else if (!done_o) begin - baud_counter <= baud_counter - 1; - done_o <= (baud_counter == 1) && (bit_index == 9); - - // a baud period has elapsed - if (baud_counter == 0) begin - baud_counter <= CLOCKS_PER_BAUD - 1; - - // clock out another bit if there are any left - if (bit_index < 9) begin - tx <= buffer[bit_index]; - bit_index <= bit_index + 1; - end - - // byte has been sent, send out next one or go to idle - else begin - if(start_i) begin - buffer <= {1'b1, data_i}; - bit_index <= 0; - tx <= 0; - end - - else done_o <= 1; - end - end - end - end -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/src/manta/uart_iface/uart_tx_bridge_tx_inst_tmpl.v b/src/manta/uart_iface/uart_tx_bridge_tx_inst_tmpl.v deleted file mode 100644 index bfe68b6..0000000 --- a/src/manta/uart_iface/uart_tx_bridge_tx_inst_tmpl.v +++ /dev/null @@ -1,23 +0,0 @@ -bridge_tx btx ( - .clk(clk), - - .data_i(), - .rw_i(), - .valid_i(), - - .data_o(btx_utx_data), - .start_o(btx_utx_start), - .done_i(utx_btx_done)); - -reg [7:0] btx_utx_data; -reg btx_utx_start; -reg utx_btx_done; - -uart_tx #(.CLOCKS_PER_BAUD(/* CLOCKS_PER_BAUD */)) utx ( - .clk(clk), - - .data_i(btx_utx_data), - .start_i(btx_utx_start), - .done_o(utx_btx_done), - - .tx(tx)); \ No newline at end of file diff --git a/src/manta/utils.py b/src/manta/utils.py index 67decc5..a40fa0a 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -1,124 +1,129 @@ -import pkgutil +from amaranth.sim import Simulator from math import ceil +import os -def pack_16bit_words(data): - """Takes a list of integers, interprets them as 16-bit integers, and - concatenates them together in little-endian order.""" + +def words_to_value(data): + """ + Takes a list of integers, interprets them as 16-bit integers, and + concatenates them together in little-endian order. + """ for d in data: - if d > 0: assert d < 2**16, "Unsigned integer too large." - if d < 0: assert d < 2**15, "Signed integer too large." + if d > 0 and d > 2**16 - 1: + raise ValueError("Unsigned integer too large.") - return int(''.join([f'{i:016b}' for i in data[::-1]]), 2) + if d < 0 and d < -(2**15 - 1): + raise ValueError("Signed integer too large.") -def unpack_16bit_words(data, n_words): - """Takes a integer, interprets it as a set of 16-bit integers - concatenated together, and splits it into a list of 16-bit numbers""" + return int("".join([f"{i:016b}" for i in data[::-1]]), 2) - assert isinstance(data, int), "Behavior is only defined for nonnegative integers." - assert data >= 0, "Behavior is only defined for nonnegative integers." + +def value_to_words(data, n_words): + """ + Takes a integer, interprets it as a set of 16-bit integers + concatenated together, and splits it into a list of 16-bit numbers. + """ + + if not isinstance(data, int) or data < 0: + raise ValueError("Behavior is only defined for nonnegative integers.") # convert to binary, split into 16-bit chunks, and then convert back to list of int - binary = f'{data:0b}'.zfill(n_words * 16) - return [int(binary[i:i+16], 2) for i in range(0, 16 * n_words, 16)][::-1] - -class VerilogManipulator: - def __init__(self, filepath=None): - if filepath is not None: - self.hdl = pkgutil.get_data(__name__, filepath).decode() - - # scrub any default_nettype or timescale directives from the source - self.hdl = self.hdl.replace("`default_nettype none", "") - self.hdl = self.hdl.replace("`default_nettype wire", "") - self.hdl = self.hdl.replace("`timescale 1ns/1ps", "") - self.hdl = self.hdl.strip() - - # python tries to be cute and automatically convert - # line endings on Windows, but Manta's source comes - # with (and injects) UNIX line endings, so Python - # ends up adding way too many line breaks, so we just - # undo anything it's done when we load the file - self.hdl = self.hdl.replace("\r\n", "\n") - - else: - self.hdl = None - - def sub(self, replace, find): - # sometimes we have integer inputs, want to accomodate - if isinstance(replace, str): - replace_str = replace - - elif isinstance(replace, int): - replace_str = str(replace) - - else: - raise ValueError("Only string and integer arguments supported.") + binary = f"{data:0b}".zfill(n_words * 16) + return [int(binary[i : i + 16], 2) for i in range(0, 16 * n_words, 16)][::-1] - # if the string being subbed in isn't multiline, just - # find-and-replace like normal: - if "\n" not in replace_str: - self.hdl = self.hdl.replace(find, replace_str) +def split_into_chunks(data, chunk_size): + """ + Split a list into a list of lists, where each sublist has length `chunk_size`. + If the list can't be evenly divided into chunks, then the last entry in the + returned list will have length less than `chunk_size`. + """ - # if the string being substituted in is multiline, - # make sure the replace text gets put at the same - # indentation level by adding whitespace to left - # of the line. - else: - for line in self.hdl.split("\n"): - if find in line: - # get whitespace that's on the left side of the line - whitespace = line.rstrip().replace(line.lstrip(), "") - - # add it to every line, except the first - replace_as_lines = replace_str.split("\n") - replace_with_whitespace = f"\n{whitespace}".join(replace_as_lines) - - # replace the first occurance in the HDL with it - self.hdl = self.hdl.replace(find, replace_with_whitespace, 1) - - def get_hdl(self): - return self.hdl - - def net_dec(self, nets, net_type, trailing_comma = False): - """Takes a dictonary of nets in the format {probe: width}, and generates - the net declarations that would go in a Verilog module definition. - - For example, calling net_dec({foo : 1, bar : 4}, "input wire") would produce: - - input wire foo, - input [3:0] wire bar - - Which you'd then slap into your module declaration, along with all the other - inputs and outputs the module needs.""" - - dec = [] - for name, width in nets.items(): - if width == 1: - dec.append(f"{net_type} {name}") - - else: - dec.append(f"{net_type} [{width-1}:0] {name}") - - dec = ",\n".join(dec) - dec = dec + "," if trailing_comma else dec - return dec - - def net_conn(self, nets, trailing_comma = False): - """Takes a dictionary of nets in the format {probe: width}, and generates - the net connections that would go in the Verilog module instantiation. - - For example, calling net_conn({foo: 1, bar: 4}) would produce: - - .foo(foo), - .bar(bar) - - Which you'd then slap into your module instantiation, along with all the other - module inputs and outputs that get connected elsewhere.""" + return [data[i : i + chunk_size] for i in range(0, len(data), chunk_size)] - conn = [f".{name}({name})" for name in nets] - conn = ",\n".join(conn) - conn = conn + "," if trailing_comma else conn +def simulate(top, testbench, vcd_path=None): + """ + Run a behavior simulation using Amaranth's built-in simulator `pysim`. Takes + the top-level module to simulate, the testbench process to run, and an optional + path to export a VCD file to. + """ + sim = Simulator(top) + sim.add_clock(1e-6) # 1 MHz + sim.add_sync_process(testbench) - return conn + if vcd_path is None: + sim.run() + + else: + with sim.write_vcd(vcd_path): + sim.run() + + +def verify_register(module, addr, expected_data): + """ + Read the contents of a register out over a module's bus connection, and verify + that it contains the expected data. + + Unfortunately because Amaranth uses generator functions to define processes, + this must be a generator function and thus cannot return a value - it must + yield the next timestep. This means that the comparision with the expected + value must occur inside this function and not somewhere else, it's not + possible to return a value from here, and compare it in the calling function. + """ + + # place read transaction on the bus + yield module.addr_i.eq(addr) + yield module.data_i.eq(0) + yield module.rw_i.eq(0) + yield module.valid_i.eq(1) + yield + yield module.addr_i.eq(0) + yield module.valid_i.eq(0) + + # wait for output to be valid + while not (yield module.valid_o): + yield + + # compare returned value with expected + data = yield (module.data_o) + if data != expected_data: + raise ValueError(f"Read from {addr} yielded {data} instead of {expected_data}") + + +def write_register(module, addr, data): + """ + Write to a register over a module's bus connection, placing the contents of `data` + at `addr`. + """ + + yield module.addr_i.eq(addr) + yield module.data_i.eq(data) + yield module.rw_i.eq(1) + yield module.valid_i.eq(1) + yield + yield module.valid_i.eq(0) + yield + + +def xilinx_tools_installed(): + """ + Return whether Vivado is installed, by checking if the VIVADO environment variable is set. + + This variable should point to the binary itself, not just the folder it's located in + (ie, /tools/Xilinx/Vivado/2023.1/bin/vivado, not /tools/Xilinx/Vivado/2023.1/bin) + """ + return "VIVADO" in os.environ + + +def ice40_tools_installed(): + """ + Return whether the ice40 tools are installed, by checking if the YOSYS, NEXTPNR_ICE40, + ICEPACK, and ICEPROG environment variables are defined. + + # These variables should point to the binaries themselves, not just the folder it's located in + # (ie, /tools/oss-cad-suite/bin/yosys, not /tools/oss-cad-suite/bin/) + """ + tools = ["YOSYS", "NEXTPNR_ICE40", "ICEPACK", "ICEPROG"] + return all(tool in os.environ for tool in tools) diff --git a/test/auto_gen/invalid_configs/0_mangled_yaml.yaml b/test/auto_gen/invalid_configs/0_mangled_yaml.yaml deleted file mode 100644 index 866e678..0000000 --- a/test/auto_gen/invalid_configs/0_mangled_yaml.yaml +++ /dev/null @@ -1,26 +0,0 @@ ---- -cores: - my_io_core: - type: io - - inputs: - btnu: 1 - btnd: 1 - btnl: Q - btnr: 1 - btnc: 1 - sw: 16 - - outputs: - led: 16 - led16_b: 1 - led16_g: 1 - led16_r: 1 - led17_b: 1 - led17_g: 1 - led17_r: 1 - -uart: - port: "auto" - baudrate: 115200 - clock_freq: 100000000 \ No newline at end of file diff --git a/test/auto_gen/invalid_configs/1_mangled_yaml.yaml b/test/auto_gen/invalid_configs/1_mangled_yaml.yaml deleted file mode 100644 index c786cdb..0000000 --- a/test/auto_gen/invalid_configs/1_mangled_yaml.yaml +++ /dev/null @@ -1,26 +0,0 @@ ---- -cores: - my_io_core: - type: io - - inputs: - btnu: 1 - btnd: 1 - btnl: 1 - btnr: 1 - btnc: - sw: 16 - - outputs: - led: 16 - led16_b: 1 - led16_g: 1 - led16_r: 1 - led17_b: 1 - led17_g: 1 - led17_r: 1 - -uart: - port: "auto" - baudrate: 115200 - clock_freq: 100000000 \ No newline at end of file diff --git a/test/auto_gen/invalid_configs/2_mangled_yaml.yaml b/test/auto_gen/invalid_configs/2_mangled_yaml.yaml deleted file mode 100644 index 9386d37..0000000 --- a/test/auto_gen/invalid_configs/2_mangled_yaml.yaml +++ /dev/null @@ -1,26 +0,0 @@ ---- -cores: - my_io_core: - type: io - - inputs: - btnu: 1 - btnd: 1 - btnl: 1 - btnr: 1 - btnc: randomstringthatsnotaninteger - sw: 16 - - outputs: - led: 16 - led16_b: 1 - led16_g: 1 - led16_r: 1 - led17_b: 1 - led17_g: 1 - led17_r: 1 - -uart: - port: "auto" - baudrate: 115200 - clock_freq: 100000000 \ No newline at end of file diff --git a/test/auto_gen/run_tests.py b/test/auto_gen/run_tests.py deleted file mode 100644 index 3e5ec4c..0000000 --- a/test/auto_gen/run_tests.py +++ /dev/null @@ -1,56 +0,0 @@ -# try to build manta instances from valid and invalid configuration files - -from os import listdir -from os.path import isfile -from manta import Manta - - -# Valid Configurations - -# test that they make a python API without errors -# TODO: test that their verilog passes lint - -print(" ==== Testing valid configurations ====") -valid_configs_path = "test/auto_gen/valid_configs/" -for config_file in sorted(listdir(valid_configs_path)): - caught_exception = None - try: - m = Manta(valid_configs_path + config_file) - - except Exception as e: - caught_exception = e - - if caught_exception is None: - print(f" -> no exceptions correctly raised by config file {config_file}") - - else: - raise RuntimeError( - f"Configuration {config_file} shouldn't have raised an exception, but raised {caught_exception}" - ) - - -print("\n") - -# Invalid Configurations - -# test that they throw errors when generating a python API - -print(" ==== Testing invalid configurations ====") -invalid_configs_path = "test/auto_gen/invalid_configs/" -for config_file in sorted(listdir(invalid_configs_path)): - caught_exception = None - try: - m = Manta(invalid_configs_path + config_file) - - except Exception as e: - caught_exception = e - - if caught_exception is not None: - print( - f" -> exception correctly raised by config file {config_file}: {caught_exception}" - ) - - else: - raise RuntimeError( - f"Configuration {config_file} should have raised an exception, but did not!" - ) diff --git a/test/auto_gen/valid_configs/0_io_core.yaml b/test/auto_gen/valid_configs/0_io_core.yaml deleted file mode 100644 index 867efbe..0000000 --- a/test/auto_gen/valid_configs/0_io_core.yaml +++ /dev/null @@ -1,26 +0,0 @@ ---- -cores: - my_io_core: - type: io - - inputs: - btnu: 1 - btnd: 1 - btnl: 1 - btnr: 1 - btnc: 1 - sw: 16 - - outputs: - led: 16 - led16_b: 1 - led16_g: 1 - led16_r: 1 - led17_b: 1 - led17_g: 1 - led17_r: 1 - -uart: - port: "auto" - baudrate: 115200 - clock_freq: 100000000 \ No newline at end of file diff --git a/test/auto_gen/valid_configs/1_logic_analyzer.yaml b/test/auto_gen/valid_configs/1_logic_analyzer.yaml deleted file mode 100644 index 107efa8..0000000 --- a/test/auto_gen/valid_configs/1_logic_analyzer.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- -cores: - my_logic_analyzer: - type: logic_analyzer - sample_depth: 4096 - - probes: - larry: 1 - curly: 1 - moe: 1 - shemp: 4 - - triggers: - - larry && curly && ~moe - -uart: - port: "auto" - baudrate: 115200 - clock_freq: 100000000 \ No newline at end of file diff --git a/test/formal_verification/bridge_rx.sby b/test/formal_verification/bridge_rx.sby deleted file mode 100644 index 93a9ed9..0000000 --- a/test/formal_verification/bridge_rx.sby +++ /dev/null @@ -1,29 +0,0 @@ -[tasks] -basic bmc -nofullskip prove -cover -noverific cover -basic cover : default - -[options] -cover: -mode cover --- -prove: -mode prove --- -bmc: -mode bmc --- - -[engines] -smtbmc boolector - -[script] -nofullskip: read -define NO_FULL_SKIP=1 -noverific: read -noverific -read -formal bridge_rx.v -prep -top bridge_rx - -[files] -src/manta/uart_iface/bridge_rx.v \ No newline at end of file diff --git a/test/functional_sim/block_memory_tb.sv b/test/functional_sim/block_memory_tb.sv deleted file mode 100644 index 818ca3b..0000000 --- a/test/functional_sim/block_memory_tb.sv +++ /dev/null @@ -1,182 +0,0 @@ -`default_nettype none - -`define CP 10 -`define HCP 5 - -`define BRAM_DEPTH 256 -`define BRAM_WIDTH 33 -`define ADDR_WIDTH $clog2(`BRAM_DEPTH) - -task read_reg_bus_side ( - input [15:0] addr, - output [15:0] data - ); - - block_memory_tb.tb_bc_addr = addr; - block_memory_tb.tb_bc_rw = 0; - block_memory_tb.tb_bc_valid = 1; - #`CP - block_memory_tb.tb_bc_rw = 0; - block_memory_tb.tb_bc_valid = 0; - while (!block_memory_tb.bc_tb_valid) #`CP; - data = block_memory_tb.bc_tb_data; - - $display(" -> bus read 0x%h from addr 0x%h", data, addr); -endtask - -task write_reg_bus_side( - input [15:0] addr, - input [15:0] data - ); - - block_memory_tb.tb_bc_addr = addr; - block_memory_tb.tb_bc_data = data; - block_memory_tb.tb_bc_rw = 1; - block_memory_tb.tb_bc_valid = 1; - #`CP - block_memory_tb.tb_bc_rw = 0; - block_memory_tb.tb_bc_valid = 0; - while (!block_memory_tb.bc_tb_valid) #`CP; - - $display(" -> bus wrote 0x%h to addr 0x%h", data, addr); -endtask - -task write_and_verify_bus_side( - input [15:0] addr, - input [15:0] write_data - ); - - reg [15:0] read_data; - - write_reg_bus_side(addr, write_data); - read_reg_bus_side(addr, read_data); - assert(read_data == write_data) else $fatal(0, "data read does not match data written!"); -endtask - -task read_user_side( - input [`ADDR_WIDTH-1:0] addr - ); - - block_memory_tb.bram_user_we = 0; - block_memory_tb.bram_user_addr = addr; - #(2*`CP); - $display("user read 0x%h from addr 0x%h", block_memory_tb.bram_user_dout, addr); -endtask - -task write_user_side( - input [`ADDR_WIDTH-1:0] addr, - input [`BRAM_WIDTH-1:0] data - ); - - block_memory_tb.bram_user_we = 1; - block_memory_tb.bram_user_addr = addr; - block_memory_tb.bram_user_din = data; - #(2*`CP); - $display("user wrote 0x%h to addr 0x%h", data, addr); -endtask - - -module block_memory_tb; - - // boilerplate - logic clk; - integer test_num; - reg [15:0] read_value; - - // tb -> bram_core bus - logic [15:0] tb_bc_addr; - logic [15:0] tb_bc_data; - logic tb_bc_rw; - logic tb_bc_valid; - - // bram_core -> tb bus - logic [15:0] bc_tb_addr; - logic [15:0] bc_tb_data; - logic bc_tb_rw; - logic bc_tb_valid; - - // bram itself - localparam BRAM_DEPTH = `BRAM_DEPTH; - localparam BRAM_WIDTH = `BRAM_WIDTH; - localparam ADDR_WIDTH = $clog2(BRAM_DEPTH); - logic [ADDR_WIDTH-1:0] bram_user_addr = 0; - logic [BRAM_WIDTH-1:0] bram_user_din = 0; - logic [BRAM_WIDTH-1:0] bram_user_dout; - logic bram_user_we = 0; - - block_memory #(.DEPTH(BRAM_DEPTH), .WIDTH(BRAM_WIDTH)) block_mem ( - .clk(clk), - - .addr_i(tb_bc_addr), - .data_i(tb_bc_data), - .rw_i(tb_bc_rw), - .valid_i(tb_bc_valid), - - .addr_o(bc_tb_addr), - .data_o(bc_tb_data), - .rw_o(bc_tb_rw), - .valid_o(bc_tb_valid), - - .user_clk(clk), - .user_addr(bram_user_addr), - .user_din(bram_user_din), - .user_dout(bram_user_dout), - .user_we(bram_user_we)); - - always begin - #`HCP - clk = !clk; - end - - initial begin - $dumpfile("block_memory_tb.vcd"); - $dumpvars(0, block_memory_tb); - - // setup and reset - clk = 0; - test_num = 0; - - tb_bc_addr = 0; - tb_bc_data = 0; - tb_bc_rw = 0; - tb_bc_valid = 0; - - bram_user_addr = 0; - bram_user_din = 0; - bram_user_we = 0; - - #`HCP - - - - #(10*`CP); - - /* ==== Test 1 Begin ==== */ - $display("\n=== test 1: read/write from BRAM, verify ==="); - test_num = 1; - write_and_verify_bus_side(0, 'h6789); - write_and_verify_bus_side(1, 'h2345); - write_and_verify_bus_side(2, 'h0001); - - // now query what's on the the user side at address 0 - read_user_side(0); - - write_and_verify_bus_side(3, 'h1111); - write_and_verify_bus_side(4, 'h1111); - write_and_verify_bus_side(5, 'h0001); - - // now query what's on the the user side at address 0 - read_user_side(1); - - write_user_side(1, 0); - read_user_side(1); - - #(10*`CP); - - /* ==== Test 1 End ==== */ - - $finish(); - end -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/test/functional_sim/bridge_rx_tb.sv b/test/functional_sim/bridge_rx_tb.sv deleted file mode 100644 index 78b4049..0000000 --- a/test/functional_sim/bridge_rx_tb.sv +++ /dev/null @@ -1,185 +0,0 @@ -`default_nettype none -// `timescale 1ns/1ps - -`define CP 10 -`define HCP 5 - -task test_good_read_msg ( - input string message, - input [15:0] addr - ); - - bridge_rx_tb.tb_brx_valid = 1; - for(int i=0; i < $size(message); i++) begin - bridge_rx_tb.tb_brx_data = message [i]; - if(bridge_rx_tb.brx_tb_valid) begin - assert(bridge_rx_tb.brx_tb_addr == addr) else $fatal(0, "wrong addr!"); - assert(bridge_rx_tb.brx_tb_rw == 0) else $fatal(0, "wrong rw!"); - assert(bridge_rx_tb.brx_tb_data == 0) else $fatal(0, "wrong data!"); - end - #`CP; - end - bridge_rx_tb.tb_brx_valid = 0; -endtask - -task test_good_write_msg ( - input string message, - input [15:0] addr, - input [15:0] data - ); - - bridge_rx_tb.tb_brx_valid = 1; - for(int i=0; i < $size(message); i++) begin - bridge_rx_tb.tb_brx_data = message[i]; - if(bridge_rx_tb.brx_tb_valid) begin - assert(bridge_rx_tb.brx_tb_addr == addr) else $fatal(0, "wrong addr!"); - assert(bridge_rx_tb.brx_tb_rw == 1) else $fatal(0, "wrong rw!"); - assert(bridge_rx_tb.brx_tb_data == data) else $fatal(0, "wrong data!"); - end - #`CP; - end - bridge_rx_tb.tb_brx_valid = 0; -endtask - -task test_bad_msg ( - input string message - ); - - bridge_rx_tb.tb_brx_valid = 1; - for(int i=0; i < $size(message); i++) begin - bridge_rx_tb.tb_brx_data = message[i]; - assert(bridge_rx_tb.brx_tb_valid == 0) else $fatal(0, "wrong valid!"); - #`CP; - end - bridge_rx_tb.tb_brx_valid = 0; -endtask - - -module bridge_rx_tb; -// https://www.youtube.com/watch?v=WCOAr-96bGc - -//boilerplate -logic clk; -integer test_num; - -// uart inputs and outputs -logic [7:0] tb_brx_data; -logic tb_brx_valid; - -logic [15:0] brx_tb_addr; -logic [15:0] brx_tb_data; -logic brx_tb_rw; -logic brx_tb_valid; - -bridge_rx bridge_rx_uut( - .clk(clk), - - .data_i(tb_brx_data), - .valid_i(tb_brx_valid), - - .addr_o(brx_tb_addr), - .data_o(brx_tb_data), - .rw_o(brx_tb_rw), - .valid_o(brx_tb_valid)); - -always begin - #`HCP - clk = !clk; -end - -initial begin - $dumpfile("bridge_rx.vcd"); - $dumpvars(0, bridge_rx_tb); - - // setup and reset - clk = 0; - tb_brx_data = 0; - tb_brx_valid = 0; - test_num = 0; - #`CP - #`HCP - - test_num = test_num + 1; - $display("\n=== test %2d: transmit W12345678(CR)(LF) for baseline functionality ===", test_num); - test_good_write_msg("W12345678\r\n", 16'h1234, 16'h5678); - #(10*`CP); - - test_num = test_num + 1; - $display("\n=== test %2d: transmit WDEADBEEF(CR)(LF) for proper state reset ===", test_num); - test_good_write_msg("WDEADBEEF\r\n", 16'hDEAD, 16'hBEEF); - #(10*`CP); - - test_num = test_num + 1; - $display("\n=== test %2d: transmit RBABE(CR)(LF) for baseline functionality ===", test_num); - test_good_read_msg("RBABE\r\n", 16'hBABE); - #(10*`CP); - - test_num = test_num + 1; - $display("\n=== test %2d: transmit R0000(CR) for EOL insensitivity ===", test_num); - test_good_read_msg("R0000\r", 16'hBABE); - #(10*`CP); - - test_num = test_num + 1; - $display("\n=== test %2d: transmit R1234(LF) for EOL insensitivity ===", test_num); - test_good_read_msg("R1234\n", 16'h1234); - #(10*`CP); - - test_num = test_num + 1; - $display("\n=== test %2d: transmit WF00DBEEF(CR) for EOL insensitivity ===", test_num); - test_good_write_msg("WF00DBEEF\r", 16'hF00D, 16'hBEEF); - #(10*`CP); - - test_num = test_num + 1; - $display("\n=== test %2d: transmit WB0BACAFE(LF) for EOL insensitivity ===", test_num); - test_good_write_msg("WB0BACAFE\r", 16'hB0BA, 16'hCAFE); - #(10*`CP); - - test_num = test_num + 1; - $display("\n=== test %2d: transmit R1234(LF)R5678 for back-to-back messages ===", test_num); - test_good_read_msg("R1234\r\n", 16'h1234); - test_good_read_msg("R5678\r\n", 16'h5678); - #(10*`CP); - - $display("\n\nIntentionally bad messages:"); - - test_num = test_num + 1; - $display("\n=== test %2d: transmit RABC(CR)(LF) for message length ===", test_num); - test_bad_msg("RABC\r\n"); - #(10*`CP); - - test_num = test_num + 1; - $display("\n=== test %2d: transmit R12345(CR)(LF) for message length ===", test_num); - test_bad_msg("R12345\r\n"); - #(10*`CP); - - test_num = test_num + 1; - $display("\n=== test %2d: transmit M(CR)(LF) for message length ===", test_num); - test_bad_msg("WABC\r\n"); - #(10*`CP); - - test_num = test_num + 1; - $display("\n=== test %2d: transmit W123456789101112131415161718191201222(CR)(LF) for message length ===", test_num); - test_bad_msg("W123456789101112131415161718191201222\r\n"); - #(10*`CP); - - test_num = test_num + 1; - $display("\n=== test %2d: transmit RABCG(CR)(LF) for invalid characters ===", test_num); - test_bad_msg("RABCG\r\n"); - #(10*`CP); - - test_num = test_num + 1; - $display("\n=== test %2d: transmit WABC[]()##*@(CR)(LF) for invalid characters and message length ===", test_num); - test_bad_msg("WABC[]()##*@\r\n"); - #(10*`CP); - - test_num = test_num + 1; - $display("\n=== test %2d: transmit R(CR)(LF) for message length ===", test_num); - test_bad_msg("R\r\n"); - #(10*`CP); - - $finish(); -end - - -endmodule -`default_nettype wire \ No newline at end of file diff --git a/test/functional_sim/bridge_tx_tb.sv b/test/functional_sim/bridge_tx_tb.sv deleted file mode 100644 index b55e6d2..0000000 --- a/test/functional_sim/bridge_tx_tb.sv +++ /dev/null @@ -1,116 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -`define CP 10 -`define HCP 5 - -module bridge_tx_tb; -// https://www.youtube.com/watch?v=WCOAr-96bGc - -// boilerplate -logic clk; -integer test_num; - -// tb -> bridge_tx signals -logic [15:0] tb_btx_data; -logic tb_btx_valid; - -// uart_tx -> tb signals -logic utx_tb_tx; - -bridge_tx btx ( - .clk(clk), - - .data_i(tb_btx_data), - .rw_i(1'b0), - .valid_i(tb_btx_valid), - - .data_o(btx_utx_data), - .start_o(btx_utx_start), - .done_i(utx_btx_done)); - -reg [7:0] btx_utx_data; -reg btx_utx_start; -reg utx_btx_done; - -uart_tx #(.CLOCKS_PER_BAUD(10)) utx ( - .clk(clk), - - .data_i(btx_utx_data), - .start_i(btx_utx_start), - .done_o(utx_btx_done), - - .tx(utx_tb_tx)); - -always begin - #`HCP - clk = !clk; -end - -initial begin - $dumpfile("bridge_tx.vcd"); - $dumpvars(0, bridge_tx_tb); - - // setup and reset - clk = 0; - test_num = 0; - - tb_btx_valid = 0; - tb_btx_data = 0; - #(10*`CP); - - /* ==== Test 1 Begin ==== */ - $display("\n=== test 1: receive 0x0123 for baseline functionality ==="); - test_num = 1; - tb_btx_data = 16'h0123; - tb_btx_valid = 1; - - #`CP; - tb_btx_valid = 0; - - #(100000*`CP); - /* ==== Test 1 End ==== */ - - /* ==== Test 2 Begin ==== */ - $display("\n=== test 2: receive 0x4567 for baseline functionality ==="); - test_num = 2; - tb_btx_data = 16'h4567; - tb_btx_valid = 1; - - #`CP; - tb_btx_valid = 0; - - #(100000*`CP); - /* ==== Test 2 End ==== */ - - /* ==== Test 3 Begin ==== */ - $display("\n=== test 3: receive 0x89AB for baseline functionality ==="); - test_num = 3; - tb_btx_data = 16'h89AB; - tb_btx_valid = 1; - - #`CP; - tb_btx_valid = 0; - - #(100000*`CP); - /* ==== Test 3 End ==== */ - - /* ==== Test 4 Begin ==== */ - $display("\n=== test 4: receive 0xCDEF for baseline functionality ==="); - test_num = 4; - tb_btx_data = 16'hCDEF; - tb_btx_valid = 1; - - #`CP; - tb_btx_valid = 0; - - #(100000*`CP); - /* ==== Test 4 End ==== */ - - $finish(); -end - - -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/test/functional_sim/ethernet_rx_tb.sv b/test/functional_sim/ethernet_rx_tb.sv deleted file mode 100644 index 89ee8d4..0000000 --- a/test/functional_sim/ethernet_rx_tb.sv +++ /dev/null @@ -1,98 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -`define FPGA_MAC 48'h69_69_5A_06_54_91 -`define HOST_MAC 48'h00_E0_4C_68_1E_0C -`define ETHERTYPE 16'h88_B5 - -module ethernet_rx_tb(); - - // https://www.youtube.com/watch?v=K35qOTQLNpA - logic clk; - - always begin - #5; - clk = !clk; - end - - logic crsdv; - logic [1:0] rxd; - - logic txen; - logic [1:0] txd; - - logic [39:0] mtx_payload; - logic mtx_start; - - mac_tx #( - .SRC_MAC(`HOST_MAC), - .DST_MAC(`FPGA_MAC), - .ETHERTYPE(`ETHERTYPE), - .PAYLOAD_LENGTH_BYTES(5) - ) mtx ( - .clk(clk), - - .payload(mtx_payload), - .start(mtx_start), - - .txen(txen), - .txd(txd)); - - assign rxd = txd; - assign crsdv = txen; - - logic [15:0] erx_addr; - logic [15:0] erx_data; - logic erx_rw; - logic erx_valid; - - ethernet_rx #( - .FPGA_MAC(`FPGA_MAC), - .ETHERTYPE(`ETHERTYPE) - ) erx ( - .clk(clk), - - .crsdv(crsdv), - .rxd(rxd), - - .addr_o(erx_addr), - .data_o(erx_data), - .rw_o(erx_rw), - .valid_o(erx_valid)); - - initial begin - $dumpfile("ethernet_rx_tb.vcd"); - $dumpvars(0, ethernet_rx_tb); - clk = 0; - mtx_payload = 0; - mtx_start = 0; - #50; - - // try to send a read request to the bus: - mtx_payload = 40'h01_0002_0001; - mtx_start = 1; - #10; - mtx_start = 0; - #10000; - - - - - // for (int i=0; i<32; i=i+1) begin - // mtx_payload = i; - // mtx_start = 0; - // #10; - // mtx_start = 1; - // #10; - // mtx_start = 0; - // while(!mrx_valid) #10; - - // #1000; - - // assert(mrx_payload == i) else $fatal(0, "data mismatch!"); - // end - $finish(); - end - -endmodule -`default_nettype wire \ No newline at end of file diff --git a/test/functional_sim/ethernet_tx_tb.sv b/test/functional_sim/ethernet_tx_tb.sv deleted file mode 100644 index 0146753..0000000 --- a/test/functional_sim/ethernet_tx_tb.sv +++ /dev/null @@ -1,121 +0,0 @@ -`default_nettype none -//`timescale 1ns/1ps - -`define FPGA_MAC 48'h69_69_5A_06_54_91 -`define HOST_MAC 48'h00_E0_4C_68_1E_0C -`define ETHERTYPE 16'h88_B5 - -task send_on_etx_receive_on_mrx ( - input [15:0] data - ); - - ethernet_tx_tb.etx_data = data; - ethernet_tx_tb.etx_rw = 0; - ethernet_tx_tb.etx_valid = 0; - #10; - ethernet_tx_tb.etx_valid = 1; - #10; - ethernet_tx_tb.etx_valid = 0; - - while(!ethernet_tx_tb.mrx_valid) #10; - - $display(ethernet_tx_tb.mrx_payload); -endtask - -module ethernet_tx_tb(); - - // https://www.youtube.com/watch?v=K35qOTQLNpA - logic clk; - - always begin - #5; - clk = !clk; - end - - logic txen; - logic [1:0] txd; - - // ethernet tx - reg [15:0] etx_data; - reg etx_rw; - reg etx_valid; - - ethernet_tx #( - .FPGA_MAC(`FPGA_MAC), - .HOST_MAC(`HOST_MAC), - .ETHERTYPE(`ETHERTYPE) - ) etx ( - .clk(clk), - - .data_i(etx_data), - .rw_i(etx_rw), - .valid_i(etx_valid), - - .txen(txen), - .txd(txd)); - - // mac_rx, for decoding - logic crsdv; - logic [1:0] rxd; - - reg [55:0] mrx_payload; - reg mrx_valid; - - mac_rx #( - // this is the host mac since we're using mac_rx to impersonate - // the host computer, to which packets are currently addressed. - - .FPGA_MAC(`HOST_MAC), - .ETHERTYPE(`ETHERTYPE) - ) mrx ( - .clk(clk), - - .crsdv(crsdv), - .rxd(rxd), - - .payload(mrx_payload), - .valid(mrx_valid)); - - logic [15:0] where_ethertype_should_be; - logic [7:0] where_rw_should_be; - logic [15:0] where_addr_should_be; - logic [15:0] where_data_should_be; - assign {where_ethertype_should_be, where_rw_should_be, where_addr_should_be, where_data_should_be} = mrx_payload; - - assign rxd = txd; - assign crsdv = txen; - - initial begin - $dumpfile("ethernet_tx_tb.vcd"); - $dumpvars(0, ethernet_tx_tb); - clk = 0; - etx_data = 16'h6970; - etx_rw = 0; - etx_valid = 0; - #50; - - send_on_etx_receive_on_mrx(16'h6970); - - #10000; - - - - - // for (int i=0; i<32; i=i+1) begin - // mtx_payload = i; - // mtx_start = 0; - // #10; - // mtx_start = 1; - // #10; - // mtx_start = 0; - // while(!mrx_valid) #10; - - // #1000; - - // assert(mrx_payload == i) else $fatal(0, "data mismatch!"); - // end - $finish(); - end - -endmodule -`default_nettype wire \ No newline at end of file diff --git a/test/functional_sim/io_core_tb/io_core.v b/test/functional_sim/io_core_tb/io_core.v deleted file mode 100644 index 8f8daa7..0000000 --- a/test/functional_sim/io_core_tb/io_core.v +++ /dev/null @@ -1,118 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -module io_core( - input wire bus_clk, - input wire user_clk, - - // inputs - input wire probe0, - input wire [1:0] probe1, - input wire [7:0] probe2, - input wire [19:0] probe3, - - // outputs - output reg probe4, - output reg [1:0] probe5, - output reg [7:0] probe6, - output reg [19:0] probe7, - - // input port - input wire [15:0] addr_i, - input wire [15:0] data_i, - input wire rw_i, - input wire valid_i, - - // output port - output reg [15:0] addr_o, - output reg [15:0] data_o, - output reg rw_o, - output reg valid_o - ); - - parameter BASE_ADDR = 0; - - reg strobe = 0; - - // configure buffers - // inputs - reg probe0_buf = 0; - reg [1:0] probe1_buf = 0; - reg [7:0] probe2_buf = 0; - reg [19:0] probe3_buf = 0; - - // outputs - reg probe4_buf = 1; // PROBE4_INITIAL_VALUE; - reg [1:0] probe5_buf = 3; // PROBE5_INITIAL_VALUE; - reg [7:0] probe6_buf = 6; // PROBE6_INITIAL_VALUE; - reg [19:0] probe7_buf = 7; // PROBE7_INITIAL_VALUE; - - initial begin - probe4 = 1; // PROBE4_INITIAL_VALUE; - probe5 = 3; // PROBE5_INITIAL_VALUE; - probe6 = 6; // PROBE6_INITIAL_VALUE; - probe7 = 7; // PROBE7_INITIAL_VALUE; - end - - // synchronize buffers and probes on strobe - always @(posedge user_clk) begin - if(strobe) begin - // update input buffers from input probes - probe0_buf <= probe0; - probe1_buf <= probe1; - probe2_buf <= probe2; - probe3_buf <= probe3; - - // update output buffers from output probes - probe4 <= probe4_buf; - probe5 <= probe5_buf; - probe6 <= probe6_buf; - probe7 <= probe7_buf; - end - end - - - // handle bus operations - always @(posedge bus_clk) begin - addr_o <= addr_i; - data_o <= data_i; - rw_o <= rw_i; - valid_o <= valid_i; - - // check if address is valid - if( (valid_i) && (addr_i >= BASE_ADDR) && (addr_i <= BASE_ADDR + 10)) begin - - if(!rw_i) begin // reads - case (addr_i) - BASE_ADDR + 0: data_o <= strobe; - - BASE_ADDR + 1: data_o <= probe0_buf; // width 1 - BASE_ADDR + 2: data_o <= probe1_buf; // width 2 - BASE_ADDR + 3: data_o <= probe2_buf; // width 8 - BASE_ADDR + 4: data_o <= probe3_buf[15:0]; // width 20 - BASE_ADDR + 5: data_o <= probe3_buf[19:16]; - - BASE_ADDR + 6: data_o <= probe4_buf; // width 1 - BASE_ADDR + 7: data_o <= probe5_buf; // width 2 - BASE_ADDR + 8: data_o <= probe6_buf; // width 8 - BASE_ADDR + 9: data_o <= probe7_buf[15:0]; // width 20 - BASE_ADDR + 10: data_o <= probe7_buf[19:16]; - endcase - end - - else begin // writes - case (addr_i) - BASE_ADDR + 0: strobe <= data_i[0]; - - BASE_ADDR + 6: probe4_buf <= data_i[0]; - BASE_ADDR + 7: probe5_buf <= data_i[1:0]; - BASE_ADDR + 8: probe6_buf <= data_i[7:0]; - BASE_ADDR + 9: probe7_buf[15:0] <= data_i; - BASE_ADDR + 10: probe7_buf[19:16] <= data_i[3:0]; - endcase - end - end - end -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/test/functional_sim/io_core_tb/io_core_tb.sv b/test/functional_sim/io_core_tb/io_core_tb.sv deleted file mode 100644 index 3a1caef..0000000 --- a/test/functional_sim/io_core_tb/io_core_tb.sv +++ /dev/null @@ -1,277 +0,0 @@ -`default_nettype none - -`define CP 10 -`define HCP 5 - -task read_reg ( - input [15:0] addr, - output [15:0] data, - input string desc - ); - - io_core_tb.tb_io_addr = addr; - io_core_tb.tb_io_rw = 0; - io_core_tb.tb_io_valid = 1; - #`CP - io_core_tb.tb_io_valid = 0; - while (!io_core_tb.io_tb_valid) #`CP; - data = io_core_tb.io_tb_data; - - $display(" -> read 0x%h from addr 0x%h (%s)", data, addr, desc); -endtask - -task write_reg( - input [15:0] addr, - input [15:0] data, - input string desc - ); - - io_core_tb.tb_io_addr = addr; - io_core_tb.tb_io_data = data; - io_core_tb.tb_io_rw = 1; - io_core_tb.tb_io_valid = 1; - #`CP - io_core_tb.tb_io_valid = 0; - while (!io_core_tb.io_tb_valid) #`CP; - - $display(" -> wrote 0x%h to addr 0x%h (%s)", data, addr, desc); -endtask - -task write_and_verify( - input [15:0] addr, - input [15:0] write_data, - input string desc - ); - - reg [15:0] read_data; - - write_reg(addr, write_data, desc); - read_reg(addr, read_data, desc); - assert(read_data == write_data) else $fatal(0, "data read does not match data written!"); -endtask - -// task read_all_reg(); -// string desc; -// for(int i = 0; i < (io_core_tb.la.block_mem.MAX_ADDR); i++) begin - -// if(i == io_core_tb.la.fsm_registers.BASE_ADDR) desc = "FSM"; -// if(i == io_core_tb.la.trig_blk.BASE_ADDR) desc = "TRIG BLK"; -// if(i == io_core_tb.la.block_mem.BASE_ADDR) desc = "SAMPLE MEM"; - -// read_reg(i, io_core_tb.read_value, desc); -// end -// endtask - -module io_core_tb; - - // boilerplate - logic clk; - integer test_num; - - // inputs - logic probe0; - logic [1:0] probe1; - logic [7:0] probe2; - logic [19:0] probe3; - - // outputs - logic probe4; - logic [1:0] probe5; - logic [7:0] probe6; - logic [19:0] probe7; - - // tb -> io bus - logic [15:0] tb_io_addr; - logic [15:0] tb_io_data; - logic tb_io_rw; - logic tb_io_valid; - - // la -> io bus - logic [15:0] io_tb_addr; - logic [15:0] io_tb_data; - logic io_tb_rw; - logic io_tb_valid; - - - io_core #(.BASE_ADDR(0)) io( - .bus_clk(clk), - .user_clk(clk), - - // inputs - .probe0(probe0), - .probe1(probe1), - .probe2(probe2), - .probe3(probe3), - - // outputs - .probe4(probe4), - .probe5(probe5), - .probe6(probe6), - .probe7(probe7), - - // input port - .addr_i(tb_io_addr), - .data_i(tb_io_data), - .rw_i(tb_io_rw), - .valid_i(tb_io_valid), - - // output port - .addr_o(io_tb_addr), - .data_o(io_tb_data), - .rw_o(io_tb_rw), - .valid_o(io_tb_valid)); - - always begin - #`HCP - clk = !clk; - end - - logic [15:0] read_data; - - initial begin - $dumpfile("io_core_tb.vcd"); - $dumpvars(0, io_core_tb); - - // setup and reset - clk = 0; - test_num = 0; - - tb_io_addr = 0; - tb_io_data = 0; - tb_io_rw = 0; - tb_io_valid = 0; - - probe0 = 0; - probe1 = 1; - probe2 = 2; - probe3 = 3; - - // #`HCP - #(10*`CP); - - /* ==== Test 1 Begin ==== */ - $display("\n=== test 1: read initial register states ==="); - test_num = 1; - read_reg(0, read_data, "strobe"); - read_reg(1, read_data, "probe0"); - read_reg(2, read_data, "probe1"); - read_reg(3, read_data, "probe2"); - read_reg(4, read_data, "probe3[15:0]"); - read_reg(5, read_data, "probe3[19:16]"); - - read_reg(6, read_data, "probe4"); - read_reg(7, read_data, "probe5"); - read_reg(8, read_data, "probe6"); - read_reg(9, read_data, "probe7[15:0]"); - read_reg(10, read_data, "probe7[19:16]"); - #(10*`CP); - /* ==== Test 1 End ==== */ - - /* ==== Test 2 Begin ==== */ - $display("\n=== test 2: assert input buffers initialized correctly ==="); - test_num = 2; - read_reg(0, read_data, "strobe"); - assert(read_data == 0) else $fatal(0, "strobe does not initialize to zero!"); - assert(io.strobe == 0) else $fatal(0, "strobe does not initialize to zero!"); - - read_reg(1, read_data, "probe0"); - assert(read_data == 0) else $fatal(0, "probe0_buf does not initialize to zero!"); - assert(io.probe0_buf == 0) else $fatal(0, "probe0_buf does not initialize to zero!"); - - read_reg(2, read_data, "probe1"); - assert(read_data == 0) else $fatal(0, "probe1_buf does not initialize to zero!"); - assert(io.probe1_buf == 0) else $fatal(0, "probe1_buf does not initialize to zero!"); - - read_reg(3, read_data, "probe2"); - assert(read_data == 0) else $fatal(0, "probe2_buf does not initialize to zero!"); - assert(io.probe2_buf == 0) else $fatal(0, "probe2_buf does not initialize to zero!"); - - read_reg(4, read_data, "probe3[15:0]"); - assert(read_data == 0) else $fatal(0, "probe3_buf does not initialize to zero!"); - read_reg(5, read_data, "probe3[19:16]"); - assert(read_data == 0) else $fatal(0, "probe3_buf does not initialize to zero!"); - assert(io.probe3_buf == 0) else $fatal(0, "probe3_buf does not initialize to zero!"); - - #(10*`CP); - /* ==== Test 2 End ==== */ - - - /* ==== Test 3 Begin ==== */ - $display("\n=== test 3: assert outputs and output buffers initialized correctly ==="); - test_num = 3; - read_reg(6, read_data, "probe4"); - assert(read_data == 1) else $fatal(0, "probe4 does not initialize correctly!"); - assert(io.probe4_buf == 1) else $fatal(0, "probe4_buf does not initialize correctly!"); - assert(io.probe4 == 1) else $fatal(0, "probe4 does not initialize correctly!"); - - read_reg(7, read_data, "probe5"); - assert(read_data == 3) else $fatal(0, "probe5 does not initialize correctly!"); - assert(io.probe5_buf == 3) else $fatal(0, "probe5_buf does not initialize correctly!"); - assert(io.probe5 == 3) else $fatal(0, "probe5 does not initialize correctly!"); - - read_reg(8, read_data, "probe6"); - assert(read_data == 6) else $fatal(0, "probe6 does not initialize correctly!"); - assert(io.probe6_buf == 6) else $fatal(0, "probe6_buf does not initialize correctly!"); - assert(io.probe6 == 6) else $fatal(0, "probe6 does not initialize correctly!"); - - read_reg(9, read_data, "probe7[15:0]"); - assert(read_data == 7) else $fatal(0, "probe7 does not initialize correctly!"); - read_reg(10, read_data, "probe7[19:16]"); - assert(read_data == 0) else $fatal(0, "probe7 does not initialize correctly!"); - assert(io.probe7_buf == 7) else $fatal(0, "probe7_buf does not initialize correctly!"); - assert(io.probe7 == 7) else $fatal(0, "probe7 does not initialize correctly!"); - - - #(10*`CP); - /* ==== Test 3 End ==== */ - - /* ==== Test 4 Begin ==== */ - $display("\n=== test 4: write new output value to each output probe==="); - test_num = 4; - write_reg(6, 0, "probe4"); - assert(io.probe4_buf == 0) else $fatal(0, "probe4_buf does not update correctly!"); - assert(io.probe4 != 0) else $fatal(0, "probe4 updated without strobing!"); - - write_reg(7, 0, "probe5"); - assert(io.probe5_buf == 0) else $fatal(0, "probe5_buf does not update correctly!"); - assert(io.probe5 != 0) else $fatal(0, "probe5 updated without strobing!"); - - write_reg(8, 0, "probe6"); - assert(io.probe6_buf == 0) else $fatal(0, "probe6_buf does not update correctly!"); - assert(io.probe6 != 0) else $fatal(0, "probe6 updated without strobing!"); - - write_reg(9, 0, "probe7[15:0]"); - write_reg(10, 0, "probe7[19:16]"); - assert(io.probe7_buf == 0) else $fatal(0, "probe7_buf does not update correctly!"); - assert(io.probe7 != 0) else $fatal(0, "probe7 updated without strobing!"); - #(10*`CP); - /* ==== Test 4 End ==== */ - - /* ==== Test 5 Begin ==== */ - $display("\n=== test 5: strobe core, check that inputs and outputs updated ==="); - test_num = 5; - - write_reg(0, 1, "strobe"); - write_reg(0, 0, "strobe"); - - assert(io.probe4 == 0) else $fatal(0, "probe4 did not update correctly!"); - assert(io.probe5 == 0) else $fatal(0, "probe5 did not update correctly!"); - assert(io.probe6 == 0) else $fatal(0, "probe6 did not update correctly!"); - assert(io.probe7 == 0) else $fatal(0, "probe7 did not update correctly!"); - - assert(io.probe0_buf == 0) else $fatal(0, "probe0_buf did not update correctly!"); - assert(io.probe1_buf == 1) else $fatal(0, "probe1_buf did not update correctly!"); - assert(io.probe2_buf == 2) else $fatal(0, "probe2_buf did not update correctly!"); - assert(io.probe3_buf == 3) else $fatal(0, "probe3_buf did not update correctly!"); - assert(io.probe4_buf == 0) else $fatal(0, "probe4_buf did not update correctly!"); - assert(io.probe5_buf == 0) else $fatal(0, "probe5_buf did not update correctly!"); - assert(io.probe6_buf == 0) else $fatal(0, "probe6_buf did not update correctly!"); - assert(io.probe7_buf == 0) else $fatal(0, "probe7_buf did not update correctly!"); - /* ==== Test 5 End ==== */ - - - $finish(); - end -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/test/functional_sim/logic_analyzer_tb/logic_analyzer_tb.sv b/test/functional_sim/logic_analyzer_tb/logic_analyzer_tb.sv deleted file mode 100644 index 36288de..0000000 --- a/test/functional_sim/logic_analyzer_tb/logic_analyzer_tb.sv +++ /dev/null @@ -1,257 +0,0 @@ -`default_nettype none - -`define CP 10 -`define HCP 5 - -task read_reg ( - input [15:0] addr, - output [15:0] data, - input string desc - ); - - logic_analyzer_tb.tb_la_addr = addr; - logic_analyzer_tb.tb_la_rw = 0; - logic_analyzer_tb.tb_la_valid = 1; - #`CP - logic_analyzer_tb.tb_la_valid = 0; - while (!logic_analyzer_tb.la_tb_valid) #`CP; - data = logic_analyzer_tb.la_tb_data; - - $display(" -> read 0x%h from addr 0x%h (%s)", data, addr, desc); -endtask - -task write_reg( - input [15:0] addr, - input [15:0] data, - input string desc - ); - - logic_analyzer_tb.tb_la_addr = addr; - logic_analyzer_tb.tb_la_data = data; - logic_analyzer_tb.tb_la_rw = 1; - logic_analyzer_tb.tb_la_valid = 1; - #`CP - logic_analyzer_tb.tb_la_valid = 0; - while (!logic_analyzer_tb.la_tb_valid) #`CP; - - $display(" -> wrote 0x%h to addr 0x%h (%s)", data, addr, desc); -endtask - -task write_and_verify( - input [15:0] addr, - input [15:0] write_data, - input string desc - ); - - reg [15:0] read_data; - - write_reg(addr, write_data, desc); - read_reg(addr, read_data, desc); - assert(read_data == write_data) else $fatal(0, "data read does not match data written!"); -endtask - -task read_all_reg(); - string desc; - for(int i = 0; i < (logic_analyzer_tb.la.block_mem.MAX_ADDR); i++) begin - - if(i == logic_analyzer_tb.la.fsm_registers.BASE_ADDR) desc = "FSM"; - if(i == logic_analyzer_tb.la.trig_blk.BASE_ADDR) desc = "TRIG BLK"; - if(i == logic_analyzer_tb.la.block_mem.BASE_ADDR) desc = "SAMPLE MEM"; - - read_reg(i, logic_analyzer_tb.read_value, desc); - end -endtask - -module logic_analyzer_tb; - - // boilerplate - logic clk; - integer test_num; - - // signal generator - logic larry; - logic curly; - logic moe; - logic [3:0] shemp; - - // tb -> la bus - logic [15:0] tb_la_addr; - logic [15:0] tb_la_data; - logic tb_la_rw; - logic tb_la_valid; - - // la -> tb bus - logic [15:0] la_tb_addr; - logic [15:0] la_tb_data; - logic la_tb_rw; - logic la_tb_valid; - - - logic_analyzer la( - .clk(clk), - - // probes - .larry(larry), - .curly(curly), - .moe(moe), - .shemp(shemp), - - // input port - .addr_i(tb_la_addr), - .data_i(tb_la_data), - .rw_i(tb_la_rw), - .valid_i(tb_la_valid), - - // output port - .addr_o(la_tb_addr), - .data_o(la_tb_data), - .rw_o(la_tb_rw), - .valid_o(la_tb_valid)); - - always begin - #`HCP - clk = !clk; - end - - reg [15:0] read_value; - - initial begin - $dumpfile("logic_analyzer_tb.vcd"); - $dumpvars(0, logic_analyzer_tb); - - // setup and reset - clk = 0; - test_num = 0; - - tb_la_addr = 0; - tb_la_data = 0; - tb_la_rw = 0; - tb_la_valid = 0; - - larry = 0; - curly = 0; - moe = 0; - shemp = 0; - #`HCP - #(10*`CP); - - - // /* ==== Test 2 Begin ==== */ - // $display("\n=== test 2: read/write to trigger block registers, verify ==="); - // test_num = 2; - - // // larry - // write_and_verify(3, 0, "larry_op"); - // write_and_verify(3, 2, "larry_op"); - // write_and_verify(3, 0, "larry_op"); - - // write_and_verify(4, 0, "larry_arg"); - // write_and_verify(4, 1, "larry_arg"); - // write_and_verify(4, 0, "larry_arg"); - - // // curly - // write_and_verify(5, 0, "curly_op"); - // write_and_verify(5, 3, "curly_op"); - // write_and_verify(5, 0, "curly_op"); - - // write_and_verify(6, 0, "curly_arg"); - // write_and_verify(6, 1, "curly_arg"); - // write_and_verify(6, 0, "curly_arg"); - - // // moe - // write_and_verify(7, 0, "moe_op"); - // write_and_verify(7, 5, "moe_op"); - // write_and_verify(7, 0, "moe_op"); - - // write_and_verify(8, 0, "moe_arg"); - // write_and_verify(8, 1, "moe_arg"); - // write_and_verify(8, 0, "moe_arg"); - - // // shemp - // write_and_verify(9, 0, "shemp_op"); - // write_and_verify(9, 7, "shemp_op"); - // write_and_verify(9, 0, "shemp_op"); - - // write_and_verify(10, 0, "shemp_arg"); - // write_and_verify(10, 7, "shemp_arg"); - // write_and_verify(10, 0, "shemp_arg"); - - // #(10*`CP); - - // /* ==== Test 2 End ==== */ - - - /* ==== Test 4 Begin ==== */ - $display("\n=== test 4: verify FSM does move out of IDLE when running ==="); - test_num = 4; - - $display(" -> setting up trigger (larry == 1)"); - write_reg(la.trig_blk.BASE_ADDR + 0, 8, "larry_op"); - write_reg(la.trig_blk.BASE_ADDR + 1, 1, "larry_arg"); - - $display(" -> requesting start"); - write_reg(3, 1, "request_start"); - write_reg(3, 0, "request_start"); - #`CP - - $display(" -> set larry = 1"); - larry = 1; - - // read - $display(" -> la core is in state 0x%h", la.fsm_registers.state); - $display(" -> wait a clock cycle"); - #`CP - $display(" -> la core is in state 0x%h", la.fsm_registers.state); - - // run until the FILLED state is reached - $display(" -> wait until FILLED state is reached"); - while (la.fsm_registers.state != la.la_controller.CAPTURED) begin - {larry, curly, moe, shemp} = {larry, curly, moe, shemp} + 1; - #`CP; - end - - $display(" -> read from sample memory:"); - read_all_reg(); - - #(200*`CP); - /* ==== Test 4 End ==== */ - - // /* ==== Test 5 Begin ==== */ - // $display("\n=== test 5: change trigger to fire on shemp > 3, and verify ==="); - // test_num = 5; - - // write_and_verify(9, 6, "shemp_op"); // set operation to GT - // write_and_verify(10, 3, "shemp_arg"); // set argument to 3 - - // assert( (la.fsm_registers.state == la.la_controller.IDLE) || (la.fsm_registers.state == la.la_controller.CAPTURED) ) - // else $fatal(0, "core is running when it shouldn't be!"); - - // larry = 0; - // curly = 0; - // moe = 0; - // shemp = 0; - - // // start the core - // // TODO: start the core - - // shemp = 4; - // $display(" -> set shemp = 4"); - - // // run until the FILLED state is reached - // $display(" -> wait until FILLED state is reached"); - // while (la.fsm_registers.state != la.la_controller.CAPTURED) begin - // {larry, curly, moe, shemp} = {larry, curly, moe, shemp} + 2; - // #`CP; - // end - - // $display(" -> read from sample memory:"); - // read_all_reg(); - - // #(10*`CP); - // /* ==== Test 5 End ==== */ - - $finish(); - end -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/test/functional_sim/logic_analyzer_tb/manta.yaml b/test/functional_sim/logic_analyzer_tb/manta.yaml deleted file mode 100644 index cbd04c1..0000000 --- a/test/functional_sim/logic_analyzer_tb/manta.yaml +++ /dev/null @@ -1,19 +0,0 @@ ---- -cores: - logic_analyzer: - type: logic_analyzer - sample_depth: 128 - - probes: - larry: 1 - curly: 1 - moe: 1 - shemp: 4 - - triggers: - - larry && curly && ~moe - -uart: - port: "auto" - baudrate: 115200 - clock_freq: 100000000 \ No newline at end of file diff --git a/test/functional_sim/mac_tb.sv b/test/functional_sim/mac_tb.sv deleted file mode 100644 index c812fc2..0000000 --- a/test/functional_sim/mac_tb.sv +++ /dev/null @@ -1,86 +0,0 @@ -`default_nettype none -`timescale 1ns/1ps - -`define FPGA_MAC 48'h69_69_5A_06_54_91 -`define HOST_MAC 48'h00_E0_4C_68_1E_0C -`define ETHERTYPE 16'h88_B5 - - -module mac_tb(); - logic clk; - - always begin - #5; - clk = !clk; - end - - logic crsdv; - logic [1:0] rxd; - - logic txen; - logic [1:0] txd; - - // this testbench makes sure that our rx pipeline is good, - // so we'll have mtx simulate the host machine and blast - // 5 bytes (plus padding) onto our fake RMII - logic [39:0] mtx_payload; - logic mtx_start; - - logic [39:0] mrx_payload; - logic mrx_valid; - - mac_tx #( - .SRC_MAC(`HOST_MAC), - .DST_MAC(`FPGA_MAC), - .ETHERTYPE(`ETHERTYPE), - .PAYLOAD_LENGTH_BYTES(5) - ) mtx ( - .clk(clk), - - .payload(mtx_payload), - .start(mtx_start), - - .txen(txen), - .txd(txd)); - - assign rxd = txd; - assign crsdv = txen; - - mac_rx #( - .FPGA_MAC(`FPGA_MAC), - .ETHERTYPE(`ETHERTYPE) - ) mrx ( - .clk(clk), - - .crsdv(crsdv), - .rxd(rxd), - - .payload(mrx_payload), - .valid(mrx_valid)); - - initial begin - $dumpfile("mac_tb.vcd"); - $dumpvars(0, mac_tb); - clk = 0; - mtx_payload = 0; - mtx_start = 0; - #10; - - for (int i=0; i<32; i=i+1) begin - mtx_payload = i; - mtx_start = 0; - #10; - mtx_start = 1; - #10; - mtx_start = 0; - while(!mrx_valid) #10; - - #1000; - - assert(mrx_payload == i) else $fatal(0, "data mismatch!"); - end - $finish(); - end - -endmodule -`default_nettype wire \ No newline at end of file diff --git a/test/functional_sim/uart_rx_tb.sv b/test/functional_sim/uart_rx_tb.sv deleted file mode 100644 index 9993eb3..0000000 --- a/test/functional_sim/uart_rx_tb.sv +++ /dev/null @@ -1,94 +0,0 @@ -`default_nettype none - -`define CP 10 -`define HCP 5 - -task automatic test_receive ( - input [7:0] data, - input integer CLOCKS_PER_BAUD - ); - - // send a byte to uart_rx, and check that it receives properly - - integer data_bit = 0; - logic valid_has_been_asserted = 0; - - for(int i=0; i < (10*CLOCKS_PER_BAUD); i++) begin - - // clock out data bits on each baud period - data_bit = i / CLOCKS_PER_BAUD; - if (data_bit == 0) uart_rx_tb.tb_urx_rx = 0; - else if ((data_bit > 0) && (data_bit < 9)) uart_rx_tb.tb_urx_rx = data[data_bit-1]; - else uart_rx_tb.tb_urx_rx = 1; - - - // every cycle, run checks on uart_rx: - - // make sure valid isn't asserted before end of byte - if (data_bit < 9) begin - assert(uart_rx_tb.urx_tb_valid == 0) else $fatal(0, "valid asserted before end of byte!"); - end - - // make sure valid is only asserted once - if (valid_has_been_asserted) begin - assert(uart_rx_tb.urx_tb_valid == 0) else $fatal(0, "valid asserted more than once!"); - end - - // make sure byte is presented once last bit has been clocked out - if (uart_rx_tb.urx_tb_valid) begin - assert(data_bit == 9) else $fatal(0, "byte presented before it is complete"); - assert(uart_rx_tb.urx_tb_data == data) else $fatal(0, "wrong data!"); - valid_has_been_asserted = 1; - end - - #`CP; - end - - // make sure valid was asserted at some point - assert (valid_has_been_asserted) else $fatal(0, "valid not asserted!"); -endtask - -module uart_rx_tb(); - logic clk; - integer test_num; - - logic tb_urx_rx; - logic [7:0] urx_tb_data; - logic urx_tb_valid; - uart_rx #(.CLOCKS_PER_BAUD(10)) urx ( - .clk(clk), - .rx(tb_urx_rx), - .data_o(urx_tb_data), - .valid_o(urx_tb_valid)); - - always begin - #`HCP - clk = !clk; - end - - initial begin - $dumpfile("uart_rx_tb.vcd"); - $dumpvars(0, uart_rx_tb); - clk = 0; - test_num = 0; - tb_urx_rx = 1; - #`HCP; - - // test all possible bytes - test_num = test_num + 1; - for(int i=0; i < 256; i++) begin - test_receive(i, 10); - #(100*`CP); - end - - // test all possible bytes (no delay between them) - test_num = test_num + 1; - for(int i=0; i < 256; i++) begin - test_receive(i, 10); - end - - $finish(); - end -endmodule - -`default_nettype wire diff --git a/test/functional_sim/uart_tx_tb.sv b/test/functional_sim/uart_tx_tb.sv deleted file mode 100644 index 308069e..0000000 --- a/test/functional_sim/uart_tx_tb.sv +++ /dev/null @@ -1,99 +0,0 @@ -`default_nettype none - -`define CP 10 -`define HCP 5 - -task automatic transmit_byte ( - input [7:0] data, - input integer CLOCKS_PER_BAUD - ); - - // send a byte from uart_tx, and check that it transmits properly - - integer data_bit = 0; - for(int i=0; i < (10*CLOCKS_PER_BAUD)-1; i++) begin - - // check that data bit is correct on every baud period - data_bit = i / CLOCKS_PER_BAUD; - if (data_bit == 0) begin - assert(uart_tx_tb.utx_tb_tx == 0) else $fatal(0, "wrong start bit!"); - end - - else if ((data_bit > 0) && (data_bit < 9)) begin - assert(uart_tx_tb.utx_tb_tx == data[data_bit-1]) else $fatal(0, "wrong data bit!"); - end - - else begin - assert(uart_tx_tb.utx_tb_tx == 1) else $fatal(0, "wrong stop bit!"); - end - - - // check that done is not asserted during transmisison - assert(!uart_tx_tb.utx_tb_done) else $fatal(0, "wrong done!"); - #`CP; - end - - // assert that done is asserted at end of transmission - assert(uart_tx_tb.utx_tb_done) else $fatal(0, "wrong done!"); -endtask - -module uart_tx_tb(); - logic clk; - integer test_num; - - logic [7:0] tb_utx_data; - logic tb_utx_start; - logic utx_tb_done; - logic utx_tb_tx; - - uart_tx #(.CLOCKS_PER_BAUD(10)) utx ( - .clk(clk), - - .data_i(tb_utx_data), - .start_i(tb_utx_start), - .done_o(utx_tb_done), - - .tx(utx_tb_tx)); - - always begin - #`HCP - clk = !clk; - end - - initial begin - $dumpfile("uart_tx_tb.vcd"); - $dumpvars(0, uart_tx_tb); - clk = 0; - test_num = 0; - - tb_utx_data = 0; - tb_utx_start = 0; - #`HCP; - - // test all possible bytes - test_num = test_num + 1; - for(int i=0; i < 256; i++) begin - tb_utx_start = 1; - tb_utx_data = i; - #`CP; - tb_utx_start = 0; - tb_utx_data = 0; - transmit_byte(i, 10); - #(100*`CP); - end - - // test all possible bytes (no delay between them) - test_num = test_num + 1; - for(int i=0; i < 256; i++) begin - tb_utx_start = 1; - tb_utx_data = i; - #`CP; - tb_utx_data = 0; - transmit_byte(i, 10); - end - - $finish(); - end -endmodule - -`default_nettype wire diff --git a/test/test_bridge_rx_sim.py b/test/test_bridge_rx_sim.py new file mode 100644 index 0000000..89c3d4d --- /dev/null +++ b/test/test_bridge_rx_sim.py @@ -0,0 +1,120 @@ +from amaranth.sim import Simulator +from manta.uart import RecieveBridge +from manta.utils import * + + +bridge_rx = RecieveBridge() + + +def verify_read_decoding(bytes, addr): + """ + Send a series of bytes to the receive bridge, and verify that the bridge places + a read request with the appropriate address on the internal bus. + """ + valid_asserted = False + yield bridge_rx.valid_i.eq(1) + + for i, byte in enumerate(bytes): + yield bridge_rx.data_i.eq(byte) + + if (yield bridge_rx.valid_o) and (i > 0): + valid_asserted = True + if (yield bridge_rx.addr_o) != addr: + raise ValueError("wrong addr!") + + if (yield bridge_rx.rw_o) != 0: + raise ValueError("wrong rw!") + + if (yield bridge_rx.data_o) != 0: + raise ValueError("wrong data!") + + yield + + yield bridge_rx.valid_i.eq(0) + yield bridge_rx.data_i.eq(0) + + if not valid_asserted and not (yield bridge_rx.valid_o): + raise ValueError("Bridge failed to output valid message.") + + +def verify_write_decoding(bytes, addr, data): + """ + Send a series of bytes to the receive bridge, and verify that the bridge places + a write request with the appropriate address and data on the internal bus. + """ + valid_asserted = False + yield bridge_rx.valid_i.eq(1) + + for i, byte in enumerate(bytes): + yield bridge_rx.data_i.eq(byte) + + if (yield bridge_rx.valid_o) and (i > 0): + valid_asserted = True + if (yield bridge_rx.addr_o) != addr: + raise ValueError("wrong addr!") + + if (yield bridge_rx.rw_o) != 1: + raise ValueError("wrong rw!") + + if (yield bridge_rx.data_o) != data: + raise ValueError("wrong data!") + + yield + + yield bridge_rx.valid_i.eq(0) + yield bridge_rx.data_i.eq(0) + + if not valid_asserted and not (yield bridge_rx.valid_o): + raise ValueError("Bridge failed to output valid message.") + + +def verify_bad_bytes(bytes): + """ + Send a series of bytes to the receive bridge, and verify that the bridge does not + place any transaction on the internal bus. + """ + yield bridge_rx.valid_i.eq(1) + + for byte in bytes: + yield bridge_rx.data_i.eq(byte) + + if (yield bridge_rx.valid_o): + raise ValueError("Bridge decoded invalid message.") + + yield + + yield bridge_rx.valid_i.eq(0) + + +def test_read_decode(): + def testbench(): + yield from verify_read_decoding(b"R0000\r\n", 0x0000) + yield from verify_read_decoding(b"R1234\r\n", 0x1234) + yield from verify_read_decoding(b"RBABE\r\n", 0xBABE) + yield from verify_read_decoding(b"R5678\n", 0x5678) + yield from verify_read_decoding(b"R9ABC\r", 0x9ABC) + + simulate(bridge_rx, testbench) + + +def test_write_decode(): + def testbench(): + yield from verify_write_decoding(b"W12345678\r\n", 0x1234, 0x5678) + yield from verify_write_decoding(b"WDEADBEEF\r\n", 0xDEAD, 0xBEEF) + yield from verify_write_decoding(b"WDEADBEEF\r", 0xDEAD, 0xBEEF) + yield from verify_write_decoding(b"WB0BACAFE\n", 0xB0BA, 0xCAFE) + + simulate(bridge_rx, testbench) + + +def test_no_decode(): + def testbench(): + yield from verify_bad_bytes(b"RABC\r\n") + yield from verify_bad_bytes(b"R12345\r\n") + yield from verify_bad_bytes(b"M\r\n") + yield from verify_bad_bytes(b"W123456789101112131415161718191201222\r\n") + yield from verify_bad_bytes(b"RABCG\r\n") + yield from verify_bad_bytes(b"WABC[]()##*@\r\n") + yield from verify_bad_bytes(b"R\r\n") + + simulate(bridge_rx, testbench) diff --git a/test/test_bridge_tx_sim.py b/test/test_bridge_tx_sim.py new file mode 100644 index 0000000..9a1568d --- /dev/null +++ b/test/test_bridge_tx_sim.py @@ -0,0 +1,67 @@ +from amaranth.sim import Simulator +from manta.uart import TransmitBridge +from manta.utils import * +from random import randint, sample + + +bridge_tx = TransmitBridge() + + +def verify_encoding(data, bytes): + """ + Place a read response on the internal bus, and verify that the sequence of bytes + sent from TransmitBridge matches the provided bytestring `bytes`. + + This function also models an ideal UARTTransmitter module, which begins transmitting + bytes when `start` is asserted, and reports when it is done by asserting `done`. + """ + + # Place a read response on the internal bus + yield bridge_tx.data_i.eq(data) + yield bridge_tx.valid_i.eq(1) + yield bridge_tx.rw_i.eq(0) + yield bridge_tx.done_i.eq(1) + + yield + + yield bridge_tx.data_i.eq(0) + yield bridge_tx.valid_i.eq(0) + yield bridge_tx.rw_i.eq(0) + + yield + + # Model the UARTTransmitter + sent_bytes = b"" + iters = 0 + + while len(sent_bytes) < len(bytes): + # If start_o is asserted, set done_i to zero, then delay, then set it back to one + if (yield bridge_tx.start_o): + yield bridge_tx.done_i.eq(0) + sent_bytes += (yield bridge_tx.data_o).to_bytes(1, "big") + + yield bridge_tx.done_i.eq(0) + for _ in range(10): + yield + + yield bridge_tx.done_i.eq(1) + yield + + # Time out if not enough bytes after trying to get bytes 15 times + iters += 1 + if iters > 15: + raise ValueError("Timed out waiting for bytes.") + + # Verify bytes sent from ReceiveBridge match expected_bytes + if sent_bytes != bytes: + raise ValueError(f"Received {sent_bytes} instead of {bytes}.") + + +def test_some_random_values(): + def testbench(): + for i in sample(range(0xFFFF), k=5000): + expected = f"D{i:04X}\r\n".encode("ascii") + print(i) + yield from verify_encoding(i, expected) + + simulate(bridge_tx, testbench) diff --git a/test/test_io_core_hw.py b/test/test_io_core_hw.py new file mode 100644 index 0000000..25f0b2c --- /dev/null +++ b/test/test_io_core_hw.py @@ -0,0 +1,129 @@ +from amaranth import * +from amaranth_boards.nexys4ddr import Nexys4DDRPlatform +from amaranth_boards.icestick import ICEStickPlatform +from manta import Manta +from manta.utils import * +import pytest +from random import randint + + +class IOCoreLoopbackTest(Elaboratable): + def __init__(self, platform, port): + self.platform = platform + self.port = port + + self.config = self.platform_specific_config() + self.m = Manta(self.config) + + def platform_specific_config(self): + return { + "cores": { + "io_core": { + "type": "io", + "inputs": {"probe0": 1, "probe1": 2, "probe2": 8, "probe3": 20}, + "outputs": { + "probe4": {"width": 1, "initial_value": 1}, + "probe5": { + "width": 2, + "initial_value": 2, + }, + "probe6": 8, + "probe7": {"width": 20, "initial_value": 65538}, + }, + } + }, + "uart": { + "port": self.port, + "baudrate": 3e6, + "clock_freq": self.platform.default_clk_frequency, + }, + } + + def elaborate(self, platform): + m = Module() + m.submodules["manta"] = self.m + + uart_pins = platform.request("uart") + + m.d.comb += [ + self.m.io_core.probe0.eq(self.m.io_core.probe4), + self.m.io_core.probe1.eq(self.m.io_core.probe5), + self.m.io_core.probe2.eq(self.m.io_core.probe6), + self.m.io_core.probe3.eq(self.m.io_core.probe7), + self.m.interface.rx.eq(uart_pins.rx.i), + uart_pins.tx.o.eq(self.m.interface.tx), + ] + + return m + + def build_and_program(self): + self.platform.build(self, do_program=True) + + def verify_output_probe_initial_values(self): + """ + Test that all output probes take their expected initial values. + We can't really test for the same of input probes, since the + strobe register pulses every time the get_probe() method is called. + """ + + # Test that all output probes take their initial values + inputs = self.config["cores"]["io_core"]["inputs"] + outputs = self.config["cores"]["io_core"]["outputs"] + + for name, attrs in outputs.items(): + actual = self.m.io_core.get_probe(name) + + if isinstance(attrs, dict): + if "initial_value" in attrs: + expected = attrs["initial_value"] + + else: + expected = 0 + + if actual != expected: + raise ValueError( + f"Output probe {name} took initial value of {actual} instead of {expected}." + ) + + def verify_probes_update(self): + """ + This design ties all the output probes to input probes, so this + test sets the outputs to random values, and verifies the inputs match + """ + inputs = self.config["cores"]["io_core"]["inputs"] + outputs = self.config["cores"]["io_core"]["outputs"] + + # The config is specified in such a way that the first output is + # connected to the first output, the second output is connected + # to the second input, and so on... + for input, output in zip(inputs, outputs): + width = self.config["cores"]["io_core"]["inputs"][input] + value = randint(0, 2**width - 1) + + self.m.io_core.set_probe(output, value) + readback = self.m.io_core.get_probe(input) + + if readback != value: + raise ValueError( + f"Reading {output} through {input} yielded {readback} instead of {value}!" + ) + + else: + print( + f"Reading {output} through {input} yielded {readback} as expected." + ) + + def verify(self): + self.build_and_program() + self.verify_output_probe_initial_values() + self.verify_probes_update() + + +@pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") +def test_output_probe_initial_values_xilinx(): + IOCoreLoopbackTest(Nexys4DDRPlatform(), "/dev/ttyUSB2").verify() + + +@pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") +def test_output_probe_initial_values_ice40(): + IOCoreLoopbackTest(ICEStickPlatform(), "/dev/ttyUSB1").verify() diff --git a/test/test_io_core_sim.py b/test/test_io_core_sim.py new file mode 100644 index 0000000..5ef1405 --- /dev/null +++ b/test/test_io_core_sim.py @@ -0,0 +1,155 @@ +from amaranth.sim import Simulator +from manta.io_core import IOCore +from manta.utils import * +from random import randint + +config = { + "type": "io", + "inputs": {"probe0": 1, "probe1": 2, "probe2": 8, "probe3": 20}, + "outputs": { + "probe4": {"width": 1, "initial_value": 1}, + "probe5": {"width": 2, "initial_value": 2}, + "probe6": 8, + "probe7": {"width": 20, "initial_value": 65538}, + }, +} + +io_core = IOCore(config, base_addr=0, interface=None) + + +def pulse_strobe_register(): + strobe_addr = io_core.mmap["strobe"]["addrs"][0] + yield from write_register(io_core, strobe_addr, 0) + yield from write_register(io_core, strobe_addr, 1) + yield from write_register(io_core, strobe_addr, 0) + + +def test_output_probe_initial_values(): + def testbench(): + # Verify all output probes initialize to the values in the config + for name, attrs in config["outputs"].items(): + initial_value = 0 + if isinstance(attrs, dict): + if "initial_value" in attrs: + initial_value = attrs["initial_value"] + + output_probe = getattr(io_core, name) + value = yield output_probe + + if value != initial_value: + raise ValueError( + f"Output probe {name} initialized to {value} instead of {initial_value}" + ) + + else: + print(f"Output probe {name} initialized to {value} as expected.") + + simulate(io_core, testbench) + + +def test_input_probe_buffer_initial_value(): + def testbench(): + # Verify all input probe buffers initialize to zero + for name, width in config["inputs"].items(): + addrs = io_core.mmap[name + "_buf"]["addrs"] + + for addr in addrs: + yield from verify_register(io_core, addr, 0) + + simulate(io_core, testbench) + + +def test_output_probe_buffer_initial_value(): + def testbench(): + # Verify all output probe buffers initialize to the values in the config + for name, attrs in config["outputs"].items(): + addrs = io_core.mmap[name + "_buf"]["addrs"] + + datas = [0] * len(addrs) + if isinstance(attrs, dict): + if "initial_value" in attrs: + datas = value_to_words(attrs["initial_value"], len(addrs)) + + for addr, data in zip(addrs, datas): + yield from verify_register(io_core, addr, data) + + simulate(io_core, testbench) + + +def test_output_probes_are_writeable(): + def testbench(): + for name, attrs in config["outputs"].items(): + if isinstance(attrs, dict): + width = attrs["width"] + else: + width = attrs + + addrs = io_core.mmap[name + "_buf"]["addrs"] + test_value = randint(0, (2**width) - 1) + datas = value_to_words(test_value, len(addrs)) + + # write value to registers + for addr, data in zip(addrs, datas): + yield from write_register(io_core, addr, data) + + # read value back from registers + for addr, data in zip(addrs, datas): + yield from verify_register(io_core, addr, data) + + simulate(io_core, testbench) + + +def test_output_probes_update(): + def testbench(): + for name, attrs in config["outputs"].items(): + if isinstance(attrs, dict): + width = attrs["width"] + else: + width = attrs + + addrs = io_core.mmap[name + "_buf"]["addrs"] + test_value = randint(0, (2**width) - 1) + datas = value_to_words(test_value, len(addrs)) + + # write value to registers + for addr, data in zip(addrs, datas): + yield from write_register(io_core, addr, data) + + # pulse strobe register + yield from pulse_strobe_register() + + # check that outputs took updated value + output_probe = getattr(io_core, name) + value = yield (output_probe) + + if value != test_value: + raise ValueError( + f"Output probe {name} took value {value} instead of {test_value} after pulsing strobe." + ) + + else: + print(f"Output probe {name} took value {value} after pulsing strobe.") + + simulate(io_core, testbench) + + +def test_input_probes_update(): + def testbench(): + for name, width in config["inputs"].items(): + test_value = randint(0, (2**width) - 1) + + # set input probe value + input_probe = getattr(io_core, name) + yield input_probe.eq(test_value) + + # pulse strobe register + yield from pulse_strobe_register() + + # check that values are as expected once read back + addrs = io_core.mmap[name + "_buf"]["addrs"] + datas = value_to_words(test_value, len(addrs)) + + for addr, data in zip(addrs, datas): + yield from verify_register(io_core, addr, data) + + simulate(io_core, testbench) diff --git a/test/test_logic_analyzer_hw.py b/test/test_logic_analyzer_hw.py new file mode 100644 index 0000000..1b6b063 --- /dev/null +++ b/test/test_logic_analyzer_hw.py @@ -0,0 +1,84 @@ +from amaranth import * +from amaranth_boards.nexys4ddr import Nexys4DDRPlatform +from amaranth_boards.icestick import ICEStickPlatform +from manta import Manta +from manta.utils import * +import pytest + + +class LogicAnalyzerCounterTest(Elaboratable): + def __init__(self, platform, port): + self.platform = platform + self.port = port + + self.config = self.platform_specific_config() + self.m = Manta(self.config) + + def platform_specific_config(self): + return { + "cores": { + "la": { + "type": "logic_analyzer", + "sample_depth": 1024, + "trigger_loc": 500, + "probes": {"larry": 1, "curly": 3, "moe": 9}, + "triggers": ["moe RISING"], + }, + }, + "uart": { + "port": self.port, + "baudrate": 3e6, + "clock_freq": self.platform.default_clk_frequency, + }, + } + + def elaborate(self, platform): + m = Module() + m.submodules["manta"] = self.m + uart_pins = platform.request("uart") + + larry = self.m.la.probe_signals["larry"]["top_level"] + curly = self.m.la.probe_signals["curly"]["top_level"] + moe = self.m.la.probe_signals["moe"]["top_level"] + + m.d.sync += larry.eq(larry + 1) + m.d.sync += curly.eq(curly + 1) + m.d.sync += moe.eq(moe + 1) + + m.d.comb += [ + self.m.interface.rx.eq(uart_pins.rx.i), + uart_pins.tx.o.eq(self.m.interface.tx), + ] + + return m + + def build_and_program(self): + self.platform.build(self, do_program=True) + + def verify(self): + self.build_and_program() + cap = self.m.la.capture() + + # check that VCD export works + cap.export_vcd("out.vcd") + + # check that Verilog export works + cap.export_playback_verilog("out.v") + + # verify that each signal is just a counter modulo the width of the signal + for name, width in self.m.la.config["probes"].items(): + trace = cap.get_trace(name) + + for i in range(len(trace) - 1): + if trace[i + 1] != (trace[i] + 1) % (2**width): + raise ValueError("Bad counter!") + + +@pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") +def test_mem_core_xilinx(): + LogicAnalyzerCounterTest(Nexys4DDRPlatform(), "/dev/ttyUSB2").verify() + + +@pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") +def test_mem_core_ice40(): + LogicAnalyzerCounterTest(ICEStickPlatform(), "/dev/ttyUSB1").verify() diff --git a/test/test_logic_analyzer_sim.py b/test/test_logic_analyzer_sim.py new file mode 100644 index 0000000..b35e682 --- /dev/null +++ b/test/test_logic_analyzer_sim.py @@ -0,0 +1,140 @@ +from amaranth.sim import Simulator +from manta.logic_analyzer_core import LogicAnalyzerCore +from manta.utils import * +from random import sample + +config = { + "type": "logic_analyzer", + "sample_depth": 1024, + "trigger_loc": 500, + "probes": {"larry": 1, "curly": 3, "moe": 9}, + "triggers": ["moe RISING"], +} + +# class SimulatedBusInterface(): +# def __init__(self, core): +# self.core = core + +# def write(self, addrs, datas): +# # Handle a single integer address and data +# if isinstance(addrs, int) and isinstance(datas, int): +# return self.write([addrs], [datas]) + +# # Make sure address and datas are all integers +# if not isinstance(addrs, list) or not isinstance(datas, list): +# raise ValueError( +# "Write addresses and data must be an integer or list of integers." +# ) + +# if not all(isinstance(a, int) for a in addrs): +# raise ValueError("Write addresses must be all be integers.") + +# if not all(isinstance(d, int) for d in datas): +# raise ValueError("Write data must all be integers.") + +# # I'm not sure if it's necessary to split outputs into chunks +# # I think the output buffer doesn't really drop stuff, just the input buffer + +# for addr, data in zip(addrs, datas): +# yield from write_register(self.core, addr, data) + +# def read(self, addrs): +# # Handle a single integer address +# if isinstance(addrs, int): +# return self.read([addrs])[0] + +# # Make sure all list elements are integers +# if not all(isinstance(a, int) for a in addrs): +# raise ValueError("Read address must be an integer or list of integers.") + +# datas = [] +# for addr in addrs: +# yield la.addr_i.eq(addr) +# yield la.data_i.eq(0) +# yield la.rw_i.eq(0) +# yield la.valid_i.eq(1) +# yield +# yield la.addr_i.eq(0) +# yield la.valid_i.eq(0) + +# # wait for output to be valid +# while not (yield la.valid_o): +# yield + +# datas.append( (yield la.data_o) ) + +# return datas + +la = LogicAnalyzerCore(config, base_addr=0, interface=None) +# interface = SimulatedBusInterface(la) +# la.registers.interface = interface # unironically the least cursed part of this +# la.sample_mem.interface = interface # unironically the least cursed part of this + + +def print_data_at_addr(addr): + # place read transaction on the bus + yield la.addr_i.eq(addr) + yield la.data_i.eq(0) + yield la.rw_i.eq(0) + yield la.valid_i.eq(1) + yield + yield la.addr_i.eq(0) + yield la.valid_i.eq(0) + + # wait for output to be valid + while not (yield la.valid_o): + yield + + print(f"addr: {hex(addr)} data: {hex((yield la.data_o))}") + + +def set_logic_analyzer_register(name, data): + addr = la.registers.mmap[f"{name}_buf"]["addrs"][0] + + yield from write_register(la, 0, 0) + yield from write_register(la, addr, data) + yield from write_register(la, 0, 1) + yield from write_register(la, 0, 0) + + +def test_do_you_fucking_work(): + def testbench(): + # # ok nice what happens if we try to run the core, which includes: + yield from set_logic_analyzer_register("request_stop", 1) + yield from set_logic_analyzer_register("request_stop", 0) + + # setting triggers + yield from set_logic_analyzer_register("curly_op", la.operations["EQ"]) + yield from set_logic_analyzer_register("curly_arg", 4) + + # setting trigger mode + yield from set_logic_analyzer_register( + "trigger_mode", 0 + ) # right now this is not actually respected...oops + + # setting trigger location + yield from set_logic_analyzer_register("trigger_loc", 500) + + # starting capture + yield from set_logic_analyzer_register("request_start", 1) + yield from set_logic_analyzer_register("request_start", 0) + + # wait a few hundred clock cycles, see what happens + for _ in range(700): + yield + + # provide the trigger condition + yield la.probe_signals["curly"]["top_level"].eq(4) + + for _ in range(700): + yield + + # dump sample memory contents + yield from write_register(la, 0, 0) + yield from write_register(la, 0, 1) + yield from write_register(la, 0, 0) + + for addr in range(la.get_max_addr()): + yield from print_data_at_addr(addr) + + simulate(la, testbench, "la_core.vcd") diff --git a/test/test_mem_core_hw.py b/test/test_mem_core_hw.py new file mode 100644 index 0000000..cb3c1de --- /dev/null +++ b/test/test_mem_core_hw.py @@ -0,0 +1,114 @@ +from amaranth import * +from amaranth_boards.nexys4ddr import Nexys4DDRPlatform +from amaranth_boards.icestick import ICEStickPlatform +from manta import Manta +from manta.utils import * +import pytest +from random import randint, sample +from math import ceil, log2 + +""" +Fundamentally we want a function to generate a configuration (as a dictionary) +for a memory core given the width, depth, and platform. This could be a random +configuration, or a standard one. +""" + + +class MemoryCoreLoopbackTest(Elaboratable): + def __init__(self, platform, width, depth, port): + self.platform = platform + self.width = width + self.depth = depth + self.port = port + + self.config = self.platform_specific_config() + self.m = Manta(self.config) + + def platform_specific_config(self): + return { + "cores": { + "mem_core": { + "type": "memory_read_only", + "width": self.width, + "depth": self.depth, + }, + "io_core": { + "type": "io", + "outputs": { + "addr": ceil(log2(self.depth)), + "data": self.width, + "we": 1, + }, + }, + }, + "uart": { + "port": self.port, + "baudrate": 3e6, + "clock_freq": self.platform.default_clk_frequency, + }, + } + + def elaborate(self, platform): + m = Module() + m.submodules["manta"] = self.m + + uart_pins = platform.request("uart") + + m.d.comb += [ + self.m.mem_core.user_addr.eq(self.m.io_core.addr), + self.m.mem_core.user_data.eq(self.m.io_core.data), + self.m.mem_core.user_we.eq(self.m.io_core.we), + self.m.interface.rx.eq(uart_pins.rx.i), + uart_pins.tx.o.eq(self.m.interface.tx), + ] + + return m + + def build_and_program(self): + self.platform.build(self, do_program=True) + + def write_user_side(self, addr, data): + self.m.io_core.set_probe("we", 0) + self.m.io_core.set_probe("addr", addr) + self.m.io_core.set_probe("data", data) + self.m.io_core.set_probe("we", 1) + self.m.io_core.set_probe("we", 0) + + def verify_register(self, addr, expected_data): + data = self.m.mem_core.read_from_user_addr(addr) + + if data != expected_data: + raise ValueError( + f"Memory read from {hex(addr)} returned {hex(data)} instead of {hex(expected_data)}." + ) + + def verify(self): + self.build_and_program() + + # Read and write randomly from the bus side + for addr in sample(range(self.depth), k=self.depth): + data = randint(0, 2**self.width - 1) + self.write_user_side(addr, data) + self.verify_register(addr, data) + + +@pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") +def test_mem_core_xilinx(): + MemoryCoreLoopbackTest(Nexys4DDRPlatform(), 33, 1024, "/dev/ttyUSB2").verify() + + +@pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") +def test_mem_core_ice40(): + port = "/dev/ttyUSB1" + MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 2, port).verify() + MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 512, port).verify() + MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 1024, port).verify() + MemoryCoreLoopbackTest(ICEStickPlatform(), 8, 2, port).verify() + MemoryCoreLoopbackTest(ICEStickPlatform(), 8, 512, port).verify() + MemoryCoreLoopbackTest(ICEStickPlatform(), 8, 1024, port).verify() + MemoryCoreLoopbackTest(ICEStickPlatform(), 14, 512, port).verify() + MemoryCoreLoopbackTest(ICEStickPlatform(), 14, 1024, port).verify() + MemoryCoreLoopbackTest(ICEStickPlatform(), 16, 512, port).verify() + MemoryCoreLoopbackTest(ICEStickPlatform(), 16, 1024, port).verify() + MemoryCoreLoopbackTest(ICEStickPlatform(), 33, 512, port).verify() + MemoryCoreLoopbackTest(ICEStickPlatform(), 33, 1024, port).verify() diff --git a/test/test_mem_core_sim.py b/test/test_mem_core_sim.py new file mode 100644 index 0000000..675991f --- /dev/null +++ b/test/test_mem_core_sim.py @@ -0,0 +1,45 @@ +from manta.memory_core import ReadOnlyMemoryCore +from manta.utils import * +from random import randint, sample + + +def fill_mem_from_user_port(mem_core, depth): + for i in range(depth): + yield mem_core.user_addr.eq(i) + yield mem_core.user_data.eq(i) + yield mem_core.user_we.eq(1) + yield + + yield mem_core.user_we.eq(0) + yield + + +def verify_mem_core(width, depth, base_addr): + config = {"type": "memory", "width": width, "depth": depth} + mem_core = ReadOnlyMemoryCore(config, base_addr, interface=None) + + def testbench(): + yield from fill_mem_from_user_port(mem_core, depth) + + # Read from address sequentially + for i in range(depth): + yield from verify_register(mem_core, i + base_addr, i % (2**width)) + + # Read from addresses randomly + for i in sample(range(depth), k=depth): + yield from verify_register(mem_core, i + base_addr, i % (2**width)) + + simulate(mem_core, testbench) + + +def test_sweep_core_widths(): + for i in range(1, 64): + verify_mem_core(i, 128, 0) + + +def test_random_cores(): + for _ in range(5): + width = randint(0, 512) + depth = randint(0, 1024) + base_addr = randint(0, 2**16 - 1 - depth) + verify_mem_core(width, depth, base_addr) diff --git a/test/test_toolchains.py b/test/test_toolchains.py new file mode 100644 index 0000000..c21c26a --- /dev/null +++ b/test/test_toolchains.py @@ -0,0 +1,15 @@ +from amaranth_boards.test.blinky import * +from amaranth_boards.nexys4ddr import Nexys4DDRPlatform +from amaranth_boards.icestick import ICEStickPlatform +from manta.utils import * +import pytest + + +@pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") +def test_arty_a7_tools(): + Nexys4DDRPlatform().build(Blinky(), do_program=False) + + +@pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") +def test_ice40_tools(): + ICEStickPlatform().build(Blinky(), do_program=False) diff --git a/test/test_uart_rx_sim.py b/test/test_uart_rx_sim.py new file mode 100644 index 0000000..3604591 --- /dev/null +++ b/test/test_uart_rx_sim.py @@ -0,0 +1,65 @@ +from amaranth.sim import Simulator +from manta.uart import UARTReceiver +from manta.utils import * +from random import sample + + +uart_rx = UARTReceiver(clocks_per_baud=10) + + +def verify_receive(data): + # 8N1 serial, LSB sent first + data_bits = "0" + f"{data:08b}"[::-1] + "1" + data_bits = [int(bit) for bit in data_bits] + + valid_asserted_before = False + + for i in range(10 * uart_rx.clocks_per_baud): + bit_index = i // uart_rx.clocks_per_baud + + # Every cycle, run checks on uart_rx: + if (yield uart_rx.valid_o): + if (yield uart_rx.data_o) != data: + a = yield uart_rx.data_o + print(data_bits) + raise ValueError( + f"Incorrect byte presented - gave {hex(a)} instead of {hex(data)}!" + ) + + if bit_index != 9: + print(bit_index) + raise ValueError("Byte presented before it is complete!") + + if not valid_asserted_before: + valid_asserted_before = True + + else: + raise ValueError("Valid asserted more than once!") + + yield uart_rx.rx.eq(data_bits[bit_index]) + yield + + if not valid_asserted_before: + raise ValueError("Failed to assert valid!") + + +def test_all_possible_bytes(): + def testbench(): + yield uart_rx.rx.eq(1) + yield + + for i in range(0xFF): + yield from verify_receive(i) + + simulate(uart_rx, testbench) + + +def test_bytes_random_sample(): + def testbench(): + yield uart_rx.rx.eq(1) + yield + + for i in sample(range(0xFF), k=0xFF): + yield from verify_receive(i) + + simulate(uart_rx, testbench) diff --git a/test/test_uart_tx_sim.py b/test/test_uart_tx_sim.py new file mode 100644 index 0000000..c78d076 --- /dev/null +++ b/test/test_uart_tx_sim.py @@ -0,0 +1,57 @@ +from amaranth.sim import Simulator +from manta.uart import UARTTransmitter +from manta.utils import * +from random import sample + + +uart_tx = UARTTransmitter(clocks_per_baud=10) + + +def verify_bit_sequence(byte): + """ + Request a byte to be transmitted, and verify that the sequence of bits is correct. + """ + + # Request byte to be transmitted + yield uart_tx.data_i.eq(byte) + yield uart_tx.start_i.eq(1) + yield + yield uart_tx.data_i.eq(0) + yield uart_tx.start_i.eq(0) + yield + + # Check that data bit is correct on every clock baud period + + # 8N1 serial, LSB sent first + data_bits = "0" + f"{byte:08b}"[::-1] + "1" + data_bits = [int(bit) for bit in data_bits] + + for i in range(10 * uart_tx.clocks_per_baud): + bit_index = i // uart_tx.clocks_per_baud + + if (yield uart_tx.tx) != data_bits[bit_index]: + raise ValueError("Wrong bit in sequence!") + + if (yield uart_tx.done_o) and (bit_index != 9): + raise ValueError("Done asserted too early!") + + yield + + if not (yield uart_tx.done_o): + raise ValueError("Done not asserted at end of transmission!") + + +def test_all_possible_bytes(): + def testbench(): + for i in range(0xFF): + yield from verify_bit_sequence(i) + + simulate(uart_tx, testbench) + + +def test_bytes_random_sample(): + def testbench(): + for i in sample(range(0xFF), k=0xFF): + yield from verify_bit_sequence(i) + + simulate(uart_tx, testbench) diff --git a/test/test_verilog_gen.py b/test/test_verilog_gen.py new file mode 100644 index 0000000..65bed93 --- /dev/null +++ b/test/test_verilog_gen.py @@ -0,0 +1,14 @@ +from manta.cli import gen +from manta import Manta +import tempfile +import os + + +def test_verilog_gen(): + with tempfile.TemporaryDirectory() as tmp_dir: + print("Created temporary directory at", tmp_dir) + + gen("test/test_verilog_gen.yaml", tmp_dir + "/manta.v") + + if not os.path.isfile(tmp_dir + "/manta.v"): + raise ValueError("No Verilog file generated!") diff --git a/test/functional_sim/io_core_tb/manta.yaml b/test/test_verilog_gen.yaml similarity index 53% rename from test/functional_sim/io_core_tb/manta.yaml rename to test/test_verilog_gen.yaml index 975a96b..09feddc 100644 --- a/test/functional_sim/io_core_tb/manta.yaml +++ b/test/test_verilog_gen.yaml @@ -2,7 +2,6 @@ cores: io_core: type: io - user_clock: True inputs: probe0: 1 @@ -14,11 +13,15 @@ cores: probe4: width: 1 initial_value: 1 - probe5: 2 + probe5: + width: 2 + initial_value: 2 probe6: 8 - probe7: 20 + probe7: + width: 20 + initial_value: 65538 uart: - port: "auto" - baudrate: 3000000 - clock_freq: 100000000 + port: "/dev/ttyUSB1" + baudrate: 115200 + clock_freq: 12000000 From 0eddf129319d224b8fb2fc9ed3d68633a9c2972a Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 28 Dec 2023 14:27:59 -0800 Subject: [PATCH 02/89] banish .DS_Store --- .DS_Store | Bin 6148 -> 0 bytes .gitignore | 6 ++++++ src/manta/cli.py | 4 +++- 3 files changed, 9 insertions(+), 1 deletion(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 81229e8d26382bd3469cb3d9bb2de3f1954844ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~Jqp4=5QS&dB4Cr!avKle4VIuM@B*S@B?yZB9^E%TjnP_yyn&f-XEsBUS7b9H zqQmpN5$Q#wgBxXSVPuMYE)TiO>2iLYjtb*@FJ*K=2U&T%hcRwa*e@u>x3=Er<$CqZN!+^)bZi z-VT<$t|nVB+C_8t(7dzS6a&*}7cEF&S{)2jfC`Khm`C2*`M-mIoBu~GOsN1B_%j7` zvE6S6yi}g8AFpTiLso6w;GkcQ@b(jc#E#+>+ztE17GO=bASy8a2)GOkRN$uyya2`( B5q1Co diff --git a/.gitignore b/.gitignore index 8fb17e5..e85d6af 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,15 @@ +# Hidden files +.DS_Store +*.vscode/ + +# Python files venv/ manta.egg-info/ .pytest_cache __pycache__/ build/ +# Miscellaneous file types *.v *.sv *.vcd diff --git a/src/manta/cli.py b/src/manta/cli.py index d84eba5..4703523 100644 --- a/src/manta/cli.py +++ b/src/manta/cli.py @@ -2,7 +2,8 @@ from .manta import Manta from warnings import warn from sys import argv from pkg_resources import get_distribution -version = "v" + get_distribution('manta').version + +version = "v" + get_distribution("manta").version logo = f""" \033[96m (\.-./) @@ -26,6 +27,7 @@ Supported commands: help, ray display this splash screen (hehe...splash screen) """ + def help(): print(logo) From 11ad9fb56a0eedeb456fef003f8fd84b48f4effa Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 28 Dec 2023 14:33:45 -0800 Subject: [PATCH 03/89] move badges to same line --- README.md | 1 - ethernet_test.yml | 19 +++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 ethernet_test.yml diff --git a/README.md b/README.md index e49515c..495439f 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ ## Manta: An In-Situ Debugging Tool for Programmable Hardware ![run_tests](https://github.com/fischermoseley/manta/actions/workflows/run_tests.yml/badge.svg) ![build_docs](https://github.com/fischermoseley/manta/actions/workflows/build_docs.yml/badge.svg) - [![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0) [![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) diff --git a/ethernet_test.yml b/ethernet_test.yml new file mode 100644 index 0000000..9ca6abf --- /dev/null +++ b/ethernet_test.yml @@ -0,0 +1,19 @@ +--- +cores: + io_core: + type: io + + inputs: + dhcp_done: 1 + dhcp_ip_address: 32 + dhcp_timeout: 1 + + outputs: + dhcp_start: 1 + ip_address: 32 + + +uart: + port: "/dev/ttyUSB1" + baudrate: 115200 + clock_freq: 12000000 From 34f6a5433037072c1718c8ba7196246215990c91 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 28 Dec 2023 15:30:55 -0800 Subject: [PATCH 04/89] fix integer bounds, move to self-hosted runner --- .github/workflows/run_tests.yml | 12 +++++++----- src/manta/io_core.py | 22 ++++++++++++++++++++++ src/manta/utils.py | 2 +- 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 331fb58..4964dbb 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -2,12 +2,14 @@ name: run_tests on: [push] jobs: all: - runs-on: ubuntu-latest + runs-on: self-hosted steps: - uses: actions/checkout@v3 - name: Install Manta from Source run: | + ls -lah + pwd python -m pip install -U pip # omitting the following commmand causes the version of setuptools @@ -19,13 +21,13 @@ jobs: python -m pip install ".[dev]" + - name: Run tests + run: | # export tool paths export VIVADO=/tools/Xilinx/Vivado/2023.1/bin/vivado export YOSYS=/tools/oss-cad-suite/bin/yosys - export NEXTPNR_ICE40=/tools/oss-cad-suite/bin/nextpnr_ice40 + export NEXTPNR_ICE40=/tools/oss-cad-suite/bin/nextpnr-ice40 export ICEPACK=/tools/oss-cad-suite/bin/icepack export ICEPROG=/tools/oss-cad-suite/bin/iceprog - - - name: Run tests - run: make test \ No newline at end of file + make test \ No newline at end of file diff --git a/src/manta/io_core.py b/src/manta/io_core.py index 97d869f..c12096a 100644 --- a/src/manta/io_core.py +++ b/src/manta/io_core.py @@ -237,6 +237,28 @@ class IOCore(Elaboratable): return self.max_addr def set_probe(self, probe_name, value): + # check that probe is an output probe + if probe_name not in self.config["outputs"]: + raise ValueError(f"Output probe '{probe_name}' not found.") + + # check that value is an integer + if not isinstance(value, int): + raise ValueError("Value must be an integer.") + + # get the width of the probe, make sure value isn't too large for the probe + attrs = self.config["outputs"][probe_name] + if isinstance(attrs, int): + width = attrs + + if isinstance(attrs, dict): + width = attrs["width"] + + if value > 0 and value > 2**width - 1: + raise ValueError("Unsigned integer too large.") + + if value < 0 and value < -(2 ** (width - 1)): + raise ValueError("Signed integer too large.") + # set value in buffer addrs = self.mmap[probe_name + "_buf"]["addrs"] datas = value_to_words(value, len(addrs)) diff --git a/src/manta/utils.py b/src/manta/utils.py index a40fa0a..068501d 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -13,7 +13,7 @@ def words_to_value(data): if d > 0 and d > 2**16 - 1: raise ValueError("Unsigned integer too large.") - if d < 0 and d < -(2**15 - 1): + if d < 0 and d < -(2**15): raise ValueError("Signed integer too large.") return int("".join([f"{i:016b}" for i in data[::-1]]), 2) From ac3bbf46b207861eb9b18d86db1737dff6c46466 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 28 Dec 2023 15:33:31 -0800 Subject: [PATCH 05/89] testing self-hosted runner --- .github/workflows/run_tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 4964dbb..8e864e6 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -10,7 +10,8 @@ jobs: run: | ls -lah pwd - python -m pip install -U pip + pip freeze + python3 -m pip install -U pip # omitting the following commmand causes the version of setuptools # used by python to get confused, and it doesn't detect the name From 17d2b8b1dad74dfe17ee8d4aa156f51bb052362a Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 28 Dec 2023 15:41:01 -0800 Subject: [PATCH 06/89] make self-hosted runner install into a venv --- .github/workflows/run_tests.yml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 8e864e6..c8929e5 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -8,9 +8,11 @@ jobs: - name: Install Manta from Source run: | - ls -lah - pwd - pip freeze + # Make venv + python3 -m venv venv/ + source venv/bin/activate + + # Update pip python3 -m pip install -U pip # omitting the following commmand causes the version of setuptools @@ -20,6 +22,7 @@ jobs: # https://github.com/pypa/setuptools/issues/3269#issuecomment-1254507377 export DEB_PYTHON_INSTALL_LAYOUT=deb_system + # Install Manta, with optional dev-only dependencies python -m pip install ".[dev]" - name: Run tests From 9867e369cb27452103e3662fef525a7973f8724d Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 28 Dec 2023 17:57:21 -0800 Subject: [PATCH 07/89] update playback module, needs pipelining --- .github/workflows/run_tests.yml | 2 +- src/manta/cli.py | 27 +++++------------- src/manta/logic_analyzer_core.py | 48 ++++++++++++++++++++++---------- 3 files changed, 42 insertions(+), 35 deletions(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index c8929e5..d87e932 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -23,7 +23,7 @@ jobs: export DEB_PYTHON_INSTALL_LAYOUT=deb_system # Install Manta, with optional dev-only dependencies - python -m pip install ".[dev]" + python3 -m pip install ".[dev]" - name: Run tests run: | diff --git a/src/manta/cli.py b/src/manta/cli.py index 4703523..4595f51 100644 --- a/src/manta/cli.py +++ b/src/manta/cli.py @@ -6,34 +6,21 @@ from pkg_resources import get_distribution version = "v" + get_distribution("manta").version logo = f""" -\033[96m (\.-./) -\033[96m / \\ -\033[96m .' : '. -\033[96m _.-'` ' `'-._ \033[34;49;1m | \033[34;49;1m Manta {version} \033[00m -\033[96m .-' : '-. \033[34;49;1m | \033[34;49;3m An In-Situ Debugging Tool for Programmable Hardware \033[00m -\033[96m ,'_.._ . _.._', \033[34;49;1m | \033[34;49m https://github.com/fischermoseley/manta \033[00m -\033[96m '` `'-. ' .-'` -\033[96m '. : .' \033[34;49;1m | \033[34;49;3m Originally created by Fischer Moseley \033[00m -\033[96m \_. ._/ -\033[96m \ |^| -\033[96m | | ; -\033[96m \\'.___.' / -\033[96m '-....-' \033[00m +Manta {version} -Supported commands: - gen [config_file] [verilog_file] generate a verilog file specifying the Manta module from a given configuration file, and save to the provided path - capture [config_file] [la_core_name] [vcd_file] [verilog_file] start a capture on the specified core, and save the results to a .vcd or .v file at the provided path(s) - ports list all available serial ports - help, ray display this splash screen (hehe...splash screen) +Usage: + gen [config_file] [verilog_file] Generate a verilog file specifying the Manta module from a given configuration file, and save to the provided path + capture [config_file] [la_core_name] [vcd_file] [verilog_file] Start a capture on the specified core, and save the results to a .vcd or .v file at the provided path(s) + ports List all available serial ports + help Display this help menu """ - def help(): print(logo) def wrong_args(): - raise ValueError('Wrong number of arguments, run "manta help" for usage.') + print('Wrong number of arguments, run "manta help" for usage.') def gen(config_path, output_path): diff --git a/src/manta/logic_analyzer_core.py b/src/manta/logic_analyzer_core.py index 4acedd5..cc59fc2 100644 --- a/src/manta/logic_analyzer_core.py +++ b/src/manta/logic_analyzer_core.py @@ -488,15 +488,15 @@ class LogicAnalyzerCapture: return LogicAnalyzerPlayback(self.data, self.config) def export_playback_verilog(self, path): - la = LogicAnalyzerPlayback(self.data, self.config) + lap = LogicAnalyzerPlayback(self.data, self.config) from amaranth.back import verilog with open(path, "w") as f: f.write( verilog.convert( - la, + lap, name="logic_analyzer_playback", - ports=la.get_top_level_ports(), + ports=lap.get_top_level_ports(), strip_internal_attrs=True, ) ) @@ -508,8 +508,13 @@ class LogicAnalyzerPlayback(Elaboratable): self.config = config # State Machine - self.enable = Signal(1) + self.start = Signal(1) self.done = Signal(1) + self.states = { + "IDLE" : 0, + "RUN" : 1, + "DONE" : 2 + } # Top-Level Probe signals self.top_level_probes = {} @@ -530,6 +535,31 @@ class LogicAnalyzerPlayback(Elaboratable): m.submodules["mem"] = self.mem m.d.comb += self.read_port.en.eq(1) + state = Signal(range(len(self.states))) + addr = self.read_port.addr + + # Run state machine + with m.If(state == self.states["IDLE"]): + with m.If(self.start): + m.d.sync += state.eq(self.states["RUN"]) + m.d.sync += addr.eq(0) + + with m.Elif(state == self.states["RUN"]): + with m.If(addr < self.config["sample_depth"]): + m.d.sync += addr.eq(addr + 1) + + with m.Else(): + m.d.sync += state.eq(self.states["DONE"]) + m.d.sync += self.done.eq(1) + + + with m.Else(state == self.states["DONE"]): + with m.If(self.start): + m.d.sync += self.done.eq(0) + m.d.sync += state.eq(self.states["RUN"]) + m.d.sync += addr.eq(0) + + # Assign the probe values by part-selecting from the data port lower = 0 for name, width in reversed(self.config["probes"].items()): @@ -544,15 +574,5 @@ class LogicAnalyzerPlayback(Elaboratable): lower += width - # Iterate through the samples if saved - with m.If((self.enable) & (~self.done)): - with m.If(self.read_port.addr < (self.config["sample_depth"] - 1)): - m.d.sync += self.read_port.addr.eq(self.read_port.addr + 1) - - with m.Else(): - m.d.sync += self.done.eq(1) - - return m - def get_top_level_ports(self): return [self.enable, self.done] + list(self.top_level_probes.values()) From 90a5dba665cc7fa04e6c682ffd740d7c243af5b4 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 28 Dec 2023 19:20:06 -0800 Subject: [PATCH 08/89] finish playback module pipelining --- pyproject.toml | 1 - src/manta/logic_analyzer_core.py | 42 ++++++++++---------------------- 2 files changed, 13 insertions(+), 30 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 8e9b9e9..575c948 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,6 @@ dependencies = [ "PyYAML", "pyserial", "pyvcd", - "scapy" ] requires-python = ">=3.7" diff --git a/src/manta/logic_analyzer_core.py b/src/manta/logic_analyzer_core.py index cc59fc2..b3915ee 100644 --- a/src/manta/logic_analyzer_core.py +++ b/src/manta/logic_analyzer_core.py @@ -509,12 +509,7 @@ class LogicAnalyzerPlayback(Elaboratable): # State Machine self.start = Signal(1) - self.done = Signal(1) - self.states = { - "IDLE" : 0, - "RUN" : 1, - "DONE" : 2 - } + self.idle = Signal(1, reset=1) # Top-Level Probe signals self.top_level_probes = {} @@ -528,37 +523,24 @@ class LogicAnalyzerPlayback(Elaboratable): init=self.data, ) - self.read_port = self.mem.read_port() + self.read_port = self.mem.read_port(domain="comb") def elaborate(self, platform): m = Module() m.submodules["mem"] = self.mem - m.d.comb += self.read_port.en.eq(1) - - state = Signal(range(len(self.states))) - addr = self.read_port.addr # Run state machine - with m.If(state == self.states["IDLE"]): + with m.If(self.idle): with m.If(self.start): - m.d.sync += state.eq(self.states["RUN"]) - m.d.sync += addr.eq(0) + m.d.sync += self.idle.eq(0) - with m.Elif(state == self.states["RUN"]): - with m.If(addr < self.config["sample_depth"]): - m.d.sync += addr.eq(addr + 1) + with m.Else(): + with m.If(self.read_port.addr == self.config["sample_depth"] - 1): + m.d.sync += self.idle.eq(1) + m.d.sync += self.read_port.addr.eq(0) with m.Else(): - m.d.sync += state.eq(self.states["DONE"]) - m.d.sync += self.done.eq(1) - - - with m.Else(state == self.states["DONE"]): - with m.If(self.start): - m.d.sync += self.done.eq(0) - m.d.sync += state.eq(self.states["RUN"]) - m.d.sync += addr.eq(0) - + m.d.sync += self.read_port.addr.eq(self.read_port.addr + 1) # Assign the probe values by part-selecting from the data port lower = 0 @@ -566,7 +548,7 @@ class LogicAnalyzerPlayback(Elaboratable): signal = self.top_level_probes[name] # Set output probe to zero if we're not - with m.If(~self.done): + with m.If(~self.idle): m.d.comb += signal.eq(self.read_port.data[lower : lower + width]) with m.Else(): @@ -574,5 +556,7 @@ class LogicAnalyzerPlayback(Elaboratable): lower += width + return m + def get_top_level_ports(self): - return [self.enable, self.done] + list(self.top_level_probes.values()) + return [self.start, self.idle] + list(self.top_level_probes.values()) From d31aa2650e9b71e8d724f5e5d88d484cfb43d729 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 28 Dec 2023 21:46:44 -0800 Subject: [PATCH 09/89] switch playback to synchronous read ports, make things synthesizable --- src/manta/logic_analyzer_core.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/manta/logic_analyzer_core.py b/src/manta/logic_analyzer_core.py index b3915ee..5368c49 100644 --- a/src/manta/logic_analyzer_core.py +++ b/src/manta/logic_analyzer_core.py @@ -509,7 +509,7 @@ class LogicAnalyzerPlayback(Elaboratable): # State Machine self.start = Signal(1) - self.idle = Signal(1, reset=1) + self.valid = Signal(1) # Top-Level Probe signals self.top_level_probes = {} @@ -523,32 +523,39 @@ class LogicAnalyzerPlayback(Elaboratable): init=self.data, ) - self.read_port = self.mem.read_port(domain="comb") + self.read_port = self.mem.read_port() def elaborate(self, platform): m = Module() m.submodules["mem"] = self.mem - # Run state machine - with m.If(self.idle): + m.d.comb += self.read_port.en.eq(1) + + # State Machine + busy = Signal(1) + with m.If(~busy): with m.If(self.start): - m.d.sync += self.idle.eq(0) + m.d.sync += busy.eq(1) + # m.d.sync += self.read_port.addr.eq(1) with m.Else(): with m.If(self.read_port.addr == self.config["sample_depth"] - 1): - m.d.sync += self.idle.eq(1) + m.d.sync += busy.eq(0) m.d.sync += self.read_port.addr.eq(0) with m.Else(): m.d.sync += self.read_port.addr.eq(self.read_port.addr + 1) + # Pipeline to accomodate for the 2-cycle latency in the RAM + m.d.sync += self.valid.eq(busy) + # Assign the probe values by part-selecting from the data port lower = 0 for name, width in reversed(self.config["probes"].items()): signal = self.top_level_probes[name] # Set output probe to zero if we're not - with m.If(~self.idle): + with m.If(self.valid): m.d.comb += signal.eq(self.read_port.data[lower : lower + width]) with m.Else(): @@ -559,4 +566,4 @@ class LogicAnalyzerPlayback(Elaboratable): return m def get_top_level_ports(self): - return [self.start, self.idle] + list(self.top_level_probes.values()) + return [self.start, self.valid] + list(self.top_level_probes.values()) From 07ae9cc2e83f92fc86f677f2c821c5a1fe046172 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 31 Dec 2023 20:07:47 -0800 Subject: [PATCH 10/89] get playback module from class method --- src/manta/logic_analyzer_core.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/manta/logic_analyzer_core.py b/src/manta/logic_analyzer_core.py index 5368c49..245b467 100644 --- a/src/manta/logic_analyzer_core.py +++ b/src/manta/logic_analyzer_core.py @@ -484,11 +484,11 @@ class LogicAnalyzerCapture: vcd_file.close() - def export_playback_module(self, path): + def export_playback_module(self): return LogicAnalyzerPlayback(self.data, self.config) def export_playback_verilog(self, path): - lap = LogicAnalyzerPlayback(self.data, self.config) + lap = self.export_playback_module() from amaranth.back import verilog with open(path, "w") as f: From ee18e10ae18833c2dfc09e9345b08d8a63307cf7 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Wed, 3 Jan 2024 13:35:09 -0700 Subject: [PATCH 11/89] add immediate capture mode to logic analyzer --- src/manta/logic_analyzer_core.py | 106 +++++++++++++++++++------------ test/test_logic_analyzer_sim.py | 62 +----------------- 2 files changed, 66 insertions(+), 102 deletions(-) diff --git a/src/manta/logic_analyzer_core.py b/src/manta/logic_analyzer_core.py index 245b467..8b40794 100644 --- a/src/manta/logic_analyzer_core.py +++ b/src/manta/logic_analyzer_core.py @@ -247,61 +247,83 @@ class LogicAnalyzerCore(Elaboratable): Cat(attrs["triggered"] for attrs in self.probe_signals.values()).any() ) + def increment_mod_sample_depth(self, m, signal): + # m.d.sync += signal.eq((signal + 1) % self.config["sample_depth"]) + + with m.If(signal == self.config["sample_depth"] - 1): + m.d.sync += signal.eq(0) + + with m.Else(): + m.d.sync += signal.eq(signal + 1) + def run_state_machine(self, m): - self.prev_request_start = Signal(1) - self.prev_request_stop = Signal(1) + prev_request_start = Signal(1) + prev_request_stop = Signal(1) + + request_start = self.registers.request_start + request_stop = self.registers.request_stop + trigger_mode = self.registers.trigger_mode + trigger_loc = self.registers.trigger_loc + state = self.registers.state + rp = self.registers.read_pointer + wp = self.registers.write_pointer + we = self.sample_mem.user_we + + m.d.comb += self.sample_mem.user_addr.eq(wp) # Rising edge detection for start/stop requests - m.d.sync += self.prev_request_start.eq(self.registers.request_start) - m.d.sync += self.prev_request_stop.eq(self.registers.request_stop) + m.d.sync += prev_request_start.eq(request_start) + m.d.sync += prev_request_stop.eq(request_stop) - m.d.comb += self.sample_mem.user_addr.eq(self.registers.write_pointer) + with m.If(state == self.states["IDLE"]): + m.d.sync += wp.eq(0) + m.d.sync += rp.eq(0) + m.d.sync += we.eq(0) - with m.If(self.registers.state == self.states["IDLE"]): - m.d.sync += self.registers.write_pointer.eq(0) - m.d.sync += self.registers.read_pointer.eq(0) - m.d.sync += self.sample_mem.user_we.eq(0) # or something like this - - with m.If((self.registers.request_start) & (~self.prev_request_start)): - m.d.sync += self.registers.state.eq(self.states["MOVE_TO_POSITION"]) - - with m.Elif(self.registers.state == self.states["MOVE_TO_POSITION"]): - m.d.sync += self.registers.write_pointer.eq( - self.registers.write_pointer + 1 - ) - m.d.sync += self.sample_mem.user_we.eq(1) - - with m.If(self.registers.write_pointer == self.registers.trigger_loc): - with m.If(self.trig): - m.d.sync += self.registers.state.eq(self.states["CAPTURING"]) + with m.If((request_start) & (~prev_request_start)): + m.d.sync += we.eq(1) + with m.If(trigger_mode == self.trigger_modes["IMMEDIATE"]): + m.d.sync += state.eq(self.states["CAPTURING"]) with m.Else(): - m.d.sync += self.registers.state.eq(self.states["IN_POSITION"]) + with m.If(trigger_loc == 0): + m.d.sync += state.eq(self.states["IN_POSITION"]) - with m.Elif(self.registers.state == self.states["IN_POSITION"]): - m.d.sync += self.registers.write_pointer.eq( - (self.registers.write_pointer + 1) % self.config["sample_depth"] - ) - m.d.sync += self.registers.read_pointer.eq( - (self.registers.read_pointer + 1) % self.config["sample_depth"] - ) - m.d.sync += self.sample_mem.user_we.eq(1) + with m.Else(): + m.d.sync += state.eq(self.states["MOVE_TO_POSITION"]) + + m.d.sync += state.eq(self.states["MOVE_TO_POSITION"]) + + with m.Elif(state == self.states["MOVE_TO_POSITION"]): + m.d.sync += wp.eq(wp + 1) + + with m.If(wp == trigger_loc): + with m.If(self.trig): + m.d.sync += state.eq(self.states["CAPTURING"]) + + with m.Else(): + m.d.sync += state.eq(self.states["IN_POSITION"]) + self.increment_mod_sample_depth(m, rp) + + with m.Elif(state == self.states["IN_POSITION"]): + self.increment_mod_sample_depth(m, wp) with m.If(self.trig): - m.d.sync += self.registers.state.eq(self.states["CAPTURING"]) - - with m.Elif(self.registers.state == self.states["CAPTURING"]): - with m.If(self.registers.write_pointer == self.registers.read_pointer): - m.d.sync += self.sample_mem.user_we.eq(0) - m.d.sync += self.registers.state.eq(self.states["CAPTURED"]) + m.d.sync += state.eq(self.states["CAPTURING"]) with m.Else(): - m.d.sync += self.registers.write_pointer.eq( - (self.registers.write_pointer + 1) % self.config["sample_depth"] - ) + self.increment_mod_sample_depth(m, rp) - with m.If((self.registers.request_stop) & (~self.prev_request_stop)): - m.d.sync += self.registers.state.eq(self.states["IDLE"]) + with m.Elif(state == self.states["CAPTURING"]): + with m.If(wp == rp): + m.d.sync += we.eq(0) + m.d.sync += state.eq(self.states["CAPTURED"]) + + with m.Else(): + self.increment_mod_sample_depth(m, wp) + + with m.If((request_stop) & (~prev_request_stop)): + m.d.sync += state.eq(self.states["IDLE"]) def elaborate(self, platform): m = Module() diff --git a/test/test_logic_analyzer_sim.py b/test/test_logic_analyzer_sim.py index b35e682..0f37aae 100644 --- a/test/test_logic_analyzer_sim.py +++ b/test/test_logic_analyzer_sim.py @@ -6,70 +6,12 @@ from random import sample config = { "type": "logic_analyzer", "sample_depth": 1024, - "trigger_loc": 500, + "trigger_loc": 512, "probes": {"larry": 1, "curly": 3, "moe": 9}, "triggers": ["moe RISING"], } -# class SimulatedBusInterface(): -# def __init__(self, core): -# self.core = core - -# def write(self, addrs, datas): -# # Handle a single integer address and data -# if isinstance(addrs, int) and isinstance(datas, int): -# return self.write([addrs], [datas]) - -# # Make sure address and datas are all integers -# if not isinstance(addrs, list) or not isinstance(datas, list): -# raise ValueError( -# "Write addresses and data must be an integer or list of integers." -# ) - -# if not all(isinstance(a, int) for a in addrs): -# raise ValueError("Write addresses must be all be integers.") - -# if not all(isinstance(d, int) for d in datas): -# raise ValueError("Write data must all be integers.") - -# # I'm not sure if it's necessary to split outputs into chunks -# # I think the output buffer doesn't really drop stuff, just the input buffer - -# for addr, data in zip(addrs, datas): -# yield from write_register(self.core, addr, data) - -# def read(self, addrs): -# # Handle a single integer address -# if isinstance(addrs, int): -# return self.read([addrs])[0] - -# # Make sure all list elements are integers -# if not all(isinstance(a, int) for a in addrs): -# raise ValueError("Read address must be an integer or list of integers.") - -# datas = [] -# for addr in addrs: -# yield la.addr_i.eq(addr) -# yield la.data_i.eq(0) -# yield la.rw_i.eq(0) -# yield la.valid_i.eq(1) -# yield -# yield la.addr_i.eq(0) -# yield la.valid_i.eq(0) - -# # wait for output to be valid -# while not (yield la.valid_o): -# yield - -# datas.append( (yield la.data_o) ) - -# return datas - la = LogicAnalyzerCore(config, base_addr=0, interface=None) -# interface = SimulatedBusInterface(la) -# la.registers.interface = interface # unironically the least cursed part of this -# la.sample_mem.interface = interface # unironically the least cursed part of this - def print_data_at_addr(addr): # place read transaction on the bus @@ -113,7 +55,7 @@ def test_do_you_fucking_work(): ) # right now this is not actually respected...oops # setting trigger location - yield from set_logic_analyzer_register("trigger_loc", 500) + yield from set_logic_analyzer_register("trigger_loc", 511) # starting capture yield from set_logic_analyzer_register("request_start", 1) From a11605b2b7b15b1f8c55fee10aa385cb62ad1a34 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Fri, 5 Jan 2024 16:50:25 -0800 Subject: [PATCH 12/89] refactor logic analyzer --- src/manta/cli.py | 1 + src/manta/logic_analyzer/__init__.py | 351 +++++++++++++ src/manta/logic_analyzer/fsm.py | 126 +++++ src/manta/logic_analyzer/playback.py | 68 +++ src/manta/logic_analyzer/sample_mem.py | 11 + src/manta/logic_analyzer/trigger_block.py | 126 +++++ src/manta/logic_analyzer_core.py | 591 ---------------------- src/manta/manta.py | 2 +- test/test_logic_analyzer_sim.py | 42 +- 9 files changed, 712 insertions(+), 606 deletions(-) create mode 100644 src/manta/logic_analyzer/__init__.py create mode 100644 src/manta/logic_analyzer/fsm.py create mode 100644 src/manta/logic_analyzer/playback.py create mode 100644 src/manta/logic_analyzer/sample_mem.py create mode 100644 src/manta/logic_analyzer/trigger_block.py delete mode 100644 src/manta/logic_analyzer_core.py diff --git a/src/manta/cli.py b/src/manta/cli.py index 4595f51..7528cf8 100644 --- a/src/manta/cli.py +++ b/src/manta/cli.py @@ -15,6 +15,7 @@ Usage: help Display this help menu """ + def help(): print(logo) diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py new file mode 100644 index 0000000..68d858d --- /dev/null +++ b/src/manta/logic_analyzer/__init__.py @@ -0,0 +1,351 @@ +from amaranth import * +from warnings import warn +from ..utils import * +from .trigger_block import LogicAnalyzerTriggerBlock +from .fsm import LogicAnalyzerFSM +from .sample_mem import LogicAnalyzerSampleMemory +from .playback import LogicAnalyzerPlayback + + +class LogicAnalyzerCore(Elaboratable): + """ """ + + def __init__(self, config, base_addr, interface): + self.config = config + self.check_config(config) + + # Bus Input + self.addr_i = Signal(16) + self.data_i = Signal(16) + self.rw_i = Signal(1) + self.valid_i = Signal(1) + + # Bus Output + self.addr_o = Signal(16) + self.data_o = Signal(16) + self.rw_o = Signal(1) + self.valid_o = Signal(1) + + self.probes = [ + Signal(width, name=name) for name, width in self.config["probes"].items() + ] + + # Submodules + self.fsm = LogicAnalyzerFSM(self.config, base_addr, interface) + self.trig_blk = LogicAnalyzerTriggerBlock( + self.config, self.fsm.get_max_addr() + 1, interface + ) + self.sample_mem = LogicAnalyzerSampleMemory( + self.config, self.trig_blk.get_max_addr() + 1, interface + ) + + # Top-Level Probes: + for name, width in self.config["probes"].items(): + if hasattr(self, name): + raise ValueError( + f"Unable to assign probe name '{name}' as it clashes with a reserved name in the backend. Please rename the probe." + ) + + setattr(self, name, Signal(width, name=name)) + + def check_config(self, config): + # Check for unrecognized options + valid_options = [ + "type", + "sample_depth", + "probes", + "triggers", + "trigger_loc", + "trigger_mode", + ] + for option in config: + if option not in valid_options: + warn(f"Ignoring unrecognized option '{option}' in Logic Analyzer.") + + # Check sample depth is provided and positive + if "sample_depth" not in config: + raise ValueError("Logic Analyzer must have sample_depth specified.") + + if not isinstance(config["sample_depth"], int): + raise ValueError("Logic Analyzer sample_depth must be an integer.") + + if config["sample_depth"] <= 0: + raise ValueError("Logic Analyzer sample_depth must be positive.") + + # Check probes + if "probes" not in config: + raise ValueError("Logic Analyzer must have at least one probe specified.") + + if len(config["probes"]) == 0: + raise ValueError("Logic Analyzer must have at least one probe specified.") + + for name, width in config["probes"].items(): + if width < 0: + raise ValueError(f"Width of probe {name} must be positive.") + + # Check triggers + if "triggers" not in config: + raise ValueError("Logic Analyzer must have at least one trigger specified.") + + if len(config["triggers"]) == 0: + raise ValueError("Logic Analyzer must have at least one trigger specified.") + + # Check trigger location + if "trigger_loc" in config: + if not isinstance(config["trigger_loc"], int): + raise ValueError("Trigger location must be an integer.") + + if config["trigger_loc"] < 0: + raise ValueError("Trigger location must be positive.") + + if config["trigger_loc"] > config["sample_depth"]: + raise ValueError("Trigger location cannot exceed sample depth.") + + # Check trigger mode, if provided + if "trigger_mode" in config: + valid_modes = ["single_shot", "incremental", "immediate"] + if config["trigger_mode"] not in valid_modes: + raise ValueError( + f"Unrecognized trigger mode {config['trigger_mode']} provided." + ) + + if config["trigger_mode"] == "incremental": + if "trigger_loc" in config: + warn( + "Ignoring option 'trigger_loc', as 'trigger_mode' is set to immediate, and there is no trigger condition to wait for." + ) + + # Check triggers themselves + for trigger in config["triggers"]: + if not isinstance(trigger, str): + raise ValueError("Trigger must be specified with a string.") + + # Trigger conditions may be composed of either two or three components, + # depending on the operation specified. In the case of operations that + # don't need an argument (like DISABLE, RISING, FALLING, CHANGING) or + # three statements in + + # Check the trigger operations + components = trigger.strip().split(" ") + if len(components) == 2: + name, op = components + if op not in ["DISABLE", "RISING", "FALLING", "CHANGING"]: + raise ValueError( + f"Unable to interpret trigger condition '{trigger}'." + ) + + elif len(components) == 3: + name, op, arg = components + if op not in ["GT", "LT", "GEQ", "LEQ", "EQ", "NEQ"]: + raise ValueError( + f"Unable to interpret trigger condition '{trigger}'." + ) + + else: + raise ValueError(f"Unable to interpret trigger condition '{trigger}'.") + + # Check probe names + if components[0] not in config["probes"]: + raise ValueError(f"Unknown probe name '{components[0]}' specified.") + + def elaborate(self, platform): + m = Module() + + # Add submodules + m.submodules["fsm"] = fsm = self.fsm + m.submodules["sample_mem"] = sample_mem = self.sample_mem + m.submodules["trig_blk"] = trig_blk = self.trig_blk + + # Concat all the probes together, and feed to input of sample memory + # (it is necessary to reverse the order such that first probe occupies + # the lowest location in memory) + m.d.comb += sample_mem.user_data.eq(Cat(self.probes[::-1])) + + # Wire bus connections between internal modules + m.d.comb += [ + # Bus Connections + fsm.addr_i.eq(self.addr_i), + fsm.data_i.eq(self.data_i), + fsm.rw_i.eq(self.rw_i), + fsm.valid_i.eq(self.valid_i), + trig_blk.addr_i.eq(fsm.addr_o), + trig_blk.data_i.eq(fsm.data_o), + trig_blk.rw_i.eq(fsm.rw_o), + trig_blk.valid_i.eq(fsm.valid_o), + sample_mem.addr_i.eq(trig_blk.addr_o), + sample_mem.data_i.eq(trig_blk.data_o), + sample_mem.rw_i.eq(trig_blk.rw_o), + sample_mem.valid_i.eq(trig_blk.valid_o), + self.addr_o.eq(sample_mem.addr_o), + self.data_o.eq(sample_mem.data_o), + self.rw_o.eq(sample_mem.rw_o), + self.valid_o.eq(sample_mem.valid_o), + # Non-bus Connections + fsm.trigger.eq(trig_blk.trig), + sample_mem.user_we.eq(fsm.write_enable), + ] + + return m + + def get_top_level_ports(self): + return self.probes + + def get_max_addr(self): + return self.sample_mem.get_max_addr() + + def set_triggers(self): + # reset all triggers to zero + for p in self.probes: + self.trig_blk.r.set_probe(p.name + "_op", 0) + self.trig_blk.r.set_probe(p.name + "_arg", 0) + + # set triggers + for trigger in self.config["triggers"]: + components = trigger.strip().split(" ") + + # Handle triggers that don't need an argument + if len(components) == 2: + name, op = components + self.trig_blk.r.set_probe(name + "_op", self.operations[op]) + + # Handle triggers that do need an argument + elif len(components) == 3: + name, op, arg = components + self.registers.set_probe(name + "_op", self.operations[op]) + self.registers.set_probe(name + "_arg", int(arg)) + + def capture(self, verbose=False): + print_if_verbose = lambda x: print(x) if verbose else None + + # If core is not in IDLE state, request that it return to IDLE + print_if_verbose(" -> Resetting core...") + state = self.registers.get_probe("state") + if state != self.states["IDLE"]: + self.registers.set_probe("request_stop", 0) + self.registers.set_probe("request_stop", 1) + self.registers.set_probe("request_stop", 0) + + if self.registers.get_probe("state") != self.states["IDLE"]: + raise ValueError("Logic analyzer did not reset to IDLE state.") + + # Set triggers + print_if_verbose(" -> Setting triggers...") + self.set_triggers() + + # Set trigger mode, default to single-shot if user didn't specify a mode + print_if_verbose(" -> Setting trigger mode...") + if "trigger_mode" in self.config: + self.registers.set_probe("trigger_mode", self.config["trigger_mode"]) + + else: + self.registers.set_probe("trigger_mode", self.trigger_modes["SINGLE_SHOT"]) + + # Set trigger location + print_if_verbose(" -> Setting trigger location...") + self.registers.set_probe("trigger_loc", self.config["trigger_loc"]) + + # Send a start request to the state machine + print_if_verbose(" -> Starting capture...") + self.registers.set_probe("request_start", 1) + self.registers.set_probe("request_start", 0) + + # Poll the state machine's state, and wait for the capture to complete + print_if_verbose(" -> Waiting for capture to complete...") + while self.registers.get_probe("state") != self.states["CAPTURED"]: + pass + + # Read out the entirety of the sample memory + print_if_verbose(" -> Reading sample memory contents...") + addrs = list(range(self.config["sample_depth"])) + raw_capture = self.sample_mem.read_from_user_addr(addrs) + + # Revolve the memory around the read_pointer, such that all the beginning + # of the caputure is at the first element + print_if_verbose(" -> Checking read pointer and revolving memory...") + read_pointer = self.registers.get_probe("read_pointer") + + data = raw_capture[read_pointer:] + raw_capture[:read_pointer] + return LogicAnalyzerCapture(data, self.config) + + +class LogicAnalyzerCapture: + def __init__(self, data, config): + self.data = data + self.config = config + + def get_trigger_loc(self): + return self.config["trigger_loc"] + + def get_trace(self, probe_name): + # sum up the widths of all the probes below this one + lower = 0 + for name, width in self.config["probes"].items(): + if name == probe_name: + break + + lower += width + + # add the width of the probe we'd like + upper = lower + self.config["probes"][probe_name] + + total_probe_width = sum(self.config["probes"].values()) + binary = [f"{d:0{total_probe_width}b}" for d in self.data] + return [int(b[lower:upper], 2) for b in binary] + + def export_vcd(self, path): + from vcd import VCDWriter + from datetime import datetime + + # Use the same datetime format that iVerilog uses + timestamp = datetime.now().strftime("%a %b %w %H:%M:%S %Y") + vcd_file = open(path, "w") + + with VCDWriter(vcd_file, "10 ns", timestamp, "manta") as writer: + # each probe has a name, width, and writer associated with it + signals = [] + for name, width in self.config["probes"].items(): + signal = { + "name": name, + "width": width, + "data": self.get_trace(name), + "var": writer.register_var("manta", name, "wire", size=width), + } + signals.append(signal) + + clock = writer.register_var("manta", "clk", "wire", size=1) + trigger = writer.register_var("manta", "trigger", "wire", size=1) + + # add the data to each probe in the vcd file + for timestamp in range(0, 2 * len(self.data)): + # run the clock + writer.change(clock, timestamp, timestamp % 2 == 0) + + # set the trigger + triggered = (timestamp // 2) >= self.get_trigger_loc() + writer.change(trigger, timestamp, triggered) + + # add other signals + for signal in signals: + var = signal["var"] + sample = signal["data"][timestamp // 2] + + writer.change(var, timestamp, sample) + + vcd_file.close() + + def export_playback_module(self): + return LogicAnalyzerPlayback(self.data, self.config) + + def export_playback_verilog(self, path): + lap = self.export_playback_module() + from amaranth.back import verilog + + with open(path, "w") as f: + f.write( + verilog.convert( + lap, + name="logic_analyzer_playback", + ports=lap.get_top_level_ports(), + strip_internal_attrs=True, + ) + ) diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py new file mode 100644 index 0000000..b2f0059 --- /dev/null +++ b/src/manta/logic_analyzer/fsm.py @@ -0,0 +1,126 @@ +from amaranth import * +from math import ceil, log2 +from ..io_core import IOCore + + +class LogicAnalyzerFSM(Elaboratable): + """ """ + + def __init__(self, config, base_addr, interface): + self.config = config + self.states = { + "IDLE": 0, + "MOVE_TO_POSITION": 1, + "IN_POSITION": 2, + "CAPTURING": 3, + "CAPTURED": 4, + } + + self.trigger_modes = {"SINGLE_SHOT": 0, "INCREMENTAL": 1, "IMMEDIATE": 2} + + self.trigger = Signal(1) + self.write_enable = Signal(1) + + register_config = { + "inputs": { + "state": 4, + "read_pointer": ceil(log2(self.config["sample_depth"])), + "write_pointer": ceil(log2(self.config["sample_depth"])), + }, + "outputs": { + "trigger_location": ceil(log2(self.config["sample_depth"])), + "trigger_mode": 2, + "request_start": 1, + "request_stop": 1, + }, + } + + self.r = IOCore(register_config, base_addr, interface) + + # Bus Input + self.addr_i = self.r.addr_i + self.data_i = self.r.data_i + self.rw_i = self.r.rw_i + self.valid_i = self.r.valid_i + + # Bus Output + self.addr_o = self.r.addr_o + self.data_o = self.r.data_o + self.rw_o = self.r.rw_o + self.valid_o = self.r.valid_o + + def get_max_addr(self): + return self.r.get_max_addr() + + def increment_mod_sample_depth(self, m, signal): + # m.d.sync += signal.eq((signal + 1) % self.config["sample_depth"]) + + with m.If(signal == self.config["sample_depth"] - 1): + m.d.sync += signal.eq(0) + + with m.Else(): + m.d.sync += signal.eq(signal + 1) + + def elaborate(self, platform): + m = Module() + + m.submodules["registers"] = self.r + + prev_request_start = Signal(1) + prev_request_stop = Signal(1) + + # Rising edge detection for start/stop requests + m.d.sync += prev_request_start.eq(self.r.request_start) + m.d.sync += prev_request_stop.eq(self.r.request_stop) + + with m.If(self.r.state == self.states["IDLE"]): + m.d.sync += self.r.write_pointer.eq(0) + m.d.sync += self.r.read_pointer.eq(0) + m.d.sync += self.write_enable.eq(0) + + with m.If((self.r.request_start) & (~prev_request_start)): + m.d.sync += self.write_enable.eq(1) + with m.If(self.r.trigger_mode == self.trigger_modes["IMMEDIATE"]): + m.d.sync += self.r.state.eq(self.states["CAPTURING"]) + + with m.Else(): + with m.If(self.r.trigger_location == 0): + m.d.sync += self.r.state.eq(self.states["IN_POSITION"]) + + with m.Else(): + m.d.sync += self.r.state.eq(self.states["MOVE_TO_POSITION"]) + + m.d.sync += self.r.state.eq(self.states["MOVE_TO_POSITION"]) + + with m.Elif(self.r.state == self.states["MOVE_TO_POSITION"]): + m.d.sync += self.r.write_pointer.eq(self.r.write_pointer + 1) + + with m.If(self.r.write_pointer == self.r.trigger_location): + with m.If(self.trigger): + m.d.sync += self.r.state.eq(self.states["CAPTURING"]) + + with m.Else(): + m.d.sync += self.r.state.eq(self.states["IN_POSITION"]) + self.increment_mod_sample_depth(m, self.r.read_pointer) + + with m.Elif(self.r.state == self.states["IN_POSITION"]): + self.increment_mod_sample_depth(m, self.r.write_pointer) + + with m.If(self.trigger): + m.d.sync += self.r.state.eq(self.states["CAPTURING"]) + + with m.Else(): + self.increment_mod_sample_depth(m, self.r.read_pointer) + + with m.Elif(self.r.state == self.states["CAPTURING"]): + with m.If(self.r.write_pointer == self.r.read_pointer): + m.d.sync += self.write_enable.eq(0) + m.d.sync += self.r.state.eq(self.states["CAPTURED"]) + + with m.Else(): + self.increment_mod_sample_depth(m, self.r.write_pointer) + + with m.If((self.r.request_stop) & (~prev_request_stop)): + m.d.sync += self.r.state.eq(self.states["IDLE"]) + + return m diff --git a/src/manta/logic_analyzer/playback.py b/src/manta/logic_analyzer/playback.py new file mode 100644 index 0000000..d5eea8e --- /dev/null +++ b/src/manta/logic_analyzer/playback.py @@ -0,0 +1,68 @@ +from amaranth import * + + +class LogicAnalyzerPlayback(Elaboratable): + def __init__(self, data, config): + self.data = data + self.config = config + + # State Machine + self.start = Signal(1) + self.valid = Signal(1) + + # Top-Level Probe signals + self.top_level_probes = {} + for name, width in self.config["probes"].items(): + self.top_level_probes[name] = Signal(width, name=name) + + # Instantiate memory + self.mem = Memory( + depth=self.config["sample_depth"], + width=sum(self.config["probes"].values()), + init=self.data, + ) + + self.read_port = self.mem.read_port() + + def elaborate(self, platform): + m = Module() + m.submodules["mem"] = self.mem + + m.d.comb += self.read_port.en.eq(1) + + # State Machine + busy = Signal(1) + with m.If(~busy): + with m.If(self.start): + m.d.sync += busy.eq(1) + # m.d.sync += self.read_port.addr.eq(1) + + with m.Else(): + with m.If(self.read_port.addr == self.config["sample_depth"] - 1): + m.d.sync += busy.eq(0) + m.d.sync += self.read_port.addr.eq(0) + + with m.Else(): + m.d.sync += self.read_port.addr.eq(self.read_port.addr + 1) + + # Pipeline to accomodate for the 2-cycle latency in the RAM + m.d.sync += self.valid.eq(busy) + + # Assign the probe values by part-selecting from the data port + lower = 0 + for name, width in reversed(self.config["probes"].items()): + signal = self.top_level_probes[name] + + # Set output probe to zero if we're not + with m.If(self.valid): + m.d.comb += signal.eq(self.read_port.data[lower : lower + width]) + + with m.Else(): + m.d.comb += signal.eq(0) + + lower += width + + return m + + def get_top_level_ports(self): + return [self.start, self.valid] + list(self.top_level_probes.values()) diff --git a/src/manta/logic_analyzer/sample_mem.py b/src/manta/logic_analyzer/sample_mem.py new file mode 100644 index 0000000..b6806fd --- /dev/null +++ b/src/manta/logic_analyzer/sample_mem.py @@ -0,0 +1,11 @@ +from amaranth import * +from ..memory_core import ReadOnlyMemoryCore + + +class LogicAnalyzerSampleMemory(ReadOnlyMemoryCore): + def __init__(self, config, base_addr, interface): + width = sum(config["probes"].values()) + depth = config["sample_depth"] + mem_config = {"width": width, "depth": depth} + + super().__init__(mem_config, base_addr, interface) diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py new file mode 100644 index 0000000..0958109 --- /dev/null +++ b/src/manta/logic_analyzer/trigger_block.py @@ -0,0 +1,126 @@ +from amaranth import * +from ..io_core import IOCore + + +class LogicAnalyzerTriggerBlock(Elaboratable): + """ """ + + def __init__(self, config, base_addr, interface): + self.config = config + + # Instantiate a bunch of trigger blocks + self.probes = [ + Signal(width, name=name) for name, width in self.config["probes"].items() + ] + self.triggers = [LogicAnalyzerTrigger(p) for p in self.probes] + + # Make IO core for everything + outputs = {} + for p in self.probes: + outputs[p.name + "_arg"] = p.width + outputs[p.name + "_op"] = 4 + + self.r = IOCore({"outputs": outputs}, base_addr, interface) + + # Bus Input + self.addr_i = self.r.addr_i + self.data_i = self.r.data_i + self.rw_i = self.r.rw_i + self.valid_i = self.r.valid_i + + # Bus Output + self.addr_o = self.r.addr_o + self.data_o = self.r.data_o + self.rw_o = self.r.rw_o + self.valid_o = self.r.valid_o + + # Global trigger. High if any probe is triggered. + self.trig = Signal(1) + + def get_max_addr(self): + return self.r.get_max_addr() + + def elaborate(self, platform): + m = Module() + + # Add IO Core as submodule + m.submodules["registers"] = self.r + + # Add triggers as submodules + for t in self.triggers: + m.submodules[t.signal.name + "_trigger"] = t + + for probe, trigger in zip(self.probes, self.triggers): + # Connect trigger input signals to top-level signals + m.d.comb += trigger.signal.eq(probe) + + # Connect IO core registers to triggers + m.d.comb += trigger.arg.eq(getattr(self.r, probe.name + "_arg")) + m.d.comb += trigger.op.eq(getattr(self.r, probe.name + "_op")) + + m.d.comb += self.trig.eq(Cat([t.triggered for t in self.triggers]).any()) + + return m + + +class LogicAnalyzerTrigger(Elaboratable): + def __init__(self, signal): + self.operations = { + "DISABLE": 0, + "RISING": 1, + "FALLING": 2, + "CHANGING": 3, + "GT": 4, + "LT": 5, + "GEQ": 6, + "LEQ": 7, + "EQ": 8, + "NEQ": 9, + } + + self.signal = signal + self.op = Signal(range(len(self.operations))) + self.arg = Signal().like(signal) + self.triggered = Signal(1) + + def elaborate(self, platform): + m = Module() + + # Save previous value to register for edge detection + prev = Signal().like(self.signal) + m.d.sync += prev.eq(self.signal) + + with m.If(self.op == self.operations["DISABLE"]): + m.d.comb += self.triggered.eq(0) + + with m.Elif(self.op == self.operations["RISING"]): + m.d.comb += self.triggered.eq((self.signal) & (~prev)) + + with m.Elif(self.op == self.operations["FALLING"]): + m.d.comb += self.triggered.eq((~self.signal) & (prev)) + + with m.Elif(self.op == self.operations["CHANGING"]): + m.d.comb += self.triggered.eq(self.signal != prev) + + with m.Elif(self.op == self.operations["GT"]): + m.d.comb += self.triggered.eq(self.signal > self.arg) + + with m.Elif(self.op == self.operations["LT"]): + m.d.comb += self.triggered.eq(self.signal < self.arg) + + with m.Elif(self.op == self.operations["GEQ"]): + m.d.comb += self.triggered.eq(self.signal >= self.arg) + + with m.Elif(self.op == self.operations["LEQ"]): + m.d.comb += self.triggered.eq(self.signal <= self.arg) + + with m.Elif(self.op == self.operations["EQ"]): + m.d.comb += self.triggered.eq(self.signal == self.arg) + + with m.Elif(self.op == self.operations["NEQ"]): + m.d.comb += self.triggered.eq(self.signal != self.arg) + + with m.Else(): + m.d.comb += self.triggered.eq(0) + + return m diff --git a/src/manta/logic_analyzer_core.py b/src/manta/logic_analyzer_core.py deleted file mode 100644 index 8b40794..0000000 --- a/src/manta/logic_analyzer_core.py +++ /dev/null @@ -1,591 +0,0 @@ -from amaranth import * -from warnings import warn -from .utils import * -from .io_core import IOCore -from .memory_core import ReadOnlyMemoryCore -from math import ceil, log2 - - -class LogicAnalyzerCore(Elaboratable): - """ """ - - def __init__(self, config, base_addr, interface): - self.config = config - self.base_addr = base_addr - self.interface = interface - - self.check_config(config) - - # State Machine Values - self.states = { - "IDLE": 0, - "MOVE_TO_POSITION": 1, - "IN_POSITION": 2, - "CAPTURING": 3, - "CAPTURED": 4, - } - - # Trigger Modes - self.trigger_modes = {"SINGLE_SHOT": 0, "INCREMENTAL": 1, "IMMEDIATE": 2} - - # Trigger operations - self.operations = { - "DISABLE": 0, - "RISING": 1, - "FALLING": 2, - "CHANGING": 3, - "GT": 4, - "LT": 5, - "GEQ": 6, - "LEQ": 7, - "EQ": 8, - "NEQ": 9, - } - - self.registers = self.make_registers(self.base_addr) - self.sample_mem = self.make_sample_mem(self.registers.max_addr) - self.define_signals() - - def check_config(self, config): - # Check for unrecognized options - valid_options = [ - "type", - "sample_depth", - "probes", - "triggers", - "trigger_loc", - "trigger_mode", - ] - for option in config: - if option not in valid_options: - warn(f"Ignoring unrecognized option '{option}' in Logic Analyzer.") - - # Check sample depth is provided and positive - if "sample_depth" not in config: - raise ValueError("Logic Analyzer must have sample_depth specified.") - - if not isinstance(config["sample_depth"], int): - raise ValueError("Logic Analyzer sample_depth must be an integer.") - - if config["sample_depth"] <= 0: - raise ValueError("Logic Analyzer sample_depth must be positive.") - - # Check probes - if "probes" not in config: - raise ValueError("Logic Analyzer must have at least one probe specified.") - - if len(config["probes"]) == 0: - raise ValueError("Logic Analyzer must have at least one probe specified.") - - for name, width in config["probes"].items(): - if width < 0: - raise ValueError(f"Width of probe {name} must be positive.") - - # Check triggers - if "triggers" not in config: - raise ValueError("Logic Analyzer must have at least one trigger specified.") - - if len(config["triggers"]) == 0: - raise ValueError("Logic Analyzer must have at least one trigger specified.") - - # Check trigger location - if "trigger_loc" in config: - if not isinstance(config["trigger_loc"], int): - raise ValueError("Trigger location must be an integer.") - - if config["trigger_loc"] < 0: - raise ValueError("Trigger location must be positive.") - - if config["trigger_loc"] > config["sample_depth"]: - raise ValueError("Trigger location cannot exceed sample depth.") - - # Check trigger mode - if "trigger_mode" in config: - valid_modes = ["single_shot", "incremental", "immediate"] - if config["trigger_mode"] not in valid_modes: - raise ValueError( - f"Unrecognized trigger mode {config['trigger_mode']} provided." - ) - - # Check triggers themselves - for trigger in config["triggers"]: - if not isinstance(trigger, str): - raise ValueError("Trigger must be specified with a string.") - - # Trigger conditions may be composed of either two or three components, - # depending on the operation specified. In the case of operations that - # don't need an argument (like DISABLE, RISING, FALLING, CHANGING) or - # three statements in - - # Check the trigger operations - components = trigger.strip().split(" ") - if len(components) == 2: - name, op = components - if op not in ["DISABLE", "RISING", "FALLING", "CHANGING"]: - raise ValueError( - f"Unable to interpret trigger condition '{trigger}'." - ) - - elif len(components) == 3: - name, op, arg = components - if op not in ["GT", "LT", "GEQ", "LEQ", "EQ", "NEQ"]: - raise ValueError( - f"Unable to interpret trigger condition '{trigger}'." - ) - - else: - raise ValueError(f"Unable to interpret trigger condition '{trigger}'.") - - # Check probe names - if components[0] not in config["probes"]: - raise ValueError(f"Unknown probe name '{components[0]}' specified.") - - def define_signals(self): - # Bus Input - self.addr_i = Signal(16) - self.data_i = Signal(16) - self.rw_i = Signal(1) - self.valid_i = Signal(1) - - # Bus Output - self.addr_o = Signal(16) - self.data_o = Signal(16) - self.rw_o = Signal(1) - self.valid_o = Signal(1) - - # Probes - self.probe_signals = {} - for name, width in self.config["probes"].items(): - self.probe_signals[name] = { - "top_level": Signal(width), - "prev": Signal(width), - "trigger_arg": getattr(self.registers, f"{name}_arg"), - "trigger_op": getattr(self.registers, f"{name}_op"), - "triggered": Signal(1), - } - - # Global trigger. High if any probe is triggered. - self.trig = Signal(1) - - def make_registers(self, base_addr): - # The logic analyzer uses an IO core to handle inputs to the FSM and trigger comparators - register_config = { - "inputs": { - "state": 4, - "read_pointer": ceil(log2(self.config["sample_depth"])), - "write_pointer": ceil(log2(self.config["sample_depth"])), - }, - "outputs": { - "trigger_loc": ceil(log2(self.config["sample_depth"])), - "trigger_mode": 2, - "request_start": 1, - "request_stop": 1, - }, - } - - for name, width in self.config["probes"].items(): - register_config["outputs"][name + "_arg"] = width - register_config["outputs"][name + "_op"] = 4 - - return IOCore(register_config, base_addr, self.interface) - - def make_sample_mem(self, base_addr): - sample_mem_config = { - "width": sum(self.config["probes"].values()), - "depth": self.config["sample_depth"], - } - - return ReadOnlyMemoryCore(sample_mem_config, base_addr, self.interface) - - def run_triggers(self, m): - # Run the trigger for each individual probe - for name, attrs in self.probe_signals.items(): - top_level = attrs["top_level"] - prev = attrs["prev"] - trigger_arg = attrs["trigger_arg"] - trigger_op = attrs["trigger_op"] - triggered = attrs["triggered"] - - # Save the previous value to a register so we can do rising/falling edge detection later! - m.d.sync += prev.eq(top_level) - - with m.If(trigger_op == self.operations["DISABLE"]): - m.d.comb += triggered.eq(0) - - with m.Elif(trigger_op == self.operations["RISING"]): - m.d.comb += triggered.eq((top_level) & (~prev)) - - with m.Elif(trigger_op == self.operations["FALLING"]): - m.d.comb += triggered.eq((~top_level) & (prev)) - - with m.Elif(trigger_op == self.operations["CHANGING"]): - m.d.comb += triggered.eq(top_level != prev) - - with m.Elif(trigger_op == self.operations["GT"]): - m.d.comb += triggered.eq(top_level > trigger_arg) - - with m.Elif(trigger_op == self.operations["LT"]): - m.d.comb += triggered.eq(top_level < trigger_arg) - - with m.Elif(trigger_op == self.operations["GEQ"]): - m.d.comb += triggered.eq(top_level >= trigger_arg) - - with m.Elif(trigger_op == self.operations["LEQ"]): - m.d.comb += triggered.eq(top_level <= trigger_arg) - - with m.Elif(trigger_op == self.operations["EQ"]): - m.d.comb += triggered.eq(top_level == trigger_arg) - - with m.Elif(trigger_op == self.operations["NEQ"]): - m.d.comb += triggered.eq(top_level != trigger_arg) - - with m.Else(): - m.d.comb += triggered.eq(0) - - # Combine all the triggers - m.d.comb += self.trig.eq( - Cat(attrs["triggered"] for attrs in self.probe_signals.values()).any() - ) - - def increment_mod_sample_depth(self, m, signal): - # m.d.sync += signal.eq((signal + 1) % self.config["sample_depth"]) - - with m.If(signal == self.config["sample_depth"] - 1): - m.d.sync += signal.eq(0) - - with m.Else(): - m.d.sync += signal.eq(signal + 1) - - def run_state_machine(self, m): - prev_request_start = Signal(1) - prev_request_stop = Signal(1) - - request_start = self.registers.request_start - request_stop = self.registers.request_stop - trigger_mode = self.registers.trigger_mode - trigger_loc = self.registers.trigger_loc - state = self.registers.state - rp = self.registers.read_pointer - wp = self.registers.write_pointer - we = self.sample_mem.user_we - - m.d.comb += self.sample_mem.user_addr.eq(wp) - - # Rising edge detection for start/stop requests - m.d.sync += prev_request_start.eq(request_start) - m.d.sync += prev_request_stop.eq(request_stop) - - with m.If(state == self.states["IDLE"]): - m.d.sync += wp.eq(0) - m.d.sync += rp.eq(0) - m.d.sync += we.eq(0) - - with m.If((request_start) & (~prev_request_start)): - m.d.sync += we.eq(1) - with m.If(trigger_mode == self.trigger_modes["IMMEDIATE"]): - m.d.sync += state.eq(self.states["CAPTURING"]) - - with m.Else(): - with m.If(trigger_loc == 0): - m.d.sync += state.eq(self.states["IN_POSITION"]) - - with m.Else(): - m.d.sync += state.eq(self.states["MOVE_TO_POSITION"]) - - m.d.sync += state.eq(self.states["MOVE_TO_POSITION"]) - - with m.Elif(state == self.states["MOVE_TO_POSITION"]): - m.d.sync += wp.eq(wp + 1) - - with m.If(wp == trigger_loc): - with m.If(self.trig): - m.d.sync += state.eq(self.states["CAPTURING"]) - - with m.Else(): - m.d.sync += state.eq(self.states["IN_POSITION"]) - self.increment_mod_sample_depth(m, rp) - - with m.Elif(state == self.states["IN_POSITION"]): - self.increment_mod_sample_depth(m, wp) - - with m.If(self.trig): - m.d.sync += state.eq(self.states["CAPTURING"]) - - with m.Else(): - self.increment_mod_sample_depth(m, rp) - - with m.Elif(state == self.states["CAPTURING"]): - with m.If(wp == rp): - m.d.sync += we.eq(0) - m.d.sync += state.eq(self.states["CAPTURED"]) - - with m.Else(): - self.increment_mod_sample_depth(m, wp) - - with m.If((request_stop) & (~prev_request_stop)): - m.d.sync += state.eq(self.states["IDLE"]) - - def elaborate(self, platform): - m = Module() - - # Add registers and sample memory as submodules - m.submodules["registers"] = self.registers - m.submodules["sample_mem"] = self.sample_mem - - # Concat all the probes together, and feed to input of sample memory - # (it is necessary to reverse the order such that first probe occupies - # the lowest location in memory) - m.d.comb += self.sample_mem.user_data.eq( - Cat([p["top_level"] for p in self.probe_signals.values()][::-1]) - ) - - self.run_state_machine(m) - self.run_triggers(m) - - # Wire internal modules - m.d.comb += [ - self.registers.addr_i.eq(self.addr_i), - self.registers.data_i.eq(self.data_i), - self.registers.rw_i.eq(self.rw_i), - self.registers.valid_i.eq(self.valid_i), - self.sample_mem.addr_i.eq(self.registers.addr_o), - self.sample_mem.data_i.eq(self.registers.data_o), - self.sample_mem.rw_i.eq(self.registers.rw_o), - self.sample_mem.valid_i.eq(self.registers.valid_o), - self.addr_o.eq(self.sample_mem.addr_o), - self.data_o.eq(self.sample_mem.data_o), - self.rw_o.eq(self.sample_mem.rw_o), - self.valid_o.eq(self.sample_mem.valid_o), - ] - - return m - - def get_top_level_ports(self): - return [p["top_level"] for p in self.probe_signals.values()] - - def get_max_addr(self): - return self.sample_mem.get_max_addr() - - def set_triggers(self): - # reset all triggers to zero - for name in self.probe_signals.keys(): - self.registers.set_probe(name + "_op", 0) - self.registers.set_probe(name + "_arg", 0) - - # set triggers - for trigger in self.config["triggers"]: - components = trigger.strip().split(" ") - - # Handle triggers that don't need an argument - if len(components) == 2: - name, op = components - self.registers.set_probe(name + "_op", self.operations[op]) - - # Handle triggers that do need an argument - elif len(components) == 3: - name, op, arg = components - self.registers.set_probe(name + "_op", self.operations[op]) - self.registers.set_probe(name + "_arg", int(arg)) - - def capture(self, verbose=False): - print_if_verbose = lambda x: print(x) if verbose else None - - # If core is not in IDLE state, request that it return to IDLE - print_if_verbose(" -> Resetting core...") - state = self.registers.get_probe("state") - if state != self.states["IDLE"]: - self.registers.set_probe("request_stop", 0) - self.registers.set_probe("request_stop", 1) - self.registers.set_probe("request_stop", 0) - - if self.registers.get_probe("state") != self.states["IDLE"]: - raise ValueError("Logic analyzer did not reset to IDLE state.") - - # Set triggers - print_if_verbose(" -> Setting triggers...") - self.set_triggers() - - # Set trigger mode, default to single-shot if user didn't specify a mode - print_if_verbose(" -> Setting trigger mode...") - if "trigger_mode" in self.config: - self.registers.set_probe("trigger_mode", self.config["trigger_mode"]) - - else: - self.registers.set_probe("trigger_mode", self.trigger_modes["SINGLE_SHOT"]) - - # Set trigger location - print_if_verbose(" -> Setting trigger location...") - self.registers.set_probe("trigger_loc", self.config["trigger_loc"]) - - # Send a start request to the state machine - print_if_verbose(" -> Starting capture...") - self.registers.set_probe("request_start", 1) - self.registers.set_probe("request_start", 0) - - # Poll the state machine's state, and wait for the capture to complete - print_if_verbose(" -> Waiting for capture to complete...") - while self.registers.get_probe("state") != self.states["CAPTURED"]: - pass - - # Read out the entirety of the sample memory - print_if_verbose(" -> Reading sample memory contents...") - addrs = list(range(self.config["sample_depth"])) - raw_capture = self.sample_mem.read_from_user_addr(addrs) - - # Revolve the memory around the read_pointer, such that all the beginning - # of the caputure is at the first element - print_if_verbose(" -> Checking read pointer and revolving memory...") - read_pointer = self.registers.get_probe("read_pointer") - - data = raw_capture[read_pointer:] + raw_capture[:read_pointer] - return LogicAnalyzerCapture(data, self.config) - - -class LogicAnalyzerCapture: - def __init__(self, data, config): - self.data = data - self.config = config - - def get_trigger_loc(self): - return self.config["trigger_loc"] - - def get_trace(self, probe_name): - # sum up the widths of all the probes below this one - lower = 0 - for name, width in self.config["probes"].items(): - if name == probe_name: - break - - lower += width - - # add the width of the probe we'd like - upper = lower + self.config["probes"][probe_name] - - total_probe_width = sum(self.config["probes"].values()) - binary = [f"{d:0{total_probe_width}b}" for d in self.data] - return [int(b[lower:upper], 2) for b in binary] - - def export_vcd(self, path): - from vcd import VCDWriter - from datetime import datetime - - # Use the same datetime format that iVerilog uses - timestamp = datetime.now().strftime("%a %b %w %H:%M:%S %Y") - vcd_file = open(path, "w") - - with VCDWriter(vcd_file, "10 ns", timestamp, "manta") as writer: - # each probe has a name, width, and writer associated with it - signals = [] - for name, width in self.config["probes"].items(): - signal = { - "name": name, - "width": width, - "data": self.get_trace(name), - "var": writer.register_var("manta", name, "wire", size=width), - } - signals.append(signal) - - clock = writer.register_var("manta", "clk", "wire", size=1) - trigger = writer.register_var("manta", "trigger", "wire", size=1) - - # add the data to each probe in the vcd file - for timestamp in range(0, 2 * len(self.data)): - # run the clock - writer.change(clock, timestamp, timestamp % 2 == 0) - - # set the trigger - triggered = (timestamp // 2) >= self.get_trigger_loc() - writer.change(trigger, timestamp, triggered) - - # add other signals - for signal in signals: - var = signal["var"] - sample = signal["data"][timestamp // 2] - - writer.change(var, timestamp, sample) - - vcd_file.close() - - def export_playback_module(self): - return LogicAnalyzerPlayback(self.data, self.config) - - def export_playback_verilog(self, path): - lap = self.export_playback_module() - from amaranth.back import verilog - - with open(path, "w") as f: - f.write( - verilog.convert( - lap, - name="logic_analyzer_playback", - ports=lap.get_top_level_ports(), - strip_internal_attrs=True, - ) - ) - - -class LogicAnalyzerPlayback(Elaboratable): - def __init__(self, data, config): - self.data = data - self.config = config - - # State Machine - self.start = Signal(1) - self.valid = Signal(1) - - # Top-Level Probe signals - self.top_level_probes = {} - for name, width in self.config["probes"].items(): - self.top_level_probes[name] = Signal(width, name=name) - - # Instantiate memory - self.mem = Memory( - depth=self.config["sample_depth"], - width=sum(self.config["probes"].values()), - init=self.data, - ) - - self.read_port = self.mem.read_port() - - def elaborate(self, platform): - m = Module() - m.submodules["mem"] = self.mem - - m.d.comb += self.read_port.en.eq(1) - - # State Machine - busy = Signal(1) - with m.If(~busy): - with m.If(self.start): - m.d.sync += busy.eq(1) - # m.d.sync += self.read_port.addr.eq(1) - - with m.Else(): - with m.If(self.read_port.addr == self.config["sample_depth"] - 1): - m.d.sync += busy.eq(0) - m.d.sync += self.read_port.addr.eq(0) - - with m.Else(): - m.d.sync += self.read_port.addr.eq(self.read_port.addr + 1) - - # Pipeline to accomodate for the 2-cycle latency in the RAM - m.d.sync += self.valid.eq(busy) - - # Assign the probe values by part-selecting from the data port - lower = 0 - for name, width in reversed(self.config["probes"].items()): - signal = self.top_level_probes[name] - - # Set output probe to zero if we're not - with m.If(self.valid): - m.d.comb += signal.eq(self.read_port.data[lower : lower + width]) - - with m.Else(): - m.d.comb += signal.eq(0) - - lower += width - - return m - - def get_top_level_ports(self): - return [self.start, self.valid] + list(self.top_level_probes.values()) diff --git a/src/manta/manta.py b/src/manta/manta.py index 073f55a..97f1b4c 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -5,7 +5,7 @@ from .uart import UARTInterface # from .ethernet import EthernetInterface from .io_core import IOCore from .memory_core import ReadOnlyMemoryCore -from .logic_analyzer_core import LogicAnalyzerCore +from .logic_analyzer import LogicAnalyzerCore class Manta(Elaboratable): diff --git a/test/test_logic_analyzer_sim.py b/test/test_logic_analyzer_sim.py index 0f37aae..01594dd 100644 --- a/test/test_logic_analyzer_sim.py +++ b/test/test_logic_analyzer_sim.py @@ -1,5 +1,5 @@ from amaranth.sim import Simulator -from manta.logic_analyzer_core import LogicAnalyzerCore +from manta.logic_analyzer import LogicAnalyzerCore from manta.utils import * from random import sample @@ -13,6 +13,7 @@ config = { la = LogicAnalyzerCore(config, base_addr=0, interface=None) + def print_data_at_addr(addr): # place read transaction on the bus yield la.addr_i.eq(addr) @@ -30,43 +31,56 @@ def print_data_at_addr(addr): print(f"addr: {hex(addr)} data: {hex((yield la.data_o))}") -def set_logic_analyzer_register(name, data): - addr = la.registers.mmap[f"{name}_buf"]["addrs"][0] +def set_fsm_register(name, data): + addr = la.fsm.r.mmap[f"{name}_buf"]["addrs"][0] yield from write_register(la, 0, 0) yield from write_register(la, addr, data) yield from write_register(la, 0, 1) yield from write_register(la, 0, 0) +def set_trig_blk_register(name, data): + addr = la.trig_blk.r.mmap[f"{name}_buf"]["addrs"][0] + + yield from write_register(la, 0, 0) + yield from write_register(la, addr, data) + yield from write_register(la, 0, 1) + yield from write_register(la, 0, 0) + +def set_probe(name, value): + probe = None + for p in la.probes: + if p.name == name: + probe = p + + yield p.eq(value) def test_do_you_fucking_work(): def testbench(): # # ok nice what happens if we try to run the core, which includes: - yield from set_logic_analyzer_register("request_stop", 1) - yield from set_logic_analyzer_register("request_stop", 0) + yield from set_fsm_register("request_stop", 1) + yield from set_fsm_register("request_stop", 0) # setting triggers - yield from set_logic_analyzer_register("curly_op", la.operations["EQ"]) - yield from set_logic_analyzer_register("curly_arg", 4) + yield from set_trig_blk_register("curly_op", la.trig_blk.triggers[0].operations["EQ"]) + yield from set_trig_blk_register("curly_arg", 4) # setting trigger mode - yield from set_logic_analyzer_register( - "trigger_mode", 0 - ) # right now this is not actually respected...oops + yield from set_fsm_register("trigger_mode", 0) # setting trigger location - yield from set_logic_analyzer_register("trigger_loc", 511) + yield from set_fsm_register("trigger_location", 511) # starting capture - yield from set_logic_analyzer_register("request_start", 1) - yield from set_logic_analyzer_register("request_start", 0) + yield from set_fsm_register("request_start", 1) + yield from set_fsm_register("request_start", 0) # wait a few hundred clock cycles, see what happens for _ in range(700): yield # provide the trigger condition - yield la.probe_signals["curly"]["top_level"].eq(4) + yield from set_probe("curly", 4) for _ in range(700): yield From 958ccadbd0a97df7fd5266794fb963986f48e0e0 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Fri, 5 Jan 2024 21:43:53 -0800 Subject: [PATCH 13/89] refactored logic analyzer working in sim --- src/manta/logic_analyzer/__init__.py | 3 ++- src/manta/logic_analyzer/trigger_block.py | 8 ++------ test/test_logic_analyzer_sim.py | 25 +++++++++++++++-------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index 68d858d..90b610c 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -33,7 +33,7 @@ class LogicAnalyzerCore(Elaboratable): # Submodules self.fsm = LogicAnalyzerFSM(self.config, base_addr, interface) self.trig_blk = LogicAnalyzerTriggerBlock( - self.config, self.fsm.get_max_addr() + 1, interface + self.probes, self.fsm.get_max_addr() + 1, interface ) self.sample_mem = LogicAnalyzerSampleMemory( self.config, self.trig_blk.get_max_addr() + 1, interface @@ -182,6 +182,7 @@ class LogicAnalyzerCore(Elaboratable): self.valid_o.eq(sample_mem.valid_o), # Non-bus Connections fsm.trigger.eq(trig_blk.trig), + sample_mem.user_addr.eq(fsm.r.write_pointer), sample_mem.user_we.eq(fsm.write_enable), ] diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 0958109..b7a952b 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -5,13 +5,9 @@ from ..io_core import IOCore class LogicAnalyzerTriggerBlock(Elaboratable): """ """ - def __init__(self, config, base_addr, interface): - self.config = config - + def __init__(self, probes, base_addr, interface): # Instantiate a bunch of trigger blocks - self.probes = [ - Signal(width, name=name) for name, width in self.config["probes"].items() - ] + self.probes = probes self.triggers = [LogicAnalyzerTrigger(p) for p in self.probes] # Make IO core for everything diff --git a/test/test_logic_analyzer_sim.py b/test/test_logic_analyzer_sim.py index 01594dd..72622ed 100644 --- a/test/test_logic_analyzer_sim.py +++ b/test/test_logic_analyzer_sim.py @@ -33,19 +33,23 @@ def print_data_at_addr(addr): def set_fsm_register(name, data): addr = la.fsm.r.mmap[f"{name}_buf"]["addrs"][0] + strobe_addr = la.fsm.r.base_addr - yield from write_register(la, 0, 0) + yield from write_register(la, strobe_addr, 0) yield from write_register(la, addr, data) - yield from write_register(la, 0, 1) - yield from write_register(la, 0, 0) + yield from write_register(la, strobe_addr, 1) + yield from write_register(la, strobe_addr, 0) + def set_trig_blk_register(name, data): addr = la.trig_blk.r.mmap[f"{name}_buf"]["addrs"][0] + strobe_addr = la.trig_blk.r.base_addr - yield from write_register(la, 0, 0) + yield from write_register(la, strobe_addr, 0) yield from write_register(la, addr, data) - yield from write_register(la, 0, 1) - yield from write_register(la, 0, 0) + yield from write_register(la, strobe_addr, 1) + yield from write_register(la, strobe_addr, 0) + def set_probe(name, value): probe = None @@ -53,16 +57,19 @@ def set_probe(name, value): if p.name == name: probe = p - yield p.eq(value) + yield probe.eq(value) -def test_do_you_fucking_work(): + +def test_single_shot_capture(): def testbench(): # # ok nice what happens if we try to run the core, which includes: yield from set_fsm_register("request_stop", 1) yield from set_fsm_register("request_stop", 0) # setting triggers - yield from set_trig_blk_register("curly_op", la.trig_blk.triggers[0].operations["EQ"]) + yield from set_trig_blk_register( + "curly_op", la.trig_blk.triggers[0].operations["EQ"] + ) yield from set_trig_blk_register("curly_arg", 4) # setting trigger mode From 03a3ec6c9fd6b635998452543e7d2eed76f405a6 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Fri, 5 Jan 2024 22:11:49 -0800 Subject: [PATCH 14/89] update logic analyzer capture method --- src/manta/logic_analyzer/__init__.py | 69 +++++++++-------------- src/manta/logic_analyzer/trigger_block.py | 21 +++++++ 2 files changed, 47 insertions(+), 43 deletions(-) diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index 90b610c..c55b82b 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -55,7 +55,7 @@ class LogicAnalyzerCore(Elaboratable): "sample_depth", "probes", "triggers", - "trigger_loc", + "trigger_location", "trigger_mode", ] for option in config: @@ -91,14 +91,14 @@ class LogicAnalyzerCore(Elaboratable): raise ValueError("Logic Analyzer must have at least one trigger specified.") # Check trigger location - if "trigger_loc" in config: - if not isinstance(config["trigger_loc"], int): + if "trigger_location" in config: + if not isinstance(config["trigger_location"], int): raise ValueError("Trigger location must be an integer.") - if config["trigger_loc"] < 0: + if config["trigger_location"] < 0: raise ValueError("Trigger location must be positive.") - if config["trigger_loc"] > config["sample_depth"]: + if config["trigger_location"] > config["sample_depth"]: raise ValueError("Trigger location cannot exceed sample depth.") # Check trigger mode, if provided @@ -110,9 +110,9 @@ class LogicAnalyzerCore(Elaboratable): ) if config["trigger_mode"] == "incremental": - if "trigger_loc" in config: + if "trigger_location" in config: warn( - "Ignoring option 'trigger_loc', as 'trigger_mode' is set to immediate, and there is no trigger condition to wait for." + "Ignoring option 'trigger_location', as 'trigger_mode' is set to immediate, and there is no trigger condition to wait for." ) # Check triggers themselves @@ -194,65 +194,48 @@ class LogicAnalyzerCore(Elaboratable): def get_max_addr(self): return self.sample_mem.get_max_addr() - def set_triggers(self): - # reset all triggers to zero - for p in self.probes: - self.trig_blk.r.set_probe(p.name + "_op", 0) - self.trig_blk.r.set_probe(p.name + "_arg", 0) - - # set triggers - for trigger in self.config["triggers"]: - components = trigger.strip().split(" ") - - # Handle triggers that don't need an argument - if len(components) == 2: - name, op = components - self.trig_blk.r.set_probe(name + "_op", self.operations[op]) - - # Handle triggers that do need an argument - elif len(components) == 3: - name, op, arg = components - self.registers.set_probe(name + "_op", self.operations[op]) - self.registers.set_probe(name + "_arg", int(arg)) - def capture(self, verbose=False): print_if_verbose = lambda x: print(x) if verbose else None # If core is not in IDLE state, request that it return to IDLE print_if_verbose(" -> Resetting core...") - state = self.registers.get_probe("state") + state = self.fsm.r.get_probe("state") if state != self.states["IDLE"]: - self.registers.set_probe("request_stop", 0) - self.registers.set_probe("request_stop", 1) - self.registers.set_probe("request_stop", 0) + self.fsm.r.set_probe("request_stop", 0) + self.fsm.r.set_probe("request_stop", 1) + self.fsm.r.set_probe("request_stop", 0) - if self.registers.get_probe("state") != self.states["IDLE"]: + if self.fsm.r.get_probe("state") != self.fsm.states["IDLE"]: raise ValueError("Logic analyzer did not reset to IDLE state.") # Set triggers print_if_verbose(" -> Setting triggers...") - self.set_triggers() + self.trig_blk.set_triggers() # Set trigger mode, default to single-shot if user didn't specify a mode print_if_verbose(" -> Setting trigger mode...") if "trigger_mode" in self.config: - self.registers.set_probe("trigger_mode", self.config["trigger_mode"]) + self.fsm.r.set_probe("trigger_mode", self.config["trigger_mode"]) else: - self.registers.set_probe("trigger_mode", self.trigger_modes["SINGLE_SHOT"]) + self.fsm.r.set_probe("trigger_mode", self.fsm.trigger_modes["SINGLE_SHOT"]) # Set trigger location print_if_verbose(" -> Setting trigger location...") - self.registers.set_probe("trigger_loc", self.config["trigger_loc"]) + if "trigger_location" in self.config: + self.fsm.r.set_probe("trigger_location", self.config["trigger_location"]) + + else: + self.fsm.r.set_probe("trigger_location", self.config["sample_depth"] // 2) # Send a start request to the state machine print_if_verbose(" -> Starting capture...") - self.registers.set_probe("request_start", 1) - self.registers.set_probe("request_start", 0) + self.fsm.r.set_probe("request_start", 1) + self.fsm.r.set_probe("request_start", 0) # Poll the state machine's state, and wait for the capture to complete print_if_verbose(" -> Waiting for capture to complete...") - while self.registers.get_probe("state") != self.states["CAPTURED"]: + while self.fsm.r.get_probe("state") != self.fsm.states["CAPTURED"]: pass # Read out the entirety of the sample memory @@ -263,7 +246,7 @@ class LogicAnalyzerCore(Elaboratable): # Revolve the memory around the read_pointer, such that all the beginning # of the caputure is at the first element print_if_verbose(" -> Checking read pointer and revolving memory...") - read_pointer = self.registers.get_probe("read_pointer") + read_pointer = self.fsm.r.get_probe("read_pointer") data = raw_capture[read_pointer:] + raw_capture[:read_pointer] return LogicAnalyzerCapture(data, self.config) @@ -274,8 +257,8 @@ class LogicAnalyzerCapture: self.data = data self.config = config - def get_trigger_loc(self): - return self.config["trigger_loc"] + def get_trigger_location(self): + return self.config["trigger_location"] def get_trace(self, probe_name): # sum up the widths of all the probes below this one diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index b7a952b..9e446e0 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -36,6 +36,27 @@ class LogicAnalyzerTriggerBlock(Elaboratable): def get_max_addr(self): return self.r.get_max_addr() + def set_triggers(self, config): + # reset all triggers to zero + for p in self.probes: + self.r.set_probe(p.name + "_op", 0) + self.r.set_probe(p.name + "_arg", 0) + + # set triggers + for trigger in config["triggers"]: + components = trigger.strip().split(" ") + + # Handle triggers that don't need an argument + if len(components) == 2: + name, op = components + self.r.set_probe(name + "_op", self.triggers[0].operations[op]) + + # Handle triggers that do need an argument + elif len(components) == 3: + name, op, arg = components + self.r.set_probe(name + "_op", self.triggers[0].operations[op]) + self.r.set_probe(name + "_arg", int(arg)) + def elaborate(self, platform): m = Module() From 89f1dcde1c8f9e40a2729919884850e0abf1dae6 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Fri, 5 Jan 2024 23:01:57 -0800 Subject: [PATCH 15/89] convert diagrams to .drawio.svg format --- doc/assets/block_memory_architecture.png | Bin 668736 -> 0 bytes doc/assets/bus_architecture.drawio.svg | 445 +++++++ doc/assets/bus_architecture.png | Bin 359910 -> 0 bytes doc/assets/ethernet_packet.png | Bin 310473 -> 0 bytes doc/assets/io_core_architecture.drawio.svg | 337 +++++ doc/assets/io_core_architecture.png | Bin 239952 -> 0 bytes doc/assets/io_core_memory_map.drawio.svg | 251 ++++ .../logic_analyzer_architecture.drawio.svg | 748 +++++++++++ doc/assets/logic_analyzer_architecture.png | Bin 603208 -> 0 bytes doc/assets/manta.drawio.png | Bin 0 -> 52590 bytes doc/assets/manta_architecture.png | Bin 494609 -> 0 bytes doc/assets/memory_architecture.drawio.svg | 608 +++++++++ doc/assets/system_architecture.drawio.svg | 342 +++++ doc/assets/uart.png | Bin 447251 -> 0 bytes doc/assets/uart_packets.drawio.svg | 1148 +++++++++++++++++ doc/how_it_works.md | 6 +- doc/io_core.md | 2 +- doc/logic_analyzer_core.md | 2 +- doc/{block_memory_core.md => memory_core.md} | 2 +- mkdocs.yml | 2 +- 20 files changed, 3886 insertions(+), 7 deletions(-) delete mode 100644 doc/assets/block_memory_architecture.png create mode 100644 doc/assets/bus_architecture.drawio.svg delete mode 100644 doc/assets/bus_architecture.png delete mode 100644 doc/assets/ethernet_packet.png create mode 100644 doc/assets/io_core_architecture.drawio.svg delete mode 100644 doc/assets/io_core_architecture.png create mode 100644 doc/assets/io_core_memory_map.drawio.svg create mode 100644 doc/assets/logic_analyzer_architecture.drawio.svg delete mode 100644 doc/assets/logic_analyzer_architecture.png create mode 100644 doc/assets/manta.drawio.png delete mode 100644 doc/assets/manta_architecture.png create mode 100644 doc/assets/memory_architecture.drawio.svg create mode 100644 doc/assets/system_architecture.drawio.svg delete mode 100644 doc/assets/uart.png create mode 100644 doc/assets/uart_packets.drawio.svg rename doc/{block_memory_core.md => memory_core.md} (99%) diff --git a/doc/assets/block_memory_architecture.png b/doc/assets/block_memory_architecture.png deleted file mode 100644 index 26298c76ac59f49f5058c32b66103508b7844bb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 668736 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

J1;+#P2y_ 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∾>A6GAdW_NRq{DS6=PP7kvRAyH-n2U;a zXAB=GY(Kt6#xC~J*xdKSN09$9jW2(yWLu#X=Pfe!7YJo4kK}lw4-M?bl$}CqvjQjz zyLPE5EfE0)srG#t8L-E%wQm~70!{oOyF-Ck#&ro`8PX)cccPqnH>Ic);yZm^@Ucka z0ZM8Ea}s+zfN0U1mc%M5@m2>CG3J>=_t209>V@H+N(BvN-4d=$o<)ArRyJHNQj^jFpXj=6$cFX^2B%-nM^CVfb43COeAVwf}vQsZ}< zOjtm91GTthU;58#kJ0D@B=ZDXq0^`iAbMiWFAExAIsr9MUw^XR5dZ0;%mYaZ63oFd zRtOuvs8BA?E9TP4Ik4TyoMcv4<5|KQ1}iRZZ*kK|<8GLC!LDRa7ih@MF7$*8K% z6=dCBp6Qe-{itqVTr`c9pNce&>#4A!7H8OWy%bset=b`YG-d`89k08B2D7`7Q8;DW z2>EJWI*6QJG#CDnzz|m}xZ~m{&@|>3q@7MXc)~}J4}h*Y4Tpktq=Ol8Gadr&rm4!} zzN(e$VW3!Qf+~f(Rju0#faBYR+@()u(FnrDGY)wa4GPsadl_AbOq3yg;f7y0& zn1XA9uA)nNr+TQrx6J58M@%(+q>u8zdBGCXcp{IYXVdn;=oK1=>`=<9o z-H&5&@klpTREcTW|B4HcsBLEhnO3&DmJNrOj^)|RTOsNbrEMXcNiGo+(E%aTF;ka{cdJ(;I^DIv2~D#zoikge?-Y;2d*KdS$m)mcPbV5z0Du{@T|UwrUBx4YEE zL$fq;k`!^8yI@toDek&-^7HIH&`(SP(iNrT-=D`M&W>g|MXG4jUHwXL1?WPWnxD46 zoDK9E1d&ZG_SGaq1tgGvDQK0;%AzAtETk`$0>_dSc8N4+8VU4{R>fAMiH5CPA8&J> z9fYO`Ahw`xdKXzG6Uo8hzWcN`2~Zq1u<35U*|ExU`qQ8GjG{%l$892~> znc1mc3hYLex$j2Jxq<&6Q8?pOb7O)T435fWn5~P?Qd4v~u9&y_t zcjBN4_DP7$TiZ`DMUHH+#0F~=QjJ^UZw_aR>pXeq^lglnsCnvgJ>uaJ49odf(m6c7 zJ<-qaw30a46wk7r1)7)C0}oNe2otIrnI2)sPMtmLTN!wNlT}{etDitejx4RyeWZ2J zyNG@ICoMcQ!e<$X2UOvw|NBo+N7RsKQvMxfaX859*I<}`#vaag2p|@C1r971ZD_c? z6BBTW{d-}!VY|@Th�HnZ`jQQK%S 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 diff --git a/doc/assets/bus_architecture.drawio.svg b/doc/assets/bus_architecture.drawio.svg new file mode 100644 index 0000000..e4858e0 --- /dev/null +++ b/doc/assets/bus_architecture.drawio.svg @@ -0,0 +1,445 @@ + + + + + + + + + + +
+
+
+ bus +
+
+
+
+ + bus + +
+
+ + + + + +
+
+
+ bus +
+
+
+
+ + bus + +
+
+ + + + +
+
+
+

+ manta +

+
+
+
+
+ + manta + +
+
+ + + + +
+
+
+

+ FPGA Fabric +

+
+
+
+
+ + FPGA Fabric + +
+
+ + + + + +
+
+
+ bus +
+
+
+
+ + bus + +
+
+ + + + + +
+
+
+ bus +
+
+
+
+ + bus + +
+
+ + + + + +
+
+
+ rx +
+
+
+
+ + rx + +
+
+ + + + + +
+
+
+ input_0 +
+
+
+
+ + input_0 + +
+
+ + + + + +
+
+
+ output_1 +
+
+
+
+ + output_1 + +
+
+ + + + +
+
+
+ rx bridge +
+
+
+
+ + rx bridge + +
+
+ + + + +
+
+
+ logic +
+ analyzer core +
+
+
+
+ + logic... + +
+
+ + + + +
+
+
+ io core +
+
+
+
+ + io core + +
+
+ + + + +
+
+
+ block memory core +
+
+
+
+ + block memo... + +
+
+ + + + +
+
+
+ tx bridge +
+
+
+
+ + tx bridge + +
+
+ + + + +
+
+
+ user logic +
+
+
+
+ + user logic + +
+
+ + + + + +
+
+
+ addr +
+
+
+
+ + addr + +
+
+ + + + + +
+
+
+ din +
+
+
+
+ + din + +
+
+ + + + + +
+
+
+ dout +
+
+
+
+ + dout + +
+
+ + + + + +
+
+
+ we +
+
+
+
+ + we + +
+
+ + + + + +
+
+
+ tx +
+
+
+
+ + tx + +
+
+ + + + + +
+
+
+ probe_2 +
+
+
+
+ + probe_2 + +
+
+ + + + + +
+
+
+ probe_3 +
+
+
+
+ + probe_3 + +
+
+ + + + + +
+
+
+ probe_1 +
+
+
+
+ + probe_1 + +
+
+ + + + + +
+
+
+ output_0 +
+
+
+
+ + output_0 + +
+
+
+ + + + + Text is not SVG - cannot display + + + +
\ No newline at end of file diff --git a/doc/assets/bus_architecture.png b/doc/assets/bus_architecture.png deleted file mode 100644 index 4badb2619d9ed5f624cc51cc2d40586037d385a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359910 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 VrY}8y<2U%XRa1LolDgTM{{vl5KcWBt diff --git a/doc/assets/ethernet_packet.png b/doc/assets/ethernet_packet.png deleted file mode 100644 index cd39e1235f10ef4f872421f7a484194acd2ad6f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 310473 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 z zxVFxKH~LEEldWZSg2S>tY%D@lhDalVyr5AA4wO*5m~hRKq{xA%Wl>Kf4eS;te|}%r zDZAxSaVtR06J4pXobkqItuMh72Gf+E$4MwFjzJDho-7fs9gg&aw^6uQ(mpv_AzDKP z?azF{c~{;PNP(jF>;A7oQ?uu9PPIhv6e#6+>JBJ7+po1^sd3s&6;n8@wX7y~cqi0& z_@u{`VrppO-!_jvwltq#q|>CNE~o%^FF}kg1BkOy5lZAljgS2SS>1+}cyjyBWJLoa z+q{e-Wd!qm5N?X9ip!Oi8PDyGCjI3up{_0`@fquri@1 z#Z)}>cF zc25*qieyy20oNEfSR||)VSNsZd+1MF8Bc#$X#0R-Mnb~d2yXHgKDNb!`GRU06#-Qz zps4D*TsleuIj|>G92;(;Dg>uUCPzhmVd)zsMjHrf;q)n@+yVFDZc~8^A2FK%1jP#A zwR^Ulm^YYjlWAcBJbQVNgXi7N(?fxVq3V&|=aC@WhN?0sQ(B)b>zKHnD0xW`xfT=6j+qwQP-{lVIj*?SC{5F#&E z)LF3;3sM9uNlR3<7%zO}(5G?~^pF0!a)pCaI5@d4>C#34y>hKYTSgH=C?Sald9rJ- zU8wGvg0SPZC-v;MVQ8cM-r{|Bd2k(glWXFAZi($Kh*y z4#JCp$i8loh>039E2NvU#9VNh5gp2(r9c?|lm27}TBTIDx(6jGPBf-4SjeH*^4=o% zKO6FMvYJQ)VQ~Soru945bF)6j$tW%!He#+JHeO4c7EYgnG*;KAeJ$QKsqCFDRB}%f z1-GQRE{pc>O6ZduXaP6M$xhvz;mg$|EHqKV#Xs58Ht#pffrf0f>w!=t;EQ>H!KK<) zSOnhsIsQoda*dT0?`|g{Lvh5DCuq~7*zmfI|9n6^G@ z3cV2^;J)tTha>dUS4{l+Xk9uLz6fKklmUrUayL*#KWn^l<0*OzJp`XD_lY^P+iepB z#m_VFb`lPJPP&`QJUB(fhT9O0JnQ`u1DHtvFDx5xXDO8{wZc!B2=B5%>cXH`NW)z$tQ zhJ(aRdW500fHf442kLX*IL zVphYhd+FA1au~`4Pudy_OeQLsfqz}1IMWgmTeeweHGk(v*IV6@jEwgf^RmPunbhBl zNJw*F`5w7-y$Qx+O+*DkHboNh*Ll%wf-s0^BCXHc$g2^bzNU0HsIMR-N#_zZ| z*9Id$6_8mmqe|lqUtfvlYFJzRw$vAK9)|VF9aa3-rnQ(M;TV_6&v!)Ep-Cw}q#l7d zEa{+oN#gAh3!|U$QRd`#lHOuAHp0N*&G6~6_O$6?I0Y?zSDfD!>u**bDNdQEWNCam z4&n`@N!c;q-+TI%eh0k9+v8YD<47z>o~dJoL(+J1%oPETVD?nwKxg~~Vv;HYSE^Ku z3Kl&zCr%Nc!xxZYBPJpR3Vs;oP)Tu|{?L-R!>@l_x;=TPTrSps2A8>QG2-(*i>}bM z?^s6aMM6xWP`~mLIe+=#9;+lzpw)>cp96|Uf27mq6Rl8t5Iy2r5T!`L@7}6wy|-NJ z5oOd$ZvKo;*}p1>b45s)eY9#Usm1b1lEd3&0Rzj&cd1!4sd=AeT|cdP&;z^A>QH-) zTe(D4OY)O>!Y3U!Xs|N=6Mwjd7K1^2<(SXVVU&lYV(<*>ZUO$5X?m)SGI> zdcGz-GWQXmD5ht`S|=O6(;@XdU6l#K8^o3#PwD$UoWh5Imf&UaaoDp)b;PaIaUa(A zmt%9B=D@EyE{kP$`(;5)({CRe*FEAu8XT@nhV)-*{3V=1JBXZeZ@U9k;|f0v^!4-F zgz&J8S?b@;PuJvX^! zhkk-hulz#uFxzDGGY5#ENpTX=<@fZK0F~z$?JHFBf`Vkef`BOdg?Lpbvc;Z6``DdBqBqb*c>+RY0YPoc?NTzhpD);gD8Zx`zc?CQ~c(> zR57dS19z>n&_bQx&m*$e!z5~>rCZlfRp9kbGOmfG2_Hu*e=SxQDdidXCbjT|cN^TM z{Ge-&{E)Tr{+g32jo4w1+})o?+F4~>e9!?&sjB*+wO>>#bb9n6>u|?laCzuCvIgD@brHWrx7IfryLYm^ z2lqlO)zVZg`Vm}p4cBrWsGd4na@gjlR_BkX&Ug8Vn5!fuhwp4Q(pwHs0q@3WQsr5O zUy}yQb-C(u}n>& z>)y)g_l9rC6&{VRj{(7lU9vXbOTRiT9xa+w&dVSfRt4@7*A5d84j{ zS$ap0_@ON3Ni3Uj21_)DX_7MOERLY(24kg>^j8UKWstpwKwDPtubQ1KLse*FiD8`fG2o~xS&;^gUR{N;jriLRh`r4I9NaI%Q^q^l#!)@G z-S#TxF6*mPe7TG;uCSaZigBJf+Wd~h>IDsvDffEhXNQm0wzro!8x%+lCn{2#zUZ7T z<i2}KOVYCq>QJy&0rLCH$!u`#S2 zzxIwkCE+FOStJ6#tTq2|$o4$hvR%k&^tCS3?(LC>frOXT5eQPdD{YKHWu)|HhANs<{HkZ z@Qj73`p%ZjCz7;;G5Ga6G}7a>9VyyBPUpr0HI{5PO&2cDR$k+9eU(Df^Ir(3Pp`6Q)r>+#5mWLdqzbV}{(V_CNnLY^GxneoMNs> zb?mNj+ulV}WsYzBu$8uPqD>h^OJ~l>_Kwat5M+cuF*S^%osmetKZIdQIKcQN-2l-B zyk#L;Enzans8))%ylkHG1WQ%vlNz?^H~bxMCy`20g`Y8>c$A$~(B1o0*v%j|!w2z1JbK!d+$i(iX(eutGDyu_ z+y|y82A!tim?x@(w+3=hC1s+1WmXzW6gt|AR?&m^k=JShZ>+gW2R&42NL4e=))D)0 zh@qEES-`0NILY2rsU#2L@M=0AlXa-=m`2WecLPgC5cp1l(L9fmTGM^f={^Tw`xs8u zwUG7Ds0W+MFXUKFSTEPXce;#QQHseHPI%J%JcJIx35pqJuwOeu7BpfW^dGeqRjW_22$NXS9j z{L4cS!u7a6gD69#SUiqkTQ8bvVfPDn?<UF2|ma!R1m?U)`yN$oifORHGUNU!_}ZDbQ$KEKp<;=RX;&|6|+ zK@X%SQ?9w@x}QGfHUW!se+&C-hp{mYZmvhK7~Go|wa0$D);~Lti3D73ACm91y>ZOj z*KDumG*iliuaH!J@+?Atr(D+Z7EB!UAY*KwUQPbCm(`^sY`60d$Ym4J&}+z(Uj{AJ>3OC`Ta0(Grx)5;zzJ;R-2wqv5C`? zDM=&|W_8&6ePgFn^S+>TOXE}J108USZ?lqnau?E{ov2;v5X_>UrIAUWF{pY!Wlpvw zp29{5HMMC!&1xJyPY^j2jg_H~1{zcPJM4)P1BPQ2f3a!`BjKQJvN+PN z54{!VKonm?x$%xlC_|?L#*B~s!S?VrJVuI&eg|;mSW)O2Ok|T;OjME>%aTmph+8Rm zf~dn+R@xJPn~E9<_+$PEH#FFEhtotfcBPj{l!TCxUDBzqueOkcYzg@4ZcHim8Mjue zMa3jPvE*a_Way{ii2a(vbvozftV6)gyyV9~6igWCneZ(T_w-VD4!C)Fd3)<8Oym=l z4}UC0?t$k(^4~|-lN&QXEopi6Yq61QmKvvyD@S)41P&0S%kL2Jd?7(flXy#=7oAed zdu#7t8&!wj)!XxApU`NI=kn;{+a8ZN$>`0ZNYsuV^;ck!+RUF|b$SZ9 z1@(d}&1Tvo1hRrxtoctl`~9(OHKLN9_6UX186aRAzAukffNJv(M*Y^!jj8vn#;fYv zTS}r&o50b{HtPKyRY$uh5e(AxDaG4@55*~d+Od1cMV>StmgKSK zM?Za-=MDdw?s}CI;q>xz?0p=Jc!9>XMbCkb56eUOJ-fL0uk`Iswkw>XT{k)pccTgB z)C=ku%~d)*3yivg>`mVS+@(|iFn{tD?wjv+-rY!f7~8a3kON9kfqR_JszypPd#iNn zaBpI&sj%{`NDbH1sTo9mXM57+ngqc-V;s`;4Un?ESklx)eV3IJk{8CBAETN0XezlS z>W)Ev%Jbb5;_>Q0(H|p^DqVLC6m5$wJ`(IJ6o3BM@`ef(oXd22`1n3V9!qt0chp}q4%?V1D`wzQ)J8emL^wSO+|RyObr_@Sx9^a zy!@iK=CU?k)2ItpZS0u6dJki=-b0)0H#nEt`XgrtL8K3rk` zZp5#0bgRiTO;yx>6nd5U@VIw{y{``?6-<`2;d{1NuX+R0n)0g(T*4m@lPt}HV78mb zbSMv-9!6^!v$aQ9xP07CTMK$reE^Odf;)Zp{)$CJi}Ola!`K70RxARy#BxBrz;DZ@ zk4GAB1RLE-C<(J#XWndv5Day6gmv~w7g$kBMOd`j*5-kPwx(ArSuV$$JUTUQkWkVI zbG7%HKZJLP%3iY?P#4L-|77`V79}~a9gGY?A9gP#VKVvywkT2B%`wEznjGEJ2mOrH zcey%I3M|xLGf5exN*R~Bikf&nqmN2u7tMmo8S|&Dnh;>*w zMt#`_wvQb#pIb0N`ZZlIGRgzEYanFvBg|hL@b}U{wot1=!s0(fajY?wa*|FcQOFWW z@%U3n5-JfOx9@|Ee)MPWB|Be_upzX7O8!ew0?rUQW%U*eR5}RtJdWWFZ%P|Ohm-teUc(6T1y5N+d|eW97py?z+b!h7#S=!ol?F} z=HinxWW9i1A-s5W-N73v)eQESZ@anr>#;W)ASKxO2$}!k9)7L%!9GbEfgjn4FF|2u z8u`Dz2Mt(#SaJ#j3L=pE2CjS`2VnrGr-%gP7c`wz07k*#@7+TvY1a3q1p3mIq;s`F zECW%+(QSM-Bgst<`4|5{%HWR%8Ym(j{(pi9Nm$kigReDP*F=|tF^NuV<*$GJV1+9- z1n5XU_O>(zpn=}&B+68O7`)$*sujz&%Q?$B7bOV^>BE-W09{hh@1Pl0$A-ok1SvGg9H;~AlFid8#N zo?kkCCyrf9ITh7Mp^=rvTJ}?7uCd3{3@1)y-{RH^RS12=&1ZiZX<|NhE`;azyG17K zbqxj#Xd$X6Z}zL^WFy&j?T|?QWTh%(Z-wA=zIxuqdHT zon2kX7az~zK6YlWDZ{>OXu<{!&m0|P_23}dsJ=TwdZ)JC^{eV0CtC@TR_-&Ju45;Q z#_>8QBkj7SJ2$aOvf}y(RZwX8GhW)^LH7b3xwZ+edUwn!Qe0?SkPmo+uCJ=CIt*4h zogA;US!q=daGWl^XQ4kmp3NBIoW* zAU|s?K`MPRr9^f&+p8|crl7#?_ng-t`|!6(I<20GT{hT&hTxdEI4r#TdRFivuEVFv zc#A2gM?JRdYovw$oy9vc@oPASiLv%JpY9XRPEMS1wUbOc`~`9gwc4#0ga|u3XKi{9 z0Lb;yeCkrZz!qpjr$@Ro=_}@shaRRR3>3j+u*^B0G07fN0n!QRyni{C1Xv>#`uHH6 z(XCH({LhD$bTs0B1<_bO^+O5etotd$0C$^2Ig#h(85#j>^-^Fte8lG~S6SK=<87KA z?#^~z;tmN@O$Mwh)5V4345Vs)07MS7U3(-bp+*hGx6c|&#cI(}(_kT&z_}o!4wl4q z6AwFvOR5ZF01czd%dxdcu$ed{0-G-l+Vsy?CPjJtC;X09E;?l`AzB29dN*OV`R_Gem{pDF&LmfiF?MCmOuLD zh{9RpBn}K0V=M~XB{5!%ezykfXumV-(PhIW6;L33R&chjlW2|<@;pq4@S6@=OIkO1Xdwlz^FX5}+-R;fJtm$iK!54b5YGi2*B*gA&2g2GUp8Fw zT@aad=l2PgQ1?B9-SY3^M7#c*2?@uAwsoyE7H+94Lc=<;M;M{N5S1^rA9w8@*&|^T z)&t_E#pM!!Ut?-HRCSd}w%0vN1}ur)M_@E?A*oorG zo*W;OsO<<%hGbTM7&ybm`6BNYc+DdkBa{%G{Ym?QmY-mm9SAQqy<#aS4DJBzAl*#4 z^9BefNrK9}%bjFESt^gm|AM8+(g9JWej$v3HbjHoW^GnB7eeF$AZMLlVy_?R4Vs`o zgpN;)O3VL~J2pLwj-P<>?g$l>A~0c}slD{?!Mx<^3n{G(z?m^fBzl3I*MAEJ89<&K zvnAaBFxMH@KuaBpv&UVFLIeuv_#vRD15sCB|7{XWG}r4aqj4|izuY z(2=0HRrCn_i&lR_0}8s&fNDcFJSA-@19S;wh#3mKmzdV| zY9J(|AenmyiKJFjattc#^_#rmO84LC+cM zkHsI?O>%23BB3aI0MzSE@`oaSW9|%)Tdo}=c9RiRA(|0JtkvFDX0y<*QR_B_{USK9N+ z&^=SxSB5SC!~fXOz0#gn+Ve_#UTM!O?Rn)Ux^ff2!2azQywaY)S#;$Zy7JOd%DBBUZvThIElP&j^@~`5t2 zRXoE?h84S!5Mn;xc<^Msq>Jl$w4_=fh`=#_@{1ZS8bnl?)jgBHSPA4lh!H|3h_$>7 zKViQKA}(HzB||5Dtp%b?HnD2={^be=UxVNjE|BGX7CIvA10rHj3VCkGJG1-cbDZ6K z)Mmkhn74=jOEGW2Le$d&0X;KD#`FJj+68s6Z-F!etFsl#fEA{_V&MPDjyD30U4ndt z233U&SbqT(8xy*_b+2G?r~uXmkz7CT;ly0VKm7qTh)`Vz z;YLJ)53Ym7c?pw&)y4UyuYdZcXAua+$^%po1jDOS4-dj)Z}aQTT*fnfRtB+t8a!3_ z=SCm+)*5{KDHJz!o`v)MdyD%QUlBkV z#_O5HzXaI7yXLE|3U$s8B%{62LHW2SK8{z2Dma;{tp;| zXu8gYmLtUy#l(D$?30C*XQpe*oykKk@ve_Sbdy_zY^sWvcE82L+U+ePtty5K3s+bg zW}utZjsqLo@QZ2kuw>0`Ipkk*bqY%9DZiQR&RG%|1?tno6J=-i%^|b3Grms@6D~&m z_^=~_D)%N#!bEWHbHxkG6p{#=o$vy|obj?D7^&1_94V6vnrs3C>x#X8yaadWA5R&- zg$YCksr0lGS$R$3OdRbnzg{_1oeGoto#B(451lm}LIlmVNSFwz&*Qk9WEDB87B|QW~?oOq1&rN**ii1ou~01B;8k~+T;1(=@yVw*r94qY!WJgp5OUz#pJJ7 zyiFNYLa4sRcy(J@y&A;01ZOwcs;g}C_@!`sj%9s3s!4vH&x8->c53u!DCl2G$|zkh z>19$_zWXUXzirp=(=P++(+WKe{1zCHcd)*{!cC+J&7(P+bwRdv+s-L$@J~WRGgt%P zjplyn8bF@L+Qdc9!sVhae#pR&f=3+BvxFYepMh4s7i(`Sz$Ct;7Ur*D4(^`S` znDs4g2w*NZ(d0}AQ9*?OHxJdVO|uKqf{cP`?B=bWUp9OPmUPZvl@6*s z2a*;9E{w>3AXwo^Ct%(=%ASD?n0jYsZ1gEn!Fdq@JRPzT_;2eFe6Lz&Siu@u#EUs# zVB1kkJ#@y~82+UDmU=kexEROnwCk^u7#9#ZW1y#))~7roZAO$(<8mDCY{s7}XoaL_ zW8d|Ho)BQj^Tc4KQ1_0QWoCW;EI44vmdSnq++Y2Bo zrRZ|!&&H+?h9v&T0X-LBtG8>qP@Q#9iv)z^Ao2VhTz`7~rl&#W+GFGS>t|h~bkEH7 zl>Khj^YR*yDfoQtyXd4*Fi6YflUqynm;6tbTj{klKbuwg=5h;OOUCo(e}I$D?%L6u z3KV0Pi@f+Di~s=3mTK`33ZMm<^BKpxgb&XTh}V(8Nr-^#mL_Fxp;z}>uaeH6Q$`}7 zm|JHQbG|bjaM;~c(K$al_ESwBI%&TdKL^*JUcZ;@h;4m3w12*!Ioy_=K^$kg5cBswzYU$r;$*u6JqcDd52N?ec#q+mL_*eSypC`_> z0dW+BG{yhi{y+2Wf2R+q&GcJq{jV?zZxObl@IfmrnT-wy}6@1ZrAZgJM{-%uZ!eH8I6(e~eiWJw!h_;mL>I zR1B>j2TC=8!arn>+tSnGHJB^c>&9ri1a?Pl`_+x_oJB?5hZo!}>kdx|;We|}t)rPP6TMY3V?KeU5lzz~sC^7z<`VRc4S$@}HnPN}fy06@5^!_x^{U z;IE|Ef1qbQc$m|Z3fPE9U@Ym00ZwA@cHx2Oz?1BjHiri?mz$KVRBZ%XF&ZbhJLZfO zvw)4UJPiH)t=K__(Y#Xsv-z6OVpqUjHI*>0LTY09s>akl9c{sjXJ=;PN${4uz z)gV-$cyy<@#Pa9#+TYcs9x+WG@Hia#{;vGg&uIN!Sv9=o^st5{@N~bP^d$Fa5>bd& zRoC5Ne^Jg;V-;XKTxjow(BOVT{SCg)vDS6Se5W!iwbwDUwwP5s`F3ekx$G_rq=EIi zBWby=6wRi-l^x#S&DK8UpJNTBn@{jOdC18#?Y`}B-)%cnmub!O^w4VCF)*Q?XRCv4 zps3;T+EzirvBi8hwfmCh#PEJXH<#_8T?b z8}rfT+50OVIP*W9Y7WQZgjgI7Mzz(Il$H`Ahrb)h`G^N5L<$}(q|7H4 zAY2eAlwC651h>=W!qbF~7b}Pl15_*ZH&1nnS^^OFcPFsFR6=WjF@W$L4VZSRW^A>0 z>an(MbTWu)T2G0cMr{a3UZ8#iMf40{;k;4#kESqKBDHK=vp%~0R7}udE}isdrdB;K z3nM&NuR7(hpK7n#Ms9W(3l>!FHL@@}m4Ay<;dRtz+1X9``{V>M zgdQLnW-m%CLaI=;Jdd~eNO#;O4#!Kja9?~rnE&xsj+w=CzrB52Q*w-IfZUDs6;s)c?|*shvT_l zwWPgPJ|c@vf{v*}H`^?9V&ejeMdojD?H#Qqa8+*v&)&y){uS@VAoL*1i=}oH@v9L- zv1&WZYOJ>lN2p~h+o{St#S>%r8^ZB%%S33g{U&b|l#qZ#$n^%tQ|w#>w{%Zkyu0k0 zXT{`_;01T`Lc?i<_FLZy)t3L%3!F}=Icl$A^doj0%t%AwuSJI%r_yk z9(S1!XY1lNu$^_lArULhsm^v@1?&>p&Qfy(@UvQ%lH)eZFblviSzgS)FUaCHh1wo7 zaWoe`us6%%sXo5n<+REu75zNQ;XN1skJln?6GxpB@1QdAedO8}hwkCA zbQo2a;#jt9X(*&SV9e|&rbh_`AjJp6obSM+)|FixXgvv7dUQs=qp z%bT4bJoH1Y=J;kr{+?fdx@Teeq&F)4ghQ1dlZV|3Ycmns{>Q+HPw)1-zpLtMuex-* z%HCr1Xz#;H*lXzEHv*DNIK0-WdMj?zUz|Vrz|a39&hfgRkd`dZ?7NKPK9V1hWP$em zL-`f;S?=G8q;?hPqnQM3@E>D~2hhd^k;!?XQx}(3DIEo<1}S=GvhjKW$kU$9*M9s@ zv(_qdxa>T8k6Yd2C{A2|4+D^0g{37bj@_Y zC1LW2*z8l3({7H~-6H{&`f5(LbK1Yf?-XvH?ACZPxgKWL9Aw%aET&m4RtX*sb*~3e+5Y&sja1O$B@=ml2Y{YZ5jK z73#KYt`n}7Yh}xXbo|2wfT|6<$#X96xykM()B<_8ZTllkeAVH;kNDPXUYn#x^)qay z94cWwkarulMGiu}&w!`k)`u>kM+F(Eoa2~{wd;D%{}4o-zw6Zby#5Kl$_E(}35eJy zaZvJ^eIv!JZdQIcw&pSG3dD4;(2uP&&x14|%<{`loD)sDd!NyEJK$*iMx#Ht`sT4M zFNyEmwu}EPb7p<4z>Nc49?@9SX}Q@w9hs>0eDTAq*Yz8NKkn7ITkX<}CB)8(79d?J zGYAJV|LJ}=ixp6vy9duSnfL=7b=@<60fwPzdqoq^z0bMC%+EU$#MZCF_^X0Yw`hIA zki}KqWo${OM7gPTMhGadNJUv5!w)TAdu`e)o#m;EX$6MC^P3Sa z`@=dZ>n7drKy6ybXcvkX-eAj+}}G z3SKgA#$Mlj?EI@$&Lf`)yzxPZT8q)K^1dJbTazrGm9(B31Ov#V*}`wKBQq!1B*8bc z>QY#3^QBZz>5b@_&>GVH!ycmf_vfMd*C3TZ7HmCTo50nJbOeYr~^RqW>B7%+bFK?t|)Y`AI!Lw0Gh+Z;(i1AivSL$+F6{|NFZk;yt#7RI#r=RXA_hs~zs3lD!D!i}_}GFL3;+xAM(tmJ7K zkNJp)x^x({0kcNP!m$02-!UA}X;&HF_(sTV_sMd%qu~1UmOFmSl^D5u_#Ya(NvalQ ztcI6ZOf-oOw{twJMrTNN2j{DCS@t@uJQQ(0h#o%A-GSN!-Of#HZ8yb<P1=q* z41|lx_rl|9Jr>*y3te`|QmvfEp8cNVv8`~ZJ`i}q;%Wt3toVKBG{IA(spHk{O}2;c z)R7FG!(99kZn`{fdb*r+|NTAwCVon~n_=oLjIDU@?}a~LQfIm>PCI`@5&Pg>T& zyPMYBj{EU7vjC?o>`k$2-e}Gwe8~46uhZURW`GYRpW(H6M=1RkNoR+t=g@Y4P_uL!SD1-*EM#y1qk)8j8l)~+u z5NR$!PJ9N-$77k!)-ODb{ z17$Sf$4M&blE3AjO#=W3e?pGscTqsWWwu}-!NPli`z6I>R25@xIF{Ezl3FgF@jBv- z!mQPj$(}K%i8x^` zGlR-FWp4ZVXoQ^7I<6}mmV`y-0}&sjB6&j);W4qkC*HqqsgA_Vq?Rk3E1tyGktUz= z(Dv7YyybgfS}2gX{J5FIx-akVE&e>dVGB@K{8{q9x` z+RW0e1RhsPhzSKimPti&tlS&S!5Yt+aEZr;gO%}Y#vzn)@%*U<2DPyyEV@w-%6|=V zBfn&VFsNp$z1QAd9-`1Jw#Xw2aqMa+#Y&o#AJpj|L3sEjrKMDshzh`I4=cC*hcB8@ zrfN>auf=bKGH_oWw>(HI$kHs41aGDU4{s{?Plz80ZsvQaMZ!Ju`u%SiY5ka|xF7Kt zHP4}nNAqkGkOnI2#a^l}Fj8?G=Ka!uE3ShVZ-RSjvvq5jeWO3c1zO2RZ&;WQ9&e6W=B!D1-C*z&#?vW+w^%7UTnB!NFRk;_mvlX- ztkujtVFe<${CQz-^9PhmwINe+LMA*8JBJrkEM;e`*N2PDi|`SSh#0QV{bJv*`!O$R zph<~&0ylYgw8Sc5qdD8`;cb4D)1{!B3V`9VvBV`{DKW?4Fh>=u-CSnLYz9r%#;d%^ zFu3}Q%vHgw4ng@S`9&qB-eCJ%O27z&KLIc2-j&6?%DP-rU{`=i{~qGj!r(4xf)oAyN~ z)M$OIY;+58nX>k!+7EKE06YV4YlU=$4~4TBMBHRPDA@O&bxYkxAz56MUvFt|)7SoI zMhPb5V!S^}B^80k_2>(Qfzm6D*BcJ60%GFAgq3b3PRc9ksL0aiA?eLji3Q?B7?4*_ zS+8enSNs69C--j389hpb`qhutw=`{PSQS{+caLTGqjPNZbLe(($KmW{dAU+JZS2cU zyQS2hZl^y^^3F#-BDT#J#uqB(-VPtEQCz3ZdsQHGiwt5y=_R8NxAtkdpj!|N4xxTx9Dmk_USMK2Rpz%~OTN*JRvv?vQOFVIPU| zOb8$mLz+oFwN!F+vX=E`+rky9o^L1e>J}IUPm*PKRTf(ElC8?wdiI)TiEi-~ejDBA zyBHBF_H59oJyAg-i|cdq;XL`Ip<1BGO2lD6sgL{kVc154Gf zH<=uhMY+!yO>pO#t4~i{TcbHLGoO(~Xnj^=wTwGGo;VG6T`dzoB+HnFrrU_$ARho-b`rtcDch6b;`qF+cBfN*p*=Xb({RBt=@~g%S(^f7uKX2s$S*l zW)PA6S)?cjj9a85R8$acxbKZv)zHn8w0ev89G!IT@p>4DZPy39mAVbMM)G#YGNlHx zUVRy0-L}R1aOvs=Mz1&>xM1vzyJEwDq;3UF`-}&1om2;Q<6ab-vF!cg2FY-GiIw4^ z57O`NH9dIbyvXZ*P-xplr}*(5RIIaw0#Vlnq;awZ;t+AztBte-kMb3#%Dt{QKCb(5 zZu^_9fI4p-t?}6YKr(wll1x6~wiV2%S=`aq0eLZQ{mzR4?Rd8JZF3u~dYUY;L?m;Z zF-ZnOSAr1B(m+lmg?LB{;D_0-Ng@$@IN5w?16zCCsp7D$ad&(;cx_a1pD(rxmqq8DR3!7*!Lc8y$7`TG=-cI@+36rDB;8{{_-qIq zUAmsf$||4L?qDXO@K0A946B_kZ!h(1HBo}X$l zQp~jABCSSL3*E^`TIHJCG8qlSCG!y2qkEHiIdAxpJZ}lG3$Y^RwSNta3I=#r@0C0WL@&jG z5|0|7`^k1x3>UwpVFXwm6=Ny}4eEy*wnxZds=BX^mW_BkBr5uOjiVps#^YuV7Gph3 zjNk%#U|QsNy_*z@wQG&#DR7vh0y?appg|Bv|L247N}{}efTJRZVz_z9^@-K73adEM zI(*VtCde8p>sROT5o8~HmTNfY!r`~c1cMF}>(Vg(vdyR~mX1lYSm^|Z&RaYv=kRco zwK`Fh3LboV(~ingNp^a?=7|;lUZR$WlfiXoIsNu& z4>}Ivl8E08Y=2K~%j9RHrSkNu*`MRMym7vzO3b`!uUM;Q0O9IN#Sm7(-BG*y#?R5% z%bhp$(}8l_;Lf`#WHEU6J+H%0Ciy#W+dz0yQImOdM{1lfzW@C%H~UJgbh84|vjzMU z(MScgqPeVA>8$%Yoz)}Y9*B|Q05*7C&xSPg6n5H(+RdgL1OHxw?IYgz+7a4?Jrzz? zY19^;H6F+1!rT&Rb!dL{@iCb8DE(yPdG3dfs^9O}vfKW6q+ab-W+U)x>u9T6DiDWB z%b4ii>PvVi8Py`f0)iPZGS@7(Pp5i~`+16x+~XS3@B^bl>zn-3yJ17$XLsf8jWXFP z4j9EQR3&EQwTXm9-MeKJdnX;c#%~?!?w#v;ed64<1fiN+@NZ4cd*+6E5ev{XI^UgO z<@WKqu_GBue}*!HYO;c(!2vjw8Lm%$@upmRhCYD1t5Rk=JE~&n^4DfzZsk&WvCUx! z9j!AZeJ}Ny(gg-mIj5;pDJsc^Tfoq?u^aKsQilqPRO2l`rH#Gc=d|1@uCe+ek~j;O zEs|L8E#%)k;PiJ!AA;|w0#Z`t?nEFgA#Cau!PKfh<< z{=$2lr%_~<@3^92NZ3;MnnL`B9AZJwUCu~Cc9ThNS%14kx%KbJ_S~H0Vu4|Nqo^@vQHoH9R+)p=i_RYJc|oY5;ep$6yc29oNaIK&(eIcir`tXyENEfeKV1v(t&9XC-5pywghl!>T&wOgnV0y>3Mq~<4t!LKI7J&n_6cIE4W z-aSNJI7QhwY(Zy=p!$7ETA-=jH9o+VR^d5D{lyaX87tz>+5f@JlloW)Eah&AkmVcS z$&Fz0P?Ol97Q&ki!lcUjLC!y#_qA{?oKa^q6;xuVOcYzjgf~di3~mh?gth{USIdF8 z^YAAx<`lJa>Y-p20A+F$Jh706mhF63R)cS;JWK00POEW7aJqY39E|sAYrdPoz+k1} zjg3kYP`cUuuA_AhKl{RfIHX(pZ)Cj(IMx0CKaP$%Mmk1Dwrn!XmRTgbtn3v+NLJZ< zZz4ogWUpjphscV`j7YL)A?x>it3IF4_y51HuCDvOudD9kykF<}dd%lhOBc})yZ-}o zf9%ECWmHT!`2|iOi3v_K?WsZ_xK!NkDcl)`E81pkxY8!!W}&Xeo;b>*+_IZ|i;~B% zmbtoJETEJk{+;YrM?`A$W=jx3az8PN&BHS66DM`oN8v6Z%BM=7Z+=C4(KTSuBDAO2EokEA-Ux)wUOJyGP`{+Yj_cOu+$ zUY7yrm2P!cdd?~;Rzp4aegljb4!8(cy~Hl%IV%#{eCWfrWUncv)c#x>^Y6TG_i=r zsp9$fy;Kp(yzt&$dR#JS5c~3Ew4~u}Ds=uq+}at_?NZu>6Boqf!og53b$NzdJW4Em+bZ@Kmj8x_Hi-}>d;Wz+cReOTqbvJ(`8TWdd z)>zo}-A`21{}nv2NkZ@7WP1Hdy?A$AS5%?C@f7NY%cP*go1e))qch2_9`PPDdKZcR z_BmjB=b9acg&UJSf9D=gm@JkoL2Z;AJHJ_g7>Dw93t4y>Lj;bHg;v#rpLc8%ZdyI! zH72@cPp5}3ee3l>R&)xXO(?wapv-=U%KZ;BtrYYvynSpH}WimZHQ zZRjFnyhC@3l`S*0>qpvT!Zvbuo5`0v$HcVq>i9mKFX2kvcmw^oCZWbtch#9O(!I!ZM|>|I+JY0@lX z%8fSJyp_;YjWS35psu(33#h@dAz&$?4#NY22UZZsmlKK<4b-YuiY!ubW_ z40bn1t}wQlI*gQGx%d73%fg=kNcHj5w1QJ+K`g5MvHU9=W-wXXem>!xs*(HGAbDbm z-@nEjiY_f#Nw}G)n&`h!rZT@O65@|4@}^#i0F~*>Z~d=sdv-DZ^V2c>#-oAp46`+# z%q*CFk=mi&i9nVak1lAs>lg+;)zz^}K((a832ND0aI`a3m;%*7v-ZBt$eV|5{$|eE=Z<7#GDY|FFa*8l?me7u0Zjf6H3odQw!a<^PcO?&@8vOHg>OC zyR#FAkrp#X8OB*%Zn$G%N2o?rzK`00p9wyrDr)B(gYT%)Md!%C8wmKpDyFsewT130QP8gq>wJ@A8G4*T-#r z@5isRt*hq;#Y1QRqjXJ^PVH5AtMoTIic|llIQ%Yigp--`XDq6sFqLA~{S206X~GU- zT5kKahpzjE+Ilf`k|_V{f9_z-R}IxtR9$t^_6f%W^N&h7Ozb<1mRFdjHcMw5iepoI zqA#_};!d`_x8Pk^txiDawLRgcS?%~0B}dC=(qzAg?IaB|w$#iIBe=C#(s)bu+DN%& z#dJul`ssBUBV}Qjd4~d)UEiL2aGCz(Dyh%5GvE3#@BvQEn0FdzgclvY80a;)t$u-@ z7^61RoSGoMQY|;u4zo^{&UTh1x!c~3+bl7eTQ56(@bF-7*6$Quf4RuRUxgO$;@@6c zh3`_F5If4Qklxn^`aiq;deU{mdmP`j>^>0lB!r&rq=)J^o_jKgpjuFB#e181YTUB~ z%(|S^X6*1tQt8F+EB*pRbny_BC1aSX%OXVN|H#arkN6I1Z9*^S>gnt9f(&)xc=78#6jY(5w>{!3@pPxE@`7h=5)Kbvs#rDn|&{VdrKBHBViHj{^N`ApoI z1N8`pKMIeORo7p`HMqw-H_E1tK?NPdphz}@wlEAEo22*IXWabWLu&DU2i~(vIqdFJ z^q&1cf12TvgraZ;INbwJV@cSq6Z)HTt`Yi@YyclHQHXeCf z?vk>p>Z)pq3w6p1I!;Ml!&kj>4uMO|m;8JV z7LB{+;yACf$tyv^PD={BmdS zKOuk<5dwa7D<1iy5r``PwlyjNdB%Rs%)YIWA{g??sm+j>?g+zb$L5W}MbFD?vz4}= zd#_VOyVOX%JGi!@CiaDu`+tO0=2%74rxIgct^AuBzk=OgCtuM2@+ zluyIOJ41?kKc7D`iih0QmtWNTGzh*guQ$%-0m<;=6N;u(9Oj!u&ufS!WXE{}pJ1pX zoXPx#b(hMfA_;r@^GJd_Xnn?YCwDeEwek~LMsvymrF4S~xOgte(EmmuZlV2fjq_Y# z;DFOZ(C#Az^NG#u=&6|)>aVO zEvGl(71+Q}-ln+ts}-)y+hP7+`D(hFY`~hi<#%tW`5?U79-Te#pFxHEL(^%$=73Yz zfiEX&5z$Flhuv#`1(VebVO#FrlRY>5EzL8K&yN?b<6%3BVLFR6E3A&=&UjWIuF8q; zr7y#ycIrJgN25*PS>vVau5;Oasn_cQIWsH6u+CMF`U_`(2yq+dQaO3v0^^TTxc9q+ z>Rc9Y+m|jV&s}VN!QX!8jyk4DyXbM1$oG@{#1!38}Y-n?6&aB0fC7 zp1V&K;_?*QF+{X1^l*%@nL|^EO48|eA07U7~*&rcRr;29enWCtClpK z2%7O?rU*z|DH(dp03(gf38a4ksl3vj#7AdssVz97H}*8ByRxiu=2XZOLR0y{f$9Pd zM_L)vbQ*=-y!M(T+ga5tZ=G7k@r1mBlXWLgf_5h>n^_p|1>=VCG6HYmd zJt8XOVv8f6pc%N0Nbx~2OC*&b9<= zx@gnLiKO{n6Ze&iswZCfD^x#`3nmr^M)0d{B0JuVXY0UhxUDYfjzspP0Ia z3UvBNwC>reNgY(aiq;C2doG5}ofu+GL4wsTjK+Zr`n@~52!Vh}6PCTl5}rw<>UzuC zYleXf(@$K4To!I}{nEEm9KBU@&vLd8B&A9c*EGt&BtCL21IC5(Wn$AqHh=EczrUL( zVNFUQe3Se$OMaL|^ZEAA2hJ}&E(gusP|hR;DnTYOeU1Se@(vDP5&@jx36*NO?(aC& zz;Hi(3*V49!B;dC$7TM*m3Wrxw=ZJs=w_NKdSjnsPhaD#=vML#=)fd9nzNV8tX9si zhD;40rb2F}Y7-81oAdYgaUgt+x!-bSQnj`KuVn)=dF*3*pfbH`QQG^pTmgq2^V`>4 zBT2NmC{Ej&Xj_ROx2hYMf82b`z3 zA1&J`VQM@pG-s<1#P`Od^D_kHs&eKKF=Ki)Zpdj)_SwOLtGfSu+?Ulo|26s~LjN{!bytU%|%%eX}7i4pye#gtAk!IH`@yBZ} z@xR)kUnm1e2xaj^{f%pV_gqM0WsYR!$G_7sACqP2M2us&ldl?lnd>rR=7m3+tOXp& z-Q{+o{~a@SXa*;Gv$PrNY0-v*U;6J7Id1q*?vqG_|MGH?A~(vzjfq`*$MdxGk*M_e z$#<^Hy;P`CDbJl!GIn+8kqqOqMAvtZwX&5k(K2?4UE|&z^CF`x6hE)ue7AB=43F;X zIa$iisOlSiPb4kdLWxK3N`aAR^D$q`e==@|EKI}Yq*K-VR6%OqYjte{DHJ5FFRmqA z9eYCWui(1g{e$xIE0Eu*+3-3%SW4yU%e&Ub+utN|YH`l4g8Wcnb~sJl>(5|x`ARrh zyC={*4iK+2lV6KVS&U;7#QzUOYa_%?F98OdqUlJ+^n8a^L+=?r9e=~huYz|wwT&KY zo=Wc}HbgYepxE8NVbc|~6Z!3K&e>{xdD?XdSf5RlFxOW!Z=vzmsBLk_d?mjZSc5f- z#dRc=d%fbT=$k8ApCIs?deJ6+UAJ^T9poy@UGN_C(q6l!ZFtlCFs!mm9eQ~~LHxVP zm6B5a(;+ck;Iq7Nxj15(-1HTXjqS?*A*lMMVGmv|fwq@`c(=y9|y`ijR)lyLfEzC+s7lKYb< z+oP(vJ6Cg#)UJcg)f)jqR&S)P|6is8hz(IwLmR(Ope*_urH^C_B?U!|k#VcYi35gy zLI>T$_u6e<&HlJx*dD~5iQ7v6D}Y;|-63$_)%?`|PK0wft8ccS0BTU(T?7Jx8)l^S z{og=bgMs+0F4;R$vj6I2gV$`)>o4U|`W@S1@izI&6uAqok)isC6_E7t=HBiwwQi+# zTsdIXITrKw$h#r2SrRK!;~|{aBMz4vwI1!yVBuVlD z;Pj!~^1Au=sn4aRa+bS9v|^n=74641)(-FA;L;XTXN#o&YQYYqI?fv<9IDSfL zc4tGHo!AX5S(FlE!GvbpdAEY8p?wBmyBi#^j4VaIFsCS9?*DTJyRadv;I?E0dI_3!OwTjRXG)$@{9yy-T#?sXFbK>3!f!KaH8PT>l&A%c~FwC_4~^SDgm|62W1 zNmwN8TT)8xJ9>I15BrliV2OX9>t&SE+cMm5{Y_ zE;gvC%pOBn82Ew1_r+c(1>|WYu&N}w5N}EXSeSJXi>oog4gXYZ$OSX?dOt-kHe)JN z)c>dozNmEcR0i$p3a38!DhyAQtm0VR+cx)(NZLP-OcG0EPH(kMt(K|!`YV(*;E4Dr z;0WG+AB%t!yz$6{{0LBs( zTk>DQ&rcU_-MQ2%zeQDB-$PtP*mA7BzVpYm_ocwWBs7~&gpsn13I(+4ir6Jf`FQhA zP<@^~WZq^wfud|Q^&Bf@_#ZjjR}BSEnF*2sH(2XhuqE0gCY?HHN5AZ2B*KH>2IkRW z$BijAdcz563W0O1X1)tUFU|3)8H~uBQbWDuJ=p>cl?mTPfl}#VsnOPXUfakL@?o)b zk`Geuo9dr@Cw$|X;#2Mf$%n3@Uca~O8v%YPrV>&Ifmt%|Az^I-0{aK>^epvV>pkbk zW!8Qm&a;Ha2I}M4Pvoe8`(dgSpcuMGw+R=rgl_zJf0J)`C6>MTQoM$E#^M^M`xeku zC9p&jZ}|0}E%qus*#Kh3jV}+Ybz zQNA|NG?zVfAAYX`|3%==5c}A*E03p$`&J*4N=zeCK}>xvjlz;Jm`l4ViOW~cV%t$N zwFWIhC*HW;$;K4;S_e@;t}1nwT{CsXlA@Qkj^d#mpRnzx_uZuslgfS~ zeGyF;MJIWy)^&Md{?Uj6wTF>II~`uOHioYY|PLnDDw2)szAM*KbzXx!je)KU0*CP7LU$m0!TT zH??vvQJ4gdyJbau(6E~yFqHOaf;={*#iRp{k5r~Ka5>g z6^m+>*ez>Q=Phj$i04Uq^KzFIkEb6GHe9|7s^)c0cnpk&Fe&hY{yQR`K>`7Xm?{Y{ zhBU*LnH9YLw=E5|^w%#W0tySce!{%Ou&zov{rSDwuF+>{7|E8`!l>BvCAcP&tu;Mc z>BP;nZVJIPnjd{}~!tGAY9B^@Sq?w<+-_l^O4rZcX$ zwBG==)yEm)q~ynF5oc@4mj{a%a#^{XSqne! z+$>T8@ z*Z)d(ZG?WdpNsK&(;X&iFEyvH7uVa52_gBm3o(i$$eAl^*rhV25PU7dri8=D2zFAe ziDk}!tVvfQ#|Gq7*>g|Ky4Y=mM9kxShqsz-c=+cXv0VJoH%>Fbc}7gj0{5q`K!Ct` z)DGWoooOtCXC~lfLhB*{Y5HkLu{=9ak+fOKcz=Ofb*(pDG)blY;MZ8!5)tOsLjThM z``5a4n5&!+9C`G$j0aEt0-~q3C|pLl)Kdn2gn%rEC8_I(^Y86dUiYgn-+$YUY@~Jn z_0qpz<>;#WSqc9cUZ9~}qD`rd_vbZvt&3_6YwyQ_D8f0`%o@#85IYw=atw`!F(7E< zGT3H@CGi@6c|gIVksWC6gr=A29OS7R1C_sMs#cx4F=i`p7h;|{>XSZpnSYN>_8%0u zMuL!zN=af7`ai0lBZF_C)>;6sZfTRX2)hmh_HxR-&rT!5Z-&%lKiJrfVk}Gz>r|LA z#4Q(n8ay^xvHyFpMf^a@Gr(-W5Ew+2{GVe8&^;Cip-o7bE(7!aM_Q&R{dEA0{we); zCu&Djsm+8!_hKAE^4cz(FBb5o-R`thOvO#qoRgaN2l1N=@+4Zl zC)PbgBzh4B7oPbp?&8!2f9+}IgYybwoc5kJQHuvjKY2NZw8VPsxkv^~` znBl2Mn>%u5IhQx3qS(wmX%;gN{$&C7ph)noxNha%oln1MyTFXQSSFwidfcZ+>*rkF z%Q9oWBRB95(2C-LZK*wj1gEWEN>JBQd4}iS^6Oh23<8IR#*JTG4KR@fNS;m^406kF zopI5d8=!+Ws_lqB7pUVFj6M-@11s7_qFc*#X_&ugDn9MI75TmZJ8V&~N) zZask+o~6U$EMiZ&3@M*4T50VW9UPs2055sdukW#^JPddF%UKzc@zxIXGM;|!d7S0r zcZe&z7-acZv6NQ8a>4`HmjD2bO2$9a^KgF`F{*MlyvdJ`pbOl;U*|H~tER(g{Z0nP zICchJ{byfd(om|Im+ifd^5Sn^vhJ6@ytgEH-iaFEM2nNL*We2kr8tam0j}BQ(C6#j zvK;Oxne#N1H%H(ddj8<&LUFENNiYYJ4A9#PGrLo8C zS=-fjy{dmnF}WXx7!_7O3Jj%alb&-AvVPCOea7>?Rc;YBwQFytRiOQe5rUlyg08VW6Q0^BqYC+^s7Q zRGG^2$09j&m}qZY4A%2QF-1y0BcQ8s>K!pWCr;%4t97JMP^8v%^~>^ahZCF(H#%Xq zCAlyrWBUoQZNhOqZYzaT3 zdv#Lk$2y90bh)Fz%s$R>7XW;hH$Z{!5mJO4^rm&Y2zYXf$%Rp^Z8~G)^T5rBgo0>w=e7?@2k9iucV(0B2hl>9>k7>w^tsi$OypA&}3!m2I5{TVDrkyIX&yFhF|eb3PeC?!HcEY4x_GGur{H(n#DdsP9g_E>nyHy}`&>w>SG zCZqz0GRMyC`}@=n*;fd1Y&=B!3FcJ!Lh7SV-d68aou?-{Yv5*J&U;dWMTGsU$bcoy z+K0=F@zT{Kq4%55i@acXG4pXvm=`#D*KOo3PX%AUDgv4X*MK=CHlCNmJZa>V^Sy%L zf;37;SElY5!;=}(X-2p){%4~%yCl?o0Knavz0>&HL>zfjvY1Tbul04i1x`%rMs`Gr z`IPF!PAWVA{!(tN1>w$L#paU#$g|Ngd1lmYKL48{d%LD7_0Q$YOovU=-)8y&F2r*# zw@OW9{9?LdDDiTLE(KMCmGjQz^OL*co&i z7(Tc3>LEM?T7B}E_h8u1EKIMEMQ{2@rLBF9@E3QvlSDLm`?T36!{X@Y^Jb1tr*Ax0 znypy`AEgWCFKK1KCgWPn4@kM%``c!hL%f6FQ$#Pgk{9Sb*ZelD+DPR(JKLamkczHN zjbt1aaP`MwQ%x^jQOihqbS<;m8zU{-;=CVml=+|AKpF?&;j5o-G`2!*QQl#!Dv!}^ zKGW1+IN(#Ux-fnZTzL;sH_}IE`&QX{yns$$Yt48QFYSpa*pC^oas434u8YIhZ1;@y zthym&GlR;U=08HM`n(5_{iGg-&Qib(qdbTZlgel6zu^|@B3&tG34tq(+tf08X!hr7 znP04L84+#KiMuKTG_V~~W5vw+MvWYdg_i1aHA(Vdsbwg79i_ zlM3ItKqmZNs2l%pVDIN=V|XasU9Jq=5sUPn zl@i$*>)ckglRLh615%fac?pKP{~P=yFUb0Az*+$JmDXbH32f6wl;*No>(cKg2MBK` z2b?;?8R7$JcZiA``cIbXB(kcUv!wMrniB6Ef+NNlwj|gmVLqC)I$K)oh`D72aR4&3 zf@##QY3SzSr=m3NXI(Luhfn@f0HCtNH=2Ir0LWv+$zDo{@7TrKF=HrKSNOv%M>Q-o{0~;450U zgzu;<3AO&wcV?|OI|!+>AkeR*4!2iD`~`g>%d|ep?R1!AJ(R_dC|Jc6vevOA$UK2Z zA+|{L1rtN2VP{}a(UvOsS;nCTBZfK&uDZd0f+vSHVzqXcSp6w#xi45BK-xYYTov(V zfl}vhbPx*InCo+>ykCz`*F0aW86&hX9wPgr&a^f7a%CIqv873iEnyosZ(!x9G{qN3 z5m0KA#Hp32G8{JTF)w)6(3^h#8u)GpoN%2!yj>{s7n}{qLyG7NZp;s3#mD0Qhe6N2 z_QF~*x({tlm zDk!w&_-4j(Z(@k=H0J>3VVOFYQkanUVX8UcxpAYnk`P>@6(qtP!gYb)!RT+OygMexE@L@@o{-?WRRvsjZN;q*m?l;TKu8e@H$BTBM#&*PNA-1-n_uhG0dFP{&p2fzu zcmCWwPCY9QvZ(@=7SI}NcLuV7Dtn4cKu)f>IJL2N*^@_ z68ZbV(xu;g6J%QgSa8VZfm7@xyCAW8OPxEH`G-vR##b=Vz z{8jd(P>z&DBT}HnS`RUJTCUb_MkfMm&hs?;!!2Y$U=H*6e8tN6#VJL;hxoKt=FUyQ zKEmUn*aS}B2;)Ng*$jRg0!w67jJ<~8L!>nE2sCo-H;&^vxl?iT_>Meo2ftmer3yT+ zGTC>=4Gs9r(p(6dbD?foOU;cC66+l3FLY^wt4qv0A888*c7WCRYW5tsg>9QDUC9@? zKtR)~IwA8I5~#-m%+O#BiLKatc(y+Nn&*(*N)BN;V+|9J-4|ZwT7Vmgw=iZ{;XK!S z4G>M#+_x)h)=R@>;ObM%H0<+)dR0IohVoLxo2n!(oi50`n6P}Tdf1S5G1U12aOHT& z7d$4jI(FL;JmAO9Y{GW?oLlX9NpwqugCI-YW@=ut?nBa@mF*dQRbj2)K0hOT=Wh5n z&UsvBad$1GG6c(w%y#iD0qsI7$2Jx1P!dp=R7{hqJD((a?xs z-rNFhZ;Z8YW9k6-5u&#Q}0L zdRJ#7gR?ZiQcRqU+ePUaEB6#k#bulz>vcfi3;Zy(^=yVWF>nL|*}lb)tO=s>*%AKz_&T85{6fZ+ee6jk^C-l)qlu@l6Rzve~l7yIsV! z1Q}U`8_75kv<+tvh7<&!q34M@cZp=;t7NW_>;Wv1fr8B=tQlchuZ}BLdt~C_y^CFX z|K=JydKfZ;*-~0*Ao#|C%r^O(gJ%0<46Qh;;^E?3csDo{7k)gNFE%u5`{cW%#ls$K!ce@%+xd0Mh7B;o)rYzf+gk-Y$1U zOvM>$t^%0&>>MwXyJ-0O?nGAnQ#lJ;7=_6|zfc!#Yy$7Gc7MK2uL=YS5HZ(homJ1U_g?aN*B3?EQwlVvtR z@V@~aGbRL!Y|;5!=Tj|Sw}QhbDUL3@%1|&$hCk&&hwo1yb+}`0DUL)XdWL+FNI(K4 zk2n|47n~B{JxQ4Ef}_MbO}#F@zR_YKOfFKyFiwmYY>Vpn01dOd_BYd_>%guMfTYXd zG(;JQ6CUngCK157zaw#LFo^E*X zbCx3a07P-kmv$lYDR9!Qp@wUgkl;28hJUg95NJ=8k#z&Gt!2;SOVP_Sk=NmQB+WLR zO2-Lq>qB62vSF!--%yG1WLaZ1E+8+s`xVDvi-E9CfYP^?P^pj~#DVybfn>sP3ciAf zxDq5Xlp`vRlNZQgl1?Py8|iMZ`wAKz?$L+rN798*XW4H+BL_!m>+)BTiZ-NE-^SGA z&E$_IG>MS4SzS_FXHi{skTDvCR9!fKt7l7j?^h3$x+oorta(CW=~^;(>c?I%QP`27 zYE=#R%^Zfcl^Q;NvPMQJOXW&g2XKJ~+J90MSL}2w^*(s83tdy13<1Y#q(6ACgVwEj zy0?WHvvNG1Jo_@G9PqT=%OK)oTj4e3vHxDMPeka9)n`&QiKpDc5W+$7R6nV4sHQrD zW3PG=d|xeuIIT$a*B{y=!)4~PkchjNE>3X#BR?a_gCZhJ;7b9NU?P`J@8HnVmmC1a z9I!=b8wvNr-G~QwBO^6BvHVOEW*Bx zQ0*(OO(6YSCRT`T!+Hn3yz$KYa$L3Dk7+P?7!%i}A4UY}w0}Rv)r^>Ee+5b(2tL)- zT&*pS<95Ff8CimO(|kfRDIk+|%ejzd)#qR2+?11;h4mV*;&BR=fa~D}CLoRRP-9K1 zwnq#t-`+CpAbl5(G~X0w0IzQ@I^5J@bN{9wpw6cPYW_VML{9;KNFMB z@N`F)Y`QHgG>W2}EP1HVoda8Rd8Xb%W}%h7M~q8f{J6OIoW z!vnM@?0M6K*zg!07;d8*mh(glLFZ2&n^?mxh!XMcimT+H9AgSgP&CutE$6MjvJeIz z=PT!*%(X$cIv!n5rj)Ux317omE^TGl8?of^Lvbio)cLl(xMC#LBuwlVXLr}n73@M^ z<@)cf`J@@YAN^38BH8~1fpR7ASYJ7>)%rMWN5=%d6>FyHqhM1#QR_t(dSTwIU3u>{ zY2Pia(sOA)oGzXK$;D~c z{ii%JqCz$wnQ~)x2H~Wj7;etNm+&wzSOc z9yIoiC-WGJnPr}!5&188zk`Md3q4*rUR%aE5L9NshNj}iAUT{QoPB^M$F&7$m-Ip< zjk6%;+$AMQ9o-(fm^kS?+x48AdRRhXO&dmJqUFgmblmFo_ic^NY*hi7f~d&zrB7#a zPtb^CCUzjBPO>#nYTAnWOqA9EPU$uED)}%HO;Dv@yBBW!r~`<0Yaj=7I6c{$5cy<9 z&e~9p!Wk-lGx`2UxP9~@rDy0Q^6XBiuELC1s_$M>^L#pV zDRUZdf`B~A^uL6C4_%jCqVMXQAd5q?s`MG_7vPhxP0sZv+|$I_5Nluh);zfimb){)wYSMYeFXBv@BE) zT$TS)R1LW-#71?(Z?pq7adfrv#-CE0X_+OHq1Lcstj|G*pGelaQmbrPaP#oy~7zwKIsu5vn>j4-K_o7 z*&4M!?+WxoN$(xdhnL*vlnV>5WkOsI6{CDW?drw!>pI&-_*yC<#DE@%orAg)-eMki zEaul{pA-eNkroxD6et{5z205`xQ}-F44U@PWwsKCApjP8xfFE_VjE$9D=SX^^h)bW-B~r#@<_&I}@rq+D z*Ih3wd2Zqvgc-~b_zoV0U3`GO_U4g1(x+&bYKYY5!ZYY83`bq`G48RvqLlR?SD>NYE8P^Mx zQqWE#p?yT3V*Aw}Q69kJhIlETLzA@I|0Hmrs4OPst5JfLK);8cJde`6n4Wwcr`FAt z`RCPptIzm=p$>UmertDS!!sOWKjA8f*4DGwtH*_wzM{!yFw@a)p7(U@4Ikqsw!rCA z&L&i8agL68giKf9&?G>^hDyx=c&mRCPg1j<-|1Txdr=Oxk!M(GA9|VM)IqyOaqO&6 z_gARBFVRTB%m9I;eEicEf*2ip+l1}L=|%4`51Z=t`V&$KurK;-4Jd2?6+AT|#1$_s zLK1qi`Ml!+{D)Ums_E5Zq7T*!{S@O~GTP#$>p*=+MIE=-*v=q{$MDvOLFtIc8+(Z+ZgwMXO!%YYf)oQYDprLc?KUSh2v6EugEo9S zS3A>$OR99uEZiXjb;t<~W*giiSgIfMUZjldFPLj10o|mILjJjr4EH1<(iCa?P!aEZ z+;fJUNaBfiqBn(1TTt`EWjSfzTk^RP_WEuos>+wF^`b)Ene|B^gO z>_$`!7U$#bj|aNwr;vT9{wHk^4X9#uTBw53UvZWdl-?YqYCMuSp%(>o<{gL;%E6BM zRBdY%5Kh+X<9Nz$wz7=UZ`l1#%>m(tMgEbVL0b}A;eawy99gD1fHKuKE82SL1%8xq zUH)M;A0?d`@&i!?A|?KmPj-R@*&xDpN8K3^P+)Z}vixd9_}2*rZu0jvv=?^(DBOBy z*_SSwkmY44K;#I0xjX(F!}_gs`lTlaO28H7C^(hYDKT7DO856Ci#vsb!1s*PyFKD@G9u~E7#$&4h-`DY2l{Y$ z;Azo1U(xs2X(_|fZnlySwqn6O;wZq)3AJ&vu0&cK6x8<*;Tf}E@mBsm1F-;k2}cG~ zaOk^MVqHk|9tV`&r}{|pFAD&!3+y6sNz`%~QAZNs&D~GBpxnjfE<@CgQ4Y`2Oe!*N zG=d!xG|Cl_pESMBa0{BqG;+72ks_6u*T%PN?+~GlsJ!&q^+&y0X|8%#)(SlV(34hD zM7kSg5rc_N&SSuS`rO6-Ucq5EUs$c8pXN|2?R8nl@WKUhz=ddHKWTDqtxfc~U9jhh zR+(Q1o8WyEq+e!0Oa3BNUnkE<)V)3B=MC-GD4H9E+*W*kyKuLb(Cbi=Y4%_Bo zfl6z654TqY9&B09V&dvam{^-fVZQYjot2Xf5Shx0h|zHg zJ#b^DMHYG8lR%OPIz}FEUGrThSK;m=MU&N(!R9O_*nyU$g^Boyq<_FnoVZAJUr)UG z{Karvt!hV8o#pd9_XrRxR=0aue)53JgU01`K@$7^Kq z#O_+_8AGi)L}%-aZPv<=HqF>PomQQzmML_{8M;bHBHLb%CfEy>O-7F5lgZvj8=TSl zgq^4ddq0MX4aH^B9LawOg+fu22SoO;0w)yy5$q!*w+k#FY~gdI-js3aRAP>8LuCWL zp=6{C;ids@Dx8h4Kq~+7zL`Yx?Vr-xB(I6oQ7%N3d`;Hl>jWcsbgB5W2jCJVtB)f( zhPm(HIiHGgk$u>pVk)|OUsXY*5_av<4W<8qIs43xAnm*ZNv7%=%7}qW2S`Iyone_- z&``cs_vh`~Grcop-yjxn4#uT6+5dlL4mM)k-V8Q6?oIS<&*?rmcdz(Zn>q7u16N{{ z{Y0&n(j%T_HHB+K`2P;CVm39Oa^3S`jT9qFqKJP4odFwL3X0_(#uG8mNjaNyAe(%v z>k)4WZFU$YHebN(CMY9U?CV1L?@ZLby6_nPEN3TRmLyAt$bDEFi}!0%<-KYo?oSo7 z$;Q7q=c+oSl7)JvOlWo$iMb0}^|D8R2;02@m4}pzv)8FWd4rm2C(J<}h(YtO^r=Rk z`h12-UiF}Tm5{$)BqwX;#W|XIk@F+6r7y%KqJBoW*qOQFVK?JUtKIE0;s(KH;d4pJ zGF{|K?P4*iacp8!@mA~W13_2uR8iB>Q988 z^iP%JW6zG*2AA$U{I@u&w`TO?G? z6o%_NSiSjz`SSuj@7vdmNNB$rsIXE4-V#{u5lS>KpwM1~jNXEAaCjjNE3Y^v&KuwrC(L}b6?;U5_pExl1jv+HWD94^98U7am~HOz_3uLGJT^iwZp(v> zYr>}+q&gNz;~=L8Ak_hdZ2kZx?s`9(NO_*<@`J_o%+b&^XtV_x_i&7T{g-kk{-A$> z>0EBVhP(kQ(LZBYk%0&~r2Tf4D^Pf|mW8hV=64k?*3BOSIises+-UyGwWxY0E+*`6 zJL@wLVdEM7nSv~eZ8w7xU%SI2>%p5tc!jVl>&18u zns5pxbd}2E$a}*x)rW1cXx% zl&SnwVMv&nVe$#_SU|VBp-Q!90>%_+n@rld75;QC8Rgn8M@5Rc66?P@1*oqkvP~8- z^}rlHjojV8ejd_Q^3CTX)8@8Gi;bZW*AoZ}pQ_?~B_ZwX6cpd65nBtq#< z*5kbpI^e-ben?I5ml8@XOO1T=P<#($2V5%QU?ST53n!Z~=#YLzhEcRUFb10Ra73t$yB=T~N}apRiZTAMWlY52YyS<=$gk;g z$#mkgj{D1LqRua*9ao~oR}_6u5h;j_W)YvpcL4ASPep0sTt4b`DZSgIKbiEV}j8!PsZ?Ugntk<4>IV4*K~QX$OAt^5o^ zx!_l*9VBANpZa{wyrhhjN#YLVXMP-)N#@Z8wf8yv=(+e61Ys?}Jp7f4ux}7avXYqW zUsZH?U3z!?8-s!g&U-W3PmkgQ{zhUzcAt6;rB39Gv%?t=EEB~ecuE+b#rU1JY#o$G zH9nR$`MblV&EX1eBy3PAe15aUXo8qvS|siw)vQbKuukYALz&gMu1cFnHeH|-A5Vsi z@-EbhwAwxL7Yg-X_pY0`fH!i1{~Q|i_EOulEZND(rT6j|-w{9Q#({lNeyohjup=`U zWyRh^GbhqC&eK5tnQXnH`CMBFgRI3J3Lb-4;1((5YU)JU`qc_IPY%3*4LP^0_;A7s zT;^mQkC1ps)l3TX*=F@`L{XTTAu+ck3oVu=GHc59?vOL|RTF9z*L_1=9ko%PbzMq2 zGMYfrKs~ey75=Pe){b@3EACIh;#dqQM5nAI!3w_%C*cTb=h)6`yL`0Fyw{sqlvihL?;cW7Ztpr2neqwk3h$CDTb9S%7iA%sNUFq=0WV{xXy%^3y2b92}8GP(Er3&*vwq<$&q2~Exe6|i-fs- zP&l<)Y)!>of39v-eesPDI6U4^Zf?%0_FR)ehlmKc8N7L*Rdsh_A@oeIE_(7M%8Q2U z$k-1ax9ye5>DT;TzwaZ_AC)xi z;+)FNsNi3jG!*#_k^5Pj-oj&*$(wYz!YW1rzHFquN4AtGc#1e-j=qb@JqHkfyO;X~ zBrYq1#AQ1d58nR%r;9GauAlvF{45_CFE%KOo}mDr@xbQYF2ebJpZJb#b2REP$#Dl> zk+nHqz8j9%iXNYXbjDtkU7@@b6y35o>U8lx(~HTQfX?sb*lLqv==F8;qCkih&e;BG z_jFk2gVM^7e8^APT!NV7|2eP9uCa*e>(RjW*k z2Z%C9ZQrZ!5U1)r#ULaMkEY$}1`fN*uhJV4;!gf zVuSvQExsr-e=O9+0!3|+j358mEPg72E{0w=7>db?nr3OLYn`ia@R&`YHdQ+}4|`iRjl6d) zJ6vOZYay`{J-dWI<#-{`M|l~LRWjHv91(I&1>k`qyPXHW8zdnD$o++(cX>qeU6@8% z&Q`Ij=^hMtZh5~=>;Cge7`Tp=tuQRt(dc@0Am@kSi5G%MP^+=AjMBJcM{IB}a8{Aw zF&qN+$HlC3BxHWTht#3M@Vqc$=?*}f)Ak|8F!(Oq5psT-vHI`}=G%1ljQ{<@Ng&`;(??OiB zJWMO0A~RYVg*WPy@)_|0{TIoc&C-}LkB~gHOd?LI(%S2;0vUcvA6~>1dBst12*Z;J ziA~uP5Q&IP*N*~CV}>f})gBQL?1)9So44T9UA2EqhGUFc4bfD7XF&rIZ+I6}Q4IUR zS*H@-8>rgjdc!=fgRdG8zv}s8mI0~lwSOEYVMOzNaCXG#*okgmhDt*m=-P^~OVR)3%0t3^$aXvf zflMX}H;KVu5TN8py@zwZeOr+(KZXxMwZ>{wmO`a*`MH67K!zA~3DbHLXHEW5bZo7WR2SidHy>|0KR7 zsB{|ulKvlM*Bwyv`~9_O(H_#CQYjxH%}caPLqm~5O3|RbFD;{`G&Ct`FIv(dlF*=? zmZVe~no9LM?^_zU_v`nMPoKK?{eGVFoPEx7Ud5?rH5n~Tp_F&EpMKrd%%@O)KIY5L z@9I1oPVYjT7A z?+7V!4e9D5YfvU(vf_F+q!$+yWMW z^rMb;cRx3T)GtvdsW?3_iU!8z5R+bL&WsVRMKPbes&1yqSQa>(GBID}stpyxXgcLz zEeC?sFtDjr`=JL12j3jS+oo;G%i-V=KD=T^{}&N9nh^ZC_l^p@T~M631GVQXI*KRW zf3}u0a($~36RLZ|ZS~q$1SRo12qY`K09x?TY8SQ1hL6b1(vY<9uxzBzlKz-QhK8Oa99vp_qqFDEvbcm^_JGa0J;S4++){G|Co zi>CB@0~+MJ!{NT#{iT^vBBiCQAO7$U(jUr#?qMf=ogKp$(yMQXT*v@gadmzi0LGI0*7Es}ZH_EVm;gS?-Mx$hlCc532s zJZ}oZJ5ZTXw5Akbz6imT=KUkr31y#6^e)VF6)ZYP9`hyN{%P=pSJByP$>7G6-e@J- z+_pSe^)9tB(u~M9>CP1EK{@k?#{EA!$OOZ^Rer=sP2Jj7`8u#Hs*soRk=DV0g=mRo z41zL}?(M`HC6MLbJVpLOf@j;-zN+Ag(R9ML{ zE_YiSgB{RqgmfbqyuNXbj&Tr_=;TO8d$ZUTVV6FnxNHl}Ig~pFA0A>SHQhb^t-U|B z6{e5sA65sI9Rw34ic^Oidcc?G_Ir5r;}|?BBXjr3LUtH|kn_UkBlpRdOrG6$v@{!x zzFeESE@l*i6b?!=OOVN#aE+X~wkd*`m8cTA{3tNu2nowfs_u&KsK#&g3|C92{cg-PDr+jhj`F<{&zwP!&q$5W=KJ?MK-NEj`r{ zNV+NL{d<##3aU z-Ge^GT|;MJ<{soyFEph`@+9>Y>?OF*2VFOzaNYbwugzrzW3DGqJ#F%!yjFdi=VqGI zBN6Baa-=Hv?ST@Ufc0@?Vq2KFWw~`3SDF$;$b@XIkm30red?9vG)$7onbX+*B9VPp zUqMe~z`@=Veq}bZOCKI6n@aVP(d{}X)w>s_x1}10{pfK-?!EAMCep|}?>gq!tPRx) zxcsyed;t;ffRn-JjiK0V&Fy*XSXH9W=oZ3^mkY(zFui<-76js8%mdgzG@WwjpbPk* z5ddR2IDbmdnO+#1-+9LJ)HcjGZs64Cx1rtsrBXBs315w!u3c7NIU33&Ld@ljS(k5+ z^8OH|y+`l{%h8&=PYNsd<>0&FD8b=0U#3eP*JH_jND!^$NV12vWd7mnT7MlHT@$=>!toBnq+z6|Lnie}Eddp3N&8qRZCPJ*D#_A>fgncr8Pyj$GhI;(@$B0Mx7(Kc_rq8m%~9U*H;tMeuK!qxQ2aj8agejASz3L z!~;FK>f0o;W2xG274||C$J{PKucDq#Idaj=QRpsXd6|(N3mX*NXWo!qL#;7THA?qt zdex)!-2(X%9C72C(5hHRjnjTdO) zZ-XeJ#O=tOUq5wxYaQgG+UpDHwIirU?p-MA|&?I=)^*@xC^ z)uq_?%BbxX`Ykl&k}Mv*$meBA$rc&vQ#b<#LElD6%xcs4cH(;OI~|2K6*pL3MwF9~ zCsm;to{a{wcX`=D*q@%?*V)t0WF)BPyV*PRlCoZx|(ksN)mz$o{0DrpMe$c+@`C0)$SNST<+9- zQ58ii|Eq(8gSUJ%fs)|-#F}P9;cFa)2uH*2;K8*HXAzkHkS0<{%zU_oM&zJ1RRrN9 zRo{ia&zn|>zP#k;w@|&6{(Ue&PFW-s0V04&nD^CA?s_|RMQrUAL7xd#X1bfxPsr9M zaF^*bqqr&Kmkv;8QomBb=iY=|ClUwGS%Df~JyjScY%ohXiym46U-LFtU!K>6E&Leg z+0y|ZNrb=!-d#K9zC>9iLVHf9gz@UY-=l=HZnQ@kLbO({4q{SY#0MeI>&v`HV#PHF zw%mj7T6QCctmf+zUL)r!{HElg@BQNmxsCh1SF`nKOElqNS5z?ARTZnqC71{MyyS@5s$J)UgVinTrlSHV; z{)PB>viczyPaSR42`yZqFtnzUnL;gMrQ8us3_-l!NFb(~yBm!Us z&}b&$;gp*%tWy{=#1j3 zUqLOx0b8O`5~Q&p+-XZ|p&LE1GEn>%8DIz#G^2%q9Wy{;07BUTn96XAO-4G!r_y~r zi{1|Md@b#Ubl5^e%T*6#Qri;nUN}NPkSz#YZ)eiKQo`3bYy{0U=b!IN)@`z?5@G%tG6S05U`rdYdZgX={EB?`4Mb@>BNuwO7ogh_`T$ zyLHXeN486XS9&^9{Y<1Dm(gWE&T_BqiDxg_S(mO!3nuH}PJ;xBwxgY=T8AMop9lm0 z+#O!8DRek8PA|`|?h9~x44RKPnnNqdrSRrFWNRa&fU2{~aAb?$&so4@ZHRw@Lv$Mk zAhkz8yCYnq_)PTx-vcH$_5o;1DAc!uxiBYzVx&RQ-+|^eWhmHM`F}^^Kjr`cJJSwu zeeOl_9-?NESi04lYWH|Rm(+bX8Ct*edPJAh+esbV@#{Fzi4Y8@C6;YwJ_Ogmq{PsX z>H|A}X7R~`>|?gN@-L+{A%ePu#JA}u9(C@ACf@UkP-eJ8a0wiox3N+ZuDs8J*Ru{c z33}zW67&3*(h@FCdcXhhCzs?}iTZ36*nLRgbbW-SAFAQsI0b-SC>yhQMTJ-vEKtJxK+jkZr>{>?l5xkWGn`p0#RFSz~?*LGI#c`A2UU% z1SN)TJg4%Po2C)5xk)(dPIpr`=E{B^)IF}>rl@01{uvG9{)-VvFi?nwR>G>K+RhT6 zkD84hn@+!a!zN*;S*&;WK}5lS84V4YHAcn^UpLE99d5a)z&&{MYZRkjJm-zw$KNlU zQDjgOpjNqi{nqZbo0i;$)GEry6wOaiCwVkYJRWj%t%=>|QadaaUVF9Tsr9#g7H;lu zuEbtx8XiR;6kjjctw2{2Q%3lps>{Bbo}j;RpLjf#iZRV|qAN$I=?Srl7OJ~mbjY%i zP@KVRj^G1~I$$QOEO; zVKVDciCV#hMHva>z*_A1XkXLH`;tj*5L*g zqCS)-K#Qt0v(x8b8r?^(zhD;88HAckm&yc{@5$%anGr=V1>`@bmovJJj~~c;!u}?2 zT?s0LEuwR-slW%IVF`@0N~Q7-AkEVyfd;=P=nzdp9-%A+#MV|hU^CczeT9x zODaktIajS)N^Lmvq}h0t&g|Lp=+xB1vHf|67yZk^6nxR7VoNL-3ZaFF2w7Vh0pXi7 z2nfv+ev;Y{L8kq0%Qb{pr~~-?XnC01b-oa$30ItDortjHH9o#fXLf|n>NzTRel5Z1 z8$xFnl3ysJjFFykS#mn+Z%!zoTIw}jrGNbavs!OLP5i(Bu}^+ufSUM0S%-monqy@v z<&%VG1~h&iSaOVM_F`4FvQjaAS>y3g-Nb@hgar>R{~;ys4z*rNd0w;O4#V*qx?V6f zapcg9{}QDeU^;p~l=^m|2XY77jsdu^j=1mv1aK612Jjpmyk^Rl7ATm^pslXQi$<+Q z%*?gvQ7m1}!T#uM7zirtv6pL^m{i1or%rssjAVtn07OkQHZf71+~K#p-v~e09j~U@ zn`i;{fvU|M%jbwWit;(aQouv?DR|l^WDF@fin~W#M`j^+{&CjwHN-SKwn>haPpQ6- zS!KD+{6XJGmrjIv-`{!osX1XKd-qQVa_z^P@d?iZXAKhp7&6@~G^4PNKy)*f<*^{Z zY+HB87%YEGXKgpK#B3%s;1hTC03}Fa)NQR?c0Dv}F+%|@|87(<8HP(3lReAWwm!B_ zT1I0>zD18GBa`Lbp}M>hG!@zG5Azo<^Bx!B^Pjel*xIdHyPsy2!{CP}G!aq`u5eMn zTXx$)ZXmLBN5|W$RT_m*DM)SE`9^b~{+#_wQToB34or6WO893PC>=$oNe$T6KWdq4 zvHT_?2sOyS%y~UNf#edoGS52V{^B+`(t48P+H~I~vrdIic5vbsDXD*blaVO?)c`py zC9?IrvbG&Od@_>6Xu5O1^x^UvhiE7rA4|J9AZXUVtqa?4!e|wK;8zUOcXmGI&JSEw zC~N8sBY&)9iLu*5P5391U)hQ7L$=OX=2@OF-rPdE%9j6YXXOKgnq`kE8Fmkt+4dE% zW1(O61C+KlN9}|@i|LlUBjU^QRYOR~YA0u5gylPb*;_mrp0WI?WTp@-bhstU?!)@> zkrzg3_$PGg96~5o0rV4ndN*>9tk^)>}Y|W(y?K5E`sIX zck~#9iHh?!Y|D!7CV+RZtzz9X3`m!ysnMoJT{)2e^B1$DsBR5`TN||7U%$Mn0SMdZ zDeW8blgF`8qFj^+bi1U3U$c|yK)vXUuQtM<<>rXgHnn$P`PN_FiDtq(B%i+qz`SlJ z$YSceQPtazgqhsid4n>GY59+JrNH3Rs{RUpC&1bs)>a|7GwA!#Ypr#ixlh@11F1IX zjny}zNkEp4BC=%meE!9Igm2;{z)p3vGDZGn<*VP@_=5ti!ouZ4%xZNSoT-+7TMHsM zk`WaSLUJ<o|@BEHEgH)STN{vez3`joi{jN zq{%IRDiL^2so*^}WxVl}F>5gcQS$a|4eIpyNU7_9jSTU7(G7b85QS%_Lqvel4UC{0 z{Bu&9j$m8gA1`YH=oubQG1Wuz7Q4gRu~lM`usC}j zD?3~U!^HlZVfugb_XTvQ?@!YM<37C)idKS?zX)&oA@(WBL?jHdNDc&WXV6R{AhlZ) z)XppZ^D#N|2hACIL_dvBFbu0p{L5P~2aDdkqVi;VP9}yaY(Y3DA{jLKb^6X+EH?U2 zqL$}^Fon@gI$>ixBR`BVg)9q`U*kSg; z2vr@axY06EUM=S;{%5)oQ!3CaI9Yq_k0_w$do+mEoRJ@ApBly-5E^RW16e?AM%gbv*@Y%1$moc#^EY0*<* zpHfLe6x~g#d0ONt&iI8!WdA%07x;AG}LZDU2Ae+N6;b$|!ng^6b8 zFBf8BmvjX#&n=h^yb#;P>0(uHIUzO(-vPUytHxC6Tg&hZ2}H)$ab zxci-&i^y@ZYk+~}48vRC_v#RsqOyz~F#?<;&1@nppyZ8nu&F-Ry1 zgvYaYCSjNM-<__z#KaQj_a6wa-{}S>j9j!Hh z&024aN&5I-)Ir!fFBkim8H^88$NHV$cFK4SHAwKyCgW;ArMiv9AKP8EZC>iy+Eo)z z!=C?87Yg2nY(5)N;}*L;u{-U*lL&nrBq>F64m%Yp`49)(Ndx16SL(V5aDulQ0X~C& z%H1YRO6B)w{_VIEAd(fW&eg}*fYlwW|G|g@tWv_pGvY(eDAlKE{pYZ0I?QL#9dJf^ zac(c#oiDLrrFXd~xD7#=Gx8TQz60xLyag)gS!nfJN=-J&K%J`r z!;Dz@U=!MD#c2qRmS|kb2eH7L28o-pe}CZLxEk}Bcr^%NV}h2jCIBFvb{u1kk}=k3 z-<`%dgj{WukcsrUzvnkKgY`Y0C<5^7wr1P@J)e*H9&$t~yEY!tVK|~)p&kG3GyIfi z?|b%rdsx9>+kPBWcte~RtBM?v*>rGhskh>O-`tzJ;(o^y!OMi$nf~2OyrrSEKj*QL>o*WPT?;v-y=lun!y}~;DD!k} zM_Ef(0!yWdq>r>bZa6rqjZ#7C)h;M8Y3%5(M5GkG1^7Le1IJf3{t0yx6rbNK15$Bw zs!sLaPjnqUU$2PPyhLp(&wETth=~;3FXAMLb)UlV0Qgf&h-WsJ3l7dT+KF)>tS}CQ z*-pBB$3WQ0Wr5>G2G51ze)yV>syhpUCAB*s1-lg_eoLotaHu+0koG9mC++2I)f-?9 zeYslGf3_Ll@%bq{YlEIH*ne*)!p=|e;rJ=0h9)OSr3OuiRFR}X1r?NGqV*&B|CMr+ z3hYz&M#W5ETf3rDaPa&^{$(dZ=T)ojiW4CskLnKohAIF269M5=C2*f=IXhC3mL$80 zsamjCU$_kq9(Vv8Zy5G6aU*}>AWIkL48#`mR1hUbW*AUx~J0EY`1ykV0)K2UAFRn!T(V)4svh!Q#lIM z-{*igG`6C3oKgF+pY6J`MaVBRwFE42PGH0Hur3u5b1Cq}bNAt(b<%Fc&nr5C@$-^O zwbBtIbpgDH_tBF$D87MwXc7`|BGhw)R=XPhJSlcX_C9i<4M%j5hkdN7birTEJb{}UWB^~`d_N^WI!H82cnqohir9liKbw_3g+mK(;P>)tgqm!H0c_N^=O#A%;Wy$Y zGc5by?e#wlmQRPV1WuR1{we9mZ^+0JrH`;!flFk3o()&! zb6uN*-Ezjk=s1#K)mFRtuL)N4PBRWvUQr1t$gP&7ZdB zgtRfyEB~Fm$fxTFzz{t}4AE4)VG^S2Ga)+1(UJ3qDC%8D4PL9a`R{6gjwba1T;yIm zrGDp?Q_6-@+H4?BgFP4b8<&8Z!$ktLG0BU%1jibNtckmI3C4|$7lA>8cCnA`)K*&Q z=EF{lUt1gS2c_K^`uqs4GZN$uy8I=4ePOm2LNd_+aeeH$^Np|OObWBEWsz_Ud0pfNG<67Q&vKdi=*DdktC9ycu5k*y8u?T8e*9r8H zXD{a)$dUMuz4{#Db7AAP^?!=U_smYX(A+hMLoZYcA-+PS(Q;0xgd#oQ{~st_Loz~D zxsjs3$>^^mMAnK)u5Nj>uD`*^5!lT~ckkYR?C2`zhJ?`h*h7vXL)`gZM{#IK6%_ka zbT(3|plP9is$2OilHb@-Ej^)Y8$GUqXEz7P(G5h7ay<~$ zcLgk;lyK13e{>m)(m{-PUQLmSGY##|-i?b27goYo2?>Mr^C7mr@L+#ED3Kzrko3cVuK;0coxVTS{C3|S69Kr;4|(9N23EP{qwtP1eZ?<#RuCGH{Q1sCpFe|P7)9Mu$lf; zzCJFlbE8K}=j3}a+RiQWei0SBhz>B`*^G2MT!dK1g+@ehN;;my^lPvF3;Q5$Lu}-F zx1j^kcbzRPfBEp=7(_$~dK<2plFgiN(6Ge2i7U9Sb3r#;d57`sO78+(Q#m7IlW02loT^H)k0X}zwGmR$!yAutyg4kI$WL0@AbkC8YO z&y%z)1aKs%*+t+kD71r1U^Jd+QmO$o*Spa|Cj3=u#D-pZ9K>|yWgkd3CECM+b3gRd z3J2#m*d=?2Uh;-6h~oU(+Iw%QvG<|7TJM*9v&GS$jUi0}je-<`5Yo9nkZN^^kT~4{ zsf!47FJd9p@8pCrA%n7|Hgi`4ob``uf&lES_Ui|Uw(7N<>jvD`2+}*{2cO)tVCF}zY5`MSSbGtwOQpiNW0LF4t#JgO+cE2 z68azg<0&zsAxGNW&X!kMP!2)PQuWIX@~xu zTUOuPqKQ;2#uA_zJop{NujrS^hQ55!`p360K87&qPCer) zD5E1_`s9wQDC3H<*J<1G5im)^B)B!!W3Hgfi+9&sBnt3V&*}cF-cE#kPteuKFyo&Iq_lVZC(}1zy5$a3*8NE>q>qqr{FaW4xUrEJkPa9i8w;Lotf#)$?3Xh;qCZq zMrv&#s~;YSL=8ql2KR8FvyQ|E4wTUp@SKj-NWeet$m}Q-k6In~9+J-p+Tn#;@YbZr z-T)&-T*zg$@Aw9+IE8O@CB3wi_M$aU^l>*sR3N_Ho}XqAB#90)MM>e|zd`x|YHAnKxAQfXWLXH`#ahuS{RmHnbUvWi?>r@{44rCjMckuBJnDzD9VA`hEuVmw) ztrhtWT46-#7Si44cjE&8>N(*2;npz_rCD?Hqc}gMvL;IPkEgvFsUvd1kn`(yf$M;M zZEJrT$Ut&-VU;g%GBd3Ql!)`C?W-m@h`E; zIf*3-M=)_Zlz zWf`Y`^#W`>;x#g|ql`|1A6}__EDg7fDVIb%@ruAN&m{u3zoFt<7MT-sV0MG+@!;0ON%`KQ>Hqcv15gA;@!|YEDJe4!ZfXK6d%X^ zC|p`9p5tv{&K@743UoZuVv$uMUYgMJCo@;V?eB8)lUeZzImbK1adU5W-b!O7YyT@u z0$pSiIPU~IZ}YFDCf^YmPTXzwf=kLn?_|X4k0CdedjPaAZeVb!VE9VSLB1Crv}S2B zc1F0_l>mVa51}%J?qH{bi3&IoF5d-sg7Br<&V>0Hdj2mRajJ2Va&FbhOv5NG{w0 zrXvhV;la}Wos(u$b~f_R-~@u%komBFnIh;|D36=#5ToUz3?D{cRw{%!-%&m9zAoHn zDA{?^<|SQ*zv=QFSdsJS975K2Y4um)=0A>IWq8UiIp12_No>*zBatJN%`Xv}6S2+| zzVe3gFiq3S->hHrgnKoYPUod`O#QZW3t-a6^!5jEMWl${hQv$Qy2Oi!C>)AxTEvf) zLs0}-ydAOFuGn4A>s_93eqPQBV@T?f%4zWf?WbTwr@YwG&xwkt&dDU}7GvK$#S4P? zAR&%_O2}jGpzo-`VV%y(R_Z6lxVc3{9jEL#>X8LB#GsRr^uBO8Xl`n=(_ z@kgP|t==mH4fe!VJ8@e`@{`M*Sl@QdIX5x)FIBKDiqIa_DBcXokBBgM`h~`JbBu_< z-3(ZjKwf!*sxVsq-L!uvMh>BypMMMMJLY3zJzisxwXVF;uHRo@de3wdWrfrh^F?_# z))s}3?h>jGxH^sCxe>`oimvC-gg%>W;CZwv1&jzdB4FA|NIVSJCxS~>x>+Ef-L3H` zmsGNClG?H1V%Na3wQU2@y+<- z994pEoTXl!;^P}I6M66-w(G|$emwbM_C99u*ffTt^-&X3tjD6dM9_7<>nqq(|=6h1-3ZIBB&|&L)2DD?) z+<2hJ)4Z=w$GnBfPcMECH`q~&TGo*mMRJi8*hPrE&p(i#BC=+1@Sd6kPAdsoK@;NY zgg3dvM+Y=w`#DOxt6Ck+y{EX=#!VphAFT*Jo4L+NK0%-*!2cj(vM=h0>Zm~0)Bj!s zUEdv5p0L}_A5H{qLo7Ld{TMl-t}Sj}N6U}1UCN^*WW7{ECOr{Z>vg48s+pccL+wonM63wKQa;fVhRj%F}grLgi+A{su0OxDSFb zlDd1$tTvzFl&yxJF*6f72X@b7aMZV$6)j(p5fi!U_p8VnHE-EB&+N!OY{oQSzw1u} zvtC;37|^Y6u6=oD8p9!5yk&33mECSBkxrECV=_Pv`<4C?3~k<3?;11vpbR|amT&+L zDG6C=aVnYQT`QMXlW=cfvc3+w@+v~;SR6w-7K@-Gi)+VPw;igC$leY0NbpUN$%!mp z!GUDmJ`wB}V=!b>QDX0VD<1oZ;b_kHiRli4z%#~kKkp|fUSht#gQdpsB5Ov$)>MZ_Hc1FfSdn$v*umnkYYBAQ#we-*k#-gLI} z_`#M-W}nuv@_Mgm#d#jcLk+f0rJnxp@eo-+bj*x1StK($59!=m8*y_AxhBFZ_;>21 z7Ic8NN32)Ho>$CTT_-5;36Qd}C#UMU8!*QPW}2+_IWQ)ck5I@=^N8-8GOqXQ3_nP5 znIHmJ!4ugQH_7ng;d@eUW_L_m42W1?I!TR{6DV4|zYcQTsUt62*%}Qr50qJsRxiYepY&u z`&!hFqV>-WRy7JLi|9*<&1Dt}sU%5qae^t{YC|ibkl!4W-CuBteS152KCRbGun z2Ogl}I=}19Z2FSv$yzzwXa65RZi}y?6F>6PZS#khPBTv#Sl*2k2QaXz+V9m9L$e~R zW~`yIQrFWn1a{mji}-gC$$r~W0^B8X6lA_b`xN}4okhal%fPB+A6$YrN``ax(JvZ* zXVASdu&kg@b{VkIrjR6+V49Zx&jt6|DB*gAgm0i*+cqivS5l2po1l3F*iWbA?aIY) z1+eU)#8YvW;3RRZI!Q)1;Pp?^o|Gqi$sctab*Ug?I9d1en)IP~q%h^IN&JBrW)0x4 zy?X&}(G{ON5ytT*w}w|}AbGDo=59Sk<^4s+fVC^X3ohmJ-V?4Gw90X>A4V_KGU`md zPuQ1JEQHkgAkoOW%mU>*iJp*3ich@VTLHs_(e;B7#T2|_$y$cjz6BR{f$^Cb0|fyfL$k z96Fs$3wr}3p6_cuN#j15z?S!)`-el@q$caed}V&#`}%5u$IruVUOV31Cguh% zQSy4fa@CA63Tep-W)^ zplL+it<;x;5b!@|>9y{ucqw$l7J*{NmOWFQHhHH$mPsAuTJPPhOR@YiG0;0pmgqwz zbY=etdFM866gx82<;HF4mGkR{!^|i+2Mo4A#G2v2_5^8fe}dfY@E-gUA-heoO`FGu z&27k_ixdW|E-GCOES-HR>;sY9!{X&xgankD2c9rxdK=FF){X|7$q50J4u>-tg4XF;uH6jWka z^jQ+gyCfY>{V_c(qmJ^k4G*OoS@el}wpuyL&VKBdZvHAouC{VQOa&?M;G{EitL_Y? z+3EP#6#-Du$rTKb^@>k;K!SY`!iw+^K;G>@py?!{s#Pzg2ut4e=YxJP9U1&yYA~&t z&iY9A3T%Fi4ftZHgB07s!MRad3oI!hiphF4ctTzWCOk4Av3`18>> z;}dx4>i^e$ET3ILOq!vW17gLSMs)bkQZzO{C82DAX$`?K>q4b^=QoIZR`#ttVSc1o z_#;d&?EwTRVt}Tn*ur9~?)aIDt*GIJsjIT<&8OPt@&4h$rBAgViWhH{EG^Fa&Mr++La@Q1^DcVT0jlK8 z9=H~eVioYQQL&|7&)(ne?|S{0q^hC#Yy4x&N3uKYYfR2aQdCb@UH1O(Z1pqe}2oB%#Wo6nX zF`R8(#o_C9jY3)su7B4+ex}}+b#1!WF{q<2T3PsiG%67N(ZA*0#Bwez{M2aXgSB(CO{j=Lu{J1O5xPZ5JM1 z8cvw?UfNT@zqG^$;Y5tom-2+<>C%}J;ggO%-Z7g>Ct`qmotulrw->*TAGhuSM(&uM z=*e%lB!isR=>zT*{vK*CPVd=ik|y)e0Wf98=g*UKL%dFKz}-q}q_Fq7R_ymsYrxp` zO$ZR*^+H<9y#70cx$i3D^nWJ2q21~iTh1vk8`d;Jfokm{+yI9TE!*qaGA{hSU7>VWy)MA?1U7$1cRb=+TOsJ3jl2!aZm% zr)c3*_`)%ng-L5b(6Vx^_ke-K8MlgS4kgVkb&Y%hb=B^DmO}DIkLaGdhc~Cc94I^J z3cNUaW}xV7rA*wXI5OQ+c8!&zaa})Z9Bv=p!Vqaj?sy9wFkaj5cV@-g+i6wFJk)Urpi zz>l#0`XHQlDLvfv8s&ccpc?U^bpJB8m$L5wv+&{TSGwPWD7k|vH$QH*9l?}0A2JgceP`zB?wbY&0Yq1|XJ9O#GSN7|V0qF;k6I+*l% z&)Db69aiZqKM@H)T$W2^yeycxo2HP>c+GZjakjT2?exOn=f#{}{)f@jnWb}sa&eK( z2YJQ@V75O6#zQrgnQv_xDQ-mVaqT-b>a6P*AZs!HW(mYnzJj52%v-J0Q>wPtMA+qo z-)Z-Ndm5mxN81K03wwO58#Lte?3c)dpNc%~ml{oBv4WYJI~JrT?@=^Pca+G&sMaOZ zQMGc{%(p= z=45sDsqB&z`++(Re#57ZVSU@!qy+&W4yGC>>5&bnlc`hukbyKR0yg_PPNpnHnOq@e z`10a$y*CJGKxC?KtjhkWx%3Hl?RXSk*8=Tzq4xxV4Y3G51;a$6HQxKG5AaUHVN~+0Bth$$vuFDv zO=HJPWQYVl@A(KfrzgMmwhKoIoi26F1x&}+fVutd!a0DW`wnVE{!49~m0j%QOYJe8 z=FC%lfWrQmwc5G69Pd?^>AQ$MvbRG*{7)p;K7TUW+)?Zh4)Rsg!nD(C6FxD!C*~iN z7_s9I9(j+RBWfN$G!OnrquUmiPK8HEiQ4o({t3Ycq?Zr?5S|rs>Z|=26Yx59r%c6+ zvf36xPC4+z{92WE6RtcXlNPR3)hwt#P@-$iIqMtq$tNu}o@uJPP>t+dcRj$Teg?~M zr#?Y`NU;7&7mPHXeQp6*I{igq-|ztieTt|)*_xH^3H93~*0*X33PE6_lmU(nzckbc zx=i%4%V*f17`SwlbA9MPCe_VKLle?th)iq;fP3087v;#w;a08VdRIyJ68D95)WkW* z0Ep|6omQ`9n&?w5Oto^1DR@`GeD>Pe5_=eldVTH%(0A^lg(-Q*G_<_ea z^+Sr#wB!7z7uR77xV**0aA!%oLjVlxHoLU#p|`eCYY>O*5$~l|GX$zw5|rwGC4-bA zyCI#^#KK$GP5?d38Sl>j{!Q7Qb5mpiUMwcz#ePFa{?`!^Qf3Qvf9{{ZAXCx&!^ur& zD4?PL{KZkaDJo(}!v#LS^h!^7g%iZ6;e@C{?D_BmC#zT;yYWusoO!8zE&pOGCjt;3 z8cJJobu$27ceFDUswb;+T+@CR`UEhVU1xiIOQ(4F_@emDla&DF)Z}wj@ca8m$;Q8j zKeP*{sVYy9S)7#xG$~F%J8VAnMP|;|yu1EDmn#>{;@)QNXmIgj`di@CRNbtR*DaOZ z!_JFv9l_?n*XFm|z&~xyVxX%z`{a)BX~W}w*E5pvg|$TjNhwJBlCF-#dMr9Q4W>Ly z1cX_RqT^H7!ULt}6aeOy2f$9ri}p1oYg8}Sqy{Dxv*Wckfy<+vTvG8qbv@(<-SQ&xMAZ`6VSFDvWd@;|wf&Nj;l> zyi{D|Osp4rz_=uP;9#I=E&T24m$b1Owj=HWa+f54eFJxJfGImZP z*z=HWYBcZ?@;0?hb<4elLK!)uyJ2X^`1 zWMH*Du7C3D2S^)aRRPS}t>*owtl_}l=UM2UeRiLaHL{aqkYiaHA;dFMD}R03!}h=S zJ0A7*uZ4A!8b32|#SFaPvL*~ze?l*j4E#LV>D7LxjK=6b>pn^p`y?T;Bx#A1@zIr| zGy+eUi@ip0-#&mzx`O%Tf|GhyB_AqKhQ{!YnoAVz_**$$ubnG7Kjikj+4O;yy`Tw zU^OyK>6m!t@K^ULC*T*N12^*B~$;m8oN#}2Q&7Xht$2AL3#&_;ALy%8s=tQY**)RTdQdCeNenYvb?@mO-P6QKl zd`m;tN3wRb{4PHZX=y|0pJTFT3s5^D9omw8$hT!0m)dI(?7W{jGqt zf0UXEE$?o1$J4e7^acQ62Lm#s{a=@_5{LBH3!BnPu%#OC7UXY|{B=`)s7t~hgJ*2x- z7mpS^Sy(sQ?|G`&{>O9Hian17_wUyM$aFrsUB}1H9qSI}litj=j;B>o-YhAnJw@w} z`;~pr|H+w1Vq?ByfPYgM8~>NRRL1u6WdD?9$?U;0gM*bEl+p;vYYlTWS1fcLWFiy@ zloJHd@=SW1x9J@x!QHBcELFw+9== zMYUMT6PG_%89#ZP75lB6i>^%+lw*Pg#hr346WyZACW@-6`<&g9Zl=s+faBg}Zml!7 z@5};-hX!4VV!E}1kph|C+3IR@u0_t&rl^+6t6h1Gr5xD~uq)EBZB+$`d@ zV{T2a?+AqFd_BBpOd*Dc?)*UjZ#>%^sd2BRMGwI<{%BpXRjxl$%;tV_?StUDhJHm8 z+gB_Og-<|rpUl}qyiO0K;U`_QT@VU8?K;W#qM7P{x`c$3*23x!)mTmxSjNobyUTsQ z;$iWaR*sz;QNq_R8BzUG!umke5BI|dsT>pgQ?CYq93D_qQ)}A6_@Z;y?0KMWldkpW zDk=nr_`MefCCQ| zJn>%3U!5(zlflq!N_*(d@i;3uD?S*^|43Rlp3iZlsQ)v7iiz&Ov~x3S2^h2g!1p`b z9HGHscV2s-U-dx8IonvkM^pwITYvZ2?j&g~%l3R#aAF^pKx4+^*NkiGz|&J3uf6QE zW8bGA-tuV%iZ=hir56R`@dKK&P74p3PN2$v&RcVrmS>3*Dp_k97vt} zND;F7He2&j5zhhCl7T@Jz{e&6idgRXcT5&n2p^3_>^YlgP+%z+ZX_^|mMSfNVbgqQ$QL(>;x`yNDY0Hf-bAXfu8 z$m(aJ_FuYn(%}5j2Gc|Ul=KrX;B5z9e*hjeud!Fq!2m6!pTe^1sCLz%2TFHt3B8i*)&QWJqa`|R z=FhfC=GvV?Cl}lF$`wKMo1yaZ$D0VysR9L2_Vow{LM*Ke*m;jH{oGmz$av=fTXFG; z$=noz+ygl`uUv<=FnU96c|n} z%uIZ&s_OnvFez10-@(pu4DM?_-uu%;NU=LOMdF=7i~@z^9Don@0VftvC*Qw1oTL)@ z$(*1vfJFezlEc3JC%2RUQp|ssKPx1>(dD=b)w_q>e0)1Hc2vJ?$O{8B`VZ8y9Ag6m z^$D7J=Gq4x$KoGaj2}QCzCxfw==tdb-?Gx;--DQ#2a+}8A<#>JsxF}~jg}9H7+9Bo z@U+9Dv!@*>`>rq+Jax$g{~rXHn2z{Ce1gDrVZ*14_dcDZ$8XgIdJPxPoIJQ3kWmRC zN=+~4jAlFvon4?sk$>P~i~77cvE+MRvLQThoo_>sxV^|{qQ7>2qzEuUnNk>bAGIHD z;Xr^qpPs}Il%(-Fg{I+xE=wYmLHR%KA67{Sd zPgF~!UsP6}PYYr-NtFJ;CT^>6`ODiB<**A&0W1>LfD7i|NalNZe0=;r0E|ASyw$$D zp3UPYL_IBuiQLDUd#uL5n(dZyo*ZjdogcDj&b$Kx0(9%g16>&oSbhhe5aI_i@2Mx* zp!uFH@+d4mPiXx1KF$_mrn$iSuhXY5$WIiHaegp_^}?rgDLTips5MNheKBEiF4= z=aH-ll)X*}mE&h8f#;d1Yn!*81FuA`>D`ZsT7~Xlj|9}D-{U`{ zvt>lk!4M`4=RA7DZ*GVb!L<~292o1V!1IVR1UI4~^Hh6PMu}NHClcNS>-Xq>B0mr_r@c>tDLg2M9k3hi8gw6i00_OlrNz-Da1f4~Mg*7c5>?4F zdYkdZj%gRuK(km@AsD|q#UoGNSZuFc=c!X_;)6TNk;6*In1*k4VMUj%Gu<2gbIc#0 z-)YJPvPY1q;HBNBD&>ok-Gr{90`gv-zAbQQS*xN25Cb!3Z@t4YG&B^+5skZKA%MFG zAb8n=tvH~0833$WpJNrc8G-<7X#4TB-EoTWR10!BEsCuL=8Z~#8DyzJ;m#nWf1H$V z7dQCx(^3lQ9~))ZRpO+jjL@6FW`qIUcIRGS=LpID`Z52%8!U*TFHfpR?mgHo&4i2efSw z)W!0K(&n82-?^tHTltBAR$iC2#T zuPUD?an4H~%gQR9t3It*ds-LoEE&Dvm_a|FFPE~Fi(l9kY7S6*YEQ%m6H3dX{xi9e zP zF{CXs|B%BIbq+??(r%xx(*Bj@6^C?FZYj@G>4@P`A1#Qit*g!%0IYpOnr`j6*JEhOl(L|gB>}l%h*S1g$lE2Q)n)7Y4p5JojEJIwT zdg5l*l$lF(XN(`Elm`RMwYloO!;Ke-ERxxaNN9K!fXY0&nJ4v!l!nrugIoDF+qmMS z|I7gew=xlc?eysQ>Fx$`#rya}1Z4{e=>Fv^MLh)X zgGS3#UzR94C4NVNkRFuIWvfDcNl7&EqAY7sI!WenjWZPcE4-`2g@u=X)Os8tn)oVe zCzCvr4~els@(&}$Zu9mjCyR2Y3*T=3Kla`_s_JbE8&(7nFfb4S2}O`lP*Q1&ZV73R zG)PEE3bbi222Oo}WYwNfS6ocY2LOa}h~^U$zo<4)Ggh(XKdCZ&6jC~-Ms-#bO^dW-n+OE)v*EG zX}hn=cF)(qISA&uN0|St8B%+Ch|J!Hp1$Q%7q2Mc5K_1iSuX%)9PG^sEVip*PDj5K zRWSJQ>5bcBitU^|WMWZf9R)4XhowWjH*VT|mvB0zdHenoG{=u0Pm10GVHx2KdjO*~ z5*zzzCP%--ggG-cYC0soKcKn@XG}9QT`p5PA9e~He-C4VAspga8?VT$Cb0sS654Ro zZ{cI36Qleg{9qx7eHJ0R+#|X)Kzo&W9Uj(Zr|c;apRtnMSvwb-9OInIFEp?wHch%o ztMwGjWd`_nL$GwGT(JNKz=Y{uIIxqCUns-|4~i85K#go|VGQH5OXUL&R?^^MI=Xun z88r&B7{YxF@{xCY$Dmwx|Mly$WIR@}y{cp+qjN$wvG`PR-Zvn}awYTzWl3-VtwKHF!@MAJ__BJ@oTDDSfrx!T_p$#wG|DdA+uSWDvy5!m{SxSej93}!#OkAs1-=X zZ=W4c-B%O=5QZ(`V=D_ECfO@sP>_i|+^#Vxhmm5+E){lIUYza$#Fbm#9?Dy_2`cPz z`fr5KhgrufB^pI?U_^xXF<$@flCQ}K;ZepFMVK2hDJbDJ*8T$W`5}tJCBDmn5hdgi zZ>7NTIyl7AW1pIa03f^R9Gg{LICueq%LMMgq6l{<`4sYU zryU7_Op4;Jdyfvxdl3eg`OuaKP6@T&hctP-y^H&UZA8~1!RuLLNQopL9DC6;3)#gE z{t53R8o6~}tp}_WK1zbkdrvmzRS;6Re8u*pOFuVcT#Z?g9T*>CTdTPVL)e*~a1iRt z76(iFx2V3T>1GvdKPtC2i4r0ujAKZL}1{?x>`AIlu&=^X2)|7R*+@Iq(;esu@PhTMVo+`i^XltBM6u zS zCbiL->)3z!c|2f|rZS^GCWZq)ILKdmKzX6X1w2#MMgRwzAGFri3l89tPf+2M_(o5GmkO=U`^#T zAs1$CWtILkgO^fgegUzjpA1v5zSv8qQ4R-vM?#&&Hz;UeLY{JZd>74&+4;k1f#ZSB zuK>_=Br?9bwWKHlr6$)s3T8eL$&HjS)m0Y{o>F=MRmZ1@71Qzo4pipIZMgKtRSfo< z|HXsWS7ZccBj1IbJU`EqMsB_^b4ANGEI9h~1BGW{iHlIz_d?sxG$5dV-=yjZn=cn4 zIN!U*J!9oQrz=CGPS9^j>%2iDcK9yP30hX8<#_AaWup4;uCT>@h_N7bRMVL)V z0~Sk5rJs9Notk>PujghUjWU6jBa>G{9%3c`f`v&(^i~f-ElY`wotTso7`ngWO~ z<@7IP;T;_9gQz|L3VZX{cbH^?$rJ_9>9X{J0ZSv;zKQQ1Yf97^yC!luFWC0CWIX*k zM(s4=!w3B~p@YDFedzsdT|kgCxRUsl_-_7M?pp)+#(%&ue!0C=X^u{aF8a{czof(M z2X~B#z9fK4eC!A;`d_kT*kDG;076c`Ndfr36t9XRf9Q`ZgAgo%l9=Ma2BVaLkE5V} zIjUE|#_K}Pht@?Duc*oXf}qKVxbrdM;NCrw7a{Mn0G52Q41koYSyPt zkXx8@fRU_Tf4MH!2iev7ri9Js zL`2G$7U!d&rd(|N^g3(a=yi80{ubLIh?}&iTo$ej5ae+d=g)s2WGYZWe8%*Zj^rukapj^nI$>;O(N z)Rftz#ZO^Fnk_I%&@1%=U`T9JDP-ATf0*zH_dK)V1Ew-QqegD}*E#FK27jnA8aMJ^ z9S-TPe58h){lG@2NukW4DR_MeK*J85JlWi*KY=!{PS_P8dcr?MJ+?nuDJgbl>$%Ekq^j*(dMby_y)Wi|>9L0*fi+1%pV=wUvvEB70WMTUG*?Kh&L`! z&HyO|RCsp#Y-Ji1U3`xFLS$!7zWSaY_t($Mde=5#(u*R}i6dnRge>Ooe5O=q(*V$P z161?yHauipL+?l7-?}C%0b(YOGLOv{hTVsy)18R{7@(uzHs#=vQCAOfT$=4|;e?cG zSsZp!Mu{$`&@IOOyf*K|z2$|+TWrJg0NY^Gd$-Rd5DM1(aES2O=U_9Vhng?g;v&)Lh1i3v33&i68dZDab!>$ZWJ+G zPCV^purBb%T#ROD8n-sIm9ThZTi(K0d4b@ivw+`>0%M7RZ`wm~4IYCdkG)biAB1#@ zS`EXDDsn&-E}6?2`jG$Joszeqj}Ik75XT!eh8+9r`d9oIlRJ!&g>PZYmxI+wavDw7IE{m1tWM8Hs~A$_!G*XY7LqpI=gowQvM)&K#QmyO1zZkTusCrjnaj)ETBw_!1lT4s%%oh$-bpUSW53a6V!lr#0LO~RV zL-p5MgEj)w;W+N$$E;jwP?6x80ma+Tm5+?A1QbWWt&S_)FQS!k+=>mbAh14_SZKG# z1$g@z_RC(V&SYmyV1&WTO=+BNSr%+dx-+>Bze7WOdE+E6F5qf~`)}{LOMGY&KL7wZ z;!sop?=46%!Wy0kwm@yywDC6_sN@mh^t+vb~mK+zn7 zniPdbIk@Xcr}-&i<2hzMo~E-Ez4S%JHl054TG5hZF8h@VO}iG5A4t(IIRuy!Q0rWi zFQl9%=P=;GL}mXxtrG)G{T> zxh@;@5VmcmvhJ@vr;r`eKLwf~4)~{3V19fk;mP!!n{6RfV}#_cVa^1XN-A z-@d*wqQU00n7pYLW7WoijI>-qQ=l#->n%;)r6vkmwR3>zH5K8I{H1cCtht=)Aq?Du^wQS`ZfYP~t_2xvPJv%9SW%5bi zJ!BWT%9u3g^7RdAfjQp$3Mru-AbAaQ%cWXn+R?WY8cT)tAon!IkqYqeJ^(MBpdgOU z_oU)y0t6`ln3ZbJak4NXh?FseDg8Xf9vIBI0O==Slq4s?#|3{R^JJ6_zXoZzFhD_( ziti^J8UTwQCMrPXXw^H?y$JmPUdX0h2KGI<(Ne+m;GW;B#CH@h*%|=<#(DnXm++St zB?68ZrbcFOGt9TxiAzP+zRUGH#-l@vfx;^u%#9F=xNH@1CGPvm{PM4zwBCE|Bb|GN zICmcqC1urg-$%`Yi}`X0;R!7!NhB*7Eao!$cSEogiif#ylt0)H9_*cOpj zx{8H+EyhRlJ?=a}EHb7Unrai+`?XnSS`qK3`fAS9y_(^v&;#IPK<+XA3sbJju%X6W z<_d*lO-HlZE``W(kKP>*oZOoYsUzY^2A9Ah$IhOM@gYv{rckUgZu@%$_%5dSCj@4Ndg`0=j51I15(0dP7V0WW_k zz90U>O}}f6#F4<Cfl;VF8hdWsR%$ho7O6?NqCWWql_9;t4#exDA!v-8#T% zc9FfntPo3sB4eIus2}UoJ*(+B2!^pMjiWj5wk@o;1$XSN?~>QRt_Nh^!GK zf&-i?izDDX$U;ih7`b7pXNjl(aQkzI;1f4$pdBd?uu_U-iUGV=jH3)ZJgUeUopaqo zKxhm=933ZTeP3I?{iJVfEJFn6qdgS-_UZRcRh{;-s53|fanz7o>godx=lyZwZy*&- zFyRRTT>5H;;1B!Nxz=O5_u|%`_Nt>ckU#3Q#dj`33g`oS^`Z~qY-vIy-+&|5SSAlm zEDrepm1;yFtCnnX#p`Z(FMo1QqX!KBe|bPLTnxq|=tWE_|9vlDBsWV-O9!y&mhIzo z#fCKX`;T9`8SCI4kaErb!V&=5s(f&5y>}0G`q9L>vwSF?<+U4&j5WU|ln!=66iP`R zGQSZ2=S+Yz17P1c%uq2=gRc{q|H6)F|Eulv|)-1{F zN1I|H>nd2*YFXayM)a4@dQ_W+7y|U$G;z;po%Ih~&hovbe;x&h{l%8et3N-Rdo8gj zLg=>s&2g%owpNDIlDNiwZTMU`Uanw_Ay27Sxy=gni==8c(i7l|lumfU_YqH#NgQJztd=u4YOjSI* zc&~iAdATiH4gubP4&LW?nA#UcD~s2TOBGiX44~qxzFqB(AJ}rQ(d;G4Dxy7?0WAe_ zP$?IxubX}hnE&>^kdIu=kcLMA@|zSW)#+o*vw1zi+7GGhH=7ZD6d(dFvQ2At7A8*e z5e~C}G)fDt`fJCafQNsX9T*sICt$qMrmdZ4Q6UK`!6!m%lse@YZe;@}gwV?NY%DH% zd1~hN@xX$E7?CB9_9>dtzAy`fnxn|}@#$M_zT^~F0rRwjXhV0byA&LhPJ-z(A~1%C z76Ap)_P$!!)<PgakZCgk$e$YGt-{RUg)bnXo2yY9(?%`b>G2!!m4%EOn<>b(M zB6iB`U43^N&wwBrX47(KH?la7cAlDTEL`fbRieO%tfBhG&)RDyW}jY2dGe(#=lxVF zYa?Q6R)#GfZRB5Z(cK+QCOdGvSW4rHUV}|n9?qZE%`|TeT}O$WVXLn_=^|0AjH8=Y6QaX|3BMg8G}#d4S6N*$~Iwmj<0m0 z*}VN49w-GW??420QpHqg?g4C*iCLmmWoT8LUX2@Ew6pkA2Nx-*sac0wvq(uU1R%1w zqj0fCo~<14eGWpZ!XeLE=ay~9&!Co>fcVXQQ4sS;2zybPr0ZqxftRQ430`GYY}+yk zAxtEMHX9!@s~?tI-i+$1jpc_&-*QrJS`Rn$hi&l5&Vaw%am!cLClw3U$>ZkTaXVtC}5` ziE@DS;1C3ODXmn^jH9s@J!NAM)=7Xp?72;0YA&H?)rLBb?i~*GhLR&WqBOMubZGl% zn~u43?9iQURYICw2m)rpEw>3iu6>(tvhI9l48ht8SwVX+72s9{fW7>L5<(6@Ne+S8mh>2zzrQMJ!M;h$q2-M9Dtt&q~e zGt|;+uX)RxHz3)0(M|{EdsZKej;O79`xHS7B5XTNw|mB~oAsmfUNsEr{43jl=nwvm95oO`0Zn(3Y=N|2Y zV8a(i2{!bRE2LmEB#*{zcdq-47LWi$3++1@&Pz;Fn9V=IeMkLP-TRuo+L%J~oH?bq_RCSUWLR3Ct%*262>5&P;6T z`t+$Asx;h6UZ>X;EB+)nI_nF|?UNp?PK1r<)xi=nWOHu<2e^=C+*t!&i8;(^O2ypl zC2^PrxB0Ci+Qn_#CT5>Q(_Qzwhv!`$I}2ljLd*~APi)(*RN0<=((<#YqhsFl7kh;P z$dUm68KqYdR8S?0h@8-&*EJ^j7*agiaFJU)`Ac(ydlk+UMsBORs9}xj_dxF~o4|H= zUWlV)JV(Ii>i4Ld=i5U5X0QK5=TnhtH~$rwBfR>%)W<8TZiQ4GpU3l-I!T2cII*Z+8NX_q!c zM+;Ch^+6P(9bCr_($g1{URHn_Jw&-r&_K;6l}ZW<3eoitZDAFTY7^lya}8iuc0hCT zXxJKf35XDNd3Kf$xy?dJ<{-$NJ6&Y(kO&pj#%e^UbLj1%(_FVUQY@(?hI$_<>0wm& zPO;y!4(85JqyuFDI1q`?HL|^16)WJ*R3xB$vLD>w0Q3U_YS!E*l?`4YV)D91g5&HM z5L`EwltWT?yuQa1Bj5sS`g(TUCAlwjC7~TN`;v(dG_0P95)W!Y&0L$Ic){wPEt5g& z$(sCesu}UD>4<#Un6w833U&TuM|iQ8!73x6@QyS{+O$(dfu^ztu=~Kd$w3E&9Qzqm z8iPDqc+h6#g9ca{h!c*v#nEK!q7%>7#Q6`n<|lgpJ^lK}U)M6>ty^@qVr7IeN8n=i z^Rt~bbjw15c~tO>C_M#M?!J72szxEGjq~_dV(YZZAU0BRK1OC*cPaiDZ>; zAjj!#*B<&G4Z}xzhy}8T_6?rH+E$oeN_Fy5Y6FT6(lOiB3H*y9fbJ+BCg9}$K?`V$ zzJRH~jiuqnwH=8c@LMV-C3 z%X8xi7tc8Ls}K}&KI*_gv_!{Nd*HxKk#O64^s--ovZmd+&D-}Iq-O>L z0Y!)1e!?JPQ1%T%a8O6V*WAaN$A~c^0H=%rKBX0X0$A@~g_0&Jb4NO)r{XTYxQ_3o1c!IbdKev~#3jn~nv{WIgR1;&wkoz^{k0Uzrp_L0DLXNa*m4%X8L zkH?%2bXTG2MTD0?yibBD_QtyS~Z!9@^j z@eR|Y!X^6^vTmap?`R*Eg{zs71Tp0zEv}fuN9WDZ7O$#T8Df~8(4VGO;Aq#J?~ql) zdD{}6{iWUX1>W_5S^wNeLfHhsZZ+jCw#Q~2MLu9SJRc-j15sj^N%$sZfD{ZM+?P+& zlZu#DhTuiF>Dgbx#<$PIjVG=$SNF1l&`!9_fdhf@YF2MTrXh>T@ox>~5@3$akPJB? z2c_3O8x_yu41=1}Fk@jPHu=3YOm2g?j~+m5E1p|j&dGUWu3PsVE4t#sN(uE!25281 zlm8T-g3Z>4g19z$p|*E~55~sEK5du;J0$UtO&3wp9V(>pFT;j}Y?LadeR0Yd%Rn#_ ze6$@4g7j^@*91k_b6*-P{`#j7*22brSkWK7vF4dZz?j%^Psn4ynAn3c zN!fWx7VC5yhRi>|BU_~UFE^`#Z@lx+Og%9^hivk90qeY_OFK(OFBRPKyr=Fn!;y1onLSNqh}1&+J% z5>y5UD^swooBwUJf-y%m-~CrTIM-^vTCn#PcBu@(=r+0!LikAlNBHDUfh$CWSdS0- z&uxZ$fg06rP+`sp1k@#Iyt##2;+;EtWtKH-C{K0zBs~~k0`r|^(P{}Kh1xmbqnOpk6x zz`pvJZJe;yakoI&WP4Xx${v+>pl7RNHq8Ma%uxGAp~BG&pJBf?LUOEz-k3b`St zR02^eQ4|8ImKL9|UoWDiJi5v*$mwrS)0eRW!cW`Q3M<5pMp^tZsJNs+V@wVVD{-#^ zR)OfPc?93h*ehK0jyHMUyoC(vst+cHT9qC8qZ?6|0^*aSjyTVTQ~=dF^lj9R0`gwh zn+?c~UFatemM^!NW|eg<=?SN~bd(R8%1Rf^F%Kok>$n^SiXgksv+hNry4lVzSP_DIr*#YE*JAuD`SR>c!xF&bR zb;wQq0oWl61AeTN1x(>Gs;3(jbz^4eWd*sPaCz9lYFeo^X9OgcFp(Gtge;hP3be3L z;xJJp1sNo`_}lj%Q({d!jQ|s9J>3^p0-Oo3UQvLa6gNf?t`*OiGZbr}w^a=Ff;Gwj zB_4np}p$j>^F^T;myb^^s_(f^1DlIB;-gga}X+b+s^ zaZZU5W}>GlJY3i-B{bNpM(eX6uv-tEC3j!uV?ts zlmN&q3|Hh?-gpx1{@)}Ty~ztyjs|(ZB`GQlh&Ht_4uD7!k_Fw=xW+;#Y~80@mXo-( zE6(ASuqB1971phI(A^^plN*`08|yxIK%q&%&y8e3reUnuPzMnqYphwYn7hzd%nb)Uf`O`RZh~RiX2u zx<`ePESk;%!&iz2HC4=k$5b0DN84qokfg4XY1WaX5m-cPl6sjMcKh?W&?^Y8WTUi2 zbU`wx27VW6^oUl*rO6zb`iy$iiVl^E6!{M(oj$6PK)*WcB#==9jL_8`0Uc5w*o^8J zx~%JsAJ`wYd=C*21B4lMs+ThnyAl+SPwH!^H|80Q1@nn!PRSTwI`+SXYS5R0tYYNwk;c_hvJe;PGZNc$=<@(;A;WeNn#4$$Lrm&RO93tN-?hNpj zsoEvmBX)xdi7PPpcw|BWVsq#s7A$Q#2#ZHA=G^uH{0Q0x~rjwX4I?XwRx4&KfuPs9VHLSVSIj<+!U zcOb?0@LDJmr6GpAWs}(0=^E-bnC3nmyP1j;CcFWL)xGp`zxyGO_#u#Zd<*1Tkx;JO zKGALsWfYHC2QDZ?4HK##he;NQSf?<9@rb4hUxs=$9TSuIb3O!zGz$RcIbG#YTs|w| zG7SY$SAe-8r`UOy<{)^t!iIiN=y68{PK~P<0v1u=uH`%%73QgsVWqk~xIcJ9$@GJ9oMZ_=G|E&C zUyfHzLaojTNL+|^Rb?FUU4;MTUp@#Mi5y~Ryn+3p0Jy)ljxCSLZ6lKmmX{VS-b-=k z6rK>ICE&{?e`^ecz6(f;Q+3@koX+pi-LdbO5aQIrgEoZr0=|g)vE@FBakT=(90`(3 ziiT=b*buhp*0;mzqPcJC zBbJd{0b*E^o?4^UK7lTAaUhN9MJ5rd%3;{!;^Kq{bQKS+0u}@IP_^(Bg+5meud6)I zAVx#fEV(d6>lWyaJv)?>D@`GFO9QZ&s`v9+u|VFL9*1P<0{i*-@as2W7RU$_F1rbJ zy?zK(b()$Q$~md+`wqY`C2zz)ABPqMSt#3f6Un4Paew1V?}%juXK2hbs3hb&T(yI! zi7(mXe>Ln|&ITdNlNq7D1AB=XKy55sXm46{`q;OX#5sx|3H1YOH$MuSK^U-FxLXFv&jHBvVK6|d(N^5 zR09d%hUkK@lZ^Yex8>QTv9=XUoc}0^lsj;jXG#1t7fI+o3W`CZjYnm}iv)|~pM@gs zF8BkT4|#TIa7sx=yHyDE@TQw}e5j}{*FJr8RP^X&NPm;gIEP${eO3XSm6&$+FZ#T7 z$4ul&Z0jK3(<<^UoIY&51Ns#tpjN!nGY~Uq$!0q<`mr`fhWfC^BJiDTBk2_%i=eJC z)MxB_Sca-_FnrVhx-`wF&^&}^W^1_s&o_$4Qg<c!|(@)GA$62xyt10#R5J6k3+kf)?b=xNIxh(IZIG-{&I8b zIeMAUBj;nJt@(--L`b$;Rq;>TGG#e0+UG$1pReAW_rk3xFmaXK3lJ?7RGq*W4RDI% z32QnGWrRj=eFLWK6a+bb;92Z*GZQvHt%@HQf7Eg&%cMSD@rl3)ZYoR}{4h;6kLm|t zt4d*tU9W=~Sd0e?Fvi;-ipAnaMn*ybkpf*$udz;Q8a}ZeZd0k7e#sTwa@E>qthZ`J z?P`*G&e{Az<}?Uc%iw=FV@~N6#*ypdZT-yiOQTKoeil-4TtYcNUtC3pvE5wZ1+UHFOLKAVe7Qo$>AYOLZbAjPLJ16&ZSy)Uye z%e33EW4>qr;K57K!I3D8M+imr;&(4!#+D^%Jnsh2JDq+B@UGb{d~-2mfa6e=UA{>; za{*G~oa-!1uu<=1nzr-AX*|#T5WZ!Yvd=uUug?G~1AYs@EJv(GQBaY$eNeYlpmH2N zRW*1Lx)y*v&k~tbF@8>0E*yl%rd_<1_WVsF0F$zXa626#R6{1LF#x&>-UcL_L2&8| zLkMzg$_+ZPnWV7s0Dw87%I-@)Q<8Oj_7TP5*~9w>*Loq3K>69i<;H_8eDY~PrZ^V6 z!wF#FC8}(T$kL(+Etf?_7?z_0DVE+|(#?wWk`HJgdmhV^2jLJ9d>77H2FGG>nr4FN zvqm^Pg|>=s+@0#u%_&V7xCxVPo8H#LD@#E^RzFgSfmCjz(tzc?Id_96w=7mCzd~#Xx(`G9<6k_%Iq@Z!0WD#^)KHuIN4BhdxBI2al$7k># zLT{N531l5G+@z*nFGO&0o*`lSZysq*6G7boUF8~SdLC$kgRRD+>ktbX)R6uHX8A+9OA`Xh@MG1=I}SF| zu-SI7CfJf&w$|Me9{`VW7nWZ^<`S0*trh;ULJ2S}f!%HE3nn0Lcmpv?99*SGf+v_7 zVIXaAbuILFNc4+9Z=C`}F5UUwcL?D*KSCKNLzw~hYX8uaM<39{$E{R+O&7j`hk$k< z_Z0ibO0n2BTrv$M=x~3;@6bS+6fxDHMIQN~7|1+TTm!I8y4s!Tda3g^lD_Ax($avA?FEAeb z?k&)dK27xX1Q-;rYs)U#&@ZN_dP@czTFJYEXA;DLox=Jh779?sN`MXv&|yR#247j4 z7>QvPfkq?NCz=#DAUmsle;5pRGWfN7gev#CM^7ETDu!j2!Q7BxcGL<5rM0f5kF_a~ z@1{D=TA%@cHFS6E!GJWu1THnAX0cZa2Xvr6azbYwHR?fsc@MO*eN{NDfM58vm|_e@ zw6_k7K~jVm-zhvIN^gK!Mb5wbe?*3HQB(Ye8|;+W9fS)5pJ}HnVgD>GjLXRFIEFuX z${xk$o0L7%No*rO&j8+d?oqv{5x}9TFw7@sICs!pb1wvTA*kc6c=ml^Ow#_xIExC; zw4RY;MC`{uJ+#tc=W z{lQ>BmPij!NB&pcn`b~m1|)THni7{Yk#>Qdj$s5?Z%EA;65kk}$6U4mmDlE48xNL~ zv+KF@L9<*#Zz&wO<8@uQ>h(J8>d(Hi5m7mcIwkL5(-aKM0(zSdb4zG5t^>_P;?kuj z^KWeT!7MKPJm%Zb`6B=Rh)U{NXsjbizj%aQJTM+j2p5>?+*BIK8djQGpbDGjKD708 zxR3XCFr-moM?~eac3wFIvbu(3H3{qPHkXH>75?fC)1IE5Q;8{%)}!Ggc2L&$ND{(h zgznBN11ZHXXaoZcbs|fq=(`RhH%N6A0Fq!ne+SOGLWMv;J(RZAx&nNyuorlCcAn6M zIP>ydU2mW>fOhdy1Dvh zv?=@{2oeng9;7~)WPRy=hq$5xBoxs3W;xZBKcWJqiQ6c4XDNrU$x zmq`$(Te?G=LN+SPtju7~)eL^4*z}Mm7$VEGlNE{?%W&w!TQ}B%ebp!5(?eB;;fti} zf0_MaHH{b-yw~+>m44WNU(`Zdub3Wu2NSm5@Pnv`AczkdgN8mf)Ef@1iVtt$KP$Vo zagz@4=V9K1u89&jbVC9@3)A9ROH*szs*AVhAj-+o2b~(ShNcTN!I19cNtGQ97G@-` zIUveMGoe_jCSXj}%u5a_Zjx9wN_t;t? zHgnzcK!prpG?y0;CraM(4X6u3PabODpq<1~JcPJ9HcBubR!GXuj%qSzWiBNk z)Yqz@#i^+D;rE`1zpKw5bd5$7s-AcRp@wVa;v}S9PRNV-WA_~$Wah)9(I>%@OFfg! z#b+92FqwlOL=4CxBd11W&0r!9m=p~(*d z4%*~Wxhx`}6AfsAFr!9G*;s2C{GVgT{UcfhZ7uuBNa#ly!rLU*rYQW(V*Tbb;U>Dvm*m5K6iBh)%>*qj;#7400YkYY&jIi98Vk@tb2^Ft6FV%`CRE^V(t=eff? zJT24Jwoq$2Bon$^^1+C;a)z)8_nZQcj+@P zk{a)E*p@;ek#LV(>e;1JMV@yr74*InoH2ah&^zTYd~(EzifUV0)d%Bz;~nf5hrJBr zo8!Cn@u>VICtsb$i1Y-{En#ukPq%oIZfLMZr;pA4nAcfJl zKD1qMIL_SzXKvR;-4W-KD(H|ntpQ@b^T48vk-7QFCwFLQ9`GW8DD z>A-jJyy^I-vt$2xq**E)(Z#@gzYc%(?5xq<7$7xpa+-Bs&Ztp`86zq0rFrW!zQA-2 z0hq)5QS_xhjCwE54N-*SnR5q|D1fGrtiliTMePomm6_EI0u1E^po@u*g$I?_t#E`GDNVRfY0VOJ*9o&Q5gSmnnup zH}9t+G%?3jw(+UL({};R%eo`~W<8vqV+HdEpWpNkkleM8*XFXCsP3-o>@aFN_vN9F zf&eDClomF?i8cDxL{xdBFNw5)nHpzYc%MtAAV#cUZwJ%{ww+AQKjS+xz8%g_${Y;^ zACbgpy#OcVJT;VU1A9aT$Kn}kIEWQ+vB2Ow>*WF~D1ZX3+ADW*4ASnB&KEbj;Pnz) z$=+~j+V@9w^+kAj9!kirIi=>$5rXSY|5t(-v10zqZFp3QY-Ck`I1}ri`$mWvPX9A{ z6BqXo``^3|V4w{^cab zN~|@}Nr_?2UE1F`pI+I%(vgT0RM549nB!b+o=M7Ev_AZsH#pw;64M) zRPDCxE602M&I>~~XUj`{U+z2f%dO0XIAZ%6K+maQ9+oWV48O@^75{?0>gF#l*!B2p zM|f}ezemfn(w$ZO@b9&RjA?_i3sRZQvjXMZuBr zuHgqapC0PyN&pj|Qpq#;I<=f-u<-$(Mm(Xt)b&~4s&RZO+wdXF{D=)Lr$yeuiugEs z<$t_Qu|#|@=uWa3@T{C#8>hQP#zsmuta^{DDn~;Qu>jWN5}c1FxG)a0{9OSl6Na%@tUW)K3g5^#wRH%C&JPB)hJ7MQmf)$xBnFLT{aG4&`2p>@2T z@|zI;Py8Wz3w)}A`>CCO*7g75b~LR>_4&2h*Hr&k`{%#7CM>!FoFXm$X5XGu>lWI2 z?)$G`{~s1?Eu(o+&W@4*{DBMoe=Rz;+oJs&};FVsqR0wQ-9YsAu2ejvggWxJsfkr0i%bG zJfFf1kwLm^hfYl{i5pyT+Ci|fW1DxIL)mv_6Ve2u&2v&&15Ur_l*{}aNAVwy<>%VZ zNkVL^a9%oi^*w#zSWN%dIy+ac85;+iJjkMD^|Ad9!Tk==yM24wGI$yV`UgF@L2yoe zEJ2^=A$Z_F?#yZ?cuZAY`2qB8%n>+?udJ41@-+HoB02(Akv>WqJ@{K+xcL#O^Q>44 zgPB0Pxax?)>2Pnz@vq+a^R3VguEX8bp^p-ty4n_w0rcR$x_U-Ev<7WoJut8si8wE3 z_u84Gc5p_p-yO!mlzLc*j5*x;71?7Sr6G)GRq3_xT<#e+jl`0 zG*LKLHKqb>n0MRy)nXXkio8G@aKpVO(ej-t{SgUWvfes??s(2)deaUZ2 zY=;h`&$>7Gr_*s)R8NQu1YK5?>bLSlb)s-h4;quzEU^rhPGNIE)XHLo3&R(Ua1Gb? zfsi!XSXQGgl{Z1PB;Dn9|7lHEo^yZ}mQNtbhHgc>-yo4tuU`KvT%X)*`0UCG0H{d` z=Zmk3DHhJRmgBS!rK?s4ovWC<3KOUQd^3y!XrlO}?H&8g!tx#R;pU z=tOFv_plb6PPl|fWSISsjFf$>&X7d+mLi4hePSmtkyd3^T?@ZcwRd!_%7JAI(b_Qd z{YdL?0{`b94D_frvHH0Ox}>e;;nlN40q$D8v_T$RusE342YV-PIwX*wXw5PBErZ$a zM%Hz$8XHK?AEV2-^5s|`xF-3jmesB1cL3I7>k)|+(<0;nU##C!%e5xQ5cJypof(e^ z;Jy#{MbLjUt-t%DP6U?2NquN#p>SPcEi43AH%1qd>4&y^E7u46!@H)AG_oG>R7Mkg z65%-@%%H&$t97X3Mw~bRQv3$KGI$~Zu`z*AB5u_0Mei92M^ekhmqeUE*LfQYS9jm8 zq_*~Ao8h61h|{&V)SZH_QOcT#tu5xaC;G`BG|cd9scd3S$cP9rqiaMN#`&Xr{|$La zN1j0`C_r`1VD}^QQSdPKu239YLEJxe<#~T6!<9R1N9Mr1Pj$u5Mk6OMw`I@DbDczf z_SIwKRX@uDYuHaKi&YY#@F@6Q#>C8?FiTjrlZ6{v4*%q3{_(=HlCUE4zx4=zcTixD zC6GWkr1HC^K#U*gleE^gYP#T5m^PKmuY6e+9beCRJ$?0@c7`)>A+iers|VqdgNWmI zMw+Zi>Lju_?_U`6?uPra9T%2bvF0mk{m=dN?UPt9SdO{umX(FtvIo|p+j-@On7=vJ z?`{D8V>mfHRehgbfRH89*~Si-&%TbE{n`qOX23%zc!^v=*YTEvtCLYCWUgIv8yr?& zM`KVz9D4)4#uMJ+ySAABSf(GAQb-B*tFEr^9C}rZ61s-?dwFIg51n%$M=Y+{QNaY**kxshCRdC|BD#iubd(ZOgSW0A#{^0F zmB6H09B!v-sA{w-RWQ~vpfPiLPY&Wl!P`MQI}cWMe!pRr`%o4&MqF(!Hp%>RXMFh=si~4`7W#H;TKY@so!n(L%i5$GI**AzT2K zW1!1Oc}3{!a0AHN7=gwsM)a!SRDeycQ+J73SIqNkD@aoh4jrcTnBbN%Fjc#YqmZ_8SA~{M%RD8 zp;zxN<6)}JeKVtJK-rGWy=vg<`2mDlU|7lQu9VPxIw1lPc766Uu55DKR#Sc7A ztODcUZ`W(>w!gN5-e=%~C->(DAbS+v56TcEfP=T@)>KjKEa4^d^(3Sve&a;pPV3rj z>&QI+p65W=3NIAzRlavhN4dGy+pd712x_Au<$ zt^;z$pBD}@hjh#9sm6-&UWXe%N*)ghs)9$TJ^_a^2-9-$k@RmjGxj-tZ3TamdV`Fr zY2d}SUANha;X%*3DgNlX9L=wz#NULLC|+;^jj83{O|p|g5#BCNzF{qJ`009KjX3eI zt>CXyZzP!Xbl7bHRAHYiA=6>#B^8?g^P<7;){%Ms9r=Q=86gP)(Q$!!ka?7~zMfoH zJ>z#y`8T-^$T0@wXu)G^qJJ9hOJ5vIunu+Hh%0=)1Q)Yj!_ejO!ZejQq(cwr9AN0b>o z(?QvIcsu#11Z1_bd+OJJ{Mrf%{W|pq)iW@J-FB2;;7zYOEL$b(wW)ROwsmBlf6sG% zz?lC9AXhxXZ>-?2Q*Wdo{{oO}LBV&=x{l0qCC{Obnx0$Z0{ja`{@TO++9Lis4M)M{ zzhLA)jrBUR(0{?mKX|xbTf|?d;mBG33r7AkWLQTQ`Y#yyhk)zXR`AzpI8yO{!N`AZ z^mSyRLjQu1zfTi?Z3Tawh9edK7mWPpM*kO#T&qbT-|;UP`8~^6%RBzBfRTwuM(2!| z?_SYzQpwsI9b!?|C-BPsc$Xyq6SZlw2sE33_i2cSmi^Mh8R!Rh8GGC3CGzG-TBVYC zu%;W!&i7aQRV$C5YozZzY`w>!e(v4!La*T0PnI&I{FeQ?4kB#atT=`UBb_3s&nh6* zvg3zyeS)vwu^MTh+dGnR(a9~gYq&JI@r+qMcfrHaA)S~bX=jr!n8uwOw6!l$i^(tW zdh?=GG3k!c3D$e$xJMLB0E^-(%xw28pb?*qcml31#?Bq%gv==$*4W|LF)OK zz7L5G@2Z`O`+y*AHC&fts^4SM)m>#``h2kA!Lh%_1bNjQYv{B~-vk;liDgVWaSXh& zUB2NnG}YPoEZVc-BO@YOeEP`XA%qXej{44Z;Z(SU0GnH!R8vo%Lgzku_T#|4-AH?G51r)gQ=yv*O5-29O1pe!qhXVO<{ zxq#Y}e77Y_+Nqk;&#fN`2rSLtI9^eAKBn-o4b%SV$(g>?>Vct#0-5E+PcJbd+!@K~ zjg1QX@9ch?4G5C^juV@P9y#?W9=|v`GSE_*z;FM$Ev;fN^O2mhmkTO+Qi{jQGrmmk zx4xBnaw85WPzn^-%jzy$6`zbLK6l1BEXdwj{q5`x7WaxdQ=hVyJ@pqbY9lk}_b&u5 zQrPrW1*+34Y3Wv6uzRDZo#C$}Q=t`Fee4=J)x_jXvUW{R>kga_!{jq(~_O`KjPu$+VWIyTML6S zLO3~x!#Et4bh%$+O12LWUu^2pFZoQ7Q2#NPgGJOKT()IUqD!*=EVc$x`emx-Zc)V4 zgiTwv*_Wm)vxKa&vgSASWWc-vLDzB2eJ;+>8v{+7E!{P1Y?=egS* zSW~7lzm^Ts@*J@UmTGjPV5MsMwTu$rd7e-t=jeqv)a^Vz5@M-Gs-h3k3Bn{_l@2d?ONLBGx5Vb zDjL-u_vN@aI7wO!3Y@9WaGLBPP5JVY-9Np`<0?N@`H@0-F=JlU^d%#=618RL{La+- zl?zT^o{fK?H0kQXl}7~|5^V$9omKe@sz(Z6NYjP!e)j)Zqg^~qmn>8MG98~VD!(B8 zog5`@Dk7t}ov(m>wViM7<8%f-^`7~W>@$+}IhL8%mScho3ufd)X6_KR4qYkn;C5XK zHVNoo;uHy&L!dQXd$uJoekxnU{D~qDj2g&Kx}50sZL+-~#cW2eFQY`kpkS6{G`QPV zVT7Pr&<%c)dP0%E2k~t*=@VtvWf)0Nk!C{$ZQM>#?M}JtmZh9oB`t%Ki8=43&ak>| zyfe%R$F|Rz?j+rs!>FVYukTLAAK#gy+-9qlko!4Tv2pV4sDri_B{!pC*bOfp#wmUs zAu(gOqvX7wyDr$>JLxuTSrx%ra@y^P(xeI(P4yO7BoA5X4zfF;w$dRErPaPf&nFVJ z;R;y{c225$qxoeSh9;wQJqKvK&%t+9LX0x)#i6N4RxbNqA z_w(&{@3r20ecxL1*R>enI?p41$M2}^hDKT>k zhScc?P_W1+_)EZ#3xk3tUC(>(qGG$yMtw%@Lq_SHLMr_Kr;yWsa?y8(TbrIY6Y5s} z){yO0#^pJ0EfXiwBT02Y4)AS93vX;6u(G*r0|W4$BPd<;rnu7`+t(bgx^@7u;}|Hz z=Uu*VyE{3L-L^)PvUDD%I@4`!^Kd!?3X+cs?2=O!bKk_MfZPK2JAQqO2$cD|!P-fW zldi-KIab@6Wl>O%J*n#Hbv3iX-&SmZY)bsq-y$((dlCQpPwsn{Ty71}!6PKk?_`gC zTX7T^*aehKR`gr-PDleK3Mzpnd37|8rq^gzSVD3sKC89CIWz5|HZrIZFPR#@cNdW6 z`D?&Dc)o*;`usc4~ufO+c|TVDNDo zXH{+{9v^zk(?vkr9a*sMS?;CiS&Ll2LR27-9&~yFHA&9NHcu| zc$P2W2PelHI0;QX{mq(@q@|Z1`wq?;%IC$hJsQ<@GymjzDD~cI-xX?h73?#x0e|?E z!^-=Aln2WPit|-4EGc9o#VY>flDp2)eIRoaSF}NHr=FZlZs2tN!2?D3Hs8txdm8#8 zs45o2id^bS<1t*HHokr~x04vhf^-ZSLr|@R)+8F1@4A#VA)LRKu16Nij;i3gsSO`| zf6d!C_`H%f%C5 z!H%Zuz6zrIo4*SaqTXC2`tLg$oa0Xwo4)g|-t8qThQJ-68g@!6(LnQfS39~6T@RFm zNHmvSJezL1Nolf=D!aBF$4+_@s%sMnfn{$%0c}kJ@a3A*^KlgffSo8U(wwY=yV8VK zt7qMNrmvAs!HU|-6=J~eg)a#R5gyfObs>~Ij_)Rv_hfnqJ$x#X%W|(EcV_f8Z?`p5 z+1Oa6o^R9LEo`Xku23lnk+C(M>ouC$x19W7UlBT+X~aO_S@Hw##=^^ifp-ZM0LKjc zcLMtV^h8V?_!g@)6Bd`iv1P0}t{2yF0M+_D6DxB+c&iqq3NU#`Qlgxh zg?+&}Akmw}RQ4UcGc}KZoqs#@RF72zr8k*y;!=LjOTx4=i<^T`qrX~2&%HP)fUbA| zM%i=^rpdngTh#WZkE&h(9phhHQu)|RiCuKbyqAG_1ezNH?;GLkSSG+CY(c#lIjp~n z>gW3b`P6au7%CISe0VjLvEZuJTZ?oF5zkATSQEfHr5eq@gB!q3xezB-Vtk@!47Z7I zi)-fR9j9n!wk)0#eAThbQpS+}aUnB*z*IyMj#(W7SSv!3cn-{JAobi^^Y1wDzek4u z`6Md~DEdsyO~6P2n&Fca)A-n7^HvjX=fF%t8n0W!%=d|A{~tYqkGj1l7HR{{UHz=J$n#2G93%iy%pTT-^245wNx z-;#ul$^!>Bt&2EUJqjkaR<-^HM!gU74+6&x3%#IzJ>CS@JSb;2q*hP6jq44MwO^G2DfZr}ux=HGx;WnRw<4mAo#d z5+#dnu3`r|BQ=*_-nH+BHLB?3V!R}G<0@$VcO+ohSSEsiCiyh%kt&XJ?EL!6ht~{d z5y<^lIl?P5;8In2o^So<3IBI)`(ICF;(+(&Qj}oXdcwtdOkdzU84T^&9~jiFJ`_Zq zzB|{k?fasO=(`T4Xc7c2rK%66Wt~j0t^~impc6%{3WK{^8tv7OnS;)Ni<$F2-o}y*&<3OwMcV&-)7-kgSd5EwAxXx1_wXp zx@!)r+DvtV;MzElmNhNkmVtUG8!U<|#w*7x8rzM&K7zD(V~cDZZ{r)b6JrR;?|EzIP zWgI~w*pLO8N;IIfDQ(aQx+t9mO4J%|1axXS^$!EJ)jVNizzBC_h^( zGQA0ljwVI#T(e~(r4W~p`TlaV3bnJa^s0)!yWNM?yBcFwiF!0(zJl+1RxS**0BQKu zA?;8PgK7CBFO!#6z4HC*27ZnRpa%I+Iqmn6!IYoX$jV3Bu1MuV$@Bga{)Apz62BjJ zRq(1Cs?2_w0LcFG`v0D;{m+}B2hdpWmZg~=7di!U@0w|S*B?&b>vmnA*gY+HsKb8d zy5d9HOq9yfa(x=!2djgg_;#XUA#E!&S1OgDmpua`L_%jHO3f5!gWykd-08m4eK9wd zQ0Lii6UJLp)1h|PrSp)UnVYVllb-BA|Li9OXF$(-&uO!{Js2emjNqHkPcrJJFoSR0 zM;ihl!=wVTJHva_(V`0)q_+aeZcfw|%4k6p)`H004zu`Bm84GyU3(ICx@oVYtrsr=3u2Yq6S0)rqp)O>Qjo{$+E_S~SCUakS}86G*bheIGvx;uDI{+3)%-UF z8)}db|E>kd%Y~M~S>{i!ddSEvWXef*m4bKQ`}X*B^H zYvk4W#N~N7oAGZ5XQ#qaV~saC{7p1BaP``$mPkbXd06=Rq&S_k+h{UfI>7<};GfN? zH-1{2*)Z;B_#I)DmtH$xvJbl)+53*GG!dypgWxD#Va%ws~y&tFz`&YsDe}~)u z+mrtkEa8*hOp`=AUO=!$W9Yhlf+=*_&prYGrF9<+F&!CcRW7STooLQ4!4D@uk>S3) z<*Ug%24C%Lo4Q=gW~!%xn0f}-gccx9;6>C|=Gx2giuRl;LToyZlc5olhP{5zj{Okd zW5;Ph7C$yCtGzcI5)^WX~1gRPQWU9 zGJIZ7&*psowp^Qf5lYG`ko!8&7rxZ#w%ga*hb6acVml^2tvrfd!wY!e60Rso|fYr4K3oTbEBUW z8j)vsDJ_J&5nWH1k-jP4K6O$G(XU;o&Z%!X-zRn4c>wB`P`Y7R_JR7ld3Oqm&RMiw zd34_ypm655N(*VzdhYeRlLbDnW%`6$FEUy?JCtrqj&38|JWbnL?ktmrp=0uHBV_+1 zd`csvi%>gj+o4lISD4`GoCG)EZPlDqNvE~4=KQ2(1$D^*WP8y|g(0YG9V5A(Oj=sh za7Mkm^BVyL`LG~~23Tsf=62k_iKX1txLLj2 zE8D7|qYO2KjGbia!d8qD`L<@~Zz=BPWkdqHKubaFW7u?jdd3dyYhL#UiCkjN-%&qT z+sUFov~2rkO*@8w05dLlOf%&7}j!uaspD@Yx*%~Qb31!-tYY*Tg;u4PkGV*<%I`&!pR zf^}yt(3M&0zpOP@Xs@uW--r`w3~~VTCF_nV~*fj^aEk5=)J=QUc>q`|LJu8uZURguFVKHPLhE@Mq*V3_g*~ueF6`1uSwYo=<5fJ zghCqu9UG_NBdLd151xsN#8MtL3p_EJw*n*AFDD))s!t@1{!E-S@j#cs!(L) zz%1CX4j58>(NP}Z;M2Sggt=4PbT|%-8oeyMdL*s z`#}totwEwo+(Na>XT9Gad7qCX*%z3F=S4&u*Wv6lm89MIVHU%J_@LC?Z2 z$`5nGyEAkh2y{zU=*$7JjCUz{9nA>1yMmX}h2ie-W>;f>pM!2-Cy;jaFhQarL(sE& zhTkdHg(>H80Z8nY$XEn|@A&8jJq zI-3%-44r7Wjjt{1`{13M_h$)vDoTlWO*nfuirj=N(`J`-lc+T3DWI0leI2lf;%6AjOLWFU4l zWt+p0>ZRd|zK5wA&K3)Tf|!`3UoL1Ik(s4T2ToQq>9COW+5=QabBX4viq5{^btjea zuHsC!V2k`iLqgJGu*%pNg~;lvi>O88*S(izLdXfRp0b`_ zDo!3IV1&;UDk1)>{W$9d0AF5aA7cNHI9Zmv&I-v#d51iA5+dvdJ*ogu@{; z8z$f*-lBT3)1W>k`z9(E!OhJ=mJTO+cZ&}oC3kIuZiE?uowaoNv7X&deXxT~ zCBNb3A?317*VjyvHW~Fj%#Nt?HTHqQDvhNDV4fN2%;IPD z8<*ohmF?Q|f_w!wqXj#i4K^1A`K7=NY!M1!#%KK3f85SPgTpgafHn2wi0C5L$cd3s z{pcGCBs?tl8OigHd7CzBoDV=PFX8IU%bsiBo#ft`mNxCq$3o?B?Z0ljTT}6qJ{rBtR-SxAP zh$qDKuPtMi2bvwzc&VybErVixU>?NptGy7-{~C0dMnmUGzF~gB8Fecw&Py zu6BCZJFqzu^k&$D4@r0pUELcGM(U4KW=#i<7DQlckDy&C1H&tjhAX0d0=THbjiNjX zvD(0N5$3u=p;A6fv~nZ#JJtR=7EvB8rgH~q%y2J?Og4jajUijtghH!IzBhK~2Z)JQ z8e}q&K_~$N#&$XQl8J>BwCG`_7=G(nx~4-e@CCrl zIIaPk5=EFIFP!n+xMmKkIw8U7xSETfrGveH06RzlujTlsqBRn$tf{^O*{@x`s2bkA zwUho_o~>4fAA~HgO_Go#y@hB0EPdo~BQcjP4aoY-2P4z}%X?GAmqii3NIeAmM%-AQ z9HV_t#v{+|wyV{-t~L!L)nSnhFqeJoPM}ktNC-e!SB;2yxLh zLyKLS_w{P*yzj8DSV9~Le^6H%g7n>rI(hRqK^v8#24kQRMvaqSv6yZSv1$K^j*jLZAQfb5;I36!nx z_};8C^klq1y3R_jswi^l+Ta0A>fCHoxR(`ojo*I%TO{>=MoWK>&xz6?1d!6$3j~x5 zyrg&OVDeuyQ>V}+n64W-!tY#Z;kvXF&3D}?E(vcsZkpIw^y?wgbDFz=ckbIH!g!;A z%{%al`EjS7q_Lw`?X#1_<#27^bJ`y*Hmu|*#$#{=ow%aYFt?H{1tsXZ{AlrAS%Rh^ zU1`IWUo5OLL~Q;}n(f}ylytaJ=3KBc>6 zG&2o1Z_e|$A`TW~O$@mC7V1~2Q5`y?=XTtkX-;2c}tWv4ya9mXRabSR2n zv1bdOv;{kDq^uD@a28)}HownMU>TlrH^+$K@EME5D;7U#$|wr*v$9sBvHn)C?SkFK zf{(#VOJ}<#6_CE9iM11OdTw>7sCO2wU zZ?L*qW|m1fhqOFqy?{&yBIv0DR+BsI%0iA2thG7@fFlx5vT_?C6>9p{pAuorDR*}N zD4Nu`;t5KjY5t5(cx4cn6*|1^3HIJd>WDfhpQ7HhTvD8gFtxw%Dyh4Xb6ncumEQRf z*g>@*=)2w->iFkHYg8lTfbY0I?b>z83RHKKB3g@(;Rmp3Nm+)UG}zGB)wb4qC1oY~ z?2$fk>cvt{8oSi#O2P-yuc|jEh4Mf;DYvUt`09}F^s-}K-=)7IPZ~w;a%71`>2Q}I zVBzDU!MiL2WLWbb%CM!&s>-SF?DFSGnvIe-4pHuFE1BKr`VAVLO+Z>4+z7AfxW#SO zG|1h}_&0sc{fNxRi&_+z?Ru7wXfk2QyZ{*oPzjH{_iCO)E&su!$$Bi7&jRGy&p-Hm z>yZoV*6ih(w`*sa>vHAle8T>9|aq{P?gpyF+=BJDlGU69ofaKS-82d@nQPgUtxw-5) zY%&tMoiDlK<*q=aJMU~Y)2$0!7OgI$5jC&nb~}!Sx#D(~zFVWy8f&BTxg~?$s2wcn z-!#8)SSJAsi382%bvTV{CJFa!TreUwl1BS_Yya zGN`lE%=88(`PNIeUb-F5;x?dKX{unmFF0KeUdryO)@O@@44fs;4Zifbj99C!j`0Lj z5V{JTf9^xN9B_CKvJWs5TnHXV`){lo9;uyb6XII_0Gy?HAGo_-_IUVNquqp2g(sxR zmCSQ9l)Uu7QXJQ%`l75h#C6%TG543cw^yK$07@I*P;3C6!sno1dx>^Z1+s$F9+ ztFk-l4Soia^kmUEFj;_+x(!=7u0>-#fuy6?+JdK|$TOOE?l*QLJLGZ1AmhJm21O2R zPsVz3`%^SkdnHA=Z3I5`{d3xLBuj2)R{H<5Pj)PnWI zHC|jIl@bXyUG}r$*2kGx84<X6)lPCa!j~r^D4&g~S@vQJGd z<~deFldj9m$1u10yD>8)lMQVA|CZ&mNhe=W0xtuZ-1)4XgfWn_cYu#38hBIrv_PI= zVC~neHl2+0*cUXc{yWT#h0Rruq*TaePMKuXZ-0A=u1bkdV7;-h zr0V=hAXze_2^1nRM}*K5x_#}wO6*~`xM}HNnK5v_(lWdHWim(OODNCQB13&&iqcz% zXW0Xeth*W(?HSb-^l>u9l{-Id*6dN>{0cp8QoN=la}~bSYIAlP;RjN6e@ZJZXb-xJ zIY;pC3K16OssHRP!9}f$4ni#q!%RkQB!Vp>y>2s-Y+%~qrSiJM|5RZeUdC$z|R;O!DA)8}UM#Xe8jFGlkModN+Ny_vT0cUNc1HSRR--iabd zj+^hl>Co@baf$UA|5C12X5SpqeYNkcxI3V{*x>y@*X43`5*T&Qt-)8K8X1T7zMV?3 zZv{OxK)Mtn&u-K9wJSDu@@IOw@XG}riIX=ppNx!79BwjwZ$oW(eS$||ids8I1@k%> z2XekX1JsdJ(PMp6iM8eXLwvxXX!r)fKJYXspJ3hUT zPs0+xa~8pFrWfLf*IEzFJElK5BoL(WbHG$~>*N$iqZa#zpI6jkYcFu5jcKE!+jBqm z;N*TB5D2@hCFcu%(eMzjV`aS-s@fs`Q9Ew2sBzZqwd+G=ZgI<)_<*6S$Odau(oR@J34M?6yN% z#zyEFrh4&Mv;N1ym%Oj!bf{dtuTC*qe1gXuimBciwoFfg2-jkk5u8$P)JL9I<6X*y zmg4wqX*lC3)c%led=+C@=0xXhsyk$yTZ?!1XRjJAX^El0gUEd~^$5gK6?_Fj}#?loigVm<2d6%#j6w~R%%GmKA5=N6i+rE=UHtTg7EMg_YJr^JUW)YIsh zN4_Y{1N(3xpTDIS2d*MM>$1M?A({s+1&cu|1=SAAa~EN|)q4?#0G}vVhIcy0(;2t3 zK113e=-U3X#rt>yv=5aRm6S5x3yLIe{*?WuZ^o}D=8ZPT(`vt`K0dnwMzOZGC>J|+ z-_6I0&N=?qdELbB$}7K@l9~bzDReep1x6341XJf zzV3G~Q2OK^{|nZWwT(yBhqG#N0cIfR>z@eiTknF`xt?zICZ~g#VGMy-_-(OQrM-!C zt;T88H6#Kq&%d*#YewiE)V`QvRM)hdAYO~1HfB^`d=mJCP(1r4Fq&3TCm^s{!u=qu zVpDm>!9Ws8$P?y0nXiL&X2E0%@r>{Wbpgd>L-|S z>rNkuX*1bOd5n)ZC@%CrcBjZ8X2Nul!XXL9-s9};mMtTKQ=E6W1+%+dT>si{Q2q9o zRD?UMjjgtHjLx+%{j8#ExB-!Mev9!YkkpTT{2{#aXo%85xzUlkOE_WE+8==}x$xsC zhDT9nu2#h7CS=NhX|3*4(C@0(7%FZ*Nz`+&ejd}0*^!Xa`uW}|UdKPxI^gI3m*N2@ z(W{jC`7(=A>e+5Y$no3PE#q5^MjKJNQX4fzhW9mDGr|*EzaUxFiqs81E^*rrC$T#w zy`8ogk&Rb&|0bR?#+Z5O_a=r*R<^c!j_o;(eB#G6VB0*LK3OpGZTD{-9gc za7U>C>wI3v^m|V>_TomTlC`~kWq>eEAcvRs=|Mr=EOwrH(%S_|V$SMBVM2u$C?CyK z)A{y#tGEgK5qtF+_x0p-wJSt{* z9|KDE zYPLTAKKePe(5a~R!&+|yW+Ua;FV5dMFX@|nPr4P=${pC6TCHw{xC*p8?g^j*J~-(| zkuWWG9@x)CysLMzDYTJW8(YZ~d2KVK^Ef=(_bFeUgy-N(4r19@>aj`PucNnr#JEUa z5lYr65QFSlIyv6?6PmomObP|`$s8@UciizRy|#fR+JTo2nS(gK6UklxK{#-qQq5uu=CL31y+s;3Ggj7O!i&aXP_ z-i$h~Qm@_eIw<3b*jGLE`G)p|<=?dc97%Z0Y{O2u zt%D7bV3vP+Nt>wA3#jNTrNG~hy{~k5;3pWOrU>r1L*eENljCEB5LdtfcL{!BwS0A7 z7!zc_tYzy}zI+B{IS9;-lM>AGq%-5M z(EDO)O5FfE`bI^E7Eq(vSS(qx&l6^6O+YbKW%aFog7A%9O0`aRR2aYK8n%v$En@_m zjag)55%`tW_|FuZZtO$ux>TT2R;yNu8;^>iB|sWZx$M6aH1!#dk40iK{Dt9Iz~=*^ zYTXSCUH-0!cQw+z!5E`@txY`diym}NS~|Nx>3|aJlM5s;q3-*T5H^K9-+p}jcGlIQ zgi%-(k7BP`6jRRYF^IZg)O@4_*sR>DGNkjC9000;o;y`8g2e6H)A5}>|}G#gv);7UYS9w+FV?ptroa17_%$(f9u0=UX&z zz(Qo9$=_m+cW0RAj20AbjU-q&QCDjZ-eriicOcqSP`q!16y$Z(2D{UHl;<0Awl5tX zGzLtwYjgUz*nk!FYCqy?V64#F zb?#Q~>YZwS+sjYe2M^3RV41kOv%Zr^WlXW|!v1ox_`Su%9P`XP z>IhWvpz)=irkpY!w=BE$oq?ho%93=W?u#0RoV*X)?87!@kR_9wn`MGD$KI2%tLW_= zQ85Ol)0|aiCv*JnIU7I(n)T1Q;L4RmU6zW~JTV^2QFVBRwfNS3`O93if2y8xV_4HS zc?V?v$qq7r4p8!T=zT$D+AO*?mELfoUi~t^a-&88p5v4w`X)Gjsaz+v>-l`Pn%W*rfaAS}-N{zSC-N%j_Ch zG0DkP>D8C5UOVNXq&Dj_`R{Q~(ySyjN8Akz_pIATWO?nq%$lB;_gd*> zw@*UI<3?G16wk@e=z)~+=M|$u8wyc({3Flmn8>(*_pwR6vp{jQGqIrAPg@VbQ+*~D zm8duua8QbHC1#0;se?foP?C?Wg&(anhNncviyr)~B%$JflJFGIN62kGMJ+1Z;b`!c zNj1-31nTb9n)Cl2Nq*A=ZLp+yIcb&ef^Q0CLh8MzQ+6}OpMM|oeoZB3mX=2rtrDGH zXua*#ecXTgd5)WP91={$j;D-EK{KhxO3_kYutNP|z|~s&QC<{fl)6MLo^0$JiPG22 z^KA}2=5z7!1*#kEM>AnKeUq$)_dpcr1KWtq`pCm4I2~$L{ec#*L1s=P%U*ufRuh=g zdlLmDH*jcdbLMLkT66<<%uu=&g6X7ERZic z%it`!;!G~Z7eX0gyHL%_!<=e$oMpD}{3no!*Yu29R%!G;+f5QzL7Q_fo;hDhd%zs) zlh&1^@9aLaMRn^lidk>txn7`&8JD$=naU1xaB#s|&`l(ek)Xp{1lf zwOOB*(<;H7iTUB9iDhO`mNWru36FVFXP0Lbg8l+_n=~(&c9h=3T@>*oMWvpO{B)xM zED#Ci8f?i)jd;GHe_YcDj~~iA?zJpdh>*VXK2)~p zY!_Ucn6@d?&%^w37RuC@9x@Sm{%LP-r^e%F(fx)Yzx~AK=t4N89V5KkilqmGvwYAy z)b^?DrPJ-MS=R{1RDd+F6}A1uJ1<5=-^2gf3wA@&KU0ajeHVh*U_U<$f5M`@7Eu4e z_{Dll$t}HFR=Id{54V=08~)67(6)4FO_R%?aaAN|BFh4=$t>R${Ak=q7GZwqynSO; zy+5hIqaS{pZ&cK9iJT{xySZ`4`ZV&xU*=`-NCF|7YrBxeiT1xdKw5pEv<^&V?`G0g zi=+*{g;KPHRAX2!<)qtQ?~G)s^!;Xjml52%3})1RsN3w)y|>~V6h;1cgQYZGMR1b($4 zk-#F*=;5Zt1O^j_P|en`%Knz?3icu9^~zy4YwgEuaV6p=Rev$fUoLzPxo!;$~yd5r)?3lC2~Hp2(!aNA?2y88eV21@G`OG)`@U~&AxO^yzc;!l_cU? zXj=>pX5;udl2s6;H`*fMIcB4*Ip@W#GJK&squlClw>BS6mYC&kBADwLhilk`EjhPO z6UZGOAngHV^PqRa0-@b}c;z}QBn1V+>@k39V@MTsnMFU}TQ-Dc%tOV?5|;B-Rc<`r z$#;k+4(BF&QyJw~v@+Ec4=gcj#6hv%RMmHik;FlbF~km z9#(xq!`!_K{ygTNPMn`^4G;lvKNw)D%&_LUi!ms{{0~_)DjYS_1biivsyxe0hS+{r^Cql9n-coQ$KQVi{%UjH!nI9N>p5x!o7!+!*adYtb>+N|<2qJ+(F_3U zVFSoAyYd%cKffh@?NtR+l-XsUZ)Ogg*1^5b=x&nuF)KUYq*;ZSTM3#0t6D? zUz$t(m*sen{L#%+y%M{&WX0^bJ|wyPQ=c9mOB_+WTqTvP2eqr+!d7@&?v|O1>djHs zqf21j-^OHWyk3=&8Tty&j}nPBm9&%nTHv-DmR|Bmp%ns$p(@#V?;j(NODF(6c3T_a zD;=A_MaT*b{3!b#SZdIlMw2?`Mk5|g{p1>!Qe#PTINwe9+Dbd$xT4tYfR>|IK-WQcC4mX1`g#P#$(6Iw~qYF#Zk+Q(X z-2L(Qf1OJj*ZDp+OXjPct}vzIfjVz~OUk``sb3s?hgEt`Lm&KUjY>e7woTq=*T*^n z`c5pr{tz5^jd@Ng%sr>MV^YH@WPocFP=C_Y=sZau^?JncO_92{QR#|+1y{a$U;g|G z?bY>FM`;iJoDM-heotR|ks0)Y^dQ8{X48=LJ)P-DEGAwsOze@M?oXMFL26`J*lr1B z)w6+h+Sg)hF|uzfLr5@pW!>VsR=tTXFddM}*%sxW9~>>b zYhwlSi7L58T5d7`G@%q{wL}LjcEmSW`mcOhnVcSH!-j`E+?~Fj5pC;WU!v=0M+^!` z-=JyC4+^OO*ZwzmEow~0KT8ca|+qm+^u0q@0Bj=#|ZqLmjHhv84gnna0XOY zqUTuv^x4%2`udj-t#+3G#>Sa)e^DvI(fonZ)}HxW&)x5sRt5Kh7+hZl>HdVqLe0|q zBLt+?%w;b*?O>+G=kbYts%}5S*v1|L^p+(!Dl+aKfOlX2Q?LvC{D0xy(bQuZV}?+# zrrN6waGE=|6zL0!hecj{re|nnLgL+q9He?5<%mU#iKs)P7ZaEq?jMRevP_q>qHeJy zedS;4LC2e2Wis@Ni12ZBV>lYS?+J^EJ^oOGyVIJ4#_X z#LR}Pwh-q4U8!@T3@oaNSNs^ugOSk~(XZG!9_WBoYi;W<#iOoL(?sxPr`OstweZB_ zK)S~0AvND!j>-#b_S=&?=A(46<>>*>Q2_Y}IXm`)BgM0M@#@}%QyA1F(bO0m7h7*VaTkS`Ob51mGw^y~=^S&hq~1+$Jx(9bd02B0)2xl{ zW^as^1+T@n@%lE27xYU8oZ0ENVgbZplI^YVBbVHfXo_|ZoYJ5qTNai;Tva#f^pY6= zo-7q4txPO+=noe~inEgqX(6nqZ4=RSb*N(z82P+E;Pk@|^83CNP8WR(22u7-CvnZ+ zUlI)6G7iEf{<mo^3_@RsMIVfdbZ^a9dUFOvlA69n1(oct!)-K8 z&$^$beiKgCyVUdCs5mnI}aEqT!793*G8wPKDFOSn#JlDc9PN z!;q`*4i7Sf21t$?Vd3g|DeA03SnkZatrFndB(4eBiFxcd_k{t*LT04V#LWRJ>h-?A zNj)I+K|^i#I!P`z8+MkLs}} zub6Ly$MN%NNg4lg^hq7`n4q8wd(c%}uyq?glX+A)os^O*;dW_~;BtP$7g=BA1@FU% zOsZlcM>wA>&%h-e7zjSx0wn}42?BdTwL zer_aP8s`P!$@1#82N8wr*%Cl}g5G7UiOW2Oh$2z$lp^inGi6UR65FZ#W7uEczvJES zjXGDF_MSbTwAXw3;>B7RId}fVbAZE3lEj`U&=e%&e|@Vr<+v{tH}*uxn@sSgwr@JF z^IhyGnXiCe{|#3!upwvr7b`{!l~He@@hA+_zGB6!VlzkX`l-mXHkl0O`X8#ap`l7^ zD*f>VKzdl^E}l#1SC=|5rZKWIvWn%84+B_==b#Ls&bVkgx6^a>pD5IAhi4spmBOIe z$LjbRupIzPhtFatrscF@O{vDLIk(Eah5K`bM6!P?v4rMd7n1bRjT*^nr&Z>d1{0U1 z|4E(3s9#feyy)&}D-NWO9ru|8wD(*|1Ep!jiwE8SA ziWX3i+f>ADvqA~AP$hKy(MPhxPWMS51#}EqqOALJLiT}-KZIO&dShxpd8)xFu~>ZK zhjCxDo}bEt#!m~|&K35u-zjC!O%5-FHZcozw(x(K>9t}_Sx=$%Z)2|}R)qk7Km0GY zTk+_|XHQ6Hl8KE}x1*boY5M4L-(a^YFJF~0xEzKHAIe`Sum4>`@*WM?FSr(y;o5V& z%wxX-a`EnApq(x>wsSKQQ*ogtV2-AHWKRKCFY!i=ecWVSc~1=AZKABS==-T7ZS##< zD7I62#o*0fn1Mey_Smv7LS=WQrba`-uq!gTg19QNl$~*AQZ`%j*=i#8p6Ni4kZ-7} z^Wlr@@y`qrgWt#9ZIp{RfbW+)Z-hL;A3kbHQe&2I}&)L1^wXUS5D`gSMif?v3uym^)`5V<4`dKq6vqvZgk`js+Xz1@9-Hk{tE zyg?Tc`;uWuaV_S@$F`&Z;9XVTLB-mOQGmIuhAfgL`n2ZHirqG0lzVsB%d`_a={?n* z>VnRcCgoO(bN}MUf$+TJC4pij#APpsz&X>V=ka z2Kz_zPn11$43{rYIhMigAnxF9$fG8djpi8|0bS z=l+zE3kP%qVA%rtod+-{6j?@N1EjxHa>aa>h9bMrEk3NpAjY}N3tsRt6jZe5rb%|8 zahv#p`pD~cvPYCle|m)}365P)FpzgUDSoO720@Q!HaZeCByWZZtjZ;d$soX6rshGivXQcBU0*XG^fVxp>; zkxToh!5jKI#hKjC2K-&I*5&LW_gIM?-ej3J=8qpi!pwzWABBg3feIf0s~SgTCXR=9 zCw#vb>$ZLFhL?@T_X)yf9Mc7l>SSry>WG_L_h;Ra7fpQTS5L8j~C6UcJ zt?qU)rhQ6IYJY@yY#YL*7N^4-`=jx(7hu7+bleDDz z=T%I9+rdwO<3H8ei)19|T4!e=HH|pl?dZXwSEB`$-}L$KM03mYunZJ+2LuOaTVA16 zI^t6ltjky52WmLxOH4MX?>zyzJ^sgZ)i?BjJ3e6WS-hq?21yj4l0Fgvs8P zB=0tvgOIUZa+)>ue4hBu6%G8_q4Y3}rk!fJ!)Q%z(D@`{K(*ovrhHpQ`}XUi*5L(Cx#1j_66b{w>x9Chz^*-? z;T-Mtc!xq$?zU+D0O{0P`_5j>(@cW+n#%4U&VmZu25RZ9Mo{IZ?^>4lE8nxB;%?`# zCEYFI81cB}hM15rs4qMrsM1Q69BkI|NBr-Tu;9)+ zwwy>Qp*O63mo^;E-kv*3G-9Nm8~=G}MQQ2%{^UNCyqfEl;S}%m$E6}qd^;5jI-UhK z0F<3pX1OtC?xcYK|4Wo}M>=;N9xd>evtEY3X<_kH%62QLOnI(E!g=pNSkI*E8L8k? z?}wl%H3^2@(U$bxh5Gup0Q2_w=KN!2KEl)G`qSr;+RBO}0eJW1oc#a8-djLbxpjNv ziYOo;2m&H0-Hmi8EsY>Zr?h~iq)16ih=PwEOv z`;Kq?|KISOp#yyOUe8){%{kYM-<%75!MHM1HS(+E$^xhE6>*uDd#j9<`#9FqUwDQF z$IeL@?C#=U$m!6<`bZB>^RE@`zB|)pjpqPjftA188$aVtN?lggv1ClIlA8U_yGfH? z)2D04Fbw&Io*p}lRGjP{gwiJ@&Fb=})I(x@v6c=uCy9mFkc%fBms{>%=}gdIWLR*Y zYaamMC~VyF90|2u7g-+lC+b`oUVW(4!8TEt70?`qd4C{7H*RPuGZOK8+h+tp;#aAHbSpmN&wEy{{0* zRXL%^UbrNx=52aRoGKTMP_14fnu>#7WR=iaa1jAB->d z()MIRK-o$`%1LOg?w( zPG85n-ITL*6w6ks>E+SF)#=em{p)TkGf)uR0`Z*^?SWQc(K)*e5~9#RrzMj2|K_y3 z?jwO!nqhFEzTF@i^L50CIETro5{}JOnmmoh93F_6HwApQ-zB?vg(+2CgmHYCBu`I^ zCW6J{(+W1t*2#&;?s|i>-rI4Fo3*>y3w<5BqfGl;-0M?Oh2XFJYGlN|eQpAb8`tP%#%sq!jme{H;gJ^fQ^g7q}@O_yh!Zwp(xo|S+E5dmfW-ZmE8`ToH3fs)^>=h0OM zVs10!`)`}ZxJ%BT-<;t{KTeYmW+O^KZEzBxDyy%6#wREe4Gl8Jb8w zuI!6Aw_0zVS4eE`?m*ERd~voFHLKny z={}P-sZhX7yPu)Z@l!Wygl@ZW(xFGR{5=n2u10(WLUDVJ=xOa%f`G?`ktqAMg)QkO zu~#=N&ZZ4XD>pq#o#Qv|W=N&Mp1p?OW8COtpz3Y^;X1$i?6Uv*rDUUlY+WssF=CA` z{Hh-ij5`y=v*f;X1v4j9fuvtgjGb(XzW+TZyUlHM4lCH8$xs*t7u~Zw(f~Z#5PhG( zWb4;SG%xco-S_9I5eYXXW(Ajxx`8?kN#GCI78phjOW+~&{t)fXIdmMAtFF22=zq$^ zPxgp?B);W-CyrsWyxHS>RRO%xe_LvI9(M{_c zN&lfIau#dX3Lcp(Uxl^zqA>Db4Q z$9av+J@s=-3#xU`17{5z-pj@LDd2OJu zzQcS2V~Y^IB2?$C;rr+aiSE~r81obGpWX#eqcL&%1PLLJGI|F0LkwRbQCS4v5KqOHvs1{7?4{9KrT;%1%zJk<(Gs z#y2c9IAMkd$;y&gQdbyXQg@n5k>yVsGkvih=h-FVy-r`(Q~0z!n{{sFo)&4wT`1wd z)qXGoMI#@T6=u#O0}GDB>==RDB?s>kZoV@PT_nTxs*~M4+bQ#p3fM1odeS78H>MRb z6<*V1DCSz+3uC-Pb@+8MwBEHEC6r9aLwu;;(nf$=&HlcWg>sI}y+|e{ZnH609`^>T z+T#FaS|wy#T7IRbwli^1aAB6fFlqbva8tf$-pnsidKQNsmtKib(7g1OjO*+E8p#;4 zX-+E(Kf%xYSeXj3iI+#;5}gzO8m7e#;A7m=9`7jLis31$%Lkyq zPib5#tveZN`Z&a5;^Il#o9bn5szOWC!L z4XaP4S7lBPtFQF|;50v_rW~1)TC#i5f8k0JL3iQTY+t&A0QKw zp_Teh^3@U@jRE#G^^N`_E_FSk7@H8>_|8n8g2l#i2f1W~`tj=$z8#Y59w{^Rt~xvA zCS!@I6PSi<+SQK&gT&0+`@bntJ)lUh3EE$OGyG6BHE4eQaKk-fN&Xg2*!J#R2I-Oj z;nNO246_I1_L*0l+?H7w7-bK1v&Z(k(Y!rvph#-$8Y>Sm@*J?uB-E~MjNA}aYjhd% zr@YyHbmXEJ2Ew+I-#}JjYSnGeS;|C^luMbi)TDEtj(JNE93FnOucv5wv^o31(?-B0 z(KJV0GK?YmW|}{U=vcF=`9b?Mk^1s=O2Hj*eGs}1cuvXF?rG_V(Mj~Rj&RGC^oe?q_XcKQVLNAmy%KtxVT ziUQ!kj4j5FcxqK*v;}swt;NA>3>c^^N=|m)tbnKPKA-4%-GnJXKN9j;$Up~DLc z#y&lR^lBs~!Z;Enl_)=NZm)@*Uku1}$)nW$?hVm^lsht2=T#8SovkS_$9e`q3~m26 z5W{C5;b2?^?#kVpO+dNnF7-YNcuMIhw$)R<&M;+@T_#&8pQs$YK{b*T(bIsIv(VNL zK@gcn-O)pFhdK|)NX*8f5jwyxG z`AI@wxAX?p{LbJ!sj~Ulosy_;mX86`ME5uJZW+>L$53*yhYg4*R6`2vSN0ZHYi%}0 zahxoMQ7~5HGU*X5?s+cYNM|+U6C{?p2gP|kS^zwtWZd}Fn=%n;A}slUPUarnu?t6f zwZIG-2^Hej@ub9?JY})VhNZY21x}-CUSbm6ViFxXXN>c<3eB?<*a;XdrkVm_R5bnp z`=#cAd*stF0uPO}2YF-M&MQ^c_p@&K^t``Qg*2$S*!~0ehl5TM;!PHq`VjwLwZ+)s=V< zIw0*gx_mLzuAI>#0FeVMP!gN!LfAhA^woJp06sbCa68dXl`{c;PB)znFND7!vm7Yr zO6}Cne0nfbOmCvuPIp(vHz?Zr%Z33c$N^oFwWZ_h~4XP2%vs&EGp1Yt{DYHQwI z;S1KMY`@yqmEhqnx*nThXiGWNGjHCdz#ws3Z#kGR^mUPc&Dp{9voA#vsGzW*zbBP& zIr_-Yl9f|(~G4(Zk>c9BnIa(3}c+R z0Zw&c?|5;GhJQaV;mlE20+3Ci`ubTDtck^gtOD(#|2FvYGdQw>BKv>h^a}kON z;cQFp&55vMkK7?(2XybaUHo>arC*9xzzTquBLr4aFdMZgmpO04xVa)*vT6IOL27gj-4`MIa7_NxnN?u)PI$#BeH+ynvnAtjWpQmR~AR-HJ&F$+Og zZz4DYyhWI{qp#aPX1m9iAiRo~tS+iJ_D8R^?`dfV-A3roAYpmzUCb?&vq! z&GnN++~>vb5RV+pFd~ZOWjfJKFNz0Y;YteH?($d6df-1hc{g58uaje~!o5qjnk=Tu zLVC;Qp@Ma6rb@{J_sLM^f+4SE{vFmJ@=6#(b`8 zU0*-9rSze}wsKvg|3jfP$2>n89|qy`>K7nr3{@1+hEubbRC{bLj9@g@JdP-|2bE*A zYO6U%1=%@Es%%}+Sv3ps&jkF8Gi9?GnJL9s(%AV;ykHrRLh z_Jbr1GXvvLo=cn9i6Xk2H>@NdUhcLBz&OJXn5DJS-Nja8HJ1tdKRGSNP)9C-&!<1GY1Q}zUwLv(aE?@ek2(b_KrJEae}iVL zUv6pch!sL_S1oTDyAy$HzY4=gI=9_Ea~pwmewOx8;grpS{Oy(AETWKD2dTwYOlSYWBln1eQe}Oj!gTza`#QTg;LDglGHUx)TTy!0Jr!u%H<%7 zfCX0Rbm@N+O8iR7pQ%xfyaKDH3@o@g8D;%&B>m}Ni8{(?*j~RzsO*74hPq{hRo6pf zi4O@pH%oFUI0KL|BB}?nRgga1Te_U)4iInpZ78lCt5DSXMUzGKh+U{6vFrT+;2rvtJ(CtQ1vJ!?jAVoPNM;LV3jj!$QtI03^-Jjxo z=yPmh0_1Y8nJtM5F5R1>H>6dOR}+zfLexoqY%kU%_oMc8r29ocuxBHW-c02QjCcJQ zztAQ`nxDmC25Tr1WX21u7xLA1KrYc2DA#jnq9;JtOmGD^-0Bx zh6aU3o!*r$hhKz|osJi99`;|Z?T2`BC0Rm`i((trF?Zc+dCZ^iUSXr@ead&(J`y&! z+NYc#l)RGuo&G=j{(-HjyPtyS%c#*Jk}0c zG}$*HgL{ED8u&3*7_Z3BiUId@9boGJaXuRv1j`y5!d{{P%e}Wk&q$NsLmk%uoj@a7 ztyJXc?z?Kf^g9I#*$3fHb04;5C1buyL|BFPX7#>(Jy4YrZ=!E(WiqU~zOynWTHPjw zp37>Qip^`cXk|@|{YPdbedh+e45R}292_`Luzv3O0{v6+Zy7w4a{*Ucyt2-|GF&C$ zBl0%uaJgtJjmPZ0c`$YUyt+$#wHyX)o(NbeoFX)vz4t%9`5qDMh)i^WF>RSvgde===xU%X{8ejpW|FA zuf&&{P2iB&QF&RYe8|gC<0H|N-SZ)7ani@uCT2%e0n^M8uhuDAg3@m2uF2x?cqXAoF# zJf+^xLPZ7XM{iaD#<=SB1s2ObE1#^AcEA1_s7@$8)E5gd*tx%Md`&$@XQl=*1ob|$ z$n#V9WIE7@P{^p)^6s57N6V!p*7tffQ3j+0o4c*#%DEbHtO@nx$?FS(VfEyntu7N# zoV^ZdMDG8kMqC(96$E)@n!p0rlm)d#7s;oC20qyL<*pGgx(D8fo0yw=5S6ocuv)9| zwe-q`0YRJj%kHhQP2*Ko*qQgH>)$?mf1z(^p2Yi!SO7s}0|( zf3SDqOAwwI?^E%hkTo-nx(@RZBei_D5Kzp#wDUxz;7NgguPB#NJ%ETQz7DdfwM`K8 z@U*y#e#Pa^DfhjD5>Q*4ep(po4e8-eC9$xYrj-_SG7pw|+zpQ@-LfgwcZj_@_@;F> zU*6g%Hr%2@BNUQwC<2us`ZI%h(|$ndF}c)_?m`LU!-ARH&6g#SC%QWylbdidY#;Pk zQ4f}m;`HUTXI{EtJ;PA8XAu^hb+-g<-+i%V=dTuKtx z9AKpA5qnXzkR&()-vb~hlikl@T5o4tYlEzwpxk#9`;wEoS;Xpvpjd7h`(n#Q$9I{A z_m z3aA^vm~`$1g};#q-+G!`BAYo;A6=(bs>ScBcc<2Ws3cWB?fx39R@&CBn1=%oVVvaw zOMi}fCJ&`iW-qtLB2GAkR1%M$C&ja?;AD%u>L69~-XP6OA?K0HZ0U@)P)g(Nh2 zOIYeFSszhf9`=3ts}z-uWTjhIc^`RN@3r+)+L&yz9U6{%?S+LUbY~8jfYhCu4F||B zM5gZ?zaj3R%tsOVRcEy&&FO;4-CKv;;1C4?vYf!NX(Gp#wR3 zF5Q+ldxbj`Qc)D`0qrSvxmw1dBC8>cHFSAE_p$NWPKH8O;rkeRdbuVeZ_5y&GWq85e7maXk%XO3f&jWSDynR;{so^}k5FC#=j(IL=uMh;P(qzc ziWelPmz76zwH{q-Mw)MFCo#xeId{<=13&TT$+ND?brNmn2F6L_Fy; z?+rNwsHo?k!pHxLa1aK3$?8?vFyIo*(2R!9J~6c_Z?x(o=n_De@~~yB^2#A@YsW6; zQwqZHMiKQqcair7EhbwhtmRS8;U-d8Os3T_B^IIO(o=h8Iq$gtD6k%OUSM^-Hp*pz zci~&y+Km3bVPsdXh~mTR-JtrwnZGfnq|W&lagmYsv}`>2u&TUUsx3{Dg|mdS8^J`0o+^^CGI0|&czTqfWz zg`fc155XIAM=Q<`$i6CYFHJ~YQA(5XT;wYuH>j|S`6A%BB%DWkseVu|j!$n!_YrF{ z4ejo_!Pi)R9O@^Hw!4PpQ(Ak+Wub+Ra;f*eS)J1T)#d2mrAu4#b3dXMJ) zZ&htqtw76-D83x;6eFb$&J^K{RAmi2DYle5ew|ruI^ZO!aH2$(9igjL-GpNrvhX<$ z(pu!N-f&b^dkDs4j|C9O5 zLh>A;%J8X7(WYAgd_B2FF5Gf)#vgNKPZhgzha$ZC)3k2&9!SoIa?z;VySGh?(htH$ zXHn6ydb<*Y8f+%e7<8tSoNv4V7zqx&+mSZ`W}?l~;1dO=7(ka0BmU#G4e2+F0E_*s z0CH$*Fv*kR6>0CQc|ym?sM76fJ6ta128U~7z(?RM>BzTxzDrOlTcE?0r*(5u{ceo( zBTGKC#fvJO@9EF`R=WhUoo6%2ot~Qt!L)2` zud#h#Hy$O1`Y}Jo;cR`faTkayg?-`8ji5@Bew&(E?Op4E;Rwrtx^b9U*gbA|e0;Sp zCo9!SDiH!|=q-VYXcL9v0JEGbbZ{5IqjVOzm_E}FCQvRYpjZ&J^5`mf#DaB~ z^7eZ=x5<9{Uh`arlN?YN$49!O2r86TP%g^iWamMM%1@R}+ZrFT%;yt%|H=V9I;6LI_(3c{9E6T0 zOdwO#t)4-}KZ@ebhR{Py1FBHv=aFK}cZ)%G#P-gMd(7}cx{!cbsqm*AF>FZD?ycEZ zsZjz_Kg67Y5e*;9iUO;HF?Hv-#ux-CJ@!X4tT(MyMje4W$YQ=>afOM7Irv4VRUPXI zO?NlIMyq)Ei6em!(|@?11_)tyKe>lJvA`ky)CT6C)e={#n|&a#L@<$lGNyKN^v${I zw+w4U3b&&Hh0vdPRY|HPdfv2Q+&829dUBIUqqo`A$4^hcpVw|5*S$UZ{j-fAN>9<7 zk3n&EfowsHW@!@!5t1C%4Iu*=p&)`@Mr~hnmsFh|6Wic6|N1xzZ45q?|Y%e1`flL;Prv&YHST9xOI-*?gF%@>@J zU1$ru0e~b6zO1D0fZG~5u2FYE895y#^b5A`LL_Z|#}LZ%oTB!J$p=|I1=yWh)v1FI ziVKZc+{VvD(yCvE`=Ifou=>DpXVyMl6QP7v@Po7^c-qz?Lt6f2#H-pJ!=6hhr? zB+0IaZe=N(=UA)zINw0$=&%Y&Y^3847rhmpFEQU1CO|EYjvrW2yfB%T;2yAE@df*h zz;J;JL6sXxtrzBLFW(4BaYX@f@U*$7HmlN-y-g*&3E!R;>EgNNY!X?aEOQiYZ# z_H|>WUs1A$tek%L9rjetU~i%}C2ePysnT_duauyv4M8LUQ8wrg(6mrqy9-Kp&_=6D zk_KAvV|a`~Nzy$w<3`XbEZCS?8=oSHx1tYSr9BH3bScvJ5!bTbPAY69t1!*D@5#^e zOi)Yx@XWZ4Bn`j^z5@vg&bZg`f|TZzTNgkz$>x1lmUoaZqB~cfFAm{cjM`&S+}kyi zD0rJS{kmdrdI{>(V%*KV!!1wzMkXGOYZWG;=Dlx@Ce{1~7mtV?-V|zB%wezg_?W=7 zO_jr>vBpx}U}7%M2tN;2Blb=_Sj8nkTQZ#FC|pn=-dpf}#O&+LMFKXf<%`n=BVvc8 zckEd&JbR1}CSiCX9YvX~0H_X7__FnW`*TeU%5D8ZX4Yyr|9tE$#S$zT zu(b2$djcp#!ESDvz-HL;)VM3&469KRi;Qz!#ZIR0c3(lKW%3ff`|j>pP;8Po?<#== z^>s4+^oDiLcz)zOXi|{WnH6$yFb0rPCuv>r^{G>n!L)Mj z1Fya@mq{aO*BjZ*Wv>NP24V!eaB}#*Dg?7rj4wPV<;XM0iP49pV5D+0DFz#yL7@-_ z{uO17R;9}cD}Yr|SyUC;OA*3Wh^@RJn}&AtuA-*ZvObbs{#%^pT@s&ZIA zj1VY2Kj8~?(fCL7q(Dw3yKRR&uo^enXD-^1gOg5iC`l~esQZ>-=d7nmm#^BcgaTrH2roEMNmgM zT$=_5gSr>K#6Rqb2LJ?XFc94C_AsxlEj8UD<>y_f#RC=uZPN0`9HC~u4}Lx=M#`h( z@s zIw!l6^W9|C{S&lWU-hEzuAS2Wr;y4R(r;$;yvF?(9FZm#B_`!35c8c9aX zZQ#a}U7$DvVu)C0Dx#wf!6AYbBcE{G+z7Be?wh<35p?&muf)z)kgA4^Ug!&9o(Svh zP0b--eORyHwg2gwX0jP$8BbnwD3ufAYkOHmO?_NqDR$Xc0{HX-s*N}ewR=qgSNt{! z@j!GR19Zo_nfLCqvUwH=MSx?qvp!b@yH8#H+_ir5Aj(b6HC+O4$CE3gvs1Bbpg0+Xnl? z=jPt;ufMLZdZCJOU8JJuLSL|XK5lFKB&vJMcGkvfPa@1J3AAM^bD-yzW9*1#L2ht% zeC#8JWrxq!L{U$kalLvA4^~g^?|HKRc8=#EFDOt4jTgkI2eK3|69=Y_56IvL$dB1kENkIVDp61L%GCG0&1fOQ!`c|!!@BfI{`@XXw0S->P(yFSv4+gMZ9%VLT->hSoB65jkCJePBrKlwquOU^6nj&Fde`}3xtMcdW>Qm=f6cVtZkpLC)# z?p-rb#Cl2%Z9cXMHY2%zh&#OjeRhAt4r|{CKZl zcbrU}Nm}qYI^v=T>l%!fF5+4{2@|_G_3m04EsaKDOKthl`wrj0_cLn6--;@)Rr$v6 zYt;1Pxruj0#=ZMAbe2dXpex{=*L%rb&~<%$q5M4dEW@2q+Z4{ssM1?`mpb%dRmUd< zwkL`nQCn_x%t?rpQ#;JaVY;+MbZ8k514=+?PP&P=y5guPU&`H~$l|Dl!|vh=hg`lC zhyG$CBW%85Gie-5gka@56lL`|8MXE+tfbGTP(+a@&am>yJM4>W@WWhJXI)?eU8={P zwpFW(`>vqp(^N&MyPMym%^6vx&UnY#qq?Xy0+IvK-JC$CIH#OqzwC>v&Laf%kF0p< z`H$vLghpR4CX6o3tJlu@fm^jWstSmxuy;SpyBEI5k4?K0_lj@dT6qrWS2_v=-wlRnE*pVH$tqy{3`9B%IJk_ZO+$wpcynvi4v zJ-rIQwBx<~RM`m}s}t3UTo+>uL_+E{6X(ytT%QR$YsR0rU7!iR$iIKEzv8BAySsO? zOEAIivG>AY?r@U)lR*4icemYvJP$YS!;hRU)s+UboomcvNAcEM!8$MPwLB%_S_BBC zz{NlmbI2pHcKe~;R<3VHVAGe|_Tw3k#~lTU<=p4xgQ}N%K|^Kolj-`kb!leegSa%o z-GER1ezu**(Q6IN{Cb_{u{)?%=&BFOT$^{S2CeU??PNF1R&84_uee$mm+fNXEu&nI zp6ZgXUC6e6x3`LtrAox#%2r)lsW+)Ik+bT$nZ2m(v4z(#;U`eJ<948J%^SJ!!ehC5 zA|_bXQQi676R-Mv#x+b;d+4*i#yJ8Od5$EX_e?(-Q!zhS3P><^q#rKt$AP2ZT|U0 znSsv76s;~?==OnUH)$j4&_K(1LeyWno(J(hxK?t?8h+b}=Pvl(mscY;{GN<=Fnr~$ zc3pQH6SQ$2R2glLm#ff6`EbQ;1*}!D%b~v~IyyJWIM#5dd|*H%@IX_acYJ~QK^c#x z`!f1OVOA~yzB`9N+Ny@5iBnT6Gm3G7%|g5f$(Js#ky`BI_eKQu_By*tgHDr-21snO z1Dic~)uh=%TaDKH?e2D+HznkkX-l1bSxRR{!L0`!9UU5o`)~h|*CMZ8DSsrOoa(faIu#_SGAN3K6eV%*L;6$?kabt=903mKsSrHJ?TD z23?}PRobI`3_^I>_;;R?*R#)bk(gJ{>m~(r!3ZBzZg#Fs^R2vOl`-Y*o%f4Bhy}CI zA(ng8jWY4rEnDC-%#Qn$9mo$|j(#xntk2JTRp?9lS{sm#PjWm04BACyPl=7` zA09ZC_%V;#i45-UnKy7Ij9@w}IT;!XeY(k;RLRD|F%(^i})1teUe zs+b5I@Z&q)-nJfD)`_!`^UKjHrCz$vOEJ?(!b1x#R(5Q%JJW%Fvbis?=r&!#?1x0+ z%tBZ+o|tdf+G7oJ*gkkfCtud8W(hz0o0yF#mu**o9d8%HIbO)Kir)G>-G0}5Aa-v! z|CqXKu1X^9N&JTO%9d=8hSaJYlHt+klcN!qt#Rd-F~ir0-KQq*^kt4P9wFxs5QVyx<1BB)z?dv5o2=)CM1sUvTU;> zu(Qm=hv7CmAuu5^LgH>HuiKR5h3nlEc?Wu?y5{$ z*Je6ian;F1Q9OGAu2QI)c^%`1D&totcVkhjH?7H}A#aaZsPzR_e(eS7fc!rPg*Vr$|@Ci=-^Z;Mxh>)J?Kq+P;0T z*L^|;MDXo%2iv#t%0B?Qc{b4<471e*Ano9{X9>_HO!t$>;0jM6v(6m$b-{Y`MGd#X zp5tc+D~ESFDZI0HOY4$Hsgj5hCc)jr*I;cC|CVe1I<**VAeN&ooHCEWwK@2pJ42f; z@@?qC2G1FYwYVOlV?(TU0b;GIPq5&(;tHQf2o*YZ;@&8;XLoowIBY-BZ2llOQJV1s z1-K2joKyk2@ARQ@+QVN`&|c7VV+Sw5r>n~h)_v(be1=b%Ndb(yoCpQd-GH5pp(!FF z7hSjBH+Lr+wcpWVzi}`muZ107y>dYHqzsaKuGoVL`~mLOQAcmoPLD3pMHe0&FydaP zxDnzuCFz=p&aGqHUz!#=n3kE-t~xbD3q!E{@a~b9&;+jG0*bAz70W@>X$3^0OfF?T zoiLsC#y)mKoX$xl{?1_?^O2d;CeLhVdAt_j+P7m)_sh20bz*FSyAIb?Ccx#lT(eu% zFH0dtpH1dPNCrdkko?l7A%6gO&b3TH+jJIT9q>>SS1CDs3gD)f;hQGpcEa;~+aK(u6ATF^Fj?9DA_uut`=qwM3Yc?6B`-Fh zOU6%vlqGd<04jF=l1@5{@b)6O=a&1FRb0XM);pFZ;d=)bcn-cm(i*Vp-5Cc8_zGwd znf8)TaK}zwd+;sxpUhM_`fS3EQRAdXAg%wZ%VjcqwR$=>0e$r(MQ6S$7q1PvBfB$O z`Sv(;%UdkUFKy_L41rVXfZ1O7!EBX~Wh`G^6#5#TEb-tdhFzP$eLZgV5-`E4y09Dt zOW0k%?g(ND?jMlg?=3aA=V3??+w=+!YzmiyIkkPe?e}zC_#VKw1-?nA`}WtJeyJin z9@cOZPNXk@@dB(KNWd2bwi*8i+bl`Bmb(*ABDgg#G&H-t>N?WpH%nrx$!*s$obLes z=)SwD_dc1gzCVL;Vnx=`kDg1D_;{*|>GLcvi7PD62eLrj1ZO=90q;B)5b7(1?u1+3 zTa5qdOu=O8Bq13^K4tkI%V;Cun=7!6E7P{+$@%)i=T@bK={)su$mGxKB{C8q~`xi6t4&?*yEeVKfJb>leZ0O9$AZZfqb2?#6fF!Q#ucsJ}QsUjwEmv zT%AZ0%9H-2P7_FDhgb*SFHPkd;K$yU#9}FED)+!G&uwOe0oS3ah(k)0&BPL};O~N| z6khYwKjpP6p0&qqFX{>0x3~1(he$ZXR@3@V>~=pMxC=0-Su3oXYp}=z!aRa5g>MEg z;0OsfhJW*Cd&B`>Je_tRQI;IVDls^q!-DPo!)%tIR?07OU~>jT+Z?#QXf!koYHnq3#@nb4eqIW61&J>zSz3K7W2pc4EcKjeW_8K>S>Tc6%mrdPvj^M2nK$8%D8 zeQkYW+gWqRfO1>Lrj!T;kiNz(C4tM&zvb@Jo%VbJzJ4!b?=|?45XZd%5qz>-UeXQmKG>BhyT8+Oe=e6L3!LbF zUhsMSi?#rYkR5(1ApVOY1k;lR(=&@n)mDd0mf^-NX}G#PCDgwqW}+9E`Xx1DO8A%p zKsFapdf4C${5Ovv$pzcQ$?IgP3f-m}z-sp7S4ddL0_NyzQ%nb+&sAV>wCtU(`NyX; z^f4LW)tX=ltYS&h1Lc!b`x$QU{OoOpKx5M^uG54-AEX1atURw8OGp($pCkhW2tc$XKsX0f?X@#~;c!a)jF4u~dD~901wWuD!4Pz&>Sho{ zJ)x^O``D!1;QS*67JoY?O8xr+_8?7YMMX!(0*R?j3O`&`|Ll#4&|P@w*pD^MzGDF{ zX|+RNdZq~&Z{soze74tsEccFoEQZ^ytzeauB%TQ0c|i=2fX>-9zzX`tB$DvK&)x|i zQXEY8p&)z=;a@RZ5RrRj3V$U z{LLd|%iJSpga%JT>Jm ze0(u5K4U~L5;T4!v_Wr7GoF8&_n)5BBsdqZskYhv>_vaiY^S{XBmM+LP$&Y^N_wBR z+YG4^_cKNE@WFnvYr2s@G0y&0jK3A*Hv##BY5qO4{Z@v*mEmt?2v@AXtwi|YeroL@ z|G#b}{^;cWtqgxF!{5sAw=(=Q*6>>y{&ti9#&Lx|`t2tFc9Z{`#()A1zvGAhzl

    w+BpQ5r&|H-pukxWrFD-k1nj81TKfh8lgLaBTcr0w_X_d`KzY$UbH->D4H4e6OSX1>szET`BHPb9M z29AKb1tD12XpBzN%;1v%y`el<7di3c!AT$f)AZn28=BJj2!yP;Y0pYeXOc}qw!Lt?us4!r*K$-7jcBSiZ zQvY`v{>#7o8upWe0T5$i!u)%toFx%TX4^2zCQ^g>3EWhNQ|V`P6%Ga|bhFsZc<6(F z;%dNe3dvx+YiXI(&{|p`c+v{C(su|^q6~P4QKxL5C7_I%`B=p%*yWc}+drEUAgdJE zK}x+++Fzm8FMq~F8mvKMv!C&ozws}-@^8K+39vLYD3!9`5h(u=5(sO6T^WukeejUVuYW=NR{~uJXo@|IvEebyB=V}*6eDw5i_z87|X8f4Z+T=DBFc&<(oFA=i3RQrY zFDWEGJ}9kwO&k5~AbS?}c(pai_w^M7BH(e@BW`m4ih<-Ag?K2OpJKWQ2d6%~Y<)7r zhGGw$!NSrAE3l~4996inFIIQ-s-2?uv^WSEljcs{j$yRz9ZpYEaC&y0{gqciC0V45F)iKZk5}5f!i}iv1T~d_T4S&T14! zIxB>^^cQUNK`FIlJKV1DyaX2Y7a)F_hs%>9v~ROdR6Gld2)?8}q5>?~mQ2f;I4EbyX;xkoRA)dBTPkCx$8 zd_S{4NX@~rKKzNPAFcfhwE2MRPZ+-S$=!be+waB){SUzQYvm`A^XL(~%~&hA)AeNv+TMnO^`u&})jQ8C13;KXy}M$Z0{<;y`cj`Rfm zkB|spHK>RcV)zSy;eYf1dfyesahJlmb=n#mK*V5@Gt0jgnxF*l>V)I6F`qJz9|wOg zavMLk|D*nH$LbGAIs&2@)|$Y*PaIo4F~Fqjr^?m&C0Bt6lB;u35^#4-SRSy#U-0#1 z9(=lwPA%@Q6ywLs--|)Oip9^n%HQ}ORD8ITatCFpz~5F!b9N_h^LriNkHicjtrQR~ zxujVw1XG|cQnpI@zU|@PN!A(9?DL1hEI(p30K8v;{RyuJ4D-Dd1n~7!ig6b6IioE7OD;^hSRDr94_U33Z2UOKD10BzBjJdnwUn~bIp5^R^AId-h6@|#@>Nw3 zg(_2u|0ACDck=u(5s2{(ZaYSJrSU_+*MAmySfBjx0pM+bu3v5apP=hWkaJ_AbzLovdD{T(EHT73z?!OcTu)_pG{9|o5M+(^Phbj`V z!8M#UfuXtaVl5xQ@pR4UzgF7XfV}HD&XRlg)a6MAyYjbU25EAt%WDEW{_&0|Z=gEB ze%Q*-bRe8L3vt1+e#mO~P|G~t{#pF7WA(2k9;>bYlM)Xh%6DX(2+mGNCQa@9M!d?jOq=SFf6OGokN+h0v)QyQk z-OM>gSc$t&7F~R^5Fgq%KrP6miix;iq$X3gR9#QAKXZA3$`pdvv+# z*XoFz!T5clYFqX6mlvgfhj_MbHumq3^8E*qcK(1Fo<%?hK?q$hkpVVnY81f4q54*{4JsRVtbX(W`j!~#Zal;PpqLv3 zJpR@b`yKH3Q)K@uul#>E;9>ni0q;8&;C~zZfX9md>(YN@m3s03qc4U%4)141?!Tw# z4~P9n((@Bj5H4Zx&**jn4KO1!EA~r5`Rl{}6MyR03GwnRFkyKXmY}@{k zh4v@yezZ-0ebo%Wd6;zCY5$US{_Dg3qnI5;qdG){S6o(?fX{Xu4|>=okVG+Q@xIH{ zK6MPYE-nogkn?Y}kh^e}Sqv5CpBx_yjFff4jeX%;K-u1M)%bQ8i6Qf^H)89Jlvuj- zRaj5dTaSAp;dXnGeP{IyC`J|k_~`rZKjW7~XHN~QYED9r!*%xUy+k!+!q_zM(vD6Q6*9(V53;h*HeY*%SJ?{$rV z{{md{fo2)C0niFR?X4&$bqj)t|m{0O4i+~t7cA4 zWs!^;{oJ^q{b6`N*ggj(fcXP0gV0Y5wT3aKir(fu}hnWxLN~Ov~PlZVk z7aUKwJ(s3a$u!KlH~%Ru)HcH7aFV3ZVR_hOa(AHin9{0d?|y7(=vinzV9HXDw_fZZ zeOm!ya^2I*`eEL4^~$Ri~tdh`m^t?>ra6mM}elgm|$GtCs<|H6Hi<>TB+F_ zS2VlrTLzSJ)H&xzO7r+PKd{%_Kv#1^2t^Q=l7LU5fTC`nK>DNRg>Q7%7p?mwxDEP3 zrrh$m$olYedR+6)kvl@D{(xm8uw6ls zAPi__b-{I@rT;YOz55KCTJCD4e@kFHbsu6aLY{|Lkt$vH9%g`!gw~_T$)bRA+LC$x7`W&H2n^g?i49-a=4 z8UR!|i-C>naS! z%>?BBvmHKCVR`YUb{ z7I+utBtmvAs~lk-6CiS4s@FR>jSwZr0e5ZePKLTHGyXZ_Qq+SZ?b^un?-V@2CS7}4 zitvx7tZu?4R{zsp4sopyJR` zM6(%%17#9GY;m|Zn?T9WubC>Juu>cvLd4hB=#O39k17h9g)ZTsXd*ZA1qnjp=?K=e za`>cxbJ2>W^O}J;d$tah}sC-oj;2 zBL%%Lx17jFO0Dn&T54@)|b>;|Ja%GV)@1F z+Ur~?qnLo&&&JR1Z!J=LAz?U7Vcr2OS_YFJ4?EKEJ#v@OkyF0)jioMM2fG8;58tQx zvo#4<;gq=_RS@#pNp3F;GZzEd#3DwzgpWaD;~Lkv#+bQo<83L1Rerkz@YX8#$__Y7kTCQVWf|RvXUb>LBidRp z`bnfOQw$~_y0#h>#5~hV@ba(JQpOlLX+7nlGgsfO8{VxNdr=j+6Nqf(TcM;d&`+}A zKfTefZ$6_GCI5sw)1qJUIC$m$+Xtp=EDANuYc~3541c)-XW?so-1E(w=~~VK`t}-fq8h9{KJv*d>a#BN|Qy zM5^FtSHf0psgLYqq?EwjEp)TSE4>N>$_W#=oeo!5s0~W{yVY6J4y>Ic={SG^MGSus zSHPgcrDIOr(+=c%OcFTRS8VD?_U5gynTOcGhEpCVMyWTF?FcK&s+Z*1BVs1lhXZ37 zF8CVpy>2Ket>odWOG#b1w#|9X8w;q!3tb7h2NlCQMu%^`V)op+5}tY?Vlc`{=CB6Y zj;IaeX~a11S=_ZYY+FCs;zWSf=?$K=yBdnWcv0N@;Ls^{@0lYdYSBb7k!#lpn_V?OY4DSOfts`QiV-&ut(%#82xZMG~k) z$@-?E;sxN%(|I+5u{8|yG@tTr^m1=y;C~G9rZ(t++z|MLwmKAG;HS=dl90!p_Q%XF zeXrMA`Cwe&@*{HzbQo1*G!kr=pBo);U;Yt4GtYZDv*rnp`cPMnse7^8 z+=w!A7a7Y#wU1r^Ai@;~b6?^<8^Rxs9V~K~iAmPVQ?!v(j1cEq!MU$oCuds%gfiP< z5O_9KyWrsUk72>4LHlKw3Mu?yYdt%5HB4dgu8pcTuE%W09w(976xxmA&Z{`$dhHF% zJT@M3dR;=s94_IkCQ0~qdAUms&T7hF>>wZdB+ z!1Q|R`eov?LXC_oZITWz|vrg=|=NVor`yG=YwidT;ud%PZ>lC+kNe{B%pT3#`-x3ntHv zM(iM8wMNf7{J@)?bf>gj`2%~D7TM$rjky8L z+AffW74`a7x3_AfD9BbX&ejQNQGV`uOvj^kCPg!6F8~KmCl3{=&{JMpjvFUWZDmU1 zIKn|Z)z&DOkf;(bA1Uc-CWY;okKcEu!i#DrF?km~{g*n!MC92WcIgr6^oh0$vTyKp z`0;PyC;5=uULaeT?B!7spSd%0i^X*=h>ipc$bN8~jG6f1^TFveEaKCB&Qq7AvS+;lzPo%ft%l`CTa!Wn zKGerg3Z2sIww>yesJa#FilKe7iXmxzV0bmm4UDM!6NtO1W9z}}vI7!=-O)0X-Gci$ zrk;3`Qp)$2xJodOv|l(twN3CzjO_h)sXDL2wBO|hNY>_C4Zo{u7q*d()FsX}E7jrp z-KTK2TL8v5309wN~a&6hK;-m^`p*J`|d+eu+QXRF{`n|DcHy1vYAF}vie zAHzD&&KudHFmhMJn9%^DJ=XP<2>h<@yN8#k zCm<+Z=~c$!zNA0#;rYocbJz2gq=+qDd2G`)1T%-N;!WPvM)@D_?c^x3zm^c~+ypGzGEvcCT(gbAa#zt=m;5 z?Wq&lo9EXey)Cea>d z7WtpK^W#W2e68rI&+MwKnS+oI*3FGJvpLQVRhb&=Nk@n~nw_O)7Ux9REfk#pjlnqeJNvbMYHSB&dvJx)b4EgfTFP_ytsgI~^kKTmnc>u`&K>dSeLk4d?~HAixx=HL z`q-C_r%S|n_=$QlsnN?AN=67WqjhXkNzP*}T!E%_U|Bs{CJ(1 zcj2l#yg^oIKgAy_7Z}iX*DKYiZ0SIt_znXAWx4%RT+;~<7;>GtNvD=P%-<|q~&7a+^yoXZ671sOYvhoiP{C3 z8KZ!UhB~iD=1eT0=(LOL;-d9sNML-;9Sq`To(r2^5uZNOFOXx}o=fx_X#YS=YrM00 zXB==d0k3@$ZMCJWjYqD)+b{**^@UaN0Ji0*<eCFRrbh(f;d+1@-own z=;SzA@HIJP?mByKsqhoH*y8>qU-i|^!9=&$WwB4we@s`<$jW$5$R|wU`U|Y(gpzq^ zquZ6KLPg9?Cd}{Ny?gw*s1jB#Ky>IRGPu}asAYx-TDoL zO2SUd`(GH%tv`=qB23g)K2^7PEFmyj##=s3x7g1%ULllyqC4+siCWC5&7Bzr-m#{q zQsO9eBOJf%P9qjliF0daCw%M5sk8F~+Mu9l`pwpWseO=cTTOHcS4XP=s}W*5-gfrg zV=gA_ZM0C*=Qq!dw<}T5Fq?f_hD0n?Knr-l%Y`bcp*T0)Z>o z$7hqAObZ_K@%omW@AP9|zg&1u!DSrvF!9tv(zxRMSSwSnw+>r)b)oGz2D|*dUg`zV zEp6p$9Bc~Dg&rQaz7{DNI)YE0;;ihoWV(T1q`ev4*{NA&@@fEw`CdsBu5 zN|!RRzo%W5CR;m4y*%bJY-}c&+_f&NW;Ff5#j}d&M)?_rR(Jg_@vjf4z3au zzq!3T(xnq9n1Ogv=*l%WCEhGr_H=uA@NDwsHmL{LbUn`^T%WUUMW9fA%`QgEncIbBFF%ENp z+O;;`cA5$*m&Fr__XSEG0Ke1ebySu*PQSuyb~HW`Q$63NWpR&U%X8nBuEx$!y5f{)DC25*~i>?y!^Nr6<8tzcA$?_q%GZB4U2}j?l1V|61 z62U1Y0{iQLj+L$OV?X~?kNmVFHzf`8W4IH;DS43V>N%-)qZ*%p1G8C;#oZy8W`gi{e-zv}gMPaZkAmq%ZrXFJ~^#G6B~>>yt(TXC(-{4FZ#~RLZ#1 zc^3WrG~&}`*tG2qLuTx*RN_sMiMGr_MMnWpyX#zq-+UMdsx(i@!uXUErK3$R?u(RN z=$pb8JLL?2NmNbIyd-KfqSrYVAv5IWDLEwFUH|k@1s)3*{6)#$r)M7Dw)fZt6a;VVo#+VN;Gdm22$`^gYQVI*}|0P2aK?^Pwc1y7HJ&o6jq-wP^%3UDNv1`8J5hq;69}OlSHERkVBErGN!0K>@|A*{M|3Uf zBP9G~MDCUYt7B#tPQh$^A;@b~^_6O^K{dvuCI6;@L4xho3b6lLlu3N!*o7m&KQSd| z)G2mqZBta3v)>J?7;5?8Av1wr8&u&M^Cs(xTLvP zPQ_`Ly6HqXPaf|qv`sRf2VM+AXih&ML8i|QDda=*?%dm{vW=N+G26H6lk;_xFBx&xgHQI?KNg+e z4;bNkqqodc-(~GmpamN1s}=9Zvnou;$h-im(&C#U?x2lQjjDJ~)}Bxbb$c=9`xV)a;AeM8rT4($zC{QS8E@>jo&N*EJ?LUu`@1s zpN!Y3@$Uer(%)?TMy)hbeh*lRW6b9QnI%q9km&DXov~ci5we>JdCkr81K{A* zI)bzMv35eNyenAKWwV;jl$uk|6oWjXFOfz-h8`Yw0TG6a;#w37~IE(%gX2RxE1C0WAm89c|6mAJOw^)^J3+TrsnUvL7N2l?Hzhas6!I z-K#_ZECi!S-ok%i=IuUm?F_K`{^mmGHF0S!eD&hr{c=j_b4G5n3GqI^wHkz_PtrnY-uM16 z&gZv+^4hV#lOWAW#yncSg1m2J!o<}s$YTa)%1XQho<`6Y88@>hswO_1*@3y1VOU4c z5fTE0<hI7h!{jGa{wopQ}8ZAASGw3a-Ue?kLB8jL(H+jY9_W)J&o^K*EOG z$x0yK*SE#!sUP#f&|^1ast=8opK-Nv1s7m2tSe5=3^|Yz@MdGUW4bOgvfZRs@G&n( zKFO*;!1Oii$!}bI?nNnq>#+`~8sah=Df1*tzd|yr&71VC=P#@HAepB z81P@kEWYz0^X;EPs9RSvr=m?G^;hsmo+Y|0bY5?YIziga45L#P7G`%jv}72_r4e`{ zQe$Yi8m9NFAeV&_phZp237iz5R;$mIn+IL-d)VnZJ0W8Uh)r*m34fd~X)_I8y93PLTy^F?NUZM#Gk-Eb~1T1 z=mh{{;ZRIzK_?%~YfSEPiVve^yEv_H@xc*gLq6>!P94fLO`R!}IBGW_5Mw;0GA?}s z@{&MED_!OWaEx>2g!uIYz&~TR^Ooh%;jhm}F6q)7+!t!Da>L2X8o$=g@3gY_* zEr!n`Ae#w09#ekjWsJTXX6)B>lB>_Z-P{@6$g?0CejP^+2GvV)}ivz1<_ze3eC z$PLT|x=|bGp(}R|%0I68(6Cw!Lpla1sB)Go96##!CnqleZI*d|iH^{PYK2CrSx7|+ zGPV+BoT+F9pV;>~%1JH`kPezc01EjSF6O+qEnLhVRTQcoY@>=r!ij@tA66Q$+#n4U zdddX}L6s@gF=c>mANFc9A#|Ch)pleU_!FTj-aIZ*$h?6Gna?3sT7VEKG)_i!XB(XW z{McR;*0Y8E8(UMlSi6P;IqxI-)Hn6!%iAUq)K$lI2-n^}-3Plh?@Vme5@bHI{l|A>%u?ZW%%apOB875c`lrY0|_C@pF#&(RhE?B9Qsa zLjJc0OPHxLpM7hO%@l3yw*=rqrNFi*Ukg$`3!hrehi6IrXRTswnnPiukfWwzH$pHQ8~^v$`#w17N<_t0b!=u z2B(6$#(_!asXQ#9MdEw^0%QB7__7? zQkn)_sqx4M$md3rchcl|(Xj9%m!DAuM{*bh14m2fL1&@!+75;3-BT8D`eu8q>kAgl z8)NPw#ZV)@HkdDTgp~fgEQ@9a)Z)|HKZ0Y)!A4uhm5SZWtRBo!;a+o?v@sykxI0p5 zrS*Gm^ruN|S^%0dIZcVuPD}i_&1BEzsz4SC=X*%R17wwdnrSI8^cm*eN$LWP@!X-l z%`!r8I_B`A)GCdnTc9dnUuQ}#)w$c1Fp-z5uaYWoo)X#G2J+Qh;>%cPR(zO*bDMHK zfVD@5464o`W~`OQhV8Xp6x7wkS^N8K{lg$!)|(ChZyE=wSe2blp-m9Lovw=xTjoJS z77VJgH``-F%VGhT$ZKdkov@u_CQ<%I&8e2AtAi4fqEm?3sClqY603WgWxgSnf^~F- zNqy>aB&8xLI8DcmZT%xE@8Rau?yP06r99Fbw8+mZdjj(+4@Gdl_6F9t5?6v~p`@o= zz*95Qz%WU&vhGVr4*{8&u$orBWwg+Zo{rr6di_(lT>+gCBWs@vCmoecO9LQZUFC7j z+yS8AV8lI&YvUa*d;saP-UNc*J&16O5$k$UZzI_c;b<7W~#+x$QJ8R z9t3=ZuEhuQfuPdzO}dm{(r-y-XhrrYtfpmI9$pQ$6J3|)24Wt?cxTv9HB3Lv=e6^c z1I}SnO^1+%T>EyF&OD3AUA!6%i(RnkDWoRqX}bOkPEc1IdUJOx5N$gQx}P1nE)S>Q zFAb1R{erYX3&jnRKqxrxN2E%LCyYEY0L)bA%ow zU(#>r^oYXs65|#qc=az|(at`(bjRFYV*C zZ`c)l2-GsgG>1_UY-O1kZu>d9?P$Nt0a5#xP;A;|++R{`J`Q^)pi`JVNaSg6@S1#hSs+o^4oBTBC1&kBz>F(#g6hDlj0uxcB>C80rPx~?3VwvYD$0Ta= z04QOK%7#cqR9}XA*>pUYIkE>vh6X)m38SNC9fH;EO)}090vGM%yyC=2 zNe>w_@CfIvzPukD5j~`wc&Y`K!W{P&qSWUqkZcBhRGVOJ**vQmyg!ngCbW4H+Eb^ko1{ z6=o@lw}?8;B@DfLQm0|CIQ^+9>$*~RTX{*p1; zT~a6&v2{;`VEs_i)d?G_!m^s$c}6h+LK%sFu;(`!Dl$RN9YZgZPcdWGtGt<83>%4QEx12W4X;$YI@ zVdoyr8E;Qx*{Rdaf!0J`4+3$FH?#dz-$X*>ONCI){`QHJ(|c`q49Fj1a>&*zCut;z zJORuj4>_#)lo7!8i=d-V;hZuacS~1YMnwEW(j&J7B>8oK6mEWb8NS@uwNqHb z-QeUCNtD{??YrVc?J5y_>hJt@Asxr44J zOyT6VR#DI>iQ`9NnVqFy^k|diBo(DQ92gfGvjz5 zi`M`$eH;-%n4NJ&^&YTrIFs(c_aH|RgT+FhKVmt zS1`YBkntm>q!wyJyzFBh^~sWUDCP4(Ug)QWrSa3vw>$ws?X!7}d+{XuG^j{szkD!t zP613L#_TOchakA98}`1}J)^}SH~z+kBv6GCy6#@W7SDfIhq5x!MCky+{;wb#u$bE1 zhRtF?e>h;WT2ok3FH;#%Hp7fATLI;%gFURVKmf;GXfwJW%1*WuQO=Zw-g?}aWo+IJ zoxt`@Ux>@V#lA!7Esmi%G6bM7I{@PaV|R9|sCdQj9aI{+rEbN%*b?ocyWX7&touHs zmb#39wZkL$fP{KWOzo9~KR|{XNN`)p>NakA4d~F)9m;s^&G=>|sZI(4s-rcfVWraA z8$A4!B!5(DDA6z?XW(AE0F@{t{r0!54?BJUbZ*m5#Wh<1F7`PLQgutmLvijbln3{& zRgk6Aw;I*-0&*$pt9r0cW@x@08v-1MbIP6&IyiZg`b@#jV#6~G^WF(Gh>3z;8- zh+w3lyrUlYJCs-Hrfp9q5a0UJJ?edJzh_F|Lb;~yjJ8@s*%y#cA;-16#mo-l5w~&J zo0`ct@6!;!u~EP(;x2Oqr#R#FTfT5Ls==2{ng~Q(Ts#-Te-T=_4V7%6*A|Uw7%>33fdw8C5idRvE#C8Ry!SRKy(|ZuLz~T z&F^m8IyqQ^AZ!*ApgLeLhZzlaudWyE zKD069urZ!n4(&Z=8MTd3u*|_)E?{p^*l}y8;u*c(srG*BktwnBvN$Y4aPxhGTI9Xn zjh4pYkDv~BPg3uVN@t1d>k+rr5){P03kWl`Tz^VHkzp-v{pYId)}|T6sT>nkAPf459c=P7 zATrnP^^Uhq1Fw!+OXP@wP`kD%KJ)}AR<#H>yz%%8NHn!5yJLb~e$3WFw)Jg96NmOA zjtG4pjSC*(6vBq@9@l<7^fsOXxoe;)E}u}bdm9;*xM&mT2Ne2eU4V7Ck(Ej$Dm%y;8yr8mSXL0c$~o9rDN=M&^#+XNDJVC~B|M>qZcrhuc% zB|o`uIsvh1S1LD^j)H28hkVPf2jJ!z2@Ua-9H1puUcqeBW1zJ`0)UZd@1cpj{$S8C zHgxpEqOn7dhmB22jXWF^p@u|g2dgp#} zg*!m}0`*&(#-zCqtjvxCLm_SiLx?s43RQ&Sg~_)xpmKmDOf^blQ;O)p7w`ZBkXpT+ zmp}xLQ79n+ti(;rq3e2rN_+sXR_^%+IW&s4^Bz=xfH~Ti)p$NrPYVcyM$0;mO%`)DB;30$F5TuV~EPYZ?ks)gMcNy z3B@a)>1j(Y;GJ%=1A^p$YJUiTu^+-JP8(4FR8=lKQV2Bn9Gh%!K6d@Xb2fqExratI z^G1Wf@m^fOg-_UER??)Q)sC41n(ZnFJ$yb z@q&dMbwWYPlx>~^S%W%dy31Zg=_KbZ;+pG}!PL01UN1;S{U>bA`P5Ux21}sm#^t2J zZ?a16h#rNrYuuUnBBK<l!weg9EenOs!K|8@lg zQ5R!R`xA7VH=Ln*?yCtzz>Ob2v{1BzyiZ6Z@{oa7_Kn`I{#0X#bepx|43{3=0Gy=2 zc$zy_EE{!UTsc?Ptc!96b6hm3aEV?g&>9Xckk;)6eL??0j9)ShlOP?{r8Y~$cs52H z0hKEoE%{U$U6DxX>~o<+m0L#h>)HL0+;-`)1RCcC*BlBe%&DYEb_Gmh$r2wvY713$ z8*6KVERK8b$p5X=1)%95su9)v9ds}9K+6-KC&KZ(tkfVvN1Vc39Lnw~c2-9?jS1tU z3H4JpIQfr}aI+(vVh`%JQxuq2mw?o|3tGMWuR_XIWtwN&t_aE9apCc zhsPi(Cv*!>pj_KylhH^x#oW_(>uR`-1&Z1>pFv>=Au$si!r6xh@72qQIZQ_x4Mahv zPyi_7EO1nVZeKrya$w#YaAW+A8a1$9E^%?p4iTmufpVOcOSm%+h{-O#h7w%ULKmQf zhrmcL3X7P}L8jvCb@ACd&|{{^xZ>!E?_(m3V}cQn15ZU{_GaFD9$G&#h!FGQpz`B} zQ;-3nWCt*lpr>#nABlF+(JH2E!)|ZGT1@TGMH;HlYH+Le^<_A|*_6HN4V09NnnGk8 z>Z#gQl+;F8{P&FIuy5I9gKjI}REEnbS+ZTrJkv_Q`~$goCDQajDw+qKRQD*mZtNX9TL3RL?tT2k^a)s3a z3*c9}3F3%Os0pgzpiD`oJTK(;hX2e}KpYn{uE<6bUZAccT24>Mr8<~xnm0rM!lM|w zc(W-m9-MUpD5qWk<0l!IvR;)jcnx3%+vi3wkHpXIdesbaYowaYD21Yb2jlGE&}VQM zbHF$3YQ*Rd>$eE{^z90~w<-fH8Zq)BIuGLBdpN2poOx(`hWt;m%vdFXO!p1#~C@CF~6UMgpWgB9+96+Rv+1rmv_`_07@H9TW(ryz2gxkt1`e!@c0_&RA( zyqe%7E=d;3iRM#Kv-}hjeWqlW>#;kMLZFDEs=BrgCK$2J7p_y;i?~v>WW0oCqL63} z+x8SK4v2t9a|u9qynr8<#GOR|20X+q1yDQdg&wLx9TIC{cy-hN{>ya8s@6$C*rHDx zCG5@vQnOXSu&yc+pc}Yjq1SS0@g|CM*r{OP4DVAI9^+eA6N;v|VT++Vs-}WQ%FGP# zi`I{k*ucH>V$is#w>C+)cfw*!-KPCVE&8&@!jIj2lRF8-a7z7NMPCX@ zGDp$;0rv3yg|_z{l`xD(^q6|AtJC@=*2))Gyuv2f9@JxRoEtBPZr{g*VB| z1l{N_;RDb95L~ZZk~^e|5Y?X}Jw$FAqT4`tdWw_|i6m3{P^&f&fDfUh*13@GDPjVA z50WgTPCi3@)gD?KT@Smq*uF83EXigOcStY#{!y$%Xr>_bQCVz_;=IQ*3i{D~B?(9y zjg+*tpnnuk-R_hw2yRd^P-Tyi!-LdIcHXTqc7^&C6iAnWZErg5WCVdewQ2!#MF{8v zE*O9e?Rh7Ws{}&kXq(PDgF1K&QtgAl0EC=>c6j&rXmlB9t>1xRN-Sgnh2ALh+|CgE zE~vS5y4!_|60oIis3p&_D1f=4wf-=;w49W9PhU*(83fl|pb}Dy^_$08&>)M!mPTGc zJU7TDk&mE@2OkkiF*B~~3Wc>;a{AHwW;iB6lCF4%qI8M{6U($xgxVl@8c&!4SXb7f z(rOv7P|43+mXyUQ6-{6rw_a{@oXuv4E}(%VhsP^H-4U;TlI`kNBORi!JL^D zZU8e?A}y>YEcj|1UT*P*JS546kVpg+Hbjw8ofo9z@MhiLZ7c=wHk*VMK=OXP>M)Qm z&P=zx?k|Bm%T;n-=-Nn!AjF2v-#WA8e0Oo}i0X5h`qFFPpW|9sJXQQm3%dGtb>4Q1 zY$Lr{NDTy&CbWEwA37+Q*$XIt7zP~J2+x5gzXp*~3(=pv00KNgu`|U~T_5NPwGENY znOEL!LG_yqJOnGI4=*Svq4QE6Oq(4En<0e}je*&74_B#xchvS24QG} zgbKWc8&c(yd9Qkl+K{qXXXlpr3sOe`v8c`2?@?Tc6~3cEdcWr}Fd-`dB$K`O9^=A@ z&b6p0T|NOofTDLQ(8p)GOSRjWGbc~t*34ivkV-n@3-QkE819r(`-ThOfP$+-A{XFz zLLeo42Trdz;47#sa-&;y_oyIu3v0}Z)F3tNexLrRXKjg(_8asjIz)MYC%q)(BfavV zzq#2fT=!h$u?apwX#z;jTZbb)2C9<=cXvAS6xv^eQ7LjXFQ(f z8hPa3OYdrO6F>!%?I7Ru8L`HAwxm(;ZcOu|aS!ohpT0cZrebxNdJKh#AQDJagMoCY z-hD=!f_c;lhj?FrUfTWcplmUO2ESB7BQ>I5Q1>gura&T-l$*BDT!Z;&OX4HcdaryG zB_pH~`G84|J`>cx6}ud!HU@&#B|`s7Ff=C}Gv5#O89H-@ow73FpAU2LvQOTFiWRHf zDs;N+?z-~afH>dlhxjOI?ad&#INt|+CGMSY)M7EN&$=zhTN6{5Mqq|RX4e~HNBf>Y z1muh&$8lEbpzy~6SY3d1Q_aiop+#~CIyJV99NRDE49Z#Aes#3bZ~%8agtgynoLiv2 z_TQ`D{7+w4E6IR{G6DzIR(==q{yKnM#OKj~8|whSAVIQQ&QW1J1j!=imkni`B^!_*lyJQ#|K?4Ru>5V}O{CW# zpUAiE0J(^)+n$jVm0&nX9?|c5%6t*hxEiskB7<%$G(21du6koZ1O?9%n8Tx77MTa( zaHBtyn3}HhgmC*{b5t479p@k^UK%q6Xf@k(PT&WzlXFb=$kiHFP^LZtQ4wC4c{LMQ z>$FTR{aDJ9zATy-v)Vh3<;o)(D!+Vwu*Y!X3DAYHZH@g~*hw&O~VIfLp4qt~ZHl=A`=C|J*I z@JG!+`DMt5IeC0kozwHA*j?$J>5RL<1(a=eG!P@2AokKH;vnMIqRIpGs9T9&Eyf}3 z0Hoq1m^Rwu9zdkmynlAYe-H^CjRsD!)8RA(?1>KRjRBMs3_P|Ra2c6-FG;OBW7U~u-y z5dc5t{2j^ z+H+`De#|~QXjSCIs3O%r(iM8-x?+5uesa7wqwoWHDVBV$u4*U@9yF-(yHOa;2XR|( zGit;cBLEvjI7$Xi>~sq<^3SnlKtUfw0`cgHjtm(PA8(JXpbjQ3Z{EpX18fE6!$}y^ zaQzA&YUrSwPNNaC)U>IGUe)Ei5mM?aF=Pa{6%^Ys)Ggp&OC6BcL5c)`?}S##%%I88 zZ5W|5;8%xUu~5Bj!<{+ru2XU)IX>agD0H6Bu%3@#`10j`Uq!1 z?R@UksYH?9W^xVLJ)bh-#Y(=SkM(wiHPNb+2<$X2S$a+voR!RW$+qL+3{R?P_MBce+ zQH0k#Sb!Yb56ZRDn;P!K#r-jx(RZb9(RSpTht4;U_9j8)qTf}jc}&+Gpj8~m_0>k) zz=0XG98_H(KtgwQLd7WmJ8Y;qOH>q%5=^29$zf@ME^S9JT+*>5!cK4!Stk>0>)&*{ z-PP6ps_C8o*j-QHb``)OrZ-y%-M7pxmXzh0xZ6 zz@xWmkLLr4JruWRHU4d?^Z;G%fHG9;E#w2&qIBg8)M>sCuOvgPc=P6pEoXFLe_90m zuQcn-v%@byu}2`w&;e^OAo9ye?Hs?J4`oTsL7$$i8pv$?B+K^aPKAuGEzAI7>+)`8 z|B1r`_JfQZWh78_6_jK`BqWqND`|^NZ>)CaqQOI8Y>yz;VZ@HxeS3PfKBBjm+{k}@ z=^M#3+#OZ^D*=ok@0j|^w5GX-X-$Y6SQI(nNBJiZ1crvO3c4@57`G)qyLoWsN4qAZ=x_lMy#NbxV*HR_W;U(;GIsvW650IU+{A%n~(Cw z1%kojkdN!mqKpQd$C7mHszLv)75&B9qWLd?9&0lVO`u&U>e%Je%Dsc1_*rjQaT zz!-2r)dXifk9Fh9l?H!`a>qvgP}C3({5RlJ-dyj>pMwXG!0|!kl~q|Ia_ZV!U~trq z2Vd5H0W0kRK&Njv@r3^oTxX>XTW!~5&~-Qg6BaQO6sY*Sef#!@LdH!4MaNICS&#I# z&1RtRhQgEKH}IgNO_1a>79L)o*!I8@R&3{FkM-B}XBjx}L3F#W*s?wf%CiHNU>80V ztT+Fz|I}ah>tB8ECO;Agp9R@8xck|(4CnyRLK6YN@`VE|VD4WNgwkUyVx(v}z?4$S z6eA`1fVwT5ngzly2t;i6Qd5-Ad2QQ01fVbowO6!0DBwq~aRbQ-0hl>9r&2?;zSGj% zwx;*9RFv5Su3Ong^wa}!Hho9MIH=9NgcoeLr7n88FnAHilbv+r3?@BTU*0Bw*b*b3*PS`UH^gqvgCiY#{d02$t^H?apeJsHAQa- zuWP~v@jpjiwUDikJ_@incRL7rrFaqQ?(stX?`XX&OQHBQh2}o4?nT+_4FqDJe}d=w zTF#t9{zaI@@8{IR{{*pDf6E3>jqTIJ8%`m`5fqpoqt?849r>HqUTj9Wti9|m(mw*4 z{ydl>$iDXJpmLf&YV^|AbNwVp?}d}X;=QPiS@&&AJ6NY{1Vq+J@Be6q>u(6uts;#y zbe$+5SpcBzt&@AM&8_`q{;p{@%TGw&vi-p6Gl0+QlA89eewybUzA|8czec|P>FckP ze8Y)Z$I!3uP9vTn-tahW%SZh)p5G!bw=DnPoH}|dm zj?YOR&1H8XGdm0X;NZCV&zk!!d03f*m-oy6Yh^aW%E(P?)Bjuq_v@^pAzB%1@@W9#%uzHZ7sx7p%)&d%z92W*w z2TUjn+$6G77v_-8aW~*Lj!+_>&^a z$YM@0{h8tXTZ{Uie__ccJrKkrxjK92H=gECf5c-a7=9S1@}D7&|8y+=`z2Nx1K+^) zVVwWZ*MHy?KsXNhmNgjjyJq+MKL>Z?F&BJ}J+y9H|F56_7#y3Ldpm6Zd%gaj{^=jn z|GVSxkLmxdvHfHEe;0Yd>nD%vQ~uNf{1XBGtu6f%0sbyuUXl{SG4WrroeEspxlxQe zp`(G7QB}3bms|jU=>%IsB|Q~)aFnvDUrfdq?uF+gIra*bzHId0{53N4D}C8Hx9<_5 zCEqja+_qT3sjgT5zR&tg*muo(>xiA!ZTRGRw-gCyFR3r#vOw+9vswS`EnI(hccQe% zzqo0^^A%iIf9dV@L%-f!@PGdi5B_=Be^!>3^&d0X@Q)e%V+P=P|1pDq%-|n0SiNQH zpP=xMHvokBj~V=92LG4=O4$Cv2LE`2f6U+?Y_LYV{NoM&|K$yKaSFnC*hLtIe&uuJ zy%+sQmhC|a9Sch2Mv#U~xzp=9d^)pIdg5QQcUA1H(+L^jPu+g^%FVz27EHMG79l5S z2^mCHZw9Q(AxY>rhW>P#E1(HE>Jr+;dmCdVA!pudid-;rYSkW(s5qm zd!2V0k&x6&;IzYFX5LL$#};C1+}BU~-c0l`livbF*Dogtt*q#?g#60r)U~&hQf#ZS z{jQ>T{KXve)xTW2EBzfdxTUDRzxB6nEC1zn2joZ;gr|+{s>9w$;TIX?|Tt!tOt{^hU!)(oT%>@o`Qlsm$r0-}6_q?BA=CcBP(YC5*9ryYDX*`=e5JSkaR z1Oud&7a0#-In}7u8n--9etR(LHnlIbuC-s43PnpJO@!N@U#%Qz+V|^bVUpmXs+_Fw z?0@?V|JzEXH^Ljb`H5N%lrbK@dWN@P=pnfg&sh&?gPjg=dCV1b-56XGQPt-3(oJQ$ z5p?-`p>bR35+Jv!N)3! z_h9<5)E8(l6BXr4p=G^r&J)_L<)8)0w7~H8w^nF*$p7TE=St#>V3P+#b9rIK569SOS*eeb8HsRi7- za{V@VRF~A~K-wryu&;$N1$uTrhy~de#(5o^t9~S6di|Z1wTc2Uh7Q<*hEuKfWH)EAwC! zG1G`G36KwE5w$S_Cs5in+=jNMY(<~}#O@9=ZyBt=qmBLscP$jO5)x061a29=6!z=3 ze9(l)%aU|sQ2JA^#sa4K&Q1>QR}r{K>(dZxrh9F>kspag(adSH;`z2iaKCX?huaMa z7Mq3>H^&m=o%)8^U(s$P`Jk-VX&B-U8oIA`qg>M?PYnWUQ~H$Xb~vbVrhWc(b&T53 zZqCoVcKFlXT+)EIS`dqIUs(<+*~CA``TE&2GR*xlbWM?#S%xf3W-rLd);5X^y-{eq zZI1{q{pG7cCvnPXX%sF=4>a0yIKShHuLL*NrW)93`>VlwNS}s{*&TiUz@MHzYg&k3 zeOyzSb^I?HVqpmQ*Kb_jKCn z0Fq!hZ_M*;YQ1w=zcC8ZW}+x0nqeMhe)>mjYP3H9%0d=wpTkrkNlsf5^w z$?J16eGkoB^F1%ofx4g$7E&Tc?I~w#t7YQ#t6@_iC{sRSe*Txm`kgiM#6#dz?R#4|lUm-`=uG z93OxkQ11R>ce-7I-xJQP+&7`*o!6Eq(^@3Ry6 z)pn(O;fY^$$2R`44VehQ8jF5+Cyrwqp#gi$S3|)=T7lfI*S4JzT#^FLj5`#t%zlv` z%Zis)$5U^^W8B@0mPc(sSwHXTn_msZNEP-H(|Xf5_}6Xx^(X$FDZNF{|Ir>M(B6E1 zs9IIM(u9P}gxwOn%v-qp<8l@;)2s#N%bt;{E#qN&`M30 zTb;Zm{y}W7T{mAYe7Q)|N)e~Q3*x`DKN2Y#dzB<#uCThoOWDY= zX_GNK-u=sRO78%uE&2D$`7g`_ptkQOag4ZwB}yplhhcw3U_{VfX!`Pn30T>4ghxt} zTtsFmHy7kv3Z|aD7+`k(wmn4G$v8Oi3&e0~66i>Ag`k%9+-#VPhwJS= z$K2=lg^83;GG5^mtM^);hsOUn{7G)ukf_b8uf^`LjsMtz zFrEKlRTpST6u731uGK>aRyB-N*VwX=OLP%tPe}TL&c3Z8Xv}ki=QFYZvB~`Bn+<<;nAH2M5y*+$ArFnrZ4*M67p9~Pm#MK_CRb_({PYCpmW3^2`=Bw>VO+y44{+nZumP_TrWeYS>{>& zc{(`3hdtqMjt1*GjlQD~Dd4`#BmujT0cIXtaJYZeeX)Y&bG`erb&2eCW%CdnyL)iU zSSGu3=NzZhH`OG=A@$+w5DRQjA$ z{Q51cJ^&zg>4Prc9jq4$%3zW^3ylA>874oRnjDfI+cF7l4TF%U2OOyvKVpDuRd9xp z;->W6mvrLQAQ_9YL+f|loZ~O+m*5UaVBY<-D1^QLw2*&Ub?Fae&(94glMvw|`B-QK zMeeu9HSqYCrwFZ1+R`1Aj@`inCMUxowP5T za$g}F8&A%%N=wok+_?xh^ccXjnM2U!HRT?^5`HTeh6C;1%Ac_O z+taG6IG$pw)pcwyeFN0@gKp`b{5+$bQ0#|YPH^36)G-)jxAiDGweKMu-JOhe7~J_3 zE+=q-LHIM!L|hpk>4t$$L~aQjy@sA=Q~k-Ue7m6G(tYrCy6EJw;>q~)&vt-H-W*|~ z7r1aImc({6*j*E*b&nM!7BOrQe}xmXXd}L;w;Jsf9{dX9Ui{`BMHr6SJJp~2KdilX zT+jReKK?c`>e#O`3pwc3)Fc{2N-5gAh=vv|+MSS5lC-p`UX`YzQd&l$skFB=R45H; zf3HXHV|;$!&p3Xc?|*LRIES9k$MgQU?$>qQulv|1#1za-SLl0kG4&c%O0J!rF~Y9J zGdW9ao5yb$X*+B_!(QRJx4U-3kB```8Re_%@O|L;-}{m_o!rW-vreDT!lY}KMy$r>u=u*RcxW+2J?Uod%HgaoDcl~S9zrsba=_P;?1eT(rI^;2Gg z`ZX$QUfep_FJw59lqXno6@vBy_UL0Xg+EvM<34gbqVqQl)tNj)y>&9mOUMI_e)O9% z%ocAzJP41Cx8~YoCq)TmA@b$LnlHs1DKEecXwzp&yRD_ZFvH@^n-SO|mpW1V^$_WlQ=6?y3LW~B)aWhFEZ-(9itQ^tt&?qb@4f7Rq2J^4;+ZZV5-~%=pO`n% zN9$?v;7DHAYx|^D(^SyoZuk|EHtgJp9hvd{T!G}VG@G;KOZ3N2>b>3_CUx)zC2s_u zY`_HWmoe5{qnLjMZN5@8RqcGcbp_DDJH;)k^b3xrB&eurY**E_@A`m9vR-TLV5NbB z?FzXOZ(Jv2$2t$L5T)RcFzVfz8$PtISF8muRv$Cec;H1m<<~ICNlJ2_T#n)75d>}>Zw_g1+?l;Zz zy;s{!uzoa6$qh(wp5PlEeD~b?e$f1RL!Wuvt)dJ5()1c}@5Cq8mSvF%taBJKGge6& z7O9lhT_|9r_wT?L=-69QFX>JB{NSzpzQPoj(S&a)vlA(79fDdTf&z!8DGz+|26a0D zMMOJ5{BT)$YMaD92&ddt=~Q?8lrDR3Va?5)2-hyL-HPi<5L#dN7|UH{w~E!=Alytw zgJB4QiZ4(f(WqV&GaIac^1pb%0-dY`xA_$vtT>R_syMo<%CP_?at&3Q)4LLLR*L(j zYI!kO^BBdx168(sN_Z>X+-SN+W}J!c(2)o|#ebo$imk)mAjgs+{`I&A-{cT@zkx%QUyjP4b}75o^0)XF>s8?Y>! z%rmJ4oJ&CP`6lzV)Dti7q!*w?W|2{py~r=c&ACes1pwPHF;@KhTh!y}4zZNBTQaYI^H zXyg5od?Z2$mkalVDsEA3z2{_|-A++WMe|+6<2qilXxWnS9`V`r`QHk8x~na^^J9CI zvwM03kfnA!cr1T*GT%CQ!gWU1vmk0Qi``utJ^XB7}fEnknIJPF`afipcT_^Tyn05<{6E^Jm@_lCV zZ%u~AaA@|)qf9B@m3N2{?37L^qqx{qD@b)sXy5M+9-2u!_ugxFfY`%w3lPj}X=808 z1Ac&|s&8k^>N3#4e#O>j>Dj{?4!tynCaIIZylF!&OqsO&ZXYmjej9^8Q9)Gh*G3L* z)I{xpiv;e^31rcMltmESJQQk$g%~BKk6CjVZ z8VUu!s36jieZ+H^GzLiH$g5Bmmy`CK3js4~;#J+7=zW2jj z#cz^ahY^_5k@&FOLr$n6nyINPtq9y0BSG)c=fbZnUvk8aQEHRrpRc~%|* z*vH0|*}VG6=WNr$uab*c2sHarBtFBdxaFj%mzPi@8@2;)qPFu5{FNH{d}Qc+D0&)= z?I9-ZmB^f6F$%Rjyvcc_(!jpj#L8i_ObYGFa)qO!p*B@VvUI+p+1`kW_z;6!%I%P6 zA3dhbhLl2L2cJ@2q?huQbe>P5|Ajf)WrPpTT8NKy!M{~O%MRZaUc^GVFSA0_IQ%JqN-uw z|16m^s12W#dks(gIr{AlxVt>rH&ZY7Bj7AK-ler7zk!ZL$9c4d)*gCg$(JKzZ}35~ za3nw0SJ9Q^p22B)e`TY^HGJ4<-6tv5*~!Q}d3h!_jES6T$`@fn)yX=(L1V})w6V|m zGovZi9d|ypd7>i|G*PDR=?1Egi_eT)i@*c1<;cR8zUPMt|JMfl+@!krV@?F&+$T=C z3n$(YGS`fL6K1m+>oT@p^(ge0PN^AT`Szr3n!6hveTPu6T$d&ti(Kd)UUI@8++#zs4;KZHC#w5 z2pZ{{6*=7Mw)y@}H>rkWJKT>(^K?g`!EIPu^R(1P4@~wrFY02=f!)iRBFX|ngDbbrr>&u{H@jq67+)WC}%jcr^S2?)eEaMEG-!j)`S(R{= z6eU|pa?SU~VC7mQ1KUTRD|T4dtKo=dmdGhOD?WX2`|&9E`x3<_+PkjsmvjD)nt{6_ zZr$tb{PG4}fW-V33tnxYZZbmXLkZ20JXR_m>&eNW2EHhM5*%`uVG_!Ikah$CE*7I?=Ti(t9B$x3<( zZ7Fwt!(PowTsV)>fkz>OU$8&^LqQb&>ups=HOP3W{urEQ<`?eUYkdl}E$!&;t3Mv@ zzuf4-?W!y>TK}8%VqtLPerpC1(%VNu_a)txwzoBwK%@dlb^oZ-!kgvjQyWhE%5{sR zmK$N0nwVl-88}$Yo-n4jt%zQWLhe@~#rqmyn-H>;)YPXV8Dfpv0g9E>>kE)x#7Ny0 zTjeu0JaE-b3P;`^QmT+8fRjq2?#ceW=Rd9^G`0;c_Xncg%63?`VEJN|)C<%UvDo{z z<73$0`hxUW*cHK+m>;>oI}g2m)o>ST%&SiuhL(sp;8G*)g1hK$t0(n;xGUa0LjNj$ zL{za|VNqvLOf}yi8=@ljwErc2AX@IES!T<5%QC^b7r2IXd`qZ&gCCHgdVQHt{g#(E znYDaPsTX{)w%Pw;cYu~fmQ`TzFOtXqg3~v)zz!Qg*Hh>dm!7EAMn{R(3XMwol zvH9MHu6z|@lV*wOwVL*u^jfN==gA}FI5EV$8~z@Fi?xiz!*Bc9zo54!VP zQ`?N{aPDyPIVgFSueS%j(6%n~H)$P#U(pYuaxSr2=f2|e z-0q7!ODQx+#oFtU;ck`|r_!!KZ{CDn$$Xks}DlL zyohXm*lUBzH$mlx2ap0I8?lB7-;_zQy6jI)eT)DF^H~NIK#!9GxKNwj6m&*J%No>~)j5 zt)5}HEiK<1SjcGuK<6#)@y$u;bbBQb&SoMWeU>^d*ItRX zdecUW$0t9F)*O6_a5kyzJcMKW*W4_KN_#BhYr4vA1d#O*y~sw;;^WJNE;1r1_9n_} zR>xRvVxYQmd*vJrspn!}E40Bzm!5eORN;5E%N%@ukqtmjf+1hhn(fx;tdHDEeBJ?8zeLTq1VHhHKo7qU!`d?C4=sc;y){PyL&^}c)u zc0UOv3zTMwi{gE~dtK{GaE#W~>0Hp+`iZvx4$gJLt;Tfj>{f^VLNx6R4PUVe@fu}^ z;%frK=Xy7m&2BZvUfroEP2%;Jp3fmB#>I>*Zd zBN_2|-OxIlD@Y*rvutkGK{od-=<37WN3{>V6QAxqW{EVywF;VYKT+8KMg6eOYl zgc^;b>>vkQ<KUcv2>AOPB=@J?^|MyP;)mS%R>)L7+~? zt-%1S-Ymj;tN1fX$+fyRm6E(r=OrBW4&)5WRD{YL1}H;Uu^Y+m%11bsWyfF#%a>;i zJTF*1ITh7617paM-D`?$%1WCEE%w<+4~GeOP=}t6s;|7k?h%^YB1m{Dhh%M4h9MMq z0z3a{jmpHQv%@Li;MTp;PQau(?gKWb5S%wQ+y}Ogtaiw% zE!#J^O>pPnhgp_N&=vSJQl*lO)KUr+rKLcu_oe4HPfVbzj)YtTUHjxcn-p!dIPTRJ z*CGkAlbF>V>~59|z*YpuiGso>)^JxwLB++MMAm;iGttk`--&O)8?1BogNf1Odva$} zQeSS!N>@D8uHe8N^N`y_d9|Glf`Fy4&d$^1esUiof_SU445vjn2jiyRa{%Rn2u?-Y z8_=e_P1myO$j-u5QkxWBF?KTBDNFkbvTJraYemUESoY)YcFQKh;svS5t-t-OLigA5 z*ag0QM~V*eJlKtne745+StjI+9fu`nJ1@XubAJWf9SLif$)>h$&HQTxE8L{S#UhbW zxCiKPrSHyT<)a__($(`_raQ1NC8_SKRewL;EVl3HiDx>9bJ`GD0I{kJ_ghv<<^!$V z0hPqiu$S(!2&iwy8t#s9HHB@qX>9IhjH^lmS~nxdM`Nd&hW18k=?-^Cu19YqvdnH@ zXjjGUj+o7I?Cg8G$rbId zs(D|dC4v8hp4~flb=w-167d_tiI6Kd-yQkr)Sr|&C#AG#9QgU<%AnFKSc}@%$^AFi z$A9*(+#*&Qo484lldO$D$r6=;6gmdcVfb#yhp3Nhx574pb-p;N;kRpF+gxX>M5{ty z!mqQ^lPg2rH?Nb(Z|9pWizJf2kXna=zgF?dJ&*GUGsRWtKl!z5QR37CH=MdGy%Syx zd7u)>jnjO7F8d6}${Wb9Q}tmu!zX-@mW7OJomKj+Zc&9)@>t$Fo^tRulYf8f z;PUI>y13qMXAmiVF%oq|l8(hZt1G~=i1~tF+wnE(J{Re*foDC*sv9-IU-u5|Iu$n- ztPt6ycB=5_Z7V=J&$96moqaz}<3Id`;cAFZAgT|zFTR9jv4Ws+!ldU(0d}k2*tk1+ z#Br$ewctJy_)fYc|4A3gg)S(06}+^;TPkWgf@9VpStsE1)Atgry@pR&?B6st>Dm#t zdc#|6BF-j1h9{xUBzmPM&|ivbli({c*NL|gtaNG=UZT2Gtrw!D0z$oTU#qMBYP&OD z52O22#xGMGo%2oA1>BjvSVZ>{!h1BC)LDcuzkoWUW}Eai%LD+GG^A zb@JjfHo3o{W@5x8Oianp-fO7{`>Zi(P;oDR1UJ#O`|V{_(%ciI+UXz(yHsfd7N0&w zEwL6^nc`4YZQE0{oM=j3-md$0~fP*@B%BJc@lVXl!k$0VPoiU z*Fz=JNX~qQ*jnOEOw2a)(d(8!z`F0#Bc*5_X(%Hd)*o$&oe}B6{?DWcgC()xiK4L# zy`xF-`@a?}zeaBLFZ)()VmewldZ31CUeFxby8%{woDhiLsLr_V#!K58nE#>1K70Nsp`PPI*wSWHy>4 zbY&>`MEF>nroD8>qMwpGXrWDW55ZvJ&-#F&?Hj;hq9C41?~R%^S~)_*$c;SBO7>k@V%wIKea{ zBQ8Q;l20ejBq4^yZX`i(nqBd+szMZU)>0v*6hVjD487Umkx7k7fR;1T-Y}zYTwagj8KZET(O#fQ8yjRQxa8vexF%&ANUi;%E0CL9;VfU127A^P3 zYg;0qLEiXRW1Zi&qZF^j8xPk2vX#-xJBwmq&rotl=TQ4qSPYi80|9!DbPb9~(dRjk zi-_j0T1@*0v4DwMeF9}Ht9tUJ&(lkbiwGEXY;mC8nJ)l!Jw)b><%~ zBC3^2x0J%0oZS~+k7`)Lt@C0yC3HtE`r#^5VLEOstJ_K%Ohq0-UwTnNYu-AF$A_Mm|0^b-HKa3uXB8+Plf8@1P@Mte^uSb~n zQX2W-x^6a!+5h6yP2nB5=vCrc7kD4Oxk-bbh20_A@hh}89y(_KVG&tp+F%sL$p(dw zGNfVAZJLi0BkSDFy8$=A;gyZaPd;w|n-KQifQ0_@I(-|gnmnAn*<+5C-{kP&p5)mm zu^%6)n<4RMYHWJw`P<^K5Z-@7XjLM}o+2XhtM7kxL*8S_6!1Wp1wF&7eafex_5rV% zp3e8-D?R#j2Q_EsfX_2+#XU+&%nV$Qj&FT8zt=YZQ$~}}k&MVvc~s3kowp7a3vqOe z2hy%%;qZ$CiJ`1(#Y3g9QqZIK|F9J1{$)Z-)Rkb{(-M zTP!KKPPz(J^^@)%{js-hA#t{dTr`$m!dy<>K}L}X6SNK%D#_p7RS-qV$OOz(GviNi zrrx{}SI83*nIYoHMMehN&(4c81v~)}*_{?@zDz=&(Y>1XQ>a5SP!hD8m~R z_92i@<(2$&S2x*KD_DoBeZEYnIKrQPPHQMXc2a=I2g!oIEqK-brgAVkT6Tk0MNw@Y zpareSxi&UAB5VmickyUza8^CsL_sC|d8%LpM*|YoG|$lDbv)<~aEz_j9Cc^=Nrc{A z4=aMnqN^WQ{|8&je}+$gd_n*I#VwV)aev)PoUEJ7A&nw1(7KIhb1cg=xmX7e!kku= z`9^}F5c!$b`%0|Kg?FM)^wY}S%!D;Kiqy;7D_oSOVQ3O1r&hwj;#DM-jRqFd{n0M? zywxwX*aGgqksMw=FT_$5`(lklQ5p^ObO8=D1c{sfMGDM)X^vC(>F|5iP-*gCPmk^$ z){PB2uer(U)mDQs!WI+>)@kE~2y=bFd(9bq#z5GtiZdn}t~~66T!KE&BA|gMrA-9! zX0c#HHk8(ST%)H@%)GJpA!o$*SqwSOn|0n|6GjKRGIr6mWHLlp_v}O{KNMi$atn9b>9>!i|ovjLWDBWqG5$3pW#LgA0gRYA1UQyNSqP!Gg+%MimmpD>jRX zD7I@VM8OHni^?2dQip1W9)#Q7-O!%fAouQw{d=TXSM1IGXm2mRvDl(u{?8^uj<}rG z2ulb4u1@AAvT$fh{{qW&wUQUuVP0~&??93=X;fY1wt2ocEB0RmJF*o?uGOJHnpQhG zCbddWJm=6i~jpO z?0_g%WHwvLn&DpQ%GljBj>WAqNPpj67tFs_cB>OOF{-II;u|Fi!>8$MJ0v>RyoQL# zwY@<-v~$;)FEsOFfk1%0TJlI%APJMT0 zJ(z?_@c9}kv~?4tq-;V%kX4&_Ri7Z-=)b&JNz+IMW2lifm+FpgWhYY3XJ_pG*~0zg zV_I52)0e4`tm~|oxGaFY>Y+lEWCAgT6BQY+9u9kVbRel7tck;Bxx6|QX2UrQxD|DecJjKB95 z&x`M8OUtjWCvFHub&XX}MmGaKIZza`DODrG5wkgSjz;mAQ97+D}fLdG|+r5WLil@43^HGB$=wkmxMdXQQen6R-8O zt>EEypWS5N>64{5u!4aF7{zD4fX9ZeMMCB%LPV+PYL#~=OGmFWmMzYC=X05jceiNO zLt9YioKMWS7I-g5DUlxQM>W$sAJN54X0%TEtEf^hG?>8|Fg08Wo?hE@=7IXEd3)fR zzgeTI#g!RO-hhUAdnHVDvJp?QDlep|p_I)}q7Vn!o%A@?Dbq@H;&?fVw@g|OSe!{g zcTxm!pjN{l^$O_W@Ca&B5y*R$Yol;>tpV=x!rFlz-Pz5v-=v7WD63B8)-TN{8TM+H zZyx;*F2W!G{=fdk2_d}Ev^ExM0V~}~KzqK)NP0u2Ro}4fS0DS$2C=K4JNV9=Th8E2HS}69;7KV zZzUl(1TsU9xXuhmY-`yk>5V^XuPUzF=1cMxFp+$Nn5uJrGMye$oefnWQT07Q&`nSQ zof$gxxL&*kc{c1}Dt$!Akmt z8+&4hdzJMi4xJ~P)>=W&CCiSi4bU~E9-=iXycj-vcm-hssQVL{ z-lGk?30u*VTS-DKHgBtjIZNz7gR$nG?GjeJQwC$Gvh=O0W1~UO{AUKQig(&CxZTuA;b>yXSbFw!J zwCwD4;r-bju8fn%)3tRWw$y)spML(HyGL+ou+Q#Ms(((5au}}UaJ9U``0v_phn7Zm z-cre%MDHOZDD`A46q+};6-TQU;DGR08s7j@`URtdYU?@>e= zQuOkh`x!*yEAUz{iSi{de`@>Ka2`Ne)UgP$thzGAbAJ=nhC!OOp=2l$^x*N@;LY;f z?1LYoedRqy?4v$>fnwm_>Nq@S)CZ;(8%XQ>Dd`&%`)_cI&yy2B5BWc=`((VV>jG(% z=KRuKbcU&EbN$0AGAL#PR()(ZSmo)+_K6YSJg4xBb~&{kG@c)bPJ;Y`pZfR0JZwy!OM)HAgRgWv|7qnR}*a={c*Bn7t{ zW@Q9daDuWG1&QQNS2(k>0|KHq-CFHk7wWEj`@?5al1=)@5x%>e7%ZP|HU8i`Il`wPe%>pvYq_*zhV9WzOvb(v@>oh({bv}UN(q@ew#v_td9DS>PCK4Wk*`}xybWKVV|C|^-n+`O z0rti|v;LbKcXOj5z182^+u(oE$V9X%odts^Sr(2&DGf3T*HA5EUEmF)cF+gF290Tf z(bu4a9|+Lk0uFV>4QIEZ~C9}j*%WpApb@?+Y z@*Hx8pGlv&X2;QM#OXmOBfDN&UBmy_x{-23GGZ&zPTShGcFb->ia?%vzU`)?Ah<#qJko8+>v-=y?Tkfbi;<5|dx zZ!~*wfD@mm`#{5;-DI-M;@&C#eIlSO~QQSd1u@7D$>_c z$@3O~?u|d4q4*3xD@4|}{hD6FCUQ$Aq->dKS%pu-vC+ujVML_QJbEyjafL1{3L#wz- z4pe*^&u|5RvC6>T4E0R|ESIaickpU_Mch_;BI?6`HrJ;o<_r}ttCVON(0DP-sWSre z{3$T;ag+Ti(N7V}5IOR()G_qjv!y;4*Az1YRztU;P?aO^p}%4xW(fEN+h(L} z!M9{Q7VTa=RG4J>&Ey6jg}31*v#Yo1^ydv}3F);nPN2O9dPeO&7Trwlch;#J&aO2| zno&;?v^azIf!xd!jpu7BwB*^O!OmQ0wv@_Uc%;ix8nn1B8NYD96-;6Ccjvh1$1Zfs_hvDqzJkoXgb zhb+}r+jV-BVBZ@1JdrttcvzjhCJY$H4-3~Axe+^bIb_Q{2tL7%#JZFUnsQAuQI5Eu zZXougxvu+baE<bjWEVeb*#;2vk%e`pRF=Az}(*Ulx-#R>=$anI7cPHA%fie z?##3|+ssGj%LZ^>x2@HPHIB@g?>#e_KfCXI#nc_xNZyVC-2?;aj#&6Q0K8yy}18{kD|PCIQ+3vX$Oc$C7aHTm_^ zwy?I~Mq+Em4*F87#=~m;WF`t1>Dt^BJX9ub?RBK7t?Z8*xEbLxai$qwQuhiq;^A}V z+4*psjzvYST_M|uR7=C2Cy{T!y>4^Xjk|IlqWlZk0q%?|!W-&U54YaGpDC=QEW{xF z8V1DuED>}VD4peZ!AhUNCx5>Gt{51* zd`i3V&um6PAmyf86b0B zcyT$2siqr7AQQYm!>?=A0`?J9>!o^fpmk-l7A$1(=P=sz0Bi;3|a`I*caONHYBeTF)9!J zR_X0R8Sbg5h}IQk%mO?0zWUFEk?&pr5KG=r>hgmFRD9B-bM@e23aap*e}o)Edl4Rf zJ+q~BWW2s;d!V-BvuhnsxYZwQ!56MH_1A1~5DqzMSz#=GXy&Dj&Y`>gJe zW-&8lKW*V(&UGh30@z$n@&81H|EOy0zx#Aa=c;yI0O$`W#VQ-3|GG9p*A8YtAaIm+ z!jBU97Wz_JzY+5{A0`Y&hZGT8+#!hUC1SBAEcL+fk0Ft7{4}F#B#x2(J-yMsR>Hwx z)A->`z9ai-g53d=G=;DiS_Qda8JIy$*~It-NJT~1+*zzCt9psWb?Qs$v&Ova7&3z* z1gmrnH$RhpYSD5nmzPWd>6ot&Z z#baiYvRCl*t6Pzifp1fT=X)!j(4w~}$<9S9>Qf%Gp%G?{jhK>h?3O+9?lj53`gi5P zKKCfB9o?QnYsN;NVt@XdKU%{5Gq~V}b_*@|akl^AFE-rRuf!lCvv?S$h(e;!3knKm zg}%M9o?jnd9>yF>Q+51qD{%8-$4d8D-8N5 z$H|aVYGNZ`0U5<0x}=8bYm+y)p`)<;O2c1E!^r#|vwcp!QQmb2?r+~~;0Qau@V%cO zzwapDH^Awz%>TnT0C2`<|5EzbaU~PvPjCzxW9~C+VJ&e|;X3w=f80n2b*Hf>ZDmee zWNc@f`&$1-G=bbZ2IHzjqQ!q4Ew@J0&#ZsPWqt1s|3^fHEAD~f7VrI+(GkH=AsVka z4raiU3|$5a#{3n8QkDF%Q3L*C_a!2l!3mR-}=k}!{@nJ{X6<({o z{@2f&CLJ*)R=+Zt|Evz4pzUXITe1v{{5;a?z-1LaZax=?0IX8y9S=mPKC* z7OWs9xpi2z&2F)OL7yO$Q_}M+(6qFd6@>$Wr0{hu(=CZ3E^Ez9i!j+wGHaPJd1$d! zov2S>2LsY+i4m^2xb29qJ~92Y;0L%wOSaok>70`86WN5ORl{iKH@_cuNO_MQ{7ne?P$JDl{JTGnm-92^uidtWJM1j)cI>w<7VEM5Kk7%za+{ z(g(G`Ey0UYpI#$h>>n&5djh+#vzJd^bhKLAL@n(D`s4MavyO_1*%5dK&e7?5o40Z$ z@qnW|?su3WBN!xYPdGsRi-XS6puxjFq5;PE4F+~v0XJ&^w|mEW1joYw=?Q7hd7VGO z|FhGC8JV3e#4HaB?k?-@tuAxl@CU*@kV`wL&8Ynaa4vZlq#OF3x91toZbqnoX7%Dvxv=`%EM|;xwUuy1Oh`P%BH! zO=^5o4gP#4Oyyg}6kc7nkqN^doLSvqotd@F(^X!-uN7(s@pc`s&e^<$eQ1p8H$Y4S zPQckNdkKeOrQ;@*?h7~RIQ#ma1@W#b5Iy&=cKLsHZh`2F-K5Z<+#p$WflUvLDItC9j=fc9GjBmGVADO(K7Lp5sG*Y(^* zgDOdXt`QwyzxDd8^01<5t<-kC={_|=op)!?h}ShS7&EGdje# z4^k?v&bP3@SAH**cnu}*`wK3Iv+^;7?^<>Ku;=i9@`a7z?7e=Z>%6uJI@>7_&TJ0r zy#xn8yxe&928^c(##gh?i{L~@VyNd!)aGe67bMQS+!11?XmtdS$(K>^E-+^Rj~)vS zJcmgO%_bW(D~Cf{-J=YV`B$o((4KgcH%@y%ndnXphgH4X>SjWdHWqQSx@#IVEMzgb zf1l|)3fQkiI5NLuZLPoSzIfoVUun6B%+_`2_sYBEN%wDX)#Ee}ypVctK@<}3cA1!% z@TDigHmtJS@7XC9X!myj0*Q7rENVpm&0inKz?QfyQieu#$H>s;$ll^8T0tCv=y{__ zXS)={#)9XLJ{kKr4@dntgql;595FhaQdN=HC`80DqSGm795G)2X8c9^6}Dv?1lW*M z72cckH^s8^ZSb=D>Zkq?0a~zpCm1qcamb9!4w0%utVM+C4~s=+q0uu<27*mB+kt=s z##=Q=y4*{ zr~QG^iz-$L?QJ-0~98SgY?r`qz|~7&7K|=&hphn${-T;dgZqu@UIZaAx~- zIxAztNg{6}T4RCCi`(oYYVId_|`@kR*OK+Ho z(exBRgVwuIbv<(+%T##{;l4h&8L?2jLe`j)|Eq%hNcKhZzo z#sBb6{#}@_GM`tUQxltRJv$pLXsW9E2|;Z;U?wn&Z22XMoI@Nms_X z(|u{qL|+0a9@>39DgxeHE~O-oB39-aII;)wB^7%I*|@r4LcC5m1o?jU3xkMq+(gyh z)-MEqE@9Ja)xVO%C~~JCcca(l=?_vGXJemMo8EwBQE(r?vUd52kM*gRBve9i5~(5H z_%a0EHbRn%ha{($??Tj$qZPu8lb{-`mPTmc}c%bs;jugV1y0Zr6uZRS=`vDe{_LA<(^C< zsep*K`*uv{&+gq8D8bfXlfH~7ps*U2VZB5^25@J?K3 zB+la1^iNdxG9nCj`RRSSgVN4J3ieS`p=f!774 zH=s|r>}VzNTS#wZ*T@8X6eo@p!GN-DP8OIt@+ptIpYf8(P5_vOSVsB9%P}-7Oh~xW zewXxiOpp89pSue;j|n)92rt5hmkuZjIxXshUyJ~U;atWw*D|w@pqJp@Hpn(?8o%ZH zquIZPdytlNKNafnjScG-Xz&?#F8R+8sGL=qn{O^{v> zP+=Xi&GQ-6DH{G&fL(Jh;shjxrbifUe&gS$*;ZHUK3!D{h8vk>m@{f;NQyD;y~Ol3 z(vV=hUfncbaj)`FZnU4RO8i;;g^IVGNX0zV7u=COE`QoP)uQ`=_JX8%j+~;}>gv-D zu~m~}BqFmcWOv0Qi_}8&#lFTh@hYh;vVEE7-aV^7_k5Y`hKG?4{~y;^4>wSJBMM}o zC{t?}1SIKu%v~AeJG+VDU#qJr=e6no(l83M?rhnkDIB) z<_H*fmt?)$u3(0?xmV8(KiRbCah?C0tn<^FHeqvuRpRvOXAfg?iFD@P9%on&SzhQ9aVBFWYkjP4tYJX-#6c9otsYUwtgALca z#W2}DavC3+Q>q|6W`%u$xv=QjrmhT%#9MGHS@)zBrC79M(zF9J$Q3!C)fiadq~|^P?6P(@+wMUe`2%FS=4jmr0$cd1 zbm9*=q6SAARfGo}s{yTj2Q+H8Z9>us`XkaOm)d8VFo-&!rPhb0S}yvLEz5BI>f4a0 zGy#`o4(RzC6WgCQl8dvB`d@sbcuR%%)BV_R4@5X6+)0)kYp{6osRM&~*SpI?){4d? zGn2tC^|aGRbV{7eoxqaFCfC*D-JH{-XD>}7*0!N=#9*z7!8oVv zsN#nPq|)(g^|U{|bc*1!nuMe`Kl*Cx=zoP%UMN|F2wNM@Ot2w23gdhsxn{JcG0;4;BumCknSfmj zN1gO@EcfK7-?q~g2z(U+&X@~1NGmg0Dk^i2liImMRCdS$fpXrIVt$?|CnI&CaQM*vpgtLZk%fsY zfM|HHwtEmr&l?XlBRbm)7>DFHjI;);Bq-m~C7T9t5$S5yRd6)Zh_$0DF0`Qr{qPl$b=lkg^E~q219V`DC zY4HmWN65B?EY47)Ey+|lrdX}S$G`W)wP(T&N&*VW3{UKagpD~To?d(w`0}9z^{-O^ zPZfeEXw3yt-!IhBfNd=a_>skjv(p(vF>XkPPJ+s9fvTnG=b6%fA_hjtLu#iJ2z#TA zazvJDc$8-L{YiZh52Hs`9#j6_9`Gp4nBaPCmV#U)nj{1+kxK(r!;@fguT%aND8;ce zjR&pv`|B5JLDbxr4us#eSd--gWGSqyi=}BVyDp938xOmEJ-^%Tlr1y_kmYt_f zbcIv!g!l*Z&27Daj2tuEg;*M4>no z7gGE0unx4dflaLukeTaYo3l=cppSL+-Gt9GtITKq3MDpOonYXaQD`7ts_TCS*|bN1 zEo%O4^?0Q^_01hHFkD(pL}`iM5)5TFfAGm|a~RP);cDXYr7GPj$M6&1{d5x_&Pxur z$MI&E0J+NylJvMVfo^aS>w`Qhc5;Sc9!x1oQ8}&aSab0^T6$|w%tr^W{PFscq2Ssl z9UdI4&OZ6KKOtNBX4~}V3t3mWNFW&Lno2Lp)*AXtJvgHKP9))T7wP^{1Cq==w@*9M zuiOXEl)Q z$vtVab06TVqbb)#8iA5m5v;&MV-Qq&(1S5q#hwYG>{0BLdlG0r8+W&hgw+0R@9aWV zdZ@U5c{WX;KeYYxp^B@63CuyW!h5zgha|gNFO_67SVOJv1eMBV@XBOzIoPK;m$6Bb zW;86K?mUvj6_}zlO(MnzyN2Pa&6KzGVAjTKBXe8?j;6l#tLC9wFg4X9&U5Cda2Upj zp6(fWljocfJ7BQW)A)637F;PyM!VI2UghG4XH7)uT=C#%*@zv*hSFNNyrFe!-mi+M4`o zd20P>BBP|f&K0wlbvjLH&wUh&&lxJyoi+M%x31s%rae;F25r*z6s zKKD3`y`8MTTr&TR;4P4GgE$q;dX|3G1d&|jPi4cesP>K$8Ma-0dhUS25OjBJ<|1!?6b-Pr*5e0DEX8UQ-$$7iN|sQNzDb` zoOQ>0HA!kk2fnuCkw+Xout2s%k~~y2Wre7(IzxM_bmsDEB?>B`BZQd_76mia5vMV_ z6zip{6HY@|KILGpgE4&4D+fBUoGF0qaTPR=lBrRRCVgT@c;--YhNQmicqg9_vd^6t z&9Yoj&f=Kk_ade`cV^}0lMpobNv-mp2(-<9^CwAglT~uHNfEKy&ya~`pVrL}O~B4u zjeKn2A2Vu&Cq3d!y&UGuUJJN8lW`7>N|z{kL8Jf_BCvL6xE*WebnG+CV;=cqgFsw) z#lvG_+MJXq-!S3A_??8S{Gg$TK>>}xI3uUd`aPVOHVFOI$GjX zC`K=d+D7)om_fmCj{r|3z{I1w2^6j;-ptvqf&A%DXUX`Oq@0{wZp!rE3UX)KO{g(R z^)FyfT8GZtKKgikdiqHA(RT-_Ht~uV?sIPy<@id1thFx%Ratit@6O1ECUp6AFTZ)^ z>t)-Vc_+HVeP>q#nQ7XCsezKr08V7Kg@q~|4P(e0 ze(CKp5_PmT3`Dw}p9uh^YpLMll*R?#pD~!Vr{mf-zI{Y~}Q=yhG*LVFf{c;@?Eq;2D;!X#u#E*9c+r++q_zJ(n zcGT!u0C(lFrdt=;Fvsd&`uvpQx7SnS!~J;$tQ=%KkKhGkz*o}r!}+BCE%Ixqur;fD zQfa90!&frnHVH_JrynC(g+m(kv&wQ?H&a86F{}CdbT}pF9PF5q6JfUda7mp)7^Fs^ z`N~m}93v4|hFf#P3x@=ApXXOscvEiQR!c}Jh+>>Pa!*toAO0yYxz|R_+Q2MDL8W$Y zzn?!lJ>cH+E&{=|9%3PH8x`L)6UXGvuXA3Q2THA6>v5d2+Mr$2Ly?}Y4g?o zYA-FF#@`GiUz?GrIh#k`8q$Tba>I+Th#~gwQ{p=+$HX9!+BA$*%I_vVZw7-Sa{&zC z)5_Rm5oAP^n0>m;Y|~GHDrTcA|Ag!G3npm|vIlAyWn00E*u2|Ghb;G^gkT;tVoaRs zE02keD&Jt(LIWqMoe<3pdJ|Pd#q#fvtlj*<^7*8*88cV{ruhEKiMfI zSomAcKF5s92I41cVMtQEM+zIRMhN%!m=f`B8m<3kKeEn>J8zwVH~a<}hC)X2G!aS^ ztYdge#mAbhEzz&6EqDIko6vDaHL7dp9NtxKRRpKg-w7+o-1_ z3CF1a4#liiGIG1)o;j}73&eB4sAWfw>`hLpNIc0wf%B88dj@rv-pv7-A0^wX&22Z5 zA)hFa*9HUmcom{37bHT+?^9}q8+FMp_u=R*h5Ajz?206bFJ!``aQW-RHgL-IB|xVV6G15@N+4tH3{d?`I1@ItjhA2OAX%el!~yvIgoa@}qllfVQIoAm z$NX6QE@%3MNvHSp#yb++O1`)t1&jxTA-2*`?daB@v^e)55AI*R))&jnevYvG#5BKr zLH`N<3TY~)?5chal@tQKN2|~m=GL~nClHwjg zGG}Vxt5JV^?&Le!AyhPuDUuAMproYa(?uLX?&mJY;AGkwmxfc@-;o4X(iGR3BdKD? z0748mQTOcd{Q7E}_aUU)JY=hBH;LX7f?-Y0zM-sGJZrFx#s<>z;fo#M`H-YP+JyWV z5+te@(npN8V2pQQ%;mnso?{N>)oLMFb^tfhwuimw-0JRt8!#L#rYiTT9T~Pey9u!z zP>UXfcBPyz#lvSIOh%00M$Ocbyj!iC)64(_>nL`9U0h0@-=ErDDt1tr6vv(&_)i|$ ze|OGTs!QJG)|)!pcL!al-cjh!Ff@iUNYb+s3kL_&MctKkO-?EBTY_RKB{3lkxG9d>W)SihIvZ_ebdUiW`X}ghInM@Z{&*a6WFeiB zn6u-r`>4J@z8{7DKlw!gJDQ*3C#!oICdr%^c(&x6`I0wf-U*<%@}ymO|5+7JCwi{0 z1pME)yL!X)RFtkqG1XYL%}q+rXogG|qYpNS z`AWX`kFbal*lDDh8SF{ao{6ymy`JqtXsC&uglvweZiwNfkod?B*xk#_ILO3sGm1n| z4M*(pQ{d;Bs4u`V$ag&u_{NLmNa?x$)tP*W%Iyl>YH|mDeu*#-#9e2}`TdDq5?0gI z;)$6PDU`tCjoQ!R=DfBre6Kz%(3-5VkY#%q8P&JQ?u~iLkbWhM*6t3TH|EG^XWJ0n z3^R>Tt70lVNiYB|QSQ^o)JHhotjJ~j_gpTRcJ8s_A=eYos;K_V)Oc2PN=zh)!M_39 zk?(dvJPyDZ;tmSGe(WF*AACbcpGS}c0wOErrU`TxL@gvT-(zr({WXuPd=dK8V2N+7 zi!TXyO#_nwRxOktdsB=r;vEOK-)rLg?~Bj>{UxdH#3LMeLY5)y`Ed7=%x3lOxom1O z@W&@rSMh*SRSmNtnVaI%+KE0ta9K>P?Nv+61BTEpUjq$xrvf@XU?6f>gflQEGATc z;*xePH%MXpJ+riTOa34ngYP0ue23kKjNe`>SF^NpeaxHsYOQn=B9mSx89$L)rq}ek zT`+r1c1PRF$FOkA8oRFu{y*`&--F1XUTk%)jHOO8JC zWi@=3**s(}4gI@{(-AaTv|Mt`3H0+ApfxWAB-qH4Gblm6*5=ic-lnA$&nSP~es(j> z#w-z13uqxkz2zxf)ngovoJ$hIg~1kMs^HuT_nLG{&xDy5z(@nP_TvXDSJ%}a^d`ZF zWJe7N$<5M1P8) z^?bOmfv{WQit0CDAP?t(51DnF+ph+$y5Ha!?PzeTDIt7GbPe@+Uv(yL>o{3&fSD;b zW8jG}Ggao$BF8WA;H)RCEYdn+>%nNUCeiLaqD&0|co=R_4AgZc%nr$c3*wEgSUs?#nkF=KvBtrRLXMKcw;m@cLgkxID~j$0_CNS&@q zia~_0QBjl1CDFw-*QATwQo5*|+*Opzk`EavBIJC}wwCzDDQe9>-}?M#ah&)4y}$kL zcfZem_OqqBdOpDkv}W6-CcMvH_}*G*y#U=-Dv{}vmC|#7aaDp(UkThat1-Vet%-Ww zP-Ck)XUXB#f@CTapprU#vcxovLMqUG6U9aZcgj*D@+8WxKu~7N*)@K8j|sY(E^s~n zp2K5mZ&K62-m)dqFFZVvSdJ7NR@-=w$5o%Qawu_)X-oG7t|MA_9WUn&HTNOmv077+ z=hA}G&6rW~U+nt%*uPK$X*X`KDmWJb&zVNejGW${2)cvq{;neGbdq$O4cc1gB-z%L zRFA<5#;0E>i9P$nCx7IBh&HIrldEbxPOvYXaxNCMf~FA&DI42gau-wOi-pwgh6L!{ zbxG8s?ziPemR}i)7!QLZv8U>Z2kN230#y7v>tA+8pP6a+(RYs_^$KXNi@GbAiVeIA z2{BdX$QEWBfX_x!@2hQBl*CKl<54g{ya4~gNQKDXSC6-d>*-j?;8H7tMUOn==(OQsbZSQzd`TV4gvhUqlH8G)_ZTR} z01kFdwbU)sX3G76non(3pPB2!@BQavxZn!6(W?)MXy=VJW*#Pi%Q0EdQU5#`%j=BF zbf#<%TG+Fez|<~;?#z1MQ>8wzMRl1hSi7j?{C!J7mr2{*Hw7t931`EK?FrDAqvLQjq}MG@>mGNa>R!qFF=(VH>bGOniHqhb zSdQ5QEZduDL=3x*doQ(dyWz1{4)E~C#Q^#U1>S&bNyx+{IB!Pg5!n>MNLAK;>TS|h z0P`WaMh-Z?-Cg+N0JVCghD8b&f(xx#dy;iALU7`g07~N{wI)utboa>GHtNvmUKR@2 z*I?^5%CCs+(~F;OJ-OQ}x~R^=nR$FtTz!w!!oc=>un58qZoc}hNyL<1i()vsLbJwB ze*t`=;V6QIs}=8Jn}C_lm`N3u^?9=!hfkmEahgQWQ14t--D7I@g@#KPfgL(bQjyBw zOMgl5aUcP=F*`=)K37}ci}XZD$wd6oTQEITD>ehyS)+%8=`rNU76papK zPj+;k&rt7C+2pf7K3#riwlq|?hz3)h8=_^eS z_Lkwu8r0W7VNBXhp#)?U(cLp!9{8vzk%3dRONAmb*N*I(B1Cz2_mRGc6R)}HG(VRs zJ%MhQq8Z8H*{w@EY;^neN$3V?bV+p@rnTu4A{_3!g7HfNz+SmYsom({{)P{r##I6w zm2q=?d{*(Mg#p_i9k*u5oGAsdYi&;Rybu^@9I#3A37}DnI?HOd%yiF>qM8$hN@B0% zR{yDB43O1KZq*WXQc9Zmu+#W4R9&y|Zz#`jC$_MdN^WF)2xk{va|wBDPEtU0^$zMT zMeNNs-3IKUimLu_;h#d$DE;f8xZoImDs9b7yJK1;7dtkHUjb~}$$~2{KEds*SR&Uc zm#d{jT`eyjxB$3Sp1Qae!+R9AWqyb%G^mlM9v=#5Wz(gZIe+`wS$Rl4<#aWgKptqV z-ba$BLl(=k)!h=9mVpB>@*L(cj!jkO$$k(#c30LQ zYNKjYDtz_)SJTGC2sq(o%;~N|OMn+yky~?Yb3fuvyhCzlEb?i~y&qoQz}#j-7V^}T zVdoa(>dLudRhUT%lNs%0#Dex!a&{`LN;B92WNsHmxrcMuIA1~f{?ypAOTs^^E+b8N z;}sEstdTj$E3Xq;tD#i$ZtKM8{PYXJ2B$e84`7w#BOiyW@yC37j~CYguV+YyN2j$L7u;7&k@nx z=U8Q@p6>P(PZZZ8 zb04{JVd-Hat;aKj$VZ3%K0!aRg~$9Ce9%0UaY%= zExoCt4K-cy*&-FYkrBy+Rr#xpRAu7O(22_ZAdjLqVuik!+7OwpCbr1gx(BBuC3B*- z9i-S@JGAi|8Nu`96 zYy@dobhJ2g?K&V2HnW4Mw96F_v&I&8(JWk*^3bM}aqPB9kKA@n-BI#lpWgPSZ5;YSMM|}dw-Mu;a2XspQW(t2Vk ztG8uzfay4gd--?fz)G_tFOfN}_+F`X$?Le=BZz`6rx`c(YApp|e`R{|A-+k4ggn5zX!HnU_S3Kx$Y z93d}7wHPJYDgMl~(;{MTsq8s-ofaq4#^iDx>Q+g=0%x9NarD~z%n|A)J1q7n!Gxq` zLj;7JgwQvsKq3=ITAa+b2Sg-mzg73OZ^nLBv7Y^JAskx}4`tn)LpTC89OF_!)|!8N zre`!w2mnR0^swqOMpCmOrzQ;bJZCrih0FA0C=MtuC0eJpR(8^-TYJw2=+9-kM2fC- z5g>XFRUx{Y`^0vdUf)@s#ch%0zLll&6zWaMq~&p_S4L|?Qv$%#F|NAA0#9^EjLQ{Z zDHl=&7_~HJl%&^4el$fsxtv3oR(T7O9+f69+YHJZSVB+9t+c8+Z_f*ToMnEwsaj<9 zsZKDx_lC?2&2lh=K2GhST(&|=jP9Ye@_C}w6^U)O@uEu{YMjD?_M}m5Sw;h{N69-+ z=aqg$5Bik1PSYNus!H!e{gq_7A4sIx%po;o(=%eO>~l70G`*IiI$ktG#J%adM!~E& zNQABoDm75Jm)p=Z!K87KB8L?u%874s$ZUV_+2YZ(xIV_PUCm@tFDG-7@;GYScK7(A zuRDRXeUy<_6iplw$m@-?dLV^=+VxA9v|e-Ry#Z+!E|Jt;!*+$mlE422|5Qr^^lUe# zzt{h{??0A^n^4s9f=~J)JuS#8-8 zy*?8a55f%Y+J){#lk3mT@=GHJ-y&T6%?j(GJeDUFTHW_UdYZx#zlrm#?1sM)awaV(T>XFqr%_EJ>Tv(CObgadT1l?HGZ+b8@*$U}j@r z#82O7>DF&x6yhDi&v?8mmmSc8wvp!XKz&|1ug`?bW77I|zliZLgkVyNs?`kVF>2q3 z9?43AO!ZW129Q7**PE{o}V z_kCT;A8Ffg=f?FCqaM(FKP{JmFz7PsJS@ukcQVbFe$Rw?89@JoxO_*3aBI@J;XJsyHx@SMiZ0PNYVY10=)Ke|QRXG-QM|?Y{L9 zc#j^u2j^-?z&IWU6c69s*JXd^H$GDEmdk!E{f4{9-_4}gG+c54Yo6S0#Upn4!hiMq zC++h%(MH|c^R>)?&pdngt5m1HJV}1S{U0v<&al^6tNaHJGIfExzeJ}~HMC6oulgOL)0;epV|!SLYQ!UL|^BD!HCU{!^T#_zw@arU%f0w#oYBj4M!ml diff --git a/doc/assets/io_core_architecture.drawio.svg b/doc/assets/io_core_architecture.drawio.svg new file mode 100644 index 0000000..d5b5064 --- /dev/null +++ b/doc/assets/io_core_architecture.drawio.svg @@ -0,0 +1,337 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +
    +
    + output_0 +
    +
    +
    +
    + + output_0 + +
    +
    + + + + + + +
    +
    +
    + output_n +
    +
    +
    +
    + + output_n + +
    +
    + + + + + +
    +
    +
    + bus +
    +
    +
    +
    + + bus + +
    +
    + + + + +
    +
    +
    + input_n +
    +
    +
    +
    + + input_n + +
    +
    + + + + + + +
    +
    +
    + strobe +
    +
    +
    +
    + + strobe + +
    +
    + + + + +
    +
    +
    +

    + IO Core +

    +
    +
    +
    +
    + + IO Core + +
    +
    + + + + + + +
    +
    +
    + input_0 +
    +
    +
    +
    + + input_0 + +
    +
    + + + + +
    +
    +
    + + ... + +
    +
    +
    +
    + + ... + +
    +
    + + + + +
    +
    +
    + input_0 buffer +
    +
    +
    +
    + + input_0 buffer + +
    +
    + + + + +
    +
    +
    + input_n buffer +
    +
    +
    +
    + + input_n buffer + +
    +
    + + + + +
    +
    +
    + output_n buffer +
    +
    +
    +
    + + output_n buffer + +
    +
    + + + + + +
    +
    +
    + bus +
    +
    +
    +
    + + bus + +
    +
    + + + + + +
    +
    +
    + output_0 +
    +
    +
    +
    + + output_0 + +
    +
    + + + + +
    +
    +
    + output_0 buffer +
    +
    +
    +
    + + output_0 buffer + +
    +
    + + + + + +
    +
    +
    + input_0 +
    +
    +
    +
    + + input_0 + +
    +
    + + + + + +
    +
    +
    + output_n +
    +
    +
    +
    + + output_n + +
    +
    + + + + + +
    +
    +
    + input_n +
    +
    +
    +
    + + input_n + +
    +
    +
    + + + + + Text is not SVG - cannot display + + + +
    \ No newline at end of file diff --git a/doc/assets/io_core_architecture.png b/doc/assets/io_core_architecture.png deleted file mode 100644 index bc446f54c6b0c9fbb2f3f288f9a11a90cf8b5aa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 239952 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

    ^or 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 ^Q{szlP+8i46|4ccpOT$u|=lBN46cB?U$ww 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 z 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%0Dl&JgKlWn6f*GY;yASK1X# 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 Zt=Haw#ZJ4j=mG)$7B5<1U1rHh_%E)AV157q diff --git a/doc/assets/io_core_memory_map.drawio.svg b/doc/assets/io_core_memory_map.drawio.svg new file mode 100644 index 0000000..35576a4 --- /dev/null +++ b/doc/assets/io_core_memory_map.drawio.svg @@ -0,0 +1,251 @@ + + + + + + + +
    +
    +
    + foo[4:0] +
    +
    +
    +
    + + foo[4:0] + +
    +
    + + + + +
    +
    +
    + bar[15:0] +
    +
    +
    +
    + + bar[15:0] + +
    +
    + + + + +
    +
    +
    + baz[31:16] +
    +
    +
    +
    + + baz[31:16] + +
    +
    + + + + +
    +
    +
    + baz[15:0] +
    +
    +
    +
    + + baz[15:0] + +
    +
    + + + + +
    +
    +
    + zero pad +
    +
    +
    +
    + + zero pad + +
    +
    + + + + +
    +
    +
    + baz[36:32] +
    +
    +
    +
    + + baz[36:32] + +
    +
    + + + + +
    +
    +
    + zero pad +
    +
    +
    +
    + + zero pad + +
    +
    + + + + +
    +
    +
    + 0x0000 +
    +
    +
    +
    + + 0x0000 + +
    +
    + + + + +
    +
    +
    + 0x0001 +
    +
    +
    +
    + + 0x0001 + +
    +
    + + + + +
    +
    +
    + 0x0002 +
    +
    +
    +
    + + 0x0002 + +
    +
    + + + + +
    +
    +
    + 0x0003 +
    +
    +
    +
    + + 0x0003 + +
    +
    + + + + +
    +
    +
    + 0x0004 +
    +
    +
    +
    + + 0x0004 + +
    +
    + + + + +
    +
    +
    + 0 +
    +
    +
    +
    + + 0 + +
    +
    + + + + +
    +
    +
    + 16 +
    +
    +
    +
    + + 16 + +
    +
    +
    + + + + + Text is not SVG - cannot display + + + +
    \ No newline at end of file diff --git a/doc/assets/logic_analyzer_architecture.drawio.svg b/doc/assets/logic_analyzer_architecture.drawio.svg new file mode 100644 index 0000000..c2123ab --- /dev/null +++ b/doc/assets/logic_analyzer_architecture.drawio.svg @@ -0,0 +1,748 @@ + + + + + + + + +
    +
    +
    + block +
    + memory +
    +
    +
    +
    + + block... + +
    +
    + + + + + +
    +
    +
    + bus +
    +
    +
    +
    + + bus + +
    +
    + + + + + + +
    +
    +
    + bus +
    +
    +
    +
    + + bus + +
    +
    + + + + +
    +
    +
    + fsm +
    + registers +
    +
    +
    +
    + + fsm... + +
    +
    + + + + +
    +
    +
    + fsm +
    +
    +
    +
    + + fsm + +
    +
    + + + + + +
    +
    +
    + bus +
    +
    +
    +
    + + bus + +
    +
    + + + + +
    +
    +
    + trigger registers +
    +
    +
    +
    + + trigger re... + +
    +
    + + + + +
    +
    +
    + trigger +
    +
    +
    +
    + + trigger + +
    +
    + + + + + +
    +
    +
    + arg +
    +
    +
    +
    + + arg + +
    +
    + + + + + +
    +
    +
    + op +
    +
    +
    +
    + + op + +
    +
    + + + + +
    +
    +
    + trigger +
    +
    +
    +
    + + trigger + +
    +
    + + + + + +
    +
    +
    + arg +
    +
    +
    +
    + + arg + +
    +
    + + + + + +
    +
    +
    + op +
    +
    +
    +
    + + op + +
    +
    + + + + + +
    +
    +
    + trigger_mode +
    +
    +
    +
    + + trigger_mode + +
    +
    + + + + + +
    +
    +
    + request_start +
    +
    +
    +
    + + request_start + +
    +
    + + + + + +
    +
    +
    + request_stop +
    +
    +
    +
    + + request_stop + +
    +
    + + + + + +
    +
    +
    + read_pointer +
    +
    +
    +
    + + read_pointer + +
    +
    + + + + + +
    +
    +
    + write_pointer +
    +
    +
    +
    + + write_pointer + +
    +
    + + + + + +
    +
    +
    + state +
    +
    +
    +
    + + state + +
    +
    + + + + + +
    +
    +
    + trigger_location +
    +
    +
    +
    + + trigger_location + +
    +
    + + + + +
    +
    +
    + ... +
    +
    +
    +
    + + ... + +
    +
    + + + + + +
    +
    +
    + bus +
    +
    +
    +
    + + bus + +
    +
    + + + + +
    +
    +
    + port A +
    +
    +
    +
    + + port A + +
    +
    + + + + + +
    +
    +
    + data +
    +
    +
    +
    + + data + +
    +
    + + + + +
    +
    +
    + port B +
    +
    +
    +
    + + port B + +
    +
    + + + + +
    +
    +
    +

    + + Trigger Block + +

    +
    +
    +
    +
    + + Trigger Block + +
    +
    + + + + + +
    +
    +
    + trig +
    +
    +
    +
    + + trig + +
    +
    + + + + +
    +
    +
    + OR +
    +
    +
    +
    + + OR + +
    +
    + + + + + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + + + + + +
    +
    +
    + probe_2 +
    +
    +
    +
    + + probe_2 + +
    +
    + + + + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    + + + + + +
    +
    +
    + probe_1 +
    +
    +
    +
    + + probe_1 + +
    +
    + + + + + +
    +
    +
    +

    + Logic Analyzer +

    +
    +
    +
    +
    + + Logic Analyzer + +
    +
    + + + + + +
    +
    +
    + probe_0 +
    +
    +
    +
    + + probe_0 + +
    +
    + + + + +
    +
    +
    + trigger +
    +
    +
    +
    + + trigger + +
    +
    + + + + + +
    +
    +
    + arg +
    +
    +
    +
    + + arg + +
    +
    + + + + + +
    +
    +
    + op +
    +
    +
    +
    + + op + +
    +
    + + + + + +
    +
    +
    + we +
    +
    +
    +
    + + we + +
    +
    + + + +
    +
    +
    + we +
    +
    +
    +
    + + we + +
    +
    + + + + + +
    +
    +
    + addr +
    +
    +
    +
    + + addr + +
    +
    + + + +
    +
    +
    + addr +
    +
    +
    +
    + + addr + +
    +
    + + + + + + +
    + + + + + Text is not SVG - cannot display + + + +
    \ No newline at end of file diff --git a/doc/assets/logic_analyzer_architecture.png b/doc/assets/logic_analyzer_architecture.png deleted file mode 100644 index 6e9ea2459022bb1989f2b88de6b6ea7eb049dc07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 603208 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

    A)Y6qM4b2xA@pU}kuX<<8L}i4xmu3o5h3+*F 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

    )fgK?q2UR8p)hP|$xi$96 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%0AJNPIC*TIB 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 diff --git a/doc/assets/uart_packets.drawio.svg b/doc/assets/uart_packets.drawio.svg new file mode 100644 index 0000000..b6c1fa6 --- /dev/null +++ b/doc/assets/uart_packets.drawio.svg @@ -0,0 +1,1148 @@ + + + + + + + +
    +
    +
    + W +
    +
    +
    +
    + + W + +
    +
    + + + + +
    +
    +
    + 8 +
    +
    +
    +
    + + 8 + +
    +
    + + + + +
    +
    +
    + 9 +
    +
    +
    +
    + + 9 + +
    +
    + + + + +
    +
    +
    + A +
    +
    +
    +
    + + A + +
    +
    + + + + +
    +
    +
    + B +
    +
    +
    +
    + + B + +
    +
    + + + + +
    +
    +
    + CR +
    +
    +
    +
    + + CR + +
    +
    + + + + +
    +
    +
    + LF +
    +
    +
    +
    + + LF + +
    +
    + + + + + + +
    +
    +
    + Write Address +
    +
    +
    +
    + + Write Address + +
    +
    + + + + + + +
    +
    +
    + End Of Line +
    +
    +
    +
    + + End Of Line + +
    +
    + + + + + + +
    +
    +
    + Preamble +
    +
    +
    +
    + + Preamble + +
    +
    + + + + +
    +
    +
    + 0 +
    +
    +
    +
    + + 0 + +
    +
    + + + + +
    +
    +
    + 8 +
    +
    +
    +
    + + 8 + +
    +
    + + + + +
    +
    +
    + 16 +
    +
    +
    +
    + + 16 + +
    +
    + + + + +
    +
    +
    + 24 +
    +
    +
    +
    + + 24 + +
    +
    + + + + +
    +
    +
    + 32 +
    +
    +
    +
    + + 32 + +
    +
    + + + + +
    +
    +
    + 48 +
    +
    +
    +
    + + 48 + +
    +
    + + + + +
    +
    +
    + 56 +
    +
    +
    +
    + + 56 + +
    +
    + + + + +
    +
    +
    + C +
    +
    +
    +
    + + C + +
    +
    + + + + +
    +
    +
    + D +
    +
    +
    +
    + + D + +
    +
    + + + + +
    +
    +
    + E +
    +
    +
    +
    + + E + +
    +
    + + + + +
    +
    +
    + F +
    +
    +
    +
    + + F + +
    +
    + + + + + + +
    +
    +
    + Write Data +
    +
    +
    +
    + + Write Data + +
    +
    + + + + +
    +
    +
    + 64 +
    +
    +
    +
    + + 64 + +
    +
    + + + + +
    +
    +
    + 72 +
    +
    +
    +
    + + 72 + +
    +
    + + + + +
    +
    +
    + 80 +
    +
    +
    +
    + + 80 + +
    +
    + + + + +
    +
    +
    + 88 +
    +
    +
    +
    + + 88 + +
    +
    + + + + +
    +
    +
    + R +
    +
    +
    +
    + + R + +
    +
    + + + + +
    +
    +
    + 0 +
    +
    +
    +
    + + 0 + +
    +
    + + + + +
    +
    +
    + 1 +
    +
    +
    +
    + + 1 + +
    +
    + + + + +
    +
    +
    + 2 +
    +
    +
    +
    + + 2 + +
    +
    + + + + +
    +
    +
    + 3 +
    +
    +
    +
    + + 3 + +
    +
    + + + + +
    +
    +
    + CR +
    +
    +
    +
    + + CR + +
    +
    + + + + +
    +
    +
    + LF +
    +
    +
    +
    + + LF + +
    +
    + + + + + + +
    +
    +
    + Read Address +
    +
    +
    +
    + + Read Address + +
    +
    + + + + + + +
    +
    +
    + End Of Line +
    +
    +
    +
    + + End Of Line + +
    +
    + + + + + + +
    +
    +
    + Preamble +
    +
    +
    +
    + + Preamble + +
    +
    + + + + +
    +
    +
    + 0 +
    +
    +
    +
    + + 0 + +
    +
    + + + + +
    +
    +
    + 8 +
    +
    +
    +
    + + 8 + +
    +
    + + + + +
    +
    +
    + 16 +
    +
    +
    +
    + + 16 + +
    +
    + + + + +
    +
    +
    + 24 +
    +
    +
    +
    + + 24 + +
    +
    + + + + +
    +
    +
    + 32 +
    +
    +
    +
    + + 32 + +
    +
    + + + + +
    +
    +
    + 48 +
    +
    +
    +
    + + 48 + +
    +
    + + + + +
    +
    +
    + 56 +
    +
    +
    +
    + + 56 + +
    +
    + + + + +
    +
    +
    +

    + Read Request +

    +
    +
    +
    +
    + + Read Request + +
    +
    + + + + +
    +
    +
    +

    + Read Response +

    +
    +
    +
    +
    + + Read Response + +
    +
    + + + + +
    +
    +
    +

    + Write Request +

    +
    +
    +
    +
    + + Write Request + +
    +
    + + + + +
    +
    +
    + D +
    +
    +
    +
    + + D + +
    +
    + + + + +
    +
    +
    + 4 +
    +
    +
    +
    + + 4 + +
    +
    + + + + +
    +
    +
    + 5 +
    +
    +
    +
    + + 5 + +
    +
    + + + + +
    +
    +
    + 6 +
    +
    +
    +
    + + 6 + +
    +
    + + + + +
    +
    +
    + 7 +
    +
    +
    +
    + + 7 + +
    +
    + + + + +
    +
    +
    + CR +
    +
    +
    +
    + + CR + +
    +
    + + + + +
    +
    +
    + LF +
    +
    +
    +
    + + LF + +
    +
    + + + + + + +
    +
    +
    + Read Data +
    +
    +
    +
    + + Read Data + +
    +
    + + + + + + +
    +
    +
    + End Of Line +
    +
    +
    +
    + + End Of Line + +
    +
    + + + + + + +
    +
    +
    + Preamble +
    +
    +
    +
    + + Preamble + +
    +
    + + + + +
    +
    +
    + 0 +
    +
    +
    +
    + + 0 + +
    +
    + + + + +
    +
    +
    + 8 +
    +
    +
    +
    + + 8 + +
    +
    + + + + +
    +
    +
    + 16 +
    +
    +
    +
    + + 16 + +
    +
    + + + + +
    +
    +
    + 24 +
    +
    +
    +
    + + 24 + +
    +
    + + + + +
    +
    +
    + 32 +
    +
    +
    +
    + + 32 + +
    +
    + + + + +
    +
    +
    + 48 +
    +
    +
    +
    + + 48 + +
    +
    + + + + +
    +
    +
    + 56 +
    +
    +
    +
    + + 56 + +
    +
    + + + + +
    +
    +
    +

    + Write Response +

    +
    +
    +
    +
    + + Write Response + +
    +
    + + + + +
    +
    +
    + + No Response + +
    +
    +
    +
    + + No Response + +
    +
    +
    + + + + + Text is not SVG - cannot display + + + +
    \ No newline at end of file diff --git a/doc/how_it_works.md b/doc/how_it_works.md index 6acdf30..0311b89 100644 --- a/doc/how_it_works.md +++ b/doc/how_it_works.md @@ -2,7 +2,7 @@ The whole system looks like the following: -![](assets/manta_architecture.png){:style="width:80%"} +![](assets/architecture.drawio.svg){:style="width:80%"} Manta is operated via its Python API, which communicates with the connected FPGA over an interface API like `pySerial` or `Scapy`. These abstract away the OS device drivers, which function differently depending on the host machine's platform. The OS device drivers ultimately send out bytes to the FPGA, across either a USB or Ethernet cable. @@ -12,7 +12,7 @@ Once sent across the wire, bytes are picked up by an interface transciever on th The logic Manta places on the FPGA consists of a series of cores connected in a chain along a common bus. Each core provides a unique method for interacting with the user’s logic, which it connects to by routing signals (called _probes_) between the user’s logic and the cores that interface with it. -![](assets/bus_architecture.png){:style="width:40%"} +![](assets/bus_architecture.drawio.svg){:style="width:40%"} These probes are presented as addressable memory, and are be controlled by reading and writing to their corresponing memory - not unlike registers on a microcontroller. Each core is allotted a section of address space at compile time, and operations addressed to a core’s address space control the behavior of the core. These cores are then daisy-chained along an internal bus, which permits a chain arbitrarily many cores to be placed on the bus. @@ -37,7 +37,7 @@ Each core has a bus input and output port, so that cores can be daisy-chained to Ethernet and UART both allow a stream of bytes to be sent between the host and FPGA, but since they're just interfaces, they don't define how these bytes are structured. As a result, Manta implements its own messaging format, with the following structure: -![](assets/uart.png){:style="width:85%"} +![](assets/uart_packets.drawio.svg){:style="width:85%"} Each of these messages is a string of ASCII characters consisting of a preamble, optional address and data fields, and an End of Line (EOL). The preamble denotes the type of operation, _R_ for a read and _W_ for a write. The address and data fields are encoded as hexadecimal digits, represented with the characters 0-9 and A-F in ASCII. As a result, four characters are needed to encode a 16-bit address or 16-bits of data. If the message specifies a write request, then it will contain a data field after the address field. Both request types will conclude with an End of Line, which consists of the two ASCII characters indicating a Carriage Return (CR) and a Line Feed (LF). diff --git a/doc/io_core.md b/doc/io_core.md index 16ff61e..ca777d1 100644 --- a/doc/io_core.md +++ b/doc/io_core.md @@ -90,7 +90,7 @@ While the IO core performs a very, very simple task, it carries a few caveats. This is done with the architecture shown below: -![](assets/io_core_architecture.png){:style="width:49%"} +![](assets/io_core_architecture.drawio.svg){:style="width:49%"} Each of the probes is mapped to a register of Manta's internal memory. Since Manta's internal registers are 16 bits wide, probes less than 16 bits are mapped to a single register, but probes wider than 16 bits require multiple. diff --git a/doc/logic_analyzer_core.md b/doc/logic_analyzer_core.md index edd9d50..8dcb3e8 100644 --- a/doc/logic_analyzer_core.md +++ b/doc/logic_analyzer_core.md @@ -139,7 +139,7 @@ At present, this class contains methods used really only for capturing data, and ## How It Works The Logic Analyzer Core's implementation on the FPGA consists of three primary components: -![](assets/logic_analyzer_architecture.png){style="width:85%"} +![](assets/logic_analyzer_architecture.drawio.svg){style="width:85%"} - The _Finite State Machine (FSM)_, which controls the operation of the core. The FSM's operation is driven by its associated registers, which are placed in a separate module. This permits simple CDC between the bus and user clock domains. - The _Trigger Block_, which generates the core's trigger condition. The trigger block contains a trigger for each input probe, and the registers necessary to configure them. It also contains the $N$-logic gate (either AND or OR) that generates the core's trigger from the individual probe triggers. CDC is performed in exactly the same manner as the FSM. If an external trigger is specified, the trigger block is omitted from the Logic Analyzer Core, and the external trigger is routed to the FSM's `trig` input. diff --git a/doc/block_memory_core.md b/doc/memory_core.md similarity index 99% rename from doc/block_memory_core.md rename to doc/memory_core.md index 1d8c464..2aa4749 100644 --- a/doc/block_memory_core.md +++ b/doc/memory_core.md @@ -68,7 +68,7 @@ A Block Memory core is used in the [video_sprite](https://github.com/fischermose Each Block Memory core is actually a set of 16-bit wide BRAMs with their ports concatenated together, with any spare bits masked off. Here's a diagram: -![](assets/block_memory_architecture.png) +![](assets/memory_architecture.drawio.svg) This has one major consequence: if the core doesn't have a width that's an exact multiple of 16, synthesis engines (Vivado in particular) will throw some warnings as they optimize out the unused bits. This is expected behavior, and while the warnings are a little annoying, not having to manually deal with the unused bits simplifies the implementation immensely. No Python is needed to generate the core, and it'll configure itself just based on Verilog parameters. This turns the block memory core from a complicated conditionally-instantiated beast to a simple ~_100 line_ [Verilog file](https://github.com/fischermoseley/manta/blob/main/src/manta/block_memory.v). diff --git a/mkdocs.yml b/mkdocs.yml index bc6c8f8..f027bdc 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -61,7 +61,7 @@ nav: - Getting Started: getting_started.md - IO Core: io_core.md - Logic Analyzer Core: logic_analyzer_core.md - - Block Memory Core: block_memory_core.md + - Memory Core: memory_core.md - UART Interace: uart_interface.md - Ethernet Interface: ethernet_interface.md - For Developers: From e2daf94f3fa5ddc1c653d3b28fec005bd5b4fdeb Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Fri, 5 Jan 2024 23:43:47 -0800 Subject: [PATCH 16/89] remove unneeded diagram --- doc/assets/manta.drawio.png | Bin 52590 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 doc/assets/manta.drawio.png diff --git a/doc/assets/manta.drawio.png b/doc/assets/manta.drawio.png deleted file mode 100644 index 7d0cfd613ff4564a2b9f56658047f09798952c92..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52590 zcmeEu1zePA*Z$CrpmbUYNOuS#N(e}ozyQ(>BOwig3J3@aNJuIONDU1`iiCuONQXL< zpoBCCi2r*Oc30PZcfW6U-}rwo{`@g>KlgJ#cbs#bbFOn9Lex~`NeJl(ArJ_O!bKSk z2m}KP{(r{D1ugU`7WUv5hKq*$c?hD5;T;5`Bn9d|UYLoM zg$s*-3=2QMDEQAJAPcUV+n886n>c{WHs)WinR@ET+v~chUOI2%epyt;!%e|N8QqG&8aPb*rw8xvTZTvi7Hk?tRh1#>)EO$$Y%~ zR~$?ZI`22QSeuwTxqrR?OVgKQaCUM6x5|Dwt_v3S=)F7Gm#_E9{l?Xw=I?Cbxc~5f ze1oc{y0(p}rLBgLl@(0DP0Lb9RFDgtF8YA4nb^DSFZgSNi>v3s4mdlxIhtFbca4`t z;JiEf=rv&`X6Wwj;K)InwX1_Y_{Il5{n}H=ub{uEnYg-II6H#AKnQq6 z(fwVWo$M?wIN3WngH{%P0a0G`KX3(R;cVkz0lK3fX5(lDE~A@)%$nPP6(8K<=;R1y zavsRM{dY}Y7XmZ+d4Kk|?3#tMtHr*2erej@et8Qg@IYrzFtz=w{382jw=cYWU}j(T z%l&6j5IB%j>tBe0(18?~?2Dh(Ph*4a-ak_C!NKFpng96we|TUAYxq|k*l!%mU$NO@ z-)=Vl!5;o%v&F=?`Gvkd>zCUtD7=5`pV@9b*i}VEIkih7R+p6d#I9a7mJ`+D;`_CN zn7X-qoxv}3#KIha#=gopIlEdrSvfhH*vtOhdj4B2`nk^~CnumnUv$UT!qwGt9|29= zT%CYe|3b5VbBA4=+?>B?Bj{nSC}ONF<}70=tgWph?DZrG$H~&PzzyufDPxZ zfzAtCp+7m8IJ%mEFJGF0_WgY2>&?GFKVVJ2-1`eR;2X34+cw(eC)+Lr9=ZQb>kA@s zfzAK1yWs?m!_xkXD`gEt!2$@&ckue_V?QvPf7tX3@b2HTZ~A{^jSjqlZ%ol&V2OTs zX8Y*;4U~OM75o#27q{sXs-@4#jFryQQZ0g(Lcw*9-g5r5R| zbMbNufS<1__P>R=eg9fOke6HR>qz@YC2-(zANUVny_n~r>TJ`0NBVfPK zH-U}j{X)-y5X{;0>#c&qUv5S>{CxM9Z{OUmc0k+hkNKOf`0pahpFH57I3e`(z$|`p z3J*^F4`YVNx0vy(fqnxszAzU5GZN#6`g0IYeq$QG)qWdCn47CHz{qc#|EHi}Z()g! zH_;5_rW9tik?C|20ks*MZM|ATNI(LLAKhzXmL6%7$!Xa7SW;y@?vFTsQ#Qj))>P|;2wFCcc%^!%43)Gy%T=j;MH)%H6%x?kqXK*r77#6r~44BYms zT%53(sD-H|xbmAu{Eri(0^fVyg8MH0FS0v7qGY~D;r~q{?S~uuYd+21$?9j;%+wjE z$`>Nk1Y~kNy#N!<&uix7{MYWirKN?i*$?;LTtv(i5Ey^U-U}QsBfqov-^bj4+1~F* zZ@<7R8>jz&w)ZFE>0hnEC_U{>vnJ z-yZxzl3oA5f@$G{>W1Ih;J*T1j3u<-GZ(TD`H>|Q z6BZFL5&mn?SWtL>N&Df-kI-0b-(UGZuEKSVK(GJz0;w=AZ^u&Qa{3Wpm|NiFuwdBM>Wy`mt z9+)=6{e0{ik^q2fFfah86o{!GWy&eOMv--zei>;X3@v;vcZA z2Pgi&Mu+bQ`kV1U^!K9-cfij6hr}2M+VFoC4fgr>e~ssGQ2L;Uu2T4&s)*lAe*E1| z|Mw{qVSZrc0poe_vri-aPxYApAoH>xJO0kFf45fuIv4Q04x<^>Kd04y&#MGK43I_l z<@(R-H7LU2=RGJG{Wi}3vuRAeZ#jvBvdsfY`Wtr*8Rt(Ey*6ox&Y| zQ3tBXPRepI5`_~=$+n1i`Vfhoq=0P~>3E=_H!_du_F<9B_>)oPW zj1hy@LQG<)5!ROuq6!$ei0GSdEx+E6TA@RC)~Qz@zNgcAQbtl#XOHfFB)9JgWDdev zTpDjA85Y@#utX1jP7Z_rBng4gdm1cVOT|j`jA*nmwx{dsh2GD@o`4=lpRr%jLcNR& zkYzTworuFk2D&s6;(+H}ekgG$3M|Mp8IySIvdFZ=6)=-q+&DDIo(zeK=U|FODj2wq zd5O+Uyx=C8IM8iYBW2VA=W@X1EC`m!fU?*jQ9_(zEbGMw{HqWN$dVBJL*6}K9271@ z3Su>HedB#D?gKVBKSTpdl-bBn3eEyC8dX1Jp@8?GMDMi_WUs8G#-_X+!Y`_}co@D; zIwjJ%ouT(cB-rk#-YeGT39JVn!|3-&-&H|#+qwG9hFp+dhmz*3a5^X+V_eC)kwZpC z@IVS{sk~&K8R8Yx*jsZE6JiEgD^?$LfEYsTOVT@yA(sT7ix8a?In$nC^^xct0baWU z=8G2ryP0}K@fhVK@Qf%oS?zfu$eQfqN5<(}rY{RC3v+J!^xp0sw>|p``j8SQ2?zQf z6GMO*o^|TeN5Xm|h$mxwh7)AIC^D5(Z&f@M1BSQsETEi?18Y$FX-5e?Ez+k zlGHV9l|vABuCt{Do*Q?=;suj;Uj7KS%#3;PEIP)>e zx2&25YtS)U)QniSo&lMTL0sh0@s>M~8ImW=K8JgS7mjhNfDuEDd-rn&27`dz^BPjG zGc53YNPEK60^ybNK)(oq8&x*K*Td7#+PM&k@WH9C**-E?!aRxxzYR%&Adl>2SQv$~ zp!}E?M^C-s_*j-I-{U6%nMzTQdf9Swe58l^xUWJ_4V(96^96(Lm5Y>nVK=w^h~QF? z?P3>EJ{V){ZK5VMoHcB2h1h|P!x@L{U&6TBVy@WYsA9etyxzrvk;Loi#0<}&dT>GQ zA&H3M)H8gHyU$PZlzqS#?SqK8AP<#mQ25qj!s{3=`If$||3nT6uT9qb$OUPAvNJTb zE@zqOCTO|6Vo#frMGBW%SQ@9oE9|(QXmuK11i8-eQGyr7s2;ZZ%p7M8m-}frr+BZ7 z4xQfR51mG={@lrah4*Hs0-{>^!`@#oCWm}_qb~= z9{p{C`lKb|xAkQ@5i0O|{5?;P)Qd-BW;N!UPP2H!l?FZ&(tpY@W?!?g`Vc~X!6~8W zkjSaYP7gByJZ|6kYkKeAx*nN(5vvrCb8N1CZHQd@0S$a@d?4%Py_G8cz_*yQ<{AW* zT=-pDPoieE*it;6o8Xh_N^xhmLoqFNyY&9WHgc54 z-tsAKdKXl}p&lxjCS>an{3A8?`si-iBE)he_m}~4<8<>!(<;n}6paU|tr+8J@mO)Y z>7@^4LUxnNI(89jRfpg@kPfaM638rTkxdRUd`~8()s|%_{?v+gRA63xfH0&jLt0h+ z;n~ELj4})5#DTe1cAOFTaS;g12vW0t+kGqEIOvIdo!vIS+F=L&m+@(s+z$Mw_iQm4 z86OHLW4B*{sAI&9usjj}c;!&wOo=OJ$F9vGb1rX;EwaT;Bm0+ZzS%Eu9~rh4&cMVV zm4>S=_e(X;DWOJsIf|!R)9f(e+{fA2b5Mn-tPg|~m)D~46F*-qQg6Ofs;a7Q+~x)t3kB<+h12U!tt7mcr%KGe(_>@z{QL!V zMxqkeN1-`KKW9yxahsaJ!iYMWwT0KI$|hsMCq@V@Zp9Z@OzS0^I{r}R^C==#1@n+z z2Vw6hF__IB=fZriXzN1S$!*zlj+C~kjxY6AX7n++^(rzQ33A-YAkKDd*?L=Xabhrb zW(U~)Q+D+k#(0^D;jU@tODH%H8$m%qBVKGtme-wS2PoN$YCM**HM8hw7?8FRfjy_X zYGIVKR&0haHN-|#b%5W->5#mv&-ZszS0bHy1$)X&G&ypL2*^6Ppxb(%TJt16I>dyF z6$`!#O0r2a({Hadv5RJ{wvmHt!=2_PO$da7-~^jITbi9!=EuDVbCC&8b0SwCAzMF(+V4DP1kQyzO$W}`PkobJ^bp!CGP)4x`~7#0$| z#*%$fyf}6=mN%lNyWUNPt1DL@19y@2um*3!z^Q^LS;aW|OCoOfDmwk;60ruyK3jMD z3=>h(q7tfkTaOD#Dk-sw+*>W`(^aa^P$CWNz%{F)m3Qjdxu;43%Vt{jdUrU`neK*% zC&jt)rMee3xZ=$A?xv^_E=sGu^XTWCeo25?C1-CteHi;4EB_}7)}@!j1|#!n^&**V z6v+DxcLdl!^m=Cw1}i_0bh92wIee>SgyK0Q4psHyk%s16YD81dsRSFTSsm(1nKbc? zb4NdM)o_b{lpe^7nmvj8F+_o*tX}AerGu?uw0DbZI!}%!i;mPOVkj3|gWFJkeJqzj z*Fb^slUuKFlA_f=gdHlElMdcv57pHIYLl9&rtO&5qj0nB6y@bGLb;Y){8`1&_pH^P z#^!J(YOG6G^Dn3g95SZ~q--tfJmnI#r+Uj>N#j(mk!f{)dLej?#WYbL^^)MQxPnQ- z<2QYXca%4X$i?aF* zzTP;@s2BPUM)z zaV)tBN$?7soKMk^&6rTHaMW)FLD0vpZLpm%TSynPID zwYyW-G5ZMf6X8Q;v2D}n1iTYix^tHaiJ|gw34R}Gk=r)Uh3GE>k28Rk71upHfc^$+ zT(G4caM(DZjA7I~a%yTr`F%-ZE@{$OE*0^MX}mDExOjTrG~lqF=nC!fZBITUf`Af? z8fWVkFbO*eKUsh5f(OAxEFN~jlGB0**fr_(RI2unj4?@ijV1A!;Vy8}vwMVh<+!Zp z!HZHy?2yVOn;+iX*i#Fo7vY|0$(nhA5fBg{>c1xuO2K|zD|*FFS1_&E}?!)WBhf?xk!0N|vVONI%hVs9$JyQU9#U4gzb9I}O@oYh-0W$VfEiRXlItb`<${kE znaOirE67L=S2DIj)2o)DAFe`Zmo6CI4 zEK0FWZ~Qf(7Na5O^mBE%N}b*?g;DhgEvsq{7h7E2S~7XJH?-K?!T_YAZ=!}z8RG(` zu3h9hgnKc1DlWiTt9WfIb^m92r}xiUpgRc!CiaGwVkal-cM z>-bCv)?gQ{Pz9`wgxAk!X!233*GcLd?5(YsEdK8*U1rpfyoM13O0@ju_4x*C)+`U) zKfGSr&@pv9SEKSllaAjUU+&Hx%?rQo6v@Z>Lh~U*Z|faiRh1PQwWaQSc=GwU|K4uo z_W3$<7QNN+_Kg-50$Jg2pNz-Nn14Jh>gD3AYU$YQC~>#Jwfz(i3LWr4N{+XZ(Lg#kv(1FFe==KVBDw?cR`)?+ofrX?lntmh|0bb zx2H;frTuN95bDb#X^|25;3OXbtvQp`&w#{!##8qo_Z8XMA)k-;SS7GDGcS=RYANOz z)mCkZ6`brvl1@b&m73dLp9?hJ*l-9{U$H61hH8fCvG><_y5#B0s=5#;ZD7W&w6B2$ zeLs38S+&o{V$p_-N3;T#4-6_Cg#+jr7&wJrTvDaJ{62yO70Yc%*Ak(AH0w^b#q-z+ znVaeLF$;H+4~N?0h6m5Jl8N$g9L)#EqVjGH;@FuWROG@c`$_arLxz4uw&j z5BpyJNh^qMxzshq$L5oXmZXHwhRuR7gCv7QM-*z712y=|;!A*GAQc>EX+<%-LE@B+9VT%J5-%)HSoy~JdlUbv9cPAv` zey!gpIu2dLZG7JJnrfTgQ+)--#zL@8)k}9rud7J9E{^F{eKQg<6z{FN9ZI7Y`;2(< z71cDmD&OrjbrNV*goFvEq`;Dy2B+ch-cYZ9v;^piGda(90l+5K>P0G4!IM2Y^@)Yi z3UUm4gi-Bj;hKAbb_1NdYeyt+332v6R>$(+mA+#~Sp6ykD&w)WbgZVPrqFk1k`VSRP;W6C1~?fMljvQp9bl5 ziEYrv0|ezkscG?p(h;^A zG?{^?q78@%t;$Ni8-V8!8oJrEw#W-J+a_M!$^#A4>*HErHYzcR^aAmq{|)7fmp+iT zG={$u=$JGk5)pJ2g`3n+5I=;x5fo?=gs~>&!%e!!-ygmC-UBJV#$K+|Rv(@(!2G<$ zVJguwC@k2{CVyV^+7YMMSl*xOXwzdgV@un}MM#$n-*GOr?k;1*&=E%kv+>Ov6F)nc~+U9Qi!&iEkM_7mLC=_IX!kJnc@m6hwR$>suH$| zNOrkKoyeJ{z|VI@rJ;R1Ss^jc>$Qs(k&ow2*Vk+FxoZxj$QDTyVIfcU-qsH0U7b-p zO%cY{Uf+LS7STA39x1-qQPa2QQ}D`ZTUdUYK1ST+c-26Si&L2Y&1*+W_LW6X!x|$92>sY}?)p-dhE@BK19>9@B9~VkXNOKseuaqkf zjxAtkybKTKPhhx*!8oOxVCLUqyAiKe1zM#(i- z9F*gm8mhBlR%V?8H-uT@#XL_s;*B-kqz#j5GdL+vnD^Ql!t{}FB(Eis_^Uz5JJ&}z zMA9&XJw|>)4!Pm@~r=@3|#V9y6Fr@=Fdn#wnL6>)^)A2T&K6$&VRr?+3NZ==Vg*tS)~TGNbZ2&}LOPOjrbA7{s!gd2FhgsL!sCLF$u4YYxYC zE-3Z3mWwV)E&$1fzPm9>h1yYK9{Ct?M@8Ir)$SEQ85yfKC{dp>a;dK|?%@fXim3mz z<6h|8>(>OFs>3k<#Xbf%I^heQUg1SoHcm=-(cDbN>oVKR3yFNcGdGKIH|EUMw;Ebp zF+_UB)92EeM@)yW(~5o?RL2+-wCR1Q^}67N`>e;Ki|-=Z((xwxbK^u^7WhaPM*}yc z`kvk8>%A*!#kBUJhcw)v^upll3!L0q`S9nLklIO2RD;X|{Qh}Osxc-tEb^gX`1>*I3MUOM%5M9AmVT@8_|733n0(3?R) zX`c?2!TLX>6<+%+y24Xz+0AI<)z-j*N~zn%4~ah6JRL@@mZeA@={{Ia!kh2(>=8L8 z($J6T=6mCrry*gRI9fbLqG8)_D5&de{nihc@0K54)wQQw;7pkdzpp7rfVyU@&73`^ zX?A^c{Hrx|COP+ssdbrdP z$7An>Fs5s!;ZamnV3p$z`7(d9aBK9jfUVC(7ramOXF)1t?h{_-^>)T)d-KHqj>Nks zWc7x1uuS+8&xL0p+bSudw@Ewa@KHKEiPRzm#vzZ+r8OxudB;ZSP;q1FPB%(kC=x<*E;`yyi*tn6$s(cMVe_e(OA>>Ais z-6`Q(T}DKM3`j$Lk*1=?o#ly-0`s4D=w4dgX21`E&q+GsZ=~R3jr;EnE-BL~ z%~;KpB^V1*u6dEuBZ73@iCKE`y7CkAY3gonc=a=@vrJON4Qn`dGQQP*Z{Qe`qePE| z5!zHN&$XIVYw^N1Q*fo8ecs!Id?cc>K#A8VA|V`CQZaMja|;XMwceYdu|`k)!lPJ} zCU!rrin`8{wa0K!XX72N58v=W*45Qnzj%Og{l<;v%M9z|37GCJv2L>;Cl579@;)BC zb8+@N)IJ9nU%lJG4O;g!nQYfnO1?A$}bd3v`gh~l7_EUS;CKLn&N`<4jD zOInmJZ61bw;!bI~h4HG;dY#m~BZ-nRaqy|~XFE(}?FLU$7w+=o{upB*KO&PY6|5Os^R@;HogPUr2thJxOf z@ojCXO9^Gfswon38K%Q8>Xe*z`|Jvr^8Iw{;2w8W@ZvG!ILGc%cQ5m@slj1AISXw1 zD|Yb%@*fG1?v9^WyT-RU69Uz5c!k=s@qF}q$LSOS_2hNm7R`h5>-NdhdrVDAZgd+; z_#VEESdh57yX2>iI5$2KUun(wGNZex-fhdQ2{7?H6fdxmr6xL=muPoayQP+vmd-VY zQmO-|z9ad}phbYvz(N2PUXmB7E_s+^Qcn=gQ=UDm)M26MJIpxa!@aDn@nQxy`{(^X z@nbTN$uCD)1c+WOoUWi8DzcEILTnrMDR9SDSA0G)<5^<1om-Bhn#z=ow;8wAAyqsKt8irRv`XPzEOs-l3uRwh)+ zSudj5foUtXQXBb1#_(0XCoKug)jyA@52Qq!=$d?a$BFJI z4G)yqGXpk(wTDfdhvdX{To<=Efj1f%6FxcKe!6Aa^g5V9Oo_+(HC{g{uOrOo0}|aE zF<&*^)5(RWh!;awDPXgi_gAY}&L0bXWRge>C27{uqr}q9fJ4WGD0%r|>5@zc^{jhb z(DW|i%`nPB1V|m}UUX%vr*d?C+~puw4bm~zsn=D{EG@n|vy4*MK62p*mPn8a=bao*;|4*cQ!N$l$=aIBNFn_Uv#8>$5w|JVwlCuH_lM(lq43(k;6Q4ItvU(wb7 zUT&&xwZzc=!_GL|dGKQaxn(H`+%eE0&0)0se9%alUAk--)dYJ(XdwOJ!`Ed(4igZG z00LmB+MVaxhu0*`%*^VJW5}!eN{{t?iJ_g3rb3}=AbxmyDx7nSRW;=b*d8>I5lY2H z=?LUrGHQmny3%|=ES zv}m#3n!k7i8wxDmSe-9DAW>*|ufXAK4r$tXm({hj(_{$dM=Mkzn@u4{8ge@C3$Ox| z=5u?m)t7HD7WKX zGH3`Jsn|c^%r+ZGLmvTU_ z9A*f6iF}?1X^OT#Pf}@<>BflzXTqX-9~Hd_2oS}X)3R%?7?2c7CPRfL2tnc3f-V`u z6Lq$LU(gj`U(dY-uX25-akcSweJ&)T7qCor?{~U2lK84OIrhLDU&flzQow+I>Sp?ot#oHvvFgKUBk) z!*xCE5HZwu5O2`Y9v~K7x9W?whxnBh%=n++ck9#X1`)IVj3CB2*d=9(e`-l6}|?JET5w|Iht^Aa+mYCY?VZN2lOCjc%4KMQjAJNp z3*NFVc$79*|aehyOSIx&*2Tku-KTIBssO_y3TKvFlF z8pk3E%<`CEgB46zcaKW2qr6j$v@SJJ)0v!C|E4EOwh)T>=;HogC*Z z7$>O`Q|o(}2WSnYrp9#x8oc|8-7f6L`4>1&N|e0Wm{_td&?^aa%zZGT}!f){6u1u92PXsU||`;#QueZ@{~^)NdMlB#l= zi}8mSo8@hKOu#^=yWZ8FE_LlZesP`B>DDm&{TzGUuCbKQ!qn2SAmIMI6VY^&DHUBc$$q5QA~wX4f7-t2Y83m9^5438X(4bp4P+Sz&<-5I{) zGm~vnmUbE!K`4t=9vkQ_Trh++M*sY7_98iDC?9Nr(rJ1te|_m}*M#$WSXOBT@l3Bu z0FgY8akc-dKmF*P<@qebd}64!e$?lI^Z^BJH>8G1{w{DQ1~>9}n5xE2$3s0=3pt*a z>v&Ba9Xt<1MTe)<+WHh&e6k}MYz49BH3H8k8J-)Sae3((bq;hbc|5i{kl)W zdTy^`u6Q;Rpj4k@Xc!Vh*F$ZmL5QxO8rFP4WSbHZ&nkkY`zb+Nv$1jKsi-^Z<+Sh# zdauXXEj652x*E#mu<4s-DE-0kuGht%bsQaR3>6PaftbQM7DV_BZ4ljxb2QEu3ahn} z9y7^Ur3->AzNZ^{TK9%pxdV#?s3u?bCobI=)39}I%<5?AG;l9+O|aztz_w%ZJmZ{d z`s2$*#{r{f?#2K(`a{fT;d@PY3jB#_a1nh`!k3QWBBr!xXpv@_JkOdrL<*hDq4Rp5 z;ng0W-jYZ-&(b5h55rg6)W_}+(~*$6-- z@jj)tzFb16lJpVJ&Yv+@Hn#%hhq^%gzK4pM+wj87-Xv`ArFLJAK56>4n_L7ZEsJ&- zw1WYesYWGOS#& z6c>RemmUdNEC+w!yJU={8;o$217>{LV$U{S z6nSP$lSTeBU&+!+KZiuEGg;%Q?i>E~j2)?hH20PIK3Tw>kIW|YvTFueavd@ z%{LHH+jE|7e+a@s;H^}_CyOnfFYSHuMjLv=>T8s4CokTGD8+I<-CCYp298{*!zdLN zE-~4NfuhUXj;CdIgS^1d<04Mwc3h5`g^a0Pa7?iACDpy-fz-#Uut-nXLU_7k^qdTN z)zq$(kc;_Nnc*bUojTJ-(%m|r1P|Z#0uJ5=Z@-f$;ap=ZAp_Tzu({yzSYC|QeqR4( zx!d$Z+R@rIW7VQHr|dLh8e`(m9!`M|gIooJC=3F2TOM%8I470jxWn(UYo>u9j7Ai8 zv~_!|(uLKsGa>LoFzG{(XhC|ep3=#?e60P$P!X1~?>c3Iumho!lM@B!WwMVe(?={Q zP%qV&K$>!7-s$Bd1zCFa%Shqp2^KVbS(`Z~K8jD(hu7Me6XAASUsiSgU0QsRHObz( zA$5^gd%s<`UMN>b*(qGO>ZWp&I0P`4fS+6lE^!Gqg}~o zPO!1z+YRJB1=pMBw7TBBVFrF~3veKDZnHZK7vsEpnbFt~NaXO|1_wz>F9;@_Ii~U) zL@jY6OQ6)oKv-r$M{;>9iU(w~I3Tf{?y~dxLQ0n_r0-lWax@xRZT8#oM!!Va8TN+>CeQpd|*m;rfaKy9!lA`|VxQ1{suFYg?#3MSS_s0BF;GfEB zMxRn{C^Bm)wC*{MF;?O9CiDnC;C`Nh97zPoZr$>U;n1Z*;DPFZ^yhIr)CJLQ-s|tR zL8Ocg*yrX$QoCe)H|>XuWg(*@NE+m|jw&Kc6I8ou!gzpEOO?iS?sbI=UTKCUUR$du z0>O8E%y+mKTi$p2qp|`faePWF6nXMSbN4VJ;YxM-n?BlnCTi{;LWuC!Co(6da|aU` zsY~1xpJH(63c=c(*H>2?tx|o1oa#QxA<0_Pgm4@|+T|vPC2-7<9?NN4mCOtbw?WMW z!ShY9zYS6b)z=)x9bxY7^5C$rYqE`sUE7qGdsU@|p>D*`#KV>5xVVVjQd%lx<_ye= zM=uz0;}jwDV#&<0%TtmR4v7QJAYUl`(UQmTPW=PnTFOi6FJggf`DeO2LZ zPurDex1Q5H)Cg(tY_{`sv53~~3=On1Vt2??FK%qtCK-!7AwSWXDB|&Ph2^x?V>rlN zOn|rr6FKD{PR)}7$#Fg<%F9cZE*F0I0Sh&TUUTWYjrm~#kQ0-&FYL)22Gl?27>O3o zN7uGgrPzXenR-c|twJ`lgspqmxu$P_I*X<2=SNHgT|I^)&dKd|Q=*!1E)aYRXyp5y8b3TUqs&1I>8e^wA-~cH*8> zjVy7Hl zN<3EpB@skSn@5@$VD}-1*YYgb*BT@-ES>InvS_PL6*umtJ*#l{v#!h6+b(!tR}mKF zu)%?riF8t+PM^J8+w#PF(-Gs!s#f0RB2{kj_!$$_d&x7~0|i*H;4?L0IUmRxZD%}? zsX4ow!(l^}AMjhR=W8Iab96ZuZfD=JZe**kb(x8P98EsW>t%|f^9{<|R0T;JJ2@Qg zmPVl={csf&-6cZ9>c*A^*OTqsx{yvMgnl5K1BrZKL+W@a9TM!tkax+30596-#=Hn}| zC(Ci5x&+;iElPRCi7tus&t6LeAsSN0-irfqLtIL-Uul|d4EeDc=D}%RA@3^{nqC<4-P7-H4+$f4 zox9Bm#pF(|&R4G_p0%XS$grz0`7r)u*&*ZQgl(bC`-y3G%we@eUpbW{EzjAQWsfPv z9H))Vdv)5Bd#sY0&C#keQS?PxLo9qWQ#O5UqNnP%3?tDo;pB0I#lkZTOIL9r|mz^@?^?!Nv(ZyKo6vmy&K>{qbnM6YJ zdc(@AtQ*W?A&mx91VX0;XW=>1im2cqp`{Pg^bNLqvEn$xahO3d+>&Q;WaXE^>C|_t`T<4M#ETFD6yw!3F-;#!mj z6l$UYCpr8z@@o36{w35?Ea1b;^jS9pW=G&KV?9gjK%Rz<4^74Hcv$SKpoxsn>I{2x zd631DT)arpNcw9FQlZbJHmC<(*_jq6S-aJ8F8YntZ9>3OLXhP*yh_6$+=hc(`n6(< zsiWbdSK)#KZch!;p^3I;iQ!NxVXJpu zx0j5LA|_tu7tw!y6#{WwO~nnftGpMHB5|kKZS?rsqQY3!4&=tO?x1d`Gsn*hZtNAw zo$=Q_7x)vYUH z6jp<4Zw)}fj}If%lp-ZEVD5pnm&G6kdIi^t^Ds8IJ4aiW-F!I{&titp`Q6|U*}L#C zr}H?FB#n>AO-YTn3#0B^Gb?W6x|v6(H_pD6FM_dmaq3mxW2?&x zp|mZymt)3G!=g{qY(XPvO=j5VpEXrQ3P}nT;KMzS4<~F?Ao#YA)!axNSOeBr7h7Qm>^ruWnepwzf+EEPC4t_ULW&0i7w|PFl6FMgwTw{sc7Z< z66}X7S(16Pk>a&2XKgHi++q^G&~u=y4sp|ZTs92{ zx$>$E8U-aG(siIxby<=s5;}e}oyp<;fDI9nw6uT#CZ->c73!kH4(Jq(;*j%vxX3m9 zHN%}dcaJ&Pddf0zW>doYpEXWfn~Y>?CKd#(J95{E^AwcEvTOj1*HUH<3kN) z2zo4CN5gmOrw1UqcFSp#wgm%bw-&e4dK>!3Fg~2*`^W%Z2^h$x#YH?SB!()CUkV+@ zMC9JIn({!tA3SfL9T31F)+>j{{fc33%%5Qv8xtp&w!c8Y*}RSI`mif4FH=^R@!_j5 z_B_+!!+}j@MxhVSNjtLLJAqSBL~&hRqgXXm50g6}*6}{&ek3=XbX!SUiAXnh>9(L+ zX!^N9FHo);o*-lw3JT-iYAD!`k3dO-x`6YV#B>5Hj$6i@Tb;fvH|9u@9ebU$?IuOM zB!b!bUiKYKPvlqQ$96@kZzacZ2XLh51u*DT2B<9f_hBlb*1kj3lcRE;kIE z=k<#bk9lMp8OBb9V7HE8*wC-ICzaXMDCxJ0^ccZvp2?8G@U7cjQ6j&U#06E3g_i0z zfTd!dz;aLNmhIrDS}75-E8H~ z)}JzcUK`eESA0ra3>so{8#leFQ5#p<@g4}tOo2Bm>bornR%uEIm2XiTrwzU;0hPDt zWqmSGKkb1${Z=8@%w%mX=yXc*k}&G#Eo1M^r=Oe3UY+-JxtvWSszJ1*?WnN;6Q(|gQe`Xw;-xa0skw%qr*we-UF^$5dinHfuvQUrlHk(~fA z{1YEdDWc1vmCg?yn+nt%&&}#Tyj;oX zPkSO%{mN2CZ_o)RgnfLiIb#)R0-F!AJ0E8~Pz)?X$uSw! znGrn~Hfgxoz#`o(@H|n3#{gNb0}lg5$1$mFjQ}34yV%jVw02$y2Fg(5m`;A2XePRP z{;5P!;9PwU?-d>3bU)&SO_vds%vMkb%kQYgl--(0fPmr(=wmu6D^z<}TYb!+iYBUkOi**!E$(zzy-=6yI|wu)nBz>XzEeWmMx)+z zsWUq-Y`DQ~AVGUHVxT@_4<-R^(*yAyK}$WTFUe<^i3=5~@7LEqVZ6}qmFLypLWMAD zmqWxE5`MurkivURAl$CbT>GQ%+-vRzh5$~s@HzJI55|X zTr3+C0NaZyh`WI&(#nC>8$S2p#w9mWg|7M*Q({oM@?Li85h3v3&d*_tJrhT2u)6u2P@!%@haB(wcHaxUP`<6R+1J5V9u;1;Yx-fB=lBOD)^#%={j*tk0!#qQYb$Z^!_BN&g65mv_WoGU1O_2_`yX$?)?I8yY! zzt23GCn!z*;Z41y{0>b?2o)fMmpqRn`ojsBDUx9)XcC9~$&2Z>uG9 zy+%AXri8zw;hb^8Y$`W{;;;{sv|q`%k@e9rrJK#O{orL7S|lA0yKjyes(miUlM_eD zkf5>zPdZB;@{pPAu!mM%iwgI<*loL`Do|ubF7c-6iFNyAur>WIzBW35Y&25L!qBY? z+laY+gf-$s_o0#kjhVNmD1KOS^~6a7Gn67B^~UWB%BGd=o9EJ_h@s&(1+9fZ`Bzd1 zIR9=OFu)mQrS_)A{!%R5g4+RhNd%^#UG_HG5*6dV~5{anCwIO^Waih?>z1k+gqHQxlM`s`jb~AX{GN*Q!9- zt5h}!F`06zRFda4c)Oq=vYKh=hwp5!+kvX&-$*nD5&~#@3QWn;?njrkg;8qx2!;Tl z(q3z`0c-Dil}=~)^OXbf?)Q(e>BR)XBCm_}kCTk&am1OZej~~FNMoDY3~b-JvBgL! zu!wy<{qRH{`^yku)U3-fLYxN_XQF zh@LG>X^_wK%D}0Cw6B%p39s{66ripXwzJ`Yjf-nq568evD-F>pGL?-i0O`-63a3=a zA}H9tshucbrGkxzXZF4?`>{a<0z;mvhXt&5uysx#%}E>$T6Au2nWg+Vt74DKhTh@^ zMbuOvuS=Oled$Q89DHMG2^L6n1dRjgQr9B4DHGvy&Y(Wg6o)oF8r{mLlNN3S&@d~+ zjJ?$^%S{2jm2*NFN+8kdsb@wE6O%~aJq`H$J>!CTJbm zJU2>53)I0u_nu!_Gabs7>mi5XLb&Zbww|J1vH4S=8O=|kSyj3BUX&T@Dxz1Lo2Lr` z+Dnzu z07Dg9uu%yHl?dxs{4fWeE4T=U@T3@EDzaTKK@iz7b2$TC;Q^E5#Y)mEX7g(ReihmP z_hGnheto!fSy_N%E*{NsRFXCWHx|^)n?$W4iZ4bUKQ4?QVnv@SOKicH9n$ai`6el; zuUlZ?`(0A<8iW^snHPem^L>PJy<4RR^4nx%^P}pF)0x9lbB5}zjfE{M*oKC;?gsle z)-D}IQZwhvm!LO^BeW!cegY{xPM9 z!73|s_n*%DJ?asVfh9`nbmHCa-{$pgaB|V|V+e-)LB4y6@vlJ*w@%dd~5$6!9v@ z-ai!sMAf2?0eQ@Q}e_ z!!261Hg7%BX9jYy-|ZIKXsb$s_qD#H)bgushqg;sCi%hjAj2t3Mu7fZ6aWxKqru6q z(~W3iIVB9IN4c!xN+XO zWq3+6qRSO6tU?0l^~AjBWYI-X*%~YcQF0L7)j9ui{a7EVh>u4kSmuhdz>BL)F-g&^ z!We@~%U~TQVMdqT7988S@^4gduhLL!-_XJE>y$CD&Ho$W_T+nDBJ zEqN7DpfH0Rc*HHhJ)W`}&YJ?Mt1wUkkOs0vI&%`vQ}}N?6N3SCPqr}o%fy`4K0a+l zq+7y%H9HjGMsG9Pow}#ReKuYSk^I`FzN!p=tmO{#Bq*^2^;>Ggy?2`9xD7*-&$yd{ zDn+Wf8t+Ynwady>+r@iqIOuyU>s;{#m0?GKDky?)F^4 zP_4I!^GsJbD9AAb`+m9b3dZdJ>+Gw;q6))3X$b*oLFtl~MnaI3kcJ_KmKGe5k_Ks{ z8)*e399jmHa3}#mx)FwwZUm(E8@>10dv~ARXP@;irw%8+^TsdU17O+#WaAieC`~+a#nQZZwy1F>jsxYZ1bai#r`CSR}QzY;K6>H`3|Kz;i z>b)-?WPxrrMe7CmDL`ec25$6eB`mmZY@@T)=^pB~*t3j&LygxHM%X)mP6`t^22{s4 zpl$KDAzVm`KiRBorM}imdANHmti}^ ztgZj553q`2a-Uk;HPjYAvn4k1NXahb4P8nFM{^+vl#R{D@F|0n94G-?4 z3r@plqUk+6jsU#q5WtJD+zu&McbTA4Q3c z{NA473_4#MVoedSU}*L^4k_B*1=cOJq6@1RxNj6rcIH?w8gD{Sqzlyo!8%EH?kC}xfcdQZ-MR79A~D} z$YSSsYXpNBR7;+n909VFFnW`(vC_qc?yBNI-5vp(u{=kDsXAI}9{1oCh%hffe?vK7 z*(T$?#}rK?;JP1~{zpgI3>zCFU>l28gSiEOG>DEvBi@LtyfHmljR@yKx~?r##fw5I-$!Ownm@hw@HGPE?;_P;tYBSSsIh{(SN|} z%?CatC;Q1I2)}LF6n;ZFrSc)jXk=SaAA!5Scv&pJsoGHNr^=Q;YEY_AX@KVp2K*H> z@R*ze^HfI^!N@WbZ2bc(eM!EsyG}@Yu(R`O_DRd%R9Z9g>mE!i_j6>maGK>(p{n=w z6?RuYH00I8JA13!QXyKV6vD3*b}JI z(T{S^uw35&OU8z-QI#8oPkcu73+$#sx!k+RF*G0kW@F~T@M7k#TC&zRS>aRCeYlmt>Yc_4Q$nz&DEUnE zp%wX8WDcT{Y|4gknjl_OtTGlj*hGWU=jI?%w`A@9kZ=NO=Z2^KhJZcH#Bbw=*3+^U zfA9XNC&dz*a4-fpWKi%83tRu=afY|tpGpNto0ys}*HJE52=!tT3Jh6~EAr?G2ZCz~ z(?oU~NzB+vLjRZtOMjNmO%iQdrjraYfqub&=KV*fH6(HhDBG`jHJS$pt8SSEAqq_a zD)u5X7`{z@iy+*+Uku0~3wKlQHPOrwzQec1F^aygyzjlmiDOmQ<|3=~bcOSu1?K{>pp=a}f7t^oZO-k>XkD4xosCjv`YDwy6YN zlYirQ|2i_S&wCd(1y$DULG#yB+HFsOYQWDfPQLkhyQ|8!%mq!E=uXJsXHHgd@O)W9 zl(`-(rj}{Ft;7<{LB9KKKFd9sRGSUkkCqtQLuxXL8<%e6>y^h3R;d_b?MzFx7f=Jd zMuzAi2o_VY1!d{@2-grYhweCfo+jad3vV(;FlFVZ4pw@|%su`v&_YFFh`66I2V9(@ zjiYoT4ndm}l`*%8R@;guwqI~*U*fnErYS`6x-{WwR2k|5;^ApaaG?*0&i$ZeS#gGt z-1eqPVfOGJBNZPxHzu5dIOeaJ#wK=6N0mmD`%%WNQTngy!$7hpq$5P6-nooat}k0G z5sU4N{HF4GB_4aS-pTGgnW4krBcno@X>p3m=d;zMnZto$7RpcJYc6*CN(dIrB~R~2 zyFLB7gWbLFQVT}}x;DUswVS+G@PzCi#|Y>Z!5%+pHY0RzP7C-wA_`SQ6UC61z@T1D z_pRTO1X^RcUQAoG)E)m0bd-zN#cgx7_VM0@ubbQ0y%d3M4rpyBZ?pi*A~Mgk!blL{ zI~}ZNxAAWyXm`w+0(bT@mI3!LUT$n5r^j*WyUyshe#NdEn5kTh*boB65dkso>^c#| zW~D2~NZ9MH(0g^hikWaxo_F>U-_qJf&&sQS8049e1et)mIdkAj7sBl+tLK&sx$PO; zB});@b?}{~UuG*E2l09^u+l94z~b9Hj%%zTW&9sNK2F}cb9*@z;Ds4 z*io=H&c#bNU1JbKb|8e4Gvm=&)OT$?enC4K=)g$0%oq8horA@6d}}eiJtdQ(`ZC_d znm^##2(E|o_>Im2hdl+CI){z0Gxb&Luix3fWt}ZG3E}S4-+>4^JPm{*ycr(UthNna zvFdzzOrX=fg)3a;IP?5lA|DOms=yntG7HtuU2hBdU~s2bMsrh@f8Fh6zezVmnhuA` zk429Sem1pu+LJOiUSn_!7=H7I3YaHA;biqHx7FR?%?Cx)7p6^-df(p1tT%7^gzjc} zb*~czAm!QB)5XSlQ?&pyf&rf|ApVvkQ~SYrdwkAe+R;+6+2+PYDCXR>M8$iuKMa}q%_V9CUBn!w3}mpw%HygzGq&?RzveW5|pw_-C{XIpOk#rR1fyE>ab?R zJ!EtWlpU7`Qg4_^{ca0pJ+Gd$XC~Q}3>W^T_0D%b@4jP-IQ-m#!m<)l&TOZVP3*>% zAXRAIk9SY+qePkEA7up1Dqrqv{nA<1u7y48PqjgR^Q@=SwW^p3aOv>mzq7h(*a?br zv(-rN+OUDT&J!sDQiG*3=`Pnb%QE`~_702xv_K+D<}m^@?P%~0VwB(I&E?5_AXbe# zvQ0#1O|b^9A&$5wizKt|$@B#nL0cH%H1nuoN% zf8_=8%ZupV!GUg&8V|4bJX+ums=w_cA{lIYH8XtA;ETwg-*>?{k86du)bw_R?OyYKzkzX842EDI7Y`ojLw zdUh}BbaVN|)1GW%`Y!>Ll@05|Vr&9lS}z&bUlZ^5t!FyQSugaUFUB>0HBo>hm!h{p_)?rX``IQ~ug zRy+^zp{8SBr`qU6t#1GP;?K%E%i2v^Fe6~Lx2JQ9a7Exvu9*+3MefBt`c)6ycAA?y}Boh=@oZb}PyG8cJO zYFr*`<9HTDXM_rW;%?>lB})nLTO76@7^v@c|1{g1dvP0A&DU~h%l4kBq{h7O$qtL_ z7sR)Ohwm_UTINZaeaGXq9vH65VY-g=b zt6LHyB~RjCv~v8Am~%w1r(fsu^oi^Fz*etsR^zq#=9weRD%9DG7{-*DoguR_(Wh7NFVKd`!|Tjbtd zK2dqU>f~0P!!RKTdWvr~`4nl@>Pp4zd!?hl14G*NN&BM6>sLZD5$YwZ;cplKRU=?7 zP4o6?>>V+Mg=+@OKhWnDMxUW|Z$)1kz8DVXg#o2?d7x?3RXZ}bS7V1H#ARTs@vixa z!JaGQyHWQN^g5Zwc8qW|ljyjjtG$SF3eeO_){!)f8ox4inxk#=c$V^K^=FffaF-@S zl;=mu#hzNuMa1N)K`SeSq#K*paZV3h`NC%?HNukDVdWj|v0-iXuh@9Su+l5GFC%_0 zPFkoW@;bWt=`}XNUfgB|ePUchxwYX~Zo9#ddmZIiFA{KU1Ce3s@*^IWJ}Ex>T9>I+ zu#e_Gk+E&DX`RpP-~B~lrb{n5r*0!^dcTTmW=o`wnIL?+k!bZ7zR%M3HlOu9?ManG zHcaS>Nu}->XG6dBTlGgiR1XR)|CREap~nTz6h0;h5W^8dS-X%1%Y}%~M^7z%w2NN3?WJHDHym|aI{+DeuTt5I7yr4}<~= z*IJhsAYxnGgC)=kO!)Z0{+Ri3G#wQ}kPGb(y_6iQ0s6%ES^ok6xW-M34bd_G1;dLBEsDcSW*Oo*`F$5RDQ-l1qxC9jxHOKEHma1aCr{ zKh_tEqPd&sM&e0B2DJ8{Vd2j?lU|M%BPTyIGxkKZ!%b)uRgoUqf1DfcwNY)RWo7`S zrhY`)_Tt{%#W_h@T1acjqV~4~pm@EJO49_{KXI*m98a_-*zLKyD*TkJ398bo2XkX9f$8xucVR)YSvp|k3Q4_Gt@ z8(7c{&Hn=}XMU!ojs`bP;GAbQRIPoCY|hlajnZuX=hn(-L&vP^7yAN=BTpu>E}6LQ%I zm^y@Zr&D=jyosFe4Vs&CNp#e&{#%96^~dU!?H?a^Mv}2s1zrb~)Rm~P-h^(J0j{*W zEV*0{=p6+l7~r!|MRhJb*Sc>zqsp{klERFWO*J0y^~1Zz%s-wxXn~u`SKnnthaP6(?bfV-=_`$P}jcKAm|(@#yh~|v5TnED6lUcsr4X)W^+L> zT|r-=Q)~BRa9&Up4I#s8K7nN?3=mIB%?Rtez&ugjUNc;z23B1K9A_2{k%EHqaVj^J z&&f_K$CE5eP^o`QV8%9SaOI=Cr&oLvNb*BLL;mjhe2WACR>2^Q!FMX8U^tJtE_(?T z7$ai%e)WlP$w!5^#D7Dbv!2^8J0=M7|Ly=(0MiK`$;kytB)=83Q9jz5q5ypoO=Ud2 z)Ocf#=NC~lFR^bxLCo%s0XU1;@K<${Y?$I;ObyTx+Y& z1Qdfs>NNW0hQw&>LLzya1vGO?=lv>Riw?k~Sx`JgKtKS(|6B|U8(Yw_4FgkWTCv=y zy70Dt6ghj<^ZAFEvlN_~_~l~2w*jjCE&vVaG`O0*O3l_wLa%`VHN7c9uxoPZ7;vF4 z0MCvIECw`>bqBa|og*b$o$I(Gij`#fGSbq}6(kPevU#pmJ*`#2?K{bj3q7-dGn{P{g5a+ZP?cnpbWTR} zJ%rMyrScnqH*Gy^7m^H20c{|7@PQXPa>Bmy!U;{YPLvX9D%pT2xeuj9Q0ChKUH)Pk zE&B>{($NVRi`t3JPQ|3&yEOV&dZ0&>9o+@+!o@}*nBzA}TwWlewLTJm{_~A?u=%_4 zR(Og8+N@|Wjt;TKP|GuH<;=wU*<_a`DM$W7g%PU5n`uuii2#35&v>IGCH_fUZ0bJDHk=9Ayp|GR8}h88V@_+MoMbHR7q-S9&O;=+A*27m~{=x7wk zI?foR8lM7sPUY}_q32$qqm+m0SxU&Nx@MC+9=y(dkP3l0)BBZAi40-?oNrzMJC*Ge z&&(93!95ja?)Ifv21J0H&?hu0ajAb5DdnCm|HZK9Vi3;5=m#Y5uXNSS#BDs*KS&cO4Q)N?m8s8lApSpt0hWjK! zsky&&TTEzOESWq=*ws$*zlpa1APo+kLSiM^+jBde8EXzT&o1ML4ozF7kP>?0AZ z;lEqqdT7Dr=ef&BR14v{JOm7`=r}fF8O%}h(5+E{Lo|3~LCmrxnlLbwMK3WlcAZH% zLWrmtLb}U5rVo>T@qNjvEPW782ZV&`93@YO|KZVf)nPn*xuav|vOi&{V$o{gsvZNix5o&0cACbu+9#}o)D~PB6SrPP09A&er$+V zlxT%>fHu&H5^e919IA8F+ZVA>dn@Kbt|eT&j6wwiHwq!q#PBAVV)Q5&3%BDC1*%j` zFE1}0!yD-#EJpg`k6GIK{_X2iki~(N6mV`^+xya|a@qn|Dyh_7=zIhdczSvM>ZMXdhQYkjqd%Za4^{Hno)*=}mLLnf*pH~P zyFqd{5)fNa54AFdZ~>9`2zXEm{md|Tf-tecthjfN3D+G^x<{u~r#XxirU>qd5{6E2 za?1V+4k!^d`>-dR2@Hbz0K^626cq$EFt_vajsm#A2B;n<>z&ir4#B96&Q|9MIQ_~d zA*|%d+wg;xJ}GQO>bFfyrdQrJ|9kzL+C1$n8T_>K3SbgOjc)9~Y8C~MZ$hH<1+;Vo z+U!FGJohTE@rXnFtbh?kr-gyI&7i{cVNt%DjO07SKjML+`>mZ@uOsGc;PoZs)YS2H z%)q4GK(;YP29!X?=cw%st#AUHDmg0eNg_+wq)6?N)Ce`uD!XOYQ-Yjh># z&9E9oFJmE88u+>z`kPoBlN2ZGyoFj$FJ7u1BY{`NpvT?|Sb^ts*MSnBhpRd<_Q z6SMO$9bTwCX16C*_s9s8cWJRsi=S8L_K$iWv7v>vdH;m9_`d|qI}=-fpn&^h@mMC} zO1>@U{PEjqdb1l(XG3OR(xzqD;S5u3L2$7tEPyos^R^ZyYZ)fDS5pF40Z_M)6`@M7LxVDWeJ4WLY?ahQ84 zF|chMOFmyuxf2Z>QDwIsjdax8*avm1G63+m^qp36;<>OR;jDSH53}i~XDpwP5DS0y z#rbK98^OWOFLSN^@&2_~kW}h6c1Hd)NO>Ah)Rm3>;zlgSmbtK$^~kgJI@IITN zM|t*dpnkmO9DJ`ADBXl$w7+hC1JuJ+FIP0GGYy;9wbsTz5e)lfa)V#>G2YN_ee(Q; z;v2D*QMQ+83AQ9!YgG7R%4$y6(=2GFRF4z$0(b)_MM1x8Ce*p1QB8mle8>Q|Mm-GN zCl7uU9~z&wpvrkm;|FTMyoLl^amrm;UxpB+p9({t9L=nH>NjNw)hApj7^5ZU_1l`x zmRNIi^Ct*8m<249Uj3X%)Jn#J>J4(Q&{w$v*?t#@DGt1*pKfLf*^--`0)NAPJE?5G zax5K7KJjH9{0wefs|-!ZXA%Pnw|Egy=CIZ>N*#hg`pfLlpQfG~E<}kH8Q5m_RPCDT z;W_WYJIfU5x-*Y+SEd?U&Fdb#$@Xro(9g`ThS?4_CUx8zy@-YeT|F`vebX*Hoz(LHU6gr<@xoRjmS>a3d7&FoT$CT9{=|4+iYpvQf@)&HY z9~rc{jFnM=6c7P)A5nOK@(%}w-~cQrp}cvSJ{QngDj0oUwZI4CW{6m*DS_x$O9*TT z%&9Bax8E44@9s_g=K^HN5OE~;+?osqts5)A{clTo0@wM`hunWc z>^0lp+`+CxN$f?CepB!fvDd3S+GZSluLoW`GQVceW%IQ1?1eVH!gt@UW}n4V*@*|k zxESE0uh=$gc zS-i`FQp4tyM+`d+>ZgcRDQTZtm6WZt;l-S)p&<}&dUy4C!-uDxb#=t63GK`D|aEr5vv^>pwVwqaTgwyR~xKQ;gMLDOR(W zixr?gGu&P|p$(D$g&MBk++!T1SW@}p1|9lLYBgKehzQseGZAx+Y#hNt>9^cu35Z_J z%bB|nrWG)^TR4el{#9QABv;@N$MN;Ag-!0 z5#bdetC_9YrXmww;2e>*HdHDqi}962^?TOcHq|$TS0ocQ4NF(ABlh;T;&cL<2M?FV zPj@TWA3yO8vJm6@TK9k~T#5g}nfL!nfVm-=~lE^4uvar?GtBQRmyf+~%xX zri6D`L2SjMi}JIrSW#+si5`S~=5%@}+w|Fb&eLy)F`M?RT(4EoL4N{!+oUA|&*gk^ zy4pbkQqg9ylTto{cc{=R-$UMsfEoMYQtvyrW%M9mE2IHVZ?UXyLb zKS-p-|8=pVIO?#^b#>~(Q<;w2b|&n~NxCN_&O%6(R=I@v!sxE~IESac(S(7l8zJQM zju!plP$TbJ|*~9s4%TKO&4rysaAQ7#i{A&$&u`Uj7GX z;q1xAkUojcZ8GsI4du>1+h36@P{Cra%pUkR*|AvRpSi0~C*gX8OIY3=}92>H(yV74^`+Io$9Q3H<K9-qXk6_&!C5K?QbPb_MF5oTFk4Vi za1Z$Pfq2r5il3r3jSn|Rpy8%tU|e0}BMsXZvzUGovX)~3gg+c`%z}+o5yMu5*ENri z2q8WbH~V^AgCCzsr3PM?H)iPOk*CxYB|z$`KxbwJu7jUxu*@@dX)y6hJhabRhK-Z+ zFtzHYFQURR%OCptSI5K*(KFd}7x5rN#GmiVhwqtDYQHp)sRMDp^rK-O;9?3=Pp02^ z_BJ1kEkI{BwUm3oU?%m!{aD@<)){3>I7zdvrk;HyfiP=d0CMv zBPW!Ho`V1)DWyapUg=;39;fq5;5!&F{))01j2y55>J-?E7bqTMPxkoaWD0Hw{CnlR z71Flh(M>v$$OxZj6L2#QW(q<`ZBsvVX!R~NIXscVz|xZ(?w-L0UEc~NoS5`RR0vKN zhE;Ee0Lu|_YU;tv*gBB4tnkcL2y`16J32aA&X9fj^r@Jde_m+t8U3>8T{b8yXIa}8 z*us5qCZ`Cf;JSrjj_p=RD)@j76KX^8=_eeHTl}Dfm-KP+cjRbnouO;8Mh+bN@ax%EXGRUf94WzuTt}Eg6L)8W^k9JY9&sQtuXm3b;Cn63t9U1sw z&`$j5s%6q+0pCu*IJQslEkfVaZ!y9Np1QYE^#gUOLj>{x9jl-3!bqHXhT!#$*}y$g z5*KL2b7A*lR&eNSY?uTPd}Zda1Q@%uehtiPE9TMp!>df@+f$CUN<88VuZxcd;SGUy z5-Q^!)D_{lr1rs`nK04BZ=iJy+id}3J1J%?ZEV`Zwypvo7qksTE4`EI@6%-Npf{TX zHtWG6WQs)&R~%KN-a%5`xzz$==f7xTHr<_^ua)@3>-urkN~dL#@KeAx-P)iRTe_g{ z*h)%z8 z>{?>1^2P_^s3pjD)d#B+a*{mf0Z>_3R>0@o@~+*ou;)1AIC_bhr%pv zh4DC??nqtWS4OG~P{G6S(;pI12$J<1;eo9`V<$RUueFy>_2p_YJ2K~XSELy1|ydXa_zU_<`llRv1nz=XKuMEpNXf5182Pg~(*R_d$!b;ri|>Q};?M|xYt0n~ zyZ`CgR0wDf58pMDk&)pO5w!zBIBIjV?_Ff|`79+9bUbwSp%Kue9lYKLaC#sJQjp!03jQ8l(*F!ra|a$FTBw5fNu@ z5Nl=&E!^9u4H0T&{6rezkP{1-bcvkye&yWXhc!uBm9JE{9Bw%L?Vm$^(*( zYvS?rxMHDCbLq z#BR;fgVQ%WSzgN&N|qfZ+ZFzC>~&LY7D;A->it%Cw5=qZqcd(Q^lx?Y$VnX+DR&~J z*y-`NU&7PeHiSIwrs9Go(m%CLgvD~IAw_cw9LS(dWC zQlJ{=_^Ep9otTvJKAqALt9N&vAje{1`-l(P-P|ipuS7m_bNGDO;pS4J#%gtqyF54U ziurLKf9?I&;Xc?c#pF+4NN=RKjI+)<^Jw>+(?r!>^>eT@z=u-Hs)9c3dct`OniRV? zj?D;5tIohg1h_u z*&D0WT?XWG9jJGHJh(;o%P@}-3$LPNEs zp*C&B*%=tpnqdl5j5g6a?myq#v}=!+ir%HWfapu9BJdL4+?={Eb@|oinqzx2ghb&s z#z4?}8ZGw4;Zo;&CSUflub9o0=@Q2B->Xr>7lD-FF{g`TT%o7Of_CS@Cu&`O0bIhg zAcdv-uQ}4rB#!i0kl=?0mK`I}sCNfoGHx2i>1mpuO*iDq~bMupO zv#47Z_BQ3y_VIaUuQJjYCS>xrOS)2vEnLar0og}tou6oQ7mEu&C@Aoo|NgL^Ecgl1 zmwPlS{P=+^DTznO!r1QOI&yM4tfrsGhQEdH0!S?#n0VoI*8eM+%{cM zLu2iAtj#hnSqQ8wIJ63GYfj^~4(=?yxlQuA1~duCB8$bNx4sE(ZsZC32)a|7ncNE$#;F4BPJ%sD;Anq^ex>?O&WS;qAp5-`2y!L zV$mq;BU?QfcafFpQl_m$$eKU73!A#82n~&l8FL2u2Deyt0to+sz5v<%+#pp={o6CV zq8;s`pW<~7L1;>P=cgzafE7&%ci>H{LsIp3&8`fkg)~O#`Kz(WAq|EdzPR>*w2%nA zomcTiGHg)wJ31Tj%-}DF4+`l`1K9E%7&2{n?d(WOFfpv0^2Y`rlN`=m_dO*o)R|*Y zpP1~vFnA*~cvFv_Vh2ENu#Hi!$(b2eCMFCtnhu7eEi5mGUR|CaT7%hV(EyEF1hF1n zx{@$Hd;_o^D^Tyl+}%e@xNA!ayb*RPnpE787zB__r*%qK zCAjxn3QBP#sqmzvHUkC-UN8-yL#NJljt)5Q!N6~AI1oHYoG$(p&Xp+6St_S6pzp{4xqSu-^LlTZH*-fyDdgXdOLi*N#wJMuz@* z^D(sr$`BY;fX1#97~`w0I|*|IL`3wN9u_Di!on8cBS+=sdXQ8;!#6EaH%2J}gFeDW zhKFy_)5ikeR3Si35uV$0pe}E;WMyHg0uTCd-yDy<{+yS`XhGcIFoXq8#;+NI>gvkE zK(0Mz6gN!!gK9CS98y%qMpg7aDpxj;0eENS+}wmfN7K#TYhLKT_w~k?@4#ebJ>TLF zMF7$HQu#C(^~)kEN`-z}2e3l0jk$z_eqC6um^(!!D75^GV9$6VIE4MchT7V`i*rzt zp}=Ll*bJ*6J(uEe08Ca9V+Iq7+wZ5&p@u?Gs52d0zswVh4VuMls0v=Dw(~zP0R{P& zi&D=s`~=vFjXjm|?Bb1Jo zwue;e{=QRa-&HPsm(6tojOtzx8K^x3Y z5trpi4h}cjlFGtizyMAMX{an6R2AMId99`osD^+DXDrXMXzDb`buHX&4AI1n%CfZ6 zODto~Urx3&q$d@xq2VTdTx!4cJG!(=C#C<8(F&eQrlk#{_vidTes#!lcy zrMho26VJA|PGq_Jyz=2hO-gs8AJ=j%=CtUGaNiYOmd{E&&_t0^-mzOuD7pvwrX-x! zC;N&ba07x^X9KYs5nJ2V#O$s+byh!U>m0Y<#O*$aabhBXP^xmP7=U|S`Q}9DX6fmC zlZ5+m8F6PT*GwzXQE|bCOb@;p<;U7mW7|B^V{e z#RF2+_hGRa?kNUif44R7CEHmLK)iX2zg@(BOyG2WE%5c)V>&7WYg0M=`KZLo>>|J^S$wz>1jIAT65_@ zl9`LMSZ>ya?{yJ8ce$t>!oc2=-!PjYJXs&%j5Kd0q?bIAOJq?xF0-;;fJvnA$Bf~aJP z7<-jAmTpV?SY#TrRn2i?QykV5hwa5mF9#4J};Nb*@`gb7m zW-3@k!d~jLKb5F=;kxiyus{9%EaFw)c!6U~+S+h2!N&M=ta;{lsJR;cw2xE4tGSG} z&NnD_HdcrP-JaoRb2l>aF00q=>=A^N3@8(qAic|tUfjGbi6`^tw7{62b1P0&E;s~t z-|98@sow(rXoVT+2>=9zu(;Q_By*cKX8tj_sKb$ zoL&9v^V4*RgT9Bn7xV7fhy>&{e`Q1{&(mpbW*m9x{u=%(OV5qafplIL@%rj2KoI22yv^Tq3 z94Nywf%Bk&Qj;P6(GN|&)993_G}ZgR0B{HsBhi^5Ib^)N-H0)-Nq~$x^g_Ve?F5w4 z87}ju+HH}xrbLM`b~b%2deT37Z4d81aA2e1=lLE0GCRjSeH#L;IObAtA4#(1d0 zln|_0Wk8qceDQu!C7aHr$6+c1>X-1*?H>4TnzPAQeiaQcxX;BtzX%oiOHe8ELg_)Ydp}ju&HR! zRVRyvM2*T=nkRgcnFUtSw*LOunBPD#5V)k2mDE7#28S&zY34i6aQK-9ebjBumE4St z`eyik%WBc)M|fVE&0HCNg;8rnCCux}hZ^p>15g9ocBdBZT*k)WUse{%eu5V-`Jt6v zV+&I5B0eXKy@6eZEfr>Y?$_DRy*fJPm$$8cq{a|@SkNbUK9kOYN@9r&io(Cm0)0Z^ z7M;%5J(*6Jlsg;x*`}Lh6mE9snbI_P{2BC%HyN0$s-my2|4A~1clO+|)Ioa=bA}{0 zxVHSx!{1Ipe`4PjBMAEAQHFl2Y(ftQO}5DqLaVo?dN6FnYAL6=1$1 zJVCuaUz@3?qUN2C+z@rL{yzB7kE%cPj>t4A4f&#=?~v2`Vxa#{>^ARsk|9J9JI@u- zwy=IW`y5B>$EQ0+rsal#U{yPE=y9;*zYU^9tx^h@ZmXHEtWvrHmvJ?))Pm;^E<`W} z$boKocz9SFs112d>hNWJug>$3YSjF%JAOZ#`h;=LZE4%#*OIE;JHQZp)gnRVOF2W* zQ2=hg%y%83zQ5ghC!I26wumBZ%Nq_2I89MIl71v0FWbXmQ(g!vp3m0H`MHzz$76&I z1~ZzIwZd6MCj%CN)~=_NS1bcR3vP0MZu&Y^#63^+v*iKdJG_(L3MnQBLcH_9B9E>? zb>X>I?UWFF2Ug2Bu-fSK%c+FR(eGj_l>ENI$yr&1Qc_YmtR?QK8j|-#a|%64P3KAV zwdjYXs2#ZI!^*O^*$c#1-qEenwM%!;9QLLBFd?CJ$I>QrESZ)8kM*5?~|H;EP; z8H%o7Z>mP!Gi?bmccEklI7<0TCp|18b|!g*a)IE)kon6%YCB5GN0|*Se+Wi6aSN}R z0%u$E!dGH`?Flf|x!iFmH%WnUrG?~U7F+A9$n|<5QDw|&A=*_KlTmfxVNrYS z#NeriA&|G49}E>vf|I^XKLXsIyne1IdBT@#Cp9C`Kc=`Br9MHXcE!4p1y}q{nhH;2 zd7wi#RS|_zy069`2Zi#y7zH(%2n^)F*gGpVH$edtwe%R7iWe99U*2$df^0s6&{$wSbt{;)UNus{53UBGpmeh#mAZ1|*-iayU@E4{=5@9-wR2d`*ue zm?O#m;X~II4}iV!HM3iY1k)m|WRQc9_E8ko;=#XMjx(XWqcPq;S=k(I% zLm5K?%s>=6YV;M9FCoFYFQy5=ZigG8+c44imYe>Zs9ubmGX0z2wRJdBl1_df_R%K0 zG`*362{ruvzBs0&qn+!bejdvpuAKu024;<_;v;?hzYWr00Vt@0xT_xn3rTbjFd^0DOVjDTZy|ee3Yu<=7iGWc~usMB2bniw_3Q=m8 zf5QIv8woJJ7y6}I=)Fh+7b&q_K9=SG{evLu*7hQAM0B>m=smFgH*DwwYg$Cri{;4WyD#GP0L;eTKas=4` From 7fc7ddc75c0b996629750e7be4a80fec6b0d87a0 Mon Sep 17 00:00:00 2001 From: fischerm Date: Sun, 7 Jan 2024 12:09:38 -0800 Subject: [PATCH 17/89] fix bad comb assignment --- src/manta/logic_analyzer/__init__.py | 5 +++++ src/manta/logic_analyzer/trigger_block.py | 5 +---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index c55b82b..4b8f466 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -191,6 +191,11 @@ class LogicAnalyzerCore(Elaboratable): def get_top_level_ports(self): return self.probes + def get_probe(self, name): + for p in self.probes: + if p.name == name: + return p + def get_max_addr(self): return self.sample_mem.get_max_addr() diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 9e446e0..2b15530 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -67,11 +67,8 @@ class LogicAnalyzerTriggerBlock(Elaboratable): for t in self.triggers: m.submodules[t.signal.name + "_trigger"] = t + # Connect IO core registers to triggers for probe, trigger in zip(self.probes, self.triggers): - # Connect trigger input signals to top-level signals - m.d.comb += trigger.signal.eq(probe) - - # Connect IO core registers to triggers m.d.comb += trigger.arg.eq(getattr(self.r, probe.name + "_arg")) m.d.comb += trigger.op.eq(getattr(self.r, probe.name + "_op")) From 4c48035201421a4872c7bed9a77b59989db25f12 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 7 Jan 2024 12:49:20 -0800 Subject: [PATCH 18/89] track amaranth release, not main repo --- pyproject.toml | 2 +- src/manta/utils.py | 25 ++++++++++++++++++++----- test/test_logic_analyzer_hw.py | 10 +++++----- 3 files changed, 26 insertions(+), 11 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 575c948..d8ceffc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ authors = [ description = "An In-Situ Debugging Tool for Programmable Hardware" readme = "README.md" dependencies = [ - "amaranth[builtin-yosys]@git+https://github.com/amaranth-lang/amaranth", + "amaranth[builtin-yosys]", "PyYAML", "pyserial", "pyvcd", diff --git a/src/manta/utils.py b/src/manta/utils.py index 068501d..a680567 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -109,21 +109,36 @@ def write_register(module, addr, data): def xilinx_tools_installed(): """ - Return whether Vivado is installed, by checking if the VIVADO environment variable is set. + Return whether Vivado is installed, by checking if the VIVADO environment variable is set, + or if the binary exists on PATH. This variable should point to the binary itself, not just the folder it's located in (ie, /tools/Xilinx/Vivado/2023.1/bin/vivado, not /tools/Xilinx/Vivado/2023.1/bin) """ - return "VIVADO" in os.environ + from shutil import which + return ("VIVADO" in os.environ) or (which("vivado") is not None) def ice40_tools_installed(): """ Return whether the ice40 tools are installed, by checking if the YOSYS, NEXTPNR_ICE40, - ICEPACK, and ICEPROG environment variables are defined. + ICEPACK, and ICEPROG environment variables are defined, or if the binaries exist on PATH. # These variables should point to the binaries themselves, not just the folder it's located in # (ie, /tools/oss-cad-suite/bin/yosys, not /tools/oss-cad-suite/bin/) """ - tools = ["YOSYS", "NEXTPNR_ICE40", "ICEPACK", "ICEPROG"] - return all(tool in os.environ for tool in tools) + + # Check environment variables + env_vars = ["YOSYS", "NEXTPNR_ICE40", "ICEPACK", "ICEPROG"] + if all(var in os.environ for var in env_vars): + return True + + # Check PATH + binaries = ["yosys", "nextpnr-ice40", "icepack", "iceprog"] + from shutil import which + if all([which(b) for b in binaries]): + return True + + return False + + diff --git a/test/test_logic_analyzer_hw.py b/test/test_logic_analyzer_hw.py index 1b6b063..49d064a 100644 --- a/test/test_logic_analyzer_hw.py +++ b/test/test_logic_analyzer_hw.py @@ -37,9 +37,9 @@ class LogicAnalyzerCounterTest(Elaboratable): m.submodules["manta"] = self.m uart_pins = platform.request("uart") - larry = self.m.la.probe_signals["larry"]["top_level"] - curly = self.m.la.probe_signals["curly"]["top_level"] - moe = self.m.la.probe_signals["moe"]["top_level"] + larry = self.m.la.probes[0] + curly = self.m.la.probes[1] + moe = self.m.la.probes[2] m.d.sync += larry.eq(larry + 1) m.d.sync += curly.eq(curly + 1) @@ -75,10 +75,10 @@ class LogicAnalyzerCounterTest(Elaboratable): @pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") -def test_mem_core_xilinx(): +def test_logic_analyzer_core_xilinx(): LogicAnalyzerCounterTest(Nexys4DDRPlatform(), "/dev/ttyUSB2").verify() @pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") -def test_mem_core_ice40(): +def test_logic_analyzer_core_ice40(): LogicAnalyzerCounterTest(ICEStickPlatform(), "/dev/ttyUSB1").verify() From 61d6479805eae099e7ee12ef50c6086f0cde4313 Mon Sep 17 00:00:00 2001 From: fischerm Date: Sun, 7 Jan 2024 15:13:35 -0800 Subject: [PATCH 19/89] add docstrings --- src/manta/logic_analyzer/__init__.py | 133 ++++++++++++++++++++++++--- src/manta/logic_analyzer/playback.py | 11 +++ src/manta/utils.py | 4 +- test/test_logic_analyzer_hw.py | 6 +- 4 files changed, 134 insertions(+), 20 deletions(-) diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index 4b8f466..fcb27d9 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -8,7 +8,29 @@ from .playback import LogicAnalyzerPlayback class LogicAnalyzerCore(Elaboratable): - """ """ + """A logic analzyer, implemented in the FPGA fabric. Connects to the rest of the cores + over Manta's internal bus, and may be operated from a user's machine through the Python API. + + Parameters: + ---------- + config : dict + Configuration options. This is taken from the section of Manta's configuration YAML that + describes the core. + + base_addr : int + Where to place the core in Manta's internal memory map. This determines the beginning of + the core's address space. The end of the core's address space may be obtained by calling + the get_max_addr() method. + + interface : UARTInterface or EthernetInterface + The interface used to communicate with the core. + + Attributes: + ---------- + None + + + """ def __init__(self, config, base_addr, interface): self.config = config @@ -39,15 +61,6 @@ class LogicAnalyzerCore(Elaboratable): self.config, self.trig_blk.get_max_addr() + 1, interface ) - # Top-Level Probes: - for name, width in self.config["probes"].items(): - if hasattr(self, name): - raise ValueError( - f"Unable to assign probe name '{name}' as it clashes with a reserved name in the backend. Please rename the probe." - ) - - setattr(self, name, Signal(width, name=name)) - def check_config(self, config): # Check for unrecognized options valid_options = [ @@ -196,16 +209,31 @@ class LogicAnalyzerCore(Elaboratable): if p.name == name: return p + raise ValueError(f"Probe '{name}' not found in Logic Analyzer core.") + def get_max_addr(self): return self.sample_mem.get_max_addr() def capture(self, verbose=False): + """Perform a capture, recording the state of all input probes to the FPGA's memory, and + then reading that out on the host. + + Parameters: + ---------- + verbose : bool + Whether or not to print the status of the capture to stdout as it progresses. + Defaults to False. + + Returns: + ---------- + An instance of LogicAnalyzerCapture. + """ print_if_verbose = lambda x: print(x) if verbose else None # If core is not in IDLE state, request that it return to IDLE print_if_verbose(" -> Resetting core...") state = self.fsm.r.get_probe("state") - if state != self.states["IDLE"]: + if state != self.fsm.states["IDLE"]: self.fsm.r.set_probe("request_stop", 0) self.fsm.r.set_probe("request_stop", 1) self.fsm.r.set_probe("request_stop", 0) @@ -215,7 +243,7 @@ class LogicAnalyzerCore(Elaboratable): # Set triggers print_if_verbose(" -> Setting triggers...") - self.trig_blk.set_triggers() + self.trig_blk.set_triggers(self.config) # Set trigger mode, default to single-shot if user didn't specify a mode print_if_verbose(" -> Setting trigger mode...") @@ -258,14 +286,52 @@ class LogicAnalyzerCore(Elaboratable): class LogicAnalyzerCapture: + """A container for the data collected during a capture from a LogicAnalyzerCore. Contains + methods for exporting the data as a VCD waveform file, or as a Verilog module for playing + back captured data in simulation/synthesis. + + Parameters: + ---------- + data : list[int] + The raw captured data taken by the LogicAnalyzerCore. This consists of the values of + all the input probes concatenated together at every timestep. + + config : dict + The configuration of the LogicAnalyzerCore that took this capture. + """ + def __init__(self, data, config): self.data = data self.config = config def get_trigger_location(self): + """Gets the location of the trigger in the capture. This will match the value of + "trigger_location" provided in the configuration file at the time of capture. + + Parameters: + ---------- + None + + Returns: + ---------- + The trigger location as an `int`. + """ return self.config["trigger_location"] def get_trace(self, probe_name): + """Gets the value of a single probe over the capture. + + Parameters: + ---------- + probe_name : int + The name of the probe in the LogicAnalyzer Core. This must match the name provided + in the configuration file. + + Returns: + ---------- + The value of the probe at every timestep in the capture, as a list of integers. + """ + # sum up the widths of all the probes below this one lower = 0 for name, width in self.config["probes"].items(): @@ -282,6 +348,19 @@ class LogicAnalyzerCapture: return [int(b[lower:upper], 2) for b in binary] def export_vcd(self, path): + """Export the capture to a VCD file, containing the data of all probes in the core. + + Parameters: + ---------- + path : str + The path of the output file, including the ".vcd" file extension. + + Returns: + ---------- + None + + """ + from vcd import VCDWriter from datetime import datetime @@ -310,7 +389,7 @@ class LogicAnalyzerCapture: writer.change(clock, timestamp, timestamp % 2 == 0) # set the trigger - triggered = (timestamp // 2) >= self.get_trigger_loc() + triggered = (timestamp // 2) >= self.get_trigger_location() writer.change(trigger, timestamp, triggered) # add other signals @@ -322,11 +401,35 @@ class LogicAnalyzerCapture: vcd_file.close() - def export_playback_module(self): + def get_playback_module(self): + """Gets an Amaranth module that will playback the captured data. This module is + synthesizable, so it may be used in either simulation or synthesis. + + Parameters: + ---------- + None + + Returns: + ---------- + An instance of LogicAnalyzerPlayback, which is a synthesizable Amaranth module. + """ return LogicAnalyzerPlayback(self.data, self.config) def export_playback_verilog(self, path): - lap = self.export_playback_module() + """Exports a Verilog module that will playback the captured data. This module is + synthesizable, so it may be used in either simulation or synthesis. + + Parameters: + ---------- + path : str + The path of the output file, including the ".v" file extension. + + Returns: + ---------- + None + """ + + lap = self.get_playback_module() from amaranth.back import verilog with open(path, "w") as f: diff --git a/src/manta/logic_analyzer/playback.py b/src/manta/logic_analyzer/playback.py index d5eea8e..cc392f3 100644 --- a/src/manta/logic_analyzer/playback.py +++ b/src/manta/logic_analyzer/playback.py @@ -2,6 +2,17 @@ from amaranth import * class LogicAnalyzerPlayback(Elaboratable): + """A synthesizable module that plays back data captured by a LogicAnalyzerCore. + + Parameters: + ---------- + data : list[int] + The raw captured data taken by the LogicAnalyzerCore. This consists of the values of + all the input probes concatenated together at every timestep. + + config : dict + The configuration of the LogicAnalyzerCore that took this capture. + """ def __init__(self, data, config): self.data = data self.config = config diff --git a/src/manta/utils.py b/src/manta/utils.py index a680567..bb20271 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -116,6 +116,7 @@ def xilinx_tools_installed(): (ie, /tools/Xilinx/Vivado/2023.1/bin/vivado, not /tools/Xilinx/Vivado/2023.1/bin) """ from shutil import which + return ("VIVADO" in os.environ) or (which("vivado") is not None) @@ -136,9 +137,8 @@ def ice40_tools_installed(): # Check PATH binaries = ["yosys", "nextpnr-ice40", "icepack", "iceprog"] from shutil import which + if all([which(b) for b in binaries]): return True return False - - diff --git a/test/test_logic_analyzer_hw.py b/test/test_logic_analyzer_hw.py index 49d064a..9b456d4 100644 --- a/test/test_logic_analyzer_hw.py +++ b/test/test_logic_analyzer_hw.py @@ -20,7 +20,7 @@ class LogicAnalyzerCounterTest(Elaboratable): "la": { "type": "logic_analyzer", "sample_depth": 1024, - "trigger_loc": 500, + "trigger_location": 500, "probes": {"larry": 1, "curly": 3, "moe": 9}, "triggers": ["moe RISING"], }, @@ -76,9 +76,9 @@ class LogicAnalyzerCounterTest(Elaboratable): @pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") def test_logic_analyzer_core_xilinx(): - LogicAnalyzerCounterTest(Nexys4DDRPlatform(), "/dev/ttyUSB2").verify() + LogicAnalyzerCounterTest(Nexys4DDRPlatform(), "/dev/ttyUSB3").verify() @pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") def test_logic_analyzer_core_ice40(): - LogicAnalyzerCounterTest(ICEStickPlatform(), "/dev/ttyUSB1").verify() + LogicAnalyzerCounterTest(ICEStickPlatform(), "/dev/ttyUSB2").verify() From ee4a3026af9a54bdd87543b4145323087f1b6928 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 7 Jan 2024 18:17:09 -0800 Subject: [PATCH 20/89] refactor to use common bus layout across all modules --- doc/getting_started.md | 2 +- doc/logic_analyzer_core.md | 2 +- src/manta/io_core.py | 30 ++++-------- src/manta/logic_analyzer/__init__.py | 36 ++++---------- src/manta/logic_analyzer/fsm.py | 19 ++------ src/manta/logic_analyzer/trigger_block.py | 17 ++----- src/manta/manta.py | 21 ++------ src/manta/memory_core.py | 56 +++++++--------------- src/manta/uart.py | 58 ++++++++--------------- src/manta/utils.py | 37 ++++++++++----- test/test_bridge_rx_sim.py | 22 ++++----- test/test_bridge_tx_sim.py | 12 ++--- test/test_logic_analyzer_sim.py | 18 +++---- 13 files changed, 119 insertions(+), 211 deletions(-) diff --git a/doc/getting_started.md b/doc/getting_started.md index 8da0adb..2913ef3 100644 --- a/doc/getting_started.md +++ b/doc/getting_started.md @@ -31,7 +31,7 @@ cores: my_logic_analyzer: type: logic_analyzer sample_depth: 4096 - trigger_loc: 1000 + trigger_location: 1000 probes: larry: 1 diff --git a/doc/logic_analyzer_core.md b/doc/logic_analyzer_core.md index 8dcb3e8..5f245c1 100644 --- a/doc/logic_analyzer_core.md +++ b/doc/logic_analyzer_core.md @@ -14,7 +14,7 @@ cores: my_logic_analyzer: type: logic_analyzer sample_depth: 4096 - trigger_loc: 1000 + trigger_location: 1000 probes: larry: 1 diff --git a/src/manta/io_core.py b/src/manta/io_core.py index c12096a..b1d9e5c 100644 --- a/src/manta/io_core.py +++ b/src/manta/io_core.py @@ -88,15 +88,8 @@ class IOCore(Elaboratable): def define_signals(self): # Bus Ports - self.addr_i = Signal(16) - self.data_i = Signal(16) - self.rw_i = Signal() - self.valid_i = Signal() - - self.addr_o = Signal(16) - self.data_o = Signal(16) - self.rw_o = Signal() - self.valid_o = Signal() + self.bus_i = Signal(InternalBus()) + self.bus_o = Signal(InternalBus()) # Input Probes (and buffers) if "inputs" in self.config: @@ -187,10 +180,7 @@ class IOCore(Elaboratable): m = Module() # Shuffle bus transactions along - m.d.sync += self.addr_o.eq(self.addr_i) - m.d.sync += self.data_o.eq(self.data_i) - m.d.sync += self.rw_o.eq(self.rw_i) - m.d.sync += self.valid_o.eq(self.valid_i) + m.d.sync += self.bus_o.eq(self.bus_i) # Update buffers from probes with m.If(self.strobe): @@ -209,17 +199,17 @@ class IOCore(Elaboratable): m.d.sync += output_probe.eq(output_probe_buf) # Handle register reads and writes - with m.If((self.addr_i >= self.base_addr)): - with m.If((self.addr_o <= self.max_addr)): + with m.If((self.bus_i.addr >= self.base_addr)): + with m.If((self.bus_o.addr <= self.max_addr)): for entry in self.mmap.values(): for addr, signal in zip(entry["addrs"], entry["signals"]): - with m.If(self.rw_i): - with m.If(self.addr_i == addr): - m.d.sync += signal.eq(self.data_i) + with m.If(self.bus_i.rw): + with m.If(self.bus_i.addr == addr): + m.d.sync += signal.eq(self.bus_i.data) with m.Else(): - with m.If(self.addr_i == addr): - m.d.sync += self.data_o.eq(signal) + with m.If(self.bus_i.addr == addr): + m.d.sync += self.bus_o.data.eq(signal) return m diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index fcb27d9..a64554d 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -36,18 +36,11 @@ class LogicAnalyzerCore(Elaboratable): self.config = config self.check_config(config) - # Bus Input - self.addr_i = Signal(16) - self.data_i = Signal(16) - self.rw_i = Signal(1) - self.valid_i = Signal(1) - - # Bus Output - self.addr_o = Signal(16) - self.data_o = Signal(16) - self.rw_o = Signal(1) - self.valid_o = Signal(1) + # Bus Input/Output + self.bus_i = Signal(InternalBus()) + self.bus_o = Signal(InternalBus()) + # Probes self.probes = [ Signal(width, name=name) for name, width in self.config["probes"].items() ] @@ -177,22 +170,11 @@ class LogicAnalyzerCore(Elaboratable): # Wire bus connections between internal modules m.d.comb += [ # Bus Connections - fsm.addr_i.eq(self.addr_i), - fsm.data_i.eq(self.data_i), - fsm.rw_i.eq(self.rw_i), - fsm.valid_i.eq(self.valid_i), - trig_blk.addr_i.eq(fsm.addr_o), - trig_blk.data_i.eq(fsm.data_o), - trig_blk.rw_i.eq(fsm.rw_o), - trig_blk.valid_i.eq(fsm.valid_o), - sample_mem.addr_i.eq(trig_blk.addr_o), - sample_mem.data_i.eq(trig_blk.data_o), - sample_mem.rw_i.eq(trig_blk.rw_o), - sample_mem.valid_i.eq(trig_blk.valid_o), - self.addr_o.eq(sample_mem.addr_o), - self.data_o.eq(sample_mem.data_o), - self.rw_o.eq(sample_mem.rw_o), - self.valid_o.eq(sample_mem.valid_o), + fsm.bus_i.eq(self.bus_i), + trig_blk.bus_i.eq(fsm.bus_o), + sample_mem.bus_i.eq(trig_blk.bus_o), + self.bus_o.eq(sample_mem.bus_o), + # Non-bus Connections fsm.trigger.eq(trig_blk.trig), sample_mem.user_addr.eq(fsm.r.write_pointer), diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index b2f0059..c2a72e8 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -1,11 +1,10 @@ from amaranth import * from math import ceil, log2 from ..io_core import IOCore +from ..utils import * class LogicAnalyzerFSM(Elaboratable): - """ """ - def __init__(self, config, base_addr, interface): self.config = config self.states = { @@ -37,24 +36,14 @@ class LogicAnalyzerFSM(Elaboratable): self.r = IOCore(register_config, base_addr, interface) - # Bus Input - self.addr_i = self.r.addr_i - self.data_i = self.r.data_i - self.rw_i = self.r.rw_i - self.valid_i = self.r.valid_i - - # Bus Output - self.addr_o = self.r.addr_o - self.data_o = self.r.data_o - self.rw_o = self.r.rw_o - self.valid_o = self.r.valid_o + # Bus Input/Output + self.bus_i = self.r.bus_i + self.bus_o = self.r.bus_o def get_max_addr(self): return self.r.get_max_addr() def increment_mod_sample_depth(self, m, signal): - # m.d.sync += signal.eq((signal + 1) % self.config["sample_depth"]) - with m.If(signal == self.config["sample_depth"] - 1): m.d.sync += signal.eq(0) diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 2b15530..191b5d1 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -1,10 +1,9 @@ from amaranth import * from ..io_core import IOCore +from ..utils import * class LogicAnalyzerTriggerBlock(Elaboratable): - """ """ - def __init__(self, probes, base_addr, interface): # Instantiate a bunch of trigger blocks self.probes = probes @@ -18,17 +17,9 @@ class LogicAnalyzerTriggerBlock(Elaboratable): self.r = IOCore({"outputs": outputs}, base_addr, interface) - # Bus Input - self.addr_i = self.r.addr_i - self.data_i = self.r.data_i - self.rw_i = self.r.rw_i - self.valid_i = self.r.valid_i - - # Bus Output - self.addr_o = self.r.addr_o - self.data_o = self.r.data_o - self.rw_o = self.r.rw_o - self.valid_o = self.r.valid_o + # Bus Input/Output + self.bus_i = Signal(InternalBus()) + self.bus_o = Signal(InternalBus()) # Global trigger. High if any probe is triggered. self.trig = Signal(1) diff --git a/src/manta/manta.py b/src/manta/manta.py index 97f1b4c..eb7e91b 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -136,28 +136,15 @@ class Manta(Elaboratable): core_instances = list(self.cores.values()) first_core = core_instances[0] last_core = core_instances[-1] - m.d.comb += [ - first_core.addr_i.eq(self.interface.addr_o), - first_core.data_i.eq(self.interface.data_o), - first_core.rw_i.eq(self.interface.rw_o), - first_core.valid_i.eq(self.interface.valid_o), - self.interface.addr_i.eq(last_core.addr_o), - self.interface.data_i.eq(last_core.data_o), - self.interface.rw_i.eq(last_core.rw_o), - self.interface.valid_i.eq(last_core.valid_o), - ] + + first_core.bus_i.eq(self.interface.bus_o) + self.interface.bus_i.eq(self.interface.bus_o) # Connect output of ith core to input of (i+1)th core for i in range(len(core_instances) - 1): ith_core = core_instances[i] i_plus_oneth_core = core_instances[i + 1] - - m.d.comb += [ - i_plus_oneth_core.addr_i.eq(ith_core.addr_o), - i_plus_oneth_core.data_i.eq(ith_core.data_o), - i_plus_oneth_core.rw_i.eq(ith_core.rw_o), - i_plus_oneth_core.valid_i.eq(ith_core.valid_o), - ] + i_plus_oneth_core.bus_i.eq(ith_core.bus_o) return m diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index cf4d9ae..b08d47e 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -47,23 +47,10 @@ class ReadOnlyMemoryCore(Elaboratable): raise ValueError("Width of memory core must be positive. ") def define_signals(self): - # Bus Input - self.addr_i = Signal(16) - self.data_i = Signal(16) - self.rw_i = Signal(1) - self.valid_i = Signal(1) - - # Bus Pipelining - self.addr_pipe = [Signal(16) for _ in range(3)] - self.data_pipe = [Signal(16) for _ in range(3)] - self.rw_pipe = [Signal(1) for _ in range(3)] - self.valid_pipe = [Signal(1) for _ in range(3)] - - # Bus Output - self.addr_o = Signal(16, reset=0) - self.data_o = Signal(16, reset=0) - self.rw_o = Signal(1, reset=0) - self.valid_o = Signal(1, reset=0) + # Bus Input/Pipelining/Output + self.bus_i = Signal(InternalBus()) + self.bus_pipe = [Signal(InternalBus()) for _ in range(3)] + self.bus_o = Signal(InternalBus()) # User Port self.user_addr = Signal(range(self.depth)) @@ -72,21 +59,12 @@ class ReadOnlyMemoryCore(Elaboratable): def pipeline_bus(self, m): # Pipelining - m.d.sync += self.addr_pipe[0].eq(self.addr_i) - m.d.sync += self.data_pipe[0].eq(self.data_i) - m.d.sync += self.rw_pipe[0].eq(self.rw_i) - m.d.sync += self.valid_pipe[0].eq(self.valid_i) + m.d.sync += self.bus_pipe[0].eq(self.bus_i) for i in range(1, 3): - m.d.sync += self.addr_pipe[i].eq(self.addr_pipe[i - 1]) - m.d.sync += self.data_pipe[i].eq(self.data_pipe[i - 1]) - m.d.sync += self.rw_pipe[i].eq(self.rw_pipe[i - 1]) - m.d.sync += self.valid_pipe[i].eq(self.valid_pipe[i - 1]) + m.d.sync += self.bus_pipe[i].eq(self.bus_pipe[i-1]) - m.d.sync += self.addr_o.eq(self.addr_pipe[2]) - m.d.sync += self.data_o.eq(self.data_pipe[2]) - m.d.sync += self.rw_o.eq(self.rw_pipe[2]) - m.d.sync += self.valid_o.eq(self.valid_pipe[2]) + m.d.sync += self.bus_o.eq(self.bus_pipe[2]) def define_mems(self): # ok there's three cases: @@ -122,21 +100,21 @@ class ReadOnlyMemoryCore(Elaboratable): # Throw BRAM operations into the front of the pipeline with m.If( - (self.valid_i) - & (~self.rw_i) - & (self.addr_i >= start_addr) - & (self.addr_i <= stop_addr) + (self.bus_i.valid) + & (~self.bus_i.rw) + & (self.bus_i.addr >= start_addr) + & (self.bus_i.addr <= stop_addr) ): - m.d.sync += read_port.addr.eq(self.addr_i - start_addr) + m.d.sync += read_port.addr.eq(self.bus_i.addr - start_addr) # Pull BRAM reads from the back of the pipeline with m.If( - (self.valid_pipe[2]) - & (~self.rw_pipe[2]) - & (self.addr_pipe[2] >= start_addr) - & (self.addr_pipe[2] <= stop_addr) + (self.bus_pipe[2].valid) + & (~self.bus_pipe[2].rw) + & (self.bus_pipe[2].addr >= start_addr) + & (self.bus_pipe[2].addr <= stop_addr) ): - m.d.sync += self.data_o.eq(read_port.data) + m.d.sync += self.bus_o.data.eq(read_port.data) def handle_write_ports(self, m): # These are given to the user diff --git a/src/manta/uart.py b/src/manta/uart.py index cba6337..0f6a395 100644 --- a/src/manta/uart.py +++ b/src/manta/uart.py @@ -222,15 +222,8 @@ class UARTInterface(Elaboratable): self.rx = Signal() self.tx = Signal() - self.addr_o = Signal(16) - self.data_o = Signal(16) - self.rw_o = Signal() - self.valid_o = Signal() - - self.addr_i = Signal(16) - self.data_i = Signal(16) - self.rw_i = Signal() - self.valid_i = Signal() + self.bus_i = Signal(InternalBus()) + self.bus_o = Signal(InternalBus()) def elaborate(self, platform): # fancy submoduling and such goes in here @@ -246,14 +239,9 @@ class UARTInterface(Elaboratable): uart_rx.rx.eq(self.rx), bridge_rx.data_i.eq(uart_rx.data_o), bridge_rx.valid_i.eq(uart_rx.valid_o), - self.data_o.eq(bridge_rx.data_o), - self.addr_o.eq(bridge_rx.addr_o), - self.rw_o.eq(bridge_rx.rw_o), - self.valid_o.eq(bridge_rx.valid_o), + self.bus_o.data.eq(bridge_rx.bus_o), # Internal Bus -> UART TX - bridge_tx.data_i.eq(self.data_i), - bridge_tx.rw_i.eq(self.rw_i), - bridge_tx.valid_i.eq(self.valid_i), + bridge_tx.bus_i.eq(self.bus_i), uart_tx.data_i.eq(bridge_tx.data_o), uart_tx.start_i.eq(bridge_tx.start_o), bridge_tx.done_i.eq(uart_tx.done_o), @@ -326,10 +314,7 @@ class RecieveBridge(Elaboratable): self.data_i = Signal(8) self.valid_i = Signal() - self.addr_o = Signal(16, reset=0) - self.data_o = Signal(16, reset=0) - self.rw_o = Signal(1, reset=0) - self.valid_o = Signal(1, reset=0) + self.bus_o = Signal(InternalBus()) # State Machine self.IDLE_STATE = 0 @@ -369,30 +354,27 @@ class RecieveBridge(Elaboratable): with m.If( (self.state == self.READ_STATE) & (self.byte_num == 4) & (self.is_eol) ): - m.d.comb += self.addr_o.eq( + m.d.comb += self.bus_o.addr.eq( Cat(self.buffer[3], self.buffer[2], self.buffer[1], self.buffer[0]) ) - m.d.comb += self.data_o.eq(0) - m.d.comb += self.valid_o.eq(1) - m.d.comb += self.rw_o.eq(0) + m.d.comb += self.bus_o.data.eq(0) + m.d.comb += self.bus_o.valid.eq(1) + m.d.comb += self.bus_o.rw.eq(0) with m.Elif( (self.state == self.WRITE_STATE) & (self.byte_num == 8) & (self.is_eol) ): - m.d.comb += self.addr_o.eq( + m.d.comb += self.bus_o.addr.eq( Cat(self.buffer[3], self.buffer[2], self.buffer[1], self.buffer[0]) ) - m.d.comb += self.data_o.eq( + m.d.comb += self.bus_o.data.eq( Cat(self.buffer[7], self.buffer[6], self.buffer[5], self.buffer[4]) ) - m.d.comb += self.valid_o.eq(1) - m.d.comb += self.rw_o.eq(1) + m.d.comb += self.bus_o.valid.eq(1) + m.d.comb += self.bus_o.rw.eq(1) with m.Else(): - m.d.comb += self.addr_o.eq(0) - m.d.comb += self.data_o.eq(0) - m.d.comb += self.rw_o.eq(0) - m.d.comb += self.valid_o.eq(0) + m.d.comb += self.bus_o.eq(0) def drive_fsm(self, m): with m.If(self.valid_i): @@ -500,9 +482,7 @@ class UARTTransmitter(Elaboratable): class TransmitBridge(Elaboratable): def __init__(self): # Top-Level Ports - self.data_i = Signal(16) - self.rw_i = Signal() - self.valid_i = Signal() + self.bus_i = Signal(InternalBus()) self.data_o = Signal(8, reset=0) self.start_o = Signal(1) @@ -521,9 +501,9 @@ class TransmitBridge(Elaboratable): m.d.comb += self.start_o.eq(self.busy) with m.If(~self.busy): - with m.If((self.valid_i) & (~self.rw_i)): + with m.If((self.bus_i.valid) & (~self.bus_i.rw)): m.d.sync += self.busy.eq(1) - m.d.sync += self.buffer.eq(self.data_i) + m.d.sync += self.buffer.eq(self.bus_i.data) with m.Else(): # uart_tx is transmitting a byte: @@ -535,8 +515,8 @@ class TransmitBridge(Elaboratable): m.d.sync += self.count.eq(0) # Go back to idle, or transmit next message - with m.If((self.valid_i) & (~self.rw_i)): - m.d.sync += self.buffer.eq(self.data_i) + with m.If((self.bus_i.valid) & (~self.bus_i.rw)): + m.d.sync += self.buffer.eq(self.bus_i.data) with m.Else(): m.d.sync += self.busy.eq(0) diff --git a/src/manta/utils.py b/src/manta/utils.py index bb20271..6ce9316 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -1,7 +1,16 @@ from amaranth.sim import Simulator +from amaranth.lib import data, enum from math import ceil import os +class InternalBus(data.StructLayout): + def __init__(self): + super().__init__({ + "addr": 16, + "data": 16, + "rw": 1, + "valid": 1 + }) def words_to_value(data): """ @@ -74,20 +83,20 @@ def verify_register(module, addr, expected_data): """ # place read transaction on the bus - yield module.addr_i.eq(addr) - yield module.data_i.eq(0) - yield module.rw_i.eq(0) - yield module.valid_i.eq(1) + yield module.bus_i.addr.eq(addr) + yield module.bus_i.data.eq(0) + yield module.bus_i.rw.eq(0) + yield module.bus_i.valid.eq(1) yield - yield module.addr_i.eq(0) - yield module.valid_i.eq(0) + yield module.bus_i.addr.eq(0) + yield module.bus_i.valid.eq(0) # wait for output to be valid - while not (yield module.valid_o): + while not (yield module.bus_o.valid): yield # compare returned value with expected - data = yield (module.data_o) + data = yield (module.bus_o.data) if data != expected_data: raise ValueError(f"Read from {addr} yielded {data} instead of {expected_data}") @@ -98,12 +107,12 @@ def write_register(module, addr, data): at `addr`. """ - yield module.addr_i.eq(addr) - yield module.data_i.eq(data) - yield module.rw_i.eq(1) - yield module.valid_i.eq(1) + yield module.bus_i.addr.eq(addr) + yield module.bus_i.data.eq(data) + yield module.bus_i.rw.eq(1) + yield module.bus_i.valid.eq(1) yield - yield module.valid_i.eq(0) + yield module.bus_i.valid.eq(0) yield @@ -142,3 +151,5 @@ def ice40_tools_installed(): return True return False + + diff --git a/test/test_bridge_rx_sim.py b/test/test_bridge_rx_sim.py index 89c3d4d..1e7415c 100644 --- a/test/test_bridge_rx_sim.py +++ b/test/test_bridge_rx_sim.py @@ -17,15 +17,15 @@ def verify_read_decoding(bytes, addr): for i, byte in enumerate(bytes): yield bridge_rx.data_i.eq(byte) - if (yield bridge_rx.valid_o) and (i > 0): + if (yield bridge_rx.bus_o.valid) and (i > 0): valid_asserted = True - if (yield bridge_rx.addr_o) != addr: + if (yield bridge_rx.bus_o.addr) != addr: raise ValueError("wrong addr!") - if (yield bridge_rx.rw_o) != 0: + if (yield bridge_rx.bus_o.rw) != 0: raise ValueError("wrong rw!") - if (yield bridge_rx.data_o) != 0: + if (yield bridge_rx.bus_o.data) != 0: raise ValueError("wrong data!") yield @@ -33,7 +33,7 @@ def verify_read_decoding(bytes, addr): yield bridge_rx.valid_i.eq(0) yield bridge_rx.data_i.eq(0) - if not valid_asserted and not (yield bridge_rx.valid_o): + if not valid_asserted and not (yield bridge_rx.bus_o.valid): raise ValueError("Bridge failed to output valid message.") @@ -48,15 +48,15 @@ def verify_write_decoding(bytes, addr, data): for i, byte in enumerate(bytes): yield bridge_rx.data_i.eq(byte) - if (yield bridge_rx.valid_o) and (i > 0): + if (yield bridge_rx.bus_o.valid) and (i > 0): valid_asserted = True - if (yield bridge_rx.addr_o) != addr: + if (yield bridge_rx.bus_o.addr) != addr: raise ValueError("wrong addr!") - if (yield bridge_rx.rw_o) != 1: + if (yield bridge_rx.bus_o.rw) != 1: raise ValueError("wrong rw!") - if (yield bridge_rx.data_o) != data: + if (yield bridge_rx.bus_o.data) != data: raise ValueError("wrong data!") yield @@ -64,7 +64,7 @@ def verify_write_decoding(bytes, addr, data): yield bridge_rx.valid_i.eq(0) yield bridge_rx.data_i.eq(0) - if not valid_asserted and not (yield bridge_rx.valid_o): + if not valid_asserted and not (yield bridge_rx.bus_o.valid): raise ValueError("Bridge failed to output valid message.") @@ -78,7 +78,7 @@ def verify_bad_bytes(bytes): for byte in bytes: yield bridge_rx.data_i.eq(byte) - if (yield bridge_rx.valid_o): + if (yield bridge_rx.bus_o.valid): raise ValueError("Bridge decoded invalid message.") yield diff --git a/test/test_bridge_tx_sim.py b/test/test_bridge_tx_sim.py index 9a1568d..db39fe7 100644 --- a/test/test_bridge_tx_sim.py +++ b/test/test_bridge_tx_sim.py @@ -17,16 +17,16 @@ def verify_encoding(data, bytes): """ # Place a read response on the internal bus - yield bridge_tx.data_i.eq(data) - yield bridge_tx.valid_i.eq(1) - yield bridge_tx.rw_i.eq(0) + yield bridge_tx.bus_i.data.eq(data) + yield bridge_tx.bus_i.valid.eq(1) + yield bridge_tx.bus_i.rw.eq(0) yield bridge_tx.done_i.eq(1) yield - yield bridge_tx.data_i.eq(0) - yield bridge_tx.valid_i.eq(0) - yield bridge_tx.rw_i.eq(0) + yield bridge_tx.bus_i.data.eq(0) + yield bridge_tx.bus_i.valid.eq(0) + yield bridge_tx.bus_i.rw.eq(0) yield diff --git a/test/test_logic_analyzer_sim.py b/test/test_logic_analyzer_sim.py index 72622ed..ebce934 100644 --- a/test/test_logic_analyzer_sim.py +++ b/test/test_logic_analyzer_sim.py @@ -6,7 +6,7 @@ from random import sample config = { "type": "logic_analyzer", "sample_depth": 1024, - "trigger_loc": 512, + "trigger_location": 512, "probes": {"larry": 1, "curly": 3, "moe": 9}, "triggers": ["moe RISING"], } @@ -16,19 +16,19 @@ la = LogicAnalyzerCore(config, base_addr=0, interface=None) def print_data_at_addr(addr): # place read transaction on the bus - yield la.addr_i.eq(addr) - yield la.data_i.eq(0) - yield la.rw_i.eq(0) - yield la.valid_i.eq(1) + yield la.bus_i.addr.eq(addr) + yield la.bus_i.data.eq(0) + yield la.bus_i.rw.eq(0) + yield la.bus_i.valid.eq(1) yield - yield la.addr_i.eq(0) - yield la.valid_i.eq(0) + yield la.bus_i.addr.eq(0) + yield la.bus_i.valid.eq(0) # wait for output to be valid - while not (yield la.valid_o): + while not (yield la.bus_o.valid): yield - print(f"addr: {hex(addr)} data: {hex((yield la.data_o))}") + print(f"addr: {hex(addr)} data: {hex((yield la.bus_o.data))}") def set_fsm_register(name, data): From fbaf93b110216c258864b1e90f6f52cc975da846 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 7 Jan 2024 18:54:33 -0800 Subject: [PATCH 21/89] fix typo introduced during refactor --- src/manta/logic_analyzer/trigger_block.py | 4 ++-- src/manta/utils.py | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 191b5d1..50f3496 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -18,8 +18,8 @@ class LogicAnalyzerTriggerBlock(Elaboratable): self.r = IOCore({"outputs": outputs}, base_addr, interface) # Bus Input/Output - self.bus_i = Signal(InternalBus()) - self.bus_o = Signal(InternalBus()) + self.bus_i = self.r.bus_i + self.bus_o = self.r.bus_o # Global trigger. High if any probe is triggered. self.trig = Signal(1) diff --git a/src/manta/utils.py b/src/manta/utils.py index 6ce9316..9c41948 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -4,6 +4,9 @@ from math import ceil import os class InternalBus(data.StructLayout): + """Describes the layout of Manta's internal bus, such that signals of + the appropriate dimension can be instantiated with Signal(InternalBus()). + """ def __init__(self): super().__init__({ "addr": 16, From 7a6ab45b9205844f833dc0dbceb67ca1ef41d84c Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 7 Jan 2024 21:39:44 -0800 Subject: [PATCH 22/89] revert UART and InternalBus() refactor --- src/manta/io_core.py | 30 ++++++++---- src/manta/logic_analyzer/__init__.py | 36 ++++++++++---- src/manta/logic_analyzer/fsm.py | 19 ++++++-- src/manta/logic_analyzer/trigger_block.py | 17 +++++-- src/manta/manta.py | 21 ++++++-- src/manta/memory_core.py | 56 +++++++++++++++------- src/manta/uart.py | 58 +++++++++++++++-------- src/manta/utils.py | 40 +++++----------- test/test_bridge_rx_sim.py | 22 ++++----- test/test_bridge_tx_sim.py | 12 ++--- test/test_io_core_hw.py | 4 +- test/test_logic_analyzer_hw.py | 2 +- test/test_logic_analyzer_sim.py | 16 +++---- test/test_mem_core_hw.py | 4 +- 14 files changed, 213 insertions(+), 124 deletions(-) diff --git a/src/manta/io_core.py b/src/manta/io_core.py index b1d9e5c..c12096a 100644 --- a/src/manta/io_core.py +++ b/src/manta/io_core.py @@ -88,8 +88,15 @@ class IOCore(Elaboratable): def define_signals(self): # Bus Ports - self.bus_i = Signal(InternalBus()) - self.bus_o = Signal(InternalBus()) + self.addr_i = Signal(16) + self.data_i = Signal(16) + self.rw_i = Signal() + self.valid_i = Signal() + + self.addr_o = Signal(16) + self.data_o = Signal(16) + self.rw_o = Signal() + self.valid_o = Signal() # Input Probes (and buffers) if "inputs" in self.config: @@ -180,7 +187,10 @@ class IOCore(Elaboratable): m = Module() # Shuffle bus transactions along - m.d.sync += self.bus_o.eq(self.bus_i) + m.d.sync += self.addr_o.eq(self.addr_i) + m.d.sync += self.data_o.eq(self.data_i) + m.d.sync += self.rw_o.eq(self.rw_i) + m.d.sync += self.valid_o.eq(self.valid_i) # Update buffers from probes with m.If(self.strobe): @@ -199,17 +209,17 @@ class IOCore(Elaboratable): m.d.sync += output_probe.eq(output_probe_buf) # Handle register reads and writes - with m.If((self.bus_i.addr >= self.base_addr)): - with m.If((self.bus_o.addr <= self.max_addr)): + with m.If((self.addr_i >= self.base_addr)): + with m.If((self.addr_o <= self.max_addr)): for entry in self.mmap.values(): for addr, signal in zip(entry["addrs"], entry["signals"]): - with m.If(self.bus_i.rw): - with m.If(self.bus_i.addr == addr): - m.d.sync += signal.eq(self.bus_i.data) + with m.If(self.rw_i): + with m.If(self.addr_i == addr): + m.d.sync += signal.eq(self.data_i) with m.Else(): - with m.If(self.bus_i.addr == addr): - m.d.sync += self.bus_o.data.eq(signal) + with m.If(self.addr_i == addr): + m.d.sync += self.data_o.eq(signal) return m diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index a64554d..fcb27d9 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -36,11 +36,18 @@ class LogicAnalyzerCore(Elaboratable): self.config = config self.check_config(config) - # Bus Input/Output - self.bus_i = Signal(InternalBus()) - self.bus_o = Signal(InternalBus()) + # Bus Input + self.addr_i = Signal(16) + self.data_i = Signal(16) + self.rw_i = Signal(1) + self.valid_i = Signal(1) + + # Bus Output + self.addr_o = Signal(16) + self.data_o = Signal(16) + self.rw_o = Signal(1) + self.valid_o = Signal(1) - # Probes self.probes = [ Signal(width, name=name) for name, width in self.config["probes"].items() ] @@ -170,11 +177,22 @@ class LogicAnalyzerCore(Elaboratable): # Wire bus connections between internal modules m.d.comb += [ # Bus Connections - fsm.bus_i.eq(self.bus_i), - trig_blk.bus_i.eq(fsm.bus_o), - sample_mem.bus_i.eq(trig_blk.bus_o), - self.bus_o.eq(sample_mem.bus_o), - + fsm.addr_i.eq(self.addr_i), + fsm.data_i.eq(self.data_i), + fsm.rw_i.eq(self.rw_i), + fsm.valid_i.eq(self.valid_i), + trig_blk.addr_i.eq(fsm.addr_o), + trig_blk.data_i.eq(fsm.data_o), + trig_blk.rw_i.eq(fsm.rw_o), + trig_blk.valid_i.eq(fsm.valid_o), + sample_mem.addr_i.eq(trig_blk.addr_o), + sample_mem.data_i.eq(trig_blk.data_o), + sample_mem.rw_i.eq(trig_blk.rw_o), + sample_mem.valid_i.eq(trig_blk.valid_o), + self.addr_o.eq(sample_mem.addr_o), + self.data_o.eq(sample_mem.data_o), + self.rw_o.eq(sample_mem.rw_o), + self.valid_o.eq(sample_mem.valid_o), # Non-bus Connections fsm.trigger.eq(trig_blk.trig), sample_mem.user_addr.eq(fsm.r.write_pointer), diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index c2a72e8..b2f0059 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -1,10 +1,11 @@ from amaranth import * from math import ceil, log2 from ..io_core import IOCore -from ..utils import * class LogicAnalyzerFSM(Elaboratable): + """ """ + def __init__(self, config, base_addr, interface): self.config = config self.states = { @@ -36,14 +37,24 @@ class LogicAnalyzerFSM(Elaboratable): self.r = IOCore(register_config, base_addr, interface) - # Bus Input/Output - self.bus_i = self.r.bus_i - self.bus_o = self.r.bus_o + # Bus Input + self.addr_i = self.r.addr_i + self.data_i = self.r.data_i + self.rw_i = self.r.rw_i + self.valid_i = self.r.valid_i + + # Bus Output + self.addr_o = self.r.addr_o + self.data_o = self.r.data_o + self.rw_o = self.r.rw_o + self.valid_o = self.r.valid_o def get_max_addr(self): return self.r.get_max_addr() def increment_mod_sample_depth(self, m, signal): + # m.d.sync += signal.eq((signal + 1) % self.config["sample_depth"]) + with m.If(signal == self.config["sample_depth"] - 1): m.d.sync += signal.eq(0) diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 50f3496..2b15530 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -1,9 +1,10 @@ from amaranth import * from ..io_core import IOCore -from ..utils import * class LogicAnalyzerTriggerBlock(Elaboratable): + """ """ + def __init__(self, probes, base_addr, interface): # Instantiate a bunch of trigger blocks self.probes = probes @@ -17,9 +18,17 @@ class LogicAnalyzerTriggerBlock(Elaboratable): self.r = IOCore({"outputs": outputs}, base_addr, interface) - # Bus Input/Output - self.bus_i = self.r.bus_i - self.bus_o = self.r.bus_o + # Bus Input + self.addr_i = self.r.addr_i + self.data_i = self.r.data_i + self.rw_i = self.r.rw_i + self.valid_i = self.r.valid_i + + # Bus Output + self.addr_o = self.r.addr_o + self.data_o = self.r.data_o + self.rw_o = self.r.rw_o + self.valid_o = self.r.valid_o # Global trigger. High if any probe is triggered. self.trig = Signal(1) diff --git a/src/manta/manta.py b/src/manta/manta.py index eb7e91b..97f1b4c 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -136,15 +136,28 @@ class Manta(Elaboratable): core_instances = list(self.cores.values()) first_core = core_instances[0] last_core = core_instances[-1] - - first_core.bus_i.eq(self.interface.bus_o) - self.interface.bus_i.eq(self.interface.bus_o) + m.d.comb += [ + first_core.addr_i.eq(self.interface.addr_o), + first_core.data_i.eq(self.interface.data_o), + first_core.rw_i.eq(self.interface.rw_o), + first_core.valid_i.eq(self.interface.valid_o), + self.interface.addr_i.eq(last_core.addr_o), + self.interface.data_i.eq(last_core.data_o), + self.interface.rw_i.eq(last_core.rw_o), + self.interface.valid_i.eq(last_core.valid_o), + ] # Connect output of ith core to input of (i+1)th core for i in range(len(core_instances) - 1): ith_core = core_instances[i] i_plus_oneth_core = core_instances[i + 1] - i_plus_oneth_core.bus_i.eq(ith_core.bus_o) + + m.d.comb += [ + i_plus_oneth_core.addr_i.eq(ith_core.addr_o), + i_plus_oneth_core.data_i.eq(ith_core.data_o), + i_plus_oneth_core.rw_i.eq(ith_core.rw_o), + i_plus_oneth_core.valid_i.eq(ith_core.valid_o), + ] return m diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index b08d47e..cf4d9ae 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -47,10 +47,23 @@ class ReadOnlyMemoryCore(Elaboratable): raise ValueError("Width of memory core must be positive. ") def define_signals(self): - # Bus Input/Pipelining/Output - self.bus_i = Signal(InternalBus()) - self.bus_pipe = [Signal(InternalBus()) for _ in range(3)] - self.bus_o = Signal(InternalBus()) + # Bus Input + self.addr_i = Signal(16) + self.data_i = Signal(16) + self.rw_i = Signal(1) + self.valid_i = Signal(1) + + # Bus Pipelining + self.addr_pipe = [Signal(16) for _ in range(3)] + self.data_pipe = [Signal(16) for _ in range(3)] + self.rw_pipe = [Signal(1) for _ in range(3)] + self.valid_pipe = [Signal(1) for _ in range(3)] + + # Bus Output + self.addr_o = Signal(16, reset=0) + self.data_o = Signal(16, reset=0) + self.rw_o = Signal(1, reset=0) + self.valid_o = Signal(1, reset=0) # User Port self.user_addr = Signal(range(self.depth)) @@ -59,12 +72,21 @@ class ReadOnlyMemoryCore(Elaboratable): def pipeline_bus(self, m): # Pipelining - m.d.sync += self.bus_pipe[0].eq(self.bus_i) + m.d.sync += self.addr_pipe[0].eq(self.addr_i) + m.d.sync += self.data_pipe[0].eq(self.data_i) + m.d.sync += self.rw_pipe[0].eq(self.rw_i) + m.d.sync += self.valid_pipe[0].eq(self.valid_i) for i in range(1, 3): - m.d.sync += self.bus_pipe[i].eq(self.bus_pipe[i-1]) + m.d.sync += self.addr_pipe[i].eq(self.addr_pipe[i - 1]) + m.d.sync += self.data_pipe[i].eq(self.data_pipe[i - 1]) + m.d.sync += self.rw_pipe[i].eq(self.rw_pipe[i - 1]) + m.d.sync += self.valid_pipe[i].eq(self.valid_pipe[i - 1]) - m.d.sync += self.bus_o.eq(self.bus_pipe[2]) + m.d.sync += self.addr_o.eq(self.addr_pipe[2]) + m.d.sync += self.data_o.eq(self.data_pipe[2]) + m.d.sync += self.rw_o.eq(self.rw_pipe[2]) + m.d.sync += self.valid_o.eq(self.valid_pipe[2]) def define_mems(self): # ok there's three cases: @@ -100,21 +122,21 @@ class ReadOnlyMemoryCore(Elaboratable): # Throw BRAM operations into the front of the pipeline with m.If( - (self.bus_i.valid) - & (~self.bus_i.rw) - & (self.bus_i.addr >= start_addr) - & (self.bus_i.addr <= stop_addr) + (self.valid_i) + & (~self.rw_i) + & (self.addr_i >= start_addr) + & (self.addr_i <= stop_addr) ): - m.d.sync += read_port.addr.eq(self.bus_i.addr - start_addr) + m.d.sync += read_port.addr.eq(self.addr_i - start_addr) # Pull BRAM reads from the back of the pipeline with m.If( - (self.bus_pipe[2].valid) - & (~self.bus_pipe[2].rw) - & (self.bus_pipe[2].addr >= start_addr) - & (self.bus_pipe[2].addr <= stop_addr) + (self.valid_pipe[2]) + & (~self.rw_pipe[2]) + & (self.addr_pipe[2] >= start_addr) + & (self.addr_pipe[2] <= stop_addr) ): - m.d.sync += self.bus_o.data.eq(read_port.data) + m.d.sync += self.data_o.eq(read_port.data) def handle_write_ports(self, m): # These are given to the user diff --git a/src/manta/uart.py b/src/manta/uart.py index 0f6a395..cba6337 100644 --- a/src/manta/uart.py +++ b/src/manta/uart.py @@ -222,8 +222,15 @@ class UARTInterface(Elaboratable): self.rx = Signal() self.tx = Signal() - self.bus_i = Signal(InternalBus()) - self.bus_o = Signal(InternalBus()) + self.addr_o = Signal(16) + self.data_o = Signal(16) + self.rw_o = Signal() + self.valid_o = Signal() + + self.addr_i = Signal(16) + self.data_i = Signal(16) + self.rw_i = Signal() + self.valid_i = Signal() def elaborate(self, platform): # fancy submoduling and such goes in here @@ -239,9 +246,14 @@ class UARTInterface(Elaboratable): uart_rx.rx.eq(self.rx), bridge_rx.data_i.eq(uart_rx.data_o), bridge_rx.valid_i.eq(uart_rx.valid_o), - self.bus_o.data.eq(bridge_rx.bus_o), + self.data_o.eq(bridge_rx.data_o), + self.addr_o.eq(bridge_rx.addr_o), + self.rw_o.eq(bridge_rx.rw_o), + self.valid_o.eq(bridge_rx.valid_o), # Internal Bus -> UART TX - bridge_tx.bus_i.eq(self.bus_i), + bridge_tx.data_i.eq(self.data_i), + bridge_tx.rw_i.eq(self.rw_i), + bridge_tx.valid_i.eq(self.valid_i), uart_tx.data_i.eq(bridge_tx.data_o), uart_tx.start_i.eq(bridge_tx.start_o), bridge_tx.done_i.eq(uart_tx.done_o), @@ -314,7 +326,10 @@ class RecieveBridge(Elaboratable): self.data_i = Signal(8) self.valid_i = Signal() - self.bus_o = Signal(InternalBus()) + self.addr_o = Signal(16, reset=0) + self.data_o = Signal(16, reset=0) + self.rw_o = Signal(1, reset=0) + self.valid_o = Signal(1, reset=0) # State Machine self.IDLE_STATE = 0 @@ -354,27 +369,30 @@ class RecieveBridge(Elaboratable): with m.If( (self.state == self.READ_STATE) & (self.byte_num == 4) & (self.is_eol) ): - m.d.comb += self.bus_o.addr.eq( + m.d.comb += self.addr_o.eq( Cat(self.buffer[3], self.buffer[2], self.buffer[1], self.buffer[0]) ) - m.d.comb += self.bus_o.data.eq(0) - m.d.comb += self.bus_o.valid.eq(1) - m.d.comb += self.bus_o.rw.eq(0) + m.d.comb += self.data_o.eq(0) + m.d.comb += self.valid_o.eq(1) + m.d.comb += self.rw_o.eq(0) with m.Elif( (self.state == self.WRITE_STATE) & (self.byte_num == 8) & (self.is_eol) ): - m.d.comb += self.bus_o.addr.eq( + m.d.comb += self.addr_o.eq( Cat(self.buffer[3], self.buffer[2], self.buffer[1], self.buffer[0]) ) - m.d.comb += self.bus_o.data.eq( + m.d.comb += self.data_o.eq( Cat(self.buffer[7], self.buffer[6], self.buffer[5], self.buffer[4]) ) - m.d.comb += self.bus_o.valid.eq(1) - m.d.comb += self.bus_o.rw.eq(1) + m.d.comb += self.valid_o.eq(1) + m.d.comb += self.rw_o.eq(1) with m.Else(): - m.d.comb += self.bus_o.eq(0) + m.d.comb += self.addr_o.eq(0) + m.d.comb += self.data_o.eq(0) + m.d.comb += self.rw_o.eq(0) + m.d.comb += self.valid_o.eq(0) def drive_fsm(self, m): with m.If(self.valid_i): @@ -482,7 +500,9 @@ class UARTTransmitter(Elaboratable): class TransmitBridge(Elaboratable): def __init__(self): # Top-Level Ports - self.bus_i = Signal(InternalBus()) + self.data_i = Signal(16) + self.rw_i = Signal() + self.valid_i = Signal() self.data_o = Signal(8, reset=0) self.start_o = Signal(1) @@ -501,9 +521,9 @@ class TransmitBridge(Elaboratable): m.d.comb += self.start_o.eq(self.busy) with m.If(~self.busy): - with m.If((self.bus_i.valid) & (~self.bus_i.rw)): + with m.If((self.valid_i) & (~self.rw_i)): m.d.sync += self.busy.eq(1) - m.d.sync += self.buffer.eq(self.bus_i.data) + m.d.sync += self.buffer.eq(self.data_i) with m.Else(): # uart_tx is transmitting a byte: @@ -515,8 +535,8 @@ class TransmitBridge(Elaboratable): m.d.sync += self.count.eq(0) # Go back to idle, or transmit next message - with m.If((self.bus_i.valid) & (~self.bus_i.rw)): - m.d.sync += self.buffer.eq(self.bus_i.data) + with m.If((self.valid_i) & (~self.rw_i)): + m.d.sync += self.buffer.eq(self.data_i) with m.Else(): m.d.sync += self.busy.eq(0) diff --git a/src/manta/utils.py b/src/manta/utils.py index 9c41948..bb20271 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -1,19 +1,7 @@ from amaranth.sim import Simulator -from amaranth.lib import data, enum from math import ceil import os -class InternalBus(data.StructLayout): - """Describes the layout of Manta's internal bus, such that signals of - the appropriate dimension can be instantiated with Signal(InternalBus()). - """ - def __init__(self): - super().__init__({ - "addr": 16, - "data": 16, - "rw": 1, - "valid": 1 - }) def words_to_value(data): """ @@ -86,20 +74,20 @@ def verify_register(module, addr, expected_data): """ # place read transaction on the bus - yield module.bus_i.addr.eq(addr) - yield module.bus_i.data.eq(0) - yield module.bus_i.rw.eq(0) - yield module.bus_i.valid.eq(1) + yield module.addr_i.eq(addr) + yield module.data_i.eq(0) + yield module.rw_i.eq(0) + yield module.valid_i.eq(1) yield - yield module.bus_i.addr.eq(0) - yield module.bus_i.valid.eq(0) + yield module.addr_i.eq(0) + yield module.valid_i.eq(0) # wait for output to be valid - while not (yield module.bus_o.valid): + while not (yield module.valid_o): yield # compare returned value with expected - data = yield (module.bus_o.data) + data = yield (module.data_o) if data != expected_data: raise ValueError(f"Read from {addr} yielded {data} instead of {expected_data}") @@ -110,12 +98,12 @@ def write_register(module, addr, data): at `addr`. """ - yield module.bus_i.addr.eq(addr) - yield module.bus_i.data.eq(data) - yield module.bus_i.rw.eq(1) - yield module.bus_i.valid.eq(1) + yield module.addr_i.eq(addr) + yield module.data_i.eq(data) + yield module.rw_i.eq(1) + yield module.valid_i.eq(1) yield - yield module.bus_i.valid.eq(0) + yield module.valid_i.eq(0) yield @@ -154,5 +142,3 @@ def ice40_tools_installed(): return True return False - - diff --git a/test/test_bridge_rx_sim.py b/test/test_bridge_rx_sim.py index 1e7415c..89c3d4d 100644 --- a/test/test_bridge_rx_sim.py +++ b/test/test_bridge_rx_sim.py @@ -17,15 +17,15 @@ def verify_read_decoding(bytes, addr): for i, byte in enumerate(bytes): yield bridge_rx.data_i.eq(byte) - if (yield bridge_rx.bus_o.valid) and (i > 0): + if (yield bridge_rx.valid_o) and (i > 0): valid_asserted = True - if (yield bridge_rx.bus_o.addr) != addr: + if (yield bridge_rx.addr_o) != addr: raise ValueError("wrong addr!") - if (yield bridge_rx.bus_o.rw) != 0: + if (yield bridge_rx.rw_o) != 0: raise ValueError("wrong rw!") - if (yield bridge_rx.bus_o.data) != 0: + if (yield bridge_rx.data_o) != 0: raise ValueError("wrong data!") yield @@ -33,7 +33,7 @@ def verify_read_decoding(bytes, addr): yield bridge_rx.valid_i.eq(0) yield bridge_rx.data_i.eq(0) - if not valid_asserted and not (yield bridge_rx.bus_o.valid): + if not valid_asserted and not (yield bridge_rx.valid_o): raise ValueError("Bridge failed to output valid message.") @@ -48,15 +48,15 @@ def verify_write_decoding(bytes, addr, data): for i, byte in enumerate(bytes): yield bridge_rx.data_i.eq(byte) - if (yield bridge_rx.bus_o.valid) and (i > 0): + if (yield bridge_rx.valid_o) and (i > 0): valid_asserted = True - if (yield bridge_rx.bus_o.addr) != addr: + if (yield bridge_rx.addr_o) != addr: raise ValueError("wrong addr!") - if (yield bridge_rx.bus_o.rw) != 1: + if (yield bridge_rx.rw_o) != 1: raise ValueError("wrong rw!") - if (yield bridge_rx.bus_o.data) != data: + if (yield bridge_rx.data_o) != data: raise ValueError("wrong data!") yield @@ -64,7 +64,7 @@ def verify_write_decoding(bytes, addr, data): yield bridge_rx.valid_i.eq(0) yield bridge_rx.data_i.eq(0) - if not valid_asserted and not (yield bridge_rx.bus_o.valid): + if not valid_asserted and not (yield bridge_rx.valid_o): raise ValueError("Bridge failed to output valid message.") @@ -78,7 +78,7 @@ def verify_bad_bytes(bytes): for byte in bytes: yield bridge_rx.data_i.eq(byte) - if (yield bridge_rx.bus_o.valid): + if (yield bridge_rx.valid_o): raise ValueError("Bridge decoded invalid message.") yield diff --git a/test/test_bridge_tx_sim.py b/test/test_bridge_tx_sim.py index db39fe7..9a1568d 100644 --- a/test/test_bridge_tx_sim.py +++ b/test/test_bridge_tx_sim.py @@ -17,16 +17,16 @@ def verify_encoding(data, bytes): """ # Place a read response on the internal bus - yield bridge_tx.bus_i.data.eq(data) - yield bridge_tx.bus_i.valid.eq(1) - yield bridge_tx.bus_i.rw.eq(0) + yield bridge_tx.data_i.eq(data) + yield bridge_tx.valid_i.eq(1) + yield bridge_tx.rw_i.eq(0) yield bridge_tx.done_i.eq(1) yield - yield bridge_tx.bus_i.data.eq(0) - yield bridge_tx.bus_i.valid.eq(0) - yield bridge_tx.bus_i.rw.eq(0) + yield bridge_tx.data_i.eq(0) + yield bridge_tx.valid_i.eq(0) + yield bridge_tx.rw_i.eq(0) yield diff --git a/test/test_io_core_hw.py b/test/test_io_core_hw.py index 25f0b2c..c463aa6 100644 --- a/test/test_io_core_hw.py +++ b/test/test_io_core_hw.py @@ -121,9 +121,9 @@ class IOCoreLoopbackTest(Elaboratable): @pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") def test_output_probe_initial_values_xilinx(): - IOCoreLoopbackTest(Nexys4DDRPlatform(), "/dev/ttyUSB2").verify() + IOCoreLoopbackTest(Nexys4DDRPlatform(), "/dev/ttyUSB1").verify() @pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") def test_output_probe_initial_values_ice40(): - IOCoreLoopbackTest(ICEStickPlatform(), "/dev/ttyUSB1").verify() + IOCoreLoopbackTest(ICEStickPlatform(), "/dev/ttyUSB2").verify() diff --git a/test/test_logic_analyzer_hw.py b/test/test_logic_analyzer_hw.py index 9b456d4..5bfd0ca 100644 --- a/test/test_logic_analyzer_hw.py +++ b/test/test_logic_analyzer_hw.py @@ -76,7 +76,7 @@ class LogicAnalyzerCounterTest(Elaboratable): @pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") def test_logic_analyzer_core_xilinx(): - LogicAnalyzerCounterTest(Nexys4DDRPlatform(), "/dev/ttyUSB3").verify() + LogicAnalyzerCounterTest(Nexys4DDRPlatform(), "/dev/ttyUSB1").verify() @pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") diff --git a/test/test_logic_analyzer_sim.py b/test/test_logic_analyzer_sim.py index ebce934..e69db0c 100644 --- a/test/test_logic_analyzer_sim.py +++ b/test/test_logic_analyzer_sim.py @@ -16,19 +16,19 @@ la = LogicAnalyzerCore(config, base_addr=0, interface=None) def print_data_at_addr(addr): # place read transaction on the bus - yield la.bus_i.addr.eq(addr) - yield la.bus_i.data.eq(0) - yield la.bus_i.rw.eq(0) - yield la.bus_i.valid.eq(1) + yield la.addr_i.eq(addr) + yield la.data_i.eq(0) + yield la.rw_i.eq(0) + yield la.valid_i.eq(1) yield - yield la.bus_i.addr.eq(0) - yield la.bus_i.valid.eq(0) + yield la.addr_i.eq(0) + yield la.valid_i.eq(0) # wait for output to be valid - while not (yield la.bus_o.valid): + while not (yield la.valid_o): yield - print(f"addr: {hex(addr)} data: {hex((yield la.bus_o.data))}") + print(f"addr: {hex(addr)} data: {hex((yield la.data_o))}") def set_fsm_register(name, data): diff --git a/test/test_mem_core_hw.py b/test/test_mem_core_hw.py index cb3c1de..8c7af24 100644 --- a/test/test_mem_core_hw.py +++ b/test/test_mem_core_hw.py @@ -94,12 +94,12 @@ class MemoryCoreLoopbackTest(Elaboratable): @pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") def test_mem_core_xilinx(): - MemoryCoreLoopbackTest(Nexys4DDRPlatform(), 33, 1024, "/dev/ttyUSB2").verify() + MemoryCoreLoopbackTest(Nexys4DDRPlatform(), 33, 1024, "/dev/ttyUSB1").verify() @pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") def test_mem_core_ice40(): - port = "/dev/ttyUSB1" + port = "/dev/ttyUSB2" MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 2, port).verify() MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 512, port).verify() MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 1024, port).verify() From a7625ce0a4e1b9b1d8fa56a18e8da0cdf100d099 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 7 Jan 2024 21:54:14 -0800 Subject: [PATCH 23/89] refactor uart into multiple files --- src/manta/logic_analyzer/playback.py | 1 + src/manta/uart.py | 583 --------------------------- src/manta/uart/__init__.py | 265 ++++++++++++ src/manta/uart/receive_bridge.py | 128 ++++++ src/manta/uart/receiver.py | 59 +++ src/manta/uart/transmit_bridge.py | 87 ++++ src/manta/uart/transmitter.py | 52 +++ src/manta/utils.py | 9 + test/test_bridge_rx_sim.py | 4 +- 9 files changed, 603 insertions(+), 585 deletions(-) delete mode 100644 src/manta/uart.py create mode 100644 src/manta/uart/__init__.py create mode 100644 src/manta/uart/receive_bridge.py create mode 100644 src/manta/uart/receiver.py create mode 100644 src/manta/uart/transmit_bridge.py create mode 100644 src/manta/uart/transmitter.py diff --git a/src/manta/logic_analyzer/playback.py b/src/manta/logic_analyzer/playback.py index cc392f3..a08db8a 100644 --- a/src/manta/logic_analyzer/playback.py +++ b/src/manta/logic_analyzer/playback.py @@ -13,6 +13,7 @@ class LogicAnalyzerPlayback(Elaboratable): config : dict The configuration of the LogicAnalyzerCore that took this capture. """ + def __init__(self, data, config): self.data = data self.config = config diff --git a/src/manta/uart.py b/src/manta/uart.py deleted file mode 100644 index cba6337..0000000 --- a/src/manta/uart.py +++ /dev/null @@ -1,583 +0,0 @@ -from amaranth import * -from amaranth.lib.data import ArrayLayout -from warnings import warn -from .utils import * -from serial import Serial - - -class UARTInterface(Elaboratable): - def __init__(self, config): - self.config = config - self.check_config(self.config) - - self.port = config["port"] - self.clock_freq = config["clock_freq"] - self.baudrate = config["baudrate"] - self.clocks_per_baud = int(self.clock_freq // self.baudrate) - - self.define_signals() - - # Set chunk_size, which is the max amount of bytes that the core will - # dump to the OS driver at a time. Since the FPGA will return bytes - # almost instantaneously, this prevents the OS's input buffer from - # overflowing, and dropping bytes. - self.chunk_size = 256 # in bytes - if "chunk_size" in config: - self.chunk_size = config["chunk_size"] - - def check_config(self, config): - # Warn if unrecognized options have been given - recognized_options = ["port", "clock_freq", "baudrate", "chunk_size"] - for option in config: - if option not in recognized_options: - warn( - f"Ignoring unrecognized option '{option}' in UART interface config." - ) - - # Ensure a serial port has been given - if "port" not in config: - raise ValueError("No serial port provided to UART interface.") - - # Ensure clock frequency is provided and positive - if "clock_freq" not in config: - raise ValueError("No clock frequency provided to UART interface.") - - if config["clock_freq"] <= 0: - raise ValueError("Non-positive clock frequency provided to UART interface.") - - # Check that baudrate is provided and positive - if "baudrate" not in config: - raise ValueError("No baudrate provided to UART interface.") - - if config["baudrate"] <= 0: - raise ValueError("Non-positive baudrate provided to UART interface.") - - # Confirm the actual baudrate is within 5% of the target baudrate - clock_freq = config["clock_freq"] - baudrate = config["baudrate"] - clocks_per_baud = clock_freq // baudrate - actual_baudrate = clock_freq / clocks_per_baud - error = 100 * abs(actual_baudrate - baudrate) / baudrate - - if error > 5: - raise ValueError( - "UART interface is unable to match targeted baudrate with specified clock frequency." - ) - - def get_serial_device(self): - """ - Return an open PySerial serial device if one exists, otherwise, open one. - """ - if hasattr(self, "serial_device"): - return self.serial_device - - else: - if self.port != "auto": - self.serial_device = Serial(self.port, self.baudrate, timeout=1) - return self.serial_device - - else: - # Try to autodetect which port to use based on the PID/VID of the device attached. - # This looks for the PID/VID of the FT2232, the primary chip used on the icestick - # and Digilent dev boards. However, folks will likely want to connect other things - # in the future, so in the future we'll probably want to look for other chips as - # well. - - # The FT2232 exposes two serial ports - and for whatever reason it usually has the - # 0th device used for JTAG programming, and the 1st used for UART. So we'll grab - # the 1st. - - import serial.tools.list_ports - - ports = [] - for port in serial.tools.list_ports.comports(): - if (port.vid == 0x403) and (port.pid == 0x6010): - ports.append(port) - - if len(ports) != 2: - raise ValueError( - f"Expected to see two serial ports for FT2232 device, but instead see {len(ports)}." - ) - - if ports[0].serial_number != ports[1].serial_number: - raise ValueError( - f"Serial numbers should be the same on both FT2232 ports - probably somehow grabbed ports on two different devices." - ) - - if ports[0].location > ports[1].location: - chosen_port = ports[0].device - - else: - chosen_port = ports[1].device - - self.serial_device = Serial(chosen_port, self.baudrate, timeout=1) - return self.serial_device - - def get_top_level_ports(self): - return [self.rx, self.tx] - - def read(self, addrs): - """ - Read the data stored in a set of address on Manta's internal memory. Addresses - must be specified as either integers or a list of integers. - """ - - # Handle a single integer address - if isinstance(addrs, int): - return self.read([addrs])[0] - - # Make sure all list elements are integers - if not all(isinstance(a, int) for a in addrs): - raise ValueError("Read address must be an integer or list of integers.") - - # Send read requests, and get responses - ser = self.get_serial_device() - addr_chunks = split_into_chunks(addrs, self.chunk_size) - datas = [] - - for addr_chunk in addr_chunks: - # Encode addrs into read requests - bytes_out = b"".join([f"R{a:04X}\r\n".encode("ascii") for a in addr_chunk]) - ser.write(bytes_out) - - # Read responses have the same length as read requests - bytes_in = ser.read(len(bytes_out)) - - if len(bytes_in) != len(bytes_out): - raise ValueError( - f"Only got {len(bytes_in)} out of {len(bytes_out)} bytes." - ) - - # Split received bytes into individual responses and decode - responses = split_into_chunks(bytes_in, 7) - data_chunk = [self.decode_read_response(r) for r in responses] - datas += data_chunk - - return datas - - def write(self, addrs, datas): - """ - Write the provided data into the provided addresses in Manta's internal memory. - Addresses and data must be specified as either integers or a list of integers. - """ - - # Handle a single integer address and data - if isinstance(addrs, int) and isinstance(datas, int): - return self.write([addrs], [datas]) - - # Make sure address and datas are all integers - if not isinstance(addrs, list) or not isinstance(datas, list): - raise ValueError( - "Write addresses and data must be an integer or list of integers." - ) - - if not all(isinstance(a, int) for a in addrs): - raise ValueError("Write addresses must be all be integers.") - - if not all(isinstance(d, int) for d in datas): - raise ValueError("Write data must all be integers.") - - # I'm not sure if it's necessary to split outputs into chunks - # I think the output buffer doesn't really drop stuff, just the input buffer - - # Encode addrs and datas into write requests - bytes_out = "".join([f"W{a:04X}{d:04X}\r\n" for a, d in zip(addrs, datas)]) - bytes_out = bytes_out.encode("ascii") - ser = self.get_serial_device() - ser.write(bytes_out) - - def decode_read_response(self, response_bytes): - """ - Check that read response is formatted properly, and extract the encoded data if so. - """ - - # Make sure response is not empty - if response_bytes is None: - raise ValueError("Unable to decode read response - no bytes received.") - - # Make sure response is properly encoded - response_ascii = response_bytes.decode("ascii") - - if len(response_ascii) != 7: - raise ValueError( - "Unable to decode read response - wrong number of bytes received." - ) - - if response_ascii[0] != "D": - raise ValueError("Unable to decode read response - incorrect preamble.") - - for i in range(1, 5): - if response_ascii[i] not in "0123456789ABCDEF": - raise ValueError("Unable to decode read response - invalid data byte.") - - if response_ascii[5] != "\r": - raise ValueError("Unable to decode read response - incorrect EOL.") - - if response_ascii[6] != "\n": - raise ValueError("Unable to decode read response - incorrect EOL.") - - return int(response_ascii[1:5], 16) - - def define_signals(self): - self.rx = Signal() - self.tx = Signal() - - self.addr_o = Signal(16) - self.data_o = Signal(16) - self.rw_o = Signal() - self.valid_o = Signal() - - self.addr_i = Signal(16) - self.data_i = Signal(16) - self.rw_i = Signal() - self.valid_i = Signal() - - def elaborate(self, platform): - # fancy submoduling and such goes in here - m = Module() - - m.submodules["uart_rx"] = uart_rx = UARTReceiver(self.clocks_per_baud) - m.submodules["bridge_rx"] = bridge_rx = RecieveBridge() - m.submodules["bridge_tx"] = bridge_tx = TransmitBridge() - m.submodules["uart_tx"] = uart_tx = UARTTransmitter(self.clocks_per_baud) - - m.d.comb += [ - # UART RX -> Internal Bus - uart_rx.rx.eq(self.rx), - bridge_rx.data_i.eq(uart_rx.data_o), - bridge_rx.valid_i.eq(uart_rx.valid_o), - self.data_o.eq(bridge_rx.data_o), - self.addr_o.eq(bridge_rx.addr_o), - self.rw_o.eq(bridge_rx.rw_o), - self.valid_o.eq(bridge_rx.valid_o), - # Internal Bus -> UART TX - bridge_tx.data_i.eq(self.data_i), - bridge_tx.rw_i.eq(self.rw_i), - bridge_tx.valid_i.eq(self.valid_i), - uart_tx.data_i.eq(bridge_tx.data_o), - uart_tx.start_i.eq(bridge_tx.start_o), - bridge_tx.done_i.eq(uart_tx.done_o), - self.tx.eq(uart_tx.tx), - ] - return m - - -class UARTReceiver(Elaboratable): - def __init__(self, clocks_per_baud): - self.clocks_per_baud = clocks_per_baud - - # Top-Level Ports - self.rx = Signal() - self.data_o = Signal(8, reset=0) - self.valid_o = Signal(1, reset=0) - - # Internal Signals - self.busy = Signal() - self.bit_index = Signal(range(10)) - self.baud_counter = Signal(range(2 * clocks_per_baud)) - - self.rx_d = Signal() - self.rx_q = Signal() - self.rx_q_prev = Signal() - - def elaborate(self, platform): - m = Module() - - # Two Flip-Flop Synchronizer - m.d.sync += [ - self.rx_d.eq(self.rx), - self.rx_q.eq(self.rx_d), - self.rx_q_prev.eq(self.rx_q), - ] - - m.d.sync += self.valid_o.eq(0) - - with m.If(~self.busy): - with m.If((~self.rx_q) & (self.rx_q_prev)): - m.d.sync += self.busy.eq(1) - m.d.sync += self.bit_index.eq(8) - m.d.sync += self.baud_counter.eq( - self.clocks_per_baud + (self.clocks_per_baud // 2) - 2 - ) - - with m.Else(): - with m.If(self.baud_counter == 0): - with m.If(self.bit_index == 0): - m.d.sync += self.valid_o.eq(1) - m.d.sync += self.busy.eq(0) - m.d.sync += self.bit_index.eq(0) - m.d.sync += self.baud_counter.eq(0) - - with m.Else(): - # m.d.sync += self.data_o.eq(Cat(self.rx_q, self.data_o[0:7])) - m.d.sync += self.data_o.eq(Cat(self.data_o[1:8], self.rx_q)) - m.d.sync += self.bit_index.eq(self.bit_index - 1) - m.d.sync += self.baud_counter.eq(self.clocks_per_baud - 1) - - with m.Else(): - m.d.sync += self.baud_counter.eq(self.baud_counter - 1) - - return m - - -class RecieveBridge(Elaboratable): - def __init__(self): - # Top-Level Ports - self.data_i = Signal(8) - self.valid_i = Signal() - - self.addr_o = Signal(16, reset=0) - self.data_o = Signal(16, reset=0) - self.rw_o = Signal(1, reset=0) - self.valid_o = Signal(1, reset=0) - - # State Machine - self.IDLE_STATE = 0 - self.READ_STATE = 1 - self.WRITE_STATE = 2 - - # Internal Signals - self.buffer = Signal(ArrayLayout(4, 8), reset_less=True) - self.state = Signal(2, reset=self.IDLE_STATE) - self.byte_num = Signal(4, reset=0) - self.is_eol = Signal() - self.is_ascii_hex = Signal() - self.from_ascii_hex = Signal(8) - - def drive_ascii_signals(self, m): - # Decode 0-9 - with m.If((self.data_i >= 0x30) & (self.data_i <= 0x39)): - m.d.comb += self.is_ascii_hex.eq(1) - m.d.comb += self.from_ascii_hex.eq(self.data_i - 0x30) - - # Decode A-F - with m.Elif((self.data_i >= 0x41) & (self.data_i <= 0x46)): - m.d.comb += self.is_ascii_hex.eq(1) - m.d.comb += self.from_ascii_hex.eq(self.data_i - 0x41 + 10) - - with m.Else(): - m.d.comb += self.is_ascii_hex.eq(0) - m.d.comb += self.from_ascii_hex.eq(0) - - with m.If((self.data_i == ord("\r")) | (self.data_i == ord("\n"))): - m.d.comb += self.is_eol.eq(1) - - with m.Else(): - m.d.comb += self.is_eol.eq(0) - - def drive_output_bus(self, m): - with m.If( - (self.state == self.READ_STATE) & (self.byte_num == 4) & (self.is_eol) - ): - m.d.comb += self.addr_o.eq( - Cat(self.buffer[3], self.buffer[2], self.buffer[1], self.buffer[0]) - ) - m.d.comb += self.data_o.eq(0) - m.d.comb += self.valid_o.eq(1) - m.d.comb += self.rw_o.eq(0) - - with m.Elif( - (self.state == self.WRITE_STATE) & (self.byte_num == 8) & (self.is_eol) - ): - m.d.comb += self.addr_o.eq( - Cat(self.buffer[3], self.buffer[2], self.buffer[1], self.buffer[0]) - ) - m.d.comb += self.data_o.eq( - Cat(self.buffer[7], self.buffer[6], self.buffer[5], self.buffer[4]) - ) - m.d.comb += self.valid_o.eq(1) - m.d.comb += self.rw_o.eq(1) - - with m.Else(): - m.d.comb += self.addr_o.eq(0) - m.d.comb += self.data_o.eq(0) - m.d.comb += self.rw_o.eq(0) - m.d.comb += self.valid_o.eq(0) - - def drive_fsm(self, m): - with m.If(self.valid_i): - with m.If(self.state == self.IDLE_STATE): - m.d.sync += self.byte_num.eq(0) - - with m.If(self.data_i == ord("R")): - m.d.sync += self.state.eq(self.READ_STATE) - - with m.Elif(self.data_i == ord("W")): - m.d.sync += self.state.eq(self.WRITE_STATE) - - with m.If(self.state == self.READ_STATE): - # buffer bytes if we don't have enough - with m.If(self.byte_num < 4): - # if bytes aren't valid ASCII then return to IDLE state - with m.If(self.is_ascii_hex == 0): - m.d.sync += self.state.eq(self.IDLE_STATE) - - # otherwise buffer them - with m.Else(): - m.d.sync += self.buffer[self.byte_num].eq(self.from_ascii_hex) - m.d.sync += self.byte_num.eq(self.byte_num + 1) - - with m.Else(): - m.d.sync += self.state.eq(self.IDLE_STATE) - - with m.If(self.state == self.WRITE_STATE): - # buffer bytes if we don't have enough - with m.If(self.byte_num < 8): - # if bytes aren't valid ASCII then return to IDLE state - with m.If(self.is_ascii_hex == 0): - m.d.sync += self.state.eq(self.IDLE_STATE) - - # otherwise buffer them - with m.Else(): - m.d.sync += self.buffer[self.byte_num].eq(self.from_ascii_hex) - m.d.sync += self.byte_num.eq(self.byte_num + 1) - - with m.Else(): - m.d.sync += self.state.eq(self.IDLE_STATE) - pass - - def elaborate(self, platform): - m = Module() - - self.drive_ascii_signals(m) - self.drive_output_bus(m) - self.drive_fsm(m) - - return m - - -class UARTTransmitter(Elaboratable): - def __init__(self, clocks_per_baud): - self.clocks_per_baud = clocks_per_baud - - # Top-Level Ports - self.data_i = Signal(8) - self.start_i = Signal() - self.done_o = Signal(reset=1) - - self.tx = Signal(reset=1) - - # Internal Signals - self.baud_counter = Signal(range(clocks_per_baud)) - self.buffer = Signal(9) - self.bit_index = Signal(4) - - def elaborate(self, platform): - m = Module() - - with m.If((self.start_i) & (self.done_o)): - m.d.sync += self.baud_counter.eq(self.clocks_per_baud - 1) - m.d.sync += self.buffer.eq(Cat(self.data_i, 1)) - m.d.sync += self.bit_index.eq(0) - m.d.sync += self.done_o.eq(0) - m.d.sync += self.tx.eq(0) - - with m.Elif(~self.done_o): - m.d.sync += self.baud_counter.eq(self.baud_counter - 1) - m.d.sync += self.done_o.eq((self.baud_counter == 1) & (self.bit_index == 9)) - - # A baud period has elapsed - with m.If(self.baud_counter == 0): - m.d.sync += self.baud_counter.eq(self.clocks_per_baud - 1) - - # Clock out another bit if there are any left - with m.If(self.bit_index < 9): - m.d.sync += self.tx.eq(self.buffer.bit_select(self.bit_index, 1)) - m.d.sync += self.bit_index.eq(self.bit_index + 1) - - # Byte has been sent, send out next one or go to idle - with m.Else(): - with m.If(self.start_i): - m.d.sync += self.buffer.eq(Cat(self.data_i, 1)) - m.d.sync += self.bit_index.eq(0) - m.d.sync += self.tx.eq(0) - - with m.Else(): - m.d.sync += self.done_o.eq(1) - return m - - -class TransmitBridge(Elaboratable): - def __init__(self): - # Top-Level Ports - self.data_i = Signal(16) - self.rw_i = Signal() - self.valid_i = Signal() - - self.data_o = Signal(8, reset=0) - self.start_o = Signal(1) - self.done_i = Signal() - - # Internal Signals - self.buffer = Signal(16, reset=0) - self.count = Signal(4, reset=0) - self.busy = Signal(1, reset=0) - self.to_ascii_hex = Signal(8) - self.n = Signal(4) - - def elaborate(self, platform): - m = Module() - - m.d.comb += self.start_o.eq(self.busy) - - with m.If(~self.busy): - with m.If((self.valid_i) & (~self.rw_i)): - m.d.sync += self.busy.eq(1) - m.d.sync += self.buffer.eq(self.data_i) - - with m.Else(): - # uart_tx is transmitting a byte: - with m.If(self.done_i): - m.d.sync += self.count.eq(self.count + 1) - - # Message has been transmitted - with m.If(self.count > 5): - m.d.sync += self.count.eq(0) - - # Go back to idle, or transmit next message - with m.If((self.valid_i) & (~self.rw_i)): - m.d.sync += self.buffer.eq(self.data_i) - - with m.Else(): - m.d.sync += self.busy.eq(0) - - # define to_ascii_hex - with m.If(self.n < 10): - m.d.comb += self.to_ascii_hex.eq(self.n + 0x30) - with m.Else(): - m.d.comb += self.to_ascii_hex.eq(self.n + 0x41 - 10) - - # run the sequence - with m.If(self.count == 0): - m.d.comb += self.n.eq(0) - m.d.comb += self.data_o.eq(ord("D")) - - with m.Elif(self.count == 1): - m.d.comb += self.n.eq(self.buffer[12:16]) - m.d.comb += self.data_o.eq(self.to_ascii_hex) - - with m.Elif(self.count == 2): - m.d.comb += self.n.eq(self.buffer[8:12]) - m.d.comb += self.data_o.eq(self.to_ascii_hex) - - with m.Elif(self.count == 3): - m.d.comb += self.n.eq(self.buffer[4:8]) - m.d.comb += self.data_o.eq(self.to_ascii_hex) - - with m.Elif(self.count == 4): - m.d.comb += self.n.eq(self.buffer[0:4]) - m.d.comb += self.data_o.eq(self.to_ascii_hex) - - with m.Elif(self.count == 5): - m.d.comb += self.n.eq(0) - m.d.comb += self.data_o.eq(ord("\r")) - - with m.Elif(self.count == 6): - m.d.comb += self.n.eq(0) - m.d.comb += self.data_o.eq(ord("\n")) - - with m.Else(): - m.d.comb += self.n.eq(0) - m.d.comb += self.data_o.eq(0) - - return m diff --git a/src/manta/uart/__init__.py b/src/manta/uart/__init__.py new file mode 100644 index 0000000..5f1556b --- /dev/null +++ b/src/manta/uart/__init__.py @@ -0,0 +1,265 @@ +from amaranth import * +from warnings import warn +from ..utils import * +from .receiver import UARTReceiver +from .receive_bridge import ReceiveBridge +from .transmitter import UARTTransmitter +from .transmit_bridge import TransmitBridge +from serial import Serial + + +class UARTInterface(Elaboratable): + def __init__(self, config): + self.config = config + self.check_config(self.config) + + self.port = config["port"] + self.clock_freq = config["clock_freq"] + self.baudrate = config["baudrate"] + self.clocks_per_baud = int(self.clock_freq // self.baudrate) + + self.define_signals() + + # Set chunk_size, which is the max amount of bytes that the core will + # dump to the OS driver at a time. Since the FPGA will return bytes + # almost instantaneously, this prevents the OS's input buffer from + # overflowing, and dropping bytes. + self.chunk_size = 256 # in bytes + if "chunk_size" in config: + self.chunk_size = config["chunk_size"] + + def check_config(self, config): + # Warn if unrecognized options have been given + recognized_options = ["port", "clock_freq", "baudrate", "chunk_size"] + for option in config: + if option not in recognized_options: + warn( + f"Ignoring unrecognized option '{option}' in UART interface config." + ) + + # Ensure a serial port has been given + if "port" not in config: + raise ValueError("No serial port provided to UART interface.") + + # Ensure clock frequency is provided and positive + if "clock_freq" not in config: + raise ValueError("No clock frequency provided to UART interface.") + + if config["clock_freq"] <= 0: + raise ValueError("Non-positive clock frequency provided to UART interface.") + + # Check that baudrate is provided and positive + if "baudrate" not in config: + raise ValueError("No baudrate provided to UART interface.") + + if config["baudrate"] <= 0: + raise ValueError("Non-positive baudrate provided to UART interface.") + + # Confirm the actual baudrate is within 5% of the target baudrate + clock_freq = config["clock_freq"] + baudrate = config["baudrate"] + clocks_per_baud = clock_freq // baudrate + actual_baudrate = clock_freq / clocks_per_baud + error = 100 * abs(actual_baudrate - baudrate) / baudrate + + if error > 5: + raise ValueError( + "UART interface is unable to match targeted baudrate with specified clock frequency." + ) + + def get_serial_device(self): + """ + Return an open PySerial serial device if one exists, otherwise, open one. + """ + if hasattr(self, "serial_device"): + return self.serial_device + + else: + if self.port != "auto": + self.serial_device = Serial(self.port, self.baudrate, timeout=1) + return self.serial_device + + else: + # Try to autodetect which port to use based on the PID/VID of the device attached. + # This looks for the PID/VID of the FT2232, the primary chip used on the icestick + # and Digilent dev boards. However, folks will likely want to connect other things + # in the future, so in the future we'll probably want to look for other chips as + # well. + + # The FT2232 exposes two serial ports - and for whatever reason it usually has the + # 0th device used for JTAG programming, and the 1st used for UART. So we'll grab + # the 1st. + + import serial.tools.list_ports + + ports = [] + for port in serial.tools.list_ports.comports(): + if (port.vid == 0x403) and (port.pid == 0x6010): + ports.append(port) + + if len(ports) != 2: + raise ValueError( + f"Expected to see two serial ports for FT2232 device, but instead see {len(ports)}." + ) + + if ports[0].serial_number != ports[1].serial_number: + raise ValueError( + f"Serial numbers should be the same on both FT2232 ports - probably somehow grabbed ports on two different devices." + ) + + if ports[0].location > ports[1].location: + chosen_port = ports[0].device + + else: + chosen_port = ports[1].device + + self.serial_device = Serial(chosen_port, self.baudrate, timeout=1) + return self.serial_device + + def get_top_level_ports(self): + return [self.rx, self.tx] + + def read(self, addrs): + """ + Read the data stored in a set of address on Manta's internal memory. Addresses + must be specified as either integers or a list of integers. + """ + + # Handle a single integer address + if isinstance(addrs, int): + return self.read([addrs])[0] + + # Make sure all list elements are integers + if not all(isinstance(a, int) for a in addrs): + raise ValueError("Read address must be an integer or list of integers.") + + # Send read requests, and get responses + ser = self.get_serial_device() + addr_chunks = split_into_chunks(addrs, self.chunk_size) + datas = [] + + for addr_chunk in addr_chunks: + # Encode addrs into read requests + bytes_out = b"".join([f"R{a:04X}\r\n".encode("ascii") for a in addr_chunk]) + ser.write(bytes_out) + + # Read responses have the same length as read requests + bytes_in = ser.read(len(bytes_out)) + + if len(bytes_in) != len(bytes_out): + raise ValueError( + f"Only got {len(bytes_in)} out of {len(bytes_out)} bytes." + ) + + # Split received bytes into individual responses and decode + responses = split_into_chunks(bytes_in, 7) + data_chunk = [self.decode_read_response(r) for r in responses] + datas += data_chunk + + return datas + + def write(self, addrs, datas): + """ + Write the provided data into the provided addresses in Manta's internal memory. + Addresses and data must be specified as either integers or a list of integers. + """ + + # Handle a single integer address and data + if isinstance(addrs, int) and isinstance(datas, int): + return self.write([addrs], [datas]) + + # Make sure address and datas are all integers + if not isinstance(addrs, list) or not isinstance(datas, list): + raise ValueError( + "Write addresses and data must be an integer or list of integers." + ) + + if not all(isinstance(a, int) for a in addrs): + raise ValueError("Write addresses must be all be integers.") + + if not all(isinstance(d, int) for d in datas): + raise ValueError("Write data must all be integers.") + + # I'm not sure if it's necessary to split outputs into chunks + # I think the output buffer doesn't really drop stuff, just the input buffer + + # Encode addrs and datas into write requests + bytes_out = "".join([f"W{a:04X}{d:04X}\r\n" for a, d in zip(addrs, datas)]) + bytes_out = bytes_out.encode("ascii") + ser = self.get_serial_device() + ser.write(bytes_out) + + def decode_read_response(self, response_bytes): + """ + Check that read response is formatted properly, and extract the encoded data if so. + """ + + # Make sure response is not empty + if response_bytes is None: + raise ValueError("Unable to decode read response - no bytes received.") + + # Make sure response is properly encoded + response_ascii = response_bytes.decode("ascii") + + if len(response_ascii) != 7: + raise ValueError( + "Unable to decode read response - wrong number of bytes received." + ) + + if response_ascii[0] != "D": + raise ValueError("Unable to decode read response - incorrect preamble.") + + for i in range(1, 5): + if response_ascii[i] not in "0123456789ABCDEF": + raise ValueError("Unable to decode read response - invalid data byte.") + + if response_ascii[5] != "\r": + raise ValueError("Unable to decode read response - incorrect EOL.") + + if response_ascii[6] != "\n": + raise ValueError("Unable to decode read response - incorrect EOL.") + + return int(response_ascii[1:5], 16) + + def define_signals(self): + self.rx = Signal() + self.tx = Signal() + + self.addr_o = Signal(16) + self.data_o = Signal(16) + self.rw_o = Signal() + self.valid_o = Signal() + + self.addr_i = Signal(16) + self.data_i = Signal(16) + self.rw_i = Signal() + self.valid_i = Signal() + + def elaborate(self, platform): + # fancy submoduling and such goes in here + m = Module() + + m.submodules["uart_rx"] = uart_rx = UARTReceiver(self.clocks_per_baud) + m.submodules["bridge_rx"] = bridge_rx = ReceiveBridge() + m.submodules["bridge_tx"] = bridge_tx = TransmitBridge() + m.submodules["uart_tx"] = uart_tx = UARTTransmitter(self.clocks_per_baud) + + m.d.comb += [ + # UART RX -> Internal Bus + uart_rx.rx.eq(self.rx), + bridge_rx.data_i.eq(uart_rx.data_o), + bridge_rx.valid_i.eq(uart_rx.valid_o), + self.data_o.eq(bridge_rx.data_o), + self.addr_o.eq(bridge_rx.addr_o), + self.rw_o.eq(bridge_rx.rw_o), + self.valid_o.eq(bridge_rx.valid_o), + # Internal Bus -> UART TX + bridge_tx.data_i.eq(self.data_i), + bridge_tx.rw_i.eq(self.rw_i), + bridge_tx.valid_i.eq(self.valid_i), + uart_tx.data_i.eq(bridge_tx.data_o), + uart_tx.start_i.eq(bridge_tx.start_o), + bridge_tx.done_i.eq(uart_tx.done_o), + self.tx.eq(uart_tx.tx), + ] + return m diff --git a/src/manta/uart/receive_bridge.py b/src/manta/uart/receive_bridge.py new file mode 100644 index 0000000..4abbc7b --- /dev/null +++ b/src/manta/uart/receive_bridge.py @@ -0,0 +1,128 @@ +from amaranth import * +from amaranth.lib.data import ArrayLayout + + +class ReceiveBridge(Elaboratable): + def __init__(self): + # Top-Level Ports + self.data_i = Signal(8) + self.valid_i = Signal() + + self.addr_o = Signal(16, reset=0) + self.data_o = Signal(16, reset=0) + self.rw_o = Signal(1, reset=0) + self.valid_o = Signal(1, reset=0) + + # State Machine + self.IDLE_STATE = 0 + self.READ_STATE = 1 + self.WRITE_STATE = 2 + + # Internal Signals + self.buffer = Signal(ArrayLayout(4, 8), reset_less=True) + self.state = Signal(2, reset=self.IDLE_STATE) + self.byte_num = Signal(4, reset=0) + self.is_eol = Signal() + self.is_ascii_hex = Signal() + self.from_ascii_hex = Signal(8) + + def drive_ascii_signals(self, m): + # Decode 0-9 + with m.If((self.data_i >= 0x30) & (self.data_i <= 0x39)): + m.d.comb += self.is_ascii_hex.eq(1) + m.d.comb += self.from_ascii_hex.eq(self.data_i - 0x30) + + # Decode A-F + with m.Elif((self.data_i >= 0x41) & (self.data_i <= 0x46)): + m.d.comb += self.is_ascii_hex.eq(1) + m.d.comb += self.from_ascii_hex.eq(self.data_i - 0x41 + 10) + + with m.Else(): + m.d.comb += self.is_ascii_hex.eq(0) + m.d.comb += self.from_ascii_hex.eq(0) + + with m.If((self.data_i == ord("\r")) | (self.data_i == ord("\n"))): + m.d.comb += self.is_eol.eq(1) + + with m.Else(): + m.d.comb += self.is_eol.eq(0) + + def drive_output_bus(self, m): + with m.If( + (self.state == self.READ_STATE) & (self.byte_num == 4) & (self.is_eol) + ): + m.d.comb += self.addr_o.eq( + Cat(self.buffer[3], self.buffer[2], self.buffer[1], self.buffer[0]) + ) + m.d.comb += self.data_o.eq(0) + m.d.comb += self.valid_o.eq(1) + m.d.comb += self.rw_o.eq(0) + + with m.Elif( + (self.state == self.WRITE_STATE) & (self.byte_num == 8) & (self.is_eol) + ): + m.d.comb += self.addr_o.eq( + Cat(self.buffer[3], self.buffer[2], self.buffer[1], self.buffer[0]) + ) + m.d.comb += self.data_o.eq( + Cat(self.buffer[7], self.buffer[6], self.buffer[5], self.buffer[4]) + ) + m.d.comb += self.valid_o.eq(1) + m.d.comb += self.rw_o.eq(1) + + with m.Else(): + m.d.comb += self.addr_o.eq(0) + m.d.comb += self.data_o.eq(0) + m.d.comb += self.rw_o.eq(0) + m.d.comb += self.valid_o.eq(0) + + def drive_fsm(self, m): + with m.If(self.valid_i): + with m.If(self.state == self.IDLE_STATE): + m.d.sync += self.byte_num.eq(0) + + with m.If(self.data_i == ord("R")): + m.d.sync += self.state.eq(self.READ_STATE) + + with m.Elif(self.data_i == ord("W")): + m.d.sync += self.state.eq(self.WRITE_STATE) + + with m.If(self.state == self.READ_STATE): + # buffer bytes if we don't have enough + with m.If(self.byte_num < 4): + # if bytes aren't valid ASCII then return to IDLE state + with m.If(self.is_ascii_hex == 0): + m.d.sync += self.state.eq(self.IDLE_STATE) + + # otherwise buffer them + with m.Else(): + m.d.sync += self.buffer[self.byte_num].eq(self.from_ascii_hex) + m.d.sync += self.byte_num.eq(self.byte_num + 1) + + with m.Else(): + m.d.sync += self.state.eq(self.IDLE_STATE) + + with m.If(self.state == self.WRITE_STATE): + # buffer bytes if we don't have enough + with m.If(self.byte_num < 8): + # if bytes aren't valid ASCII then return to IDLE state + with m.If(self.is_ascii_hex == 0): + m.d.sync += self.state.eq(self.IDLE_STATE) + + # otherwise buffer them + with m.Else(): + m.d.sync += self.buffer[self.byte_num].eq(self.from_ascii_hex) + m.d.sync += self.byte_num.eq(self.byte_num + 1) + + with m.Else(): + m.d.sync += self.state.eq(self.IDLE_STATE) + pass + + def elaborate(self, platform): + m = Module() + + self.drive_ascii_signals(m) + self.drive_output_bus(m) + self.drive_fsm(m) + + return m diff --git a/src/manta/uart/receiver.py b/src/manta/uart/receiver.py new file mode 100644 index 0000000..70650cf --- /dev/null +++ b/src/manta/uart/receiver.py @@ -0,0 +1,59 @@ +from amaranth import * + + +class UARTReceiver(Elaboratable): + def __init__(self, clocks_per_baud): + self.clocks_per_baud = clocks_per_baud + + # Top-Level Ports + self.rx = Signal() + self.data_o = Signal(8, reset=0) + self.valid_o = Signal(1, reset=0) + + # Internal Signals + self.busy = Signal() + self.bit_index = Signal(range(10)) + self.baud_counter = Signal(range(2 * clocks_per_baud)) + + self.rx_d = Signal() + self.rx_q = Signal() + self.rx_q_prev = Signal() + + def elaborate(self, platform): + m = Module() + + # Two Flip-Flop Synchronizer + m.d.sync += [ + self.rx_d.eq(self.rx), + self.rx_q.eq(self.rx_d), + self.rx_q_prev.eq(self.rx_q), + ] + + m.d.sync += self.valid_o.eq(0) + + with m.If(~self.busy): + with m.If((~self.rx_q) & (self.rx_q_prev)): + m.d.sync += self.busy.eq(1) + m.d.sync += self.bit_index.eq(8) + m.d.sync += self.baud_counter.eq( + self.clocks_per_baud + (self.clocks_per_baud // 2) - 2 + ) + + with m.Else(): + with m.If(self.baud_counter == 0): + with m.If(self.bit_index == 0): + m.d.sync += self.valid_o.eq(1) + m.d.sync += self.busy.eq(0) + m.d.sync += self.bit_index.eq(0) + m.d.sync += self.baud_counter.eq(0) + + with m.Else(): + # m.d.sync += self.data_o.eq(Cat(self.rx_q, self.data_o[0:7])) + m.d.sync += self.data_o.eq(Cat(self.data_o[1:8], self.rx_q)) + m.d.sync += self.bit_index.eq(self.bit_index - 1) + m.d.sync += self.baud_counter.eq(self.clocks_per_baud - 1) + + with m.Else(): + m.d.sync += self.baud_counter.eq(self.baud_counter - 1) + + return m diff --git a/src/manta/uart/transmit_bridge.py b/src/manta/uart/transmit_bridge.py new file mode 100644 index 0000000..3f1b640 --- /dev/null +++ b/src/manta/uart/transmit_bridge.py @@ -0,0 +1,87 @@ +from amaranth import * + + +class TransmitBridge(Elaboratable): + def __init__(self): + # Top-Level Ports + self.data_i = Signal(16) + self.rw_i = Signal() + self.valid_i = Signal() + + self.data_o = Signal(8, reset=0) + self.start_o = Signal(1) + self.done_i = Signal() + + # Internal Signals + self.buffer = Signal(16, reset=0) + self.count = Signal(4, reset=0) + self.busy = Signal(1, reset=0) + self.to_ascii_hex = Signal(8) + self.n = Signal(4) + + def elaborate(self, platform): + m = Module() + + m.d.comb += self.start_o.eq(self.busy) + + with m.If(~self.busy): + with m.If((self.valid_i) & (~self.rw_i)): + m.d.sync += self.busy.eq(1) + m.d.sync += self.buffer.eq(self.data_i) + + with m.Else(): + # uart_tx is transmitting a byte: + with m.If(self.done_i): + m.d.sync += self.count.eq(self.count + 1) + + # Message has been transmitted + with m.If(self.count > 5): + m.d.sync += self.count.eq(0) + + # Go back to idle, or transmit next message + with m.If((self.valid_i) & (~self.rw_i)): + m.d.sync += self.buffer.eq(self.data_i) + + with m.Else(): + m.d.sync += self.busy.eq(0) + + # define to_ascii_hex + with m.If(self.n < 10): + m.d.comb += self.to_ascii_hex.eq(self.n + 0x30) + with m.Else(): + m.d.comb += self.to_ascii_hex.eq(self.n + 0x41 - 10) + + # run the sequence + with m.If(self.count == 0): + m.d.comb += self.n.eq(0) + m.d.comb += self.data_o.eq(ord("D")) + + with m.Elif(self.count == 1): + m.d.comb += self.n.eq(self.buffer[12:16]) + m.d.comb += self.data_o.eq(self.to_ascii_hex) + + with m.Elif(self.count == 2): + m.d.comb += self.n.eq(self.buffer[8:12]) + m.d.comb += self.data_o.eq(self.to_ascii_hex) + + with m.Elif(self.count == 3): + m.d.comb += self.n.eq(self.buffer[4:8]) + m.d.comb += self.data_o.eq(self.to_ascii_hex) + + with m.Elif(self.count == 4): + m.d.comb += self.n.eq(self.buffer[0:4]) + m.d.comb += self.data_o.eq(self.to_ascii_hex) + + with m.Elif(self.count == 5): + m.d.comb += self.n.eq(0) + m.d.comb += self.data_o.eq(ord("\r")) + + with m.Elif(self.count == 6): + m.d.comb += self.n.eq(0) + m.d.comb += self.data_o.eq(ord("\n")) + + with m.Else(): + m.d.comb += self.n.eq(0) + m.d.comb += self.data_o.eq(0) + + return m diff --git a/src/manta/uart/transmitter.py b/src/manta/uart/transmitter.py new file mode 100644 index 0000000..b67a1ab --- /dev/null +++ b/src/manta/uart/transmitter.py @@ -0,0 +1,52 @@ +from amaranth import * + + +class UARTTransmitter(Elaboratable): + def __init__(self, clocks_per_baud): + self.clocks_per_baud = clocks_per_baud + + # Top-Level Ports + self.data_i = Signal(8) + self.start_i = Signal() + self.done_o = Signal(reset=1) + + self.tx = Signal(reset=1) + + # Internal Signals + self.baud_counter = Signal(range(clocks_per_baud)) + self.buffer = Signal(9) + self.bit_index = Signal(4) + + def elaborate(self, platform): + m = Module() + + with m.If((self.start_i) & (self.done_o)): + m.d.sync += self.baud_counter.eq(self.clocks_per_baud - 1) + m.d.sync += self.buffer.eq(Cat(self.data_i, 1)) + m.d.sync += self.bit_index.eq(0) + m.d.sync += self.done_o.eq(0) + m.d.sync += self.tx.eq(0) + + with m.Elif(~self.done_o): + m.d.sync += self.baud_counter.eq(self.baud_counter - 1) + m.d.sync += self.done_o.eq((self.baud_counter == 1) & (self.bit_index == 9)) + + # A baud period has elapsed + with m.If(self.baud_counter == 0): + m.d.sync += self.baud_counter.eq(self.clocks_per_baud - 1) + + # Clock out another bit if there are any left + with m.If(self.bit_index < 9): + m.d.sync += self.tx.eq(self.buffer.bit_select(self.bit_index, 1)) + m.d.sync += self.bit_index.eq(self.bit_index + 1) + + # Byte has been sent, send out next one or go to idle + with m.Else(): + with m.If(self.start_i): + m.d.sync += self.buffer.eq(Cat(self.data_i, 1)) + m.d.sync += self.bit_index.eq(0) + m.d.sync += self.tx.eq(0) + + with m.Else(): + m.d.sync += self.done_o.eq(1) + return m diff --git a/src/manta/utils.py b/src/manta/utils.py index bb20271..3591165 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -1,8 +1,17 @@ from amaranth.sim import Simulator +from amaranth.lib import data, enum from math import ceil import os +class InternalBus(data.StructLayout): + """Describes the layout of Manta's internal bus, such that signals of + the appropriate dimension can be instantiated with Signal(InternalBus()).""" + + def __init__(self): + super().__init__({"addr": 16, "data": 16, "rw": 1, "valid": 1}) + + def words_to_value(data): """ Takes a list of integers, interprets them as 16-bit integers, and diff --git a/test/test_bridge_rx_sim.py b/test/test_bridge_rx_sim.py index 89c3d4d..c65a184 100644 --- a/test/test_bridge_rx_sim.py +++ b/test/test_bridge_rx_sim.py @@ -1,9 +1,9 @@ from amaranth.sim import Simulator -from manta.uart import RecieveBridge +from manta.uart import ReceiveBridge from manta.utils import * -bridge_rx = RecieveBridge() +bridge_rx = ReceiveBridge() def verify_read_decoding(bytes, addr): From 487b11f1556be5e78a6b76ae019f7214d4ea8a3a Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 7 Jan 2024 22:35:15 -0800 Subject: [PATCH 24/89] complete refactor to InternalBus() --- src/manta/io_core.py | 32 +++++-------- src/manta/logic_analyzer/__init__.py | 37 ++++----------- src/manta/logic_analyzer/fsm.py | 14 ++---- src/manta/logic_analyzer/trigger_block.py | 14 ++---- src/manta/manta.py | 20 ++------ src/manta/memory_core.py | 57 +++++++---------------- src/manta/uart/__init__.py | 25 ++++------ src/manta/utils.py | 26 +++++------ test/test_logic_analyzer_sim.py | 16 +++---- 9 files changed, 77 insertions(+), 164 deletions(-) diff --git a/src/manta/io_core.py b/src/manta/io_core.py index c12096a..98ce631 100644 --- a/src/manta/io_core.py +++ b/src/manta/io_core.py @@ -87,16 +87,9 @@ class IOCore(Elaboratable): ) def define_signals(self): - # Bus Ports - self.addr_i = Signal(16) - self.data_i = Signal(16) - self.rw_i = Signal() - self.valid_i = Signal() - - self.addr_o = Signal(16) - self.data_o = Signal(16) - self.rw_o = Signal() - self.valid_o = Signal() + # Bus Input/Output + self.bus_i = Signal(InternalBus()) + self.bus_o = Signal(InternalBus()) # Input Probes (and buffers) if "inputs" in self.config: @@ -187,10 +180,7 @@ class IOCore(Elaboratable): m = Module() # Shuffle bus transactions along - m.d.sync += self.addr_o.eq(self.addr_i) - m.d.sync += self.data_o.eq(self.data_i) - m.d.sync += self.rw_o.eq(self.rw_i) - m.d.sync += self.valid_o.eq(self.valid_i) + m.d.sync += self.bus_o.eq(self.bus_i) # Update buffers from probes with m.If(self.strobe): @@ -209,17 +199,17 @@ class IOCore(Elaboratable): m.d.sync += output_probe.eq(output_probe_buf) # Handle register reads and writes - with m.If((self.addr_i >= self.base_addr)): - with m.If((self.addr_o <= self.max_addr)): + with m.If((self.bus_i.addr >= self.base_addr)): + with m.If((self.bus_o.addr <= self.max_addr)): for entry in self.mmap.values(): for addr, signal in zip(entry["addrs"], entry["signals"]): - with m.If(self.rw_i): - with m.If(self.addr_i == addr): - m.d.sync += signal.eq(self.data_i) + with m.If(self.bus_i.rw): + with m.If(self.bus_i.addr == addr): + m.d.sync += signal.eq(self.bus_i.data) with m.Else(): - with m.If(self.addr_i == addr): - m.d.sync += self.data_o.eq(signal) + with m.If(self.bus_i.addr == addr): + m.d.sync += self.bus_o.data.eq(signal) return m diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index fcb27d9..6e38e54 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -36,17 +36,9 @@ class LogicAnalyzerCore(Elaboratable): self.config = config self.check_config(config) - # Bus Input - self.addr_i = Signal(16) - self.data_i = Signal(16) - self.rw_i = Signal(1) - self.valid_i = Signal(1) - - # Bus Output - self.addr_o = Signal(16) - self.data_o = Signal(16) - self.rw_o = Signal(1) - self.valid_o = Signal(1) + # Bus Input/Output + self.bus_i = Signal(InternalBus()) + self.bus_o = Signal(InternalBus()) self.probes = [ Signal(width, name=name) for name, width in self.config["probes"].items() @@ -177,26 +169,15 @@ class LogicAnalyzerCore(Elaboratable): # Wire bus connections between internal modules m.d.comb += [ # Bus Connections - fsm.addr_i.eq(self.addr_i), - fsm.data_i.eq(self.data_i), - fsm.rw_i.eq(self.rw_i), - fsm.valid_i.eq(self.valid_i), - trig_blk.addr_i.eq(fsm.addr_o), - trig_blk.data_i.eq(fsm.data_o), - trig_blk.rw_i.eq(fsm.rw_o), - trig_blk.valid_i.eq(fsm.valid_o), - sample_mem.addr_i.eq(trig_blk.addr_o), - sample_mem.data_i.eq(trig_blk.data_o), - sample_mem.rw_i.eq(trig_blk.rw_o), - sample_mem.valid_i.eq(trig_blk.valid_o), - self.addr_o.eq(sample_mem.addr_o), - self.data_o.eq(sample_mem.data_o), - self.rw_o.eq(sample_mem.rw_o), - self.valid_o.eq(sample_mem.valid_o), + fsm.bus_i.eq(self.bus_i), + trig_blk.bus_i.eq(self.fsm.bus_o), + sample_mem.bus_i.eq(trig_blk.bus_o), + self.bus_o.eq(sample_mem.bus_o), + # Non-bus Connections fsm.trigger.eq(trig_blk.trig), sample_mem.user_addr.eq(fsm.r.write_pointer), - sample_mem.user_we.eq(fsm.write_enable), + sample_mem.user_we.eq(fsm.write_enable) ] return m diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index b2f0059..4d8583e 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -37,17 +37,9 @@ class LogicAnalyzerFSM(Elaboratable): self.r = IOCore(register_config, base_addr, interface) - # Bus Input - self.addr_i = self.r.addr_i - self.data_i = self.r.data_i - self.rw_i = self.r.rw_i - self.valid_i = self.r.valid_i - - # Bus Output - self.addr_o = self.r.addr_o - self.data_o = self.r.data_o - self.rw_o = self.r.rw_o - self.valid_o = self.r.valid_o + # Bus Input/Output + self.bus_i = self.r.bus_i + self.bus_o = self.r.bus_o def get_max_addr(self): return self.r.get_max_addr() diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 2b15530..0d0a0bd 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -18,17 +18,9 @@ class LogicAnalyzerTriggerBlock(Elaboratable): self.r = IOCore({"outputs": outputs}, base_addr, interface) - # Bus Input - self.addr_i = self.r.addr_i - self.data_i = self.r.data_i - self.rw_i = self.r.rw_i - self.valid_i = self.r.valid_i - - # Bus Output - self.addr_o = self.r.addr_o - self.data_o = self.r.data_o - self.rw_o = self.r.rw_o - self.valid_o = self.r.valid_o + # Bus Input/Output + self.bus_i = self.r.bus_i + self.bus_o = self.r.bus_o # Global trigger. High if any probe is triggered. self.trig = Signal(1) diff --git a/src/manta/manta.py b/src/manta/manta.py index 97f1b4c..63f902b 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -136,28 +136,16 @@ class Manta(Elaboratable): core_instances = list(self.cores.values()) first_core = core_instances[0] last_core = core_instances[-1] - m.d.comb += [ - first_core.addr_i.eq(self.interface.addr_o), - first_core.data_i.eq(self.interface.data_o), - first_core.rw_i.eq(self.interface.rw_o), - first_core.valid_i.eq(self.interface.valid_o), - self.interface.addr_i.eq(last_core.addr_o), - self.interface.data_i.eq(last_core.data_o), - self.interface.rw_i.eq(last_core.rw_o), - self.interface.valid_i.eq(last_core.valid_o), - ] + + m.d.comb += first_core.bus_i.eq(self.interface.bus_o) + m.d.comb += self.interface.bus_i.eq(last_core.bus_o) # Connect output of ith core to input of (i+1)th core for i in range(len(core_instances) - 1): ith_core = core_instances[i] i_plus_oneth_core = core_instances[i + 1] - m.d.comb += [ - i_plus_oneth_core.addr_i.eq(ith_core.addr_o), - i_plus_oneth_core.data_i.eq(ith_core.data_o), - i_plus_oneth_core.rw_i.eq(ith_core.rw_o), - i_plus_oneth_core.valid_i.eq(ith_core.valid_o), - ] + m.d.comb += i_plus_oneth_core.bus_i.eq(ith_core.bus_o) return m diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index cf4d9ae..e74e32d 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -47,23 +47,10 @@ class ReadOnlyMemoryCore(Elaboratable): raise ValueError("Width of memory core must be positive. ") def define_signals(self): - # Bus Input - self.addr_i = Signal(16) - self.data_i = Signal(16) - self.rw_i = Signal(1) - self.valid_i = Signal(1) - - # Bus Pipelining - self.addr_pipe = [Signal(16) for _ in range(3)] - self.data_pipe = [Signal(16) for _ in range(3)] - self.rw_pipe = [Signal(1) for _ in range(3)] - self.valid_pipe = [Signal(1) for _ in range(3)] - - # Bus Output - self.addr_o = Signal(16, reset=0) - self.data_o = Signal(16, reset=0) - self.rw_o = Signal(1, reset=0) - self.valid_o = Signal(1, reset=0) + # Bus Input/Pipelining/Output + self.bus_i = Signal(InternalBus()) + self.bus_pipe = [Signal(InternalBus()) for _ in range(3)] + self.bus_o = Signal(InternalBus()) # User Port self.user_addr = Signal(range(self.depth)) @@ -71,22 +58,12 @@ class ReadOnlyMemoryCore(Elaboratable): self.user_we = Signal(1) def pipeline_bus(self, m): - # Pipelining - m.d.sync += self.addr_pipe[0].eq(self.addr_i) - m.d.sync += self.data_pipe[0].eq(self.data_i) - m.d.sync += self.rw_pipe[0].eq(self.rw_i) - m.d.sync += self.valid_pipe[0].eq(self.valid_i) + m.d.sync += self.bus_pipe[0].eq(self.bus_i) for i in range(1, 3): - m.d.sync += self.addr_pipe[i].eq(self.addr_pipe[i - 1]) - m.d.sync += self.data_pipe[i].eq(self.data_pipe[i - 1]) - m.d.sync += self.rw_pipe[i].eq(self.rw_pipe[i - 1]) - m.d.sync += self.valid_pipe[i].eq(self.valid_pipe[i - 1]) + m.d.sync += self.bus_pipe[i].eq(self.bus_pipe[i-1]) - m.d.sync += self.addr_o.eq(self.addr_pipe[2]) - m.d.sync += self.data_o.eq(self.data_pipe[2]) - m.d.sync += self.rw_o.eq(self.rw_pipe[2]) - m.d.sync += self.valid_o.eq(self.valid_pipe[2]) + m.d.sync += self.bus_o.eq(self.bus_pipe[2]) def define_mems(self): # ok there's three cases: @@ -122,21 +99,21 @@ class ReadOnlyMemoryCore(Elaboratable): # Throw BRAM operations into the front of the pipeline with m.If( - (self.valid_i) - & (~self.rw_i) - & (self.addr_i >= start_addr) - & (self.addr_i <= stop_addr) + (self.bus_i.valid) + & (~self.bus_i.rw) + & (self.bus_i.addr >= start_addr) + & (self.bus_i.addr <= stop_addr) ): - m.d.sync += read_port.addr.eq(self.addr_i - start_addr) + m.d.sync += read_port.addr.eq(self.bus_i.addr - start_addr) # Pull BRAM reads from the back of the pipeline with m.If( - (self.valid_pipe[2]) - & (~self.rw_pipe[2]) - & (self.addr_pipe[2] >= start_addr) - & (self.addr_pipe[2] <= stop_addr) + (self.bus_pipe[2].valid) + & (~self.bus_pipe[2].rw) + & (self.bus_pipe[2].addr >= start_addr) + & (self.bus_pipe[2].addr <= stop_addr) ): - m.d.sync += self.data_o.eq(read_port.data) + m.d.sync += self.bus_o.data.eq(read_port.data) def handle_write_ports(self, m): # These are given to the user diff --git a/src/manta/uart/__init__.py b/src/manta/uart/__init__.py index 5f1556b..a6f5c19 100644 --- a/src/manta/uart/__init__.py +++ b/src/manta/uart/__init__.py @@ -225,15 +225,8 @@ class UARTInterface(Elaboratable): self.rx = Signal() self.tx = Signal() - self.addr_o = Signal(16) - self.data_o = Signal(16) - self.rw_o = Signal() - self.valid_o = Signal() - - self.addr_i = Signal(16) - self.data_i = Signal(16) - self.rw_i = Signal() - self.valid_i = Signal() + self.bus_o = Signal(InternalBus()) + self.bus_i = Signal(InternalBus()) def elaborate(self, platform): # fancy submoduling and such goes in here @@ -249,14 +242,14 @@ class UARTInterface(Elaboratable): uart_rx.rx.eq(self.rx), bridge_rx.data_i.eq(uart_rx.data_o), bridge_rx.valid_i.eq(uart_rx.valid_o), - self.data_o.eq(bridge_rx.data_o), - self.addr_o.eq(bridge_rx.addr_o), - self.rw_o.eq(bridge_rx.rw_o), - self.valid_o.eq(bridge_rx.valid_o), + self.bus_o.data.eq(bridge_rx.data_o), + self.bus_o.addr.eq(bridge_rx.addr_o), + self.bus_o.rw.eq(bridge_rx.rw_o), + self.bus_o.valid.eq(bridge_rx.valid_o), # Internal Bus -> UART TX - bridge_tx.data_i.eq(self.data_i), - bridge_tx.rw_i.eq(self.rw_i), - bridge_tx.valid_i.eq(self.valid_i), + bridge_tx.data_i.eq(self.bus_i.data), + bridge_tx.rw_i.eq(self.bus_i.rw), + bridge_tx.valid_i.eq(self.bus_i.valid), uart_tx.data_i.eq(bridge_tx.data_o), uart_tx.start_i.eq(bridge_tx.start_o), bridge_tx.done_i.eq(uart_tx.done_o), diff --git a/src/manta/utils.py b/src/manta/utils.py index 3591165..9773a57 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -83,20 +83,20 @@ def verify_register(module, addr, expected_data): """ # place read transaction on the bus - yield module.addr_i.eq(addr) - yield module.data_i.eq(0) - yield module.rw_i.eq(0) - yield module.valid_i.eq(1) + yield module.bus_i.addr.eq(addr) + yield module.bus_i.data.eq(0) + yield module.bus_i.rw.eq(0) + yield module.bus_i.valid.eq(1) yield - yield module.addr_i.eq(0) - yield module.valid_i.eq(0) + yield module.bus_i.addr.eq(0) + yield module.bus_i.valid.eq(0) # wait for output to be valid - while not (yield module.valid_o): + while not (yield module.bus_o.valid): yield # compare returned value with expected - data = yield (module.data_o) + data = yield (module.bus_o.data) if data != expected_data: raise ValueError(f"Read from {addr} yielded {data} instead of {expected_data}") @@ -107,12 +107,12 @@ def write_register(module, addr, data): at `addr`. """ - yield module.addr_i.eq(addr) - yield module.data_i.eq(data) - yield module.rw_i.eq(1) - yield module.valid_i.eq(1) + yield module.bus_i.addr.eq(addr) + yield module.bus_i.data.eq(data) + yield module.bus_i.rw.eq(1) + yield module.bus_i.valid.eq(1) yield - yield module.valid_i.eq(0) + yield module.bus_i.valid.eq(0) yield diff --git a/test/test_logic_analyzer_sim.py b/test/test_logic_analyzer_sim.py index e69db0c..ebce934 100644 --- a/test/test_logic_analyzer_sim.py +++ b/test/test_logic_analyzer_sim.py @@ -16,19 +16,19 @@ la = LogicAnalyzerCore(config, base_addr=0, interface=None) def print_data_at_addr(addr): # place read transaction on the bus - yield la.addr_i.eq(addr) - yield la.data_i.eq(0) - yield la.rw_i.eq(0) - yield la.valid_i.eq(1) + yield la.bus_i.addr.eq(addr) + yield la.bus_i.data.eq(0) + yield la.bus_i.rw.eq(0) + yield la.bus_i.valid.eq(1) yield - yield la.addr_i.eq(0) - yield la.valid_i.eq(0) + yield la.bus_i.addr.eq(0) + yield la.bus_i.valid.eq(0) # wait for output to be valid - while not (yield la.valid_o): + while not (yield la.bus_o.valid): yield - print(f"addr: {hex(addr)} data: {hex((yield la.data_o))}") + print(f"addr: {hex(addr)} data: {hex((yield la.bus_o.data))}") def set_fsm_register(name, data): From c1c0330d86f4dea89951314dbd305cb08083763c Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 11 Jan 2024 09:33:21 -0800 Subject: [PATCH 25/89] fix bug in USB PID/VID reporting --- src/manta/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/manta/cli.py b/src/manta/cli.py index 7528cf8..961aa0d 100644 --- a/src/manta/cli.py +++ b/src/manta/cli.py @@ -66,7 +66,7 @@ def ports(): # sometimes macOS will enumerate non-serial devices as serial ports, # in which case the PID/VID/serial/location/etc are all None - pid = f"0x{port.vid:04X}" if port.pid is not None else "None" + pid = f"0x{port.pid:04X}" if port.pid is not None else "None" vid = f"0x{port.vid:04X}" if port.vid is not None else "None" print(f" -> pid: {pid}") From 4e44f7ac90bb60558bb19de4d5c9385065d0e228 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 11 Jan 2024 10:40:12 -0800 Subject: [PATCH 26/89] add version command to CLI --- src/manta/cli.py | 58 ++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 9 deletions(-) diff --git a/src/manta/cli.py b/src/manta/cli.py index 961aa0d..21d9519 100644 --- a/src/manta/cli.py +++ b/src/manta/cli.py @@ -3,22 +3,59 @@ from warnings import warn from sys import argv from pkg_resources import get_distribution -version = "v" + get_distribution("manta").version logo = f""" -Manta {version} + . + .'; + ( ( + . `. `. + `.. .' ) + ; `; .'.--. + :' `.' (' + .;' : + ______:..._____ ./' + .-" "-.( +(`-.__ .-' .. .. `-. __......') + `: `-... .-' :* : :* : `-. ...-' :' + `-. `\"""' `--' `--' `""\"' .-' + `-. . .-. .--. `. .-' + `-. : .'. ( `--_____--' ) `. ; .-' + `--..`.`.` `--... ..--' .'.'.' ..--' + `---... ````''' ...---' + `------........------' -Usage: - gen [config_file] [verilog_file] Generate a verilog file specifying the Manta module from a given configuration file, and save to the provided path - capture [config_file] [la_core_name] [vcd_file] [verilog_file] Start a capture on the specified core, and save the results to a .vcd or .v file at the provided path(s) - ports List all available serial ports - help Display this help menu + +\033[34;49;1m\033[34;49;3m Manta Version {get_distribution("manta").version} \033[00m +\033[34;49;1m\033[34;49;3m An In-Situ Debugging Tool for Programmable Hardware \033[00m +\033[34;49;1m\033[34;49;3m https://github.com/fischermoseley/manta \033[00m """ -def help(): - print(logo) +usage = """ +Usage: + gen [config_file] [verilog_file] + Generate a verilog file specifying the Manta module from a given + configuration file, and save to the provided path. + capture [config_file] [la_core_name] [vcd_file] [verilog_file] + Start a capture on the specified core, and save the results to a .vcd + or .v file at the provided path(s). + + ports + List all available serial ports. + + help + Display this help menu. + + version + Display the currently installed version.""" + + +def help(): + print(usage) + +def version(): + print(logo) def wrong_args(): print('Wrong number of arguments, run "manta help" for usage.') @@ -108,6 +145,9 @@ def main(): elif argv[1] == "ports": ports() + elif argv[1] == "version": + version() + else: wrong_args() From 2b95fea496fff563d910df54903d37951afa107c Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 13 Jan 2024 15:05:45 -0800 Subject: [PATCH 27/89] update docs, bump required python to 3.8 --- doc/alternatives.md | 61 ++++++++++++++++++++++++ doc/{how_it_works.md => architecture.md} | 46 +++++++++++++++++- doc/ethernet_interface.md | 1 - doc/getting_started.md | 2 +- doc/index.md | 16 ++++--- doc/installation.md | 50 +++++++++++-------- doc/io_core.md | 14 +----- doc/logic_analyzer_core.md | 37 ++++---------- doc/memory_core.md | 25 +--------- doc/repository_structure.md | 1 - doc/uart_interface.md | 2 +- mkdocs.yml | 9 ++-- pyproject.toml | 2 +- 13 files changed, 163 insertions(+), 103 deletions(-) create mode 100644 doc/alternatives.md rename doc/{how_it_works.md => architecture.md} (65%) diff --git a/doc/alternatives.md b/doc/alternatives.md new file mode 100644 index 0000000..e7dcd11 --- /dev/null +++ b/doc/alternatives.md @@ -0,0 +1,61 @@ +There's quite a few FPGA debugging tools out there, and it may happen that your needs are better met by another tool. This section aims to provide a list of alternatives, in hopes that you're able to be confident in your debugging flow. + +## Open Source Tools + +### LiteScope + +An embedded logic analyzer written in Migen, primarily for use in LiteX SoC designs. Also includes IO peek and poke, as well as UART, Ethernet, and PCIe interfaces with a host machine. Includes VCD, Sigrok, CSV, and Python data export. + +- [Source Code](https://github.com/enjoy-digital/litescope) +- [Documentation](https://github.com/enjoy-digital/litex/wiki/Use-LiteScope-To-Debug-A-SoC) + +### ZipCPU Debugger + +A set of embedded debugging modules written by Dan Gisselquist of ZipCPU fame. Communication between the host and FPGA is accomplished with UART, and control of the debugger is performed with a C++ API on the host. A wishbone interface is provided on the FPGA side to connect to other Wishbone-based debugging tools that can provide control of user registers, block RAM, and an embedded logic analyzer. Supports dumping of signals to a VCD file. + +- [Source Code](https://github.com/ZipCPU/dbgbus) +- [Documentation](https://zipcpu.com/topics.html), under the _How to Debug an FPGA_ section. + +## Commercial Tools + +### Xilinx Integrated Logic Analzyer + +An embedded logic analyzer for Xilinx FPGAs, provided as part of the Xilinx Vivado development suite. Communication between the host and FPGA is accomplished with JTAG, typically running over a USB cable to the device. Includes an integrated waveform viewer, and VCD and CSV export. Also supports a JTAG-to-AXI mode, which integrates well with Xilinx IP, which uses primarily AXI. Also integrates with the ChipScoPy API, which allows for Python control of the ILA on Versal devices. The ILA was previously known as ChipScope in earlier versions of Vivado. + +- [ILA Documentation](https://docs.xilinx.com/v/u/en-US/pg172-ila) +- [ILA User's Guide](https://docs.xilinx.com/r/en-US/ug936-vivado-tutorial-programming-debugging/Using-the-Vivado-Logic-Analyzer-to-Debug-Hardware) +- [ChipScoPy API](https://github.com/Xilinx/chipscopy) + + +### Xilinx Virtual IO + +A tool for reading and writing to individual registers on the FPGA, provided as part of the Xilinx Vivado development suite. Just like the ILA, communication between the host and FPGA is done over JTAG. Control over the registers is done through the Vivado GUI or through the Tcl interpreter. In the case of Versal devices, the ChipScoPy API can also control the registers. + +- [Virtual IO Documentation](https://docs.xilinx.com/v/u/en-US/pg159-vio) +- [ChipScoPy API](https://github.com/Xilinx/chipscopy) + +### Intel Signal Tap + +An embedded logic analyzer for Intel/Altera FPGAs, provided as part of the Quartus development suite. Communication between the host and FPGA is accomplished with JTAG, and a programmable interface is provided via Tcl. Signal Tap is notable for providing a significant amount of configurability in the trigger conditions, and provides a small scripting language called _Trigger Flow_ that allows users to define triggers as state machines. Signal Tap also allows for _Simulation-Aware nodes_, which allows for running simulations with data captured from the real world. At the time of writing, this feature is only available in the most recent and full-featured version of the Quartus suite, Quartus Prime Pro Edition 22.4. + +- [Documentation](https://www.intel.com/content/www/us/en/docs/programmable/683552/18-1/design-debugging-with-the-logic-analyzer-69524.html) + + +### Intel In-System Sources and Probes + +A tool for reading and writing to individual registers on the FPGA, provided for Intel/Altera FPGAs as part of the Quartus development suite. Just like Signal Tap, communication between the host and FPGA is accomplished with JTAG. + +- [Documentation](https://www.intel.com/content/www/us/en/docs/programmable/683552/18-1/design-debugging-using-in-system-sources-45607.html) + +### Lattice Reveal + +An embedded logic analyzer for Lattice FPGAs, provided as part of the Diamond development suite. Communication between the host and FPGA is accomplished with JTAG. Reveal is notable for providing a significant amount of configurability in the trigger conditions, and supports trigger conditions formed with a mix of combinational and sequential logic. Reveal also provides special support for Wishbone buses, and for controlling SERDES modules on ECP5 devices. + +- [Documentation](https://www.latticesemi.com/~/media/328D471BF2C74EB1907832FAA6FB344B.ashx) + +### Opal Kelly FrontPanel SDK + +Unlike other entries in this list, Opal Kelly's FrontPanel SDK is not marketed as a debugger (although it can be used as such). Instead, it's designed to provide a host computer with a real time interface to FGPA signals, and present them on a graphical “front panel". These front panels exist as a GUI window on the host, and contain buttons, knobs, and indicators, much like a LabVIEW virtual instrument. Communication between the host and FPGA is accomplished with either USB or PCIe. Bindings for hosts running Windows, macOS, and Linux are provided, and target C, C++, C#, Python, Java, Ruby, and MATLAB. The FrontPanel SDK differs from other debuggers in that it provides a skeleton module into which the user logic is instantiated, instead of being instantiated inside the user's logic. + +- [Documentation](https://docs.opalkelly.com/fpsdk/) +- [User's Guide](https://assets00.opalkelly.com/library/FrontPanel-UM.pdf) \ No newline at end of file diff --git a/doc/how_it_works.md b/doc/architecture.md similarity index 65% rename from doc/how_it_works.md rename to doc/architecture.md index 0311b89..be7f57b 100644 --- a/doc/how_it_works.md +++ b/doc/architecture.md @@ -2,7 +2,7 @@ The whole system looks like the following: -![](assets/architecture.drawio.svg){:style="width:80%"} +![](assets/system_architecture.drawio.svg){:style="width:80%"} Manta is operated via its Python API, which communicates with the connected FPGA over an interface API like `pySerial` or `Scapy`. These abstract away the OS device drivers, which function differently depending on the host machine's platform. The OS device drivers ultimately send out bytes to the FPGA, across either a USB or Ethernet cable. @@ -56,4 +56,46 @@ An example of some bus traffic is provided below: | 5 | FPGA → Host: RBEEF(CR)(LF) | Read 0xBEEF from 0xF00D | | 6 | Host → FPGA: W12340000(CR)(LF) | Write 0x0000 to 0x1234 | -When UART is used, these bytes are transmitted directly across the wire, but when Ethernet is used, they're packed into the packet's payload field. \ No newline at end of file +When UART is used, these bytes are transmitted directly across the wire, but when Ethernet is used, they're packed into the packet's payload field. + +# Cores + +## IO Core + +This is done with the architecture shown below: + +![](assets/io_core_architecture.drawio.svg){:style="width:49%"} + +Each of the probes is mapped to a register of Manta's internal memory. Since Manta's internal registers are 16 bits wide, probes less than 16 bits are mapped to a single register, but probes wider than 16 bits require multiple. + +Whatever the number of registers required, these are read from and written to by the host machine - but the connection to the user's logic isn't direct. The value of each probe is buffered, and only once the `strobe` register has been set to one will the buffers update. When this happens, output probes provide new values to user logic, and new values for input probes are read from user logic. This provides a convenient place to perform clock domain crossing, and also mitigates the possibility of an inconsistent system state. This is explained in more detail in Chapter 3.6 of the [original thesis](thesis.pdf). + +## Logic Analyzer +The Logic Analyzer Core's implementation on the FPGA consists of three primary components: + +![](assets/logic_analyzer_architecture.drawio.svg){style="width:85%"} + +- The _Finite State Machine (FSM)_, which controls the operation of the core. The FSM's operation is driven by its associated registers, which are placed in a separate module. This permits simple CDC between the bus and user clock domains. +- The _Trigger Block_, which generates the core's trigger condition. The trigger block contains a trigger for each input probe, and the registers necessary to configure them. It also contains the $N$-logic gate (either AND or OR) that generates the core's trigger from the individual probe triggers. CDC is performed in exactly the same manner as the FSM. If an external trigger is specified, the trigger block is omitted from the Logic Analyzer Core, and the external trigger is routed to the FSM's `trig` input. +- The _Sample Memory_, which stores the states of the probes during a capture. This is implemented as a dual-port, dual-clock block memory, with the bus on one port and the probes on the other. The probe-connected port only writes to the memory, with the address and enable pins managed by the FSM. CDC is performed in the block RAM primitive itself. + + +## Memory Core + +Each Memory core is actually a set of 16-bit wide BRAMs with their ports concatenated together, with any spare bits masked off. Here's a diagram: + +![](assets/memory_architecture.drawio.svg) + + +Since each $n$-bit wide block memory is actually $ceil(n/16)$ BRAMs under the hood, addressing the BRAMs correctly from Manta's internal bus is important. BRAMs are organized such that each 16-bit slice of a $N$-bit word in the Block Memory core are placed next to each other in bus address space. For instance, a 34-bit wide block memory would exist on Manta's internal bus as: + +| Bus Address Space | BRAM Address Space | +| ----------- | -------------------- | +| BASE_ADDR + 0 | address 0, bits 0-15 | +| BASE_ADDR + 1 | address 0, bits 16-31| +| BASE_ADDR + 2 | address 0, bits 32-33| +| BASE_ADDR + 3 | address 1, bits 0-15 | +| BASE_ADDR + 4 | address 1, bits 16-31| +| BASE_ADDR + 5 | address 1, bits 32-33| + +...and so on. diff --git a/doc/ethernet_interface.md b/doc/ethernet_interface.md index 57d0c84..416c31b 100644 --- a/doc/ethernet_interface.md +++ b/doc/ethernet_interface.md @@ -11,6 +11,5 @@ Manta's bus clock must be equivalent to the PHY's reference clock if Ethernet is This MAC allows for the usage of packets with the structure shown below. The bus transaction being communicated is placed at the beginning of the packet's payload field, which IEEE 802.3 allows to vary in length from 46 to 1500 bytes. The 46-byte lower limit requires 41 bytes of zero padding to be added to the five bytes used to specify a bus transaction, and only one bus transactions is specified in each Ethernet frame. This abundance of unused space results in all packets being the same length, whether the packet contains a read request, write request, or read response. Packets containing write requests elicit no response from the FPGA, just as write requests delivered over UART produce no response. -![](assets/ethernet_packet.png) These packets are addressed directly to the host's MAC address, which is obtained during code autogeneration. These packets also use a fixed Ethertype of `0x88B5`, which is specially reserved for "public use and for prototype and vendor-specific protocol development" in IEEE 802.1. This was done to create an Ethernet II frame instead of a legacy 802.3 frame, without having to implement a higher level protocol like TCP or UDP to safely use a fixed Ethertype. This allows the MAC to use modern Ethernet II frames safely, but save FPGA resources. \ No newline at end of file diff --git a/doc/getting_started.md b/doc/getting_started.md index 2913ef3..2de3e05 100644 --- a/doc/getting_started.md +++ b/doc/getting_started.md @@ -1,7 +1,7 @@ ## Overview -To use Manta, you'll need a host machine with a FPGA board connected over UART or Ethernet. You'll then: +To use Manta, you'll need a host machine with a FPGA board connected over UART, or a FPGA board connected to the same network via Ethernet. You'll then: - _Specify a set of debug cores you wish to include in your design._ This is done by writing a configuration file, typically called `manta.yaml`. Specifying files in JSON is also supported, as long as the hierarchy in the file is equivalent. Just make sure that your YAML files end in `.yaml` or `.yml`, and that JSON files end in `.json`. - _Invoke Manta to generate Verilog from the configuration provided._ This is done by running `manta gen [config_file] [verilog_file]` at the command line, which generates a Verilog file (typically named `manta.v`) from the provided configuration file. This Verilog file contains a definition for a Verilog module named `manta`, and all its constituent modules. diff --git a/doc/index.md b/doc/index.md index b3c88f9..41bae4d 100644 --- a/doc/index.md +++ b/doc/index.md @@ -2,7 +2,13 @@ ## Manta: An In-Situ Debugging Tool for Programmable Hardware -Manta is a tool for getting information into and out of FPGAs over UART or Ethernet. It's primarily intended for debugging and experimentation, but it's robust enough to be a simple, reliable transport layer between a FPGA and a host machine. It works by letting you configure a series of cores, which live as digital logic on the FPGA and are represented with vendor-agnostic Verilog-2001. The information and behavior of these cores are accessible to the host machine, which presents a Python API to the user. Manta includes the following cores, any number and combination of which may be used at once: +Manta is a tool for moving data between a host machine and a FPGA over UART or Ethernet. It's primarily intended for debugging and rapid prototyping of FPGA designs, but it's robust enough to be used as a simple, reliable transport layer. + +Manta works by generating a number of cores that are instantiated in the FPGA design. These allow for a variety of functions, such as reading and writing to registers and memory, or capturing data with a logic analyzer. These cores are operated by the connected host machine through either the Manta CLI, or a simple Python API. + +Manta is written in Amaranth HDL, and the generated designs may be used natively in other Amaranth designs, or exported to vendor-agnostic Verilog-2001. All dependencies are cross-platform, so Manta can be used on any machine that has at least Python 3.8 or newer installed. + +Manta's capabilities are best reflected in its cores, for which a brief description of each is provided below: ### __Logic Analyzer Core__ @@ -28,9 +34,9 @@ You may find this core useful for: * _Making dashboards_ - you'd like to get some telemetry out of your existing FPGA design and display it nicely, but you don't want to implement an interface, design a packetization scheme, and write a library. -### __Block Memory Cores__ +### __Memory Cores__ -_More details available on the [full documentation page](./block_memory_core.md)._ +_More details available on the [full documentation page](./memory_core.md)._ This core creates a two-port block memory on the FPGA, and gives one port to the host machine, and the other to your logic on the FPGA. The width and depth of this block memory is configurable, allowing large chunks of arbitrarily-sized data to be shuffled onto and off of the FPGA by the host machine, via the Python API. This lets you establish a transport layer between the host and FPGA, that treats the data as exactly how it exists on the FPGA. @@ -40,10 +46,6 @@ You may find this core useful for: * _Hand-tuning ROMs_ - you're designing a digital filter for a DSP project and would like to tune it in real-time, or you're developing a soft processor and want to upload program code without rebuilding a bitstream. - -## Dependencies -Manta is written in Python, and generates Verilog-2001 HDL. It's cross-platform, and its only strict dependency is pyYAML. However, [pySerial](https://github.com/pyserial/pyserial) is required for using UART, [scapy](https://github.com/secdev/scapy) is required for using Ethernet, and [pyvcd](https://github.com/westerndigitalcorporation/pyvcd) is required if you want to export a waveform from the Logic Analyzer core to a `.vcd` file. - ## About Manta and its source code are released under a [GPLv3 license](https://github.com/fischermoseley/manta/blob/main/LICENSE.txt), and it was originally developed as part of my [Master's Thesis at MIT](https://hdl.handle.net/1721.1/151223) in 2023, done under the supervision of [Dr. Joe Steinmeyer](https://www.jodalyst.com/). The thesis itself is copyrighted by Fischer Moseley (me!), but feel free to use the following Bibtex if you'd like to cite it: diff --git a/doc/installation.md b/doc/installation.md index 189552e..9141181 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -1,32 +1,42 @@ -## Dependencies -Manta requires the following dependencies: +Before installing, make sure to upgrade your `pip` to the latest version: -- pyYAML, which is used for parsing configuration files written in YAML. -- pySerial, used for communicating with the FPGA over UART. -- Scapy, used for communicating with FPGA over Ethernet. -- pyVCD, used for writing waveforms captured by the Logic Analyzer Core to standard Value Change Dump (VCD) files. +``` +pip install --upgrade pip +``` -All of these dependencies are technically optional. If you're comfortable writing configuration files in JSON, then you don't need pyYAML. If you're using UART exclusively in your project, then you won't need Scapy. That said, Manta will try to install (or use an existing copy of) pyYAML, pySerial, and pyVCD during its own installation to cover all use cases. - -## Installation +## Latest Version You can install the latest version of Manta directly from source with: ``` -pip install git+https://github.com/fischermoseley/manta.git +pip install --upgrade git+https://github.com/fischermoseley/manta.git ``` -!!! warning "Note for Ubuntu users:" +## Editable Development Install +If you're working on the source, you might want an editable installation with some extra dependencies used for development: - If you're on Ubuntu, you'll probably need to run this first to dodge - a bug in the current version of Python's `setuptools`: - ``` - export DEB_PYTHON_INSTALL_LAYOUT=deb_system - ``` - Do this before installing Manta. If you've already installed it, just - uninstall, run the above command, and then reinstall. +``` +git clone https://github.com/fischermoseley/manta.git +cd manta +pip install -e ".[dev]" +``` + +## Adding Manta to Path (Recommended) It's recommended to place Manta on your system path by adding `export PATH="~/.local/bin:$PATH"` to your `.bashrc` or `.zshrc`. This isn't strictly necessary, but it means that Manta (and any other executable Python modules) can be run as just `manta` on the command line, instead of `python3 -m manta`. If you're on Windows, this location will likely be different. -Feel free to install Manta within a virtual environment (venv, Conda, and so on) if you'd like! +Later Manta will be availabe on the PyPI lists, and you'll be able to just `pip install mantaray`, but that's not configured quite yet. -Later Manta will be availabe on the PyPI lists, and you'll be able to just `pip install mantaray`, but that's not configured quite yet. \ No newline at end of file +## Dependencies +Manta requires the following dependencies: + +- Amaranth HDL, which comes with it's own built-in copy of Yosys. +- pyYAML, which is used for parsing configuration files written in YAML. +- pySerial, used for communicating with the FPGA over UART. +- pyVCD, used for writing waveforms captured by the Logic Analyzer Core to standard Value Change Dump (VCD) files. + +As well as these dependencies for development, which are installed with the `[dev]` argument: + +- Pytest, for testing. +- Black, used for formatting the Python source. +- mkdocs-material, for generating the documentation site. +- amaranth_boards, for building designs for hardware-in-the-loop testing done by the CI. diff --git a/doc/io_core.md b/doc/io_core.md index ca777d1..ba86a53 100644 --- a/doc/io_core.md +++ b/doc/io_core.md @@ -78,20 +78,10 @@ True 5 ``` -## Caveats +## Limitations While the IO core performs a very, very simple task, it carries a few caveats. -- First, __it's not instantaneous__. Manta has designed to be as fast as possible, but setting and querying registers relies on passing messages between the host and FPGA, which is slow relative to FPGA clock speeds! If you're trying to set values in your design with cycle-accurate timing, this will not do that for you. However, the [Logic Analyzer's playback feature](./logic_analyzer.md#playback) might be helpful. +- First, __it's not instantaneous__. Manta has designed to be as fast as possible, but setting and querying registers relies on passing messages between the host and FPGA, which is slow relative to FPGA clock speeds! If you're trying to set values in your design with cycle-accurate timing, this will not do that for you. However, the [Logic Analyzer's playback feature](./logic_analyzer_core.md#playback) might be helpful. - Second, __the API methods are blocking__, and will wait for a response from the FPGA before resuming program execution. Depending on your application, you might want to run your IO Core operations in a seperate thread, but you can also decrease the execution time by using a faster interface between the host and FPGA. This means using a higher UART baudrate, or using Ethernet. - -## How It Works - -This is done with the architecture shown below: - -![](assets/io_core_architecture.drawio.svg){:style="width:49%"} - -Each of the probes is mapped to a register of Manta's internal memory. Since Manta's internal registers are 16 bits wide, probes less than 16 bits are mapped to a single register, but probes wider than 16 bits require multiple. - -Whatever the number of registers required, these are read from and written to by the host machine - but the connection to the user's logic isn't direct. The value of each probe is buffered, and only once the `strobe` register has been set to one will the buffers update. When this happens, output probes provide new values to user logic, and new values for input probes are read from user logic. This provides a convenient place to perform clock domain crossing, and also mitigates the possibility of an inconsistent system state. This is explained in more detail in Chapter 3.6 of the [original thesis](thesis.pdf). \ No newline at end of file diff --git a/doc/logic_analyzer_core.md b/doc/logic_analyzer_core.md index 5f245c1..bcf0a4b 100644 --- a/doc/logic_analyzer_core.md +++ b/doc/logic_analyzer_core.md @@ -101,50 +101,29 @@ manta capture [config file] [LA core] [path] [path] If the file `manta.yaml` contained the configuration above, and you wanted to export a .vcd and .mem of the captured data, you would execute: ```bash -manta capture manta.yaml my_logic_analyzer capture.vcd capture.mem +manta capture manta.yaml my_logic_analyzer capture.vcd capture.v ``` -This will reset your logic analyzer, configure it with the triggers specified in `manta.yaml`, and perform a capture. The resulting .vcd file can be opened in a waveform viewer like [GTKWave](https://gtkwave.sourceforge.net/), and the `.mem` file can be used for playback as described in the following section. - -Manta will stuff the capture data into as many files as you provide it on the command line, so if you don't want the `.mem` or `.vcd` file, just omit their paths. +This will reset your logic analyzer, configure it with the triggers specified in `manta.yaml`, and perform a capture. The resulting .vcd file can be opened in a waveform viewer like [GTKWave](https://gtkwave.sourceforge.net/). Manta will stuff the capture data into as many files as you provide it on the command line, so if you don't want the `.mem` or `.vcd` file, just omit their paths. ### Playback -The Logic Analyzer Core has the ability to capture a recording of a set of signals on the FPGA, and then 'play them back' inside a Verilog simulation. This requires generating a small Verilog module that loads a capture from a `.mem` file, which can be done by: - -``` -manta playback [config_file_path] [core_name] [verilog_file_path] -``` +Manta has the ability to generate a module that _plays back_ a set of data captured from a Logic Analyzer core. This module has a set of outputs matching the inputs of the Logic Analyzer, which when enabled, will take the exact values captured by the logic analyzer. This module is synthesizable, and can either be used in simulation or included in the FPGA design. This is handy for If the file `manta.yaml` contained the configuration above, then running: - -``` -manta playback manta.yaml my_logic_analyzer sim/playback.v +```bash +manta capture manta.yaml my_logic_analyzer capture.v ``` -Generates a Verilog wrapper at `sim/playback.v`, which can then be instantiated in the testbench in which it is needed. An example instantiation is provided at the top of the output verilog, so a simple copy-paste into the testbench is all that's necessary to use the module. This module is also fully synthesizable, so you can use it in designs that live on the FPGA too, if so you so wish. +Generates a Verilog module at `capture.v` which can then be instantiated in the testbench or FPGA design in which it is needed. An example instantiation is provided at the top of the output verilog, so a simple copy-paste into the testbench is all that's necessary to use the module. This is useful for two situations in particular: - _Input Verification._ Designs will often work in simulation, but fail in hardware. In the absence of any build errors, this usually means that the inputs being applied to the logic in simulation don't accurately represent those being applied to the logic in the real world. Playing signals back in simulation allows for easy comparison between simulated and measured input, and provides a nice way to check that the logic downstream is behaves properly. -- _Sparse Sampling_ Sometimes designs will have a small number of inputs, but a huge amount of internal state. In situations like these, it may be more effecient to sample the inputs and simulate the logic, instead of directly sampling the state. For instance, debugging a misbehaving branch predictor in a CPU can be done by recording activity on the address and data busses and playing them back in simulation - which would use less BRAM than sampling the entire pattern history table. +- _Sparse Sampling_ Sometimes designs will have a small number of inputs, but a huge amount of internal state. In situations like these, it may be more efficient to sample the inputs and simulate the logic, instead of directly sampling the state. For instance, debugging a misbehaving branch predictor in a CPU can be done by recording activity on the address and data busses and playing them back in simulation - which would use less FPGA resources than sampling the entire pattern history table. ## Python API -The Logic Analyzer core functionality is stored in the `Manta.LogicAnalyzerCore` class in [src/manta/la_core/\_\_init\_\_.py](https://github.com/fischermoseley/manta/blob/main/src/manta/la_core/__init__.py). - -At present, this class contains methods used really only for capturing data, and exporting `.vcd` and `.mem` files. It'd be super handy to expose the data from the logic analyzer core in a Pythonic way - which is why the feature is on the [roadmap](https://github.com/fischermoseley/manta/milestones)! - -## How It Works -The Logic Analyzer Core's implementation on the FPGA consists of three primary components: - -![](assets/logic_analyzer_architecture.drawio.svg){style="width:85%"} - -- The _Finite State Machine (FSM)_, which controls the operation of the core. The FSM's operation is driven by its associated registers, which are placed in a separate module. This permits simple CDC between the bus and user clock domains. -- The _Trigger Block_, which generates the core's trigger condition. The trigger block contains a trigger for each input probe, and the registers necessary to configure them. It also contains the $N$-logic gate (either AND or OR) that generates the core's trigger from the individual probe triggers. CDC is performed in exactly the same manner as the FSM. If an external trigger is specified, the trigger block is omitted from the Logic Analyzer Core, and the external trigger is routed to the FSM's `trig` input. -- The _Sample Memory_, which stores the states of the probes during a capture. This is implemented as a dual-port, dual-clock block memory, with the bus on one port and the probes on the other. The probe-connected port only writes to the memory, with the address and enable pins managed by the FSM. CDC is performed in the block RAM primitive itself. -\end{itemize} - - +The Logic Analyzer core functionality is stored in the `Manta.LogicAnalyzerCore` class in [src/manta/la_core/\_\_init\_\_.py](https://github.com/fischermoseley/manta/blob/main/src/manta/la_core/__init__.py). This class contains methods for capturing data, and exporting `.vcd` and `.v` files. diff --git a/doc/memory_core.md b/doc/memory_core.md index 2aa4749..7189648 100644 --- a/doc/memory_core.md +++ b/doc/memory_core.md @@ -64,32 +64,9 @@ foo = m.my_block_memory.read(addrs) A Block Memory core is used in the [video_sprite](https://github.com/fischermoseley/manta/blob/main/examples/nexys_a7/video_sprite) example. This uses the core to store a 128x128 image sprite in 12-bit color, and outputs it to a VGA display at 1024x768. The sprite contents can be filled with an arbitrary image using the [send_image.py](https://github.com/fischermoseley/manta/blob/main/examples/nexys_a7/video_sprite/send_image.py) python script. -## Under the Hood - -Each Block Memory core is actually a set of 16-bit wide BRAMs with their ports concatenated together, with any spare bits masked off. Here's a diagram: - -![](assets/memory_architecture.drawio.svg) - -This has one major consequence: if the core doesn't have a width that's an exact multiple of 16, synthesis engines (Vivado in particular) will throw some warnings as they optimize out the unused bits. This is expected behavior, and while the warnings are a little annoying, not having to manually deal with the unused bits simplifies the implementation immensely. No Python is needed to generate the core, and it'll configure itself just based on Verilog parameters. This turns the block memory core from a complicated conditionally-instantiated beast to a simple ~_100 line_ [Verilog file](https://github.com/fischermoseley/manta/blob/main/src/manta/block_memory.v). - -### Address Assignment - -Since each $n$-bit wide block memory is actually $ceil(n/16)$ BRAMs under the hood, addressing the BRAMs correctly from Manta's internal bus is important. BRAMs are organized such that each 16-bit slice of a $N$-bit word in the Block Memory core are placed next to each other in bus address space. For instance, a 34-bit wide block memory would exist on Manta's internal bus as: - -| Bus Address Space | BRAM Address Space | -| ----------- | -------------------- | -| BASE_ADDR + 0 | address 0, bits 0-15 | -| BASE_ADDR + 1 | address 0, bits 16-31| -| BASE_ADDR + 2 | address 0, bits 32-33| -| BASE_ADDR + 3 | address 1, bits 0-15 | -| BASE_ADDR + 4 | address 1, bits 16-31| -| BASE_ADDR + 5 | address 1, bits 32-33| - -...and so on. - ### Synchronicity -Since Manta's [data bus](../system_architecture) is only 16-bits wide, it's only possible to manipulate the BRAM core in 16-bit increments. This means that if you have a BRAM that's ≤16 bits wide, you'll only need to issue a single bus transaction to read/write one entry in the BRAM. However, if you have a BRAM that's ≥16 bits wide, you'll need to issue a bus transaction to update each 16-bit slice of it. For instance, updating a single entry in a 33-bit wide BRAM would require sending 3 messages to the FPGA: one for bits 1-16, another for bits 17-32, and one for bit 33. If your application expects each BRAM entry to update instantaneously, this could be problematic. +Since Manta's [data bus](architecture.md#data-bus) is only 16-bits wide, it's only possible to manipulate the BRAM core in 16-bit increments. This means that if you have a BRAM that's ≤16 bits wide, you'll only need to issue a single bus transaction to read/write one entry in the BRAM. However, if you have a BRAM that's ≥16 bits wide, you'll need to issue a bus transaction to update each 16-bit slice of it. For instance, updating a single entry in a 33-bit wide BRAM would require sending 3 messages to the FPGA: one for bits 1-16, another for bits 17-32, and one for bit 33. If your application expects each BRAM entry to update instantaneously, this could be problematic. There's a few different ways to solve this - you could use an IO core to signal when a BRAM's contents or valid - or you could ping-pong between two BRAMs while one is being modified. The choice is yours, and Manta makes no attempt to presribe any particular approach. diff --git a/doc/repository_structure.md b/doc/repository_structure.md index 8b9e967..9652d74 100644 --- a/doc/repository_structure.md +++ b/doc/repository_structure.md @@ -6,7 +6,6 @@ - `.github/` also contains some GitHub Actions configuration for automatically running the SystemVerilog testbenches and building the examples, in addition to automatically rebuilding the site. ## Tools Used -- [Icarus Verilog](https://github.com/steveicarus/iverilog) is used for functional simulation. - The [YosysHQ](https://github.com/YosysHQ) tools and [Vivado](https://www.xilinx.com/products/design-tools/vivado.html) are used for building bitstreams. - [Wavedrom](https://wavedrom.com/) is used for for waveform diagrams, and [draw.io](https://app.diagrams.net/) for block diagrams - [GitHub Pages](https://pages.github.com/) is used to serve the documentation site, which is built with [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/). diff --git a/doc/uart_interface.md b/doc/uart_interface.md index 0ad3ca8..847f52b 100644 --- a/doc/uart_interface.md +++ b/doc/uart_interface.md @@ -1,6 +1,6 @@ ## Overview -Manta needs an interface to pass data between the host machine and FPGA, and UART is a convenient option. When configured to use UART, Manta will shuffle data back and forth using generic 8N1 serial with no flow control. This happens through a series of read and write transactions, which are specified using a messaging format described [here](../how_it_works/#message-format). +Manta needs an interface to pass data between the host machine and FPGA, and UART is a convenient option. When configured to use UART, Manta will shuffle data back and forth using generic 8N1 serial with no flow control. This happens through a series of read and write transactions, which are specified using a messaging format described [here](architecture.md#message-format). ## Configuration diff --git a/mkdocs.yml b/mkdocs.yml index f027bdc..ca1d1d0 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -57,14 +57,15 @@ markdown_extensions: nav: - Home: index.md - Installation: installation.md - - Reference: - - Getting Started: getting_started.md + - Getting Started: getting_started.md + - Alternatives: alternatives.md + - Architecture: architecture.md + - Usage: - IO Core: io_core.md - Logic Analyzer Core: logic_analyzer_core.md - Memory Core: memory_core.md - - UART Interace: uart_interface.md + - UART Interface: uart_interface.md - Ethernet Interface: ethernet_interface.md - For Developers: - Repository Structure: repository_structure.md - - How It Works: how_it_works.md - Roadmap: https://github.com/fischermoseley/manta/milestones diff --git a/pyproject.toml b/pyproject.toml index d8ceffc..0b798de 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,7 +13,7 @@ dependencies = [ "pyvcd", ] -requires-python = ">=3.7" +requires-python = ">=3.8" [project.optional-dependencies] dev = [ From 970499d137d232090f454f6f3dac725fa5605c9f Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 13 Jan 2024 15:52:06 -0800 Subject: [PATCH 28/89] remove ANSI escape codes, they don't work in command prompt --- src/manta/cli.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/manta/cli.py b/src/manta/cli.py index 21d9519..cb79be3 100644 --- a/src/manta/cli.py +++ b/src/manta/cli.py @@ -25,9 +25,9 @@ logo = f""" `------........------' -\033[34;49;1m\033[34;49;3m Manta Version {get_distribution("manta").version} \033[00m -\033[34;49;1m\033[34;49;3m An In-Situ Debugging Tool for Programmable Hardware \033[00m -\033[34;49;1m\033[34;49;3m https://github.com/fischermoseley/manta \033[00m +Manta - An In-Situ Debugging Tool for Programmable Hardware +Version {get_distribution("manta").version} +https://github.com/fischermoseley/manta """ From 1528f569ef95864538bab9eeea8b59b68ce5df93 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 14 Jan 2024 12:51:52 -0800 Subject: [PATCH 29/89] update submodule usage, tidy logic analyzer config check --- src/manta/cli.py | 2 + src/manta/logic_analyzer/__init__.py | 159 ++++++++++++---------- src/manta/logic_analyzer/fsm.py | 5 +- src/manta/logic_analyzer/playback.py | 2 +- src/manta/logic_analyzer/trigger_block.py | 7 +- src/manta/manta.py | 2 +- src/manta/memory_core.py | 2 +- src/manta/uart/__init__.py | 8 +- test/test_io_core_hw.py | 22 +-- test/test_logic_analyzer_hw.py | 21 ++- test/test_mem_core_hw.py | 26 ++-- 11 files changed, 136 insertions(+), 120 deletions(-) diff --git a/src/manta/cli.py b/src/manta/cli.py index cb79be3..e629064 100644 --- a/src/manta/cli.py +++ b/src/manta/cli.py @@ -54,9 +54,11 @@ Usage: def help(): print(usage) + def version(): print(logo) + def wrong_args(): print('Wrong number of arguments, run "manta help" for usage.') diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index 6e38e54..ffce911 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -68,98 +68,102 @@ class LogicAnalyzerCore(Elaboratable): warn(f"Ignoring unrecognized option '{option}' in Logic Analyzer.") # Check sample depth is provided and positive - if "sample_depth" not in config: + sample_depth = config.get("sample_depth") + if not sample_depth: raise ValueError("Logic Analyzer must have sample_depth specified.") - if not isinstance(config["sample_depth"], int): - raise ValueError("Logic Analyzer sample_depth must be an integer.") - - if config["sample_depth"] <= 0: - raise ValueError("Logic Analyzer sample_depth must be positive.") + if not isinstance(sample_depth, int) or sample_depth <= 0: + raise ValueError("Logic Analyzer sample_depth must be a positive integer.") # Check probes - if "probes" not in config: - raise ValueError("Logic Analyzer must have at least one probe specified.") - - if len(config["probes"]) == 0: + if "probes" not in config or len(config["probes"]) == 0: raise ValueError("Logic Analyzer must have at least one probe specified.") for name, width in config["probes"].items(): if width < 0: raise ValueError(f"Width of probe {name} must be positive.") - # Check triggers - if "triggers" not in config: - raise ValueError("Logic Analyzer must have at least one trigger specified.") - - if len(config["triggers"]) == 0: - raise ValueError("Logic Analyzer must have at least one trigger specified.") - - # Check trigger location - if "trigger_location" in config: - if not isinstance(config["trigger_location"], int): - raise ValueError("Trigger location must be an integer.") - - if config["trigger_location"] < 0: - raise ValueError("Trigger location must be positive.") - - if config["trigger_location"] > config["sample_depth"]: - raise ValueError("Trigger location cannot exceed sample depth.") - # Check trigger mode, if provided - if "trigger_mode" in config: - valid_modes = ["single_shot", "incremental", "immediate"] - if config["trigger_mode"] not in valid_modes: + trigger_mode = config.get("trigger_mode") + valid_modes = ["single_shot", "incremental", "immediate"] + if trigger_mode and trigger_mode not in valid_modes: + raise ValueError( + f"Unrecognized trigger mode {config['trigger_mode']} provided." + ) + + # Check triggers + if (trigger_mode) and (trigger_mode != "immediate"): + if ("triggers" not in config) or (config["triggers"] == 0): raise ValueError( - f"Unrecognized trigger mode {config['trigger_mode']} provided." + "Logic Analyzer must have at least one trigger specified." ) - if config["trigger_mode"] == "incremental": - if "trigger_location" in config: - warn( - "Ignoring option 'trigger_location', as 'trigger_mode' is set to immediate, and there is no trigger condition to wait for." - ) + # Check trigger location + trigger_location = config.get("trigger_location") + if trigger_location: + if not isinstance(trigger_location, int) or trigger_location < 0: + raise ValueError("Trigger location must be a positive integer.") + + if trigger_location > config["sample_depth"]: + raise ValueError("Trigger location cannot exceed sample depth.") + + if trigger_mode == "immediate": + warn( + "Ignoring option 'trigger_location', as 'trigger_mode' is set to immediate, and there is no trigger condition to wait for." + ) # Check triggers themselves - for trigger in config["triggers"]: - if not isinstance(trigger, str): - raise ValueError("Trigger must be specified with a string.") + if trigger_mode == "immediate": + if "triggers" in config: + warn( + "Ignoring triggers as 'trigger_mode' is set to immediate, and there are no triggers to specify." + ) - # Trigger conditions may be composed of either two or three components, - # depending on the operation specified. In the case of operations that - # don't need an argument (like DISABLE, RISING, FALLING, CHANGING) or - # three statements in + else: + if ("triggers" not in config) or (len(config["triggers"]) == 0): + raise ValueError("At least one trigger must be specified.") - # Check the trigger operations - components = trigger.strip().split(" ") - if len(components) == 2: - name, op = components - if op not in ["DISABLE", "RISING", "FALLING", "CHANGING"]: + for trigger in config.get("triggers"): + if not isinstance(trigger, str): + raise ValueError("Trigger must be specified with a string.") + + # Trigger conditions may be composed of either two or three components, + # depending on the operation specified. In the case of operations that + # don't need an argument (like DISABLE, RISING, FALLING, CHANGING) or + # three statements in + + # Check the trigger operations + components = trigger.strip().split(" ") + if len(components) == 2: + name, op = components + if op not in ["DISABLE", "RISING", "FALLING", "CHANGING"]: + raise ValueError( + f"Unable to interpret trigger condition '{trigger}'." + ) + + elif len(components) == 3: + name, op, arg = components + if op not in ["GT", "LT", "GEQ", "LEQ", "EQ", "NEQ"]: + raise ValueError( + f"Unable to interpret trigger condition '{trigger}'." + ) + + else: raise ValueError( f"Unable to interpret trigger condition '{trigger}'." ) - elif len(components) == 3: - name, op, arg = components - if op not in ["GT", "LT", "GEQ", "LEQ", "EQ", "NEQ"]: - raise ValueError( - f"Unable to interpret trigger condition '{trigger}'." - ) - - else: - raise ValueError(f"Unable to interpret trigger condition '{trigger}'.") - - # Check probe names - if components[0] not in config["probes"]: - raise ValueError(f"Unknown probe name '{components[0]}' specified.") + # Check probe names + if components[0] not in config["probes"]: + raise ValueError(f"Unknown probe name '{components[0]}' specified.") def elaborate(self, platform): m = Module() # Add submodules - m.submodules["fsm"] = fsm = self.fsm - m.submodules["sample_mem"] = sample_mem = self.sample_mem - m.submodules["trig_blk"] = trig_blk = self.trig_blk + m.submodules.fsm = fsm = self.fsm + m.submodules.sample_mem = sample_mem = self.sample_mem + m.submodules.trig_blk = trig_blk = self.trig_blk # Concat all the probes together, and feed to input of sample memory # (it is necessary to reverse the order such that first probe occupies @@ -173,11 +177,10 @@ class LogicAnalyzerCore(Elaboratable): trig_blk.bus_i.eq(self.fsm.bus_o), sample_mem.bus_i.eq(trig_blk.bus_o), self.bus_o.eq(sample_mem.bus_o), - # Non-bus Connections fsm.trigger.eq(trig_blk.trig), sample_mem.user_addr.eq(fsm.r.write_pointer), - sample_mem.user_we.eq(fsm.write_enable) + sample_mem.user_we.eq(fsm.write_enable), ] return m @@ -215,6 +218,7 @@ class LogicAnalyzerCore(Elaboratable): print_if_verbose(" -> Resetting core...") state = self.fsm.r.get_probe("state") if state != self.fsm.states["IDLE"]: + self.fsm.r.set_probe("request_start", 0) self.fsm.r.set_probe("request_stop", 0) self.fsm.r.set_probe("request_stop", 1) self.fsm.r.set_probe("request_stop", 0) @@ -224,12 +228,16 @@ class LogicAnalyzerCore(Elaboratable): # Set triggers print_if_verbose(" -> Setting triggers...") - self.trig_blk.set_triggers(self.config) + self.trig_blk.clear_triggers() + + if self.config["trigger_mode"] != "immediate": + self.trig_blk.set_triggers(self.config) # Set trigger mode, default to single-shot if user didn't specify a mode print_if_verbose(" -> Setting trigger mode...") if "trigger_mode" in self.config: - self.fsm.r.set_probe("trigger_mode", self.config["trigger_mode"]) + mode = self.config["trigger_mode"].upper() + self.fsm.r.set_probe("trigger_mode", self.fsm.trigger_modes[mode]) else: self.fsm.r.set_probe("trigger_mode", self.fsm.trigger_modes["SINGLE_SHOT"]) @@ -244,6 +252,7 @@ class LogicAnalyzerCore(Elaboratable): # Send a start request to the state machine print_if_verbose(" -> Starting capture...") + self.fsm.r.set_probe("request_start", 0) self.fsm.r.set_probe("request_start", 1) self.fsm.r.set_probe("request_start", 0) @@ -362,16 +371,20 @@ class LogicAnalyzerCapture: signals.append(signal) clock = writer.register_var("manta", "clk", "wire", size=1) - trigger = writer.register_var("manta", "trigger", "wire", size=1) + + # include a trigger signal such would be meaningful (ie, we didn't trigger immediately) + if self.config["trigger_mode"] != "immediate": + trigger = writer.register_var("manta", "trigger", "wire", size=1) # add the data to each probe in the vcd file for timestamp in range(0, 2 * len(self.data)): # run the clock writer.change(clock, timestamp, timestamp % 2 == 0) - # set the trigger - triggered = (timestamp // 2) >= self.get_trigger_location() - writer.change(trigger, timestamp, triggered) + # set the trigger (if there is one) + if self.config["trigger_mode"] != "immediate": + triggered = (timestamp // 2) >= self.get_trigger_location() + writer.change(trigger, timestamp, triggered) # add other signals for signal in signals: diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index 4d8583e..d146818 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -56,7 +56,7 @@ class LogicAnalyzerFSM(Elaboratable): def elaborate(self, platform): m = Module() - m.submodules["registers"] = self.r + m.submodules.registers = self.r prev_request_start = Signal(1) prev_request_stop = Signal(1) @@ -74,6 +74,7 @@ class LogicAnalyzerFSM(Elaboratable): m.d.sync += self.write_enable.eq(1) with m.If(self.r.trigger_mode == self.trigger_modes["IMMEDIATE"]): m.d.sync += self.r.state.eq(self.states["CAPTURING"]) + m.d.sync += self.r.write_pointer.eq(self.r.write_pointer + 1) with m.Else(): with m.If(self.r.trigger_location == 0): @@ -82,7 +83,7 @@ class LogicAnalyzerFSM(Elaboratable): with m.Else(): m.d.sync += self.r.state.eq(self.states["MOVE_TO_POSITION"]) - m.d.sync += self.r.state.eq(self.states["MOVE_TO_POSITION"]) + # m.d.sync += self.r.state.eq(self.states["MOVE_TO_POSITION"]) with m.Elif(self.r.state == self.states["MOVE_TO_POSITION"]): m.d.sync += self.r.write_pointer.eq(self.r.write_pointer + 1) diff --git a/src/manta/logic_analyzer/playback.py b/src/manta/logic_analyzer/playback.py index a08db8a..50100e6 100644 --- a/src/manta/logic_analyzer/playback.py +++ b/src/manta/logic_analyzer/playback.py @@ -38,7 +38,7 @@ class LogicAnalyzerPlayback(Elaboratable): def elaborate(self, platform): m = Module() - m.submodules["mem"] = self.mem + m.submodules.mem = self.mem m.d.comb += self.read_port.en.eq(1) diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 0d0a0bd..0591e2e 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -28,12 +28,13 @@ class LogicAnalyzerTriggerBlock(Elaboratable): def get_max_addr(self): return self.r.get_max_addr() - def set_triggers(self, config): - # reset all triggers to zero + def clear_triggers(self): + # reset all triggers to disabled with no argument for p in self.probes: self.r.set_probe(p.name + "_op", 0) self.r.set_probe(p.name + "_arg", 0) + def set_triggers(self, config): # set triggers for trigger in config["triggers"]: components = trigger.strip().split(" ") @@ -53,7 +54,7 @@ class LogicAnalyzerTriggerBlock(Elaboratable): m = Module() # Add IO Core as submodule - m.submodules["registers"] = self.r + m.submodules.registers = self.r # Add triggers as submodules for t in self.triggers: diff --git a/src/manta/manta.py b/src/manta/manta.py index 63f902b..a86150a 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -126,7 +126,7 @@ class Manta(Elaboratable): m = Module() # Add interface as submodule - m.submodules["interface"] = self.interface + m.submodules.interface = self.interface # Add all cores as submodules for name, instance in self.cores.items(): diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index e74e32d..db54a36 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -61,7 +61,7 @@ class ReadOnlyMemoryCore(Elaboratable): m.d.sync += self.bus_pipe[0].eq(self.bus_i) for i in range(1, 3): - m.d.sync += self.bus_pipe[i].eq(self.bus_pipe[i-1]) + m.d.sync += self.bus_pipe[i].eq(self.bus_pipe[i - 1]) m.d.sync += self.bus_o.eq(self.bus_pipe[2]) diff --git a/src/manta/uart/__init__.py b/src/manta/uart/__init__.py index a6f5c19..7540c93 100644 --- a/src/manta/uart/__init__.py +++ b/src/manta/uart/__init__.py @@ -232,10 +232,10 @@ class UARTInterface(Elaboratable): # fancy submoduling and such goes in here m = Module() - m.submodules["uart_rx"] = uart_rx = UARTReceiver(self.clocks_per_baud) - m.submodules["bridge_rx"] = bridge_rx = ReceiveBridge() - m.submodules["bridge_tx"] = bridge_tx = TransmitBridge() - m.submodules["uart_tx"] = uart_tx = UARTTransmitter(self.clocks_per_baud) + m.submodules.uart_rx = uart_rx = UARTReceiver(self.clocks_per_baud) + m.submodules.bridge_rx = bridge_rx = ReceiveBridge() + m.submodules.bridge_tx = bridge_tx = TransmitBridge() + m.submodules.uart_tx = uart_tx = UARTTransmitter(self.clocks_per_baud) m.d.comb += [ # UART RX -> Internal Bus diff --git a/test/test_io_core_hw.py b/test/test_io_core_hw.py index c463aa6..1e6f31c 100644 --- a/test/test_io_core_hw.py +++ b/test/test_io_core_hw.py @@ -13,7 +13,7 @@ class IOCoreLoopbackTest(Elaboratable): self.port = port self.config = self.platform_specific_config() - self.m = Manta(self.config) + self.manta = Manta(self.config) def platform_specific_config(self): return { @@ -41,17 +41,17 @@ class IOCoreLoopbackTest(Elaboratable): def elaborate(self, platform): m = Module() - m.submodules["manta"] = self.m + m.submodules.manta = self.manta uart_pins = platform.request("uart") m.d.comb += [ - self.m.io_core.probe0.eq(self.m.io_core.probe4), - self.m.io_core.probe1.eq(self.m.io_core.probe5), - self.m.io_core.probe2.eq(self.m.io_core.probe6), - self.m.io_core.probe3.eq(self.m.io_core.probe7), - self.m.interface.rx.eq(uart_pins.rx.i), - uart_pins.tx.o.eq(self.m.interface.tx), + self.manta.io_core.probe0.eq(self.manta.io_core.probe4), + self.manta.io_core.probe1.eq(self.manta.io_core.probe5), + self.manta.io_core.probe2.eq(self.manta.io_core.probe6), + self.manta.io_core.probe3.eq(self.manta.io_core.probe7), + self.manta.interface.rx.eq(uart_pins.rx.i), + uart_pins.tx.o.eq(self.manta.interface.tx), ] return m @@ -71,7 +71,7 @@ class IOCoreLoopbackTest(Elaboratable): outputs = self.config["cores"]["io_core"]["outputs"] for name, attrs in outputs.items(): - actual = self.m.io_core.get_probe(name) + actual = self.manta.io_core.get_probe(name) if isinstance(attrs, dict): if "initial_value" in attrs: @@ -100,8 +100,8 @@ class IOCoreLoopbackTest(Elaboratable): width = self.config["cores"]["io_core"]["inputs"][input] value = randint(0, 2**width - 1) - self.m.io_core.set_probe(output, value) - readback = self.m.io_core.get_probe(input) + self.manta.io_core.set_probe(output, value) + readback = self.manta.io_core.get_probe(input) if readback != value: raise ValueError( diff --git a/test/test_logic_analyzer_hw.py b/test/test_logic_analyzer_hw.py index 5bfd0ca..12e8c41 100644 --- a/test/test_logic_analyzer_hw.py +++ b/test/test_logic_analyzer_hw.py @@ -12,7 +12,7 @@ class LogicAnalyzerCounterTest(Elaboratable): self.port = port self.config = self.platform_specific_config() - self.m = Manta(self.config) + self.manta = Manta(self.config) def platform_specific_config(self): return { @@ -20,9 +20,8 @@ class LogicAnalyzerCounterTest(Elaboratable): "la": { "type": "logic_analyzer", "sample_depth": 1024, - "trigger_location": 500, + "trigger_mode": "immediate", "probes": {"larry": 1, "curly": 3, "moe": 9}, - "triggers": ["moe RISING"], }, }, "uart": { @@ -34,20 +33,20 @@ class LogicAnalyzerCounterTest(Elaboratable): def elaborate(self, platform): m = Module() - m.submodules["manta"] = self.m + m.submodules.manta = self.manta uart_pins = platform.request("uart") - larry = self.m.la.probes[0] - curly = self.m.la.probes[1] - moe = self.m.la.probes[2] + larry = self.manta.la.probes[0] + curly = self.manta.la.probes[1] + moe = self.manta.la.probes[2] m.d.sync += larry.eq(larry + 1) m.d.sync += curly.eq(curly + 1) m.d.sync += moe.eq(moe + 1) m.d.comb += [ - self.m.interface.rx.eq(uart_pins.rx.i), - uart_pins.tx.o.eq(self.m.interface.tx), + self.manta.interface.rx.eq(uart_pins.rx.i), + uart_pins.tx.o.eq(self.manta.interface.tx), ] return m @@ -57,7 +56,7 @@ class LogicAnalyzerCounterTest(Elaboratable): def verify(self): self.build_and_program() - cap = self.m.la.capture() + cap = self.manta.la.capture() # check that VCD export works cap.export_vcd("out.vcd") @@ -66,7 +65,7 @@ class LogicAnalyzerCounterTest(Elaboratable): cap.export_playback_verilog("out.v") # verify that each signal is just a counter modulo the width of the signal - for name, width in self.m.la.config["probes"].items(): + for name, width in self.manta.la.config["probes"].items(): trace = cap.get_trace(name) for i in range(len(trace) - 1): diff --git a/test/test_mem_core_hw.py b/test/test_mem_core_hw.py index 8c7af24..e9c0710 100644 --- a/test/test_mem_core_hw.py +++ b/test/test_mem_core_hw.py @@ -22,7 +22,7 @@ class MemoryCoreLoopbackTest(Elaboratable): self.port = port self.config = self.platform_specific_config() - self.m = Manta(self.config) + self.manta = Manta(self.config) def platform_specific_config(self): return { @@ -50,16 +50,16 @@ class MemoryCoreLoopbackTest(Elaboratable): def elaborate(self, platform): m = Module() - m.submodules["manta"] = self.m + m.submodules.manta = self.manta uart_pins = platform.request("uart") m.d.comb += [ - self.m.mem_core.user_addr.eq(self.m.io_core.addr), - self.m.mem_core.user_data.eq(self.m.io_core.data), - self.m.mem_core.user_we.eq(self.m.io_core.we), - self.m.interface.rx.eq(uart_pins.rx.i), - uart_pins.tx.o.eq(self.m.interface.tx), + self.manta.mem_core.user_addr.eq(self.manta.io_core.addr), + self.manta.mem_core.user_data.eq(self.manta.io_core.data), + self.manta.mem_core.user_we.eq(self.manta.io_core.we), + self.manta.interface.rx.eq(uart_pins.rx.i), + uart_pins.tx.o.eq(self.manta.interface.tx), ] return m @@ -68,14 +68,14 @@ class MemoryCoreLoopbackTest(Elaboratable): self.platform.build(self, do_program=True) def write_user_side(self, addr, data): - self.m.io_core.set_probe("we", 0) - self.m.io_core.set_probe("addr", addr) - self.m.io_core.set_probe("data", data) - self.m.io_core.set_probe("we", 1) - self.m.io_core.set_probe("we", 0) + self.manta.io_core.set_probe("we", 0) + self.manta.io_core.set_probe("addr", addr) + self.manta.io_core.set_probe("data", data) + self.manta.io_core.set_probe("we", 1) + self.manta.io_core.set_probe("we", 0) def verify_register(self, addr, expected_data): - data = self.m.mem_core.read_from_user_addr(addr) + data = self.manta.mem_core.read_from_user_addr(addr) if data != expected_data: raise ValueError( From edd00310c4e357c4f2d0eb16fd0bbe052e37fb1d Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 14 Jan 2024 14:49:02 -0800 Subject: [PATCH 30/89] first pass at logic analyzer trigger block tests --- src/manta/logic_analyzer/__init__.py | 6 +- src/manta/logic_analyzer/trigger_block.py | 4 +- test/logic_analyzer_trig_blk_sim.py | 181 ++++++++++++++++++++++ 3 files changed, 186 insertions(+), 5 deletions(-) create mode 100644 test/logic_analyzer_trig_blk_sim.py diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index ffce911..bfbf295 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -92,10 +92,10 @@ class LogicAnalyzerCore(Elaboratable): ) # Check triggers - if (trigger_mode) and (trigger_mode != "immediate"): - if ("triggers" not in config) or (config["triggers"] == 0): + if trigger_mode and trigger_mode != "immediate": + if "triggers" not in config or config["triggers"] == 0: raise ValueError( - "Logic Analyzer must have at least one trigger specified." + "Logic Analyzer must have at least one trigger specified if not running in immediate mode." ) # Check trigger location diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 0591e2e..7dca023 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -101,10 +101,10 @@ class LogicAnalyzerTrigger(Elaboratable): m.d.comb += self.triggered.eq(0) with m.Elif(self.op == self.operations["RISING"]): - m.d.comb += self.triggered.eq((self.signal) & (~prev)) + m.d.comb += self.triggered.eq(self.signal > prev) with m.Elif(self.op == self.operations["FALLING"]): - m.d.comb += self.triggered.eq((~self.signal) & (prev)) + m.d.comb += self.triggered.eq(self.signal < prev) with m.Elif(self.op == self.operations["CHANGING"]): m.d.comb += self.triggered.eq(self.signal != prev) diff --git a/test/logic_analyzer_trig_blk_sim.py b/test/logic_analyzer_trig_blk_sim.py new file mode 100644 index 0000000..910bfa6 --- /dev/null +++ b/test/logic_analyzer_trig_blk_sim.py @@ -0,0 +1,181 @@ +from amaranth import * +from amaranth.sim import Simulator +from manta.logic_analyzer import LogicAnalyzerTriggerBlock +from manta.utils import * +from random import randint, sample + + +# Make random number of random width probes +probes = [Signal(randint(1, 32), name=str(i)) for i in range(randint(1, 32))] +trig_blk = LogicAnalyzerTriggerBlock(probes, base_addr=0, interface=None) + + +def write_trig_blk_register(name, value): + strobe_addr = trig_blk.r.base_addr + yield from write_register(trig_blk, strobe_addr, 0) + + addrs = trig_blk.r.mmap[f"{name}_buf"]["addrs"] + datas = value_to_words(value, len(addrs)) + for addr, data in zip(addrs, datas): + yield from write_register(trig_blk, addr, data) + + yield from write_register(trig_blk, strobe_addr, 1) + yield from write_register(trig_blk, strobe_addr, 0) + + +def test(): + def testbench(): + # Step through each probe and perform all functions in random order + for p in trig_blk.probes: + ops = trig_blk.triggers[0].operations + for op in sample(list(ops.keys()), len(ops)): + # Program operation register with selected register + yield from write_trig_blk_register(f"{p.name}_op", ops[op]) + + if op == "DISABLE": + # Argument can be anything, since it's not used for this operation + yield from write_trig_blk_register( + f"{p.name}_arg", randint(0, (2**p.width) - 1) + ) + yield p.eq(randint(0, (2**p.width) - 1)) + yield + + if (yield trig_blk.trig): + raise ValueError("Trigger raised when disabled!") + + if op == "RISING": + # Argument can be anything, since it's not used for this operation + yield from write_trig_blk_register( + f"{p.name}_arg", randint(0, (2**p.width) - 1) + ) + yield p.eq(0) + yield + yield p.eq(randint(1, (2**p.width) - 1)) + yield + + if not (yield trig_blk.trig): + raise ValueError(f"Trigger not raised on probe {p.name}!") + + if op == "FALLING": + # Argument can be anything, since it's not used for this operation + yield from write_trig_blk_register( + f"{p.name}_arg", randint(0, (2**p.width) - 1) + ) + yield p.eq(randint(1, (2**p.width) - 1)) + yield + yield p.eq(0) + yield + + if not (yield trig_blk.trig): + raise ValueError(f"Trigger not raised on probe {p.name}!") + pass + + if op == "CHANGING": + # Argument can be anything, since it's not used for this operation + yield from write_trig_blk_register( + f"{p.name}_arg", randint(0, (2**p.width) - 1) + ) + yield p.eq(randint(1, (2**p.width) - 1)) + yield + + if not (yield trig_blk.trig): + raise ValueError(f"Trigger not raised on probe {p.name}!") + pass + + if op == "GT": + upper = randint(1, (2**p.width) - 1) + lower = randint(0, upper - 1) + + yield from write_trig_blk_register(f"{p.name}_arg", lower) + yield p.eq(upper) + yield + + if not (yield trig_blk.trig): + raise ValueError(f"Trigger not raised on probe {p.name}!") + pass + + if op == "LT": + upper = randint(1, (2**p.width) - 1) + lower = randint(0, upper - 1) + + yield from write_trig_blk_register(f"{p.name}_arg", upper) + yield p.eq(lower) + yield + + if not (yield trig_blk.trig): + raise ValueError(f"Trigger not raised on probe {p.name}!") + pass + + if op == "GEQ": + upper = randint(1, (2**p.width) - 1) + lower = randint(0, upper - 1) + + # test that the case where it's equal + yield from write_trig_blk_register(f"{p.name}_arg", lower) + yield p.eq(lower) + yield + + if not (yield trig_blk.trig): + raise ValueError(f"Trigger not raised on probe {p.name}!") + pass + + # test the case where it's greater than + yield p.eq(upper) + yield + + if not (yield trig_blk.trig): + raise ValueError(f"Trigger not raised on probe {p.name}!") + pass + + if op == "LEQ": + upper = randint(1, (2**p.width) - 1) + lower = randint(0, upper - 1) + + # test that the case where it's equal + yield from write_trig_blk_register(f"{p.name}_arg", upper) + yield p.eq(upper) + yield + + if not (yield trig_blk.trig): + raise ValueError(f"Trigger not raised on probe {p.name}!") + pass + + # test the case where it's less than + yield p.eq(lower) + yield + + if not (yield trig_blk.trig): + raise ValueError(f"Trigger not raised on probe {p.name}!") + pass + + if op == "EQ": + value = randint(0, (2**p.width) - 1) + yield from write_trig_blk_register(f"{p.name}_arg", value) + yield p.eq(value) + yield + + if not (yield trig_blk.trig): + raise ValueError(f"Trigger not raised on probe {p.name}!") + pass + + if op == "NEQ": + upper = randint(1, (2**p.width) - 1) + lower = randint(0, upper - 1) + + # test that the case where it's equal + yield from write_trig_blk_register(f"{p.name}_arg", upper) + yield p.eq(lower) + yield + + if not (yield trig_blk.trig): + raise ValueError(f"Trigger not raised on probe {p.name}!") + pass + + + # disable probe once complete + yield + yield from write_trig_blk_register(f"{p.name}_op", ops["DISABLE"]) + yield from write_trig_blk_register(f"{p.name}_arg", 0) + yield p.eq(0) + + simulate(trig_blk, testbench, "out.vcd") From a8b43849ecb4d50fcf7873761ef6bae019adbc3c Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Mon, 15 Jan 2024 12:33:59 -0800 Subject: [PATCH 31/89] remove trig_blk test - was not adding value --- test/logic_analyzer_trig_blk_sim.py | 181 ---------------------------- 1 file changed, 181 deletions(-) delete mode 100644 test/logic_analyzer_trig_blk_sim.py diff --git a/test/logic_analyzer_trig_blk_sim.py b/test/logic_analyzer_trig_blk_sim.py deleted file mode 100644 index 910bfa6..0000000 --- a/test/logic_analyzer_trig_blk_sim.py +++ /dev/null @@ -1,181 +0,0 @@ -from amaranth import * -from amaranth.sim import Simulator -from manta.logic_analyzer import LogicAnalyzerTriggerBlock -from manta.utils import * -from random import randint, sample - - -# Make random number of random width probes -probes = [Signal(randint(1, 32), name=str(i)) for i in range(randint(1, 32))] -trig_blk = LogicAnalyzerTriggerBlock(probes, base_addr=0, interface=None) - - -def write_trig_blk_register(name, value): - strobe_addr = trig_blk.r.base_addr - yield from write_register(trig_blk, strobe_addr, 0) - - addrs = trig_blk.r.mmap[f"{name}_buf"]["addrs"] - datas = value_to_words(value, len(addrs)) - for addr, data in zip(addrs, datas): - yield from write_register(trig_blk, addr, data) - - yield from write_register(trig_blk, strobe_addr, 1) - yield from write_register(trig_blk, strobe_addr, 0) - - -def test(): - def testbench(): - # Step through each probe and perform all functions in random order - for p in trig_blk.probes: - ops = trig_blk.triggers[0].operations - for op in sample(list(ops.keys()), len(ops)): - # Program operation register with selected register - yield from write_trig_blk_register(f"{p.name}_op", ops[op]) - - if op == "DISABLE": - # Argument can be anything, since it's not used for this operation - yield from write_trig_blk_register( - f"{p.name}_arg", randint(0, (2**p.width) - 1) - ) - yield p.eq(randint(0, (2**p.width) - 1)) - yield - - if (yield trig_blk.trig): - raise ValueError("Trigger raised when disabled!") - - if op == "RISING": - # Argument can be anything, since it's not used for this operation - yield from write_trig_blk_register( - f"{p.name}_arg", randint(0, (2**p.width) - 1) - ) - yield p.eq(0) - yield - yield p.eq(randint(1, (2**p.width) - 1)) - yield - - if not (yield trig_blk.trig): - raise ValueError(f"Trigger not raised on probe {p.name}!") - - if op == "FALLING": - # Argument can be anything, since it's not used for this operation - yield from write_trig_blk_register( - f"{p.name}_arg", randint(0, (2**p.width) - 1) - ) - yield p.eq(randint(1, (2**p.width) - 1)) - yield - yield p.eq(0) - yield - - if not (yield trig_blk.trig): - raise ValueError(f"Trigger not raised on probe {p.name}!") - pass - - if op == "CHANGING": - # Argument can be anything, since it's not used for this operation - yield from write_trig_blk_register( - f"{p.name}_arg", randint(0, (2**p.width) - 1) - ) - yield p.eq(randint(1, (2**p.width) - 1)) - yield - - if not (yield trig_blk.trig): - raise ValueError(f"Trigger not raised on probe {p.name}!") - pass - - if op == "GT": - upper = randint(1, (2**p.width) - 1) - lower = randint(0, upper - 1) - - yield from write_trig_blk_register(f"{p.name}_arg", lower) - yield p.eq(upper) - yield - - if not (yield trig_blk.trig): - raise ValueError(f"Trigger not raised on probe {p.name}!") - pass - - if op == "LT": - upper = randint(1, (2**p.width) - 1) - lower = randint(0, upper - 1) - - yield from write_trig_blk_register(f"{p.name}_arg", upper) - yield p.eq(lower) - yield - - if not (yield trig_blk.trig): - raise ValueError(f"Trigger not raised on probe {p.name}!") - pass - - if op == "GEQ": - upper = randint(1, (2**p.width) - 1) - lower = randint(0, upper - 1) - - # test that the case where it's equal - yield from write_trig_blk_register(f"{p.name}_arg", lower) - yield p.eq(lower) - yield - - if not (yield trig_blk.trig): - raise ValueError(f"Trigger not raised on probe {p.name}!") - pass - - # test the case where it's greater than - yield p.eq(upper) - yield - - if not (yield trig_blk.trig): - raise ValueError(f"Trigger not raised on probe {p.name}!") - pass - - if op == "LEQ": - upper = randint(1, (2**p.width) - 1) - lower = randint(0, upper - 1) - - # test that the case where it's equal - yield from write_trig_blk_register(f"{p.name}_arg", upper) - yield p.eq(upper) - yield - - if not (yield trig_blk.trig): - raise ValueError(f"Trigger not raised on probe {p.name}!") - pass - - # test the case where it's less than - yield p.eq(lower) - yield - - if not (yield trig_blk.trig): - raise ValueError(f"Trigger not raised on probe {p.name}!") - pass - - if op == "EQ": - value = randint(0, (2**p.width) - 1) - yield from write_trig_blk_register(f"{p.name}_arg", value) - yield p.eq(value) - yield - - if not (yield trig_blk.trig): - raise ValueError(f"Trigger not raised on probe {p.name}!") - pass - - if op == "NEQ": - upper = randint(1, (2**p.width) - 1) - lower = randint(0, upper - 1) - - # test that the case where it's equal - yield from write_trig_blk_register(f"{p.name}_arg", upper) - yield p.eq(lower) - yield - - if not (yield trig_blk.trig): - raise ValueError(f"Trigger not raised on probe {p.name}!") - pass - - - # disable probe once complete - yield - yield from write_trig_blk_register(f"{p.name}_op", ops["DISABLE"]) - yield from write_trig_blk_register(f"{p.name}_arg", 0) - yield p.eq(0) - - simulate(trig_blk, testbench, "out.vcd") From 6e3fe8cb0e34ef88f64d9a619805d2567532dda8 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 20 Jan 2024 15:25:04 -0800 Subject: [PATCH 32/89] add initial FSM tests --- src/manta/logic_analyzer/fsm.py | 174 ++++++++++++++++++++++------ test/test_logic_analyzer_fsm_sim.py | 73 ++++++++++++ 2 files changed, 209 insertions(+), 38 deletions(-) create mode 100644 test/test_logic_analyzer_fsm_sim.py diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index d146818..7dcbceb 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -58,62 +58,160 @@ class LogicAnalyzerFSM(Elaboratable): m.submodules.registers = self.r + sample_depth = self.config["sample_depth"] + request_start = self.r.request_start + request_stop = self.r.request_stop + trigger_mode = self.r.trigger_mode + trigger_location = self.r.trigger_location + state = self.r.state + write_enable = self.write_enable + write_pointer = self.r.write_pointer + read_pointer = self.r.read_pointer + prev_request_start = Signal(1) prev_request_stop = Signal(1) - # Rising edge detection for start/stop requests - m.d.sync += prev_request_start.eq(self.r.request_start) - m.d.sync += prev_request_stop.eq(self.r.request_stop) + next_state = Signal().like(state) + next_read_pointer = Signal().like(read_pointer) + latch_read_pointer = Signal().like(read_pointer) + next_write_pointer = Signal().like(write_pointer) - with m.If(self.r.state == self.states["IDLE"]): - m.d.sync += self.r.write_pointer.eq(0) - m.d.sync += self.r.read_pointer.eq(0) - m.d.sync += self.write_enable.eq(0) + # COMBINATIONAL SHIT + with m.If(trigger_mode == self.trigger_modes["SINGLE_SHOT"]): + with m.If(state == self.states["IDLE"]): + m.d.comb += write_enable.eq(0) + m.d.comb += write_pointer.eq(0) + m.d.comb += read_pointer.eq(0) + m.d.comb += next_state.eq(self.states["IDLE"]) - with m.If((self.r.request_start) & (~prev_request_start)): - m.d.sync += self.write_enable.eq(1) - with m.If(self.r.trigger_mode == self.trigger_modes["IMMEDIATE"]): - m.d.sync += self.r.state.eq(self.states["CAPTURING"]) - m.d.sync += self.r.write_pointer.eq(self.r.write_pointer + 1) + # Rising edge of request_start beings the capture: + with m.If((request_start) & (~prev_request_start)): + m.d.comb += write_enable.eq(1) + # Go straight to IN_POSITION if trigger_location == 0 + with m.If(trigger_location == 0): + m.d.comb += next_state.eq(self.states["IN_POSITION"]) - with m.Else(): - with m.If(self.r.trigger_location == 0): - m.d.sync += self.r.state.eq(self.states["IN_POSITION"]) + # Otherwise go to MOVE_TO_POSITION + with m.Else(): + m.d.comb += next_state.eq(self.states["MOVE_TO_POSITION"]) + + with m.Elif(state == self.states["MOVE_TO_POSITION"]): + m.d.comb += write_enable.eq(1) + m.d.comb += write_pointer.eq(next_write_pointer) + m.d.comb += read_pointer.eq(0) + m.d.comb += next_state.eq(self.states["MOVE_TO_POSITION"]) + + with m.If(write_pointer == trigger_location - 1): + with m.If(self.trigger): + m.d.comb += next_state.eq(self.states["CAPTURING"]) with m.Else(): - m.d.sync += self.r.state.eq(self.states["MOVE_TO_POSITION"]) + m.d.comb += next_state.eq(self.states["IN_POSITION"]) - # m.d.sync += self.r.state.eq(self.states["MOVE_TO_POSITION"]) + with m.Elif(state == self.states["IN_POSITION"]): + m.d.comb += write_enable.eq(1) + m.d.comb += write_pointer.eq(next_write_pointer) + m.d.comb += next_state.eq(self.states["IN_POSITION"]) - with m.Elif(self.r.state == self.states["MOVE_TO_POSITION"]): - m.d.sync += self.r.write_pointer.eq(self.r.write_pointer + 1) - - with m.If(self.r.write_pointer == self.r.trigger_location): with m.If(self.trigger): - m.d.sync += self.r.state.eq(self.states["CAPTURING"]) + m.d.comb += next_state.eq(self.states["CAPTURING"]) + m.d.comb += read_pointer.eq(latch_read_pointer) with m.Else(): - m.d.sync += self.r.state.eq(self.states["IN_POSITION"]) - self.increment_mod_sample_depth(m, self.r.read_pointer) + m.d.comb += read_pointer.eq(next_read_pointer) - with m.Elif(self.r.state == self.states["IN_POSITION"]): - self.increment_mod_sample_depth(m, self.r.write_pointer) + with m.Elif(state == self.states["CAPTURING"]): + m.d.comb += write_enable.eq(1) + m.d.comb += read_pointer.eq(latch_read_pointer) + m.d.comb += next_state.eq(self.states["CAPTURING"]) - with m.If(self.trigger): - m.d.sync += self.r.state.eq(self.states["CAPTURING"]) + with m.If(next_write_pointer == read_pointer): + m.d.comb += write_enable.eq(0) + m.d.comb += next_state.eq(self.states["CAPTURED"]) - with m.Else(): - self.increment_mod_sample_depth(m, self.r.read_pointer) + with m.Else(): + m.d.comb += write_pointer.eq(next_write_pointer) - with m.Elif(self.r.state == self.states["CAPTURING"]): - with m.If(self.r.write_pointer == self.r.read_pointer): - m.d.sync += self.write_enable.eq(0) - m.d.sync += self.r.state.eq(self.states["CAPTURED"]) + with m.Elif(state == self.states["CAPTURED"]): + m.d.comb += next_state.eq(self.states["CAPTURED"]) + m.d.comb += read_pointer.eq(latch_read_pointer) + m.d.comb += write_enable.eq(0) + # m.d.comb += read_pointer.eq(read_pointer) + # m.d.comb += write_pointer.eq(write_pointer) - with m.Else(): - self.increment_mod_sample_depth(m, self.r.write_pointer) + with m.If(self.r.trigger_mode == self.trigger_modes["IMMEDIATE"]): + pass - with m.If((self.r.request_stop) & (~prev_request_stop)): - m.d.sync += self.r.state.eq(self.states["IDLE"]) + with m.If(self.r.trigger_mode == self.trigger_modes["INCREMENTAL"]): + pass + + # Regardless of trigger mode, go back to IDLE if request_stop is pulsed + with m.If((request_stop) & (~prev_request_stop)): + m.d.comb += next_state.eq(self.states["IDLE"]) + + # SEQUENTIAL SHIT + + # Rising edge detection for start/stop requests + m.d.sync += prev_request_start.eq(request_start) + m.d.sync += prev_request_stop.eq(request_stop) + + # Copy next into current + m.d.sync += state.eq(next_state) + m.d.sync += next_write_pointer.eq((write_pointer + 1) % sample_depth) + m.d.sync += next_read_pointer.eq((read_pointer + 1) % sample_depth) + m.d.sync += latch_read_pointer.eq(read_pointer) return m + + #### OLD STUFF FOR REFERENCE #### + + # with m.If(self.r.state == self.states["IDLE"]): + # m.d.sync += self.r.write_pointer.eq(0) + # m.d.sync += self.r.read_pointer.eq(0) + # m.d.sync += self.write_enable.eq(0) + + # with m.If((self.r.request_start) & (~prev_request_start)): + # m.d.sync += self.write_enable.eq(1) + # with m.If(self.r.trigger_mode == self.trigger_modes["IMMEDIATE"]): + # m.d.sync += self.r.state.eq(self.states["CAPTURING"]) + # m.d.sync += self.r.write_pointer.eq(self.r.write_pointer + 1) + + # with m.Else(): + # with m.If(self.r.trigger_location == 0): + # m.d.sync += self.r.state.eq(self.states["IN_POSITION"]) + + # with m.Else(): + # m.d.sync += self.r.state.eq(self.states["MOVE_TO_POSITION"]) + + # # m.d.sync += self.r.state.eq(self.states["MOVE_TO_POSITION"]) + + # with m.Elif(self.r.state == self.states["MOVE_TO_POSITION"]): + # m.d.sync += self.r.write_pointer.eq(self.r.write_pointer + 1) + + # with m.If(self.r.write_pointer == self.r.trigger_location): + # with m.If(self.trigger): + # m.d.sync += self.r.state.eq(self.states["CAPTURING"]) + + # with m.Else(): + # m.d.sync += self.r.state.eq(self.states["IN_POSITION"]) + # self.increment_mod_sample_depth(m, self.r.read_pointer) + + # with m.Elif(self.r.state == self.states["IN_POSITION"]): + # self.increment_mod_sample_depth(m, self.r.write_pointer) + + # with m.If(self.trigger): + # m.d.sync += self.r.state.eq(self.states["CAPTURING"]) + + # with m.Else(): + # self.increment_mod_sample_depth(m, self.r.read_pointer) + + # with m.Elif(self.r.state == self.states["CAPTURING"]): + # with m.If(self.r.write_pointer == self.r.read_pointer): + # m.d.sync += self.write_enable.eq(0) + # m.d.sync += self.r.state.eq(self.states["CAPTURED"]) + + # with m.Else(): + # self.increment_mod_sample_depth(m, self.r.write_pointer) + + # with m.If((self.r.request_stop) & (~prev_request_stop)): + # m.d.sync += self.r.state.eq(self.states["IDLE"]) diff --git a/test/test_logic_analyzer_fsm_sim.py b/test/test_logic_analyzer_fsm_sim.py new file mode 100644 index 0000000..2bd7f8d --- /dev/null +++ b/test/test_logic_analyzer_fsm_sim.py @@ -0,0 +1,73 @@ +from amaranth.sim import Simulator +from manta.logic_analyzer import LogicAnalyzerFSM +from manta.utils import * + +""" +what do we want this to do? + +we want to run a capture in single shot mode, immediate mode, and incremental mode + + +single-shot case: +- exactly the right number of samples are taken +- we only start taking samples once captured + +immediate case: +- exactly the right number of samples are taken +- we only start taking samples once captured + +incremental case: +- exactly the right number of samples are taken +- we only take samples when trig is asserted + +""" +config = {"sample_depth": 8} +fsm = LogicAnalyzerFSM(config, base_addr=0, interface=None) + + +def set_fsm_register(name, data): + addr = fsm.r.mmap[f"{name}_buf"]["addrs"][0] + strobe_addr = fsm.r.base_addr + + yield from write_register(fsm, strobe_addr, 0) + yield from write_register(fsm, addr, data) + yield from write_register(fsm, strobe_addr, 1) + yield from write_register(fsm, strobe_addr, 0) + + +def test_single_shot_always_trigger(): + def testbench(): + if (yield fsm.r.state != fsm.states["IDLE"]): + raise ValueError + + yield fsm.trigger.eq(1) + yield from set_fsm_register("trigger_mode", fsm.trigger_modes["SINGLE_SHOT"]) + yield from set_fsm_register("trigger_location", 4) + yield from set_fsm_register("request_start", 1) + yield from set_fsm_register("request_start", 0) + + for _ in range(100): + yield + + simulate(fsm, testbench, "single_shot_always_trigger.vcd") + + +def test_single_shot_wait_to_trigger(): + def testbench(): + if (yield fsm.r.state != fsm.states["IDLE"]): + raise ValueError + + yield from set_fsm_register("trigger_mode", fsm.trigger_modes["SINGLE_SHOT"]) + yield from set_fsm_register("trigger_location", 4) + yield from set_fsm_register("request_start", 1) + yield from set_fsm_register("request_start", 0) + + for _ in range(8): + yield + + yield fsm.trigger.eq(1) + + for _ in range(100): + yield + + simulate(fsm, testbench, "single_shot_wait_to_trigger.vcd") From ab0909d06bbf2efce6a5629b3037c1ecd5630fa5 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 20 Jan 2024 21:59:42 -0800 Subject: [PATCH 33/89] refactor logic analyzer to use enums, add incremental + immediate trigger modes --- src/manta/logic_analyzer/__init__.py | 12 +- src/manta/logic_analyzer/fsm.py | 288 ++++++++++++++------------- test/test_logic_analyzer_fsm_sim.py | 263 +++++++++++++++++++++--- 3 files changed, 389 insertions(+), 174 deletions(-) diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index bfbf295..e78f634 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -2,7 +2,7 @@ from amaranth import * from warnings import warn from ..utils import * from .trigger_block import LogicAnalyzerTriggerBlock -from .fsm import LogicAnalyzerFSM +from .fsm import LogicAnalyzerFSM, States, TriggerModes from .sample_mem import LogicAnalyzerSampleMemory from .playback import LogicAnalyzerPlayback @@ -217,13 +217,13 @@ class LogicAnalyzerCore(Elaboratable): # If core is not in IDLE state, request that it return to IDLE print_if_verbose(" -> Resetting core...") state = self.fsm.r.get_probe("state") - if state != self.fsm.states["IDLE"]: + if state != States.IDLE: self.fsm.r.set_probe("request_start", 0) self.fsm.r.set_probe("request_stop", 0) self.fsm.r.set_probe("request_stop", 1) self.fsm.r.set_probe("request_stop", 0) - if self.fsm.r.get_probe("state") != self.fsm.states["IDLE"]: + if self.fsm.r.get_probe("state") != States.IDLE: raise ValueError("Logic analyzer did not reset to IDLE state.") # Set triggers @@ -237,10 +237,10 @@ class LogicAnalyzerCore(Elaboratable): print_if_verbose(" -> Setting trigger mode...") if "trigger_mode" in self.config: mode = self.config["trigger_mode"].upper() - self.fsm.r.set_probe("trigger_mode", self.fsm.trigger_modes[mode]) + self.fsm.r.set_probe("trigger_mode", TriggerModes[mode]) else: - self.fsm.r.set_probe("trigger_mode", self.fsm.trigger_modes["SINGLE_SHOT"]) + self.fsm.r.set_probe("trigger_mode", TriggerModes.SINGLE_SHOT) # Set trigger location print_if_verbose(" -> Setting trigger location...") @@ -258,7 +258,7 @@ class LogicAnalyzerCore(Elaboratable): # Poll the state machine's state, and wait for the capture to complete print_if_verbose(" -> Waiting for capture to complete...") - while self.fsm.r.get_probe("state") != self.fsm.states["CAPTURED"]: + while self.fsm.r.get_probe("state") != States.CAPTURED: pass # Read out the entirety of the sample memory diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index 7dcbceb..38d384d 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -1,23 +1,28 @@ from amaranth import * +from amaranth.lib.enum import IntEnum from math import ceil, log2 from ..io_core import IOCore +class States(IntEnum): + IDLE = 0 + MOVE_TO_POSITION = 1 + IN_POSITION = 2 + CAPTURING = 3 + CAPTURED = 4 + + +class TriggerModes(IntEnum): + SINGLE_SHOT = 0 + INCREMENTAL = 1 + IMMEDIATE = 2 + + class LogicAnalyzerFSM(Elaboratable): """ """ def __init__(self, config, base_addr, interface): self.config = config - self.states = { - "IDLE": 0, - "MOVE_TO_POSITION": 1, - "IN_POSITION": 2, - "CAPTURING": 3, - "CAPTURED": 4, - } - - self.trigger_modes = {"SINGLE_SHOT": 0, "INCREMENTAL": 1, "IMMEDIATE": 2} - self.trigger = Signal(1) self.write_enable = Signal(1) @@ -74,83 +79,11 @@ class LogicAnalyzerFSM(Elaboratable): next_state = Signal().like(state) next_read_pointer = Signal().like(read_pointer) latch_read_pointer = Signal().like(read_pointer) + latch_write_pointer = Signal().like(write_pointer) + latch_write_enable = Signal().like(write_enable) next_write_pointer = Signal().like(write_pointer) - # COMBINATIONAL SHIT - with m.If(trigger_mode == self.trigger_modes["SINGLE_SHOT"]): - with m.If(state == self.states["IDLE"]): - m.d.comb += write_enable.eq(0) - m.d.comb += write_pointer.eq(0) - m.d.comb += read_pointer.eq(0) - m.d.comb += next_state.eq(self.states["IDLE"]) - - # Rising edge of request_start beings the capture: - with m.If((request_start) & (~prev_request_start)): - m.d.comb += write_enable.eq(1) - # Go straight to IN_POSITION if trigger_location == 0 - with m.If(trigger_location == 0): - m.d.comb += next_state.eq(self.states["IN_POSITION"]) - - # Otherwise go to MOVE_TO_POSITION - with m.Else(): - m.d.comb += next_state.eq(self.states["MOVE_TO_POSITION"]) - - with m.Elif(state == self.states["MOVE_TO_POSITION"]): - m.d.comb += write_enable.eq(1) - m.d.comb += write_pointer.eq(next_write_pointer) - m.d.comb += read_pointer.eq(0) - m.d.comb += next_state.eq(self.states["MOVE_TO_POSITION"]) - - with m.If(write_pointer == trigger_location - 1): - with m.If(self.trigger): - m.d.comb += next_state.eq(self.states["CAPTURING"]) - - with m.Else(): - m.d.comb += next_state.eq(self.states["IN_POSITION"]) - - with m.Elif(state == self.states["IN_POSITION"]): - m.d.comb += write_enable.eq(1) - m.d.comb += write_pointer.eq(next_write_pointer) - m.d.comb += next_state.eq(self.states["IN_POSITION"]) - - with m.If(self.trigger): - m.d.comb += next_state.eq(self.states["CAPTURING"]) - m.d.comb += read_pointer.eq(latch_read_pointer) - - with m.Else(): - m.d.comb += read_pointer.eq(next_read_pointer) - - with m.Elif(state == self.states["CAPTURING"]): - m.d.comb += write_enable.eq(1) - m.d.comb += read_pointer.eq(latch_read_pointer) - m.d.comb += next_state.eq(self.states["CAPTURING"]) - - with m.If(next_write_pointer == read_pointer): - m.d.comb += write_enable.eq(0) - m.d.comb += next_state.eq(self.states["CAPTURED"]) - - with m.Else(): - m.d.comb += write_pointer.eq(next_write_pointer) - - with m.Elif(state == self.states["CAPTURED"]): - m.d.comb += next_state.eq(self.states["CAPTURED"]) - m.d.comb += read_pointer.eq(latch_read_pointer) - m.d.comb += write_enable.eq(0) - # m.d.comb += read_pointer.eq(read_pointer) - # m.d.comb += write_pointer.eq(write_pointer) - - with m.If(self.r.trigger_mode == self.trigger_modes["IMMEDIATE"]): - pass - - with m.If(self.r.trigger_mode == self.trigger_modes["INCREMENTAL"]): - pass - - # Regardless of trigger mode, go back to IDLE if request_stop is pulsed - with m.If((request_stop) & (~prev_request_stop)): - m.d.comb += next_state.eq(self.states["IDLE"]) - - # SEQUENTIAL SHIT - + # --- Sequential Logic --- # Rising edge detection for start/stop requests m.d.sync += prev_request_start.eq(request_start) m.d.sync += prev_request_stop.eq(request_stop) @@ -160,58 +93,137 @@ class LogicAnalyzerFSM(Elaboratable): m.d.sync += next_write_pointer.eq((write_pointer + 1) % sample_depth) m.d.sync += next_read_pointer.eq((read_pointer + 1) % sample_depth) m.d.sync += latch_read_pointer.eq(read_pointer) + m.d.sync += latch_write_pointer.eq(write_pointer) + m.d.sync += latch_write_enable.eq(write_enable) + + # --- Combinational Logic --- + + # --- Single Shot Trigger Mode --- + with m.If(trigger_mode == TriggerModes.SINGLE_SHOT): + with m.If(state == States.IDLE): + m.d.comb += write_enable.eq(0) + m.d.comb += write_pointer.eq(0) + m.d.comb += read_pointer.eq(0) + m.d.comb += next_state.eq(States.IDLE) + + # Rising edge of request_start beings the capture: + with m.If((request_start) & (~prev_request_start)): + m.d.comb += write_enable.eq(1) + # Go straight to IN_POSITION if trigger_location == 0 + with m.If(trigger_location == 0): + m.d.comb += next_state.eq(States.IN_POSITION) + + # Otherwise go to MOVE_TO_POSITION + with m.Else(): + m.d.comb += next_state.eq(States.MOVE_TO_POSITION) + + with m.Elif(state == States.MOVE_TO_POSITION): + m.d.comb += write_enable.eq(1) + m.d.comb += write_pointer.eq(next_write_pointer) + m.d.comb += read_pointer.eq(0) + m.d.comb += next_state.eq(States.MOVE_TO_POSITION) + + with m.If(write_pointer == trigger_location - 1): + with m.If(self.trigger): + m.d.comb += next_state.eq(States.CAPTURING) + + with m.Else(): + m.d.comb += next_state.eq(States.IN_POSITION) + + with m.Elif(state == States.IN_POSITION): + m.d.comb += write_enable.eq(1) + m.d.comb += write_pointer.eq(next_write_pointer) + m.d.comb += next_state.eq(States.IN_POSITION) + + with m.If(self.trigger): + m.d.comb += next_state.eq(States.CAPTURING) + m.d.comb += read_pointer.eq(latch_read_pointer) + + with m.Else(): + m.d.comb += read_pointer.eq(next_read_pointer) + + with m.Elif(state == States.CAPTURING): + m.d.comb += write_enable.eq(1) + m.d.comb += read_pointer.eq(latch_read_pointer) + m.d.comb += next_state.eq(States.CAPTURING) + + with m.If(next_write_pointer == read_pointer): + m.d.comb += write_enable.eq(0) + m.d.comb += write_pointer.eq(latch_write_pointer) + m.d.comb += next_state.eq(States.CAPTURED) + + with m.Else(): + m.d.comb += write_pointer.eq(next_write_pointer) + + with m.Elif(state == States.CAPTURED): + m.d.comb += next_state.eq(States.CAPTURED) + m.d.comb += read_pointer.eq(latch_read_pointer) + m.d.comb += write_pointer.eq(latch_write_pointer) + m.d.comb += write_enable.eq(0) + + # --- Immediate Trigger Mode --- + with m.If(self.r.trigger_mode == TriggerModes.IMMEDIATE): + m.d.comb += read_pointer.eq(0) + with m.If(self.r.state == States.IDLE): + m.d.comb += write_enable.eq(0) + m.d.comb += write_pointer.eq(0) + m.d.comb += next_state.eq(States.IDLE) + + # Rising edge of request_start beings the capture: + with m.If((request_start) & (~prev_request_start)): + m.d.comb += write_enable.eq(1) + m.d.comb += next_state.eq(States.CAPTURING) + + with m.Elif(state == States.CAPTURING): + m.d.comb += write_enable.eq(1) + m.d.comb += next_state.eq(States.CAPTURING) + m.d.comb += write_pointer.eq(next_write_pointer) + + with m.If(next_write_pointer == read_pointer): + m.d.comb += write_enable.eq(0) + m.d.comb += write_pointer.eq(latch_write_pointer) + m.d.comb += next_state.eq(States.CAPTURED) + + with m.Elif(state == States.CAPTURED): + m.d.comb += write_enable.eq(0) + m.d.comb += write_pointer.eq(latch_write_pointer) + m.d.comb += next_state.eq(States.CAPTURED) + + # --- Incremental Trigger Mode --- + with m.If(self.r.trigger_mode == TriggerModes.INCREMENTAL): + with m.If(state == States.IDLE): + m.d.comb += write_enable.eq(0) + m.d.comb += write_pointer.eq(0) + m.d.comb += read_pointer.eq(0) + m.d.comb += next_state.eq(States.IDLE) + + # Rising edge of request_start beings the capture: + with m.If((request_start) & (~prev_request_start)): + m.d.comb += write_enable.eq(self.trigger) + m.d.comb += next_state.eq(States.CAPTURING) + + with m.Elif(state == States.CAPTURING): + m.d.comb += read_pointer.eq(0) + m.d.comb += next_state.eq(States.CAPTURING) + m.d.comb += write_enable.eq(self.trigger) + + with m.If(latch_write_enable): + m.d.comb += write_pointer.eq(next_write_pointer) + with m.Else(): + m.d.comb += write_pointer.eq(latch_write_pointer) + + with m.If((self.trigger) & (next_write_pointer == read_pointer)): + m.d.comb += write_pointer.eq(latch_write_pointer) + m.d.comb += next_state.eq(States.CAPTURED) + + with m.Elif(state == States.CAPTURED): + m.d.comb += next_state.eq(States.CAPTURED) + m.d.comb += read_pointer.eq(latch_read_pointer) + m.d.comb += write_pointer.eq(latch_write_pointer) + m.d.comb += write_enable.eq(0) + + # Regardless of trigger mode, go back to IDLE if request_stop is pulsed + with m.If((request_stop) & (~prev_request_stop)): + m.d.comb += next_state.eq(States.IDLE) return m - - #### OLD STUFF FOR REFERENCE #### - - # with m.If(self.r.state == self.states["IDLE"]): - # m.d.sync += self.r.write_pointer.eq(0) - # m.d.sync += self.r.read_pointer.eq(0) - # m.d.sync += self.write_enable.eq(0) - - # with m.If((self.r.request_start) & (~prev_request_start)): - # m.d.sync += self.write_enable.eq(1) - # with m.If(self.r.trigger_mode == self.trigger_modes["IMMEDIATE"]): - # m.d.sync += self.r.state.eq(self.states["CAPTURING"]) - # m.d.sync += self.r.write_pointer.eq(self.r.write_pointer + 1) - - # with m.Else(): - # with m.If(self.r.trigger_location == 0): - # m.d.sync += self.r.state.eq(self.states["IN_POSITION"]) - - # with m.Else(): - # m.d.sync += self.r.state.eq(self.states["MOVE_TO_POSITION"]) - - # # m.d.sync += self.r.state.eq(self.states["MOVE_TO_POSITION"]) - - # with m.Elif(self.r.state == self.states["MOVE_TO_POSITION"]): - # m.d.sync += self.r.write_pointer.eq(self.r.write_pointer + 1) - - # with m.If(self.r.write_pointer == self.r.trigger_location): - # with m.If(self.trigger): - # m.d.sync += self.r.state.eq(self.states["CAPTURING"]) - - # with m.Else(): - # m.d.sync += self.r.state.eq(self.states["IN_POSITION"]) - # self.increment_mod_sample_depth(m, self.r.read_pointer) - - # with m.Elif(self.r.state == self.states["IN_POSITION"]): - # self.increment_mod_sample_depth(m, self.r.write_pointer) - - # with m.If(self.trigger): - # m.d.sync += self.r.state.eq(self.states["CAPTURING"]) - - # with m.Else(): - # self.increment_mod_sample_depth(m, self.r.read_pointer) - - # with m.Elif(self.r.state == self.states["CAPTURING"]): - # with m.If(self.r.write_pointer == self.r.read_pointer): - # m.d.sync += self.write_enable.eq(0) - # m.d.sync += self.r.state.eq(self.states["CAPTURED"]) - - # with m.Else(): - # self.increment_mod_sample_depth(m, self.r.write_pointer) - - # with m.If((self.r.request_stop) & (~prev_request_stop)): - # m.d.sync += self.r.state.eq(self.states["IDLE"]) diff --git a/test/test_logic_analyzer_fsm_sim.py b/test/test_logic_analyzer_fsm_sim.py index 2bd7f8d..24d8215 100644 --- a/test/test_logic_analyzer_fsm_sim.py +++ b/test/test_logic_analyzer_fsm_sim.py @@ -1,5 +1,5 @@ from amaranth.sim import Simulator -from manta.logic_analyzer import LogicAnalyzerFSM +from manta.logic_analyzer import * from manta.utils import * """ @@ -25,49 +25,252 @@ config = {"sample_depth": 8} fsm = LogicAnalyzerFSM(config, base_addr=0, interface=None) -def set_fsm_register(name, data): - addr = fsm.r.mmap[f"{name}_buf"]["addrs"][0] - strobe_addr = fsm.r.base_addr - - yield from write_register(fsm, strobe_addr, 0) - yield from write_register(fsm, addr, data) - yield from write_register(fsm, strobe_addr, 1) - yield from write_register(fsm, strobe_addr, 0) - - -def test_single_shot_always_trigger(): +def test_signals_reset_correctly(): def testbench(): - if (yield fsm.r.state != fsm.states["IDLE"]): + # Make sure pointers and write enable reset to zero + for sig in [fsm.r.write_pointer, fsm.r.read_pointer, fsm.write_enable]: + if (yield sig) != 0: + raise ValueError + + # Make sure state resets to IDLE + if (yield fsm.r.state != States.IDLE): raise ValueError - yield fsm.trigger.eq(1) - yield from set_fsm_register("trigger_mode", fsm.trigger_modes["SINGLE_SHOT"]) - yield from set_fsm_register("trigger_location", 4) - yield from set_fsm_register("request_start", 1) - yield from set_fsm_register("request_start", 0) + simulate(fsm, testbench) - for _ in range(100): + +def test_single_shot_no_wait_for_trigger(): + def testbench(): + # Configure and start FSM + yield fsm.trigger.eq(1) + yield fsm.r.trigger_mode.eq(TriggerModes.SINGLE_SHOT) + yield fsm.r.trigger_location.eq(4) + yield fsm.r.request_start.eq(1) + + # Wait until write_enable is asserted + while not (yield fsm.write_enable): yield - simulate(fsm, testbench, "single_shot_always_trigger.vcd") + # Wait 8 clock cycles for capture to complete + for i in range(8): + # Make sure that read_pointer does not increase + if (yield fsm.r.read_pointer) != 0: + raise ValueError + # Make sure that write_pointer increases by one each cycle + if (yield fsm.r.write_pointer) != i: + raise ValueError -def test_single_shot_wait_to_trigger(): - def testbench(): - if (yield fsm.r.state != fsm.states["IDLE"]): + yield + + # Wait one clock cycle (to let BRAM contents cycle in) + yield + + # Check that write_pointer points to the end of memory + if (yield fsm.r.write_pointer) != 7: raise ValueError - yield from set_fsm_register("trigger_mode", fsm.trigger_modes["SINGLE_SHOT"]) - yield from set_fsm_register("trigger_location", 4) - yield from set_fsm_register("request_start", 1) - yield from set_fsm_register("request_start", 0) + # Check that state is CAPTURED + if (yield fsm.r.state) != States.CAPTURED: + raise ValueError + + simulate(fsm, testbench, "single_shot_no_wait_for_trigger.vcd") + + +def test_single_shot_wait_for_trigger(): + def testbench(): + # Configure and start FSM + yield fsm.r.trigger_mode.eq(TriggerModes.SINGLE_SHOT) + yield fsm.r.trigger_location.eq(4) + yield fsm.r.request_start.eq(1) + yield + + # Check that write_enable is asserted on the same edge as request_start + if not (yield fsm.write_enable): + raise ValueError + + # Wait 4 clock cycles to get to IN_POSITION + for i in range(4): + rp = yield fsm.r.read_pointer + wp = yield fsm.r.write_pointer + + # Make sure that read_pointer does not increase + if rp != 0: + raise ValueError + + # Make sure that write_pointer increases by one each cycle + if wp != i: + raise ValueError + + yield + + # Wait a few cycles before triggering: + for _ in range(10): + if (rp + 3) % fsm.config["sample_depth"] != wp: + raise ValueError + + yield + + # Provide the trigger, and check that the capture completes 4 cycles later + yield fsm.trigger.eq(1) + yield + + rp_start = yield fsm.r.read_pointer + for i in range(4): + rp = yield fsm.r.read_pointer + wp = yield fsm.r.write_pointer + + if rp != rp_start: + raise ValueError + + if (rp_start + 4 + i) % fsm.config["sample_depth"] != wp: + raise ValueError + + yield + + # Wait one clock cycle (to let BRAM contents cycle in) + yield + + # Check that write_pointer points to the end of memory + rp = yield fsm.r.read_pointer + wp = yield fsm.r.write_pointer + if (wp + 1) % fsm.config["sample_depth"] != rp: + raise ValueError + + # Check that state is CAPTURED + if (yield fsm.r.state) != States.CAPTURED: + raise ValueError + + simulate(fsm, testbench, "single_shot_wait_for_trigger.vcd") + + +def test_immediate(): + def testbench(): + # Configure and start FSM + yield fsm.r.trigger_mode.eq(TriggerModes.IMMEDIATE) + yield fsm.r.request_start.eq(1) + yield + + # Check that write_enable is asserted on the same edge as request_start + if not (yield fsm.write_enable): + raise ValueError + + for i in range(fsm.config["sample_depth"]): + rp = yield fsm.r.read_pointer + wp = yield fsm.r.write_pointer + + if rp != 0: + raise ValueError + + if wp != i: + raise ValueError + + yield + + # Wait one clock cycle (to let BRAM contents cycle in) + yield + + # Check that write_pointer points to the end of memory + rp = yield fsm.r.read_pointer + wp = yield fsm.r.write_pointer + if rp != 0: + raise ValueError + if wp != 7: + raise ValueError + + # Check that state is CAPTURED + if (yield fsm.r.state) != States.CAPTURED: + raise ValueError + + simulate(fsm, testbench, "immediate.vcd") + + +def test_incremental(): + def testbench(): + # Configure and start FSM + yield fsm.r.trigger_mode.eq(TriggerModes.INCREMENTAL) + yield fsm.r.request_start.eq(1) + yield + + # Check that write_enable is asserted on the same edge as request_start + # if not (yield fsm.write_enable): + # raise ValueError + + for _ in range(10): + for _ in range(3): + yield + + yield fsm.trigger.eq(1) + yield + yield fsm.trigger.eq(0) + yield + + # # Check that state is CAPTURED + # if (yield fsm.r.state) != States.CAPTURED: + # raise ValueError + + simulate(fsm, testbench, "incremental.vcd") + + +def test_single_shot_write_enable(): + def testbench(): + # Configure FSM + yield fsm.r.trigger_mode.eq(TriggerModes.SINGLE_SHOT) + yield fsm.r.trigger_location.eq(4) + yield + + # Make sure write is not enabled before starting the FSM + if (yield fsm.write_enable): + raise ValueError + + # Start the FSM, ensure write enable is asserted throughout the capture + yield fsm.r.request_start.eq(1) + yield + + for _ in range(fsm.config["sample_depth"]): + if not (yield fsm.write_enable): + raise ValueError - for _ in range(8): yield yield fsm.trigger.eq(1) + yield + + for _ in range(4): + if not (yield fsm.write_enable): + raise ValueError - for _ in range(100): yield - simulate(fsm, testbench, "single_shot_wait_to_trigger.vcd") + # Make sure write_enable is deasserted after + if (yield fsm.write_enable): + raise ValueError + + simulate(fsm, testbench, "single_shot_write_enable.vcd") + + +def test_immediate_write_enable(): + def testbench(): + # Configure FSM + yield fsm.r.trigger_mode.eq(TriggerModes.IMMEDIATE) + yield + + # Make sure write is not enabled before starting the FSM + if (yield fsm.write_enable): + raise ValueError + + # Start the FSM, ensure write enable is asserted throughout the capture + yield fsm.r.request_start.eq(1) + yield + + for _ in range(fsm.config["sample_depth"]): + if not (yield fsm.write_enable): + raise ValueError + + yield + + # Make sure write_enable is deasserted after + if (yield fsm.write_enable): + raise ValueError + + simulate(fsm, testbench, "immediate_write_enable.vcd") From b8de6339aae97898436cd06b085559028840b1a2 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 21 Jan 2024 00:23:07 -0800 Subject: [PATCH 34/89] adjust some ergonomics found while playtesting --- doc/getting_started.md | 21 ++------------ doc/logic_analyzer_core.md | 2 +- src/manta/cli.py | 41 +++++++++++++++++++--------- src/manta/io_core.py | 1 - src/manta/logic_analyzer/__init__.py | 17 +++++++++--- src/manta/manta.py | 3 +- src/manta/memory_core.py | 1 - src/manta/uart/__init__.py | 1 - src/manta/utils.py | 16 +++++++++-- 9 files changed, 60 insertions(+), 43 deletions(-) diff --git a/doc/getting_started.md b/doc/getting_started.md index 2de3e05..e6b3141 100644 --- a/doc/getting_started.md +++ b/doc/getting_started.md @@ -58,34 +58,19 @@ This Manta instance has an IO Core and a Logic Analyzer, each containing a numbe ## Example Instantiation -The Verilog file generated by `manta gen` contains some information at the top of the file. This includes an example instantiation for the `manta` module that's been configured, which you can copy paste into your source code. Here's what that looks like for the configuration above: - -```c -/* -This module was generated with Manta v0.0.5 on 11 Sep 2023 at 17:52:28 by fischerm - -If this breaks or if you've got spicy formal verification memes, contact fischerm [at] mit.edu - -Provided under a GNU GPLv3 license. Go wild. - -Here's an example instantiation of the Manta module you configured, feel free to copy-paste -this into your source! +Lastly, we Manta can automatically generate a copy-pasteable Verilog snippet to instantiate Manta in your design. This is done by running `manta inst` with the path to the configuration file describing the Manta core you'd like to instantiate. For example, the following snippet is generated for the configuration above: +```verilog manta manta_inst ( .clk(clk), - + .rst(rst) .rx(rx), .tx(tx), - .probe_0_in(probe_0_in), .probe_1_in(probe_1_in), .probe_2_out(probe_2_out), .probe_3_out(probe_3_out), - - .larry(larry), .curly(curly), .moe(moe)); - -*/ ``` \ No newline at end of file diff --git a/doc/logic_analyzer_core.md b/doc/logic_analyzer_core.md index bcf0a4b..50debe6 100644 --- a/doc/logic_analyzer_core.md +++ b/doc/logic_analyzer_core.md @@ -116,7 +116,7 @@ If the file `manta.yaml` contained the configuration above, then running: manta capture manta.yaml my_logic_analyzer capture.v ``` -Generates a Verilog module at `capture.v` which can then be instantiated in the testbench or FPGA design in which it is needed. An example instantiation is provided at the top of the output verilog, so a simple copy-paste into the testbench is all that's necessary to use the module. +Generates a Verilog module at `capture.v` which can then be instantiated in the testbench or FPGA design in which it is needed. This is useful for two situations in particular: diff --git a/src/manta/cli.py b/src/manta/cli.py index e629064..610ec13 100644 --- a/src/manta/cli.py +++ b/src/manta/cli.py @@ -1,5 +1,5 @@ from .manta import Manta -from warnings import warn +from .utils import * from sys import argv from pkg_resources import get_distribution @@ -37,6 +37,10 @@ Usage: Generate a verilog file specifying the Manta module from a given configuration file, and save to the provided path. + inst [config_file] + Generate a copy-pasteable Verilog snippet to instantiate Manta + in your design. + capture [config_file] [la_core_name] [vcd_file] [verilog_file] Start a capture on the specified core, and save the results to a .vcd or .v file at the provided path(s). @@ -61,6 +65,7 @@ def version(): def wrong_args(): print('Wrong number of arguments, run "manta help" for usage.') + exit(1) def gen(config_path, output_path): @@ -79,9 +84,23 @@ def gen(config_path, output_path): ) +def inst(config_path): + m = Manta(config_path) + ports = m.get_top_level_ports() + hdl = ",\n ".join([f".{p.name}({p.name})" for p in ports]) + + foo = """ +manta manta_inst( + .clk(clk), + .rst(rst), + """ + + print(foo + hdl + ");\n") + + def capture(config_path, logic_analyzer_name, export_paths): m = Manta(config_path) - la = getattr(s, logic_analyzer_name) + la = getattr(m, logic_analyzer_name) cap = la.capture() for path in export_paths: @@ -129,20 +148,16 @@ def main(): wrong_args() gen(argv[2], argv[3]) + elif argv[1] == "inst": + if len(argv) != 3: + wrong_args() + + inst(argv[2]) + elif argv[1] == "capture": if len(argv) < 5: wrong_args() - capture(argv[2], argv[3], argv[4]) - - elif argv[1] == "playback": - if len(argv) != 5: - wrong_args() - playback(argv[2], argv[3], argv[4]) - - elif argv[1] == "mmap": - if len(argv) != 3: - wrong_args() - mmap(argv[2]) + capture(argv[2], argv[3], argv[4:]) elif argv[1] == "ports": ports() diff --git a/src/manta/io_core.py b/src/manta/io_core.py index 98ce631..08e7633 100644 --- a/src/manta/io_core.py +++ b/src/manta/io_core.py @@ -1,5 +1,4 @@ from amaranth import * -from warnings import warn from .utils import * from math import ceil diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index e78f634..fd8dece 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -1,5 +1,4 @@ from amaranth import * -from warnings import warn from ..utils import * from .trigger_block import LogicAnalyzerTriggerBlock from .fsm import LogicAnalyzerFSM, States, TriggerModes @@ -306,7 +305,11 @@ class LogicAnalyzerCapture: ---------- The trigger location as an `int`. """ - return self.config["trigger_location"] + if "trigger_location" in self.config: + return self.config["trigger_location"] + + else: + return self.config["sample_depth"] // 2 def get_trace(self, probe_name): """Gets the value of a single probe over the capture. @@ -373,7 +376,10 @@ class LogicAnalyzerCapture: clock = writer.register_var("manta", "clk", "wire", size=1) # include a trigger signal such would be meaningful (ie, we didn't trigger immediately) - if self.config["trigger_mode"] != "immediate": + if ( + "trigger_mode" not in self.config + or self.config["trigger_mode"] == "single_shot" + ): trigger = writer.register_var("manta", "trigger", "wire", size=1) # add the data to each probe in the vcd file @@ -382,7 +388,10 @@ class LogicAnalyzerCapture: writer.change(clock, timestamp, timestamp % 2 == 0) # set the trigger (if there is one) - if self.config["trigger_mode"] != "immediate": + if ( + "trigger_mode" not in self.config + or self.config["trigger_mode"] == "single_shot" + ): triggered = (timestamp // 2) >= self.get_trigger_location() writer.change(trigger, timestamp, triggered) diff --git a/src/manta/manta.py b/src/manta/manta.py index a86150a..8e9e997 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -1,5 +1,4 @@ from amaranth import * -from warnings import warn from .uart import UARTInterface # from .ethernet import EthernetInterface @@ -70,7 +69,7 @@ class Manta(Elaboratable): return EthernetInterface(self.config["ethernet"]) else: - raise ValueError("Unrecognized interface specified.") + raise ValueError("No recognized interface specified.") def get_cores(self): """ """ diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index db54a36..17bfd33 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -1,5 +1,4 @@ from amaranth import * -from warnings import warn from .utils import * from math import ceil diff --git a/src/manta/uart/__init__.py b/src/manta/uart/__init__.py index 7540c93..4cfbeef 100644 --- a/src/manta/uart/__init__.py +++ b/src/manta/uart/__init__.py @@ -1,5 +1,4 @@ from amaranth import * -from warnings import warn from ..utils import * from .receiver import UARTReceiver from .receive_bridge import ReceiveBridge diff --git a/src/manta/utils.py b/src/manta/utils.py index 9773a57..98ae766 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -5,13 +5,25 @@ import os class InternalBus(data.StructLayout): - """Describes the layout of Manta's internal bus, such that signals of - the appropriate dimension can be instantiated with Signal(InternalBus()).""" + """ + Describes the layout of Manta's internal bus, such that signals of + the appropriate dimension can be instantiated with Signal(InternalBus()). + """ def __init__(self): super().__init__({"addr": 16, "data": 16, "rw": 1, "valid": 1}) +def warn(message): + """ + Prints a warning to the user's terminal. Originally the warn() method + from the builtin warnings module was used for this, but I don't think the + way it outputs on the command line is the most helpful for the users. + (They don't care about the stacktrace or the filename/line number, for example.) + """ + print("Warning: " + message) + + def words_to_value(data): """ Takes a list of integers, interprets them as 16-bit integers, and From d075c04e2a6f1abb97244c7790ba06a882eadaf3 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 21 Jan 2024 00:47:14 -0800 Subject: [PATCH 35/89] update makefile to not require python scripts on PATH --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index c22f0d1..229247e 100644 --- a/Makefile +++ b/Makefile @@ -1,9 +1,9 @@ .PHONY: test format clean serve_docs test: - pytest + python3 -m pytest format: - black . + python3 -m black . clean: git clean -Xdf From c177e3b5b57e8f128fe1e28793203a3f60441b46 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 21 Jan 2024 00:50:53 -0800 Subject: [PATCH 36/89] update makefile to source venv again --- .github/workflows/run_tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index d87e932..3396525 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -34,4 +34,6 @@ jobs: export ICEPACK=/tools/oss-cad-suite/bin/icepack export ICEPROG=/tools/oss-cad-suite/bin/iceprog + source venv/bin/activate + make test \ No newline at end of file From ee4a79a4d42bb434c60d6d6634f4ecd885063d48 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 21 Jan 2024 23:45:14 -0800 Subject: [PATCH 37/89] refactor logic analyzer FSM to be sequential-only for better timing --- src/manta/logic_analyzer/__init__.py | 6 +- src/manta/logic_analyzer/fsm.py | 175 ++++++++------------------- test/test_logic_analyzer_fsm_sim.py | 53 ++------ 3 files changed, 69 insertions(+), 165 deletions(-) diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index fd8dece..470843d 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -103,8 +103,8 @@ class LogicAnalyzerCore(Elaboratable): if not isinstance(trigger_location, int) or trigger_location < 0: raise ValueError("Trigger location must be a positive integer.") - if trigger_location > config["sample_depth"]: - raise ValueError("Trigger location cannot exceed sample depth.") + if trigger_location >= config["sample_depth"]: + raise ValueError("Trigger location must be less than sample depth.") if trigger_mode == "immediate": warn( @@ -229,7 +229,7 @@ class LogicAnalyzerCore(Elaboratable): print_if_verbose(" -> Setting triggers...") self.trig_blk.clear_triggers() - if self.config["trigger_mode"] != "immediate": + if self.config.get("trigger_mode") != "immediate": self.trig_blk.set_triggers(self.config) # Set trigger mode, default to single-shot if user didn't specify a mode diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index 38d384d..9efe17a 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -76,154 +76,85 @@ class LogicAnalyzerFSM(Elaboratable): prev_request_start = Signal(1) prev_request_stop = Signal(1) - next_state = Signal().like(state) - next_read_pointer = Signal().like(read_pointer) - latch_read_pointer = Signal().like(read_pointer) - latch_write_pointer = Signal().like(write_pointer) - latch_write_enable = Signal().like(write_enable) next_write_pointer = Signal().like(write_pointer) - # --- Sequential Logic --- + m.d.comb += next_write_pointer.eq((write_pointer + 1) % sample_depth) + # Rising edge detection for start/stop requests m.d.sync += prev_request_start.eq(request_start) m.d.sync += prev_request_stop.eq(request_stop) - # Copy next into current - m.d.sync += state.eq(next_state) - m.d.sync += next_write_pointer.eq((write_pointer + 1) % sample_depth) - m.d.sync += next_read_pointer.eq((read_pointer + 1) % sample_depth) - m.d.sync += latch_read_pointer.eq(read_pointer) - m.d.sync += latch_write_pointer.eq(write_pointer) - m.d.sync += latch_write_enable.eq(write_enable) + with m.If(state == States.IDLE): + m.d.sync += write_pointer.eq(0) + m.d.sync += read_pointer.eq(0) + m.d.sync += write_enable.eq(0) - # --- Combinational Logic --- + with m.If((request_start) & (~prev_request_start)): + with m.If(trigger_mode == TriggerModes.IMMEDIATE): + m.d.sync += state.eq(States.CAPTURING) + m.d.sync += write_enable.eq(1) - # --- Single Shot Trigger Mode --- - with m.If(trigger_mode == TriggerModes.SINGLE_SHOT): - with m.If(state == States.IDLE): - m.d.comb += write_enable.eq(0) - m.d.comb += write_pointer.eq(0) - m.d.comb += read_pointer.eq(0) - m.d.comb += next_state.eq(States.IDLE) + with m.Elif(trigger_mode == TriggerModes.INCREMENTAL): + m.d.sync += state.eq(States.CAPTURING) + m.d.sync += write_enable.eq(1) - # Rising edge of request_start beings the capture: - with m.If((request_start) & (~prev_request_start)): - m.d.comb += write_enable.eq(1) - # Go straight to IN_POSITION if trigger_location == 0 + with m.Elif(trigger_mode == TriggerModes.SINGLE_SHOT): with m.If(trigger_location == 0): - m.d.comb += next_state.eq(States.IN_POSITION) - - # Otherwise go to MOVE_TO_POSITION - with m.Else(): - m.d.comb += next_state.eq(States.MOVE_TO_POSITION) - - with m.Elif(state == States.MOVE_TO_POSITION): - m.d.comb += write_enable.eq(1) - m.d.comb += write_pointer.eq(next_write_pointer) - m.d.comb += read_pointer.eq(0) - m.d.comb += next_state.eq(States.MOVE_TO_POSITION) - - with m.If(write_pointer == trigger_location - 1): - with m.If(self.trigger): - m.d.comb += next_state.eq(States.CAPTURING) + m.d.sync += state.eq(States.IN_POSITION) with m.Else(): - m.d.comb += next_state.eq(States.IN_POSITION) + m.d.sync += state.eq(States.MOVE_TO_POSITION) - with m.Elif(state == States.IN_POSITION): - m.d.comb += write_enable.eq(1) - m.d.comb += write_pointer.eq(next_write_pointer) - m.d.comb += next_state.eq(States.IN_POSITION) + m.d.sync += write_enable.eq(1) + with m.Elif(state == States.MOVE_TO_POSITION): + m.d.sync += write_pointer.eq(next_write_pointer) + + with m.If(write_pointer == trigger_location - 1): with m.If(self.trigger): - m.d.comb += next_state.eq(States.CAPTURING) - m.d.comb += read_pointer.eq(latch_read_pointer) + m.d.sync += state.eq(States.CAPTURING) with m.Else(): - m.d.comb += read_pointer.eq(next_read_pointer) + m.d.sync += state.eq(States.IN_POSITION) - with m.Elif(state == States.CAPTURING): - m.d.comb += write_enable.eq(1) - m.d.comb += read_pointer.eq(latch_read_pointer) - m.d.comb += next_state.eq(States.CAPTURING) + with m.Elif(state == States.IN_POSITION): + m.d.sync += write_pointer.eq(next_write_pointer) + with m.If(self.trigger): + m.d.sync += state.eq(States.CAPTURING) + + # kind of horrible, i'll get rid of this later... + with m.If(write_pointer > trigger_location): + m.d.sync += read_pointer.eq(write_pointer - trigger_location) + with m.Else(): + m.d.sync += read_pointer.eq( + write_pointer - trigger_location + sample_depth + ) + + # ok that's all for horrible + + with m.If(state == States.CAPTURING): + # Non- incremental modes + with m.If(trigger_mode != TriggerModes.INCREMENTAL): with m.If(next_write_pointer == read_pointer): - m.d.comb += write_enable.eq(0) - m.d.comb += write_pointer.eq(latch_write_pointer) - m.d.comb += next_state.eq(States.CAPTURED) + m.d.sync += write_enable.eq(0) + m.d.sync += state.eq(States.CAPTURED) with m.Else(): - m.d.comb += write_pointer.eq(next_write_pointer) + m.d.sync += write_pointer.eq(next_write_pointer) - with m.Elif(state == States.CAPTURED): - m.d.comb += next_state.eq(States.CAPTURED) - m.d.comb += read_pointer.eq(latch_read_pointer) - m.d.comb += write_pointer.eq(latch_write_pointer) - m.d.comb += write_enable.eq(0) + # Incremental mode + with m.Else(): + with m.If(self.trigger): + with m.If(next_write_pointer == read_pointer): + m.d.sync += write_enable.eq(0) + m.d.sync += state.eq(States.CAPTURED) - # --- Immediate Trigger Mode --- - with m.If(self.r.trigger_mode == TriggerModes.IMMEDIATE): - m.d.comb += read_pointer.eq(0) - with m.If(self.r.state == States.IDLE): - m.d.comb += write_enable.eq(0) - m.d.comb += write_pointer.eq(0) - m.d.comb += next_state.eq(States.IDLE) - - # Rising edge of request_start beings the capture: - with m.If((request_start) & (~prev_request_start)): - m.d.comb += write_enable.eq(1) - m.d.comb += next_state.eq(States.CAPTURING) - - with m.Elif(state == States.CAPTURING): - m.d.comb += write_enable.eq(1) - m.d.comb += next_state.eq(States.CAPTURING) - m.d.comb += write_pointer.eq(next_write_pointer) - - with m.If(next_write_pointer == read_pointer): - m.d.comb += write_enable.eq(0) - m.d.comb += write_pointer.eq(latch_write_pointer) - m.d.comb += next_state.eq(States.CAPTURED) - - with m.Elif(state == States.CAPTURED): - m.d.comb += write_enable.eq(0) - m.d.comb += write_pointer.eq(latch_write_pointer) - m.d.comb += next_state.eq(States.CAPTURED) - - # --- Incremental Trigger Mode --- - with m.If(self.r.trigger_mode == TriggerModes.INCREMENTAL): - with m.If(state == States.IDLE): - m.d.comb += write_enable.eq(0) - m.d.comb += write_pointer.eq(0) - m.d.comb += read_pointer.eq(0) - m.d.comb += next_state.eq(States.IDLE) - - # Rising edge of request_start beings the capture: - with m.If((request_start) & (~prev_request_start)): - m.d.comb += write_enable.eq(self.trigger) - m.d.comb += next_state.eq(States.CAPTURING) - - with m.Elif(state == States.CAPTURING): - m.d.comb += read_pointer.eq(0) - m.d.comb += next_state.eq(States.CAPTURING) - m.d.comb += write_enable.eq(self.trigger) - - with m.If(latch_write_enable): - m.d.comb += write_pointer.eq(next_write_pointer) - with m.Else(): - m.d.comb += write_pointer.eq(latch_write_pointer) - - with m.If((self.trigger) & (next_write_pointer == read_pointer)): - m.d.comb += write_pointer.eq(latch_write_pointer) - m.d.comb += next_state.eq(States.CAPTURED) - - with m.Elif(state == States.CAPTURED): - m.d.comb += next_state.eq(States.CAPTURED) - m.d.comb += read_pointer.eq(latch_read_pointer) - m.d.comb += write_pointer.eq(latch_write_pointer) - m.d.comb += write_enable.eq(0) + with m.Else(): + m.d.sync += write_pointer.eq(next_write_pointer) # Regardless of trigger mode, go back to IDLE if request_stop is pulsed with m.If((request_stop) & (~prev_request_stop)): - m.d.comb += next_state.eq(States.IDLE) + m.d.sync += state.eq(States.IDLE) return m diff --git a/test/test_logic_analyzer_fsm_sim.py b/test/test_logic_analyzer_fsm_sim.py index 24d8215..c2b4e70 100644 --- a/test/test_logic_analyzer_fsm_sim.py +++ b/test/test_logic_analyzer_fsm_sim.py @@ -2,25 +2,6 @@ from amaranth.sim import Simulator from manta.logic_analyzer import * from manta.utils import * -""" -what do we want this to do? - -we want to run a capture in single shot mode, immediate mode, and incremental mode - - -single-shot case: -- exactly the right number of samples are taken -- we only start taking samples once captured - -immediate case: -- exactly the right number of samples are taken -- we only start taking samples once captured - -incremental case: -- exactly the right number of samples are taken -- we only take samples when trig is asserted - -""" config = {"sample_depth": 8} fsm = LogicAnalyzerFSM(config, base_addr=0, interface=None) @@ -84,8 +65,9 @@ def test_single_shot_wait_for_trigger(): yield fsm.r.trigger_location.eq(4) yield fsm.r.request_start.eq(1) yield + yield - # Check that write_enable is asserted on the same edge as request_start + # Check that write_enable is asserted a cycle after request_start if not (yield fsm.write_enable): raise ValueError @@ -104,28 +86,15 @@ def test_single_shot_wait_for_trigger(): yield - # Wait a few cycles before triggering: + # Wait a few cycles before triggering for _ in range(10): - if (rp + 3) % fsm.config["sample_depth"] != wp: - raise ValueError - yield # Provide the trigger, and check that the capture completes 4 cycles later yield fsm.trigger.eq(1) yield - rp_start = yield fsm.r.read_pointer for i in range(4): - rp = yield fsm.r.read_pointer - wp = yield fsm.r.write_pointer - - if rp != rp_start: - raise ValueError - - if (rp_start + 4 + i) % fsm.config["sample_depth"] != wp: - raise ValueError - yield # Wait one clock cycle (to let BRAM contents cycle in) @@ -150,8 +119,9 @@ def test_immediate(): yield fsm.r.trigger_mode.eq(TriggerModes.IMMEDIATE) yield fsm.r.request_start.eq(1) yield + yield - # Check that write_enable is asserted on the same edge as request_start + # Check that write_enable is asserted a cycle after request_start if not (yield fsm.write_enable): raise ValueError @@ -191,10 +161,11 @@ def test_incremental(): yield fsm.r.trigger_mode.eq(TriggerModes.INCREMENTAL) yield fsm.r.request_start.eq(1) yield + yield # Check that write_enable is asserted on the same edge as request_start - # if not (yield fsm.write_enable): - # raise ValueError + if not (yield fsm.write_enable): + raise ValueError for _ in range(10): for _ in range(3): @@ -205,9 +176,9 @@ def test_incremental(): yield fsm.trigger.eq(0) yield - # # Check that state is CAPTURED - # if (yield fsm.r.state) != States.CAPTURED: - # raise ValueError + # Check that state is CAPTURED + if (yield fsm.r.state) != States.CAPTURED: + raise ValueError simulate(fsm, testbench, "incremental.vcd") @@ -226,6 +197,7 @@ def test_single_shot_write_enable(): # Start the FSM, ensure write enable is asserted throughout the capture yield fsm.r.request_start.eq(1) yield + yield for _ in range(fsm.config["sample_depth"]): if not (yield fsm.write_enable): @@ -262,6 +234,7 @@ def test_immediate_write_enable(): # Start the FSM, ensure write enable is asserted throughout the capture yield fsm.r.request_start.eq(1) yield + yield for _ in range(fsm.config["sample_depth"]): if not (yield fsm.write_enable): From 510bae6f38f81b4a934806e7bbe9ecf2cd26fb75 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Mon, 22 Jan 2024 00:03:54 -0800 Subject: [PATCH 38/89] add MATLAB fpga data capture to alternatives, thanks nathan --- doc/alternatives.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/doc/alternatives.md b/doc/alternatives.md index e7dcd11..7758656 100644 --- a/doc/alternatives.md +++ b/doc/alternatives.md @@ -58,4 +58,11 @@ An embedded logic analyzer for Lattice FPGAs, provided as part of the Diamond de Unlike other entries in this list, Opal Kelly's FrontPanel SDK is not marketed as a debugger (although it can be used as such). Instead, it's designed to provide a host computer with a real time interface to FGPA signals, and present them on a graphical “front panel". These front panels exist as a GUI window on the host, and contain buttons, knobs, and indicators, much like a LabVIEW virtual instrument. Communication between the host and FPGA is accomplished with either USB or PCIe. Bindings for hosts running Windows, macOS, and Linux are provided, and target C, C++, C#, Python, Java, Ruby, and MATLAB. The FrontPanel SDK differs from other debuggers in that it provides a skeleton module into which the user logic is instantiated, instead of being instantiated inside the user's logic. - [Documentation](https://docs.opalkelly.com/fpsdk/) -- [User's Guide](https://assets00.opalkelly.com/library/FrontPanel-UM.pdf) \ No newline at end of file +- [User's Guide](https://assets00.opalkelly.com/library/FrontPanel-UM.pdf) + + +### MATLAB FPGA Data Capture + +An embedded logic analyzer for Xilinx and Altera FPGAs, provided as part of MATLAB. Communication between the host and FPGA is accomplished with JTAG, but Ethernet is supported for Xilinx FPGAs. Notably, this tool allows for data to be captured and used directly inside MATLAB, which also includes a framework for FPGA-in-the-loop testing. It also provides an AXI manager IP block that allows for reads and writes to an AXI memory map from MATLAB. This IP supports PCI Express on Xilinx FPGAs, in addition to JTAG and Ethernet. + +- [Documentation](https://www.mathworks.com/help/hdlverifier/fpga-data-capture-xilinx.html) \ No newline at end of file From a75a6a3ccf266802552bc065d8aa3cfdde196799 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 28 Jan 2024 21:54:46 -0800 Subject: [PATCH 39/89] add first pass at ethernet --- project_0/build.tcl | 65 ++++++ ethernet_test.yml => project_0/manta.yaml | 8 +- project_0/manta_test.yaml | 12 + project_0/stream.py | 68 ++++++ project_0/test.yml | 28 +++ project_0/xdc/top_level.xdc | 260 ++++++++++++++++++++++ project_1/build.tcl | 65 ++++++ project_1/liteeth_config.yml | 28 +++ project_1/manta.yaml | 15 ++ project_1/stream.py | 17 ++ project_1/xdc/top_level.xdc | 260 ++++++++++++++++++++++ src/manta/ethernet.py | 171 ++++++++++++++ src/manta/io_core.py | 10 +- src/manta/manta.py | 2 +- src/manta/utils.py | 9 +- test/test_source_bridge_sim.py | 39 ++++ 16 files changed, 1049 insertions(+), 8 deletions(-) create mode 100644 project_0/build.tcl rename ethernet_test.yml => project_0/manta.yaml (62%) create mode 100644 project_0/manta_test.yaml create mode 100644 project_0/stream.py create mode 100644 project_0/test.yml create mode 100644 project_0/xdc/top_level.xdc create mode 100644 project_1/build.tcl create mode 100644 project_1/liteeth_config.yml create mode 100644 project_1/manta.yaml create mode 100644 project_1/stream.py create mode 100644 project_1/xdc/top_level.xdc create mode 100644 src/manta/ethernet.py create mode 100644 test/test_source_bridge_sim.py diff --git a/project_0/build.tcl b/project_0/build.tcl new file mode 100644 index 0000000..d0441d6 --- /dev/null +++ b/project_0/build.tcl @@ -0,0 +1,65 @@ +#!/usr/bin/tclsh +# jay's build script +# pass -tclargs -d to generate diagnostics + +# switches + +set partNum xc7a100tcsg324-1 +set outputDir output_files +set verbose 0 + +if { $argc > 0 } { + if { $argc == 1 && [string compare [ lindex $argv 0 ] "-d"] == 0 } { + set verbose 1 + } else { + puts "usage: $argv0 \[-d\]" + exit 1 + } +} + +file mkdir $outputDir +set files [glob -nocomplain "$outputDir/*"] +if {[llength $files] != 0} { + file delete -force {*}[glob -directory $outputDir *]; +} + +read_verilog -sv [ glob ./src/*.{sv,v,svh,vh} ] +read_xdc ./xdc/top_level.xdc + +set_part $partNum + +# synth +synth_design -top top_level -part $partNum -verbose +report_utilization -file $outputDir/post_synth_util.rpt +if { $verbose } { + report_timing_summary -file $outputDir/post_synth_timing_summary.rpt + report_timing -file $outputDir/post_synth_timing.rpt +} + +# place +opt_design +place_design +phys_opt_design +report_utilization -file $outputDir/post_place_util.rpt + +if { $verbose } { + report_clock_utilization -file $outputDir/clock_util.rpt + report_timing_summary -file $outputDir/post_place_timing_summary.rpt + report_timing -file $outputDir/post_place_timing.rpt +} + +# route design and generate bitstream + +route_design -directive Explore +write_bitstream -force $outputDir/final.bit + +if { $verbose } { + report_route_status -file $outputDir/post_route_status.rpt + report_timing_summary -file $outputDir/post_route_timing_summary.rpt + report_timing -file $outputDir/post_route_timing.rpt + report_power -file $outputDir/post_route_power.rpt + report_drc -file $outputDir/post_imp_drc.rpt + write_verilog -force $outputDir/cpu_impl_netlist.v -mode timesim -sdf_anno true + # unfortunately, does nothing + show_schematic [ get_cells ] +} \ No newline at end of file diff --git a/ethernet_test.yml b/project_0/manta.yaml similarity index 62% rename from ethernet_test.yml rename to project_0/manta.yaml index 9ca6abf..4fd772f 100644 --- a/ethernet_test.yml +++ b/project_0/manta.yaml @@ -7,13 +7,17 @@ cores: dhcp_done: 1 dhcp_ip_address: 32 dhcp_timeout: 1 + led: 16 outputs: dhcp_start: 1 ip_address: 32 - + udp_port: 16 + udp0_ip_address: 32 + udp0_sink_data: 32 + udp0_sink_valid: 1 uart: port: "/dev/ttyUSB1" baudrate: 115200 - clock_freq: 12000000 + clock_freq: 50000000 diff --git a/project_0/manta_test.yaml b/project_0/manta_test.yaml new file mode 100644 index 0000000..a7a83c4 --- /dev/null +++ b/project_0/manta_test.yaml @@ -0,0 +1,12 @@ +--- +cores: + io_core: + type: io + + inputs: + foobar: 1 + + +ethernet: + desired_fpga_ip: "192.168.0.110" + host_ip: "192.168.0.100" diff --git a/project_0/stream.py b/project_0/stream.py new file mode 100644 index 0000000..038d43e --- /dev/null +++ b/project_0/stream.py @@ -0,0 +1,68 @@ +from manta import Manta +import socket +import time + + +def configure(ip_address, udp_port): + m = Manta("manta.yaml") + + # Compute IP address + octets = [bin(int(o))[2:].zfill(8) for o in ip_address.split(".")] + ip_binary = int("".join(octets), 2) + + # Set IP address + m.io_core.set_probe("ip_address", ip_binary) + m.io_core.set_probe("dhcp_start", 1) + m.io_core.set_probe("dhcp_start", 0) + while m.io_core.get_probe("dhcp_done") != 1: + pass + print(m.io_core.get_probe("dhcp_ip_address")) + + # Set UDP port + m.io_core.set_probe("udp_port", udp_port) + + +def leds_test(ip_address, udp_port): + m = Manta("manta.yaml") + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + for i in range(0xFF): + sock.sendto(int(i).to_bytes(1, byteorder="big"), (ip_address, udp_port)) + led = m.io_core.get_probe("led") + print(f"i:{i} led:{led}") + time.sleep(0.2) + + +def send_variable_length_test(): + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + for i in range(0xFF): + sock.sendto(int(i).to_bytes(i, byteorder="big"), (ip_address, udp_port)) + time.sleep(0.2) + + +def send_to_host_test(host_ip, udp_port): + m = Manta("manta.yaml") + + # Set UDP port + m.io_core.set_probe("udp_port", udp_port) + + # Compute and set destination IP address: + octets = [bin(int(o))[2:].zfill(8) for o in host_ip.split(".")] + ip_binary = int("".join(octets), 2) + m.io_core.set_probe("udp0_ip_address", ip_binary) + + # Send data + m.io_core.set_probe("udp0_sink_data", 0x21_43_65_87) + m.io_core.set_probe("udp0_sink_valid", 1) + m.io_core.set_probe("udp0_sink_valid", 0) + + +if __name__ == "__main__": + ip_address = "192.168.0.110" + udp_port = 42069 + + configure(ip_address, udp_port) + # time.sleep(0.2) + # for _ in range(64): + # send_to_host_test("192.168.0.107", 42069) + # leds_test(ip_address, udp_port) + send_variable_length_test() diff --git a/project_0/test.yml b/project_0/test.yml new file mode 100644 index 0000000..666a399 --- /dev/null +++ b/project_0/test.yml @@ -0,0 +1,28 @@ +# +# This file is part of LiteEth. +# +# Copyright (c) 2020-2022 Florent Kermarrec +# SPDX-License-Identifier: BSD-2-Clause + +# PHY -------------------------------------------------------------------------- +phy: LiteEthPHYRMII +vendor: xilinx +toolchain: vivado + +# Core ------------------------------------------------------------------------- +refclk_freq: 50e6 +clk_freq: 50e6 +core: udp +mac_address: 0x10e2d5000000 +dhcp: True +data_width: 8 + +# UDP Ports -------------------------------------------------------------------- +udp_ports: { + "udp0": { + "udp_port" : 2000, # Static Params. + "data_width" : 32, + "tx_fifo_depth" : 64, + "rx_fifo_depth" : 64, + }, +} diff --git a/project_0/xdc/top_level.xdc b/project_0/xdc/top_level.xdc new file mode 100644 index 0000000..7a77074 --- /dev/null +++ b/project_0/xdc/top_level.xdc @@ -0,0 +1,260 @@ +## R1.0 2019-08-27 +## Updated by jodalyst in 2020-2022 +## all inputs/outputs changed to lowercase; arrays start with zero. +## system clock renamed to clk_100mhz +## ja, jb, jc, jd renamed to 0-7 +## xa port renamed 0-3 +## seven segments renamed to a,b,c,d,e,f,dp + +## This file is a general .xdc for the Nexys4 DDR Rev. C +## To use it in a project: +## - uncomment the lines corresponding to used pins +## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project + +## Clock signal +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk_100mhz }]; #IO_L12P_T1_MRCC_35 Sch=clk_100mhz +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk_100mhz}]; + + +##Switches + +set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] +set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] +set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] +set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] + + +## LEDs + +set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] + +#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b +#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g +#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r +#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b +#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g +#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r + + +##7 segment display + +#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca +#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb +#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc +#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd +#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce +#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf +#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg + +#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp + +#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] +#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] +#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] +#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] +#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] +#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] +#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] +#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] + + +##Buttons + +#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn + +set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc +set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu +set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl +set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr +set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd + + +##Pmod Headers + + +##Pmod Header JA + +#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] +#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] +#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] +#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] +#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] +#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] +#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] +#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] + + +##Pmod Header JB + +#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] +#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] +#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] +#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] +#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] +#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] +#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] +#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] + + +##Pmod Header JC + +#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] +#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] +#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] +#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] +#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] +#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] +#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] +#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] + + +##Pmod Header JD + +#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] +#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] +#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] +#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] +#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] +#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] +#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] +#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] + + +##Pmod Header JXADC + +#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] +#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] +#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] +#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] +#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] +#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] +#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] +#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] + + +##VGA Connector + +#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] +#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] +#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] +#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] +# +#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] +#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] +#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] +#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] +# +#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] +#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] +#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] +#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] + +#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs +#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs + +##Micro SD Connector + +#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset +#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd +#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck +#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd +#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] +#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] +#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] +#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] + + +##Accelerometer + +#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso +#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi +#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk +#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn +#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] +#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] + + +##Temperature Sensor + +#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl +#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda +#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int +#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct + +##Omnidirectional Microphone + +#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk +#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data +#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel + + +##PWM Audio Amplifier + +#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm +#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd + + +##USB-RS232 Interface + +set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out +#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts +#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts + +##USB HID (PS/2) + +#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk +#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data + + +##SMSC Ethernet PHY + +set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc +set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio +set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn +set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv +set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr +set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] +set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] +set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen +set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] +set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] +set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk +set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn + + +##Quad SPI Flash + +#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] +#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] +#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] +#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] +#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn + diff --git a/project_1/build.tcl b/project_1/build.tcl new file mode 100644 index 0000000..d0441d6 --- /dev/null +++ b/project_1/build.tcl @@ -0,0 +1,65 @@ +#!/usr/bin/tclsh +# jay's build script +# pass -tclargs -d to generate diagnostics + +# switches + +set partNum xc7a100tcsg324-1 +set outputDir output_files +set verbose 0 + +if { $argc > 0 } { + if { $argc == 1 && [string compare [ lindex $argv 0 ] "-d"] == 0 } { + set verbose 1 + } else { + puts "usage: $argv0 \[-d\]" + exit 1 + } +} + +file mkdir $outputDir +set files [glob -nocomplain "$outputDir/*"] +if {[llength $files] != 0} { + file delete -force {*}[glob -directory $outputDir *]; +} + +read_verilog -sv [ glob ./src/*.{sv,v,svh,vh} ] +read_xdc ./xdc/top_level.xdc + +set_part $partNum + +# synth +synth_design -top top_level -part $partNum -verbose +report_utilization -file $outputDir/post_synth_util.rpt +if { $verbose } { + report_timing_summary -file $outputDir/post_synth_timing_summary.rpt + report_timing -file $outputDir/post_synth_timing.rpt +} + +# place +opt_design +place_design +phys_opt_design +report_utilization -file $outputDir/post_place_util.rpt + +if { $verbose } { + report_clock_utilization -file $outputDir/clock_util.rpt + report_timing_summary -file $outputDir/post_place_timing_summary.rpt + report_timing -file $outputDir/post_place_timing.rpt +} + +# route design and generate bitstream + +route_design -directive Explore +write_bitstream -force $outputDir/final.bit + +if { $verbose } { + report_route_status -file $outputDir/post_route_status.rpt + report_timing_summary -file $outputDir/post_route_timing_summary.rpt + report_timing -file $outputDir/post_route_timing.rpt + report_power -file $outputDir/post_route_power.rpt + report_drc -file $outputDir/post_imp_drc.rpt + write_verilog -force $outputDir/cpu_impl_netlist.v -mode timesim -sdf_anno true + # unfortunately, does nothing + show_schematic [ get_cells ] +} \ No newline at end of file diff --git a/project_1/liteeth_config.yml b/project_1/liteeth_config.yml new file mode 100644 index 0000000..666a399 --- /dev/null +++ b/project_1/liteeth_config.yml @@ -0,0 +1,28 @@ +# +# This file is part of LiteEth. +# +# Copyright (c) 2020-2022 Florent Kermarrec +# SPDX-License-Identifier: BSD-2-Clause + +# PHY -------------------------------------------------------------------------- +phy: LiteEthPHYRMII +vendor: xilinx +toolchain: vivado + +# Core ------------------------------------------------------------------------- +refclk_freq: 50e6 +clk_freq: 50e6 +core: udp +mac_address: 0x10e2d5000000 +dhcp: True +data_width: 8 + +# UDP Ports -------------------------------------------------------------------- +udp_ports: { + "udp0": { + "udp_port" : 2000, # Static Params. + "data_width" : 32, + "tx_fifo_depth" : 64, + "rx_fifo_depth" : 64, + }, +} diff --git a/project_1/manta.yaml b/project_1/manta.yaml new file mode 100644 index 0000000..1e9cc7a --- /dev/null +++ b/project_1/manta.yaml @@ -0,0 +1,15 @@ +--- +cores: + io_core: + type: io + + inputs: + sw: 16 + + outputs: + led: 16 + +ethernet: + desired_fpga_ip: "192.168.0.110" + host_ip: "192.168.0.107" + udp_port: 42069 diff --git a/project_1/stream.py b/project_1/stream.py new file mode 100644 index 0000000..5a3c542 --- /dev/null +++ b/project_1/stream.py @@ -0,0 +1,17 @@ +from manta import Manta +import socket +import time + +if __name__ == "__main__": + ip_address = "192.168.0.110" + udp_port = 42069 + + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + + for i in range(256): + data = [0, 0] + data = [int(d).to_bytes(4, byteorder="big") for d in data] + data = b"".join(data) + print(data) + sock.sendto(data, (ip_address, udp_port)) + # time.sleep(0.2) diff --git a/project_1/xdc/top_level.xdc b/project_1/xdc/top_level.xdc new file mode 100644 index 0000000..7a77074 --- /dev/null +++ b/project_1/xdc/top_level.xdc @@ -0,0 +1,260 @@ +## R1.0 2019-08-27 +## Updated by jodalyst in 2020-2022 +## all inputs/outputs changed to lowercase; arrays start with zero. +## system clock renamed to clk_100mhz +## ja, jb, jc, jd renamed to 0-7 +## xa port renamed 0-3 +## seven segments renamed to a,b,c,d,e,f,dp + +## This file is a general .xdc for the Nexys4 DDR Rev. C +## To use it in a project: +## - uncomment the lines corresponding to used pins +## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project + +## Clock signal +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk_100mhz }]; #IO_L12P_T1_MRCC_35 Sch=clk_100mhz +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk_100mhz}]; + + +##Switches + +set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] +set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] +set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] +set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] + + +## LEDs + +set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] + +#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b +#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g +#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r +#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b +#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g +#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r + + +##7 segment display + +#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca +#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb +#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc +#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd +#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce +#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf +#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg + +#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp + +#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] +#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] +#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] +#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] +#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] +#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] +#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] +#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] + + +##Buttons + +#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn + +set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc +set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu +set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl +set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr +set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd + + +##Pmod Headers + + +##Pmod Header JA + +#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] +#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] +#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] +#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] +#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] +#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] +#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] +#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] + + +##Pmod Header JB + +#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] +#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] +#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] +#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] +#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] +#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] +#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] +#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] + + +##Pmod Header JC + +#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] +#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] +#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] +#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] +#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] +#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] +#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] +#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] + + +##Pmod Header JD + +#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] +#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] +#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] +#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] +#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] +#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] +#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] +#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] + + +##Pmod Header JXADC + +#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] +#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] +#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] +#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] +#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] +#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] +#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] +#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] + + +##VGA Connector + +#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] +#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] +#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] +#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] +# +#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] +#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] +#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] +#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] +# +#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] +#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] +#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] +#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] + +#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs +#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs + +##Micro SD Connector + +#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset +#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd +#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck +#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd +#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] +#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] +#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] +#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] + + +##Accelerometer + +#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso +#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi +#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk +#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn +#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] +#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] + + +##Temperature Sensor + +#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl +#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda +#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int +#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct + +##Omnidirectional Microphone + +#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk +#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data +#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel + + +##PWM Audio Amplifier + +#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm +#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd + + +##USB-RS232 Interface + +set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out +#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts +#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts + +##USB HID (PS/2) + +#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk +#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data + + +##SMSC Ethernet PHY + +set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc +set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio +set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn +set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv +set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr +set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] +set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] +set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen +set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] +set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] +set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk +set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn + + +##Quad SPI Flash + +#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] +#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] +#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] +#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] +#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn + diff --git a/src/manta/ethernet.py b/src/manta/ethernet.py new file mode 100644 index 0000000..ae348b5 --- /dev/null +++ b/src/manta/ethernet.py @@ -0,0 +1,171 @@ +from amaranth import * +from manta.utils import * + + +class EthernetInterface(Elaboratable): + def __init__(self, config): + self.desired_fpga_ip = config["desired_fpga_ip"] + self.host_ip = config["host_ip"] + self.udp_port = config["udp_port"] + + self.bus_i = Signal(InternalBus()) + self.bus_o = Signal(InternalBus()) + + self.rmii_clocks_ref_clk = Signal() + self.rmii_crs_dv = Signal() + self.rmii_mdc = Signal() + self.rmii_mdio = Signal() + self.rmii_rst_n = Signal() + self.rmii_rx_data = Signal(2) + self.rmii_tx_data = Signal(2) + self.rmii_tx_en = Signal() + + self.dhcp_start = Signal() + self.dhcp_timer = Signal(range(int(100e6))) + + self.source_data = Signal(32) + self.source_last = Signal() + self.source_ready = Signal() + self.source_valid = Signal() + + self.sink_data = Signal(32) + self.sink_last = Signal() + self.sink_ready = Signal() + self.sink_valid = Signal() + + def get_top_level_ports(self): + ports = [ + self.rmii_clocks_ref_clk, + self.rmii_crs_dv, + self.rmii_mdc, + self.rmii_mdio, + self.rmii_rst_n, + self.rmii_rx_data, + self.rmii_tx_data, + self.rmii_tx_en, + ] + return ports + + def binarize_ip_addr(self, ip_addr): + octets = [bin(int(o))[2:].zfill(8) for o in ip_addr.split(".")] + return int("".join(octets), 2) + + def elaborate(self, platform): + m = Module() + + with m.If(self.dhcp_timer < 15): + m.d.sync += self.dhcp_timer.eq(self.dhcp_timer + 1) + + m.d.sync += self.dhcp_start.eq(self.dhcp_timer == 14) + + m.submodules.liteeth = Instance( + "liteeth_core", + ("i", "sys_clock", ClockSignal()), + ("i", "sys_reset", ResetSignal()), + # PHY connection + ("i", "rmii_clocks_ref_clk", self.rmii_clocks_ref_clk), + ("i", "rmii_crs_dv", self.rmii_crs_dv), + ("o", "rmii_mdc", self.rmii_mdc), + ("io", "rmii_mdio", self.rmii_mdio), + ("o", "rmii_rst_n", self.rmii_rst_n), + ("i", "rmii_rx_data", self.rmii_rx_data), + ("o", "rmii_tx_data", self.rmii_tx_data), + ("o", "rmii_tx_en", self.rmii_tx_en), + # DHCP + # ("o", "dhcp_done", 1), + # ("o", "dhcp_ip_address", 1), + ("i", "dhcp_start", self.dhcp_start), + # ("o", "dhcp_timeout", 1), + ("i", "ip_address", self.binarize_ip_addr(self.desired_fpga_ip)), + # UDP Port + ("i", "udp0_udp_port", self.udp_port), + # UDP from host + ("o", "udp0_source_data", self.source_data), + # ("o", "udp0_source_error", 1), + ("o", "udp0_source_last", self.source_last), + ("i", "udp0_source_ready", self.source_ready), + ("o", "udp0_source_valid", self.source_valid), + # UDP back to host + ("i", "udp0_ip_address", self.binarize_ip_addr(self.host_ip)), + ("i", "udp0_sink_data", self.sink_data), + ("i", "udp0_sink_last", self.sink_last), + ("o", "udp0_sink_ready", self.sink_ready), + ("i", "udp0_sink_valid", self.sink_valid), + ) + + m.submodules.source_bridge = source_bridge = UDPSourceBridge() + m.submodules.sink_bridge = sink_bridge = UDPSinkBridge() + + m.d.comb += source_bridge.data_i.eq(self.source_data) + m.d.comb += source_bridge.last_i.eq(self.source_last) + m.d.comb += self.source_ready.eq(source_bridge.ready_o) + m.d.comb += source_bridge.valid_i.eq(self.source_valid) + + m.d.comb += self.sink_data.eq(sink_bridge.data_o) + m.d.comb += self.sink_last.eq(sink_bridge.last_o) + m.d.comb += sink_bridge.ready_i.eq(self.sink_ready) + m.d.comb += self.sink_valid.eq(sink_bridge.valid_o) + + m.d.comb += sink_bridge.bus_i.eq(self.bus_i) + m.d.comb += self.bus_o.eq(source_bridge.bus_o) + + return m + + +class UDPSourceBridge(Elaboratable): + def __init__(self): + self.bus_o = Signal(InternalBus()) + + self.data_i = Signal(32) + self.last_i = Signal() + self.ready_o = Signal() + self.valid_i = Signal() + + def elaborate(self, platform): + m = Module() + + state = Signal() # can either be 0, for read/write, or 1, for data + rw_buf = Signal().like(self.bus_o.rw) + + # Can always take more data + m.d.sync += self.ready_o.eq(1) + + m.d.sync += self.bus_o.eq(0) + with m.If(self.valid_i): + m.d.sync += state.eq(~state) + + with m.If(state == 0): + m.d.sync += rw_buf.eq(self.data_i) + + with m.Else(): + m.d.sync += self.bus_o.addr.eq(self.data_i[:16]) + m.d.sync += self.bus_o.data.eq(self.data_i[16:]) + m.d.sync += self.bus_o.rw.eq(rw_buf) + m.d.sync += self.bus_o.valid.eq(1) + # m.d.sync += self.bus_o.last.eq(self.last_i) + + return m + + +class UDPSinkBridge(Elaboratable): + def __init__(self): + self.bus_i = Signal(InternalBus()) + + self.data_o = Signal(32) + self.last_o = Signal() + self.ready_i = Signal() + self.valid_o = Signal() + + def elaborate(self, platform): + m = Module() + + m.d.sync += self.data_o.eq(0) + m.d.sync += self.last_o.eq(0) + m.d.sync += self.valid_o.eq(0) + + with m.If(self.bus_i.valid): + m.d.sync += self.data_o.eq(self.bus_i.data) + # m.d.sync += self.last_o.eq(self.bus_i.last) + m.d.sync += self.valid_o.eq(1) + + return m diff --git a/src/manta/io_core.py b/src/manta/io_core.py index 08e7633..40009df 100644 --- a/src/manta/io_core.py +++ b/src/manta/io_core.py @@ -214,11 +214,13 @@ class IOCore(Elaboratable): def get_top_level_ports(self): ports = [] - for name in self.config["inputs"].keys(): - ports.append(getattr(self, name)) + if "inputs" in self.config: + for name in self.config["inputs"].keys(): + ports.append(getattr(self, name)) - for name in self.config["outputs"].keys(): - ports.append(getattr(self, name)) + if "outputs" in self.config: + for name in self.config["outputs"].keys(): + ports.append(getattr(self, name)) return ports diff --git a/src/manta/manta.py b/src/manta/manta.py index 8e9e997..c503fd2 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -1,7 +1,7 @@ from amaranth import * from .uart import UARTInterface -# from .ethernet import EthernetInterface +from .ethernet import EthernetInterface from .io_core import IOCore from .memory_core import ReadOnlyMemoryCore from .logic_analyzer import LogicAnalyzerCore diff --git a/src/manta/utils.py b/src/manta/utils.py index 98ae766..7aa3625 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -11,7 +11,14 @@ class InternalBus(data.StructLayout): """ def __init__(self): - super().__init__({"addr": 16, "data": 16, "rw": 1, "valid": 1}) + super().__init__( + { + "addr": 16, + "data": 16, + "rw": 1, + "valid": 1, + } + ) def warn(message): diff --git a/test/test_source_bridge_sim.py b/test/test_source_bridge_sim.py new file mode 100644 index 0000000..031dec8 --- /dev/null +++ b/test/test_source_bridge_sim.py @@ -0,0 +1,39 @@ +from amaranth.sim import Simulator +from manta.ethernet import UDPSourceBridge +from manta.utils import * + + +source_bridge = UDPSourceBridge() + + +def test_normie_ops(): + def testbench(): + yield source_bridge.data_i.eq(0) + yield source_bridge.last_i.eq(0) + yield source_bridge.valid_i.eq(0) + yield + yield + + yield source_bridge.data_i.eq(0x0000_0001) + yield source_bridge.valid_i.eq(1) + yield + yield source_bridge.data_i.eq(0x1234_5678) + yield + yield source_bridge.valid_i.eq(0) + yield + yield + + yield source_bridge.valid_i.eq(1) + yield source_bridge.data_i.eq(0x0000_0001) + yield + yield source_bridge.data_i.eq(0x90AB_CDEF) + yield + yield source_bridge.data_i.eq(0x0000_0000) + yield + yield source_bridge.data_i.eq(0x1234_5678) + yield + yield source_bridge.valid_i.eq(0) + yield + yield + + simulate(source_bridge, testbench, "source_bridge.vcd") From a5afad69927f281dd5903ed09e4dd55f88c79ac4 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 4 Feb 2024 14:29:39 -0800 Subject: [PATCH 40/89] io core with ethernet working! --- .gitignore | 12 +++++- project_0/stream.py | 2 +- project_1/manta.yaml | 16 ++++++- project_1/stream.py | 49 +++++++++++++++------ project_1/test.py | 5 +++ src/manta/ethernet.py | 87 +++++++++++++++++++++++++++++++++++--- src/manta/uart/__init__.py | 5 ++- src/manta/utils.py | 1 + 8 files changed, 151 insertions(+), 26 deletions(-) create mode 100644 project_1/test.py diff --git a/.gitignore b/.gitignore index e85d6af..5dc2efa 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,14 @@ build/ *.v *.sv *.vcd -*.out \ No newline at end of file +*.out + +# Vivado files from the occasional debugging sesh +*.log +*.jou +*.rpt +*.bin +*.bit +*.out +*.xdc +.Xil/* \ No newline at end of file diff --git a/project_0/stream.py b/project_0/stream.py index 038d43e..82a17c8 100644 --- a/project_0/stream.py +++ b/project_0/stream.py @@ -65,4 +65,4 @@ if __name__ == "__main__": # for _ in range(64): # send_to_host_test("192.168.0.107", 42069) # leds_test(ip_address, udp_port) - send_variable_length_test() + # send_variable_length_test() diff --git a/project_1/manta.yaml b/project_1/manta.yaml index 1e9cc7a..23f7b6d 100644 --- a/project_1/manta.yaml +++ b/project_1/manta.yaml @@ -10,6 +10,18 @@ cores: led: 16 ethernet: - desired_fpga_ip: "192.168.0.110" - host_ip: "192.168.0.107" + phy: LiteEthPHYRMII + vendor: xilinx + toolchain: vivado + + refclk_freq: 50e6 + clk_freq: 50e6 + + fpga_ip_addr: "192.168.0.110" + host_ip_addr: "192.168.0.100" udp_port: 42069 + + core: udp # we handle this + mac_address: # this should be optional + dhcp: # should be optional, default to true? + data_width: 32 # using DHCP will force this to 32, but for ease of use we should design for that even for static IP devices diff --git a/project_1/stream.py b/project_1/stream.py index 5a3c542..ae56e49 100644 --- a/project_1/stream.py +++ b/project_1/stream.py @@ -1,17 +1,40 @@ -from manta import Manta import socket -import time - -if __name__ == "__main__": - ip_address = "192.168.0.110" - udp_port = 42069 +def write(addrs, datas): + bytes_out = b"" + for addr, data in zip(addrs, datas): + bytes_out += int(1).to_bytes(4, byteorder="little") + bytes_out += int(addr).to_bytes(2, byteorder="little") + bytes_out += int(data).to_bytes(2, byteorder="little") sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + sock.sendto(bytes_out, (fpga_ip_addr, udp_port)) - for i in range(256): - data = [0, 0] - data = [int(d).to_bytes(4, byteorder="big") for d in data] - data = b"".join(data) - print(data) - sock.sendto(data, (ip_address, udp_port)) - # time.sleep(0.2) +def read(addrs): + bytes_out = b"" + for addr in addrs: + bytes_out += int(0).to_bytes(4, byteorder="little") + bytes_out += int(addr).to_bytes(2, byteorder="little") + bytes_out += int(0).to_bytes(2, byteorder="little") + + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + sock.bind((host_ip_addr, udp_port)) + sock.sendto(bytes_out, (fpga_ip_addr, udp_port)) + data, addr = sock.recvfrom(1024) + + return int.from_bytes(data, "little") + +if __name__ == "__main__": + host_ip_addr = "192.168.0.100" + fpga_ip_addr = "192.168.0.110" + udp_port = 42069 + + for i in range(2**16): + write([0x0000],[0x0000]) + write([0x0000],[0x0001]) + write([0x0000],[0x0000]) + write([0x0002],[i]) + # print(read([0x0002])) + # write([0x0002],[0b0101_0101_0101_0101]) + # write([0x0000],[0x0000]) + # write([0x0000],[0x0001]) + # write([0x0000],[0x0000]) diff --git a/project_1/test.py b/project_1/test.py new file mode 100644 index 0000000..3a725ad --- /dev/null +++ b/project_1/test.py @@ -0,0 +1,5 @@ +from manta import Manta +m = Manta("manta.yaml") + +print(bin(m.io_core.get_probe("sw"))) +m.io_core.set_probe("led", 4) \ No newline at end of file diff --git a/src/manta/ethernet.py b/src/manta/ethernet.py index ae348b5..9f174fd 100644 --- a/src/manta/ethernet.py +++ b/src/manta/ethernet.py @@ -1,11 +1,12 @@ from amaranth import * from manta.utils import * +import socket class EthernetInterface(Elaboratable): def __init__(self, config): - self.desired_fpga_ip = config["desired_fpga_ip"] - self.host_ip = config["host_ip"] + self.fpga_ip_addr = config["fpga_ip_addr"] + self.host_ip_addr = config["host_ip_addr"] self.udp_port = config["udp_port"] self.bus_i = Signal(InternalBus()) @@ -76,7 +77,7 @@ class EthernetInterface(Elaboratable): # ("o", "dhcp_ip_address", 1), ("i", "dhcp_start", self.dhcp_start), # ("o", "dhcp_timeout", 1), - ("i", "ip_address", self.binarize_ip_addr(self.desired_fpga_ip)), + ("i", "ip_address", self.binarize_ip_addr(self.fpga_ip_addr)), # UDP Port ("i", "udp0_udp_port", self.udp_port), # UDP from host @@ -86,7 +87,7 @@ class EthernetInterface(Elaboratable): ("i", "udp0_source_ready", self.source_ready), ("o", "udp0_source_valid", self.source_valid), # UDP back to host - ("i", "udp0_ip_address", self.binarize_ip_addr(self.host_ip)), + ("i", "udp0_ip_address", self.binarize_ip_addr(self.host_ip_addr)), ("i", "udp0_sink_data", self.sink_data), ("i", "udp0_sink_last", self.sink_last), ("o", "udp0_sink_ready", self.sink_ready), @@ -111,6 +112,78 @@ class EthernetInterface(Elaboratable): return m + def read(self, addrs): + """ + Read the data stored in a set of address on Manta's internal memory. Addresses + must be specified as either integers or a list of integers. + """ + + # Handle a single integer address + if isinstance(addrs, int): + return self.read([addrs])[0] + + # Make sure all list elements are integers + if not all(isinstance(a, int) for a in addrs): + raise ValueError("Read address must be an integer or list of integers.") + + # Send read requests, and get responses + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + sock.bind((self.host_ip_addr, self.udp_port)) + chunk_size = 128 + addr_chunks = split_into_chunks(addrs, chunk_size) + datas = [] + + for addr_chunk in addr_chunks: + bytes_out = b"" + for addr in addr_chunk: + bytes_out += int(0).to_bytes(4, byteorder="little") + bytes_out += int(addr).to_bytes(2, byteorder="little") + bytes_out += int(0).to_bytes(2, byteorder="little") + + sock.sendto(bytes_out, (self.fpga_ip_addr, self.udp_port)) + data, addr = sock.recvfrom(4 * chunk_size) + + # Split into groups of four bytes + datas += [int.from_bytes(d, "little") for d in split_into_chunks(data, 4)] + + return datas + + def write(self, addrs, datas): + """ + Write the provided data into the provided addresses in Manta's internal memory. + Addresses and data must be specified as either integers or a list of integers. + """ + + # Handle a single integer address and data + if isinstance(addrs, int) and isinstance(datas, int): + return self.write([addrs], [datas]) + + # Make sure address and datas are all integers + if not isinstance(addrs, list) or not isinstance(datas, list): + raise ValueError( + "Write addresses and data must be an integer or list of integers." + ) + + if not all(isinstance(a, int) for a in addrs): + raise ValueError("Write addresses must be all be integers.") + + if not all(isinstance(d, int) for d in datas): + raise ValueError("Write data must all be integers.") + + # Since the FPGA doesn't issue any responses to write requests, we + # the host's input buffer isn't written to, and we don't need to + # send the data as chunks as the to avoid overflowing the input buffer. + + # Encode addrs and datas into write requests + bytes_out = b"" + for addr, data in zip(addrs, datas): + bytes_out += int(1).to_bytes(4, byteorder="little") + bytes_out += int(addr).to_bytes(2, byteorder="little") + bytes_out += int(data).to_bytes(2, byteorder="little") + + sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + sock.sendto(bytes_out, (self.fpga_ip_addr, self.udp_port)) + class UDPSourceBridge(Elaboratable): def __init__(self): @@ -142,7 +215,7 @@ class UDPSourceBridge(Elaboratable): m.d.sync += self.bus_o.data.eq(self.data_i[16:]) m.d.sync += self.bus_o.rw.eq(rw_buf) m.d.sync += self.bus_o.valid.eq(1) - # m.d.sync += self.bus_o.last.eq(self.last_i) + m.d.sync += self.bus_o.last.eq(self.last_i) return m @@ -163,9 +236,9 @@ class UDPSinkBridge(Elaboratable): m.d.sync += self.last_o.eq(0) m.d.sync += self.valid_o.eq(0) - with m.If(self.bus_i.valid): + with m.If( (self.bus_i.valid) & (~self.bus_i.rw)): m.d.sync += self.data_o.eq(self.bus_i.data) - # m.d.sync += self.last_o.eq(self.bus_i.last) + m.d.sync += self.last_o.eq(self.bus_i.last) m.d.sync += self.valid_o.eq(1) return m diff --git a/src/manta/uart/__init__.py b/src/manta/uart/__init__.py index 4cfbeef..a735897 100644 --- a/src/manta/uart/__init__.py +++ b/src/manta/uart/__init__.py @@ -179,8 +179,9 @@ class UARTInterface(Elaboratable): if not all(isinstance(d, int) for d in datas): raise ValueError("Write data must all be integers.") - # I'm not sure if it's necessary to split outputs into chunks - # I think the output buffer doesn't really drop stuff, just the input buffer + # Since the FPGA doesn't issue any responses to write requests, we + # the host's input buffer isn't written to, and we don't need to + # send the data as chunks as the to avoid overflowing the input buffer. # Encode addrs and datas into write requests bytes_out = "".join([f"W{a:04X}{d:04X}\r\n" for a, d in zip(addrs, datas)]) diff --git a/src/manta/utils.py b/src/manta/utils.py index 7aa3625..1e63bcb 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -17,6 +17,7 @@ class InternalBus(data.StructLayout): "data": 16, "rw": 1, "valid": 1, + "last": 1, } ) From 24ee956d6cda395f138357d61fad971c60669ff9 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Fri, 9 Feb 2024 18:58:02 -0800 Subject: [PATCH 41/89] add liteeth wrapper --- project_0/build.tcl | 65 -- project_0/manta.yaml | 23 - project_0/manta_test.yaml | 12 - project_0/stream.py | 68 -- project_0/test.yml | 28 - project_0/xdc/top_level.xdc | 260 -------- project_1/build.tcl | 65 -- project_1/liteeth_config.yml | 28 - project_1/manta.yaml | 27 - project_1/stream.py | 40 -- project_1/test.py | 5 - project_1/xdc/top_level.xdc | 260 -------- pyproject.toml | 1 + src/manta/cli.py | 11 +- .../{ethernet.py => ethernet/__init__.py} | 101 ++- src/manta/ethernet/liteeth_gen.py | 611 ++++++++++++++++++ src/manta/ethernet/sink_bridge.py | 26 + src/manta/ethernet/source_bridge.py | 37 ++ src/manta/manta.py | 22 + 19 files changed, 741 insertions(+), 949 deletions(-) delete mode 100644 project_0/build.tcl delete mode 100644 project_0/manta.yaml delete mode 100644 project_0/manta_test.yaml delete mode 100644 project_0/stream.py delete mode 100644 project_0/test.yml delete mode 100644 project_0/xdc/top_level.xdc delete mode 100644 project_1/build.tcl delete mode 100644 project_1/liteeth_config.yml delete mode 100644 project_1/manta.yaml delete mode 100644 project_1/stream.py delete mode 100644 project_1/test.py delete mode 100644 project_1/xdc/top_level.xdc rename src/manta/{ethernet.py => ethernet/__init__.py} (79%) create mode 100755 src/manta/ethernet/liteeth_gen.py create mode 100644 src/manta/ethernet/sink_bridge.py create mode 100644 src/manta/ethernet/source_bridge.py diff --git a/project_0/build.tcl b/project_0/build.tcl deleted file mode 100644 index d0441d6..0000000 --- a/project_0/build.tcl +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/tclsh -# jay's build script -# pass -tclargs -d to generate diagnostics - -# switches - -set partNum xc7a100tcsg324-1 -set outputDir output_files -set verbose 0 - -if { $argc > 0 } { - if { $argc == 1 && [string compare [ lindex $argv 0 ] "-d"] == 0 } { - set verbose 1 - } else { - puts "usage: $argv0 \[-d\]" - exit 1 - } -} - -file mkdir $outputDir -set files [glob -nocomplain "$outputDir/*"] -if {[llength $files] != 0} { - file delete -force {*}[glob -directory $outputDir *]; -} - -read_verilog -sv [ glob ./src/*.{sv,v,svh,vh} ] -read_xdc ./xdc/top_level.xdc - -set_part $partNum - -# synth -synth_design -top top_level -part $partNum -verbose -report_utilization -file $outputDir/post_synth_util.rpt -if { $verbose } { - report_timing_summary -file $outputDir/post_synth_timing_summary.rpt - report_timing -file $outputDir/post_synth_timing.rpt -} - -# place -opt_design -place_design -phys_opt_design -report_utilization -file $outputDir/post_place_util.rpt - -if { $verbose } { - report_clock_utilization -file $outputDir/clock_util.rpt - report_timing_summary -file $outputDir/post_place_timing_summary.rpt - report_timing -file $outputDir/post_place_timing.rpt -} - -# route design and generate bitstream - -route_design -directive Explore -write_bitstream -force $outputDir/final.bit - -if { $verbose } { - report_route_status -file $outputDir/post_route_status.rpt - report_timing_summary -file $outputDir/post_route_timing_summary.rpt - report_timing -file $outputDir/post_route_timing.rpt - report_power -file $outputDir/post_route_power.rpt - report_drc -file $outputDir/post_imp_drc.rpt - write_verilog -force $outputDir/cpu_impl_netlist.v -mode timesim -sdf_anno true - # unfortunately, does nothing - show_schematic [ get_cells ] -} \ No newline at end of file diff --git a/project_0/manta.yaml b/project_0/manta.yaml deleted file mode 100644 index 4fd772f..0000000 --- a/project_0/manta.yaml +++ /dev/null @@ -1,23 +0,0 @@ ---- -cores: - io_core: - type: io - - inputs: - dhcp_done: 1 - dhcp_ip_address: 32 - dhcp_timeout: 1 - led: 16 - - outputs: - dhcp_start: 1 - ip_address: 32 - udp_port: 16 - udp0_ip_address: 32 - udp0_sink_data: 32 - udp0_sink_valid: 1 - -uart: - port: "/dev/ttyUSB1" - baudrate: 115200 - clock_freq: 50000000 diff --git a/project_0/manta_test.yaml b/project_0/manta_test.yaml deleted file mode 100644 index a7a83c4..0000000 --- a/project_0/manta_test.yaml +++ /dev/null @@ -1,12 +0,0 @@ ---- -cores: - io_core: - type: io - - inputs: - foobar: 1 - - -ethernet: - desired_fpga_ip: "192.168.0.110" - host_ip: "192.168.0.100" diff --git a/project_0/stream.py b/project_0/stream.py deleted file mode 100644 index 82a17c8..0000000 --- a/project_0/stream.py +++ /dev/null @@ -1,68 +0,0 @@ -from manta import Manta -import socket -import time - - -def configure(ip_address, udp_port): - m = Manta("manta.yaml") - - # Compute IP address - octets = [bin(int(o))[2:].zfill(8) for o in ip_address.split(".")] - ip_binary = int("".join(octets), 2) - - # Set IP address - m.io_core.set_probe("ip_address", ip_binary) - m.io_core.set_probe("dhcp_start", 1) - m.io_core.set_probe("dhcp_start", 0) - while m.io_core.get_probe("dhcp_done") != 1: - pass - print(m.io_core.get_probe("dhcp_ip_address")) - - # Set UDP port - m.io_core.set_probe("udp_port", udp_port) - - -def leds_test(ip_address, udp_port): - m = Manta("manta.yaml") - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - for i in range(0xFF): - sock.sendto(int(i).to_bytes(1, byteorder="big"), (ip_address, udp_port)) - led = m.io_core.get_probe("led") - print(f"i:{i} led:{led}") - time.sleep(0.2) - - -def send_variable_length_test(): - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - for i in range(0xFF): - sock.sendto(int(i).to_bytes(i, byteorder="big"), (ip_address, udp_port)) - time.sleep(0.2) - - -def send_to_host_test(host_ip, udp_port): - m = Manta("manta.yaml") - - # Set UDP port - m.io_core.set_probe("udp_port", udp_port) - - # Compute and set destination IP address: - octets = [bin(int(o))[2:].zfill(8) for o in host_ip.split(".")] - ip_binary = int("".join(octets), 2) - m.io_core.set_probe("udp0_ip_address", ip_binary) - - # Send data - m.io_core.set_probe("udp0_sink_data", 0x21_43_65_87) - m.io_core.set_probe("udp0_sink_valid", 1) - m.io_core.set_probe("udp0_sink_valid", 0) - - -if __name__ == "__main__": - ip_address = "192.168.0.110" - udp_port = 42069 - - configure(ip_address, udp_port) - # time.sleep(0.2) - # for _ in range(64): - # send_to_host_test("192.168.0.107", 42069) - # leds_test(ip_address, udp_port) - # send_variable_length_test() diff --git a/project_0/test.yml b/project_0/test.yml deleted file mode 100644 index 666a399..0000000 --- a/project_0/test.yml +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is part of LiteEth. -# -# Copyright (c) 2020-2022 Florent Kermarrec -# SPDX-License-Identifier: BSD-2-Clause - -# PHY -------------------------------------------------------------------------- -phy: LiteEthPHYRMII -vendor: xilinx -toolchain: vivado - -# Core ------------------------------------------------------------------------- -refclk_freq: 50e6 -clk_freq: 50e6 -core: udp -mac_address: 0x10e2d5000000 -dhcp: True -data_width: 8 - -# UDP Ports -------------------------------------------------------------------- -udp_ports: { - "udp0": { - "udp_port" : 2000, # Static Params. - "data_width" : 32, - "tx_fifo_depth" : 64, - "rx_fifo_depth" : 64, - }, -} diff --git a/project_0/xdc/top_level.xdc b/project_0/xdc/top_level.xdc deleted file mode 100644 index 7a77074..0000000 --- a/project_0/xdc/top_level.xdc +++ /dev/null @@ -1,260 +0,0 @@ -## R1.0 2019-08-27 -## Updated by jodalyst in 2020-2022 -## all inputs/outputs changed to lowercase; arrays start with zero. -## system clock renamed to clk_100mhz -## ja, jb, jc, jd renamed to 0-7 -## xa port renamed 0-3 -## seven segments renamed to a,b,c,d,e,f,dp - -## This file is a general .xdc for the Nexys4 DDR Rev. C -## To use it in a project: -## - uncomment the lines corresponding to used pins -## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project - -## Clock signal -set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk_100mhz }]; #IO_L12P_T1_MRCC_35 Sch=clk_100mhz -create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk_100mhz}]; - - -##Switches - -set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] -set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] -set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] -set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] -set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] -set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] -set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] -set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] -set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] -set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] -set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] -set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] -set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] -set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] -set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] -set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] - - -## LEDs - -set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] -set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] -set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] -set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] -set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] -set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] -set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] -set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] -set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] -set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] -set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] -set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] -set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] -set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] -set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] -set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] - -#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b -#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g -#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r -#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b -#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g -#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r - - -##7 segment display - -#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca -#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb -#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc -#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd -#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce -#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf -#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg - -#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp - -#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] -#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] -#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] -#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] -#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] -#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] -#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] -#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] - - -##Buttons - -#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn - -set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc -set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu -set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl -set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr -set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd - - -##Pmod Headers - - -##Pmod Header JA - -#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] -#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] -#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] -#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] -#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] -#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] -#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] -#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] - - -##Pmod Header JB - -#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] -#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] -#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] -#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] -#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] -#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] -#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] -#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] - - -##Pmod Header JC - -#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] -#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] -#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] -#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] -#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] -#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] -#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] -#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] - - -##Pmod Header JD - -#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] -#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] -#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] -#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] -#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] -#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] -#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] -#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] - - -##Pmod Header JXADC - -#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] -#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] -#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] -#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] -#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] -#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] -#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] -#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] - - -##VGA Connector - -#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] -#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] -#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] -#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] -# -#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] -#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] -#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] -#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] -# -#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] -#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] -#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] -#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] - -#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs -#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs - -##Micro SD Connector - -#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset -#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd -#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck -#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd -#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] -#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] -#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] -#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] - - -##Accelerometer - -#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso -#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi -#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk -#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn -#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] -#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] - - -##Temperature Sensor - -#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl -#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda -#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int -#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct - -##Omnidirectional Microphone - -#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk -#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data -#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel - - -##PWM Audio Amplifier - -#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm -#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd - - -##USB-RS232 Interface - -set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in -set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out -#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts -#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts - -##USB HID (PS/2) - -#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk -#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data - - -##SMSC Ethernet PHY - -set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc -set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio -set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn -set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv -set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr -set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] -set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] -set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen -set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] -set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] -set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk -set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn - - -##Quad SPI Flash - -#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] -#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] -#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] -#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] -#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn - diff --git a/project_1/build.tcl b/project_1/build.tcl deleted file mode 100644 index d0441d6..0000000 --- a/project_1/build.tcl +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/tclsh -# jay's build script -# pass -tclargs -d to generate diagnostics - -# switches - -set partNum xc7a100tcsg324-1 -set outputDir output_files -set verbose 0 - -if { $argc > 0 } { - if { $argc == 1 && [string compare [ lindex $argv 0 ] "-d"] == 0 } { - set verbose 1 - } else { - puts "usage: $argv0 \[-d\]" - exit 1 - } -} - -file mkdir $outputDir -set files [glob -nocomplain "$outputDir/*"] -if {[llength $files] != 0} { - file delete -force {*}[glob -directory $outputDir *]; -} - -read_verilog -sv [ glob ./src/*.{sv,v,svh,vh} ] -read_xdc ./xdc/top_level.xdc - -set_part $partNum - -# synth -synth_design -top top_level -part $partNum -verbose -report_utilization -file $outputDir/post_synth_util.rpt -if { $verbose } { - report_timing_summary -file $outputDir/post_synth_timing_summary.rpt - report_timing -file $outputDir/post_synth_timing.rpt -} - -# place -opt_design -place_design -phys_opt_design -report_utilization -file $outputDir/post_place_util.rpt - -if { $verbose } { - report_clock_utilization -file $outputDir/clock_util.rpt - report_timing_summary -file $outputDir/post_place_timing_summary.rpt - report_timing -file $outputDir/post_place_timing.rpt -} - -# route design and generate bitstream - -route_design -directive Explore -write_bitstream -force $outputDir/final.bit - -if { $verbose } { - report_route_status -file $outputDir/post_route_status.rpt - report_timing_summary -file $outputDir/post_route_timing_summary.rpt - report_timing -file $outputDir/post_route_timing.rpt - report_power -file $outputDir/post_route_power.rpt - report_drc -file $outputDir/post_imp_drc.rpt - write_verilog -force $outputDir/cpu_impl_netlist.v -mode timesim -sdf_anno true - # unfortunately, does nothing - show_schematic [ get_cells ] -} \ No newline at end of file diff --git a/project_1/liteeth_config.yml b/project_1/liteeth_config.yml deleted file mode 100644 index 666a399..0000000 --- a/project_1/liteeth_config.yml +++ /dev/null @@ -1,28 +0,0 @@ -# -# This file is part of LiteEth. -# -# Copyright (c) 2020-2022 Florent Kermarrec -# SPDX-License-Identifier: BSD-2-Clause - -# PHY -------------------------------------------------------------------------- -phy: LiteEthPHYRMII -vendor: xilinx -toolchain: vivado - -# Core ------------------------------------------------------------------------- -refclk_freq: 50e6 -clk_freq: 50e6 -core: udp -mac_address: 0x10e2d5000000 -dhcp: True -data_width: 8 - -# UDP Ports -------------------------------------------------------------------- -udp_ports: { - "udp0": { - "udp_port" : 2000, # Static Params. - "data_width" : 32, - "tx_fifo_depth" : 64, - "rx_fifo_depth" : 64, - }, -} diff --git a/project_1/manta.yaml b/project_1/manta.yaml deleted file mode 100644 index 23f7b6d..0000000 --- a/project_1/manta.yaml +++ /dev/null @@ -1,27 +0,0 @@ ---- -cores: - io_core: - type: io - - inputs: - sw: 16 - - outputs: - led: 16 - -ethernet: - phy: LiteEthPHYRMII - vendor: xilinx - toolchain: vivado - - refclk_freq: 50e6 - clk_freq: 50e6 - - fpga_ip_addr: "192.168.0.110" - host_ip_addr: "192.168.0.100" - udp_port: 42069 - - core: udp # we handle this - mac_address: # this should be optional - dhcp: # should be optional, default to true? - data_width: 32 # using DHCP will force this to 32, but for ease of use we should design for that even for static IP devices diff --git a/project_1/stream.py b/project_1/stream.py deleted file mode 100644 index ae56e49..0000000 --- a/project_1/stream.py +++ /dev/null @@ -1,40 +0,0 @@ -import socket -def write(addrs, datas): - bytes_out = b"" - for addr, data in zip(addrs, datas): - bytes_out += int(1).to_bytes(4, byteorder="little") - bytes_out += int(addr).to_bytes(2, byteorder="little") - bytes_out += int(data).to_bytes(2, byteorder="little") - - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - sock.sendto(bytes_out, (fpga_ip_addr, udp_port)) - -def read(addrs): - bytes_out = b"" - for addr in addrs: - bytes_out += int(0).to_bytes(4, byteorder="little") - bytes_out += int(addr).to_bytes(2, byteorder="little") - bytes_out += int(0).to_bytes(2, byteorder="little") - - sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - sock.bind((host_ip_addr, udp_port)) - sock.sendto(bytes_out, (fpga_ip_addr, udp_port)) - data, addr = sock.recvfrom(1024) - - return int.from_bytes(data, "little") - -if __name__ == "__main__": - host_ip_addr = "192.168.0.100" - fpga_ip_addr = "192.168.0.110" - udp_port = 42069 - - for i in range(2**16): - write([0x0000],[0x0000]) - write([0x0000],[0x0001]) - write([0x0000],[0x0000]) - write([0x0002],[i]) - # print(read([0x0002])) - # write([0x0002],[0b0101_0101_0101_0101]) - # write([0x0000],[0x0000]) - # write([0x0000],[0x0001]) - # write([0x0000],[0x0000]) diff --git a/project_1/test.py b/project_1/test.py deleted file mode 100644 index 3a725ad..0000000 --- a/project_1/test.py +++ /dev/null @@ -1,5 +0,0 @@ -from manta import Manta -m = Manta("manta.yaml") - -print(bin(m.io_core.get_probe("sw"))) -m.io_core.set_probe("led", 4) \ No newline at end of file diff --git a/project_1/xdc/top_level.xdc b/project_1/xdc/top_level.xdc deleted file mode 100644 index 7a77074..0000000 --- a/project_1/xdc/top_level.xdc +++ /dev/null @@ -1,260 +0,0 @@ -## R1.0 2019-08-27 -## Updated by jodalyst in 2020-2022 -## all inputs/outputs changed to lowercase; arrays start with zero. -## system clock renamed to clk_100mhz -## ja, jb, jc, jd renamed to 0-7 -## xa port renamed 0-3 -## seven segments renamed to a,b,c,d,e,f,dp - -## This file is a general .xdc for the Nexys4 DDR Rev. C -## To use it in a project: -## - uncomment the lines corresponding to used pins -## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project - -## Clock signal -set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk_100mhz }]; #IO_L12P_T1_MRCC_35 Sch=clk_100mhz -create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk_100mhz}]; - - -##Switches - -set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] -set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] -set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] -set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] -set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] -set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] -set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] -set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] -set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] -set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] -set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] -set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] -set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] -set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] -set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] -set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] - - -## LEDs - -set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] -set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] -set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] -set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] -set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] -set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] -set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] -set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] -set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] -set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] -set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] -set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] -set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] -set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] -set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] -set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] - -#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b -#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g -#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r -#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b -#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g -#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r - - -##7 segment display - -#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca -#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb -#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc -#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd -#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce -#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf -#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg - -#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp - -#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] -#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] -#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] -#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] -#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] -#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] -#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] -#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] - - -##Buttons - -#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn - -set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc -set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu -set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl -set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr -set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd - - -##Pmod Headers - - -##Pmod Header JA - -#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] -#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] -#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] -#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] -#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] -#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] -#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] -#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] - - -##Pmod Header JB - -#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] -#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] -#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] -#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] -#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] -#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] -#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] -#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] - - -##Pmod Header JC - -#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] -#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] -#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] -#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] -#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] -#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] -#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] -#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] - - -##Pmod Header JD - -#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] -#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] -#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] -#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] -#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] -#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] -#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] -#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] - - -##Pmod Header JXADC - -#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] -#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] -#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] -#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] -#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] -#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] -#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] -#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] - - -##VGA Connector - -#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] -#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] -#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] -#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] -# -#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] -#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] -#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] -#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] -# -#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] -#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] -#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] -#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] - -#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs -#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs - -##Micro SD Connector - -#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset -#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd -#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck -#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd -#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] -#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] -#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] -#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] - - -##Accelerometer - -#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso -#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi -#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk -#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn -#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] -#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] - - -##Temperature Sensor - -#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl -#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda -#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int -#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct - -##Omnidirectional Microphone - -#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk -#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data -#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel - - -##PWM Audio Amplifier - -#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm -#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd - - -##USB-RS232 Interface - -set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in -set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out -#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts -#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts - -##USB HID (PS/2) - -#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk -#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data - - -##SMSC Ethernet PHY - -set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc -set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio -set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn -set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv -set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr -set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] -set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] -set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen -set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] -set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] -set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk -set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn - - -##Quad SPI Flash - -#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] -#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] -#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] -#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] -#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn - diff --git a/pyproject.toml b/pyproject.toml index 0b798de..b794d15 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,6 +10,7 @@ dependencies = [ "amaranth[builtin-yosys]", "PyYAML", "pyserial", + "liteeth@git+https://github.com/enjoy-digital/liteeth@2023.12", "pyvcd", ] diff --git a/src/manta/cli.py b/src/manta/cli.py index 610ec13..0d64bd5 100644 --- a/src/manta/cli.py +++ b/src/manta/cli.py @@ -71,17 +71,8 @@ def wrong_args(): def gen(config_path, output_path): m = Manta(config_path) - from amaranth.back import verilog - with open(output_path, "w") as f: - f.write( - verilog.convert( - m, - name="manta", - ports=m.get_top_level_ports(), - strip_internal_attrs=True, - ) - ) + f.write(m.generate_verilog()) def inst(config_path): diff --git a/src/manta/ethernet.py b/src/manta/ethernet/__init__.py similarity index 79% rename from src/manta/ethernet.py rename to src/manta/ethernet/__init__.py index 9f174fd..4b16ee8 100644 --- a/src/manta/ethernet.py +++ b/src/manta/ethernet/__init__.py @@ -1,10 +1,14 @@ from amaranth import * -from manta.utils import * +from ..utils import * +from .source_bridge import UDPSourceBridge +from .sink_bridge import UDPSinkBridge +from random import randint import socket class EthernetInterface(Elaboratable): def __init__(self, config): + self.config = config self.fpga_ip_addr = config["fpga_ip_addr"] self.host_ip_addr = config["host_ip_addr"] self.udp_port = config["udp_port"] @@ -54,10 +58,10 @@ class EthernetInterface(Elaboratable): def elaborate(self, platform): m = Module() - with m.If(self.dhcp_timer < 15): + with m.If(self.dhcp_timer < int(50e6)): m.d.sync += self.dhcp_timer.eq(self.dhcp_timer + 1) - m.d.sync += self.dhcp_start.eq(self.dhcp_timer == 14) + m.d.sync += self.dhcp_start.eq(self.dhcp_timer == (int(50e6) - 2)) m.submodules.liteeth = Instance( "liteeth_core", @@ -129,7 +133,7 @@ class EthernetInterface(Elaboratable): # Send read requests, and get responses sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind((self.host_ip_addr, self.udp_port)) - chunk_size = 128 + chunk_size = 64 # 128 addr_chunks = split_into_chunks(addrs, chunk_size) datas = [] @@ -146,6 +150,9 @@ class EthernetInterface(Elaboratable): # Split into groups of four bytes datas += [int.from_bytes(d, "little") for d in split_into_chunks(data, 4)] + if len(datas) != len(addrs): + raise ValueError("Got less data than expected from FPGA.") + return datas def write(self, addrs, datas): @@ -184,61 +191,39 @@ class EthernetInterface(Elaboratable): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.sendto(bytes_out, (self.fpga_ip_addr, self.udp_port)) + def generate_liteeth_core(self): + # Randomly assign a MAC address if one is not specified in the configuration. + # This will choose a MAC address in the Locally Administered, Administratively Assigned group. + # For more information, see: + # https://en.wikipedia.org/wiki/MAC_address#Ranges_of_group_and_locally_administered_addresses -class UDPSourceBridge(Elaboratable): - def __init__(self): - self.bus_o = Signal(InternalBus()) + if "mac_address" not in self.config: + mac_address = list(f"{randint(0, (2**48) - 1):012x}") + mac_address[1] = "2" + mac_address = int("".join(mac_address), 16) - self.data_i = Signal(32) - self.last_i = Signal() - self.ready_o = Signal() - self.valid_i = Signal() + else: + mac_address = self.config["mac_address"] - def elaborate(self, platform): - m = Module() + liteeth_config = { + "phy": self.config["phy"], + "vendor": self.config["vendor"], + "toolchain": self.config["toolchain"], + "refclk_freq": self.config["refclk_freq"], + "clk_freq": self.config["clk_freq"], + "mac_address": mac_address, + "dhcp": True, + "data_width": 32, + "udp_ports": { + "udp0": { + "udp_port": self.udp_port, + "data_width": 32, + "tx_fifo_depth": 64, + "rx_fifo_depth": 64, + } + }, + } - state = Signal() # can either be 0, for read/write, or 1, for data - rw_buf = Signal().like(self.bus_o.rw) - - # Can always take more data - m.d.sync += self.ready_o.eq(1) - - m.d.sync += self.bus_o.eq(0) - with m.If(self.valid_i): - m.d.sync += state.eq(~state) - - with m.If(state == 0): - m.d.sync += rw_buf.eq(self.data_i) - - with m.Else(): - m.d.sync += self.bus_o.addr.eq(self.data_i[:16]) - m.d.sync += self.bus_o.data.eq(self.data_i[16:]) - m.d.sync += self.bus_o.rw.eq(rw_buf) - m.d.sync += self.bus_o.valid.eq(1) - m.d.sync += self.bus_o.last.eq(self.last_i) - - return m - - -class UDPSinkBridge(Elaboratable): - def __init__(self): - self.bus_i = Signal(InternalBus()) - - self.data_o = Signal(32) - self.last_o = Signal() - self.ready_i = Signal() - self.valid_o = Signal() - - def elaborate(self, platform): - m = Module() - - m.d.sync += self.data_o.eq(0) - m.d.sync += self.last_o.eq(0) - m.d.sync += self.valid_o.eq(0) - - with m.If( (self.bus_i.valid) & (~self.bus_i.rw)): - m.d.sync += self.data_o.eq(self.bus_i.data) - m.d.sync += self.last_o.eq(self.bus_i.last) - m.d.sync += self.valid_o.eq(1) - - return m + # Generate the core + from .liteeth_gen import main + return main(liteeth_config) diff --git a/src/manta/ethernet/liteeth_gen.py b/src/manta/ethernet/liteeth_gen.py new file mode 100755 index 0000000..e07481e --- /dev/null +++ b/src/manta/ethernet/liteeth_gen.py @@ -0,0 +1,611 @@ +# LiteEth Core Generator +# Modified from https://github.com/enjoy-digital/liteeth/blob/master/liteeth/gen.py + +# Unless otherwise noted, LiteEth is Copyright 2012-2022 / EnjoyDigital + +# Redistribution and use in source and binary forms, with or without modification, +# are permitted provided that the following conditions are met: + +# 1. Redistributions of source code must retain the above copyright notice, this +# list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. + +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER 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. + + +# Other authors retain ownership of their contributions. If a submission can +# reasonably be considered independently copyrightable, it's yours and we +# encourage you to claim it with appropriate copyright notices. This submission +# then falls under the "otherwise noted" category. All submissions are strongly +# encouraged to use the two-clause BSD license reproduced above. + +# Copyright (c) 2015-2023 Florent Kermarrec +# Copyright (c) 2020 Xiretza +# Copyright (c) 2020 Stefan Schrijvers +# Copyright (c) 2022 Victor Suarez Rovere +# Copyright (c) 2023 LumiGuide Fietsdetectie B.V. +# SPDX-License-Identifier: BSD-2-Clause + +from migen import * + +from litex.gen import * + +from litex.build.generic_platform import * +from litex.build.xilinx.platform import XilinxPlatform +from litex.build.lattice.platform import LatticePlatform + +from litex.soc.interconnect import wishbone +from litex.soc.interconnect import axi +from litex.soc.integration.soc_core import * +from litex.soc.integration.builder import * +from litex.soc.integration.soc import SoCRegion + +from liteeth.common import * + +from liteeth import phy as liteeth_phys +from liteeth.mac import LiteEthMAC +from liteeth.core import LiteEthUDPIPCore +from liteeth.core.dhcp import LiteEthDHCP + +from liteeth.frontend.stream import LiteEthUDPStreamer +from liteeth.frontend.etherbone import LiteEthEtherbone + +from tempfile import TemporaryDirectory + +# IOs ---------------------------------------------------------------------------------------------- + +_io = [ + # Clk / Rst + ("sys_clock", 0, Pins(1)), + ("sys_reset", 1, Pins(1)), + # IP/MAC Address. + ("mac_address", 0, Pins(48)), + ("ip_address", 0, Pins(32)), + # Interrupt + ("interrupt", 0, Pins(1)), + # DHCP. + ( + "dhcp", + 0, + Subsignal("start", Pins(1)), + Subsignal("done", Pins(1)), + Subsignal("timeout", Pins(1)), + Subsignal("ip_address", Pins(32)), + ), + # MII PHY Pads + ( + "mii_clocks", + 0, + Subsignal("tx", Pins(1)), + Subsignal("rx", Pins(1)), + ), + ( + "mii", + 0, + Subsignal("rst_n", Pins(1)), + Subsignal("mdio", Pins(1)), + Subsignal("mdc", Pins(1)), + Subsignal("rx_dv", Pins(1)), + Subsignal("rx_er", Pins(1)), + Subsignal("rx_data", Pins(4)), + Subsignal("tx_en", Pins(1)), + Subsignal("tx_data", Pins(4)), + Subsignal("col", Pins(1)), + Subsignal("crs", Pins(1)), + ), + # RMII PHY Pads + ("rmii_clocks", 0, Subsignal("ref_clk", Pins(1))), + ( + "rmii", + 0, + Subsignal("rst_n", Pins(1)), + Subsignal("rx_data", Pins(2)), + Subsignal("crs_dv", Pins(1)), + Subsignal("tx_en", Pins(1)), + Subsignal("tx_data", Pins(2)), + Subsignal("mdc", Pins(1)), + Subsignal("mdio", Pins(1)), + ), + # GMII PHY Pads + ( + "gmii_clocks", + 0, + Subsignal("tx", Pins(1)), + Subsignal("gtx", Pins(1)), + Subsignal("rx", Pins(1)), + ), + ( + "gmii", + 0, + Subsignal("rst_n", Pins(1)), + Subsignal("int_n", Pins(1)), + Subsignal("mdio", Pins(1)), + Subsignal("mdc", Pins(1)), + Subsignal("rx_dv", Pins(1)), + Subsignal("rx_er", Pins(1)), + Subsignal("rx_data", Pins(8)), + Subsignal("tx_en", Pins(1)), + Subsignal("tx_er", Pins(1)), + Subsignal("tx_data", Pins(8)), + Subsignal("col", Pins(1)), + Subsignal("crs", Pins(1)), + ), + # RGMII PHY Pads + ("rgmii_clocks", 0, Subsignal("tx", Pins(1)), Subsignal("rx", Pins(1))), + ( + "rgmii", + 0, + Subsignal("rst_n", Pins(1)), + Subsignal("int_n", Pins(1)), + Subsignal("mdio", Pins(1)), + Subsignal("mdc", Pins(1)), + Subsignal("rx_ctl", Pins(1)), + Subsignal("rx_data", Pins(4)), + Subsignal("tx_ctl", Pins(1)), + Subsignal("tx_data", Pins(4)), + ), + # SGMII PHY Pads + ( + "sgmii", + 0, + Subsignal("refclk", Pins(1)), + Subsignal("rst", Pins(1)), + Subsignal("txp", Pins(1)), + Subsignal("txn", Pins(1)), + Subsignal("rxp", Pins(1)), + Subsignal("rxn", Pins(1)), + Subsignal("link_up", Pins(1)), + ), +] + + +def get_udp_port_ios(name, data_width, dynamic_params=False): + return [ + ( + f"{name}", + 0, + # Parameters. + *( + [ + Subsignal("udp_port", Pins(16)), + Subsignal("ip_address", Pins(32)), + ] + if dynamic_params + else [] + ), + # Sink. + Subsignal("sink_valid", Pins(1)), + Subsignal("sink_last", Pins(1)), + Subsignal("sink_ready", Pins(1)), + Subsignal("sink_data", Pins(data_width)), + # Source. + Subsignal("source_valid", Pins(1)), + Subsignal("source_last", Pins(1)), + Subsignal("source_ready", Pins(1)), + Subsignal("source_data", Pins(data_width)), + Subsignal("source_error", Pins(1)), + ), + ] + + +def get_udp_raw_port_ios(name, data_width): + return [ + ( + f"{name}", + 0, + # Sink. + Subsignal("sink_ip_address", Pins(32)), + Subsignal("sink_src_port", Pins(16)), + Subsignal("sink_dst_port", Pins(16)), + Subsignal("sink_valid", Pins(1)), + Subsignal("sink_length", Pins(16)), + Subsignal("sink_last", Pins(1)), + Subsignal("sink_ready", Pins(1)), + Subsignal("sink_data", Pins(data_width)), + Subsignal("sink_last_be", Pins(data_width // 8)), + # Source. + Subsignal("source_ip_address", Pins(32)), + Subsignal("source_src_port", Pins(16)), + Subsignal("source_dst_port", Pins(16)), + Subsignal("source_valid", Pins(1)), + Subsignal("source_length", Pins(16)), + Subsignal("source_last", Pins(1)), + Subsignal("source_ready", Pins(1)), + Subsignal("source_data", Pins(data_width)), + Subsignal("source_last_be", Pins(data_width // 8)), + Subsignal("source_error", Pins(1)), + ), + ] + + +# PHY Core ----------------------------------------------------------------------------------------- +class PHYCore(SoCMini): + SoCMini.csr_map = { + "ctrl": 0, + "ethphy": 1, + "ethmac": 2, + } + + def __init__(self, platform, core_config): + for deprecated in ("csr_map", "mem_map"): + if deprecated in core_config: + raise RuntimeWarning( + "Config option {!r} is now a sub-option of 'soc'".format(deprecated) + ) + + # SoC parameters --------------------------------------------------------------------------- + soc_args = {} + if "soc" in core_config: + soc_config = core_config["soc"] + + for arg in soc_config: + if arg in ("csr_map", "interrupt_map", "mem_map"): + getattr(self, arg).update(soc_config[arg]) + else: + soc_args[arg] = soc_config[arg] + + # SoCMini ---------------------------------------------------------------------------------- + SoCMini.__init__(self, platform, clk_freq=core_config["clk_freq"], **soc_args) + + # CRG -------------------------------------------------------------------------------------- + self.crg = CRG(platform.request("sys_clock"), platform.request("sys_reset")) + + # PHY -------------------------------------------------------------------------------------- + phy = core_config["phy"] + # MII. + if phy in [liteeth_phys.LiteEthPHYMII]: + ethphy = phy( + clock_pads=platform.request("mii_clocks"), pads=platform.request("mii") + ) + # RMII. + elif phy in [liteeth_phys.LiteEthPHYRMII]: + ethphy = phy( + refclk_cd=None, + clock_pads=platform.request("rmii_clocks"), + pads=platform.request("rmii"), + ) + # GMII. + elif phy in [liteeth_phys.LiteEthPHYGMII]: + ethphy = phy( + clock_pads=platform.request("gmii_clocks"), + pads=platform.request("gmii"), + ) + # GMII / MII. + elif phy in [liteeth_phys.LiteEthPHYGMIIMII]: + ethphy = phy( + clock_pads=platform.request("gmii_clocks"), + pads=platform.request("gmii"), + clk_freq=self.clk_freq, + ) + # RGMII. + elif phy in [ + liteeth_phys.LiteEthS7PHYRGMII, + liteeth_phys.LiteEthECP5PHYRGMII, + ]: + ethphy = phy( + clock_pads=platform.request("rgmii_clocks"), + pads=platform.request("rgmii"), + tx_delay=core_config.get("phy_tx_delay", 2e-9), + rx_delay=core_config.get("phy_rx_delay", 2e-9), + with_hw_init_reset=False, + ) # FIXME: required since sys_clk = eth_rx_clk. + # SGMII. + elif phy in [ + liteeth_phys.A7_1000BASEX, + liteeth_phys.A7_2500BASEX, + liteeth_phys.K7_1000BASEX, + liteeth_phys.K7_2500BASEX, + liteeth_phys.KU_1000BASEX, + liteeth_phys.KU_2500BASEX, + liteeth_phys.USP_GTH_1000BASEX, + liteeth_phys.USP_GTH_2500BASEX, + liteeth_phys.USP_GTY_1000BASEX, + liteeth_phys.USP_GTY_2500BASEX, + ]: + ethphy_pads = platform.request("sgmii") + # Artix7. + if phy in [liteeth_phys.A7_1000BASEX, liteeth_phys.A7_2500BASEX]: + refclk_freq = core_config.get("refclk_freq", 0) + assert refclk_freq in [125e6, 156.25e6] + from liteeth.phy.a7_gtp import QPLLSettings, QPLL + + qpll_settings = QPLLSettings( + refclksel=0b001, + fbdiv=4, + fbdiv_45={125e6: 5, 156.25e6: 4}[refclk_freq], + refclk_div=1, + ) + qpll = QPLL(ethphy_pads.refclk, qpll_settings) + self.submodules += qpll + ethphy = phy( + qpll_channel=qpll.channels[0], + data_pads=ethphy_pads, + sys_clk_freq=self.clk_freq, + with_csr=False, + rx_polarity=core_config.get("phy_rx_polarity", 0), + tx_polarity=core_config.get("phy_tx_polarity", 0), + ) + # Other 7-Series/Ultrascale(+). + else: + ethphy = phy( + refclk_or_clk_pads=ethphy_pads.refclk, + data_pads=ethphy_pads, + sys_clk_freq=self.clk_freq, + refclk_freq=core_config.get("refclk_freq", 200e6), + with_csr=False, + rx_polarity=core_config.get("phy_rx_polarity", 0), + tx_polarity=core_config.get("phy_tx_polarity", 0), + ) + self.comb += [ + ethphy.reset.eq(ethphy_pads.rst), + ethphy_pads.link_up.eq(ethphy.link_up), + ] + else: + raise ValueError("Unsupported PHY") + self.ethphy = ethphy + + # Timing constaints. + # Generate timing constraints to ensure the "keep" attribute is properly set on the various + # clocks. This also adds the constraints to the generated .xdc that can then be "imported" + # in the project using the core. + eth_rx_clk = getattr(ethphy, "crg", ethphy).cd_eth_rx.clk + eth_tx_clk = getattr(ethphy, "crg", ethphy).cd_eth_tx.clk + from liteeth.phy.model import LiteEthPHYModel + + if not isinstance(ethphy, LiteEthPHYModel): + self.platform.add_period_constraint(eth_rx_clk, 1e9 / phy.rx_clk_freq) + self.platform.add_period_constraint(eth_tx_clk, 1e9 / phy.tx_clk_freq) + self.platform.add_false_path_constraints( + self.crg.cd_sys.clk, eth_rx_clk, eth_tx_clk + ) + + +# UDP Core ----------------------------------------------------------------------------------------- +class UDPCore(PHYCore): + def add_streamer_port(self, platform, name, port_cfg): + # Use default Data-Width of 8-bit when not specified. + data_width = port_cfg.get("data_width", 8) + + # Used dynamic UDP-Port/IP-Address when not specified. + dynamic_params = port_cfg.get("ip_address", None) is None + + # FIFO Depth. + tx_fifo_depth = port_cfg.get("tx_fifo_depth", 64) + rx_fifo_depth = port_cfg.get("rx_fifo_depth", 64) + + # Create/Add IOs. + # --------------- + platform.add_extension( + get_udp_port_ios(name, data_width=data_width, dynamic_params=dynamic_params) + ) + + port_ios = platform.request(name) + + if dynamic_params: + ip_address = port_ios.ip_address + udp_port = port_ios.udp_port + else: + ip_address = port_cfg.get("ip_address") + udp_port = port_cfg.get("udp_port") + + # Create UDPStreamer. + # ------------------- + udp_streamer = LiteEthUDPStreamer( + self.core.udp, + ip_address=ip_address, + udp_port=udp_port, + data_width=data_width, + tx_fifo_depth=tx_fifo_depth, + rx_fifo_depth=rx_fifo_depth, + ) + self.submodules += udp_streamer + + # Connect IOs. + # ------------ + # Connect UDP Sink IOs to UDP Steamer. + self.comb += [ + udp_streamer.sink.valid.eq(port_ios.sink_valid), + udp_streamer.sink.last.eq(port_ios.sink_last), + port_ios.sink_ready.eq(udp_streamer.sink.ready), + udp_streamer.sink.data.eq(port_ios.sink_data), + ] + + # Connect UDP Streamer to UDP Source IOs. + self.comb += [ + port_ios.source_valid.eq(udp_streamer.source.valid), + port_ios.source_last.eq(udp_streamer.source.last), + udp_streamer.source.ready.eq(port_ios.source_ready), + port_ios.source_data.eq(udp_streamer.source.data), + port_ios.source_error.eq(udp_streamer.source.error), + ] + + def add_raw_port(self, platform, name, port_cfg): + # Use default Data-Width of 8-bit when not specified. + data_width = port_cfg.get("data_width", 8) + + # Create/Add IOs. + # --------------- + platform.add_extension( + get_udp_raw_port_ios( + name, + data_width=data_width, + ) + ) + + port_ios = platform.request(name) + + raw_port = self.core.udp.crossbar.get_port( + port_ios.sink_dst_port, dw=data_width + ) + + # Connect IOs. + # ------------ + # Connect UDP Sink IOs to UDP. + self.comb += [ + raw_port.sink.valid.eq(port_ios.sink_valid), + raw_port.sink.last.eq(port_ios.sink_last), + raw_port.sink.dst_port.eq(port_ios.sink_dst_port), + raw_port.sink.src_port.eq(port_ios.sink_src_port), + raw_port.sink.ip_address.eq(port_ios.sink_ip_address), + raw_port.sink.length.eq(port_ios.sink_length), + port_ios.sink_ready.eq(raw_port.sink.ready), + raw_port.sink.data.eq(port_ios.sink_data), + raw_port.sink.last_be.eq(port_ios.sink_last_be), + ] + + # Connect UDP to UDP Source IOs. + self.comb += [ + port_ios.source_valid.eq(raw_port.source.valid), + port_ios.source_last.eq(raw_port.source.last), + port_ios.source_dst_port.eq(raw_port.source.dst_port), + port_ios.source_src_port.eq(raw_port.source.src_port), + port_ios.source_ip_address.eq(raw_port.source.ip_address), + port_ios.source_length.eq(raw_port.source.length), + raw_port.source.ready.eq(port_ios.source_ready), + port_ios.source_data.eq(raw_port.source.data), + port_ios.source_last_be.eq(raw_port.source.last_be), + port_ios.source_error.eq(raw_port.source.error), + ] + + def __init__(self, platform, core_config): + # Config ----------------------------------------------------------------------------------- + tx_cdc_depth = core_config.get("tx_cdc_depth", 32) + tx_cdc_buffered = core_config.get("tx_cdc_buffered", False) + rx_cdc_depth = core_config.get("rx_cdc_depth", 32) + rx_cdc_buffered = core_config.get("rx_cdc_buffered", False) + + # MAC Address. + mac_address = core_config.get("mac_address", None) + # Get MAC Address from IOs when not specified. + if mac_address is None: + mac_address = platform.request("mac_address") + + # IP Address. + dhcp = core_config.get("dhcp", False) + ip_address = core_config.get("ip_address", None) + # Get IP Address from IOs when not specified. + if ip_address is None: + ip_address = platform.request("ip_address") + else: + assert not dhcp + + # PHY -------------------------------------------------------------------------------------- + PHYCore.__init__(self, platform, core_config) + + # Core ------------------------------------------------------------------------------------- + data_width = core_config.get("data_width", 8) + self.core = LiteEthUDPIPCore( + self.ethphy, + mac_address=mac_address, + ip_address=ip_address, + clk_freq=core_config["clk_freq"], + dw=data_width, + with_sys_datapath=(data_width == 32), + tx_cdc_depth=tx_cdc_depth, + tx_cdc_buffered=tx_cdc_buffered, + rx_cdc_depth=rx_cdc_depth, + rx_cdc_buffered=rx_cdc_buffered, + ) + + # DHCP ------------------------------------------------------------------------------------- + + if dhcp: + dhcp_pads = platform.request("dhcp") + dhcp_port = self.core.udp.crossbar.get_port(68, dw=32, cd="sys") + if isinstance(mac_address, Signal): + dhcp_mac_address = mac_address + else: + dhcp_mac_address = Signal(48, reset=0x10E2D5000001) + self.dhcp = LiteEthDHCP(udp_port=dhcp_port, sys_clk_freq=self.sys_clk_freq) + self.comb += [ + self.dhcp.start.eq(dhcp_pads.start), + dhcp_pads.done.eq(self.dhcp.done), + dhcp_pads.timeout.eq(self.dhcp.timeout), + dhcp_pads.ip_address.eq(self.dhcp.ip_address), + ] + + # Etherbone -------------------------------------------------------------------------------- + + etherbone = core_config.get("etherbone", False) + etherbone_port = core_config.get("etherbone_port", 1234) + etherbone_buffer_depth = core_config.get("etherbone_buffer_depth", 16) + + if etherbone: + assert data_width == 32 + self.etherbone = LiteEthEtherbone( + udp=self.core.udp, + udp_port=etherbone_port, + buffer_depth=etherbone_buffer_depth, + cd="sys", + ) + axil_bus = axi.AXILiteInterface(address_width=32, data_width=32) + platform.add_extension(axil_bus.get_ios("mmap")) + self.submodules += axi.Wishbone2AXILite( + self.etherbone.wishbone.bus, axil_bus + ) + self.comb += axil_bus.connect_to_pads( + platform.request("mmap"), mode="master" + ) + + # UDP Ports -------------------------------------------------------------------------------- + for name, port_cfg in core_config["udp_ports"].items(): + # mode either `raw` or `stream`, default to streamer to be backwards compatible + mode = port_cfg.get("mode", "streamer") + assert mode == "raw" or mode == "streamer" + + if mode == "streamer": + self.add_streamer_port(platform, name, port_cfg) + elif mode == "raw": + self.add_raw_port(platform, name, port_cfg) + + +# Build -------------------------------------------------------------------------------------------- +def main(core_config): + # Convert YAML elements to Python/LiteX -------------------------------------------------------- + for k, v in core_config.items(): + replaces = {"False": False, "True": True, "None": None} + for r in replaces.keys(): + if v == r: + core_config[k] = replaces[r] + if k == "phy": + core_config[k] = getattr(liteeth_phys, core_config[k]) + if k in ["refclk_freq", "clk_freq"]: + core_config[k] = int(float(core_config[k])) + if k in ["phy_tx_delay", "phy_rx_delay"]: + core_config[k] = float(core_config[k]) + + # Generate core -------------------------------------------------------------------------------- + if "device" not in core_config: + core_config["device"] = "" + if core_config["vendor"] == "lattice": + toolchain = core_config.get("toolchain", "diamond") + platform = LatticePlatform(core_config["device"], io=[], toolchain=toolchain) + elif core_config["vendor"] == "xilinx": + toolchain = core_config.get("toolchain", "vivado") + platform = XilinxPlatform(core_config["device"], io=[], toolchain=toolchain) + else: + raise ValueError("Unsupported vendor: {}".format(core_config["vendor"])) + platform.add_extension(_io) + + soc = UDPCore(platform, core_config) + + with TemporaryDirectory() as path: + builder = Builder(soc, compile_gateware=False, output_dir=path) + builder.build(build_name="liteeth_core") + + file = open(path + "/gateware/liteeth_core.v") + data = file.read() + file.close() + + return data diff --git a/src/manta/ethernet/sink_bridge.py b/src/manta/ethernet/sink_bridge.py new file mode 100644 index 0000000..c10a290 --- /dev/null +++ b/src/manta/ethernet/sink_bridge.py @@ -0,0 +1,26 @@ +from amaranth import * +from manta.utils import * + + +class UDPSinkBridge(Elaboratable): + def __init__(self): + self.bus_i = Signal(InternalBus()) + + self.data_o = Signal(32) + self.last_o = Signal() + self.ready_i = Signal() + self.valid_o = Signal() + + def elaborate(self, platform): + m = Module() + + m.d.sync += self.data_o.eq(0) + m.d.sync += self.last_o.eq(0) + m.d.sync += self.valid_o.eq(0) + + with m.If((self.bus_i.valid) & (~self.bus_i.rw)): + m.d.sync += self.data_o.eq(self.bus_i.data) + m.d.sync += self.last_o.eq(self.bus_i.last) + m.d.sync += self.valid_o.eq(1) + + return m diff --git a/src/manta/ethernet/source_bridge.py b/src/manta/ethernet/source_bridge.py new file mode 100644 index 0000000..e87967b --- /dev/null +++ b/src/manta/ethernet/source_bridge.py @@ -0,0 +1,37 @@ +from amaranth import * +from manta.utils import * + + +class UDPSourceBridge(Elaboratable): + def __init__(self): + self.bus_o = Signal(InternalBus()) + + self.data_i = Signal(32) + self.last_i = Signal() + self.ready_o = Signal() + self.valid_i = Signal() + + def elaborate(self, platform): + m = Module() + + state = Signal() # can either be 0, for read/write, or 1, for data + rw_buf = Signal().like(self.bus_o.rw) + + # Can always take more data + m.d.sync += self.ready_o.eq(1) + + m.d.sync += self.bus_o.eq(0) + with m.If(self.valid_i): + m.d.sync += state.eq(~state) + + with m.If(state == 0): + m.d.sync += rw_buf.eq(self.data_i) + + with m.Else(): + m.d.sync += self.bus_o.addr.eq(self.data_i[:16]) + m.d.sync += self.bus_o.data.eq(self.data_i[16:]) + m.d.sync += self.bus_o.rw.eq(rw_buf) + m.d.sync += self.bus_o.valid.eq(1) + m.d.sync += self.bus_o.last.eq(self.last_i) + + return m diff --git a/src/manta/manta.py b/src/manta/manta.py index c503fd2..35744a5 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -155,3 +155,25 @@ class Manta(Elaboratable): ports += instance.get_top_level_ports() return ports + + def generate_verilog(self, strip_internal_attrs=False): + from amaranth.back import verilog + + output = verilog.convert( + self, + name="manta", + ports=self.get_top_level_ports(), + strip_internal_attrs=strip_internal_attrs, + ) + + # Below is a hack! + # The Ethernet core is a Verilog snippet generated by LiteEth, + # which gets appended to the Amaranth output such that everything + # still lives within one file. + + # In the future this shouldn't be required once Amaranth SOC + # launches, but until then, this is likely the simplest approach. + if isinstance(self.interface, EthernetInterface): + output += self.interface.generate_liteeth_core() + + return output From 63e912fb63cf968dbd3d495ecefcbe4b2e00a63d Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Fri, 9 Feb 2024 22:49:58 -0800 Subject: [PATCH 42/89] fix grammar and diagrams --- doc/alternatives.md | 2 +- doc/architecture.md | 17 +- doc/assets/bus_architecture.drawio.svg | 66 +- doc/assets/io_core_architecture.drawio.svg | 270 +++++--- doc/assets/io_core_memory_map.drawio.svg | 251 ------- .../logic_analyzer_architecture.drawio.svg | 458 +++++++------ doc/assets/memory_architecture.drawio.svg | 386 ++++++----- doc/assets/system_architecture.drawio.svg | 505 +++++++------- doc/assets/uart_packets.drawio.svg | 627 ++++++++++-------- doc/ethernet_interface.md | 42 +- doc/index.md | 2 +- doc/installation.md | 23 +- doc/io_core.md | 8 +- doc/logic_analyzer_core.md | 6 +- doc/memory_core.md | 2 +- doc/uart_interface.md | 2 +- mkdocs.yml | 26 +- 17 files changed, 1392 insertions(+), 1301 deletions(-) delete mode 100644 doc/assets/io_core_memory_map.drawio.svg diff --git a/doc/alternatives.md b/doc/alternatives.md index 7758656..44f998d 100644 --- a/doc/alternatives.md +++ b/doc/alternatives.md @@ -55,7 +55,7 @@ An embedded logic analyzer for Lattice FPGAs, provided as part of the Diamond de ### Opal Kelly FrontPanel SDK -Unlike other entries in this list, Opal Kelly's FrontPanel SDK is not marketed as a debugger (although it can be used as such). Instead, it's designed to provide a host computer with a real time interface to FGPA signals, and present them on a graphical “front panel". These front panels exist as a GUI window on the host, and contain buttons, knobs, and indicators, much like a LabVIEW virtual instrument. Communication between the host and FPGA is accomplished with either USB or PCIe. Bindings for hosts running Windows, macOS, and Linux are provided, and target C, C++, C#, Python, Java, Ruby, and MATLAB. The FrontPanel SDK differs from other debuggers in that it provides a skeleton module into which the user logic is instantiated, instead of being instantiated inside the user's logic. +Unlike other entries in this list, Opal Kelly's FrontPanel SDK is not marketed as a debugger (although it can be used as such). Instead, it's designed to provide a host computer with a real time interface to FPGA signals, and present them on a graphical “front panel". These front panels exist as a GUI window on the host, and contain buttons, knobs, and indicators, much like a LabVIEW virtual instrument. Communication between the host and FPGA is accomplished with either USB or PCIe. Bindings for hosts running Windows, macOS, and Linux are provided, and target C, C++, C#, Python, Java, Ruby, and MATLAB. The FrontPanel SDK differs from other debuggers in that it provides a skeleton module into which the user logic is instantiated, instead of being instantiated inside the user's logic. - [Documentation](https://docs.opalkelly.com/fpsdk/) - [User's Guide](https://assets00.opalkelly.com/library/FrontPanel-UM.pdf) diff --git a/doc/architecture.md b/doc/architecture.md index be7f57b..588ab59 100644 --- a/doc/architecture.md +++ b/doc/architecture.md @@ -2,19 +2,19 @@ The whole system looks like the following: -![](assets/system_architecture.drawio.svg){:style="width:80%"} +

    Manta is operated via its Python API, which communicates with the connected FPGA over an interface API like `pySerial` or `Scapy`. These abstract away the OS device drivers, which function differently depending on the host machine's platform. The OS device drivers ultimately send out bytes to the FPGA, across either a USB or Ethernet cable. -Once sent across the wire, bytes are picked up by an interface transciever on the FPGA development board. This is either a USB-UART converter or a RMII PHY depending on if you're using UART or Ethernet. This chip is connected to the FPGA's IO, which routes the signals to the Verilog module generated by Manta. This module parses incoming messages, passes them down a set of daisy-chained cores, and then packetizes it and sends it back to the host. +Once sent across the wire, bytes are picked up by an interface transceiver on the FPGA development board. This is either a USB-UART converter or a RMII PHY depending on if you're using UART or Ethernet. This chip is connected to the FPGA's IO, which routes the signals to the Verilog module generated by Manta. This module parses incoming messages, passes them down a set of daisy-chained cores, and then packetizes it and sends it back to the host. ## Manta Architecture The logic Manta places on the FPGA consists of a series of cores connected in a chain along a common bus. Each core provides a unique method for interacting with the user’s logic, which it connects to by routing signals (called _probes_) between the user’s logic and the cores that interface with it. -![](assets/bus_architecture.drawio.svg){:style="width:40%"} +
    -These probes are presented as addressable memory, and are be controlled by reading and writing to their corresponing memory - not unlike registers on a microcontroller. Each core is allotted a section of address space at compile time, and operations addressed to a core’s address space control the behavior of the core. These cores are then daisy-chained along an internal bus, which permits a chain arbitrarily many cores to be placed on the bus. +These probes are presented as addressable memory, and are be controlled by reading and writing to their corresponding memory - not unlike registers on a microcontroller. Each core is allotted a section of address space at compile time, and operations addressed to a core’s address space control the behavior of the core. These cores are then daisy-chained along an internal bus, which permits a chain arbitrarily many cores to be placed on the bus. At the beginning of this chain is a module called a _receive bridge_, which converts incoming UART/Ethernet communication from the host into read and write requests, which are placed on the bus. These are called _bus transactions_, and once placed on the bus, they travel through each core before reaching the _transmit bridge_ at the end of the chain. This module places the result of the bus transaction back on the UART/Ethernet interface, and sends it back to the host. This produces a request-response style of communication between the host machine and the FPGA. @@ -37,7 +37,7 @@ Each core has a bus input and output port, so that cores can be daisy-chained to Ethernet and UART both allow a stream of bytes to be sent between the host and FPGA, but since they're just interfaces, they don't define how these bytes are structured. As a result, Manta implements its own messaging format, with the following structure: -![](assets/uart_packets.drawio.svg){:style="width:85%"} +
    Each of these messages is a string of ASCII characters consisting of a preamble, optional address and data fields, and an End of Line (EOL). The preamble denotes the type of operation, _R_ for a read and _W_ for a write. The address and data fields are encoded as hexadecimal digits, represented with the characters 0-9 and A-F in ASCII. As a result, four characters are needed to encode a 16-bit address or 16-bits of data. If the message specifies a write request, then it will contain a data field after the address field. Both request types will conclude with an End of Line, which consists of the two ASCII characters indicating a Carriage Return (CR) and a Line Feed (LF). @@ -64,7 +64,7 @@ When UART is used, these bytes are transmitted directly across the wire, but whe This is done with the architecture shown below: -![](assets/io_core_architecture.drawio.svg){:style="width:49%"} +
    Each of the probes is mapped to a register of Manta's internal memory. Since Manta's internal registers are 16 bits wide, probes less than 16 bits are mapped to a single register, but probes wider than 16 bits require multiple. @@ -73,7 +73,7 @@ Whatever the number of registers required, these are read from and written to by ## Logic Analyzer The Logic Analyzer Core's implementation on the FPGA consists of three primary components: -![](assets/logic_analyzer_architecture.drawio.svg){style="width:85%"} +
    - The _Finite State Machine (FSM)_, which controls the operation of the core. The FSM's operation is driven by its associated registers, which are placed in a separate module. This permits simple CDC between the bus and user clock domains. - The _Trigger Block_, which generates the core's trigger condition. The trigger block contains a trigger for each input probe, and the registers necessary to configure them. It also contains the $N$-logic gate (either AND or OR) that generates the core's trigger from the individual probe triggers. CDC is performed in exactly the same manner as the FSM. If an external trigger is specified, the trigger block is omitted from the Logic Analyzer Core, and the external trigger is routed to the FSM's `trig` input. @@ -84,8 +84,7 @@ The Logic Analyzer Core's implementation on the FPGA consists of three primary c Each Memory core is actually a set of 16-bit wide BRAMs with their ports concatenated together, with any spare bits masked off. Here's a diagram: -![](assets/memory_architecture.drawio.svg) - +
    Since each $n$-bit wide block memory is actually $ceil(n/16)$ BRAMs under the hood, addressing the BRAMs correctly from Manta's internal bus is important. BRAMs are organized such that each 16-bit slice of a $N$-bit word in the Block Memory core are placed next to each other in bus address space. For instance, a 34-bit wide block memory would exist on Manta's internal bus as: diff --git a/doc/assets/bus_architecture.drawio.svg b/doc/assets/bus_architecture.drawio.svg index e4858e0..a8b8077 100644 --- a/doc/assets/bus_architecture.drawio.svg +++ b/doc/assets/bus_architecture.drawio.svg @@ -1,8 +1,68 @@ - - + + + + + - + diff --git a/doc/assets/io_core_architecture.drawio.svg b/doc/assets/io_core_architecture.drawio.svg index d5b5064..65f936d 100644 --- a/doc/assets/io_core_architecture.drawio.svg +++ b/doc/assets/io_core_architecture.drawio.svg @@ -1,122 +1,182 @@ - - + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + -
    +
    -
    +
    output_0
    - + output_0 - - - + + + -
    +
    -
    +
    output_n
    - + output_n - - + + -
    +
    -
    +
    bus
    - + bus - + -
    +
    -
    +
    input_n
    - + input_n - - - + + + -
    +
    -
    +
    strobe
    - + strobe - + -
    +
    -
    +

    IO Core

    @@ -124,37 +184,37 @@
    - + IO Core - - - + + + -
    +
    -
    +
    input_0
    - + input_0 - + -
    +
    -
    +
    ... @@ -162,165 +222,165 @@
    - + ... - + -
    +
    -
    +
    input_0 buffer
    - + input_0 buffer - + -
    +
    -
    +
    input_n buffer
    - + input_n buffer - + -
    +
    -
    +
    output_n buffer
    - + output_n buffer - - + + -
    +
    -
    +
    bus
    - + bus - - + + -
    -
    -
    +
    +
    +
    output_0
    - + output_0 - + -
    +
    -
    +
    output_0 buffer
    - + output_0 buffer - - + + -
    -
    -
    +
    +
    +
    input_0
    - + input_0 - - + + -
    -
    -
    +
    +
    +
    output_n
    - + output_n - - + + -
    -
    -
    +
    +
    +
    input_n
    - + input_n diff --git a/doc/assets/io_core_memory_map.drawio.svg b/doc/assets/io_core_memory_map.drawio.svg deleted file mode 100644 index 35576a4..0000000 --- a/doc/assets/io_core_memory_map.drawio.svg +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - - -
    -
    -
    - foo[4:0] -
    -
    -
    -
    - - foo[4:0] - -
    -
    - - - - -
    -
    -
    - bar[15:0] -
    -
    -
    -
    - - bar[15:0] - -
    -
    - - - - -
    -
    -
    - baz[31:16] -
    -
    -
    -
    - - baz[31:16] - -
    -
    - - - - -
    -
    -
    - baz[15:0] -
    -
    -
    -
    - - baz[15:0] - -
    -
    - - - - -
    -
    -
    - zero pad -
    -
    -
    -
    - - zero pad - -
    -
    - - - - -
    -
    -
    - baz[36:32] -
    -
    -
    -
    - - baz[36:32] - -
    -
    - - - - -
    -
    -
    - zero pad -
    -
    -
    -
    - - zero pad - -
    -
    - - - - -
    -
    -
    - 0x0000 -
    -
    -
    -
    - - 0x0000 - -
    -
    - - - - -
    -
    -
    - 0x0001 -
    -
    -
    -
    - - 0x0001 - -
    -
    - - - - -
    -
    -
    - 0x0002 -
    -
    -
    -
    - - 0x0002 - -
    -
    - - - - -
    -
    -
    - 0x0003 -
    -
    -
    -
    - - 0x0003 - -
    -
    - - - - -
    -
    -
    - 0x0004 -
    -
    -
    -
    - - 0x0004 - -
    -
    - - - - -
    -
    -
    - 0 -
    -
    -
    -
    - - 0 - -
    -
    - - - - -
    -
    -
    - 16 -
    -
    -
    -
    - - 16 - -
    -
    -
    - - - - - Text is not SVG - cannot display - - - -
    \ No newline at end of file diff --git a/doc/assets/logic_analyzer_architecture.drawio.svg b/doc/assets/logic_analyzer_architecture.drawio.svg index c2123ab..4f3dc26 100644 --- a/doc/assets/logic_analyzer_architecture.drawio.svg +++ b/doc/assets/logic_analyzer_architecture.drawio.svg @@ -1,14 +1,76 @@ - - + + + + - - + + + -
    +
    -
    +
    block
    memory @@ -16,55 +78,55 @@
    - + block... - - + + -
    +
    -
    +
    bus
    - + bus - - - + + + -
    +
    -
    +
    bus
    - + bus - + -
    +
    -
    +
    fsm
    registers @@ -72,389 +134,389 @@
    - + fsm... - + -
    +
    -
    +
    fsm
    - + fsm - - + + -
    +
    -
    +
    bus
    - + bus - + -
    +
    -
    +
    trigger registers
    - + trigger re... - + -
    +
    -
    +
    trigger
    - + trigger - - + + -
    +
    -
    +
    arg
    - + arg - - + + -
    +
    -
    +
    op
    - + op - + -
    +
    -
    +
    trigger
    - + trigger - - + + -
    +
    -
    +
    arg
    - + arg - - + + -
    +
    -
    +
    op
    - + op - - + + -
    +
    -
    +
    trigger_mode
    - + trigger_mode - - + + -
    +
    -
    +
    request_start
    - + request_start - - + + -
    +
    -
    +
    request_stop
    - + request_stop - - + + -
    +
    -
    +
    read_pointer
    - + read_pointer - - + + -
    +
    -
    +
    write_pointer
    - + write_pointer - - + + -
    +
    -
    +
    state
    - + state - - + + -
    +
    -
    +
    trigger_location
    - + trigger_location - + -
    +
    -
    +
    ...
    - + ... - - + + -
    +
    -
    +
    bus
    - + bus - + -
    +
    -
    +
    port A
    - + port A - - + + -
    +
    -
    +
    data
    - + data - + -
    +
    -
    +
    port B
    - + port B - + -
    +
    -
    +

    Trigger Block @@ -464,121 +526,121 @@

    - + Trigger Block - - + + -
    +
    -
    +
    trig
    - + trig - + -
    +
    -
    +
    OR
    - + OR - - + + -
    +
    -
    +
    - + - - + + -
    +
    -
    +
    probe_2
    - + probe_2 - + -
    +
    -
    +
    - + - - + + -
    +
    -
    +
    probe_1
    - + probe_1 - - + + -
    +
    -
    +

    Logic Analyzer

    @@ -586,96 +648,96 @@
    - + Logic Analyzer - - + + -
    +
    -
    +
    probe_0
    - + probe_0 - + -
    +
    -
    +
    trigger
    - + trigger - - + + -
    +
    -
    +
    arg
    - + arg - - + + -
    +
    -
    +
    op
    - + op - - + + -
    +
    -
    +
    we
    - + we @@ -683,33 +745,33 @@ -
    +
    -
    +
    we
    - + we - - + + -
    +
    -
    +
    addr
    - + addr @@ -717,25 +779,25 @@ -
    +
    -
    +
    addr
    - + addr - - - - - - + + + + + + diff --git a/doc/assets/memory_architecture.drawio.svg b/doc/assets/memory_architecture.drawio.svg index ca3a1c9..ef58678 100644 --- a/doc/assets/memory_architecture.drawio.svg +++ b/doc/assets/memory_architecture.drawio.svg @@ -1,475 +1,537 @@ - - + + + + - - + + + -
    +
    -
    +
    block RAM
    - + block RAM - + -
    +
    -
    +
    port A
    - + port A - - + + -
    +
    -
    +
    addr
    - + addr - - + + -
    +
    -
    +
    din
    - + din - - + + -
    +
    -
    +
    dout
    - + dout - - + + -
    +
    -
    +
    we
    - + we - + -
    +
    -
    +
    port B
    - + port B - + -
    +
    -
    +
    Bus Controller
    - + Bus Controller - + -
    +
    -
    +
    block RAM
    - + block RAM - + -
    +
    -
    +
    port A
    - + port A - + -
    +
    -
    +
    port B
    - + port B - - - - - + + + + + -
    +
    -
    +
    user_addr
    - + user_addr - - + + -
    +
    -
    +
    user_din
    - + user_din - - + + -
    +
    -
    +
    user_dout
    - + user_dout - - + + -
    +
    -
    +
    user_we
    - + user_we - - + + -
    +
    -
    +
    addr
    - + addr - - + + -
    +
    -
    +
    din
    - + din - - + + -
    +
    -
    +
    dout
    - + dout - - + + -
    +
    -
    +
    we
    - + we - + -
    +
    -
    +
    block RAM
    - + block RAM - + -
    +
    -
    +
    port A
    - + port A - + -
    +
    -
    +
    port B
    - + port B - - + + -
    +
    -
    +
    addr
    - + addr - - + + -
    +
    -
    +
    din
    - + din - - + + -
    +
    -
    +
    dout
    - + dout - - + + -
    +
    -
    +
    we
    - + we - + -
    +
    -
    +
    ... @@ -479,111 +541,111 @@
    - + ... - - - + + + -
    +
    -
    +
    16 bits
    - + 16 bits - - - + + + -
    +
    -
    +
    16 bits
    - + 16 bits - - - + + + -
    +
    -
    +
    10 bits
    - + 10 bits - - + + -
    +
    -
    +
    bus
    - + bus - - + + -
    +
    -
    +
    bus
    - + bus - + -
    +
    -
    +

    Memory Core

    @@ -591,7 +653,7 @@
    - + Memory Core diff --git a/doc/assets/system_architecture.drawio.svg b/doc/assets/system_architecture.drawio.svg index 930a0c7..6e01b9f 100644 --- a/doc/assets/system_architecture.drawio.svg +++ b/doc/assets/system_architecture.drawio.svg @@ -1,15 +1,133 @@ - - + + + + - - - + + + + + + + + -
    +
    +
    +
    + Manta API +
    +
    +
    + + + Manta API + + + + + + + +
    +
    +
    + OS Device Driver +
    +
    +
    +
    + + OS Device Driver + +
    +
    + + + + + + + +
    +
    +
    + Your Code! +
    +
    +
    +
    + + Your Code! + +
    +
    + + + + +
    -
    +

    Host Machine

    @@ -17,305 +135,93 @@
    - + Host Machine - - - + -
    +
    -
    - User Application -
    -
    -
    - - - User Application - - - - - - - - - -
    -
    -
    - Manta API -
    -
    -
    -
    - - Manta API - -
    -
    - - - - - - -
    -
    -
    - Interface API -
    -
    -
    -
    - - Interface API - -
    -
    - - - - - -
    -
    -
    - USB/Ethernet Cable -
    -
    -
    -
    - - USB/Ethernet Cable - -
    -
    - - - - -
    -
    -
    - OS Device Driver -
    -
    -
    -
    - - OS Device Driver - -
    -
    - - - - -
    -
    -
    - Interface Transceiver -
    -
    - (USB UART -
    - Converter / Ethernet PHY) -
    -
    -
    -
    - - Interface Trans... - -
    -
    - - - - - - -
    -
    -
    - rxd -
    -
    -
    -
    - - rxd - -
    -
    - - - - -
    -
    -
    - bridge_rx -
    -
    -
    -
    - - bridge_rx - -
    -
    - - - - -
    -
    -
    +
    logic_analyzer
    - + logic_analyzer - + -
    +
    -
    +
    io_core
    - + io_core - + -
    +
    -
    +
    block_memory
    - + block_memory - + -
    +
    -
    - bridge_tx +
    + Your RTL!
    - - bridge_tx + + Your RTL! - - - - - - - - - + + + + + + + + -
    -
    -
    - User Logic -
    -
    -
    -
    - - User Logic - -
    -
    - - - - - - - - - - - - -
    -
    -
    - txd -
    -
    -
    -
    - - txd - -
    -
    - - - - -
    -
    -
    -

    - FPGA Development Board -

    -
    -
    -
    -
    - - FPGA Development Board - -
    -
    - - - - -
    -
    -
    +
    +
    +

    Manta RTL @@ -325,11 +231,110 @@

    - + Manta RTL + + + + +
    +
    +
    +

    + FPGA Development Board +

    +
    +
    +
    +
    + + FPGA Development Board + +
    +
    + + + + + + + + + +
    +
    +
    + Network +
    + Connection +
    +
    +
    +
    + + Network... + +
    +
    + + + + +
    +
    +
    + Ethernet PHY +
    +
    +
    +
    + + Ethernet PHY + +
    +
    + + + + + + + + + +
    +
    +
    + USB Cable +
    +
    +
    +
    + + USB Cable + +
    +
    + + + + +
    +
    +
    + USB-UART Converter +
    +
    +
    +
    + + USB-UART Conver... + +
    +
    diff --git a/doc/assets/uart_packets.drawio.svg b/doc/assets/uart_packets.drawio.svg index b6c1fa6..e3cc3b0 100644 --- a/doc/assets/uart_packets.drawio.svg +++ b/doc/assets/uart_packets.drawio.svg @@ -1,758 +1,821 @@ - - + + + + - + + -
    +
    -
    +
    W
    - + W - + -
    +
    -
    +
    8
    - + 8 - + -
    +
    -
    +
    9
    - + 9 - + -
    +
    -
    +
    A
    - + A - + -
    +
    -
    +
    B
    - + B - + -
    +
    -
    +
    CR
    - + CR - + -
    +
    -
    +
    LF
    - + LF - - - + + + -
    +
    -
    +
    Write Address
    - + Write Address - - - + + + -
    +
    -
    +
    End Of Line
    - + End Of Line - - - + + + -
    +
    -
    +
    Preamble
    - + Preamble - + -
    +
    -
    +
    0
    - + 0 - + -
    +
    -
    +
    8
    - + 8 - + -
    +
    -
    +
    16
    - + 16 - + -
    +
    -
    +
    24
    - + 24 - + -
    +
    -
    +
    32
    - + 32 - + -
    +
    -
    +
    48
    - + 48 - + -
    +
    -
    +
    56
    - + 56 - + -
    +
    -
    +
    C
    - + C - + -
    +
    -
    +
    D
    - + D - + -
    +
    -
    +
    E
    - + E - + -
    +
    -
    +
    F
    - + F - - - + + + -
    +
    -
    +
    Write Data
    - + Write Data - + -
    +
    -
    +
    64
    - + 64 - + -
    +
    -
    +
    72
    - + 72 - + -
    +
    -
    +
    80
    - + 80 - + -
    +
    -
    +
    88
    - + 88 - + -
    +
    -
    +
    R
    - + R - + -
    +
    -
    +
    0
    - + 0 - + -
    +
    -
    +
    1
    - + 1 - + -
    +
    -
    +
    2
    - + 2 - + -
    +
    -
    +
    3
    - + 3 - + -
    +
    -
    +
    CR
    - + CR - + -
    +
    -
    +
    LF
    - + LF - - - + + + -
    +
    -
    +
    Read Address
    - + Read Address - - - + + + -
    +
    -
    +
    End Of Line
    - + End Of Line - - - + + + -
    +
    -
    +
    Preamble
    - + Preamble - + -
    +
    -
    +
    0
    - + 0 - + -
    +
    -
    +
    8
    - + 8 - + -
    +
    -
    +
    16
    - + 16 - + -
    +
    -
    +
    24
    - + 24 - + -
    +
    -
    +
    32
    - + 32 - + -
    +
    -
    +
    48
    - + 48 - + -
    +
    -
    +
    56
    - + 56 - + -
    +
    -
    +

    Read Request

    @@ -760,18 +823,18 @@
    - + Read Request - + -
    +
    -
    +

    Read Response

    @@ -779,18 +842,18 @@
    - + Read Response - + -
    +
    -
    +

    Write Request

    @@ -798,313 +861,313 @@
    - + Write Request - + -
    +
    -
    +
    D
    - + D - + -
    +
    -
    +
    4
    - + 4 - + -
    +
    -
    +
    5
    - + 5 - + -
    +
    -
    +
    6
    - + 6 - + -
    +
    -
    +
    7
    - + 7 - + -
    +
    -
    +
    CR
    - + CR - + -
    +
    -
    +
    LF
    - + LF - - - + + + -
    +
    -
    +
    Read Data
    - + Read Data - - - + + + -
    +
    -
    +
    End Of Line
    - + End Of Line - - - + + + -
    +
    -
    +
    Preamble
    - + Preamble - + -
    +
    -
    +
    0
    - + 0 - + -
    +
    -
    +
    8
    - + 8 - + -
    +
    -
    +
    16
    - + 16 - + -
    +
    -
    +
    24
    - + 24 - + -
    +
    -
    +
    32
    - + 32 - + -
    +
    -
    +
    48
    - + 48 - + -
    +
    -
    +
    56
    - + 56 - + -
    +
    -
    +

    Write Response

    @@ -1112,18 +1175,18 @@
    - + Write Response - + -
    +
    -
    +
    No Response @@ -1131,7 +1194,7 @@
    - + No Response diff --git a/doc/ethernet_interface.md b/doc/ethernet_interface.md index 416c31b..e78ae9b 100644 --- a/doc/ethernet_interface.md +++ b/doc/ethernet_interface.md @@ -1,15 +1,39 @@ -!!! warning "This section is under construction!" - - The Ethernet interface is just about to get refactored to implement a few performance gains, so what's here represents the Ethernet interface circa April 2023. Hang tight for new stuff! - ## Overview -For situations where the onboard UART is not available, Manta provides a 100Mbps Ethernet link for communicating between the host machine and target FPGA. This link implements a L2 MAC on the FPGA, designed to be directly connected to a host machine on a dedicated network adapter. The MAC is controlled by a bridge interface, which performs the exact same function as it does on the UART interface. Incoming packets are parsed into bus transactions, placed on the bus, and any response data is encapsulated into another packet sent to the host. +For scenarios where UART is not available or higher bandwidth is desired, Manta provides an Ethernet interface for communicating between the host and FPGA. This interface uses UDP for communication, and leverages the builtin Python `sockets` module on the host side, and the open-source [LiteEth](https://github.com/enjoy-digital/liteeth) Ethernet core on the FPGA side. -This is done by interacting with an Ethernet PHY, an onboard transceiver IC that converts between the FPGA's logic-level signaling and the voltages on the cable's twisted pairs. The communication between the Ethernet PHY and the FPGA is done over an interface that's dependent on the speed of the PHY. The 10/100 Mbps interface used on the Nexys A7-100T uses the RMII as defined in IEEE 802.3u. RMII is the second-oldest member in the Media Independent Interface family, with newer revisions of 802.3 supporting faster interfaces. +!!! warning "Not every device is supported!" -Manta's bus clock must be equivalent to the PHY's reference clock if Ethernet is to be used - in the case of the 100Mbps RMII PHY on the Nexys A7 used in 6.205, this is 50MHz. This doesn't pose a problem for user logic, which is connected through Manta's cores that perform CDC internally. It does mean that a reference clock for the PHY has to be synthesized outside of Manta itself, and the means by which this is done varies by FPGA vendor and toolchain. + Although Manta aims to be as platform-agnostic as possible, Ethernet PHYs and FPGA clock primitives are very particular devices. As a result, the supported devices are loosely restricted to those on [this list](https://github.com/enjoy-digital/liteeth?tab=readme-ov-file#-features). If a device you'd like to use isn't on the list, the community would love your help! -This MAC allows for the usage of packets with the structure shown below. The bus transaction being communicated is placed at the beginning of the packet's payload field, which IEEE 802.3 allows to vary in length from 46 to 1500 bytes. The 46-byte lower limit requires 41 bytes of zero padding to be added to the five bytes used to specify a bus transaction, and only one bus transactions is specified in each Ethernet frame. This abundance of unused space results in all packets being the same length, whether the packet contains a read request, write request, or read response. Packets containing write requests elicit no response from the FPGA, just as write requests delivered over UART produce no response. +Although UDP does not guarantee reliable packet delivery, this usually doesn't pose an issue in practice. Manta will throw a runtime error if packets are dropped, and the UDP checksum and Ethernet FCS guarantee that any data delivered is not corrupted. Together, these two behaviors prevent corrupted data from being provided to the user, as Manta will error before returning invalid data. As long as your network is not terribly congested, Manta will operate without issue. +## Configuration -These packets are addressed directly to the host's MAC address, which is obtained during code autogeneration. These packets also use a fixed Ethertype of `0x88B5`, which is specially reserved for "public use and for prototype and vendor-specific protocol development" in IEEE 802.1. This was done to create an Ethernet II frame instead of a legacy 802.3 frame, without having to implement a higher level protocol like TCP or UDP to safely use a fixed Ethertype. This allows the MAC to use modern Ethernet II frames safely, but save FPGA resources. \ No newline at end of file +The configuration of the Ethernet core is best shown by example: +```yaml +ethernet: + phy: LiteEthPHYRMII + vendor: xilinx + toolchain: vivado + + clk_freq: 50e6 + refclk_freq: 50e6 + + fpga_ip_addr: "192.168.0.110" + host_ip_addr: "192.168.0.100" +``` +This snippet at the end of the configuration file defines the interface. The following parameters must be set: + +- `phy` _(required)_: The name of the LiteEth PHY class to use. Valid values consist of any of the names in [this list](https://github.com/enjoy-digital/liteeth/blob/b4e28506238c5340f2ade7899c2223424cabd410/liteeth/phy/__init__.py#L25-L45). Select the appropriate one for your FPGA vendor and family. + +- `vendor` _(required)_: The vendor of the FPGA being designed for. Currently only values of `xilinx` and `lattice` are supported. Used to generate timing constraints files, which are currently unused. + +- `toolchain` _(required)_: The toolchain being used. Currently only values of `vivado` and `diamond` are supported. + +- `clk_freq` _(required)_: The frequency of the clock provided to the Manta instance. Used to configure a PLL in the FPGA fabric for generating the PHY's `refclk`. + +- `refclk_freq` _(required)_: The frequency of the reference clock to be provided to the Ethernet PHY. This clock is generated from Manta's main clock using a PLL inside the FPGA. This frequency must match the MII variant supported by the PHY, as well as speed that the PHY is being operated at. For instance, a RGMII PHY may be operated at either 125MHz in Gigabit mode, or 25MHz in 100Mbps mode. + +- `fpga_ip_addr` _(required)_: The IP address the FPGA will attempt to claim. Upon power-on, the FPGA will issue a DHCP request for this IP address. The easiest way to check if this was successful is by pinging the FPGA's IP, but if you have access to your network's router it may report a list of connected devices. + +- `host_ip_addr` _(required)_: The IP address of the host machine, which the FPGA will send packets back to. diff --git a/doc/index.md b/doc/index.md index 41bae4d..3aada17 100644 --- a/doc/index.md +++ b/doc/index.md @@ -49,7 +49,7 @@ You may find this core useful for: ## About Manta and its source code are released under a [GPLv3 license](https://github.com/fischermoseley/manta/blob/main/LICENSE.txt), and it was originally developed as part of my [Master's Thesis at MIT](https://hdl.handle.net/1721.1/151223) in 2023, done under the supervision of [Dr. Joe Steinmeyer](https://www.jodalyst.com/). The thesis itself is copyrighted by Fischer Moseley (me!), but feel free to use the following Bibtex if you'd like to cite it: -``` +```bibtex @misc{manta2023, author={Fischer Moseley}, title={Manta: An In-Situ Debugging Tool for Programmable Hardware}, diff --git a/doc/installation.md b/doc/installation.md index 9141181..8fc2624 100644 --- a/doc/installation.md +++ b/doc/installation.md @@ -1,20 +1,20 @@ Before installing, make sure to upgrade your `pip` to the latest version: -``` +```bash pip install --upgrade pip ``` ## Latest Version You can install the latest version of Manta directly from source with: -``` +```bash pip install --upgrade git+https://github.com/fischermoseley/manta.git ``` ## Editable Development Install If you're working on the source, you might want an editable installation with some extra dependencies used for development: -``` +```bash git clone https://github.com/fischermoseley/manta.git cd manta pip install -e ".[dev]" @@ -29,14 +29,15 @@ Later Manta will be availabe on the PyPI lists, and you'll be able to just `pip ## Dependencies Manta requires the following dependencies: -- Amaranth HDL, which comes with it's own built-in copy of Yosys. -- pyYAML, which is used for parsing configuration files written in YAML. -- pySerial, used for communicating with the FPGA over UART. -- pyVCD, used for writing waveforms captured by the Logic Analyzer Core to standard Value Change Dump (VCD) files. +- [Amaranth HDL](https://amaranth-lang.org/docs/amaranth/latest/), which comes with it's own built-in copy of Yosys. +- [LiteEth](https://github.com/enjoy-digital/liteeth), for sending and receiving UDP packets on the FPGA. +- [pySerial](https://pyserial.readthedocs.io/en/latest/index.html), for communicating with the FPGA over UART. +- [pyYAML](https://pyyaml.org/), for parsing configuration files written in YAML. +- [pyVCD](https://github.com/westerndigitalcorporation/pyvcd), for writing waveforms captured by the Logic Analyzer Core to standard Value Change Dump (VCD) files. As well as these dependencies for development, which are installed with the `[dev]` argument: -- Pytest, for testing. -- Black, used for formatting the Python source. -- mkdocs-material, for generating the documentation site. -- amaranth_boards, for building designs for hardware-in-the-loop testing done by the CI. +- [Pytest](https://pytest.org/), for unit testing. +- [Black](https://black.readthedocs.io/en/stable/), for formatting the Python source. +- [mkdocs-material](https://squidfunk.github.io/mkdocs-material/), for generating the documentation site. +- [amaranth_boards](https://github.com/amaranth-lang/amaranth-boards), for building designs for hardware-in-the-loop testing done by the CI. diff --git a/doc/io_core.md b/doc/io_core.md index ba86a53..da61255 100644 --- a/doc/io_core.md +++ b/doc/io_core.md @@ -32,7 +32,7 @@ Inside this configuration, the following parameters may be configured: - `name` _(required)_: The name of the IO core. This name is used to reference the core when working with the API, and can be whatever you'd like. - `type` _(required)_: This denotes that this is an IO core. All cores contain a `type` field, which must be set to `io` to be recognized as an IO core. - `inputs` _(optional)_: This lists all inputs from from the FPGA fabric to the host machine. Signals in this list may be read by the host, but ___cannot___ be written to. Technically specifying input probes is totally optional - it's perfectly fine to have an IO core with only output probes. -- `outputs` _(optional)_: This lists all outputs from the host machine to the FPGA fabric. Signals in this list are usually written to by the host, but they can also be read from. Doing so returns the value last written to the register. Just like the `inputs` parameter, this list is techically optional, and it's perfectly valid to have an IO core with input probes only. +- `outputs` _(optional)_: This lists all outputs from the host machine to the FPGA fabric. Signals in this list are usually written to by the host, but they can also be read from. Doing so returns the value last written to the register. Just like the `inputs` parameter, this list is technically optional, and it's perfectly valid to have an IO core with input probes only. - `initial_value` _(optional)_: This sets an initial value for an output probe to take after the FPGA powers on. This is done with an `initial` statement in Manta's Verilog, and is independent of the input clock or resets elsewhere in the FPGA. This parameter is optional, and if it isn't provided the probe will initialize to zero. - `user_clock` _(optional)_: If set to True, an extra input port will be added to the `manta` module for an clock input to run the IO core on. This lets the IO Core handle clock domain crossing through its internal buffers. If set to False, Manta will run the IO core from its internal clock (the one provided through `manta`'s `clk` port). More information on this is available in the [diagram](#how-it-works) below. This parameter is optional, and defaults to False. @@ -50,7 +50,7 @@ The IO core functionality is stored in the `Manta.IOCore`, `Manta.InputProbe`, a - [`int`, `bool`] _data_: The value to write to an output probe. May be signed or unsigned, but will raise an exception if the value is too large for the width of the port. - _returns_: None -This method is blocking. When called it will dispatch a request to the FPGA, and wait until a response has been receieved. +This method is blocking. When called it will dispatch a request to the FPGA, and wait until a response has been received. --- @@ -58,7 +58,7 @@ This method is blocking. When called it will dispatch a request to the FPGA, and - _returns_: The value of an input or output probe. In the case of an output probe, the value returned will be the last value written to the probe. -This method is blocking. When called it will dispatch a request to the FPGA, and wait until a response has been receieved. +This method is blocking. When called it will dispatch a request to the FPGA, and wait until a response has been received. --- @@ -84,4 +84,4 @@ While the IO core performs a very, very simple task, it carries a few caveats. - First, __it's not instantaneous__. Manta has designed to be as fast as possible, but setting and querying registers relies on passing messages between the host and FPGA, which is slow relative to FPGA clock speeds! If you're trying to set values in your design with cycle-accurate timing, this will not do that for you. However, the [Logic Analyzer's playback feature](./logic_analyzer_core.md#playback) might be helpful. -- Second, __the API methods are blocking__, and will wait for a response from the FPGA before resuming program execution. Depending on your application, you might want to run your IO Core operations in a seperate thread, but you can also decrease the execution time by using a faster interface between the host and FPGA. This means using a higher UART baudrate, or using Ethernet. +- Second, __the API methods are blocking__, and will wait for a response from the FPGA before resuming program execution. Depending on your application, you might want to run your IO Core operations in a separate thread, but you can also decrease the execution time by using a faster interface between the host and FPGA. This means using a higher UART baudrate, or using Ethernet. diff --git a/doc/logic_analyzer_core.md b/doc/logic_analyzer_core.md index 50debe6..450f20d 100644 --- a/doc/logic_analyzer_core.md +++ b/doc/logic_analyzer_core.md @@ -60,14 +60,14 @@ Each individual trigger is specified with the following structure: - `EQ`, for equal to. - `NEQ`, for not equal to. - These operations require a constant to compare against, referred to as an _argument_, which is descirbed below: + These operations require a constant to compare against, referred to as an _argument_, which is described below: - __argument__: A constant to compare against, if the operation specified requires one. On the FPGA, the argument will have just as many bits as the probe width. -Lastly, if you're not able to express your desired trigger condition in terms of the operators above, fear not! You can also specifiy an `external_trigger: true` entry in the config file, which exposes an input on Manta's top level for your own trigger. +Lastly, if you're not able to express your desired trigger condition in terms of the operators above, fear not! You can also specify an `external_trigger: true` entry in the config file, which exposes an input on Manta's top level for your own trigger. ### Trigger Position (optional) -Sometimes, you care more about what happens before a trigger is met than afterwards, or vice versa. To accomodate this, the logic analyzer has an optional _Trigger Position_ parameter, which sets when probe data is captured relative to the trigger condition being met. This is specified with the `trigger_position` entry in the configuration file, which sets how many samples to save prior to the trigger condition occuring. This is best explained with a picture: +Sometimes, you care more about what happens before a trigger is met than afterwards, or vice versa. To accommodate this, the logic analyzer has an optional _Trigger Position_ parameter, which sets when probe data is captured relative to the trigger condition being met. This is specified with the `trigger_position` entry in the configuration file, which sets how many samples to save prior to the trigger condition occurring. This is best explained with a picture: ![](assets/trigger_positions.png){style="width:90%"} diff --git a/doc/memory_core.md b/doc/memory_core.md index 7189648..26109f8 100644 --- a/doc/memory_core.md +++ b/doc/memory_core.md @@ -68,6 +68,6 @@ A Block Memory core is used in the [video_sprite](https://github.com/fischermose Since Manta's [data bus](architecture.md#data-bus) is only 16-bits wide, it's only possible to manipulate the BRAM core in 16-bit increments. This means that if you have a BRAM that's ≤16 bits wide, you'll only need to issue a single bus transaction to read/write one entry in the BRAM. However, if you have a BRAM that's ≥16 bits wide, you'll need to issue a bus transaction to update each 16-bit slice of it. For instance, updating a single entry in a 33-bit wide BRAM would require sending 3 messages to the FPGA: one for bits 1-16, another for bits 17-32, and one for bit 33. If your application expects each BRAM entry to update instantaneously, this could be problematic. -There's a few different ways to solve this - you could use an IO core to signal when a BRAM's contents or valid - or you could ping-pong between two BRAMs while one is being modified. The choice is yours, and Manta makes no attempt to presribe any particular approach. +There's a few different ways to solve this - you could use an IO core to signal when a BRAM's contents or valid - or you could ping-pong between two BRAMs while one is being modified. The choice is yours, and Manta makes no attempt to prescribe any particular approach. Lastly, the interface you use (and to a lesser extent, your operating system) will determine the space between bus transactions. For instance, 100Mbit Ethernet is a thousand times faster than 115200bps UART, so the time where the BRAM is invalid is a thousand times smaller. diff --git a/doc/uart_interface.md b/doc/uart_interface.md index 847f52b..8813004 100644 --- a/doc/uart_interface.md +++ b/doc/uart_interface.md @@ -12,7 +12,7 @@ uart: baudrate: 3000000 clock_freq: 100000000 ``` -This snippet defines the interface, and lives at the bottom of a Manta configuration file. Three parameters must be set: +This snippet at the end of the configuration file defines the interface. The following parameters must be set: - `port` _(required)_: The name of the serial port on the host machine that's connected to the FPGA. Depending on your platform, this could be `/dev/ttyUSBXX`, `/dev/tty.usbserialXXX`, or `COMX`. If set to `auto`, then Manta will try to find the right serial port by looking for a USB device with the same VID and PID as a FT2232 - a USB/UART converter chip that's super popular on FPGA dev boards. This doesn't always work, but it's super convenient when it does. If your port isn't automatically detected, then just specify the port manually. diff --git a/mkdocs.yml b/mkdocs.yml index ca1d1d0..67f50e5 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -17,18 +17,24 @@ theme: - navigation.expand palette: - - scheme: default - primary: custom - accent: light blue + - media: "(prefers-color-scheme)" toggle: - icon: material/brightness-7 - name: Switch to dark mode - - scheme: slate - primary: custom - accent: light blue - toggle: - icon: material/brightness-4 + icon: material/link name: Switch to light mode + - media: "(prefers-color-scheme: light)" + scheme: default + primary: blue + accent: custom + toggle: + icon: material/toggle-switch + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: black + accent: custom + toggle: + icon: material/toggle-switch-off + name: Switch to system preference extra_css: - stylesheets/extra.css From 5e642101efe44d9f5f6cc114daa645da4463602a Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 10 Feb 2024 00:48:53 -0800 Subject: [PATCH 43/89] pass Ethernet config to LiteEth core generator --- src/manta/ethernet/__init__.py | 53 +++++++++++-------- src/manta/ethernet/liteeth_gen.py | 87 +++++++++++++++++++++++++++++-- 2 files changed, 114 insertions(+), 26 deletions(-) diff --git a/src/manta/ethernet/__init__.py b/src/manta/ethernet/__init__.py index 4b16ee8..20ebf3c 100644 --- a/src/manta/ethernet/__init__.py +++ b/src/manta/ethernet/__init__.py @@ -192,38 +192,45 @@ class EthernetInterface(Elaboratable): sock.sendto(bytes_out, (self.fpga_ip_addr, self.udp_port)) def generate_liteeth_core(self): + """ + Generate a LiteEth core by calling a slightly modified form of the LiteEth + standalone core generator. This passes the contents of the 'ethernet' section + of the Manta configuration file to LiteEth, after modifying it slightly to + include the UDP ports and set a MAC address if the user didn't specify one. + """ + liteeth_config = self.config.copy() + # Randomly assign a MAC address if one is not specified in the configuration. # This will choose a MAC address in the Locally Administered, Administratively Assigned group. # For more information, see: # https://en.wikipedia.org/wiki/MAC_address#Ranges_of_group_and_locally_administered_addresses - if "mac_address" not in self.config: - mac_address = list(f"{randint(0, (2**48) - 1):012x}") - mac_address[1] = "2" - mac_address = int("".join(mac_address), 16) + if "mac_address" not in liteeth_config: + addr = list(f"{randint(0, (2**48) - 1):012x}") + addr[1] = "2" + liteeth_config["mac_address"] = int("".join(addr), 16) - else: - mac_address = self.config["mac_address"] + # Force use of DHCP + liteeth_config["dhcp"] = True - liteeth_config = { - "phy": self.config["phy"], - "vendor": self.config["vendor"], - "toolchain": self.config["toolchain"], - "refclk_freq": self.config["refclk_freq"], - "clk_freq": self.config["clk_freq"], - "mac_address": mac_address, - "dhcp": True, - "data_width": 32, - "udp_ports": { - "udp0": { - "udp_port": self.udp_port, - "data_width": 32, - "tx_fifo_depth": 64, - "rx_fifo_depth": 64, - } - }, + # Use UDP + liteeth_config["core"] = "udp" + + # Use 32-bit words. Might be redundant, as I think using DHCP forces + # LiteEth to use 32-bit words + liteeth_config["data_width"] = 32 + + # Add UDP port + liteeth_config["udp_ports"] = { + "udp0": { + "udp_port": self.udp_port, + "data_width": 32, + "tx_fifo_depth": 64, + "rx_fifo_depth": 64, + } } # Generate the core from .liteeth_gen import main + return main(liteeth_config) diff --git a/src/manta/ethernet/liteeth_gen.py b/src/manta/ethernet/liteeth_gen.py index e07481e..5ba0f22 100755 --- a/src/manta/ethernet/liteeth_gen.py +++ b/src/manta/ethernet/liteeth_gen.py @@ -230,6 +230,8 @@ def get_udp_raw_port_ios(name, data_width): # PHY Core ----------------------------------------------------------------------------------------- + + class PHYCore(SoCMini): SoCMini.csr_map = { "ctrl": 0, @@ -322,8 +324,14 @@ class PHYCore(SoCMini): qpll_settings = QPLLSettings( refclksel=0b001, - fbdiv=4, - fbdiv_45={125e6: 5, 156.25e6: 4}[refclk_freq], + fbdiv={ + liteeth_phys.A7_1000BASEX: 4, + liteeth_phys.A7_2500BASEX: 5, + }[phy], + fbdiv_45={ + 125e6: 5, + 156.25e6: 4, + }[refclk_freq], refclk_div=1, ) qpll = QPLL(ethphy_pads.refclk, qpll_settings) @@ -371,7 +379,73 @@ class PHYCore(SoCMini): ) +# MAC Core ----------------------------------------------------------------------------------------- + + +class MACCore(PHYCore): + def __init__(self, platform, core_config): + # Parameters ------------------------------------------------------------------------------- + nrxslots = core_config.get("nrxslots", 2) + ntxslots = core_config.get("ntxslots", 2) + bus_standard = core_config["core"] + tx_cdc_depth = core_config.get("tx_cdc_depth", 32) + tx_cdc_buffered = core_config.get("tx_cdc_buffered", False) + rx_cdc_depth = core_config.get("rx_cdc_depth", 32) + rx_cdc_buffered = core_config.get("rx_cdc_buffered", False) + assert bus_standard in ["wishbone", "axi-lite"] + + # PHY -------------------------------------------------------------------------------------- + PHYCore.__init__(self, platform, core_config) + + # MAC -------------------------------------------------------------------------------------- + self.ethmac = ethmac = LiteEthMAC( + phy=self.ethphy, + dw=32, + interface="wishbone", + endianness=core_config["endianness"], + nrxslots=nrxslots, + ntxslots=ntxslots, + full_memory_we=core_config.get("full_memory_we", False), + tx_cdc_depth=tx_cdc_depth, + tx_cdc_buffered=tx_cdc_buffered, + rx_cdc_depth=rx_cdc_depth, + rx_cdc_buffered=rx_cdc_buffered, + ) + + if bus_standard == "wishbone": + # Wishbone Interface ----------------------------------------------------------------------- + wb_bus = wishbone.Interface() + platform.add_extension(wb_bus.get_ios("wishbone")) + self.comb += wb_bus.connect_to_pads( + self.platform.request("wishbone"), mode="slave" + ) + self.bus.add_master(master=wb_bus) + + if bus_standard == "axi-lite": + # AXI-Lite Interface ----------------------------------------------------------------------- + axil_bus = axi.AXILiteInterface(address_width=32, data_width=32) + platform.add_extension(axil_bus.get_ios("bus")) + self.submodules += axi.Wishbone2AXILite(ethmac.bus, axil_bus) + self.comb += axil_bus.connect_to_pads( + self.platform.request("bus"), mode="slave" + ) + self.bus.add_master(master=axil_bus) + + ethmac_region_size = (nrxslots + ntxslots) * buffer_depth + ethmac_region = SoCRegion( + origin=self.mem_map.get("ethmac", None), + size=ethmac_region_size, + cached=False, + ) + self.bus.add_slave(name="ethmac", slave=ethmac.bus, region=ethmac_region) + + # Interrupt Interface ---------------------------------------------------------------------- + self.comb += self.platform.request("interrupt").eq(self.ethmac.ev.irq) + + # UDP Core ----------------------------------------------------------------------------------------- + + class UDPCore(PHYCore): def add_streamer_port(self, platform, name, port_cfg): # Use default Data-Width of 8-bit when not specified. @@ -571,6 +645,8 @@ class UDPCore(PHYCore): # Build -------------------------------------------------------------------------------------------- + + def main(core_config): # Convert YAML elements to Python/LiteX -------------------------------------------------------- for k, v in core_config.items(): @@ -598,7 +674,12 @@ def main(core_config): raise ValueError("Unsupported vendor: {}".format(core_config["vendor"])) platform.add_extension(_io) - soc = UDPCore(platform, core_config) + if core_config["core"] in ["wishbone", "axi-lite"]: + soc = MACCore(platform, core_config) + elif core_config["core"] == "udp": + soc = UDPCore(platform, core_config) + else: + raise ValueError("Unknown core: {}".format(core_config["core"])) with TemporaryDirectory() as path: builder = Builder(soc, compile_gateware=False, output_dir=path) From 75a0fe46ff3eea12ed296a276f823590db067fab Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 10 Feb 2024 01:13:11 -0800 Subject: [PATCH 44/89] fix PLL information in Ethernet docs --- doc/architecture.md | 4 +--- doc/ethernet_interface.md | 12 +++++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/doc/architecture.md b/doc/architecture.md index 588ab59..53ed0db 100644 --- a/doc/architecture.md +++ b/doc/architecture.md @@ -4,9 +4,7 @@ The whole system looks like the following:
    -Manta is operated via its Python API, which communicates with the connected FPGA over an interface API like `pySerial` or `Scapy`. These abstract away the OS device drivers, which function differently depending on the host machine's platform. The OS device drivers ultimately send out bytes to the FPGA, across either a USB or Ethernet cable. - -Once sent across the wire, bytes are picked up by an interface transceiver on the FPGA development board. This is either a USB-UART converter or a RMII PHY depending on if you're using UART or Ethernet. This chip is connected to the FPGA's IO, which routes the signals to the Verilog module generated by Manta. This module parses incoming messages, passes them down a set of daisy-chained cores, and then packetizes it and sends it back to the host. +Manta consists of two parts - a Python API running on a host machine, and an autogenerated block of RTL that's included with your logic on a FPGA. Either UART or Ethernet is used for communication, which allows the host machine to operate the debugging cores on the FPGA. ## Manta Architecture diff --git a/doc/ethernet_interface.md b/doc/ethernet_interface.md index e78ae9b..2d7b77f 100644 --- a/doc/ethernet_interface.md +++ b/doc/ethernet_interface.md @@ -1,7 +1,7 @@ ## Overview For scenarios where UART is not available or higher bandwidth is desired, Manta provides an Ethernet interface for communicating between the host and FPGA. This interface uses UDP for communication, and leverages the builtin Python `sockets` module on the host side, and the open-source [LiteEth](https://github.com/enjoy-digital/liteeth) Ethernet core on the FPGA side. -!!! warning "Not every device is supported!" +!!! info "Not every device is supported!" Although Manta aims to be as platform-agnostic as possible, Ethernet PHYs and FPGA clock primitives are very particular devices. As a result, the supported devices are loosely restricted to those on [this list](https://github.com/enjoy-digital/liteeth?tab=readme-ov-file#-features). If a device you'd like to use isn't on the list, the community would love your help! @@ -30,10 +30,16 @@ This snippet at the end of the configuration file defines the interface. The fol - `toolchain` _(required)_: The toolchain being used. Currently only values of `vivado` and `diamond` are supported. -- `clk_freq` _(required)_: The frequency of the clock provided to the Manta instance. Used to configure a PLL in the FPGA fabric for generating the PHY's `refclk`. +- `clk_freq` _(required)_: The frequency of the clock provided to the Manta instance. -- `refclk_freq` _(required)_: The frequency of the reference clock to be provided to the Ethernet PHY. This clock is generated from Manta's main clock using a PLL inside the FPGA. This frequency must match the MII variant supported by the PHY, as well as speed that the PHY is being operated at. For instance, a RGMII PHY may be operated at either 125MHz in Gigabit mode, or 25MHz in 100Mbps mode. +- `refclk_freq` _(required)_: The frequency of the reference clock to be provided to the Ethernet PHY. This frequency must match the MII variant supported by the PHY, as well as speed that the PHY is being operated at. For instance, a RGMII PHY may be operated at either 125MHz in Gigabit mode, or 25MHz in 100Mbps mode. - `fpga_ip_addr` _(required)_: The IP address the FPGA will attempt to claim. Upon power-on, the FPGA will issue a DHCP request for this IP address. The easiest way to check if this was successful is by pinging the FPGA's IP, but if you have access to your network's router it may report a list of connected devices. - `host_ip_addr` _(required)_: The IP address of the host machine, which the FPGA will send packets back to. + +Lastly, any additonal arguments provided in the `ethernet` section of the config file will be passed to the LiteEth standalone core generator. As a result, the [examples](https://github.com/enjoy-digital/liteeth/tree/master/examples) provided by LiteEth may be of some service to you if you're bringing up a different FPGA! + +!!! warning "LiteEth doesn't always generate its own `refclk`!" + + Although LitEth is built on Migen and LiteX which support PLLs and other clock generation primitives, I haven't seen it instantiate one to synthesize a suitable `refclk` at the appropriate frequency from the input clock. As a result, for now it's recommended to generate your `refclk` outside Manta, and then use it to clock your Manta instance. \ No newline at end of file From a1fddf555e7eae265bc9e2339b2a40fbd2ef224e Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Mon, 12 Feb 2024 08:50:43 -0800 Subject: [PATCH 45/89] move init'ing UARTInterface from config to classmethod --- src/manta/manta.py | 2 +- src/manta/uart/__init__.py | 162 +++++++++++++++++++------------------ 2 files changed, 83 insertions(+), 81 deletions(-) diff --git a/src/manta/manta.py b/src/manta/manta.py index 35744a5..50a83e7 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -63,7 +63,7 @@ class Manta(Elaboratable): def get_interface(self): if "uart" in self.config: - return UARTInterface(self.config["uart"]) + return UARTInterface.from_config(self.config["uart"]) elif "ethernet" in self.config: return EthernetInterface(self.config["ethernet"]) diff --git a/src/manta/uart/__init__.py b/src/manta/uart/__init__.py index a735897..f974209 100644 --- a/src/manta/uart/__init__.py +++ b/src/manta/uart/__init__.py @@ -8,26 +8,31 @@ from serial import Serial class UARTInterface(Elaboratable): - def __init__(self, config): - self.config = config - self.check_config(self.config) - - self.port = config["port"] - self.clock_freq = config["clock_freq"] - self.baudrate = config["baudrate"] - self.clocks_per_baud = int(self.clock_freq // self.baudrate) - - self.define_signals() + def __init__(self, port, baudrate, clock_freq, chunk_size=256): + self._port = port + self._baudrate = baudrate + self._clock_freq = clock_freq + self._chunk_size = chunk_size + self._clocks_per_baud = int(self._clock_freq // self._baudrate) + self._check_config() # Set chunk_size, which is the max amount of bytes that the core will # dump to the OS driver at a time. Since the FPGA will return bytes # almost instantaneously, this prevents the OS's input buffer from # overflowing, and dropping bytes. - self.chunk_size = 256 # in bytes - if "chunk_size" in config: - self.chunk_size = config["chunk_size"] - def check_config(self, config): + self.rx = Signal() + self.tx = Signal() + + self.bus_o = Signal(InternalBus()) + self.bus_i = Signal(InternalBus()) + + @classmethod + def from_config(cls, config): + port = config.get("port") + clock_freq = config.get("clock_freq") + baudrate = config.get("baudrate") + # Warn if unrecognized options have been given recognized_options = ["port", "clock_freq", "baudrate", "chunk_size"] for option in config: @@ -36,84 +41,88 @@ class UARTInterface(Elaboratable): f"Ignoring unrecognized option '{option}' in UART interface config." ) + if "chunk_size" in config: + return cls(port, baudrate, clock_freq, config["chunk_size"]) + + else: + return cls(port, baudrate, clock_freq) + + def _check_config(self): # Ensure a serial port has been given - if "port" not in config: + if self._port is None: raise ValueError("No serial port provided to UART interface.") # Ensure clock frequency is provided and positive - if "clock_freq" not in config: + if self._clock_freq is None: raise ValueError("No clock frequency provided to UART interface.") - if config["clock_freq"] <= 0: + if self._clock_freq <= 0: raise ValueError("Non-positive clock frequency provided to UART interface.") # Check that baudrate is provided and positive - if "baudrate" not in config: + if self._baudrate is None: raise ValueError("No baudrate provided to UART interface.") - if config["baudrate"] <= 0: + if self._baudrate <= 0: raise ValueError("Non-positive baudrate provided to UART interface.") # Confirm the actual baudrate is within 5% of the target baudrate - clock_freq = config["clock_freq"] - baudrate = config["baudrate"] - clocks_per_baud = clock_freq // baudrate - actual_baudrate = clock_freq / clocks_per_baud - error = 100 * abs(actual_baudrate - baudrate) / baudrate + actual_baudrate = self._clock_freq / self._clocks_per_baud + error = 100 * abs(actual_baudrate - self._baudrate) / self._baudrate if error > 5: raise ValueError( "UART interface is unable to match targeted baudrate with specified clock frequency." ) - def get_serial_device(self): + def _get_serial_device(self): """ Return an open PySerial serial device if one exists, otherwise, open one. """ - if hasattr(self, "serial_device"): - return self.serial_device + + # Check if we've already opened a device + if hasattr(self, "_serial_device"): + return self._serial_device + + if self._port != "auto": + self._serial_device = Serial(self._port, self._baudrate, timeout=1) + return self._serial_device + + # Try to autodetect which port to use based on the PID/VID of the device attached. + # This looks for the PID/VID of the FT2232, the primary chip used on the icestick + # and Digilent dev boards. However, folks will likely want to connect other things + # in the future, so in the future we'll probably want to look for other chips as + # well. + + # The FT2232 exposes two serial ports - and for whatever reason it usually has the + # 0th device used for JTAG programming, and the 1st used for UART. So we'll grab + # the 1st. + + import serial.tools.list_ports + + ports = [] + for port in serial.tools.list_ports.comports(): + if (port.vid == 0x403) and (port.pid == 0x6010): + ports.append(port) + + if len(ports) != 2: + raise ValueError( + f"Expected to see two serial ports for FT2232 device, but instead see {len(ports)}." + ) + + if ports[0].serial_number != ports[1].serial_number: + raise ValueError( + f"Serial numbers should be the same on both FT2232 ports - probably somehow grabbed ports on two different devices." + ) + + if ports[0].location > ports[1].location: + chosen_port = ports[0].device else: - if self.port != "auto": - self.serial_device = Serial(self.port, self.baudrate, timeout=1) - return self.serial_device + chosen_port = ports[1].device - else: - # Try to autodetect which port to use based on the PID/VID of the device attached. - # This looks for the PID/VID of the FT2232, the primary chip used on the icestick - # and Digilent dev boards. However, folks will likely want to connect other things - # in the future, so in the future we'll probably want to look for other chips as - # well. - - # The FT2232 exposes two serial ports - and for whatever reason it usually has the - # 0th device used for JTAG programming, and the 1st used for UART. So we'll grab - # the 1st. - - import serial.tools.list_ports - - ports = [] - for port in serial.tools.list_ports.comports(): - if (port.vid == 0x403) and (port.pid == 0x6010): - ports.append(port) - - if len(ports) != 2: - raise ValueError( - f"Expected to see two serial ports for FT2232 device, but instead see {len(ports)}." - ) - - if ports[0].serial_number != ports[1].serial_number: - raise ValueError( - f"Serial numbers should be the same on both FT2232 ports - probably somehow grabbed ports on two different devices." - ) - - if ports[0].location > ports[1].location: - chosen_port = ports[0].device - - else: - chosen_port = ports[1].device - - self.serial_device = Serial(chosen_port, self.baudrate, timeout=1) - return self.serial_device + self._serial_device = Serial(chosen_port, self._baudrate, timeout=1) + return self._serial_device def get_top_level_ports(self): return [self.rx, self.tx] @@ -133,8 +142,8 @@ class UARTInterface(Elaboratable): raise ValueError("Read address must be an integer or list of integers.") # Send read requests, and get responses - ser = self.get_serial_device() - addr_chunks = split_into_chunks(addrs, self.chunk_size) + ser = self._get_serial_device() + addr_chunks = split_into_chunks(addrs, self._chunk_size) datas = [] for addr_chunk in addr_chunks: @@ -152,7 +161,7 @@ class UARTInterface(Elaboratable): # Split received bytes into individual responses and decode responses = split_into_chunks(bytes_in, 7) - data_chunk = [self.decode_read_response(r) for r in responses] + data_chunk = [self._decode_read_response(r) for r in responses] datas += data_chunk return datas @@ -186,10 +195,10 @@ class UARTInterface(Elaboratable): # Encode addrs and datas into write requests bytes_out = "".join([f"W{a:04X}{d:04X}\r\n" for a, d in zip(addrs, datas)]) bytes_out = bytes_out.encode("ascii") - ser = self.get_serial_device() + ser = self._get_serial_device() ser.write(bytes_out) - def decode_read_response(self, response_bytes): + def _decode_read_response(self, response_bytes): """ Check that read response is formatted properly, and extract the encoded data if so. """ @@ -221,21 +230,14 @@ class UARTInterface(Elaboratable): return int(response_ascii[1:5], 16) - def define_signals(self): - self.rx = Signal() - self.tx = Signal() - - self.bus_o = Signal(InternalBus()) - self.bus_i = Signal(InternalBus()) - def elaborate(self, platform): # fancy submoduling and such goes in here m = Module() - m.submodules.uart_rx = uart_rx = UARTReceiver(self.clocks_per_baud) + m.submodules.uart_rx = uart_rx = UARTReceiver(self._clocks_per_baud) m.submodules.bridge_rx = bridge_rx = ReceiveBridge() m.submodules.bridge_tx = bridge_tx = TransmitBridge() - m.submodules.uart_tx = uart_tx = UARTTransmitter(self.clocks_per_baud) + m.submodules.uart_tx = uart_tx = UARTTransmitter(self._clocks_per_baud) m.d.comb += [ # UART RX -> Internal Bus From 1487cfe9a26181aeb097065324bd93116bf4e2f7 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 17 Feb 2024 13:31:27 -0800 Subject: [PATCH 46/89] banish relative imports --- src/manta/__init__.py | 4 +-- src/manta/__main__.py | 2 +- src/manta/cli.py | 4 +-- src/manta/ethernet/__init__.py | 13 +++++----- src/manta/io_core.py | 2 +- src/manta/logic_analyzer/__init__.py | 10 ++++---- src/manta/logic_analyzer/fsm.py | 2 +- src/manta/logic_analyzer/sample_mem.py | 2 +- src/manta/logic_analyzer/trigger_block.py | 2 +- src/manta/manta.py | 10 ++++---- src/manta/memory_core.py | 2 +- src/manta/uart/__init__.py | 31 ++++++++++++----------- 12 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/manta/__init__.py b/src/manta/__init__.py index 60b9f60..f95e36e 100644 --- a/src/manta/__init__.py +++ b/src/manta/__init__.py @@ -1,5 +1,5 @@ -from .manta import Manta -from .cli import main +from manta.manta import Manta +from manta.cli import main if __name__ == "__main__": main() diff --git a/src/manta/__main__.py b/src/manta/__main__.py index 4e28416..2c4044f 100644 --- a/src/manta/__main__.py +++ b/src/manta/__main__.py @@ -1,3 +1,3 @@ -from .cli import main +from manta.cli import main main() diff --git a/src/manta/cli.py b/src/manta/cli.py index 0d64bd5..c65a167 100644 --- a/src/manta/cli.py +++ b/src/manta/cli.py @@ -1,5 +1,5 @@ -from .manta import Manta -from .utils import * +from manta.manta import Manta +from manta.utils import * from sys import argv from pkg_resources import get_distribution diff --git a/src/manta/ethernet/__init__.py b/src/manta/ethernet/__init__.py index 20ebf3c..f8f44fa 100644 --- a/src/manta/ethernet/__init__.py +++ b/src/manta/ethernet/__init__.py @@ -1,7 +1,7 @@ from amaranth import * -from ..utils import * -from .source_bridge import UDPSourceBridge -from .sink_bridge import UDPSinkBridge +from manta.utils import * +from manta.ethernet.source_bridge import UDPSourceBridge +from manta.ethernet.sink_bridge import UDPSinkBridge from random import randint import socket @@ -195,10 +195,9 @@ class EthernetInterface(Elaboratable): """ Generate a LiteEth core by calling a slightly modified form of the LiteEth standalone core generator. This passes the contents of the 'ethernet' section - of the Manta configuration file to LiteEth, after modifying it slightly to - include the UDP ports and set a MAC address if the user didn't specify one. + of the Manta configuration file to LiteEth, after modifying it slightly. """ - liteeth_config = self.config.copy() + liteeth_config = self._config.copy() # Randomly assign a MAC address if one is not specified in the configuration. # This will choose a MAC address in the Locally Administered, Administratively Assigned group. @@ -231,6 +230,6 @@ class EthernetInterface(Elaboratable): } # Generate the core - from .liteeth_gen import main + from manta.ethernet.liteeth_gen import main return main(liteeth_config) diff --git a/src/manta/io_core.py b/src/manta/io_core.py index 40009df..39c0634 100644 --- a/src/manta/io_core.py +++ b/src/manta/io_core.py @@ -1,5 +1,5 @@ from amaranth import * -from .utils import * +from manta.utils import * from math import ceil diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index 470843d..fddcfa6 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -1,9 +1,9 @@ from amaranth import * -from ..utils import * -from .trigger_block import LogicAnalyzerTriggerBlock -from .fsm import LogicAnalyzerFSM, States, TriggerModes -from .sample_mem import LogicAnalyzerSampleMemory -from .playback import LogicAnalyzerPlayback +from manta.utils import * +from manta.logic_analyzer.trigger_block import LogicAnalyzerTriggerBlock +from manta.logic_analyzer.fsm import LogicAnalyzerFSM, States, TriggerModes +from manta.logic_analyzer.sample_mem import LogicAnalyzerSampleMemory +from manta.logic_analyzer.playback import LogicAnalyzerPlayback class LogicAnalyzerCore(Elaboratable): diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index 9efe17a..2c8215d 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -1,7 +1,7 @@ from amaranth import * from amaranth.lib.enum import IntEnum from math import ceil, log2 -from ..io_core import IOCore +from manta.io_core import IOCore class States(IntEnum): diff --git a/src/manta/logic_analyzer/sample_mem.py b/src/manta/logic_analyzer/sample_mem.py index b6806fd..fc8f218 100644 --- a/src/manta/logic_analyzer/sample_mem.py +++ b/src/manta/logic_analyzer/sample_mem.py @@ -1,5 +1,5 @@ from amaranth import * -from ..memory_core import ReadOnlyMemoryCore +from manta.memory_core import ReadOnlyMemoryCore class LogicAnalyzerSampleMemory(ReadOnlyMemoryCore): diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 7dca023..3cfbba5 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -1,5 +1,5 @@ from amaranth import * -from ..io_core import IOCore +from manta.io_core import IOCore class LogicAnalyzerTriggerBlock(Elaboratable): diff --git a/src/manta/manta.py b/src/manta/manta.py index 50a83e7..313af71 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -1,10 +1,10 @@ from amaranth import * -from .uart import UARTInterface +from manta.uart import UARTInterface -from .ethernet import EthernetInterface -from .io_core import IOCore -from .memory_core import ReadOnlyMemoryCore -from .logic_analyzer import LogicAnalyzerCore +from manta.ethernet import EthernetInterface +from manta.io_core import IOCore +from manta.memory_core import ReadOnlyMemoryCore +from manta.logic_analyzer import LogicAnalyzerCore class Manta(Elaboratable): diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index 17bfd33..50c78f8 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -1,5 +1,5 @@ from amaranth import * -from .utils import * +from manta.utils import * from math import ceil diff --git a/src/manta/uart/__init__.py b/src/manta/uart/__init__.py index f974209..9a57482 100644 --- a/src/manta/uart/__init__.py +++ b/src/manta/uart/__init__.py @@ -1,9 +1,9 @@ from amaranth import * -from ..utils import * -from .receiver import UARTReceiver -from .receive_bridge import ReceiveBridge -from .transmitter import UARTTransmitter -from .transmit_bridge import TransmitBridge +from manta.utils import * +from manta.uart.receiver import UARTReceiver +from manta.uart.receive_bridge import ReceiveBridge +from manta.uart.transmitter import UARTTransmitter +from manta.uart.transmit_bridge import TransmitBridge from serial import Serial @@ -16,11 +16,7 @@ class UARTInterface(Elaboratable): self._clocks_per_baud = int(self._clock_freq // self._baudrate) self._check_config() - # Set chunk_size, which is the max amount of bytes that the core will - # dump to the OS driver at a time. Since the FPGA will return bytes - # almost instantaneously, this prevents the OS's input buffer from - # overflowing, and dropping bytes. - + # Top-Level Ports self.rx = Signal() self.tx = Signal() @@ -139,9 +135,14 @@ class UARTInterface(Elaboratable): # Make sure all list elements are integers if not all(isinstance(a, int) for a in addrs): - raise ValueError("Read address must be an integer or list of integers.") + raise TypeError("Read address must be an integer or list of integers.") + + # Send read requests in chunks, and read bytes after each. + # The input buffer exposed by the OS on most hosts isn't terribly deep, + # so sending in chunks (instead of all at once) prevents the OS's input + # buffer from overflowing and dropping bytes, as the FPGA will send + # responses instantly after it's received a request. - # Send read requests, and get responses ser = self._get_serial_device() addr_chunks = split_into_chunks(addrs, self._chunk_size) datas = [] @@ -178,15 +179,15 @@ class UARTInterface(Elaboratable): # Make sure address and datas are all integers if not isinstance(addrs, list) or not isinstance(datas, list): - raise ValueError( + raise TypeError( "Write addresses and data must be an integer or list of integers." ) if not all(isinstance(a, int) for a in addrs): - raise ValueError("Write addresses must be all be integers.") + raise TypeError("Write addresses must be all be integers.") if not all(isinstance(d, int) for d in datas): - raise ValueError("Write data must all be integers.") + raise TypeError("Write data must all be integers.") # Since the FPGA doesn't issue any responses to write requests, we # the host's input buffer isn't written to, and we don't need to From 8aedb8e9688f791d9742b55dbb707707e24489b0 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 17 Feb 2024 14:09:29 -0800 Subject: [PATCH 47/89] add config check to ethernet interface --- src/manta/ethernet/__init__.py | 122 ++++++++++++++++++---------- src/manta/ethernet/sink_bridge.py | 5 ++ src/manta/ethernet/source_bridge.py | 5 ++ 3 files changed, 90 insertions(+), 42 deletions(-) diff --git a/src/manta/ethernet/__init__.py b/src/manta/ethernet/__init__.py index f8f44fa..f68885b 100644 --- a/src/manta/ethernet/__init__.py +++ b/src/manta/ethernet/__init__.py @@ -7,11 +7,18 @@ import socket class EthernetInterface(Elaboratable): + """A module for communicating with Manta over Ethernet, using UDP. + + Provides methods for generating synthesizable logic for the FPGA, + as well as methods for reading and writing to memory by the host. + """ + def __init__(self, config): - self.config = config - self.fpga_ip_addr = config["fpga_ip_addr"] - self.host_ip_addr = config["host_ip_addr"] - self.udp_port = config["udp_port"] + self._config = config + self._fpga_ip_addr = config.get("fpga_ip_addr") + self._host_ip_addr = config.get("host_ip_addr") + self._udp_port = config.get("udp_port") + self._check_config() self.bus_i = Signal(InternalBus()) self.bus_o = Signal(InternalBus()) @@ -25,18 +32,49 @@ class EthernetInterface(Elaboratable): self.rmii_tx_data = Signal(2) self.rmii_tx_en = Signal() - self.dhcp_start = Signal() - self.dhcp_timer = Signal(range(int(100e6))) + self._dhcp_start = Signal() + self._dhcp_timer = Signal(range(int(100e6))) - self.source_data = Signal(32) - self.source_last = Signal() - self.source_ready = Signal() - self.source_valid = Signal() + self._source_data = Signal(32) + self._source_last = Signal() + self._source_ready = Signal() + self._source_valid = Signal() + + self._sink_data = Signal(32) + self._sink_last = Signal() + self._sink_ready = Signal() + self._sink_valid = Signal() + + def _check_config(self): + # Make sure UDP port is an integer in the range 0-65535 + if not isinstance(self._udp_port, int): + raise TypeError("UDP Port must be specified as an integer between 0 and 65535.") + + if not 0 <= self._udp_port <= 65535: + raise ValueError("UDP Port must be between 0 and 65535.") + + # Make sure Host IP address is four bytes separated by a period + if not isinstance(self._host_ip_addr, str): + raise TypeError("Host IP must be specified as a string in the form 'xxx.xxx.xxx.xxx'.") + + if len(self._host_ip_addr.split(".")) != 4: + raise ValueError("Host IP must be specified in the form 'xxx.xxx.xxx.xxx'.") + + for byte in self._host_ip_addr.split("."): + if not 0 <= int(byte) <= 255: + raise ValueError(f"Invalid byte in Host IP: {byte}") + + # Make sure FPGA IP is four bytes separated by a period + if not isinstance(self._fpga_ip_addr, str): + raise TypeError("FPGA IP must be specified as a string in the form 'xxx.xxx.xxx.xxx'.") + + if len(self._fpga_ip_addr.split(".")) != 4: + raise ValueError("FPGA IP must be specified in the form 'xxx.xxx.xxx.xxx'.") + + for byte in self._fpga_ip_addr.split("."): + if not 0 <= int(byte) <= 255: + raise ValueError(f"Invalid byte in FPGA IP: {byte}") - self.sink_data = Signal(32) - self.sink_last = Signal() - self.sink_ready = Signal() - self.sink_valid = Signal() def get_top_level_ports(self): ports = [ @@ -51,17 +89,17 @@ class EthernetInterface(Elaboratable): ] return ports - def binarize_ip_addr(self, ip_addr): + def _binarize_ip_addr(self, ip_addr): octets = [bin(int(o))[2:].zfill(8) for o in ip_addr.split(".")] return int("".join(octets), 2) def elaborate(self, platform): m = Module() - with m.If(self.dhcp_timer < int(50e6)): - m.d.sync += self.dhcp_timer.eq(self.dhcp_timer + 1) + with m.If(self._dhcp_timer < int(50e6)): + m.d.sync += self._dhcp_timer.eq(self._dhcp_timer + 1) - m.d.sync += self.dhcp_start.eq(self.dhcp_timer == (int(50e6) - 2)) + m.d.sync += self._dhcp_start.eq(self._dhcp_timer == (int(50e6) - 2)) m.submodules.liteeth = Instance( "liteeth_core", @@ -79,37 +117,37 @@ class EthernetInterface(Elaboratable): # DHCP # ("o", "dhcp_done", 1), # ("o", "dhcp_ip_address", 1), - ("i", "dhcp_start", self.dhcp_start), + ("i", "dhcp_start", self._dhcp_start), # ("o", "dhcp_timeout", 1), - ("i", "ip_address", self.binarize_ip_addr(self.fpga_ip_addr)), + ("i", "ip_address", self._binarize_ip_addr(self._fpga_ip_addr)), # UDP Port - ("i", "udp0_udp_port", self.udp_port), + ("i", "udp0_udp_port", self._udp_port), # UDP from host - ("o", "udp0_source_data", self.source_data), + ("o", "udp0_source_data", self._source_data), # ("o", "udp0_source_error", 1), - ("o", "udp0_source_last", self.source_last), - ("i", "udp0_source_ready", self.source_ready), - ("o", "udp0_source_valid", self.source_valid), + ("o", "udp0_source_last", self._source_last), + ("i", "udp0_source_ready", self._source_ready), + ("o", "udp0_source_valid", self._source_valid), # UDP back to host - ("i", "udp0_ip_address", self.binarize_ip_addr(self.host_ip_addr)), - ("i", "udp0_sink_data", self.sink_data), - ("i", "udp0_sink_last", self.sink_last), - ("o", "udp0_sink_ready", self.sink_ready), - ("i", "udp0_sink_valid", self.sink_valid), + ("i", "udp0_ip_address", self._binarize_ip_addr(self._host_ip_addr)), + ("i", "udp0_sink_data", self._sink_data), + ("i", "udp0_sink_last", self._sink_last), + ("o", "udp0_sink_ready", self._sink_ready), + ("i", "udp0_sink_valid", self._sink_valid), ) m.submodules.source_bridge = source_bridge = UDPSourceBridge() m.submodules.sink_bridge = sink_bridge = UDPSinkBridge() - m.d.comb += source_bridge.data_i.eq(self.source_data) - m.d.comb += source_bridge.last_i.eq(self.source_last) - m.d.comb += self.source_ready.eq(source_bridge.ready_o) - m.d.comb += source_bridge.valid_i.eq(self.source_valid) + m.d.comb += source_bridge.data_i.eq(self._source_data) + m.d.comb += source_bridge.last_i.eq(self._source_last) + m.d.comb += self._source_ready.eq(source_bridge.ready_o) + m.d.comb += source_bridge.valid_i.eq(self._source_valid) - m.d.comb += self.sink_data.eq(sink_bridge.data_o) - m.d.comb += self.sink_last.eq(sink_bridge.last_o) - m.d.comb += sink_bridge.ready_i.eq(self.sink_ready) - m.d.comb += self.sink_valid.eq(sink_bridge.valid_o) + m.d.comb += self._sink_data.eq(sink_bridge.data_o) + m.d.comb += self._sink_last.eq(sink_bridge.last_o) + m.d.comb += sink_bridge.ready_i.eq(self._sink_ready) + m.d.comb += self._sink_valid.eq(sink_bridge.valid_o) m.d.comb += sink_bridge.bus_i.eq(self.bus_i) m.d.comb += self.bus_o.eq(source_bridge.bus_o) @@ -132,7 +170,7 @@ class EthernetInterface(Elaboratable): # Send read requests, and get responses sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - sock.bind((self.host_ip_addr, self.udp_port)) + sock.bind((self._host_ip_addr, self._udp_port)) chunk_size = 64 # 128 addr_chunks = split_into_chunks(addrs, chunk_size) datas = [] @@ -144,7 +182,7 @@ class EthernetInterface(Elaboratable): bytes_out += int(addr).to_bytes(2, byteorder="little") bytes_out += int(0).to_bytes(2, byteorder="little") - sock.sendto(bytes_out, (self.fpga_ip_addr, self.udp_port)) + sock.sendto(bytes_out, (self._fpga_ip_addr, self._udp_port)) data, addr = sock.recvfrom(4 * chunk_size) # Split into groups of four bytes @@ -189,7 +227,7 @@ class EthernetInterface(Elaboratable): bytes_out += int(data).to_bytes(2, byteorder="little") sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) - sock.sendto(bytes_out, (self.fpga_ip_addr, self.udp_port)) + sock.sendto(bytes_out, (self._fpga_ip_addr, self._udp_port)) def generate_liteeth_core(self): """ @@ -222,7 +260,7 @@ class EthernetInterface(Elaboratable): # Add UDP port liteeth_config["udp_ports"] = { "udp0": { - "udp_port": self.udp_port, + "udp_port": self._udp_port, "data_width": 32, "tx_fifo_depth": 64, "rx_fifo_depth": 64, diff --git a/src/manta/ethernet/sink_bridge.py b/src/manta/ethernet/sink_bridge.py index c10a290..09dda83 100644 --- a/src/manta/ethernet/sink_bridge.py +++ b/src/manta/ethernet/sink_bridge.py @@ -3,6 +3,11 @@ from manta.utils import * class UDPSinkBridge(Elaboratable): + """A module for bridging Manta's internal bus to an AXI stream of UDP + packet data. + + Connects to the LiteEth core's "sink" port. + """ def __init__(self): self.bus_i = Signal(InternalBus()) diff --git a/src/manta/ethernet/source_bridge.py b/src/manta/ethernet/source_bridge.py index e87967b..9cbcdd2 100644 --- a/src/manta/ethernet/source_bridge.py +++ b/src/manta/ethernet/source_bridge.py @@ -3,6 +3,11 @@ from manta.utils import * class UDPSourceBridge(Elaboratable): + """A module for bridging the AXI-stream of incoming UDP packet data to + Manta's internal bus. + + Connects to the LiteEth core's "source" port. + """ def __init__(self): self.bus_o = Signal(InternalBus()) From 68aeb1a4a8ae3177f22694ceb1ce79740e82e808 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 17 Feb 2024 15:04:50 -0800 Subject: [PATCH 48/89] add underscores for private objects --- src/manta/ethernet/__init__.py | 30 +++++--- src/manta/ethernet/sink_bridge.py | 4 +- src/manta/ethernet/source_bridge.py | 4 +- src/manta/uart/__init__.py | 16 +++- src/manta/uart/receive_bridge.py | 115 +++++++++++++++------------- src/manta/uart/receiver.py | 61 ++++++++------- src/manta/uart/transmit_bridge.py | 79 ++++++++++--------- src/manta/uart/transmitter.py | 39 ++++++---- 8 files changed, 200 insertions(+), 148 deletions(-) diff --git a/src/manta/ethernet/__init__.py b/src/manta/ethernet/__init__.py index f68885b..2fd1104 100644 --- a/src/manta/ethernet/__init__.py +++ b/src/manta/ethernet/__init__.py @@ -7,7 +7,8 @@ import socket class EthernetInterface(Elaboratable): - """A module for communicating with Manta over Ethernet, using UDP. + """ + A module for communicating with Manta over Ethernet, using UDP. Provides methods for generating synthesizable logic for the FPGA, as well as methods for reading and writing to memory by the host. @@ -48,14 +49,18 @@ class EthernetInterface(Elaboratable): def _check_config(self): # Make sure UDP port is an integer in the range 0-65535 if not isinstance(self._udp_port, int): - raise TypeError("UDP Port must be specified as an integer between 0 and 65535.") + raise TypeError( + "UDP Port must be specified as an integer between 0 and 65535." + ) if not 0 <= self._udp_port <= 65535: raise ValueError("UDP Port must be between 0 and 65535.") # Make sure Host IP address is four bytes separated by a period if not isinstance(self._host_ip_addr, str): - raise TypeError("Host IP must be specified as a string in the form 'xxx.xxx.xxx.xxx'.") + raise TypeError( + "Host IP must be specified as a string in the form 'xxx.xxx.xxx.xxx'." + ) if len(self._host_ip_addr.split(".")) != 4: raise ValueError("Host IP must be specified in the form 'xxx.xxx.xxx.xxx'.") @@ -66,7 +71,9 @@ class EthernetInterface(Elaboratable): # Make sure FPGA IP is four bytes separated by a period if not isinstance(self._fpga_ip_addr, str): - raise TypeError("FPGA IP must be specified as a string in the form 'xxx.xxx.xxx.xxx'.") + raise TypeError( + "FPGA IP must be specified as a string in the form 'xxx.xxx.xxx.xxx'." + ) if len(self._fpga_ip_addr.split(".")) != 4: raise ValueError("FPGA IP must be specified in the form 'xxx.xxx.xxx.xxx'.") @@ -75,8 +82,11 @@ class EthernetInterface(Elaboratable): if not 0 <= int(byte) <= 255: raise ValueError(f"Invalid byte in FPGA IP: {byte}") - def get_top_level_ports(self): + """ + Return the Amaranth signals that should be included as ports in the top-level + Manta module. + """ ports = [ self.rmii_clocks_ref_clk, self.rmii_crs_dv, @@ -125,7 +135,7 @@ class EthernetInterface(Elaboratable): # UDP from host ("o", "udp0_source_data", self._source_data), # ("o", "udp0_source_error", 1), - ("o", "udp0_source_last", self._source_last), + ("o", "udp0_source_last", self._source_last), ("i", "udp0_source_ready", self._source_ready), ("o", "udp0_source_valid", self._source_valid), # UDP back to host @@ -166,7 +176,7 @@ class EthernetInterface(Elaboratable): # Make sure all list elements are integers if not all(isinstance(a, int) for a in addrs): - raise ValueError("Read address must be an integer or list of integers.") + raise TypeError("Read address must be an integer or list of integers.") # Send read requests, and get responses sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) @@ -205,15 +215,15 @@ class EthernetInterface(Elaboratable): # Make sure address and datas are all integers if not isinstance(addrs, list) or not isinstance(datas, list): - raise ValueError( + raise TypeError( "Write addresses and data must be an integer or list of integers." ) if not all(isinstance(a, int) for a in addrs): - raise ValueError("Write addresses must be all be integers.") + raise TypeError("Write addresses must be all be integers.") if not all(isinstance(d, int) for d in datas): - raise ValueError("Write data must all be integers.") + raise TypeError("Write data must all be integers.") # Since the FPGA doesn't issue any responses to write requests, we # the host's input buffer isn't written to, and we don't need to diff --git a/src/manta/ethernet/sink_bridge.py b/src/manta/ethernet/sink_bridge.py index 09dda83..ecff0d0 100644 --- a/src/manta/ethernet/sink_bridge.py +++ b/src/manta/ethernet/sink_bridge.py @@ -3,11 +3,13 @@ from manta.utils import * class UDPSinkBridge(Elaboratable): - """A module for bridging Manta's internal bus to an AXI stream of UDP + """ + A module for bridging Manta's internal bus to an AXI stream of UDP packet data. Connects to the LiteEth core's "sink" port. """ + def __init__(self): self.bus_i = Signal(InternalBus()) diff --git a/src/manta/ethernet/source_bridge.py b/src/manta/ethernet/source_bridge.py index 9cbcdd2..9506636 100644 --- a/src/manta/ethernet/source_bridge.py +++ b/src/manta/ethernet/source_bridge.py @@ -3,11 +3,13 @@ from manta.utils import * class UDPSourceBridge(Elaboratable): - """A module for bridging the AXI-stream of incoming UDP packet data to + """ + A module for bridging the AXI-stream of incoming UDP packet data to Manta's internal bus. Connects to the LiteEth core's "source" port. """ + def __init__(self): self.bus_o = Signal(InternalBus()) diff --git a/src/manta/uart/__init__.py b/src/manta/uart/__init__.py index 9a57482..60bab24 100644 --- a/src/manta/uart/__init__.py +++ b/src/manta/uart/__init__.py @@ -8,6 +8,13 @@ from serial import Serial class UARTInterface(Elaboratable): + """ + A module for communicating with Manta over UART. + + Provides methods for generating synthesizable logic for the FPGA, + as well as methods for reading and writing to memory by the host. + """ + def __init__(self, port, baudrate, clock_freq, chunk_size=256): self._port = port self._baudrate = baudrate @@ -73,7 +80,7 @@ class UARTInterface(Elaboratable): def _get_serial_device(self): """ - Return an open PySerial serial device if one exists, otherwise, open one. + Return an open PySerial serial device if one exists, otherwise, open one and return it. """ # Check if we've already opened a device @@ -121,6 +128,10 @@ class UARTInterface(Elaboratable): return self._serial_device def get_top_level_ports(self): + """ + Return the Amaranth signals that should be included as ports in the top-level + Manta module. + """ return [self.rx, self.tx] def read(self, addrs): @@ -201,7 +212,7 @@ class UARTInterface(Elaboratable): def _decode_read_response(self, response_bytes): """ - Check that read response is formatted properly, and extract the encoded data if so. + Check that read response is formatted properly, and return the encoded data if so. """ # Make sure response is not empty @@ -232,7 +243,6 @@ class UARTInterface(Elaboratable): return int(response_ascii[1:5], 16) def elaborate(self, platform): - # fancy submoduling and such goes in here m = Module() m.submodules.uart_rx = uart_rx = UARTReceiver(self._clocks_per_baud) diff --git a/src/manta/uart/receive_bridge.py b/src/manta/uart/receive_bridge.py index 4abbc7b..07179b1 100644 --- a/src/manta/uart/receive_bridge.py +++ b/src/manta/uart/receive_bridge.py @@ -1,71 +1,78 @@ from amaranth import * +from amaranth.lib.enum import IntEnum from amaranth.lib.data import ArrayLayout +class States(IntEnum): + IDLE = 0 + READ = 1 + WRITE = 2 + + class ReceiveBridge(Elaboratable): + """ + A module for bridging the stream of bytes from the UARTReceiver + module to Manta's internal bus. + """ + def __init__(self): # Top-Level Ports self.data_i = Signal(8) self.valid_i = Signal() - self.addr_o = Signal(16, reset=0) - self.data_o = Signal(16, reset=0) - self.rw_o = Signal(1, reset=0) - self.valid_o = Signal(1, reset=0) - - # State Machine - self.IDLE_STATE = 0 - self.READ_STATE = 1 - self.WRITE_STATE = 2 + self.addr_o = Signal(16) + self.data_o = Signal(16) + self.rw_o = Signal(1) + self.valid_o = Signal(1) # Internal Signals - self.buffer = Signal(ArrayLayout(4, 8), reset_less=True) - self.state = Signal(2, reset=self.IDLE_STATE) - self.byte_num = Signal(4, reset=0) - self.is_eol = Signal() - self.is_ascii_hex = Signal() - self.from_ascii_hex = Signal(8) + self._buffer = Signal(ArrayLayout(4, 8)) + self._state = Signal(States) + self._byte_num = Signal(4) + self._is_eol = Signal() + self._is_ascii_hex = Signal() + self._from_ascii_hex = Signal(8) - def drive_ascii_signals(self, m): + def _drive_ascii_signals(self, m): # Decode 0-9 with m.If((self.data_i >= 0x30) & (self.data_i <= 0x39)): - m.d.comb += self.is_ascii_hex.eq(1) - m.d.comb += self.from_ascii_hex.eq(self.data_i - 0x30) + m.d.comb += self._is_ascii_hex.eq(1) + m.d.comb += self._from_ascii_hex.eq(self.data_i - 0x30) # Decode A-F with m.Elif((self.data_i >= 0x41) & (self.data_i <= 0x46)): - m.d.comb += self.is_ascii_hex.eq(1) - m.d.comb += self.from_ascii_hex.eq(self.data_i - 0x41 + 10) + m.d.comb += self._is_ascii_hex.eq(1) + m.d.comb += self._from_ascii_hex.eq(self.data_i - 0x41 + 10) with m.Else(): - m.d.comb += self.is_ascii_hex.eq(0) - m.d.comb += self.from_ascii_hex.eq(0) + m.d.comb += self._is_ascii_hex.eq(0) + m.d.comb += self._from_ascii_hex.eq(0) with m.If((self.data_i == ord("\r")) | (self.data_i == ord("\n"))): - m.d.comb += self.is_eol.eq(1) + m.d.comb += self._is_eol.eq(1) with m.Else(): - m.d.comb += self.is_eol.eq(0) + m.d.comb += self._is_eol.eq(0) - def drive_output_bus(self, m): + def _drive_output_bus(self, m): with m.If( - (self.state == self.READ_STATE) & (self.byte_num == 4) & (self.is_eol) + (self._state == States.READ) & (self._byte_num == 4) & (self._is_eol) ): m.d.comb += self.addr_o.eq( - Cat(self.buffer[3], self.buffer[2], self.buffer[1], self.buffer[0]) + Cat(self._buffer[3], self._buffer[2], self._buffer[1], self._buffer[0]) ) m.d.comb += self.data_o.eq(0) m.d.comb += self.valid_o.eq(1) m.d.comb += self.rw_o.eq(0) with m.Elif( - (self.state == self.WRITE_STATE) & (self.byte_num == 8) & (self.is_eol) + (self._state == States.WRITE) & (self._byte_num == 8) & (self._is_eol) ): m.d.comb += self.addr_o.eq( - Cat(self.buffer[3], self.buffer[2], self.buffer[1], self.buffer[0]) + Cat(self._buffer[3], self._buffer[2], self._buffer[1], self._buffer[0]) ) m.d.comb += self.data_o.eq( - Cat(self.buffer[7], self.buffer[6], self.buffer[5], self.buffer[4]) + Cat(self._buffer[7], self._buffer[6], self._buffer[5], self._buffer[4]) ) m.d.comb += self.valid_o.eq(1) m.d.comb += self.rw_o.eq(1) @@ -76,53 +83,57 @@ class ReceiveBridge(Elaboratable): m.d.comb += self.rw_o.eq(0) m.d.comb += self.valid_o.eq(0) - def drive_fsm(self, m): + def _drive_fsm(self, m): with m.If(self.valid_i): - with m.If(self.state == self.IDLE_STATE): - m.d.sync += self.byte_num.eq(0) + with m.If(self._state == States.IDLE): + m.d.sync += self._byte_num.eq(0) with m.If(self.data_i == ord("R")): - m.d.sync += self.state.eq(self.READ_STATE) + m.d.sync += self._state.eq(States.READ) with m.Elif(self.data_i == ord("W")): - m.d.sync += self.state.eq(self.WRITE_STATE) + m.d.sync += self._state.eq(States.WRITE) - with m.If(self.state == self.READ_STATE): + with m.If(self._state == States.READ): # buffer bytes if we don't have enough - with m.If(self.byte_num < 4): + with m.If(self._byte_num < 4): # if bytes aren't valid ASCII then return to IDLE state - with m.If(self.is_ascii_hex == 0): - m.d.sync += self.state.eq(self.IDLE_STATE) + with m.If(self._is_ascii_hex == 0): + m.d.sync += self._state.eq(States.IDLE) # otherwise buffer them with m.Else(): - m.d.sync += self.buffer[self.byte_num].eq(self.from_ascii_hex) - m.d.sync += self.byte_num.eq(self.byte_num + 1) + m.d.sync += self._buffer[self._byte_num].eq( + self._from_ascii_hex + ) + m.d.sync += self._byte_num.eq(self._byte_num + 1) with m.Else(): - m.d.sync += self.state.eq(self.IDLE_STATE) + m.d.sync += self._state.eq(States.IDLE) - with m.If(self.state == self.WRITE_STATE): + with m.If(self._state == States.WRITE): # buffer bytes if we don't have enough - with m.If(self.byte_num < 8): + with m.If(self._byte_num < 8): # if bytes aren't valid ASCII then return to IDLE state - with m.If(self.is_ascii_hex == 0): - m.d.sync += self.state.eq(self.IDLE_STATE) + with m.If(self._is_ascii_hex == 0): + m.d.sync += self._state.eq(States.IDLE) # otherwise buffer them with m.Else(): - m.d.sync += self.buffer[self.byte_num].eq(self.from_ascii_hex) - m.d.sync += self.byte_num.eq(self.byte_num + 1) + m.d.sync += self._buffer[self._byte_num].eq( + self._from_ascii_hex + ) + m.d.sync += self._byte_num.eq(self._byte_num + 1) with m.Else(): - m.d.sync += self.state.eq(self.IDLE_STATE) + m.d.sync += self._state.eq(States.IDLE) pass def elaborate(self, platform): m = Module() - self.drive_ascii_signals(m) - self.drive_output_bus(m) - self.drive_fsm(m) + self._drive_ascii_signals(m) + self._drive_output_bus(m) + self._drive_fsm(m) return m diff --git a/src/manta/uart/receiver.py b/src/manta/uart/receiver.py index 70650cf..d42c8ea 100644 --- a/src/manta/uart/receiver.py +++ b/src/manta/uart/receiver.py @@ -2,58 +2,63 @@ from amaranth import * class UARTReceiver(Elaboratable): + """ + A module for receiving bytes on a 8N1 UART at a configurable + baudrate. Outputs bytes as a stream. + """ + def __init__(self, clocks_per_baud): - self.clocks_per_baud = clocks_per_baud + self._clocks_per_baud = clocks_per_baud # Top-Level Ports self.rx = Signal() - self.data_o = Signal(8, reset=0) - self.valid_o = Signal(1, reset=0) + self.data_o = Signal(8) + self.valid_o = Signal(1) # Internal Signals - self.busy = Signal() - self.bit_index = Signal(range(10)) - self.baud_counter = Signal(range(2 * clocks_per_baud)) + self._busy = Signal() + self._bit_index = Signal(range(10)) + self._baud_counter = Signal(range(2 * clocks_per_baud)) - self.rx_d = Signal() - self.rx_q = Signal() - self.rx_q_prev = Signal() + self._rx_d = Signal() + self._rx_q = Signal() + self._rx_q_prev = Signal() def elaborate(self, platform): m = Module() # Two Flip-Flop Synchronizer m.d.sync += [ - self.rx_d.eq(self.rx), - self.rx_q.eq(self.rx_d), - self.rx_q_prev.eq(self.rx_q), + self._rx_d.eq(self.rx), + self._rx_q.eq(self._rx_d), + self._rx_q_prev.eq(self._rx_q), ] m.d.sync += self.valid_o.eq(0) - with m.If(~self.busy): - with m.If((~self.rx_q) & (self.rx_q_prev)): - m.d.sync += self.busy.eq(1) - m.d.sync += self.bit_index.eq(8) - m.d.sync += self.baud_counter.eq( - self.clocks_per_baud + (self.clocks_per_baud // 2) - 2 + with m.If(~self._busy): + with m.If((~self._rx_q) & (self._rx_q_prev)): + m.d.sync += self._busy.eq(1) + m.d.sync += self._bit_index.eq(8) + m.d.sync += self._baud_counter.eq( + self._clocks_per_baud + (self._clocks_per_baud // 2) - 2 ) with m.Else(): - with m.If(self.baud_counter == 0): - with m.If(self.bit_index == 0): + with m.If(self._baud_counter == 0): + with m.If(self._bit_index == 0): m.d.sync += self.valid_o.eq(1) - m.d.sync += self.busy.eq(0) - m.d.sync += self.bit_index.eq(0) - m.d.sync += self.baud_counter.eq(0) + m.d.sync += self._busy.eq(0) + m.d.sync += self._bit_index.eq(0) + m.d.sync += self._baud_counter.eq(0) with m.Else(): - # m.d.sync += self.data_o.eq(Cat(self.rx_q, self.data_o[0:7])) - m.d.sync += self.data_o.eq(Cat(self.data_o[1:8], self.rx_q)) - m.d.sync += self.bit_index.eq(self.bit_index - 1) - m.d.sync += self.baud_counter.eq(self.clocks_per_baud - 1) + # m.d.sync += self.data_o.eq(Cat(self._rx_q, self.data_o[0:7])) + m.d.sync += self.data_o.eq(Cat(self.data_o[1:8], self._rx_q)) + m.d.sync += self._bit_index.eq(self._bit_index - 1) + m.d.sync += self._baud_counter.eq(self._clocks_per_baud - 1) with m.Else(): - m.d.sync += self.baud_counter.eq(self.baud_counter - 1) + m.d.sync += self._baud_counter.eq(self._baud_counter - 1) return m diff --git a/src/manta/uart/transmit_bridge.py b/src/manta/uart/transmit_bridge.py index 3f1b640..2505309 100644 --- a/src/manta/uart/transmit_bridge.py +++ b/src/manta/uart/transmit_bridge.py @@ -2,86 +2,91 @@ from amaranth import * class TransmitBridge(Elaboratable): + """ + A module for bridging Manta's internal bus to the stream of bytes + expected by the UARTTransmitter module. + """ + def __init__(self): # Top-Level Ports self.data_i = Signal(16) self.rw_i = Signal() self.valid_i = Signal() - self.data_o = Signal(8, reset=0) + self.data_o = Signal(8) self.start_o = Signal(1) self.done_i = Signal() # Internal Signals - self.buffer = Signal(16, reset=0) - self.count = Signal(4, reset=0) - self.busy = Signal(1, reset=0) - self.to_ascii_hex = Signal(8) - self.n = Signal(4) + self._buffer = Signal(16) + self._count = Signal(4) + self._busy = Signal(1) + self._to_ascii_hex = Signal(8) + self._n = Signal(4) def elaborate(self, platform): m = Module() - m.d.comb += self.start_o.eq(self.busy) + m.d.comb += self.start_o.eq(self._busy) - with m.If(~self.busy): + with m.If(~self._busy): with m.If((self.valid_i) & (~self.rw_i)): - m.d.sync += self.busy.eq(1) - m.d.sync += self.buffer.eq(self.data_i) + m.d.sync += self._busy.eq(1) + m.d.sync += self._buffer.eq(self.data_i) with m.Else(): # uart_tx is transmitting a byte: with m.If(self.done_i): - m.d.sync += self.count.eq(self.count + 1) + m.d.sync += self._count.eq(self._count + 1) # Message has been transmitted - with m.If(self.count > 5): - m.d.sync += self.count.eq(0) + with m.If(self._count > 5): + m.d.sync += self._count.eq(0) # Go back to idle, or transmit next message with m.If((self.valid_i) & (~self.rw_i)): - m.d.sync += self.buffer.eq(self.data_i) + m.d.sync += self._buffer.eq(self.data_i) with m.Else(): - m.d.sync += self.busy.eq(0) + m.d.sync += self._busy.eq(0) # define to_ascii_hex - with m.If(self.n < 10): - m.d.comb += self.to_ascii_hex.eq(self.n + 0x30) + with m.If(self._n < 10): + m.d.comb += self._to_ascii_hex.eq(self._n + 0x30) with m.Else(): - m.d.comb += self.to_ascii_hex.eq(self.n + 0x41 - 10) + m.d.comb += self._to_ascii_hex.eq(self._n + 0x41 - 10) # run the sequence - with m.If(self.count == 0): - m.d.comb += self.n.eq(0) + with m.If(self._count == 0): + m.d.comb += self._n.eq(0) m.d.comb += self.data_o.eq(ord("D")) - with m.Elif(self.count == 1): - m.d.comb += self.n.eq(self.buffer[12:16]) - m.d.comb += self.data_o.eq(self.to_ascii_hex) + with m.Elif(self._count == 1): + m.d.comb += self._n.eq(self._buffer[12:16]) + m.d.comb += self.data_o.eq(self._to_ascii_hex) - with m.Elif(self.count == 2): - m.d.comb += self.n.eq(self.buffer[8:12]) - m.d.comb += self.data_o.eq(self.to_ascii_hex) + with m.Elif(self._count == 2): + m.d.comb += self._n.eq(self._buffer[8:12]) + m.d.comb += self.data_o.eq(self._to_ascii_hex) - with m.Elif(self.count == 3): - m.d.comb += self.n.eq(self.buffer[4:8]) - m.d.comb += self.data_o.eq(self.to_ascii_hex) + with m.Elif(self._count == 3): + m.d.comb += self._n.eq(self._buffer[4:8]) + m.d.comb += self.data_o.eq(self._to_ascii_hex) - with m.Elif(self.count == 4): - m.d.comb += self.n.eq(self.buffer[0:4]) - m.d.comb += self.data_o.eq(self.to_ascii_hex) + with m.Elif(self._count == 4): + m.d.comb += self._n.eq(self._buffer[0:4]) + m.d.comb += self.data_o.eq(self._to_ascii_hex) - with m.Elif(self.count == 5): - m.d.comb += self.n.eq(0) + with m.Elif(self._count == 5): + m.d.comb += self._n.eq(0) m.d.comb += self.data_o.eq(ord("\r")) - with m.Elif(self.count == 6): - m.d.comb += self.n.eq(0) + with m.Elif(self._count == 6): + m.d.comb += self._n.eq(0) m.d.comb += self.data_o.eq(ord("\n")) with m.Else(): - m.d.comb += self.n.eq(0) + m.d.comb += self._n.eq(0) m.d.comb += self.data_o.eq(0) return m diff --git a/src/manta/uart/transmitter.py b/src/manta/uart/transmitter.py index b67a1ab..2084c0a 100644 --- a/src/manta/uart/transmitter.py +++ b/src/manta/uart/transmitter.py @@ -2,8 +2,13 @@ from amaranth import * class UARTTransmitter(Elaboratable): + """ + A module for transmitting bytes on a 8N1 UART at a configurable + baudrate. Accepts bytes as a stream. + """ + def __init__(self, clocks_per_baud): - self.clocks_per_baud = clocks_per_baud + self._clocks_per_baud = clocks_per_baud # Top-Level Ports self.data_i = Signal(8) @@ -13,38 +18,40 @@ class UARTTransmitter(Elaboratable): self.tx = Signal(reset=1) # Internal Signals - self.baud_counter = Signal(range(clocks_per_baud)) - self.buffer = Signal(9) - self.bit_index = Signal(4) + self._baud_counter = Signal(range(self._clocks_per_baud)) + self._buffer = Signal(9) + self._bit_index = Signal(4) def elaborate(self, platform): m = Module() with m.If((self.start_i) & (self.done_o)): - m.d.sync += self.baud_counter.eq(self.clocks_per_baud - 1) - m.d.sync += self.buffer.eq(Cat(self.data_i, 1)) - m.d.sync += self.bit_index.eq(0) + m.d.sync += self._baud_counter.eq(self._clocks_per_baud - 1) + m.d.sync += self._buffer.eq(Cat(self.data_i, 1)) + m.d.sync += self._bit_index.eq(0) m.d.sync += self.done_o.eq(0) m.d.sync += self.tx.eq(0) with m.Elif(~self.done_o): - m.d.sync += self.baud_counter.eq(self.baud_counter - 1) - m.d.sync += self.done_o.eq((self.baud_counter == 1) & (self.bit_index == 9)) + m.d.sync += self._baud_counter.eq(self._baud_counter - 1) + m.d.sync += self.done_o.eq( + (self._baud_counter == 1) & (self._bit_index == 9) + ) # A baud period has elapsed - with m.If(self.baud_counter == 0): - m.d.sync += self.baud_counter.eq(self.clocks_per_baud - 1) + with m.If(self._baud_counter == 0): + m.d.sync += self._baud_counter.eq(self._clocks_per_baud - 1) # Clock out another bit if there are any left - with m.If(self.bit_index < 9): - m.d.sync += self.tx.eq(self.buffer.bit_select(self.bit_index, 1)) - m.d.sync += self.bit_index.eq(self.bit_index + 1) + with m.If(self._bit_index < 9): + m.d.sync += self.tx.eq(self._buffer.bit_select(self._bit_index, 1)) + m.d.sync += self._bit_index.eq(self._bit_index + 1) # Byte has been sent, send out next one or go to idle with m.Else(): with m.If(self.start_i): - m.d.sync += self.buffer.eq(Cat(self.data_i, 1)) - m.d.sync += self.bit_index.eq(0) + m.d.sync += self._buffer.eq(Cat(self.data_i, 1)) + m.d.sync += self._bit_index.eq(0) m.d.sync += self.tx.eq(0) with m.Else(): From 0e1bc30802fbce9fac62c89a8dbc755c0b10cb31 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 17 Feb 2024 15:18:57 -0800 Subject: [PATCH 49/89] wrap docstrings at 80 chars --- src/manta/ethernet/__init__.py | 24 +++++++++++++----------- src/manta/ethernet/sink_bridge.py | 6 ++---- src/manta/ethernet/source_bridge.py | 6 ++---- src/manta/logic_analyzer/__init__.py | 3 ++- src/manta/logic_analyzer/playback.py | 13 ++++--------- src/manta/logic_analyzer/sample_mem.py | 5 +++++ src/manta/uart/__init__.py | 23 +++++++++++++---------- src/manta/uart/receive_bridge.py | 4 ++-- src/manta/uart/receiver.py | 4 ++-- src/manta/uart/transmit_bridge.py | 4 ++-- src/manta/uart/transmitter.py | 4 ++-- 11 files changed, 49 insertions(+), 47 deletions(-) diff --git a/src/manta/ethernet/__init__.py b/src/manta/ethernet/__init__.py index 2fd1104..e283237 100644 --- a/src/manta/ethernet/__init__.py +++ b/src/manta/ethernet/__init__.py @@ -10,8 +10,8 @@ class EthernetInterface(Elaboratable): """ A module for communicating with Manta over Ethernet, using UDP. - Provides methods for generating synthesizable logic for the FPGA, - as well as methods for reading and writing to memory by the host. + Provides methods for generating synthesizable logic for the FPGA, as well + as methods for reading and writing to memory by the host. """ def __init__(self, config): @@ -84,8 +84,8 @@ class EthernetInterface(Elaboratable): def get_top_level_ports(self): """ - Return the Amaranth signals that should be included as ports in the top-level - Manta module. + Return the Amaranth signals that should be included as ports in the + top-level Manta module. """ ports = [ self.rmii_clocks_ref_clk, @@ -166,8 +166,8 @@ class EthernetInterface(Elaboratable): def read(self, addrs): """ - Read the data stored in a set of address on Manta's internal memory. Addresses - must be specified as either integers or a list of integers. + Read the data stored in a set of address on Manta's internal memory. + Addresses must be specified as either integers or a list of integers. """ # Handle a single integer address @@ -205,8 +205,9 @@ class EthernetInterface(Elaboratable): def write(self, addrs, datas): """ - Write the provided data into the provided addresses in Manta's internal memory. - Addresses and data must be specified as either integers or a list of integers. + Write the provided data into the provided addresses in Manta's internal + memory. Addresses and data must be specified as either integers or a + list of integers. """ # Handle a single integer address and data @@ -241,9 +242,10 @@ class EthernetInterface(Elaboratable): def generate_liteeth_core(self): """ - Generate a LiteEth core by calling a slightly modified form of the LiteEth - standalone core generator. This passes the contents of the 'ethernet' section - of the Manta configuration file to LiteEth, after modifying it slightly. + Generate a LiteEth core by calling a slightly modified form of the + LiteEth standalone core generator. This passes the contents of the + 'ethernet' section of the Manta configuration file to LiteEth, after + modifying it slightly. """ liteeth_config = self._config.copy() diff --git a/src/manta/ethernet/sink_bridge.py b/src/manta/ethernet/sink_bridge.py index ecff0d0..621d8b9 100644 --- a/src/manta/ethernet/sink_bridge.py +++ b/src/manta/ethernet/sink_bridge.py @@ -4,10 +4,8 @@ from manta.utils import * class UDPSinkBridge(Elaboratable): """ - A module for bridging Manta's internal bus to an AXI stream of UDP - packet data. - - Connects to the LiteEth core's "sink" port. + A module for bridging Manta's internal bus to an AXI stream of UDP packet + data. Connects to the LiteEth core's "sink" port. """ def __init__(self): diff --git a/src/manta/ethernet/source_bridge.py b/src/manta/ethernet/source_bridge.py index 9506636..91b7fbc 100644 --- a/src/manta/ethernet/source_bridge.py +++ b/src/manta/ethernet/source_bridge.py @@ -4,10 +4,8 @@ from manta.utils import * class UDPSourceBridge(Elaboratable): """ - A module for bridging the AXI-stream of incoming UDP packet data to - Manta's internal bus. - - Connects to the LiteEth core's "source" port. + A module for bridging the AXI-stream of incoming UDP packet data to Manta's + internal bus. Connects to the LiteEth core's "source" port. """ def __init__(self): diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index fddcfa6..0d34941 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -7,7 +7,8 @@ from manta.logic_analyzer.playback import LogicAnalyzerPlayback class LogicAnalyzerCore(Elaboratable): - """A logic analzyer, implemented in the FPGA fabric. Connects to the rest of the cores + """ + A logic analzyer, implemented in the FPGA fabric. Connects to the rest of the cores over Manta's internal bus, and may be operated from a user's machine through the Python API. Parameters: diff --git a/src/manta/logic_analyzer/playback.py b/src/manta/logic_analyzer/playback.py index 50100e6..3cf17aa 100644 --- a/src/manta/logic_analyzer/playback.py +++ b/src/manta/logic_analyzer/playback.py @@ -2,16 +2,11 @@ from amaranth import * class LogicAnalyzerPlayback(Elaboratable): - """A synthesizable module that plays back data captured by a LogicAnalyzerCore. + """ + A synthesizable module that plays back data captured by a LogicAnalyzerCore. - Parameters: - ---------- - data : list[int] - The raw captured data taken by the LogicAnalyzerCore. This consists of the values of - all the input probes concatenated together at every timestep. - - config : dict - The configuration of the LogicAnalyzerCore that took this capture. + Takes a list of all the samples captured by a core, along with the config + of the core used to take it. """ def __init__(self, data, config): diff --git a/src/manta/logic_analyzer/sample_mem.py b/src/manta/logic_analyzer/sample_mem.py index fc8f218..045fabb 100644 --- a/src/manta/logic_analyzer/sample_mem.py +++ b/src/manta/logic_analyzer/sample_mem.py @@ -3,6 +3,11 @@ from manta.memory_core import ReadOnlyMemoryCore class LogicAnalyzerSampleMemory(ReadOnlyMemoryCore): + """ + A module that wraps a ReadOnlyMemoryCore, using the config from a LogicAnalyzerCore + to determine the parameters with which to instantiate the core. + """ + def __init__(self, config, base_addr, interface): width = sum(config["probes"].values()) depth = config["sample_depth"] diff --git a/src/manta/uart/__init__.py b/src/manta/uart/__init__.py index 60bab24..d584ad5 100644 --- a/src/manta/uart/__init__.py +++ b/src/manta/uart/__init__.py @@ -11,8 +11,8 @@ class UARTInterface(Elaboratable): """ A module for communicating with Manta over UART. - Provides methods for generating synthesizable logic for the FPGA, - as well as methods for reading and writing to memory by the host. + Provides methods for generating synthesizable logic for the FPGA, as well + as methods for reading and writing to memory by the host. """ def __init__(self, port, baudrate, clock_freq, chunk_size=256): @@ -80,7 +80,8 @@ class UARTInterface(Elaboratable): def _get_serial_device(self): """ - Return an open PySerial serial device if one exists, otherwise, open one and return it. + Return an open PySerial serial device if one exists, otherwise, open + one and return it. """ # Check if we've already opened a device @@ -129,15 +130,15 @@ class UARTInterface(Elaboratable): def get_top_level_ports(self): """ - Return the Amaranth signals that should be included as ports in the top-level - Manta module. + Return the Amaranth signals that should be included as ports in the + top-level Manta module. """ return [self.rx, self.tx] def read(self, addrs): """ - Read the data stored in a set of address on Manta's internal memory. Addresses - must be specified as either integers or a list of integers. + Read the data stored in a set of address on Manta's internal memory. + Addresses must be specified as either integers or a list of integers. """ # Handle a single integer address @@ -180,8 +181,9 @@ class UARTInterface(Elaboratable): def write(self, addrs, datas): """ - Write the provided data into the provided addresses in Manta's internal memory. - Addresses and data must be specified as either integers or a list of integers. + Write the provided data into the provided addresses in Manta's internal + memory. Addresses and data must be specified as either integers or a + list of integers. """ # Handle a single integer address and data @@ -212,7 +214,8 @@ class UARTInterface(Elaboratable): def _decode_read_response(self, response_bytes): """ - Check that read response is formatted properly, and return the encoded data if so. + Check that read response is formatted properly, and return the encoded + data if so. """ # Make sure response is not empty diff --git a/src/manta/uart/receive_bridge.py b/src/manta/uart/receive_bridge.py index 07179b1..d78c4bd 100644 --- a/src/manta/uart/receive_bridge.py +++ b/src/manta/uart/receive_bridge.py @@ -11,8 +11,8 @@ class States(IntEnum): class ReceiveBridge(Elaboratable): """ - A module for bridging the stream of bytes from the UARTReceiver - module to Manta's internal bus. + A module for bridging the stream of bytes from the UARTReceiver module to + Manta's internal bus. """ def __init__(self): diff --git a/src/manta/uart/receiver.py b/src/manta/uart/receiver.py index d42c8ea..2fe65df 100644 --- a/src/manta/uart/receiver.py +++ b/src/manta/uart/receiver.py @@ -3,8 +3,8 @@ from amaranth import * class UARTReceiver(Elaboratable): """ - A module for receiving bytes on a 8N1 UART at a configurable - baudrate. Outputs bytes as a stream. + A module for receiving bytes on a 8N1 UART at a configurable baudrate. + Outputs bytes as a stream. """ def __init__(self, clocks_per_baud): diff --git a/src/manta/uart/transmit_bridge.py b/src/manta/uart/transmit_bridge.py index 2505309..abb1c82 100644 --- a/src/manta/uart/transmit_bridge.py +++ b/src/manta/uart/transmit_bridge.py @@ -3,8 +3,8 @@ from amaranth import * class TransmitBridge(Elaboratable): """ - A module for bridging Manta's internal bus to the stream of bytes - expected by the UARTTransmitter module. + A module for bridging Manta's internal bus to the stream of bytes expected + by the UARTTransmitter module. """ def __init__(self): diff --git a/src/manta/uart/transmitter.py b/src/manta/uart/transmitter.py index 2084c0a..cea5764 100644 --- a/src/manta/uart/transmitter.py +++ b/src/manta/uart/transmitter.py @@ -3,8 +3,8 @@ from amaranth import * class UARTTransmitter(Elaboratable): """ - A module for transmitting bytes on a 8N1 UART at a configurable - baudrate. Accepts bytes as a stream. + A module for transmitting bytes on a 8N1 UART at a configurable baudrate. + Accepts bytes as a stream. """ def __init__(self, clocks_per_baud): From ea6b3f73b9a2b98e4565da486910aeb133243e87 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 17 Feb 2024 16:07:29 -0800 Subject: [PATCH 50/89] add docstrings --- src/manta/ethernet/__init__.py | 3 + src/manta/io_core.py | 60 ++++++---- src/manta/logic_analyzer/__init__.py | 34 +++--- src/manta/logic_analyzer/fsm.py | 10 +- src/manta/logic_analyzer/playback.py | 4 + src/manta/logic_analyzer/trigger_block.py | 17 ++- src/manta/manta.py | 4 + src/manta/memory_core.py | 137 ++++++++++++---------- src/manta/uart/__init__.py | 3 + 9 files changed, 167 insertions(+), 105 deletions(-) diff --git a/src/manta/ethernet/__init__.py b/src/manta/ethernet/__init__.py index e283237..1d779a9 100644 --- a/src/manta/ethernet/__init__.py +++ b/src/manta/ethernet/__init__.py @@ -12,6 +12,9 @@ class EthernetInterface(Elaboratable): Provides methods for generating synthesizable logic for the FPGA, as well as methods for reading and writing to memory by the host. + + More information available in the online documentation at: + https://fischermoseley.github.io/manta/ethernet_interface/ """ def __init__(self, config): diff --git a/src/manta/io_core.py b/src/manta/io_core.py index 39c0634..91322d80 100644 --- a/src/manta/io_core.py +++ b/src/manta/io_core.py @@ -5,20 +5,26 @@ from math import ceil class IOCore(Elaboratable): """ - Contains the HDL to instantiate an IO core on a FPGA, and the functions to interact with it. For - more information on the core itself, check out the IO core documentation. + A module for setting and getting the values of registers of arbitrary size + on a FPGA. + + Provides methods for generating synthesizable logic for the FPGA, as well + as methods for reading and writing the value of a register. + + More information available in the online documentation at: + https://fischermoseley.github.io/manta/io_core/ """ def __init__(self, config, base_addr, interface): - self.config = config + self._config = config self.base_addr = base_addr self.interface = interface + self._check_config(self._config) - self.check_config(self.config) self.define_signals() self.mmap, self.max_addr = self.assign_memory() - def check_config(self, config): + def _check_config(self, config): # make sure ports are defined if "inputs" not in config and "outputs" not in config: raise ValueError("No input or output ports specified.") @@ -91,14 +97,14 @@ class IOCore(Elaboratable): self.bus_o = Signal(InternalBus()) # Input Probes (and buffers) - if "inputs" in self.config: - for name, width in self.config["inputs"].items(): + if "inputs" in self._config: + for name, width in self._config["inputs"].items(): setattr(self, name, Signal(width, name=name)) setattr(self, name + "_buf", Signal(width, name=name + "_buf")) # Output Probes (and buffers) - if "outputs" in self.config: - for name, attrs in self.config["outputs"].items(): + if "outputs" in self._config: + for name, attrs in self._config["outputs"].items(): if isinstance(attrs, dict): width = attrs["width"] initial_value = attrs["initial_value"] @@ -148,11 +154,11 @@ class IOCore(Elaboratable): # Add all input and output probes all_probes = {} - if "inputs" in self.config: - all_probes = {**all_probes, **self.config["inputs"]} + if "inputs" in self._config: + all_probes = {**all_probes, **self._config["inputs"]} - if "outputs" in self.config: - all_probes = {**all_probes, **self.config["outputs"]} + if "outputs" in self._config: + all_probes = {**all_probes, **self._config["outputs"]} for name, attrs in all_probes.items(): # Handle output probes that might have initial value specified in addition to width @@ -184,15 +190,15 @@ class IOCore(Elaboratable): # Update buffers from probes with m.If(self.strobe): # Input buffers - if "inputs" in self.config: - for name in self.config["inputs"]: + if "inputs" in self._config: + for name in self._config["inputs"]: input_probe = getattr(self, name) input_probe_buf = getattr(self, name + "_buf") m.d.sync += input_probe_buf.eq(input_probe) # Output buffers - if "outputs" in self.config: - for name in self.config["outputs"]: + if "outputs" in self._config: + for name in self._config["outputs"]: output_probe = getattr(self, name) output_probe_buf = getattr(self, name + "_buf") m.d.sync += output_probe.eq(output_probe_buf) @@ -213,23 +219,31 @@ class IOCore(Elaboratable): return m def get_top_level_ports(self): + """ + Return the Amaranth signals that should be included as ports in the + top-level Manta module. + """ ports = [] - if "inputs" in self.config: - for name in self.config["inputs"].keys(): + if "inputs" in self._config: + for name in self._config["inputs"].keys(): ports.append(getattr(self, name)) - if "outputs" in self.config: - for name in self.config["outputs"].keys(): + if "outputs" in self._config: + for name in self._config["outputs"].keys(): ports.append(getattr(self, name)) return ports def get_max_addr(self): + """ + Return the maximum addresses in memory used by the core. The address space used + by the core extends from `base_addr` to the number returned by this function. + """ return self.max_addr def set_probe(self, probe_name, value): # check that probe is an output probe - if probe_name not in self.config["outputs"]: + if probe_name not in self._config["outputs"]: raise ValueError(f"Output probe '{probe_name}' not found.") # check that value is an integer @@ -237,7 +251,7 @@ class IOCore(Elaboratable): raise ValueError("Value must be an integer.") # get the width of the probe, make sure value isn't too large for the probe - attrs = self.config["outputs"][probe_name] + attrs = self._config["outputs"][probe_name] if isinstance(attrs, int): width = attrs diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index 0d34941..66e62a0 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -8,28 +8,14 @@ from manta.logic_analyzer.playback import LogicAnalyzerPlayback class LogicAnalyzerCore(Elaboratable): """ - A logic analzyer, implemented in the FPGA fabric. Connects to the rest of the cores - over Manta's internal bus, and may be operated from a user's machine through the Python API. - - Parameters: - ---------- - config : dict - Configuration options. This is taken from the section of Manta's configuration YAML that - describes the core. - - base_addr : int - Where to place the core in Manta's internal memory map. This determines the beginning of - the core's address space. The end of the core's address space may be obtained by calling - the get_max_addr() method. - - interface : UARTInterface or EthernetInterface - The interface used to communicate with the core. - - Attributes: - ---------- - None + A module for generating a logic analyzer on the FPGA, with configurable + triggers, trigger position, and trigger modes. + Provides methods for generating synthesizable logic for the FPGA, as well + as methods for reading and writing the value of a register. + More information available in the online documentation at: + https://fischermoseley.github.io/manta/logic_analyzer_core/ """ def __init__(self, config, base_addr, interface): @@ -186,6 +172,10 @@ class LogicAnalyzerCore(Elaboratable): return m def get_top_level_ports(self): + """ + Return the Amaranth signals that should be included as ports in the + top-level Manta module. + """ return self.probes def get_probe(self, name): @@ -196,6 +186,10 @@ class LogicAnalyzerCore(Elaboratable): raise ValueError(f"Probe '{name}' not found in Logic Analyzer core.") def get_max_addr(self): + """ + Return the maximum addresses in memory used by the core. The address space used + by the core extends from `base_addr` to the number returned by this function. + """ return self.sample_mem.get_max_addr() def capture(self, verbose=False): diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index 2c8215d..d90322a 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -19,7 +19,11 @@ class TriggerModes(IntEnum): class LogicAnalyzerFSM(Elaboratable): - """ """ + """ + A module containing the state machine for a LogicAnalyzerCore. Primarily + responsible for controlling the write port of the Logic Analyzer's sample + memory in each trigger mode (immediate, incremental, single-shot). + """ def __init__(self, config, base_addr, interface): self.config = config @@ -47,6 +51,10 @@ class LogicAnalyzerFSM(Elaboratable): self.bus_o = self.r.bus_o def get_max_addr(self): + """ + Return the maximum addresses in memory used by the core. The address space used + by the core extends from `base_addr` to the number returned by this function. + """ return self.r.get_max_addr() def increment_mod_sample_depth(self, m, signal): diff --git a/src/manta/logic_analyzer/playback.py b/src/manta/logic_analyzer/playback.py index 3cf17aa..3fc72e4 100644 --- a/src/manta/logic_analyzer/playback.py +++ b/src/manta/logic_analyzer/playback.py @@ -72,4 +72,8 @@ class LogicAnalyzerPlayback(Elaboratable): return m def get_top_level_ports(self): + """ + Return the Amaranth signals that should be included as ports in the + exported Verilog module. + """ return [self.start, self.valid] + list(self.top_level_probes.values()) diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 3cfbba5..f0bf5f6 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -3,7 +3,12 @@ from manta.io_core import IOCore class LogicAnalyzerTriggerBlock(Elaboratable): - """ """ + """ + A module containing an instance of a LogicAnalyzerTrigger for each input + probe. The operations and arguments of these LogicAnalyzerTriggers are set + with an internal IOCore, which is connected to the internal bus, and allows + the triggers to be reprogrammed without reflashing the FPGA. + """ def __init__(self, probes, base_addr, interface): # Instantiate a bunch of trigger blocks @@ -26,6 +31,10 @@ class LogicAnalyzerTriggerBlock(Elaboratable): self.trig = Signal(1) def get_max_addr(self): + """ + Return the maximum addresses in memory used by the core. The address space used + by the core extends from `base_addr` to the number returned by this function. + """ return self.r.get_max_addr() def clear_triggers(self): @@ -71,6 +80,12 @@ class LogicAnalyzerTriggerBlock(Elaboratable): class LogicAnalyzerTrigger(Elaboratable): + """ + A module containing a programmable "trigger" for a given input signal, + which asserts its output when the programmed "trigger condition" is met. + This condition is programmed through the `op` and `arg` inputs. + """ + def __init__(self, signal): self.operations = { "DISABLE": 0, diff --git a/src/manta/manta.py b/src/manta/manta.py index 313af71..3625a19 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -149,6 +149,10 @@ class Manta(Elaboratable): return m def get_top_level_ports(self): + """ + Return the Amaranth signals that should be included as ports in the + top-level Manta module. + """ ports = self.interface.get_top_level_ports() for name, instance in self.cores.items(): diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index 50c78f8..a99549a 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -4,21 +4,39 @@ from math import ceil class ReadOnlyMemoryCore(Elaboratable): + """ + A module for generating a memory on the FPGA, with a read port tied to + Manta's internal bus, and a write port provided to user logic. + + Provides methods for generating synthesizable logic for the FPGA, as well + as methods for reading and writing the value of a register. + + More information available in the online documentation at: + https://fischermoseley.github.io/manta/memory_core/ + """ + def __init__(self, config, base_addr, interface): - self.config = config - self.base_addr = base_addr - self.interface = interface + self._config = config + self._base_addr = base_addr + self._interface = interface + self._check_config(config) - self.check_config(config) + self._depth = self._config["depth"] + self._width = self._config["width"] + self._max_addr = self._base_addr + (self._depth * ceil(self._width / 16)) - self.depth = self.config["depth"] - self.width = self.config["width"] - self.max_addr = self.base_addr + (self.depth * ceil(self.width / 16)) + # Bus Connections + self.bus_i = Signal(InternalBus()) + self.bus_o = Signal(InternalBus()) - self.define_signals() - self.define_mems() + # User Port + self.user_addr = Signal(range(self._depth)) + self.user_data = Signal(self._width) + self.user_we = Signal(1) - def check_config(self, config): + self._define_mems() + + def _check_config(self, config): # Check for unrecognized options valid_options = ["type", "depth", "width"] for option in config: @@ -45,56 +63,46 @@ class ReadOnlyMemoryCore(Elaboratable): if config["width"] <= 0: raise ValueError("Width of memory core must be positive. ") - def define_signals(self): - # Bus Input/Pipelining/Output - self.bus_i = Signal(InternalBus()) - self.bus_pipe = [Signal(InternalBus()) for _ in range(3)] - self.bus_o = Signal(InternalBus()) - - # User Port - self.user_addr = Signal(range(self.depth)) - self.user_data = Signal(self.width) - self.user_we = Signal(1) - - def pipeline_bus(self, m): - m.d.sync += self.bus_pipe[0].eq(self.bus_i) + def _pipeline_bus(self, m): + self._bus_pipe = [Signal(InternalBus()) for _ in range(3)] + m.d.sync += self._bus_pipe[0].eq(self.bus_i) for i in range(1, 3): - m.d.sync += self.bus_pipe[i].eq(self.bus_pipe[i - 1]) + m.d.sync += self._bus_pipe[i].eq(self._bus_pipe[i - 1]) - m.d.sync += self.bus_o.eq(self.bus_pipe[2]) + m.d.sync += self.bus_o.eq(self._bus_pipe[2]) - def define_mems(self): - # ok there's three cases: - # 1. integer number of 16 bit mems - # 2. integer number of 16 bit mems + partial mem - # 3. just the partial mem (width < 16) + def _define_mems(self): + # There's three cases that must be handled: + # 1. Integer number of 16 bit mems + # 2. Integer number of 16 bit mems + partial mem + # 3. Just the partial mem (width < 16) # Only one, partial-width memory is needed - if self.width < 16: - self.mems = [Memory(depth=self.depth, width=self.width)] + if self._width < 16: + self._mems = [Memory(depth=self._depth, width=self._width)] # Only full-width memories are needed - elif self.width % 16 == 0: - self.mems = [ - Memory(depth=self.depth, width=16) for _ in range(self.width // 16) + elif self._width % 16 == 0: + self._mems = [ + Memory(depth=self._depth, width=16) for _ in range(self._width // 16) ] # Both full-width and partial memories are needed else: - self.mems = [ - Memory(depth=self.depth, width=16) for i in range(self.width // 16) + self._mems = [ + Memory(depth=self._depth, width=16) for i in range(self._width // 16) ] - self.mems += [Memory(depth=self.depth, width=self.width % 16)] + self._mems += [Memory(depth=self._depth, width=self._width % 16)] - def handle_read_ports(self, m): + def _handle_read_ports(self, m): # These are tied to the bus - for i, mem in enumerate(self.mems): + for i, mem in enumerate(self._mems): read_port = mem.read_port() m.d.comb += read_port.en.eq(1) - start_addr = self.base_addr + (i * self.depth) - stop_addr = start_addr + self.depth - 1 + start_addr = self._base_addr + (i * self._depth) + stop_addr = start_addr + self._depth - 1 # Throw BRAM operations into the front of the pipeline with m.If( @@ -107,16 +115,16 @@ class ReadOnlyMemoryCore(Elaboratable): # Pull BRAM reads from the back of the pipeline with m.If( - (self.bus_pipe[2].valid) - & (~self.bus_pipe[2].rw) - & (self.bus_pipe[2].addr >= start_addr) - & (self.bus_pipe[2].addr <= stop_addr) + (self._bus_pipe[2].valid) + & (~self._bus_pipe[2].rw) + & (self._bus_pipe[2].addr >= start_addr) + & (self._bus_pipe[2].addr <= stop_addr) ): m.d.sync += self.bus_o.data.eq(read_port.data) - def handle_write_ports(self, m): + def _handle_write_ports(self, m): # These are given to the user - for i, mem in enumerate(self.mems): + for i, mem in enumerate(self._mems): write_port = mem.write_port() m.d.comb += write_port.addr.eq(self.user_addr) @@ -127,19 +135,27 @@ class ReadOnlyMemoryCore(Elaboratable): m = Module() # Add memories as submodules - for i, mem in enumerate(self.mems): + for i, mem in enumerate(self._mems): m.submodules[f"mem_{i}"] = mem - self.pipeline_bus(m) - self.handle_read_ports(m) - self.handle_write_ports(m) + self._pipeline_bus(m) + self._handle_read_ports(m) + self._handle_write_ports(m) return m def get_top_level_ports(self): + """ + Return the Amaranth signals that should be included as ports in the + top-level Manta module. + """ return [self.user_addr, self.user_data, self.user_we] def get_max_addr(self): - return self.max_addr + """ + Return the maximum addresses in memory used by the core. The address space used + by the core extends from `base_addr` to the number returned by this function. + """ + return self._max_addr def read_from_user_addr(self, addrs): """ @@ -147,8 +163,9 @@ class ReadOnlyMemoryCore(Elaboratable): """ # Convert user address space to bus address space - # (for instance, for a core with base address 10 and width 33, - # reading from address 4 is actually a read from address 14 and address 14 + depth, and address 14 + 2*depth) + # (for instance, for a core with base address 10 and width 33, + # reading from address 4 is actually a read from address 14 + # and address 14 + depth, and address 14 + 2*depth) if isinstance(addrs, int): return self.read_from_user_addr([addrs])[0] @@ -156,11 +173,11 @@ class ReadOnlyMemoryCore(Elaboratable): bus_addrs = [] for addr in addrs: bus_addrs += [ - addr + self.base_addr + i * self.depth for i in range(len(self.mems)) + addr + self._base_addr + i * self._depth for i in range(len(self._mems)) ] - datas = self.interface.read(bus_addrs) - data_chunks = split_into_chunks(datas, len(self.mems)) + datas = self._interface.read(bus_addrs) + data_chunks = split_into_chunks(datas, len(self._mems)) return [words_to_value(chunk) for chunk in data_chunks] # def write_to_user_addr(self, addrs, datas): @@ -171,11 +188,11 @@ class ReadOnlyMemoryCore(Elaboratable): # bus_addrs = [] # for addr in addrs: # bus_addrs += [ - # addr + self.base_addr + i * self.depth for i in range(len(self.mems)) + # addr + self._base_addr + i * self._depth for i in range(len(self._mems)) # ] # bus_datas = [] # for data in datas: # bus_datas += value_to_words(data) - # self.interface.write(bus_addrs, bus_datas) + # self._interface.write(bus_addrs, bus_datas) diff --git a/src/manta/uart/__init__.py b/src/manta/uart/__init__.py index d584ad5..2e38cf4 100644 --- a/src/manta/uart/__init__.py +++ b/src/manta/uart/__init__.py @@ -13,6 +13,9 @@ class UARTInterface(Elaboratable): Provides methods for generating synthesizable logic for the FPGA, as well as methods for reading and writing to memory by the host. + + More information available in the online documentation at: + https://fischermoseley.github.io/manta/uart_interface/ """ def __init__(self, port, baudrate, clock_freq, chunk_size=256): From 3f724b333684b1e89991a871dbdb25860e2f9b72 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 17 Feb 2024 21:34:17 -0800 Subject: [PATCH 51/89] add width check function to utils --- src/manta/logic_analyzer/__init__.py | 5 +++-- src/manta/logic_analyzer/fsm.py | 5 +++-- src/manta/logic_analyzer/trigger_block.py | 5 +++-- src/manta/memory_core.py | 5 +++-- src/manta/utils.py | 23 +++++++++++++++++------ 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index 66e62a0..b46a449 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -187,8 +187,9 @@ class LogicAnalyzerCore(Elaboratable): def get_max_addr(self): """ - Return the maximum addresses in memory used by the core. The address space used - by the core extends from `base_addr` to the number returned by this function. + Return the maximum addresses in memory used by the core. The address + space used by the core extends from `base_addr` to the number returned + by this function. """ return self.sample_mem.get_max_addr() diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index d90322a..461fa8b 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -52,8 +52,9 @@ class LogicAnalyzerFSM(Elaboratable): def get_max_addr(self): """ - Return the maximum addresses in memory used by the core. The address space used - by the core extends from `base_addr` to the number returned by this function. + Return the maximum addresses in memory used by the core. The address + space used by the core extends from `base_addr` to the number returned + by this function. """ return self.r.get_max_addr() diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index f0bf5f6..487a9c4 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -32,8 +32,9 @@ class LogicAnalyzerTriggerBlock(Elaboratable): def get_max_addr(self): """ - Return the maximum addresses in memory used by the core. The address space used - by the core extends from `base_addr` to the number returned by this function. + Return the maximum addresses in memory used by the core. The address + space used by the core extends from `base_addr` to the number returned + by this function. """ return self.r.get_max_addr() diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index a99549a..6d92ee4 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -152,8 +152,9 @@ class ReadOnlyMemoryCore(Elaboratable): def get_max_addr(self): """ - Return the maximum addresses in memory used by the core. The address space used - by the core extends from `base_addr` to the number returned by this function. + Return the maximum addresses in memory used by the core. The address + space used by the core extends from `base_addr` to the number returned + by this function. """ return self._max_addr diff --git a/src/manta/utils.py b/src/manta/utils.py index 1e63bcb..7fe12f2 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -38,16 +38,27 @@ def words_to_value(data): concatenates them together in little-endian order. """ - for d in data: - if d > 0 and d > 2**16 - 1: - raise ValueError("Unsigned integer too large.") - - if d < 0 and d < -(2**15): - raise ValueError("Signed integer too large.") + [check_value_fits_in_bits(d, 16) for d in data] return int("".join([f"{i:016b}" for i in data[::-1]]), 2) +def check_value_fits_in_bits(value, n_bits): + """ + Rasies an exception if the provided value isn't an integer that cannot + be expressed with the provided number of bits. + """ + + if not isinstance(value, int): + raise TypeError("Value must be an integer.") + + if value > 0 and value > 2**n_bits - 1: + raise ValueError("Unsigned integer too large.") + + if value < 0 and value < -(2 ** (n_bits - 1)): + raise ValueError("Signed integer too large.") + + def value_to_words(data, n_words): """ Takes a integer, interprets it as a set of 16-bit integers From 0c0f31be64d9208dbed5a9b7e1fb91a901fe05a5 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 18 Feb 2024 13:50:26 -0800 Subject: [PATCH 52/89] rewrite IO Core --- src/manta/io_core.py | 390 +++++++++++++++++---------------------- src/manta/manta.py | 2 +- test/test_io_core_hw.py | 32 +++- test/test_io_core_sim.py | 102 ++++------ 4 files changed, 232 insertions(+), 294 deletions(-) diff --git a/src/manta/io_core.py b/src/manta/io_core.py index 91322d80..648be7c 100644 --- a/src/manta/io_core.py +++ b/src/manta/io_core.py @@ -15,171 +15,133 @@ class IOCore(Elaboratable): https://fischermoseley.github.io/manta/io_core/ """ - def __init__(self, config, base_addr, interface): - self._config = config - self.base_addr = base_addr - self.interface = interface - self._check_config(self._config) + def __init__(self, base_addr, interface, inputs=[], outputs=[]): + self._base_addr = base_addr + self._interface = interface + self._inputs = inputs + self._outputs = outputs - self.define_signals() - self.mmap, self.max_addr = self.assign_memory() + # Bus Connections + self.bus_i = Signal(InternalBus()) + self.bus_o = Signal(InternalBus()) - def _check_config(self, config): - # make sure ports are defined - if "inputs" not in config and "outputs" not in config: - raise ValueError("No input or output ports specified.") + # Internal Signals + self._strobe = Signal() + self._input_bufs = [Signal(p.width, name=p.name + "_buf") for p in self._inputs] + self._output_bufs = [ + Signal(p.width, name=p.name + "_buf", reset=p.reset) for p in self._outputs + ] - # check for unrecognized options - valid_options = ["type", "inputs", "outputs", "user_clock"] + self._make_memory_map() + + @classmethod + def from_config(cls, config, base_addr, interface): + inputs = config.get("inputs", []) + outputs = config.get("outputs", []) + + # Make sure IO core has at least one input or output + if not inputs and not outputs: + raise ValueError("Must specify at least one input or output port.") + + # Warn about unrecognized options + valid_options = ["type", "inputs", "outputs"] for option in config: if option not in valid_options: warn(f"Ignoring unrecognized option '{option}' in IO core.'") - # check that user_clock is a bool - if "user_clock" in config: - if not isinstance(config["user_clock"], bool): - raise ValueError("Option user_clock must be a boolean.") - - # check that inputs is only dicts of format name:width - if "inputs" in config: - for name, attrs in config["inputs"].items(): - if not isinstance(name, str): - raise ValueError( - f'Input probe "{name}" has invalid name, names must be strings.' - ) - - if not isinstance(attrs, int): - raise ValueError(f'Input probe "{name}" must have integer width.') - - if not attrs > 0: - raise ValueError(f'Input probe "{name}" must have positive width.') - - if "outputs" in config: - for name, attrs in config["outputs"].items(): - if not isinstance(name, str): - raise ValueError( - f'Output probe "{name}" has invalid name, names must be strings.' - ) - - if not isinstance(attrs, int) and not isinstance(attrs, dict): - raise ValueError(f'Unrecognized format for output probe "{name}".') - - if isinstance(attrs, int): - if not attrs > 0: - raise ValueError( - f'Output probe "{name}" must have positive width.' - ) - - if isinstance(attrs, dict): - # check that each output probe has only recognized options - valid_options = ["width", "initial_value"] - for option in attrs: - if option not in valid_options: - warn(f'Ignoring unrecognized option "{option}" in IO core.') - - # check that widths are appropriate - if "width" not in attrs: - raise ValueError(f"No width specified for output probe {name}.") - - if not isinstance(attrs["width"], int): - raise ValueError( - f'Output probe "{name}" must have integer width.' - ) - - if not attrs["width"] > 0: - raise ValueError( - f'Input probe "{name}" must have positive width.' - ) - - def define_signals(self): - # Bus Input/Output - self.bus_i = Signal(InternalBus()) - self.bus_o = Signal(InternalBus()) - - # Input Probes (and buffers) - if "inputs" in self._config: - for name, width in self._config["inputs"].items(): - setattr(self, name, Signal(width, name=name)) - setattr(self, name + "_buf", Signal(width, name=name + "_buf")) - - # Output Probes (and buffers) - if "outputs" in self._config: - for name, attrs in self._config["outputs"].items(): - if isinstance(attrs, dict): - width = attrs["width"] - initial_value = attrs["initial_value"] - else: - width = attrs - initial_value = 0 - - setattr(self, name, Signal(width, name=name, reset=initial_value)) - setattr( - self, - name + "_buf", - Signal(width, name=name + "_buf", reset=initial_value), + # Define input signals + input_signals = [] + for name, width in inputs.items(): + if not isinstance(name, str): + raise ValueError( + f'Input probe "{name}" has invalid name, names must be strings.' ) - # Strobe Register - self.strobe = Signal(reset=0) + if not isinstance(width, int): + raise ValueError(f"Input probe '{name}' must have integer width.") - def assign_memory(self): - """ - the memory map is a dict that maps registers (in memory) to their locations (in memory) - as well as their Signals (from Amaranth). This looks like the following: + if not width > 0: + raise ValueError(f"Input probe '{name}' must have positive width.") - { - strobe: - addrs: [0x0000] - signals: [self.strobe] - probe0_buf: - addrs: [0x0001] - signals: [self.probe0_buf] - probe1_buf: - addrs: [0x0002] - signals: [self.probe1_buf] - probe2_buf: - addrs: [0x0003] - signals: [self.probe2_buf] - probe3_buf: - addrs: [0x0004, 0x0005] - signals: [self.probe3_buf[0:15], self.probe3_buf[16:19]] - ... and so on - } + input_signals += [Signal(width, name=name)] - """ - mmap = {} + # Define output signals + output_signals = [] + for name, attrs in outputs.items(): + if not isinstance(name, str): + raise ValueError( + f'Output probe "{name}" has invalid name, names must be strings.' + ) - # Add strobe register first - mmap["strobe"] = dict(addrs=[self.base_addr], signals=[self.strobe]) + if not isinstance(attrs, int) and not isinstance(attrs, dict): + raise ValueError(f'Unrecognized format for output probe "{name}".') - # Add all input and output probes - all_probes = {} - if "inputs" in self._config: - all_probes = {**all_probes, **self._config["inputs"]} + if isinstance(attrs, int): + if not attrs > 0: + raise ValueError(f'Output probe "{name}" must have positive width.') - if "outputs" in self._config: - all_probes = {**all_probes, **self._config["outputs"]} - - for name, attrs in all_probes.items(): - # Handle output probes that might have initial value specified in addition to width - if isinstance(attrs, dict): - width = attrs["width"] - else: width = attrs + initial_value = 0 - # Assign addresses - last_used_addr = list(mmap.values())[-1]["addrs"][-1] - addrs = [last_used_addr + 1 + i for i in range(ceil(width / 16))] + if isinstance(attrs, dict): + # check that each output probe has only recognized options + valid_options = ["width", "initial_value"] + for option in attrs: + if option not in valid_options: + warn(f'Ignoring unrecognized option "{option}" in IO core.') - # Slice signal into 16-bit chunks - signal = getattr(self, name + "_buf") - signals = [signal[16 * i : 16 * (i + 1)] for i in range(ceil(width / 16))] + # check that widths are appropriate + if "width" not in attrs: + raise ValueError(f"No width specified for output probe {name}.") - mmap[name + "_buf"] = {"addrs": addrs, "signals": signals} + if not isinstance(attrs["width"], int): + raise ValueError(f'Output probe "{name}" must have integer width.') - # Compute maximum address used by the core - max_addr = list(mmap.values())[-1]["addrs"][-1] - return mmap, max_addr + if not attrs["width"] > 0: + raise ValueError(f'Input probe "{name}" must have positive width.') + + width = attrs["width"] + + initial_value = 0 + if "initial_value" in attrs: + if not isinstance(attrs["initial_value"], int): + raise ValueError("Initial value must be an integer.") + + check_value_fits_in_bits(attrs["initial_value"], width) + initial_value = attrs["initial_value"] + + output_signals += [Signal(width, name=name, reset=initial_value)] + + return cls(base_addr, interface, inputs=input_signals, outputs=output_signals) + + def _make_memory_map(self): + self._memory_map = {} + + # Add strobe register + self._memory_map["strobe"] = dict( + signals=[self._strobe], addrs=[self._base_addr] + ) + + # Assign memory to all inputs and outputs + ios = self._inputs + self._outputs + io_bufs = self._input_bufs + self._output_bufs + last_used_addr = self._base_addr + + for io, io_buf in zip(ios, io_bufs): + n_slices = ceil(io.width / 16) + signals = split_into_chunks(io_buf, 16) + addrs = [i + last_used_addr + 1 for i in range(n_slices)] + + self._memory_map[io.name] = dict(signals=signals, addrs=addrs) + + last_used_addr = addrs[-1] + + # Save the last used address, for use later. + # Normally we'd just grab this from self._memory_map, but Python + # dictionaries don't guaruntee that insertion order is preserved, + # so it's more convenient to just save it now. + + self._max_addr = last_used_addr def elaborate(self, platform): m = Module() @@ -187,34 +149,27 @@ class IOCore(Elaboratable): # Shuffle bus transactions along m.d.sync += self.bus_o.eq(self.bus_i) - # Update buffers from probes - with m.If(self.strobe): - # Input buffers - if "inputs" in self._config: - for name in self._config["inputs"]: - input_probe = getattr(self, name) - input_probe_buf = getattr(self, name + "_buf") - m.d.sync += input_probe_buf.eq(input_probe) + # Update input_buffers from inputs + for i, i_buf in zip(self._inputs, self._input_bufs): + with m.If(self._strobe): + m.d.sync += i_buf.eq(i) - # Output buffers - if "outputs" in self._config: - for name in self._config["outputs"]: - output_probe = getattr(self, name) - output_probe_buf = getattr(self, name + "_buf") - m.d.sync += output_probe.eq(output_probe_buf) + # Update outputs from output_buffers + for o, o_buf in zip(self._outputs, self._output_bufs): + with m.If(self._strobe): + m.d.sync += o.eq(o_buf) # Handle register reads and writes - with m.If((self.bus_i.addr >= self.base_addr)): - with m.If((self.bus_o.addr <= self.max_addr)): - for entry in self.mmap.values(): - for addr, signal in zip(entry["addrs"], entry["signals"]): - with m.If(self.bus_i.rw): - with m.If(self.bus_i.addr == addr): - m.d.sync += signal.eq(self.bus_i.data) + for io in self._memory_map.values(): + for addr, signal in zip(io["addrs"], io["signals"]): + with m.If(self.bus_i.addr == addr): + # Writes + with m.If(self.bus_i.rw): + m.d.sync += signal.eq(self.bus_i.data) - with m.Else(): - with m.If(self.bus_i.addr == addr): - m.d.sync += self.bus_o.data.eq(signal) + # Reads + with m.Else(): + m.d.sync += self.bus_o.data.eq(signal) return m @@ -223,65 +178,64 @@ class IOCore(Elaboratable): Return the Amaranth signals that should be included as ports in the top-level Manta module. """ - ports = [] - if "inputs" in self._config: - for name in self._config["inputs"].keys(): - ports.append(getattr(self, name)) - - if "outputs" in self._config: - for name in self._config["outputs"].keys(): - ports.append(getattr(self, name)) - - return ports + return [self._inputs + self._outputs] def get_max_addr(self): """ - Return the maximum addresses in memory used by the core. The address space used - by the core extends from `base_addr` to the number returned by this function. + Return the maximum addresses in memory used by the core. The address + space used by the core extends from `base_addr` to the number returned + by this function. """ - return self.max_addr + return self._max_addr - def set_probe(self, probe_name, value): - # check that probe is an output probe - if probe_name not in self._config["outputs"]: - raise ValueError(f"Output probe '{probe_name}' not found.") + def set_probe(self, name, value): + """ + Set the value of an output probe on the FPGA. The value may be either + an unsigned or signed integer, but must fit within the width of the + probe. + """ - # check that value is an integer - if not isinstance(value, int): - raise ValueError("Value must be an integer.") + # Check that probe exists in memory map + probe = self._memory_map.get(name) + if not probe: + raise KeyError(f"Probe '{name}' not found in IO core.") - # get the width of the probe, make sure value isn't too large for the probe - attrs = self._config["outputs"][probe_name] - if isinstance(attrs, int): - width = attrs + # Check that the probe is an output + if not any([o.name == name for o in self._outputs]): + raise KeyError(f"Probe '{name}' is not an output of the IO core.") - if isinstance(attrs, dict): - width = attrs["width"] + # Check that value isn't too big for the register + n_bits = sum([len(s) for s in probe["signals"]]) + check_value_fits_in_bits(value, n_bits) - if value > 0 and value > 2**width - 1: - raise ValueError("Unsigned integer too large.") - - if value < 0 and value < -(2 ** (width - 1)): - raise ValueError("Signed integer too large.") - - # set value in buffer - addrs = self.mmap[probe_name + "_buf"]["addrs"] + # Write value to core + addrs = probe["addrs"] datas = value_to_words(value, len(addrs)) - self.interface.write(addrs, datas) + self._interface.write(addrs, datas) - # pulse strobe register - strobe_addr = self.mmap["strobe"]["addrs"][0] - self.interface.write(strobe_addr, 0) - self.interface.write(strobe_addr, 1) - self.interface.write(strobe_addr, 0) + # Pulse strobe register + self._interface.write(self._base_addr, 0) + self._interface.write(self._base_addr, 1) + self._interface.write(self._base_addr, 0) - def get_probe(self, probe_name): - # pulse strobe register - strobe_addr = self.mmap["strobe"]["addrs"][0] - self.interface.write(strobe_addr, 0) - self.interface.write(strobe_addr, 1) - self.interface.write(strobe_addr, 0) + def get_probe(self, name): + """ + Get the present value of a probe on the FPGA, which is returned as an + unsigned integer. This function may be called on both input and output + probes, but output probes will return the last value written to them + (or their initial value, if no value has been written to them yet). + """ - # get value from buffer - addrs = self.mmap[probe_name + "_buf"]["addrs"] - return words_to_value(self.interface.read(addrs)) + # Check that probe exists in memory map + probe = self._memory_map.get(name) + if not probe: + raise KeyError(f"Probe with name {name} not found in IO core.") + + # Pulse strobe register + self._interface.write(self._base_addr, 0) + self._interface.write(self._base_addr, 1) + self._interface.write(self._base_addr, 0) + + # Get value from buffer + datas = self._interface.read(probe["addrs"]) + return words_to_value(datas) diff --git a/src/manta/manta.py b/src/manta/manta.py index 3625a19..9384957 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -78,7 +78,7 @@ class Manta(Elaboratable): base_addr = 0 for name, attrs in self.config["cores"].items(): if attrs["type"] == "io": - core = IOCore(attrs, base_addr, self.interface) + core = IOCore.from_config(attrs, base_addr, self.interface) elif attrs["type"] == "logic_analyzer": core = LogicAnalyzerCore(attrs, base_addr, self.interface) diff --git a/test/test_io_core_hw.py b/test/test_io_core_hw.py index 1e6f31c..2c984f8 100644 --- a/test/test_io_core_hw.py +++ b/test/test_io_core_hw.py @@ -39,17 +39,39 @@ class IOCoreLoopbackTest(Elaboratable): }, } + def get_probe(self, name): + # This is a hack! And should be removed once the full Amaranth-native + # API is built out + for i in self.manta.io_core._inputs: + if i.name == name: + return i + + for o in self.manta.io_core._outputs: + if o.name == name: + return o + + return None + def elaborate(self, platform): m = Module() m.submodules.manta = self.manta uart_pins = platform.request("uart") + probe0 = self.get_probe("probe0") + probe1 = self.get_probe("probe1") + probe2 = self.get_probe("probe2") + probe3 = self.get_probe("probe3") + probe4 = self.get_probe("probe4") + probe5 = self.get_probe("probe5") + probe6 = self.get_probe("probe6") + probe7 = self.get_probe("probe7") + m.d.comb += [ - self.manta.io_core.probe0.eq(self.manta.io_core.probe4), - self.manta.io_core.probe1.eq(self.manta.io_core.probe5), - self.manta.io_core.probe2.eq(self.manta.io_core.probe6), - self.manta.io_core.probe3.eq(self.manta.io_core.probe7), + probe0.eq(probe4), + probe1.eq(probe5), + probe2.eq(probe6), + probe3.eq(probe7), self.manta.interface.rx.eq(uart_pins.rx.i), uart_pins.tx.o.eq(self.manta.interface.tx), ] @@ -126,4 +148,4 @@ def test_output_probe_initial_values_xilinx(): @pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") def test_output_probe_initial_values_ice40(): - IOCoreLoopbackTest(ICEStickPlatform(), "/dev/ttyUSB2").verify() + IOCoreLoopbackTest(ICEStickPlatform(), "/dev/ttyUSB3").verify() diff --git a/test/test_io_core_sim.py b/test/test_io_core_sim.py index 5ef1405..3bda812 100644 --- a/test/test_io_core_sim.py +++ b/test/test_io_core_sim.py @@ -1,57 +1,36 @@ +from amaranth import * from amaranth.sim import Simulator from manta.io_core import IOCore from manta.utils import * from random import randint -config = { - "type": "io", - "inputs": {"probe0": 1, "probe1": 2, "probe2": 8, "probe3": 20}, - "outputs": { - "probe4": {"width": 1, "initial_value": 1}, - "probe5": {"width": 2, "initial_value": 2}, - "probe6": 8, - "probe7": {"width": 20, "initial_value": 65538}, - }, -} +probe0 = Signal(1) +probe1 = Signal(2) +probe2 = Signal(8) +probe3 = Signal(20) +inputs = [probe0, probe1, probe2, probe3] -io_core = IOCore(config, base_addr=0, interface=None) +probe4 = Signal(1, reset=1) +probe5 = Signal(2, reset=2) +probe6 = Signal(8) +probe7 = Signal(20, reset=65538) +outputs = [probe4, probe5, probe6, probe7] + +io_core = IOCore(base_addr=0, interface=None, inputs=inputs, outputs=outputs) def pulse_strobe_register(): - strobe_addr = io_core.mmap["strobe"]["addrs"][0] + strobe_addr = io_core._memory_map["strobe"]["addrs"][0] yield from write_register(io_core, strobe_addr, 0) yield from write_register(io_core, strobe_addr, 1) yield from write_register(io_core, strobe_addr, 0) -def test_output_probe_initial_values(): - def testbench(): - # Verify all output probes initialize to the values in the config - for name, attrs in config["outputs"].items(): - initial_value = 0 - if isinstance(attrs, dict): - if "initial_value" in attrs: - initial_value = attrs["initial_value"] - - output_probe = getattr(io_core, name) - value = yield output_probe - - if value != initial_value: - raise ValueError( - f"Output probe {name} initialized to {value} instead of {initial_value}" - ) - - else: - print(f"Output probe {name} initialized to {value} as expected.") - - simulate(io_core, testbench) - - def test_input_probe_buffer_initial_value(): def testbench(): # Verify all input probe buffers initialize to zero - for name, width in config["inputs"].items(): - addrs = io_core.mmap[name + "_buf"]["addrs"] + for i in inputs: + addrs = io_core._memory_map[i.name]["addrs"] for addr in addrs: yield from verify_register(io_core, addr, 0) @@ -62,13 +41,9 @@ def test_input_probe_buffer_initial_value(): def test_output_probe_buffer_initial_value(): def testbench(): # Verify all output probe buffers initialize to the values in the config - for name, attrs in config["outputs"].items(): - addrs = io_core.mmap[name + "_buf"]["addrs"] - - datas = [0] * len(addrs) - if isinstance(attrs, dict): - if "initial_value" in attrs: - datas = value_to_words(attrs["initial_value"], len(addrs)) + for o in outputs: + addrs = io_core._memory_map[o.name]["addrs"] + datas = value_to_words(o.reset, len(addrs)) for addr, data in zip(addrs, datas): yield from verify_register(io_core, addr, data) @@ -78,14 +53,9 @@ def test_output_probe_buffer_initial_value(): def test_output_probes_are_writeable(): def testbench(): - for name, attrs in config["outputs"].items(): - if isinstance(attrs, dict): - width = attrs["width"] - else: - width = attrs - - addrs = io_core.mmap[name + "_buf"]["addrs"] - test_value = randint(0, (2**width) - 1) + for o in outputs: + addrs = io_core._memory_map[o.name]["addrs"] + test_value = randint(0, (2**o.width) - 1) datas = value_to_words(test_value, len(addrs)) # write value to registers @@ -101,14 +71,9 @@ def test_output_probes_are_writeable(): def test_output_probes_update(): def testbench(): - for name, attrs in config["outputs"].items(): - if isinstance(attrs, dict): - width = attrs["width"] - else: - width = attrs - - addrs = io_core.mmap[name + "_buf"]["addrs"] - test_value = randint(0, (2**width) - 1) + for o in outputs: + addrs = io_core._memory_map[o.name]["addrs"] + test_value = randint(0, (2**o.width) - 1) datas = value_to_words(test_value, len(addrs)) # write value to registers @@ -119,34 +84,31 @@ def test_output_probes_update(): yield from pulse_strobe_register() # check that outputs took updated value - output_probe = getattr(io_core, name) - value = yield (output_probe) + value = yield (o) if value != test_value: raise ValueError( - f"Output probe {name} took value {value} instead of {test_value} after pulsing strobe." + f"Output probe {o.name} took value {value} instead of {test_value} after pulsing strobe." ) else: - print(f"Output probe {name} took value {value} after pulsing strobe.") + print(f"Output probe {o.name} took value {value} after pulsing strobe.") simulate(io_core, testbench) def test_input_probes_update(): def testbench(): - for name, width in config["inputs"].items(): - test_value = randint(0, (2**width) - 1) - + for i in inputs: # set input probe value - input_probe = getattr(io_core, name) - yield input_probe.eq(test_value) + test_value = randint(0, (2**i.width) - 1) + yield i.eq(test_value) # pulse strobe register yield from pulse_strobe_register() # check that values are as expected once read back - addrs = io_core.mmap[name + "_buf"]["addrs"] + addrs = io_core._memory_map[i.name]["addrs"] datas = value_to_words(test_value, len(addrs)) for addr, data in zip(addrs, datas): From e2450ddbffcb7378d611ab38fa6da341ad858be1 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 18 Feb 2024 15:50:51 -0800 Subject: [PATCH 53/89] complete IO core refactor --- src/manta/io_core.py | 6 +- src/manta/logic_analyzer/__init__.py | 36 +++++---- src/manta/logic_analyzer/fsm.py | 83 ++++++++++--------- src/manta/logic_analyzer/trigger_block.py | 97 +++++++++++------------ test/test_io_core_hw.py | 2 +- test/test_logic_analyzer_fsm_sim.py | 72 ++++++++--------- test/test_logic_analyzer_sim.py | 13 ++- test/test_mem_core_hw.py | 23 +++++- test/test_uart_rx_sim.py | 4 +- test/test_uart_tx_sim.py | 4 +- 10 files changed, 179 insertions(+), 161 deletions(-) diff --git a/src/manta/io_core.py b/src/manta/io_core.py index 648be7c..61bc5be 100644 --- a/src/manta/io_core.py +++ b/src/manta/io_core.py @@ -36,8 +36,8 @@ class IOCore(Elaboratable): @classmethod def from_config(cls, config, base_addr, interface): - inputs = config.get("inputs", []) - outputs = config.get("outputs", []) + inputs = config.get("inputs", {}) + outputs = config.get("outputs", {}) # Make sure IO core has at least one input or output if not inputs and not outputs: @@ -178,7 +178,7 @@ class IOCore(Elaboratable): Return the Amaranth signals that should be included as ports in the top-level Manta module. """ - return [self._inputs + self._outputs] + return self._inputs + self._outputs def get_max_addr(self): """ diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index b46a449..d88cbef 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -165,7 +165,7 @@ class LogicAnalyzerCore(Elaboratable): self.bus_o.eq(sample_mem.bus_o), # Non-bus Connections fsm.trigger.eq(trig_blk.trig), - sample_mem.user_addr.eq(fsm.r.write_pointer), + sample_mem.user_addr.eq(fsm.write_pointer), sample_mem.user_we.eq(fsm.write_enable), ] @@ -211,14 +211,14 @@ class LogicAnalyzerCore(Elaboratable): # If core is not in IDLE state, request that it return to IDLE print_if_verbose(" -> Resetting core...") - state = self.fsm.r.get_probe("state") + state = self.fsm.registers.get_probe("state") if state != States.IDLE: - self.fsm.r.set_probe("request_start", 0) - self.fsm.r.set_probe("request_stop", 0) - self.fsm.r.set_probe("request_stop", 1) - self.fsm.r.set_probe("request_stop", 0) + self.fsm.registers.set_probe("request_start", 0) + self.fsm.registers.set_probe("request_stop", 0) + self.fsm.registers.set_probe("request_stop", 1) + self.fsm.registers.set_probe("request_stop", 0) - if self.fsm.r.get_probe("state") != States.IDLE: + if self.fsm.registers.get_probe("state") != States.IDLE: raise ValueError("Logic analyzer did not reset to IDLE state.") # Set triggers @@ -232,28 +232,32 @@ class LogicAnalyzerCore(Elaboratable): print_if_verbose(" -> Setting trigger mode...") if "trigger_mode" in self.config: mode = self.config["trigger_mode"].upper() - self.fsm.r.set_probe("trigger_mode", TriggerModes[mode]) + self.fsm.registers.set_probe("trigger_mode", TriggerModes[mode]) else: - self.fsm.r.set_probe("trigger_mode", TriggerModes.SINGLE_SHOT) + self.fsm.registers.set_probe("trigger_mode", TriggerModes.SINGLE_SHOT) # Set trigger location print_if_verbose(" -> Setting trigger location...") if "trigger_location" in self.config: - self.fsm.r.set_probe("trigger_location", self.config["trigger_location"]) + self.fsm.registers.set_probe( + "trigger_location", self.config["trigger_location"] + ) else: - self.fsm.r.set_probe("trigger_location", self.config["sample_depth"] // 2) + self.fsm.registers.set_probe( + "trigger_location", self.config["sample_depth"] // 2 + ) # Send a start request to the state machine print_if_verbose(" -> Starting capture...") - self.fsm.r.set_probe("request_start", 0) - self.fsm.r.set_probe("request_start", 1) - self.fsm.r.set_probe("request_start", 0) + self.fsm.registers.set_probe("request_start", 0) + self.fsm.registers.set_probe("request_start", 1) + self.fsm.registers.set_probe("request_start", 0) # Poll the state machine's state, and wait for the capture to complete print_if_verbose(" -> Waiting for capture to complete...") - while self.fsm.r.get_probe("state") != States.CAPTURED: + while self.fsm.registers.get_probe("state") != States.CAPTURED: pass # Read out the entirety of the sample memory @@ -264,7 +268,7 @@ class LogicAnalyzerCore(Elaboratable): # Revolve the memory around the read_pointer, such that all the beginning # of the caputure is at the first element print_if_verbose(" -> Checking read pointer and revolving memory...") - read_pointer = self.fsm.r.get_probe("read_pointer") + read_pointer = self.fsm.registers.get_probe("read_pointer") data = raw_capture[read_pointer:] + raw_capture[:read_pointer] return LogicAnalyzerCapture(data, self.config) diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index 461fa8b..cdf4b3c 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -26,29 +26,39 @@ class LogicAnalyzerFSM(Elaboratable): """ def __init__(self, config, base_addr, interface): - self.config = config + self._sample_depth = config["sample_depth"] + + # Outputs to rest of Logic Analyzer self.trigger = Signal(1) self.write_enable = Signal(1) - register_config = { - "inputs": { - "state": 4, - "read_pointer": ceil(log2(self.config["sample_depth"])), - "write_pointer": ceil(log2(self.config["sample_depth"])), - }, - "outputs": { - "trigger_location": ceil(log2(self.config["sample_depth"])), - "trigger_mode": 2, - "request_start": 1, - "request_stop": 1, - }, - } + # Outputs from FSM, inputs from IOCore + self.state = Signal(States) + self.read_pointer = Signal(range(self._sample_depth)) + self.write_pointer = Signal(range(self._sample_depth)) + inputs = [ + self.state, + self.read_pointer, + self.write_pointer, + ] - self.r = IOCore(register_config, base_addr, interface) + # Inputs to FSM, outputs from IOCore + self.trigger_location = Signal(range(self._sample_depth)) + self.trigger_mode = Signal(TriggerModes) + self.request_start = Signal() + self.request_stop = Signal() + outputs = [ + self.trigger_location, + self.trigger_mode, + self.request_start, + self.request_stop, + ] + + self.registers = IOCore(base_addr, interface, inputs, outputs) # Bus Input/Output - self.bus_i = self.r.bus_i - self.bus_o = self.r.bus_o + self.bus_i = self.registers.bus_i + self.bus_o = self.registers.bus_o def get_max_addr(self): """ @@ -56,38 +66,33 @@ class LogicAnalyzerFSM(Elaboratable): space used by the core extends from `base_addr` to the number returned by this function. """ - return self.r.get_max_addr() - - def increment_mod_sample_depth(self, m, signal): - # m.d.sync += signal.eq((signal + 1) % self.config["sample_depth"]) - - with m.If(signal == self.config["sample_depth"] - 1): - m.d.sync += signal.eq(0) - - with m.Else(): - m.d.sync += signal.eq(signal + 1) + return self.registers.get_max_addr() def elaborate(self, platform): m = Module() - m.submodules.registers = self.r + m.submodules.registers = self.registers - sample_depth = self.config["sample_depth"] - request_start = self.r.request_start - request_stop = self.r.request_stop - trigger_mode = self.r.trigger_mode - trigger_location = self.r.trigger_location - state = self.r.state + sample_depth = self._sample_depth + request_start = self.request_start + request_stop = self.request_stop + trigger_mode = self.trigger_mode + trigger_location = self.trigger_location + state = self.state write_enable = self.write_enable - write_pointer = self.r.write_pointer - read_pointer = self.r.read_pointer + write_pointer = self.write_pointer + read_pointer = self.read_pointer - prev_request_start = Signal(1) - prev_request_stop = Signal(1) + prev_request_start = Signal().like(request_start) + prev_request_stop = Signal().like(request_stop) + # Compute next_write_pointer as write_pointer + 1 % sample_depth next_write_pointer = Signal().like(write_pointer) + with m.If(write_pointer == self._sample_depth - 1): + m.d.comb += next_write_pointer.eq(0) - m.d.comb += next_write_pointer.eq((write_pointer + 1) % sample_depth) + with m.Else(): + m.d.comb += next_write_pointer.eq(write_pointer + 1) # Rising edge detection for start/stop requests m.d.sync += prev_request_start.eq(request_start) diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 487a9c4..652f5be 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -1,4 +1,5 @@ from amaranth import * +from amaranth.lib.enum import IntEnum from manta.io_core import IOCore @@ -12,23 +13,20 @@ class LogicAnalyzerTriggerBlock(Elaboratable): def __init__(self, probes, base_addr, interface): # Instantiate a bunch of trigger blocks - self.probes = probes - self.triggers = [LogicAnalyzerTrigger(p) for p in self.probes] + self._probes = probes + self._triggers = [LogicAnalyzerTrigger(p) for p in self._probes] # Make IO core for everything - outputs = {} - for p in self.probes: - outputs[p.name + "_arg"] = p.width - outputs[p.name + "_op"] = 4 - - self.r = IOCore({"outputs": outputs}, base_addr, interface) + ops = [t.op for t in self._triggers] + args = [t.arg for t in self._triggers] + self.registers = IOCore(base_addr, interface, outputs=ops + args) # Bus Input/Output - self.bus_i = self.r.bus_i - self.bus_o = self.r.bus_o + self.bus_i = self.registers.bus_i + self.bus_o = self.registers.bus_o # Global trigger. High if any probe is triggered. - self.trig = Signal(1) + self.trig = Signal() def get_max_addr(self): """ @@ -36,13 +34,13 @@ class LogicAnalyzerTriggerBlock(Elaboratable): space used by the core extends from `base_addr` to the number returned by this function. """ - return self.r.get_max_addr() + return self.registers.get_max_addr() def clear_triggers(self): # reset all triggers to disabled with no argument - for p in self.probes: - self.r.set_probe(p.name + "_op", 0) - self.r.set_probe(p.name + "_arg", 0) + for p in self._probes: + self.registers.set_probe(p.name + "_op", Operations.DISABLE) + self.registers.set_probe(p.name + "_arg", 0) def set_triggers(self, config): # set triggers @@ -52,34 +50,42 @@ class LogicAnalyzerTriggerBlock(Elaboratable): # Handle triggers that don't need an argument if len(components) == 2: name, op = components - self.r.set_probe(name + "_op", self.triggers[0].operations[op]) + self.registers.set_probe(name + "_op", Operations[op].value) # Handle triggers that do need an argument elif len(components) == 3: name, op, arg = components - self.r.set_probe(name + "_op", self.triggers[0].operations[op]) - self.r.set_probe(name + "_arg", int(arg)) + self.registers.set_probe(name + "_op", Operations[op].value) + self.registers.set_probe(name + "_arg", int(arg)) def elaborate(self, platform): m = Module() # Add IO Core as submodule - m.submodules.registers = self.r + m.submodules.registers = self.registers # Add triggers as submodules - for t in self.triggers: + for t in self._triggers: m.submodules[t.signal.name + "_trigger"] = t - # Connect IO core registers to triggers - for probe, trigger in zip(self.probes, self.triggers): - m.d.comb += trigger.arg.eq(getattr(self.r, probe.name + "_arg")) - m.d.comb += trigger.op.eq(getattr(self.r, probe.name + "_op")) - - m.d.comb += self.trig.eq(Cat([t.triggered for t in self.triggers]).any()) + m.d.comb += self.trig.eq(Cat([t.triggered for t in self._triggers]).any()) return m +class Operations(IntEnum): + DISABLE = 0 + RISING = 1 + FALLING = 2 + CHANGING = 3 + GT = 4 + LT = 5 + GEQ = 6 + LEQ = 7 + EQ = 8 + NEQ = 9 + + class LogicAnalyzerTrigger(Elaboratable): """ A module containing a programmable "trigger" for a given input signal, @@ -88,23 +94,10 @@ class LogicAnalyzerTrigger(Elaboratable): """ def __init__(self, signal): - self.operations = { - "DISABLE": 0, - "RISING": 1, - "FALLING": 2, - "CHANGING": 3, - "GT": 4, - "LT": 5, - "GEQ": 6, - "LEQ": 7, - "EQ": 8, - "NEQ": 9, - } - self.signal = signal - self.op = Signal(range(len(self.operations))) - self.arg = Signal().like(signal) - self.triggered = Signal(1) + self.op = Signal(Operations, name=signal.name + "_op") + self.arg = Signal(signal.width, name=signal.name + "_arg") + self.triggered = Signal() def elaborate(self, platform): m = Module() @@ -113,34 +106,34 @@ class LogicAnalyzerTrigger(Elaboratable): prev = Signal().like(self.signal) m.d.sync += prev.eq(self.signal) - with m.If(self.op == self.operations["DISABLE"]): + with m.If(self.op == Operations.DISABLE): m.d.comb += self.triggered.eq(0) - with m.Elif(self.op == self.operations["RISING"]): + with m.Elif(self.op == Operations.RISING): m.d.comb += self.triggered.eq(self.signal > prev) - with m.Elif(self.op == self.operations["FALLING"]): + with m.Elif(self.op == Operations.FALLING): m.d.comb += self.triggered.eq(self.signal < prev) - with m.Elif(self.op == self.operations["CHANGING"]): + with m.Elif(self.op == Operations.CHANGING): m.d.comb += self.triggered.eq(self.signal != prev) - with m.Elif(self.op == self.operations["GT"]): + with m.Elif(self.op == Operations.GT): m.d.comb += self.triggered.eq(self.signal > self.arg) - with m.Elif(self.op == self.operations["LT"]): + with m.Elif(self.op == Operations.LT): m.d.comb += self.triggered.eq(self.signal < self.arg) - with m.Elif(self.op == self.operations["GEQ"]): + with m.Elif(self.op == Operations.GEQ): m.d.comb += self.triggered.eq(self.signal >= self.arg) - with m.Elif(self.op == self.operations["LEQ"]): + with m.Elif(self.op == Operations.LEQ): m.d.comb += self.triggered.eq(self.signal <= self.arg) - with m.Elif(self.op == self.operations["EQ"]): + with m.Elif(self.op == Operations.EQ): m.d.comb += self.triggered.eq(self.signal == self.arg) - with m.Elif(self.op == self.operations["NEQ"]): + with m.Elif(self.op == Operations.NEQ): m.d.comb += self.triggered.eq(self.signal != self.arg) with m.Else(): diff --git a/test/test_io_core_hw.py b/test/test_io_core_hw.py index 2c984f8..13f29c6 100644 --- a/test/test_io_core_hw.py +++ b/test/test_io_core_hw.py @@ -148,4 +148,4 @@ def test_output_probe_initial_values_xilinx(): @pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") def test_output_probe_initial_values_ice40(): - IOCoreLoopbackTest(ICEStickPlatform(), "/dev/ttyUSB3").verify() + IOCoreLoopbackTest(ICEStickPlatform(), "/dev/ttyUSB2").verify() diff --git a/test/test_logic_analyzer_fsm_sim.py b/test/test_logic_analyzer_fsm_sim.py index c2b4e70..7e7043c 100644 --- a/test/test_logic_analyzer_fsm_sim.py +++ b/test/test_logic_analyzer_fsm_sim.py @@ -9,12 +9,12 @@ fsm = LogicAnalyzerFSM(config, base_addr=0, interface=None) def test_signals_reset_correctly(): def testbench(): # Make sure pointers and write enable reset to zero - for sig in [fsm.r.write_pointer, fsm.r.read_pointer, fsm.write_enable]: + for sig in [fsm.write_pointer, fsm.read_pointer, fsm.write_enable]: if (yield sig) != 0: raise ValueError # Make sure state resets to IDLE - if (yield fsm.r.state != States.IDLE): + if (yield fsm.state != States.IDLE): raise ValueError simulate(fsm, testbench) @@ -24,9 +24,9 @@ def test_single_shot_no_wait_for_trigger(): def testbench(): # Configure and start FSM yield fsm.trigger.eq(1) - yield fsm.r.trigger_mode.eq(TriggerModes.SINGLE_SHOT) - yield fsm.r.trigger_location.eq(4) - yield fsm.r.request_start.eq(1) + yield fsm.trigger_mode.eq(TriggerModes.SINGLE_SHOT) + yield fsm.trigger_location.eq(4) + yield fsm.request_start.eq(1) # Wait until write_enable is asserted while not (yield fsm.write_enable): @@ -35,11 +35,11 @@ def test_single_shot_no_wait_for_trigger(): # Wait 8 clock cycles for capture to complete for i in range(8): # Make sure that read_pointer does not increase - if (yield fsm.r.read_pointer) != 0: + if (yield fsm.read_pointer) != 0: raise ValueError # Make sure that write_pointer increases by one each cycle - if (yield fsm.r.write_pointer) != i: + if (yield fsm.write_pointer) != i: raise ValueError yield @@ -48,11 +48,11 @@ def test_single_shot_no_wait_for_trigger(): yield # Check that write_pointer points to the end of memory - if (yield fsm.r.write_pointer) != 7: + if (yield fsm.write_pointer) != 7: raise ValueError # Check that state is CAPTURED - if (yield fsm.r.state) != States.CAPTURED: + if (yield fsm.state) != States.CAPTURED: raise ValueError simulate(fsm, testbench, "single_shot_no_wait_for_trigger.vcd") @@ -61,9 +61,9 @@ def test_single_shot_no_wait_for_trigger(): def test_single_shot_wait_for_trigger(): def testbench(): # Configure and start FSM - yield fsm.r.trigger_mode.eq(TriggerModes.SINGLE_SHOT) - yield fsm.r.trigger_location.eq(4) - yield fsm.r.request_start.eq(1) + yield fsm.trigger_mode.eq(TriggerModes.SINGLE_SHOT) + yield fsm.trigger_location.eq(4) + yield fsm.request_start.eq(1) yield yield @@ -73,8 +73,8 @@ def test_single_shot_wait_for_trigger(): # Wait 4 clock cycles to get to IN_POSITION for i in range(4): - rp = yield fsm.r.read_pointer - wp = yield fsm.r.write_pointer + rp = yield fsm.read_pointer + wp = yield fsm.write_pointer # Make sure that read_pointer does not increase if rp != 0: @@ -101,13 +101,13 @@ def test_single_shot_wait_for_trigger(): yield # Check that write_pointer points to the end of memory - rp = yield fsm.r.read_pointer - wp = yield fsm.r.write_pointer - if (wp + 1) % fsm.config["sample_depth"] != rp: + rp = yield fsm.read_pointer + wp = yield fsm.write_pointer + if (wp + 1) % config["sample_depth"] != rp: raise ValueError # Check that state is CAPTURED - if (yield fsm.r.state) != States.CAPTURED: + if (yield fsm.state) != States.CAPTURED: raise ValueError simulate(fsm, testbench, "single_shot_wait_for_trigger.vcd") @@ -116,8 +116,8 @@ def test_single_shot_wait_for_trigger(): def test_immediate(): def testbench(): # Configure and start FSM - yield fsm.r.trigger_mode.eq(TriggerModes.IMMEDIATE) - yield fsm.r.request_start.eq(1) + yield fsm.trigger_mode.eq(TriggerModes.IMMEDIATE) + yield fsm.request_start.eq(1) yield yield @@ -125,9 +125,9 @@ def test_immediate(): if not (yield fsm.write_enable): raise ValueError - for i in range(fsm.config["sample_depth"]): - rp = yield fsm.r.read_pointer - wp = yield fsm.r.write_pointer + for i in range(config["sample_depth"]): + rp = yield fsm.read_pointer + wp = yield fsm.write_pointer if rp != 0: raise ValueError @@ -141,15 +141,15 @@ def test_immediate(): yield # Check that write_pointer points to the end of memory - rp = yield fsm.r.read_pointer - wp = yield fsm.r.write_pointer + rp = yield fsm.read_pointer + wp = yield fsm.write_pointer if rp != 0: raise ValueError if wp != 7: raise ValueError # Check that state is CAPTURED - if (yield fsm.r.state) != States.CAPTURED: + if (yield fsm.state) != States.CAPTURED: raise ValueError simulate(fsm, testbench, "immediate.vcd") @@ -158,8 +158,8 @@ def test_immediate(): def test_incremental(): def testbench(): # Configure and start FSM - yield fsm.r.trigger_mode.eq(TriggerModes.INCREMENTAL) - yield fsm.r.request_start.eq(1) + yield fsm.trigger_mode.eq(TriggerModes.INCREMENTAL) + yield fsm.request_start.eq(1) yield yield @@ -177,7 +177,7 @@ def test_incremental(): yield # Check that state is CAPTURED - if (yield fsm.r.state) != States.CAPTURED: + if (yield fsm.state) != States.CAPTURED: raise ValueError simulate(fsm, testbench, "incremental.vcd") @@ -186,8 +186,8 @@ def test_incremental(): def test_single_shot_write_enable(): def testbench(): # Configure FSM - yield fsm.r.trigger_mode.eq(TriggerModes.SINGLE_SHOT) - yield fsm.r.trigger_location.eq(4) + yield fsm.trigger_mode.eq(TriggerModes.SINGLE_SHOT) + yield fsm.trigger_location.eq(4) yield # Make sure write is not enabled before starting the FSM @@ -195,11 +195,11 @@ def test_single_shot_write_enable(): raise ValueError # Start the FSM, ensure write enable is asserted throughout the capture - yield fsm.r.request_start.eq(1) + yield fsm.request_start.eq(1) yield yield - for _ in range(fsm.config["sample_depth"]): + for _ in range(config["sample_depth"]): if not (yield fsm.write_enable): raise ValueError @@ -224,7 +224,7 @@ def test_single_shot_write_enable(): def test_immediate_write_enable(): def testbench(): # Configure FSM - yield fsm.r.trigger_mode.eq(TriggerModes.IMMEDIATE) + yield fsm.trigger_mode.eq(TriggerModes.IMMEDIATE) yield # Make sure write is not enabled before starting the FSM @@ -232,11 +232,11 @@ def test_immediate_write_enable(): raise ValueError # Start the FSM, ensure write enable is asserted throughout the capture - yield fsm.r.request_start.eq(1) + yield fsm.request_start.eq(1) yield yield - for _ in range(fsm.config["sample_depth"]): + for _ in range(config["sample_depth"]): if not (yield fsm.write_enable): raise ValueError diff --git a/test/test_logic_analyzer_sim.py b/test/test_logic_analyzer_sim.py index ebce934..0346bd6 100644 --- a/test/test_logic_analyzer_sim.py +++ b/test/test_logic_analyzer_sim.py @@ -1,5 +1,6 @@ from amaranth.sim import Simulator from manta.logic_analyzer import LogicAnalyzerCore +from manta.logic_analyzer.trigger_block import Operations from manta.utils import * from random import sample @@ -32,8 +33,8 @@ def print_data_at_addr(addr): def set_fsm_register(name, data): - addr = la.fsm.r.mmap[f"{name}_buf"]["addrs"][0] - strobe_addr = la.fsm.r.base_addr + addr = la.fsm.registers._memory_map[name]["addrs"][0] + strobe_addr = la.fsm.registers._base_addr yield from write_register(la, strobe_addr, 0) yield from write_register(la, addr, data) @@ -42,8 +43,8 @@ def set_fsm_register(name, data): def set_trig_blk_register(name, data): - addr = la.trig_blk.r.mmap[f"{name}_buf"]["addrs"][0] - strobe_addr = la.trig_blk.r.base_addr + addr = la.trig_blk.registers._memory_map[name]["addrs"][0] + strobe_addr = la.trig_blk.registers._base_addr yield from write_register(la, strobe_addr, 0) yield from write_register(la, addr, data) @@ -67,9 +68,7 @@ def test_single_shot_capture(): yield from set_fsm_register("request_stop", 0) # setting triggers - yield from set_trig_blk_register( - "curly_op", la.trig_blk.triggers[0].operations["EQ"] - ) + yield from set_trig_blk_register("curly_op", Operations.EQ) yield from set_trig_blk_register("curly_arg", 4) # setting trigger mode diff --git a/test/test_mem_core_hw.py b/test/test_mem_core_hw.py index e9c0710..78bd024 100644 --- a/test/test_mem_core_hw.py +++ b/test/test_mem_core_hw.py @@ -48,16 +48,33 @@ class MemoryCoreLoopbackTest(Elaboratable): }, } + def get_probe(self, name): + # This is a hack! And should be removed once the full Amaranth-native + # API is built out + for i in self.manta.io_core._inputs: + if i.name == name: + return i + + for o in self.manta.io_core._outputs: + if o.name == name: + return o + + return None + def elaborate(self, platform): m = Module() m.submodules.manta = self.manta uart_pins = platform.request("uart") + addr = self.get_probe("addr") + data = self.get_probe("data") + we = self.get_probe("we") + m.d.comb += [ - self.manta.mem_core.user_addr.eq(self.manta.io_core.addr), - self.manta.mem_core.user_data.eq(self.manta.io_core.data), - self.manta.mem_core.user_we.eq(self.manta.io_core.we), + self.manta.mem_core.user_addr.eq(addr), + self.manta.mem_core.user_data.eq(data), + self.manta.mem_core.user_we.eq(we), self.manta.interface.rx.eq(uart_pins.rx.i), uart_pins.tx.o.eq(self.manta.interface.tx), ] diff --git a/test/test_uart_rx_sim.py b/test/test_uart_rx_sim.py index 3604591..40111aa 100644 --- a/test/test_uart_rx_sim.py +++ b/test/test_uart_rx_sim.py @@ -14,8 +14,8 @@ def verify_receive(data): valid_asserted_before = False - for i in range(10 * uart_rx.clocks_per_baud): - bit_index = i // uart_rx.clocks_per_baud + for i in range(10 * uart_rx._clocks_per_baud): + bit_index = i // uart_rx._clocks_per_baud # Every cycle, run checks on uart_rx: if (yield uart_rx.valid_o): diff --git a/test/test_uart_tx_sim.py b/test/test_uart_tx_sim.py index c78d076..8b07aa4 100644 --- a/test/test_uart_tx_sim.py +++ b/test/test_uart_tx_sim.py @@ -26,8 +26,8 @@ def verify_bit_sequence(byte): data_bits = "0" + f"{byte:08b}"[::-1] + "1" data_bits = [int(bit) for bit in data_bits] - for i in range(10 * uart_tx.clocks_per_baud): - bit_index = i // uart_tx.clocks_per_baud + for i in range(10 * uart_tx._clocks_per_baud): + bit_index = i // uart_tx._clocks_per_baud if (yield uart_tx.tx) != data_bits[bit_index]: raise ValueError("Wrong bit in sequence!") From 7ee51158d2dea2be309cc67ae14094a6944ff93e Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Mon, 19 Feb 2024 11:23:11 -0800 Subject: [PATCH 54/89] enforce consistent docstrings and underscores in logic analyzer core --- .gitignore | 1 + src/manta/logic_analyzer/__init__.py | 288 ++++++++++++--------------- src/manta/logic_analyzer/playback.py | 9 +- test/test_logic_analyzer_hw.py | 11 +- 4 files changed, 138 insertions(+), 171 deletions(-) diff --git a/.gitignore b/.gitignore index 5dc2efa..48226f2 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ build/ *.sv *.vcd *.out +*.csv # Vivado files from the occasional debugging sesh *.log diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index d88cbef..20a8ef8 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -19,27 +19,27 @@ class LogicAnalyzerCore(Elaboratable): """ def __init__(self, config, base_addr, interface): - self.config = config - self.check_config(config) + self._config = config + self._check_config() # Bus Input/Output self.bus_i = Signal(InternalBus()) self.bus_o = Signal(InternalBus()) - self.probes = [ - Signal(width, name=name) for name, width in self.config["probes"].items() + self._probes = [ + Signal(width, name=name) for name, width in self._config["probes"].items() ] # Submodules - self.fsm = LogicAnalyzerFSM(self.config, base_addr, interface) - self.trig_blk = LogicAnalyzerTriggerBlock( - self.probes, self.fsm.get_max_addr() + 1, interface + self._fsm = LogicAnalyzerFSM(self._config, base_addr, interface) + self._trig_blk = LogicAnalyzerTriggerBlock( + self._probes, self._fsm.get_max_addr() + 1, interface ) - self.sample_mem = LogicAnalyzerSampleMemory( - self.config, self.trig_blk.get_max_addr() + 1, interface + self._sample_mem = LogicAnalyzerSampleMemory( + self._config, self._trig_blk.get_max_addr() + 1, interface ) - def check_config(self, config): + def _check_config(self): # Check for unrecognized options valid_options = [ "type", @@ -49,12 +49,12 @@ class LogicAnalyzerCore(Elaboratable): "trigger_location", "trigger_mode", ] - for option in config: + for option in self._config: if option not in valid_options: warn(f"Ignoring unrecognized option '{option}' in Logic Analyzer.") # Check sample depth is provided and positive - sample_depth = config.get("sample_depth") + sample_depth = self._config.get("sample_depth") if not sample_depth: raise ValueError("Logic Analyzer must have sample_depth specified.") @@ -62,35 +62,35 @@ class LogicAnalyzerCore(Elaboratable): raise ValueError("Logic Analyzer sample_depth must be a positive integer.") # Check probes - if "probes" not in config or len(config["probes"]) == 0: + if "probes" not in self._config or len(self._config["probes"]) == 0: raise ValueError("Logic Analyzer must have at least one probe specified.") - for name, width in config["probes"].items(): + for name, width in self._config["probes"].items(): if width < 0: raise ValueError(f"Width of probe {name} must be positive.") # Check trigger mode, if provided - trigger_mode = config.get("trigger_mode") + trigger_mode = self._config.get("trigger_mode") valid_modes = ["single_shot", "incremental", "immediate"] if trigger_mode and trigger_mode not in valid_modes: raise ValueError( - f"Unrecognized trigger mode {config['trigger_mode']} provided." + f"Unrecognized trigger mode {self._config['trigger_mode']} provided." ) # Check triggers if trigger_mode and trigger_mode != "immediate": - if "triggers" not in config or config["triggers"] == 0: + if "triggers" not in self._config or self._config["triggers"] == 0: raise ValueError( "Logic Analyzer must have at least one trigger specified if not running in immediate mode." ) # Check trigger location - trigger_location = config.get("trigger_location") + trigger_location = self._config.get("trigger_location") if trigger_location: if not isinstance(trigger_location, int) or trigger_location < 0: raise ValueError("Trigger location must be a positive integer.") - if trigger_location >= config["sample_depth"]: + if trigger_location >= self._config["sample_depth"]: raise ValueError("Trigger location must be less than sample depth.") if trigger_mode == "immediate": @@ -100,16 +100,16 @@ class LogicAnalyzerCore(Elaboratable): # Check triggers themselves if trigger_mode == "immediate": - if "triggers" in config: + if "triggers" in self._config: warn( "Ignoring triggers as 'trigger_mode' is set to immediate, and there are no triggers to specify." ) else: - if ("triggers" not in config) or (len(config["triggers"]) == 0): + if ("triggers" not in self._config) or (len(self._config["triggers"]) == 0): raise ValueError("At least one trigger must be specified.") - for trigger in config.get("triggers"): + for trigger in self._config.get("triggers"): if not isinstance(trigger, str): raise ValueError("Trigger must be specified with a string.") @@ -140,33 +140,33 @@ class LogicAnalyzerCore(Elaboratable): ) # Check probe names - if components[0] not in config["probes"]: + if components[0] not in self._config["probes"]: raise ValueError(f"Unknown probe name '{components[0]}' specified.") def elaborate(self, platform): m = Module() # Add submodules - m.submodules.fsm = fsm = self.fsm - m.submodules.sample_mem = sample_mem = self.sample_mem - m.submodules.trig_blk = trig_blk = self.trig_blk + m.submodules.fsm = self._fsm + m.submodules.sample_mem = self._sample_mem + m.submodules.trig_blk = self._trig_blk # Concat all the probes together, and feed to input of sample memory # (it is necessary to reverse the order such that first probe occupies # the lowest location in memory) - m.d.comb += sample_mem.user_data.eq(Cat(self.probes[::-1])) + m.d.comb += self._sample_mem.user_data.eq(Cat(self._probes[::-1])) # Wire bus connections between internal modules m.d.comb += [ # Bus Connections - fsm.bus_i.eq(self.bus_i), - trig_blk.bus_i.eq(self.fsm.bus_o), - sample_mem.bus_i.eq(trig_blk.bus_o), - self.bus_o.eq(sample_mem.bus_o), + self._fsm.bus_i.eq(self.bus_i), + self._trig_blk.bus_i.eq(self._fsm.bus_o), + self._sample_mem.bus_i.eq(self._trig_blk.bus_o), + self.bus_o.eq(self._sample_mem.bus_o), # Non-bus Connections - fsm.trigger.eq(trig_blk.trig), - sample_mem.user_addr.eq(fsm.write_pointer), - sample_mem.user_we.eq(fsm.write_enable), + self._fsm.trigger.eq(self._trig_blk.trig), + self._sample_mem.user_addr.eq(self._fsm.write_pointer), + self._sample_mem.user_we.eq(self._fsm.write_enable), ] return m @@ -176,14 +176,7 @@ class LogicAnalyzerCore(Elaboratable): Return the Amaranth signals that should be included as ports in the top-level Manta module. """ - return self.probes - - def get_probe(self, name): - for p in self.probes: - if p.name == name: - return p - - raise ValueError(f"Probe '{name}' not found in Logic Analyzer core.") + return self._probes def get_max_addr(self): """ @@ -191,167 +184,150 @@ class LogicAnalyzerCore(Elaboratable): space used by the core extends from `base_addr` to the number returned by this function. """ - return self.sample_mem.get_max_addr() + return self._sample_mem.get_max_addr() def capture(self, verbose=False): - """Perform a capture, recording the state of all input probes to the FPGA's memory, and - then reading that out on the host. - - Parameters: - ---------- - verbose : bool - Whether or not to print the status of the capture to stdout as it progresses. - Defaults to False. - - Returns: - ---------- - An instance of LogicAnalyzerCapture. + """ + Performs a capture, recording the state of all input probes to the + FPGA's memory, and then returns that as a LogicAnalyzerCapture class + on the host. """ print_if_verbose = lambda x: print(x) if verbose else None # If core is not in IDLE state, request that it return to IDLE print_if_verbose(" -> Resetting core...") - state = self.fsm.registers.get_probe("state") + state = self._fsm.registers.get_probe("state") if state != States.IDLE: - self.fsm.registers.set_probe("request_start", 0) - self.fsm.registers.set_probe("request_stop", 0) - self.fsm.registers.set_probe("request_stop", 1) - self.fsm.registers.set_probe("request_stop", 0) + self._fsm.registers.set_probe("request_start", 0) + self._fsm.registers.set_probe("request_stop", 0) + self._fsm.registers.set_probe("request_stop", 1) + self._fsm.registers.set_probe("request_stop", 0) - if self.fsm.registers.get_probe("state") != States.IDLE: + if self._fsm.registers.get_probe("state") != States.IDLE: raise ValueError("Logic analyzer did not reset to IDLE state.") # Set triggers print_if_verbose(" -> Setting triggers...") - self.trig_blk.clear_triggers() + self._trig_blk.clear_triggers() - if self.config.get("trigger_mode") != "immediate": - self.trig_blk.set_triggers(self.config) + if self._config.get("trigger_mode") != "immediate": + self._trig_blk.set_triggers(self._config) # Set trigger mode, default to single-shot if user didn't specify a mode print_if_verbose(" -> Setting trigger mode...") - if "trigger_mode" in self.config: - mode = self.config["trigger_mode"].upper() - self.fsm.registers.set_probe("trigger_mode", TriggerModes[mode]) + if "trigger_mode" in self._config: + mode = self._config["trigger_mode"].upper() + self._fsm.registers.set_probe("trigger_mode", TriggerModes[mode]) else: - self.fsm.registers.set_probe("trigger_mode", TriggerModes.SINGLE_SHOT) + self._fsm.registers.set_probe("trigger_mode", TriggerModes.SINGLE_SHOT) # Set trigger location print_if_verbose(" -> Setting trigger location...") - if "trigger_location" in self.config: - self.fsm.registers.set_probe( - "trigger_location", self.config["trigger_location"] + if "trigger_location" in self._config: + self._fsm.registers.set_probe( + "trigger_location", self._config["trigger_location"] ) else: - self.fsm.registers.set_probe( - "trigger_location", self.config["sample_depth"] // 2 + self._fsm.registers.set_probe( + "trigger_location", self._config["sample_depth"] // 2 ) # Send a start request to the state machine print_if_verbose(" -> Starting capture...") - self.fsm.registers.set_probe("request_start", 0) - self.fsm.registers.set_probe("request_start", 1) - self.fsm.registers.set_probe("request_start", 0) + self._fsm.registers.set_probe("request_start", 0) + self._fsm.registers.set_probe("request_start", 1) + self._fsm.registers.set_probe("request_start", 0) # Poll the state machine's state, and wait for the capture to complete print_if_verbose(" -> Waiting for capture to complete...") - while self.fsm.registers.get_probe("state") != States.CAPTURED: + while self._fsm.registers.get_probe("state") != States.CAPTURED: pass # Read out the entirety of the sample memory print_if_verbose(" -> Reading sample memory contents...") - addrs = list(range(self.config["sample_depth"])) - raw_capture = self.sample_mem.read_from_user_addr(addrs) + addrs = list(range(self._config["sample_depth"])) + raw_capture = self._sample_mem.read_from_user_addr(addrs) # Revolve the memory around the read_pointer, such that all the beginning # of the caputure is at the first element print_if_verbose(" -> Checking read pointer and revolving memory...") - read_pointer = self.fsm.registers.get_probe("read_pointer") + read_pointer = self._fsm.registers.get_probe("read_pointer") data = raw_capture[read_pointer:] + raw_capture[:read_pointer] - return LogicAnalyzerCapture(data, self.config) + return LogicAnalyzerCapture(data, self._config) class LogicAnalyzerCapture: - """A container for the data collected during a capture from a LogicAnalyzerCore. Contains - methods for exporting the data as a VCD waveform file, or as a Verilog module for playing - back captured data in simulation/synthesis. - - Parameters: - ---------- - data : list[int] - The raw captured data taken by the LogicAnalyzerCore. This consists of the values of - all the input probes concatenated together at every timestep. - - config : dict - The configuration of the LogicAnalyzerCore that took this capture. + """ + A container class for the data collected by a LogicAnalyzerCore. Contains + methods for exporting the data as a VCD waveform file, a Python list, a + CSV file, or a Verilog module. """ def __init__(self, data, config): - self.data = data - self.config = config + self._data = data + self._config = config def get_trigger_location(self): - """Gets the location of the trigger in the capture. This will match the value of - "trigger_location" provided in the configuration file at the time of capture. - - Parameters: - ---------- - None - - Returns: - ---------- - The trigger location as an `int`. """ - if "trigger_location" in self.config: - return self.config["trigger_location"] + Gets the location of the trigger in the capture. This will match the + value of "trigger_location" provided in the configuration file at the + time of capture. + """ + + if "trigger_location" in self._config: + return self._config["trigger_location"] else: - return self.config["sample_depth"] // 2 + return self._config["sample_depth"] // 2 def get_trace(self, probe_name): - """Gets the value of a single probe over the capture. - - Parameters: - ---------- - probe_name : int - The name of the probe in the LogicAnalyzer Core. This must match the name provided - in the configuration file. - - Returns: - ---------- - The value of the probe at every timestep in the capture, as a list of integers. + """ + Gets the value of a single probe over the capture. """ # sum up the widths of all the probes below this one lower = 0 - for name, width in self.config["probes"].items(): + for name, width in self._config["probes"].items(): if name == probe_name: break lower += width # add the width of the probe we'd like - upper = lower + self.config["probes"][probe_name] + upper = lower + self._config["probes"][probe_name] - total_probe_width = sum(self.config["probes"].values()) - binary = [f"{d:0{total_probe_width}b}" for d in self.data] + total_probe_width = sum(self._config["probes"].values()) + binary = [f"{d:0{total_probe_width}b}" for d in self._data] return [int(b[lower:upper], 2) for b in binary] + def export_csv(self, path): + """ + Export the capture to a CSV file, containing the data of all probes in + the core. + """ + + names = list(self._config["probes"].keys()) + values = [self.get_trace(n) for n in names] + + # Transpose list of lists so that data flows top-to-bottom instead of + # left-to-right + values_t = [list(x) for x in zip(*values)] + + import csv + with open(path, 'w') as f: + writer = csv.writer(f) + + writer.writerow(names) + writer.writerows(values_t) + + def export_vcd(self, path): - """Export the capture to a VCD file, containing the data of all probes in the core. - - Parameters: - ---------- - path : str - The path of the output file, including the ".vcd" file extension. - - Returns: - ---------- - None - + """ + Export the capture to a VCD file, containing the data of all probes in + the core. """ from vcd import VCDWriter @@ -364,7 +340,7 @@ class LogicAnalyzerCapture: with VCDWriter(vcd_file, "10 ns", timestamp, "manta") as writer: # each probe has a name, width, and writer associated with it signals = [] - for name, width in self.config["probes"].items(): + for name, width in self._config["probes"].items(): signal = { "name": name, "width": width, @@ -377,20 +353,20 @@ class LogicAnalyzerCapture: # include a trigger signal such would be meaningful (ie, we didn't trigger immediately) if ( - "trigger_mode" not in self.config - or self.config["trigger_mode"] == "single_shot" + "trigger_mode" not in self._config + or self._config["trigger_mode"] == "single_shot" ): trigger = writer.register_var("manta", "trigger", "wire", size=1) # add the data to each probe in the vcd file - for timestamp in range(0, 2 * len(self.data)): + for timestamp in range(0, 2 * len(self._data)): # run the clock writer.change(clock, timestamp, timestamp % 2 == 0) # set the trigger (if there is one) if ( - "trigger_mode" not in self.config - or self.config["trigger_mode"] == "single_shot" + "trigger_mode" not in self._config + or self._config["trigger_mode"] == "single_shot" ): triggered = (timestamp // 2) >= self.get_trigger_location() writer.change(trigger, timestamp, triggered) @@ -405,31 +381,19 @@ class LogicAnalyzerCapture: vcd_file.close() def get_playback_module(self): - """Gets an Amaranth module that will playback the captured data. This module is - synthesizable, so it may be used in either simulation or synthesis. - - Parameters: - ---------- - None - - Returns: - ---------- - An instance of LogicAnalyzerPlayback, which is a synthesizable Amaranth module. """ - return LogicAnalyzerPlayback(self.data, self.config) + Returns an Amaranth module that will playback the captured data. This + module is synthesizable, so it may be used in either simulation or + on the FPGA directly by including it your build process. + """ + + return LogicAnalyzerPlayback(self._data, self._config) def export_playback_verilog(self, path): - """Exports a Verilog module that will playback the captured data. This module is - synthesizable, so it may be used in either simulation or synthesis. - - Parameters: - ---------- - path : str - The path of the output file, including the ".v" file extension. - - Returns: - ---------- - None + """ + Exports a Verilog module that will playback the captured data. This + module is synthesizable, so it may be used in either simulation or + on the FPGA directly by including it your build process. """ lap = self.get_playback_module() diff --git a/src/manta/logic_analyzer/playback.py b/src/manta/logic_analyzer/playback.py index 3fc72e4..5ddb6d9 100644 --- a/src/manta/logic_analyzer/playback.py +++ b/src/manta/logic_analyzer/playback.py @@ -3,10 +3,9 @@ from amaranth import * class LogicAnalyzerPlayback(Elaboratable): """ - A synthesizable module that plays back data captured by a LogicAnalyzerCore. - - Takes a list of all the samples captured by a core, along with the config - of the core used to take it. + A synthesizable module that plays back data captured by a + LogicAnalyzerCore. Takes a list of all the samples captured by a core, + along with the config of the core used to take it. """ def __init__(self, data, config): @@ -73,7 +72,7 @@ class LogicAnalyzerPlayback(Elaboratable): def get_top_level_ports(self): """ - Return the Amaranth signals that should be included as ports in the + Returns the Amaranth signals that should be included as ports in the exported Verilog module. """ return [self.start, self.valid] + list(self.top_level_probes.values()) diff --git a/test/test_logic_analyzer_hw.py b/test/test_logic_analyzer_hw.py index 12e8c41..d1dd695 100644 --- a/test/test_logic_analyzer_hw.py +++ b/test/test_logic_analyzer_hw.py @@ -36,9 +36,9 @@ class LogicAnalyzerCounterTest(Elaboratable): m.submodules.manta = self.manta uart_pins = platform.request("uart") - larry = self.manta.la.probes[0] - curly = self.manta.la.probes[1] - moe = self.manta.la.probes[2] + larry = self.manta.la._probes[0] + curly = self.manta.la._probes[1] + moe = self.manta.la._probes[2] m.d.sync += larry.eq(larry + 1) m.d.sync += curly.eq(curly + 1) @@ -61,11 +61,14 @@ class LogicAnalyzerCounterTest(Elaboratable): # check that VCD export works cap.export_vcd("out.vcd") + # check that CSV export works + cap.export_csv("out.csv") + # check that Verilog export works cap.export_playback_verilog("out.v") # verify that each signal is just a counter modulo the width of the signal - for name, width in self.manta.la.config["probes"].items(): + for name, width in self.manta.la._config["probes"].items(): trace = cap.get_trace(name) for i in range(len(trace) - 1): From b0dcd269bcb7e57cfadbec733acdf389276165b3 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Mon, 19 Feb 2024 11:42:28 -0800 Subject: [PATCH 55/89] add from_config to memory_core --- src/manta/logic_analyzer/__init__.py | 14 +++++--- src/manta/logic_analyzer/sample_mem.py | 16 --------- src/manta/manta.py | 2 +- src/manta/memory_core.py | 47 ++++++++++---------------- test/test_logic_analyzer_sim.py | 10 +++--- test/test_mem_core_sim.py | 3 +- 6 files changed, 33 insertions(+), 59 deletions(-) delete mode 100644 src/manta/logic_analyzer/sample_mem.py diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index 20a8ef8..1ffe387 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -1,8 +1,8 @@ from amaranth import * from manta.utils import * +from manta.memory_core import ReadOnlyMemoryCore from manta.logic_analyzer.trigger_block import LogicAnalyzerTriggerBlock from manta.logic_analyzer.fsm import LogicAnalyzerFSM, States, TriggerModes -from manta.logic_analyzer.sample_mem import LogicAnalyzerSampleMemory from manta.logic_analyzer.playback import LogicAnalyzerPlayback @@ -35,8 +35,12 @@ class LogicAnalyzerCore(Elaboratable): self._trig_blk = LogicAnalyzerTriggerBlock( self._probes, self._fsm.get_max_addr() + 1, interface ) - self._sample_mem = LogicAnalyzerSampleMemory( - self._config, self._trig_blk.get_max_addr() + 1, interface + + self._sample_mem = ReadOnlyMemoryCore( + width=sum(self._config["probes"].values()), + depth=self._config["sample_depth"], + base_addr=self._trig_blk.get_max_addr() + 1, + interface=interface, ) def _check_config(self): @@ -317,13 +321,13 @@ class LogicAnalyzerCapture: values_t = [list(x) for x in zip(*values)] import csv - with open(path, 'w') as f: + + with open(path, "w") as f: writer = csv.writer(f) writer.writerow(names) writer.writerows(values_t) - def export_vcd(self, path): """ Export the capture to a VCD file, containing the data of all probes in diff --git a/src/manta/logic_analyzer/sample_mem.py b/src/manta/logic_analyzer/sample_mem.py deleted file mode 100644 index 045fabb..0000000 --- a/src/manta/logic_analyzer/sample_mem.py +++ /dev/null @@ -1,16 +0,0 @@ -from amaranth import * -from manta.memory_core import ReadOnlyMemoryCore - - -class LogicAnalyzerSampleMemory(ReadOnlyMemoryCore): - """ - A module that wraps a ReadOnlyMemoryCore, using the config from a LogicAnalyzerCore - to determine the parameters with which to instantiate the core. - """ - - def __init__(self, config, base_addr, interface): - width = sum(config["probes"].values()) - depth = config["sample_depth"] - mem_config = {"width": width, "depth": depth} - - super().__init__(mem_config, base_addr, interface) diff --git a/src/manta/manta.py b/src/manta/manta.py index 9384957..5dca676 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -84,7 +84,7 @@ class Manta(Elaboratable): core = LogicAnalyzerCore(attrs, base_addr, self.interface) elif attrs["type"] == "memory_read_only": - core = ReadOnlyMemoryCore(attrs, base_addr, self.interface) + core = ReadOnlyMemoryCore.from_config(attrs, base_addr, self.interface) # make sure we're not out of address space if core.get_max_addr() > (2**16) - 1: diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index 6d92ee4..6bc3681 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -15,14 +15,12 @@ class ReadOnlyMemoryCore(Elaboratable): https://fischermoseley.github.io/manta/memory_core/ """ - def __init__(self, config, base_addr, interface): - self._config = config + def __init__(self, width, depth, base_addr, interface): + self._width = width + self._depth = depth self._base_addr = base_addr self._interface = interface - self._check_config(config) - self._depth = self._config["depth"] - self._width = self._config["width"] self._max_addr = self._base_addr + (self._depth * ceil(self._width / 16)) # Bus Connections @@ -36,7 +34,8 @@ class ReadOnlyMemoryCore(Elaboratable): self._define_mems() - def _check_config(self, config): + @classmethod + def from_config(cls, config, base_addr, interface): # Check for unrecognized options valid_options = ["type", "depth", "width"] for option in config: @@ -44,25 +43,29 @@ class ReadOnlyMemoryCore(Elaboratable): warn(f"Ignoring unrecognized option '{option}' in memory core.") # Check depth is provided and positive - if "depth" not in config: + depth = config.get("depth") + if not depth: raise ValueError("Depth of memory core must be specified.") - if not isinstance(config["depth"], int): + if not isinstance(depth, int): raise ValueError("Depth of memory core must be an integer.") - if config["depth"] <= 0: + if not depth > 0: raise ValueError("Depth of memory core must be positive. ") # Check width is provided and positive - if "width" not in config: + width = config.get("width") + if not width: raise ValueError("Width of memory core must be specified.") - if not isinstance(config["width"], int): + if not isinstance(width, int): raise ValueError("Width of memory core must be an integer.") - if config["width"] <= 0: + if not width > 0: raise ValueError("Width of memory core must be positive. ") + cls(width, depth, base_addr, interface) + def _pipeline_bus(self, m): self._bus_pipe = [Signal(InternalBus()) for _ in range(3)] m.d.sync += self._bus_pipe[0].eq(self.bus_i) @@ -160,7 +163,8 @@ class ReadOnlyMemoryCore(Elaboratable): def read_from_user_addr(self, addrs): """ - Read the memory stored at the provided address, as seen from the user side. + Read the memory stored at the provided address, as seen from the user + side. """ # Convert user address space to bus address space @@ -180,20 +184,3 @@ class ReadOnlyMemoryCore(Elaboratable): datas = self._interface.read(bus_addrs) data_chunks = split_into_chunks(datas, len(self._mems)) return [words_to_value(chunk) for chunk in data_chunks] - - # def write_to_user_addr(self, addrs, datas): - # """ - # Read from the address - # """ - - # bus_addrs = [] - # for addr in addrs: - # bus_addrs += [ - # addr + self._base_addr + i * self._depth for i in range(len(self._mems)) - # ] - - # bus_datas = [] - # for data in datas: - # bus_datas += value_to_words(data) - - # self._interface.write(bus_addrs, bus_datas) diff --git a/test/test_logic_analyzer_sim.py b/test/test_logic_analyzer_sim.py index 0346bd6..f5c7ea2 100644 --- a/test/test_logic_analyzer_sim.py +++ b/test/test_logic_analyzer_sim.py @@ -33,8 +33,8 @@ def print_data_at_addr(addr): def set_fsm_register(name, data): - addr = la.fsm.registers._memory_map[name]["addrs"][0] - strobe_addr = la.fsm.registers._base_addr + addr = la._fsm.registers._memory_map[name]["addrs"][0] + strobe_addr = la._fsm.registers._base_addr yield from write_register(la, strobe_addr, 0) yield from write_register(la, addr, data) @@ -43,8 +43,8 @@ def set_fsm_register(name, data): def set_trig_blk_register(name, data): - addr = la.trig_blk.registers._memory_map[name]["addrs"][0] - strobe_addr = la.trig_blk.registers._base_addr + addr = la._trig_blk.registers._memory_map[name]["addrs"][0] + strobe_addr = la._trig_blk.registers._base_addr yield from write_register(la, strobe_addr, 0) yield from write_register(la, addr, data) @@ -54,7 +54,7 @@ def set_trig_blk_register(name, data): def set_probe(name, value): probe = None - for p in la.probes: + for p in la._probes: if p.name == name: probe = p diff --git a/test/test_mem_core_sim.py b/test/test_mem_core_sim.py index 675991f..e793c4f 100644 --- a/test/test_mem_core_sim.py +++ b/test/test_mem_core_sim.py @@ -15,8 +15,7 @@ def fill_mem_from_user_port(mem_core, depth): def verify_mem_core(width, depth, base_addr): - config = {"type": "memory", "width": width, "depth": depth} - mem_core = ReadOnlyMemoryCore(config, base_addr, interface=None) + mem_core = ReadOnlyMemoryCore(width, depth, base_addr, interface=None) def testbench(): yield from fill_mem_from_user_port(mem_core, depth) From ca7d743bf45009d923e17ac2cdbc13a2d70a863f Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Mon, 19 Feb 2024 12:15:19 -0800 Subject: [PATCH 56/89] move to private methods in Manta class --- src/manta/cli.py | 2 +- src/manta/ethernet/source_bridge.py | 2 +- src/manta/io_core.py | 4 +- src/manta/logic_analyzer/__init__.py | 16 ++--- src/manta/logic_analyzer/trigger_block.py | 4 +- src/manta/manta.py | 82 ++++++++++++----------- src/manta/memory_core.py | 2 +- src/manta/utils.py | 10 +-- 8 files changed, 62 insertions(+), 60 deletions(-) diff --git a/src/manta/cli.py b/src/manta/cli.py index c65a167..2ae2f3a 100644 --- a/src/manta/cli.py +++ b/src/manta/cli.py @@ -113,7 +113,7 @@ def ports(): for port in serial.tools.list_ports.comports(): print(port) - # sometimes macOS will enumerate non-serial devices as serial ports, + # Sometimes macOS will enumerate non-serial devices as serial ports, # in which case the PID/VID/serial/location/etc are all None pid = f"0x{port.pid:04X}" if port.pid is not None else "None" vid = f"0x{port.vid:04X}" if port.vid is not None else "None" diff --git a/src/manta/ethernet/source_bridge.py b/src/manta/ethernet/source_bridge.py index 91b7fbc..4ed8765 100644 --- a/src/manta/ethernet/source_bridge.py +++ b/src/manta/ethernet/source_bridge.py @@ -19,7 +19,7 @@ class UDPSourceBridge(Elaboratable): def elaborate(self, platform): m = Module() - state = Signal() # can either be 0, for read/write, or 1, for data + state = Signal() # Can either be 0, for read/write, or 1, for data rw_buf = Signal().like(self.bus_o.rw) # Can always take more data diff --git a/src/manta/io_core.py b/src/manta/io_core.py index 61bc5be..ff633a6 100644 --- a/src/manta/io_core.py +++ b/src/manta/io_core.py @@ -84,13 +84,13 @@ class IOCore(Elaboratable): initial_value = 0 if isinstance(attrs, dict): - # check that each output probe has only recognized options + # Check that each output probe has only recognized options valid_options = ["width", "initial_value"] for option in attrs: if option not in valid_options: warn(f'Ignoring unrecognized option "{option}" in IO core.') - # check that widths are appropriate + # Check that widths are appropriate if "width" not in attrs: raise ValueError(f"No width specified for output probe {name}.") diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index 1ffe387..62dc8c6 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -292,7 +292,7 @@ class LogicAnalyzerCapture: Gets the value of a single probe over the capture. """ - # sum up the widths of all the probes below this one + # Sum up the widths of all the probes below this one lower = 0 for name, width in self._config["probes"].items(): if name == probe_name: @@ -300,7 +300,7 @@ class LogicAnalyzerCapture: lower += width - # add the width of the probe we'd like + # Add the width of the probe we'd like upper = lower + self._config["probes"][probe_name] total_probe_width = sum(self._config["probes"].values()) @@ -342,7 +342,7 @@ class LogicAnalyzerCapture: vcd_file = open(path, "w") with VCDWriter(vcd_file, "10 ns", timestamp, "manta") as writer: - # each probe has a name, width, and writer associated with it + # Each probe has a name, width, and writer associated with it signals = [] for name, width in self._config["probes"].items(): signal = { @@ -355,19 +355,19 @@ class LogicAnalyzerCapture: clock = writer.register_var("manta", "clk", "wire", size=1) - # include a trigger signal such would be meaningful (ie, we didn't trigger immediately) + # Include a trigger signal such would be meaningful (ie, we didn't trigger immediately) if ( "trigger_mode" not in self._config or self._config["trigger_mode"] == "single_shot" ): trigger = writer.register_var("manta", "trigger", "wire", size=1) - # add the data to each probe in the vcd file + # Add the data to each probe in the vcd file for timestamp in range(0, 2 * len(self._data)): - # run the clock + # Run the clock writer.change(clock, timestamp, timestamp % 2 == 0) - # set the trigger (if there is one) + # Set the trigger (if there is one) if ( "trigger_mode" not in self._config or self._config["trigger_mode"] == "single_shot" @@ -375,7 +375,7 @@ class LogicAnalyzerCapture: triggered = (timestamp // 2) >= self.get_trigger_location() writer.change(trigger, timestamp, triggered) - # add other signals + # Add other signals for signal in signals: var = signal["var"] sample = signal["data"][timestamp // 2] diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 652f5be..1f16599 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -37,13 +37,13 @@ class LogicAnalyzerTriggerBlock(Elaboratable): return self.registers.get_max_addr() def clear_triggers(self): - # reset all triggers to disabled with no argument + # Reset all triggers to disabled with no argument for p in self._probes: self.registers.set_probe(p.name + "_op", Operations.DISABLE) self.registers.set_probe(p.name + "_arg", 0) def set_triggers(self, config): - # set triggers + # Set triggers for trigger in config["triggers"]: components = trigger.strip().split(" ") diff --git a/src/manta/manta.py b/src/manta/manta.py index 5dca676..0b89726 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -9,24 +9,26 @@ from manta.logic_analyzer import LogicAnalyzerCore class Manta(Elaboratable): def __init__(self, config): - # load config from either a configuration file or a dictionary. Users primarily use the - # config file, but the dictionary is included for internal tests. + # Load config from either a configuration file or a dictionary. + # Users primarily use the config file, but the dictionary is + # included for internal tests. if isinstance(config, str): - self.config = self.read_config_file(config) + self._config = self._read_config_file(config) if isinstance(config, dict): - self.config = config + self._config = config - self.check_config() + self._check_config() - self.interface = self.get_interface() - self.cores = self.get_cores() - self.add_friendly_core_names() + self._get_interface() + self._get_cores() + self._add_friendly_core_names() - def read_config_file(self, path): + def _read_config_file(self, path): """ - Take path to configuration file, and retun the configuration as a python list/dict object. + Takes a path to configuration file, and return the configuration as a + python dictionary. """ extension = path.split(".")[-1] @@ -46,37 +48,46 @@ class Manta(Elaboratable): else: raise ValueError("Unable to recognize configuration file extension.") - def check_config(self): - if "cores" not in self.config: + def _check_config(self): + if "cores" not in self._config: raise ValueError("No cores specified in configuration file.") - if not len(self.config["cores"]) > 0: + if not len(self._config["cores"]) > 0: raise ValueError("Must specify at least one core.") - for name, attrs in self.config["cores"].items(): - # make sure core type is specified + for name, attrs in self._config["cores"].items(): + # Make sure core type is specified if "type" not in attrs: raise ValueError(f"No type specified for core {name}.") if attrs["type"] not in ["logic_analyzer", "io", "memory_read_only"]: raise ValueError(f"Unrecognized core type specified for {name}.") - def get_interface(self): - if "uart" in self.config: - return UARTInterface.from_config(self.config["uart"]) + def _get_interface(self): + """ + Returns an instance of an interface object (UARTInterface or + EthernetInterface) configured with the parameters in the + config file. + """ + if "uart" in self._config: + self.interface = UARTInterface.from_config(self._config["uart"]) - elif "ethernet" in self.config: - return EthernetInterface(self.config["ethernet"]) + elif "ethernet" in self._config: + self.interface = EthernetInterface(self._config["ethernet"]) else: raise ValueError("No recognized interface specified.") - def get_cores(self): - """ """ + def _get_cores(self): + """ + Creates instances of the cores (IOCore, LogicAnalyzerCore, + ReadOnlyMemoryCore) specified in the user's configuration, and returns + them as a list. + """ - cores = {} + self._cores = {} base_addr = 0 - for name, attrs in self.config["cores"].items(): + for name, attrs in self._config["cores"].items(): if attrs["type"] == "io": core = IOCore.from_config(attrs, base_addr, self.interface) @@ -86,7 +97,7 @@ class Manta(Elaboratable): elif attrs["type"] == "memory_read_only": core = ReadOnlyMemoryCore.from_config(attrs, base_addr, self.interface) - # make sure we're not out of address space + # Make sure we're not out of address space if core.get_max_addr() > (2**16) - 1: raise ValueError( f"Ran out of address space to allocate to core {name}." @@ -94,18 +105,16 @@ class Manta(Elaboratable): # Make the next core's base address start one address after the previous one's base_addr = core.get_max_addr() + 1 - cores[name] = core + self._cores[name] = core - return cores - - def add_friendly_core_names(self): + def _add_friendly_core_names(self): """ Add cores to the instance under a friendly name - ie, a core named `my_core` belonging to a Manta instance `m` could be obtained with `m.cores["my_core"]`, but this allows it to be obtained with `m.my_core`. Which is way nicer. """ - for name, instance in self.cores.items(): + for name, instance in self._cores.items(): if not hasattr(self, name): setattr(self, name, instance) @@ -115,24 +124,17 @@ class Manta(Elaboratable): ) def elaborate(self, platform): - # make a module object - # add all the submodules - # connect them together, which consists of: - # connect interface to first core - # connect cores to each other - # connect interface to last core - m = Module() # Add interface as submodule m.submodules.interface = self.interface # Add all cores as submodules - for name, instance in self.cores.items(): + for name, instance in self._cores.items(): m.submodules[name] = instance # Connect first/last cores to interface output/input respectively - core_instances = list(self.cores.values()) + core_instances = list(self._cores.values()) first_core = core_instances[0] last_core = core_instances[-1] @@ -155,7 +157,7 @@ class Manta(Elaboratable): """ ports = self.interface.get_top_level_ports() - for name, instance in self.cores.items(): + for name, instance in self._cores.items(): ports += instance.get_top_level_ports() return ports diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index 6bc3681..fa52411 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -64,7 +64,7 @@ class ReadOnlyMemoryCore(Elaboratable): if not width > 0: raise ValueError("Width of memory core must be positive. ") - cls(width, depth, base_addr, interface) + return cls(width, depth, base_addr, interface) def _pipeline_bus(self, m): self._bus_pipe = [Signal(InternalBus()) for _ in range(3)] diff --git a/src/manta/utils.py b/src/manta/utils.py index 7fe12f2..072ceb5 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -27,7 +27,7 @@ def warn(message): Prints a warning to the user's terminal. Originally the warn() method from the builtin warnings module was used for this, but I don't think the way it outputs on the command line is the most helpful for the users. - (They don't care about the stacktrace or the filename/line number, for example.) + (ie, Users don't care about the stacktrace or the filename/line number.) """ print("Warning: " + message) @@ -68,7 +68,7 @@ def value_to_words(data, n_words): if not isinstance(data, int) or data < 0: raise ValueError("Behavior is only defined for nonnegative integers.") - # convert to binary, split into 16-bit chunks, and then convert back to list of int + # Convert to binary, split into 16-bit chunks, and then convert back to list of int binary = f"{data:0b}".zfill(n_words * 16) return [int(binary[i : i + 16], 2) for i in range(0, 16 * n_words, 16)][::-1] @@ -113,7 +113,7 @@ def verify_register(module, addr, expected_data): possible to return a value from here, and compare it in the calling function. """ - # place read transaction on the bus + # Place read transaction on the bus yield module.bus_i.addr.eq(addr) yield module.bus_i.data.eq(0) yield module.bus_i.rw.eq(0) @@ -122,11 +122,11 @@ def verify_register(module, addr, expected_data): yield module.bus_i.addr.eq(0) yield module.bus_i.valid.eq(0) - # wait for output to be valid + # Wait for output to be valid while not (yield module.bus_o.valid): yield - # compare returned value with expected + # Compare returned value with expected data = yield (module.bus_o.data) if data != expected_data: raise ValueError(f"Read from {addr} yielded {data} instead of {expected_data}") From 491db38def178109f7a6d22d222ff2c719c1adba Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Mon, 19 Feb 2024 13:53:04 -0800 Subject: [PATCH 57/89] tidy DHCP counter --- mkdocs.yml | 2 +- src/manta/ethernet/__init__.py | 21 +++++++++++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/mkdocs.yml b/mkdocs.yml index 67f50e5..a82ea34 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,7 +3,7 @@ site_description: Manta Documentation site_author: Fischer Moseley repo_url: https://github.com/fischermoseley/manta/ - +repo_name: fischermoseley/manta docs_dir: 'doc' theme: diff --git a/src/manta/ethernet/__init__.py b/src/manta/ethernet/__init__.py index 1d779a9..a415420 100644 --- a/src/manta/ethernet/__init__.py +++ b/src/manta/ethernet/__init__.py @@ -22,6 +22,10 @@ class EthernetInterface(Elaboratable): self._fpga_ip_addr = config.get("fpga_ip_addr") self._host_ip_addr = config.get("host_ip_addr") self._udp_port = config.get("udp_port") + + # Convert to float first because Python considers scientific notation + # to only represent floats, not ints. + self._clk_freq = int(float(config.get("clk_freq"))) self._check_config() self.bus_i = Signal(InternalBus()) @@ -37,7 +41,7 @@ class EthernetInterface(Elaboratable): self.rmii_tx_en = Signal() self._dhcp_start = Signal() - self._dhcp_timer = Signal(range(int(100e6))) + self._dhcp_timer = Signal(range(self._clk_freq + 1), reset=self._clk_freq) self._source_data = Signal(32) self._source_last = Signal() @@ -109,11 +113,20 @@ class EthernetInterface(Elaboratable): def elaborate(self, platform): m = Module() - with m.If(self._dhcp_timer < int(50e6)): - m.d.sync += self._dhcp_timer.eq(self._dhcp_timer + 1) + # The DHCP engine in the LiteEth core will request a new IP address + # when the dhcp_start signal is pulsed. It doesn't want this signal + # immediately at power-on though, so a timer is used to request an IP + # one second after power on. The self._clk_freq attribute is used to + # figure out how many clock cycles that equates to. - m.d.sync += self._dhcp_start.eq(self._dhcp_timer == (int(50e6) - 2)) + # In my limited testing this seems to be enough time. + with m.If(self._dhcp_timer < 0): + m.d.sync += self._dhcp_timer.eq(self._dhcp_timer - 1) + + m.d.sync += self._dhcp_start.eq(self._dhcp_timer == 1) + + # Add the LiteEth core as a submodule m.submodules.liteeth = Instance( "liteeth_core", ("i", "sys_clock", ClockSignal()), From 8a2b9ced7665f3b05e41f3f625f202cbb0d28d0d Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Mon, 19 Feb 2024 17:19:23 -0800 Subject: [PATCH 58/89] add ethernet PHY IO autoassignment --- src/manta/ethernet/__init__.py | 129 +++++++++++++++++++++++++-------- 1 file changed, 99 insertions(+), 30 deletions(-) diff --git a/src/manta/ethernet/__init__.py b/src/manta/ethernet/__init__.py index a415420..dc5ca69 100644 --- a/src/manta/ethernet/__init__.py +++ b/src/manta/ethernet/__init__.py @@ -22,6 +22,7 @@ class EthernetInterface(Elaboratable): self._fpga_ip_addr = config.get("fpga_ip_addr") self._host_ip_addr = config.get("host_ip_addr") self._udp_port = config.get("udp_port") + self._phy = config.get("phy") # Convert to float first because Python considers scientific notation # to only represent floats, not ints. @@ -31,14 +32,7 @@ class EthernetInterface(Elaboratable): self.bus_i = Signal(InternalBus()) self.bus_o = Signal(InternalBus()) - self.rmii_clocks_ref_clk = Signal() - self.rmii_crs_dv = Signal() - self.rmii_mdc = Signal() - self.rmii_mdio = Signal() - self.rmii_rst_n = Signal() - self.rmii_rx_data = Signal(2) - self.rmii_tx_data = Signal(2) - self.rmii_tx_en = Signal() + self._phy_io = self._define_phy_io() self._dhcp_start = Signal() self._dhcp_timer = Signal(range(self._clk_freq + 1), reset=self._clk_freq) @@ -94,22 +88,102 @@ class EthernetInterface(Elaboratable): Return the Amaranth signals that should be included as ports in the top-level Manta module. """ - ports = [ - self.rmii_clocks_ref_clk, - self.rmii_crs_dv, - self.rmii_mdc, - self.rmii_mdio, - self.rmii_rst_n, - self.rmii_rx_data, - self.rmii_tx_data, - self.rmii_tx_en, - ] - return ports + return [io[2] for io in self._phy_io] def _binarize_ip_addr(self, ip_addr): octets = [bin(int(o))[2:].zfill(8) for o in ip_addr.split(".")] return int("".join(octets), 2) + def _define_phy_io(self): + if self._phy in ["LiteEthPHYMII"]: + return [ + ("i", "mii_clocks_tx", mii_clocks_tx := Signal()), + ("i", "mii_clocks_rx", mii_clocks_rx := Signal()), + ("o", "mii_rst_n", mii_rst_n := Signal()), + ("io", "mii_mdio", mii_mdio := Signal()), + ("o", "mii_mdc", mii_mdc := Signal()), + ("i", "mii_rx_dv", mii_rx_dv := Signal()), + ("i", "mii_rx_er", mii_rx_er := Signal()), + ("i", "mii_rx_data", mii_rx_data := Signal(4)), + ("o", "mii_tx_en", mii_tx_en := Signal()), + ("o", "mii_tx_data", mii_tx_data := Signal(4)), + ("i", "mii_col", mii_col := Signal()), + ("i", "mii_crs", mii_crs := Signal()), + ] + + elif self._phy in ["LiteEthPHYRMII"]: + return [ + ("i", "rmii_clocks_ref_clk", rmii_clocks_ref_clk := Signal()), + ("o", "rmii_rst_n", rmii_rst_n := Signal()), + ("i", "rmii_rx_data", rmii_rx_data := Signal(2)), + ("i", "rmii_crs_dv", rmii_crs_dv := Signal()), + ("o", "rmii_tx_en", rmii_tx_en := Signal()), + ("o", "rmii_tx_data", rmii_tx_data := Signal(2)), + ("o", "rmii_mdc", rmii_mdc := Signal()), + ("io", "rmii_mdio", rmii_mdio := Signal()), + ] + + elif self._phy in [ + "LiteEthPHYGMII", + "LiteEthPHYGMIIMII", + ]: + return [ + ("i", "gmii_clocks_tx", gmii_clocks_tx := Signal()), + ("o", "gmii_clocks_gtx", gmii_clocks_gtx := Signal()), + ("i", "gmii_clocks_rx", gmii_clocks_rx := Signal()), + ("o", "gmii_rst_n", gmii_rst_n := Signal()), + ("i", "gmii_int_n", gmii_int_n := Signal()), + ("io", "gmii_mdio", gmii_mdio := Signal()), + ("o", "gmii_mdc", gmii_mdc := Signal()), + ("i", "gmii_rx_dv", gmii_rx_dv := Signal()), + ("i", "gmii_rx_er", gmii_rx_er := Signal()), + ("i", "gmii_rx_data", gmii_rx_data := Signal(8)), + ("o", "gmii_tx_en", gmii_tx_en := Signal()), + ("o", "gmii_tx_er", gmii_tx_er := Signal()), + ("o", "gmii_tx_data", gmii_tx_data := Signal(8)), + ("i", "gmii_col", gmii_col := Signal()), + ("i", "gmii_crs", gmii_crs := Signal()), + ] + + elif self._phy in [ + "LiteEthS7PHYRGMII", + "LiteEthECP5PHYRGMII", + ]: + return [ + ("o", "rgmii_clocks_tx", rgmii_clocks_tx := Signal()), + ("i", "rgmii_clocks_rx", rgmii_clocks_rx := Signal()), + ("o", "rgmii_rst_n", rgmii_rst_n := Signal()), + ("i", "rgmii_int_n", rgmii_int_n := Signal()), + ("io", "rgmii_mdio", rgmii_mdio := Signal()), + ("o", "rgmii_mdc", rgmii_mdc := Signal()), + ("i", "rgmii_rx_ctl", rgmii_rx_ctl := Signal()), + ("i", "rgmii_rx_data", rgmii_rx_data := Signal(4)), + ("o", "rgmii_tx_ctl", rgmii_tx_ctl := Signal()), + ("o", "rgmii_tx_data", rgmii_tx_data := Signal(4)), + ] + + elif self._phy in [ + "A7_1000BASEX", + "A7_2500BASEX", + "K7_1000BASEX", + "K7_2500BASEX", + "KU_1000BASEX", + "KU_2500BASEX", + "USP_GTH_1000BASEX", + "USP_GTH_2500BASEX", + "USP_GTY_1000BASEX", + "USP_GTY_2500BASEX", + ]: + return [ + ("i", "sgmii_refclk", sgmii_refclk := Signal()), + ("i", "sgmii_rst", sgmii_rst := Signal()), + ("o", "sgmii_txp", sgmii_txp := Signal()), + ("o", "sgmii_txn", sgmii_txn := Signal()), + ("i", "sgmii_rxp", sgmii_rxp := Signal()), + ("i", "sgmii_rxn", sgmii_rxn := Signal()), + ("o", "sgmii_link_up", sgmii_link_up := Signal()), + ] + def elaborate(self, platform): m = Module() @@ -132,14 +206,7 @@ class EthernetInterface(Elaboratable): ("i", "sys_clock", ClockSignal()), ("i", "sys_reset", ResetSignal()), # PHY connection - ("i", "rmii_clocks_ref_clk", self.rmii_clocks_ref_clk), - ("i", "rmii_crs_dv", self.rmii_crs_dv), - ("o", "rmii_mdc", self.rmii_mdc), - ("io", "rmii_mdio", self.rmii_mdio), - ("o", "rmii_rst_n", self.rmii_rst_n), - ("i", "rmii_rx_data", self.rmii_rx_data), - ("o", "rmii_tx_data", self.rmii_tx_data), - ("o", "rmii_tx_en", self.rmii_tx_en), + *self._phy_io, # DHCP # ("o", "dhcp_done", 1), # ("o", "dhcp_ip_address", 1), @@ -265,15 +332,17 @@ class EthernetInterface(Elaboratable): """ liteeth_config = self._config.copy() - # Randomly assign a MAC address if one is not specified in the configuration. - # This will choose a MAC address in the Locally Administered, Administratively Assigned group. - # For more information, see: + # Randomly assign a MAC address if one is not specified in the + # configuration. This will choose a MAC address in the Locally + # Administered, Administratively Assigned group. For more information, + # please reference: # https://en.wikipedia.org/wiki/MAC_address#Ranges_of_group_and_locally_administered_addresses if "mac_address" not in liteeth_config: addr = list(f"{randint(0, (2**48) - 1):012x}") addr[1] = "2" liteeth_config["mac_address"] = int("".join(addr), 16) + print(liteeth_config["mac_address"]) # Force use of DHCP liteeth_config["dhcp"] = True From ab7d9105b1af99013b0ce515db410478ea71efc1 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Wed, 28 Feb 2024 10:36:27 -0800 Subject: [PATCH 59/89] add preliminary bidirectional memory core --- src/manta/logic_analyzer/__init__.py | 2 +- src/manta/manta.py | 2 +- src/manta/memory_core.py | 266 +++++++++++++++++---------- test/test_mem_core_sim.py | 10 +- 4 files changed, 178 insertions(+), 102 deletions(-) diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index 62dc8c6..c3f7c26 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -1,6 +1,6 @@ from amaranth import * from manta.utils import * -from manta.memory_core import ReadOnlyMemoryCore +from manta.memory_core import MemoryCore from manta.logic_analyzer.trigger_block import LogicAnalyzerTriggerBlock from manta.logic_analyzer.fsm import LogicAnalyzerFSM, States, TriggerModes from manta.logic_analyzer.playback import LogicAnalyzerPlayback diff --git a/src/manta/manta.py b/src/manta/manta.py index 0b89726..424a40a 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -3,7 +3,7 @@ from manta.uart import UARTInterface from manta.ethernet import EthernetInterface from manta.io_core import IOCore -from manta.memory_core import ReadOnlyMemoryCore +from manta.memory_core import MemoryCore from manta.logic_analyzer import LogicAnalyzerCore diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index fa52411..f62af64 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -1,12 +1,13 @@ from amaranth import * +from amaranth.lib.memory import Memory from manta.utils import * from math import ceil -class ReadOnlyMemoryCore(Elaboratable): +class MemoryCore(Elaboratable): """ - A module for generating a memory on the FPGA, with a read port tied to - Manta's internal bus, and a write port provided to user logic. + A module for generating a memory on the FPGA, with a port tied to Manta's + internal bus, and a port provided to user logic. Provides methods for generating synthesizable logic for the FPGA, as well as methods for reading and writing the value of a register. @@ -15,24 +16,50 @@ class ReadOnlyMemoryCore(Elaboratable): https://fischermoseley.github.io/manta/memory_core/ """ - def __init__(self, width, depth, base_addr, interface): + def __init__(self, mode, width, depth, base_addr, interface): + self._mode = mode self._width = width self._depth = depth self._base_addr = base_addr self._interface = interface - self._max_addr = self._base_addr + (self._depth * ceil(self._width / 16)) + self._n_brams = ceil(self._width / 16) + self._max_addr = self._base_addr + (self._depth * self._n_brams) # Bus Connections self.bus_i = Signal(InternalBus()) self.bus_o = Signal(InternalBus()) - # User Port - self.user_addr = Signal(range(self._depth)) - self.user_data = Signal(self._width) - self.user_we = Signal(1) + # User Ports + if self._mode == "fpga_to_host": + self.user_addr = Signal(range(self._depth)) + self.user_data_in = Signal(self._width) + self.user_write_enable = Signal() + self._top_level_ports = [ + self.user_addr, + self.user_data_in, + self.user_write_enable, + ] - self._define_mems() + elif self._mode == "host_to_fpga": + self.user_addr = Signal(range(self._depth)) + self.user_data_out = Signal(self._width) + self._top_level_ports = [ + self.user_addr, + self.user_data_out, + ] + + elif self._mode == "bidirectional": + self.user_addr = Signal(range(self._depth)) + self.user_data_in = Signal(self._width) + self.user_data_out = Signal(self._width) + self.user_write_enable = Signal() + self._top_level_ports = [ + self.user_addr, + self.user_data_in, + self.user_data_out, + self.user_write_enable, + ] @classmethod def from_config(cls, config, base_addr, interface): @@ -64,9 +91,86 @@ class ReadOnlyMemoryCore(Elaboratable): if not width > 0: raise ValueError("Width of memory core must be positive. ") - return cls(width, depth, base_addr, interface) + # Check mode is provided and is recognized value + mode = config.get("mode") + if not mode: + raise ValueError("Mode of memory core must be specified.") - def _pipeline_bus(self, m): + if mode not in ["fpga_to_host", "host_to_fpga", "bidirectional"]: + raise ValueError("Unrecognized mode provided to memory core.") + + return cls(mode, width, depth, base_addr, interface) + + def _tie_mems_to_bus(self, m): + for i, mem in enumerate(self._mems): + # Compute address range corresponding to this chunk of memory + start_addr = self._base_addr + (i * self._depth) + stop_addr = start_addr + self._depth - 1 + + # Handle write ports + if self._mode in ["host_to_fpga", "bidirectional"]: + write_port = mem.write_port() + m.d.sync += write_port.data.eq(self.bus_i.data) + m.d.sync += write_port.en.eq(self.bus_i.rw) + m.d.sync += write_port.addr.eq(self.bus_i.addr - start_addr) + + # Handle read ports + if self._mode in ["fpga_to_host", "bidirectional"]: + read_port = mem.read_port() + m.d.comb += read_port.en.eq(1) + + # Throw BRAM operations into the front of the pipeline + with m.If( + (self.bus_i.valid) + & (self.bus_i.addr >= start_addr) + & (self.bus_i.addr <= stop_addr) + ): + m.d.sync += read_port.addr.eq(self.bus_i.addr - start_addr) + + # Pull BRAM reads from the back of the pipeline + with m.If( + (self._bus_pipe[2].valid) + & (self._bus_pipe[2].addr >= start_addr) + & (self._bus_pipe[2].addr <= stop_addr) + ): + m.d.sync += self.bus_o.data.eq(read_port.data) + + def _tie_mems_to_user_logic(self, m): + # Handle write ports + if self._mode in ["fpga_to_host", "bidirectional"]: + for i, mem in enumerate(self._mems): + write_port = mem.write_port() + m.d.comb += write_port.addr.eq(self.user_addr) + m.d.comb += write_port.data.eq(self.user_data_in[16 * i : 16 * (i + 1)]) + m.d.comb += write_port.en.eq(self.user_write_enable) + + # Handle read ports + if self._mode in ["host_to_fpga", "bidirectional"]: + read_datas = [] + for i, mem in enumerate(self._mems): + read_port = mem.read_port() + m.d.comb += read_port.addr.eq(self.user_addr) + m.d.comb += read_port.en.eq(1) + read_datas.append(read_port.data) + + m.d.comb += self.user_data_out.eq(Cat(read_datas)) + + def elaborate(self, platform): + m = Module() + + # Define memories + n_full = self._width // 16 + n_partial = self._width % 16 + + self._mems = [Memory(shape=16, depth=self._depth, init=[0]*self._depth) for _ in range(n_full)] + if n_partial > 0: + self._mems += [Memory(shape=n_partial, depth=self._depth, init=[0]*self._depth)] + + # Add memories as submodules + for i, mem in enumerate(self._mems): + m.submodules[f"mem_{i}"] = mem + + # Pipeline the bus to accomodate the two clock-cycle delay in the memories self._bus_pipe = [Signal(InternalBus()) for _ in range(3)] m.d.sync += self._bus_pipe[0].eq(self.bus_i) @@ -75,75 +179,9 @@ class ReadOnlyMemoryCore(Elaboratable): m.d.sync += self.bus_o.eq(self._bus_pipe[2]) - def _define_mems(self): - # There's three cases that must be handled: - # 1. Integer number of 16 bit mems - # 2. Integer number of 16 bit mems + partial mem - # 3. Just the partial mem (width < 16) - - # Only one, partial-width memory is needed - if self._width < 16: - self._mems = [Memory(depth=self._depth, width=self._width)] - - # Only full-width memories are needed - elif self._width % 16 == 0: - self._mems = [ - Memory(depth=self._depth, width=16) for _ in range(self._width // 16) - ] - - # Both full-width and partial memories are needed - else: - self._mems = [ - Memory(depth=self._depth, width=16) for i in range(self._width // 16) - ] - self._mems += [Memory(depth=self._depth, width=self._width % 16)] - - def _handle_read_ports(self, m): - # These are tied to the bus - for i, mem in enumerate(self._mems): - read_port = mem.read_port() - m.d.comb += read_port.en.eq(1) - - start_addr = self._base_addr + (i * self._depth) - stop_addr = start_addr + self._depth - 1 - - # Throw BRAM operations into the front of the pipeline - with m.If( - (self.bus_i.valid) - & (~self.bus_i.rw) - & (self.bus_i.addr >= start_addr) - & (self.bus_i.addr <= stop_addr) - ): - m.d.sync += read_port.addr.eq(self.bus_i.addr - start_addr) - - # Pull BRAM reads from the back of the pipeline - with m.If( - (self._bus_pipe[2].valid) - & (~self._bus_pipe[2].rw) - & (self._bus_pipe[2].addr >= start_addr) - & (self._bus_pipe[2].addr <= stop_addr) - ): - m.d.sync += self.bus_o.data.eq(read_port.data) - - def _handle_write_ports(self, m): - # These are given to the user - for i, mem in enumerate(self._mems): - write_port = mem.write_port() - - m.d.comb += write_port.addr.eq(self.user_addr) - m.d.comb += write_port.data.eq(self.user_data[16 * i : 16 * (i + 1)]) - m.d.comb += write_port.en.eq(self.user_we) - - def elaborate(self, platform): - m = Module() - - # Add memories as submodules - for i, mem in enumerate(self._mems): - m.submodules[f"mem_{i}"] = mem - - self._pipeline_bus(m) - self._handle_read_ports(m) - self._handle_write_ports(m) + # Tie memory ports to the internal bus and user logic + self._tie_mems_to_bus(m) + self._tie_mems_to_user_logic(m) return m def get_top_level_ports(self): @@ -151,7 +189,7 @@ class ReadOnlyMemoryCore(Elaboratable): Return the Amaranth signals that should be included as ports in the top-level Manta module. """ - return [self.user_addr, self.user_data, self.user_we] + return self._top_level_ports def get_max_addr(self): """ @@ -161,26 +199,64 @@ class ReadOnlyMemoryCore(Elaboratable): """ return self._max_addr - def read_from_user_addr(self, addrs): + def _convert_user_to_bus_addr(self, addrs): + """ + Convert user address space to bus address space. For instance, for a + core with base address 10 and width 33, reading from address 4 is + actually a read from address 14 and address 14 + depth, and address + 14 + (2 * depth). + """ + if isinstance(addrs, int): + return self._convert_user_to_bus_addr([addrs])[0] + + bus_addrs = [] + for addr in addrs: + for i in range(len(self._mems)): + bus_addrs.append(self._base_addr + addr + (i * self._depth)) + + return bus_addrs + + def read(self, addrs): """ Read the memory stored at the provided address, as seen from the user side. """ - # Convert user address space to bus address space - # (for instance, for a core with base address 10 and width 33, - # reading from address 4 is actually a read from address 14 - # and address 14 + depth, and address 14 + 2*depth) - + # Handle a single integer address if isinstance(addrs, int): - return self.read_from_user_addr([addrs])[0] + return self.read([addrs])[0] - bus_addrs = [] - for addr in addrs: - bus_addrs += [ - addr + self._base_addr + i * self._depth for i in range(len(self._mems)) - ] + # Make sure all list elements are integers + if not all(isinstance(a, int) for a in addrs): + raise TypeError("Read address must be an integer or list of integers.") + bus_addrs = self._convert_user_to_bus_addr(addrs) datas = self._interface.read(bus_addrs) - data_chunks = split_into_chunks(datas, len(self._mems)) + data_chunks = split_into_chunks(datas, self._n_brams) return [words_to_value(chunk) for chunk in data_chunks] + + def write(self, addrs, datas): + """ + Write to the memory stored at the provided address, as seen from the + user side. + """ + + # Handle a single integer address and data + if isinstance(addrs, int) and isinstance(datas, int): + return self.write([addrs], [datas]) + + # Make sure address and datas are all integers + if not isinstance(addrs, list) or not isinstance(datas, list): + raise TypeError( + "Write addresses and data must be an integer or list of integers." + ) + + if not all(isinstance(a, int) for a in addrs): + raise TypeError("Write addresses must be all be integers.") + + if not all(isinstance(d, int) for d in datas): + raise TypeError("Write data must all be integers.") + + bus_addrs = self._convert_user_to_bus_addr([addrs])[0] + bus_datas = [word for d in datas for word in value_to_words(d, self._n_brams)] + self._interface.write(bus_addrs, bus_datas) diff --git a/test/test_mem_core_sim.py b/test/test_mem_core_sim.py index e793c4f..fce9800 100644 --- a/test/test_mem_core_sim.py +++ b/test/test_mem_core_sim.py @@ -1,4 +1,4 @@ -from manta.memory_core import ReadOnlyMemoryCore +from manta.memory_core import MemoryCore from manta.utils import * from random import randint, sample @@ -6,16 +6,16 @@ from random import randint, sample def fill_mem_from_user_port(mem_core, depth): for i in range(depth): yield mem_core.user_addr.eq(i) - yield mem_core.user_data.eq(i) - yield mem_core.user_we.eq(1) + yield mem_core.user_data_in.eq(i) + yield mem_core.user_write_enable.eq(1) yield - yield mem_core.user_we.eq(0) + yield mem_core.user_write_enable.eq(0) yield def verify_mem_core(width, depth, base_addr): - mem_core = ReadOnlyMemoryCore(width, depth, base_addr, interface=None) + mem_core = MemoryCore("fpga_to_host", width, depth, base_addr, interface=None) def testbench(): yield from fill_mem_from_user_port(mem_core, depth) From 6aea5cc6e1144e65b956d9368d062048928233c4 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 2 Mar 2024 12:52:04 -0800 Subject: [PATCH 60/89] update MemoryCore references --- doc/assets/memory_architecture.drawio.svg | 66 +++++++++++------------ src/manta/logic_analyzer/__init__.py | 7 +-- src/manta/manta.py | 7 ++- test/test_mem_core_hw.py | 4 +- 4 files changed, 41 insertions(+), 43 deletions(-) diff --git a/doc/assets/memory_architecture.drawio.svg b/doc/assets/memory_architecture.drawio.svg index ef58678..c929ee4 100644 --- a/doc/assets/memory_architecture.drawio.svg +++ b/doc/assets/memory_architecture.drawio.svg @@ -1,4 +1,4 @@ - + - + @@ -103,7 +101,7 @@ -
    +
    addr @@ -121,7 +119,7 @@ -
    +
    din @@ -129,7 +127,7 @@
    - + din @@ -139,7 +137,7 @@ -
    +
    dout @@ -157,7 +155,7 @@ -
    +
    we @@ -258,12 +256,12 @@ - + -
    +
    user_addr @@ -276,8 +274,8 @@ - - + + @@ -289,17 +287,17 @@
    - + user_din - - + + -
    +
    user_dout @@ -312,21 +310,21 @@ - - + + -
    +
    - user_we + user_write_enable
    - user_we + user_write_enable @@ -353,7 +351,7 @@ -
    +
    din @@ -361,7 +359,7 @@
    - + din @@ -476,7 +474,7 @@ -
    +
    din @@ -484,7 +482,7 @@
    - + din @@ -603,12 +601,12 @@ - - + + -
    +
    bus @@ -616,17 +614,17 @@
    - + bus - - + + -
    +
    bus @@ -634,7 +632,7 @@
    - + bus diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index c3f7c26..3f091f6 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -36,7 +36,8 @@ class LogicAnalyzerCore(Elaboratable): self._probes, self._fsm.get_max_addr() + 1, interface ) - self._sample_mem = ReadOnlyMemoryCore( + self._sample_mem = MemoryCore( + mode = "fpga_to_host", width=sum(self._config["probes"].values()), depth=self._config["sample_depth"], base_addr=self._trig_blk.get_max_addr() + 1, @@ -158,7 +159,7 @@ class LogicAnalyzerCore(Elaboratable): # Concat all the probes together, and feed to input of sample memory # (it is necessary to reverse the order such that first probe occupies # the lowest location in memory) - m.d.comb += self._sample_mem.user_data.eq(Cat(self._probes[::-1])) + m.d.comb += self._sample_mem.user_data_in.eq(Cat(self._probes[::-1])) # Wire bus connections between internal modules m.d.comb += [ @@ -170,7 +171,7 @@ class LogicAnalyzerCore(Elaboratable): # Non-bus Connections self._fsm.trigger.eq(self._trig_blk.trig), self._sample_mem.user_addr.eq(self._fsm.write_pointer), - self._sample_mem.user_we.eq(self._fsm.write_enable), + self._sample_mem.user_write_enable.eq(self._fsm.write_enable), ] return m diff --git a/src/manta/manta.py b/src/manta/manta.py index 424a40a..cf2bd09 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -80,9 +80,8 @@ class Manta(Elaboratable): def _get_cores(self): """ - Creates instances of the cores (IOCore, LogicAnalyzerCore, - ReadOnlyMemoryCore) specified in the user's configuration, and returns - them as a list. + Creates instances of the cores (IOCore, LogicAnalyzerCore, MemoryCore) + specified in the user's configuration, and returns them as a list. """ self._cores = {} @@ -95,7 +94,7 @@ class Manta(Elaboratable): core = LogicAnalyzerCore(attrs, base_addr, self.interface) elif attrs["type"] == "memory_read_only": - core = ReadOnlyMemoryCore.from_config(attrs, base_addr, self.interface) + core = MemoryCore.from_config(attrs, base_addr, self.interface) # Make sure we're not out of address space if core.get_max_addr() > (2**16) - 1: diff --git a/test/test_mem_core_hw.py b/test/test_mem_core_hw.py index 78bd024..3a5d7b5 100644 --- a/test/test_mem_core_hw.py +++ b/test/test_mem_core_hw.py @@ -73,8 +73,8 @@ class MemoryCoreLoopbackTest(Elaboratable): m.d.comb += [ self.manta.mem_core.user_addr.eq(addr), - self.manta.mem_core.user_data.eq(data), - self.manta.mem_core.user_we.eq(we), + self.manta.mem_core.user_data_in.eq(data), + self.manta.mem_core.user_write_enable.eq(we), self.manta.interface.rx.eq(uart_pins.rx.i), uart_pins.tx.o.eq(self.manta.interface.tx), ] From 6438a55192b0a90c74091793d8a74212fcc20f00 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 2 Mar 2024 13:31:01 -0800 Subject: [PATCH 61/89] partially revert MemoryCore updates --- src/manta/io_core.py | 2 +- src/manta/logic_analyzer/__init__.py | 4 +- src/manta/logic_analyzer/fsm.py | 2 +- src/manta/logic_analyzer/trigger_block.py | 2 +- src/manta/memory_core.py | 158 ++++++++++------------ test/test_mem_core_hw.py | 2 +- 6 files changed, 80 insertions(+), 90 deletions(-) diff --git a/src/manta/io_core.py b/src/manta/io_core.py index ff633a6..63d6df5 100644 --- a/src/manta/io_core.py +++ b/src/manta/io_core.py @@ -184,7 +184,7 @@ class IOCore(Elaboratable): """ Return the maximum addresses in memory used by the core. The address space used by the core extends from `base_addr` to the number returned - by this function. + by this function (including the endpoints). """ return self._max_addr diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index 3f091f6..c36d171 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -187,7 +187,7 @@ class LogicAnalyzerCore(Elaboratable): """ Return the maximum addresses in memory used by the core. The address space used by the core extends from `base_addr` to the number returned - by this function. + by this function (including the endpoints). """ return self._sample_mem.get_max_addr() @@ -253,7 +253,7 @@ class LogicAnalyzerCore(Elaboratable): # Read out the entirety of the sample memory print_if_verbose(" -> Reading sample memory contents...") addrs = list(range(self._config["sample_depth"])) - raw_capture = self._sample_mem.read_from_user_addr(addrs) + raw_capture = self._sample_mem.read(addrs) # Revolve the memory around the read_pointer, such that all the beginning # of the caputure is at the first element diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index cdf4b3c..bfe4183 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -64,7 +64,7 @@ class LogicAnalyzerFSM(Elaboratable): """ Return the maximum addresses in memory used by the core. The address space used by the core extends from `base_addr` to the number returned - by this function. + by this function (including the endpoints). """ return self.registers.get_max_addr() diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 1f16599..ff67b45 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -32,7 +32,7 @@ class LogicAnalyzerTriggerBlock(Elaboratable): """ Return the maximum addresses in memory used by the core. The address space used by the core extends from `base_addr` to the number returned - by this function. + by this function (including the endpoints). """ return self.registers.get_max_addr() diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index f62af64..367b519 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -1,5 +1,4 @@ from amaranth import * -from amaranth.lib.memory import Memory from manta.utils import * from math import ceil @@ -61,6 +60,8 @@ class MemoryCore(Elaboratable): self.user_write_enable, ] + self._define_mems() + @classmethod def from_config(cls, config, base_addr, interface): # Check for unrecognized options @@ -91,86 +92,9 @@ class MemoryCore(Elaboratable): if not width > 0: raise ValueError("Width of memory core must be positive. ") - # Check mode is provided and is recognized value - mode = config.get("mode") - if not mode: - raise ValueError("Mode of memory core must be specified.") + return cls(width, depth, base_addr, interface) - if mode not in ["fpga_to_host", "host_to_fpga", "bidirectional"]: - raise ValueError("Unrecognized mode provided to memory core.") - - return cls(mode, width, depth, base_addr, interface) - - def _tie_mems_to_bus(self, m): - for i, mem in enumerate(self._mems): - # Compute address range corresponding to this chunk of memory - start_addr = self._base_addr + (i * self._depth) - stop_addr = start_addr + self._depth - 1 - - # Handle write ports - if self._mode in ["host_to_fpga", "bidirectional"]: - write_port = mem.write_port() - m.d.sync += write_port.data.eq(self.bus_i.data) - m.d.sync += write_port.en.eq(self.bus_i.rw) - m.d.sync += write_port.addr.eq(self.bus_i.addr - start_addr) - - # Handle read ports - if self._mode in ["fpga_to_host", "bidirectional"]: - read_port = mem.read_port() - m.d.comb += read_port.en.eq(1) - - # Throw BRAM operations into the front of the pipeline - with m.If( - (self.bus_i.valid) - & (self.bus_i.addr >= start_addr) - & (self.bus_i.addr <= stop_addr) - ): - m.d.sync += read_port.addr.eq(self.bus_i.addr - start_addr) - - # Pull BRAM reads from the back of the pipeline - with m.If( - (self._bus_pipe[2].valid) - & (self._bus_pipe[2].addr >= start_addr) - & (self._bus_pipe[2].addr <= stop_addr) - ): - m.d.sync += self.bus_o.data.eq(read_port.data) - - def _tie_mems_to_user_logic(self, m): - # Handle write ports - if self._mode in ["fpga_to_host", "bidirectional"]: - for i, mem in enumerate(self._mems): - write_port = mem.write_port() - m.d.comb += write_port.addr.eq(self.user_addr) - m.d.comb += write_port.data.eq(self.user_data_in[16 * i : 16 * (i + 1)]) - m.d.comb += write_port.en.eq(self.user_write_enable) - - # Handle read ports - if self._mode in ["host_to_fpga", "bidirectional"]: - read_datas = [] - for i, mem in enumerate(self._mems): - read_port = mem.read_port() - m.d.comb += read_port.addr.eq(self.user_addr) - m.d.comb += read_port.en.eq(1) - read_datas.append(read_port.data) - - m.d.comb += self.user_data_out.eq(Cat(read_datas)) - - def elaborate(self, platform): - m = Module() - - # Define memories - n_full = self._width // 16 - n_partial = self._width % 16 - - self._mems = [Memory(shape=16, depth=self._depth, init=[0]*self._depth) for _ in range(n_full)] - if n_partial > 0: - self._mems += [Memory(shape=n_partial, depth=self._depth, init=[0]*self._depth)] - - # Add memories as submodules - for i, mem in enumerate(self._mems): - m.submodules[f"mem_{i}"] = mem - - # Pipeline the bus to accomodate the two clock-cycle delay in the memories + def _pipeline_bus(self, m): self._bus_pipe = [Signal(InternalBus()) for _ in range(3)] m.d.sync += self._bus_pipe[0].eq(self.bus_i) @@ -179,9 +103,75 @@ class MemoryCore(Elaboratable): m.d.sync += self.bus_o.eq(self._bus_pipe[2]) - # Tie memory ports to the internal bus and user logic - self._tie_mems_to_bus(m) - self._tie_mems_to_user_logic(m) + def _define_mems(self): + # There's three cases that must be handled: + # 1. Integer number of 16 bit mems + # 2. Integer number of 16 bit mems + partial mem + # 3. Just the partial mem (width < 16) + + # Only one, partial-width memory is needed + if self._width < 16: + self._mems = [Memory(depth=self._depth, width=self._width)] + + # Only full-width memories are needed + elif self._width % 16 == 0: + self._mems = [ + Memory(depth=self._depth, width=16) for _ in range(self._width // 16) + ] + + # Both full-width and partial memories are needed + else: + self._mems = [ + Memory(depth=self._depth, width=16) for i in range(self._width // 16) + ] + self._mems += [Memory(depth=self._depth, width=self._width % 16)] + + def _handle_read_ports(self, m): + # These are tied to the bus + for i, mem in enumerate(self._mems): + read_port = mem.read_port() + m.d.comb += read_port.en.eq(1) + + start_addr = self._base_addr + (i * self._depth) + stop_addr = start_addr + self._depth - 1 + + # Throw BRAM operations into the front of the pipeline + with m.If( + (self.bus_i.valid) + & (~self.bus_i.rw) + & (self.bus_i.addr >= start_addr) + & (self.bus_i.addr <= stop_addr) + ): + m.d.sync += read_port.addr.eq(self.bus_i.addr - start_addr) + + # Pull BRAM reads from the back of the pipeline + with m.If( + (self._bus_pipe[2].valid) + & (~self._bus_pipe[2].rw) + & (self._bus_pipe[2].addr >= start_addr) + & (self._bus_pipe[2].addr <= stop_addr) + ): + m.d.sync += self.bus_o.data.eq(read_port.data) + + def _handle_write_ports(self, m): + # These are given to the user + for i, mem in enumerate(self._mems): + write_port = mem.write_port() + + m.d.comb += write_port.addr.eq(self.user_addr) + m.d.comb += write_port.data.eq(self.user_data_in[16 * i : 16 * (i + 1)]) + m.d.comb += write_port.en.eq(self.user_write_enable) + + def elaborate(self, platform): + m = Module() + + # Add memories as submodules + for i, mem in enumerate(self._mems): + m.submodules[f"mem_{i}"] = mem + + self._pipeline_bus(m) + self._handle_read_ports(m) + self._handle_write_ports(m) return m def get_top_level_ports(self): @@ -195,7 +185,7 @@ class MemoryCore(Elaboratable): """ Return the maximum addresses in memory used by the core. The address space used by the core extends from `base_addr` to the number returned - by this function. + by this function (including the endpoints). """ return self._max_addr diff --git a/test/test_mem_core_hw.py b/test/test_mem_core_hw.py index 3a5d7b5..6afdd4c 100644 --- a/test/test_mem_core_hw.py +++ b/test/test_mem_core_hw.py @@ -92,7 +92,7 @@ class MemoryCoreLoopbackTest(Elaboratable): self.manta.io_core.set_probe("we", 0) def verify_register(self, addr, expected_data): - data = self.manta.mem_core.read_from_user_addr(addr) + data = self.manta.mem_core.read(addr) if data != expected_data: raise ValueError( From 40a57651bb9540600e0494c0188db72f32fb297a Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 2 Mar 2024 13:44:08 -0800 Subject: [PATCH 62/89] shorten methods in MemoryCore --- src/manta/memory_core.py | 60 +++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 35 deletions(-) diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index 367b519..48ae8c4 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -60,8 +60,6 @@ class MemoryCore(Elaboratable): self.user_write_enable, ] - self._define_mems() - @classmethod def from_config(cls, config, base_addr, interface): # Check for unrecognized options @@ -92,40 +90,16 @@ class MemoryCore(Elaboratable): if not width > 0: raise ValueError("Width of memory core must be positive. ") + # Check mode is provided and is recognized value + mode = config.get("mode") + if not mode: + raise ValueError("Mode of memory core must be specified.") + + if mode not in ["fpga_to_host", "host_to_fpga", "bidirectional"]: + raise ValueError("Unrecognized mode provided to memory core.") + return cls(width, depth, base_addr, interface) - def _pipeline_bus(self, m): - self._bus_pipe = [Signal(InternalBus()) for _ in range(3)] - m.d.sync += self._bus_pipe[0].eq(self.bus_i) - - for i in range(1, 3): - m.d.sync += self._bus_pipe[i].eq(self._bus_pipe[i - 1]) - - m.d.sync += self.bus_o.eq(self._bus_pipe[2]) - - def _define_mems(self): - # There's three cases that must be handled: - # 1. Integer number of 16 bit mems - # 2. Integer number of 16 bit mems + partial mem - # 3. Just the partial mem (width < 16) - - # Only one, partial-width memory is needed - if self._width < 16: - self._mems = [Memory(depth=self._depth, width=self._width)] - - # Only full-width memories are needed - elif self._width % 16 == 0: - self._mems = [ - Memory(depth=self._depth, width=16) for _ in range(self._width // 16) - ] - - # Both full-width and partial memories are needed - else: - self._mems = [ - Memory(depth=self._depth, width=16) for i in range(self._width // 16) - ] - self._mems += [Memory(depth=self._depth, width=self._width % 16)] - def _handle_read_ports(self, m): # These are tied to the bus for i, mem in enumerate(self._mems): @@ -165,11 +139,27 @@ class MemoryCore(Elaboratable): def elaborate(self, platform): m = Module() + # Define memories + n_full = self._width // 16 + n_partial = self._width % 16 + + self._mems = [Memory(width=16, depth=self._depth, init=[0]*self._depth) for _ in range(n_full)] + if n_partial > 0: + self._mems += [Memory(width=n_partial, depth=self._depth, init=[0]*self._depth)] + # Add memories as submodules for i, mem in enumerate(self._mems): m.submodules[f"mem_{i}"] = mem - self._pipeline_bus(m) + # Pipeline the bus to accomodate the two clock-cycle delay in the memories + self._bus_pipe = [Signal(InternalBus()) for _ in range(3)] + m.d.sync += self._bus_pipe[0].eq(self.bus_i) + + for i in range(1, 3): + m.d.sync += self._bus_pipe[i].eq(self._bus_pipe[i - 1]) + + m.d.sync += self.bus_o.eq(self._bus_pipe[2]) + self._handle_read_ports(m) self._handle_write_ports(m) return m From 2e2397013e8e022af45e0c6651ac0ef13d65df33 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sat, 2 Mar 2024 14:08:52 -0800 Subject: [PATCH 63/89] make mem_core_hw tests pass --- src/manta/logic_analyzer/__init__.py | 2 +- src/manta/manta.py | 4 +- src/manta/memory_core.py | 94 ++++++++++++++++++---------- test/test_mem_core_hw.py | 3 +- 4 files changed, 65 insertions(+), 38 deletions(-) diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index c36d171..19e3a04 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -37,7 +37,7 @@ class LogicAnalyzerCore(Elaboratable): ) self._sample_mem = MemoryCore( - mode = "fpga_to_host", + mode="fpga_to_host", width=sum(self._config["probes"].values()), depth=self._config["sample_depth"], base_addr=self._trig_blk.get_max_addr() + 1, diff --git a/src/manta/manta.py b/src/manta/manta.py index cf2bd09..1a3830b 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -60,7 +60,7 @@ class Manta(Elaboratable): if "type" not in attrs: raise ValueError(f"No type specified for core {name}.") - if attrs["type"] not in ["logic_analyzer", "io", "memory_read_only"]: + if attrs["type"] not in ["logic_analyzer", "io", "memory"]: raise ValueError(f"Unrecognized core type specified for {name}.") def _get_interface(self): @@ -93,7 +93,7 @@ class Manta(Elaboratable): elif attrs["type"] == "logic_analyzer": core = LogicAnalyzerCore(attrs, base_addr, self.interface) - elif attrs["type"] == "memory_read_only": + elif attrs["type"] == "memory": core = MemoryCore.from_config(attrs, base_addr, self.interface) # Make sure we're not out of address space diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index 48ae8c4..e88a9ec 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -63,7 +63,7 @@ class MemoryCore(Elaboratable): @classmethod def from_config(cls, config, base_addr, interface): # Check for unrecognized options - valid_options = ["type", "depth", "width"] + valid_options = ["type", "depth", "width", "mode"] for option in config: if option not in valid_options: warn(f"Ignoring unrecognized option '{option}' in memory core.") @@ -98,43 +98,64 @@ class MemoryCore(Elaboratable): if mode not in ["fpga_to_host", "host_to_fpga", "bidirectional"]: raise ValueError("Unrecognized mode provided to memory core.") - return cls(width, depth, base_addr, interface) + return cls(mode, width, depth, base_addr, interface) - def _handle_read_ports(self, m): - # These are tied to the bus + def _tie_mems_to_bus(self, m): for i, mem in enumerate(self._mems): - read_port = mem.read_port() - m.d.comb += read_port.en.eq(1) - + # Compute address range corresponding to this chunk of memory start_addr = self._base_addr + (i * self._depth) stop_addr = start_addr + self._depth - 1 - # Throw BRAM operations into the front of the pipeline - with m.If( - (self.bus_i.valid) - & (~self.bus_i.rw) - & (self.bus_i.addr >= start_addr) - & (self.bus_i.addr <= stop_addr) - ): - m.d.sync += read_port.addr.eq(self.bus_i.addr - start_addr) + # Handle write ports + if self._mode in ["host_to_fpga", "bidirectional"]: + pass + # write_port = mem.write_port() + # m.d.sync += write_port.data.eq(self.bus_i.data) + # m.d.sync += write_port.en.eq(self.bus_i.rw) + # m.d.sync += write_port.addr.eq(self.bus_i.addr - start_addr) - # Pull BRAM reads from the back of the pipeline - with m.If( - (self._bus_pipe[2].valid) - & (~self._bus_pipe[2].rw) - & (self._bus_pipe[2].addr >= start_addr) - & (self._bus_pipe[2].addr <= stop_addr) - ): - m.d.sync += self.bus_o.data.eq(read_port.data) + # Handle read ports + if self._mode in ["fpga_to_host", "bidirectional"]: + read_port = mem.read_port() + m.d.comb += read_port.en.eq(1) - def _handle_write_ports(self, m): - # These are given to the user - for i, mem in enumerate(self._mems): - write_port = mem.write_port() + # Throw BRAM operations into the front of the pipeline + with m.If( + (self.bus_i.valid) + & (~self.bus_i.rw) + & (self.bus_i.addr >= start_addr) + & (self.bus_i.addr <= stop_addr) + ): + m.d.sync += read_port.addr.eq(self.bus_i.addr - start_addr) - m.d.comb += write_port.addr.eq(self.user_addr) - m.d.comb += write_port.data.eq(self.user_data_in[16 * i : 16 * (i + 1)]) - m.d.comb += write_port.en.eq(self.user_write_enable) + # Pull BRAM reads from the back of the pipeline + with m.If( + (self._bus_pipe[2].valid) + & (~self._bus_pipe[2].rw) + & (self._bus_pipe[2].addr >= start_addr) + & (self._bus_pipe[2].addr <= stop_addr) + ): + m.d.sync += self.bus_o.data.eq(read_port.data) + + def _tie_mems_to_user_logic(self, m): + # Handle write ports + if self._mode in ["fpga_to_host", "bidirectional"]: + for i, mem in enumerate(self._mems): + write_port = mem.write_port() + m.d.comb += write_port.addr.eq(self.user_addr) + m.d.comb += write_port.data.eq(self.user_data_in[16 * i : 16 * (i + 1)]) + m.d.comb += write_port.en.eq(self.user_write_enable) + + # Handle read ports + if self._mode in ["host_to_fpga", "bidirectional"]: + read_datas = [] + for i, mem in enumerate(self._mems): + read_port = mem.read_port() + m.d.comb += read_port.addr.eq(self.user_addr) + m.d.comb += read_port.en.eq(1) + read_datas.append(read_port.data) + + m.d.comb += self.user_data_out.eq(Cat(read_datas)) def elaborate(self, platform): m = Module() @@ -143,9 +164,14 @@ class MemoryCore(Elaboratable): n_full = self._width // 16 n_partial = self._width % 16 - self._mems = [Memory(width=16, depth=self._depth, init=[0]*self._depth) for _ in range(n_full)] + self._mems = [ + Memory(width=16, depth=self._depth, init=[0] * self._depth) + for _ in range(n_full) + ] if n_partial > 0: - self._mems += [Memory(width=n_partial, depth=self._depth, init=[0]*self._depth)] + self._mems += [ + Memory(width=n_partial, depth=self._depth, init=[0] * self._depth) + ] # Add memories as submodules for i, mem in enumerate(self._mems): @@ -160,8 +186,8 @@ class MemoryCore(Elaboratable): m.d.sync += self.bus_o.eq(self._bus_pipe[2]) - self._handle_read_ports(m) - self._handle_write_ports(m) + self._tie_mems_to_bus(m) + self._tie_mems_to_user_logic(m) return m def get_top_level_ports(self): diff --git a/test/test_mem_core_hw.py b/test/test_mem_core_hw.py index 6afdd4c..02925c8 100644 --- a/test/test_mem_core_hw.py +++ b/test/test_mem_core_hw.py @@ -28,7 +28,8 @@ class MemoryCoreLoopbackTest(Elaboratable): return { "cores": { "mem_core": { - "type": "memory_read_only", + "type": "memory", + "mode": "fpga_to_host", "width": self.width, "depth": self.depth, }, From e2d52a6e2d2bafb3ce5b00ff112139b84a74cdf3 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 3 Mar 2024 02:14:12 -0800 Subject: [PATCH 64/89] add simulate decorator --- src/manta/memory_core.py | 89 +++++-- src/manta/utils.py | 46 +++- test/test_bridge_rx_sim.py | 44 ++-- test/test_bridge_tx_sim.py | 12 +- test/test_io_core_sim.py | 118 ++++----- test/test_logic_analyzer_fsm_sim.py | 370 +++++++++++++--------------- test/test_logic_analyzer_sim.py | 56 ++--- test/test_mem_core_sim.py | 176 ++++++++++--- test/test_source_bridge_sim.py | 54 ++-- test/test_uart_rx_sim.py | 24 +- test/test_uart_tx_sim.py | 16 +- 11 files changed, 579 insertions(+), 426 deletions(-) diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index e88a9ec..7e8e0a5 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -22,8 +22,8 @@ class MemoryCore(Elaboratable): self._base_addr = base_addr self._interface = interface - self._n_brams = ceil(self._width / 16) - self._max_addr = self._base_addr + (self._depth * self._n_brams) + self._n_mems = ceil(self._width / 16) + self._max_addr = self._base_addr + (self._depth * self._n_mems) # Bus Connections self.bus_i = Signal(InternalBus()) @@ -106,23 +106,43 @@ class MemoryCore(Elaboratable): start_addr = self._base_addr + (i * self._depth) stop_addr = start_addr + self._depth - 1 - # Handle write ports - if self._mode in ["host_to_fpga", "bidirectional"]: - pass - # write_port = mem.write_port() - # m.d.sync += write_port.data.eq(self.bus_i.data) - # m.d.sync += write_port.en.eq(self.bus_i.rw) - # m.d.sync += write_port.addr.eq(self.bus_i.addr - start_addr) + # # Handle write ports + # if self._mode in ["host_to_fpga", "bidirectional"]: + # write_port = mem.write_port() + # m.d.sync += write_port.data.eq(self.bus_i.data) + # m.d.sync += write_port.en.eq(self.bus_i.rw) + # m.d.sync += write_port.addr.eq(self.bus_i.addr - start_addr) - # Handle read ports - if self._mode in ["fpga_to_host", "bidirectional"]: + # # Handle read ports + # if self._mode in ["fpga_to_host", "bidirectional"]: + # read_port = mem.read_port() + # m.d.comb += read_port.en.eq(1) + + # # Throw BRAM operations into the front of the pipeline + # with m.If( + # (self.bus_i.valid) + # & (~self.bus_i.rw) + # & (self.bus_i.addr >= start_addr) + # & (self.bus_i.addr <= stop_addr) + # ): + # m.d.sync += read_port.addr.eq(self.bus_i.addr - start_addr) + + # # Pull BRAM reads from the back of the pipeline + # with m.If( + # (self._bus_pipe[2].valid) + # & (~self._bus_pipe[2].rw) + # & (self._bus_pipe[2].addr >= start_addr) + # & (self._bus_pipe[2].addr <= stop_addr) + # ): + # m.d.sync += self.bus_o.data.eq(read_port.data) + + if self._mode == "fpga_to_host": read_port = mem.read_port() m.d.comb += read_port.en.eq(1) # Throw BRAM operations into the front of the pipeline with m.If( (self.bus_i.valid) - & (~self.bus_i.rw) & (self.bus_i.addr >= start_addr) & (self.bus_i.addr <= stop_addr) ): @@ -137,6 +157,47 @@ class MemoryCore(Elaboratable): ): m.d.sync += self.bus_o.data.eq(read_port.data) + elif self._mode == "host_to_fpga": + write_port = mem.write_port() + m.d.sync += write_port.en.eq(0) + + # Throw BRAM operations into the front of the pipeline + with m.If( + (self.bus_i.valid) + & (self.bus_i.addr >= start_addr) + & (self.bus_i.addr <= stop_addr) + ): + m.d.sync += write_port.addr.eq(self.bus_i.addr - start_addr) + m.d.sync += write_port.data.eq(self.bus_i.data) + m.d.sync += write_port.en.eq(self.bus_i.rw) + + elif self._mode == "bidirectional": + read_port = mem.read_port() + m.d.comb += read_port.en.eq(1) + + write_port = mem.write_port() + m.d.sync += write_port.en.eq(0) + + # Throw BRAM operations into the front of the pipeline + with m.If( + (self.bus_i.valid) + & (self.bus_i.addr >= start_addr) + & (self.bus_i.addr <= stop_addr) + ): + m.d.sync += read_port.addr.eq(self.bus_i.addr - start_addr) + m.d.sync += write_port.addr.eq(self.bus_i.addr - start_addr) + m.d.sync += write_port.data.eq(self.bus_i.data) + m.d.sync += write_port.en.eq(self.bus_i.rw) + + # Pull BRAM reads from the back of the pipeline + with m.If( + (self._bus_pipe[2].valid) + & (~self._bus_pipe[2].rw) + & (self._bus_pipe[2].addr >= start_addr) + & (self._bus_pipe[2].addr <= stop_addr) + ): + m.d.sync += self.bus_o.data.eq(read_port.data) + def _tie_mems_to_user_logic(self, m): # Handle write ports if self._mode in ["fpga_to_host", "bidirectional"]: @@ -238,7 +299,7 @@ class MemoryCore(Elaboratable): bus_addrs = self._convert_user_to_bus_addr(addrs) datas = self._interface.read(bus_addrs) - data_chunks = split_into_chunks(datas, self._n_brams) + data_chunks = split_into_chunks(datas, self._n_mems) return [words_to_value(chunk) for chunk in data_chunks] def write(self, addrs, datas): @@ -264,5 +325,5 @@ class MemoryCore(Elaboratable): raise TypeError("Write data must all be integers.") bus_addrs = self._convert_user_to_bus_addr([addrs])[0] - bus_datas = [word for d in datas for word in value_to_words(d, self._n_brams)] + bus_datas = [word for d in datas for word in value_to_words(d, self._n_mems)] self._interface.write(bus_addrs, bus_datas) diff --git a/src/manta/utils.py b/src/manta/utils.py index 072ceb5..20dc6bc 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -83,22 +83,41 @@ def split_into_chunks(data, chunk_size): return [data[i : i + chunk_size] for i in range(0, len(data), chunk_size)] -def simulate(top, testbench, vcd_path=None): +def simulate(top): """ - Run a behavior simulation using Amaranth's built-in simulator `pysim`. Takes - the top-level module to simulate, the testbench process to run, and an optional - path to export a VCD file to. + A decorator for running behavioral simulation using Amaranth's built-in + simulator. Requires the top-level module in the simulation as an argument, + and automatically names VCD file containing the waveform dump with the name + of the function being decorated. """ - sim = Simulator(top) - sim.add_clock(1e-6) # 1 MHz - sim.add_sync_process(testbench) - if vcd_path is None: - sim.run() + def decorator(testbench): + def wrapper(*args, **kwargs): + sim = Simulator(top) + sim.add_clock(1e-6) # 1 MHz + sim.add_sync_process(testbench) - else: - with sim.write_vcd(vcd_path): - sim.run() + vcd_path = testbench.__name__ + ".vcd" + + with sim.write_vcd(vcd_path): + sim.run() + + return wrapper + + return decorator + + +# def simulate_decorator(testbench): +# def wrapper_accepting_arguments(top): +# sim = Simulator(top) +# sim.add_clock(1e-6) # 1 MHz +# sim.add_sync_process(testbench) + +# vcd_path = testbench.__name__ + ".vcd" +# with sim.write_vcd(vcd_path): +# sim.run() + +# return wrapper_accepting_arguments def verify_register(module, addr, expected_data): @@ -143,7 +162,10 @@ def write_register(module, addr, data): yield module.bus_i.rw.eq(1) yield module.bus_i.valid.eq(1) yield + yield module.bus_i.addr.eq(0) + yield module.bus_i.data.eq(0) yield module.bus_i.valid.eq(0) + yield module.bus_i.rw.eq(0) yield diff --git a/test/test_bridge_rx_sim.py b/test/test_bridge_rx_sim.py index c65a184..403f614 100644 --- a/test/test_bridge_rx_sim.py +++ b/test/test_bridge_rx_sim.py @@ -86,35 +86,29 @@ def verify_bad_bytes(bytes): yield bridge_rx.valid_i.eq(0) +@simulate(bridge_rx) def test_read_decode(): - def testbench(): - yield from verify_read_decoding(b"R0000\r\n", 0x0000) - yield from verify_read_decoding(b"R1234\r\n", 0x1234) - yield from verify_read_decoding(b"RBABE\r\n", 0xBABE) - yield from verify_read_decoding(b"R5678\n", 0x5678) - yield from verify_read_decoding(b"R9ABC\r", 0x9ABC) - - simulate(bridge_rx, testbench) + yield from verify_read_decoding(b"R0000\r\n", 0x0000) + yield from verify_read_decoding(b"R1234\r\n", 0x1234) + yield from verify_read_decoding(b"RBABE\r\n", 0xBABE) + yield from verify_read_decoding(b"R5678\n", 0x5678) + yield from verify_read_decoding(b"R9ABC\r", 0x9ABC) +@simulate(bridge_rx) def test_write_decode(): - def testbench(): - yield from verify_write_decoding(b"W12345678\r\n", 0x1234, 0x5678) - yield from verify_write_decoding(b"WDEADBEEF\r\n", 0xDEAD, 0xBEEF) - yield from verify_write_decoding(b"WDEADBEEF\r", 0xDEAD, 0xBEEF) - yield from verify_write_decoding(b"WB0BACAFE\n", 0xB0BA, 0xCAFE) - - simulate(bridge_rx, testbench) + yield from verify_write_decoding(b"W12345678\r\n", 0x1234, 0x5678) + yield from verify_write_decoding(b"WDEADBEEF\r\n", 0xDEAD, 0xBEEF) + yield from verify_write_decoding(b"WDEADBEEF\r", 0xDEAD, 0xBEEF) + yield from verify_write_decoding(b"WB0BACAFE\n", 0xB0BA, 0xCAFE) +@simulate(bridge_rx) def test_no_decode(): - def testbench(): - yield from verify_bad_bytes(b"RABC\r\n") - yield from verify_bad_bytes(b"R12345\r\n") - yield from verify_bad_bytes(b"M\r\n") - yield from verify_bad_bytes(b"W123456789101112131415161718191201222\r\n") - yield from verify_bad_bytes(b"RABCG\r\n") - yield from verify_bad_bytes(b"WABC[]()##*@\r\n") - yield from verify_bad_bytes(b"R\r\n") - - simulate(bridge_rx, testbench) + yield from verify_bad_bytes(b"RABC\r\n") + yield from verify_bad_bytes(b"R12345\r\n") + yield from verify_bad_bytes(b"M\r\n") + yield from verify_bad_bytes(b"W123456789101112131415161718191201222\r\n") + yield from verify_bad_bytes(b"RABCG\r\n") + yield from verify_bad_bytes(b"WABC[]()##*@\r\n") + yield from verify_bad_bytes(b"R\r\n") diff --git a/test/test_bridge_tx_sim.py b/test/test_bridge_tx_sim.py index 9a1568d..777c252 100644 --- a/test/test_bridge_tx_sim.py +++ b/test/test_bridge_tx_sim.py @@ -57,11 +57,9 @@ def verify_encoding(data, bytes): raise ValueError(f"Received {sent_bytes} instead of {bytes}.") +@simulate(bridge_tx) def test_some_random_values(): - def testbench(): - for i in sample(range(0xFFFF), k=5000): - expected = f"D{i:04X}\r\n".encode("ascii") - print(i) - yield from verify_encoding(i, expected) - - simulate(bridge_tx, testbench) + for i in sample(range(0xFFFF), k=5000): + expected = f"D{i:04X}\r\n".encode("ascii") + print(i) + yield from verify_encoding(i, expected) diff --git a/test/test_io_core_sim.py b/test/test_io_core_sim.py index 3bda812..4edbd37 100644 --- a/test/test_io_core_sim.py +++ b/test/test_io_core_sim.py @@ -26,92 +26,82 @@ def pulse_strobe_register(): yield from write_register(io_core, strobe_addr, 0) +@simulate(io_core) def test_input_probe_buffer_initial_value(): - def testbench(): - # Verify all input probe buffers initialize to zero - for i in inputs: - addrs = io_core._memory_map[i.name]["addrs"] + # Verify all input probe buffers initialize to zero + for i in inputs: + addrs = io_core._memory_map[i.name]["addrs"] - for addr in addrs: - yield from verify_register(io_core, addr, 0) - - simulate(io_core, testbench) + for addr in addrs: + yield from verify_register(io_core, addr, 0) +@simulate(io_core) def test_output_probe_buffer_initial_value(): - def testbench(): - # Verify all output probe buffers initialize to the values in the config - for o in outputs: - addrs = io_core._memory_map[o.name]["addrs"] - datas = value_to_words(o.reset, len(addrs)) + # Verify all output probe buffers initialize to the values in the config + for o in outputs: + addrs = io_core._memory_map[o.name]["addrs"] + datas = value_to_words(o.reset, len(addrs)) - for addr, data in zip(addrs, datas): - yield from verify_register(io_core, addr, data) - - simulate(io_core, testbench) + for addr, data in zip(addrs, datas): + yield from verify_register(io_core, addr, data) +@simulate(io_core) def test_output_probes_are_writeable(): - def testbench(): - for o in outputs: - addrs = io_core._memory_map[o.name]["addrs"] - test_value = randint(0, (2**o.width) - 1) - datas = value_to_words(test_value, len(addrs)) + for o in outputs: + addrs = io_core._memory_map[o.name]["addrs"] + test_value = randint(0, (2**o.width) - 1) + datas = value_to_words(test_value, len(addrs)) - # write value to registers - for addr, data in zip(addrs, datas): - yield from write_register(io_core, addr, data) + # write value to registers + for addr, data in zip(addrs, datas): + yield from write_register(io_core, addr, data) - # read value back from registers - for addr, data in zip(addrs, datas): - yield from verify_register(io_core, addr, data) - - simulate(io_core, testbench) + # read value back from registers + for addr, data in zip(addrs, datas): + yield from verify_register(io_core, addr, data) +@simulate(io_core) def test_output_probes_update(): - def testbench(): - for o in outputs: - addrs = io_core._memory_map[o.name]["addrs"] - test_value = randint(0, (2**o.width) - 1) - datas = value_to_words(test_value, len(addrs)) + for o in outputs: + addrs = io_core._memory_map[o.name]["addrs"] + test_value = randint(0, (2**o.width) - 1) + datas = value_to_words(test_value, len(addrs)) - # write value to registers - for addr, data in zip(addrs, datas): - yield from write_register(io_core, addr, data) + # write value to registers + for addr, data in zip(addrs, datas): + yield from write_register(io_core, addr, data) - # pulse strobe register - yield from pulse_strobe_register() + # pulse strobe register + yield from pulse_strobe_register() - # check that outputs took updated value - value = yield (o) + # check that outputs took updated value + value = yield (o) - if value != test_value: - raise ValueError( - f"Output probe {o.name} took value {value} instead of {test_value} after pulsing strobe." - ) + if value != test_value: + raise ValueError( + f"Output probe {o.name} took value {value} instead of {test_value} after pulsing strobe." + ) - else: - print(f"Output probe {o.name} took value {value} after pulsing strobe.") - - simulate(io_core, testbench) + else: + print(f"Output probe {o.name} took value {value} after pulsing strobe.") +@simulate(io_core) def test_input_probes_update(): - def testbench(): - for i in inputs: - # set input probe value - test_value = randint(0, (2**i.width) - 1) - yield i.eq(test_value) + for i in inputs: + # set input probe value + test_value = randint(0, (2**i.width) - 1) + yield i.eq(test_value) - # pulse strobe register - yield from pulse_strobe_register() + # pulse strobe register + yield from pulse_strobe_register() - # check that values are as expected once read back - addrs = io_core._memory_map[i.name]["addrs"] - datas = value_to_words(test_value, len(addrs)) + # check that values are as expected once read back + addrs = io_core._memory_map[i.name]["addrs"] + datas = value_to_words(test_value, len(addrs)) - for addr, data in zip(addrs, datas): - yield from verify_register(io_core, addr, data) - - simulate(io_core, testbench) + for addr, data in zip(addrs, datas): + yield from verify_register(io_core, addr, data) diff --git a/test/test_logic_analyzer_fsm_sim.py b/test/test_logic_analyzer_fsm_sim.py index 7e7043c..fb04615 100644 --- a/test/test_logic_analyzer_fsm_sim.py +++ b/test/test_logic_analyzer_fsm_sim.py @@ -6,244 +6,230 @@ config = {"sample_depth": 8} fsm = LogicAnalyzerFSM(config, base_addr=0, interface=None) +@simulate(fsm) def test_signals_reset_correctly(): - def testbench(): - # Make sure pointers and write enable reset to zero - for sig in [fsm.write_pointer, fsm.read_pointer, fsm.write_enable]: - if (yield sig) != 0: - raise ValueError - - # Make sure state resets to IDLE - if (yield fsm.state != States.IDLE): + # Make sure pointers and write enable reset to zero + for sig in [fsm.write_pointer, fsm.read_pointer, fsm.write_enable]: + if (yield sig) != 0: raise ValueError - simulate(fsm, testbench) + # Make sure state resets to IDLE + if (yield fsm.state != States.IDLE): + raise ValueError +@simulate(fsm) def test_single_shot_no_wait_for_trigger(): - def testbench(): - # Configure and start FSM - yield fsm.trigger.eq(1) - yield fsm.trigger_mode.eq(TriggerModes.SINGLE_SHOT) - yield fsm.trigger_location.eq(4) - yield fsm.request_start.eq(1) + # Configure and start FSM + yield fsm.trigger.eq(1) + yield fsm.trigger_mode.eq(TriggerModes.SINGLE_SHOT) + yield fsm.trigger_location.eq(4) + yield fsm.request_start.eq(1) - # Wait until write_enable is asserted - while not (yield fsm.write_enable): - yield - - # Wait 8 clock cycles for capture to complete - for i in range(8): - # Make sure that read_pointer does not increase - if (yield fsm.read_pointer) != 0: - raise ValueError - - # Make sure that write_pointer increases by one each cycle - if (yield fsm.write_pointer) != i: - raise ValueError - - yield - - # Wait one clock cycle (to let BRAM contents cycle in) + # Wait until write_enable is asserted + while not (yield fsm.write_enable): yield - # Check that write_pointer points to the end of memory - if (yield fsm.write_pointer) != 7: + # Wait 8 clock cycles for capture to complete + for i in range(8): + # Make sure that read_pointer does not increase + if (yield fsm.read_pointer) != 0: raise ValueError - # Check that state is CAPTURED - if (yield fsm.state) != States.CAPTURED: + # Make sure that write_pointer increases by one each cycle + if (yield fsm.write_pointer) != i: raise ValueError - simulate(fsm, testbench, "single_shot_no_wait_for_trigger.vcd") + yield + + # Wait one clock cycle (to let BRAM contents cycle in) + yield + + # Check that write_pointer points to the end of memory + if (yield fsm.write_pointer) != 7: + raise ValueError + + # Check that state is CAPTURED + if (yield fsm.state) != States.CAPTURED: + raise ValueError +@simulate(fsm) def test_single_shot_wait_for_trigger(): - def testbench(): - # Configure and start FSM - yield fsm.trigger_mode.eq(TriggerModes.SINGLE_SHOT) - yield fsm.trigger_location.eq(4) - yield fsm.request_start.eq(1) - yield - yield + # Configure and start FSM + yield fsm.trigger_mode.eq(TriggerModes.SINGLE_SHOT) + yield fsm.trigger_location.eq(4) + yield fsm.request_start.eq(1) + yield + yield - # Check that write_enable is asserted a cycle after request_start - if not (yield fsm.write_enable): - raise ValueError + # Check that write_enable is asserted a cycle after request_start + if not (yield fsm.write_enable): + raise ValueError - # Wait 4 clock cycles to get to IN_POSITION - for i in range(4): - rp = yield fsm.read_pointer - wp = yield fsm.write_pointer - - # Make sure that read_pointer does not increase - if rp != 0: - raise ValueError - - # Make sure that write_pointer increases by one each cycle - if wp != i: - raise ValueError - - yield - - # Wait a few cycles before triggering - for _ in range(10): - yield - - # Provide the trigger, and check that the capture completes 4 cycles later - yield fsm.trigger.eq(1) - yield - - for i in range(4): - yield - - # Wait one clock cycle (to let BRAM contents cycle in) - yield - - # Check that write_pointer points to the end of memory + # Wait 4 clock cycles to get to IN_POSITION + for i in range(4): rp = yield fsm.read_pointer wp = yield fsm.write_pointer - if (wp + 1) % config["sample_depth"] != rp: - raise ValueError - # Check that state is CAPTURED - if (yield fsm.state) != States.CAPTURED: - raise ValueError - - simulate(fsm, testbench, "single_shot_wait_for_trigger.vcd") - - -def test_immediate(): - def testbench(): - # Configure and start FSM - yield fsm.trigger_mode.eq(TriggerModes.IMMEDIATE) - yield fsm.request_start.eq(1) - yield - yield - - # Check that write_enable is asserted a cycle after request_start - if not (yield fsm.write_enable): - raise ValueError - - for i in range(config["sample_depth"]): - rp = yield fsm.read_pointer - wp = yield fsm.write_pointer - - if rp != 0: - raise ValueError - - if wp != i: - raise ValueError - - yield - - # Wait one clock cycle (to let BRAM contents cycle in) - yield - - # Check that write_pointer points to the end of memory - rp = yield fsm.read_pointer - wp = yield fsm.write_pointer + # Make sure that read_pointer does not increase if rp != 0: raise ValueError - if wp != 7: + + # Make sure that write_pointer increases by one each cycle + if wp != i: raise ValueError - # Check that state is CAPTURED - if (yield fsm.state) != States.CAPTURED: + yield + + # Wait a few cycles before triggering + for _ in range(10): + yield + + # Provide the trigger, and check that the capture completes 4 cycles later + yield fsm.trigger.eq(1) + yield + + for i in range(4): + yield + + # Wait one clock cycle (to let BRAM contents cycle in) + yield + + # Check that write_pointer points to the end of memory + rp = yield fsm.read_pointer + wp = yield fsm.write_pointer + if (wp + 1) % config["sample_depth"] != rp: + raise ValueError + + # Check that state is CAPTURED + if (yield fsm.state) != States.CAPTURED: + raise ValueError + + +@simulate(fsm) +def test_immediate(): + # Configure and start FSM + yield fsm.trigger_mode.eq(TriggerModes.IMMEDIATE) + yield fsm.request_start.eq(1) + yield + yield + + # Check that write_enable is asserted a cycle after request_start + if not (yield fsm.write_enable): + raise ValueError + + for i in range(config["sample_depth"]): + rp = yield fsm.read_pointer + wp = yield fsm.write_pointer + + if rp != 0: raise ValueError - simulate(fsm, testbench, "immediate.vcd") + if wp != i: + raise ValueError + + yield + + # Wait one clock cycle (to let BRAM contents cycle in) + yield + + # Check that write_pointer points to the end of memory + rp = yield fsm.read_pointer + wp = yield fsm.write_pointer + if rp != 0: + raise ValueError + if wp != 7: + raise ValueError + + # Check that state is CAPTURED + if (yield fsm.state) != States.CAPTURED: + raise ValueError +@simulate(fsm) def test_incremental(): - def testbench(): - # Configure and start FSM - yield fsm.trigger_mode.eq(TriggerModes.INCREMENTAL) - yield fsm.request_start.eq(1) - yield - yield + # Configure and start FSM + yield fsm.trigger_mode.eq(TriggerModes.INCREMENTAL) + yield fsm.request_start.eq(1) + yield + yield - # Check that write_enable is asserted on the same edge as request_start - if not (yield fsm.write_enable): - raise ValueError - - for _ in range(10): - for _ in range(3): - yield - - yield fsm.trigger.eq(1) - yield - yield fsm.trigger.eq(0) - yield - - # Check that state is CAPTURED - if (yield fsm.state) != States.CAPTURED: - raise ValueError - - simulate(fsm, testbench, "incremental.vcd") - - -def test_single_shot_write_enable(): - def testbench(): - # Configure FSM - yield fsm.trigger_mode.eq(TriggerModes.SINGLE_SHOT) - yield fsm.trigger_location.eq(4) - yield - - # Make sure write is not enabled before starting the FSM - if (yield fsm.write_enable): - raise ValueError - - # Start the FSM, ensure write enable is asserted throughout the capture - yield fsm.request_start.eq(1) - yield - yield - - for _ in range(config["sample_depth"]): - if not (yield fsm.write_enable): - raise ValueError + # Check that write_enable is asserted on the same edge as request_start + if not (yield fsm.write_enable): + raise ValueError + for _ in range(10): + for _ in range(3): yield yield fsm.trigger.eq(1) yield + yield fsm.trigger.eq(0) + yield - for _ in range(4): - if not (yield fsm.write_enable): - raise ValueError + # Check that state is CAPTURED + if (yield fsm.state) != States.CAPTURED: + raise ValueError - yield - # Make sure write_enable is deasserted after - if (yield fsm.write_enable): +@simulate(fsm) +def test_single_shot_write_enable(): + # Configure FSM + yield fsm.trigger_mode.eq(TriggerModes.SINGLE_SHOT) + yield fsm.trigger_location.eq(4) + yield + + # Make sure write is not enabled before starting the FSM + if (yield fsm.write_enable): + raise ValueError + + # Start the FSM, ensure write enable is asserted throughout the capture + yield fsm.request_start.eq(1) + yield + yield + + for _ in range(config["sample_depth"]): + if not (yield fsm.write_enable): raise ValueError - simulate(fsm, testbench, "single_shot_write_enable.vcd") + yield + + yield fsm.trigger.eq(1) + yield + + for _ in range(4): + if not (yield fsm.write_enable): + raise ValueError + + yield + + # Make sure write_enable is deasserted after + if (yield fsm.write_enable): + raise ValueError +@simulate(fsm) def test_immediate_write_enable(): - def testbench(): - # Configure FSM - yield fsm.trigger_mode.eq(TriggerModes.IMMEDIATE) - yield + # Configure FSM + yield fsm.trigger_mode.eq(TriggerModes.IMMEDIATE) + yield - # Make sure write is not enabled before starting the FSM - if (yield fsm.write_enable): + # Make sure write is not enabled before starting the FSM + if (yield fsm.write_enable): + raise ValueError + + # Start the FSM, ensure write enable is asserted throughout the capture + yield fsm.request_start.eq(1) + yield + yield + + for _ in range(config["sample_depth"]): + if not (yield fsm.write_enable): raise ValueError - # Start the FSM, ensure write enable is asserted throughout the capture - yield fsm.request_start.eq(1) - yield yield - for _ in range(config["sample_depth"]): - if not (yield fsm.write_enable): - raise ValueError - - yield - - # Make sure write_enable is deasserted after - if (yield fsm.write_enable): - raise ValueError - - simulate(fsm, testbench, "immediate_write_enable.vcd") + # Make sure write_enable is deasserted after + if (yield fsm.write_enable): + raise ValueError diff --git a/test/test_logic_analyzer_sim.py b/test/test_logic_analyzer_sim.py index f5c7ea2..eb240a5 100644 --- a/test/test_logic_analyzer_sim.py +++ b/test/test_logic_analyzer_sim.py @@ -61,42 +61,40 @@ def set_probe(name, value): yield probe.eq(value) +@simulate(la) def test_single_shot_capture(): - def testbench(): - # # ok nice what happens if we try to run the core, which includes: - yield from set_fsm_register("request_stop", 1) - yield from set_fsm_register("request_stop", 0) + # # ok nice what happens if we try to run the core, which includes: + yield from set_fsm_register("request_stop", 1) + yield from set_fsm_register("request_stop", 0) - # setting triggers - yield from set_trig_blk_register("curly_op", Operations.EQ) - yield from set_trig_blk_register("curly_arg", 4) + # setting triggers + yield from set_trig_blk_register("curly_op", Operations.EQ) + yield from set_trig_blk_register("curly_arg", 4) - # setting trigger mode - yield from set_fsm_register("trigger_mode", 0) + # setting trigger mode + yield from set_fsm_register("trigger_mode", 0) - # setting trigger location - yield from set_fsm_register("trigger_location", 511) + # setting trigger location + yield from set_fsm_register("trigger_location", 511) - # starting capture - yield from set_fsm_register("request_start", 1) - yield from set_fsm_register("request_start", 0) + # starting capture + yield from set_fsm_register("request_start", 1) + yield from set_fsm_register("request_start", 0) - # wait a few hundred clock cycles, see what happens - for _ in range(700): - yield + # wait a few hundred clock cycles, see what happens + for _ in range(700): + yield - # provide the trigger condition - yield from set_probe("curly", 4) + # provide the trigger condition + yield from set_probe("curly", 4) - for _ in range(700): - yield + for _ in range(700): + yield - # dump sample memory contents - yield from write_register(la, 0, 0) - yield from write_register(la, 0, 1) - yield from write_register(la, 0, 0) + # dump sample memory contents + yield from write_register(la, 0, 0) + yield from write_register(la, 0, 1) + yield from write_register(la, 0, 0) - for addr in range(la.get_max_addr()): - yield from print_data_at_addr(addr) - - simulate(la, testbench, "la_core.vcd") + for addr in range(la.get_max_addr()): + yield from print_data_at_addr(addr) diff --git a/test/test_mem_core_sim.py b/test/test_mem_core_sim.py index fce9800..dd8d430 100644 --- a/test/test_mem_core_sim.py +++ b/test/test_mem_core_sim.py @@ -1,44 +1,158 @@ from manta.memory_core import MemoryCore from manta.utils import * -from random import randint, sample +from random import randint, sample, choice + +width = 18 +depth = 512 +base_addr = 0 +mem_core = MemoryCore( + mode="bidirectional", width=width, depth=depth, base_addr=base_addr, interface=None +) + +max_addr = mem_core.get_max_addr() +bus_addrs = list(range(base_addr, max_addr)) # include the endpoint! +user_addrs = list(range(depth)) -def fill_mem_from_user_port(mem_core, depth): - for i in range(depth): - yield mem_core.user_addr.eq(i) - yield mem_core.user_data_in.eq(i) - yield mem_core.user_write_enable.eq(1) +@simulate(mem_core) +def test_bidirectional(): + # make sure each address on the bus side contains zero + for addr in bus_addrs: + yield from verify_register(mem_core, addr, 0) + + # make sure each address on the user side contains zero + for addr in user_addrs: + yield from verify_user_side(mem_core, addr, 0) + + # write then immediately read + for addr in bus_addrs: + # this part is a little hard to check since we might have a + # memory at the end of the address space that's less than + # 16-bits wide. so we'll have to calculate how wide our + # memory is + + n_full = width // 16 + if addr < base_addr + (n_full * depth): + data_width = 16 + else: + data_width = width % 16 + + data = randint(0, (2**data_width) - 1) + yield from write_register(mem_core, addr, data) + yield + yield + yield + yield + yield from verify_register(mem_core, addr, data) + yield + yield + yield + yield yield + # write-write-write then read-read-read + model = {} + for addr in sample(bus_addrs, len(bus_addrs)): + n_full = width // 16 + if addr < base_addr + (n_full * depth): + data_width = 16 + else: + data_width = width % 16 + + data = randint(0, (2**data_width) - 1) + model[addr] = data + yield from write_register(mem_core, addr, data) + yield + yield + yield + yield + + for addr in sample(bus_addrs, len(bus_addrs)): + yield from verify_register(mem_core, addr, model[addr]) + yield + yield + yield + yield + + # random reads and writes in random orders + for _ in range(5): + for addr in sample(bus_addrs, len(bus_addrs)): + + operation = choice(["read", "write"]) + if operation == "read": + yield from verify_register(mem_core, addr, model[addr]) + yield + yield + yield + yield + yield + yield + + elif operation == "write": + n_full = width // 16 + + if addr < base_addr + (n_full * depth): + data_width = 16 + else: + data_width = width % 16 + + data = randint(0, (2**data_width) - 1) + model[addr] = data + + yield from write_register(mem_core, addr, data) + yield + yield + yield + yield + yield + yield + + +def verify_user_side(mem_core, addr, expected_data): + yield mem_core.user_addr.eq(addr) yield mem_core.user_write_enable.eq(0) yield - -def verify_mem_core(width, depth, base_addr): - mem_core = MemoryCore("fpga_to_host", width, depth, base_addr, interface=None) - - def testbench(): - yield from fill_mem_from_user_port(mem_core, depth) - - # Read from address sequentially - for i in range(depth): - yield from verify_register(mem_core, i + base_addr, i % (2**width)) - - # Read from addresses randomly - for i in sample(range(depth), k=depth): - yield from verify_register(mem_core, i + base_addr, i % (2**width)) - - simulate(mem_core, testbench) + data = yield (mem_core.user_data_out) + if data != expected_data: + raise ValueError(f"Read from {addr} yielded {data} instead of {expected_data}") -def test_sweep_core_widths(): - for i in range(1, 64): - verify_mem_core(i, 128, 0) +# def fill_mem_from_user_port(mem_core, depth): +# for i in range(depth): +# yield mem_core.user_addr.eq(i) +# yield mem_core.user_data_in.eq(i) +# yield mem_core.user_write_enable.eq(1) +# yield + +# yield mem_core.user_write_enable.eq(0) +# yield -def test_random_cores(): - for _ in range(5): - width = randint(0, 512) - depth = randint(0, 1024) - base_addr = randint(0, 2**16 - 1 - depth) - verify_mem_core(width, depth, base_addr) +# def verify_mem_core(width, depth, base_addr): +# mem_core = MemoryCore("bidirectional", width, depth, base_addr, interface=None) + +# def testbench(): +# yield from fill_mem_from_user_port(mem_core, depth) + +# # Read from address sequentially +# for i in range(depth): +# yield from verify_register(mem_core, i + base_addr, i % (2**width)) + +# # Read from addresses randomly +# for i in sample(range(depth), k=depth): +# yield from verify_register(mem_core, i + base_addr, i % (2**width)) + +# simulate(mem_core, testbench) + +# def test_sweep_core_widths(): +# for i in range(1, 64): +# verify_mem_core(i, 128, 0) + + +# def test_random_cores(): +# for _ in range(5): +# width = randint(0, 512) +# depth = randint(0, 1024) +# base_addr = randint(0, 2**16 - 1 - depth) +# verify_mem_core(width, depth, base_addr) diff --git a/test/test_source_bridge_sim.py b/test/test_source_bridge_sim.py index 031dec8..b3b03ef 100644 --- a/test/test_source_bridge_sim.py +++ b/test/test_source_bridge_sim.py @@ -6,34 +6,32 @@ from manta.utils import * source_bridge = UDPSourceBridge() +@simulate(source_bridge) def test_normie_ops(): - def testbench(): - yield source_bridge.data_i.eq(0) - yield source_bridge.last_i.eq(0) - yield source_bridge.valid_i.eq(0) - yield - yield + yield source_bridge.data_i.eq(0) + yield source_bridge.last_i.eq(0) + yield source_bridge.valid_i.eq(0) + yield + yield - yield source_bridge.data_i.eq(0x0000_0001) - yield source_bridge.valid_i.eq(1) - yield - yield source_bridge.data_i.eq(0x1234_5678) - yield - yield source_bridge.valid_i.eq(0) - yield - yield + yield source_bridge.data_i.eq(0x0000_0001) + yield source_bridge.valid_i.eq(1) + yield + yield source_bridge.data_i.eq(0x1234_5678) + yield + yield source_bridge.valid_i.eq(0) + yield + yield - yield source_bridge.valid_i.eq(1) - yield source_bridge.data_i.eq(0x0000_0001) - yield - yield source_bridge.data_i.eq(0x90AB_CDEF) - yield - yield source_bridge.data_i.eq(0x0000_0000) - yield - yield source_bridge.data_i.eq(0x1234_5678) - yield - yield source_bridge.valid_i.eq(0) - yield - yield - - simulate(source_bridge, testbench, "source_bridge.vcd") + yield source_bridge.valid_i.eq(1) + yield source_bridge.data_i.eq(0x0000_0001) + yield + yield source_bridge.data_i.eq(0x90AB_CDEF) + yield + yield source_bridge.data_i.eq(0x0000_0000) + yield + yield source_bridge.data_i.eq(0x1234_5678) + yield + yield source_bridge.valid_i.eq(0) + yield + yield diff --git a/test/test_uart_rx_sim.py b/test/test_uart_rx_sim.py index 40111aa..23c9f43 100644 --- a/test/test_uart_rx_sim.py +++ b/test/test_uart_rx_sim.py @@ -43,23 +43,19 @@ def verify_receive(data): raise ValueError("Failed to assert valid!") +@simulate(uart_rx) def test_all_possible_bytes(): - def testbench(): - yield uart_rx.rx.eq(1) - yield + yield uart_rx.rx.eq(1) + yield - for i in range(0xFF): - yield from verify_receive(i) - - simulate(uart_rx, testbench) + for i in range(0xFF): + yield from verify_receive(i) +@simulate(uart_rx) def test_bytes_random_sample(): - def testbench(): - yield uart_rx.rx.eq(1) - yield + yield uart_rx.rx.eq(1) + yield - for i in sample(range(0xFF), k=0xFF): - yield from verify_receive(i) - - simulate(uart_rx, testbench) + for i in sample(range(0xFF), k=0xFF): + yield from verify_receive(i) diff --git a/test/test_uart_tx_sim.py b/test/test_uart_tx_sim.py index 8b07aa4..63bd373 100644 --- a/test/test_uart_tx_sim.py +++ b/test/test_uart_tx_sim.py @@ -41,17 +41,13 @@ def verify_bit_sequence(byte): raise ValueError("Done not asserted at end of transmission!") +@simulate(uart_tx) def test_all_possible_bytes(): - def testbench(): - for i in range(0xFF): - yield from verify_bit_sequence(i) - - simulate(uart_tx, testbench) + for i in range(0xFF): + yield from verify_bit_sequence(i) +@simulate(uart_tx) def test_bytes_random_sample(): - def testbench(): - for i in sample(range(0xFF), k=0xFF): - yield from verify_bit_sequence(i) - - simulate(uart_tx, testbench) + for i in sample(range(0xFF), k=0xFF): + yield from verify_bit_sequence(i) From 11022f474ddc71006513c8a88ccad7f3d63d5afa Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 3 Mar 2024 13:30:54 -0800 Subject: [PATCH 65/89] refactor Memory Core simulation into test class --- test/test_mem_core_sim.py | 235 ++++++++++++++++---------------------- 1 file changed, 98 insertions(+), 137 deletions(-) diff --git a/test/test_mem_core_sim.py b/test/test_mem_core_sim.py index dd8d430..9618687 100644 --- a/test/test_mem_core_sim.py +++ b/test/test_mem_core_sim.py @@ -2,148 +2,109 @@ from manta.memory_core import MemoryCore from manta.utils import * from random import randint, sample, choice -width = 18 -depth = 512 -base_addr = 0 +class MemoryCoreTests(): + def __init__(self, mem_core): + self.mem_core = mem_core + self.base_addr = mem_core._base_addr + self.max_addr = mem_core.get_max_addr() + self.width = self.mem_core._width + self.depth = self.mem_core._depth + + self.bus_addrs = list(range(self.base_addr, self.max_addr)) # include the endpoint! + self.user_addrs = list(range(self.mem_core._depth)) + self.model = {} + + def check_each_address_on_bus_side_contains_zero(self): + for addr in self.bus_addrs: + yield from self.verify_bus_side(addr, 0) + + def check_each_address_on_user_side_contains_zero(self): + for addr in self.user_addrs: + yield from self.verify_user_side(addr, 0) + + def check_write_then_immediately_read_bus_side(self): + for addr in self.bus_addrs: + # this part is a little hard to check since we might have a + # memory at the end of the address space that's less than + # 16-bits wide. so we'll have to calculate how wide our + # memory is + + data_width = self.get_data_width(addr) + data = randint(0, (2**data_width) - 1) + + yield from self.write_bus_side(addr, data) + yield from self.verify_bus_side(addr, data) + + def check_multiple_writes_then_multiple_reads(self): + # write-write-write then read-read-read + for addr in sample(self.bus_addrs, len(self.bus_addrs)): + data_width = self.get_data_width(addr) + data = randint(0, (2**data_width) - 1) + + self.model[addr] = data + yield from self.write_bus_side(addr, data) + + for addr in sample(self.bus_addrs, len(self.bus_addrs)): + yield from self.verify_bus_side(addr, self.model[addr]) + + def check_random_reads_random_writes_random_orders(self): + # random reads and writes in random orders + for _ in range(5): + for addr in sample(self.bus_addrs, len(self.bus_addrs)): + + operation = choice(["read", "write"]) + if operation == "read": + yield from self.verify_bus_side(addr, self.model[addr]) + + elif operation == "write": + data_width = self.get_data_width(addr) + data = randint(0, (2**data_width) - 1) + self.model[addr] = data + yield from self.write_bus_side(addr, data) + + def get_data_width(self, addr): + n_full = self.width // 16 + if addr < self.base_addr + (n_full * self.depth): + return 16 + else: + return self.width % 16 + + def verify_bus_side(self, addr, expected_data): + yield from verify_register(self.mem_core, addr, expected_data) + for _ in range(4): + yield + + def write_bus_side(self, addr, data): + yield from write_register(self.mem_core, addr, data) + for _ in range(4): + yield + + def verify_user_side(self, addr, expected_data): + yield self.mem_core.user_addr.eq(addr) + yield self.mem_core.user_write_enable.eq(0) + yield + + data = yield (self.mem_core.user_data_out) + if data != expected_data: + raise ValueError(f"Read from {addr} yielded {data} instead of {expected_data}") + mem_core = MemoryCore( - mode="bidirectional", width=width, depth=depth, base_addr=base_addr, interface=None + mode="bidirectional", + width=23, + depth=512, + base_addr=0, + interface=None, ) -max_addr = mem_core.get_max_addr() -bus_addrs = list(range(base_addr, max_addr)) # include the endpoint! -user_addrs = list(range(depth)) - +tests = MemoryCoreTests(mem_core) @simulate(mem_core) -def test_bidirectional(): - # make sure each address on the bus side contains zero - for addr in bus_addrs: - yield from verify_register(mem_core, addr, 0) - - # make sure each address on the user side contains zero - for addr in user_addrs: - yield from verify_user_side(mem_core, addr, 0) - - # write then immediately read - for addr in bus_addrs: - # this part is a little hard to check since we might have a - # memory at the end of the address space that's less than - # 16-bits wide. so we'll have to calculate how wide our - # memory is - - n_full = width // 16 - if addr < base_addr + (n_full * depth): - data_width = 16 - else: - data_width = width % 16 - - data = randint(0, (2**data_width) - 1) - yield from write_register(mem_core, addr, data) - yield - yield - yield - yield - yield from verify_register(mem_core, addr, data) - yield - yield - yield - yield - yield - - # write-write-write then read-read-read - model = {} - for addr in sample(bus_addrs, len(bus_addrs)): - n_full = width // 16 - if addr < base_addr + (n_full * depth): - data_width = 16 - else: - data_width = width % 16 - - data = randint(0, (2**data_width) - 1) - model[addr] = data - yield from write_register(mem_core, addr, data) - yield - yield - yield - yield - - for addr in sample(bus_addrs, len(bus_addrs)): - yield from verify_register(mem_core, addr, model[addr]) - yield - yield - yield - yield - - # random reads and writes in random orders - for _ in range(5): - for addr in sample(bus_addrs, len(bus_addrs)): - - operation = choice(["read", "write"]) - if operation == "read": - yield from verify_register(mem_core, addr, model[addr]) - yield - yield - yield - yield - yield - yield - - elif operation == "write": - n_full = width // 16 - - if addr < base_addr + (n_full * depth): - data_width = 16 - else: - data_width = width % 16 - - data = randint(0, (2**data_width) - 1) - model[addr] = data - - yield from write_register(mem_core, addr, data) - yield - yield - yield - yield - yield - yield - - -def verify_user_side(mem_core, addr, expected_data): - yield mem_core.user_addr.eq(addr) - yield mem_core.user_write_enable.eq(0) - yield - - data = yield (mem_core.user_data_out) - if data != expected_data: - raise ValueError(f"Read from {addr} yielded {data} instead of {expected_data}") - - -# def fill_mem_from_user_port(mem_core, depth): -# for i in range(depth): -# yield mem_core.user_addr.eq(i) -# yield mem_core.user_data_in.eq(i) -# yield mem_core.user_write_enable.eq(1) -# yield - -# yield mem_core.user_write_enable.eq(0) -# yield - - -# def verify_mem_core(width, depth, base_addr): -# mem_core = MemoryCore("bidirectional", width, depth, base_addr, interface=None) - -# def testbench(): -# yield from fill_mem_from_user_port(mem_core, depth) - -# # Read from address sequentially -# for i in range(depth): -# yield from verify_register(mem_core, i + base_addr, i % (2**width)) - -# # Read from addresses randomly -# for i in sample(range(depth), k=depth): -# yield from verify_register(mem_core, i + base_addr, i % (2**width)) - -# simulate(mem_core, testbench) +def test_bidirectional_testbench(): + yield from tests.check_each_address_on_bus_side_contains_zero() + yield from tests.check_each_address_on_user_side_contains_zero() + yield from tests.check_write_then_immediately_read_bus_side() + yield from tests.check_multiple_writes_then_multiple_reads() + yield from tests.check_random_reads_random_writes_random_orders() # def test_sweep_core_widths(): # for i in range(1, 64): From 25ebae42e206c575a5e5e93dd2a126242117fb98 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 3 Mar 2024 13:57:52 -0800 Subject: [PATCH 66/89] add GateMate ILA to alternatives --- doc/alternatives.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/alternatives.md b/doc/alternatives.md index 44f998d..8008edf 100644 --- a/doc/alternatives.md +++ b/doc/alternatives.md @@ -1,4 +1,4 @@ -There's quite a few FPGA debugging tools out there, and it may happen that your needs are better met by another tool. This section aims to provide a list of alternatives, in hopes that you're able to be confident in your debugging flow. +There's quite a few FPGA debugging tools out there, and it may happen that your needs are better met by another tool! This section aims to provide a list of alternatives, in hopes that you're able to be confident in your debugging flow. ## Open Source Tools @@ -9,6 +9,12 @@ An embedded logic analyzer written in Migen, primarily for use in LiteX SoC desi - [Source Code](https://github.com/enjoy-digital/litescope) - [Documentation](https://github.com/enjoy-digital/litex/wiki/Use-LiteScope-To-Debug-A-SoC) +### GateMate ILA + +An embedded logic analyzer written in Verilog, targeting the GateMate FPGA family from Colonge Chip and the Yosys/NextPNR toolchain. Communication between the host and FPGA is accomplished with SPI, via a FT232 or FT2232 used as a USB-SPI adapter. GateMate is inteneded to be used with GTKWave, so the tool generates `.gtkw` files in addition to VCD files. + +- [Source Code](https://github.com/colognechip/gatemate_ila) + ### ZipCPU Debugger A set of embedded debugging modules written by Dan Gisselquist of ZipCPU fame. Communication between the host and FPGA is accomplished with UART, and control of the debugger is performed with a C++ API on the host. A wishbone interface is provided on the FPGA side to connect to other Wishbone-based debugging tools that can provide control of user registers, block RAM, and an embedded logic analyzer. Supports dumping of signals to a VCD file. From b729deb144f1414f81e89fc8020bfc3dcf48cbf2 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 3 Mar 2024 18:31:11 -0800 Subject: [PATCH 67/89] hardcode device paths in hardware tests --- test/test_io_core_hw.py | 6 ++++-- test/test_logic_analyzer_hw.py | 6 ++++-- test/test_mem_core_hw.py | 5 +++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/test/test_io_core_hw.py b/test/test_io_core_hw.py index 13f29c6..6715728 100644 --- a/test/test_io_core_hw.py +++ b/test/test_io_core_hw.py @@ -143,9 +143,11 @@ class IOCoreLoopbackTest(Elaboratable): @pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") def test_output_probe_initial_values_xilinx(): - IOCoreLoopbackTest(Nexys4DDRPlatform(), "/dev/ttyUSB1").verify() + port = "/dev/serial/by-id/usb-Digilent_Digilent_USB_Device_210292696307-if01-port0" + IOCoreLoopbackTest(Nexys4DDRPlatform(), port).verify() @pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") def test_output_probe_initial_values_ice40(): - IOCoreLoopbackTest(ICEStickPlatform(), "/dev/ttyUSB2").verify() + port = "/dev/serial/by-id/usb-Lattice_Lattice_FTUSB_Interface_Cable-if01-port0" + IOCoreLoopbackTest(ICEStickPlatform(), port).verify() diff --git a/test/test_logic_analyzer_hw.py b/test/test_logic_analyzer_hw.py index d1dd695..8a25335 100644 --- a/test/test_logic_analyzer_hw.py +++ b/test/test_logic_analyzer_hw.py @@ -78,9 +78,11 @@ class LogicAnalyzerCounterTest(Elaboratable): @pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") def test_logic_analyzer_core_xilinx(): - LogicAnalyzerCounterTest(Nexys4DDRPlatform(), "/dev/ttyUSB1").verify() + port = "/dev/serial/by-id/usb-Digilent_Digilent_USB_Device_210292696307-if01-port0" + LogicAnalyzerCounterTest(Nexys4DDRPlatform(), port).verify() @pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") def test_logic_analyzer_core_ice40(): - LogicAnalyzerCounterTest(ICEStickPlatform(), "/dev/ttyUSB2").verify() + port = "/dev/serial/by-id/usb-Lattice_Lattice_FTUSB_Interface_Cable-if01-port0" + LogicAnalyzerCounterTest(ICEStickPlatform(), port).verify() diff --git a/test/test_mem_core_hw.py b/test/test_mem_core_hw.py index 02925c8..18070ee 100644 --- a/test/test_mem_core_hw.py +++ b/test/test_mem_core_hw.py @@ -112,12 +112,13 @@ class MemoryCoreLoopbackTest(Elaboratable): @pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") def test_mem_core_xilinx(): - MemoryCoreLoopbackTest(Nexys4DDRPlatform(), 33, 1024, "/dev/ttyUSB1").verify() + port = "/dev/serial/by-id/usb-Digilent_Digilent_USB_Device_210292696307-if01-port0" + MemoryCoreLoopbackTest(Nexys4DDRPlatform(), 33, 1024, port).verify() @pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") def test_mem_core_ice40(): - port = "/dev/ttyUSB2" + port = "/dev/serial/by-id/usb-Lattice_Lattice_FTUSB_Interface_Cable-if01-port0" MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 2, port).verify() MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 512, port).verify() MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 1024, port).verify() From be79ba28b559b4b73d2eb43a89fcbcc85942f95a Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 3 Mar 2024 18:53:08 -0800 Subject: [PATCH 68/89] define ABC for cores to inherit from --- src/manta/io_core.py | 25 ++++++---------- src/manta/logic_analyzer/__init__.py | 25 ++++++---------- src/manta/logic_analyzer/fsm.py | 2 +- src/manta/logic_analyzer/trigger_block.py | 2 +- src/manta/manta.py | 4 +-- src/manta/memory_core.py | 25 ++++++---------- src/manta/utils.py | 35 +++++++++++++++++++++-- test/test_logic_analyzer_sim.py | 2 +- test/test_mem_core_sim.py | 16 ++++++++--- 9 files changed, 77 insertions(+), 59 deletions(-) diff --git a/src/manta/io_core.py b/src/manta/io_core.py index 63d6df5..d4b7add 100644 --- a/src/manta/io_core.py +++ b/src/manta/io_core.py @@ -3,7 +3,7 @@ from manta.utils import * from math import ceil -class IOCore(Elaboratable): +class IOCore(MantaCore): """ A module for setting and getting the values of registers of arbitrary size on a FPGA. @@ -34,6 +34,14 @@ class IOCore(Elaboratable): self._make_memory_map() + @property + def top_level_ports(self): + return self._inputs + self._outputs + + @property + def max_addr(self): + return self._max_addr + @classmethod def from_config(cls, config, base_addr, interface): inputs = config.get("inputs", {}) @@ -173,21 +181,6 @@ class IOCore(Elaboratable): return m - def get_top_level_ports(self): - """ - Return the Amaranth signals that should be included as ports in the - top-level Manta module. - """ - return self._inputs + self._outputs - - def get_max_addr(self): - """ - Return the maximum addresses in memory used by the core. The address - space used by the core extends from `base_addr` to the number returned - by this function (including the endpoints). - """ - return self._max_addr - def set_probe(self, name, value): """ Set the value of an output probe on the FPGA. The value may be either diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index 19e3a04..2276a6a 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -6,7 +6,7 @@ from manta.logic_analyzer.fsm import LogicAnalyzerFSM, States, TriggerModes from manta.logic_analyzer.playback import LogicAnalyzerPlayback -class LogicAnalyzerCore(Elaboratable): +class LogicAnalyzerCore(MantaCore): """ A module for generating a logic analyzer on the FPGA, with configurable triggers, trigger position, and trigger modes. @@ -44,6 +44,14 @@ class LogicAnalyzerCore(Elaboratable): interface=interface, ) + @property + def max_addr(self): + return self._sample_mem.max_addr + + @property + def top_level_ports(self): + return self._probes + def _check_config(self): # Check for unrecognized options valid_options = [ @@ -176,21 +184,6 @@ class LogicAnalyzerCore(Elaboratable): return m - def get_top_level_ports(self): - """ - Return the Amaranth signals that should be included as ports in the - top-level Manta module. - """ - return self._probes - - def get_max_addr(self): - """ - Return the maximum addresses in memory used by the core. The address - space used by the core extends from `base_addr` to the number returned - by this function (including the endpoints). - """ - return self._sample_mem.get_max_addr() - def capture(self, verbose=False): """ Performs a capture, recording the state of all input probes to the diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index bfe4183..4853963 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -66,7 +66,7 @@ class LogicAnalyzerFSM(Elaboratable): space used by the core extends from `base_addr` to the number returned by this function (including the endpoints). """ - return self.registers.get_max_addr() + return self.registers.max_addr def elaborate(self, platform): m = Module() diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index ff67b45..9db01a2 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -34,7 +34,7 @@ class LogicAnalyzerTriggerBlock(Elaboratable): space used by the core extends from `base_addr` to the number returned by this function (including the endpoints). """ - return self.registers.get_max_addr() + return self.registers.max_addr def clear_triggers(self): # Reset all triggers to disabled with no argument diff --git a/src/manta/manta.py b/src/manta/manta.py index 1a3830b..b5ea59e 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -97,13 +97,13 @@ class Manta(Elaboratable): core = MemoryCore.from_config(attrs, base_addr, self.interface) # Make sure we're not out of address space - if core.get_max_addr() > (2**16) - 1: + if core.max_addr > (2**16) - 1: raise ValueError( f"Ran out of address space to allocate to core {name}." ) # Make the next core's base address start one address after the previous one's - base_addr = core.get_max_addr() + 1 + base_addr = core.max_addr + 1 self._cores[name] = core def _add_friendly_core_names(self): diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index 7e8e0a5..edcbb74 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -3,7 +3,7 @@ from manta.utils import * from math import ceil -class MemoryCore(Elaboratable): +class MemoryCore(MantaCore): """ A module for generating a memory on the FPGA, with a port tied to Manta's internal bus, and a port provided to user logic. @@ -60,6 +60,14 @@ class MemoryCore(Elaboratable): self.user_write_enable, ] + @property + def top_level_ports(self): + return self._top_level_ports + + @property + def max_addr(self): + return self._max_addr + @classmethod def from_config(cls, config, base_addr, interface): # Check for unrecognized options @@ -251,21 +259,6 @@ class MemoryCore(Elaboratable): self._tie_mems_to_user_logic(m) return m - def get_top_level_ports(self): - """ - Return the Amaranth signals that should be included as ports in the - top-level Manta module. - """ - return self._top_level_ports - - def get_max_addr(self): - """ - Return the maximum addresses in memory used by the core. The address - space used by the core extends from `base_addr` to the number returned - by this function (including the endpoints). - """ - return self._max_addr - def _convert_user_to_bus_addr(self, addrs): """ Convert user address space to bus address space. For instance, for a diff --git a/src/manta/utils.py b/src/manta/utils.py index 20dc6bc..b9bfba8 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -1,9 +1,40 @@ +from amaranth import * from amaranth.sim import Simulator -from amaranth.lib import data, enum -from math import ceil +from amaranth.lib import data +from abc import ABC, abstractmethod import os +class MantaCore(ABC, Elaboratable): + + @property + @abstractmethod + def max_addr(self): + """ + Return the maximum addresses in memory used by the core. The address + space used by the core extends from `base_addr` to the number returned + by this function (including the endpoints). + """ + pass + + @property + @abstractmethod + def top_level_ports(self): + """ + Return the Amaranth signals that should be included as ports in the + top-level Manta module. + """ + pass + + @abstractmethod + def elaborate(self, platform): + pass + + # @abstractclassmethod + # def from_config(cls): + # pass + + class InternalBus(data.StructLayout): """ Describes the layout of Manta's internal bus, such that signals of diff --git a/test/test_logic_analyzer_sim.py b/test/test_logic_analyzer_sim.py index eb240a5..aeb9186 100644 --- a/test/test_logic_analyzer_sim.py +++ b/test/test_logic_analyzer_sim.py @@ -96,5 +96,5 @@ def test_single_shot_capture(): yield from write_register(la, 0, 1) yield from write_register(la, 0, 0) - for addr in range(la.get_max_addr()): + for addr in range(la.max_addr): yield from print_data_at_addr(addr) diff --git a/test/test_mem_core_sim.py b/test/test_mem_core_sim.py index 9618687..222827c 100644 --- a/test/test_mem_core_sim.py +++ b/test/test_mem_core_sim.py @@ -2,15 +2,18 @@ from manta.memory_core import MemoryCore from manta.utils import * from random import randint, sample, choice -class MemoryCoreTests(): + +class MemoryCoreTests: def __init__(self, mem_core): self.mem_core = mem_core self.base_addr = mem_core._base_addr - self.max_addr = mem_core.get_max_addr() + self.max_addr = mem_core.max_addr self.width = self.mem_core._width self.depth = self.mem_core._depth - self.bus_addrs = list(range(self.base_addr, self.max_addr)) # include the endpoint! + self.bus_addrs = list( + range(self.base_addr, self.max_addr) + ) # include the endpoint! self.user_addrs = list(range(self.mem_core._depth)) self.model = {} @@ -86,7 +89,10 @@ class MemoryCoreTests(): data = yield (self.mem_core.user_data_out) if data != expected_data: - raise ValueError(f"Read from {addr} yielded {data} instead of {expected_data}") + raise ValueError( + f"Read from {addr} yielded {data} instead of {expected_data}" + ) + mem_core = MemoryCore( mode="bidirectional", @@ -98,6 +104,7 @@ mem_core = MemoryCore( tests = MemoryCoreTests(mem_core) + @simulate(mem_core) def test_bidirectional_testbench(): yield from tests.check_each_address_on_bus_side_contains_zero() @@ -106,6 +113,7 @@ def test_bidirectional_testbench(): yield from tests.check_multiple_writes_then_multiple_reads() yield from tests.check_random_reads_random_writes_random_orders() + # def test_sweep_core_widths(): # for i in range(1, 64): # verify_mem_core(i, 128, 0) From 08adbd8ede8c89b2dd6e493d75d3ffd5de0e57a3 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Sun, 3 Mar 2024 19:10:06 -0800 Subject: [PATCH 69/89] switch to wiring.Component instead of Elaboratable --- src/manta/ethernet/__init__.py | 4 +++- src/manta/ethernet/sink_bridge.py | 4 +++- src/manta/ethernet/source_bridge.py | 4 +++- src/manta/logic_analyzer/__init__.py | 2 ++ src/manta/logic_analyzer/fsm.py | 5 +++-- src/manta/logic_analyzer/playback.py | 4 +++- src/manta/logic_analyzer/trigger_block.py | 6 ++++-- src/manta/manta.py | 7 ++++--- src/manta/memory_core.py | 2 ++ src/manta/uart/__init__.py | 4 +++- src/manta/uart/receive_bridge.py | 4 +++- src/manta/uart/receiver.py | 4 +++- src/manta/uart/transmit_bridge.py | 4 +++- src/manta/uart/transmitter.py | 4 +++- src/manta/utils.py | 6 ++++-- test/test_io_core_hw.py | 2 +- test/test_logic_analyzer_hw.py | 2 +- test/test_mem_core_hw.py | 2 +- 18 files changed, 49 insertions(+), 21 deletions(-) diff --git a/src/manta/ethernet/__init__.py b/src/manta/ethernet/__init__.py index dc5ca69..cb79c4a 100644 --- a/src/manta/ethernet/__init__.py +++ b/src/manta/ethernet/__init__.py @@ -1,4 +1,6 @@ from amaranth import * +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out from manta.utils import * from manta.ethernet.source_bridge import UDPSourceBridge from manta.ethernet.sink_bridge import UDPSinkBridge @@ -6,7 +8,7 @@ from random import randint import socket -class EthernetInterface(Elaboratable): +class EthernetInterface(wiring.Component): """ A module for communicating with Manta over Ethernet, using UDP. diff --git a/src/manta/ethernet/sink_bridge.py b/src/manta/ethernet/sink_bridge.py index 621d8b9..bec5761 100644 --- a/src/manta/ethernet/sink_bridge.py +++ b/src/manta/ethernet/sink_bridge.py @@ -1,8 +1,10 @@ from amaranth import * +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out from manta.utils import * -class UDPSinkBridge(Elaboratable): +class UDPSinkBridge(wiring.Component): """ A module for bridging Manta's internal bus to an AXI stream of UDP packet data. Connects to the LiteEth core's "sink" port. diff --git a/src/manta/ethernet/source_bridge.py b/src/manta/ethernet/source_bridge.py index 4ed8765..504ddb2 100644 --- a/src/manta/ethernet/source_bridge.py +++ b/src/manta/ethernet/source_bridge.py @@ -1,8 +1,10 @@ from amaranth import * +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out from manta.utils import * -class UDPSourceBridge(Elaboratable): +class UDPSourceBridge(wiring.Component): """ A module for bridging the AXI-stream of incoming UDP packet data to Manta's internal bus. Connects to the LiteEth core's "source" port. diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index 2276a6a..11b9c95 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -1,4 +1,6 @@ from amaranth import * +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out from manta.utils import * from manta.memory_core import MemoryCore from manta.logic_analyzer.trigger_block import LogicAnalyzerTriggerBlock diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index 4853963..26f9aa7 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -1,6 +1,7 @@ from amaranth import * +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out from amaranth.lib.enum import IntEnum -from math import ceil, log2 from manta.io_core import IOCore @@ -18,7 +19,7 @@ class TriggerModes(IntEnum): IMMEDIATE = 2 -class LogicAnalyzerFSM(Elaboratable): +class LogicAnalyzerFSM(wiring.Component): """ A module containing the state machine for a LogicAnalyzerCore. Primarily responsible for controlling the write port of the Logic Analyzer's sample diff --git a/src/manta/logic_analyzer/playback.py b/src/manta/logic_analyzer/playback.py index 5ddb6d9..b4b7175 100644 --- a/src/manta/logic_analyzer/playback.py +++ b/src/manta/logic_analyzer/playback.py @@ -1,7 +1,9 @@ from amaranth import * +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out -class LogicAnalyzerPlayback(Elaboratable): +class LogicAnalyzerPlayback(wiring.Component): """ A synthesizable module that plays back data captured by a LogicAnalyzerCore. Takes a list of all the samples captured by a core, diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 9db01a2..626fc34 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -1,9 +1,11 @@ from amaranth import * +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out from amaranth.lib.enum import IntEnum from manta.io_core import IOCore -class LogicAnalyzerTriggerBlock(Elaboratable): +class LogicAnalyzerTriggerBlock(wiring.Component): """ A module containing an instance of a LogicAnalyzerTrigger for each input probe. The operations and arguments of these LogicAnalyzerTriggers are set @@ -86,7 +88,7 @@ class Operations(IntEnum): NEQ = 9 -class LogicAnalyzerTrigger(Elaboratable): +class LogicAnalyzerTrigger(wiring.Component): """ A module containing a programmable "trigger" for a given input signal, which asserts its output when the programmed "trigger condition" is met. diff --git a/src/manta/manta.py b/src/manta/manta.py index b5ea59e..b2aa899 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -1,13 +1,14 @@ from amaranth import * +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out from manta.uart import UARTInterface - from manta.ethernet import EthernetInterface from manta.io_core import IOCore from manta.memory_core import MemoryCore from manta.logic_analyzer import LogicAnalyzerCore -class Manta(Elaboratable): +class Manta(wiring.Component): def __init__(self, config): # Load config from either a configuration file or a dictionary. # Users primarily use the config file, but the dictionary is @@ -157,7 +158,7 @@ class Manta(Elaboratable): ports = self.interface.get_top_level_ports() for name, instance in self._cores.items(): - ports += instance.get_top_level_ports() + ports += instance.top_level_ports return ports diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index edcbb74..556d142 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -1,4 +1,6 @@ from amaranth import * +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out from manta.utils import * from math import ceil diff --git a/src/manta/uart/__init__.py b/src/manta/uart/__init__.py index 2e38cf4..cf88122 100644 --- a/src/manta/uart/__init__.py +++ b/src/manta/uart/__init__.py @@ -1,4 +1,6 @@ from amaranth import * +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out from manta.utils import * from manta.uart.receiver import UARTReceiver from manta.uart.receive_bridge import ReceiveBridge @@ -7,7 +9,7 @@ from manta.uart.transmit_bridge import TransmitBridge from serial import Serial -class UARTInterface(Elaboratable): +class UARTInterface(wiring.Component): """ A module for communicating with Manta over UART. diff --git a/src/manta/uart/receive_bridge.py b/src/manta/uart/receive_bridge.py index d78c4bd..5d75dfa 100644 --- a/src/manta/uart/receive_bridge.py +++ b/src/manta/uart/receive_bridge.py @@ -1,4 +1,6 @@ from amaranth import * +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out from amaranth.lib.enum import IntEnum from amaranth.lib.data import ArrayLayout @@ -9,7 +11,7 @@ class States(IntEnum): WRITE = 2 -class ReceiveBridge(Elaboratable): +class ReceiveBridge(wiring.Component): """ A module for bridging the stream of bytes from the UARTReceiver module to Manta's internal bus. diff --git a/src/manta/uart/receiver.py b/src/manta/uart/receiver.py index 2fe65df..8c9f918 100644 --- a/src/manta/uart/receiver.py +++ b/src/manta/uart/receiver.py @@ -1,7 +1,9 @@ from amaranth import * +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out -class UARTReceiver(Elaboratable): +class UARTReceiver(wiring.Component): """ A module for receiving bytes on a 8N1 UART at a configurable baudrate. Outputs bytes as a stream. diff --git a/src/manta/uart/transmit_bridge.py b/src/manta/uart/transmit_bridge.py index abb1c82..a288414 100644 --- a/src/manta/uart/transmit_bridge.py +++ b/src/manta/uart/transmit_bridge.py @@ -1,7 +1,9 @@ from amaranth import * +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out -class TransmitBridge(Elaboratable): +class TransmitBridge(wiring.Component): """ A module for bridging Manta's internal bus to the stream of bytes expected by the UARTTransmitter module. diff --git a/src/manta/uart/transmitter.py b/src/manta/uart/transmitter.py index cea5764..c71fd8b 100644 --- a/src/manta/uart/transmitter.py +++ b/src/manta/uart/transmitter.py @@ -1,7 +1,9 @@ from amaranth import * +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out -class UARTTransmitter(Elaboratable): +class UARTTransmitter(wiring.Component): """ A module for transmitting bytes on a 8N1 UART at a configurable baudrate. Accepts bytes as a stream. diff --git a/src/manta/utils.py b/src/manta/utils.py index b9bfba8..7a75ac9 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -1,11 +1,13 @@ from amaranth import * -from amaranth.sim import Simulator from amaranth.lib import data +from amaranth.lib import wiring +from amaranth.lib.wiring import In, Out +from amaranth.sim import Simulator from abc import ABC, abstractmethod import os -class MantaCore(ABC, Elaboratable): +class MantaCore(ABC, wiring.Component): @property @abstractmethod diff --git a/test/test_io_core_hw.py b/test/test_io_core_hw.py index 6715728..25edac1 100644 --- a/test/test_io_core_hw.py +++ b/test/test_io_core_hw.py @@ -7,7 +7,7 @@ import pytest from random import randint -class IOCoreLoopbackTest(Elaboratable): +class IOCoreLoopbackTest(wiring.Component): def __init__(self, platform, port): self.platform = platform self.port = port diff --git a/test/test_logic_analyzer_hw.py b/test/test_logic_analyzer_hw.py index 8a25335..7521c0a 100644 --- a/test/test_logic_analyzer_hw.py +++ b/test/test_logic_analyzer_hw.py @@ -6,7 +6,7 @@ from manta.utils import * import pytest -class LogicAnalyzerCounterTest(Elaboratable): +class LogicAnalyzerCounterTest(wiring.Component): def __init__(self, platform, port): self.platform = platform self.port = port diff --git a/test/test_mem_core_hw.py b/test/test_mem_core_hw.py index 18070ee..185eff1 100644 --- a/test/test_mem_core_hw.py +++ b/test/test_mem_core_hw.py @@ -14,7 +14,7 @@ configuration, or a standard one. """ -class MemoryCoreLoopbackTest(Elaboratable): +class MemoryCoreLoopbackTest(wiring.Component): def __init__(self, platform, width, depth, port): self.platform = platform self.width = width From f83dc59b4e7dc2db9be5342e9584d0f5596487e5 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Mon, 4 Mar 2024 00:17:36 -0800 Subject: [PATCH 70/89] add more MemoryCore tests --- src/manta/utils.py | 26 +++--- test/test_mem_core_hw.py | 2 +- test/test_mem_core_sim.py | 187 +++++++++++++++++++++++++++++++------- test/test_uart_rx_sim.py | 2 +- test/test_uart_tx_sim.py | 2 +- 5 files changed, 168 insertions(+), 51 deletions(-) diff --git a/src/manta/utils.py b/src/manta/utils.py index 7a75ac9..7e9ace4 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -4,6 +4,7 @@ from amaranth.lib import wiring from amaranth.lib.wiring import In, Out from amaranth.sim import Simulator from abc import ABC, abstractmethod +from random import sample import os @@ -140,29 +141,26 @@ def simulate(top): return decorator -# def simulate_decorator(testbench): -# def wrapper_accepting_arguments(top): -# sim = Simulator(top) -# sim.add_clock(1e-6) # 1 MHz -# sim.add_sync_process(testbench) - -# vcd_path = testbench.__name__ + ".vcd" -# with sim.write_vcd(vcd_path): -# sim.run() - -# return wrapper_accepting_arguments +def jumble(iterable): + """ + Returns the provided iterable, but with every element moved to a random + index. Very similar to random.shuffle, but returns an iteratable, instead + of modifying one in-place. + """ + return sample(iterable, len(iterable)) def verify_register(module, addr, expected_data): """ - Read the contents of a register out over a module's bus connection, and verify - that it contains the expected data. + Read the contents of a register out over a module's bus connection, and + verify that it contains the expected data. Unfortunately because Amaranth uses generator functions to define processes, this must be a generator function and thus cannot return a value - it must yield the next timestep. This means that the comparision with the expected value must occur inside this function and not somewhere else, it's not - possible to return a value from here, and compare it in the calling function. + possible to return a value from here, and compare it in the calling + function. """ # Place read transaction on the bus diff --git a/test/test_mem_core_hw.py b/test/test_mem_core_hw.py index 185eff1..7e801ac 100644 --- a/test/test_mem_core_hw.py +++ b/test/test_mem_core_hw.py @@ -104,7 +104,7 @@ class MemoryCoreLoopbackTest(wiring.Component): self.build_and_program() # Read and write randomly from the bus side - for addr in sample(range(self.depth), k=self.depth): + for addr in jumble(range(self.depth)): data = randint(0, 2**self.width - 1) self.write_user_side(addr, data) self.verify_register(addr, data) diff --git a/test/test_mem_core_sim.py b/test/test_mem_core_sim.py index 222827c..0a362fd 100644 --- a/test/test_mem_core_sim.py +++ b/test/test_mem_core_sim.py @@ -1,6 +1,7 @@ from manta.memory_core import MemoryCore from manta.utils import * -from random import randint, sample, choice +from random import randint, choice +from math import ceil class MemoryCoreTests: @@ -10,6 +11,8 @@ class MemoryCoreTests: self.max_addr = mem_core.max_addr self.width = self.mem_core._width self.depth = self.mem_core._depth + self.n_full = self.width // 16 + self.n_mems = ceil(self.width / 16) self.bus_addrs = list( range(self.base_addr, self.max_addr) @@ -17,43 +20,38 @@ class MemoryCoreTests: self.user_addrs = list(range(self.mem_core._depth)) self.model = {} - def check_each_address_on_bus_side_contains_zero(self): + def bus_addrs_all_zero(self): for addr in self.bus_addrs: yield from self.verify_bus_side(addr, 0) - def check_each_address_on_user_side_contains_zero(self): + def user_addrs_all_zero(self): for addr in self.user_addrs: yield from self.verify_user_side(addr, 0) - def check_write_then_immediately_read_bus_side(self): + def one_bus_write_then_one_bus_read(self): for addr in self.bus_addrs: - # this part is a little hard to check since we might have a - # memory at the end of the address space that's less than - # 16-bits wide. so we'll have to calculate how wide our - # memory is - data_width = self.get_data_width(addr) data = randint(0, (2**data_width) - 1) yield from self.write_bus_side(addr, data) yield from self.verify_bus_side(addr, data) - def check_multiple_writes_then_multiple_reads(self): + def multi_bus_writes_then_multi_bus_reads(self): # write-write-write then read-read-read - for addr in sample(self.bus_addrs, len(self.bus_addrs)): + for addr in jumble(self.bus_addrs): data_width = self.get_data_width(addr) data = randint(0, (2**data_width) - 1) self.model[addr] = data yield from self.write_bus_side(addr, data) - for addr in sample(self.bus_addrs, len(self.bus_addrs)): + for addr in jumble(self.bus_addrs): yield from self.verify_bus_side(addr, self.model[addr]) - def check_random_reads_random_writes_random_orders(self): + def rand_bus_reads_writes(self): # random reads and writes in random orders for _ in range(5): - for addr in sample(self.bus_addrs, len(self.bus_addrs)): + for addr in jumble(self.bus_addrs): operation = choice(["read", "write"]) if operation == "read": @@ -65,9 +63,69 @@ class MemoryCoreTests: self.model[addr] = data yield from self.write_bus_side(addr, data) + def one_user_write_then_one_bus_read(self): + for user_addr in self.user_addrs: + # write to user side + data = randint(0, (2**self.width) - 1) + yield from self.write_user_side(user_addr, data) + + # verify contents when read out from the bus + words = value_to_words(data, self.n_mems) + for i, word in enumerate(words): + bus_addr = self.base_addr + user_addr + (i * self.depth) + yield from self.verify_bus_side(bus_addr, word) + + def multi_user_write_then_multi_bus_reads(self): + # write-write-write then read-read-read + for user_addr in jumble(self.user_addrs): + + # write a random number to the user side + data = randint(0, (2**self.width) - 1) + yield from self.write_user_side(user_addr, data) + + # convert value to words, and save to self.model + words = value_to_words(data, self.n_mems) + for i, word in enumerate(words): + bus_addr = self.base_addr + user_addr + (i * self.depth) + self.model[bus_addr] = word + + # read out every bus_addr in random order + for bus_addr in jumble(self.bus_addrs): + yield from self.verify_bus_side(bus_addr, self.model[bus_addr]) + + def rand_bus_reads_rand_user_writes(self): + # random reads and writes in random orders + for _ in range(5): + for user_addr in jumble(self.user_addrs): + bus_addrs = [ + self.base_addr + user_addr + (i * self.depth) + for i in range(self.n_mems) + ] + + operation = choice(["read", "write"]) + + # read from bus side + if operation == "read": + for bus_addr in bus_addrs: + yield from self.verify_bus_side(bus_addr, self.model[bus_addr]) + + # write to user side + elif operation == "write": + data = randint(0, (2**self.width) - 1) + yield from self.write_user_side(user_addr, data) + + # save words just written to self.model + words = value_to_words(data, self.n_mems) + for addr, word in zip(bus_addrs, words): + self.model[addr] = word + def get_data_width(self, addr): - n_full = self.width // 16 - if addr < self.base_addr + (n_full * self.depth): + # this part is a little hard to check since we might have a + # memory at the end of the address space that's less than + # 16-bits wide. so we'll have to calculate how wide our + # memory is + + if addr < self.base_addr + (self.n_full * self.depth): return 16 else: return self.width % 16 @@ -84,7 +142,6 @@ class MemoryCoreTests: def verify_user_side(self, addr, expected_data): yield self.mem_core.user_addr.eq(addr) - yield self.mem_core.user_write_enable.eq(0) yield data = yield (self.mem_core.user_data_out) @@ -93,25 +150,87 @@ class MemoryCoreTests: f"Read from {addr} yielded {data} instead of {expected_data}" ) - -mem_core = MemoryCore( - mode="bidirectional", - width=23, - depth=512, - base_addr=0, - interface=None, -) - -tests = MemoryCoreTests(mem_core) + def write_user_side(self, addr, data): + yield self.mem_core.user_addr.eq(addr) + yield self.mem_core.user_data_in.eq(data) + yield self.mem_core.user_write_enable.eq(1) + yield + yield self.mem_core.user_addr.eq(0) + yield self.mem_core.user_data_in.eq(0) + yield self.mem_core.user_write_enable.eq(0) -@simulate(mem_core) -def test_bidirectional_testbench(): - yield from tests.check_each_address_on_bus_side_contains_zero() - yield from tests.check_each_address_on_user_side_contains_zero() - yield from tests.check_write_then_immediately_read_bus_side() - yield from tests.check_multiple_writes_then_multiple_reads() - yield from tests.check_random_reads_random_writes_random_orders() +def test_bidirectional(): + mem_core = MemoryCore( + mode="bidirectional", + width=23, + depth=512, + base_addr=0, + interface=None, + ) + + tests = MemoryCoreTests(mem_core) + + @simulate(mem_core) + def test_bidirectional_testbench(): + yield from tests.bus_addrs_all_zero() + + # Test Bus -> Bus functionality + yield from tests.user_addrs_all_zero() + yield from tests.one_bus_write_then_one_bus_read() + yield from tests.multi_bus_writes_then_multi_bus_reads() + yield from tests.rand_bus_reads_writes() + + # Test User -> Bus functionality + yield from tests.one_user_write_then_one_bus_read() + yield from tests.multi_user_write_then_multi_bus_reads() + yield from tests.rand_bus_reads_rand_user_writes() + + test_bidirectional_testbench() + + +def test_fpga_to_host(): + mem_core = MemoryCore( + mode="fpga_to_host", + width=23, + depth=512, + base_addr=0, + interface=None, + ) + + tests = MemoryCoreTests(mem_core) + + @simulate(mem_core) + def test_fpga_to_host_testbench(): + yield from tests.bus_addrs_all_zero() + + # Test User -> Bus functionality + yield from tests.one_user_write_then_one_bus_read() + yield from tests.multi_user_write_then_multi_bus_reads() + yield from tests.rand_bus_reads_rand_user_writes() + + test_fpga_to_host_testbench() + + +def test_host_to_fpga(): + mem_core = MemoryCore( + mode="host_to_fpga", + width=23, + depth=512, + base_addr=0, + interface=None, + ) + + tests = MemoryCoreTests(mem_core) + + @simulate(mem_core) + def test_host_to_fpga_testbench(): + yield from tests.user_addrs_all_zero() + # yield from tests.one_user_write_then_one_bus_read() + # yield from tests.multi_user_write_then_multi_bus_reads() + # yield from tests.rand_bus_reads_rand_user_writes() + + test_host_to_fpga_testbench() # def test_sweep_core_widths(): diff --git a/test/test_uart_rx_sim.py b/test/test_uart_rx_sim.py index 23c9f43..111ce09 100644 --- a/test/test_uart_rx_sim.py +++ b/test/test_uart_rx_sim.py @@ -57,5 +57,5 @@ def test_bytes_random_sample(): yield uart_rx.rx.eq(1) yield - for i in sample(range(0xFF), k=0xFF): + for i in jumble(range(0xFF)): yield from verify_receive(i) diff --git a/test/test_uart_tx_sim.py b/test/test_uart_tx_sim.py index 63bd373..1176cfc 100644 --- a/test/test_uart_tx_sim.py +++ b/test/test_uart_tx_sim.py @@ -49,5 +49,5 @@ def test_all_possible_bytes(): @simulate(uart_tx) def test_bytes_random_sample(): - for i in sample(range(0xFF), k=0xFF): + for i in jumble(range(0xFF)): yield from verify_bit_sequence(i) From 5531277c996d68874c49a34285459ed9e9f646bd Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Mon, 4 Mar 2024 00:43:54 -0800 Subject: [PATCH 71/89] even more MemoryCore tests --- test/test_mem_core_sim.py | 56 ++++++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/test/test_mem_core_sim.py b/test/test_mem_core_sim.py index 0a362fd..5e52131 100644 --- a/test/test_mem_core_sim.py +++ b/test/test_mem_core_sim.py @@ -28,6 +28,7 @@ class MemoryCoreTests: for addr in self.user_addrs: yield from self.verify_user_side(addr, 0) + def one_bus_write_then_one_bus_read(self): for addr in self.bus_addrs: data_width = self.get_data_width(addr) @@ -48,7 +49,7 @@ class MemoryCoreTests: for addr in jumble(self.bus_addrs): yield from self.verify_bus_side(addr, self.model[addr]) - def rand_bus_reads_writes(self): + def rand_bus_writes_rand_bus_reads(self): # random reads and writes in random orders for _ in range(5): for addr in jumble(self.bus_addrs): @@ -63,6 +64,7 @@ class MemoryCoreTests: self.model[addr] = data yield from self.write_bus_side(addr, data) + def one_user_write_then_one_bus_read(self): for user_addr in self.user_addrs: # write to user side @@ -93,7 +95,7 @@ class MemoryCoreTests: for bus_addr in jumble(self.bus_addrs): yield from self.verify_bus_side(bus_addr, self.model[bus_addr]) - def rand_bus_reads_rand_user_writes(self): + def rand_user_writes_rand_bus_reads(self): # random reads and writes in random orders for _ in range(5): for user_addr in jumble(self.user_addrs): @@ -119,6 +121,30 @@ class MemoryCoreTests: for addr, word in zip(bus_addrs, words): self.model[addr] = word + + def one_bus_write_then_one_user_read(self): + yield + + def multi_bus_write_then_multi_user_reads(self): + yield + + def rand_bus_writes_rand_user_reads(self): + yield + + + def one_user_write_then_one_user_read(self): + for addr in self.user_addrs: + data = randint(0, (2**self.width) - 1) + + yield from self.write_user_side(addr, data) + yield from self.verify_user_side(addr, data) + + def multi_user_write_then_multi_user_read(self): + yield + + def rand_user_write_rand_user_read(self): + yield + def get_data_width(self, addr): # this part is a little hard to check since we might have a # memory at the end of the address space that's less than @@ -174,17 +200,27 @@ def test_bidirectional(): @simulate(mem_core) def test_bidirectional_testbench(): yield from tests.bus_addrs_all_zero() + yield from tests.user_addrs_all_zero() # Test Bus -> Bus functionality - yield from tests.user_addrs_all_zero() yield from tests.one_bus_write_then_one_bus_read() yield from tests.multi_bus_writes_then_multi_bus_reads() - yield from tests.rand_bus_reads_writes() + yield from tests.rand_bus_writes_rand_bus_reads() # Test User -> Bus functionality yield from tests.one_user_write_then_one_bus_read() yield from tests.multi_user_write_then_multi_bus_reads() - yield from tests.rand_bus_reads_rand_user_writes() + yield from tests.rand_user_writes_rand_bus_reads() + + # Test Bus -> User functionality + yield from tests.one_bus_write_then_one_user_read() + yield from tests.multi_bus_write_then_multi_user_reads() + yield from tests.rand_bus_writes_rand_user_reads() + + # Test User -> User functionality + yield from tests.one_user_write_then_one_user_read() + yield from tests.multi_user_write_then_multi_user_read() + yield from tests.rand_user_write_rand_user_read() test_bidirectional_testbench() @@ -207,7 +243,7 @@ def test_fpga_to_host(): # Test User -> Bus functionality yield from tests.one_user_write_then_one_bus_read() yield from tests.multi_user_write_then_multi_bus_reads() - yield from tests.rand_bus_reads_rand_user_writes() + yield from tests.rand_user_writes_rand_bus_reads() test_fpga_to_host_testbench() @@ -226,9 +262,11 @@ def test_host_to_fpga(): @simulate(mem_core) def test_host_to_fpga_testbench(): yield from tests.user_addrs_all_zero() - # yield from tests.one_user_write_then_one_bus_read() - # yield from tests.multi_user_write_then_multi_bus_reads() - # yield from tests.rand_bus_reads_rand_user_writes() + + # Test Bus -> User functionality + yield from tests.one_bus_write_then_one_user_read() + yield from tests.multi_bus_write_then_multi_user_reads() + yield from tests.rand_bus_writes_rand_user_reads() test_host_to_fpga_testbench() From b00e4d0e60b5ff63f282da811a2546df14c0badb Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Mon, 4 Mar 2024 01:18:31 -0800 Subject: [PATCH 72/89] revert wiring.Component instead of Elaboratable --- src/manta/ethernet/__init__.py | 4 +--- src/manta/ethernet/sink_bridge.py | 4 +--- src/manta/ethernet/source_bridge.py | 4 +--- src/manta/logic_analyzer/__init__.py | 2 -- src/manta/logic_analyzer/fsm.py | 4 +--- src/manta/logic_analyzer/playback.py | 4 +--- src/manta/logic_analyzer/trigger_block.py | 6 ++---- src/manta/manta.py | 4 +--- src/manta/memory_core.py | 2 -- src/manta/uart/__init__.py | 4 +--- src/manta/uart/receive_bridge.py | 4 +--- src/manta/uart/receiver.py | 4 +--- src/manta/uart/transmit_bridge.py | 4 +--- src/manta/uart/transmitter.py | 4 +--- src/manta/utils.py | 4 +--- test/test_io_core_hw.py | 2 +- test/test_logic_analyzer_hw.py | 2 +- test/test_mem_core_hw.py | 2 +- test/test_mem_core_sim.py | 4 ---- 19 files changed, 17 insertions(+), 51 deletions(-) diff --git a/src/manta/ethernet/__init__.py b/src/manta/ethernet/__init__.py index cb79c4a..dc5ca69 100644 --- a/src/manta/ethernet/__init__.py +++ b/src/manta/ethernet/__init__.py @@ -1,6 +1,4 @@ from amaranth import * -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out from manta.utils import * from manta.ethernet.source_bridge import UDPSourceBridge from manta.ethernet.sink_bridge import UDPSinkBridge @@ -8,7 +6,7 @@ from random import randint import socket -class EthernetInterface(wiring.Component): +class EthernetInterface(Elaboratable): """ A module for communicating with Manta over Ethernet, using UDP. diff --git a/src/manta/ethernet/sink_bridge.py b/src/manta/ethernet/sink_bridge.py index bec5761..621d8b9 100644 --- a/src/manta/ethernet/sink_bridge.py +++ b/src/manta/ethernet/sink_bridge.py @@ -1,10 +1,8 @@ from amaranth import * -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out from manta.utils import * -class UDPSinkBridge(wiring.Component): +class UDPSinkBridge(Elaboratable): """ A module for bridging Manta's internal bus to an AXI stream of UDP packet data. Connects to the LiteEth core's "sink" port. diff --git a/src/manta/ethernet/source_bridge.py b/src/manta/ethernet/source_bridge.py index 504ddb2..4ed8765 100644 --- a/src/manta/ethernet/source_bridge.py +++ b/src/manta/ethernet/source_bridge.py @@ -1,10 +1,8 @@ from amaranth import * -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out from manta.utils import * -class UDPSourceBridge(wiring.Component): +class UDPSourceBridge(Elaboratable): """ A module for bridging the AXI-stream of incoming UDP packet data to Manta's internal bus. Connects to the LiteEth core's "source" port. diff --git a/src/manta/logic_analyzer/__init__.py b/src/manta/logic_analyzer/__init__.py index 11b9c95..2276a6a 100644 --- a/src/manta/logic_analyzer/__init__.py +++ b/src/manta/logic_analyzer/__init__.py @@ -1,6 +1,4 @@ from amaranth import * -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out from manta.utils import * from manta.memory_core import MemoryCore from manta.logic_analyzer.trigger_block import LogicAnalyzerTriggerBlock diff --git a/src/manta/logic_analyzer/fsm.py b/src/manta/logic_analyzer/fsm.py index 26f9aa7..5eebb31 100644 --- a/src/manta/logic_analyzer/fsm.py +++ b/src/manta/logic_analyzer/fsm.py @@ -1,6 +1,4 @@ from amaranth import * -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out from amaranth.lib.enum import IntEnum from manta.io_core import IOCore @@ -19,7 +17,7 @@ class TriggerModes(IntEnum): IMMEDIATE = 2 -class LogicAnalyzerFSM(wiring.Component): +class LogicAnalyzerFSM(Elaboratable): """ A module containing the state machine for a LogicAnalyzerCore. Primarily responsible for controlling the write port of the Logic Analyzer's sample diff --git a/src/manta/logic_analyzer/playback.py b/src/manta/logic_analyzer/playback.py index b4b7175..5ddb6d9 100644 --- a/src/manta/logic_analyzer/playback.py +++ b/src/manta/logic_analyzer/playback.py @@ -1,9 +1,7 @@ from amaranth import * -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out -class LogicAnalyzerPlayback(wiring.Component): +class LogicAnalyzerPlayback(Elaboratable): """ A synthesizable module that plays back data captured by a LogicAnalyzerCore. Takes a list of all the samples captured by a core, diff --git a/src/manta/logic_analyzer/trigger_block.py b/src/manta/logic_analyzer/trigger_block.py index 626fc34..9db01a2 100644 --- a/src/manta/logic_analyzer/trigger_block.py +++ b/src/manta/logic_analyzer/trigger_block.py @@ -1,11 +1,9 @@ from amaranth import * -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out from amaranth.lib.enum import IntEnum from manta.io_core import IOCore -class LogicAnalyzerTriggerBlock(wiring.Component): +class LogicAnalyzerTriggerBlock(Elaboratable): """ A module containing an instance of a LogicAnalyzerTrigger for each input probe. The operations and arguments of these LogicAnalyzerTriggers are set @@ -88,7 +86,7 @@ class Operations(IntEnum): NEQ = 9 -class LogicAnalyzerTrigger(wiring.Component): +class LogicAnalyzerTrigger(Elaboratable): """ A module containing a programmable "trigger" for a given input signal, which asserts its output when the programmed "trigger condition" is met. diff --git a/src/manta/manta.py b/src/manta/manta.py index b2aa899..2cd4868 100644 --- a/src/manta/manta.py +++ b/src/manta/manta.py @@ -1,6 +1,4 @@ from amaranth import * -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out from manta.uart import UARTInterface from manta.ethernet import EthernetInterface from manta.io_core import IOCore @@ -8,7 +6,7 @@ from manta.memory_core import MemoryCore from manta.logic_analyzer import LogicAnalyzerCore -class Manta(wiring.Component): +class Manta(Elaboratable): def __init__(self, config): # Load config from either a configuration file or a dictionary. # Users primarily use the config file, but the dictionary is diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index 556d142..edcbb74 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -1,6 +1,4 @@ from amaranth import * -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out from manta.utils import * from math import ceil diff --git a/src/manta/uart/__init__.py b/src/manta/uart/__init__.py index cf88122..2e38cf4 100644 --- a/src/manta/uart/__init__.py +++ b/src/manta/uart/__init__.py @@ -1,6 +1,4 @@ from amaranth import * -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out from manta.utils import * from manta.uart.receiver import UARTReceiver from manta.uart.receive_bridge import ReceiveBridge @@ -9,7 +7,7 @@ from manta.uart.transmit_bridge import TransmitBridge from serial import Serial -class UARTInterface(wiring.Component): +class UARTInterface(Elaboratable): """ A module for communicating with Manta over UART. diff --git a/src/manta/uart/receive_bridge.py b/src/manta/uart/receive_bridge.py index 5d75dfa..d78c4bd 100644 --- a/src/manta/uart/receive_bridge.py +++ b/src/manta/uart/receive_bridge.py @@ -1,6 +1,4 @@ from amaranth import * -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out from amaranth.lib.enum import IntEnum from amaranth.lib.data import ArrayLayout @@ -11,7 +9,7 @@ class States(IntEnum): WRITE = 2 -class ReceiveBridge(wiring.Component): +class ReceiveBridge(Elaboratable): """ A module for bridging the stream of bytes from the UARTReceiver module to Manta's internal bus. diff --git a/src/manta/uart/receiver.py b/src/manta/uart/receiver.py index 8c9f918..2fe65df 100644 --- a/src/manta/uart/receiver.py +++ b/src/manta/uart/receiver.py @@ -1,9 +1,7 @@ from amaranth import * -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out -class UARTReceiver(wiring.Component): +class UARTReceiver(Elaboratable): """ A module for receiving bytes on a 8N1 UART at a configurable baudrate. Outputs bytes as a stream. diff --git a/src/manta/uart/transmit_bridge.py b/src/manta/uart/transmit_bridge.py index a288414..abb1c82 100644 --- a/src/manta/uart/transmit_bridge.py +++ b/src/manta/uart/transmit_bridge.py @@ -1,9 +1,7 @@ from amaranth import * -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out -class TransmitBridge(wiring.Component): +class TransmitBridge(Elaboratable): """ A module for bridging Manta's internal bus to the stream of bytes expected by the UARTTransmitter module. diff --git a/src/manta/uart/transmitter.py b/src/manta/uart/transmitter.py index c71fd8b..cea5764 100644 --- a/src/manta/uart/transmitter.py +++ b/src/manta/uart/transmitter.py @@ -1,9 +1,7 @@ from amaranth import * -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out -class UARTTransmitter(wiring.Component): +class UARTTransmitter(Elaboratable): """ A module for transmitting bytes on a 8N1 UART at a configurable baudrate. Accepts bytes as a stream. diff --git a/src/manta/utils.py b/src/manta/utils.py index 7e9ace4..fdee740 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -1,14 +1,12 @@ from amaranth import * from amaranth.lib import data -from amaranth.lib import wiring -from amaranth.lib.wiring import In, Out from amaranth.sim import Simulator from abc import ABC, abstractmethod from random import sample import os -class MantaCore(ABC, wiring.Component): +class MantaCore(ABC, Elaboratable): @property @abstractmethod diff --git a/test/test_io_core_hw.py b/test/test_io_core_hw.py index 25edac1..6715728 100644 --- a/test/test_io_core_hw.py +++ b/test/test_io_core_hw.py @@ -7,7 +7,7 @@ import pytest from random import randint -class IOCoreLoopbackTest(wiring.Component): +class IOCoreLoopbackTest(Elaboratable): def __init__(self, platform, port): self.platform = platform self.port = port diff --git a/test/test_logic_analyzer_hw.py b/test/test_logic_analyzer_hw.py index 7521c0a..8a25335 100644 --- a/test/test_logic_analyzer_hw.py +++ b/test/test_logic_analyzer_hw.py @@ -6,7 +6,7 @@ from manta.utils import * import pytest -class LogicAnalyzerCounterTest(wiring.Component): +class LogicAnalyzerCounterTest(Elaboratable): def __init__(self, platform, port): self.platform = platform self.port = port diff --git a/test/test_mem_core_hw.py b/test/test_mem_core_hw.py index 7e801ac..27c1208 100644 --- a/test/test_mem_core_hw.py +++ b/test/test_mem_core_hw.py @@ -14,7 +14,7 @@ configuration, or a standard one. """ -class MemoryCoreLoopbackTest(wiring.Component): +class MemoryCoreLoopbackTest(Elaboratable): def __init__(self, platform, width, depth, port): self.platform = platform self.width = width diff --git a/test/test_mem_core_sim.py b/test/test_mem_core_sim.py index 5e52131..659eef3 100644 --- a/test/test_mem_core_sim.py +++ b/test/test_mem_core_sim.py @@ -28,7 +28,6 @@ class MemoryCoreTests: for addr in self.user_addrs: yield from self.verify_user_side(addr, 0) - def one_bus_write_then_one_bus_read(self): for addr in self.bus_addrs: data_width = self.get_data_width(addr) @@ -64,7 +63,6 @@ class MemoryCoreTests: self.model[addr] = data yield from self.write_bus_side(addr, data) - def one_user_write_then_one_bus_read(self): for user_addr in self.user_addrs: # write to user side @@ -121,7 +119,6 @@ class MemoryCoreTests: for addr, word in zip(bus_addrs, words): self.model[addr] = word - def one_bus_write_then_one_user_read(self): yield @@ -131,7 +128,6 @@ class MemoryCoreTests: def rand_bus_writes_rand_user_reads(self): yield - def one_user_write_then_one_user_read(self): for addr in self.user_addrs: data = randint(0, (2**self.width) - 1) From fd22c9a9f4d74964afaab36cfad52ac8d65cfe6a Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Tue, 5 Mar 2024 22:44:36 -0800 Subject: [PATCH 73/89] finish memory core test class --- test/test_mem_core_sim.py | 107 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 102 insertions(+), 5 deletions(-) diff --git a/test/test_mem_core_sim.py b/test/test_mem_core_sim.py index 659eef3..da97fcd 100644 --- a/test/test_mem_core_sim.py +++ b/test/test_mem_core_sim.py @@ -120,13 +120,61 @@ class MemoryCoreTests: self.model[addr] = word def one_bus_write_then_one_user_read(self): - yield + for user_addr in self.user_addrs: + # Try and set the value at the user address to a given value, + # by writing to the appropriate memory locaitons on the bus side + data = randint(0, (2**self.width) - 1) + + words = value_to_words(data, self.n_mems) + + for i, word in enumerate(words): + bus_addr = self.base_addr + user_addr + (i * self.depth) + yield from self.write_bus_side(bus_addr, word) + + yield from self.verify_user_side(user_addr, data) def multi_bus_write_then_multi_user_reads(self): - yield + # write-write-write then read-read-read + for bus_addr in jumble(self.bus_addrs): + data_width = self.get_data_width(bus_addr) + data = randint(0, (2**data_width) - 1) + + self.model[bus_addr] = data + yield from self.write_bus_side(bus_addr, data) + + for user_addr in jumble(self.user_addrs): + bus_addrs = [ + self.base_addr + user_addr + (i * self.depth) + for i in range(self.n_mems) + ] + + value = words_to_value([self.model[addr] for addr in bus_addrs]) + yield from self.verify_user_side(user_addr, value) def rand_bus_writes_rand_user_reads(self): - yield + for _ in range(5 * self.depth): + operation = choice(["read", "write"]) + + # write random data to random bus address + if operation == "write": + bus_addr = randint(self.base_addr, self.max_addr - 1) + data_width = self.get_data_width(bus_addr) + data = randint(0, (2**data_width) - 1) + self.model[bus_addr] = data + + yield from self.write_bus_side(bus_addr, data) + + # read from random user_addr + if operation == "read": + user_addr = randint(0, self.depth - 1) + bus_addrs = [ + self.base_addr + user_addr + (i * self.depth) + for i in range(self.n_mems) + ] + + value = words_to_value([self.model[addr] for addr in bus_addrs]) + + yield from self.verify_user_side(user_addr, value) def one_user_write_then_one_user_read(self): for addr in self.user_addrs: @@ -136,10 +184,58 @@ class MemoryCoreTests: yield from self.verify_user_side(addr, data) def multi_user_write_then_multi_user_read(self): - yield + # write-write-write then read-read-read + for user_addr in jumble(self.user_addrs): + data = randint(0, (2**self.width) - 1) + + bus_addrs = [ + self.base_addr + user_addr + (i * self.depth) + for i in range(self.n_mems) + ] + + words = value_to_words(data, self.n_mems) + for addr, word in zip(bus_addrs, words): + self.model[addr] = word + + yield from self.write_user_side(addr, data) + + for user_addr in jumble(self.user_addrs): + bus_addrs = [ + self.base_addr + user_addr + (i * self.depth) + for i in range(self.n_mems) + ] + + value = words_to_value([self.model[addr] for addr in bus_addrs]) + + yield from self.verify_user_side(user_addr, value) def rand_user_write_rand_user_read(self): - yield + # random reads and writes in random orders + for _ in range(5): + for user_addr in jumble(self.user_addrs): + + operation = choice(["read", "write"]) + if operation == "read": + bus_addrs = [ + self.base_addr + user_addr + (i * self.depth) + for i in range(self.n_mems) + ] + + value = words_to_value([self.model[addr] for addr in bus_addrs]) + + yield from self.verify_user_side(user_addr, value) + + elif operation == "write": + data = randint(0, (2**self.width) - 1) + yield from self.write_user_side(user_addr, data) + + words = value_to_words(data, self.n_mems) + bus_addrs = [ + self.base_addr + user_addr + (i * self.depth) + for i in range(self.n_mems) + ] + for addr, word in zip(bus_addrs, words): + self.model[addr] = word def get_data_width(self, addr): # this part is a little hard to check since we might have a @@ -165,6 +261,7 @@ class MemoryCoreTests: def verify_user_side(self, addr, expected_data): yield self.mem_core.user_addr.eq(addr) yield + yield data = yield (self.mem_core.user_data_out) if data != expected_data: From c1935bcb11ef4f5fc812ccb53e03bf5be9dcee3e Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Tue, 5 Mar 2024 23:59:42 -0800 Subject: [PATCH 74/89] add random memory core tests --- test/test_mem_core_sim.py | 173 +++++++++++++++++++++----------------- 1 file changed, 94 insertions(+), 79 deletions(-) diff --git a/test/test_mem_core_sim.py b/test/test_mem_core_sim.py index da97fcd..29bd73d 100644 --- a/test/test_mem_core_sim.py +++ b/test/test_mem_core_sim.py @@ -20,6 +20,7 @@ class MemoryCoreTests: self.user_addrs = list(range(self.mem_core._depth)) self.model = {} + def bus_addrs_all_zero(self): for addr in self.bus_addrs: yield from self.verify_bus_side(addr, 0) @@ -28,9 +29,29 @@ class MemoryCoreTests: for addr in self.user_addrs: yield from self.verify_user_side(addr, 0) + def bus_to_bus_functionality(self): + yield from self.one_bus_write_then_one_bus_read() + yield from self.multi_bus_writes_then_multi_bus_reads() + yield from self.rand_bus_writes_rand_bus_reads() + + def user_to_bus_functionality(self): + yield from self.one_user_write_then_one_bus_read() + yield from self.multi_user_write_then_multi_bus_reads() + yield from self.rand_user_writes_rand_bus_reads() + + def bus_to_user_functionality(self): + yield from self.one_bus_write_then_one_user_read() + yield from self.multi_bus_write_then_multi_user_reads() + yield from self.rand_bus_writes_rand_user_reads() + + def user_to_user_functionality(self): + yield from self.one_user_write_then_one_user_read() + yield from self.multi_user_write_then_multi_user_read() + yield from self.rand_user_write_rand_user_read() + def one_bus_write_then_one_bus_read(self): for addr in self.bus_addrs: - data_width = self.get_data_width(addr) + data_width = self._get_data_width(addr) data = randint(0, (2**data_width) - 1) yield from self.write_bus_side(addr, data) @@ -39,7 +60,7 @@ class MemoryCoreTests: def multi_bus_writes_then_multi_bus_reads(self): # write-write-write then read-read-read for addr in jumble(self.bus_addrs): - data_width = self.get_data_width(addr) + data_width = self._get_data_width(addr) data = randint(0, (2**data_width) - 1) self.model[addr] = data @@ -58,7 +79,7 @@ class MemoryCoreTests: yield from self.verify_bus_side(addr, self.model[addr]) elif operation == "write": - data_width = self.get_data_width(addr) + data_width = self._get_data_width(addr) data = randint(0, (2**data_width) - 1) self.model[addr] = data yield from self.write_bus_side(addr, data) @@ -136,7 +157,7 @@ class MemoryCoreTests: def multi_bus_write_then_multi_user_reads(self): # write-write-write then read-read-read for bus_addr in jumble(self.bus_addrs): - data_width = self.get_data_width(bus_addr) + data_width = self._get_data_width(bus_addr) data = randint(0, (2**data_width) - 1) self.model[bus_addr] = data @@ -158,7 +179,7 @@ class MemoryCoreTests: # write random data to random bus address if operation == "write": bus_addr = randint(self.base_addr, self.max_addr - 1) - data_width = self.get_data_width(bus_addr) + data_width = self._get_data_width(bus_addr) data = randint(0, (2**data_width) - 1) self.model[bus_addr] = data @@ -185,29 +206,14 @@ class MemoryCoreTests: def multi_user_write_then_multi_user_read(self): # write-write-write then read-read-read + self.foo = {} for user_addr in jumble(self.user_addrs): data = randint(0, (2**self.width) - 1) - - bus_addrs = [ - self.base_addr + user_addr + (i * self.depth) - for i in range(self.n_mems) - ] - - words = value_to_words(data, self.n_mems) - for addr, word in zip(bus_addrs, words): - self.model[addr] = word - - yield from self.write_user_side(addr, data) + self.foo[user_addr] = data + yield from self.write_user_side(user_addr, data) for user_addr in jumble(self.user_addrs): - bus_addrs = [ - self.base_addr + user_addr + (i * self.depth) - for i in range(self.n_mems) - ] - - value = words_to_value([self.model[addr] for addr in bus_addrs]) - - yield from self.verify_user_side(user_addr, value) + yield from self.verify_user_side(user_addr, self.foo[user_addr]) def rand_user_write_rand_user_read(self): # random reads and writes in random orders @@ -216,28 +222,14 @@ class MemoryCoreTests: operation = choice(["read", "write"]) if operation == "read": - bus_addrs = [ - self.base_addr + user_addr + (i * self.depth) - for i in range(self.n_mems) - ] - - value = words_to_value([self.model[addr] for addr in bus_addrs]) - - yield from self.verify_user_side(user_addr, value) + yield from self.verify_user_side(user_addr, self.foo[user_addr]) elif operation == "write": data = randint(0, (2**self.width) - 1) + self.foo[user_addr] = data yield from self.write_user_side(user_addr, data) - words = value_to_words(data, self.n_mems) - bus_addrs = [ - self.base_addr + user_addr + (i * self.depth) - for i in range(self.n_mems) - ] - for addr, word in zip(bus_addrs, words): - self.model[addr] = word - - def get_data_width(self, addr): + def _get_data_width(self, addr): # this part is a little hard to check since we might have a # memory at the end of the address space that's less than # 16-bits wide. so we'll have to calculate how wide our @@ -295,28 +287,36 @@ def test_bidirectional(): yield from tests.bus_addrs_all_zero() yield from tests.user_addrs_all_zero() - # Test Bus -> Bus functionality - yield from tests.one_bus_write_then_one_bus_read() - yield from tests.multi_bus_writes_then_multi_bus_reads() - yield from tests.rand_bus_writes_rand_bus_reads() - - # Test User -> Bus functionality - yield from tests.one_user_write_then_one_bus_read() - yield from tests.multi_user_write_then_multi_bus_reads() - yield from tests.rand_user_writes_rand_bus_reads() - - # Test Bus -> User functionality - yield from tests.one_bus_write_then_one_user_read() - yield from tests.multi_bus_write_then_multi_user_reads() - yield from tests.rand_bus_writes_rand_user_reads() - - # Test User -> User functionality - yield from tests.one_user_write_then_one_user_read() - yield from tests.multi_user_write_then_multi_user_read() - yield from tests.rand_user_write_rand_user_read() + yield from tests.bus_to_bus_functionality() + yield from tests.user_to_bus_functionality() + yield from tests.bus_to_user_functionality() + yield from tests.user_to_user_functionality() test_bidirectional_testbench() +def test_bidirectional_random(): + mem_core = MemoryCore( + mode="bidirectional", + width=randint(0, 128), + depth=randint(0, 2048), + base_addr=randint(0, 32678), + interface=None, + ) + + tests = MemoryCoreTests(mem_core) + + @simulate(mem_core) + def test_bidirectional_random_testbench(): + yield from tests.bus_addrs_all_zero() + yield from tests.user_addrs_all_zero() + + yield from tests.bus_to_bus_functionality() + yield from tests.user_to_bus_functionality() + yield from tests.bus_to_user_functionality() + yield from tests.user_to_user_functionality() + + test_bidirectional_random_testbench() + def test_fpga_to_host(): mem_core = MemoryCore( @@ -332,14 +332,28 @@ def test_fpga_to_host(): @simulate(mem_core) def test_fpga_to_host_testbench(): yield from tests.bus_addrs_all_zero() - - # Test User -> Bus functionality - yield from tests.one_user_write_then_one_bus_read() - yield from tests.multi_user_write_then_multi_bus_reads() - yield from tests.rand_user_writes_rand_bus_reads() + yield from tests.user_to_bus_functionality() test_fpga_to_host_testbench() +def test_fpga_to_host_random(): + mem_core = MemoryCore( + mode="fpga_to_host", + width=randint(0, 128), + depth=randint(0, 2048), + base_addr=randint(0, 32678), + interface=None, + ) + + tests = MemoryCoreTests(mem_core) + + @simulate(mem_core) + def test_fpga_to_host_random_testbench(): + yield from tests.bus_addrs_all_zero() + yield from tests.user_to_bus_functionality() + + test_fpga_to_host_random_testbench() + def test_host_to_fpga(): mem_core = MemoryCore( @@ -355,23 +369,24 @@ def test_host_to_fpga(): @simulate(mem_core) def test_host_to_fpga_testbench(): yield from tests.user_addrs_all_zero() - - # Test Bus -> User functionality - yield from tests.one_bus_write_then_one_user_read() - yield from tests.multi_bus_write_then_multi_user_reads() - yield from tests.rand_bus_writes_rand_user_reads() + yield from tests.bus_to_user_functionality() test_host_to_fpga_testbench() +def test_host_to_fpga_random(): + mem_core = MemoryCore( + mode="host_to_fpga", + width=randint(0, 128), + depth=randint(0, 2048), + base_addr=randint(0, 32678), + interface=None, + ) -# def test_sweep_core_widths(): -# for i in range(1, 64): -# verify_mem_core(i, 128, 0) + tests = MemoryCoreTests(mem_core) + @simulate(mem_core) + def test_host_to_fpga_random_testbench(): + yield from tests.user_addrs_all_zero() + yield from tests.bus_to_user_functionality() -# def test_random_cores(): -# for _ in range(5): -# width = randint(0, 512) -# depth = randint(0, 1024) -# base_addr = randint(0, 2**16 - 1 - depth) -# verify_mem_core(width, depth, base_addr) + test_host_to_fpga_random_testbench() From 5d5a50042f0da70ad93b7a446c4a296ae766b745 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Wed, 6 Mar 2024 01:12:36 -0800 Subject: [PATCH 75/89] make model tracking automatic in memory core tests --- src/manta/ethernet/__init__.py | 4 +- src/manta/utils.py | 30 +++---- test/test_io_core_hw.py | 4 +- test/test_io_core_sim.py | 8 +- test/test_mem_core_hw.py | 4 +- test/test_mem_core_sim.py | 152 +++++++++++++++------------------ 6 files changed, 96 insertions(+), 106 deletions(-) diff --git a/src/manta/ethernet/__init__.py b/src/manta/ethernet/__init__.py index dc5ca69..4b8bbb8 100644 --- a/src/manta/ethernet/__init__.py +++ b/src/manta/ethernet/__init__.py @@ -2,7 +2,7 @@ from amaranth import * from manta.utils import * from manta.ethernet.source_bridge import UDPSourceBridge from manta.ethernet.sink_bridge import UDPSinkBridge -from random import randint +from random import getrandbits import socket @@ -339,7 +339,7 @@ class EthernetInterface(Elaboratable): # https://en.wikipedia.org/wiki/MAC_address#Ranges_of_group_and_locally_administered_addresses if "mac_address" not in liteeth_config: - addr = list(f"{randint(0, (2**48) - 1):012x}") + addr = list(f"{getrandbits(48):012x}") addr[1] = "2" liteeth_config["mac_address"] = int("".join(addr), 16) print(liteeth_config["mac_address"]) diff --git a/src/manta/utils.py b/src/manta/utils.py index fdee740..a10af95 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -2,7 +2,7 @@ from amaranth import * from amaranth.lib import data from amaranth.sim import Simulator from abc import ABC, abstractmethod -from random import sample +from random import sample, randint import os @@ -75,6 +75,20 @@ def words_to_value(data): return int("".join([f"{i:016b}" for i in data[::-1]]), 2) +def value_to_words(data, n_words): + """ + Takes a integer, interprets it as a set of 16-bit integers + concatenated together, and splits it into a list of 16-bit numbers. + """ + + if not isinstance(data, int) or data < 0: + raise ValueError("Behavior is only defined for nonnegative integers.") + + # Convert to binary, split into 16-bit chunks, and then convert back to list of int + binary = f"{data:0b}".zfill(n_words * 16) + return [int(binary[i : i + 16], 2) for i in range(0, 16 * n_words, 16)][::-1] + + def check_value_fits_in_bits(value, n_bits): """ Rasies an exception if the provided value isn't an integer that cannot @@ -91,20 +105,6 @@ def check_value_fits_in_bits(value, n_bits): raise ValueError("Signed integer too large.") -def value_to_words(data, n_words): - """ - Takes a integer, interprets it as a set of 16-bit integers - concatenated together, and splits it into a list of 16-bit numbers. - """ - - if not isinstance(data, int) or data < 0: - raise ValueError("Behavior is only defined for nonnegative integers.") - - # Convert to binary, split into 16-bit chunks, and then convert back to list of int - binary = f"{data:0b}".zfill(n_words * 16) - return [int(binary[i : i + 16], 2) for i in range(0, 16 * n_words, 16)][::-1] - - def split_into_chunks(data, chunk_size): """ Split a list into a list of lists, where each sublist has length `chunk_size`. diff --git a/test/test_io_core_hw.py b/test/test_io_core_hw.py index 6715728..d40aada 100644 --- a/test/test_io_core_hw.py +++ b/test/test_io_core_hw.py @@ -4,7 +4,7 @@ from amaranth_boards.icestick import ICEStickPlatform from manta import Manta from manta.utils import * import pytest -from random import randint +from random import getrandbits class IOCoreLoopbackTest(Elaboratable): @@ -120,7 +120,7 @@ class IOCoreLoopbackTest(Elaboratable): # to the second input, and so on... for input, output in zip(inputs, outputs): width = self.config["cores"]["io_core"]["inputs"][input] - value = randint(0, 2**width - 1) + value = getrandbits(width) self.manta.io_core.set_probe(output, value) readback = self.manta.io_core.get_probe(input) diff --git a/test/test_io_core_sim.py b/test/test_io_core_sim.py index 4edbd37..d99a72a 100644 --- a/test/test_io_core_sim.py +++ b/test/test_io_core_sim.py @@ -2,7 +2,7 @@ from amaranth import * from amaranth.sim import Simulator from manta.io_core import IOCore from manta.utils import * -from random import randint +from random import getrandbits probe0 = Signal(1) probe1 = Signal(2) @@ -51,7 +51,7 @@ def test_output_probe_buffer_initial_value(): def test_output_probes_are_writeable(): for o in outputs: addrs = io_core._memory_map[o.name]["addrs"] - test_value = randint(0, (2**o.width) - 1) + test_value = getrandbits(o.width) datas = value_to_words(test_value, len(addrs)) # write value to registers @@ -67,7 +67,7 @@ def test_output_probes_are_writeable(): def test_output_probes_update(): for o in outputs: addrs = io_core._memory_map[o.name]["addrs"] - test_value = randint(0, (2**o.width) - 1) + test_value = getrandbits(o.width) datas = value_to_words(test_value, len(addrs)) # write value to registers @@ -93,7 +93,7 @@ def test_output_probes_update(): def test_input_probes_update(): for i in inputs: # set input probe value - test_value = randint(0, (2**i.width) - 1) + test_value = getrandbits(i.width) yield i.eq(test_value) # pulse strobe register diff --git a/test/test_mem_core_hw.py b/test/test_mem_core_hw.py index 27c1208..9cb73f3 100644 --- a/test/test_mem_core_hw.py +++ b/test/test_mem_core_hw.py @@ -4,7 +4,7 @@ from amaranth_boards.icestick import ICEStickPlatform from manta import Manta from manta.utils import * import pytest -from random import randint, sample +from random import randint, getrandbits from math import ceil, log2 """ @@ -105,7 +105,7 @@ class MemoryCoreLoopbackTest(Elaboratable): # Read and write randomly from the bus side for addr in jumble(range(self.depth)): - data = randint(0, 2**self.width - 1) + data = getrandbits(self.width) self.write_user_side(addr, data) self.verify_register(addr, data) diff --git a/test/test_mem_core_sim.py b/test/test_mem_core_sim.py index 29bd73d..0c4fc32 100644 --- a/test/test_mem_core_sim.py +++ b/test/test_mem_core_sim.py @@ -1,6 +1,6 @@ from manta.memory_core import MemoryCore from manta.utils import * -from random import randint, choice +from random import randint, choice, getrandbits from math import ceil @@ -18,56 +18,56 @@ class MemoryCoreTests: range(self.base_addr, self.max_addr) ) # include the endpoint! self.user_addrs = list(range(self.mem_core._depth)) - self.model = {} + # A model of what each bus address contains + self.model = {i: 0 for i in self.bus_addrs} def bus_addrs_all_zero(self): for addr in self.bus_addrs: - yield from self.verify_bus_side(addr, 0) + yield from self.verify_bus_side(addr) def user_addrs_all_zero(self): for addr in self.user_addrs: - yield from self.verify_user_side(addr, 0) + yield from self.verify_user_side(addr) def bus_to_bus_functionality(self): - yield from self.one_bus_write_then_one_bus_read() - yield from self.multi_bus_writes_then_multi_bus_reads() + # yield from self.one_bus_write_then_one_bus_read() + # yield from self.multi_bus_writes_then_multi_bus_reads() yield from self.rand_bus_writes_rand_bus_reads() def user_to_bus_functionality(self): - yield from self.one_user_write_then_one_bus_read() - yield from self.multi_user_write_then_multi_bus_reads() + # yield from self.one_user_write_then_one_bus_read() + # yield from self.multi_user_write_then_multi_bus_reads() yield from self.rand_user_writes_rand_bus_reads() def bus_to_user_functionality(self): - yield from self.one_bus_write_then_one_user_read() - yield from self.multi_bus_write_then_multi_user_reads() + # yield from self.one_bus_write_then_one_user_read() + # yield from self.multi_bus_write_then_multi_user_reads() yield from self.rand_bus_writes_rand_user_reads() def user_to_user_functionality(self): - yield from self.one_user_write_then_one_user_read() - yield from self.multi_user_write_then_multi_user_read() + # yield from self.one_user_write_then_one_user_read() + # yield from self.multi_user_write_then_multi_user_read() yield from self.rand_user_write_rand_user_read() def one_bus_write_then_one_bus_read(self): for addr in self.bus_addrs: - data_width = self._get_data_width(addr) - data = randint(0, (2**data_width) - 1) + data_width = self.get_data_width(addr) + data = getrandbits(data_width) yield from self.write_bus_side(addr, data) - yield from self.verify_bus_side(addr, data) + yield from self.verify_bus_side(addr) def multi_bus_writes_then_multi_bus_reads(self): # write-write-write then read-read-read for addr in jumble(self.bus_addrs): - data_width = self._get_data_width(addr) - data = randint(0, (2**data_width) - 1) + data_width = self.get_data_width(addr) + data = getrandbits(data_width) - self.model[addr] = data yield from self.write_bus_side(addr, data) for addr in jumble(self.bus_addrs): - yield from self.verify_bus_side(addr, self.model[addr]) + yield from self.verify_bus_side(addr) def rand_bus_writes_rand_bus_reads(self): # random reads and writes in random orders @@ -76,43 +76,35 @@ class MemoryCoreTests: operation = choice(["read", "write"]) if operation == "read": - yield from self.verify_bus_side(addr, self.model[addr]) + yield from self.verify_bus_side(addr) elif operation == "write": - data_width = self._get_data_width(addr) - data = randint(0, (2**data_width) - 1) - self.model[addr] = data + data_width = self.get_data_width(addr) + data = getrandbits(data_width) yield from self.write_bus_side(addr, data) def one_user_write_then_one_bus_read(self): for user_addr in self.user_addrs: # write to user side - data = randint(0, (2**self.width) - 1) + data = getrandbits(self.width) yield from self.write_user_side(user_addr, data) # verify contents when read out from the bus - words = value_to_words(data, self.n_mems) - for i, word in enumerate(words): + for i in range(self.n_mems): bus_addr = self.base_addr + user_addr + (i * self.depth) - yield from self.verify_bus_side(bus_addr, word) + yield from self.verify_bus_side(bus_addr) def multi_user_write_then_multi_bus_reads(self): # write-write-write then read-read-read for user_addr in jumble(self.user_addrs): # write a random number to the user side - data = randint(0, (2**self.width) - 1) + data = getrandbits(self.width) yield from self.write_user_side(user_addr, data) - # convert value to words, and save to self.model - words = value_to_words(data, self.n_mems) - for i, word in enumerate(words): - bus_addr = self.base_addr + user_addr + (i * self.depth) - self.model[bus_addr] = word - # read out every bus_addr in random order for bus_addr in jumble(self.bus_addrs): - yield from self.verify_bus_side(bus_addr, self.model[bus_addr]) + yield from self.verify_bus_side(bus_addr) def rand_user_writes_rand_bus_reads(self): # random reads and writes in random orders @@ -128,23 +120,18 @@ class MemoryCoreTests: # read from bus side if operation == "read": for bus_addr in bus_addrs: - yield from self.verify_bus_side(bus_addr, self.model[bus_addr]) + yield from self.verify_bus_side(bus_addr) # write to user side elif operation == "write": - data = randint(0, (2**self.width) - 1) + data = getrandbits(self.width) yield from self.write_user_side(user_addr, data) - # save words just written to self.model - words = value_to_words(data, self.n_mems) - for addr, word in zip(bus_addrs, words): - self.model[addr] = word - def one_bus_write_then_one_user_read(self): for user_addr in self.user_addrs: # Try and set the value at the user address to a given value, # by writing to the appropriate memory locaitons on the bus side - data = randint(0, (2**self.width) - 1) + data = getrandbits(self.width) words = value_to_words(data, self.n_mems) @@ -152,25 +139,18 @@ class MemoryCoreTests: bus_addr = self.base_addr + user_addr + (i * self.depth) yield from self.write_bus_side(bus_addr, word) - yield from self.verify_user_side(user_addr, data) + yield from self.verify_user_side(user_addr) def multi_bus_write_then_multi_user_reads(self): # write-write-write then read-read-read for bus_addr in jumble(self.bus_addrs): - data_width = self._get_data_width(bus_addr) - data = randint(0, (2**data_width) - 1) + data_width = self.get_data_width(bus_addr) + data = getrandbits(data_width) - self.model[bus_addr] = data yield from self.write_bus_side(bus_addr, data) for user_addr in jumble(self.user_addrs): - bus_addrs = [ - self.base_addr + user_addr + (i * self.depth) - for i in range(self.n_mems) - ] - - value = words_to_value([self.model[addr] for addr in bus_addrs]) - yield from self.verify_user_side(user_addr, value) + yield from self.verify_user_side(user_addr) def rand_bus_writes_rand_user_reads(self): for _ in range(5 * self.depth): @@ -179,41 +159,31 @@ class MemoryCoreTests: # write random data to random bus address if operation == "write": bus_addr = randint(self.base_addr, self.max_addr - 1) - data_width = self._get_data_width(bus_addr) - data = randint(0, (2**data_width) - 1) - self.model[bus_addr] = data + data_width = self.get_data_width(bus_addr) + data = getrandbits(data_width) yield from self.write_bus_side(bus_addr, data) # read from random user_addr if operation == "read": user_addr = randint(0, self.depth - 1) - bus_addrs = [ - self.base_addr + user_addr + (i * self.depth) - for i in range(self.n_mems) - ] - - value = words_to_value([self.model[addr] for addr in bus_addrs]) - - yield from self.verify_user_side(user_addr, value) + yield from self.verify_user_side(user_addr) def one_user_write_then_one_user_read(self): for addr in self.user_addrs: - data = randint(0, (2**self.width) - 1) + data = getrandbits(self.width) yield from self.write_user_side(addr, data) - yield from self.verify_user_side(addr, data) + yield from self.verify_user_side(addr) def multi_user_write_then_multi_user_read(self): # write-write-write then read-read-read - self.foo = {} for user_addr in jumble(self.user_addrs): - data = randint(0, (2**self.width) - 1) - self.foo[user_addr] = data + data = getrandbits(self.width) yield from self.write_user_side(user_addr, data) for user_addr in jumble(self.user_addrs): - yield from self.verify_user_side(user_addr, self.foo[user_addr]) + yield from self.verify_user_side(user_addr) def rand_user_write_rand_user_read(self): # random reads and writes in random orders @@ -222,14 +192,13 @@ class MemoryCoreTests: operation = choice(["read", "write"]) if operation == "read": - yield from self.verify_user_side(user_addr, self.foo[user_addr]) + yield from self.verify_user_side(user_addr) elif operation == "write": - data = randint(0, (2**self.width) - 1) - self.foo[user_addr] = data + data = getrandbits(self.width) yield from self.write_user_side(user_addr, data) - def _get_data_width(self, addr): + def get_data_width(self, addr): # this part is a little hard to check since we might have a # memory at the end of the address space that's less than # 16-bits wide. so we'll have to calculate how wide our @@ -240,17 +209,29 @@ class MemoryCoreTests: else: return self.width % 16 - def verify_bus_side(self, addr, expected_data): - yield from verify_register(self.mem_core, addr, expected_data) + def verify_bus_side(self, addr): + yield from verify_register(self.mem_core, addr, self.model[addr]) for _ in range(4): yield def write_bus_side(self, addr, data): + self.model[addr] = data yield from write_register(self.mem_core, addr, data) for _ in range(4): yield - def verify_user_side(self, addr, expected_data): + def verify_user_side(self, addr): + # Determine the expected value on the user side by looking + # up the appropriate bus addresses in the model + + # Convert to bus addresses: + bus_words = [] + for i in range(self.n_mems): + bus_addr = self.base_addr + addr + (i * self.depth) + bus_words.append(self.model[bus_addr]) + + expected_data = words_to_value(bus_words) + yield self.mem_core.user_addr.eq(addr) yield yield @@ -262,6 +243,12 @@ class MemoryCoreTests: ) def write_user_side(self, addr, data): + # convert value to words, and save to self.model + words = value_to_words(data, self.n_mems) + for i, word in enumerate(words): + bus_addr = self.base_addr + addr + (i * self.depth) + self.model[bus_addr] = word + yield self.mem_core.user_addr.eq(addr) yield self.mem_core.user_data_in.eq(data) yield self.mem_core.user_write_enable.eq(1) @@ -294,11 +281,12 @@ def test_bidirectional(): test_bidirectional_testbench() + def test_bidirectional_random(): mem_core = MemoryCore( mode="bidirectional", width=randint(0, 128), - depth=randint(0, 2048), + depth=randint(0, 1024), base_addr=randint(0, 32678), interface=None, ) @@ -336,11 +324,12 @@ def test_fpga_to_host(): test_fpga_to_host_testbench() + def test_fpga_to_host_random(): mem_core = MemoryCore( mode="fpga_to_host", width=randint(0, 128), - depth=randint(0, 2048), + depth=randint(0, 1024), base_addr=randint(0, 32678), interface=None, ) @@ -373,11 +362,12 @@ def test_host_to_fpga(): test_host_to_fpga_testbench() + def test_host_to_fpga_random(): mem_core = MemoryCore( mode="host_to_fpga", width=randint(0, 128), - depth=randint(0, 2048), + depth=randint(0, 1024), base_addr=randint(0, 32678), interface=None, ) From d1a772784a54656f2dc5505c4b758d25b248ada6 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Wed, 6 Mar 2024 11:26:31 -0800 Subject: [PATCH 76/89] add environment.sh for tool paths and serial ports --- environment.sh | 11 +++++++++++ test/test_io_core_hw.py | 5 +++-- test/test_logic_analyzer_hw.py | 5 +++-- test/test_mem_core_hw.py | 7 ++++--- 4 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 environment.sh diff --git a/environment.sh b/environment.sh new file mode 100644 index 0000000..1c622d0 --- /dev/null +++ b/environment.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +export VIVADO=/tools/Xilinx/Vivado/2023.1/bin/vivado + +export YOSYS=/tools/oss-cad-suite/bin/yosys +export NEXTPNR_ICE40=/tools/oss-cad-suite/bin/nextpnr-ice40 +export ICEPACK=/tools/oss-cad-suite/bin/icepack +export ICEPROG=/tools/oss-cad-suite/bin/iceprog + +export NEXYS4DDR_PORT=/dev/serial/by-id/usb-Digilent_Digilent_USB_Device_210292696307-if01-port0 +export ICESTICK_PORT=/dev/serial/by-id/usb-Lattice_Lattice_FTUSB_Interface_Cable-if01-port0 diff --git a/test/test_io_core_hw.py b/test/test_io_core_hw.py index d40aada..c5ab941 100644 --- a/test/test_io_core_hw.py +++ b/test/test_io_core_hw.py @@ -5,6 +5,7 @@ from manta import Manta from manta.utils import * import pytest from random import getrandbits +import os class IOCoreLoopbackTest(Elaboratable): @@ -143,11 +144,11 @@ class IOCoreLoopbackTest(Elaboratable): @pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") def test_output_probe_initial_values_xilinx(): - port = "/dev/serial/by-id/usb-Digilent_Digilent_USB_Device_210292696307-if01-port0" + port = os.environ["NEXYS4DDR_PORT"] IOCoreLoopbackTest(Nexys4DDRPlatform(), port).verify() @pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") def test_output_probe_initial_values_ice40(): - port = "/dev/serial/by-id/usb-Lattice_Lattice_FTUSB_Interface_Cable-if01-port0" + port = os.environ["ICESTICK_PORT"] IOCoreLoopbackTest(ICEStickPlatform(), port).verify() diff --git a/test/test_logic_analyzer_hw.py b/test/test_logic_analyzer_hw.py index 8a25335..f82bec2 100644 --- a/test/test_logic_analyzer_hw.py +++ b/test/test_logic_analyzer_hw.py @@ -4,6 +4,7 @@ from amaranth_boards.icestick import ICEStickPlatform from manta import Manta from manta.utils import * import pytest +import os class LogicAnalyzerCounterTest(Elaboratable): @@ -78,11 +79,11 @@ class LogicAnalyzerCounterTest(Elaboratable): @pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") def test_logic_analyzer_core_xilinx(): - port = "/dev/serial/by-id/usb-Digilent_Digilent_USB_Device_210292696307-if01-port0" + port = os.environ["NEXYS4DDR_PORT"] LogicAnalyzerCounterTest(Nexys4DDRPlatform(), port).verify() @pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") def test_logic_analyzer_core_ice40(): - port = "/dev/serial/by-id/usb-Lattice_Lattice_FTUSB_Interface_Cable-if01-port0" + port = os.environ["ICESTICK_PORT"] LogicAnalyzerCounterTest(ICEStickPlatform(), port).verify() diff --git a/test/test_mem_core_hw.py b/test/test_mem_core_hw.py index 9cb73f3..242e4c6 100644 --- a/test/test_mem_core_hw.py +++ b/test/test_mem_core_hw.py @@ -4,8 +4,9 @@ from amaranth_boards.icestick import ICEStickPlatform from manta import Manta from manta.utils import * import pytest -from random import randint, getrandbits +from random import getrandbits from math import ceil, log2 +import os """ Fundamentally we want a function to generate a configuration (as a dictionary) @@ -112,13 +113,13 @@ class MemoryCoreLoopbackTest(Elaboratable): @pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") def test_mem_core_xilinx(): - port = "/dev/serial/by-id/usb-Digilent_Digilent_USB_Device_210292696307-if01-port0" + port = os.environ["NEXYS4DDR_PORT"] MemoryCoreLoopbackTest(Nexys4DDRPlatform(), 33, 1024, port).verify() @pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") def test_mem_core_ice40(): - port = "/dev/serial/by-id/usb-Lattice_Lattice_FTUSB_Interface_Cable-if01-port0" + port = os.environ["ICESTICK_PORT"] MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 2, port).verify() MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 512, port).verify() MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 1024, port).verify() From 71ec1174d1d9fe5c69f0d7a1f0bb29334ebd168d Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Wed, 6 Mar 2024 14:53:27 -0800 Subject: [PATCH 77/89] add parameterized HW tests for all memory core modes --- src/manta/memory_core.py | 2 +- test/test_mem_core_hw.py | 145 +++++++++++++++++++++++--------------- test/test_mem_core_sim.py | 143 ++++++++----------------------------- 3 files changed, 117 insertions(+), 173 deletions(-) diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index edcbb74..f8c11b4 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -317,6 +317,6 @@ class MemoryCore(MantaCore): if not all(isinstance(d, int) for d in datas): raise TypeError("Write data must all be integers.") - bus_addrs = self._convert_user_to_bus_addr([addrs])[0] + bus_addrs = self._convert_user_to_bus_addr(addrs) bus_datas = [word for d in datas for word in value_to_words(d, self._n_mems)] self._interface.write(bus_addrs, bus_datas) diff --git a/test/test_mem_core_hw.py b/test/test_mem_core_hw.py index 242e4c6..fb8f853 100644 --- a/test/test_mem_core_hw.py +++ b/test/test_mem_core_hw.py @@ -8,16 +8,11 @@ from random import getrandbits from math import ceil, log2 import os -""" -Fundamentally we want a function to generate a configuration (as a dictionary) -for a memory core given the width, depth, and platform. This could be a random -configuration, or a standard one. -""" - class MemoryCoreLoopbackTest(Elaboratable): - def __init__(self, platform, width, depth, port): + def __init__(self, platform, mode, width, depth, port): self.platform = platform + self.mode = mode self.width = width self.depth = depth self.port = port @@ -28,19 +23,22 @@ class MemoryCoreLoopbackTest(Elaboratable): def platform_specific_config(self): return { "cores": { - "mem_core": { - "type": "memory", - "mode": "fpga_to_host", - "width": self.width, - "depth": self.depth, - }, "io_core": { "type": "io", "outputs": { - "addr": ceil(log2(self.depth)), - "data": self.width, - "we": 1, + "user_addr": ceil(log2(self.depth)), + "user_data_in": self.width, + "user_write_enable": 1, }, + "inputs": { + "user_data_out": self.width, + }, + }, + "mem_core": { + "type": "memory", + "mode": self.mode, + "width": self.width, + "depth": self.depth, }, }, "uart": { @@ -69,17 +67,21 @@ class MemoryCoreLoopbackTest(Elaboratable): uart_pins = platform.request("uart") - addr = self.get_probe("addr") - data = self.get_probe("data") - we = self.get_probe("we") + user_addr = self.get_probe("user_addr") + user_data_in = self.get_probe("user_data_in") + user_data_out = self.get_probe("user_data_out") + user_write_enable = self.get_probe("user_write_enable") - m.d.comb += [ - self.manta.mem_core.user_addr.eq(addr), - self.manta.mem_core.user_data_in.eq(data), - self.manta.mem_core.user_write_enable.eq(we), - self.manta.interface.rx.eq(uart_pins.rx.i), - uart_pins.tx.o.eq(self.manta.interface.tx), - ] + m.d.comb += self.manta.interface.rx.eq(uart_pins.rx.i) + m.d.comb += uart_pins.tx.o.eq(self.manta.interface.tx) + m.d.comb += self.manta.mem_core.user_addr.eq(user_addr) + + if self.mode in ["bidirectional", "fpga_to_host"]: + m.d.comb += self.manta.mem_core.user_data_in.eq(user_data_in) + m.d.comb += self.manta.mem_core.user_write_enable.eq(user_write_enable) + + if self.mode in ["bidirectional", "host_to_fpga"]: + m.d.comb += user_data_out.eq(self.manta.mem_core.user_data_out) return m @@ -87,48 +89,75 @@ class MemoryCoreLoopbackTest(Elaboratable): self.platform.build(self, do_program=True) def write_user_side(self, addr, data): - self.manta.io_core.set_probe("we", 0) - self.manta.io_core.set_probe("addr", addr) - self.manta.io_core.set_probe("data", data) - self.manta.io_core.set_probe("we", 1) - self.manta.io_core.set_probe("we", 0) + self.manta.io_core.set_probe("user_write_enable", 0) + self.manta.io_core.set_probe("user_addr", addr) + self.manta.io_core.set_probe("user_data_in", data) + self.manta.io_core.set_probe("user_write_enable", 1) + self.manta.io_core.set_probe("user_write_enable", 0) - def verify_register(self, addr, expected_data): - data = self.manta.mem_core.read(addr) - - if data != expected_data: - raise ValueError( - f"Memory read from {hex(addr)} returned {hex(data)} instead of {hex(expected_data)}." - ) + def read_user_side(self, addr): + self.manta.io_core.set_probe("user_write_enable", 0) + self.manta.io_core.set_probe("user_addr", addr) + return self.manta.io_core.get_probe("user_data_out") def verify(self): self.build_and_program() - # Read and write randomly from the bus side - for addr in jumble(range(self.depth)): - data = getrandbits(self.width) - self.write_user_side(addr, data) - self.verify_register(addr, data) + if self.mode in ["bidirectional", "host_to_fpga"]: + for addr in jumble(range(self.depth)): + + # Write a random balue to a random bus address + data = getrandbits(self.width) + self.manta.mem_core.write(addr, data) + + # Verify the same number is returned when reading on the user side + readback = self.read_user_side(addr) + if readback != data: + raise ValueError( + f"Memory read from {hex(addr)} returned {hex(data)} instead of {hex(readback)}." + ) + + if self.mode in ["bidirectional", "fpga_to_host"]: + for addr in jumble(range(self.depth)): + + # Write a random value to a random user address + data = getrandbits(self.width) + self.write_user_side(addr, data) + + # Verify the same number is returned when reading on the bus side + readback = self.manta.mem_core.read(addr) + if readback != data: + raise ValueError( + f"Memory read from {hex(addr)} returned {hex(data)} instead of {hex(readback)}." + ) + + +# Nexys4DDR Tests + +# Omit the bidirectional mode for now, pending completion of: +# https://github.com/amaranth-lang/amaranth/issues/1011 +modes = ["fpga_to_host", "host_to_fpga"] +widths = [1, 8, 14, 16, 33] +depths = [2, 512, 1024] +nexys4ddr_cases = [(m, w, d) for m in modes for w in widths for d in depths] @pytest.mark.skipif(not xilinx_tools_installed(), reason="no toolchain installed") -def test_mem_core_xilinx(): +@pytest.mark.parametrize("mode, width, depth", nexys4ddr_cases) +def test_mem_core_xilinx(mode, width, depth): port = os.environ["NEXYS4DDR_PORT"] - MemoryCoreLoopbackTest(Nexys4DDRPlatform(), 33, 1024, port).verify() + MemoryCoreLoopbackTest(Nexys4DDRPlatform(), mode, width, depth, port).verify() + + +# IceStick Tests +modes = ["fpga_to_host", "host_to_fpga"] +widths = [1, 8, 14, 16, 33] +depths = [2, 512, 1024] +ice40_cases = [(m, w, d) for m in modes for w in widths for d in depths] @pytest.mark.skipif(not ice40_tools_installed(), reason="no toolchain installed") -def test_mem_core_ice40(): +@pytest.mark.parametrize("mode, width, depth", ice40_cases) +def test_mem_core_ice40(mode, width, depth): port = os.environ["ICESTICK_PORT"] - MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 2, port).verify() - MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 512, port).verify() - MemoryCoreLoopbackTest(ICEStickPlatform(), 1, 1024, port).verify() - MemoryCoreLoopbackTest(ICEStickPlatform(), 8, 2, port).verify() - MemoryCoreLoopbackTest(ICEStickPlatform(), 8, 512, port).verify() - MemoryCoreLoopbackTest(ICEStickPlatform(), 8, 1024, port).verify() - MemoryCoreLoopbackTest(ICEStickPlatform(), 14, 512, port).verify() - MemoryCoreLoopbackTest(ICEStickPlatform(), 14, 1024, port).verify() - MemoryCoreLoopbackTest(ICEStickPlatform(), 16, 512, port).verify() - MemoryCoreLoopbackTest(ICEStickPlatform(), 16, 1024, port).verify() - MemoryCoreLoopbackTest(ICEStickPlatform(), 33, 512, port).verify() - MemoryCoreLoopbackTest(ICEStickPlatform(), 33, 1024, port).verify() + MemoryCoreLoopbackTest(ICEStickPlatform(), mode, width, depth, port).verify() diff --git a/test/test_mem_core_sim.py b/test/test_mem_core_sim.py index 0c4fc32..7fe2bae 100644 --- a/test/test_mem_core_sim.py +++ b/test/test_mem_core_sim.py @@ -2,6 +2,7 @@ from manta.memory_core import MemoryCore from manta.utils import * from random import randint, choice, getrandbits from math import ceil +import pytest class MemoryCoreTests: @@ -258,125 +259,39 @@ class MemoryCoreTests: yield self.mem_core.user_write_enable.eq(0) -def test_bidirectional(): - mem_core = MemoryCore( - mode="bidirectional", - width=23, - depth=512, - base_addr=0, - interface=None, - ) +modes = ["bidirectional", "fpga_to_host", "host_to_fpga"] +widths = [23, randint(0, 128)] +depths = [512, randint(0, 1024)] +base_addrs = [0, randint(0, 32678)] + +cases = [ + (m, w, d, ba) for m in modes for w in widths for d in depths for ba in base_addrs +] + + +@pytest.mark.parametrize("mode, width, depth, base_addr", cases) +def test_mem_core(mode, width, depth, base_addr): + mem_core = MemoryCore(mode, width, depth, base_addr, interface=None) tests = MemoryCoreTests(mem_core) @simulate(mem_core) - def test_bidirectional_testbench(): - yield from tests.bus_addrs_all_zero() - yield from tests.user_addrs_all_zero() + def testbench(): + if mode == "bidirectional": + yield from tests.bus_addrs_all_zero() + yield from tests.user_addrs_all_zero() - yield from tests.bus_to_bus_functionality() - yield from tests.user_to_bus_functionality() - yield from tests.bus_to_user_functionality() - yield from tests.user_to_user_functionality() + yield from tests.bus_to_bus_functionality() + yield from tests.user_to_bus_functionality() + yield from tests.bus_to_user_functionality() + yield from tests.user_to_user_functionality() - test_bidirectional_testbench() + if mode == "fpga_to_host": + yield from tests.bus_addrs_all_zero() + yield from tests.user_to_bus_functionality() + if mode == "host_to_fpga": + yield from tests.user_addrs_all_zero() + yield from tests.bus_to_user_functionality() -def test_bidirectional_random(): - mem_core = MemoryCore( - mode="bidirectional", - width=randint(0, 128), - depth=randint(0, 1024), - base_addr=randint(0, 32678), - interface=None, - ) - - tests = MemoryCoreTests(mem_core) - - @simulate(mem_core) - def test_bidirectional_random_testbench(): - yield from tests.bus_addrs_all_zero() - yield from tests.user_addrs_all_zero() - - yield from tests.bus_to_bus_functionality() - yield from tests.user_to_bus_functionality() - yield from tests.bus_to_user_functionality() - yield from tests.user_to_user_functionality() - - test_bidirectional_random_testbench() - - -def test_fpga_to_host(): - mem_core = MemoryCore( - mode="fpga_to_host", - width=23, - depth=512, - base_addr=0, - interface=None, - ) - - tests = MemoryCoreTests(mem_core) - - @simulate(mem_core) - def test_fpga_to_host_testbench(): - yield from tests.bus_addrs_all_zero() - yield from tests.user_to_bus_functionality() - - test_fpga_to_host_testbench() - - -def test_fpga_to_host_random(): - mem_core = MemoryCore( - mode="fpga_to_host", - width=randint(0, 128), - depth=randint(0, 1024), - base_addr=randint(0, 32678), - interface=None, - ) - - tests = MemoryCoreTests(mem_core) - - @simulate(mem_core) - def test_fpga_to_host_random_testbench(): - yield from tests.bus_addrs_all_zero() - yield from tests.user_to_bus_functionality() - - test_fpga_to_host_random_testbench() - - -def test_host_to_fpga(): - mem_core = MemoryCore( - mode="host_to_fpga", - width=23, - depth=512, - base_addr=0, - interface=None, - ) - - tests = MemoryCoreTests(mem_core) - - @simulate(mem_core) - def test_host_to_fpga_testbench(): - yield from tests.user_addrs_all_zero() - yield from tests.bus_to_user_functionality() - - test_host_to_fpga_testbench() - - -def test_host_to_fpga_random(): - mem_core = MemoryCore( - mode="host_to_fpga", - width=randint(0, 128), - depth=randint(0, 1024), - base_addr=randint(0, 32678), - interface=None, - ) - - tests = MemoryCoreTests(mem_core) - - @simulate(mem_core) - def test_host_to_fpga_random_testbench(): - yield from tests.user_addrs_all_zero() - yield from tests.bus_to_user_functionality() - - test_host_to_fpga_random_testbench() + testbench() From 69000872376dc0ccddfb91d5d7c700c830f70777 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Wed, 6 Mar 2024 15:08:11 -0800 Subject: [PATCH 78/89] delete dead code from memory core --- src/manta/memory_core.py | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index f8c11b4..32237ab 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -114,36 +114,6 @@ class MemoryCore(MantaCore): start_addr = self._base_addr + (i * self._depth) stop_addr = start_addr + self._depth - 1 - # # Handle write ports - # if self._mode in ["host_to_fpga", "bidirectional"]: - # write_port = mem.write_port() - # m.d.sync += write_port.data.eq(self.bus_i.data) - # m.d.sync += write_port.en.eq(self.bus_i.rw) - # m.d.sync += write_port.addr.eq(self.bus_i.addr - start_addr) - - # # Handle read ports - # if self._mode in ["fpga_to_host", "bidirectional"]: - # read_port = mem.read_port() - # m.d.comb += read_port.en.eq(1) - - # # Throw BRAM operations into the front of the pipeline - # with m.If( - # (self.bus_i.valid) - # & (~self.bus_i.rw) - # & (self.bus_i.addr >= start_addr) - # & (self.bus_i.addr <= stop_addr) - # ): - # m.d.sync += read_port.addr.eq(self.bus_i.addr - start_addr) - - # # Pull BRAM reads from the back of the pipeline - # with m.If( - # (self._bus_pipe[2].valid) - # & (~self._bus_pipe[2].rw) - # & (self._bus_pipe[2].addr >= start_addr) - # & (self._bus_pipe[2].addr <= stop_addr) - # ): - # m.d.sync += self.bus_o.data.eq(read_port.data) - if self._mode == "fpga_to_host": read_port = mem.read_port() m.d.comb += read_port.en.eq(1) From bd452d94a476b8fd27fe003eb02dd5c8a3bb423c Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Wed, 6 Mar 2024 16:40:54 -0800 Subject: [PATCH 79/89] put test outputs in build/ --- src/manta/utils.py | 17 +++++++++++++---- test/test_logic_analyzer_hw.py | 8 +++++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/manta/utils.py b/src/manta/utils.py index a10af95..e2fa22c 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -2,7 +2,8 @@ from amaranth import * from amaranth.lib import data from amaranth.sim import Simulator from abc import ABC, abstractmethod -from random import sample, randint +from random import sample +from pathlib import Path import os @@ -114,22 +115,30 @@ def split_into_chunks(data, chunk_size): return [data[i : i + chunk_size] for i in range(0, len(data), chunk_size)] +def make_build_dir_if_it_does_not_exist_already(): + """ + Make build/ if it doesn't exist already. + """ + + Path("build").mkdir(parents=True, exist_ok=True) + def simulate(top): """ A decorator for running behavioral simulation using Amaranth's built-in simulator. Requires the top-level module in the simulation as an argument, - and automatically names VCD file containing the waveform dump with the name - of the function being decorated. + and automatically names VCD file containing the waveform dump in build/ + with the name of the function being decorated. """ def decorator(testbench): + make_build_dir_if_it_does_not_exist_already() def wrapper(*args, **kwargs): sim = Simulator(top) sim.add_clock(1e-6) # 1 MHz sim.add_sync_process(testbench) - vcd_path = testbench.__name__ + ".vcd" + vcd_path = "build/" + testbench.__name__ + ".vcd" with sim.write_vcd(vcd_path): sim.run() diff --git a/test/test_logic_analyzer_hw.py b/test/test_logic_analyzer_hw.py index f82bec2..e199db6 100644 --- a/test/test_logic_analyzer_hw.py +++ b/test/test_logic_analyzer_hw.py @@ -59,14 +59,16 @@ class LogicAnalyzerCounterTest(Elaboratable): self.build_and_program() cap = self.manta.la.capture() + make_build_dir_if_it_does_not_exist_already() + # check that VCD export works - cap.export_vcd("out.vcd") + cap.export_vcd("build/logic_analyzer_capture.vcd") # check that CSV export works - cap.export_csv("out.csv") + cap.export_csv("build/logic_analyzer_capture.csv") # check that Verilog export works - cap.export_playback_verilog("out.v") + cap.export_playback_verilog("build/logic_analzyer_capture_playback.v") # verify that each signal is just a counter modulo the width of the signal for name, width in self.manta.la._config["probes"].items(): From 21afbad7c4f958ae09c9450578dfd0f60bd704ac Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Wed, 6 Mar 2024 21:47:03 -0800 Subject: [PATCH 80/89] add icestick IO core example --- examples/icestick/io_core/.gitignore | 1 + examples/icestick/io_core/build.sh | 4 ++ examples/icestick/io_core/manta.yaml | 16 ++++++ examples/icestick/io_core/run_io_core.py | 16 ++++++ examples/icestick/io_core/top_level.pcf | 67 ++++++++++++++++++++++++ examples/icestick/io_core/top_level.sv | 33 ++++++++++++ 6 files changed, 137 insertions(+) create mode 100644 examples/icestick/io_core/.gitignore create mode 100755 examples/icestick/io_core/build.sh create mode 100644 examples/icestick/io_core/manta.yaml create mode 100644 examples/icestick/io_core/run_io_core.py create mode 100644 examples/icestick/io_core/top_level.pcf create mode 100644 examples/icestick/io_core/top_level.sv diff --git a/examples/icestick/io_core/.gitignore b/examples/icestick/io_core/.gitignore new file mode 100644 index 0000000..a670a87 --- /dev/null +++ b/examples/icestick/io_core/.gitignore @@ -0,0 +1 @@ +!top_level.sv \ No newline at end of file diff --git a/examples/icestick/io_core/build.sh b/examples/icestick/io_core/build.sh new file mode 100755 index 0000000..a300d28 --- /dev/null +++ b/examples/icestick/io_core/build.sh @@ -0,0 +1,4 @@ +python3 -m manta gen manta.yaml manta.v +$YOSYS -p 'synth_ice40 -top top_level -json top_level.json' top_level.sv +$NEXTPNR_ICE40 --hx1k --json top_level.json --pcf top_level.pcf --asc top_level.asc +$ICEPACK top_level.asc top_level.bin \ No newline at end of file diff --git a/examples/icestick/io_core/manta.yaml b/examples/icestick/io_core/manta.yaml new file mode 100644 index 0000000..162311e --- /dev/null +++ b/examples/icestick/io_core/manta.yaml @@ -0,0 +1,16 @@ +--- +cores: + my_io_core: + type: io + + outputs: + LED0: 1 + LED1: 1 + LED2: 1 + LED3: 1 + LED4: 1 + +uart: + port: "/dev/ttyUSB3" + baudrate: 115200 + clock_freq: 12000000 \ No newline at end of file diff --git a/examples/icestick/io_core/run_io_core.py b/examples/icestick/io_core/run_io_core.py new file mode 100644 index 0000000..b1fd3d1 --- /dev/null +++ b/examples/icestick/io_core/run_io_core.py @@ -0,0 +1,16 @@ +from manta import Manta +from time import sleep + +manta = Manta('manta.yaml') + +i = 0 +while True: + # Turn each LED off + for j in range(5): + manta.my_io_core.set_probe(f"LED{j}", 0) + + # Turn one LED back on + manta.my_io_core.set_probe(f"LED{i}", 1) + + i = (i+1) % 5 + sleep(0.1) \ No newline at end of file diff --git a/examples/icestick/io_core/top_level.pcf b/examples/icestick/io_core/top_level.pcf new file mode 100644 index 0000000..d042aa0 --- /dev/null +++ b/examples/icestick/io_core/top_level.pcf @@ -0,0 +1,67 @@ +# Generic iCEstick placement constraints file + +# Red LEDs +set_io LED0 99 +set_io LED1 98 +set_io LED2 97 +set_io LED3 96 + +# Green LED +set_io LED4 95 + +# IrDA port +#set_io RXD 106 +#set_io TXD 105 +#set_io SD 107 + +# Pmod connector +#set_io PIO1_02 78 # Pin 1 +#set_io PIO1_03 79 # Pin 2 +#set_io PIO1_04 80 # Pin 3 +#set_io PIO1_05 81 # Pin 4 +#set_io PIO1_06 87 # Pin 7 +#set_io PIO1_07 88 # Pin 8 +#set_io PIO1_08 90 # Pin 9 +#set_io PIO1_09 91 # Pin 10 + +# Connector J1 +#set_io PIO0_02 112 # Pin 3 +#set_io PIO0_03 113 # Pin 4 +#set_io PIO0_04 114 # Pin 5 +#set_io PIO0_05 115 # Pin 6 +#set_io PIO0_06 116 # Pin 7 +#set_io PIO0_07 117 # Pin 8 +#set_io PIO0_08 118 # Pin 9 +#set_io PIO0_09 119 # Pin 10 + +# Connector J3 +#set_io PIO2_17 62 # Pin 3 +#set_io PIO2_16 61 # Pin 4 +#set_io PIO2_15 60 # Pin 5 +#set_io PIO2_14 56 # Pin 6 +#set_io PIO2_13 48 # Pin 7 +#set_io PIO2_12 47 # Pin 8 +#set_io PIO2_11 45 # Pin 9 +#set_io PIO2_10 44 # Pin 10 + +# FTDI Port B UART +#set_io DCDn 1 +#set_io DSRn 2 +#set_io DTRn 3 +#set_io CTSn 4 +#set_io RTSn 7 +set_io rs232_tx_ttl 8 +set_io rs232_rx_ttl 9 + +# SPI +#set_io SPI_SCK 70 +#set_io SPI_SI 68 +#set_io SPI_SO 67 +#set_io SPI_SS_B 71 + +# Configuration pins +#set_io CDONE 65 +#set_io CRESET_B 66 + +# 12 MHz clock +set_io clk 21 diff --git a/examples/icestick/io_core/top_level.sv b/examples/icestick/io_core/top_level.sv new file mode 100644 index 0000000..f0740f1 --- /dev/null +++ b/examples/icestick/io_core/top_level.sv @@ -0,0 +1,33 @@ +`default_nettype none +`timescale 1ns / 1ps + +`include "manta.v" + +module top_level ( + input wire clk, + + output logic LED0, + output logic LED1, + output logic LED2, + output logic LED3, + output logic LED4, + + input wire rs232_rx_ttl, + output logic rs232_tx_ttl + ); + + manta manta_inst ( + .clk(clk), + .rst(0), + + .rx(rs232_rx_ttl), + .tx(rs232_tx_ttl), + + .LED0(LED0), + .LED1(LED1), + .LED2(LED2), + .LED3(LED3), + .LED4(LED4)); +endmodule + +`default_nettype wire \ No newline at end of file From 05b9b450e848f2cf9c74619d84b0f8fe5aeddf61 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Wed, 6 Mar 2024 22:05:24 -0800 Subject: [PATCH 81/89] add logic analyzer icestick example --- .../io_core/{run_io_core.py => blinky.py} | 0 .../verilog/icestick/io_core_uart/.gitignore | 1 + .../verilog/icestick/io_core_uart/blinky.py | 16 +++++ .../verilog/icestick/io_core_uart/build.sh | 4 ++ .../verilog/icestick/io_core_uart/manta.yaml | 16 +++++ .../icestick/io_core_uart/top_level.pcf | 67 +++++++++++++++++++ .../icestick/io_core_uart/top_level.sv | 33 +++++++++ .../icestick/logic_analyzer_uart/.gitignore | 1 + .../icestick/logic_analyzer_uart/build.sh | 4 ++ .../icestick/logic_analyzer_uart/manta.yaml | 19 ++++++ .../logic_analyzer_uart/top_level.pcf | 67 +++++++++++++++++++ .../icestick/logic_analyzer_uart/top_level.sv | 38 +++++++++++ 12 files changed, 266 insertions(+) rename examples/icestick/io_core/{run_io_core.py => blinky.py} (100%) create mode 100644 examples/verilog/icestick/io_core_uart/.gitignore create mode 100644 examples/verilog/icestick/io_core_uart/blinky.py create mode 100755 examples/verilog/icestick/io_core_uart/build.sh create mode 100644 examples/verilog/icestick/io_core_uart/manta.yaml create mode 100644 examples/verilog/icestick/io_core_uart/top_level.pcf create mode 100644 examples/verilog/icestick/io_core_uart/top_level.sv create mode 100644 examples/verilog/icestick/logic_analyzer_uart/.gitignore create mode 100755 examples/verilog/icestick/logic_analyzer_uart/build.sh create mode 100644 examples/verilog/icestick/logic_analyzer_uart/manta.yaml create mode 100644 examples/verilog/icestick/logic_analyzer_uart/top_level.pcf create mode 100644 examples/verilog/icestick/logic_analyzer_uart/top_level.sv diff --git a/examples/icestick/io_core/run_io_core.py b/examples/icestick/io_core/blinky.py similarity index 100% rename from examples/icestick/io_core/run_io_core.py rename to examples/icestick/io_core/blinky.py diff --git a/examples/verilog/icestick/io_core_uart/.gitignore b/examples/verilog/icestick/io_core_uart/.gitignore new file mode 100644 index 0000000..a670a87 --- /dev/null +++ b/examples/verilog/icestick/io_core_uart/.gitignore @@ -0,0 +1 @@ +!top_level.sv \ No newline at end of file diff --git a/examples/verilog/icestick/io_core_uart/blinky.py b/examples/verilog/icestick/io_core_uart/blinky.py new file mode 100644 index 0000000..b1fd3d1 --- /dev/null +++ b/examples/verilog/icestick/io_core_uart/blinky.py @@ -0,0 +1,16 @@ +from manta import Manta +from time import sleep + +manta = Manta('manta.yaml') + +i = 0 +while True: + # Turn each LED off + for j in range(5): + manta.my_io_core.set_probe(f"LED{j}", 0) + + # Turn one LED back on + manta.my_io_core.set_probe(f"LED{i}", 1) + + i = (i+1) % 5 + sleep(0.1) \ No newline at end of file diff --git a/examples/verilog/icestick/io_core_uart/build.sh b/examples/verilog/icestick/io_core_uart/build.sh new file mode 100755 index 0000000..a300d28 --- /dev/null +++ b/examples/verilog/icestick/io_core_uart/build.sh @@ -0,0 +1,4 @@ +python3 -m manta gen manta.yaml manta.v +$YOSYS -p 'synth_ice40 -top top_level -json top_level.json' top_level.sv +$NEXTPNR_ICE40 --hx1k --json top_level.json --pcf top_level.pcf --asc top_level.asc +$ICEPACK top_level.asc top_level.bin \ No newline at end of file diff --git a/examples/verilog/icestick/io_core_uart/manta.yaml b/examples/verilog/icestick/io_core_uart/manta.yaml new file mode 100644 index 0000000..162311e --- /dev/null +++ b/examples/verilog/icestick/io_core_uart/manta.yaml @@ -0,0 +1,16 @@ +--- +cores: + my_io_core: + type: io + + outputs: + LED0: 1 + LED1: 1 + LED2: 1 + LED3: 1 + LED4: 1 + +uart: + port: "/dev/ttyUSB3" + baudrate: 115200 + clock_freq: 12000000 \ No newline at end of file diff --git a/examples/verilog/icestick/io_core_uart/top_level.pcf b/examples/verilog/icestick/io_core_uart/top_level.pcf new file mode 100644 index 0000000..d042aa0 --- /dev/null +++ b/examples/verilog/icestick/io_core_uart/top_level.pcf @@ -0,0 +1,67 @@ +# Generic iCEstick placement constraints file + +# Red LEDs +set_io LED0 99 +set_io LED1 98 +set_io LED2 97 +set_io LED3 96 + +# Green LED +set_io LED4 95 + +# IrDA port +#set_io RXD 106 +#set_io TXD 105 +#set_io SD 107 + +# Pmod connector +#set_io PIO1_02 78 # Pin 1 +#set_io PIO1_03 79 # Pin 2 +#set_io PIO1_04 80 # Pin 3 +#set_io PIO1_05 81 # Pin 4 +#set_io PIO1_06 87 # Pin 7 +#set_io PIO1_07 88 # Pin 8 +#set_io PIO1_08 90 # Pin 9 +#set_io PIO1_09 91 # Pin 10 + +# Connector J1 +#set_io PIO0_02 112 # Pin 3 +#set_io PIO0_03 113 # Pin 4 +#set_io PIO0_04 114 # Pin 5 +#set_io PIO0_05 115 # Pin 6 +#set_io PIO0_06 116 # Pin 7 +#set_io PIO0_07 117 # Pin 8 +#set_io PIO0_08 118 # Pin 9 +#set_io PIO0_09 119 # Pin 10 + +# Connector J3 +#set_io PIO2_17 62 # Pin 3 +#set_io PIO2_16 61 # Pin 4 +#set_io PIO2_15 60 # Pin 5 +#set_io PIO2_14 56 # Pin 6 +#set_io PIO2_13 48 # Pin 7 +#set_io PIO2_12 47 # Pin 8 +#set_io PIO2_11 45 # Pin 9 +#set_io PIO2_10 44 # Pin 10 + +# FTDI Port B UART +#set_io DCDn 1 +#set_io DSRn 2 +#set_io DTRn 3 +#set_io CTSn 4 +#set_io RTSn 7 +set_io rs232_tx_ttl 8 +set_io rs232_rx_ttl 9 + +# SPI +#set_io SPI_SCK 70 +#set_io SPI_SI 68 +#set_io SPI_SO 67 +#set_io SPI_SS_B 71 + +# Configuration pins +#set_io CDONE 65 +#set_io CRESET_B 66 + +# 12 MHz clock +set_io clk 21 diff --git a/examples/verilog/icestick/io_core_uart/top_level.sv b/examples/verilog/icestick/io_core_uart/top_level.sv new file mode 100644 index 0000000..f0740f1 --- /dev/null +++ b/examples/verilog/icestick/io_core_uart/top_level.sv @@ -0,0 +1,33 @@ +`default_nettype none +`timescale 1ns / 1ps + +`include "manta.v" + +module top_level ( + input wire clk, + + output logic LED0, + output logic LED1, + output logic LED2, + output logic LED3, + output logic LED4, + + input wire rs232_rx_ttl, + output logic rs232_tx_ttl + ); + + manta manta_inst ( + .clk(clk), + .rst(0), + + .rx(rs232_rx_ttl), + .tx(rs232_tx_ttl), + + .LED0(LED0), + .LED1(LED1), + .LED2(LED2), + .LED3(LED3), + .LED4(LED4)); +endmodule + +`default_nettype wire \ No newline at end of file diff --git a/examples/verilog/icestick/logic_analyzer_uart/.gitignore b/examples/verilog/icestick/logic_analyzer_uart/.gitignore new file mode 100644 index 0000000..a670a87 --- /dev/null +++ b/examples/verilog/icestick/logic_analyzer_uart/.gitignore @@ -0,0 +1 @@ +!top_level.sv \ No newline at end of file diff --git a/examples/verilog/icestick/logic_analyzer_uart/build.sh b/examples/verilog/icestick/logic_analyzer_uart/build.sh new file mode 100755 index 0000000..a300d28 --- /dev/null +++ b/examples/verilog/icestick/logic_analyzer_uart/build.sh @@ -0,0 +1,4 @@ +python3 -m manta gen manta.yaml manta.v +$YOSYS -p 'synth_ice40 -top top_level -json top_level.json' top_level.sv +$NEXTPNR_ICE40 --hx1k --json top_level.json --pcf top_level.pcf --asc top_level.asc +$ICEPACK top_level.asc top_level.bin \ No newline at end of file diff --git a/examples/verilog/icestick/logic_analyzer_uart/manta.yaml b/examples/verilog/icestick/logic_analyzer_uart/manta.yaml new file mode 100644 index 0000000..6422e2e --- /dev/null +++ b/examples/verilog/icestick/logic_analyzer_uart/manta.yaml @@ -0,0 +1,19 @@ +--- +cores: + my_logic_analyzer: + type: logic_analyzer + sample_depth: 256 + + probes: + probe0: 1 + probe1: 4 + probe2: 8 + probe3: 16 + + triggers: + - probe2 EQ 3 + +uart: + port: "/dev/ttyUSB3" + baudrate: 115200 + clock_freq: 12000000 \ No newline at end of file diff --git a/examples/verilog/icestick/logic_analyzer_uart/top_level.pcf b/examples/verilog/icestick/logic_analyzer_uart/top_level.pcf new file mode 100644 index 0000000..d042aa0 --- /dev/null +++ b/examples/verilog/icestick/logic_analyzer_uart/top_level.pcf @@ -0,0 +1,67 @@ +# Generic iCEstick placement constraints file + +# Red LEDs +set_io LED0 99 +set_io LED1 98 +set_io LED2 97 +set_io LED3 96 + +# Green LED +set_io LED4 95 + +# IrDA port +#set_io RXD 106 +#set_io TXD 105 +#set_io SD 107 + +# Pmod connector +#set_io PIO1_02 78 # Pin 1 +#set_io PIO1_03 79 # Pin 2 +#set_io PIO1_04 80 # Pin 3 +#set_io PIO1_05 81 # Pin 4 +#set_io PIO1_06 87 # Pin 7 +#set_io PIO1_07 88 # Pin 8 +#set_io PIO1_08 90 # Pin 9 +#set_io PIO1_09 91 # Pin 10 + +# Connector J1 +#set_io PIO0_02 112 # Pin 3 +#set_io PIO0_03 113 # Pin 4 +#set_io PIO0_04 114 # Pin 5 +#set_io PIO0_05 115 # Pin 6 +#set_io PIO0_06 116 # Pin 7 +#set_io PIO0_07 117 # Pin 8 +#set_io PIO0_08 118 # Pin 9 +#set_io PIO0_09 119 # Pin 10 + +# Connector J3 +#set_io PIO2_17 62 # Pin 3 +#set_io PIO2_16 61 # Pin 4 +#set_io PIO2_15 60 # Pin 5 +#set_io PIO2_14 56 # Pin 6 +#set_io PIO2_13 48 # Pin 7 +#set_io PIO2_12 47 # Pin 8 +#set_io PIO2_11 45 # Pin 9 +#set_io PIO2_10 44 # Pin 10 + +# FTDI Port B UART +#set_io DCDn 1 +#set_io DSRn 2 +#set_io DTRn 3 +#set_io CTSn 4 +#set_io RTSn 7 +set_io rs232_tx_ttl 8 +set_io rs232_rx_ttl 9 + +# SPI +#set_io SPI_SCK 70 +#set_io SPI_SI 68 +#set_io SPI_SO 67 +#set_io SPI_SS_B 71 + +# Configuration pins +#set_io CDONE 65 +#set_io CRESET_B 66 + +# 12 MHz clock +set_io clk 21 diff --git a/examples/verilog/icestick/logic_analyzer_uart/top_level.sv b/examples/verilog/icestick/logic_analyzer_uart/top_level.sv new file mode 100644 index 0000000..620be4b --- /dev/null +++ b/examples/verilog/icestick/logic_analyzer_uart/top_level.sv @@ -0,0 +1,38 @@ +`default_nettype none +`timescale 1ns / 1ps + +`include "manta.v" + +module top_level ( + input wire clk, + + input wire rs232_rx_ttl, + output logic rs232_tx_ttl + ); + + logic probe0; + logic [3:0] probe1; + logic [7:0] probe2; + logic [15:0] probe3; + + always @(posedge clk) begin + probe0 <= probe0 + 1; + probe1 <= probe1 + 1; + probe2 <= probe2 + 1; + probe3 <= probe3 + 1; + end + + manta manta_inst ( + .clk(clk), + .rst(0), + + .rx(rs232_rx_ttl), + .tx(rs232_tx_ttl), + + .probe0(probe0), + .probe1(probe1), + .probe2(probe2), + .probe3(probe3)); +endmodule + +`default_nettype wire \ No newline at end of file From 60066ccdcab17a938c23c1ff692482209aac0bf4 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Wed, 6 Mar 2024 23:07:20 -0800 Subject: [PATCH 82/89] add examples for the Nexys4DDR, bump version to 1.0.0 --- .gitignore | 8 +- examples/icestick/io_core/blinky.py | 16 -- examples/icestick/io_core/build.sh | 4 - examples/icestick/io_core/manta.yaml | 16 -- examples/icestick/io_core/top_level.pcf | 67 ----- examples/icestick/io_core/top_level.sv | 33 --- .../verilog/icestick/io_core_uart/blinky.py | 6 +- .../.Xil/top_level_propImpl.xdc | 71 +++++ .../host_to_fpga_mem_uart}/.gitignore | 0 .../nexys_a7/host_to_fpga_mem_uart/build.sh | 3 + .../nexys_a7/host_to_fpga_mem_uart/build.tcl | 36 +++ .../nexys_a7/host_to_fpga_mem_uart/manta.yaml | 12 + .../host_to_fpga_mem_uart/top_level.sv | 23 ++ .../host_to_fpga_mem_uart/top_level.xdc | 254 ++++++++++++++++++ .../nexys_a7/host_to_fpga_mem_uart/write.py | 8 + .../io_core_uart/.Xil/top_level_propImpl.xdc | 93 +++++++ .../verilog/nexys_a7/io_core_uart/.gitignore | 1 + .../verilog/nexys_a7/io_core_uart/blinky.py | 25 ++ .../verilog/nexys_a7/io_core_uart/build.sh | 3 + .../verilog/nexys_a7/io_core_uart/build.tcl | 36 +++ .../verilog/nexys_a7/io_core_uart/manta.yaml | 26 ++ .../nexys_a7/io_core_uart/top_level.sv | 49 ++++ .../nexys_a7/io_core_uart/top_level.xdc | 254 ++++++++++++++++++ .../.Xil/top_level_propImpl.xdc | 11 + .../nexys_a7/logic_analyzer_uart/.gitignore | 1 + .../nexys_a7/logic_analyzer_uart/build.sh | 3 + .../nexys_a7/logic_analyzer_uart/build.tcl | 36 +++ .../nexys_a7/logic_analyzer_uart/manta.yaml | 19 ++ .../nexys_a7/logic_analyzer_uart/top_level.sv | 37 +++ .../logic_analyzer_uart/top_level.xdc | 254 ++++++++++++++++++ pyproject.toml | 2 +- src/manta/memory_core.py | 26 +- src/manta/utils.py | 2 + 33 files changed, 1280 insertions(+), 155 deletions(-) delete mode 100644 examples/icestick/io_core/blinky.py delete mode 100755 examples/icestick/io_core/build.sh delete mode 100644 examples/icestick/io_core/manta.yaml delete mode 100644 examples/icestick/io_core/top_level.pcf delete mode 100644 examples/icestick/io_core/top_level.sv create mode 100644 examples/verilog/nexys_a7/host_to_fpga_mem_uart/.Xil/top_level_propImpl.xdc rename examples/{icestick/io_core => verilog/nexys_a7/host_to_fpga_mem_uart}/.gitignore (100%) create mode 100755 examples/verilog/nexys_a7/host_to_fpga_mem_uart/build.sh create mode 100644 examples/verilog/nexys_a7/host_to_fpga_mem_uart/build.tcl create mode 100644 examples/verilog/nexys_a7/host_to_fpga_mem_uart/manta.yaml create mode 100644 examples/verilog/nexys_a7/host_to_fpga_mem_uart/top_level.sv create mode 100644 examples/verilog/nexys_a7/host_to_fpga_mem_uart/top_level.xdc create mode 100644 examples/verilog/nexys_a7/host_to_fpga_mem_uart/write.py create mode 100644 examples/verilog/nexys_a7/io_core_uart/.Xil/top_level_propImpl.xdc create mode 100644 examples/verilog/nexys_a7/io_core_uart/.gitignore create mode 100644 examples/verilog/nexys_a7/io_core_uart/blinky.py create mode 100755 examples/verilog/nexys_a7/io_core_uart/build.sh create mode 100644 examples/verilog/nexys_a7/io_core_uart/build.tcl create mode 100644 examples/verilog/nexys_a7/io_core_uart/manta.yaml create mode 100644 examples/verilog/nexys_a7/io_core_uart/top_level.sv create mode 100644 examples/verilog/nexys_a7/io_core_uart/top_level.xdc create mode 100644 examples/verilog/nexys_a7/logic_analyzer_uart/.Xil/top_level_propImpl.xdc create mode 100644 examples/verilog/nexys_a7/logic_analyzer_uart/.gitignore create mode 100755 examples/verilog/nexys_a7/logic_analyzer_uart/build.sh create mode 100644 examples/verilog/nexys_a7/logic_analyzer_uart/build.tcl create mode 100644 examples/verilog/nexys_a7/logic_analyzer_uart/manta.yaml create mode 100644 examples/verilog/nexys_a7/logic_analyzer_uart/top_level.sv create mode 100644 examples/verilog/nexys_a7/logic_analyzer_uart/top_level.xdc diff --git a/.gitignore b/.gitignore index 48226f2..6ef1d49 100644 --- a/.gitignore +++ b/.gitignore @@ -23,5 +23,9 @@ build/ *.bin *.bit *.out -*.xdc -.Xil/* \ No newline at end of file +.Xil/* + +# Yosys/IceStorm files from the same +*.asc +*.bin +*.json \ No newline at end of file diff --git a/examples/icestick/io_core/blinky.py b/examples/icestick/io_core/blinky.py deleted file mode 100644 index b1fd3d1..0000000 --- a/examples/icestick/io_core/blinky.py +++ /dev/null @@ -1,16 +0,0 @@ -from manta import Manta -from time import sleep - -manta = Manta('manta.yaml') - -i = 0 -while True: - # Turn each LED off - for j in range(5): - manta.my_io_core.set_probe(f"LED{j}", 0) - - # Turn one LED back on - manta.my_io_core.set_probe(f"LED{i}", 1) - - i = (i+1) % 5 - sleep(0.1) \ No newline at end of file diff --git a/examples/icestick/io_core/build.sh b/examples/icestick/io_core/build.sh deleted file mode 100755 index a300d28..0000000 --- a/examples/icestick/io_core/build.sh +++ /dev/null @@ -1,4 +0,0 @@ -python3 -m manta gen manta.yaml manta.v -$YOSYS -p 'synth_ice40 -top top_level -json top_level.json' top_level.sv -$NEXTPNR_ICE40 --hx1k --json top_level.json --pcf top_level.pcf --asc top_level.asc -$ICEPACK top_level.asc top_level.bin \ No newline at end of file diff --git a/examples/icestick/io_core/manta.yaml b/examples/icestick/io_core/manta.yaml deleted file mode 100644 index 162311e..0000000 --- a/examples/icestick/io_core/manta.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -cores: - my_io_core: - type: io - - outputs: - LED0: 1 - LED1: 1 - LED2: 1 - LED3: 1 - LED4: 1 - -uart: - port: "/dev/ttyUSB3" - baudrate: 115200 - clock_freq: 12000000 \ No newline at end of file diff --git a/examples/icestick/io_core/top_level.pcf b/examples/icestick/io_core/top_level.pcf deleted file mode 100644 index d042aa0..0000000 --- a/examples/icestick/io_core/top_level.pcf +++ /dev/null @@ -1,67 +0,0 @@ -# Generic iCEstick placement constraints file - -# Red LEDs -set_io LED0 99 -set_io LED1 98 -set_io LED2 97 -set_io LED3 96 - -# Green LED -set_io LED4 95 - -# IrDA port -#set_io RXD 106 -#set_io TXD 105 -#set_io SD 107 - -# Pmod connector -#set_io PIO1_02 78 # Pin 1 -#set_io PIO1_03 79 # Pin 2 -#set_io PIO1_04 80 # Pin 3 -#set_io PIO1_05 81 # Pin 4 -#set_io PIO1_06 87 # Pin 7 -#set_io PIO1_07 88 # Pin 8 -#set_io PIO1_08 90 # Pin 9 -#set_io PIO1_09 91 # Pin 10 - -# Connector J1 -#set_io PIO0_02 112 # Pin 3 -#set_io PIO0_03 113 # Pin 4 -#set_io PIO0_04 114 # Pin 5 -#set_io PIO0_05 115 # Pin 6 -#set_io PIO0_06 116 # Pin 7 -#set_io PIO0_07 117 # Pin 8 -#set_io PIO0_08 118 # Pin 9 -#set_io PIO0_09 119 # Pin 10 - -# Connector J3 -#set_io PIO2_17 62 # Pin 3 -#set_io PIO2_16 61 # Pin 4 -#set_io PIO2_15 60 # Pin 5 -#set_io PIO2_14 56 # Pin 6 -#set_io PIO2_13 48 # Pin 7 -#set_io PIO2_12 47 # Pin 8 -#set_io PIO2_11 45 # Pin 9 -#set_io PIO2_10 44 # Pin 10 - -# FTDI Port B UART -#set_io DCDn 1 -#set_io DSRn 2 -#set_io DTRn 3 -#set_io CTSn 4 -#set_io RTSn 7 -set_io rs232_tx_ttl 8 -set_io rs232_rx_ttl 9 - -# SPI -#set_io SPI_SCK 70 -#set_io SPI_SI 68 -#set_io SPI_SO 67 -#set_io SPI_SS_B 71 - -# Configuration pins -#set_io CDONE 65 -#set_io CRESET_B 66 - -# 12 MHz clock -set_io clk 21 diff --git a/examples/icestick/io_core/top_level.sv b/examples/icestick/io_core/top_level.sv deleted file mode 100644 index f0740f1..0000000 --- a/examples/icestick/io_core/top_level.sv +++ /dev/null @@ -1,33 +0,0 @@ -`default_nettype none -`timescale 1ns / 1ps - -`include "manta.v" - -module top_level ( - input wire clk, - - output logic LED0, - output logic LED1, - output logic LED2, - output logic LED3, - output logic LED4, - - input wire rs232_rx_ttl, - output logic rs232_tx_ttl - ); - - manta manta_inst ( - .clk(clk), - .rst(0), - - .rx(rs232_rx_ttl), - .tx(rs232_tx_ttl), - - .LED0(LED0), - .LED1(LED1), - .LED2(LED2), - .LED3(LED3), - .LED4(LED4)); -endmodule - -`default_nettype wire \ No newline at end of file diff --git a/examples/verilog/icestick/io_core_uart/blinky.py b/examples/verilog/icestick/io_core_uart/blinky.py index b1fd3d1..95d3dec 100644 --- a/examples/verilog/icestick/io_core_uart/blinky.py +++ b/examples/verilog/icestick/io_core_uart/blinky.py @@ -1,7 +1,7 @@ from manta import Manta from time import sleep -manta = Manta('manta.yaml') +manta = Manta("manta.yaml") i = 0 while True: @@ -12,5 +12,5 @@ while True: # Turn one LED back on manta.my_io_core.set_probe(f"LED{i}", 1) - i = (i+1) % 5 - sleep(0.1) \ No newline at end of file + i = (i + 1) % 5 + sleep(0.1) diff --git a/examples/verilog/nexys_a7/host_to_fpga_mem_uart/.Xil/top_level_propImpl.xdc b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/.Xil/top_level_propImpl.xdc new file mode 100644 index 0000000..a975d04 --- /dev/null +++ b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/.Xil/top_level_propImpl.xdc @@ -0,0 +1,71 @@ +set_property SRC_FILE_INFO {cfile:/home/fischerm/manta/examples/verilog/nexys_a7/host_to_fpga_mem_uart/top_level.xdc rfile:../top_level.xdc id:1} [current_design] +set_property src_info {type:XDC file:1 line:9 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk +set_property src_info {type:XDC file:1 line:14 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +set_property src_info {type:XDC file:1 line:15 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +set_property src_info {type:XDC file:1 line:16 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +set_property src_info {type:XDC file:1 line:17 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +set_property src_info {type:XDC file:1 line:18 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +set_property src_info {type:XDC file:1 line:19 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +set_property src_info {type:XDC file:1 line:20 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +set_property src_info {type:XDC file:1 line:21 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +set_property src_info {type:XDC file:1 line:22 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] +set_property src_info {type:XDC file:1 line:23 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] +set_property src_info {type:XDC file:1 line:24 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +set_property src_info {type:XDC file:1 line:25 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +set_property src_info {type:XDC file:1 line:26 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] +set_property src_info {type:XDC file:1 line:27 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +set_property src_info {type:XDC file:1 line:28 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +set_property src_info {type:XDC file:1 line:29 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] +set_property src_info {type:XDC file:1 line:34 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +set_property src_info {type:XDC file:1 line:35 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +set_property src_info {type:XDC file:1 line:36 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +set_property src_info {type:XDC file:1 line:37 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +set_property src_info {type:XDC file:1 line:38 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +set_property src_info {type:XDC file:1 line:39 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +set_property src_info {type:XDC file:1 line:40 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +set_property src_info {type:XDC file:1 line:41 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +set_property src_info {type:XDC file:1 line:42 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +set_property src_info {type:XDC file:1 line:43 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +set_property src_info {type:XDC file:1 line:44 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +set_property src_info {type:XDC file:1 line:45 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +set_property src_info {type:XDC file:1 line:46 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +set_property src_info {type:XDC file:1 line:47 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +set_property src_info {type:XDC file:1 line:48 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +set_property src_info {type:XDC file:1 line:49 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] +set_property src_info {type:XDC file:1 line:219 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +set_property src_info {type:XDC file:1 line:220 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out diff --git a/examples/icestick/io_core/.gitignore b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/.gitignore similarity index 100% rename from examples/icestick/io_core/.gitignore rename to examples/verilog/nexys_a7/host_to_fpga_mem_uart/.gitignore diff --git a/examples/verilog/nexys_a7/host_to_fpga_mem_uart/build.sh b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/build.sh new file mode 100755 index 0000000..829824b --- /dev/null +++ b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/build.sh @@ -0,0 +1,3 @@ +python3 -m manta gen manta.yaml manta.v +mkdir -p build/ +$VIVADO -mode batch -source build.tcl \ No newline at end of file diff --git a/examples/verilog/nexys_a7/host_to_fpga_mem_uart/build.tcl b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/build.tcl new file mode 100644 index 0000000..0e7570e --- /dev/null +++ b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/build.tcl @@ -0,0 +1,36 @@ +#!/usr/bin/tclsh + +set partNum xc7a100tcsg324-1 +set outputDir build + +read_verilog -sv [ glob *.{sv,v,svh,vh} ] +read_xdc top_level.xdc + +set_part $partNum + +# synth +synth_design -top top_level -part $partNum -verbose +report_utilization -file $outputDir/post_synth_util.rpt +report_timing_summary -file $outputDir/post_synth_timing_summary.rpt +report_timing -file $outputDir/post_synth_timing.rpt + +# place +opt_design +place_design +phys_opt_design +report_utilization -file $outputDir/post_place_util.rpt + +report_clock_utilization -file $outputDir/clock_util.rpt +report_timing_summary -file $outputDir/post_place_timing_summary.rpt +report_timing -file $outputDir/post_place_timing.rpt + +# route design and generate bitstream +route_design -directive Explore +write_bitstream -force $outputDir/out.bit + +report_route_status -file $outputDir/post_route_status.rpt +report_timing_summary -file $outputDir/post_route_timing_summary.rpt +report_timing -file $outputDir/post_route_timing.rpt +report_power -file $outputDir/post_route_power.rpt +report_drc -file $outputDir/post_imp_drc.rpt +write_verilog -force $outputDir/cpu_impl_netlist.v -mode timesim -sdf_anno true diff --git a/examples/verilog/nexys_a7/host_to_fpga_mem_uart/manta.yaml b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/manta.yaml new file mode 100644 index 0000000..382458c --- /dev/null +++ b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/manta.yaml @@ -0,0 +1,12 @@ +--- +cores: + my_memory: + type: memory + mode: host_to_fpga + width: 16 + depth: 1024 + +uart: + port: "/dev/ttyUSB1" + baudrate: 115200 + clock_freq: 100000000 \ No newline at end of file diff --git a/examples/verilog/nexys_a7/host_to_fpga_mem_uart/top_level.sv b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/top_level.sv new file mode 100644 index 0000000..7272c36 --- /dev/null +++ b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/top_level.sv @@ -0,0 +1,23 @@ +`default_nettype none +`timescale 1ns / 1ps + +module top_level ( + input wire clk, + input wire [15:0] sw, + output logic [15:0] led, + + input wire uart_txd_in, + output logic uart_rxd_out); + + manta manta_inst ( + .clk(clk), + + .rx(uart_txd_in), + .tx(uart_rxd_out), + + .user_addr(sw), + .user_data_out(led)); + +endmodule + +`default_nettype wire \ No newline at end of file diff --git a/examples/verilog/nexys_a7/host_to_fpga_mem_uart/top_level.xdc b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/top_level.xdc new file mode 100644 index 0000000..6184324 --- /dev/null +++ b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/top_level.xdc @@ -0,0 +1,254 @@ +## This file is a general .xdc for the Nexys4 DDR Rev. C +## To use it in a project: +## - uncomment the lines corresponding to used pins +## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project + +## This file has been modified from the default .xdc provided by Digilent for the Nexys A7 + +## Clock signal - uncomment _both_ of these lines to create clk_100mhz +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk}]; + +##Switches + +set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] +set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] +set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] +set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] + + +## LEDs + +set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] + +#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b +#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g +#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r +#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b +#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g +#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r + + +##7 segment display + +#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca +#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb +#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc +#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd +#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce +#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf +#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg + +#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp + +#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] +#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] +#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] +#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] +#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] +#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] +#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] +#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] + + +##Buttons + +#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn + +#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc +#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu +#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl +#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr +#set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd + + +##Pmod Headers + + +##Pmod Header JA + +#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] +#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] +#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] +#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] +#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] +#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] +#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] +#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] + + +##Pmod Header JB + +#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] +#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] +#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] +#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] +#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] +#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] +#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] +#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] + + +##Pmod Header JC + +#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] +#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] +#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] +#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] +#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] +#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] +#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] +#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] + + +##Pmod Header JD + +#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] +#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] +#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] +#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] +#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] +#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] +#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] +#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] + + +##Pmod Header JXADC + +#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] +#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] +#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] +#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] +#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] +#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] +#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] +#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] + + +##VGA Connector + +#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] +#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] +#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] +#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] +# +#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] +#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] +#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] +#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] +# +#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] +#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] +#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] +#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] + +#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs +#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs + +##Micro SD Connector + +#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset +#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd +#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck +#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd +#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] +#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] +#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] +#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] + + +##Accelerometer + +#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso +#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi +#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk +#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn +#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] +#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] + + +##Temperature Sensor + +#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl +#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda +#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int +#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct + +##Omnidirectional Microphone + +#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk +#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data +#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel + + +##PWM Audio Amplifier + +#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm +#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd + + +##USB-RS232 Interface + +set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out +#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts +#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts + +##USB HID (PS/2) + +#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk +#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data + + +##SMSC Ethernet PHY + +#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc +#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio +#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn +#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crs/udv +#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr +#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] +#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] +#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen +#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] +#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] +#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk +#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn + + +##Quad SPI Flash + +#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] +#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] +#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] +#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] +#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn + + diff --git a/examples/verilog/nexys_a7/host_to_fpga_mem_uart/write.py b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/write.py new file mode 100644 index 0000000..3c62506 --- /dev/null +++ b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/write.py @@ -0,0 +1,8 @@ +from manta import Manta + +m = Manta("manta.yaml") + +# Memory addresses can be written to in Python, and then be read out by +# flipping the switches on the FPGA, and watching the LEDs update! + +m.my_memory.write(0, 1) diff --git a/examples/verilog/nexys_a7/io_core_uart/.Xil/top_level_propImpl.xdc b/examples/verilog/nexys_a7/io_core_uart/.Xil/top_level_propImpl.xdc new file mode 100644 index 0000000..e76c2e0 --- /dev/null +++ b/examples/verilog/nexys_a7/io_core_uart/.Xil/top_level_propImpl.xdc @@ -0,0 +1,93 @@ +set_property SRC_FILE_INFO {cfile:/home/fischerm/manta/examples/verilog/nexys_a7/io_core_uart/top_level.xdc rfile:../top_level.xdc id:1} [current_design] +set_property src_info {type:XDC file:1 line:9 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk +set_property src_info {type:XDC file:1 line:14 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +set_property src_info {type:XDC file:1 line:15 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +set_property src_info {type:XDC file:1 line:16 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +set_property src_info {type:XDC file:1 line:17 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +set_property src_info {type:XDC file:1 line:18 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +set_property src_info {type:XDC file:1 line:19 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +set_property src_info {type:XDC file:1 line:20 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +set_property src_info {type:XDC file:1 line:21 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +set_property src_info {type:XDC file:1 line:22 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] +set_property src_info {type:XDC file:1 line:23 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] +set_property src_info {type:XDC file:1 line:24 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +set_property src_info {type:XDC file:1 line:25 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +set_property src_info {type:XDC file:1 line:26 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] +set_property src_info {type:XDC file:1 line:27 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +set_property src_info {type:XDC file:1 line:28 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +set_property src_info {type:XDC file:1 line:29 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] +set_property src_info {type:XDC file:1 line:34 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +set_property src_info {type:XDC file:1 line:35 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +set_property src_info {type:XDC file:1 line:36 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +set_property src_info {type:XDC file:1 line:37 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +set_property src_info {type:XDC file:1 line:38 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +set_property src_info {type:XDC file:1 line:39 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +set_property src_info {type:XDC file:1 line:40 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +set_property src_info {type:XDC file:1 line:41 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +set_property src_info {type:XDC file:1 line:42 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +set_property src_info {type:XDC file:1 line:43 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +set_property src_info {type:XDC file:1 line:44 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +set_property src_info {type:XDC file:1 line:45 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +set_property src_info {type:XDC file:1 line:46 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +set_property src_info {type:XDC file:1 line:47 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +set_property src_info {type:XDC file:1 line:48 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +set_property src_info {type:XDC file:1 line:49 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] +set_property src_info {type:XDC file:1 line:51 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b +set_property src_info {type:XDC file:1 line:52 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g +set_property src_info {type:XDC file:1 line:53 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r +set_property src_info {type:XDC file:1 line:54 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b +set_property src_info {type:XDC file:1 line:55 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g +set_property src_info {type:XDC file:1 line:56 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r +set_property src_info {type:XDC file:1 line:85 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc +set_property src_info {type:XDC file:1 line:86 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu +set_property src_info {type:XDC file:1 line:87 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl +set_property src_info {type:XDC file:1 line:88 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr +set_property src_info {type:XDC file:1 line:89 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd +set_property src_info {type:XDC file:1 line:219 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +set_property src_info {type:XDC file:1 line:220 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out diff --git a/examples/verilog/nexys_a7/io_core_uart/.gitignore b/examples/verilog/nexys_a7/io_core_uart/.gitignore new file mode 100644 index 0000000..a670a87 --- /dev/null +++ b/examples/verilog/nexys_a7/io_core_uart/.gitignore @@ -0,0 +1 @@ +!top_level.sv \ No newline at end of file diff --git a/examples/verilog/nexys_a7/io_core_uart/blinky.py b/examples/verilog/nexys_a7/io_core_uart/blinky.py new file mode 100644 index 0000000..e4c4920 --- /dev/null +++ b/examples/verilog/nexys_a7/io_core_uart/blinky.py @@ -0,0 +1,25 @@ +from manta import Manta +from time import sleep +from random import randint + +m = Manta("manta.yaml") + +i = 0 +while True: + i = (i + 1) % 16 + m.my_io_core.set_probe("led", 2**i) + + m.my_io_core.set_probe("led16_r", randint(0, 1)) + m.my_io_core.set_probe("led16_g", randint(0, 1)) + m.my_io_core.set_probe("led16_b", randint(0, 1)) + + print(f'Switches: {m.my_io_core.get_probe("sw")}') + print(f"Buttons:") + print(f'btnu: {m.my_io_core.get_probe("btnu")}') + print(f'btnd: {m.my_io_core.get_probe("btnd")}') + print(f'btnr: {m.my_io_core.get_probe("btnr")}') + print(f'btnl: {m.my_io_core.get_probe("btnl")}') + print(f'btnc: {m.my_io_core.get_probe("btnc")}') + print("") + + sleep(0.1) diff --git a/examples/verilog/nexys_a7/io_core_uart/build.sh b/examples/verilog/nexys_a7/io_core_uart/build.sh new file mode 100755 index 0000000..829824b --- /dev/null +++ b/examples/verilog/nexys_a7/io_core_uart/build.sh @@ -0,0 +1,3 @@ +python3 -m manta gen manta.yaml manta.v +mkdir -p build/ +$VIVADO -mode batch -source build.tcl \ No newline at end of file diff --git a/examples/verilog/nexys_a7/io_core_uart/build.tcl b/examples/verilog/nexys_a7/io_core_uart/build.tcl new file mode 100644 index 0000000..0e7570e --- /dev/null +++ b/examples/verilog/nexys_a7/io_core_uart/build.tcl @@ -0,0 +1,36 @@ +#!/usr/bin/tclsh + +set partNum xc7a100tcsg324-1 +set outputDir build + +read_verilog -sv [ glob *.{sv,v,svh,vh} ] +read_xdc top_level.xdc + +set_part $partNum + +# synth +synth_design -top top_level -part $partNum -verbose +report_utilization -file $outputDir/post_synth_util.rpt +report_timing_summary -file $outputDir/post_synth_timing_summary.rpt +report_timing -file $outputDir/post_synth_timing.rpt + +# place +opt_design +place_design +phys_opt_design +report_utilization -file $outputDir/post_place_util.rpt + +report_clock_utilization -file $outputDir/clock_util.rpt +report_timing_summary -file $outputDir/post_place_timing_summary.rpt +report_timing -file $outputDir/post_place_timing.rpt + +# route design and generate bitstream +route_design -directive Explore +write_bitstream -force $outputDir/out.bit + +report_route_status -file $outputDir/post_route_status.rpt +report_timing_summary -file $outputDir/post_route_timing_summary.rpt +report_timing -file $outputDir/post_route_timing.rpt +report_power -file $outputDir/post_route_power.rpt +report_drc -file $outputDir/post_imp_drc.rpt +write_verilog -force $outputDir/cpu_impl_netlist.v -mode timesim -sdf_anno true diff --git a/examples/verilog/nexys_a7/io_core_uart/manta.yaml b/examples/verilog/nexys_a7/io_core_uart/manta.yaml new file mode 100644 index 0000000..b924fb3 --- /dev/null +++ b/examples/verilog/nexys_a7/io_core_uart/manta.yaml @@ -0,0 +1,26 @@ +--- +cores: + my_io_core: + type: io + + inputs: + btnu: 1 + btnd: 1 + btnl: 1 + btnr: 1 + btnc: 1 + sw: 16 + + outputs: + led: 16 + led16_b: 1 + led16_g: 1 + led16_r: 1 + led17_b: 1 + led17_g: 1 + led17_r: 1 + +uart: + port: "/dev/ttyUSB1" + baudrate: 115200 + clock_freq: 100000000 \ No newline at end of file diff --git a/examples/verilog/nexys_a7/io_core_uart/top_level.sv b/examples/verilog/nexys_a7/io_core_uart/top_level.sv new file mode 100644 index 0000000..a005530 --- /dev/null +++ b/examples/verilog/nexys_a7/io_core_uart/top_level.sv @@ -0,0 +1,49 @@ +`default_nettype none +`timescale 1ns / 1ps + +module top_level ( + input wire clk, + + input wire uart_txd_in, + output logic uart_rxd_out, + + input wire btnu, + input wire btnd, + input wire btnl, + input wire btnr, + input wire btnc, + + input wire [15:0] sw, + + output logic [15:0] led, + output logic led16_b, + output logic led16_g, + output logic led16_r, + output logic led17_b, + output logic led17_g, + output logic led17_r); + + manta manta_inst ( + .clk(clk), + .rst(0), + + .rx(uart_txd_in), + .tx(uart_rxd_out), + + .btnu(btnu), + .btnd(btnd), + .btnl(btnl), + .btnr(btnr), + .btnc(btnc), + .sw(sw), + .led(led), + .led16_b(led16_b), + .led16_g(led16_g), + .led16_r(led16_r), + .led17_b(led17_b), + .led17_g(led17_g), + .led17_r(led17_r)); + +endmodule + +`default_nettype wire \ No newline at end of file diff --git a/examples/verilog/nexys_a7/io_core_uart/top_level.xdc b/examples/verilog/nexys_a7/io_core_uart/top_level.xdc new file mode 100644 index 0000000..82c04c3 --- /dev/null +++ b/examples/verilog/nexys_a7/io_core_uart/top_level.xdc @@ -0,0 +1,254 @@ +## This file is a general .xdc for the Nexys4 DDR Rev. C +## To use it in a project: +## - uncomment the lines corresponding to used pins +## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project + +## This file has been modified from the default .xdc provided by Digilent for the Nexys A7 + +## Clock signal - uncomment _both_ of these lines to create clk_100mhz +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk}]; + +##Switches + +set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] +set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] +set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] +set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] + + +## LEDs + +set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] + +set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b +set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g +set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r +set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b +set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g +set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r + + +##7 segment display + +#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca +#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb +#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc +#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd +#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce +#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf +#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg + +#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp + +#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] +#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] +#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] +#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] +#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] +#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] +#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] +#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] + + +##Buttons + +#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn + +set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc +set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu +set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl +set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr +set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd + + +##Pmod Headers + + +##Pmod Header JA + +#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] +#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] +#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] +#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] +#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] +#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] +#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] +#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] + + +##Pmod Header JB + +#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] +#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] +#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] +#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] +#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] +#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] +#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] +#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] + + +##Pmod Header JC + +#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] +#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] +#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] +#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] +#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] +#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] +#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] +#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] + + +##Pmod Header JD + +#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] +#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] +#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] +#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] +#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] +#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] +#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] +#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] + + +##Pmod Header JXADC + +#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] +#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] +#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] +#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] +#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] +#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] +#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] +#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] + + +##VGA Connector + +#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] +#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] +#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] +#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] +# +#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] +#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] +#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] +#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] +# +#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] +#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] +#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] +#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] + +#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs +#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs + +##Micro SD Connector + +#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset +#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd +#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck +#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd +#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] +#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] +#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] +#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] + + +##Accelerometer + +#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso +#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi +#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk +#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn +#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] +#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] + + +##Temperature Sensor + +#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl +#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda +#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int +#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct + +##Omnidirectional Microphone + +#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk +#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data +#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel + + +##PWM Audio Amplifier + +#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm +#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd + + +##USB-RS232 Interface + +set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out +#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts +#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts + +##USB HID (PS/2) + +#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk +#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data + + +##SMSC Ethernet PHY + +#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc +#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio +#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn +#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crs/udv +#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr +#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] +#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] +#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen +#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] +#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] +#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk +#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn + + +##Quad SPI Flash + +#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] +#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] +#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] +#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] +#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn + + diff --git a/examples/verilog/nexys_a7/logic_analyzer_uart/.Xil/top_level_propImpl.xdc b/examples/verilog/nexys_a7/logic_analyzer_uart/.Xil/top_level_propImpl.xdc new file mode 100644 index 0000000..9b1c029 --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_uart/.Xil/top_level_propImpl.xdc @@ -0,0 +1,11 @@ +set_property SRC_FILE_INFO {cfile:/home/fischerm/manta/examples/verilog/nexys_a7/logic_analyzer_uart/top_level.xdc rfile:../top_level.xdc id:1} [current_design] +set_property src_info {type:XDC file:1 line:9 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk +set_property src_info {type:XDC file:1 line:219 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +set_property src_info {type:XDC file:1 line:220 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out +set_property src_info {type:XDC file:1 line:226 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk +set_property src_info {type:XDC file:1 line:227 export:INPUT save:INPUT read:READ} [current_design] +set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data diff --git a/examples/verilog/nexys_a7/logic_analyzer_uart/.gitignore b/examples/verilog/nexys_a7/logic_analyzer_uart/.gitignore new file mode 100644 index 0000000..a670a87 --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_uart/.gitignore @@ -0,0 +1 @@ +!top_level.sv \ No newline at end of file diff --git a/examples/verilog/nexys_a7/logic_analyzer_uart/build.sh b/examples/verilog/nexys_a7/logic_analyzer_uart/build.sh new file mode 100755 index 0000000..829824b --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_uart/build.sh @@ -0,0 +1,3 @@ +python3 -m manta gen manta.yaml manta.v +mkdir -p build/ +$VIVADO -mode batch -source build.tcl \ No newline at end of file diff --git a/examples/verilog/nexys_a7/logic_analyzer_uart/build.tcl b/examples/verilog/nexys_a7/logic_analyzer_uart/build.tcl new file mode 100644 index 0000000..0e7570e --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_uart/build.tcl @@ -0,0 +1,36 @@ +#!/usr/bin/tclsh + +set partNum xc7a100tcsg324-1 +set outputDir build + +read_verilog -sv [ glob *.{sv,v,svh,vh} ] +read_xdc top_level.xdc + +set_part $partNum + +# synth +synth_design -top top_level -part $partNum -verbose +report_utilization -file $outputDir/post_synth_util.rpt +report_timing_summary -file $outputDir/post_synth_timing_summary.rpt +report_timing -file $outputDir/post_synth_timing.rpt + +# place +opt_design +place_design +phys_opt_design +report_utilization -file $outputDir/post_place_util.rpt + +report_clock_utilization -file $outputDir/clock_util.rpt +report_timing_summary -file $outputDir/post_place_timing_summary.rpt +report_timing -file $outputDir/post_place_timing.rpt + +# route design and generate bitstream +route_design -directive Explore +write_bitstream -force $outputDir/out.bit + +report_route_status -file $outputDir/post_route_status.rpt +report_timing_summary -file $outputDir/post_route_timing_summary.rpt +report_timing -file $outputDir/post_route_timing.rpt +report_power -file $outputDir/post_route_power.rpt +report_drc -file $outputDir/post_imp_drc.rpt +write_verilog -force $outputDir/cpu_impl_netlist.v -mode timesim -sdf_anno true diff --git a/examples/verilog/nexys_a7/logic_analyzer_uart/manta.yaml b/examples/verilog/nexys_a7/logic_analyzer_uart/manta.yaml new file mode 100644 index 0000000..6502705 --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_uart/manta.yaml @@ -0,0 +1,19 @@ +--- +cores: + my_logic_analyzer: + type: logic_analyzer + sample_depth: 256 + + probes: + probe0: 1 + probe1: 4 + probe2: 8 + probe3: 16 + + triggers: + - probe2 EQ 3 + +uart: + port: "/dev/ttyUSB1" + baudrate: 115200 + clock_freq: 100000000 \ No newline at end of file diff --git a/examples/verilog/nexys_a7/logic_analyzer_uart/top_level.sv b/examples/verilog/nexys_a7/logic_analyzer_uart/top_level.sv new file mode 100644 index 0000000..b79f36b --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_uart/top_level.sv @@ -0,0 +1,37 @@ +`default_nettype none +`timescale 1ns / 1ps + +module top_level ( + input wire clk, + + input wire uart_txd_in, + output logic uart_rxd_out + ); + + logic probe0; + logic [3:0] probe1; + logic [7:0] probe2; + logic [15:0] probe3; + + always @(posedge clk) begin + probe0 <= probe0 + 1; + probe1 <= probe1 + 1; + probe2 <= probe2 + 1; + probe3 <= probe3 + 1; + end + + manta manta_inst ( + .clk(clk), + .rst(0), + + .rx(uart_txd_in), + .tx(uart_rxd_out), + + .probe0(probe0), + .probe1(probe1), + .probe2(probe2), + .probe3(probe3)); + +endmodule + +`default_nettype wire \ No newline at end of file diff --git a/examples/verilog/nexys_a7/logic_analyzer_uart/top_level.xdc b/examples/verilog/nexys_a7/logic_analyzer_uart/top_level.xdc new file mode 100644 index 0000000..81c1998 --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_uart/top_level.xdc @@ -0,0 +1,254 @@ +## This file is a general .xdc for the Nexys4 DDR Rev. C +## To use it in a project: +## - uncomment the lines corresponding to used pins +## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project + +## This file has been modified from the default .xdc provided by Digilent for the Nexys A7 + +## Clock signal - uncomment _both_ of these lines to create clk_100mhz +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk}]; + +##Switches + +#set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +#set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +#set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +#set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +#set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +#set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +#set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +#set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +#set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] +#set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] +#set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +#set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +#set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] +#set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +#set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +#set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] + + +## LEDs + +#set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +#set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +#set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +#set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +#set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +#set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +#set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +#set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +#set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +#set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +#set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +#set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +#set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +#set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +#set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +#set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] + +#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b +#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g +#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r +#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b +#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g +#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r + + +##7 segment display + +#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca +#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb +#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc +#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd +#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce +#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf +#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg + +#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp + +#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] +#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] +#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] +#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] +#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] +#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] +#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] +#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] + + +##Buttons + +#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn + +#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc +#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu +#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl +#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr +#set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd + + +##Pmod Headers + + +##Pmod Header JA + +#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] +#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] +#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] +#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] +#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] +#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] +#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] +#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] + + +##Pmod Header JB + +#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] +#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] +#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] +#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] +#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] +#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] +#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] +#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] + + +##Pmod Header JC + +#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] +#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] +#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] +#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] +#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] +#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] +#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] +#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] + + +##Pmod Header JD + +#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] +#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] +#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] +#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] +#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] +#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] +#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] +#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] + + +##Pmod Header JXADC + +#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] +#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] +#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] +#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] +#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] +#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] +#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] +#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] + + +##VGA Connector + +#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] +#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] +#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] +#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] +# +#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] +#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] +#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] +#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] +# +#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] +#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] +#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] +#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] + +#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs +#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs + +##Micro SD Connector + +#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset +#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd +#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck +#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd +#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] +#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] +#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] +#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] + + +##Accelerometer + +#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso +#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi +#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk +#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn +#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] +#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] + + +##Temperature Sensor + +#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl +#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda +#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int +#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct + +##Omnidirectional Microphone + +#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk +#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data +#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel + + +##PWM Audio Amplifier + +#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm +#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd + + +##USB-RS232 Interface + +set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out +#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts +#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts + +##USB HID (PS/2) + +set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk +set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data + + +##SMSC Ethernet PHY + +#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc +#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio +#set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn +#set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crs/udv +#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr +#set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] +#set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] +#set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen +#set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] +#set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] +#set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk +#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn + + +##Quad SPI Flash + +#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] +#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] +#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] +#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] +#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn + + diff --git a/pyproject.toml b/pyproject.toml index b794d15..711a9b0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "manta" -version = "0.1.0" +version = "1.0.0" authors = [ { name="Fischer Moseley", email="fischerm@mit.edu" }, ] diff --git a/src/manta/memory_core.py b/src/manta/memory_core.py index 32237ab..177cae7 100644 --- a/src/manta/memory_core.py +++ b/src/manta/memory_core.py @@ -60,6 +60,19 @@ class MemoryCore(MantaCore): self.user_write_enable, ] + # Define memories + n_full = self._width // 16 + n_partial = self._width % 16 + + self._mems = [ + Memory(width=16, depth=self._depth, init=[0] * self._depth) + for _ in range(n_full) + ] + if n_partial > 0: + self._mems += [ + Memory(width=n_partial, depth=self._depth, init=[0] * self._depth) + ] + @property def top_level_ports(self): return self._top_level_ports @@ -199,19 +212,6 @@ class MemoryCore(MantaCore): def elaborate(self, platform): m = Module() - # Define memories - n_full = self._width // 16 - n_partial = self._width % 16 - - self._mems = [ - Memory(width=16, depth=self._depth, init=[0] * self._depth) - for _ in range(n_full) - ] - if n_partial > 0: - self._mems += [ - Memory(width=n_partial, depth=self._depth, init=[0] * self._depth) - ] - # Add memories as submodules for i, mem in enumerate(self._mems): m.submodules[f"mem_{i}"] = mem diff --git a/src/manta/utils.py b/src/manta/utils.py index e2fa22c..62913c5 100644 --- a/src/manta/utils.py +++ b/src/manta/utils.py @@ -115,6 +115,7 @@ def split_into_chunks(data, chunk_size): return [data[i : i + chunk_size] for i in range(0, len(data), chunk_size)] + def make_build_dir_if_it_does_not_exist_already(): """ Make build/ if it doesn't exist already. @@ -133,6 +134,7 @@ def simulate(top): def decorator(testbench): make_build_dir_if_it_does_not_exist_already() + def wrapper(*args, **kwargs): sim = Simulator(top) sim.add_clock(1e-6) # 1 MHz From 7957d41a9926165158a39dfb52929f94c68b627c Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Wed, 6 Mar 2024 23:09:37 -0800 Subject: [PATCH 83/89] fix consistency in .gitignore --- .gitignore | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 6ef1d49..348d56d 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,7 @@ build/ *.out *.csv -# Vivado files from the occasional debugging sesh +# Vivado files *.log *.jou *.rpt @@ -25,7 +25,7 @@ build/ *.out .Xil/* -# Yosys/IceStorm files from the same +# Yosys/IceStorm files *.asc *.bin *.json \ No newline at end of file From 04cfa4119064dd5b790747cbed0ee2dfeff56148 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 7 Mar 2024 09:18:30 -0800 Subject: [PATCH 84/89] add logic analyzer/io core ethernet example --- .../.Xil/top_level_propImpl.xdc | 71 ----- .../io_core_uart/.Xil/top_level_propImpl.xdc | 93 ------- .../logic_analyzer_io_core_ethernet/build.sh | 3 + .../logic_analyzer_io_core_ethernet/build.tcl | 36 +++ .../manta.yaml | 35 +++ .../logic_analyzer_io_core_ethernet/test.py | 6 + .../top_level.xdc | 260 ++++++++++++++++++ .../.Xil/top_level_propImpl.xdc | 11 - 8 files changed, 340 insertions(+), 175 deletions(-) delete mode 100644 examples/verilog/nexys_a7/host_to_fpga_mem_uart/.Xil/top_level_propImpl.xdc delete mode 100644 examples/verilog/nexys_a7/io_core_uart/.Xil/top_level_propImpl.xdc create mode 100755 examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/build.sh create mode 100644 examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/build.tcl create mode 100644 examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/manta.yaml create mode 100644 examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/test.py create mode 100644 examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/top_level.xdc delete mode 100644 examples/verilog/nexys_a7/logic_analyzer_uart/.Xil/top_level_propImpl.xdc diff --git a/examples/verilog/nexys_a7/host_to_fpga_mem_uart/.Xil/top_level_propImpl.xdc b/examples/verilog/nexys_a7/host_to_fpga_mem_uart/.Xil/top_level_propImpl.xdc deleted file mode 100644 index a975d04..0000000 --- a/examples/verilog/nexys_a7/host_to_fpga_mem_uart/.Xil/top_level_propImpl.xdc +++ /dev/null @@ -1,71 +0,0 @@ -set_property SRC_FILE_INFO {cfile:/home/fischerm/manta/examples/verilog/nexys_a7/host_to_fpga_mem_uart/top_level.xdc rfile:../top_level.xdc id:1} [current_design] -set_property src_info {type:XDC file:1 line:9 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk -set_property src_info {type:XDC file:1 line:14 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] -set_property src_info {type:XDC file:1 line:15 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] -set_property src_info {type:XDC file:1 line:16 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] -set_property src_info {type:XDC file:1 line:17 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] -set_property src_info {type:XDC file:1 line:18 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] -set_property src_info {type:XDC file:1 line:19 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] -set_property src_info {type:XDC file:1 line:20 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] -set_property src_info {type:XDC file:1 line:21 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] -set_property src_info {type:XDC file:1 line:22 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] -set_property src_info {type:XDC file:1 line:23 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] -set_property src_info {type:XDC file:1 line:24 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] -set_property src_info {type:XDC file:1 line:25 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] -set_property src_info {type:XDC file:1 line:26 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] -set_property src_info {type:XDC file:1 line:27 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] -set_property src_info {type:XDC file:1 line:28 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] -set_property src_info {type:XDC file:1 line:29 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] -set_property src_info {type:XDC file:1 line:34 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] -set_property src_info {type:XDC file:1 line:35 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] -set_property src_info {type:XDC file:1 line:36 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] -set_property src_info {type:XDC file:1 line:37 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] -set_property src_info {type:XDC file:1 line:38 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] -set_property src_info {type:XDC file:1 line:39 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] -set_property src_info {type:XDC file:1 line:40 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] -set_property src_info {type:XDC file:1 line:41 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] -set_property src_info {type:XDC file:1 line:42 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] -set_property src_info {type:XDC file:1 line:43 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] -set_property src_info {type:XDC file:1 line:44 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] -set_property src_info {type:XDC file:1 line:45 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] -set_property src_info {type:XDC file:1 line:46 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] -set_property src_info {type:XDC file:1 line:47 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] -set_property src_info {type:XDC file:1 line:48 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] -set_property src_info {type:XDC file:1 line:49 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] -set_property src_info {type:XDC file:1 line:219 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in -set_property src_info {type:XDC file:1 line:220 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out diff --git a/examples/verilog/nexys_a7/io_core_uart/.Xil/top_level_propImpl.xdc b/examples/verilog/nexys_a7/io_core_uart/.Xil/top_level_propImpl.xdc deleted file mode 100644 index e76c2e0..0000000 --- a/examples/verilog/nexys_a7/io_core_uart/.Xil/top_level_propImpl.xdc +++ /dev/null @@ -1,93 +0,0 @@ -set_property SRC_FILE_INFO {cfile:/home/fischerm/manta/examples/verilog/nexys_a7/io_core_uart/top_level.xdc rfile:../top_level.xdc id:1} [current_design] -set_property src_info {type:XDC file:1 line:9 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk -set_property src_info {type:XDC file:1 line:14 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] -set_property src_info {type:XDC file:1 line:15 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] -set_property src_info {type:XDC file:1 line:16 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] -set_property src_info {type:XDC file:1 line:17 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] -set_property src_info {type:XDC file:1 line:18 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] -set_property src_info {type:XDC file:1 line:19 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] -set_property src_info {type:XDC file:1 line:20 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] -set_property src_info {type:XDC file:1 line:21 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] -set_property src_info {type:XDC file:1 line:22 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] -set_property src_info {type:XDC file:1 line:23 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] -set_property src_info {type:XDC file:1 line:24 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] -set_property src_info {type:XDC file:1 line:25 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] -set_property src_info {type:XDC file:1 line:26 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] -set_property src_info {type:XDC file:1 line:27 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] -set_property src_info {type:XDC file:1 line:28 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] -set_property src_info {type:XDC file:1 line:29 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] -set_property src_info {type:XDC file:1 line:34 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] -set_property src_info {type:XDC file:1 line:35 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] -set_property src_info {type:XDC file:1 line:36 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] -set_property src_info {type:XDC file:1 line:37 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] -set_property src_info {type:XDC file:1 line:38 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] -set_property src_info {type:XDC file:1 line:39 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] -set_property src_info {type:XDC file:1 line:40 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] -set_property src_info {type:XDC file:1 line:41 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] -set_property src_info {type:XDC file:1 line:42 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] -set_property src_info {type:XDC file:1 line:43 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] -set_property src_info {type:XDC file:1 line:44 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] -set_property src_info {type:XDC file:1 line:45 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] -set_property src_info {type:XDC file:1 line:46 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] -set_property src_info {type:XDC file:1 line:47 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] -set_property src_info {type:XDC file:1 line:48 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] -set_property src_info {type:XDC file:1 line:49 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] -set_property src_info {type:XDC file:1 line:51 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b -set_property src_info {type:XDC file:1 line:52 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g -set_property src_info {type:XDC file:1 line:53 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r -set_property src_info {type:XDC file:1 line:54 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b -set_property src_info {type:XDC file:1 line:55 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g -set_property src_info {type:XDC file:1 line:56 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r -set_property src_info {type:XDC file:1 line:85 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc -set_property src_info {type:XDC file:1 line:86 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu -set_property src_info {type:XDC file:1 line:87 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl -set_property src_info {type:XDC file:1 line:88 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr -set_property src_info {type:XDC file:1 line:89 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd -set_property src_info {type:XDC file:1 line:219 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in -set_property src_info {type:XDC file:1 line:220 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out diff --git a/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/build.sh b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/build.sh new file mode 100755 index 0000000..829824b --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/build.sh @@ -0,0 +1,3 @@ +python3 -m manta gen manta.yaml manta.v +mkdir -p build/ +$VIVADO -mode batch -source build.tcl \ No newline at end of file diff --git a/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/build.tcl b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/build.tcl new file mode 100644 index 0000000..0e7570e --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/build.tcl @@ -0,0 +1,36 @@ +#!/usr/bin/tclsh + +set partNum xc7a100tcsg324-1 +set outputDir build + +read_verilog -sv [ glob *.{sv,v,svh,vh} ] +read_xdc top_level.xdc + +set_part $partNum + +# synth +synth_design -top top_level -part $partNum -verbose +report_utilization -file $outputDir/post_synth_util.rpt +report_timing_summary -file $outputDir/post_synth_timing_summary.rpt +report_timing -file $outputDir/post_synth_timing.rpt + +# place +opt_design +place_design +phys_opt_design +report_utilization -file $outputDir/post_place_util.rpt + +report_clock_utilization -file $outputDir/clock_util.rpt +report_timing_summary -file $outputDir/post_place_timing_summary.rpt +report_timing -file $outputDir/post_place_timing.rpt + +# route design and generate bitstream +route_design -directive Explore +write_bitstream -force $outputDir/out.bit + +report_route_status -file $outputDir/post_route_status.rpt +report_timing_summary -file $outputDir/post_route_timing_summary.rpt +report_timing -file $outputDir/post_route_timing.rpt +report_power -file $outputDir/post_route_power.rpt +report_drc -file $outputDir/post_imp_drc.rpt +write_verilog -force $outputDir/cpu_impl_netlist.v -mode timesim -sdf_anno true diff --git a/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/manta.yaml b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/manta.yaml new file mode 100644 index 0000000..8dd1036 --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/manta.yaml @@ -0,0 +1,35 @@ +--- +cores: + my_logic_analyzer: + type: logic_analyzer + sample_depth: 8192 + + probes: + probe0: 1 + probe1: 4 + probe2: 8 + probe3: 16 + + triggers: + - probe2 EQ 3 + + my_io_core: + type: io + inputs: + sw: 16 + outputs: + led: 16 + + +ethernet: + phy: LiteEthPHYRMII + device: xc7a + vendor: xilinx + toolchain: vivado + + refclk_freq: 50e6 + clk_freq: 50e6 + + fpga_ip_addr: "192.168.0.110" + host_ip_addr: "192.168.0.100" + udp_port: 2000 diff --git a/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/test.py b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/test.py new file mode 100644 index 0000000..06ab14a --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/test.py @@ -0,0 +1,6 @@ +from manta import Manta + +m = Manta("manta.yaml") + +print(m.my_io_core.get_probe("sw")) +m.my_io_core.set_probe("led", 4) diff --git a/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/top_level.xdc b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/top_level.xdc new file mode 100644 index 0000000..e2ad6f3 --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/top_level.xdc @@ -0,0 +1,260 @@ +## R1.0 2019-08-27 +## Updated by jodalyst in 2020-2022 +## all inputs/outputs changed to lowercase; arrays start with zero. +## system clock renamed to clk_100mhz +## ja, jb, jc, jd renamed to 0-7 +## xa port renamed 0-3 +## seven segments renamed to a,b,c,d,e,f,dp + +## This file is a general .xdc for the Nexys4 DDR Rev. C +## To use it in a project: +## - uncomment the lines corresponding to used pins +## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project + +## Clock signal +set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk_100mhz }]; #IO_L12P_T1_MRCC_35 Sch=clk_100mhz +create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk_100mhz}]; + + +##Switches + +set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] +set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] +set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] +set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] +set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] +set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] +set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] +set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] +set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] +set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] +set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] +set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] +set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] +set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] +set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] +set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] + + +## LEDs + +set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] +set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] +set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] +set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] +set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] +set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] +set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] +set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] +set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] +set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] +set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] +set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] +set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] +set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] +set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] +set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] + +#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b +#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g +#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r +#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b +#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g +#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r + + +##7 segment display + +#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca +#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb +#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc +#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd +#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce +#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf +#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg + +#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp + +#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] +#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] +#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] +#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] +#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] +#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] +#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] +#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] + + +##Buttons + +#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn + +set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc +set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu +set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl +set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr +set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd + + +##Pmod Headers + + +##Pmod Header JA + +#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] +#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] +#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] +#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] +#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] +#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] +#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] +#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] + + +##Pmod Header JB + +#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] +#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] +#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] +#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] +#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] +#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] +#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] +#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] + + +##Pmod Header JC + +#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] +#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] +#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] +#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] +#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] +#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] +#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] +#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] + + +##Pmod Header JD + +#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] +#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] +#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] +#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] +#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] +#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] +#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] +#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] + + +##Pmod Header JXADC + +#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] +#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] +#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] +#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] +#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] +#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] +#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] +#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] + + +##VGA Connector + +#set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] +#set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] +#set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] +#set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] +# +#set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] +#set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] +#set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] +#set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] +# +#set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] +#set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] +#set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] +#set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] + +#set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs +#set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs + +##Micro SD Connector + +#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset +#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd +#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck +#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd +#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] +#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] +#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] +#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] + + +##Accelerometer + +#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso +#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi +#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk +#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn +#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] +#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] + + +##Temperature Sensor + +#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl +#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda +#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int +#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct + +##Omnidirectional Microphone + +#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk +#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data +#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel + + +##PWM Audio Amplifier + +#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm +#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd + + +##USB-RS232 Interface + +#set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in +#set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out +#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts +#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts + +##USB HID (PS/2) + +#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk +#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data + + +##SMSC Ethernet PHY + +set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc +set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio +set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn +set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv +set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr +set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] +set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] +set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen +set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] +set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] +set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk +set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn + + +##Quad SPI Flash + +#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] +#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] +#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] +#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] +#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn + diff --git a/examples/verilog/nexys_a7/logic_analyzer_uart/.Xil/top_level_propImpl.xdc b/examples/verilog/nexys_a7/logic_analyzer_uart/.Xil/top_level_propImpl.xdc deleted file mode 100644 index 9b1c029..0000000 --- a/examples/verilog/nexys_a7/logic_analyzer_uart/.Xil/top_level_propImpl.xdc +++ /dev/null @@ -1,11 +0,0 @@ -set_property SRC_FILE_INFO {cfile:/home/fischerm/manta/examples/verilog/nexys_a7/logic_analyzer_uart/top_level.xdc rfile:../top_level.xdc id:1} [current_design] -set_property src_info {type:XDC file:1 line:9 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk }]; #IO_L12P_T1_MRCC_35 Sch=clk -set_property src_info {type:XDC file:1 line:219 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in -set_property src_info {type:XDC file:1 line:220 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out -set_property src_info {type:XDC file:1 line:226 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk -set_property src_info {type:XDC file:1 line:227 export:INPUT save:INPUT read:READ} [current_design] -set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data From 05f9da383cf8412a6d15b29f474efe21727c16a1 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 7 Mar 2024 09:19:11 -0800 Subject: [PATCH 85/89] banish all .Xil/ folders --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 348d56d..44697e8 100644 --- a/.gitignore +++ b/.gitignore @@ -23,7 +23,7 @@ build/ *.bin *.bit *.out -.Xil/* +.Xil/ # Yosys/IceStorm files *.asc From 4ae061ffdc322f0ba4a6ef44af1dac0eab2ad731 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 7 Mar 2024 09:21:40 -0800 Subject: [PATCH 86/89] add missing .gitignore --- .../.gitignore | 2 + .../divider.sv | 193 ++++++++++++++++++ .../top_level.sv | 54 +++++ 3 files changed, 249 insertions(+) create mode 100644 examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/.gitignore create mode 100644 examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/divider.sv create mode 100644 examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/top_level.sv diff --git a/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/.gitignore b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/.gitignore new file mode 100644 index 0000000..f6ca93a --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/.gitignore @@ -0,0 +1,2 @@ +!top_level.sv +!divider.sv \ No newline at end of file diff --git a/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/divider.sv b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/divider.sv new file mode 100644 index 0000000..623cce7 --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/divider.sv @@ -0,0 +1,193 @@ +`default_nettype wire + +// file: divider.sv +// +// (c) Copyright 2008 - 2013 Xilinx, Inc. All rights reserved. +// +// This file contains confidential and proprietary information +// of Xilinx, Inc. and is protected under U.S. and +// international copyright and other intellectual property +// laws. +// +// DISCLAIMER +// This disclaimer is not a license and does not grant any +// rights to the materials distributed herewith. Except as +// otherwise provided in a valid license issued to you by +// Xilinx, and to the maximum extent permitted by applicable +// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND +// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES +// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING +// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- +// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and +// (2) Xilinx shall not be liable (whether in contract or tort, +// including negligence, or under any other theory of +// liability) for any loss or damage of any kind or nature +// related to, arising under or in connection with these +// materials, including for any direct, or any indirect, +// special, incidental, or consequential loss or damage +// (including loss of data, profits, goodwill, or any type of +// loss or damage suffered as a result of any action brought +// by a third party) even if such damage or loss was +// reasonably foreseeable or Xilinx had been advised of the +// possibility of the same. +// +// CRITICAL APPLICATIONS +// Xilinx products are not designed or intended to be fail- +// safe, or for use in any application requiring fail-safe +// performance, such as life-support or safety devices or +// systems, Class III medical devices, nuclear facilities, +// applications related to the deployment of airbags, or any +// other applications that could lead to death, personal +// injury, or severe property or environmental damage +// (individually and collectively, "Critical +// Applications"). Customer assumes the sole risk and +// liability of any use of Xilinx products in Critical +// Applications, subject only to applicable laws and +// regulations governing limitations on product liability. +// +// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS +// PART OF THIS FILE AT ALL TIMES. +// +//---------------------------------------------------------------------------- +// User entered comments +//---------------------------------------------------------------------------- +// popopopopopopopopopopop +// +//---------------------------------------------------------------------------- +// Output Output Phase Duty Cycle Pk-to-Pk Phase +// Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps) +//---------------------------------------------------------------------------- +// __ethclk__50.00000______0.000______50.0______151.636_____98.575 +// +//---------------------------------------------------------------------------- +// Input Clock Freq (MHz) Input Jitter (UI) +//---------------------------------------------------------------------------- +// __primary_________100.000____________0.010 + +`timescale 1ps/1ps + +module divider + + (// Clock in ports + // Clock out ports + output ethclk, + input clk + ); + // Input buffering + //------------------------------------ +wire clk_divider; +wire clk_in2_divider; + IBUF clkin1_ibufg + (.O (clk_divider), + .I (clk)); + + + + + // Clocking PRIMITIVE + //------------------------------------ + + // Instantiation of the MMCM PRIMITIVE + // * Unused inputs are tied off + // * Unused outputs are labeled unused + + wire ethclk_divider; + wire clk_out2_divider; + wire clk_out3_divider; + wire clk_out4_divider; + wire clk_out5_divider; + wire clk_out6_divider; + wire clk_out7_divider; + + wire [15:0] do_unused; + wire drdy_unused; + wire psdone_unused; + wire locked_int; + wire clkfbout_divider; + wire clkfbout_buf_divider; + wire clkfboutb_unused; + wire clkout0b_unused; + wire clkout1_unused; + wire clkout1b_unused; + wire clkout2_unused; + wire clkout2b_unused; + wire clkout3_unused; + wire clkout3b_unused; + wire clkout4_unused; + wire clkout5_unused; + wire clkout6_unused; + wire clkfbstopped_unused; + wire clkinstopped_unused; + + MMCME2_ADV + #(.BANDWIDTH ("OPTIMIZED"), + .CLKOUT4_CASCADE ("FALSE"), + .COMPENSATION ("ZHOLD"), + .STARTUP_WAIT ("FALSE"), + .DIVCLK_DIVIDE (1), + .CLKFBOUT_MULT_F (10.000), + .CLKFBOUT_PHASE (0.000), + .CLKFBOUT_USE_FINE_PS ("FALSE"), + .CLKOUT0_DIVIDE_F (20.000), + .CLKOUT0_PHASE (0.000), + .CLKOUT0_DUTY_CYCLE (0.500), + .CLKOUT0_USE_FINE_PS ("FALSE"), + .CLKIN1_PERIOD (10.000)) + mmcm_adv_inst + // Output clocks + ( + .CLKFBOUT (clkfbout_divider), + .CLKFBOUTB (clkfboutb_unused), + .CLKOUT0 (ethclk_divider), + .CLKOUT0B (clkout0b_unused), + .CLKOUT1 (clkout1_unused), + .CLKOUT1B (clkout1b_unused), + .CLKOUT2 (clkout2_unused), + .CLKOUT2B (clkout2b_unused), + .CLKOUT3 (clkout3_unused), + .CLKOUT3B (clkout3b_unused), + .CLKOUT4 (clkout4_unused), + .CLKOUT5 (clkout5_unused), + .CLKOUT6 (clkout6_unused), + // Input clock control + .CLKFBIN (clkfbout_buf_divider), + .CLKIN1 (clk_divider), + .CLKIN2 (1'b0), + // Tied to always select the primary input clock + .CLKINSEL (1'b1), + // Ports for dynamic reconfiguration + .DADDR (7'h0), + .DCLK (1'b0), + .DEN (1'b0), + .DI (16'h0), + .DO (do_unused), + .DRDY (drdy_unused), + .DWE (1'b0), + // Ports for dynamic phase shift + .PSCLK (1'b0), + .PSEN (1'b0), + .PSINCDEC (1'b0), + .PSDONE (psdone_unused), + // Other control and status signals + .LOCKED (locked_int), + .CLKINSTOPPED (clkinstopped_unused), + .CLKFBSTOPPED (clkfbstopped_unused), + .PWRDWN (1'b0), + .RST (1'b0)); + +// Clock Monitor clock assigning +//-------------------------------------- + // Output buffering + //----------------------------------- + + BUFG clkf_buf + (.O (clkfbout_buf_divider), + .I (clkfbout_divider)); + + BUFG clkout1_buf + (.O (ethclk), + .I (ethclk_divider)); + +endmodule + +`default_nettype none \ No newline at end of file diff --git a/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/top_level.sv b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/top_level.sv new file mode 100644 index 0000000..c38deb8 --- /dev/null +++ b/examples/verilog/nexys_a7/logic_analyzer_io_core_ethernet/top_level.sv @@ -0,0 +1,54 @@ +module top_level ( + input wire clk_100mhz, + output logic eth_refclk, + input wire btnc, + + output logic [15:0] led, + input wire [15:0] sw, + + input wire eth_crsdv, + output logic eth_mdc, + output logic eth_mdio, + output logic eth_rstn, + input wire [1:0] eth_rxd, + output logic [1:0] eth_txd, + output logic eth_txen +); + +logic ethclk; +assign eth_refclk = ethclk; +divider div (.clk(clk_100mhz), .ethclk(ethclk)); + + logic probe0; + logic [3:0] probe1; + logic [7:0] probe2; + logic [15:0] probe3; + + always @(posedge ethclk) begin + probe0 <= probe0 + 1; + probe1 <= probe1 + 1; + probe2 <= probe2 + 1; + probe3 <= probe3 + 1; + end + +manta manta_inst( + .clk(ethclk), + .rst(btnc), + .rmii_clocks_ref_clk(ethclk), + .rmii_crs_dv(eth_crsdv), + .rmii_mdc(eth_mdc), + .rmii_mdio(eth_mdio), + .rmii_rst_n(eth_rstn), + .rmii_rx_data(eth_rxd), + .rmii_tx_data(eth_txd), + .rmii_tx_en(eth_txen), + + .probe0(probe0), + .probe1(probe1), + .probe2(probe2), + .probe3(probe3), + + .led(led), + .sw(sw)); + +endmodule \ No newline at end of file From c8665e87033484d961a31047dc8eabaf1a417e4c Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 7 Mar 2024 09:33:50 -0800 Subject: [PATCH 87/89] update environment on CI runner --- .github/workflows/run_tests.yml | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index 3396525..bb2640f 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -27,13 +27,6 @@ jobs: - name: Run tests run: | - # export tool paths - export VIVADO=/tools/Xilinx/Vivado/2023.1/bin/vivado - export YOSYS=/tools/oss-cad-suite/bin/yosys - export NEXTPNR_ICE40=/tools/oss-cad-suite/bin/nextpnr-ice40 - export ICEPACK=/tools/oss-cad-suite/bin/icepack - export ICEPROG=/tools/oss-cad-suite/bin/iceprog - + source ./environment.sh source venv/bin/activate - make test \ No newline at end of file From 6251c162cca37bfad41b4479501aa2c59971c278 Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 7 Mar 2024 09:35:47 -0800 Subject: [PATCH 88/89] update to node 20-based checkout in CI --- .github/workflows/run_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/run_tests.yml b/.github/workflows/run_tests.yml index bb2640f..8d718c1 100644 --- a/.github/workflows/run_tests.yml +++ b/.github/workflows/run_tests.yml @@ -4,7 +4,7 @@ jobs: all: runs-on: self-hosted steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Install Manta from Source run: | From e0aeb38cdbd9c0ec4c654f364349b8ba7ad54f1c Mon Sep 17 00:00:00 2001 From: Fischer Moseley <42497969+fischermoseley@users.noreply.github.com> Date: Thu, 7 Mar 2024 12:25:30 -0800 Subject: [PATCH 89/89] update docs --- Makefile | 2 +- doc/architecture.md | 22 +- doc/assets/bus_architecture.drawio.svg | 261 +++++++----------- .../logic_analyzer_architecture.drawio.svg | 182 +++++------- doc/assets/memory_architecture.drawio.svg | 62 ++--- doc/getting_started.md | 6 +- doc/io_core.md | 32 ++- doc/logic_analyzer_core.md | 14 +- doc/memory_core.md | 55 ++-- doc/repository_structure.md | 14 +- 10 files changed, 281 insertions(+), 369 deletions(-) diff --git a/Makefile b/Makefile index 229247e..d8b63bc 100644 --- a/Makefile +++ b/Makefile @@ -8,5 +8,5 @@ format: clean: git clean -Xdf -serve_docs: +preview_site: mkdocs serve diff --git a/doc/architecture.md b/doc/architecture.md index 53ed0db..6bab858 100644 --- a/doc/architecture.md +++ b/doc/architecture.md @@ -86,13 +86,19 @@ Each Memory core is actually a set of 16-bit wide BRAMs with their ports concate Since each $n$-bit wide block memory is actually $ceil(n/16)$ BRAMs under the hood, addressing the BRAMs correctly from Manta's internal bus is important. BRAMs are organized such that each 16-bit slice of a $N$-bit word in the Block Memory core are placed next to each other in bus address space. For instance, a 34-bit wide block memory would exist on Manta's internal bus as: -| Bus Address Space | BRAM Address Space | -| ----------- | -------------------- | -| BASE_ADDR + 0 | address 0, bits 0-15 | -| BASE_ADDR + 1 | address 0, bits 16-31| -| BASE_ADDR + 2 | address 0, bits 32-33| -| BASE_ADDR + 3 | address 1, bits 0-15 | -| BASE_ADDR + 4 | address 1, bits 16-31| -| BASE_ADDR + 5 | address 1, bits 32-33| +| Bus Address Space | BRAM Address Space | +| ----------- | -------------------- | +| BASE_ADDR + 0 | address 0, bits 0-15 | +| BASE_ADDR + 1 | address 1, bits 0-15 | +| BASE_ADDR + n | address n, bits 0-15 | +| ... | ... | +| BASE_ADDR + 0 + DEPTH | address 0, bits 16-31| +| BASE_ADDR + 1 + DEPTH | address 1, bits 16-31| +| BASE_ADDR + n + DEPTH | address n, bits 16-31| +| ... | ... | +| BASE_ADDR + 0 + (2 * DEPTH) | address 0, bits 32-33| +| BASE_ADDR + 1 + (2 * DEPTH) | address 1, bits 32-33| +| BASE_ADDR + n + (2 * DEPTH) | address n, bits 32-33| +| ... | ... | ...and so on. diff --git a/doc/assets/bus_architecture.drawio.svg b/doc/assets/bus_architecture.drawio.svg index a8b8077..739e2ad 100644 --- a/doc/assets/bus_architecture.drawio.svg +++ b/doc/assets/bus_architecture.drawio.svg @@ -1,74 +1,15 @@ - - - - + + - - - - - + + + + + -
    +
    bus @@ -76,17 +17,17 @@
    - + bus - - + + -
    +
    bus @@ -94,16 +35,16 @@
    - + bus - + -
    +

    @@ -113,16 +54,16 @@

    - + manta - + -
    +

    @@ -132,17 +73,17 @@

    - + FPGA Fabric - - + + -
    +
    bus @@ -150,17 +91,17 @@
    - + bus - - + + -
    +
    bus @@ -168,17 +109,17 @@
    - + bus - - + + -
    +
    rx @@ -186,17 +127,17 @@
    - + rx - - + + -
    +
    input_0 @@ -204,17 +145,17 @@
    - + input_0 - - + + -
    +
    output_1 @@ -222,16 +163,16 @@
    - + output_1 - + -
    +
    rx bridge @@ -239,16 +180,16 @@
    - + rx bridge - + -
    +
    logic @@ -258,16 +199,16 @@
    - + logic... - + -
    +
    io core @@ -275,16 +216,16 @@
    - + io core - + -
    +
    block memory core @@ -292,16 +233,16 @@
    - + block memo... - + -
    +
    tx bridge @@ -309,16 +250,16 @@
    - + tx bridge - + -
    +
    user logic @@ -326,89 +267,89 @@
    - + user logic - - + + -
    +
    - addr + user_addr
    - - addr + + user_addr - - + + -
    +
    - din + user_data_in
    - - din + + user_data_in - - + + -
    +
    - dout + user_data_out
    - - dout + + user_data_out - - + + -
    +
    - we + user_write_enable
    - - we + + user_write_enable - - + + -
    +
    tx @@ -416,17 +357,17 @@
    - + tx - - + + -
    +
    probe_2 @@ -434,17 +375,17 @@
    - + probe_2 - - + + -
    +
    probe_3 @@ -452,17 +393,17 @@
    - + probe_3 - - + + -
    +
    probe_1 @@ -470,17 +411,17 @@
    - + probe_1 - - + + -
    +
    output_0 @@ -488,7 +429,7 @@
    - + output_0 diff --git a/doc/assets/logic_analyzer_architecture.drawio.svg b/doc/assets/logic_analyzer_architecture.drawio.svg index 4f3dc26..8e6f240 100644 --- a/doc/assets/logic_analyzer_architecture.drawio.svg +++ b/doc/assets/logic_analyzer_architecture.drawio.svg @@ -1,4 +1,4 @@ - + - - - + + + -
    -
    -
    - block +
    +
    +
    + Sample Memory
    - memory + (Memory Core)
    - - block... + + Sample Memory... @@ -88,7 +86,7 @@ -
    +
    bus @@ -96,7 +94,7 @@
    - + bus @@ -107,7 +105,7 @@ -
    +
    bus @@ -115,7 +113,7 @@
    - + bus @@ -130,6 +128,8 @@ fsm
    registers +
    + (IO Core)
    @@ -156,12 +156,12 @@ - - + + -
    +
    bus @@ -169,7 +169,7 @@
    - + bus @@ -182,6 +182,8 @@
    trigger registers +
    + (IO Core)
    @@ -208,12 +210,12 @@ - - + + -
    +
    arg @@ -261,12 +263,12 @@ - - + + -
    +
    arg @@ -302,7 +304,7 @@ -
    +
    trigger_mode @@ -320,7 +322,7 @@ -
    +
    request_start @@ -338,7 +340,7 @@ -
    +
    request_stop @@ -356,7 +358,7 @@ -
    +
    read_pointer @@ -374,7 +376,7 @@ -
    +
    write_pointer @@ -392,7 +394,7 @@ -
    +
    state @@ -410,7 +412,7 @@ -
    +
    trigger_location @@ -440,12 +442,12 @@ - - + + -
    +
    bus @@ -453,34 +455,17 @@
    - + bus - + + -
    -
    -
    - port A -
    -
    -
    -
    - - port A - -
    -
    - - - - - -
    +
    data @@ -488,28 +473,11 @@
    - + data - - - - -
    -
    -
    - port B -
    -
    -
    -
    - - port B - -
    -
    @@ -536,7 +504,7 @@ -
    +
    trig @@ -544,7 +512,7 @@
    - + trig @@ -567,27 +535,27 @@ - + -
    +
    - + - + -
    +
    probe_2 @@ -604,23 +572,23 @@ -
    +
    - + - + -
    +
    probe_1 @@ -633,7 +601,7 @@ - + @@ -658,7 +626,7 @@ -
    +
    probe_0 @@ -688,12 +656,12 @@ - - + + -
    +
    arg @@ -724,12 +692,12 @@ - - + + -
    +
    we @@ -737,7 +705,7 @@
    - + we @@ -745,7 +713,7 @@ -
    +
    we @@ -753,17 +721,17 @@
    - + we - - + + -
    +
    addr @@ -771,7 +739,7 @@
    - + addr @@ -779,7 +747,7 @@ -
    +
    addr @@ -787,16 +755,16 @@
    - + addr - + - + - + diff --git a/doc/assets/memory_architecture.drawio.svg b/doc/assets/memory_architecture.drawio.svg index c929ee4..84c6998 100644 --- a/doc/assets/memory_architecture.drawio.svg +++ b/doc/assets/memory_architecture.drawio.svg @@ -1,4 +1,4 @@ - +
    - block RAM + RAM
    - block RAM + RAM
    @@ -101,7 +101,7 @@ -
    +
    addr @@ -119,7 +119,7 @@ -
    +
    din @@ -127,7 +127,7 @@
    - + din @@ -137,7 +137,7 @@ -
    +
    dout @@ -155,7 +155,7 @@ -
    +
    we @@ -209,13 +209,13 @@
    - block RAM + RAM
    - block RAM + RAM @@ -261,7 +261,7 @@ -
    +
    user_addr @@ -274,8 +274,8 @@ - - + + @@ -287,7 +287,7 @@
    - + user_din @@ -297,7 +297,7 @@ -
    +
    user_dout @@ -310,8 +310,8 @@ - - + + @@ -351,7 +351,7 @@ -
    +
    din @@ -359,7 +359,7 @@
    - + din @@ -407,13 +407,13 @@
    - block RAM + RAM
    - block RAM + RAM @@ -474,7 +474,7 @@ -
    +
    din @@ -482,7 +482,7 @@
    - + din @@ -601,12 +601,12 @@ - - + + -
    +
    bus @@ -614,17 +614,17 @@
    - + bus - - + + -
    +
    bus @@ -632,7 +632,7 @@
    - + bus diff --git a/doc/getting_started.md b/doc/getting_started.md index e6b3141..7494a49 100644 --- a/doc/getting_started.md +++ b/doc/getting_started.md @@ -5,7 +5,7 @@ To use Manta, you'll need a host machine with a FPGA board connected over UART, - _Specify a set of debug cores you wish to include in your design._ This is done by writing a configuration file, typically called `manta.yaml`. Specifying files in JSON is also supported, as long as the hierarchy in the file is equivalent. Just make sure that your YAML files end in `.yaml` or `.yml`, and that JSON files end in `.json`. - _Invoke Manta to generate Verilog from the configuration provided._ This is done by running `manta gen [config_file] [verilog_file]` at the command line, which generates a Verilog file (typically named `manta.v`) from the provided configuration file. This Verilog file contains a definition for a Verilog module named `manta`, and all its constituent modules. -- _Instantiate `manta` in your design, and connecting it to the logic you'd like to debug._ An example instantiation is provided at the top of `manta.v`, which you can copy-paste into your main source code. You'll connect its ports to the logic you're trying to debug, as well as to whatever interface you're using to communicate with the host. This will be a serial transciever on your development board if you're using UART, or it's RMII PHY if you're using Ethernet. +- _Instantiate `manta` in your design, and connecting it to the logic you'd like to debug._ Manta will provide an example instantiation if you run `manta inst [config_file]`, which you can copy-paste into your source code. You'll connect its ports to the logic you're trying to debug, as well as to whatever interface you're using to communicate with the host. This will be a serial transciever on your development board if you're using UART, or it's RMII PHY if you're using Ethernet. - _Build and upload the design to your FPGA using your preferred toolchain._ - _Use the debug core(s) through the Python API or the command line._ The functions availble to each core are described in their documentation. - _Repeat!_ As you debug, you'll probably want to change exactly how Manta is configured. This means tweaking the configuration file, regenerating the Verilog module, and so on. @@ -58,12 +58,12 @@ This Manta instance has an IO Core and a Logic Analyzer, each containing a numbe ## Example Instantiation -Lastly, we Manta can automatically generate a copy-pasteable Verilog snippet to instantiate Manta in your design. This is done by running `manta inst` with the path to the configuration file describing the Manta core you'd like to instantiate. For example, the following snippet is generated for the configuration above: +Lastly, we Manta can automatically generate a copy-pasteable Verilog snippet to instantiate Manta in your design by running `manta inst [config_file]`. For example, the following snippet is generated for the configuration above: ```verilog manta manta_inst ( .clk(clk), - .rst(rst) + .rst(rst), .rx(rx), .tx(tx), .probe_0_in(probe_0_in), diff --git a/doc/io_core.md b/doc/io_core.md index da61255..0e97bfd 100644 --- a/doc/io_core.md +++ b/doc/io_core.md @@ -43,22 +43,26 @@ Inside this configuration, the following parameters may be configured: ## Python API -The IO core functionality is stored in the `Manta.IOCore`, `Manta.InputProbe`, and `Manta.OutputProbe` classes in [src/manta/io_core/\_\_init\_\_.py](https://github.com/fischermoseley/manta/blob/main/src/manta/io_core/__init__.py), and it may be controlled with the two functions: - -`Manta.IOCoreProbe.set(data)` - -- [`int`, `bool`] _data_: The value to write to an output probe. May be signed or unsigned, but will raise an exception if the value is too large for the width of the port. -- _returns_: None - -This method is blocking. When called it will dispatch a request to the FPGA, and wait until a response has been received. +The IO core functionality is stored in the `Manta.IOCore` class in [src/manta/io_core/\_\_init\_\_.py](https://github.com/fischermoseley/manta/blob/main/src/manta/io_core.py), and it may be controlled with the two functions: --- -`Manta.IOCoreProbe.get()` +`Manta.IOCore.set_probe(name, data)` +- [`string`] _name_: The probe to write to. Must not be an output port, and must match the name provided in the config file. +- [`int`, `bool`] _data_: The value to write to an output probe. May be signed or unsigned, but will raise an exception if the value is too large for the width of the port. +- _returns_: None + +This method is blocking. When called it will dispatch a request to the FPGA, and halt execution until the request has been sent. + +--- + +`Manta.IOCore.get_probe(name)` + +- [`string`] _name_: The probe to read from. May be either an input or an output port, and must match the name provided in the config file. - _returns_: The value of an input or output probe. In the case of an output probe, the value returned will be the last value written to the probe. -This method is blocking. When called it will dispatch a request to the FPGA, and wait until a response has been received. +This method is blocking. When called it will dispatch a request to the FPGA, and halt execution until the request has been sent and a response has been received. --- @@ -70,11 +74,11 @@ A small example is shown below, using the [example configuration](#configuration ```python >>> import Manta >>> m = Manta ->>> m.my_io_core.fozzy.set(True) ->>> m.my_io_core.fozzy.get() +>>> m.my_io_core.set_probe("fozzy", True) +>>> m.my_io_core.get_probe("fozzy") True ->>> m.my_io_core.gonzo.set(4) ->>> m.my_io_core.scooter.get() +>>> m.my_io_core.set_probe("gonzo", 4) +>>> m.my_io_core.get_probe("scooter") 5 ``` diff --git a/doc/logic_analyzer_core.md b/doc/logic_analyzer_core.md index 450f20d..69aed07 100644 --- a/doc/logic_analyzer_core.md +++ b/doc/logic_analyzer_core.md @@ -67,17 +67,9 @@ Each individual trigger is specified with the following structure: Lastly, if you're not able to express your desired trigger condition in terms of the operators above, fear not! You can also specify an `external_trigger: true` entry in the config file, which exposes an input on Manta's top level for your own trigger. ### Trigger Position (optional) -Sometimes, you care more about what happens before a trigger is met than afterwards, or vice versa. To accommodate this, the logic analyzer has an optional _Trigger Position_ parameter, which sets when probe data is captured relative to the trigger condition being met. This is specified with the `trigger_position` entry in the configuration file, which sets how many samples to save prior to the trigger condition occurring. This is best explained with a picture: +Sometimes, you care more about what happens before a trigger is met than afterwards, or vice versa. To accommodate this, the logic analyzer has an optional _Trigger Position_ parameter, which sets when probe data is captured relative to the trigger condition being met. This is specified with the `trigger_position` entry in the configuration file, which sets how many samples to save prior to the trigger condition occurring. This is similar to a "holdoff" option on a traditional oscilloscope or logic analyzer. -![](assets/trigger_positions.png){style="width:90%"} - -The windows at the bottom of the diagram show what portions of the timeseries will be captured for different trigger positions. For instance: - -- A trigger position of half the sample depth centers the capture window around when the trigger condition is met. -- A trigger position of zero places the trigger at the zeroth clock cycle of the capture. -- A trigger position equal to the sample depth causes the trigger to occur on the last sample in the capture. - -If `trigger_position` is not specified, Manta will default to centering the capture window around the trigger condition. +If `trigger_position` is not specified, Manta will default to centering the capture window around the trigger condition. This results in just as many samples before the trigger as after. ### Capture Modes (optional) The logic analyzer has a few different ways of capturing data, which are represented by the _capture modes_ below: @@ -125,5 +117,5 @@ This is useful for two situations in particular: - _Sparse Sampling_ Sometimes designs will have a small number of inputs, but a huge amount of internal state. In situations like these, it may be more efficient to sample the inputs and simulate the logic, instead of directly sampling the state. For instance, debugging a misbehaving branch predictor in a CPU can be done by recording activity on the address and data busses and playing them back in simulation - which would use less FPGA resources than sampling the entire pattern history table. ## Python API -The Logic Analyzer core functionality is stored in the `Manta.LogicAnalyzerCore` class in [src/manta/la_core/\_\_init\_\_.py](https://github.com/fischermoseley/manta/blob/main/src/manta/la_core/__init__.py). This class contains methods for capturing data, and exporting `.vcd` and `.v` files. +The Logic Analyzer core functionality is stored in the `Manta.LogicAnalyzerCore` class in [src/manta/la_core/\_\_init\_\_.py](https://github.com/fischermoseley/manta/blob/main/src/manta/la_core/__init__.py). This class contains methods for capturing data, exporting it as `.vcd`, `.v` or `.csv` files, or as a Python list. diff --git a/doc/memory_core.md b/doc/memory_core.md index 26109f8..96be6ec 100644 --- a/doc/memory_core.md +++ b/doc/memory_core.md @@ -1,18 +1,19 @@ ## Overview -Block Memory (also called Block RAM, or BRAM) is the de facto means of storing data on FPGAs when the space needed exceeds a few registers. As a result, Manta provides a Block Memory core, which instantiates a dual-port BRAM on the FPGA. One port is provided to the host, and the other is connected to your logic with the standard BRAM interface (`addr`, `din`, `dout`, `wea`). This allows the host to provide reasonably large amounts of data to user logic - or the other way around, or a mix of both! +Memory is the de facto means of storing data on FPGAs when the space needed exceeds a few registers. As a result, Manta provides a Memory core, which instantiates a dual-port RAM on the FPGA. One port is provided to the host, and the other is connected to your logic with the standard RAM interface (`addr`, `data_in`, `data_out`, `write_enable`). This allows the host to provide reasonably large amounts of data to user logic - or the other way around, or a mix of both! This is a very, very simple task - and while configuration is straightforward, there are a few caveats. More on both topics below: ## Configuration -Just like the rest of the cores, the Block Memory core is configured via an entry in a project's configuration file. This is easiest to show by example: +Just like the rest of the cores, the Memory core is configured via an entry in a project's configuration file. This is easiest to show by example: ```yaml --- cores: - my_block_memory: - type: block_memory + my_memory: + type: memory + mode: bidirectional width: 12 depth: 16384 @@ -20,34 +21,38 @@ cores: There's a few parameters that get configured here, including: -- `name`: The name of the Block Memory core. This name is used to reference the core when working with the API, and can be whatever you'd like. -- `type`: This denotes that this is a Block Memory core. All cores contain a `type` field, which must be set to `block_memory` to be recognized as an Block Memory core. +- `name`: The name of the Memory core. This name is used to reference the core when working with the API, and can be whatever you'd like. +- `type`: This denotes that this is a Memory core. All cores contain a `type` field, which must be set to `memory` to be recognized as an Memory core. +- `mode`: The mode for the Memory core to operate in. This must be one of `bidirectional`, `host_to_fpga`, or `fpga_to_host`. Bidirectional memories can be both read or written to by the host and FPGA, but they require the use of a True Dual Port RAM, which is not available on all platforms (most notably, the ice40). Host-to-fpga and fpga-to-host RAMs only require a Simple Dual Port RAM, which is available on nearly all platforms. +- `width`: The width of the Memory core, in bits. +- `depth`: The depth of the Memory core, in entries. -### Dimensions -The dimensions of the block memory are specified in the config file with the `width` and `depth` entries. +Manta won't impose any limit on the width or depth of the memory you instantiate, but since Manta instantiates BRAM primitives on the FPGA, you will be limited by what your FPGA can support. It helps to know your particular FPGA's architecture here. -Manta won't impose any limit on the width or depth of the block memory you instantiate, but since Manta instantiates BRAM primitives on the FPGA, you will be limited by what your FPGA can support. It helps to know your particular FPGA's architecture here. +!!! warning "Bidirectional memories are currently broken on Xilinx platforms." + Due to a bug in Amaranth, trying to use a bidirectional memory on a Xilinx platform will cause Vivado to throw an `Unable to infer RAMs due to unsupported pattern.` error. This is a known issue, and has been reported [here](https://github.com/amaranth-lang/amaranth/issues/1011). In the meantime, if you have a Xilinx device, consider if your data flow is unidirectional, and you could use the `host_to_fpga` or `fpga_to_host` modes. Other platforms with dual-port RAM capability (such as the Lattice ECP5) appear to not be affected by this issue. -If your BRAM is more than 16 bits wide, check out the section on [Synchronicity](#synchronicity) and make sure your project will tolerate how Manta writes to the block memory. +### On-Chip Implementation +For most use cases, Manta will choose to implement the memory in Block RAM, if it is available on the device. However, the Verilog produced by Manta may be inferred to a number of memory types, including FF RAM or LUT (Distributed) RAM. For more information on how this is chosen, please refer to the [Yosys documentation](https://yosyshq.readthedocs.io/projects/yosys/en/latest/CHAPTER_Memorymap.html). ### Python API -The Block Memory core functionality is stored in the `Manta.IOCore` and `Manta.IOCoreProbe` classes in [src/manta/io_core/\_\_init\_\_.py](https://github.com/fischermoseley/manta/blob/main/src/manta/io_core/__init__.py), and it may be controlled with the two functions: +The Memory core functionality is stored in the `Manta.MemoryCore` classes in [src/manta/memory_core.py](https://github.com/fischermoseley/manta/blob/main/src/manta/memory_core.py), and it may be controlled with the two functions: -Just like with the other cores, interfacing with the BRAM with the Python API is simple: +Just like with the other cores, interfacing with the Memory with the Python API is simple: ```python from manta import Manta m = manta('manta.yaml') -m.my_block_memory.write(addr=38, data=600) -m.my_block_memory.write(addr=0x1234, data = 0b100011101011) -m.my_block_memory.write(0x0612, 0x2001) +m.my_memory.write(addr=38, data=600) +m.my_memory.write(addr=0x1234, data = 0b100011101011) +m.my_memory.write(0x0612, 0x2001) -foo = m.my_block_memory.write(addr=38) -foo = m.my_block_memory.write(addr=1234) -foo = m.my_block_memory.write(0x0612) +foo = m.my_memory.write(addr=38) +foo = m.my_memory.write(addr=1234) +foo = m.my_memory.write(0x0612) ``` Reading/writing in batches is also supported. This is recommended where possible, as reads are massively sped up by performing them in bulk: @@ -55,19 +60,15 @@ Reading/writing in batches is also supported. This is recommended where possible ```python addrs = list(range(0, 1234)) datas = list(range(1234, 2468)) -m.my_block_memory.write(addrs, datas) +m.my_memory.write(addrs, datas) -foo = m.my_block_memory.read(addrs) +foo = m.my_memory.read(addrs) ``` -### Examples - -A Block Memory core is used in the [video_sprite](https://github.com/fischermoseley/manta/blob/main/examples/nexys_a7/video_sprite) example. This uses the core to store a 128x128 image sprite in 12-bit color, and outputs it to a VGA display at 1024x768. The sprite contents can be filled with an arbitrary image using the [send_image.py](https://github.com/fischermoseley/manta/blob/main/examples/nexys_a7/video_sprite/send_image.py) python script. - ### Synchronicity -Since Manta's [data bus](architecture.md#data-bus) is only 16-bits wide, it's only possible to manipulate the BRAM core in 16-bit increments. This means that if you have a BRAM that's ≤16 bits wide, you'll only need to issue a single bus transaction to read/write one entry in the BRAM. However, if you have a BRAM that's ≥16 bits wide, you'll need to issue a bus transaction to update each 16-bit slice of it. For instance, updating a single entry in a 33-bit wide BRAM would require sending 3 messages to the FPGA: one for bits 1-16, another for bits 17-32, and one for bit 33. If your application expects each BRAM entry to update instantaneously, this could be problematic. +Since Manta's [data bus](architecture.md#data-bus) is only 16-bits wide, it's only possible to manipulate the Memory core in 16-bit increments. This means that if you have a RAM that's ≤16 bits wide, you'll only need to issue a single bus transaction to read/write one entry in the RAM. However, if you have a RAM that's ≥16 bits wide, you'll need to issue a bus transaction to update each 16-bit slice of it. For instance, updating a single entry in a 33-bit wide RAM would require sending 3 messages to the FPGA: one for bits 1-16, another for bits 17-32, and one for bit 33. If your application expects each RAM entry to update instantaneously, this could be problematic. -There's a few different ways to solve this - you could use an IO core to signal when a BRAM's contents or valid - or you could ping-pong between two BRAMs while one is being modified. The choice is yours, and Manta makes no attempt to prescribe any particular approach. +There's a few different ways to solve this - you could use an IO core to signal when a RAM's contents or valid - or you could ping-pong between two RAMs while one is being modified. The choice is yours, and Manta makes no attempt to prescribe any particular approach. -Lastly, the interface you use (and to a lesser extent, your operating system) will determine the space between bus transactions. For instance, 100Mbit Ethernet is a thousand times faster than 115200bps UART, so the time where the BRAM is invalid is a thousand times smaller. +Lastly, the interface you use (and to a lesser extent, your operating system) will determine the space between bus transactions. For instance, 100Mbit Ethernet is a thousand times faster than 115200bps UART, so the time where the RAM is invalid is a thousand times smaller. diff --git a/doc/repository_structure.md b/doc/repository_structure.md index 9652d74..6fc6d3f 100644 --- a/doc/repository_structure.md +++ b/doc/repository_structure.md @@ -1,15 +1,15 @@ ## Repository Structure -- `src/manta/` contains the Python and Verilog source needed to generate and run the cores. -- `test/` contains testbenchs for HDL. Manta is written in Verilog 2001, but the testbenches are written in SystemVerilog 2012. These are simulated using Icarus Verilog, which produces `.vcd` files, viewable with your favorite waveform viewer, like GTKWave. -- `doc/` contains the documentation you're reading right now! It's built into a nice static site by Material for MkDocs, which automatically rebuilds the site on every commit to `main`. This is done with a GitHub Action configured in `.github/` -- `examples/` is exactly what it sounds like. It contains examples for both the Digilent Nexys 4 DDR/Nexys A7 with thier onboard Series-7, as well as the Icestick with its onboard iCE40. -- `.github/` also contains some GitHub Actions configuration for automatically running the SystemVerilog testbenches and building the examples, in addition to automatically rebuilding the site. +- `src/manta/` contains the Python source needed to generate and run the cores. +- `test/` contains Manta's tests, which are a mix of functional simulations and hardware-in-the-loop testing. These tests leverage the `pytest` testing framework. +- `doc/` contains the documentation you're reading right now! +- `examples/` contains examples for both the Digilent Nexys 4 DDR/Nexys A7 with thier onboard Series-7, as well as the Icestick with its onboard iCE40. +- `.github/` contains GitHub Actions workflows for automatically running the tests and building the documentation site on every commit. ## Tools Used - The [YosysHQ](https://github.com/YosysHQ) tools and [Vivado](https://www.xilinx.com/products/design-tools/vivado.html) are used for building bitstreams. -- [Wavedrom](https://wavedrom.com/) is used for for waveform diagrams, and [draw.io](https://app.diagrams.net/) for block diagrams +- [draw.io](https://app.diagrams.net/) is used for block diagrams. - [GitHub Pages](https://pages.github.com/) is used to serve the documentation site, which is built with [Material for MkDocs](https://squidfunk.github.io/mkdocs-material/). - [GitHub Actions](https://docs.github.com/en/actions) is used for continuous integration. ## GitHub Actions Setup -Since Vivado is large and requires individual licenses it's run on a private server, which is configured as a self-hosted runner in GitHub Actions. This is a virtual server hosted with KVM/QEMU and managed by libvirt, which is configured as transient so that it reloads its state from a snapshot periodically. A Nexys A7 and Icestick are connected to the physical machine and passthrough-ed to this VM so that continuous integration can check against real hardware. \ No newline at end of file +Since Vivado is large and requires individual licenses, it is run on a private server, which is configured as a self-hosted runner in GitHub Actions. This is a virtual server hosted with KVM/QEMU and managed by libvirt, which is configured as transient so that it reloads its state from a snapshot periodically. A Nexys A7 and Icestick are connected to the physical machine and passthrough-ed to this VM so that continuous integration can check against real hardware. \ No newline at end of file

    BrU!&4XRA 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 z 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�^$m`)s`6ic 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 diff --git a/doc/assets/manta.drawio.png b/doc/assets/manta.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..7d0cfd613ff4564a2b9f56658047f09798952c92 GIT binary patch literal 52590 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 literal 0 HcmV?d00001 diff --git a/doc/assets/manta_architecture.png b/doc/assets/manta_architecture.png deleted file mode 100644 index d388fe2481f1fb8012ee8e5f07832d2a2325c0e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 494609 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Π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%0Dq^JQrfr`Gq^yiwg5sKnf~N{Z~l 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 z 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Ν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%0Al9LgQc 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 diff --git a/doc/assets/memory_architecture.drawio.svg b/doc/assets/memory_architecture.drawio.svg new file mode 100644 index 0000000..ca3a1c9 --- /dev/null +++ b/doc/assets/memory_architecture.drawio.svg @@ -0,0 +1,608 @@ + + + + + + + + +
    +
    +
    + block RAM +
    +
    +
    +
    + + block RAM + +
    +
    + + + + +
    +
    +
    + port A +
    +
    +
    +
    + + port A + +
    +
    + + + + + +
    +
    +
    + addr +
    +
    +
    +
    + + addr + +
    +
    + + + + + +
    +
    +
    + din +
    +
    +
    +
    + + din + +
    +
    + + + + + +
    +
    +
    + dout +
    +
    +
    +
    + + dout + +
    +
    + + + + + +
    +
    +
    + we +
    +
    +
    +
    + + we + +
    +
    + + + + +
    +
    +
    + port B +
    +
    +
    +
    + + port B + +
    +
    + + + + +
    +
    +
    + Bus Controller +
    +
    +
    +
    + + Bus Controller + +
    +
    + + + + +
    +
    +
    + block RAM +
    +
    +
    +
    + + block RAM + +
    +
    + + + + +
    +
    +
    + port A +
    +
    +
    +
    + + port A + +
    +
    + + + + +
    +
    +
    + port B +
    +
    +
    +
    + + port B + +
    +
    + + + + + + + + +
    +
    +
    + user_addr +
    +
    +
    +
    + + user_addr + +
    +
    + + + + + +
    +
    +
    + user_din +
    +
    +
    +
    + + user_din + +
    +
    + + + + + +
    +
    +
    + user_dout +
    +
    +
    +
    + + user_dout + +
    +
    + + + + + +
    +
    +
    + user_we +
    +
    +
    +
    + + user_we + +
    +
    + + + + + +
    +
    +
    + addr +
    +
    +
    +
    + + addr + +
    +
    + + + + + +
    +
    +
    + din +
    +
    +
    +
    + + din + +
    +
    + + + + + +
    +
    +
    + dout +
    +
    +
    +
    + + dout + +
    +
    + + + + + +
    +
    +
    + we +
    +
    +
    +
    + + we + +
    +
    + + + + +
    +
    +
    + block RAM +
    +
    +
    +
    + + block RAM + +
    +
    + + + + +
    +
    +
    + port A +
    +
    +
    +
    + + port A + +
    +
    + + + + +
    +
    +
    + port B +
    +
    +
    +
    + + port B + +
    +
    + + + + + +
    +
    +
    + addr +
    +
    +
    +
    + + addr + +
    +
    + + + + + +
    +
    +
    + din +
    +
    +
    +
    + + din + +
    +
    + + + + + +
    +
    +
    + dout +
    +
    +
    +
    + + dout + +
    +
    + + + + + +
    +
    +
    + we +
    +
    +
    +
    + + we + +
    +
    + + + + +
    +
    +
    + + + ... + + +
    +
    +
    +
    + + ... + +
    +
    + + + + + + +
    +
    +
    + 16 bits +
    +
    +
    +
    + + 16 bits + +
    +
    + + + + + + +
    +
    +
    + 16 bits +
    +
    +
    +
    + + 16 bits + +
    +
    + + + + + + +
    +
    +
    + 10 bits +
    +
    +
    +
    + + 10 bits + +
    +
    + + + + + +
    +
    +
    + bus +
    +
    +
    +
    + + bus + +
    +
    + + + + + +
    +
    +
    + bus +
    +
    +
    +
    + + bus + +
    +
    + + + + +
    +
    +
    +

    + Memory Core +

    +
    +
    +
    +
    + + Memory Core + +
    +
    +
    + + + + + Text is not SVG - cannot display + + + +
    \ No newline at end of file diff --git a/doc/assets/system_architecture.drawio.svg b/doc/assets/system_architecture.drawio.svg new file mode 100644 index 0000000..930a0c7 --- /dev/null +++ b/doc/assets/system_architecture.drawio.svg @@ -0,0 +1,342 @@ + + + + + + + + + +
    +
    +
    +

    + Host Machine +

    +
    +
    +
    +
    + + Host Machine + +
    +
    + + + + + + +
    +
    +
    + User Application +
    +
    +
    +
    + + User Application + +
    +
    + + + + + + +
    +
    +
    + Manta API +
    +
    +
    +
    + + Manta API + +
    +
    + + + + + + +
    +
    +
    + Interface API +
    +
    +
    +
    + + Interface API + +
    +
    + + + + + +
    +
    +
    + USB/Ethernet Cable +
    +
    +
    +
    + + USB/Ethernet Cable + +
    +
    + + + + +
    +
    +
    + OS Device Driver +
    +
    +
    +
    + + OS Device Driver + +
    +
    + + + + +
    +
    +
    + Interface Transceiver +
    +
    + (USB UART +
    + Converter / Ethernet PHY) +
    +
    +
    +
    + + Interface Trans... + +
    +
    + + + + + + +
    +
    +
    + rxd +
    +
    +
    +
    + + rxd + +
    +
    + + + + +
    +
    +
    + bridge_rx +
    +
    +
    +
    + + bridge_rx + +
    +
    + + + + +
    +
    +
    + logic_analyzer +
    +
    +
    +
    + + logic_analyzer + +
    +
    + + + + +
    +
    +
    + io_core +
    +
    +
    +
    + + io_core + +
    +
    + + + + +
    +
    +
    + block_memory +
    +
    +
    +
    + + block_memory + +
    +
    + + + + +
    +
    +
    + bridge_tx +
    +
    +
    +
    + + bridge_tx + +
    +
    + + + + + + + + + + + + +
    +
    +
    + User Logic +
    +
    +
    +
    + + User Logic + +
    +
    + + + + + + + + + + + + +
    +
    +
    + txd +
    +
    +
    +
    + + txd + +
    +
    + + + + +
    +
    +
    +

    + FPGA Development Board +

    +
    +
    +
    +
    + + FPGA Development Board + +
    +
    + + + + +
    +
    +
    +

    + + Manta RTL + +

    +
    +
    +
    +
    + + Manta RTL + +
    +
    +
    + + + + + Text is not SVG - cannot display + + + +
    \ No newline at end of file diff --git a/doc/assets/uart.png b/doc/assets/uart.png deleted file mode 100644 index c7455d587d225cb53da98f338e79f404204bb01c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 447251 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�@n8ZmbGWvZ)#pi+R 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".format(sys.argv[0])) - - else: - input_fname = sys.argv[1] - image_in = Image.open(input_fname) - image_in = image_in.convert('RGB') - - # Resize the image - image_in = image_in.resize((128, 128)) - image_out = image_in.copy() - w, h = image_in.size - - # Take input image and divide each color channel's value by 16 - for y in range(h): - for x in range(w): - r, g, b = image_in.getpixel((x, y)) - image_out.putpixel((x,y), (r//16, g//16, b//16)) - - - # Save the image itself - pixels = [] - for y in range(h): - for x in range(w): - (r, g, b) = image_out.getpixel((x,y)) - color = (r*16*16) + (g*16) + (b) - pixels.append(color) - - from manta import Manta - m = Manta('manta.yaml') - - addrs = list(range(len(pixels))) - m.image_mem.write(addrs, pixels) \ No newline at end of file diff --git a/examples/nexys_a7/video_sprite_ether/src/clk_gen.v b/examples/nexys_a7/video_sprite_ether/src/clk_gen.v deleted file mode 100644 index 91d4265..0000000 --- a/examples/nexys_a7/video_sprite_ether/src/clk_gen.v +++ /dev/null @@ -1,207 +0,0 @@ - -// file: clk_gen.v -// -// (c) Copyright 2008 - 2013 Xilinx, Inc. All rights reserved. -// -// This file contains confidential and proprietary information -// of Xilinx, Inc. and is protected under U.S. and -// international copyright and other intellectual property -// laws. -// -// DISCLAIMER -// This disclaimer is not a license and does not grant any -// rights to the materials distributed herewith. Except as -// otherwise provided in a valid license issued to you by -// Xilinx, and to the maximum extent permitted by applicable -// law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND -// WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES -// AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING -// BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON- -// INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and -// (2) Xilinx shall not be liable (whether in contract or tort, -// including negligence, or under any other theory of -// liability) for any loss or damage of any kind or nature -// related to, arising under or in connection with these -// materials, including for any direct, or any indirect, -// special, incidental, or consequential loss or damage -// (including loss of data, profits, goodwill, or any type of -// loss or damage suffered as a result of any action brought -// by a third party) even if such damage or loss was -// reasonably foreseeable or Xilinx had been advised of the -// possibility of the same. -// -// CRITICAL APPLICATIONS -// Xilinx products are not designed or intended to be fail- -// safe, or for use in any application requiring fail-safe -// performance, such as life-support or safety devices or -// systems, Class III medical devices, nuclear facilities, -// applications related to the deployment of airbags, or any -// other applications that could lead to death, personal -// injury, or severe property or environmental damage -// (individually and collectively, "Critical -// Applications"). Customer assumes the sole risk and -// liability of any use of Xilinx products in Critical -// Applications, subject only to applicable laws and -// regulations governing limitations on product liability. -// -// THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS -// PART OF THIS FILE AT ALL TIMES. -// -//---------------------------------------------------------------------------- -// User entered comments -//---------------------------------------------------------------------------- -// None -// -//---------------------------------------------------------------------------- -// Output Output Phase Duty Cycle Pk-to-Pk Phase -// Clock Freq (MHz) (degrees) (%) Jitter (ps) Error (ps) -//---------------------------------------------------------------------------- -// clk_50mhz__50.00000______0.000______50.0______150.541_____99.281 -// clk_65mhz__65.00000______0.000______50.0______142.278_____99.281 -// -//---------------------------------------------------------------------------- -// Input Clock Freq (MHz) Input Jitter (UI) -//---------------------------------------------------------------------------- -// __primary_________100.000____________0.010 - -`timescale 1ps/1ps - -module clk_gen - - (// Clock in ports - // Clock out ports - output clk_50mhz, - output clk_65mhz, - input clk_100mhz - ); - // Input buffering - //------------------------------------ -wire clk_100mhz_clk_gen; -wire clk_in2_clk_gen; - IBUF clkin1_ibufg - (.O (clk_100mhz_clk_gen), - .I (clk_100mhz)); - - - - - // Clocking PRIMITIVE - //------------------------------------ - - // Instantiation of the MMCM PRIMITIVE - // * Unused inputs are tied off - // * Unused outputs are labeled unused - - wire clk_50mhz_clk_gen; - wire clk_65mhz_clk_gen; - wire clk_out3_clk_gen; - wire clk_out4_clk_gen; - wire clk_out5_clk_gen; - wire clk_out6_clk_gen; - wire clk_out7_clk_gen; - - wire [15:0] do_unused; - wire drdy_unused; - wire psdone_unused; - wire locked_int; - wire clkfbout_clk_gen; - wire clkfbout_buf_clk_gen; - wire clkfboutb_unused; - wire clkout0b_unused; - wire clkout1b_unused; - wire clkout2_unused; - wire clkout2b_unused; - wire clkout3_unused; - wire clkout3b_unused; - wire clkout4_unused; - wire clkout5_unused; - wire clkout6_unused; - wire clkfbstopped_unused; - wire clkinstopped_unused; - - MMCME2_ADV - #(.BANDWIDTH ("OPTIMIZED"), - .CLKOUT4_CASCADE ("FALSE"), - .COMPENSATION ("ZHOLD"), - .STARTUP_WAIT ("FALSE"), - .DIVCLK_DIVIDE (1), - .CLKFBOUT_MULT_F (9.750), - .CLKFBOUT_PHASE (0.000), - .CLKFBOUT_USE_FINE_PS ("FALSE"), - .CLKOUT0_DIVIDE_F (19.500), - .CLKOUT0_PHASE (0.000), - .CLKOUT0_DUTY_CYCLE (0.500), - .CLKOUT0_USE_FINE_PS ("FALSE"), - .CLKOUT1_DIVIDE (15), - .CLKOUT1_PHASE (0.000), - .CLKOUT1_DUTY_CYCLE (0.500), - .CLKOUT1_USE_FINE_PS ("FALSE"), - .CLKIN1_PERIOD (10.000)) - mmcm_adv_inst - // Output clocks - ( - .CLKFBOUT (clkfbout_clk_gen), - .CLKFBOUTB (clkfboutb_unused), - .CLKOUT0 (clk_50mhz_clk_gen), - .CLKOUT0B (clkout0b_unused), - .CLKOUT1 (clk_65mhz_clk_gen), - .CLKOUT1B (clkout1b_unused), - .CLKOUT2 (clkout2_unused), - .CLKOUT2B (clkout2b_unused), - .CLKOUT3 (clkout3_unused), - .CLKOUT3B (clkout3b_unused), - .CLKOUT4 (clkout4_unused), - .CLKOUT5 (clkout5_unused), - .CLKOUT6 (clkout6_unused), - // Input clock control - .CLKFBIN (clkfbout_buf_clk_gen), - .CLKIN1 (clk_100mhz_clk_gen), - .CLKIN2 (1'b0), - // Tied to always select the primary input clock - .CLKINSEL (1'b1), - // Ports for dynamic reconfiguration - .DADDR (7'h0), - .DCLK (1'b0), - .DEN (1'b0), - .DI (16'h0), - .DO (do_unused), - .DRDY (drdy_unused), - .DWE (1'b0), - // Ports for dynamic phase shift - .PSCLK (1'b0), - .PSEN (1'b0), - .PSINCDEC (1'b0), - .PSDONE (psdone_unused), - // Other control and status signals - .LOCKED (locked_int), - .CLKINSTOPPED (clkinstopped_unused), - .CLKFBSTOPPED (clkfbstopped_unused), - .PWRDWN (1'b0), - .RST (1'b0)); - -// Clock Monitor clock assigning -//-------------------------------------- - // Output buffering - //----------------------------------- - - BUFG clkf_buf - (.O (clkfbout_buf_clk_gen), - .I (clkfbout_clk_gen)); - - - - - - - BUFG clkout1_buf - (.O (clk_50mhz), - .I (clk_50mhz_clk_gen)); - - - BUFG clkout2_buf - (.O (clk_65mhz), - .I (clk_65mhz_clk_gen)); - - - -endmodule diff --git a/examples/nexys_a7/video_sprite_ether/src/top_level.sv b/examples/nexys_a7/video_sprite_ether/src/top_level.sv deleted file mode 100644 index c1023db..0000000 --- a/examples/nexys_a7/video_sprite_ether/src/top_level.sv +++ /dev/null @@ -1,108 +0,0 @@ -`timescale 1ns / 1ps -`default_nettype none - -module top_level ( - input wire clk_100mhz, - - output reg eth_refclk, - output reg eth_rstn, - - input wire eth_crsdv, - input wire [1:0] eth_rxd, - - output reg eth_txen, - output reg [1:0] eth_txd, - - output logic [3:0] vga_r, vga_g, vga_b, - output logic vga_hs, vga_vs); - - assign eth_rstn = 1; - - // Clock generation - logic clk_50mhz; - logic clk_65mhz; - assign eth_refclk = clk_50mhz; - - clk_gen gen( - .clk_100mhz(clk_100mhz), - .clk_50mhz(clk_50mhz), - .clk_65mhz(clk_65mhz)); - - // VGA signals - logic [10:0] hcount; - logic [9:0] vcount; - logic hsync, vsync, blank; - - vga vga_gen( - .pixel_clk_in(clk_65mhz), - .hcount_out(hcount), - .vcount_out(vcount), - .hsync_out(hsync), - .vsync_out(vsync), - .blank_out(blank)); - - // VGA Pipelining - reg[1:0][10:0] hcount_pipe; - reg[1:0][10:0] vcount_pipe; - reg[1:0] hsync_pipe; - reg[1:0] vsync_pipe; - reg[1:0] blank_pipe; - - always_ff @(posedge clk_65mhz)begin - hcount_pipe[0] <= hcount; - vcount_pipe[0] <= vcount; - hsync_pipe[0] <= hsync; - vsync_pipe[0] <= vsync; - blank_pipe[0] <= blank; - for (int i=1; i<2; i = i+1)begin - hcount_pipe[i] <= hcount_pipe[i-1]; - vcount_pipe[i] <= vcount_pipe[i-1]; - hsync_pipe[i] <= hsync_pipe[i-1]; - vsync_pipe[i] <= vsync_pipe[i-1]; - blank_pipe[i] <= blank_pipe[i-1]; - end - end - - localparam WIDTH = 128; - localparam HEIGHT = 128; - - localparam X = 0; - localparam Y = 0; - - // calculate rom address - logic [$clog2(WIDTH*HEIGHT)-1:0] image_addr; - assign image_addr = (hcount - X) + ((vcount - Y) * WIDTH); - - logic in_sprite; - assign in_sprite = ((hcount_pipe[1] >= X && hcount_pipe[1] < (X + WIDTH)) && - (vcount_pipe[1] >= Y && vcount_pipe[1] < (Y + HEIGHT))); - - manta manta_inst ( - .clk(clk_50mhz), - - .crsdv(eth_crsdv), - .rxd(eth_rxd), - .txen(eth_txen), - .txd(eth_txd), - - .image_mem_clk(clk_65mhz), - .image_mem_addr(image_addr), - .image_mem_din(), - .image_mem_dout(sprite_color), - .image_mem_we(1'b0)); - - logic [11:0] sprite_color; - logic [11:0] color; - assign color = in_sprite ? sprite_color : 12'h0; - - // the following lines are required for the Nexys4 VGA circuit - do not change - assign vga_r = ~blank_pipe[1] ? color[11:8]: 0; - assign vga_g = ~blank_pipe[1] ? color[7:4] : 0; - assign vga_b = ~blank_pipe[1] ? color[3:0] : 0; - - assign vga_hs = ~hsync_pipe[1]; - assign vga_vs = ~vsync_pipe[1]; - - -endmodule -`default_nettype wire diff --git a/examples/nexys_a7/video_sprite_ether/src/vga.sv b/examples/nexys_a7/video_sprite_ether/src/vga.sv deleted file mode 100644 index 3fa787f..0000000 --- a/examples/nexys_a7/video_sprite_ether/src/vga.sv +++ /dev/null @@ -1,68 +0,0 @@ - -/* vga: Generate VGA display signals (1024 x 768 @ 60Hz) - * - * ---- HORIZONTAL ----- ------VERTICAL ----- - * Active Active - * Freq Video FP Sync BP Video FP Sync BP - * 640x480, 60Hz 25.175 640 16 96 48 480 11 2 31 - * 800x600, 60Hz 40.000 800 40 128 88 600 1 4 23 - * 1024x768, 60Hz 65.000 1024 24 136 160 768 3 6 29 - * 1280x1024, 60Hz 108.00 1280 48 112 248 768 1 3 38 - * 1280x720p 60Hz 75.25 1280 72 80 216 720 3 5 30 - * 1920x1080 60Hz 148.5 1920 88 44 148 1080 4 5 36 - * - * change the clock frequency, front porches, sync's, and back porches to create - * other screen resolutions - */ - -module vga( - input wire pixel_clk_in, - output logic [10:0] hcount_out, // pixel number on current line - output logic [9:0] vcount_out, // line number - output logic vsync_out, hsync_out, - output logic blank_out); - - parameter DISPLAY_WIDTH = 1024; // display width - parameter DISPLAY_HEIGHT = 768; // number of lines - - parameter H_FP = 24; // horizontal front porch - parameter H_SYNC_PULSE = 136; // horizontal sync - parameter H_BP = 160; // horizontal back porch - - parameter V_FP = 3; // vertical front porch - parameter V_SYNC_PULSE = 6; // vertical sync - parameter V_BP = 29; // vertical back porch - - // horizontal: 1344 pixels total - // display 1024 pixels per line - logic hblank,vblank; - logic hsyncon,hsyncoff,hreset,hblankon; - assign hblankon = (hcount_out == (DISPLAY_WIDTH -1)); - assign hsyncon = (hcount_out == (DISPLAY_WIDTH + H_FP - 1)); //1047 - assign hsyncoff = (hcount_out == (DISPLAY_WIDTH + H_FP + H_SYNC_PULSE - 1)); // 1183 - assign hreset = (hcount_out == (DISPLAY_WIDTH + H_FP + H_SYNC_PULSE + H_BP - 1)); //1343 - - // vertical: 806 lines total - // display 768 lines - logic vsyncon,vsyncoff,vreset,vblankon; - assign vblankon = hreset & (vcount_out == (DISPLAY_HEIGHT - 1)); // 767 - assign vsyncon = hreset & (vcount_out == (DISPLAY_HEIGHT + V_FP - 1)); // 771 - assign vsyncoff = hreset & (vcount_out == (DISPLAY_HEIGHT + V_FP + V_SYNC_PULSE - 1)); // 777 - assign vreset = hreset & (vcount_out == (DISPLAY_HEIGHT + V_FP + V_SYNC_PULSE + V_BP - 1)); // 805 - - // sync and blanking - logic next_hblank,next_vblank; - assign next_hblank = hreset ? 0 : hblankon ? 1 : hblank; - assign next_vblank = vreset ? 0 : vblankon ? 1 : vblank; - always_ff @(posedge pixel_clk_in) begin - hcount_out <= hreset ? 0 : hcount_out + 1; - hblank <= next_hblank; - hsync_out <= hsyncon ? 0 : hsyncoff ? 1 : hsync_out; // active low - - vcount_out <= hreset ? (vreset ? 0 : vcount_out + 1) : vcount_out; - vblank <= next_vblank; - vsync_out <= vsyncon ? 0 : vsyncoff ? 1 : vsync_out; // active low - - blank_out <= next_vblank | (next_hblank & ~hreset); - end -endmodule \ No newline at end of file diff --git a/examples/nexys_a7/video_sprite_ether/xdc/top_level.xdc b/examples/nexys_a7/video_sprite_ether/xdc/top_level.xdc deleted file mode 100644 index 8a3551b..0000000 --- a/examples/nexys_a7/video_sprite_ether/xdc/top_level.xdc +++ /dev/null @@ -1,253 +0,0 @@ -## This file is a general .xdc for the Nexys4 DDR Rev. C -## To use it in a project: -## - uncomment the lines corresponding to used pins -## - rename the used ports (in each line, after get_ports) according to the top level signal names in the project - -## This file has been modified from the default .xdc provided by Digilent for the Nexys A7 - -## Clock signal -set_property -dict { PACKAGE_PIN E3 IOSTANDARD LVCMOS33 } [get_ports { clk_100mhz }]; #IO_L12P_T1_MRCC_35 Sch=clk_100mhz -create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports {clk_100mhz}]; - - -##Switches - -#set_property -dict { PACKAGE_PIN J15 IOSTANDARD LVCMOS33 } [get_ports { sw[0] }]; #IO_L24N_T3_RS0_15 Sch=sw[0] -#set_property -dict { PACKAGE_PIN L16 IOSTANDARD LVCMOS33 } [get_ports { sw[1] }]; #IO_L3N_T0_DQS_EMCCLK_14 Sch=sw[1] -#set_property -dict { PACKAGE_PIN M13 IOSTANDARD LVCMOS33 } [get_ports { sw[2] }]; #IO_L6N_T0_D08_VREF_14 Sch=sw[2] -#set_property -dict { PACKAGE_PIN R15 IOSTANDARD LVCMOS33 } [get_ports { sw[3] }]; #IO_L13N_T2_MRCC_14 Sch=sw[3] -#set_property -dict { PACKAGE_PIN R17 IOSTANDARD LVCMOS33 } [get_ports { sw[4] }]; #IO_L12N_T1_MRCC_14 Sch=sw[4] -#set_property -dict { PACKAGE_PIN T18 IOSTANDARD LVCMOS33 } [get_ports { sw[5] }]; #IO_L7N_T1_D10_14 Sch=sw[5] -#set_property -dict { PACKAGE_PIN U18 IOSTANDARD LVCMOS33 } [get_ports { sw[6] }]; #IO_L17N_T2_A13_D29_14 Sch=sw[6] -#set_property -dict { PACKAGE_PIN R13 IOSTANDARD LVCMOS33 } [get_ports { sw[7] }]; #IO_L5N_T0_D07_14 Sch=sw[7] -#set_property -dict { PACKAGE_PIN T8 IOSTANDARD LVCMOS18 } [get_ports { sw[8] }]; #IO_L24N_T3_34 Sch=sw[8] -#set_property -dict { PACKAGE_PIN U8 IOSTANDARD LVCMOS18 } [get_ports { sw[9] }]; #IO_25_34 Sch=sw[9] -#set_property -dict { PACKAGE_PIN R16 IOSTANDARD LVCMOS33 } [get_ports { sw[10] }]; #IO_L15P_T2_DQS_RDWR_B_14 Sch=sw[10] -#set_property -dict { PACKAGE_PIN T13 IOSTANDARD LVCMOS33 } [get_ports { sw[11] }]; #IO_L23P_T3_A03_D19_14 Sch=sw[11] -#set_property -dict { PACKAGE_PIN H6 IOSTANDARD LVCMOS33 } [get_ports { sw[12] }]; #IO_L24P_T3_35 Sch=sw[12] -#set_property -dict { PACKAGE_PIN U12 IOSTANDARD LVCMOS33 } [get_ports { sw[13] }]; #IO_L20P_T3_A08_D24_14 Sch=sw[13] -#set_property -dict { PACKAGE_PIN U11 IOSTANDARD LVCMOS33 } [get_ports { sw[14] }]; #IO_L19N_T3_A09_D25_VREF_14 Sch=sw[14] -#set_property -dict { PACKAGE_PIN V10 IOSTANDARD LVCMOS33 } [get_ports { sw[15] }]; #IO_L21P_T3_DQS_14 Sch=sw[15] - - -## LEDs - -#set_property -dict { PACKAGE_PIN H17 IOSTANDARD LVCMOS33 } [get_ports { led[0] }]; #IO_L18P_T2_A24_15 Sch=led[0] -#set_property -dict { PACKAGE_PIN K15 IOSTANDARD LVCMOS33 } [get_ports { led[1] }]; #IO_L24P_T3_RS1_15 Sch=led[1] -#set_property -dict { PACKAGE_PIN J13 IOSTANDARD LVCMOS33 } [get_ports { led[2] }]; #IO_L17N_T2_A25_15 Sch=led[2] -#set_property -dict { PACKAGE_PIN N14 IOSTANDARD LVCMOS33 } [get_ports { led[3] }]; #IO_L8P_T1_D11_14 Sch=led[3] -#set_property -dict { PACKAGE_PIN R18 IOSTANDARD LVCMOS33 } [get_ports { led[4] }]; #IO_L7P_T1_D09_14 Sch=led[4] -#set_property -dict { PACKAGE_PIN V17 IOSTANDARD LVCMOS33 } [get_ports { led[5] }]; #IO_L18N_T2_A11_D27_14 Sch=led[5] -#set_property -dict { PACKAGE_PIN U17 IOSTANDARD LVCMOS33 } [get_ports { led[6] }]; #IO_L17P_T2_A14_D30_14 Sch=led[6] -#set_property -dict { PACKAGE_PIN U16 IOSTANDARD LVCMOS33 } [get_ports { led[7] }]; #IO_L18P_T2_A12_D28_14 Sch=led[7] -#set_property -dict { PACKAGE_PIN V16 IOSTANDARD LVCMOS33 } [get_ports { led[8] }]; #IO_L16N_T2_A15_D31_14 Sch=led[8] -#set_property -dict { PACKAGE_PIN T15 IOSTANDARD LVCMOS33 } [get_ports { led[9] }]; #IO_L14N_T2_SRCC_14 Sch=led[9] -#set_property -dict { PACKAGE_PIN U14 IOSTANDARD LVCMOS33 } [get_ports { led[10] }]; #IO_L22P_T3_A05_D21_14 Sch=led[10] -#set_property -dict { PACKAGE_PIN T16 IOSTANDARD LVCMOS33 } [get_ports { led[11] }]; #IO_L15N_T2_DQS_DOUT_CSO_B_14 Sch=led[11] -#set_property -dict { PACKAGE_PIN V15 IOSTANDARD LVCMOS33 } [get_ports { led[12] }]; #IO_L16P_T2_CSI_B_14 Sch=led[12] -#set_property -dict { PACKAGE_PIN V14 IOSTANDARD LVCMOS33 } [get_ports { led[13] }]; #IO_L22N_T3_A04_D20_14 Sch=led[13] -#set_property -dict { PACKAGE_PIN V12 IOSTANDARD LVCMOS33 } [get_ports { led[14] }]; #IO_L20N_T3_A07_D23_14 Sch=led[14] -#set_property -dict { PACKAGE_PIN V11 IOSTANDARD LVCMOS33 } [get_ports { led[15] }]; #IO_L21N_T3_DQS_A06_D22_14 Sch=led[15] - -#set_property -dict { PACKAGE_PIN R12 IOSTANDARD LVCMOS33 } [get_ports { led16_b }]; #IO_L5P_T0_D06_14 Sch=led16_b -#set_property -dict { PACKAGE_PIN M16 IOSTANDARD LVCMOS33 } [get_ports { led16_g }]; #IO_L10P_T1_D14_14 Sch=led16_g -#set_property -dict { PACKAGE_PIN N15 IOSTANDARD LVCMOS33 } [get_ports { led16_r }]; #IO_L11P_T1_SRCC_14 Sch=led16_r -#set_property -dict { PACKAGE_PIN G14 IOSTANDARD LVCMOS33 } [get_ports { led17_b }]; #IO_L15N_T2_DQS_ADV_B_15 Sch=led17_b -#set_property -dict { PACKAGE_PIN R11 IOSTANDARD LVCMOS33 } [get_ports { led17_g }]; #IO_0_14 Sch=led17_g -#set_property -dict { PACKAGE_PIN N16 IOSTANDARD LVCMOS33 } [get_ports { led17_r }]; #IO_L11N_T1_SRCC_14 Sch=led17_r - - -##7 segment display - -#set_property -dict { PACKAGE_PIN T10 IOSTANDARD LVCMOS33 } [get_ports { ca }]; #IO_L24N_T3_A00_D16_14 Sch=ca -#set_property -dict { PACKAGE_PIN R10 IOSTANDARD LVCMOS33 } [get_ports { cb }]; #IO_25_14 Sch=cb -#set_property -dict { PACKAGE_PIN K16 IOSTANDARD LVCMOS33 } [get_ports { cc }]; #IO_25_15 Sch=cc -#set_property -dict { PACKAGE_PIN K13 IOSTANDARD LVCMOS33 } [get_ports { cd }]; #IO_L17P_T2_A26_15 Sch=cd -#set_property -dict { PACKAGE_PIN P15 IOSTANDARD LVCMOS33 } [get_ports { ce }]; #IO_L13P_T2_MRCC_14 Sch=ce -#set_property -dict { PACKAGE_PIN T11 IOSTANDARD LVCMOS33 } [get_ports { cf }]; #IO_L19P_T3_A10_D26_14 Sch=cf -#set_property -dict { PACKAGE_PIN L18 IOSTANDARD LVCMOS33 } [get_ports { cg }]; #IO_L4P_T0_D04_14 Sch=cg - -#set_property -dict { PACKAGE_PIN H15 IOSTANDARD LVCMOS33 } [get_ports { dp }]; #IO_L19N_T3_A21_VREF_15 Sch=dp - -#set_property -dict { PACKAGE_PIN J17 IOSTANDARD LVCMOS33 } [get_ports { an[0] }]; #IO_L23P_T3_FOE_B_15 Sch=an[0] -#set_property -dict { PACKAGE_PIN J18 IOSTANDARD LVCMOS33 } [get_ports { an[1] }]; #IO_L23N_T3_FWE_B_15 Sch=an[1] -#set_property -dict { PACKAGE_PIN T9 IOSTANDARD LVCMOS33 } [get_ports { an[2] }]; #IO_L24P_T3_A01_D17_14 Sch=an[2] -#set_property -dict { PACKAGE_PIN J14 IOSTANDARD LVCMOS33 } [get_ports { an[3] }]; #IO_L19P_T3_A22_15 Sch=an[3] -#set_property -dict { PACKAGE_PIN P14 IOSTANDARD LVCMOS33 } [get_ports { an[4] }]; #IO_L8N_T1_D12_14 Sch=an[4] -#set_property -dict { PACKAGE_PIN T14 IOSTANDARD LVCMOS33 } [get_ports { an[5] }]; #IO_L14P_T2_SRCC_14 Sch=an[5] -#set_property -dict { PACKAGE_PIN K2 IOSTANDARD LVCMOS33 } [get_ports { an[6] }]; #IO_L23P_T3_35 Sch=an[6] -#set_property -dict { PACKAGE_PIN U13 IOSTANDARD LVCMOS33 } [get_ports { an[7] }]; #IO_L23N_T3_A02_D18_14 Sch=an[7] - - -##Buttons - -#set_property -dict { PACKAGE_PIN C12 IOSTANDARD LVCMOS33 } [get_ports { cpu_resetn }]; #IO_L3P_T0_DQS_AD1P_15 Sch=cpu_resetn - -#set_property -dict { PACKAGE_PIN N17 IOSTANDARD LVCMOS33 } [get_ports { btnc }]; #IO_L9P_T1_DQS_14 Sch=btnc -#set_property -dict { PACKAGE_PIN M18 IOSTANDARD LVCMOS33 } [get_ports { btnu }]; #IO_L4N_T0_D05_14 Sch=btnu -#set_property -dict { PACKAGE_PIN P17 IOSTANDARD LVCMOS33 } [get_ports { btnl }]; #IO_L12P_T1_MRCC_14 Sch=btnl -#set_property -dict { PACKAGE_PIN M17 IOSTANDARD LVCMOS33 } [get_ports { btnr }]; #IO_L10N_T1_D15_14 Sch=btnr -#set_property -dict { PACKAGE_PIN P18 IOSTANDARD LVCMOS33 } [get_ports { btnd }]; #IO_L9N_T1_DQS_D13_14 Sch=btnd - - -##Pmod Headers - - -##Pmod Header JA - -#set_property -dict { PACKAGE_PIN C17 IOSTANDARD LVCMOS33 } [get_ports { ja[0] }]; #IO_L20N_T3_A19_15 Sch=ja[1] -#set_property -dict { PACKAGE_PIN D18 IOSTANDARD LVCMOS33 } [get_ports { ja[1] }]; #IO_L21N_T3_DQS_A18_15 Sch=ja[2] -#set_property -dict { PACKAGE_PIN E18 IOSTANDARD LVCMOS33 } [get_ports { ja[2] }]; #IO_L21P_T3_DQS_15 Sch=ja[3] -#set_property -dict { PACKAGE_PIN G17 IOSTANDARD LVCMOS33 } [get_ports { ja[3] }]; #IO_L18N_T2_A23_15 Sch=ja[4] -#set_property -dict { PACKAGE_PIN D17 IOSTANDARD LVCMOS33 } [get_ports { ja[4] }]; #IO_L16N_T2_A27_15 Sch=ja[7] -#set_property -dict { PACKAGE_PIN E17 IOSTANDARD LVCMOS33 } [get_ports { ja[5] }]; #IO_L16P_T2_A28_15 Sch=ja[8] -#set_property -dict { PACKAGE_PIN F18 IOSTANDARD LVCMOS33 } [get_ports { ja[6] }]; #IO_L22N_T3_A16_15 Sch=ja[9] -#set_property -dict { PACKAGE_PIN G18 IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L22P_T3_A17_15 Sch=ja[10] - - -##Pmod Header JB - -#set_property -dict { PACKAGE_PIN D14 IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L1P_T0_AD0P_15 Sch=jb[1] -#set_property -dict { PACKAGE_PIN F16 IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L14N_T2_SRCC_15 Sch=jb[2] -#set_property -dict { PACKAGE_PIN G16 IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L13N_T2_MRCC_15 Sch=jb[3] -#set_property -dict { PACKAGE_PIN H14 IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L15P_T2_DQS_15 Sch=jb[4] -#set_property -dict { PACKAGE_PIN E16 IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11N_T1_SRCC_15 Sch=jb[7] -#set_property -dict { PACKAGE_PIN F13 IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L5P_T0_AD9P_15 Sch=jb[8] -#set_property -dict { PACKAGE_PIN G13 IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_0_15 Sch=jb[9] -#set_property -dict { PACKAGE_PIN H16 IOSTANDARD LVCMOS33 } [get_ports { jb[7] }]; #IO_L13P_T2_MRCC_15 Sch=jb[10] - - -##Pmod Header JC - -#set_property -dict { PACKAGE_PIN K1 IOSTANDARD LVCMOS33 } [get_ports { jc[0] }]; #IO_L23N_T3_35 Sch=jc[1] -#set_property -dict { PACKAGE_PIN F6 IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L19N_T3_VREF_35 Sch=jc[2] -#set_property -dict { PACKAGE_PIN J2 IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22N_T3_35 Sch=jc[3] -#set_property -dict { PACKAGE_PIN G6 IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L19P_T3_35 Sch=jc[4] -#set_property -dict { PACKAGE_PIN E7 IOSTANDARD LVCMOS33 } [get_ports { jc[4] }]; #IO_L6P_T0_35 Sch=jc[7] -#set_property -dict { PACKAGE_PIN J3 IOSTANDARD LVCMOS33 } [get_ports { jc[5] }]; #IO_L22P_T3_35 Sch=jc[8] -#set_property -dict { PACKAGE_PIN J4 IOSTANDARD LVCMOS33 } [get_ports { jc[6] }]; #IO_L21P_T3_DQS_35 Sch=jc[9] -#set_property -dict { PACKAGE_PIN E6 IOSTANDARD LVCMOS33 } [get_ports { jc[7] }]; #IO_L5P_T0_AD13P_35 Sch=jc[10] - - -##Pmod Header JD - -#set_property -dict { PACKAGE_PIN H4 IOSTANDARD LVCMOS33 } [get_ports { jd[0] }]; #IO_L21N_T3_DQS_35 Sch=jd[1] -#set_property -dict { PACKAGE_PIN H1 IOSTANDARD LVCMOS33 } [get_ports { jd[1] }]; #IO_L17P_T2_35 Sch=jd[2] -#set_property -dict { PACKAGE_PIN G1 IOSTANDARD LVCMOS33 } [get_ports { jd[2] }]; #IO_L17N_T2_35 Sch=jd[3] -#set_property -dict { PACKAGE_PIN G3 IOSTANDARD LVCMOS33 } [get_ports { jd[3] }]; #IO_L20N_T3_35 Sch=jd[4] -#set_property -dict { PACKAGE_PIN H2 IOSTANDARD LVCMOS33 } [get_ports { jd[4] }]; #IO_L15P_T2_DQS_35 Sch=jd[7] -#set_property -dict { PACKAGE_PIN G4 IOSTANDARD LVCMOS33 } [get_ports { jd[5] }]; #IO_L20P_T3_35 Sch=jd[8] -#set_property -dict { PACKAGE_PIN G2 IOSTANDARD LVCMOS33 } [get_ports { jd[6] }]; #IO_L15N_T2_DQS_35 Sch=jd[9] -#set_property -dict { PACKAGE_PIN F3 IOSTANDARD LVCMOS33 } [get_ports { jd[7] }]; #IO_L13N_T2_MRCC_35 Sch=jd[10] - - -##Pmod Header JXADC - -#set_property -dict { PACKAGE_PIN A14 IOSTANDARD LVDS } [get_ports { xa_n[0] }]; #IO_L9N_T1_DQS_AD3N_15 Sch=xa_n[1] -#set_property -dict { PACKAGE_PIN A13 IOSTANDARD LVDS } [get_ports { xa_p[0] }]; #IO_L9P_T1_DQS_AD3P_15 Sch=xa_p[1] -#set_property -dict { PACKAGE_PIN A16 IOSTANDARD LVDS } [get_ports { xa_n[1] }]; #IO_L8N_T1_AD10N_15 Sch=xa_n[2] -#set_property -dict { PACKAGE_PIN A15 IOSTANDARD LVDS } [get_ports { xa_p[1] }]; #IO_L8P_T1_AD10P_15 Sch=xa_p[2] -#set_property -dict { PACKAGE_PIN B17 IOSTANDARD LVDS } [get_ports { xa_n[2] }]; #IO_L7N_T1_AD2N_15 Sch=xa_n[3] -#set_property -dict { PACKAGE_PIN B16 IOSTANDARD LVDS } [get_ports { xa_p[2] }]; #IO_L7P_T1_AD2P_15 Sch=xa_p[3] -#set_property -dict { PACKAGE_PIN A18 IOSTANDARD LVDS } [get_ports { xa_n[3] }]; #IO_L10N_T1_AD11N_15 Sch=xa_n[4] -#set_property -dict { PACKAGE_PIN B18 IOSTANDARD LVDS } [get_ports { xa_p[3] }]; #IO_L10P_T1_AD11P_15 Sch=xa_p[4] - - -##VGA Connector - -set_property -dict { PACKAGE_PIN A3 IOSTANDARD LVCMOS33 } [get_ports { vga_r[0] }]; #IO_L8N_T1_AD14N_35 Sch=vga_r[0] -set_property -dict { PACKAGE_PIN B4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[1] }]; #IO_L7N_T1_AD6N_35 Sch=vga_r[1] -set_property -dict { PACKAGE_PIN C5 IOSTANDARD LVCMOS33 } [get_ports { vga_r[2] }]; #IO_L1N_T0_AD4N_35 Sch=vga_r[2] -set_property -dict { PACKAGE_PIN A4 IOSTANDARD LVCMOS33 } [get_ports { vga_r[3] }]; #IO_L8P_T1_AD14P_35 Sch=vga_r[3] - -set_property -dict { PACKAGE_PIN C6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[0] }]; #IO_L1P_T0_AD4P_35 Sch=vga_g[0] -set_property -dict { PACKAGE_PIN A5 IOSTANDARD LVCMOS33 } [get_ports { vga_g[1] }]; #IO_L3N_T0_DQS_AD5N_35 Sch=vga_g[1] -set_property -dict { PACKAGE_PIN B6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[2] }]; #IO_L2N_T0_AD12N_35 Sch=vga_g[2] -set_property -dict { PACKAGE_PIN A6 IOSTANDARD LVCMOS33 } [get_ports { vga_g[3] }]; #IO_L3P_T0_DQS_AD5P_35 Sch=vga_g[3] - -set_property -dict { PACKAGE_PIN B7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[0] }]; #IO_L2P_T0_AD12P_35 Sch=vga_b[0] -set_property -dict { PACKAGE_PIN C7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[1] }]; #IO_L4N_T0_35 Sch=vga_b[1] -set_property -dict { PACKAGE_PIN D7 IOSTANDARD LVCMOS33 } [get_ports { vga_b[2] }]; #IO_L6N_T0_VREF_35 Sch=vga_b[2] -set_property -dict { PACKAGE_PIN D8 IOSTANDARD LVCMOS33 } [get_ports { vga_b[3] }]; #IO_L4P_T0_35 Sch=vga_b[3] - -set_property -dict { PACKAGE_PIN B11 IOSTANDARD LVCMOS33 } [get_ports { vga_hs }]; #IO_L4P_T0_15 Sch=vga_hs -set_property -dict { PACKAGE_PIN B12 IOSTANDARD LVCMOS33 } [get_ports { vga_vs }]; #IO_L3N_T0_DQS_AD1N_15 Sch=vga_vs - -##Micro SD Connector - -#set_property -dict { PACKAGE_PIN E2 IOSTANDARD LVCMOS33 } [get_ports { sd_reset }]; #IO_L14P_T2_SRCC_35 Sch=sd_reset -#set_property -dict { PACKAGE_PIN A1 IOSTANDARD LVCMOS33 } [get_ports { sd_cd }]; #IO_L9N_T1_DQS_AD7N_35 Sch=sd_cd -#set_property -dict { PACKAGE_PIN B1 IOSTANDARD LVCMOS33 } [get_ports { sd_sck }]; #IO_L9P_T1_DQS_AD7P_35 Sch=sd_sck -#set_property -dict { PACKAGE_PIN C1 IOSTANDARD LVCMOS33 } [get_ports { sd_cmd }]; #IO_L16N_T2_35 Sch=sd_cmd -#set_property -dict { PACKAGE_PIN C2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[0] }]; #IO_L16P_T2_35 Sch=sd_dat[0] -#set_property -dict { PACKAGE_PIN E1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[1] }]; #IO_L18N_T2_35 Sch=sd_dat[1] -#set_property -dict { PACKAGE_PIN F1 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[2] }]; #IO_L18P_T2_35 Sch=sd_dat[2] -#set_property -dict { PACKAGE_PIN D2 IOSTANDARD LVCMOS33 } [get_ports { sd_dat[3] }]; #IO_L14N_T2_SRCC_35 Sch=sd_dat[3] - - -##Accelerometer - -#set_property -dict { PACKAGE_PIN E15 IOSTANDARD LVCMOS33 } [get_ports { acl_miso }]; #IO_L11P_T1_SRCC_15 Sch=acl_miso -#set_property -dict { PACKAGE_PIN F14 IOSTANDARD LVCMOS33 } [get_ports { acl_mosi }]; #IO_L5N_T0_AD9N_15 Sch=acl_mosi -#set_property -dict { PACKAGE_PIN F15 IOSTANDARD LVCMOS33 } [get_ports { acl_sclk }]; #IO_L14P_T2_SRCC_15 Sch=acl_sclk -#set_property -dict { PACKAGE_PIN D15 IOSTANDARD LVCMOS33 } [get_ports { acl_csn }]; #IO_L12P_T1_MRCC_15 Sch=acl_csn -#set_property -dict { PACKAGE_PIN B13 IOSTANDARD LVCMOS33 } [get_ports { acl_int[1] }]; #IO_L2P_T0_AD8P_15 Sch=acl_int[1] -#set_property -dict { PACKAGE_PIN C16 IOSTANDARD LVCMOS33 } [get_ports { acl_int[2] }]; #IO_L20P_T3_A20_15 Sch=acl_int[2] - - -##Temperature Sensor - -#set_property -dict { PACKAGE_PIN C14 IOSTANDARD LVCMOS33 } [get_ports { tmp_scl }]; #IO_L1N_T0_AD0N_15 Sch=tmp_scl -#set_property -dict { PACKAGE_PIN C15 IOSTANDARD LVCMOS33 } [get_ports { tmp_sda }]; #IO_L12N_T1_MRCC_15 Sch=tmp_sda -#set_property -dict { PACKAGE_PIN D13 IOSTANDARD LVCMOS33 } [get_ports { tmp_int }]; #IO_L6N_T0_VREF_15 Sch=tmp_int -#set_property -dict { PACKAGE_PIN B14 IOSTANDARD LVCMOS33 } [get_ports { tmp_ct }]; #IO_L2N_T0_AD8N_15 Sch=tmp_ct - -##Omnidirectional Microphone - -#set_property -dict { PACKAGE_PIN J5 IOSTANDARD LVCMOS33 } [get_ports { m_clk }]; #IO_25_35 Sch=m_clk -#set_property -dict { PACKAGE_PIN H5 IOSTANDARD LVCMOS33 } [get_ports { m_data }]; #IO_L24N_T3_35 Sch=m_data -#set_property -dict { PACKAGE_PIN F5 IOSTANDARD LVCMOS33 } [get_ports { m_lrsel }]; #IO_0_35 Sch=m_lrsel - - -##PWM Audio Amplifier - -#set_property -dict { PACKAGE_PIN A11 IOSTANDARD LVCMOS33 } [get_ports { aud_pwm }]; #IO_L4N_T0_15 Sch=aud_pwm -#set_property -dict { PACKAGE_PIN D12 IOSTANDARD LVCMOS33 } [get_ports { aud_sd }]; #IO_L6P_T0_15 Sch=aud_sd - - -##USB-RS232 Interface - -#set_property -dict { PACKAGE_PIN C4 IOSTANDARD LVCMOS33 } [get_ports { uart_txd_in }]; #IO_L7P_T1_AD6P_35 Sch=uart_txd_in -#set_property -dict { PACKAGE_PIN D4 IOSTANDARD LVCMOS33 } [get_ports { uart_rxd_out }]; #IO_L11N_T1_SRCC_35 Sch=uart_rxd_out -#set_property -dict { PACKAGE_PIN D3 IOSTANDARD LVCMOS33 } [get_ports { uart_cts }]; #IO_L12N_T1_MRCC_35 Sch=uart_cts -#set_property -dict { PACKAGE_PIN E5 IOSTANDARD LVCMOS33 } [get_ports { uart_rts }]; #IO_L5N_T0_AD13N_35 Sch=uart_rts - -##USB HID (PS/2) - -#set_property -dict { PACKAGE_PIN F4 IOSTANDARD LVCMOS33 } [get_ports { ps2_clk }]; #IO_L13P_T2_MRCC_35 Sch=ps2_clk -#set_property -dict { PACKAGE_PIN B2 IOSTANDARD LVCMOS33 } [get_ports { ps2_data }]; #IO_L10N_T1_AD15N_35 Sch=ps2_data - - -##SMSC Ethernet PHY - -#set_property -dict { PACKAGE_PIN C9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdc }]; #IO_L11P_T1_SRCC_16 Sch=eth_mdc -#set_property -dict { PACKAGE_PIN A9 IOSTANDARD LVCMOS33 } [get_ports { eth_mdio }]; #IO_L14N_T2_SRCC_16 Sch=eth_mdio -set_property -dict { PACKAGE_PIN B3 IOSTANDARD LVCMOS33 } [get_ports { eth_rstn }]; #IO_L10P_T1_AD15P_35 Sch=eth_rstn -set_property -dict { PACKAGE_PIN D9 IOSTANDARD LVCMOS33 } [get_ports { eth_crsdv }]; #IO_L6N_T0_VREF_16 Sch=eth_crsdv -#set_property -dict { PACKAGE_PIN C10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxerr }]; #IO_L13N_T2_MRCC_16 Sch=eth_rxerr -set_property -dict { PACKAGE_PIN C11 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[0] }]; #IO_L13P_T2_MRCC_16 Sch=eth_rxd[0] -set_property -dict { PACKAGE_PIN D10 IOSTANDARD LVCMOS33 } [get_ports { eth_rxd[1] }]; #IO_L19N_T3_VREF_16 Sch=eth_rxd[1] -set_property -dict { PACKAGE_PIN B9 IOSTANDARD LVCMOS33 } [get_ports { eth_txen }]; #IO_L11N_T1_SRCC_16 Sch=eth_txen -set_property -dict { PACKAGE_PIN A10 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[0] }]; #IO_L14P_T2_SRCC_16 Sch=eth_txd[0] -set_property -dict { PACKAGE_PIN A8 IOSTANDARD LVCMOS33 } [get_ports { eth_txd[1] }]; #IO_L12N_T1_MRCC_16 Sch=eth_txd[1] -set_property -dict { PACKAGE_PIN D5 IOSTANDARD LVCMOS33 } [get_ports { eth_refclk }]; #IO_L11P_T1_SRCC_35 Sch=eth_refclk -#set_property -dict { PACKAGE_PIN B8 IOSTANDARD LVCMOS33 } [get_ports { eth_intn }]; #IO_L12P_T1_MRCC_16 Sch=eth_intn - - -##Quad SPI Flash - -#set_property -dict { PACKAGE_PIN K17 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[0] }]; #IO_L1P_T0_D00_MOSI_14 Sch=qspi_dq[0] -#set_property -dict { PACKAGE_PIN K18 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[1] }]; #IO_L1N_T0_D01_DIN_14 Sch=qspi_dq[1] -#set_property -dict { PACKAGE_PIN L14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[2] }]; #IO_L2P_T0_D02_14 Sch=qspi_dq[2] -#set_property -dict { PACKAGE_PIN M14 IOSTANDARD LVCMOS33 } [get_ports { qspi_dq[3] }]; #IO_L2N_T0_D03_14 Sch=qspi_dq[3] -#set_property -dict { PACKAGE_PIN L13 IOSTANDARD LVCMOS33 } [get_ports { qspi_csn }]; #IO_L6P_T0_FCS_B_14 Sch=qspi_csn \ No newline at end of file diff --git a/examples/nexys_a7/video_sprite_uart/img/buff_doge.png b/examples/nexys_a7/video_sprite_uart/img/buff_doge.png deleted file mode 100644 index d504d022b1fbe9896a43e008ec41ffbad202d00d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69692 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�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