diff --git a/Applications/relax2/poetry.lock b/Applications/relax2/poetry.lock index 60e7218a..798e1602 100644 --- a/Applications/relax2/poetry.lock +++ b/Applications/relax2/poetry.lock @@ -1,81 +1,362 @@ +# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. + [[package]] name = "contourpy" -version = "1.0.7" +version = "1.1.1" description = "Python library for calculating contours of 2D quadrilateral grids" category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, + {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, + {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, + {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, + {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, + {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, + {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, + {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, + {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, + {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, + {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, + {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, + {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, + {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, + {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, + {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, + {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, +] [package.dependencies] -numpy = ">=1.16" +numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} [package.extras] -bokeh = ["bokeh", "chromedriver", "selenium"] -docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy", "docutils-stubs", "mypy (==0.991)", "types-pillow"] -test = ["matplotlib", "pillow", "pytest"] -test-no-images = ["pytest"] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "wurlitzer"] [[package]] name = "cycler" -version = "0.11.0" +version = "0.12.1" description = "Composable style cycles" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, +] + +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "fonttools" -version = "4.39.2" +version = "4.53.1" description = "Tools to manipulate font files" category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "fonttools-4.53.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397"}, + {file = "fonttools-4.53.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3"}, + {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d"}, + {file = "fonttools-4.53.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0"}, + {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41"}, + {file = "fonttools-4.53.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f"}, + {file = "fonttools-4.53.1-cp310-cp310-win32.whl", hash = "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4"}, + {file = "fonttools-4.53.1-cp310-cp310-win_amd64.whl", hash = "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671"}, + {file = "fonttools-4.53.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1"}, + {file = "fonttools-4.53.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923"}, + {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719"}, + {file = "fonttools-4.53.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3"}, + {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb"}, + {file = "fonttools-4.53.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2"}, + {file = "fonttools-4.53.1-cp311-cp311-win32.whl", hash = "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88"}, + {file = "fonttools-4.53.1-cp311-cp311-win_amd64.whl", hash = "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58"}, + {file = "fonttools-4.53.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60"}, + {file = "fonttools-4.53.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2"}, + {file = "fonttools-4.53.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f"}, + {file = "fonttools-4.53.1-cp312-cp312-win32.whl", hash = "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670"}, + {file = "fonttools-4.53.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab"}, + {file = "fonttools-4.53.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749"}, + {file = "fonttools-4.53.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2"}, + {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb"}, + {file = "fonttools-4.53.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f"}, + {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d"}, + {file = "fonttools-4.53.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169"}, + {file = "fonttools-4.53.1-cp38-cp38-win32.whl", hash = "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d"}, + {file = "fonttools-4.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8"}, + {file = "fonttools-4.53.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a"}, + {file = "fonttools-4.53.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31"}, + {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c"}, + {file = "fonttools-4.53.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407"}, + {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb"}, + {file = "fonttools-4.53.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122"}, + {file = "fonttools-4.53.1-cp39-cp39-win32.whl", hash = "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb"}, + {file = "fonttools-4.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb"}, + {file = "fonttools-4.53.1-py3-none-any.whl", hash = "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d"}, + {file = "fonttools-4.53.1.tar.gz", hash = "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4"}, +] [package.extras] -all = ["fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "zopfli (>=0.1.4)", "lz4 (>=1.7.4.2)", "matplotlib", "sympy", "skia-pathops (>=0.5.0)", "uharfbuzz (>=0.23.0)", "brotlicffi (>=0.8.0)", "scipy", "brotli (>=1.0.1)", "munkres", "unicodedata2 (>=15.0.0)", "xattr"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["scipy", "munkres"] -lxml = ["lxml (>=4.0,<5)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.0.0)"] -woff = ["zopfli (>=0.1.4)", "brotlicffi (>=0.8.0)", "brotli (>=1.0.1)"] +unicode = ["unicodedata2 (>=15.1.0)"] +woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "importlib-resources" -version = "5.12.0" +version = "6.4.5" description = "Read resources from Python packages" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.4.5-py3-none-any.whl", hash = "sha256:ac29d5f956f01d5e4bb63102a5a19957f1b9175e45649977264a1416783bb717"}, + {file = "importlib_resources-6.4.5.tar.gz", hash = "sha256:980862a1d16c9e147a59603677fa2aa5fd82b87f223b6cb870695bcfce830065"}, +] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["jaraco.test (>=5.4)", "pytest (>=6,!=8.1.*)", "zipp (>=3.17)"] +type = ["pytest-mypy"] [[package]] name = "kiwisolver" -version = "1.4.4" +version = "1.4.7" description = "A fast implementation of the Cassowary constraint solver" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8a9c83f75223d5e48b0bc9cb1bf2776cf01563e00ade8775ffe13b0b6e1af3a6"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:58370b1ffbd35407444d57057b57da5d6549d2d854fa30249771775c63b5fe17"}, + {file = "kiwisolver-1.4.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aa0abdf853e09aff551db11fce173e2177d00786c688203f52c87ad7fcd91ef9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d53103597a252fb3ab8b5845af04c7a26d5e7ea8122303dd7a021176a87e8b9"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:88f17c5ffa8e9462fb79f62746428dd57b46eb931698e42e990ad63103f35e6c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88a9ca9c710d598fd75ee5de59d5bda2684d9db36a9f50b6125eaea3969c2599"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f4d742cb7af1c28303a51b7a27aaee540e71bb8e24f68c736f6f2ffc82f2bf05"}, + {file = "kiwisolver-1.4.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e28c7fea2196bf4c2f8d46a0415c77a1c480cc0724722f23d7410ffe9842c407"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e968b84db54f9d42046cf154e02911e39c0435c9801681e3fc9ce8a3c4130278"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:0c18ec74c0472de033e1bebb2911c3c310eef5649133dd0bedf2a169a1b269e5"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8f0ea6da6d393d8b2e187e6a5e3fb81f5862010a40c3945e2c6d12ae45cfb2ad"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:f106407dda69ae456dd1227966bf445b157ccc80ba0dff3802bb63f30b74e895"}, + {file = "kiwisolver-1.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:84ec80df401cfee1457063732d90022f93951944b5b58975d34ab56bb150dfb3"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win32.whl", hash = "sha256:71bb308552200fb2c195e35ef05de12f0c878c07fc91c270eb3d6e41698c3bcc"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:44756f9fd339de0fb6ee4f8c1696cfd19b2422e0d70b4cefc1cc7f1f64045a8c"}, + {file = "kiwisolver-1.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:78a42513018c41c2ffd262eb676442315cbfe3c44eed82385c2ed043bc63210a"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d2b0e12a42fb4e72d509fc994713d099cbb15ebf1103545e8a45f14da2dfca54"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2a8781ac3edc42ea4b90bc23e7d37b665d89423818e26eb6df90698aa2287c95"}, + {file = "kiwisolver-1.4.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:46707a10836894b559e04b0fd143e343945c97fd170d69a2d26d640b4e297935"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef97b8df011141c9b0f6caf23b29379f87dd13183c978a30a3c546d2c47314cb"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab58c12a2cd0fc769089e6d38466c46d7f76aced0a1f54c77652446733d2d02"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:803b8e1459341c1bb56d1c5c010406d5edec8a0713a0945851290a7930679b51"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f9a9e8a507420fe35992ee9ecb302dab68550dedc0da9e2880dd88071c5fb052"}, + {file = "kiwisolver-1.4.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18077b53dc3bb490e330669a99920c5e6a496889ae8c63b58fbc57c3d7f33a18"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6af936f79086a89b3680a280c47ea90b4df7047b5bdf3aa5c524bbedddb9e545"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:3abc5b19d24af4b77d1598a585b8a719beb8569a71568b66f4ebe1fb0449460b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:933d4de052939d90afbe6e9d5273ae05fb836cc86c15b686edd4b3560cc0ee36"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:65e720d2ab2b53f1f72fb5da5fb477455905ce2c88aaa671ff0a447c2c80e8e3"}, + {file = "kiwisolver-1.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3bf1ed55088f214ba6427484c59553123fdd9b218a42bbc8c6496d6754b1e523"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win32.whl", hash = "sha256:4c00336b9dd5ad96d0a558fd18a8b6f711b7449acce4c157e7343ba92dd0cf3d"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:929e294c1ac1e9f615c62a4e4313ca1823ba37326c164ec720a803287c4c499b"}, + {file = "kiwisolver-1.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:e33e8fbd440c917106b237ef1a2f1449dfbb9b6f6e1ce17c94cd6a1e0d438376"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5360cc32706dab3931f738d3079652d20982511f7c0ac5711483e6eab08efff2"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942216596dc64ddb25adb215c3c783215b23626f8d84e8eff8d6d45c3f29f75a"}, + {file = "kiwisolver-1.4.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:48b571ecd8bae15702e4f22d3ff6a0f13e54d3d00cd25216d5e7f658242065ee"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad42ba922c67c5f219097b28fae965e10045ddf145d2928bfac2eb2e17673640"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:612a10bdae23404a72941a0fc8fa2660c6ea1217c4ce0dbcab8a8f6543ea9e7f"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9e838bba3a3bac0fe06d849d29772eb1afb9745a59710762e4ba3f4cb8424483"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:22f499f6157236c19f4bbbd472fa55b063db77a16cd74d49afe28992dff8c258"}, + {file = "kiwisolver-1.4.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693902d433cf585133699972b6d7c42a8b9f8f826ebcaf0132ff55200afc599e"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4e77f2126c3e0b0d055f44513ed349038ac180371ed9b52fe96a32aa071a5107"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:657a05857bda581c3656bfc3b20e353c232e9193eb167766ad2dc58b56504948"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4bfa75a048c056a411f9705856abfc872558e33c055d80af6a380e3658766038"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:34ea1de54beef1c104422d210c47c7d2a4999bdecf42c7b5718fbe59a4cac383"}, + {file = "kiwisolver-1.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:90da3b5f694b85231cf93586dad5e90e2d71b9428f9aad96952c99055582f520"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win32.whl", hash = "sha256:18e0cca3e008e17fe9b164b55735a325140a5a35faad8de92dd80265cd5eb80b"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:58cb20602b18f86f83a5c87d3ee1c766a79c0d452f8def86d925e6c60fbf7bfb"}, + {file = "kiwisolver-1.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:f5a8b53bdc0b3961f8b6125e198617c40aeed638b387913bf1ce78afb1b0be2a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2e6039dcbe79a8e0f044f1c39db1986a1b8071051efba3ee4d74f5b365f5226e"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a1ecf0ac1c518487d9d23b1cd7139a6a65bc460cd101ab01f1be82ecf09794b6"}, + {file = "kiwisolver-1.4.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7ab9ccab2b5bd5702ab0803676a580fffa2aa178c2badc5557a84cc943fcf750"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f816dd2277f8d63d79f9c8473a79fe54047bc0467754962840782c575522224d"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf8bcc23ceb5a1b624572a1623b9f79d2c3b337c8c455405ef231933a10da379"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dea0bf229319828467d7fca8c7c189780aa9ff679c94539eed7532ebe33ed37c"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c06a4c7cf15ec739ce0e5971b26c93638730090add60e183530d70848ebdd34"}, + {file = "kiwisolver-1.4.7-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:913983ad2deb14e66d83c28b632fd35ba2b825031f2fa4ca29675e665dfecbe1"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5337ec7809bcd0f424c6b705ecf97941c46279cf5ed92311782c7c9c2026f07f"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:4c26ed10c4f6fa6ddb329a5120ba3b6db349ca192ae211e882970bfc9d91420b"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c619b101e6de2222c1fcb0531e1b17bbffbe54294bfba43ea0d411d428618c27"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:073a36c8273647592ea332e816e75ef8da5c303236ec0167196793eb1e34657a"}, + {file = "kiwisolver-1.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:3ce6b2b0231bda412463e152fc18335ba32faf4e8c23a754ad50ffa70e4091ee"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win32.whl", hash = "sha256:f4c9aee212bc89d4e13f58be11a56cc8036cabad119259d12ace14b34476fd07"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:8a3ec5aa8e38fc4c8af308917ce12c536f1c88452ce554027e55b22cbbfbff76"}, + {file = "kiwisolver-1.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:76c8094ac20ec259471ac53e774623eb62e6e1f56cd8690c67ce6ce4fcb05650"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5d5abf8f8ec1f4e22882273c423e16cae834c36856cac348cfbfa68e01c40f3a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:aeb3531b196ef6f11776c21674dba836aeea9d5bd1cf630f869e3d90b16cfade"}, + {file = "kiwisolver-1.4.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7d755065e4e866a8086c9bdada157133ff466476a2ad7861828e17b6026e22c"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08471d4d86cbaec61f86b217dd938a83d85e03785f51121e791a6e6689a3be95"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7bbfcb7165ce3d54a3dfbe731e470f65739c4c1f85bb1018ee912bae139e263b"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d34eb8494bea691a1a450141ebb5385e4b69d38bb8403b5146ad279f4b30fa3"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9242795d174daa40105c1d86aba618e8eab7bf96ba8c3ee614da8302a9f95503"}, + {file = "kiwisolver-1.4.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a0f64a48bb81af7450e641e3fe0b0394d7381e342805479178b3d335d60ca7cf"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:8e045731a5416357638d1700927529e2b8ab304811671f665b225f8bf8d8f933"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4322872d5772cae7369f8351da1edf255a604ea7087fe295411397d0cfd9655e"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:e1631290ee9271dffe3062d2634c3ecac02c83890ada077d225e081aca8aab89"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:edcfc407e4eb17e037bca59be0e85a2031a2ac87e4fed26d3e9df88b4165f92d"}, + {file = "kiwisolver-1.4.7-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:4d05d81ecb47d11e7f8932bd8b61b720bf0b41199358f3f5e36d38e28f0532c5"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win32.whl", hash = "sha256:b38ac83d5f04b15e515fd86f312479d950d05ce2368d5413d46c088dda7de90a"}, + {file = "kiwisolver-1.4.7-cp38-cp38-win_amd64.whl", hash = "sha256:d83db7cde68459fc803052a55ace60bea2bae361fc3b7a6d5da07e11954e4b09"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9362ecfca44c863569d3d3c033dbe8ba452ff8eed6f6b5806382741a1334bd"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e8df2eb9b2bac43ef8b082e06f750350fbbaf2887534a5be97f6cf07b19d9583"}, + {file = "kiwisolver-1.4.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f32d6edbc638cde7652bd690c3e728b25332acbadd7cad670cc4a02558d9c417"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e2e6c39bd7b9372b0be21456caab138e8e69cc0fc1190a9dfa92bd45a1e6e904"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dda56c24d869b1193fcc763f1284b9126550eaf84b88bbc7256e15028f19188a"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79849239c39b5e1fd906556c474d9b0439ea6792b637511f3fe3a41158d89ca8"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5e3bc157fed2a4c02ec468de4ecd12a6e22818d4f09cde2c31ee3226ffbefab2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3da53da805b71e41053dc670f9a820d1157aae77b6b944e08024d17bcd51ef88"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:8705f17dfeb43139a692298cb6637ee2e59c0194538153e83e9ee0c75c2eddde"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:82a5c2f4b87c26bb1a0ef3d16b5c4753434633b83d365cc0ddf2770c93829e3c"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ce8be0466f4c0d585cdb6c1e2ed07232221df101a4c6f28821d2aa754ca2d9e2"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:409afdfe1e2e90e6ee7fc896f3df9a7fec8e793e58bfa0d052c8a82f99c37abb"}, + {file = "kiwisolver-1.4.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5b9c3f4ee0b9a439d2415012bd1b1cc2df59e4d6a9939f4d669241d30b414327"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win32.whl", hash = "sha256:a79ae34384df2b615eefca647a2873842ac3b596418032bef9a7283675962644"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_amd64.whl", hash = "sha256:cf0438b42121a66a3a667de17e779330fc0f20b0d97d59d2f2121e182b0505e4"}, + {file = "kiwisolver-1.4.7-cp39-cp39-win_arm64.whl", hash = "sha256:764202cc7e70f767dab49e8df52c7455e8de0df5d858fa801a11aa0d882ccf3f"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:94252291e3fe68001b1dd747b4c0b3be12582839b95ad4d1b641924d68fd4643"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5b7dfa3b546da08a9f622bb6becdb14b3e24aaa30adba66749d38f3cc7ea9706"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3de6481f4ed8b734da5df134cd5a6a64fe32124fe83dde1e5b5f29fe30b1e6"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a91b5f9f1205845d488c928e8570dcb62b893372f63b8b6e98b863ebd2368ff2"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40fa14dbd66b8b8f470d5fc79c089a66185619d31645f9b0773b88b19f7223c4"}, + {file = "kiwisolver-1.4.7-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:eb542fe7933aa09d8d8f9d9097ef37532a7df6497819d16efe4359890a2f417a"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bfa1acfa0c54932d5607e19a2c24646fb4c1ae2694437789129cf099789a3b00"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:eee3ea935c3d227d49b4eb85660ff631556841f6e567f0f7bda972df6c2c9935"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f3160309af4396e0ed04db259c3ccbfdc3621b5559b5453075e5de555e1f3a1b"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a17f6a29cf8935e587cc8a4dbfc8368c55edc645283db0ce9801016f83526c2d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10849fb2c1ecbfae45a693c070e0320a91b35dd4bcf58172c023b994283a124d"}, + {file = "kiwisolver-1.4.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:ac542bf38a8a4be2dc6b15248d36315ccc65f0743f7b1a76688ffb6b5129a5c2"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b01aac285f91ca889c800042c35ad3b239e704b150cfd3382adfc9dcc780e39"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:48be928f59a1f5c8207154f935334d374e79f2b5d212826307d072595ad76a2e"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f37cfe618a117e50d8c240555331160d73d0411422b59b5ee217843d7b693608"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599b5c873c63a1f6ed7eead644a8a380cfbdf5db91dcb6f85707aaab213b1674"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801fa7802e5cfabe3ab0c81a34c323a319b097dfb5004be950482d882f3d7225"}, + {file = "kiwisolver-1.4.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0c6c43471bc764fad4bc99c5c2d6d16a676b1abf844ca7c8702bdae92df01ee0"}, + {file = "kiwisolver-1.4.7.tar.gz", hash = "sha256:9893ff81bd7107f7b685d3017cc6583daadb4fc26e4a888350df530e41980a60"}, +] [[package]] name = "matplotlib" -version = "3.7.1" +version = "3.7.5" description = "Python plotting package" category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "matplotlib-3.7.5-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:4a87b69cb1cb20943010f63feb0b2901c17a3b435f75349fd9865713bfa63925"}, + {file = "matplotlib-3.7.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d3ce45010fefb028359accebb852ca0c21bd77ec0f281952831d235228f15810"}, + {file = "matplotlib-3.7.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fbea1e762b28400393d71be1a02144aa16692a3c4c676ba0178ce83fc2928fdd"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec0e1adc0ad70ba8227e957551e25a9d2995e319c29f94a97575bb90fa1d4469"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6738c89a635ced486c8a20e20111d33f6398a9cbebce1ced59c211e12cd61455"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1210b7919b4ed94b5573870f316bca26de3e3b07ffdb563e79327dc0e6bba515"}, + {file = "matplotlib-3.7.5-cp310-cp310-win32.whl", hash = "sha256:068ebcc59c072781d9dcdb82f0d3f1458271c2de7ca9c78f5bd672141091e9e1"}, + {file = "matplotlib-3.7.5-cp310-cp310-win_amd64.whl", hash = "sha256:f098ffbaab9df1e3ef04e5a5586a1e6b1791380698e84938d8640961c79b1fc0"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:f65342c147572673f02a4abec2d5a23ad9c3898167df9b47c149f32ce61ca078"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4ddf7fc0e0dc553891a117aa083039088d8a07686d4c93fb8a810adca68810af"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ccb830fc29442360d91be48527809f23a5dcaee8da5f4d9b2d5b867c1b087b8"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efc6bb28178e844d1f408dd4d6341ee8a2e906fc9e0fa3dae497da4e0cab775d"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b15c4c2d374f249f324f46e883340d494c01768dd5287f8bc00b65b625ab56c"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d028555421912307845e59e3de328260b26d055c5dac9b182cc9783854e98fb"}, + {file = "matplotlib-3.7.5-cp311-cp311-win32.whl", hash = "sha256:fe184b4625b4052fa88ef350b815559dd90cc6cc8e97b62f966e1ca84074aafa"}, + {file = "matplotlib-3.7.5-cp311-cp311-win_amd64.whl", hash = "sha256:084f1f0f2f1010868c6f1f50b4e1c6f2fb201c58475494f1e5b66fed66093647"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:34bceb9d8ddb142055ff27cd7135f539f2f01be2ce0bafbace4117abe58f8fe4"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c5a2134162273eb8cdfd320ae907bf84d171de948e62180fa372a3ca7cf0f433"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:039ad54683a814002ff37bf7981aa1faa40b91f4ff84149beb53d1eb64617980"}, + {file = "matplotlib-3.7.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d742ccd1b09e863b4ca58291728db645b51dab343eebb08d5d4b31b308296ce"}, + {file = "matplotlib-3.7.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:743b1c488ca6a2bc7f56079d282e44d236bf375968bfd1b7ba701fd4d0fa32d6"}, + {file = "matplotlib-3.7.5-cp312-cp312-win_amd64.whl", hash = "sha256:fbf730fca3e1f23713bc1fae0a57db386e39dc81ea57dc305c67f628c1d7a342"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:cfff9b838531698ee40e40ea1a8a9dc2c01edb400b27d38de6ba44c1f9a8e3d2"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:1dbcca4508bca7847fe2d64a05b237a3dcaec1f959aedb756d5b1c67b770c5ee"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4cdf4ef46c2a1609a50411b66940b31778db1e4b73d4ecc2eaa40bd588979b13"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:167200ccfefd1674b60e957186dfd9baf58b324562ad1a28e5d0a6b3bea77905"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:53e64522934df6e1818b25fd48cf3b645b11740d78e6ef765fbb5fa5ce080d02"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3e3bc79b2d7d615067bd010caff9243ead1fc95cf735c16e4b2583173f717eb"}, + {file = "matplotlib-3.7.5-cp38-cp38-win32.whl", hash = "sha256:6b641b48c6819726ed47c55835cdd330e53747d4efff574109fd79b2d8a13748"}, + {file = "matplotlib-3.7.5-cp38-cp38-win_amd64.whl", hash = "sha256:f0b60993ed3488b4532ec6b697059897891927cbfc2b8d458a891b60ec03d9d7"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:090964d0afaff9c90e4d8de7836757e72ecfb252fb02884016d809239f715651"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:9fc6fcfbc55cd719bc0bfa60bde248eb68cf43876d4c22864603bdd23962ba25"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7cc3078b019bb863752b8b60e8b269423000f1603cb2299608231996bd9d54"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e4e9a868e8163abaaa8259842d85f949a919e1ead17644fb77a60427c90473c"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa7ebc995a7d747dacf0a717d0eb3aa0f0c6a0e9ea88b0194d3a3cd241a1500f"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3785bfd83b05fc0e0c2ae4c4a90034fe693ef96c679634756c50fe6efcc09856"}, + {file = "matplotlib-3.7.5-cp39-cp39-win32.whl", hash = "sha256:29b058738c104d0ca8806395f1c9089dfe4d4f0f78ea765c6c704469f3fffc81"}, + {file = "matplotlib-3.7.5-cp39-cp39-win_amd64.whl", hash = "sha256:fd4028d570fa4b31b7b165d4a685942ae9cdc669f33741e388c01857d9723eab"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2a9a3f4d6a7f88a62a6a18c7e6a84aedcaf4faf0708b4ca46d87b19f1b526f88"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b3fd853d4a7f008a938df909b96db0b454225f935d3917520305b90680579c"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0ad550da9f160737d7890217c5eeed4337d07e83ca1b2ca6535078f354e7675"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:20da7924a08306a861b3f2d1da0d1aa9a6678e480cf8eacffe18b565af2813e7"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b45c9798ea6bb920cb77eb7306409756a7fab9db9b463e462618e0559aecb30e"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a99866267da1e561c7776fe12bf4442174b79aac1a47bd7e627c7e4d077ebd83"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b6aa62adb6c268fc87d80f963aca39c64615c31830b02697743c95590ce3fbb"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e530ab6a0afd082d2e9c17eb1eb064a63c5b09bb607b2b74fa41adbe3e162286"}, + {file = "matplotlib-3.7.5.tar.gz", hash = "sha256:1e5c971558ebc811aa07f54c7b7c677d78aa518ef4c390e14673a09e0860184a"}, +] [package.dependencies] contourpy = ">=1.0.1" @@ -83,28 +364,107 @@ cycler = ">=0.10" fonttools = ">=4.22.0" importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} kiwisolver = ">=1.0.1" -numpy = ">=1.20" +numpy = ">=1.20,<2" packaging = ">=20.0" pillow = ">=6.2.0" pyparsing = ">=2.3.1" python-dateutil = ">=2.7" -setuptools_scm = ">=7" [[package]] name = "numpy" -version = "1.24.2" +version = "1.24.4" description = "Fundamental package for array computing in Python" category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "numpy-1.24.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64"}, + {file = "numpy-1.24.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4"}, + {file = "numpy-1.24.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6"}, + {file = "numpy-1.24.4-cp310-cp310-win32.whl", hash = "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc"}, + {file = "numpy-1.24.4-cp310-cp310-win_amd64.whl", hash = "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810"}, + {file = "numpy-1.24.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7"}, + {file = "numpy-1.24.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5"}, + {file = "numpy-1.24.4-cp311-cp311-win32.whl", hash = "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d"}, + {file = "numpy-1.24.4-cp311-cp311-win_amd64.whl", hash = "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61"}, + {file = "numpy-1.24.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e"}, + {file = "numpy-1.24.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc"}, + {file = "numpy-1.24.4-cp38-cp38-win32.whl", hash = "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2"}, + {file = "numpy-1.24.4-cp38-cp38-win_amd64.whl", hash = "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400"}, + {file = "numpy-1.24.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9"}, + {file = "numpy-1.24.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d"}, + {file = "numpy-1.24.4-cp39-cp39-win32.whl", hash = "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835"}, + {file = "numpy-1.24.4-cp39-cp39-win_amd64.whl", hash = "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a"}, + {file = "numpy-1.24.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2"}, + {file = "numpy-1.24.4.tar.gz", hash = "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463"}, +] + +[[package]] +name = "numpy" +version = "1.26.4" +description = "Fundamental package for array computing in Python" +category = "main" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, +] [[package]] name = "packaging" -version = "23.0" +version = "24.1" description = "Core utilities for Python packages" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] [[package]] name = "pandas" @@ -113,6 +473,35 @@ description = "Powerful data structures for data analysis, time series, and stat category = "main" optional = false python-versions = ">=3.8" +files = [ + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, + {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c3ac844a0fe00bfaeb2c9b51ab1424e5c8744f89860b138434a363b1f620f354"}, + {file = "pandas-1.5.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a0a56cef15fd1586726dace5616db75ebcfec9179a3a55e78f72c5639fa2a23"}, + {file = "pandas-1.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:478ff646ca42b20376e4ed3fa2e8d7341e8a63105586efe54fa2508ee087f328"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6973549c01ca91ec96199e940495219c887ea815b2083722821f1d7abfa2b4dc"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c39a8da13cede5adcd3be1182883aea1c925476f4e84b2807a46e2775306305d"}, + {file = "pandas-1.5.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f76d097d12c82a535fda9dfe5e8dd4127952b45fea9b0276cb30cca5ea313fbc"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e474390e60ed609cec869b0da796ad94f420bb057d86784191eefc62b65819ae"}, + {file = "pandas-1.5.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f2b952406a1588ad4cad5b3f55f520e82e902388a6d5a4a91baa8d38d23c7f6"}, + {file = "pandas-1.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:bc4c368f42b551bf72fac35c5128963a171b40dce866fb066540eeaf46faa003"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:14e45300521902689a81f3f41386dc86f19b8ba8dd5ac5a3c7010ef8d2932813"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9842b6f4b8479e41968eced654487258ed81df7d1c9b7b870ceea24ed9459b31"}, + {file = "pandas-1.5.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:26d9c71772c7afb9d5046e6e9cf42d83dd147b5cf5bcb9d97252077118543792"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fbcb19d6fceb9e946b3e23258757c7b225ba450990d9ed63ccceeb8cae609f7"}, + {file = "pandas-1.5.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:565fa34a5434d38e9d250af3c12ff931abaf88050551d9fbcdfafca50d62babf"}, + {file = "pandas-1.5.3-cp38-cp38-win32.whl", hash = "sha256:87bd9c03da1ac870a6d2c8902a0e1fd4267ca00f13bc494c9e5a9020920e1d51"}, + {file = "pandas-1.5.3-cp38-cp38-win_amd64.whl", hash = "sha256:41179ce559943d83a9b4bbacb736b04c928b095b5f25dd2b7389eda08f46f373"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c74a62747864ed568f5a82a49a23a8d7fe171d0c69038b38cedf0976831296fa"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c4c00e0b0597c8e4f59e8d461f797e5d70b4d025880516a8261b2817c47759ee"}, + {file = "pandas-1.5.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a50d9a4336a9621cab7b8eb3fb11adb82de58f9b91d84c2cd526576b881a0c5a"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd05f7783b3274aa206a1af06f0ceed3f9b412cf665b7247eacd83be41cf7bf0"}, + {file = "pandas-1.5.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f69c4029613de47816b1bb30ff5ac778686688751a5e9c99ad8c7031f6508e5"}, + {file = "pandas-1.5.3-cp39-cp39-win32.whl", hash = "sha256:7cec0bee9f294e5de5bbfc14d0573f65526071029d036b753ee6507d2a21480a"}, + {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, + {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, +] [package.dependencies] numpy = [ @@ -128,73 +517,207 @@ test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] [[package]] name = "pillow" -version = "9.4.0" +version = "10.4.0" description = "Python Imaging Library (Fork)" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, +] [package.extras] -docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-issues (>=3.0.1)", "sphinx-removed-in", "sphinxext-opengraph"] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "pyparsing" -version = "3.0.9" +version = "3.1.4" description = "pyparsing module - Classes and methods to define and execute parsing grammars" category = "main" optional = false python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, + {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, +] [package.extras] -diagrams = ["railroad-diagrams", "jinja2"] +diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pyqt5" -version = "5.15.9" +version = "5.15.11" description = "Python bindings for the Qt cross platform application toolkit" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "PyQt5-5.15.11-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c8b03dd9380bb13c804f0bdb0f4956067f281785b5e12303d529f0462f9afdc2"}, + {file = "PyQt5-5.15.11-cp38-abi3-macosx_11_0_x86_64.whl", hash = "sha256:6cd75628f6e732b1ffcfe709ab833a0716c0445d7aec8046a48d5843352becb6"}, + {file = "PyQt5-5.15.11-cp38-abi3-manylinux_2_17_x86_64.whl", hash = "sha256:cd672a6738d1ae33ef7d9efa8e6cb0a1525ecf53ec86da80a9e1b6ec38c8d0f1"}, + {file = "PyQt5-5.15.11-cp38-abi3-win32.whl", hash = "sha256:76be0322ceda5deecd1708a8d628e698089a1cea80d1a49d242a6d579a40babd"}, + {file = "PyQt5-5.15.11-cp38-abi3-win_amd64.whl", hash = "sha256:bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517"}, + {file = "PyQt5-5.15.11.tar.gz", hash = "sha256:fda45743ebb4a27b4b1a51c6d8ef455c4c1b5d610c90d2934c7802b5c1557c52"}, +] [package.dependencies] -PyQt5-Qt5 = ">=5.15.2" -PyQt5-sip = ">=12.11,<13" +PyQt5-Qt5 = ">=5.15.2,<5.16.0" +PyQt5-sip = ">=12.15,<13" [[package]] name = "pyqt5-qt5" -version = "5.15.2" +version = "5.15.15" description = "The subset of a Qt installation needed by PyQt5." category = "main" optional = false python-versions = "*" +files = [ + {file = "PyQt5_Qt5-5.15.15-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:eb74072935958a830887115b1de1ff26341fc2d5881b28129de39612b10a260e"}, + {file = "PyQt5_Qt5-5.15.15-py3-none-macosx_11_0_arm64.whl", hash = "sha256:f8b174725fbe29c1a22f8acce5798933a65c8a083f1d9833ff212479ec2b3c14"}, + {file = "PyQt5_Qt5-5.15.15-py3-none-manylinux2014_x86_64.whl", hash = "sha256:611505d04ffb06a5e5bcf98f5ff0e4e15ba7785565ccbe7bd3b2e40642ea3bdd"}, +] [[package]] name = "pyqt5-sip" -version = "12.11.1" +version = "12.15.0" description = "The sip module support for PyQt5" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "PyQt5_sip-12.15.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:749f7a3ffd6e3d2d5db65ed92c95cbd14490631595c61f0c0672c9238bfb17de"}, + {file = "PyQt5_sip-12.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b4adc529fa4ec05728e14ea55194d907cc51f18d6f2ac5cc9f6eb52ac038aa0f"}, + {file = "PyQt5_sip-12.15.0-cp310-cp310-win32.whl", hash = "sha256:83d247cdc43ef224410b14c97413067ea26356dfa39e9ed0fe702a31e25710b0"}, + {file = "PyQt5_sip-12.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:13f0c6a78e781255863e3e160304648efaf62276b7102741af637b63a6e96930"}, + {file = "PyQt5_sip-12.15.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:855563d4d3b59ce7438bbf2dd32fed2707787defa40f3efe94f204a19ef92b25"}, + {file = "PyQt5_sip-12.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0b718a362f4392430903bbb2a4b9bbff9841a16a52f0cfdd5b5bbd9d11457980"}, + {file = "PyQt5_sip-12.15.0-cp311-cp311-win32.whl", hash = "sha256:2575f428de584a12009fd29d00c89df16ed101a3b38beba818dfdcbc4a10709c"}, + {file = "PyQt5_sip-12.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:c85be433fbafcb3d417581c0e1b67c8198d23858166e4f938e971c2262c13cdb"}, + {file = "PyQt5_sip-12.15.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:852b75cf208825602480e95ab63314108f872d0da251e9ad3deaaff5a183a6f5"}, + {file = "PyQt5_sip-12.15.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0cd21c3215e3c47fdd5fa7a2dc3dd1e07a7230b0626e905a7217925068c788b9"}, + {file = "PyQt5_sip-12.15.0-cp312-cp312-win32.whl", hash = "sha256:b58eeedc9b2a3037b136bf96915196c391a33be470ed1c0723d7163ef0b727a2"}, + {file = "PyQt5_sip-12.15.0-cp312-cp312-win_amd64.whl", hash = "sha256:24a1d4937332bf0a38dd95bb2ce4d89723df449f6e912b52ef0e107e11fefac1"}, + {file = "PyQt5_sip-12.15.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:91b9538458a3a23e033c213bc879ce64f3d0a33d5a49cbd03e1e584efe307a35"}, + {file = "PyQt5_sip-12.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0c1c727ede7fdc464a1fe2e46109ba836509b2d7187a46fdeae443148ce51d1c"}, + {file = "PyQt5_sip-12.15.0-cp38-cp38-win32.whl", hash = "sha256:dd241de9c569c07bbba62bff1049996e5b52478164f61f430073a87bf6d26d33"}, + {file = "PyQt5_sip-12.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:f600ae6f03e4bff91153c0dc7ebe52f90bd2b6afda58fd580e6990b3b951adc0"}, + {file = "PyQt5_sip-12.15.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c0c543d604116af26694a8a5ba90f510551ff9124d503ae5ee14bb73a61363a3"}, + {file = "PyQt5_sip-12.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:97f2d6e8d9b7b3d3e795d576d7f56e6257f524221f6383b33ded7287763e9f06"}, + {file = "PyQt5_sip-12.15.0-cp39-cp39-win32.whl", hash = "sha256:ed5221c6241981bd98d39504823efb9cbe36841bf8917288f8fe8fc1d5569a41"}, + {file = "PyQt5_sip-12.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:7f88c85702dce80ac2e1a162054f688ed394811d6dd03a5574b3fa8111b0a6db"}, + {file = "PyQt5_sip-12.15.0.tar.gz", hash = "sha256:d23fdfcf363b5cedd9d39f8a9c5710e7d52804f5b08a58e91c638b36eafcb702"}, +] [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] [package.dependencies] six = ">=1.5" [[package]] name = "pytz" -version = "2022.7.1" +version = "2024.2" description = "World timezone definitions, modern and historical" category = "main" optional = false python-versions = "*" +files = [ + {file = "pytz-2024.2-py2.py3-none-any.whl", hash = "sha256:31c7c1817eb7fae7ca4b8c7ee50c72f93aa2dd863de768e1ef4245d426aa0725"}, + {file = "pytz-2024.2.tar.gz", hash = "sha256:2aa355083c50a0f93fa581709deac0c9ad65cca8a9e9beac660adcbd493c798a"}, +] [[package]] name = "scipy" @@ -203,31 +726,37 @@ description = "Fundamental algorithms for scientific computing in Python" category = "main" optional = false python-versions = "<3.12,>=3.8" +files = [ + {file = "scipy-1.10.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e7354fd7527a4b0377ce55f286805b34e8c54b91be865bac273f527e1b839019"}, + {file = "scipy-1.10.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:4b3f429188c66603a1a5c549fb414e4d3bdc2a24792e061ffbd607d3d75fd84e"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1553b5dcddd64ba9a0d95355e63fe6c3fc303a8fd77c7bc91e77d61363f7433f"}, + {file = "scipy-1.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c0ff64b06b10e35215abce517252b375e580a6125fd5fdf6421b98efbefb2d2"}, + {file = "scipy-1.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:fae8a7b898c42dffe3f7361c40d5952b6bf32d10c4569098d276b4c547905ee1"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f1564ea217e82c1bbe75ddf7285ba0709ecd503f048cb1236ae9995f64217bd"}, + {file = "scipy-1.10.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d925fa1c81b772882aa55bcc10bf88324dadb66ff85d548c71515f6689c6dac5"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaea0a6be54462ec027de54fca511540980d1e9eea68b2d5c1dbfe084797be35"}, + {file = "scipy-1.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15a35c4242ec5f292c3dd364a7c71a61be87a3d4ddcc693372813c0b73c9af1d"}, + {file = "scipy-1.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:43b8e0bcb877faf0abfb613d51026cd5cc78918e9530e375727bf0625c82788f"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5678f88c68ea866ed9ebe3a989091088553ba12c6090244fdae3e467b1139c35"}, + {file = "scipy-1.10.1-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:39becb03541f9e58243f4197584286e339029e8908c46f7221abeea4b749fa88"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bce5869c8d68cf383ce240e44c1d9ae7c06078a9396df68ce88a1230f93a30c1"}, + {file = "scipy-1.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07c3457ce0b3ad5124f98a86533106b643dd811dd61b548e78cf4c8786652f6f"}, + {file = "scipy-1.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:049a8bbf0ad95277ffba9b3b7d23e5369cc39e66406d60422c8cfef40ccc8415"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cd9f1027ff30d90618914a64ca9b1a77a431159df0e2a195d8a9e8a04c78abf9"}, + {file = "scipy-1.10.1-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:79c8e5a6c6ffaf3a2262ef1be1e108a035cf4f05c14df56057b64acc5bebffb6"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51af417a000d2dbe1ec6c372dfe688e041a7084da4fdd350aeb139bd3fb55353"}, + {file = "scipy-1.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b4735d6c28aad3cdcf52117e0e91d6b39acd4272f3f5cd9907c24ee931ad601"}, + {file = "scipy-1.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:7ff7f37b1bf4417baca958d254e8e2875d0cc23aaadbe65b3d5b3077b0eb23ea"}, + {file = "scipy-1.10.1.tar.gz", hash = "sha256:2cf9dfb80a7b4589ba4c40ce7588986d6d5cebc5457cad2c2880f6bc2d42f3a5"}, +] [package.dependencies] numpy = ">=1.19.5,<1.27.0" [package.extras] -test = ["pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "asv", "mpmath", "gmpy2", "threadpoolctl", "scikit-umfpack", "pooch"] -doc = ["sphinx (!=4.1.0)", "pydata-sphinx-theme (==0.9.0)", "sphinx-design (>=0.2.0)", "matplotlib (>2)", "numpydoc"] -dev = ["mypy", "typing-extensions", "pycodestyle", "flake8", "rich-click", "click", "doit (>=0.36.0)", "pydevtool"] - -[[package]] -name = "setuptools-scm" -version = "7.1.0" -description = "the blessed package to manage your versions by scm tags" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -packaging = ">=20.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} -typing-extensions = "*" - -[package.extras] -test = ["pytest (>=6.2)", "virtualenv (>20)"] -toml = ["setuptools (>=42)"] +dev = ["click", "doit (>=0.36.0)", "flake8", "mypy", "pycodestyle", "pydevtool", "rich-click", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-design (>=0.2.0)"] +test = ["asv", "gmpy2", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] [[package]] name = "six" @@ -236,63 +765,32 @@ description = "Python 2 and 3 compatibility utilities" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "typing-extensions" -version = "4.5.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "zipp" -version = "3.15.0" +version = "3.20.2" description = "Backport of pathlib-compatible object wrapper for zip files" category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "zipp-3.20.2-py3-none-any.whl", hash = "sha256:a817ac80d6cf4b23bf7f2828b7cabf326f15a001bea8b1f9b49631780ba28350"}, + {file = "zipp-3.20.2.tar.gz", hash = "sha256:bc9eb26f4506fda01b81bcde0ca78103b6e62f991b381fec825435c836edbc29"}, +] [package.extras] -docs = ["sphinx (>=3.5)", "jaraco.packaging (>=9)", "rst.linker (>=1.9)", "furo", "sphinx-lint", "jaraco.tidelift (>=1.4)"] -testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "flake8 (<5)", "pytest-cov", "pytest-enabler (>=1.3)", "jaraco.itertools", "jaraco.functools", "more-itertools", "big-o", "pytest-black (>=0.3.7)", "pytest-mypy (>=0.9.1)", "pytest-flake8"] +check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)"] +cover = ["pytest-cov"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +enabler = ["pytest-enabler (>=2.2)"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-ignore-flaky"] +type = ["pytest-mypy"] [metadata] -lock-version = "1.1" +lock-version = "2.0" python-versions = "<3.12,>=3.8" content-hash = "d91f94789b834755329a2b187c53a3c0fe903c8a52ab11c39a26eeb7ac0d9478" - -[metadata.files] -contourpy = [] -cycler = [] -fonttools = [ - {file = "fonttools-4.39.2-py3-none-any.whl", hash = "sha256:85245aa2fd4cf502a643c9a9a2b5a393703e150a6eaacc3e0e84bb448053f061"}, - {file = "fonttools-4.39.2.zip", hash = "sha256:e2d9f10337c9e3b17f9bce17a60a16a885a7d23b59b7f45ce07ea643e5580439"}, -] -importlib-resources = [] -kiwisolver = [] -matplotlib = [] -numpy = [] -packaging = [] -pandas = [] -pillow = [] -pyparsing = [] -pyqt5 = [] -pyqt5-qt5 = [] -pyqt5-sip = [] -python-dateutil = [] -pytz = [] -scipy = [] -setuptools-scm = [] -six = [] -tomli = [] -typing-extensions = [] -zipp = [] diff --git a/Applications/relax2/server/cross-build.sh b/Applications/relax2/server/cross-build.sh old mode 100644 new mode 100755 diff --git a/Applications/relax2/server/relax_server_dev.c b/Applications/relax2/server/relax_server_dev.c index f1478cca..4352e7a5 100644 --- a/Applications/relax2/server/relax_server_dev.c +++ b/Applications/relax2/server/relax_server_dev.c @@ -17076,6 +17076,21 @@ void update_RF_SAR_cal_pulses(volatile uint16_t *tx_size, void *tx_data, int32_ memcpy(tx_data, pulse, 2 * size); } +typedef __attribute__((packed)) union mixer { + uint64_t x; + int32_t y[2]; + float z[2]; +} mixer_t; + +// new function to take over the conversion to float, because it would be tough in numpy +uint64_t cast_int32cplx_float32cplx(uint64_t x) +{ + mixer_t X,Y; + X.x = x; + Y.z[0] = (float)(X.y[0]); + Y.z[1] = (float)(X.y[1]); + return Y.x; +} int main(int argc) { @@ -17446,8 +17461,12 @@ int main(int argc) usleep(1000000); // Sleep 1s // printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { - while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + while(*rx_cntr < 10000) usleep(500); + for(j = 0; j < 5000; ++j) { + + buffer[j] = cast_int32cplx_float32cplx(*rx_data); + + } send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; @@ -17501,7 +17520,8 @@ int main(int argc) // printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + for(j = 0; j < 5000; ++j) + buffer[j] = cast_int32cplx_float32cplx(*rx_data); send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; @@ -17555,7 +17575,7 @@ int main(int argc) // printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + for(j = 0; j < 5000; ++j) buffer[j] = cast_int32cplx_float32cplx(*rx_data); send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; @@ -17611,7 +17631,7 @@ int main(int argc) // printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + for(j = 0; j < 5000; ++j) buffer[j] = cast_int32cplx_float32cplx(*rx_data); send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; @@ -17671,7 +17691,7 @@ int main(int argc) // printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + for(j = 0; j < 5000; ++j) buffer[j] = cast_int32cplx_float32cplx(*rx_data); send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; @@ -17729,7 +17749,7 @@ int main(int argc) // printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + for(j = 0; j < 5000; ++j) buffer[j] = cast_int32cplx_float32cplx(*rx_data); send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; @@ -17775,8 +17795,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -17819,8 +17839,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -17863,8 +17883,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -17908,8 +17928,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -17952,8 +17972,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -17998,8 +18018,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -18041,8 +18061,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -18092,7 +18112,7 @@ int main(int argc) // printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 5000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + for(j = 0; j < 5000; ++j) buffer[j] = cast_int32cplx_float32cplx(*rx_data); send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; @@ -18146,7 +18166,7 @@ int main(int argc) // printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + for(j = 0; j < 5000; ++j) buffer[j] = cast_int32cplx_float32cplx(*rx_data); send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; @@ -18202,7 +18222,7 @@ int main(int argc) // printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + for(j = 0; j < 5000; ++j) buffer[j] = cast_int32cplx_float32cplx(*rx_data); send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; @@ -18255,7 +18275,7 @@ int main(int argc) // printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + for(j = 0; j < 5000; ++j) buffer[j] = cast_int32cplx_float32cplx(*rx_data); send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; @@ -18302,8 +18322,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -18347,8 +18367,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -18393,8 +18413,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -18438,8 +18458,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -18485,8 +18505,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -18532,8 +18552,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -18578,8 +18598,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -18635,7 +18655,7 @@ int main(int argc) // printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + for(j = 0; j < 5000; ++j) buffer[j] = cast_int32cplx_float32cplx(*rx_data); send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; @@ -18677,8 +18697,8 @@ int main(int argc) //printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; - send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); + for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; usleep(500000); // Sleep 0.5s @@ -18730,7 +18750,7 @@ int main(int argc) // printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + for(j = 0; j < 5000; ++j) buffer[j] = cast_int32cplx_float32cplx(*rx_data); send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; @@ -18744,7 +18764,7 @@ int main(int argc) usleep(1000000); // Sleep 1s for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + for(j = 0; j < 5000; ++j) buffer[j] = cast_int32cplx_float32cplx(*rx_data); send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; @@ -18799,7 +18819,7 @@ int main(int argc) // printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + for(j = 0; j < 5000; ++j) buffer[j] = cast_int32cplx_float32cplx(*rx_data); send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; @@ -18813,7 +18833,7 @@ int main(int argc) // printf("Number of RX samples in FIFO: %d\n",*rx_cntr); for(i = 0; i < 10; ++i) { while(*rx_cntr < 10000) usleep(500); - for(j = 0; j < 5000; ++j) buffer[j] = *rx_data; + for(j = 0; j < 5000; ++j) buffer[j] = cast_int32cplx_float32cplx(*rx_data); send(sock_client, buffer, 5000*8, MSG_NOSIGNAL | (i<9?MSG_MORE:0)); } seq_config[0] = 0x00000000; diff --git a/HDL/.gitignore b/HDL/.gitignore index 83d92837..b5d5df77 100644 --- a/HDL/.gitignore +++ b/HDL/.gitignore @@ -3,4 +3,5 @@ uImage devicetree.dtb *~ tmp/ -vivado* \ No newline at end of file +vivado* +.Xil/ \ No newline at end of file diff --git a/HDL/Makefile b/HDL/Makefile index 90548bbf..d236ef61 100644 --- a/HDL/Makefile +++ b/HDL/Makefile @@ -15,7 +15,7 @@ CORES_PAVEL = axi_axis_reader_v1_0 axi_axis_writer_v1_0 axi_bram_reader_v1_0 \ axis_zeroer_v1_0 axis_variable_v1_0 axis_interpolator_v1_0 \ axi_sts_register_v1_0 -CORES = micro_sequencer_v1_0 axi_dac_spi_sequencer_v1_1 axi_dac_daisy_spi_sequencer_v1_0 axis_segmented_bram_reader_v1_0 axi_serial_attenuator_v1_0 axi_four_ltc2656_spi_v1_0 axi_trigger_core_v1_0 axis_red_pitaya_adc_v3_0 axi_config_registers_v1_0 +CORES = micro_sequencer_v1_0 axi_dac_spi_sequencer_v1_1 axi_dac_daisy_spi_sequencer_v1_0 axis_segmented_bram_reader_v1_0 axi_serial_attenuator_v1_0 axi_four_ltc2656_spi_v1_0 axi_trigger_core_v1_0 axis_red_pitaya_adc_v3_0 axi_config_registers_v1_0 axis_red_pitaya_dac_v1_1 VIVADO = vivado -nolog -nojournal -mode batch HSI = xsct @@ -23,7 +23,7 @@ RM = rm -rf VIVADO_VER = $(shell vivado -version | grep "v20" | sed -r 's/.*v(20[0-9]{2}.[0-9]).*/\1/g') -DTREE_TAG = xlnx_rel_v2022.2 +DTREE_TAG = xlnx_rel_v2024.1 DTREE_DIR = tmp/device-tree-xlnx-$(DTREE_TAG) DTREE_URL = https://github.com/Xilinx/device-tree-xlnx/ @@ -34,8 +34,10 @@ DTREE_URL = https://github.com/Xilinx/device-tree-xlnx/ .PHONY: clean all xpr bit dtbo setup .ONESHELL: -all: setup tmp/%.bin tmp/%.dtbo +all: setup tmp/%.bin +.ONESHELL: +xsa: setup tmp/%.xsa .ONESHELL: xpr: setup tmp/%.xpr diff --git a/HDL/README.md b/HDL/README.md index 833cd580..e4d0595c 100644 --- a/HDL/README.md +++ b/HDL/README.md @@ -2,11 +2,11 @@ This directory contains all the HDL code of the ocra project. The code is organized in projects, which can be found in subdirectories of the projects folders. -In order to build the HDL code you need to have Xilinx Vitis 2022.2 full edition. We highly recommend that you use Linux, because the build system and other tooling relies on Linux. We are working on and recommend [Ubuntu 22.04 LTS](https://ubuntu.com/download/desktop). +In order to build the HDL code you need to have at least Xilinx Vitis 2022.2 full edition. This build has been tested up to Vitis 2024.1. We highly recommend that you use Linux, because the build system and other tooling relies on Linux. We are working on and recommend [Ubuntu 22.04 LTS or Ubuntu 24.04 LTS](https://ubuntu.com/download/desktop). **Basic working knowledge of Linux and bash is more or less required to follow these instructions.** -In order to install Vitis you will need about 110 GB of free disk space, and you will need to register an account with Xilinx website (remember the password, because the installer will also require the same login credentials that you created on the Xilinx website. It is best to download the [Vitis web installer](https://www.xilinx.com/member/forms/download/xef.html?filename=Xilinx_Unified_2022.2_1014_8888_Lin64.bin). +In order to install Vitis you will need about 110 GB of free disk space, and you will need to register an account with Xilinx website (remember the password, because the installer will also require the same login credentials that you created on the Xilinx website. It is best to download the [Vitis web installer](https://account.amd.com/en/forms/downloads/xef.html?filename=FPGAs_AdaptiveSoCs_Unified_2024.1_0522_2023_Lin64.bin). Vivado (the main tool in the Vitis package) is a bit of a beast and requires a reasonably powerful workstation. @@ -15,15 +15,18 @@ All building of the HDL is done by a [GNU Makefile](https://www.gnu.org/software This makes it straightforward to build multiple projects etc. from the command line without having to wrestle the Vivado GUI. This entire setup is based on the [red-pitaya-notes](https://github.com/pavel-demin/red-pitaya-notes) by Pavel Demin, and some of his architecture and cores can also be found in this repository. This repository makes use of Vivado board files, which requires additional configuration of your Vivado/Vitis setup. In order to make everything work the following configuration steps need to be taken: -1. Add `source /tools/Xilinx/Vitis/2022.2/settings64.sh` to your `.bash_profile` +1. Add `source /tools/Xilinx/Vitis/2024.1/settings64.sh` to your `.bash_profile` 1. Define the environment variable OCRA_DIR in your `.bash_profile` to point to the ocra directory -2. Include the following in your local Vivado config (i.e. $HOME/.Xilinx/Vivado/2022.2/Vivado_init.tcl): +2. Include the following in your local Vivado config (i.e. $HOME/.Xilinx/Vivado/2024.1/Vivado_init.tcl): ``` # set up the OCRA project set ocra_dir $::env(OCRA_DIR) source $ocra_dir/HDL/scripts/Vivado_ocra_init.tcl ``` +You may need to adjust the path of your Vitis installation as appropriate for this to be correct on your installation. + + To get a quick start, assuming you have Vitis/Vivado configured in your path, you should be able to build the base_pl project for the snickerdoodle_black ``` cd $OCRA_DIR/HDL @@ -34,5 +37,17 @@ Similarily, you can build the ocra_mri project for the stemlab_125_14 by calling ``` make NAME=ocra_mri BOARD=stemlab_125_14 ``` +This will build bitfiles that can be used with on a Linux installation on your Zynq so long it supports the fpga_manager. + +Sometimes you might want to only quickly generate the project file for Vivado, which you make by calling: +``` +make xpr NAME=ocra_mri BOARD=stemlab_125_14 +``` + +If you want to build a device tree and the associated files to create your own bootloader etc. you need to run: +``` +make dtbo NAME=ocra_mri BOARD=stemlab_125_14 +``` +Note that this requires the HSI tool xsct and the device tree compiler dtc. This is pretty easy, isn't it? \ No newline at end of file diff --git a/HDL/projects/base_pl/block_design.tcl b/HDL/blockdesign-projects/base_pl/block_design.tcl similarity index 100% rename from HDL/projects/base_pl/block_design.tcl rename to HDL/blockdesign-projects/base_pl/block_design.tcl diff --git a/HDL/projects/ocra_mri/README.md b/HDL/blockdesign-projects/ocra_mri/README.md similarity index 100% rename from HDL/projects/ocra_mri/README.md rename to HDL/blockdesign-projects/ocra_mri/README.md diff --git a/HDL/projects/ocra_mri/block_design.tcl b/HDL/blockdesign-projects/ocra_mri/block_design.tcl similarity index 89% rename from HDL/projects/ocra_mri/block_design.tcl rename to HDL/blockdesign-projects/ocra_mri/block_design.tcl index 75800427..aa406d18 100644 --- a/HDL/projects/ocra_mri/block_design.tcl +++ b/HDL/blockdesign-projects/ocra_mri/block_design.tcl @@ -3,6 +3,15 @@ global project_name set ps_preset boards/${board_name}/ps_${project_name}.xml +# define some variables needed for later +variable dsp_clk_freq + +if {$board_name == "stemlab_122_16"} { + set dsp_clk_freq 122.88 +} else { + set dsp_clk_freq 125.0 +} + # Create processing_system7 cell xilinx.com:ip:processing_system7:5.5 ps_0 { PCW_IMPORT_BOARD_PRESET $ps_preset @@ -20,11 +29,14 @@ apply_bd_automation -rule xilinx.com:bd_rule:processing_system7 -config { # Create proc_sys_reset cell xilinx.com:ip:proc_sys_reset:5.0 rst_0 +puts "OCRA: DSP_CLK_FREQ:" +puts $dsp_clk_freq + # Create clk_wiz cell xilinx.com:ip:clk_wiz:6.0 pll_0 { PRIMITIVE PLL PRIM_IN_FREQ.VALUE_SRC USER - PRIM_IN_FREQ 125.0 + PRIM_IN_FREQ $dsp_clk_freq PRIM_SOURCE Differential_clock_capable_pin CLKOUT1_USED true CLKOUT1_REQUESTED_OUT_FREQ 125.0 @@ -36,33 +48,12 @@ cell xilinx.com:ip:clk_wiz:6.0 pll_0 { clk_in1_p adc_clk_p_i clk_in1_n adc_clk_n_i } + cell open-mri:user:axi_config_registers:1.0 cfg8 { AXI_ADDR_WIDTH 5 AXI_DATA_WIDTH 32 } -# Create slice with the TX configuration, which uses the bottom 32 bits -cell xilinx.com:ip:xlslice:1.0 txinterpolator_slice_0 { - DIN_WIDTH 32 DIN_FROM 31 DIN_TO 0 DOUT_WIDTH 32 -} { - Din cfg8/config_0 -} - -# Create slice with the RX configuration and NCO configuration -# RX seems to use the bottom 16 bit of the upper 32 bit -# NCO uses the bottom 32 bit -cell xilinx.com:ip:xlslice:1.0 nco_slice_0 { - DIN_WIDTH 32 DIN_FROM 31 DIN_TO 0 DOUT_WIDTH 32 -} { - Din cfg8/config_1 -} - -cell xilinx.com:ip:xlslice:1.0 rx_slice_0 { - DIN_WIDTH 32 DIN_FROM 31 DIN_TO 0 DOUT_WIDTH 32 -} { - Din cfg8/config_2 -} - # ADC switch slice cell xilinx.com:ip:xlslice:1.0 cfg_adc_switch { DIN_WIDTH 32 DIN_FROM 1 DIN_TO 0 DOUT_WIDTH 2 @@ -81,12 +72,6 @@ cell xilinx.com:ip:xpm_cdc_gen:1.0 xpm_cdc_gen_0 { set_property CONFIG.CDC_TYPE {xpm_cdc_array_single} [get_bd_cells xpm_cdc_gen_0] set_property CONFIG.WIDTH {2} [get_bd_cells xpm_cdc_gen_0] -# Create another slice with data for the TX, which is another 32 bit -cell xilinx.com:ip:xlslice:1.0 cfg_slice_1 { - DIN_WIDTH 32 DIN_FROM 31 DIN_TO 0 DOUT_WIDTH 32 -} { - Din cfg8/config_3 -} # ADC # Create axis_red_pitaya_adc @@ -99,7 +84,7 @@ cell open-mri:user:axis_red_pitaya_adc:3.0 adc_0 {} { } # Create axis_red_pitaya_dac -cell pavel-demin:user:axis_red_pitaya_dac:1.0 dac_0 {} { +cell open-mri:user:axis_red_pitaya_dac:1.1 dac_0 {} { aclk pll_0/clk_out1 ddr_clk pll_0/clk_out2 locked pll_0/locked @@ -110,36 +95,35 @@ cell pavel-demin:user:axis_red_pitaya_dac:1.0 dac_0 {} { dac_dat dac_dat_o } - # Create xlconstant cell xilinx.com:ip:xlconstant:1.1 const_0 # Removed this connection from rx: # slice_0/Din rst_slice_0/Dout module rx_0 { - source projects/ocra_mri/rx2.tcl + source blockdesign-projects/ocra_mri/rx2.tcl } { - rate_slice/Din rx_slice_0/Dout + rate_slice/Din cfg8/config_2 fifo_0/S_AXIS adc_0/M_AXIS fifo_0/s_axis_aclk pll_0/clk_out1 fifo_0/s_axis_aresetn const_0/dout } -# axis_interpolator_0/cfg_data txinterpolator_slice_0/Dout +# axis_interpolator_0/cfg_data cfg8/config_0 module tx_0 { - source projects/ocra_mri/tx6.tcl + source blockdesign-projects/ocra_mri/tx6.tcl } { - slice_1/Din cfg_slice_1/Dout - axis_interpolator_0/cfg_data txinterpolator_slice_0/Dout + slice_1/Din cfg8/config_3 + axis_interpolator_0/cfg_data cfg8/config_0 fifo_1/M_AXIS dac_0/S_AXIS fifo_1/m_axis_aclk pll_0/clk_out1 fifo_1/m_axis_aresetn const_0/dout } module nco_0 { - source projects/ocra_mri/nco.tcl + source blockdesign-projects/ocra_mri/nco.tcl } { - slice_1/Din nco_slice_0/Dout + slice_1/Din cfg8/config_1 bcast_nco/M00_AXIS rx_0/mult_0/S_AXIS_B bcast_nco/M01_AXIS tx_0/mult_0/S_AXIS_B } @@ -362,7 +346,7 @@ set_property RANGE 8K [get_bd_addr_segs ps_0/Data/SEG_gradient_writerz2_reg0] set_property OFFSET 0x40008000 [get_bd_addr_segs ps_0/Data/SEG_gradient_writerz2_reg0] module gradient_dac_0 { - source projects/ocra_mri/gradient_dacs.tcl + source blockdesign-projects/ocra_mri/gradient_dacs.tcl } { spi_sequencer_0/BRAM_PORTX gradient_memoryx/BRAM_PORTB spi_sequencer_0/BRAM_PORTY gradient_memoryy/BRAM_PORTB @@ -415,16 +399,6 @@ set_property -dict [list CONFIG.Register_PortB_Output_of_Memory_Primitives {true # # try to connect the bottom 8 bits of the pulse output of the sequencer to the positive gpoi # -# Delete input/output port -delete_bd_objs [get_bd_ports exp_p_tri_io] -delete_bd_objs [get_bd_ports exp_n_tri_io] - -# Create newoutput port -create_bd_port -dir O -from 7 -to 0 exp_p_tri_io -#connect_bd_net [get_bd_pins exp_p_tri_io] [get_bd_pins trigger_slice_0/Dout] - -# Create output port for the SPI stuff -create_bd_port -dir O -from 7 -to 0 exp_n_tri_io # 09/2019: For the new board we are doing this differently. The SPI bus will use seven pins on the n side of the header # and the txgate will use the eight' pin on the n side diff --git a/HDL/projects/ocra_mri/client/COPYING b/HDL/blockdesign-projects/ocra_mri/client/COPYING similarity index 100% rename from HDL/projects/ocra_mri/client/COPYING rename to HDL/blockdesign-projects/ocra_mri/client/COPYING diff --git a/HDL/projects/ocra_mri/client/pulsed_nmr.py b/HDL/blockdesign-projects/ocra_mri/client/pulsed_nmr.py similarity index 100% rename from HDL/projects/ocra_mri/client/pulsed_nmr.py rename to HDL/blockdesign-projects/ocra_mri/client/pulsed_nmr.py diff --git a/HDL/projects/ocra_mri/client/pulsed_nmr.ui b/HDL/blockdesign-projects/ocra_mri/client/pulsed_nmr.ui similarity index 100% rename from HDL/projects/ocra_mri/client/pulsed_nmr.ui rename to HDL/blockdesign-projects/ocra_mri/client/pulsed_nmr.ui diff --git a/HDL/projects/ocra_mri/filters/fir_0.r b/HDL/blockdesign-projects/ocra_mri/filters/fir_0.r similarity index 100% rename from HDL/projects/ocra_mri/filters/fir_0.r rename to HDL/blockdesign-projects/ocra_mri/filters/fir_0.r diff --git a/HDL/projects/ocra_mri/gradient_dacs.tcl b/HDL/blockdesign-projects/ocra_mri/gradient_dacs.tcl similarity index 100% rename from HDL/projects/ocra_mri/gradient_dacs.tcl rename to HDL/blockdesign-projects/ocra_mri/gradient_dacs.tcl diff --git a/HDL/projects/ocra_mri/gradient_dacs_daisy.tcl b/HDL/blockdesign-projects/ocra_mri/gradient_dacs_daisy.tcl similarity index 100% rename from HDL/projects/ocra_mri/gradient_dacs_daisy.tcl rename to HDL/blockdesign-projects/ocra_mri/gradient_dacs_daisy.tcl diff --git a/HDL/projects/ocra_mri/nco.tcl b/HDL/blockdesign-projects/ocra_mri/nco.tcl similarity index 95% rename from HDL/projects/ocra_mri/nco.tcl rename to HDL/blockdesign-projects/ocra_mri/nco.tcl index 945d012e..9c3315fe 100644 --- a/HDL/projects/ocra_mri/nco.tcl +++ b/HDL/blockdesign-projects/ocra_mri/nco.tcl @@ -3,6 +3,8 @@ # 2017 by Thomas Witzel # block design for the NCO +global dsp_clk_freq + # Create xlslice cell xilinx.com:ip:xlslice:1.0 slice_1 { DIN_WIDTH 32 DIN_FROM 31 DIN_TO 0 DOUT_WIDTH 32 @@ -18,7 +20,7 @@ cell pavel-demin:user:axis_constant:1.0 phase_nco { # Create dds_compiler cell xilinx.com:ip:dds_compiler:6.0 dds_nco { - DDS_CLOCK_RATE 125 + DDS_CLOCK_RATE $dsp_clk_freq SPURIOUS_FREE_DYNAMIC_RANGE 138 FREQUENCY_RESOLUTION 0.2 PHASE_INCREMENT Streaming diff --git a/HDL/projects/ocra_mri/rx2.tcl b/HDL/blockdesign-projects/ocra_mri/rx2.tcl similarity index 91% rename from HDL/projects/ocra_mri/rx2.tcl rename to HDL/blockdesign-projects/ocra_mri/rx2.tcl index 67192183..f9b5faa0 100644 --- a/HDL/projects/ocra_mri/rx2.tcl +++ b/HDL/blockdesign-projects/ocra_mri/rx2.tcl @@ -1,3 +1,5 @@ +global dsp_clk_freq + # Create xlslice # Trigger slice on Bit 1 (RX pulse) cell xilinx.com:ip:xlslice:1.0 slice_0 { @@ -27,7 +29,7 @@ cell pavel-demin:user:axis_lfsr:1.0 lfsr_0 {} { aresetn /rst_0/peripheral_aresetn } -# Create cmpy +# The top 24 bits is the most we need, 16 would probably be fine as well cell xilinx.com:ip:cmpy:6.0 mult_0 { FLOWCONTROL Blocking APORTWIDTH.VALUE_SRC USER @@ -35,7 +37,7 @@ cell xilinx.com:ip:cmpy:6.0 mult_0 { APORTWIDTH 16 BPORTWIDTH 24 ROUNDMODE Random_Rounding - OUTPUTWIDTH 26 + OUTPUTWIDTH 24 } { S_AXIS_A fifo_0/M_AXIS S_AXIS_CTRL lfsr_0/M_AXIS @@ -46,10 +48,10 @@ cell xilinx.com:ip:cmpy:6.0 mult_0 { cell xilinx.com:ip:axis_broadcaster:1.1 bcast_0 { S_TDATA_NUM_BYTES.VALUE_SRC USER M_TDATA_NUM_BYTES.VALUE_SRC USER - S_TDATA_NUM_BYTES 8 + S_TDATA_NUM_BYTES 6 M_TDATA_NUM_BYTES 3 M00_TDATA_REMAP {tdata[23:0]} - M01_TDATA_REMAP {tdata[55:32]} + M01_TDATA_REMAP {tdata[47:24]} } { S_AXIS mult_0/M_AXIS_DOUT aclk /ps_0/FCLK_CLK0 @@ -83,7 +85,7 @@ cell xilinx.com:ip:cic_compiler:4.0 cic_0 { MINIMUM_RATE 25 MAXIMUM_RATE 8192 FIXED_OR_INITIAL_RATE 625 - INPUT_SAMPLE_FREQUENCY 125 + INPUT_SAMPLE_FREQUENCY $dsp_clk_freq CLOCK_FREQUENCY 125 INPUT_DATA_WIDTH 24 QUANTIZATION Truncation @@ -107,7 +109,7 @@ cell xilinx.com:ip:cic_compiler:4.0 cic_1 { MINIMUM_RATE 25 MAXIMUM_RATE 8192 FIXED_OR_INITIAL_RATE 625 - INPUT_SAMPLE_FREQUENCY 125 + INPUT_SAMPLE_FREQUENCY $dsp_clk_freq CLOCK_FREQUENCY 125 INPUT_DATA_WIDTH 24 QUANTIZATION Truncation @@ -159,7 +161,7 @@ cell xilinx.com:ip:fir_compiler:7.2 fir_0 { SAMPLE_FREQUENCY 5.0 CLOCK_FREQUENCY 125 OUTPUT_ROUNDING_MODE Convergent_Rounding_to_Even - OUTPUT_WIDTH 26 + OUTPUT_WIDTH 32 M_DATA_HAS_TREADY true HAS_ARESETN true } { @@ -168,43 +170,13 @@ cell xilinx.com:ip:fir_compiler:7.2 fir_0 { aresetn /rst_0/peripheral_aresetn } -# Create axis_subset_converter -cell xilinx.com:ip:axis_subset_converter:1.1 subset_0 { - S_TDATA_NUM_BYTES.VALUE_SRC USER - M_TDATA_NUM_BYTES.VALUE_SRC USER - S_TDATA_NUM_BYTES 4 - M_TDATA_NUM_BYTES 3 - TDATA_REMAP {tdata[23:0]} -} { - S_AXIS fir_0/M_AXIS_DATA - aclk /ps_0/FCLK_CLK0 - aresetn /rst_0/peripheral_aresetn -} - -# Create floating_point -cell xilinx.com:ip:floating_point:7.1 fp_0 { - OPERATION_TYPE Fixed_to_float - A_PRECISION_TYPE.VALUE_SRC USER - C_A_EXPONENT_WIDTH.VALUE_SRC USER - C_A_FRACTION_WIDTH.VALUE_SRC USER - A_PRECISION_TYPE Custom - C_A_EXPONENT_WIDTH 2 - C_A_FRACTION_WIDTH 22 - RESULT_PRECISION_TYPE Single - HAS_ARESETN true -} { - S_AXIS_A subset_0/M_AXIS - aclk /ps_0/FCLK_CLK0 - aresetn /rst_0/peripheral_aresetn -} - -# Create axis_dwidth_converter +# Convert the 64 bit wide complex word into sequential 32 bit words of real and imag cell xilinx.com:ip:axis_dwidth_converter:1.1 conv_1 { S_TDATA_NUM_BYTES.VALUE_SRC USER S_TDATA_NUM_BYTES 4 M_TDATA_NUM_BYTES 8 } { - S_AXIS fp_0/M_AXIS_RESULT + S_AXIS fir_0/M_AXIS_DATA aclk /ps_0/FCLK_CLK0 aresetn /rst_0/peripheral_aresetn } diff --git a/HDL/projects/ocra_mri/server-c++/pulsed_nmr_server.cpp b/HDL/blockdesign-projects/ocra_mri/server-c++/pulsed_nmr_server.cpp similarity index 100% rename from HDL/projects/ocra_mri/server-c++/pulsed_nmr_server.cpp rename to HDL/blockdesign-projects/ocra_mri/server-c++/pulsed_nmr_server.cpp diff --git a/HDL/projects/ocra_mri/server/pulsed_nmr_old_backend.c b/HDL/blockdesign-projects/ocra_mri/server/pulsed_nmr_old_backend.c similarity index 100% rename from HDL/projects/ocra_mri/server/pulsed_nmr_old_backend.c rename to HDL/blockdesign-projects/ocra_mri/server/pulsed_nmr_old_backend.c diff --git a/HDL/projects/ocra_mri/tx6.tcl b/HDL/blockdesign-projects/ocra_mri/tx6.tcl similarity index 58% rename from HDL/projects/ocra_mri/tx6.tcl rename to HDL/blockdesign-projects/ocra_mri/tx6.tcl index 787d8ce3..b5a3b028 100644 --- a/HDL/projects/ocra_mri/tx6.tcl +++ b/HDL/blockdesign-projects/ocra_mri/tx6.tcl @@ -76,13 +76,15 @@ cell pavel-demin:user:axis_interpolator:1.0 axis_interpolator_0 { # ROUNDMODE Random_Rounding # No control connection needed # S_AXIS_CTRL lfsr_0/M_AXIS + +# take the top 16 bit of the product. This means TX pulses should be scaled full range of a signed short in the data to the FPGA cell xilinx.com:ip:cmpy:6.0 mult_0 { FLOWCONTROL Blocking APORTWIDTH.VALUE_SRC USER BPORTWIDTH.VALUE_SRC USER APORTWIDTH 16 BPORTWIDTH 24 - OUTPUTWIDTH 41 + OUTPUTWIDTH 16 } { S_AXIS_A axis_interpolator_0/M_AXIS aclk /ps_0/FCLK_CLK0 @@ -91,43 +93,17 @@ cell xilinx.com:ip:cmpy:6.0 mult_0 { # extract the real component of the product using a broadcaster in to I and Q # a simpler alternative would be to use a axis_subset_converter cell xilinx.com:ip:axis_subset_converter:1.1 real_0 { - S_TDATA_NUM_BYTES.VALUE_SRC USER - M_TDATA_NUM_BYTES.VALUE_SRC USER - S_TDATA_NUM_BYTES 10 - M_TDATA_NUM_BYTES 2 - TDATA_REMAP {tdata[40:25]} -} { - S_AXIS mult_0/M_AXIS_DOUT - aclk /ps_0/FCLK_CLK0 - aresetn /rst_0/peripheral_aresetn -} - -# extract the real component of the product using a broadcaster in to I and Q -# a simpler alternative would be to use a axis_subset_converter -cell xilinx.com:ip:axis_subset_converter:1.1 quotient_0 { S_TDATA_NUM_BYTES.VALUE_SRC USER M_TDATA_NUM_BYTES.VALUE_SRC USER S_TDATA_NUM_BYTES 4 M_TDATA_NUM_BYTES 2 - TDATA_REMAP {tdata[31:16]} + TDATA_REMAP {tdata[15:0]} } { + S_AXIS mult_0/M_AXIS_DOUT aclk /ps_0/FCLK_CLK0 aresetn /rst_0/peripheral_aresetn } -#cell xilinx.com:ip:axis_broadcaster:1.1 bcast_0 { -# S_TDATA_NUM_BYTES.VALUE_SRC USER -# M_TDATA_NUM_BYTES.VALUE_SRC USER -# S_TDATA_NUM_BYTES 8 -# M_TDATA_NUM_BYTES 3 -# M00_TDATA_REMAP {tdata[23:0]} -# M01_TDATA_REMAP {tdata[55:32]} -#} { -# S_AXIS mult_0/M_AXIS_DOUT -# aclk /ps_0/FCLK_CLK0 -# aresetn /rst_0/peripheral_aresetn -#} - # Create axis_clock_converter cell xilinx.com:ip:axis_clock_converter:1.1 fifo_1 { TDATA_NUM_BYTES.VALUE_SRC USER @@ -138,18 +114,3 @@ cell xilinx.com:ip:axis_clock_converter:1.1 fifo_1 { s_axis_aresetn /rst_0/peripheral_aresetn } -## DO all this below to insert the divider by 4 -create_bd_cell -type ip -vlnv xilinx.com:ip:div_gen:5.1 div_gen_0 -create_bd_cell -type ip -vlnv pavel-demin:user:axis_constant:1.0 axis_constant_0 -set_property -dict [list CONFIG.AXIS_TDATA_WIDTH {16}] [get_bd_cells axis_constant_0] -connect_bd_intf_net [get_bd_intf_pins axis_constant_0/M_AXIS] [get_bd_intf_pins div_gen_0/S_AXIS_DIVISOR] -create_bd_cell -type ip -vlnv xilinx.com:ip:xlconstant:1.1 xlconstant_0 -# Constant was 4, now its 1 -set_property -dict [list CONFIG.CONST_WIDTH {16} CONFIG.CONST_VAL {1}] [get_bd_cells xlconstant_0] -connect_bd_net [get_bd_pins xlconstant_0/dout] [get_bd_pins axis_constant_0/cfg_data] -connect_bd_net [get_bd_pins aclk] [get_bd_pins axis_constant_0/aclk] -connect_bd_net [get_bd_pins aclk] [get_bd_pins div_gen_0/aclk] -delete_bd_objs [get_bd_intf_nets real_0_M_AXIS] -connect_bd_intf_net [get_bd_intf_pins real_0/M_AXIS] [get_bd_intf_pins div_gen_0/S_AXIS_DIVIDEND] -connect_bd_intf_net [get_bd_intf_pins div_gen_0/M_AXIS_DOUT] [get_bd_intf_pins quotient_0/S_AXIS] -connect_bd_intf_net [get_bd_intf_pins quotient_0/M_AXIS] [get_bd_intf_pins fifo_1/S_AXIS] diff --git a/HDL/projects/shim_controller/block_design.tcl b/HDL/blockdesign-projects/shim_controller/block_design.tcl similarity index 100% rename from HDL/projects/shim_controller/block_design.tcl rename to HDL/blockdesign-projects/shim_controller/block_design.tcl diff --git a/HDL/projects/shim_controller/shim_dacs.tcl b/HDL/blockdesign-projects/shim_controller/shim_dacs.tcl similarity index 100% rename from HDL/projects/shim_controller/shim_dacs.tcl rename to HDL/blockdesign-projects/shim_controller/shim_dacs.tcl diff --git a/HDL/boards/eclypse_z7/brd/A.0/board.xml b/HDL/boards/eclypse_z7/brd/A.0/board.xml new file mode 100644 index 00000000..f5148031 --- /dev/null +++ b/HDL/boards/eclypse_z7/brd/A.0/board.xml @@ -0,0 +1,376 @@ + + + + + A.0 + +1.0 +Eclypse Z7 + + + + + + + + + + + + + + + + + + + Buttons + + + + + + + + + + + + + + 8 LEDs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3.3V Single-Ended 125 MHz clock from Ethernet PHY + + + Buttons 1 to 0 + + + RGB leds 5 to 0 (3 per LED, Ordered "RGBRGB") + + + Pmod Connector JA + + + Pmod Connector JB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/HDL/boards/eclypse_z7/brd/A.0/part0_pins.xml b/HDL/boards/eclypse_z7/brd/A.0/part0_pins.xml new file mode 100644 index 00000000..b2155f3e --- /dev/null +++ b/HDL/boards/eclypse_z7/brd/A.0/part0_pins.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HDL/boards/eclypse_z7/brd/A.0/preset.xml b/HDL/boards/eclypse_z7/brd/A.0/preset.xml new file mode 100644 index 00000000..352e4591 --- /dev/null +++ b/HDL/boards/eclypse_z7/brd/A.0/preset.xml @@ -0,0 +1,608 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/HDL/boards/eclypse_z7/brd/B.0/board.xml b/HDL/boards/eclypse_z7/brd/B.0/board.xml new file mode 100644 index 00000000..20768cd0 --- /dev/null +++ b/HDL/boards/eclypse_z7/brd/B.0/board.xml @@ -0,0 +1,376 @@ + + + + + B.0 + +1.1 +Eclypse Z7 + + + + + + + + + + + + + + + + + + + Buttons + + + + + + + + + + + + + + 8 LEDs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 3.3V Single-Ended 125 MHz clock from Ethernet PHY + + + Buttons 1 to 0 + + + RGB leds 5 to 0 (3 per LED, Ordered "RGBRGB") + + + Pmod Connector JA + + + Pmod Connector JB + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/HDL/boards/eclypse_z7/brd/B.0/part0_pins.xml b/HDL/boards/eclypse_z7/brd/B.0/part0_pins.xml new file mode 100644 index 00000000..71a442f5 --- /dev/null +++ b/HDL/boards/eclypse_z7/brd/B.0/part0_pins.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HDL/boards/eclypse_z7/brd/B.0/preset.xml b/HDL/boards/eclypse_z7/brd/B.0/preset.xml new file mode 100644 index 00000000..c32c99d5 --- /dev/null +++ b/HDL/boards/eclypse_z7/brd/B.0/preset.xml @@ -0,0 +1,608 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/HDL/boards/snickerdoodle_black/brd/1.0/board.xml b/HDL/boards/snickerdoodle_black/brd/1.0/board.xml index 6d54eaa5..cce08a60 100755 --- a/HDL/boards/snickerdoodle_black/brd/1.0/board.xml +++ b/HDL/boards/snickerdoodle_black/brd/1.0/board.xml @@ -25,6 +25,4 @@ - - diff --git a/HDL/boards/stemlab_122_16/brd/1.0/board.xml b/HDL/boards/stemlab_122_16/brd/1.0/board.xml index 7a46bdb3..bfb54d83 100644 --- a/HDL/boards/stemlab_122_16/brd/1.0/board.xml +++ b/HDL/boards/stemlab_122_16/brd/1.0/board.xml @@ -26,6 +26,4 @@ - - diff --git a/HDL/boards/stemlab_122_16/brd/1.0/part0_pins.xml b/HDL/boards/stemlab_122_16/brd/1.0/part0_pins.xml index 3b45ff68..5f20aba7 100644 --- a/HDL/boards/stemlab_122_16/brd/1.0/part0_pins.xml +++ b/HDL/boards/stemlab_122_16/brd/1.0/part0_pins.xml @@ -2,81 +2,81 @@ - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + - - + + diff --git a/HDL/boards/stemlab_125_14/brd/1.1/board.xml b/HDL/boards/stemlab_125_14/brd/1.1/board.xml index a8d751d9..927a8f07 100644 --- a/HDL/boards/stemlab_125_14/brd/1.1/board.xml +++ b/HDL/boards/stemlab_125_14/brd/1.1/board.xml @@ -26,6 +26,4 @@ - - diff --git a/HDL/boards/stemlab_125_14/brd/1.1/part0_pins.xml b/HDL/boards/stemlab_125_14/brd/1.1/part0_pins.xml index 0d6e4168..785721bd 100644 --- a/HDL/boards/stemlab_125_14/brd/1.1/part0_pins.xml +++ b/HDL/boards/stemlab_125_14/brd/1.1/part0_pins.xml @@ -2,81 +2,81 @@ - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - - + + - - + + diff --git a/HDL/boards/stemlab_125_14/ocra_config.json b/HDL/boards/stemlab_125_14/ocra_config.json index e491552d..6afb074b 100644 --- a/HDL/boards/stemlab_125_14/ocra_config.json +++ b/HDL/boards/stemlab_125_14/ocra_config.json @@ -3,6 +3,6 @@ "part": "xc7z010clg400-1", "proc": "ps7_cortexa9_0", "board_part": "redpitaya.com:stemlab_125_14:part0:1.0", - "projects": ["ocra_mri", "shim_controller", "base_pl"] + "projects": ["ocra_mri", "shim_controller", "base_pl","base_pl_new"] } } diff --git a/HDL/boards/stemlab_125_14/ports.tcl b/HDL/boards/stemlab_125_14/ports.tcl index 5823941c..fbee07e5 100644 --- a/HDL/boards/stemlab_125_14/ports.tcl +++ b/HDL/boards/stemlab_125_14/ports.tcl @@ -26,17 +26,16 @@ create_bd_port -dir O dac_wrt_o create_bd_port -dir O -from 3 -to 0 dac_pwm_o ### XADC - -create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vp_Vn -create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vaux0 -create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vaux1 -create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vaux9 -create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vaux8 +# create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vp_Vn +# create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vaux0 +# create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vaux1 +# create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vaux9 +# create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vaux8 ### Expansion connector -create_bd_port -dir IO -from 7 -to 0 exp_p_tri_io -create_bd_port -dir IO -from 7 -to 0 exp_n_tri_io +create_bd_port -dir O -from 7 -to 0 exp_p_tri_io +create_bd_port -dir O -from 7 -to 0 exp_n_tri_io ### LED diff --git a/HDL/boards/stemlab_125_14/ps_base_pl_new.xml b/HDL/boards/stemlab_125_14/ps_base_pl_new.xml new file mode 100644 index 00000000..33a9fc8d --- /dev/null +++ b/HDL/boards/stemlab_125_14/ps_base_pl_new.xml @@ -0,0 +1,164 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HDL/boards/stemlab_125_14_4in/brd/1.0/board.xml b/HDL/boards/stemlab_125_14_4in/brd/1.0/board.xml new file mode 100644 index 00000000..1b869b60 --- /dev/null +++ b/HDL/boards/stemlab_125_14_4in/brd/1.0/board.xml @@ -0,0 +1,29 @@ + + + + + STEMLab-125.14 4-input Board File + + + 1.0 + Red Pitaya STEMLab-125.14 4-input + + 1.0 + + + + FPGA part on the board + + + + + + + + + + + + + + diff --git a/HDL/boards/stemlab_125_14_4in/brd/1.0/part0_pins.xml b/HDL/boards/stemlab_125_14_4in/brd/1.0/part0_pins.xml new file mode 100644 index 00000000..5f20aba7 --- /dev/null +++ b/HDL/boards/stemlab_125_14_4in/brd/1.0/part0_pins.xml @@ -0,0 +1,84 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HDL/boards/stemlab_125_14_4in/brd/1.0/preset.xml b/HDL/boards/stemlab_125_14_4in/brd/1.0/preset.xml new file mode 100644 index 00000000..07481caf --- /dev/null +++ b/HDL/boards/stemlab_125_14_4in/brd/1.0/preset.xml @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HDL/boards/stemlab_125_14_4in/brd/1.0/redpitaya.jpg b/HDL/boards/stemlab_125_14_4in/brd/1.0/redpitaya.jpg new file mode 100644 index 00000000..e5676cbf Binary files /dev/null and b/HDL/boards/stemlab_125_14_4in/brd/1.0/redpitaya.jpg differ diff --git a/HDL/boards/stemlab_125_14_4in/clocks.xdc b/HDL/boards/stemlab_125_14_4in/clocks.xdc new file mode 100644 index 00000000..d2cfe3fa --- /dev/null +++ b/HDL/boards/stemlab_125_14_4in/clocks.xdc @@ -0,0 +1,2 @@ +set_input_delay -max 1.000 -clock adc_clk_p_i [get_ports adc_dat_a_i[*]] +set_input_delay -max 1.000 -clock adc_clk_p_i [get_ports adc_dat_b_i[*]] diff --git a/HDL/boards/stemlab_125_14_4in/ocra_config.json b/HDL/boards/stemlab_125_14_4in/ocra_config.json new file mode 100644 index 00000000..c3b762ae --- /dev/null +++ b/HDL/boards/stemlab_125_14_4in/ocra_config.json @@ -0,0 +1,8 @@ +{ + "HDL": { + "part": "xc7z020clg400-1", + "proc": "ps7_cortexa9_0", + "board_part": "redpitaya.com:stemlab_125_14_4in:part0:1.0", + "projects": ["ocra_mri", "base_pl"] + } +} diff --git a/HDL/boards/stemlab_125_14_4in/ports.tcl b/HDL/boards/stemlab_125_14_4in/ports.tcl new file mode 100644 index 00000000..9a7319b7 --- /dev/null +++ b/HDL/boards/stemlab_125_14_4in/ports.tcl @@ -0,0 +1,43 @@ + +### ADC + +create_bd_port -dir I -from 15 -to 0 adc_dat_a_i +create_bd_port -dir I -from 15 -to 0 adc_dat_b_i + +create_bd_port -dir I adc_clk_p_i +create_bd_port -dir I adc_clk_n_i + +create_bd_port -dir O adc_enc_p_o +create_bd_port -dir O adc_enc_n_o + +create_bd_port -dir O adc_csn_o + +### DAC + +create_bd_port -dir O -from 13 -to 0 dac_dat_o + +create_bd_port -dir O dac_clk_o +create_bd_port -dir O dac_rst_o +create_bd_port -dir O dac_sel_o +create_bd_port -dir O dac_wrt_o + +### PWM + +create_bd_port -dir O -from 3 -to 0 dac_pwm_o + +### XADC + +create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vp_Vn +create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vaux0 +create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vaux1 +create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vaux9 +create_bd_intf_port -mode Slave -vlnv xilinx.com:interface:diff_analog_io_rtl:1.0 Vaux8 + +### Expansion connector + +create_bd_port -dir IO -from 7 -to 0 exp_p_tri_io +create_bd_port -dir IO -from 7 -to 0 exp_n_tri_io + +### LED + +create_bd_port -dir O -from 7 -to 0 led_o diff --git a/HDL/boards/stemlab_125_14_4in/ports.xdc b/HDL/boards/stemlab_125_14_4in/ports.xdc new file mode 100644 index 00000000..8bdea47d --- /dev/null +++ b/HDL/boards/stemlab_125_14_4in/ports.xdc @@ -0,0 +1,225 @@ + +# set_property CFGBVS VCCO [current_design] +# set_property CONFIG_VOLTAGE 3.3 [current_design] + +### ADC + +# data + +set_property IOSTANDARD LVCMOS18 [get_ports {adc_dat_a_i[*]}] +set_property IOB TRUE [get_ports {adc_dat_a_i[*]}] + +set_property PACKAGE_PIN V17 [get_ports {adc_dat_a_i[0]}] +set_property PACKAGE_PIN_U17 [get_ports {adc_dat_a_i[1]}] +set_property PACKAGE_PIN Y17 [get_ports {adc_dat_a_i[2]}] +set_property PACKAGE_PIN W16 [get_ports {adc_dat_a_i[3]}] +set_property PACKAGE_PIN Y16 [get_ports {adc_dat_a_i[4]}] +set_property PACKAGE_PIN W15 [get_ports {adc_dat_a_i[5]}] +set_property PACKAGE_PIN W14 [get_ports {adc_dat_a_i[6]}] +set_property PACKAGE_PIN Y14 [get_ports {adc_dat_a_i[7]}] +set_property PACKAGE_PIN W13 [get_ports {adc_dat_a_i[8]}] +set_property PACKAGE_PIN V12 [get_ports {adc_dat_a_i[9]}] +set_property PACKAGE_PIN V13 [get_ports {adc_dat_a_i[10]}] +set_property PACKAGE_PIN T14 [get_ports {adc_dat_a_i[11]}] +set_property PACKAGE_PIN T15 [get_ports {adc_dat_a_i[12]}] +set_property PACKAGE_PIN V15 [get_ports {adc_dat_a_i[13]}] +set_property PACKAGE_PIN T16 [get_ports {adc_dat_a_i[14]}] +set_property PACKAGE_PIN V16 [get_ports {adc_dat_a_i[15]}] + +set_property IOSTANDARD LVCMOS18 [get_ports {adc_dat_b_i[*]}] +set_property IOB TRUE [get_ports {adc_dat_b_i[*]}] + +set_property PACKAGE_PIN T17 [get_ports {adc_dat_b_i[0]}] +set_property PACKAGE_PIN R16 [get_ports {adc_dat_b_i[1]}] +set_property PACKAGE_PIN R18 [get_ports {adc_dat_b_i[2]}] +set_property PACKAGE_PIN P16 [get_ports {adc_dat_b_i[3]}] +set_property PACKAGE_PIN P18 [get_ports {adc_dat_b_i[4]}] +set_property PACKAGE_PIN N17 [get_ports {adc_dat_b_i[5]}] +set_property PACKAGE_PIN R19 [get_ports {adc_dat_b_i[6]}] +set_property PACKAGE_PIN T20 [get_ports {adc_dat_b_i[7]}] +set_property PACKAGE_PIN T19 [get_ports {adc_dat_b_i[8]}] +set_property PACKAGE_PIN U20 [get_ports {adc_dat_b_i[9]}] +set_property PACKAGE_PIN V20 [get_ports {adc_dat_b_i[10]}] +set_property PACKAGE_PIN W20 [get_ports {adc_dat_b_i[11]}] +set_property PACKAGE_PIN W19 [get_ports {adc_dat_b_i[12]}] +set_property PACKAGE_PIN Y19 [get_ports {adc_dat_b_i[13]}] +set_property PACKAGE_PIN W18 [get_ports {adc_dat_b_i[14]}] +set_property PACKAGE_PIN Y18 [get_ports {adc_dat_b_i[15]}] + +# clock input + +set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports adc_clk_p_i] +set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports adc_clk_n_i] +set_property PACKAGE_PIN U18 [get_ports adc_clk_p_i] +set_property PACKAGE_PIN U19 [get_ports adc_clk_n_i] + +# clock output + +set_property IOSTANDARD LVCMOS18 [get_ports adc_enc_p_o] +set_property IOSTANDARD LVCMOS18 [get_ports adc_enc_n_o] + +set_property SLEW FAST [get_ports adc_enc_p_o] +set_property SLEW FAST [get_ports adc_enc_n_o] + +set_property DRIVE 8 [get_ports adc_enc_p_o] +set_property DRIVE 8 [get_ports adc_enc_n_o] + +set_property PACKAGE_PIN N20 [get_ports adc_enc_p_o] +set_property PACKAGE_PIN P20 [get_ports adc_enc_n_o] + +# clock duty cycle stabilizer (CSn) + +set_property IOSTANDARD LVCMOS18 [get_ports adc_csn_o] +set_property PACKAGE_PIN V18 [get_ports adc_csn_o] +set_property SLEW FAST [get_ports adc_csn_o] +set_property DRIVE 8 [get_ports adc_csn_o] + +### DAC + +# data + +set_property IOSTANDARD LVCMOS33 [get_ports {dac_dat_o[*]}] +set_property SLEW SLOW [get_ports {dac_dat_o[*]}] +set_property DRIVE 4 [get_ports {dac_dat_o[*]}] +# set_property IOB TRUE [get_ports {dac_dat_o[*]}] + +set_property PACKAGE_PIN M19 [get_ports {dac_dat_o[0]}] +set_property PACKAGE_PIN M20 [get_ports {dac_dat_o[1]}] +set_property PACKAGE_PIN L19 [get_ports {dac_dat_o[2]}] +set_property PACKAGE_PIN L20 [get_ports {dac_dat_o[3]}] +set_property PACKAGE_PIN K19 [get_ports {dac_dat_o[4]}] +set_property PACKAGE_PIN J19 [get_ports {dac_dat_o[5]}] +set_property PACKAGE_PIN J20 [get_ports {dac_dat_o[6]}] +set_property PACKAGE_PIN H20 [get_ports {dac_dat_o[7]}] +set_property PACKAGE_PIN G19 [get_ports {dac_dat_o[8]}] +set_property PACKAGE_PIN G20 [get_ports {dac_dat_o[9]}] +set_property PACKAGE_PIN F19 [get_ports {dac_dat_o[10]}] +set_property PACKAGE_PIN F20 [get_ports {dac_dat_o[11]}] +set_property PACKAGE_PIN D20 [get_ports {dac_dat_o[12]}] +set_property PACKAGE_PIN D19 [get_ports {dac_dat_o[13]}] + +# control + +set_property IOSTANDARD LVCMOS33 [get_ports dac_*_o] +set_property SLEW FAST [get_ports dac_*_o] +set_property DRIVE 8 [get_ports dac_*_o] +# set_property IOB TRUE [get_ports {dac_*_o}] + +set_property PACKAGE_PIN M17 [get_ports dac_wrt_o] +set_property PACKAGE_PIN N16 [get_ports dac_sel_o] +set_property PACKAGE_PIN M18 [get_ports dac_clk_o] +set_property PACKAGE_PIN N15 [get_ports dac_rst_o] + +### PWM + +set_property IOSTANDARD LVCMOS18 [get_ports {dac_pwm_o[*]}] +set_property SLEW FAST [get_ports {dac_pwm_o[*]}] +set_property DRIVE 12 [get_ports {dac_pwm_o[*]}] +# set_property IOB TRUE [get_ports {dac_pwm_o[*]}] + +set_property PACKAGE_PIN T10 [get_ports {dac_pwm_o[0]}] +set_property PACKAGE_PIN T11 [get_ports {dac_pwm_o[1]}] +set_property PACKAGE_PIN P15 [get_ports {dac_pwm_o[2]}] +set_property PACKAGE_PIN U13 [get_ports {dac_pwm_o[3]}] + +### XADC + +set_property IOSTANDARD LVCMOS33 [get_ports Vp_Vn_v_p] +set_property IOSTANDARD LVCMOS33 [get_ports Vp_Vn_v_n] +set_property IOSTANDARD LVCMOS33 [get_ports Vaux0_v_p] +set_property IOSTANDARD LVCMOS33 [get_ports Vaux0_v_n] +set_property IOSTANDARD LVCMOS33 [get_ports Vaux1_v_p] +set_property IOSTANDARD LVCMOS33 [get_ports Vaux1_v_n] +set_property IOSTANDARD LVCMOS33 [get_ports Vaux8_v_p] +set_property IOSTANDARD LVCMOS33 [get_ports Vaux8_v_n] +set_property IOSTANDARD LVCMOS33 [get_ports Vaux9_v_p] +set_property IOSTANDARD LVCMOS33 [get_ports Vaux9_v_n] + +set_property PACKAGE_PIN K9 [get_ports Vp_Vn_v_p] +set_property PACKAGE_PIN L10 [get_ports Vp_Vn_v_n] +set_property PACKAGE_PIN C20 [get_ports Vaux0_v_p] +set_property PACKAGE_PIN B20 [get_ports Vaux0_v_n] +set_property PACKAGE_PIN E17 [get_ports Vaux1_v_p] +set_property PACKAGE_PIN D18 [get_ports Vaux1_v_n] +set_property PACKAGE_PIN B19 [get_ports Vaux8_v_p] +set_property PACKAGE_PIN A20 [get_ports Vaux8_v_n] +set_property PACKAGE_PIN E18 [get_ports Vaux9_v_p] +set_property PACKAGE_PIN E19 [get_ports Vaux9_v_n] + +### Expansion connector + +set_property IOSTANDARD LVCMOS33 [get_ports {exp_p_tri_io[*]}] +set_property IOSTANDARD LVCMOS33 [get_ports {exp_n_tri_io[*]}] +set_property SLEW FAST [get_ports {exp_p_tri_io[*]}] +set_property SLEW FAST [get_ports {exp_n_tri_io[*]}] +set_property DRIVE 8 [get_ports {exp_p_tri_io[*]}] +set_property DRIVE 8 [get_ports {exp_n_tri_io[*]}] +set_property PULLTYPE PULLUP [get_ports {exp_p_tri_io[*]}] +set_property PULLTYPE PULLUP [get_ports {exp_n_tri_io[*]}] + +set_property PACKAGE_PIN G17 [get_ports {exp_p_tri_io[0]}] +set_property PACKAGE_PIN G18 [get_ports {exp_n_tri_io[0]}] +set_property PACKAGE_PIN H16 [get_ports {exp_p_tri_io[1]}] +set_property PACKAGE_PIN H17 [get_ports {exp_n_tri_io[1]}] +set_property PACKAGE_PIN J18 [get_ports {exp_p_tri_io[2]}] +set_property PACKAGE_PIN H18 [get_ports {exp_n_tri_io[2]}] +set_property PACKAGE_PIN K17 [get_ports {exp_p_tri_io[3]}] +set_property PACKAGE_PIN K18 [get_ports {exp_n_tri_io[3]}] +set_property PACKAGE_PIN L14 [get_ports {exp_p_tri_io[4]}] +set_property PACKAGE_PIN L15 [get_ports {exp_n_tri_io[4]}] +set_property PACKAGE_PIN L16 [get_ports {exp_p_tri_io[5]}] +set_property PACKAGE_PIN L17 [get_ports {exp_n_tri_io[5]}] +set_property PACKAGE_PIN K16 [get_ports {exp_p_tri_io[6]}] +set_property PACKAGE_PIN J16 [get_ports {exp_n_tri_io[6]}] +set_property PACKAGE_PIN M14 [get_ports {exp_p_tri_io[7]}] +set_property PACKAGE_PIN M15 [get_ports {exp_n_tri_io[7]}] + +set_property IOSTANDARD LVCMOS33 [get_ports exp_p_trg] +set_property SLEW FAST [get_ports exp_p_trg] +set_property DRIVE 8 [get_ports exp_p_trg] + +set_property PACKAGE_PIN M14 [get_ports exp_p_trg] + +set_property IOSTANDARD LVCMOS33 [get_ports {exp_n_alex[*]}] +set_property SLEW FAST [get_ports {exp_n_alex[*]}] +set_property DRIVE 8 [get_ports {exp_n_alex[*]}] + +set_property PACKAGE_PIN L15 [get_ports {exp_n_alex[0]}] +set_property PACKAGE_PIN L17 [get_ports {exp_n_alex[1]}] +set_property PACKAGE_PIN J16 [get_ports {exp_n_alex[2]}] +set_property PACKAGE_PIN M15 [get_ports {exp_n_alex[3]}] + +### SATA connector + +set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports daisy_p_o[*]] +set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports daisy_n_o[*]] + +set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports daisy_p_i[*]] +set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports daisy_n_i[*]] + +set_property PACKAGE_PIN T12 [get_ports {daisy_p_o[0]}] +set_property PACKAGE_PIN U12 [get_ports {daisy_n_o[0]}] + +set_property PACKAGE_PIN U14 [get_ports {daisy_p_o[1]}] +set_property PACKAGE_PIN U15 [get_ports {daisy_n_o[1]}] + +set_property PACKAGE_PIN P14 [get_ports {daisy_p_i[0]}] +set_property PACKAGE_PIN R14 [get_ports {daisy_n_i[0]}] + +set_property PACKAGE_PIN N18 [get_ports {daisy_p_i[1]}] +set_property PACKAGE_PIN P19 [get_ports {daisy_n_i[1]}] + +### LED + +set_property IOSTANDARD LVCMOS33 [get_ports {led_o[*]}] +set_property SLEW SLOW [get_ports {led_o[*]}] +set_property DRIVE 8 [get_ports {led_o[*]}] + +set_property PACKAGE_PIN F16 [get_ports {led_o[0]}] +set_property PACKAGE_PIN F17 [get_ports {led_o[1]}] +set_property PACKAGE_PIN G15 [get_ports {led_o[2]}] +set_property PACKAGE_PIN H15 [get_ports {led_o[3]}] +set_property PACKAGE_PIN K14 [get_ports {led_o[4]}] +set_property PACKAGE_PIN G14 [get_ports {led_o[5]}] +set_property PACKAGE_PIN J15 [get_ports {led_o[6]}] +set_property PACKAGE_PIN J14 [get_ports {led_o[7]}] diff --git a/HDL/boards/zub1cg/brd/1.2/LICENSE b/HDL/boards/zub1cg/brd/1.2/LICENSE new file mode 100644 index 00000000..64d3aace --- /dev/null +++ b/HDL/boards/zub1cg/brd/1.2/LICENSE @@ -0,0 +1,15 @@ +######################################################################### +Copyright (C) 2021, Avnet Inc - All rights reserved + +Licensed under the Apache License, Version 2.0 (the "License"). You may +not use this file except in compliance with the License. A copy of the +License is located at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +License for the specific language governing permissions and limitations +under the License. +######################################################################### diff --git a/HDL/boards/zub1cg/brd/1.2/ZUBoard_temp.xdc b/HDL/boards/zub1cg/brd/1.2/ZUBoard_temp.xdc new file mode 100644 index 00000000..0225a080 --- /dev/null +++ b/HDL/boards/zub1cg/brd/1.2/ZUBoard_temp.xdc @@ -0,0 +1,5 @@ +set_property PACKAGE_PIN G7 [get_ports {click_spi_pl_ss_io[0]}] +set_property PACKAGE_PIN G5 [get_ports {click_spi_pl_ss_io[1]}] + +set_property IOSTANDARD LVCMOS18 [get_ports {click_spi_pl_ss_io[1]}] +set_property IOSTANDARD LVCMOS18 [get_ports {click_spi_pl_ss_io[0]}] \ No newline at end of file diff --git a/HDL/boards/zub1cg/brd/1.2/board.xml b/HDL/boards/zub1cg/brd/1.2/board.xml new file mode 100644 index 00000000..2c62c351 --- /dev/null +++ b/HDL/boards/zub1cg/brd/1.2/board.xml @@ -0,0 +1,580 @@ + + + + + + + + + + ZUBoard 1CG DK Image + + + + + Rev 1 + + + 1.2 + + ZUBoard 1CG Development Board + + + + + + + + + + + + + + + + + + + + + + + + + + + Zynq UltraScale+ part on the board + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Click Reset + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PL Push Button + + + + + + + + + + + + + + + PL RGB LED 1 + + + + + + + + + + + + + + + PL RGB LED 2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + PL Click I2C + + + + + + + + + PL Click Reset Input + + + + + PL Click SPI + + + + + PL Click UART + + + + + PL Push Button + + + + + PL RGB LED, 2 to 0, Active High + + + PL RGB LED, 2 to 0, Active High + + + + + PL Temp Sensor I2C + + + + + HSIO DNA I2C + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HDL/boards/zub1cg/brd/1.2/changelog.txt b/HDL/boards/zub1cg/brd/1.2/changelog.txt new file mode 100644 index 00000000..a65eb0cc --- /dev/null +++ b/HDL/boards/zub1cg/brd/1.2/changelog.txt @@ -0,0 +1,6 @@ +1.2 +Updated company to Tria (an Avnet Company) +Updated search keywords + +1.0 +Original version diff --git a/HDL/boards/zub1cg/brd/1.2/part0_pins.xml b/HDL/boards/zub1cg/brd/1.2/part0_pins.xml new file mode 100644 index 00000000..0c2b89a2 --- /dev/null +++ b/HDL/boards/zub1cg/brd/1.2/part0_pins.xml @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HDL/boards/zub1cg/brd/1.2/preset.xml b/HDL/boards/zub1cg/brd/1.2/preset.xml new file mode 100644 index 00000000..3bf146c4 --- /dev/null +++ b/HDL/boards/zub1cg/brd/1.2/preset.xml @@ -0,0 +1,736 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/HDL/boards/zub1cg/brd/1.2/xitem.json b/HDL/boards/zub1cg/brd/1.2/xitem.json new file mode 100644 index 00000000..a18f39a7 --- /dev/null +++ b/HDL/boards/zub1cg/brd/1.2/xitem.json @@ -0,0 +1,40 @@ +{ + "config": { + "items": [ + { + "infra": { + "name": "ZUBoard_1CG", + "display": "ZUBoard 1CG Development Board", + "revision": "1.2", + "description": "ZUBoard 1CG Development Board", + + "company": "Tria (an Avnet Company)", + "company_display": "Tria (an Avnet Company)", + "author": "Avnet", + "contributors": [ + { + "group": "Avnet", + "url": "avnet.me/ZUBoard-1CG" + } + ], + "category": "Evaluation Boards", + "website": "avnet.me/ZUBoard-1CG", + "search-keywords": [ + "zuboard", + "zu1", + "1cg", + "devkit", + "avnet", + "tria", + "avnet.com", + "tria-technologies.com", + "board", + "Evaluation Boards" + ] + } + } + ] + }, + "_major": 1, + "_minor": 0 +} diff --git a/HDL/boards/zub1cg/brd/1.2/zub1cg_top.png b/HDL/boards/zub1cg/brd/1.2/zub1cg_top.png new file mode 100644 index 00000000..2cf64161 Binary files /dev/null and b/HDL/boards/zub1cg/brd/1.2/zub1cg_top.png differ diff --git a/HDL/cores/axi_bidrectional_spi_v1_0/axi_bidirectional_spi.v b/HDL/cores/axi_bidrectional_spi_v1_0/axi_bidirectional_spi.v new file mode 100644 index 00000000..8b2225d6 --- /dev/null +++ b/HDL/cores/axi_bidrectional_spi_v1_0/axi_bidirectional_spi.v @@ -0,0 +1,431 @@ + +`timescale 1 ns / 1 ps + +// This core is for driving a sinlge lane SPI device with a bidirectional data line +// In the first version of this core, there are only 4 registers +// 0x00 32 bit register for the data to be sent +// 0x04 32 bit register for the R/W mask +// 0x08 32 bit register for the data bit-length in the bottom 8 bits and the status of the SPI interface in the top 24bits +// 0x12 32 bit register for the data read +module axi_bidirectional_spi # +( + parameter integer C_S_AXI_DATA_WIDTH = 32, + parameter integer C_S_AXI_ADDR_WIDTH = 2 +) +( + // Control Signals for the SPI interface + inout wire spi_sdio, + output wire spi_sclk, + output wire spi_cs_n, + + // Do not modify the ports beyond this line + + // Global Clock Signal + input wire S_AXI_ACLK, + // Global Reset Signal. This Signal is Active LOW + input wire S_AXI_ARESETN, + // Write address (issued by master, acceped by Slave) + input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_AWADDR, + // Write channel Protection type. This signal indicates the + // privilege and security level of the transaction, and whether + // the transaction is a data access or an instruction access. + input wire [2 : 0] S_AXI_AWPROT, + // Write address valid. This signal indicates that the master signaling + // valid write address and control information. + input wire S_AXI_AWVALID, + // Write address ready. This signal indicates that the slave is ready + // to accept an address and associated control signals. + output wire S_AXI_AWREADY, + // Write data (issued by master, acceped by Slave) + input wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_WDATA, + // Write strobes. This signal indicates which byte lanes hold + // valid data. There is one write strobe bit for each eight + // bits of the write data bus. + input wire [(C_S_AXI_DATA_WIDTH/8)-1 : 0] S_AXI_WSTRB, + // Write valid. This signal indicates that valid write + // data and strobes are available. + input wire S_AXI_WVALID, + // Write ready. This signal indicates that the slave + // can accept the write data. + output wire S_AXI_WREADY, + // Write response. This signal indicates the status + // of the write transaction. + output wire [1 : 0] S_AXI_BRESP, + // Write response valid. This signal indicates that the channel + // is signaling a valid write response. + output wire S_AXI_BVALID, + // Response ready. This signal indicates that the master + // can accept a write response. + input wire S_AXI_BREADY, + // Read address (issued by master, acceped by Slave) + input wire [C_S_AXI_ADDR_WIDTH-1 : 0] S_AXI_ARADDR, + // Protection type. This signal indicates the privilege + // and security level of the transaction, and whether the + // transaction is a data access or an instruction access. + input wire [2 : 0] S_AXI_ARPROT, + // Read address valid. This signal indicates that the channel + // is signaling valid read address and control information. + input wire S_AXI_ARVALID, + // Read address ready. This signal indicates that the slave is + // ready to accept an address and associated control signals. + output wire S_AXI_ARREADY, + // Read data (issued by slave) + output wire [C_S_AXI_DATA_WIDTH-1 : 0] S_AXI_RDATA, + // Read response. This signal indicates the status of the + // read transfer. + output wire [1 : 0] S_AXI_RRESP, + // Read valid. This signal indicates that the channel is + // signaling the required read data. + output wire S_AXI_RVALID, + // Read ready. This signal indicates that the master can + // accept the read data and response information. + input wire S_AXI_RREADY +); + + // + // AXI4LITE signals + reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_awaddr; + reg axi_awready; + reg axi_wready; + reg [1 : 0] axi_bresp; + reg axi_bvalid; + reg [C_S_AXI_ADDR_WIDTH-1 : 0] axi_araddr; + reg axi_arready; + reg [C_S_AXI_DATA_WIDTH-1 : 0] axi_rdata; + reg [1 : 0] axi_rresp; + reg axi_rvalid; + + // Example-specific design signals + // local parameter for addressing 32 bit / 64 bit C_S_AXI_DATA_WIDTH + // ADDR_LSB is used for addressing 32/64 bit registers/memories + // ADDR_LSB = 2 for 32 bits (n downto 2) + // ADDR_LSB = 3 for 64 bits (n downto 3) + localparam integer ADDR_LSB = (C_S_AXI_DATA_WIDTH/32) + 1; + localparam integer OPT_MEM_ADDR_BITS = 3; + //---------------------------------------------- + //-- Signals for user logic register space example + //------------------------------------------------ + //-- Number of Slave Registers 4 + reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg0; + reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg1; + reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg2; + reg [C_S_AXI_DATA_WIDTH-1:0] slv_reg3; + + + wire slv_reg_rden; + wire slv_reg_wren; + reg [C_S_AXI_DATA_WIDTH-1:0] reg_data_out; + integer byte_index; + + // I/O Connections assignments + + assign S_AXI_AWREADY = axi_awready; + assign S_AXI_WREADY = axi_wready; + assign S_AXI_BRESP = axi_bresp; + assign S_AXI_BVALID = axi_bvalid; + assign S_AXI_ARREADY = axi_arready; + assign S_AXI_RDATA = axi_rdata; + assign S_AXI_RRESP = axi_rresp; + assign S_AXI_RVALID = axi_rvalid; + // Implement axi_awready generation + // axi_awready is asserted for one S_AXI_ACLK clock cycle when both + // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_awready is + // de-asserted when reset is low. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_awready <= 1'b0; + end + else + begin + if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID) + begin + // slave is ready to accept write address when + // there is a valid write address and write data + // on the write address and data bus. This design + // expects no outstanding transactions. + axi_awready <= 1'b1; + end + else + begin + axi_awready <= 1'b0; + end + end + end + + // Implement axi_awaddr latching + // This process is used to latch the address when both + // S_AXI_AWVALID and S_AXI_WVALID are valid. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_awaddr <= 0; + end + else + begin + if (~axi_awready && S_AXI_AWVALID && S_AXI_WVALID) + begin + // Write Address latching + axi_awaddr <= S_AXI_AWADDR; + end + end + end + + // Implement axi_wready generation + // axi_wready is asserted for one S_AXI_ACLK clock cycle when both + // S_AXI_AWVALID and S_AXI_WVALID are asserted. axi_wready is + // de-asserted when reset is low. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_wready <= 1'b0; + end + else + begin + if (~axi_wready && S_AXI_WVALID && S_AXI_AWVALID) + begin + // slave is ready to accept write data when + // there is a valid write address and write data + // on the write address and data bus. This design + // expects no outstanding transactions. + axi_wready <= 1'b1; + end + else + begin + axi_wready <= 1'b0; + end + end + end + + // Implement memory mapped register select and write logic generation + // The write data is accepted and written to memory mapped registers when + // axi_awready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. Write strobes are used to + // select byte enables of slave registers while writing. + // These registers are cleared when reset (active low) is applied. + // Slave register write enable is asserted when valid address and data are available + // and the slave is ready to accept the write address and write data. + assign slv_reg_wren = axi_wready && S_AXI_WVALID && axi_awready && S_AXI_AWVALID; + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + slv_reg0 <= 8'h00; + //slv_reg1 <= 8'h10; + //slv_reg2 <= 8'h20; + //slv_reg3 <= 8'h30; + //slv_reg4 <= 8'h40; + //slv_reg5 <= 8'h50; + //slv_reg6 <= 8'h60; + //slv_reg7 <= 8'h70; + //slv_reg8 <= 8'h80; + //slv_reg9 <= 8'h90; + //slv_reg10 <= 8'h77; + end + else begin + if (slv_reg_wren) + begin + case ( axi_awaddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] ) + 4'h0: + for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) + if ( S_AXI_WSTRB[byte_index] == 1 ) begin + // Respective byte enables are asserted as per write strobes + // Slave register 0 + slv_reg0[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8]; + end + 4'h1: + for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) + if ( S_AXI_WSTRB[byte_index] == 1 ) begin + // Respective byte enables are asserted as per write strobes + // Slave register 1 + slv_reg1[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8]; + end + 4'h2: + for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) + if ( S_AXI_WSTRB[byte_index] == 1 ) begin + // Respective byte enables are asserted as per write strobes + // Slave register 2 + slv_reg2[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8]; + end + 4'h3: + for ( byte_index = 0; byte_index <= (C_S_AXI_DATA_WIDTH/8)-1; byte_index = byte_index+1 ) + if ( S_AXI_WSTRB[byte_index] == 1 ) begin + // Respective byte enables are asserted as per write strobes + // Slave register 3 + slv_reg3[(byte_index*8) +: 8] <= S_AXI_WDATA[(byte_index*8) +: 8]; + end + default : begin + //slv_reg0 <= slv_reg0; + //slv_reg1 <= slv_reg1; + //slv_reg2 <= slv_reg2; + //slv_reg3 <= slv_reg3; + end + endcase + end + end + end + + // Implement write response logic generation + // The write response and response valid signals are asserted by the slave + // when axi_wready, S_AXI_WVALID, axi_wready and S_AXI_WVALID are asserted. + // This marks the acceptance of address and indicates the status of + // write transaction. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_bvalid <= 0; + axi_bresp <= 2'b0; + end + else + begin + if (axi_awready && S_AXI_AWVALID && ~axi_bvalid && axi_wready && S_AXI_WVALID) + begin + // indicates a valid write response is available + axi_bvalid <= 1'b1; + axi_bresp <= 2'b0; // 'OKAY' response + end // work error responses in future + else + begin + if (S_AXI_BREADY && axi_bvalid) + //check if bready is asserted while bvalid is high) + //(there is a possibility that bready is always asserted high) + begin + axi_bvalid <= 1'b0; + end + end + end + end + + // Implement axi_arready generation + // axi_arready is asserted for one S_AXI_ACLK clock cycle when + // S_AXI_ARVALID is asserted. axi_awready is + // de-asserted when reset (active low) is asserted. + // The read address is also latched when S_AXI_ARVALID is + // asserted. axi_araddr is reset to zero on reset assertion. + + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_arready <= 1'b0; + axi_araddr <= 32'b0; + end + else + begin + if (~axi_arready && S_AXI_ARVALID) + begin + // indicates that the slave has acceped the valid read address + axi_arready <= 1'b1; + // Read address latching + axi_araddr <= S_AXI_ARADDR; + end + else + begin + axi_arready <= 1'b0; + end + end + end + + // Implement axi_arvalid generation + // axi_rvalid is asserted for one S_AXI_ACLK clock cycle when both + // S_AXI_ARVALID and axi_arready are asserted. The slave registers + // data are available on the axi_rdata bus at this instance. The + // assertion of axi_rvalid marks the validity of read data on the + // bus and axi_rresp indicates the status of read transaction.axi_rvalid + // is deasserted on reset (active low). axi_rresp and axi_rdata are + // cleared to zero on reset (active low). + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_rvalid <= 0; + axi_rresp <= 0; + end + else + begin + if (axi_arready && S_AXI_ARVALID && ~axi_rvalid) + begin + // Valid read data is available at the read data bus + axi_rvalid <= 1'b1; + axi_rresp <= 2'b0; // 'OKAY' response + end + else if (axi_rvalid && S_AXI_RREADY) + begin + // Read data is accepted by the master + axi_rvalid <= 1'b0; + end + end + end + + // Implement memory mapped register select and read logic generation + // Slave register read enable is asserted when valid address is available + // and the slave is ready to accept the read address. + assign slv_reg_rden = axi_arready & S_AXI_ARVALID & ~axi_rvalid; + always @(*) + begin + // Address decoding for reading registers + case ( axi_araddr[ADDR_LSB+OPT_MEM_ADDR_BITS:ADDR_LSB] ) + 4'h0 : reg_data_out <= slv_reg0; + 4'h1 : reg_data_out <= slv_reg1; + 4'h2 : reg_data_out <= slv_reg2; + 4'h3 : reg_data_out <= slv_reg3; + 4'h4 : reg_data_out <= slv_reg4; + 4'h5 : reg_data_out <= slv_reg5; + + default : reg_data_out <= 0; + endcase + end + + // Output register or memory read data + always @( posedge S_AXI_ACLK ) + begin + if ( S_AXI_ARESETN == 1'b0 ) + begin + axi_rdata <= 0; + end + else + begin + // When there is a valid read address (S_AXI_ARVALID) with + // acceptance of read address by the slave (axi_arready), + // output the read dada + if (slv_reg_rden) + begin + axi_rdata <= reg_data_out; // register read data + end + end + end + + // Add user logic here + reg spi_dir; // Direction control for the SPI interface (1 for write, 0 for read) + reg [31:0] shift_out; // SPI Data to be shifted out + reg [31:0] shift_in; // SPI Data to be shifted in + assign spi_sdio = spi_dir ? shift_out[31] : 1'bz; + + + // State Machine to Control the SPI Interface + always @(posedge S_AXI_ACLK or negedge S_AXI_ARESETN) begin + if (~S_AXI_ARESETN) begin + spi_sclk <= 0; // keep the spi clock low + spi_cs_n <= 1; // deassert the chip select line + spi_dir <= 1; // start in write mode + shift_out <= 0; // clear the shift out register + shift_in <= 0; // clear the shift in register + end else begin + case (slv_reg2[7:0]) + 8'h00: begin + spi_sclk <= 0; + spi_cs_n <= 1; + spi_dir <= 1; + shift_out <= 0; + end + 8'h01: begin + spi_sclk <= +endmodule diff --git a/HDL/cores/axi_bidrectional_spi_v1_0/core_config.tcl b/HDL/cores/axi_bidrectional_spi_v1_0/core_config.tcl new file mode 100644 index 00000000..00c5f5c5 --- /dev/null +++ b/HDL/cores/axi_bidrectional_spi_v1_0/core_config.tcl @@ -0,0 +1,17 @@ +set display_name {AXI-4 Lite Bi-directional SPI Master} + +set core [ipx::current_core] + +set_property DISPLAY_NAME $display_name $core +set_property DESCRIPTION $display_name $core + +core_parameter C_S_AXI_DATA_WIDTH {AXI DATA WIDTH} {Width of the AXI data bus.} +core_parameter C_S_AXI_ADDR_WIDTH {AXI ADDR WIDTH} {Width of the AXI address bus.} + +set bus [ipx::get_bus_interfaces -of_objects $core S_AXI] +set_property NAME S_AXI $bus +set_property INTERFACE_MODE slave $bus + +set bus [ipx::get_bus_interfaces S_AXI_ACLK] +set parameter [ipx::get_bus_parameters -of_objects $bus ASSOCIATED_BUSIF] +set_property VALUE S_AXI $parameter diff --git a/HDL/cores/axis_red_pitaya_dac_v1_1/axis_red_pitaya_dac.v b/HDL/cores/axis_red_pitaya_dac_v1_1/axis_red_pitaya_dac.v new file mode 100644 index 00000000..6d3f6d02 --- /dev/null +++ b/HDL/cores/axis_red_pitaya_dac_v1_1/axis_red_pitaya_dac.v @@ -0,0 +1,80 @@ + +`timescale 1 ns / 1 ps + +module axis_red_pitaya_dac # +( + parameter integer DAC_DATA_WIDTH = 14, + parameter integer AXIS_TDATA_WIDTH = 32 +) +( + // PLL signals + input wire aclk, + input wire ddr_clk, + input wire locked, + + // DAC signals + output wire dac_clk, + output wire dac_rst, + output wire dac_sel, + output wire dac_wrt, + output wire [DAC_DATA_WIDTH-1:0] dac_dat, + + // Slave side + output wire s_axis_tready, + input wire [AXIS_TDATA_WIDTH-1:0] s_axis_tdata, + input wire s_axis_tvalid +); + + reg [DAC_DATA_WIDTH-1:0] int_dat_a_reg; + reg [DAC_DATA_WIDTH-1:0] int_dat_b_reg; + reg int_rst_reg; + + wire [DAC_DATA_WIDTH-1:0] int_dat_a_wire; + wire [DAC_DATA_WIDTH-1:0] int_dat_b_wire; + + localparam PAD = AXIS_TDATA_WIDTH/2 - DAC_DATA_WIDTH; + + // Make sure we take the 14 MSB, not LSB + assign int_dat_a_wire = s_axis_tdata[AXIS_TDATA_WIDTH/2-1:PAD]; + assign int_dat_b_wire = s_axis_tdata[AXIS_TDATA_WIDTH-1:AXIS_TDATA_WIDTH/2+PAD]; + + genvar j; + + always @(posedge aclk) + begin + if(~locked | ~s_axis_tvalid) + begin + int_dat_a_reg <= {(DAC_DATA_WIDTH){1'b0}}; + int_dat_b_reg <= {(DAC_DATA_WIDTH){1'b0}}; + end + else + begin + int_dat_a_reg <= {int_dat_a_wire[DAC_DATA_WIDTH-1], ~int_dat_a_wire[DAC_DATA_WIDTH-2:0]}; + int_dat_b_reg <= {int_dat_b_wire[DAC_DATA_WIDTH-1], ~int_dat_b_wire[DAC_DATA_WIDTH-2:0]}; + end + int_rst_reg <= ~locked | ~s_axis_tvalid; + end + + ODDR ODDR_rst(.Q(dac_rst), .D1(int_rst_reg), .D2(int_rst_reg), .C(aclk), .CE(1'b1), .R(1'b0), .S(1'b0)); + ODDR ODDR_sel(.Q(dac_sel), .D1(1'b0), .D2(1'b1), .C(aclk), .CE(1'b1), .R(1'b0), .S(1'b0)); + ODDR ODDR_wrt(.Q(dac_wrt), .D1(1'b0), .D2(1'b1), .C(ddr_clk), .CE(1'b1), .R(1'b0), .S(1'b0)); + ODDR ODDR_clk(.Q(dac_clk), .D1(1'b0), .D2(1'b1), .C(ddr_clk), .CE(1'b1), .R(1'b0), .S(1'b0)); + + generate + for(j = 0; j < DAC_DATA_WIDTH; j = j + 1) + begin : DAC_DAT + ODDR ODDR_inst( + .Q(dac_dat[j]), + .D1(int_dat_a_reg[j]), + .D2(int_dat_b_reg[j]), + .C(aclk), + .CE(1'b1), + .R(1'b0), + .S(1'b0) + ); + end + endgenerate + + assign s_axis_tready = 1'b1; + +endmodule diff --git a/HDL/cores/axis_red_pitaya_dac_v1_1/core_config.tcl b/HDL/cores/axis_red_pitaya_dac_v1_1/core_config.tcl new file mode 100644 index 00000000..d6bf45ff --- /dev/null +++ b/HDL/cores/axis_red_pitaya_dac_v1_1/core_config.tcl @@ -0,0 +1,17 @@ +set display_name {AXI4-Stream Red Pitaya DAC} + +set core [ipx::current_core] + +set_property DISPLAY_NAME $display_name $core +set_property DESCRIPTION $display_name $core + +core_parameter AXIS_TDATA_WIDTH {AXIS TDATA WIDTH} {Width of the S_AXIS data bus.} +core_parameter DAC_DATA_WIDTH {DAC DATA WIDTH} {Width of the DAC data bus.} + +set bus [ipx::get_bus_interfaces -of_objects $core s_axis] +set_property NAME S_AXIS $bus +set_property INTERFACE_MODE slave $bus + +set bus [ipx::get_bus_interfaces aclk] +set parameter [ipx::get_bus_parameters -of_objects $bus ASSOCIATED_BUSIF] +set_property VALUE S_AXIS $parameter diff --git a/HDL/projects/README.md b/HDL/projects/README.md new file mode 100644 index 00000000..a33b9c48 --- /dev/null +++ b/HDL/projects/README.md @@ -0,0 +1,24 @@ +# HDL Projects + +This folder contains projects written in SystemVerilog and other Hardware Description Languages (HDL). Each project is organized with separate directories for simulations and testbenches. + +## Structure + +- `src/`: Source files for the HDL projects. +- `sim/`: Simulation files and scripts. +- `tb/`: Testbenches for verifying the HDL designs. + +## Getting Started + +1. Navigate to the project directory. +2. Run the simulation scripts located in the `sim/` directory. +3. Verify the design using the testbenches in the `tb/` directory. + +## Requirements + +- SystemVerilog or other HDL tools. +- Simulation software compatible with the HDL used. + +## Contributing + +Feel free to contribute by adding new projects, improving existing ones, or updating documentation. diff --git a/HDL/projects/async_fifo/Makefile b/HDL/projects/async_fifo/Makefile new file mode 100644 index 00000000..cbf10209 --- /dev/null +++ b/HDL/projects/async_fifo/Makefile @@ -0,0 +1,21 @@ +VERILATOR = verilator +TOP_MODULE = async_fifo +VERILATED = obj_dir/V$(TOP_MODULE) + +SRC_FILES = async_fifo.sv +CPP_FILES = main.cpp + +all: sim + +sim: $(VERILATED) + ./$(VERILATED) + +$(VERILATED): $(SRC_FILES) $(CPP_FILES) + $(VERILATOR) -Wall --cc $(SRC_FILES) --exe $(CPP_FILES) --top-module $(TOP_MODULE) --trace --timing + make -C obj_dir -f V$(TOP_MODULE).mk V$(TOP_MODULE) + +clean: + rm -rf obj_dir + rm -f sim.vcd + +.PHONY: all sim clean diff --git a/HDL/projects/async_fifo/README.md b/HDL/projects/async_fifo/README.md new file mode 100644 index 00000000..71f154ab --- /dev/null +++ b/HDL/projects/async_fifo/README.md @@ -0,0 +1,10 @@ +# async_fifo + +This project is to build and understand asynchronous FIFOs for clock-domain crossing. + +At the same time this is also a testbed on how to leverage both verilator and Vivado techniques to generate simulations and reports on +clock-domain crossing issues. + +## Requirements + +This project requires verilator and a tool to display the simulations. There are either gtkwave or surfer project that I would recommend. \ No newline at end of file diff --git a/HDL/projects/async_fifo/async_fifo.sv b/HDL/projects/async_fifo/async_fifo.sv new file mode 100644 index 00000000..e5e02d19 --- /dev/null +++ b/HDL/projects/async_fifo/async_fifo.sv @@ -0,0 +1,122 @@ +module async_fifo #( + parameter DATA_WIDTH = 16, + parameter ADDR_WIDTH = 4, // FIFO depth = 2^ADDR_WIDTH + parameter ALMOST_FULL_THRESHOLD = 2, // Adjust as needed + parameter ALMOST_EMPTY_THRESHOLD = 2 // Adjust as needed +)( + input wire wr_clk, + input wire wr_rst_n, + input wire [DATA_WIDTH-1:0] wr_data, + input wire wr_en, + output wire full, + output wire almost_full, + + input wire rd_clk, + input wire rd_rst_n, + output wire [DATA_WIDTH-1:0] rd_data, + input wire rd_en, + output wire empty, + output wire almost_empty +); + + // Function to convert binary to Gray code + function [ADDR_WIDTH:0] binary_to_gray(input [ADDR_WIDTH:0] bin); + binary_to_gray = (bin >> 1) ^ bin; + endfunction + + + // Function to convert Gray code to binary + function [ADDR_WIDTH:0] gray_to_binary(input [ADDR_WIDTH:0] gray); + integer i; + begin + gray_to_binary[ADDR_WIDTH] = gray[ADDR_WIDTH]; + for (i = ADDR_WIDTH-1; i >= 0; i = i - 1) + gray_to_binary[i] = gray[i] ^ gray_to_binary[i+1]; + end + endfunction + + // FIFO memory + reg [DATA_WIDTH-1:0] mem [0:(1<= ((1 << ADDR_WIDTH) - ALMOST_FULL_THRESHOLD)); + + // ALMOST EMPTY calculation is done in read clock domain + wire [ADDR_WIDTH:0] fifo_count_rd_clk; + assign fifo_count_rd_clk = wr_ptr_bin_rd_clk - rd_ptr_bin; + + assign almost_empty = (fifo_count_rd_clk <= ALMOST_EMPTY_THRESHOLD); + +endmodule diff --git a/HDL/projects/async_fifo/main.cpp b/HDL/projects/async_fifo/main.cpp new file mode 100644 index 00000000..c0b40f8f --- /dev/null +++ b/HDL/projects/async_fifo/main.cpp @@ -0,0 +1,131 @@ +// main.cpp +#include "Vasync_fifo.h" +#include "verilated.h" +#include "verilated_vcd_c.h" +#include +#include + +int main(int argc, char **argv) +{ + Verilated::commandArgs(argc, argv); + + // Instantiate the top module + Vasync_fifo *top = new Vasync_fifo; + + // Initialize simulation inputs + top->wr_clk = 0; + top->rd_clk = 0; + top->wr_rst_n = 0; + top->rd_rst_n = 0; + top->wr_en = 0; + top->rd_en = 0; + + // Variables for simulation + vluint64_t main_time = 0; // Current simulation time + const vluint64_t sim_time = 4000000; // Adjust as needed + + // Open VCD dump file + Verilated::traceEverOn(true); + VerilatedVcdC *tfp = new VerilatedVcdC; + top->trace(tfp, 99); // Trace 99 levels of hierarchy + tfp->open("sim.vcd"); + + // Reset sequence + while (main_time < 20) + { + top->wr_clk = !top->wr_clk; + top->rd_clk = !top->rd_clk; + top->eval(); + tfp->dump(main_time); + main_time++; + } + top->wr_rst_n = 1; + top->rd_rst_n = 1; + + uint16_t write_count = 0; + uint16_t read_count = 0; + uint16_t expected_data = 0; + uint16_t wr_data = 0; + bool prev_wr_clk = 0; + bool prev_rd_clk = 0; + + while (main_time < sim_time) + { + // Toggle clocks + if ((main_time % 5) == 0) + { + top->wr_clk = !top->wr_clk; + } + if ((main_time % 7) == 0) + { + top->rd_clk = !top->rd_clk; + } + + // Write process + if (top->wr_clk && !prev_wr_clk) + { // Rising edge of wr_clk + if (main_time > 20) + { // After reset + if (!top->full) + { + top->wr_en = 1; + top->wr_data = wr_data; + wr_data++; + write_count++; + } + else + { + top->wr_en = 0; + } + } + } + prev_wr_clk = top->wr_clk; + + // Read process + if (top->rd_clk && !prev_rd_clk) + { // Rising edge of rd_clk + if (main_time > 20) + { // After reset + if (!top->empty) + { + top->rd_en = 1; + } + else + { + top->rd_en = 0; + } + + // Data integrity check + if (top->rd_en && !top->empty) + { + if (top->rd_data != expected_data) + { + std::cout << "ERROR: Data Mismatch at time " << main_time + << ": Expected " << expected_data << ", Got " << top->rd_data << std::endl; + exit(1); + } + expected_data++; + read_count++; + } + } + } + prev_rd_clk = top->rd_clk; + + // Check for simulation end + if (write_count >= 500 && read_count >= 500) + { + std::cout << "Simulation completed successfully at time " << main_time << std::endl; + break; + } + + top->eval(); // Evaluate model + tfp->dump(main_time); // Dump signals to VCD file + + main_time++; + } + + // Cleanup + tfp->close(); + delete top; + return 0; +} diff --git a/HDL/projects/async_fifo/tb_async_fifo.sv b/HDL/projects/async_fifo/tb_async_fifo.sv new file mode 100644 index 00000000..409a537b --- /dev/null +++ b/HDL/projects/async_fifo/tb_async_fifo.sv @@ -0,0 +1,137 @@ +module tb_async_fifo; + + // Parameters + parameter DATA_WIDTH = 16; + parameter ADDR_WIDTH = 4; // FIFO depth = 2^ADDR_WIDTH + + // Signals + reg wr_clk; + reg wr_rst_n; + reg [DATA_WIDTH-1:0] wr_data; + reg wr_en; + wire full; + + reg rd_clk; + reg rd_rst_n; + wire [DATA_WIDTH-1:0] rd_data; + reg rd_en; + wire empty; + + integer write_count; + integer read_count; + reg [DATA_WIDTH-1:0] expected_data; + + // Instantiate the FIFO + async_fifo #( + .DATA_WIDTH(DATA_WIDTH), + .ADDR_WIDTH(ADDR_WIDTH) + ) fifo_inst ( + .wr_clk (wr_clk), + .wr_rst_n (wr_rst_n), + .wr_data (wr_data), + .wr_en (wr_en), + .full (full), + .rd_clk (rd_clk), + .rd_rst_n (rd_rst_n), + .rd_data (rd_data), + .rd_en (rd_en), + .empty (empty) + ); + + // Clock generation + initial begin + wr_clk = 0; + forever #5 wr_clk = ~wr_clk; // 100 MHz clock + end + + initial begin + rd_clk = 0; + forever #7 rd_clk = ~rd_clk; // Approximately 71.4 MHz clock + end + + // Reset generation + initial begin + wr_rst_n = 0; + rd_rst_n = 0; + #20; + wr_rst_n = 1; + rd_rst_n = 1; + end + + // Write process + initial begin + wr_en = 0; + wr_data = 0; + write_count = 0; + @(posedge wr_rst_n); + @(posedge wr_clk); + + // Write data until a certain count + while (write_count < 50) begin + @(posedge wr_clk); + if (!full) begin + wr_en = 1; + wr_data = write_count[DATA_WIDTH-1:0]; + write_count = write_count + 1; + end else begin + wr_en = 0; + end + end + wr_en = 0; + end + + // Read process + initial begin + rd_en = 0; + expected_data = 0; + read_count = 0; + @(posedge rd_rst_n); + @(posedge rd_clk); + + // Read data until all written data is read + while (read_count < 50) begin + @(posedge rd_clk); + if (!empty) begin + rd_en = 1; + end else begin + rd_en = 0; + end + end + rd_en = 0; + end + + // Data integrity check + always @(posedge rd_clk) begin + if (rd_en && !empty) begin + if (rd_data !== expected_data) begin + $display("ERROR: Data Mismatch at time %t: Expected %0d, Got %0d", $time, expected_data, rd_data); + $stop; + end else begin + expected_data <= expected_data + 1; + read_count <= read_count + 1; + end + end + end + + // Monitor full and empty flags + always @(posedge wr_clk) begin + if (full && wr_en) begin + $display("INFO: FIFO is full at time %t", $time); + end + end + + always @(posedge rd_clk) begin + if (empty && rd_en) begin + $display("INFO: FIFO is empty at time %t", $time); + end + end + + // Terminate simulation + initial begin + wait (write_count == 50 && read_count == 50); + #100; // Wait for any remaining activity + $display("Simulation completed successfully at time %t", $time); + $stop; + end + +endmodule diff --git a/HDL/projects/half_duplex_spi_master/Makefile b/HDL/projects/half_duplex_spi_master/Makefile new file mode 100644 index 00000000..b10d6ad5 --- /dev/null +++ b/HDL/projects/half_duplex_spi_master/Makefile @@ -0,0 +1,38 @@ +VERILATOR = verilator +TOP_MODULE = half_duplex_spi_master_clkdiv +VERILATED = obj_dir/V$(TOP_MODULE) + +SRC_FILES = half_duplex_spi_master_clkdiv.sv half_duplex_spi_master.sv ../async_fifo/async_fifo.sv ../reset_synchronizer/reset_synchronizer.sv ../quadrature_clock_divider/quadrature_clock_divider.sv +CPP_FILES = half_duplex_spi_master_tb.cpp + +all: sim + +sim: $(VERILATED) + ./$(VERILATED) + +$(VERILATED): $(SRC_FILES) $(CPP_FILES) + $(VERILATOR) -Wall --cc $(SRC_FILES) --exe $(CPP_FILES) --top-module $(TOP_MODULE) --trace --timing + make -C obj_dir -f V$(TOP_MODULE).mk V$(TOP_MODULE) + +clean: + rm -rf obj_dir + rm -f sim.vcd + rm -f sim_reset_n_clock.vcd + rm -f sim_load_value_32w_mode0.vcd + rm -f sim_load_value_32w_mode1.vcd + rm -f sim_load_value_32w_mode2.vcd + rm -f sim_load_value_32w_mode3.vcd + rm -f sim_load_value_mode0.vcd + rm -f sim_load_value_mode1.vcd + rm -f sim_load_value_mode2.vcd + rm -f sim_load_value_mode3.vcd + rm -f sim_load_value_24w_8r_mode0.vcd + rm -f sim_load_value_24w_8r_mode1.vcd + rm -f sim_load_value_24w_8r_mode2.vcd + rm -f sim_load_value_24w_8r_mode3.vcd + rm -f sim_load_value_24r_8w_mode0.vcd + rm -f sim_load_value_24r_8w_mode1.vcd + rm -f sim_load_value_24r_8w_mode2.vcd + rm -f sim_load_value_24r_8w_mode3.vcd + +.PHONY: all sim clean diff --git a/HDL/projects/half_duplex_spi_master/TODO.md b/HDL/projects/half_duplex_spi_master/TODO.md new file mode 100644 index 00000000..b45e5e92 --- /dev/null +++ b/HDL/projects/half_duplex_spi_master/TODO.md @@ -0,0 +1,17 @@ +Important issues remaining on this core +- [x] Reading doesn't shift into correct bits (off by one) (done) +- [x] To fabric FIFO transfer does not finish due to possible reset (done) +- [ ] Asserts in test bench (not done) +- [x] correct bit-lengths for transaction length and bit counters (done) +- [x] remove dual clock approach and replace with simple single clock (done) +- [x] make a separate module with built-in clock-divider for the verilator tests (done) +- [ ] check all the reset conditions (not done) +- [x] fix the input shift register shifts when writing out (done) +- [x] make sure SPI modes cannot be changed in the middle of transactions etc (done) +- [ ] remove unnecessary registers (not done) +- [ ] check for unnecessary priority encoders (not done) +- [ ] change the state machine to follow standard pattern (not done) +- [ ] implement and test error detection (not done) +- [ ] bring a busy flag to the fabric domain using a double flop synchronizer (not done) +- [x] rewrite to use a FSM running on double clock speed to only have positive edge sensitivity (not done) +- [ ] rewrite logic so that for sure only 1 read value is written to the fabric fifo (not done) \ No newline at end of file diff --git a/HDL/projects/half_duplex_spi_master/half_duplex_spi_master.sv b/HDL/projects/half_duplex_spi_master/half_duplex_spi_master.sv new file mode 100644 index 00000000..ff8094f7 --- /dev/null +++ b/HDL/projects/half_duplex_spi_master/half_duplex_spi_master.sv @@ -0,0 +1,385 @@ +// half_duplex_spi_master module +// This module implements a half-duplex (bidirectional) SPI master interface with the following features: +// - uses a mask to determine which bits are written or read +// - supports all four SPI modes (CPOL=0, CPHA=0; CPOL=0, CPHA=1; CPOL=1, CPHA=0; CPOL=1, CPHA=1) +// - supports configurable data width +// - supports input of an arbitary spi clock +// - raise an error flag if invalid parameters are used +// Half-duplex SPI is an interface where the data can be written and read using a single wire. +module half_duplex_spi_master #( + parameter DATA_WIDTH = 32, + parameter TRANSACTION_LEN_WIDTH = 6 +)( + input wire [TRANSACTION_LEN_WIDTH-1:0] transaction_length, + input wire [DATA_WIDTH-1:0] transaction_data, + input wire [DATA_WIDTH-1:0] transaction_rw_mask, + output reg [DATA_WIDTH-1:0] transaction_read_data, + + input wire reset_n, + input wire fabric_clk, + input wire spi_clk_in, + + // SPI Mode control + input wire spi_cpol, // Clock polarity + input wire spi_cpha, // Clock phase + + // The 3-wire output + inout wire spi_sdio, + output reg spi_sclk, + output reg spi_cs_n +); + + reg spi_dir; // Direction control for the SPI interface (1 for write, 0 for read) + reg shift_out; // SPI Data to be shifted out + reg r_spi_cpol, r_spi_cpha, spi_cpol_sc, spi_cpha_sc; + + localparam BIT_COUNT_WIDTH = $clog2(DATA_WIDTH); + + // Some of our data in the spi_clk domain + reg [TRANSACTION_LEN_WIDTH-1:0] r_transaction_length; + reg [BIT_COUNT_WIDTH:0] bitcounter_sc, read_bitcounter_sc; + + //reg [DATA_WIDTH-1:0] transaction_rw_mask_sc + reg [DATA_WIDTH-1:0] r_transaction_rw_mask; + //reg [DATA_WIDTH-1:0] transaction_data_sc, + reg [DATA_WIDTH-1:0] r_transaction_data; + reg [DATA_WIDTH-1:0] r_transaction_read_data, f_transaction_read_data; + + reg [2+TRANSACTION_LEN_WIDTH+DATA_WIDTH+DATA_WIDTH-1:0] sc_data, fc_data; + + reg [DATA_WIDTH-1:0] transaction_read_data_sc; + + assign fc_data = {r_spi_cpol, r_spi_cpha, r_transaction_length, r_transaction_rw_mask, r_transaction_data}; + + assign spi_sdio = spi_dir ? shift_out : 1'bz; + + assign transaction_read_data = r_transaction_read_data; + + wire spi_clk; + + reg to_spi_fifo_empty; + + // fabric side state machine states + typedef enum logic [1:0] { + F_IDLE, + F_WRITE, + F_READ, + F_DONE + } fstate_t; + + fstate_t fabric_state; + + // Fabric side state machine + always @(posedge fabric_clk or negedge reset_n) begin + if (~reset_n) begin + to_spi_fifo_wr_en <= 1'b0; + to_fabric_fifo_rd_en <= 1'b0; + fabric_state <= F_IDLE; + r_transaction_length <= 0; + r_transaction_rw_mask <= 0; + r_transaction_data <= 0; + r_spi_cpol <= 0; + r_spi_cpha <= 0; + end else if (fabric_state == F_IDLE) begin + if (transaction_length > 0) begin + fabric_state <= F_WRITE; + to_spi_fifo_wr_en <= 1'b1; + r_transaction_length <= transaction_length; + r_transaction_rw_mask <= transaction_rw_mask; + r_transaction_data <= transaction_data; + r_spi_cpol <= spi_cpol; + r_spi_cpha <= spi_cpha; + end else begin + fabric_state <= F_IDLE; + end + // check if there is something to read + if (~to_fabric_fifo_empty) begin + to_fabric_fifo_rd_en <= 1'b1; + fabric_state <= F_READ; + end else begin + to_fabric_fifo_rd_en <= 1'b0; + end + end else if (fabric_state == F_WRITE) begin + fabric_state <= F_IDLE; + to_spi_fifo_wr_en <= 1'b0; + end else if (fabric_state == F_READ) begin + to_fabric_fifo_rd_en <= 1'b0; + fabric_state <= F_IDLE; + // should also copy the data from the FIFO + r_transaction_read_data <= f_transaction_read_data; + end + end + + // Reset synchronizer + wire reset_n_sc; + + reset_synchronizer reset_sync ( + .reset_n(reset_n), + .clk(spi_clk), + .sync_reset_n(reset_n_sc) + ); + + // I know this is super hacky, but it allows the logic below to look cleaner + assign spi_clk = spi_cpol_sc ? ~spi_clk_in : spi_clk_in; + + reg to_spi_fifo_rd_en, to_spi_fifo_wr_en; + // Instantiate the asynchronous FIFO for the data going to the SPI side + async_fifo #( + .DATA_WIDTH(2+TRANSACTION_LEN_WIDTH+2*DATA_WIDTH), + .ADDR_WIDTH(3) + ) to_spi_fifo ( + .wr_clk(fabric_clk), + .wr_rst_n(reset_n), + .wr_data(fc_data), + .wr_en(to_spi_fifo_wr_en), + .rd_clk(spi_clk), + .rd_rst_n(reset_n), + .rd_data(sc_data), + .rd_en(to_spi_fifo_rd_en), + .empty(to_spi_fifo_empty), + /* verilator lint_off PINCONNECTEMPTY */ + .almost_empty(), + .full(), + .almost_full() + /* verilator lint_on PINCONNECTEMPTY */ + ); + + reg to_fabric_fifo_full, to_fabric_fifo_empty, to_fabric_fifo_wr_en, to_fabric_fifo_rd_en; + + // Instantiate the asynchronous FIFO for the data coming from the SPI side + async_fifo #( + .DATA_WIDTH(DATA_WIDTH), + .ADDR_WIDTH(3) + ) to_fabric_fifo ( + .wr_clk(spi_clk), + .wr_rst_n(reset_n), + .wr_data(transaction_read_data_sc), + .wr_en(to_fabric_fifo_wr_en), + .rd_clk(fabric_clk), + .rd_rst_n(reset_n), + .rd_data(f_transaction_read_data), + .rd_en(to_fabric_fifo_rd_en), + .full(to_fabric_fifo_full), + .empty(to_fabric_fifo_empty), + /* verilator lint_off PINCONNECTEMPTY */ + .almost_empty(), + .almost_full() + /* verilator lint_on PINCONNECTEMPTY */ + ); + + // SPI state machine stuff + typedef enum logic [2:0] { + IDLE, + FIFO_READ, + CS_ASSERT, + READ, + WRITE, + DONE, + FIFO_WRITE + } state_t; + + /* verilator lint_off UNUSEDSIGNAL */ + state_t spi_state, next_spi_state; + /* verilator lint_on UNUSEDSIGNAL */ + + // combinatorial logic to assign the SPI clock + assign spi_sclk = spi_clock_hot ? (spi_cpol_sc ? ~odd_strobe : odd_strobe) : spi_cpol_sc; + + reg spi_clock_hot; + reg [DATA_WIDTH-1:0] shiftout_register, rw_shift_register, shiftin_register; + + assign transaction_read_data_sc = shiftin_register; + + // the even-odd strobe + reg eotoggle; + wire even_strobe, odd_strobe; + assign even_strobe = ~eotoggle; + assign odd_strobe = eotoggle; + + always @(posedge spi_clk or negedge reset_n_sc) begin + if (~reset_n_sc) begin + eotoggle <= 1'b0; + end else begin + eotoggle <= ~eotoggle; + end + end + + // traditional FSM pattern + + always_comb begin + next_spi_state = spi_state; + + case (spi_state) + IDLE: begin + if(~to_spi_fifo_empty) next_spi_state = FIFO_READ; + end + + FIFO_READ: begin + next_spi_state = CS_ASSERT; + end + + CS_ASSERT: begin + if (rw_shift_register[DATA_WIDTH-1]) begin + next_spi_state = WRITE; + end else begin + next_spi_state = READ; + end + end + + WRITE: begin + if (bitcounter_sc == 0) begin + next_spi_state = DONE; + end else if (~rw_shift_register[DATA_WIDTH-1]) begin + next_spi_state = READ; + end + end + + READ: begin + if (bitcounter_sc == 0) begin + next_spi_state = DONE; + end else if (rw_shift_register[DATA_WIDTH-1]) begin + next_spi_state = WRITE; + end + end + + DONE: begin + if (read_bitcounter_sc == 0 || to_fabric_fifo_full) begin + next_spi_state = IDLE; + end else begin + next_spi_state = FIFO_WRITE; + end + end + + FIFO_WRITE: next_spi_state = IDLE; + + default: next_spi_state = IDLE; + endcase + end + + always_ff @(posedge spi_clk or negedge reset_n_sc) begin + if (~reset_n_sc) begin + spi_dir <= 1'b1; + shift_out <= 1'b0; + spi_cs_n <= 1'b1; + to_spi_fifo_rd_en <= 1'b0; + to_fabric_fifo_wr_en <= 1'b0; + spi_state <= IDLE; + spi_clock_hot <= 1'b0; + read_bitcounter_sc <= 0; + shiftin_register <= 0; + // pickup the mode on reset + spi_cpol_sc <= spi_cpol; + spi_cpha_sc <= spi_cpha; + end else begin + if (spi_state == IDLE) begin + to_fabric_fifo_wr_en <= 1'b0; + shift_out <= 1'b0; + spi_cs_n <= 1'b1; + read_bitcounter_sc <= 0; + shiftin_register <= 0; + if(~to_spi_fifo_empty) begin + spi_state <= FIFO_READ; + to_spi_fifo_rd_en <= 1'b1; // assert the read enable + end else begin + spi_state <= IDLE; + end + end else if (spi_state == FIFO_READ) begin + spi_state <= CS_ASSERT; + to_spi_fifo_rd_en <= 1'b0; // deassert the read enable + // copy the data from the fifo + spi_cpol_sc <= sc_data[TRANSACTION_LEN_WIDTH+DATA_WIDTH+DATA_WIDTH+1]; + spi_cpha_sc <= sc_data[TRANSACTION_LEN_WIDTH+DATA_WIDTH+DATA_WIDTH]; + bitcounter_sc <= sc_data[TRANSACTION_LEN_WIDTH+DATA_WIDTH+DATA_WIDTH-1:DATA_WIDTH+DATA_WIDTH]; + shiftout_register <= sc_data[DATA_WIDTH-1:0]; + rw_shift_register <= sc_data[DATA_WIDTH+DATA_WIDTH-1:DATA_WIDTH]; + end else if (spi_state == CS_ASSERT) begin + if (rw_shift_register[DATA_WIDTH-1]) begin + spi_state <= WRITE; + end else begin + spi_state <= READ; + end + spi_cs_n <= 1'b0; + spi_clock_hot <= 1'b1; + + // deal with the write case for Mode 0 & 2, I doubt there is a read case here + // at all directly after CS is asserted + if (odd_strobe && ~spi_cpha_sc && spi_dir) begin + spi_dir <= rw_shift_register[DATA_WIDTH-1]; + rw_shift_register <= {rw_shift_register[DATA_WIDTH-2:0], 1'b0}; + + shift_out <= shiftout_register[DATA_WIDTH-1]; + shiftout_register <= {shiftout_register[DATA_WIDTH-2:0],1'b0}; + shiftin_register <= {shiftin_register[DATA_WIDTH-2:0],1'b0}; + if (spi_dir == rw_shift_register[DATA_WIDTH-1]) begin + bitcounter_sc <= bitcounter_sc - 1; + end + end + + end else if (spi_state == WRITE) begin + if (bitcounter_sc == 0) begin + spi_state <= DONE; + end else begin + spi_state <= WRITE; + end + + // all valid transitions that advance the state machine + if ((even_strobe && spi_cpha_sc) || (odd_strobe && ~spi_cpha_sc)) begin + spi_dir <= rw_shift_register[DATA_WIDTH-1]; + rw_shift_register <= {rw_shift_register[DATA_WIDTH-2:0], 1'b0}; + if (rw_shift_register[DATA_WIDTH-1]) begin + // only decrement when direction stays the same + bitcounter_sc <= bitcounter_sc - 1; + end else begin + spi_state <= READ; + end + end + + if (((even_strobe && spi_cpha_sc) || (odd_strobe && ~spi_cpha_sc)) && rw_shift_register[DATA_WIDTH-1]) begin + shift_out <= shiftout_register[DATA_WIDTH-1]; + shiftout_register <= {shiftout_register[DATA_WIDTH-2:0],1'b0}; + shiftin_register <= {shiftin_register[DATA_WIDTH-2:0],1'b0}; + end + + end else if (spi_state == READ) begin + if (bitcounter_sc == 0) begin + spi_state <= DONE; + end else begin + spi_state <= READ; + end + + if ((even_strobe && ~spi_cpha_sc) || (odd_strobe && spi_cpha_sc)) begin + read_bitcounter_sc <= read_bitcounter_sc + 1; + shiftin_register <= {shiftin_register[DATA_WIDTH-2:0],1'b1}; + bitcounter_sc <= bitcounter_sc - 1; + if (~rw_shift_register[DATA_WIDTH-1]) begin + spi_dir <= rw_shift_register[DATA_WIDTH-1]; + rw_shift_register <= {rw_shift_register[DATA_WIDTH-2:0], 1'b0}; + end else begin + spi_state <= WRITE; + end + end + + end else if (spi_state == DONE) begin + if (even_strobe) begin + shift_out <= 1'b0; + spi_clock_hot <= 1'b0; + spi_dir <= 1'b1; + spi_cs_n <= 1'b1; + if (read_bitcounter_sc == 0 || to_fabric_fifo_full) begin + spi_state <= IDLE; + to_fabric_fifo_wr_en <= 1'b0; + end else begin + spi_state <= FIFO_WRITE; + to_fabric_fifo_wr_en <= 1'b1; + end + end + end else if (spi_state == FIFO_WRITE) begin + if (even_strobe) begin + spi_state <= IDLE; + to_fabric_fifo_wr_en <= 1'b0; + end + end + end + end + + endmodule diff --git a/HDL/projects/half_duplex_spi_master/half_duplex_spi_master_clkdiv.sv b/HDL/projects/half_duplex_spi_master/half_duplex_spi_master_clkdiv.sv new file mode 100644 index 00000000..128e2a10 --- /dev/null +++ b/HDL/projects/half_duplex_spi_master/half_duplex_spi_master_clkdiv.sv @@ -0,0 +1,56 @@ +/* a top level module with built-in clock divider */ +module half_duplex_spi_master_clkdiv #( + parameter DATA_WIDTH = 32, + parameter TRANSACTION_LEN_WIDTH = 6, + parameter CLOCK_DIVIDER = 1 +)( + input wire [TRANSACTION_LEN_WIDTH-1:0] transaction_length, + input wire [DATA_WIDTH-1:0] transaction_data, + input wire [DATA_WIDTH-1:0] transaction_rw_mask, + output reg [DATA_WIDTH-1:0] transaction_read_data, + + input wire reset_n, + input wire fabric_clk, + + // SPI Mode control + input wire spi_cpol, // Clock polarity + input wire spi_cpha, // Clock phase + + inout wire spi_sdio, + output reg spi_sclk, + output reg spi_cs_n +); + +wire spi_clk_gen; + +// Generate the clocks +quadrature_clock_divider clock_div ( + .reset_n(reset_n), + .clk_in(fabric_clk), + .div_factor_4(CLOCK_DIVIDER), + .sck_0(spi_clk_gen), + /* verilator lint_off PINCONNECTEMPTY */ + .sck_90() + /* verilator lint_on PINCONNECTEMPTY */ + ); + +// Instantiate the spi_master core +half_duplex_spi_master #( + .DATA_WIDTH(DATA_WIDTH), .TRANSACTION_LEN_WIDTH(TRANSACTION_LEN_WIDTH) +) hdsm ( + .transaction_length(transaction_length), + .transaction_data(transaction_data), + .transaction_rw_mask(transaction_rw_mask), + .transaction_read_data(transaction_read_data), + .reset_n(reset_n), + .fabric_clk(fabric_clk), + .spi_clk_in(spi_clk_gen), + .spi_cpol(spi_cpol), + .spi_cpha(spi_cpha), + + .spi_sdio(spi_sdio), + .spi_sclk(spi_sclk), + .spi_cs_n(spi_cs_n) +); + +endmodule diff --git a/HDL/projects/half_duplex_spi_master/half_duplex_spi_master_tb.cpp b/HDL/projects/half_duplex_spi_master/half_duplex_spi_master_tb.cpp new file mode 100644 index 00000000..72e68b2c --- /dev/null +++ b/HDL/projects/half_duplex_spi_master/half_duplex_spi_master_tb.cpp @@ -0,0 +1,833 @@ +// main.cpp +#include "Vhalf_duplex_spi_master_clkdiv.h" +#include "verilated.h" +#include "verilated_vcd_c.h" +#include +#include + +int main(int argc, char **argv) +{ + Verilated::commandArgs(argc, argv); + + // Instantiate the top module + Vhalf_duplex_spi_master_clkdiv *top = new Vhalf_duplex_spi_master_clkdiv; + + // Initialize simulation inputs + top->transaction_length = 0; + top->transaction_data = 0; + top->transaction_rw_mask = 0; + top->transaction_read_data = 0; + top->reset_n = 0; + top->fabric_clk = 0; + top->spi_cpol = 0; + top->spi_cpha = 0; + top->spi_sdio = 0; + + // Variables for simulation + vluint64_t main_time = 0; // Current simulation time + const vluint64_t sim_time_reset_n_clock = 100; // Adjust as needed + const vluint64_t sim_load_value_fifo = 600; // Adjust as needed + const vluint64_t sim_load_value_fifo_32 = 700; // Adjust as needed + + // Open VCD dump file + Verilated::traceEverOn(true); + VerilatedVcdC *tfp = new VerilatedVcdC; + VerilatedVcdC *tfp2 = new VerilatedVcdC; + VerilatedVcdC *tfp3 = new VerilatedVcdC; + VerilatedVcdC *tfp4 = new VerilatedVcdC; + VerilatedVcdC *tfp5 = new VerilatedVcdC; + VerilatedVcdC *tfp6 = new VerilatedVcdC; + VerilatedVcdC *tfp7 = new VerilatedVcdC; + VerilatedVcdC *tfp8 = new VerilatedVcdC; + VerilatedVcdC *tfp9 = new VerilatedVcdC; + VerilatedVcdC *tfp10 = new VerilatedVcdC; + VerilatedVcdC *tfp11 = new VerilatedVcdC; + VerilatedVcdC *tfp12 = new VerilatedVcdC; + VerilatedVcdC *tfp13 = new VerilatedVcdC; + VerilatedVcdC *tfp14 = new VerilatedVcdC; + VerilatedVcdC *tfp15 = new VerilatedVcdC; + VerilatedVcdC *tfp16 = new VerilatedVcdC; + VerilatedVcdC *tfp17 = new VerilatedVcdC; + VerilatedVcdC *tfp18 = new VerilatedVcdC; + VerilatedVcdC *tfp19 = new VerilatedVcdC; + VerilatedVcdC *tfp20 = new VerilatedVcdC; + + top->trace(tfp, 99); // Trace 99 levels of hierarchy + tfp->open("sim_reset_n_clock.vcd"); + top->reset_n = 0; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_time_reset_n_clock) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp->dump(main_time); // Dump signals to VCD file + + main_time++; + } + + // Cleanup sim file + tfp->close(); + + top->trace(tfp2, 99); // Trace 99 levels of hierarchy + tfp2->open("sim_load_value_mode0.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 0; + top->spi_cpha = 0; + + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp2->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo) + { + if (main_time == 20) + { + top->transaction_length = 24; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0x00FFFFFF; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp2->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp2->close(); + + top->trace(tfp3, 99); // Trace 99 levels of hierarchy + tfp3->open("sim_load_value_mode1.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 0; + top->spi_cpha = 1; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp3->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo) + { + if (main_time == 20) + { + top->transaction_length = 24; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0x00FFFFFF; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp3->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp3->close(); + + top->trace(tfp4, 99); // Trace 99 levels of hierarchy + tfp4->open("sim_load_value_mode2.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 1; + top->spi_cpha = 0; + + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp4->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo) + { + if (main_time == 20) + { + top->transaction_length = 24; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0x00FFFFFF; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp4->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp4->close(); + + top->trace(tfp5, 99); // Trace 99 levels of hierarchy + tfp5->open("sim_load_value_mode3.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 1; + top->spi_cpha = 1; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp5->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo) + { + if (main_time == 20) + { + top->transaction_length = 24; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0x00FFFFFF; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp5->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp5->close(); + + top->trace(tfp6, 99); // Trace 99 levels of hierarchy + tfp6->open("sim_load_value_32w_mode0.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 0; + top->spi_cpha = 0; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp6->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 20) + { + top->transaction_length = 32; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0xFFFFFFFF; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp6->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp6->close(); + + top->trace(tfp7, 99); // Trace 99 levels of hierarchy + tfp7->open("sim_load_value_24w_8r_mode0.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 0; + top->spi_cpha = 0; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp7->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 20) + { + top->transaction_length = 32; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0xFFFFFF00; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp7->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp7->close(); + + top->trace(tfp8, 99); // Trace 99 levels of hierarchy + tfp8->open("sim_load_value_24w_8r_mode1.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 0; + top->spi_cpha = 1; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp8->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 20) + { + top->transaction_length = 32; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0xFFFFFF00; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp8->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp8->close(); + + top->trace(tfp9, 99); // Trace 99 levels of hierarchy + tfp9->open("sim_load_value_24w_8r_mode2.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 1; + top->spi_cpha = 0; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp9->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 20) + { + top->transaction_length = 32; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0xFFFFFF00; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp9->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp9->close(); + + top->trace(tfp10, 99); // Trace 99 levels of hierarchy + tfp10->open("sim_load_value_24w_8r_mode3.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 1; + top->spi_cpha = 1; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp10->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 20) + { + top->transaction_length = 32; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0xFFFFFF00; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp10->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp10->close(); + + /* this test case is unrealistic, as reading before writing doesn't make any + sense in most practical scenarios, nevertheless it should work */ + top->trace(tfp11, 99); // Trace 99 levels of hierarchy + tfp11->open("sim_load_value_24r_8w_mode0.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 0; + top->spi_cpha = 0; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp11->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 20) + { + top->transaction_length = 32; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0x000000FF; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp11->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp11->close(); + + top->trace(tfp15, 99); // Trace 99 levels of hierarchy + tfp15->open("sim_load_value_24r_8w_mode1.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 0; + top->spi_cpha = 1; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp15->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 20) + { + top->transaction_length = 32; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0x000000FF; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp15->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp15->close(); + + top->trace(tfp16, 99); // Trace 99 levels of hierarchy + tfp16->open("sim_load_value_24r_8w_mode2.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 1; + top->spi_cpha = 0; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp16->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 20) + { + top->transaction_length = 32; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0x000000FF; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp16->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp16->close(); + + top->trace(tfp17, 99); // Trace 99 levels of hierarchy + tfp17->open("sim_load_value_24r_8w_mode3.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 1; + top->spi_cpha = 1; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp17->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 20) + { + top->transaction_length = 32; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0x000000FF; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp17->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp17->close(); + + top->trace(tfp12, 99); // Trace 99 levels of hierarchy + tfp12->open("sim_load_value_32w_mode1.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 0; + top->spi_cpha = 1; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp12->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 20) + { + top->transaction_length = 32; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0xFFFFFFFF; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp12->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp12->close(); + + top->trace(tfp13, 99); // Trace 99 levels of hierarchy + tfp13->open("sim_load_value_32w_mode2.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 1; + top->spi_cpha = 0; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp13->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 20) + { + top->transaction_length = 32; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0xFFFFFFFF; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp13->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp13->close(); + + top->trace(tfp14, 99); // Trace 99 levels of hierarchy + tfp14->open("sim_load_value_32w_mode3.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 1; + top->spi_cpha = 1; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp14->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 20) + { + top->transaction_length = 32; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0xFFFFFFFF; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp14->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp14->close(); + + /* this test case is unrealistic, as reading before writing doesn't make any + sense in most practical scenarios, nevertheless it should work */ + top->trace(tfp18, 99); // Trace 99 levels of hierarchy + tfp18->open("sim_load_value_32inter_mode0.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 0; + top->spi_cpha = 0; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp18->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 20) + { + top->transaction_length = 32; + top->transaction_data = 0xFFFFFFFF; + top->transaction_rw_mask = 0xAAAAAAAA; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp18->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp18->close(); + + /* this test case is unrealistic, as reading before writing doesn't make any + sense in most practical scenarios, nevertheless it should work */ + top->trace(tfp19, 99); // Trace 99 levels of hierarchy + tfp19->open("sim_load_value_32interb_mode0.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 0; + top->spi_cpha = 0; + // Reset sequence + while (main_time < 20) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp19->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 20) + { + top->transaction_length = 32; + top->transaction_data = 0xFFFFFFFF; + top->transaction_rw_mask = 0x55555555; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp19->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp19->close(); + + top->trace(tfp20, 99); // Trace 99 levels of hierarchy + tfp20->open("sim_load_value_24w_8r_21reset_mode0.vcd"); + main_time = 0; // Reset time + top->reset_n = 0; + top->spi_cpol = 0; + top->spi_cpha = 0; + // Reset sequence + while (main_time < 22) + { + top->fabric_clk = !top->fabric_clk; + top->eval(); + tfp20->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_load_value_fifo_32) + { + if (main_time == 22) + { + top->transaction_length = 32; + top->transaction_data = 0xAAA00F0F; + top->transaction_rw_mask = 0xFFFFFF00; + } + else + { + top->transaction_length = 0; + top->transaction_data = 0x00000000; + top->transaction_rw_mask = 0x00000000; + } + + top->fabric_clk = !top->fabric_clk; + top->eval(); // Evaluate model + tfp20->dump(main_time); // Dump signals to VCD file + + main_time++; + } + // cleanup sim file + tfp20->close(); + + delete top; + return 0; +} diff --git a/HDL/projects/half_duplex_spi_master/surfer_load_data_rw.ron b/HDL/projects/half_duplex_spi_master/surfer_load_data_rw.ron new file mode 100644 index 00000000..26dbc901 --- /dev/null +++ b/HDL/projects/half_duplex_spi_master/surfer_load_data_rw.ron @@ -0,0 +1,454 @@ +( + show_hierarchy: None, + show_menu: None, + show_ticks: None, + show_toolbar: None, + show_tooltip: None, + show_overview: None, + show_statusbar: None, + align_names_right: None, + show_variable_indices: None, + show_variable_direction: None, + show_empty_scopes: None, + show_parameters_in_scopes: None, + waves: Some(( + source: File("sim_load_value_24w_8rbit_mode0.vcd"), + format: Vcd, + active_scope: Some(WaveScope(( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ))), + displayed_items_order: [ + (1), + (2), + (5), + (6), + (7), + (9), + (10), + (12), + (14), + (13), + (15), + (16), + (17), + (18), + (19), + (20), + (21), + (22), + (23), + ], + displayed_items: { + (10): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "to_spi_fifo_rd_en", + ), + color: None, + background_color: None, + display_name: "to_spi_fifo_rd_en", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (7): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "to_spi_fifo_empty", + ), + color: None, + background_color: None, + display_name: "to_spi_fifo_empty", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (2): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + ], + ), + name: "fabric_clk", + ), + color: None, + background_color: None, + display_name: "fabric_clk", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (13): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "spi_sdio", + ), + color: Some("blue"), + background_color: None, + display_name: "spi_sdio", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (9): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "spi_clk", + ), + color: Some("yellow"), + background_color: None, + display_name: "spi_clk", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (5): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "to_spi_fifo_wr_en", + ), + color: None, + background_color: None, + display_name: "to_spi_fifo_wr_en", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (19): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "transaction_read_data_sc", + ), + color: None, + background_color: None, + display_name: "transaction_read_data_sc [31:0]", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (21): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "to_fabric_fifo_empty", + ), + color: None, + background_color: None, + display_name: "to_fabric_fifo_empty", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (1): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + ], + ), + name: "reset_n", + ), + color: None, + background_color: None, + display_name: "reset_n", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (16): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "spi_state", + ), + color: None, + background_color: None, + display_name: "spi_state [2:0]", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (23): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "transaction_read_data", + ), + color: None, + background_color: None, + display_name: "transaction_read_data [31:0]", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (18): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "read_bitcounter_sc", + ), + color: Some("violet"), + background_color: None, + display_name: "read_bitcounter_sc [5:0]", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (6): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + "to_spi_fifo", + "mem", + ], + ), + name: "[0]", + ), + color: None, + background_color: None, + display_name: "[0] [69:0]", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (15): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "spi_dir", + ), + color: None, + background_color: None, + display_name: "spi_dir", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (14): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "spi_sclk", + ), + color: Some("red"), + background_color: None, + display_name: "spi_sclk", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (20): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "to_fabric_fifo_wr_en", + ), + color: None, + background_color: None, + display_name: "to_fabric_fifo_wr_en", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (22): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "to_fabric_fifo_rd_en", + ), + color: None, + background_color: None, + display_name: "to_fabric_fifo_rd_en", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + (17): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "bitcounter_sc", + ), + color: None, + background_color: None, + display_name: "bitcounter_sc [5:0]", + display_name_type: Unique, + manual_name: None, + format: Some("Unsigned"), + field_formats: [], + )), + (12): Variable(( + variable_ref: ( + path: ( + strs: [ + "TOP", + "half_duplex_spi_master_clkdiv", + "hdsm", + ], + ), + name: "spi_cs_n", + ), + color: Some("red"), + background_color: None, + display_name: "spi_cs_n", + display_name_type: Unique, + manual_name: None, + format: None, + field_formats: [], + )), + }, + display_item_ref_counter: 23, + viewports: [ + ( + curr_left: (0.22314915249669653), + curr_right: (1.3251333489443518), + target_left: (0.0), + target_right: (1.0), + move_start_left: (0.0), + move_start_right: (1.0), + move_duration: None, + move_strategy: Instant, + ), + ], + cursor: Some((1, [ + 406, + ])), + markers: {}, + focused_item: Some((2)), + focused_transaction: (None, None), + selected_items: [], + default_variable_name_type: Unique, + scroll_offset: 0.0, + display_variable_indices: true, + graphics: {}, + )), + drag_started: false, + drag_source_idx: None, + drag_target_idx: None, + previous_waves: None, + count: None, + blacklisted_translators: [], + show_about: false, + show_keys: false, + show_gestures: false, + show_quick_start: false, + show_license: false, + show_performance: false, + show_logs: false, + show_cursor_window: false, + wanted_timeunit: PicoSeconds, + time_string_format: None, + show_url_entry: false, + variable_name_filter_focused: false, + variable_name_filter_type: Fuzzy, + variable_name_filter_case_insensitive: true, + rename_target: None, + sidepanel_width: Some(300.0), + ui_zoom_factor: None, +) \ No newline at end of file diff --git a/HDL/projects/quadrature_clock_divider/Makefile b/HDL/projects/quadrature_clock_divider/Makefile new file mode 100644 index 00000000..414a75a8 --- /dev/null +++ b/HDL/projects/quadrature_clock_divider/Makefile @@ -0,0 +1,21 @@ +VERILATOR = verilator +TOP_MODULE = quadrature_clock_divider +VERILATED = obj_dir/V$(TOP_MODULE) + +SRC_FILES = quadrature_clock_divider.sv +CPP_FILES = quadrature_clock_divider_tb.cpp + +all: sim + +sim: $(VERILATED) + ./$(VERILATED) + +$(VERILATED): $(SRC_FILES) $(CPP_FILES) + $(VERILATOR) -Wall --cc $(SRC_FILES) --exe $(CPP_FILES) --top-module $(TOP_MODULE) --trace --timing + make -C obj_dir -f V$(TOP_MODULE).mk V$(TOP_MODULE) + +clean: + rm -rf obj_dir + rm -f sim.vcd + +.PHONY: all sim clean diff --git a/HDL/projects/quadrature_clock_divider/quadrature_clock_divider.sv b/HDL/projects/quadrature_clock_divider/quadrature_clock_divider.sv new file mode 100644 index 00000000..ec37ee96 --- /dev/null +++ b/HDL/projects/quadrature_clock_divider/quadrature_clock_divider.sv @@ -0,0 +1,58 @@ +// this divider uses the counts per quarter cycle to ensure the division is always valid +// the application for this simple module is the generation of quadrature clocks that are +// divided from a fast input clock. +// The bit-width of the division factor is configurable for this module and refers to the +// number of bits in the quarter cycle count +// Common applications are SPI buses for example. +module quadrature_clock_divider #( + parameter DIVIDER_WIDTH = 8 +)( + input wire clk_in, // Fast input clock + input wire reset_n, // Reset signal + input wire [DIVIDER_WIDTH-1:0] div_factor_4, // Division factor as multiplier to 4 + // or "counts per quarter cycle" + output reg sck_0, // 0-degree phase clock + output reg sck_90 // 90-degree phase-shifted clock +); + + reg [DIVIDER_WIDTH+1:0] counter; // Counter for clock division + reg [DIVIDER_WIDTH+1:0] half_cycle; // Half-cycle count for 50% duty cycle + reg [DIVIDER_WIDTH+1:0] quarter_cycle; // Quarter-cycle count for 90-degree shift + reg [DIVIDER_WIDTH+1:0] zero; + + always @(posedge clk_in or negedge reset_n) begin + if (~reset_n) begin + counter <= 0; + sck_0 <= 0; + sck_90 <= 0; + zero <= 0; + half_cycle <= {1'b0, div_factor_4, 1'b0}; // 50% duty cycle + quarter_cycle <= {2'b00, div_factor_4}; // 90-degree phase shift + end else begin + // Calculate half and quarter cycles based on the division factor + half_cycle <= {1'b0, div_factor_4, 1'b0}; // 50% duty cycle + quarter_cycle <= {2'b00, div_factor_4}; // 90-degree phase shift + + // Counter logic to generate sck_0 and sck_90 + if (counter >= {div_factor_4, 2'b00} - 1) begin + counter <= 0; // Reset counter at the end of the cycle + end else begin + counter <= counter + 1; + end + + // Generate sck_0 and sck_90 based on counter values + if (counter >= zero && counter < half_cycle) begin + sck_0 <= 1; + end else begin + sck_0 <= 0; + end + + if (counter >= quarter_cycle && counter < half_cycle + quarter_cycle) begin + sck_90 <= 1; + end else begin + sck_90 <= 0; + end + end + end +endmodule + diff --git a/HDL/projects/quadrature_clock_divider/quadrature_clock_divider_tb.cpp b/HDL/projects/quadrature_clock_divider/quadrature_clock_divider_tb.cpp new file mode 100644 index 00000000..bd1752a6 --- /dev/null +++ b/HDL/projects/quadrature_clock_divider/quadrature_clock_divider_tb.cpp @@ -0,0 +1,56 @@ +// main.cpp +#include "Vquadrature_clock_divider.h" +#include "verilated.h" +#include "verilated_vcd_c.h" +#include +#include + +int main(int argc, char **argv) +{ + Verilated::commandArgs(argc, argv); + + // Instantiate the top module + Vquadrature_clock_divider *top = new Vquadrature_clock_divider; + + // Initialize simulation inputs + top->reset_n = 0; + top->div_factor_4 = 1; + // Variables for simulation + vluint64_t main_time = 0; // Current simulation time + const vluint64_t sim_time = 4000000; // Adjust as needed + + // Open VCD dump file + Verilated::traceEverOn(true); + VerilatedVcdC *tfp = new VerilatedVcdC; + top->trace(tfp, 99); // Trace 99 levels of hierarchy + tfp->open("sim.vcd"); + + // Reset sequence + while (main_time < 20) + { + top->clk_in = !top->clk_in; + top->eval(); + tfp->dump(main_time); + main_time++; + } + top->reset_n = 1; + + while (main_time < sim_time) + { + // Toggle clocks + if ((main_time % 5) == 0) + { + top->clk_in = !top->clk_in; + } + + top->eval(); // Evaluate model + tfp->dump(main_time); // Dump signals to VCD file + + main_time++; + } + + // Cleanup + tfp->close(); + delete top; + return 0; +} diff --git a/HDL/projects/reset_synchronizer/reset_synchronizer.sv b/HDL/projects/reset_synchronizer/reset_synchronizer.sv new file mode 100644 index 00000000..b87ce198 --- /dev/null +++ b/HDL/projects/reset_synchronizer/reset_synchronizer.sv @@ -0,0 +1,19 @@ +// A reset synchronizer synchronizes the deassertion of reset with respect to the clock domain. +// In other words, a reset synchronizer manipulates the asynchronous reset to have synchronous deassertion. + +module reset_synchronizer ( + input wire reset_n, + input wire clk, + output reg sync_reset_n +); + reg Q1; + always @ (posedge clk or negedge reset_n) begin + if(~reset_n) begin + Q1 <= 1'b0; + sync_reset_n <= 1'b0; + end else begin + Q1 <= 1'b1; + sync_reset_n <= Q1; + end + end +endmodule diff --git a/HDL/projects/spi_clock_generator/Makefile b/HDL/projects/spi_clock_generator/Makefile new file mode 100644 index 00000000..9b96c193 --- /dev/null +++ b/HDL/projects/spi_clock_generator/Makefile @@ -0,0 +1,21 @@ +VERILATOR = verilator +TOP_MODULE = spi_clock_generator +VERILATED = obj_dir/V$(TOP_MODULE) + +SRC_FILES = spi_clock_generator.sv +CPP_FILES = spi_clock_generator_tb.cpp + +all: sim + +sim: $(VERILATED) + ./$(VERILATED) + +$(VERILATED): $(SRC_FILES) $(CPP_FILES) + $(VERILATOR) -Wall --cc $(SRC_FILES) --exe $(CPP_FILES) --top-module $(TOP_MODULE) --trace --timing + make -C obj_dir -f V$(TOP_MODULE).mk V$(TOP_MODULE) + +clean: + rm -rf obj_dir + rm -f sim.vcd + +.PHONY: all sim clean diff --git a/HDL/projects/spi_clock_generator/spi_clock_generator.sv b/HDL/projects/spi_clock_generator/spi_clock_generator.sv new file mode 100644 index 00000000..39d3e2b7 --- /dev/null +++ b/HDL/projects/spi_clock_generator/spi_clock_generator.sv @@ -0,0 +1,31 @@ +module spi_clock_generator ( + input wire clk_0, // External clock (0° phase) + input wire clk_90, // External clock (90° phase) + input wire cpol, // Clock Polarity + input wire cpha, // Clock Phase + output logic spi_clk, // Generated SPI clock + output logic shift_clk // Data shift clock +); + + // Generate spi_clk based on cpol + always_comb begin + if (cpol == 0) begin + if (cpha == 0) begin + spi_clk = clk_90; // SPI mode 0 + shift_clk = clk_0; + end else begin + spi_clk = clk_0; // SPI mode 1 + shift_clk = clk_90; + end + end else begin + if (cpha == 0) begin + spi_clk = ~clk_90; // SPI mode 2 + shift_clk = clk_0; + end else begin + spi_clk = ~clk_0; // SPI mode 3 + shift_clk = clk_90; + end + end + end + +endmodule diff --git a/HDL/projects/spi_clock_generator/spi_clock_generator_tb.cpp b/HDL/projects/spi_clock_generator/spi_clock_generator_tb.cpp new file mode 100644 index 00000000..3043882b --- /dev/null +++ b/HDL/projects/spi_clock_generator/spi_clock_generator_tb.cpp @@ -0,0 +1,76 @@ +#include +#include +#include +#include "Vspi_clock_generator.h" // Include the generated Verilator header + +// Define clock signal generation helper +void toggle_clock(bool &clk) +{ + clk = !clk; +} + +int main(int argc, char **argv) +{ + Verilated::commandArgs(argc, argv); + Verilated::traceEverOn(true); + + // Instantiate the DUT (Device Under Test) + Vspi_clock_generator *dut = new Vspi_clock_generator; + + // Initialize trace file + VerilatedVcdC *vcd = new VerilatedVcdC; + dut->trace(vcd, 10); + vcd->open("spi_clock_generator.vcd"); + + // Simulation variables + bool clk_0 = 0; // Clock signal (0° phase) + bool clk_90 = 0; // Clock signal (90° phase) + int clk_0_count = 0; + + // Test CPOL and CPHA configurations + // The way of doing these tests is causing ugly glitches in the cpol=1 case + for (int cpol = 0; cpol <= 1; ++cpol) + { + for (int cpha = 0; cpha <= 1; ++cpha) + { + // Initialize DUT inputs + dut->cpol = cpol; + dut->cpha = cpha; + + // Run simulation for a few clock cycles + for (int i = 0; i < 20; ++i) + { + // Toggle clocks + if (clk_0_count % 2 == 0) + toggle_clock(clk_0); + if (clk_0_count % 2 == 1) + toggle_clock(clk_90); // 90° phase assumes clk_90 toggles half as often + + // Drive inputs + dut->clk_0 = clk_0; + dut->clk_90 = clk_90; + + // Evaluate the DUT + dut->eval(); + vcd->dump(clk_0_count); + // Print results + std::cout << "CPOL: " << cpol + << " CPHA: " << cpha + << " clk_0: " << clk_0 + << " clk_90: " << clk_90 + << " spi_clk: " << (dut->spi_clk ? "1" : "0") + << " shift_clk: " << (dut->shift_clk ? "1" : "0") + << std::endl; + + // Increment clock cycle count + clk_0_count++; + } + } + } + + // Cleanup + dut->final(); + vcd->close(); + delete dut; + return 0; +} \ No newline at end of file diff --git a/HDL/scripts/Vivado_ocra_init.tcl b/HDL/scripts/Vivado_ocra_init.tcl index 29c658d2..7fb736f1 100644 --- a/HDL/scripts/Vivado_ocra_init.tcl +++ b/HDL/scripts/Vivado_ocra_init.tcl @@ -1,4 +1,4 @@ # source this from your Vivado_init.tcl set ocra_dir $::env(OCRA_DIR) -set_param board.repoPaths [list ${ocra_dir}/HDL/boards/snickerdoodle_black/brd/1.0/ ${ocra_dir}/HDL/boards/stemlab_125_14/brd/1.1/ ${ocra_dir}/HDL/boards/stemlab_122_16/brd/1.0/ ] +set_param board.repoPaths [list ${ocra_dir}/HDL/boards/snickerdoodle_black/brd/1.0/ ${ocra_dir}/HDL/boards/stemlab_125_14/brd/1.1/ ${ocra_dir}/HDL/boards/stemlab_122_16/brd/1.0/ ${ocra_dir}/HDL/boards/eclypse_z7/brd/A.0/ ${ocra_dir}/HDL/boards/eclypse_z7/brd/B.0/ ${ocra_dir}/HDL/boards/zub1cg/brd/1.2/] diff --git a/HDL/scripts/app_cpu1.tcl b/HDL/scripts/app_cpu1.tcl deleted file mode 100644 index 8fda3259..00000000 --- a/HDL/scripts/app_cpu1.tcl +++ /dev/null @@ -1,22 +0,0 @@ - -set project_name [lindex $argv 0] - -set proc_name ps7_cortexa9_1 - -set hard_path tmp/$project_name.hard -set cpu1_path tmp/$project_name.cpu1 - -file mkdir $hard_path -file copy -force tmp/$project_name.hwdef $hard_path/$project_name.hdf - -open_hw_design $hard_path/$project_name.hdf -create_sw_design -proc $proc_name -os standalone system - -set_property CONFIG.stdin {none} [get_os] -set_property CONFIG.stdout {none} [get_os] - -set_property CONFIG.extra_compiler_flags { -g -DUSE_AMP=1 -DSTDOUT_REDIR=1} [get_sw_processor] - -generate_bsp -proc $proc_name -dir $cpu1_path/app_cpu1_bsp - -close_hw_design [current_hw_design] diff --git a/HDL/scripts/debian-ecosystem.sh b/HDL/scripts/debian-ecosystem.sh deleted file mode 100644 index 82a00453..00000000 --- a/HDL/scripts/debian-ecosystem.sh +++ /dev/null @@ -1,338 +0,0 @@ -device=$1 - -boot_dir=`mktemp -d /tmp/BOOT.XXXXXXXXXX` -root_dir=`mktemp -d /tmp/ROOT.XXXXXXXXXX` - -ecosystem_tar=red-pitaya-ecosystem-0.95-20160526.tgz -ecosystem_url=https://www.dropbox.com/sh/5fy49wae6xwxa8a/AADrueq0P1OJFy9z6AaJ72nWa/red-pitaya-ecosystem/red-pitaya-ecosystem-0.95-20160526.tgz?dl=1 - -# Choose mirror automatically, depending the geographic and network location -mirror=http://httpredir.debian.org/debian - -distro=jessie -arch=armhf - -hostapd_url=https://www.dropbox.com/sh/5fy49wae6xwxa8a/AAAQHa5NkpLYFocaOrrnft-Pa/rtl8192cu/hostapd-armhf?dl=1 - -passwd=changeme -timezone=Europe/Brussels - -# Create partitions - -parted -s $device mklabel msdos -parted -s $device mkpart primary fat16 4MB 16MB -parted -s $device mkpart primary ext4 16MB 100% - -boot_dev=/dev/`lsblk -lno NAME $device | sed '2!d'` -root_dev=/dev/`lsblk -lno NAME $device | sed '3!d'` - -# Create file systems - -mkfs.vfat -v $boot_dev -mkfs.ext4 -F -j $root_dev - -# Mount file systems - -mount $boot_dev $boot_dir -mount $root_dev $root_dir - -# Copy files to the boot file system - -cp boot.bin devicetree.dtb uImage uEnv.txt $boot_dir - -# Install Debian base system to the root file system - -debootstrap --foreign --arch $arch $distro $root_dir $mirror - -# Add missing configuration files and packages - -cp /etc/resolv.conf $root_dir/etc/ -cp /usr/bin/qemu-arm-static $root_dir/usr/bin/ - -cp patches/fw_env.config $root_dir/etc/ - -mkdir -p $root_dir/usr/local/bin -cp fw_printenv $root_dir/usr/local/bin/fw_printenv -cp fw_printenv $root_dir/usr/local/bin/fw_setenv - -mkdir -p $root_dir/usr/local/sbin -curl -L $hostapd_url -o $root_dir/usr/local/sbin/hostapd -chmod +x $root_dir/usr/local/sbin/hostapd - -test -f $ecosystem_tar || curl -L $ecosystem_url -o $ecosystem_tar - -mkdir -p $root_dir/var/log/nginx -mkdir -p $root_dir/var/log/redpitaya_nginx -mkdir -p $root_dir/opt -tar -zxf $ecosystem_tar --directory=$root_dir/opt - -chroot $root_dir <<- EOF_CHROOT -export LANG=C -export LC_ALL=C - -# Add missing paths - -echo :$PATH: | grep -q :/sbin: || export PATH=$PATH:/sbin -echo :$PATH: | grep -q :/bin: || export PATH=$PATH:/bin -echo :$PATH: | grep -q :/usr/sbin: || export PATH=$PATH:/usr/sbin -echo :$PATH: | grep -q :/usr/bin: || export PATH=$PATH:/usr/bin - -/debootstrap/debootstrap --second-stage - -cat <<- EOF_CAT > /etc/apt/sources.list -deb $mirror $distro main contrib non-free -deb-src $mirror $distro main contrib non-free -deb $mirror $distro-updates main contrib non-free -deb-src $mirror $distro-updates main contrib non-free -deb http://security.debian.org/debian-security $distro/updates main contrib non-free -deb-src http://security.debian.org/debian-security $distro/updates main contrib non-free -EOF_CAT - -cat <<- EOF_CAT > etc/apt/apt.conf.d/99norecommends -APT::Install-Recommends "0"; -APT::Install-Suggests "0"; -EOF_CAT - -cat <<- EOF_CAT > etc/fstab -# /etc/fstab: static file system information. -# -/dev/mmcblk0p2 / ext4 errors=remount-ro 0 1 -/dev/mmcblk0p1 /boot vfat defaults 0 2 -EOF_CAT - -cat <<- EOF_CAT >> etc/securetty - -# Serial Console for Xilinx Zynq-7000 -ttyPS0 -EOF_CAT - -echo red-pitaya > etc/hostname - -apt-get update -apt-get -y upgrade - -apt-get -y install locales - -sed -i "/^# en_US.UTF-8 UTF-8$/s/^# //" etc/locale.gen -locale-gen -update-locale LANG=en_US.UTF-8 - -echo $timezone > etc/timezone -dpkg-reconfigure --frontend=noninteractive tzdata - -apt-get -y install openssh-server ca-certificates ntp ntpdate fake-hwclock \ - usbutils psmisc lsof parted curl vim wpasupplicant hostapd isc-dhcp-server \ - iw firmware-realtek firmware-ralink firmware-atheros firmware-brcm80211 \ - build-essential libconfig-dev libpcre3-dev libluajit-5.1-dev libssl-dev \ - libboost-regex1.55-dev libboost-system1.55-dev libboost-thread1.55-dev \ - libcurl4-openssl-dev libcrypto++-dev libfftw3-dev libasound2-dev zlib1g-dev \ - unzip ifplugd ntfs-3g alsa-utils lua-cjson parallel subversion git - -sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/' etc/ssh/sshd_config - -cat <<- EOF_CAT > etc/systemd/system/redpitaya_nginx.service -[Unit] -Description=Customized Nginx web server for Red Pitaya applications -After=network.target - -[Service] -Type=forking -PIDFile=/run/redpitaya_nginx.pid -Environment=PATH_REDPITAYA=/opt/redpitaya -Environment=LD_LIBRARY_PATH=/opt/redpitaya/lib -Environment=PATH=/usr/sbin:/usr/bin:/sbin:/bin:/opt/redpitaya/sbin:/opt/redpitaya/bin -ExecStart=/opt/redpitaya/sbin/nginx -p \\\${PATH_REDPITAYA}/www -ExecReload=/opt/redpitaya/sbin/nginx -p \\\${PATH_REDPITAYA}/www -s reload -ExecStop=/opt/redpitaya/sbin/nginx -p \\\${PATH_REDPITAYA}/www -s quit - -[Install] -WantedBy=multi-user.target -EOF_CAT - -cat <<- EOF_CAT > etc/systemd/system/redpitaya_scpi.service -[Unit] -Description=SCPI server for Red Pitaya -After=network.target - -[Service] -Type=simple -Restart=always -Environment=PATH_REDPITAYA=/opt/redpitaya -Environment=LD_LIBRARY_PATH=/opt/redpitaya/lib -Environment=PATH=/usr/sbin:/usr/bin:/sbin:/bin:/opt/redpitaya/sbin:/opt/redpitaya/bin -ExecStart=/opt/redpitaya/bin/scpi-server -ExecStop=/bin/kill -15 \\\${MAINPID} - -[Install] -WantedBy=multi-user.target -EOF_CAT - -systemctl enable redpitaya_nginx - -cat <<- EOF_CAT > etc/profile.d/red-pitaya.sh -export PATH=\\\$PATH:/opt/redpitaya/bin -export LD_LIBRARY_PATH=\\\$LD_LIBRARY_PATH:/opt/redpitaya/lib -EOF_CAT - -touch etc/udev/rules.d/75-persistent-net-generator.rules - -cat <<- EOF_CAT > etc/network/interfaces.d/eth0 -iface eth0 inet dhcp -EOF_CAT - -cat <<- EOF_CAT > etc/default/ifplugd -INTERFACES="eth0" -HOTPLUG_INTERFACES="" -ARGS="-q -f -u0 -d10 -w -I" -SUSPEND_ACTION="stop" -EOF_CAT - -cat <<- EOF_CAT > etc/network/interfaces.d/wlan0 -allow-hotplug wlan0 -iface wlan0 inet static - address 192.168.42.1 - netmask 255.255.255.0 - post-up service hostapd restart - post-up service isc-dhcp-server restart - post-up iptables-restore < /etc/iptables.ipv4.nat - pre-down iptables-restore < /etc/iptables.ipv4.nonat - pre-down service isc-dhcp-server stop - pre-down service hostapd stop -EOF_CAT - -cat <<- EOF_CAT > etc/hostapd/hostapd.conf -interface=wlan0 -ssid=RedPitaya -driver=nl80211 -hw_mode=g -channel=6 -macaddr_acl=0 -auth_algs=1 -ignore_broadcast_ssid=0 -wpa=2 -wpa_passphrase=RedPitaya -wpa_key_mgmt=WPA-PSK -wpa_pairwise=CCMP -rsn_pairwise=CCMP -EOF_CAT - -cat <<- EOF_CAT > etc/default/hostapd -DAEMON_CONF=/etc/hostapd/hostapd.conf - -if [ "\\\$1" = "start" ] -then - iw wlan0 info > /dev/null 2>&1 - if [ \\\$? -eq 0 ] - then - sed -i '/^driver/s/=.*/=nl80211/' /etc/hostapd/hostapd.conf - DAEMON_SBIN=/usr/sbin/hostapd - else - sed -i '/^driver/s/=.*/=rtl871xdrv/' /etc/hostapd/hostapd.conf - DAEMON_SBIN=/usr/local/sbin/hostapd - fi - echo \\\$DAEMON_SBIN > /run/hostapd.which -elif [ "\\\$1" = "stop" ] -then - DAEMON_SBIN=\\\$(cat /run/hostapd.which) -fi -EOF_CAT - -cat <<- EOF_CAT > etc/dhcp/dhcpd.conf -ddns-update-style none; -default-lease-time 600; -max-lease-time 7200; -authoritative; -log-facility local7; -subnet 192.168.42.0 netmask 255.255.255.0 { - range 192.168.42.10 192.168.42.50; - option broadcast-address 192.168.42.255; - option routers 192.168.42.1; - default-lease-time 600; - max-lease-time 7200; - option domain-name "local"; - option domain-name-servers 8.8.8.8, 8.8.4.4; -} -EOF_CAT - -cat <<- EOF_CAT >> etc/dhcp/dhclient.conf -timeout 20; - -lease { - interface "eth0"; - fixed-address 192.168.1.100; - option subnet-mask 255.255.255.0; - renew 2 2030/1/1 00:00:01; - rebind 2 2030/1/1 00:00:01; - expire 2 2030/1/1 00:00:01; -} -EOF_CAT - -sed -i '/^#net.ipv4.ip_forward=1$/s/^#//' etc/sysctl.conf - -cat <<- EOF_CAT > etc/iptables.ipv4.nat -*nat -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] --A POSTROUTING -o eth0 -j MASQUERADE -COMMIT -*mangle -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*filter -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] --A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT --A FORWARD -i wlan0 -o eth0 -j ACCEPT -COMMIT -EOF_CAT - -cat <<- EOF_CAT > etc/iptables.ipv4.nonat -*nat -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*mangle -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*filter -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -COMMIT -EOF_CAT - -apt-get clean - -echo root:$passwd | chpasswd - -service ntp stop -service ssh stop - -history -c - -sync -EOF_CHROOT - -rm $root_dir/etc/resolv.conf -rm $root_dir/usr/bin/qemu-arm-static - -# Unmount file systems - -umount $boot_dir $root_dir - -rmdir $boot_dir $root_dir - -zerofree $root_dev diff --git a/HDL/scripts/debian-gnuradio.sh b/HDL/scripts/debian-gnuradio.sh deleted file mode 100644 index 44334006..00000000 --- a/HDL/scripts/debian-gnuradio.sh +++ /dev/null @@ -1,286 +0,0 @@ -device=$1 - -boot_dir=`mktemp -d /tmp/BOOT.XXXXXXXXXX` -root_dir=`mktemp -d /tmp/ROOT.XXXXXXXXXX` - -# Choose mirror automatically, depending the geographic and network location -mirror=http://httpredir.debian.org/debian - -distro=jessie -arch=armhf - -hostapd_url=https://www.dropbox.com/sh/5fy49wae6xwxa8a/AAAQHa5NkpLYFocaOrrnft-Pa/rtl8192cu/hostapd-armhf?dl=1 - -passwd=changeme -timezone=Europe/Brussels - -# Create partitions - -parted -s $device mklabel msdos -parted -s $device mkpart primary fat16 4MB 16MB -parted -s $device mkpart primary ext4 16MB 100% - -boot_dev=/dev/`lsblk -lno NAME $device | sed '2!d'` -root_dev=/dev/`lsblk -lno NAME $device | sed '3!d'` - -# Create file systems - -mkfs.vfat -v $boot_dev -mkfs.ext4 -F -j $root_dev - -# Mount file systems - -mount $boot_dev $boot_dir -mount $root_dev $root_dir - -# Copy files to the boot file system - -cp boot.bin devicetree.dtb uImage uEnv.txt $boot_dir - -# Install Debian base system to the root file system - -debootstrap --foreign --arch $arch $distro $root_dir $mirror - -# Add missing configuration files and packages - -cp /etc/resolv.conf $root_dir/etc/ -cp /usr/bin/qemu-arm-static $root_dir/usr/bin/ - -cp patches/fw_env.config $root_dir/etc/ - -mkdir -p $root_dir/usr/local/bin -cp fw_printenv $root_dir/usr/local/bin/fw_printenv -cp fw_printenv $root_dir/usr/local/bin/fw_setenv - -mkdir -p $root_dir/usr/local/sbin -curl -L $hostapd_url -o $root_dir/usr/local/sbin/hostapd -chmod +x $root_dir/usr/local/sbin/hostapd - -mkdir -p $root_dir/root/gnuradio -cp projects/sdr_transceiver_emb/gnuradio/* $root_dir/root/gnuradio/ - -chroot $root_dir <<- EOF_CHROOT -export LANG=C -export LC_ALL=C - -# Add missing paths - -echo :$PATH: | grep -q :/sbin: || export PATH=$PATH:/sbin -echo :$PATH: | grep -q :/bin: || export PATH=$PATH:/bin -echo :$PATH: | grep -q :/usr/sbin: || export PATH=$PATH:/usr/sbin -echo :$PATH: | grep -q :/usr/bin: || export PATH=$PATH:/usr/bin - -/debootstrap/debootstrap --second-stage - -cat <<- EOF_CAT > /etc/apt/sources.list -deb $mirror $distro main contrib non-free -deb-src $mirror $distro main contrib non-free -deb $mirror $distro-updates main contrib non-free -deb-src $mirror $distro-updates main contrib non-free -deb http://security.debian.org/debian-security $distro/updates main contrib non-free -deb-src http://security.debian.org/debian-security $distro/updates main contrib non-free -EOF_CAT - -cat <<- EOF_CAT > etc/apt/apt.conf.d/99norecommends -APT::Install-Recommends "0"; -APT::Install-Suggests "0"; -EOF_CAT - -cat <<- EOF_CAT > etc/fstab -# /etc/fstab: static file system information. -# -/dev/mmcblk0p2 / ext4 errors=remount-ro 0 1 -/dev/mmcblk0p1 /boot vfat defaults 0 2 -EOF_CAT - -cat <<- EOF_CAT >> etc/securetty - -# Serial Console for Xilinx Zynq-7000 -ttyPS0 -EOF_CAT - -echo red-pitaya > etc/hostname - -apt-get update -apt-get -y upgrade - -apt-get -y install locales - -sed -i "/^# en_US.UTF-8 UTF-8$/s/^# //" etc/locale.gen -locale-gen -update-locale LANG=en_US.UTF-8 - -echo $timezone > etc/timezone -dpkg-reconfigure --frontend=noninteractive tzdata - -apt-get -y install openssh-server ca-certificates ntp ntpdate fake-hwclock \ - usbutils psmisc lsof parted curl vim wpasupplicant hostapd isc-dhcp-server \ - iw firmware-realtek firmware-ralink firmware-atheros firmware-brcm80211 \ - build-essential libasound2-dev libconfig-dev libfftw3-dev subversion git \ - alsa-utils gnuradio python-numpy python-gtk2 python-urwid python-serial \ - python-alsaaudio xauth xterm parallel ifplugd ntfs-3g - -sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/' etc/ssh/sshd_config - -touch etc/udev/rules.d/75-persistent-net-generator.rules - -cat <<- EOF_CAT > etc/network/interfaces.d/eth0 -iface eth0 inet dhcp -EOF_CAT - -cat <<- EOF_CAT > etc/default/ifplugd -INTERFACES="eth0" -HOTPLUG_INTERFACES="" -ARGS="-q -f -u0 -d10 -w -I" -SUSPEND_ACTION="stop" -EOF_CAT - -cat <<- EOF_CAT > etc/network/interfaces.d/wlan0 -allow-hotplug wlan0 -iface wlan0 inet static - address 192.168.42.1 - netmask 255.255.255.0 - post-up service hostapd restart - post-up service isc-dhcp-server restart - post-up iptables-restore < /etc/iptables.ipv4.nat - pre-down iptables-restore < /etc/iptables.ipv4.nonat - pre-down service isc-dhcp-server stop - pre-down service hostapd stop -EOF_CAT - -cat <<- EOF_CAT > etc/hostapd/hostapd.conf -interface=wlan0 -ssid=RedPitaya -driver=nl80211 -hw_mode=g -channel=6 -macaddr_acl=0 -auth_algs=1 -ignore_broadcast_ssid=0 -wpa=2 -wpa_passphrase=RedPitaya -wpa_key_mgmt=WPA-PSK -wpa_pairwise=CCMP -rsn_pairwise=CCMP -EOF_CAT - -cat <<- EOF_CAT > etc/default/hostapd -DAEMON_CONF=/etc/hostapd/hostapd.conf - -if [ "\\\$1" = "start" ] -then - iw wlan0 info > /dev/null 2>&1 - if [ \\\$? -eq 0 ] - then - sed -i '/^driver/s/=.*/=nl80211/' /etc/hostapd/hostapd.conf - DAEMON_SBIN=/usr/sbin/hostapd - else - sed -i '/^driver/s/=.*/=rtl871xdrv/' /etc/hostapd/hostapd.conf - DAEMON_SBIN=/usr/local/sbin/hostapd - fi - echo \\\$DAEMON_SBIN > /run/hostapd.which -elif [ "\\\$1" = "stop" ] -then - DAEMON_SBIN=\\\$(cat /run/hostapd.which) -fi -EOF_CAT - -cat <<- EOF_CAT > etc/dhcp/dhcpd.conf -ddns-update-style none; -default-lease-time 600; -max-lease-time 7200; -authoritative; -log-facility local7; -subnet 192.168.42.0 netmask 255.255.255.0 { - range 192.168.42.10 192.168.42.50; - option broadcast-address 192.168.42.255; - option routers 192.168.42.1; - default-lease-time 600; - max-lease-time 7200; - option domain-name "local"; - option domain-name-servers 8.8.8.8, 8.8.4.4; -} -EOF_CAT - -cat <<- EOF_CAT >> etc/dhcp/dhclient.conf -timeout 20; - -lease { - interface "eth0"; - fixed-address 192.168.1.100; - option subnet-mask 255.255.255.0; - renew 2 2030/1/1 00:00:01; - rebind 2 2030/1/1 00:00:01; - expire 2 2030/1/1 00:00:01; -} -EOF_CAT - -sed -i '/^#net.ipv4.ip_forward=1$/s/^#//' etc/sysctl.conf - -cat <<- EOF_CAT > etc/iptables.ipv4.nat -*nat -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] --A POSTROUTING -o eth0 -j MASQUERADE -COMMIT -*mangle -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*filter -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] --A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT --A FORWARD -i wlan0 -o eth0 -j ACCEPT -COMMIT -EOF_CAT - -cat <<- EOF_CAT > etc/iptables.ipv4.nonat -*nat -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*mangle -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*filter -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -COMMIT -EOF_CAT - -apt-get clean - -echo root:$passwd | chpasswd - -service ntp stop -service ssh stop - -history -c - -sync -EOF_CHROOT - -rm $root_dir/etc/resolv.conf -rm $root_dir/usr/bin/qemu-arm-static - -# Unmount file systems - -umount $boot_dir $root_dir - -rmdir $boot_dir $root_dir - -zerofree $root_dev diff --git a/HDL/scripts/debian-wspr.sh b/HDL/scripts/debian-wspr.sh deleted file mode 100644 index bc876ca2..00000000 --- a/HDL/scripts/debian-wspr.sh +++ /dev/null @@ -1,301 +0,0 @@ -device=$1 - -boot_dir=`mktemp -d /tmp/BOOT.XXXXXXXXXX` -root_dir=`mktemp -d /tmp/ROOT.XXXXXXXXXX` - -# Choose mirror automatically, depending the geographic and network location -mirror=http://httpredir.debian.org/debian - -distro=jessie -arch=armhf - -hostapd_url=https://www.dropbox.com/sh/5fy49wae6xwxa8a/AAAQHa5NkpLYFocaOrrnft-Pa/rtl8192cu/hostapd-armhf?dl=1 - -passwd=changeme -timezone=Europe/Brussels - -# Create partitions - -parted -s $device mklabel msdos -parted -s $device mkpart primary fat16 4MB 16MB -parted -s $device mkpart primary ext4 16MB 100% - -boot_dev=/dev/`lsblk -lno NAME $device | sed '2!d'` -root_dev=/dev/`lsblk -lno NAME $device | sed '3!d'` - -# Create file systems - -mkfs.vfat -v $boot_dev -mkfs.ext4 -F -j $root_dev - -# Mount file systems - -mount $boot_dev $boot_dir -mount $root_dev $root_dir - -# Copy files to the boot file system - -cp boot.bin devicetree.dtb uImage uEnv.txt $boot_dir - -# Install Debian base system to the root file system - -debootstrap --foreign --arch $arch $distro $root_dir $mirror - -# Add missing configuration files and packages - -cp /etc/resolv.conf $root_dir/etc/ -cp /usr/bin/qemu-arm-static $root_dir/usr/bin/ - -cp patches/fw_env.config $root_dir/etc/ - -mkdir -p $root_dir/usr/local/bin -cp fw_printenv $root_dir/usr/local/bin/fw_printenv -cp fw_printenv $root_dir/usr/local/bin/fw_setenv - -mkdir -p $root_dir/usr/local/sbin -curl -L $hostapd_url -o $root_dir/usr/local/sbin/hostapd -chmod +x $root_dir/usr/local/sbin/hostapd - -mkdir -p $root_dir/root -cp projects/sdr_transceiver_wspr/transmit-wspr-message.c $root_dir/root/ -cp projects/sdr_transceiver_wspr/transmit-wspr-message.cfg $root_dir/root/ -cp projects/sdr_transceiver_wspr/transmit-wspr.sh $root_dir/root/ -cp projects/sdr_transceiver_wspr/write-c2-files.c $root_dir/root/ -cp projects/sdr_transceiver_wspr/write-c2-files.cfg $root_dir/root/ -cp projects/sdr_transceiver_wspr/decode-wspr.sh $root_dir/root/ -cp projects/sdr_transceiver_wspr/gpio-output.c $root_dir/root/ -cp projects/sdr_transceiver_wspr/wspr.cron $root_dir/root/ -cp projects/sdr_transceiver_wspr/README $root_dir/root/ -cp projects/sdr_transceiver_wspr/Makefile $root_dir/root/ - -chroot $root_dir <<- EOF_CHROOT -export LANG=C -export LC_ALL=C - -# Add missing paths - -echo :$PATH: | grep -q :/sbin: || export PATH=$PATH:/sbin -echo :$PATH: | grep -q :/bin: || export PATH=$PATH:/bin -echo :$PATH: | grep -q :/usr/sbin: || export PATH=$PATH:/usr/sbin -echo :$PATH: | grep -q :/usr/bin: || export PATH=$PATH:/usr/bin - -/debootstrap/debootstrap --second-stage - -cat <<- EOF_CAT > /etc/apt/sources.list -deb $mirror $distro main contrib non-free -deb-src $mirror $distro main contrib non-free -deb $mirror $distro-updates main contrib non-free -deb-src $mirror $distro-updates main contrib non-free -deb http://security.debian.org/debian-security $distro/updates main contrib non-free -deb-src http://security.debian.org/debian-security $distro/updates main contrib non-free -EOF_CAT - -cat <<- EOF_CAT > etc/apt/apt.conf.d/99norecommends -APT::Install-Recommends "0"; -APT::Install-Suggests "0"; -EOF_CAT - -cat <<- EOF_CAT > etc/fstab -# /etc/fstab: static file system information. -# -/dev/mmcblk0p2 / ext4 errors=remount-ro 0 1 -/dev/mmcblk0p1 /boot vfat defaults 0 2 -EOF_CAT - -cat <<- EOF_CAT >> etc/securetty - -# Serial Console for Xilinx Zynq-7000 -ttyPS0 -EOF_CAT - -echo red-pitaya > etc/hostname - -apt-get update -apt-get -y upgrade - -apt-get -y install locales - -sed -i "/^# en_US.UTF-8 UTF-8$/s/^# //" etc/locale.gen -locale-gen -update-locale LANG=en_US.UTF-8 - -echo $timezone > etc/timezone -dpkg-reconfigure --frontend=noninteractive tzdata - -apt-get -y install openssh-server ca-certificates ntp ntpdate fake-hwclock \ - usbutils psmisc lsof parted curl vim wpasupplicant hostapd isc-dhcp-server \ - iw firmware-realtek firmware-ralink firmware-atheros firmware-brcm80211 \ - build-essential subversion libfftw3-dev libconfig-dev parallel ifplugd ntfs-3g - -cd root -svn co svn://svn.code.sf.net/p/wsjt/wsjt/branches/wsjtx/lib/wsprd -make -C wsprd CFLAGS='-O3 -march=armv7-a -mcpu=cortex-a9 -mtune=cortex-a9 -mfpu=neon -mfloat-abi=hard -ffast-math -fsingle-precision-constant -mvectorize-with-neon-quad' wsprd -make -cd .. - -ln -sf /root/wspr.cron etc/cron.d/wspr - -sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/' etc/ssh/sshd_config - -touch etc/udev/rules.d/75-persistent-net-generator.rules - -cat <<- EOF_CAT > etc/network/interfaces.d/eth0 -iface eth0 inet dhcp -EOF_CAT - -cat <<- EOF_CAT > etc/default/ifplugd -INTERFACES="eth0" -HOTPLUG_INTERFACES="" -ARGS="-q -f -u0 -d10 -w -I" -SUSPEND_ACTION="stop" -EOF_CAT - -cat <<- EOF_CAT > etc/network/interfaces.d/wlan0 -allow-hotplug wlan0 -iface wlan0 inet static - address 192.168.42.1 - netmask 255.255.255.0 - post-up service hostapd restart - post-up service isc-dhcp-server restart - post-up iptables-restore < /etc/iptables.ipv4.nat - pre-down iptables-restore < /etc/iptables.ipv4.nonat - pre-down service isc-dhcp-server stop - pre-down service hostapd stop -EOF_CAT - -cat <<- EOF_CAT > etc/hostapd/hostapd.conf -interface=wlan0 -ssid=RedPitaya -driver=nl80211 -hw_mode=g -channel=6 -macaddr_acl=0 -auth_algs=1 -ignore_broadcast_ssid=0 -wpa=2 -wpa_passphrase=RedPitaya -wpa_key_mgmt=WPA-PSK -wpa_pairwise=CCMP -rsn_pairwise=CCMP -EOF_CAT - -cat <<- EOF_CAT > etc/default/hostapd -DAEMON_CONF=/etc/hostapd/hostapd.conf - -if [ "\\\$1" = "start" ] -then - iw wlan0 info > /dev/null 2>&1 - if [ \\\$? -eq 0 ] - then - sed -i '/^driver/s/=.*/=nl80211/' /etc/hostapd/hostapd.conf - DAEMON_SBIN=/usr/sbin/hostapd - else - sed -i '/^driver/s/=.*/=rtl871xdrv/' /etc/hostapd/hostapd.conf - DAEMON_SBIN=/usr/local/sbin/hostapd - fi - echo \\\$DAEMON_SBIN > /run/hostapd.which -elif [ "\\\$1" = "stop" ] -then - DAEMON_SBIN=\\\$(cat /run/hostapd.which) -fi -EOF_CAT - -cat <<- EOF_CAT > etc/dhcp/dhcpd.conf -ddns-update-style none; -default-lease-time 600; -max-lease-time 7200; -authoritative; -log-facility local7; -subnet 192.168.42.0 netmask 255.255.255.0 { - range 192.168.42.10 192.168.42.50; - option broadcast-address 192.168.42.255; - option routers 192.168.42.1; - default-lease-time 600; - max-lease-time 7200; - option domain-name "local"; - option domain-name-servers 8.8.8.8, 8.8.4.4; -} -EOF_CAT - -cat <<- EOF_CAT >> etc/dhcp/dhclient.conf -timeout 20; - -lease { - interface "eth0"; - fixed-address 192.168.1.100; - option subnet-mask 255.255.255.0; - renew 2 2030/1/1 00:00:01; - rebind 2 2030/1/1 00:00:01; - expire 2 2030/1/1 00:00:01; -} -EOF_CAT - -sed -i '/^#net.ipv4.ip_forward=1$/s/^#//' etc/sysctl.conf - -cat <<- EOF_CAT > etc/iptables.ipv4.nat -*nat -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] --A POSTROUTING -o eth0 -j MASQUERADE -COMMIT -*mangle -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*filter -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] --A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT --A FORWARD -i wlan0 -o eth0 -j ACCEPT -COMMIT -EOF_CAT - -cat <<- EOF_CAT > etc/iptables.ipv4.nonat -*nat -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*mangle -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*filter -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -COMMIT -EOF_CAT - -apt-get clean - -echo root:$passwd | chpasswd - -service ntp stop -service ssh stop - -history -c - -sync -EOF_CHROOT - -rm $root_dir/etc/resolv.conf -rm $root_dir/usr/bin/qemu-arm-static - -# Unmount file systems - -umount $boot_dir $root_dir - -rmdir $boot_dir $root_dir - -zerofree $root_dev diff --git a/HDL/scripts/debian.sh b/HDL/scripts/debian.sh deleted file mode 100644 index 781d9a99..00000000 --- a/HDL/scripts/debian.sh +++ /dev/null @@ -1,281 +0,0 @@ -device=$1 - -boot_dir=`mktemp -d /tmp/BOOT.XXXXXXXXXX` -root_dir=`mktemp -d /tmp/ROOT.XXXXXXXXXX` - -# Choose mirror automatically, depending the geographic and network location -mirror=http://httpredir.debian.org/debian - -distro=jessie -arch=armhf - -hostapd_url=https://www.dropbox.com/sh/5fy49wae6xwxa8a/AAAQHa5NkpLYFocaOrrnft-Pa/rtl8192cu/hostapd-armhf?dl=1 - -passwd=changeme -timezone=Europe/Brussels - -# Create partitions - -parted -s $device mklabel msdos -parted -s $device mkpart primary fat16 4MB 16MB -parted -s $device mkpart primary ext4 16MB 100% - -boot_dev=/dev/`lsblk -lno NAME $device | sed '2!d'` -root_dev=/dev/`lsblk -lno NAME $device | sed '3!d'` - -# Create file systems - -mkfs.vfat -v $boot_dev -mkfs.ext4 -F -j $root_dev - -# Mount file systems - -mount $boot_dev $boot_dir -mount $root_dev $root_dir - -# Copy files to the boot file system - -cp boot.bin devicetree.dtb uImage uEnv.txt $boot_dir - -# Install Debian base system to the root file system - -debootstrap --foreign --arch $arch $distro $root_dir $mirror - -# Add missing configuration files and packages - -cp /etc/resolv.conf $root_dir/etc/ -cp /usr/bin/qemu-arm-static $root_dir/usr/bin/ - -cp patches/fw_env.config $root_dir/etc/ - -mkdir -p $root_dir/usr/local/bin -cp fw_printenv $root_dir/usr/local/bin/fw_printenv -cp fw_printenv $root_dir/usr/local/bin/fw_setenv - -mkdir -p $root_dir/usr/local/sbin -curl -L $hostapd_url -o $root_dir/usr/local/sbin/hostapd -chmod +x $root_dir/usr/local/sbin/hostapd - -chroot $root_dir <<- EOF_CHROOT -export LANG=C -export LC_ALL=C - -# Add missing paths - -echo :$PATH: | grep -q :/sbin: || export PATH=$PATH:/sbin -echo :$PATH: | grep -q :/bin: || export PATH=$PATH:/bin -echo :$PATH: | grep -q :/usr/sbin: || export PATH=$PATH:/usr/sbin -echo :$PATH: | grep -q :/usr/bin: || export PATH=$PATH:/usr/bin - -/debootstrap/debootstrap --second-stage - -cat <<- EOF_CAT > /etc/apt/sources.list -deb $mirror $distro main contrib non-free -deb-src $mirror $distro main contrib non-free -deb $mirror $distro-updates main contrib non-free -deb-src $mirror $distro-updates main contrib non-free -deb http://security.debian.org/debian-security $distro/updates main contrib non-free -deb-src http://security.debian.org/debian-security $distro/updates main contrib non-free -EOF_CAT - -cat <<- EOF_CAT > etc/apt/apt.conf.d/99norecommends -APT::Install-Recommends "0"; -APT::Install-Suggests "0"; -EOF_CAT - -cat <<- EOF_CAT > etc/fstab -# /etc/fstab: static file system information. -# -/dev/mmcblk0p2 / ext4 errors=remount-ro 0 1 -/dev/mmcblk0p1 /boot vfat defaults 0 2 -EOF_CAT - -cat <<- EOF_CAT >> etc/securetty - -# Serial Console for Xilinx Zynq-7000 -ttyPS0 -EOF_CAT - -echo red-pitaya > etc/hostname - -apt-get update -apt-get -y upgrade - -apt-get -y install locales - -sed -i "/^# en_US.UTF-8 UTF-8$/s/^# //" etc/locale.gen -locale-gen -update-locale LANG=en_US.UTF-8 - -echo $timezone > etc/timezone -dpkg-reconfigure --frontend=noninteractive tzdata - -apt-get -y install openssh-server ca-certificates ntp ntpdate fake-hwclock \ - usbutils psmisc lsof parted curl vim wpasupplicant hostapd isc-dhcp-server \ - iw firmware-realtek firmware-ralink firmware-atheros firmware-brcm80211 \ - ifplugd ntfs-3g - -sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/' etc/ssh/sshd_config - -touch etc/udev/rules.d/75-persistent-net-generator.rules - -cat <<- EOF_CAT > etc/network/interfaces.d/eth0 -iface eth0 inet dhcp -EOF_CAT - -cat <<- EOF_CAT > etc/default/ifplugd -INTERFACES="eth0" -HOTPLUG_INTERFACES="" -ARGS="-q -f -u0 -d10 -w -I" -SUSPEND_ACTION="stop" -EOF_CAT - -cat <<- EOF_CAT > etc/network/interfaces.d/wlan0 -allow-hotplug wlan0 -iface wlan0 inet static - address 192.168.42.1 - netmask 255.255.255.0 - post-up service hostapd restart - post-up service isc-dhcp-server restart - post-up iptables-restore < /etc/iptables.ipv4.nat - pre-down iptables-restore < /etc/iptables.ipv4.nonat - pre-down service isc-dhcp-server stop - pre-down service hostapd stop -EOF_CAT - -cat <<- EOF_CAT > etc/hostapd/hostapd.conf -interface=wlan0 -ssid=RedPitaya -driver=nl80211 -hw_mode=g -channel=6 -macaddr_acl=0 -auth_algs=1 -ignore_broadcast_ssid=0 -wpa=2 -wpa_passphrase=RedPitaya -wpa_key_mgmt=WPA-PSK -wpa_pairwise=CCMP -rsn_pairwise=CCMP -EOF_CAT - -cat <<- EOF_CAT > etc/default/hostapd -DAEMON_CONF=/etc/hostapd/hostapd.conf - -if [ "\\\$1" = "start" ] -then - iw wlan0 info > /dev/null 2>&1 - if [ \\\$? -eq 0 ] - then - sed -i '/^driver/s/=.*/=nl80211/' /etc/hostapd/hostapd.conf - DAEMON_SBIN=/usr/sbin/hostapd - else - sed -i '/^driver/s/=.*/=rtl871xdrv/' /etc/hostapd/hostapd.conf - DAEMON_SBIN=/usr/local/sbin/hostapd - fi - echo \\\$DAEMON_SBIN > /run/hostapd.which -elif [ "\\\$1" = "stop" ] -then - DAEMON_SBIN=\\\$(cat /run/hostapd.which) -fi -EOF_CAT - -cat <<- EOF_CAT > etc/dhcp/dhcpd.conf -ddns-update-style none; -default-lease-time 600; -max-lease-time 7200; -authoritative; -log-facility local7; -subnet 192.168.42.0 netmask 255.255.255.0 { - range 192.168.42.10 192.168.42.50; - option broadcast-address 192.168.42.255; - option routers 192.168.42.1; - default-lease-time 600; - max-lease-time 7200; - option domain-name "local"; - option domain-name-servers 8.8.8.8, 8.8.4.4; -} -EOF_CAT - -cat <<- EOF_CAT >> etc/dhcp/dhclient.conf -timeout 20; - -lease { - interface "eth0"; - fixed-address 192.168.1.100; - option subnet-mask 255.255.255.0; - renew 2 2030/1/1 00:00:01; - rebind 2 2030/1/1 00:00:01; - expire 2 2030/1/1 00:00:01; -} -EOF_CAT - -sed -i '/^#net.ipv4.ip_forward=1$/s/^#//' etc/sysctl.conf - -cat <<- EOF_CAT > etc/iptables.ipv4.nat -*nat -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] --A POSTROUTING -o eth0 -j MASQUERADE -COMMIT -*mangle -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*filter -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] --A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT --A FORWARD -i wlan0 -o eth0 -j ACCEPT -COMMIT -EOF_CAT - -cat <<- EOF_CAT > etc/iptables.ipv4.nonat -*nat -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*mangle -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*filter -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -COMMIT -EOF_CAT - -apt-get clean - -echo root:$passwd | chpasswd - -service ntp stop -service ssh stop - -history -c - -sync -EOF_CHROOT - -rm $root_dir/etc/resolv.conf -rm $root_dir/usr/bin/qemu-arm-static - -# Unmount file systems - -umount $boot_dir $root_dir - -rmdir $boot_dir $root_dir - -zerofree $root_dev diff --git a/HDL/scripts/project.tcl b/HDL/scripts/project.tcl index a3fff02c..6fbfb86f 100644 --- a/HDL/scripts/project.tcl +++ b/HDL/scripts/project.tcl @@ -104,7 +104,7 @@ proc get_slice_pin {pin_name from to {cell_name ""}} { } -source projects/$project_name/block_design.tcl +source blockdesign-projects/$project_name/block_design.tcl rename cell {} rename module {} @@ -118,7 +118,7 @@ make_wrapper -files [get_files $bd_path/system.bd] -top add_files -norecurse $bd_path/hdl/system_wrapper.v -set files [glob -nocomplain projects/$project_name/*.v projects/$project_name/*.sv] +set files [glob -nocomplain blockdesign-projects/$project_name/*.v blockdesign-projects/$project_name/*.sv] if {[llength $files] > 0} { add_files -norecurse $files } diff --git a/HDL/scripts/ubuntu.sh b/HDL/scripts/ubuntu.sh deleted file mode 100644 index 37cacc30..00000000 --- a/HDL/scripts/ubuntu.sh +++ /dev/null @@ -1,266 +0,0 @@ -device=$1 - -boot_dir=`mktemp -d /tmp/BOOT.XXXXXXXXXX` -root_dir=`mktemp -d /tmp/ROOT.XXXXXXXXXX` - -root_tar=ubuntu-base-14.04.5-core-armhf.tar.gz -root_url=http://cdimage.ubuntu.com/ubuntu-base/releases/14.04/release/$root_tar - -hostapd_url=https://www.dropbox.com/sh/5fy49wae6xwxa8a/AAAQHa5NkpLYFocaOrrnft-Pa/rtl8192cu/hostapd-armhf?dl=1 - -passwd=changeme -timezone=Europe/Brussels - -# Create partitions - -parted -s $device mklabel msdos -parted -s $device mkpart primary fat16 4MB 16MB -parted -s $device mkpart primary ext4 16MB 100% - -boot_dev=/dev/`lsblk -lno NAME $device | sed '2!d'` -root_dev=/dev/`lsblk -lno NAME $device | sed '3!d'` - -# Create file systems - -mkfs.vfat -v $boot_dev -mkfs.ext4 -F -j $root_dev - -# Mount file systems - -mount $boot_dev $boot_dir -mount $root_dev $root_dir - -# Copy files to the boot file system - -cp boot.bin devicetree.dtb uImage uEnv.txt $boot_dir - -# Copy Ubuntu Core to the root file system - -test -f $root_tar || curl -L $root_url -o $root_tar - -tar -zxf $root_tar --directory=$root_dir - -# Add missing configuration files and packages - -cp /etc/resolv.conf $root_dir/etc/ -cp /usr/bin/qemu-arm-static $root_dir/usr/bin/ - -cp patches/fw_env.config $root_dir/etc/ - -cp fw_printenv $root_dir/usr/local/bin/fw_printenv -cp fw_printenv $root_dir/usr/local/bin/fw_setenv - -curl -L $hostapd_url -o $root_dir/usr/local/sbin/hostapd -chmod +x $root_dir/usr/local/sbin/hostapd - -chroot $root_dir <<- EOF_CHROOT -export LANG=C -export LC_ALL=C - -# Add missing paths - -echo :$PATH: | grep -q :/sbin: || export PATH=$PATH:/sbin -echo :$PATH: | grep -q :/bin: || export PATH=$PATH:/bin -echo :$PATH: | grep -q :/usr/sbin: || export PATH=$PATH:/usr/sbin -echo :$PATH: | grep -q :/usr/bin: || export PATH=$PATH:/usr/bin - -cat <<- EOF_CAT > etc/apt/apt.conf.d/99norecommends -APT::Install-Recommends "0"; -APT::Install-Suggests "0"; -EOF_CAT - -cat <<- EOF_CAT > etc/fstab -# /etc/fstab: static file system information. -# -/dev/mmcblk0p2 / ext4 errors=remount-ro 0 1 -/dev/mmcblk0p1 /boot vfat defaults 0 2 -EOF_CAT - -cat <<- EOF_CAT >> etc/securetty - -# Serial Console for Xilinx Zynq-7000 -ttyPS0 -EOF_CAT - -sed 's/tty1/ttyPS0/g; s/38400/115200/' etc/init/tty1.conf > etc/init/ttyPS0.conf - -echo red-pitaya > etc/hostname - -sed -i '/^# deb .* universe$/s/^# //' etc/apt/sources.list - -sed -i '/### END INIT INFO/aexit 0' /etc/init.d/udev -apt-get update -apt-get -y upgrade -sed -i '/### END INIT INFO/{n;d}' /etc/init.d/udev - -apt-get -y install locales - -locale-gen en_US.UTF-8 -update-locale LANG=en_US.UTF-8 - -echo $timezone > etc/timezone -dpkg-reconfigure --frontend=noninteractive tzdata - -apt-get -y install openssh-server ca-certificates ntp usbutils psmisc lsof \ - parted curl less vim man-db iw wpasupplicant linux-firmware ntfs-3g - -sed -i 's/^PermitRootLogin.*/PermitRootLogin yes/' etc/ssh/sshd_config - -apt-get -y install hostapd isc-dhcp-server iptables - -touch etc/udev/rules.d/75-persistent-net-generator.rules - -cat <<- EOF_CAT >> etc/network/interfaces.d/eth0 -allow-hotplug eth0 -iface eth0 inet dhcp -EOF_CAT - -cat <<- EOF_CAT > etc/network/interfaces.d/wlan0 -allow-hotplug wlan0 -iface wlan0 inet static - address 192.168.42.1 - netmask 255.255.255.0 - post-up service hostapd restart - post-up service isc-dhcp-server restart - post-up iptables-restore < /etc/iptables.ipv4.nat - pre-down iptables-restore < /etc/iptables.ipv4.nonat - pre-down service isc-dhcp-server stop - pre-down service hostapd stop -EOF_CAT - -cat <<- EOF_CAT > etc/hostapd/hostapd.conf -interface=wlan0 -ssid=RedPitaya -driver=nl80211 -hw_mode=g -channel=6 -macaddr_acl=0 -auth_algs=1 -ignore_broadcast_ssid=0 -wpa=2 -wpa_passphrase=RedPitaya -wpa_key_mgmt=WPA-PSK -wpa_pairwise=CCMP -rsn_pairwise=CCMP -EOF_CAT - -cat <<- EOF_CAT > etc/default/hostapd -DAEMON_CONF=/etc/hostapd/hostapd.conf - -if [ "\\\$1" = "start" ] -then - iw wlan0 info > /dev/null 2>&1 - if [ \\\$? -eq 0 ] - then - sed -i '/^driver/s/=.*/=nl80211/' /etc/hostapd/hostapd.conf - DAEMON_SBIN=/usr/sbin/hostapd - else - sed -i '/^driver/s/=.*/=rtl871xdrv/' /etc/hostapd/hostapd.conf - DAEMON_SBIN=/usr/local/sbin/hostapd - fi - echo \\\$DAEMON_SBIN > /run/hostapd.which -elif [ "\\\$1" = "stop" ] -then - DAEMON_SBIN=\\\$(cat /run/hostapd.which) -fi -EOF_CAT - -cat <<- EOF_CAT > etc/dhcp/dhcpd.conf -ddns-update-style none; -default-lease-time 600; -max-lease-time 7200; -authoritative; -log-facility local7; -subnet 192.168.42.0 netmask 255.255.255.0 { - range 192.168.42.10 192.168.42.50; - option broadcast-address 192.168.42.255; - option routers 192.168.42.1; - default-lease-time 600; - max-lease-time 7200; - option domain-name "local"; - option domain-name-servers 8.8.8.8, 8.8.4.4; -} -EOF_CAT - -cat <<- EOF_CAT >> etc/dhcp/dhclient.conf -timeout 20; - -lease { - interface "eth0"; - fixed-address 192.168.1.100; - option subnet-mask 255.255.255.0; - renew 2 2030/1/1 00:00:01; - rebind 2 2030/1/1 00:00:01; - expire 2 2030/1/1 00:00:01; -} -EOF_CAT - -sed -i '/^#net.ipv4.ip_forward=1$/s/^#//' etc/sysctl.conf - -cat <<- EOF_CAT > etc/iptables.ipv4.nat -*nat -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] --A POSTROUTING -o eth0 -j MASQUERADE -COMMIT -*mangle -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*filter -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] --A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT --A FORWARD -i wlan0 -o eth0 -j ACCEPT -COMMIT -EOF_CAT - -cat <<- EOF_CAT > etc/iptables.ipv4.nonat -*nat -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*mangle -:PREROUTING ACCEPT [0:0] -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -:POSTROUTING ACCEPT [0:0] -COMMIT -*filter -:INPUT ACCEPT [0:0] -:FORWARD ACCEPT [0:0] -:OUTPUT ACCEPT [0:0] -COMMIT -EOF_CAT - -apt-get clean - -echo root:$passwd | chpasswd - -service ntp stop -service ssh stop - -history -c - -sync -EOF_CHROOT - -rm $root_dir/etc/resolv.conf -rm $root_dir/usr/bin/qemu-arm-static - -# Unmount file systems - -umount $boot_dir $root_dir - -rmdir $boot_dir $root_dir - -zerofree $root_dev