├── CITATION.cff ├── Manifest.toml ├── Pluto Notebooks ├── html │ ├── JLSD_pt1_background.html │ ├── JLSD_pt2_framework.html │ ├── JLSD_pt3_structure.html │ ├── JLSD_pt4_tx.html │ ├── JLSD_pt5a_plot.html │ └── JLSD_pt5b_animate.html ├── jl │ ├── JLSD_pt1_background.jl │ ├── JLSD_pt2_framework.jl │ ├── JLSD_pt3_structure.jl │ ├── JLSD_pt4_tx.jl │ ├── JLSD_pt5a_plot.jl │ └── JLSD_pt5b_animate.jl └── pdf │ ├── JLSD_pt1_background.pdf │ ├── JLSD_pt2_framework.pdf │ ├── JLSD_pt3_structure.pdf │ ├── JLSD_pt4_tx.pdf │ ├── JLSD_pt5a_plot.pdf │ └── JLSD_pt5b_animate.pdf ├── Project.toml ├── README.md ├── channel_data ├── SP_files │ └── Channel5_thru_small_pad_4inch.s4p └── TF_data │ └── channel_4inch.mat ├── img └── widget_ui.png └── src ├── JLSD.jl ├── Main.jl ├── Main_UI.jl ├── blks ├── BlkBIST.jl ├── BlkCH.jl ├── BlkRX.jl ├── BlkTX.jl └── WvfmGen.jl ├── structs └── TrxStruct.jl ├── tb ├── TB.jl └── Widget.jl └── util └── Util_JLSD.jl /CITATION.cff: -------------------------------------------------------------------------------- 1 | cff-version: 1.2.0 2 | message: "If you use this software or contents, please cite it as below." 3 | authors: 4 | - family-names: "Zheng" 5 | given-names: "Kevin" 6 | orcid: "https://orcid.org/0000-0003-1818-5093" 7 | title: "Julia SerDes" 8 | version: 1.0 9 | doi: 10.5281/zenodo.12520404 10 | date-released: 2024-06-24 11 | url: "https://github.com/kevjzheng/JLSD" 12 | -------------------------------------------------------------------------------- /Manifest.toml: -------------------------------------------------------------------------------- 1 | # This file is machine-generated - editing it directly is not advised 2 | 3 | julia_version = "1.10.4" 4 | manifest_format = "2.0" 5 | project_hash = "385b165b44c9b37ddae179a774989b0e91ff6199" 6 | 7 | [[deps.Adapt]] 8 | deps = ["LinearAlgebra", "Requires"] 9 | git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099" 10 | uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" 11 | version = "4.0.4" 12 | 13 | [deps.Adapt.extensions] 14 | AdaptStaticArraysExt = "StaticArrays" 15 | 16 | [deps.Adapt.weakdeps] 17 | StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" 18 | 19 | [[deps.AliasTables]] 20 | deps = ["PtrArrays", "Random"] 21 | git-tree-sha1 = "9876e1e164b144ca45e9e3198d0b689cadfed9ff" 22 | uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" 23 | version = "1.1.3" 24 | 25 | [[deps.ArgTools]] 26 | uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" 27 | version = "1.1.1" 28 | 29 | [[deps.ArrayInterface]] 30 | deps = ["Adapt", "LinearAlgebra", "SparseArrays", "SuiteSparse"] 31 | git-tree-sha1 = "133a240faec6e074e07c31ee75619c90544179cf" 32 | uuid = "4fba245c-0d91-5ea0-9b3e-6abc04ee57a9" 33 | version = "7.10.0" 34 | 35 | [deps.ArrayInterface.extensions] 36 | ArrayInterfaceBandedMatricesExt = "BandedMatrices" 37 | ArrayInterfaceBlockBandedMatricesExt = "BlockBandedMatrices" 38 | ArrayInterfaceCUDAExt = "CUDA" 39 | ArrayInterfaceCUDSSExt = "CUDSS" 40 | ArrayInterfaceChainRulesExt = "ChainRules" 41 | ArrayInterfaceGPUArraysCoreExt = "GPUArraysCore" 42 | ArrayInterfaceReverseDiffExt = "ReverseDiff" 43 | ArrayInterfaceStaticArraysCoreExt = "StaticArraysCore" 44 | ArrayInterfaceTrackerExt = "Tracker" 45 | 46 | [deps.ArrayInterface.weakdeps] 47 | BandedMatrices = "aae01518-5342-5314-be14-df237901396f" 48 | BlockBandedMatrices = "ffab5731-97b5-5995-9138-79e8c1846df0" 49 | CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" 50 | CUDSS = "45b445bb-4962-46a0-9369-b4df9d0f772e" 51 | ChainRules = "082447d4-558c-5d27-93f4-14fc19e9eca2" 52 | GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" 53 | ReverseDiff = "37e2e3b7-166d-5795-8a7a-e32c996b4267" 54 | StaticArraysCore = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" 55 | Tracker = "9f7883ad-71c0-57eb-9f7f-b5c9e6d3789c" 56 | 57 | [[deps.Artifacts]] 58 | uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" 59 | 60 | [[deps.Base64]] 61 | uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" 62 | 63 | [[deps.BitFlags]] 64 | git-tree-sha1 = "2dc09997850d68179b69dafb58ae806167a32b1b" 65 | uuid = "d1d4a3ce-64b1-5f1a-9ba4-7e7e69966f35" 66 | version = "0.1.8" 67 | 68 | [[deps.BitTwiddlingConvenienceFunctions]] 69 | deps = ["Static"] 70 | git-tree-sha1 = "0c5f81f47bbbcf4aea7b2959135713459170798b" 71 | uuid = "62783981-4cbd-42fc-bca8-16325de8dc4b" 72 | version = "0.1.5" 73 | 74 | [[deps.Bzip2_jll]] 75 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 76 | git-tree-sha1 = "9e2a6b69137e6969bab0152632dcb3bc108c8bdd" 77 | uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" 78 | version = "1.0.8+1" 79 | 80 | [[deps.CPUSummary]] 81 | deps = ["CpuId", "IfElse", "PrecompileTools", "Static"] 82 | git-tree-sha1 = "585a387a490f1c4bd88be67eea15b93da5e85db7" 83 | uuid = "2a0fbf3d-bb9c-48f3-b0a9-814d99fd7ab9" 84 | version = "0.2.5" 85 | 86 | [[deps.Cairo_jll]] 87 | deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] 88 | git-tree-sha1 = "a4c43f59baa34011e303e76f5c8c91bf58415aaf" 89 | uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" 90 | version = "1.18.0+1" 91 | 92 | [[deps.Calculus]] 93 | deps = ["LinearAlgebra"] 94 | git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" 95 | uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" 96 | version = "0.5.1" 97 | 98 | [[deps.CloseOpenIntervals]] 99 | deps = ["Static", "StaticArrayInterface"] 100 | git-tree-sha1 = "70232f82ffaab9dc52585e0dd043b5e0c6b714f1" 101 | uuid = "fb6a15b2-703c-40df-9091-08a04967cfa9" 102 | version = "0.1.12" 103 | 104 | [[deps.CodeTracking]] 105 | deps = ["InteractiveUtils", "UUIDs"] 106 | git-tree-sha1 = "c0216e792f518b39b22212127d4a84dc31e4e386" 107 | uuid = "da1fd8a2-8d9e-5ec2-8556-3022fb5608a2" 108 | version = "1.3.5" 109 | 110 | [[deps.CodecZlib]] 111 | deps = ["TranscodingStreams", "Zlib_jll"] 112 | git-tree-sha1 = "59939d8a997469ee05c4b4944560a820f9ba0d73" 113 | uuid = "944b1d66-785c-5afd-91f1-9de20f533193" 114 | version = "0.7.4" 115 | 116 | [[deps.ColorSchemes]] 117 | deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] 118 | git-tree-sha1 = "4b270d6465eb21ae89b732182c20dc165f8bf9f2" 119 | uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" 120 | version = "3.25.0" 121 | 122 | [[deps.ColorTypes]] 123 | deps = ["FixedPointNumbers", "Random"] 124 | git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" 125 | uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" 126 | version = "0.11.5" 127 | 128 | [[deps.ColorVectorSpace]] 129 | deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] 130 | git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" 131 | uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" 132 | version = "0.10.0" 133 | weakdeps = ["SpecialFunctions"] 134 | 135 | [deps.ColorVectorSpace.extensions] 136 | SpecialFunctionsExt = "SpecialFunctions" 137 | 138 | [[deps.Colors]] 139 | deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] 140 | git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0" 141 | uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" 142 | version = "0.12.11" 143 | 144 | [[deps.Compat]] 145 | deps = ["TOML", "UUIDs"] 146 | git-tree-sha1 = "b1c55339b7c6c350ee89f2c1604299660525b248" 147 | uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" 148 | version = "4.15.0" 149 | weakdeps = ["Dates", "LinearAlgebra"] 150 | 151 | [deps.Compat.extensions] 152 | CompatLinearAlgebraExt = "LinearAlgebra" 153 | 154 | [[deps.CompilerSupportLibraries_jll]] 155 | deps = ["Artifacts", "Libdl"] 156 | uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" 157 | version = "1.1.1+0" 158 | 159 | [[deps.ConcurrentUtilities]] 160 | deps = ["Serialization", "Sockets"] 161 | git-tree-sha1 = "6cbbd4d241d7e6579ab354737f4dd95ca43946e1" 162 | uuid = "f0e56b4a-5159-44fe-b623-3e5288b988bb" 163 | version = "2.4.1" 164 | 165 | [[deps.Conda]] 166 | deps = ["Downloads", "JSON", "VersionParsing"] 167 | git-tree-sha1 = "51cab8e982c5b598eea9c8ceaced4b58d9dd37c9" 168 | uuid = "8f4d0f93-b110-5947-807f-2305c1781a2d" 169 | version = "1.10.0" 170 | 171 | [[deps.Contour]] 172 | git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" 173 | uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" 174 | version = "0.6.3" 175 | 176 | [[deps.CpuId]] 177 | deps = ["Markdown"] 178 | git-tree-sha1 = "fcbb72b032692610bfbdb15018ac16a36cf2e406" 179 | uuid = "adafc99b-e345-5852-983c-f28acb93d879" 180 | version = "0.3.1" 181 | 182 | [[deps.DataAPI]] 183 | git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" 184 | uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" 185 | version = "1.16.0" 186 | 187 | [[deps.DataStructures]] 188 | deps = ["Compat", "InteractiveUtils", "OrderedCollections"] 189 | git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" 190 | uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" 191 | version = "0.18.20" 192 | 193 | [[deps.Dates]] 194 | deps = ["Printf"] 195 | uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" 196 | 197 | [[deps.DelimitedFiles]] 198 | deps = ["Mmap"] 199 | git-tree-sha1 = "9e2f36d3c96a820c678f2f1f1782582fcf685bae" 200 | uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" 201 | version = "1.9.1" 202 | 203 | [[deps.Distributed]] 204 | deps = ["Random", "Serialization", "Sockets"] 205 | uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" 206 | 207 | [[deps.Distributions]] 208 | deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] 209 | git-tree-sha1 = "9c405847cc7ecda2dc921ccf18b47ca150d7317e" 210 | uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" 211 | version = "0.25.109" 212 | 213 | [deps.Distributions.extensions] 214 | DistributionsChainRulesCoreExt = "ChainRulesCore" 215 | DistributionsDensityInterfaceExt = "DensityInterface" 216 | DistributionsTestExt = "Test" 217 | 218 | [deps.Distributions.weakdeps] 219 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 220 | DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" 221 | Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" 222 | 223 | [[deps.DocStringExtensions]] 224 | deps = ["LibGit2"] 225 | git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" 226 | uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" 227 | version = "0.9.3" 228 | 229 | [[deps.Downloads]] 230 | deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] 231 | uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" 232 | version = "1.6.0" 233 | 234 | [[deps.DualNumbers]] 235 | deps = ["Calculus", "NaNMath", "SpecialFunctions"] 236 | git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566" 237 | uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74" 238 | version = "0.6.8" 239 | 240 | [[deps.EpollShim_jll]] 241 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 242 | git-tree-sha1 = "8e9441ee83492030ace98f9789a654a6d0b1f643" 243 | uuid = "2702e6a9-849d-5ed8-8c21-79e8b8f9ee43" 244 | version = "0.0.20230411+0" 245 | 246 | [[deps.ExceptionUnwrapping]] 247 | deps = ["Test"] 248 | git-tree-sha1 = "dcb08a0d93ec0b1cdc4af184b26b591e9695423a" 249 | uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" 250 | version = "0.1.10" 251 | 252 | [[deps.Expat_jll]] 253 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 254 | git-tree-sha1 = "1c6317308b9dc757616f0b5cb379db10494443a7" 255 | uuid = "2e619515-83b5-522b-bb60-26c02a35a201" 256 | version = "2.6.2+0" 257 | 258 | [[deps.FFMPEG]] 259 | deps = ["FFMPEG_jll"] 260 | git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" 261 | uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" 262 | version = "0.4.1" 263 | 264 | [[deps.FFMPEG_jll]] 265 | deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] 266 | git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" 267 | uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" 268 | version = "4.4.4+1" 269 | 270 | [[deps.FileWatching]] 271 | uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" 272 | 273 | [[deps.FillArrays]] 274 | deps = ["LinearAlgebra"] 275 | git-tree-sha1 = "0653c0a2396a6da5bc4766c43041ef5fd3efbe57" 276 | uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" 277 | version = "1.11.0" 278 | weakdeps = ["PDMats", "SparseArrays", "Statistics"] 279 | 280 | [deps.FillArrays.extensions] 281 | FillArraysPDMatsExt = "PDMats" 282 | FillArraysSparseArraysExt = "SparseArrays" 283 | FillArraysStatisticsExt = "Statistics" 284 | 285 | [[deps.FixedPointNumbers]] 286 | deps = ["Statistics"] 287 | git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" 288 | uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" 289 | version = "0.8.5" 290 | 291 | [[deps.Fontconfig_jll]] 292 | deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] 293 | git-tree-sha1 = "db16beca600632c95fc8aca29890d83788dd8b23" 294 | uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" 295 | version = "2.13.96+0" 296 | 297 | [[deps.Format]] 298 | git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" 299 | uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" 300 | version = "1.3.7" 301 | 302 | [[deps.FreeType2_jll]] 303 | deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] 304 | git-tree-sha1 = "d8db6a5a2fe1381c1ea4ef2cab7c69c2de7f9ea0" 305 | uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" 306 | version = "2.13.1+0" 307 | 308 | [[deps.FriBidi_jll]] 309 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 310 | git-tree-sha1 = "1ed150b39aebcc805c26b93a8d0122c940f64ce2" 311 | uuid = "559328eb-81f9-559d-9380-de523a88c83c" 312 | version = "1.0.14+0" 313 | 314 | [[deps.GLFW_jll]] 315 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] 316 | git-tree-sha1 = "ff38ba61beff76b8f4acad8ab0c97ef73bb670cb" 317 | uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" 318 | version = "3.3.9+0" 319 | 320 | [[deps.GR]] 321 | deps = ["Artifacts", "Base64", "DelimitedFiles", "Downloads", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Preferences", "Printf", "Random", "Serialization", "Sockets", "TOML", "Tar", "Test", "p7zip_jll"] 322 | git-tree-sha1 = "ddda044ca260ee324c5fc07edb6d7cf3f0b9c350" 323 | uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" 324 | version = "0.73.5" 325 | 326 | [[deps.GR_jll]] 327 | deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "FreeType2_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Qt6Base_jll", "Zlib_jll", "libpng_jll"] 328 | git-tree-sha1 = "278e5e0f820178e8a26df3184fcb2280717c79b1" 329 | uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" 330 | version = "0.73.5+0" 331 | 332 | [[deps.Gettext_jll]] 333 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] 334 | git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" 335 | uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" 336 | version = "0.21.0+0" 337 | 338 | [[deps.Glib_jll]] 339 | deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] 340 | git-tree-sha1 = "7c82e6a6cd34e9d935e9aa4051b66c6ff3af59ba" 341 | uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" 342 | version = "2.80.2+0" 343 | 344 | [[deps.Graphite2_jll]] 345 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 346 | git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" 347 | uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" 348 | version = "1.3.14+0" 349 | 350 | [[deps.Grisu]] 351 | git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" 352 | uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" 353 | version = "1.0.2" 354 | 355 | [[deps.HTTP]] 356 | deps = ["Base64", "CodecZlib", "ConcurrentUtilities", "Dates", "ExceptionUnwrapping", "Logging", "LoggingExtras", "MbedTLS", "NetworkOptions", "OpenSSL", "Random", "SimpleBufferStream", "Sockets", "URIs", "UUIDs"] 357 | git-tree-sha1 = "d1d712be3164d61d1fb98e7ce9bcbc6cc06b45ed" 358 | uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" 359 | version = "1.10.8" 360 | 361 | [[deps.HarfBuzz_jll]] 362 | deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] 363 | git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" 364 | uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" 365 | version = "2.8.1+1" 366 | 367 | [[deps.HostCPUFeatures]] 368 | deps = ["BitTwiddlingConvenienceFunctions", "IfElse", "Libdl", "Static"] 369 | git-tree-sha1 = "eb8fed28f4994600e29beef49744639d985a04b2" 370 | uuid = "3e5b6fbb-0976-4d2c-9146-d79de83f2fb0" 371 | version = "0.1.16" 372 | 373 | [[deps.HypergeometricFunctions]] 374 | deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] 375 | git-tree-sha1 = "f218fe3736ddf977e0e772bc9a586b2383da2685" 376 | uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" 377 | version = "0.3.23" 378 | 379 | [[deps.IfElse]] 380 | git-tree-sha1 = "debdd00ffef04665ccbb3e150747a77560e8fad1" 381 | uuid = "615f187c-cbe4-4ef1-ba3b-2fcf58d6d173" 382 | version = "0.1.1" 383 | 384 | [[deps.InteractiveUtils]] 385 | deps = ["Markdown"] 386 | uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" 387 | 388 | [[deps.IrrationalConstants]] 389 | git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" 390 | uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" 391 | version = "0.2.2" 392 | 393 | [[deps.JLFzf]] 394 | deps = ["Pipe", "REPL", "Random", "fzf_jll"] 395 | git-tree-sha1 = "a53ebe394b71470c7f97c2e7e170d51df21b17af" 396 | uuid = "1019f520-868f-41f5-a6de-eb00f4b6a39c" 397 | version = "0.1.7" 398 | 399 | [[deps.JLLWrappers]] 400 | deps = ["Artifacts", "Preferences"] 401 | git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" 402 | uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" 403 | version = "1.5.0" 404 | 405 | [[deps.JSON]] 406 | deps = ["Dates", "Mmap", "Parsers", "Unicode"] 407 | git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" 408 | uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" 409 | version = "0.21.4" 410 | 411 | [[deps.JpegTurbo_jll]] 412 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 413 | git-tree-sha1 = "c84a835e1a09b289ffcd2271bf2a337bbdda6637" 414 | uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" 415 | version = "3.0.3+0" 416 | 417 | [[deps.JuliaInterpreter]] 418 | deps = ["CodeTracking", "InteractiveUtils", "Random", "UUIDs"] 419 | git-tree-sha1 = "e9648d90370e2d0317f9518c9c6e0841db54a90b" 420 | uuid = "aa1ae85d-cabe-5617-a682-6adf51b2e16a" 421 | version = "0.9.31" 422 | 423 | [[deps.LAME_jll]] 424 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 425 | git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" 426 | uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" 427 | version = "3.100.2+0" 428 | 429 | [[deps.LERC_jll]] 430 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 431 | git-tree-sha1 = "bf36f528eec6634efc60d7ec062008f171071434" 432 | uuid = "88015f11-f218-50d7-93a8-a6af411a945d" 433 | version = "3.0.0+1" 434 | 435 | [[deps.LLVMOpenMP_jll]] 436 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 437 | git-tree-sha1 = "d986ce2d884d49126836ea94ed5bfb0f12679713" 438 | uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" 439 | version = "15.0.7+0" 440 | 441 | [[deps.LZO_jll]] 442 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 443 | git-tree-sha1 = "70c5da094887fd2cae843b8db33920bac4b6f07d" 444 | uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" 445 | version = "2.10.2+0" 446 | 447 | [[deps.LaTeXStrings]] 448 | git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec" 449 | uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" 450 | version = "1.3.1" 451 | 452 | [[deps.Latexify]] 453 | deps = ["Format", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "OrderedCollections", "Requires"] 454 | git-tree-sha1 = "e0b5cd21dc1b44ec6e64f351976f961e6f31d6c4" 455 | uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" 456 | version = "0.16.3" 457 | 458 | [deps.Latexify.extensions] 459 | DataFramesExt = "DataFrames" 460 | SymEngineExt = "SymEngine" 461 | 462 | [deps.Latexify.weakdeps] 463 | DataFrames = "a93c6f00-e57d-5684-b7b6-d8193f3e46c0" 464 | SymEngine = "123dc426-2d89-5057-bbad-38513e3affd8" 465 | 466 | [[deps.LayoutPointers]] 467 | deps = ["ArrayInterface", "LinearAlgebra", "ManualMemory", "SIMDTypes", "Static", "StaticArrayInterface"] 468 | git-tree-sha1 = "62edfee3211981241b57ff1cedf4d74d79519277" 469 | uuid = "10f19ff3-798f-405d-979b-55457f8fc047" 470 | version = "0.1.15" 471 | 472 | [[deps.LibCURL]] 473 | deps = ["LibCURL_jll", "MozillaCACerts_jll"] 474 | uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" 475 | version = "0.6.4" 476 | 477 | [[deps.LibCURL_jll]] 478 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] 479 | uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" 480 | version = "8.4.0+0" 481 | 482 | [[deps.LibGit2]] 483 | deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] 484 | uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" 485 | 486 | [[deps.LibGit2_jll]] 487 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] 488 | uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" 489 | version = "1.6.4+0" 490 | 491 | [[deps.LibSSH2_jll]] 492 | deps = ["Artifacts", "Libdl", "MbedTLS_jll"] 493 | uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" 494 | version = "1.11.0+1" 495 | 496 | [[deps.Libdl]] 497 | uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" 498 | 499 | [[deps.Libffi_jll]] 500 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 501 | git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" 502 | uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" 503 | version = "3.2.2+1" 504 | 505 | [[deps.Libgcrypt_jll]] 506 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] 507 | git-tree-sha1 = "9fd170c4bbfd8b935fdc5f8b7aa33532c991a673" 508 | uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" 509 | version = "1.8.11+0" 510 | 511 | [[deps.Libglvnd_jll]] 512 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] 513 | git-tree-sha1 = "6f73d1dd803986947b2c750138528a999a6c7733" 514 | uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" 515 | version = "1.6.0+0" 516 | 517 | [[deps.Libgpg_error_jll]] 518 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 519 | git-tree-sha1 = "fbb1f2bef882392312feb1ede3615ddc1e9b99ed" 520 | uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" 521 | version = "1.49.0+0" 522 | 523 | [[deps.Libiconv_jll]] 524 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 525 | git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" 526 | uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" 527 | version = "1.17.0+0" 528 | 529 | [[deps.Libmount_jll]] 530 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 531 | git-tree-sha1 = "0c4f9c4f1a50d8f35048fa0532dabbadf702f81e" 532 | uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" 533 | version = "2.40.1+0" 534 | 535 | [[deps.Libtiff_jll]] 536 | deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "LERC_jll", "Libdl", "XZ_jll", "Zlib_jll", "Zstd_jll"] 537 | git-tree-sha1 = "2da088d113af58221c52828a80378e16be7d037a" 538 | uuid = "89763e89-9b03-5906-acba-b20f662cd828" 539 | version = "4.5.1+1" 540 | 541 | [[deps.Libuuid_jll]] 542 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 543 | git-tree-sha1 = "5ee6203157c120d79034c748a2acba45b82b8807" 544 | uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" 545 | version = "2.40.1+0" 546 | 547 | [[deps.LinearAlgebra]] 548 | deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] 549 | uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" 550 | 551 | [[deps.LogExpFunctions]] 552 | deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] 553 | git-tree-sha1 = "18144f3e9cbe9b15b070288eef858f71b291ce37" 554 | uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" 555 | version = "0.3.27" 556 | 557 | [deps.LogExpFunctions.extensions] 558 | LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" 559 | LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" 560 | LogExpFunctionsInverseFunctionsExt = "InverseFunctions" 561 | 562 | [deps.LogExpFunctions.weakdeps] 563 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 564 | ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" 565 | InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" 566 | 567 | [[deps.Logging]] 568 | uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" 569 | 570 | [[deps.LoggingExtras]] 571 | deps = ["Dates", "Logging"] 572 | git-tree-sha1 = "c1dd6d7978c12545b4179fb6153b9250c96b0075" 573 | uuid = "e6f89c97-d47a-5376-807f-9c37f3926c36" 574 | version = "1.0.3" 575 | 576 | [[deps.LoopVectorization]] 577 | deps = ["ArrayInterface", "CPUSummary", "CloseOpenIntervals", "DocStringExtensions", "HostCPUFeatures", "IfElse", "LayoutPointers", "LinearAlgebra", "OffsetArrays", "PolyesterWeave", "PrecompileTools", "SIMDTypes", "SLEEFPirates", "Static", "StaticArrayInterface", "ThreadingUtilities", "UnPack", "VectorizationBase"] 578 | git-tree-sha1 = "8f6786d8b2b3248d79db3ad359ce95382d5a6df8" 579 | uuid = "bdcacae8-1622-11e9-2a5c-532679323890" 580 | version = "0.12.170" 581 | 582 | [deps.LoopVectorization.extensions] 583 | ForwardDiffExt = ["ChainRulesCore", "ForwardDiff"] 584 | SpecialFunctionsExt = "SpecialFunctions" 585 | 586 | [deps.LoopVectorization.weakdeps] 587 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 588 | ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" 589 | SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" 590 | 591 | [[deps.LoweredCodeUtils]] 592 | deps = ["JuliaInterpreter"] 593 | git-tree-sha1 = "31e27f0b0bf0df3e3e951bfcc43fe8c730a219f6" 594 | uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" 595 | version = "2.4.5" 596 | 597 | [[deps.MacroTools]] 598 | deps = ["Markdown", "Random"] 599 | git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" 600 | uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" 601 | version = "0.5.13" 602 | 603 | [[deps.ManualMemory]] 604 | git-tree-sha1 = "bcaef4fc7a0cfe2cba636d84cda54b5e4e4ca3cd" 605 | uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" 606 | version = "0.1.8" 607 | 608 | [[deps.Markdown]] 609 | deps = ["Base64"] 610 | uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" 611 | 612 | [[deps.MbedTLS]] 613 | deps = ["Dates", "MbedTLS_jll", "MozillaCACerts_jll", "NetworkOptions", "Random", "Sockets"] 614 | git-tree-sha1 = "c067a280ddc25f196b5e7df3877c6b226d390aaf" 615 | uuid = "739be429-bea8-5141-9913-cc70e7f3736d" 616 | version = "1.1.9" 617 | 618 | [[deps.MbedTLS_jll]] 619 | deps = ["Artifacts", "Libdl"] 620 | uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" 621 | version = "2.28.2+1" 622 | 623 | [[deps.Measures]] 624 | git-tree-sha1 = "c13304c81eec1ed3af7fc20e75fb6b26092a1102" 625 | uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" 626 | version = "0.3.2" 627 | 628 | [[deps.Missings]] 629 | deps = ["DataAPI"] 630 | git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" 631 | uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" 632 | version = "1.2.0" 633 | 634 | [[deps.Mmap]] 635 | uuid = "a63ad114-7e13-5084-954f-fe012c677804" 636 | 637 | [[deps.MozillaCACerts_jll]] 638 | uuid = "14a3606d-f60d-562e-9121-12d972cd8159" 639 | version = "2023.1.10" 640 | 641 | [[deps.NaNMath]] 642 | deps = ["OpenLibm_jll"] 643 | git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" 644 | uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" 645 | version = "1.0.2" 646 | 647 | [[deps.NetworkOptions]] 648 | uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" 649 | version = "1.2.0" 650 | 651 | [[deps.OffsetArrays]] 652 | git-tree-sha1 = "e64b4f5ea6b7389f6f046d13d4896a8f9c1ba71e" 653 | uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" 654 | version = "1.14.0" 655 | weakdeps = ["Adapt"] 656 | 657 | [deps.OffsetArrays.extensions] 658 | OffsetArraysAdaptExt = "Adapt" 659 | 660 | [[deps.Ogg_jll]] 661 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 662 | git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" 663 | uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" 664 | version = "1.3.5+1" 665 | 666 | [[deps.OpenBLAS_jll]] 667 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] 668 | uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" 669 | version = "0.3.23+4" 670 | 671 | [[deps.OpenLibm_jll]] 672 | deps = ["Artifacts", "Libdl"] 673 | uuid = "05823500-19ac-5b8b-9628-191a04bc5112" 674 | version = "0.8.1+2" 675 | 676 | [[deps.OpenSSL]] 677 | deps = ["BitFlags", "Dates", "MozillaCACerts_jll", "OpenSSL_jll", "Sockets"] 678 | git-tree-sha1 = "38cb508d080d21dc1128f7fb04f20387ed4c0af4" 679 | uuid = "4d8831e6-92b7-49fb-bdf8-b643e874388c" 680 | version = "1.4.3" 681 | 682 | [[deps.OpenSSL_jll]] 683 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 684 | git-tree-sha1 = "3da7367955dcc5c54c1ba4d402ccdc09a1a3e046" 685 | uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" 686 | version = "3.0.13+1" 687 | 688 | [[deps.OpenSpecFun_jll]] 689 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] 690 | git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" 691 | uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" 692 | version = "0.5.5+0" 693 | 694 | [[deps.Opus_jll]] 695 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 696 | git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" 697 | uuid = "91d4177d-7536-5919-b921-800302f37372" 698 | version = "1.3.2+0" 699 | 700 | [[deps.OrderedCollections]] 701 | git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" 702 | uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" 703 | version = "1.6.3" 704 | 705 | [[deps.PCRE2_jll]] 706 | deps = ["Artifacts", "Libdl"] 707 | uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" 708 | version = "10.42.0+1" 709 | 710 | [[deps.PDMats]] 711 | deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] 712 | git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65" 713 | uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" 714 | version = "0.11.31" 715 | 716 | [[deps.Parameters]] 717 | deps = ["OrderedCollections", "UnPack"] 718 | git-tree-sha1 = "34c0e9ad262e5f7fc75b10a9952ca7692cfc5fbe" 719 | uuid = "d96e819e-fc66-5662-9728-84c9c7592b0a" 720 | version = "0.12.3" 721 | 722 | [[deps.Parsers]] 723 | deps = ["Dates", "PrecompileTools", "UUIDs"] 724 | git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" 725 | uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" 726 | version = "2.8.1" 727 | 728 | [[deps.Pipe]] 729 | git-tree-sha1 = "6842804e7867b115ca9de748a0cf6b364523c16d" 730 | uuid = "b98c9c47-44ae-5843-9183-064241ee97a0" 731 | version = "1.3.0" 732 | 733 | [[deps.Pixman_jll]] 734 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] 735 | git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b" 736 | uuid = "30392449-352a-5448-841d-b1acce4e97dc" 737 | version = "0.43.4+0" 738 | 739 | [[deps.Pkg]] 740 | deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] 741 | uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" 742 | version = "1.10.0" 743 | 744 | [[deps.PlotThemes]] 745 | deps = ["PlotUtils", "Statistics"] 746 | git-tree-sha1 = "1f03a2d339f42dca4a4da149c7e15e9b896ad899" 747 | uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" 748 | version = "3.1.0" 749 | 750 | [[deps.PlotUtils]] 751 | deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"] 752 | git-tree-sha1 = "7b1a9df27f072ac4c9c7cbe5efb198489258d1f5" 753 | uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" 754 | version = "1.4.1" 755 | 756 | [[deps.Plots]] 757 | deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "JLFzf", "JSON", "LaTeXStrings", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "Pkg", "PlotThemes", "PlotUtils", "PrecompileTools", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "RelocatableFolders", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "UnitfulLatexify", "Unzip"] 758 | git-tree-sha1 = "442e1e7ac27dd5ff8825c3fa62fbd1e86397974b" 759 | uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" 760 | version = "1.40.4" 761 | 762 | [deps.Plots.extensions] 763 | FileIOExt = "FileIO" 764 | GeometryBasicsExt = "GeometryBasics" 765 | IJuliaExt = "IJulia" 766 | ImageInTerminalExt = "ImageInTerminal" 767 | UnitfulExt = "Unitful" 768 | 769 | [deps.Plots.weakdeps] 770 | FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" 771 | GeometryBasics = "5c1252a2-5f33-56bf-86c9-59e7332b4326" 772 | IJulia = "7073ff75-c697-5162-941a-fcdaad2a7d2a" 773 | ImageInTerminal = "d8c32880-2388-543b-8c61-d9f865259254" 774 | Unitful = "1986cc42-f94f-5a68-af5c-568840ba703d" 775 | 776 | [[deps.PolyesterWeave]] 777 | deps = ["BitTwiddlingConvenienceFunctions", "CPUSummary", "IfElse", "Static", "ThreadingUtilities"] 778 | git-tree-sha1 = "240d7170f5ffdb285f9427b92333c3463bf65bf6" 779 | uuid = "1d0040c9-8b98-4ee7-8388-3f51789ca0ad" 780 | version = "0.2.1" 781 | 782 | [[deps.PrecompileTools]] 783 | deps = ["Preferences"] 784 | git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" 785 | uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" 786 | version = "1.2.1" 787 | 788 | [[deps.Preferences]] 789 | deps = ["TOML"] 790 | git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" 791 | uuid = "21216c6a-2e73-6563-6e65-726566657250" 792 | version = "1.4.3" 793 | 794 | [[deps.Printf]] 795 | deps = ["Unicode"] 796 | uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" 797 | 798 | [[deps.Profile]] 799 | deps = ["Printf"] 800 | uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" 801 | 802 | [[deps.ProfileCanvas]] 803 | deps = ["Base64", "JSON", "Pkg", "Profile", "REPL"] 804 | git-tree-sha1 = "e42571ce9a614c2fbebcaa8aab23bbf8865c624e" 805 | uuid = "efd6af41-a80b-495e-886c-e51b0c7d77a3" 806 | version = "0.1.6" 807 | 808 | [[deps.ProtoStructs]] 809 | git-tree-sha1 = "18fc867e6190b93289b0cb462f8d4fc5cc281e5e" 810 | uuid = "437b6fc4-8e8e-11e9-3fa1-ad391e66c018" 811 | version = "1.2.0" 812 | 813 | [[deps.PtrArrays]] 814 | git-tree-sha1 = "f011fbb92c4d401059b2212c05c0601b70f8b759" 815 | uuid = "43287f4e-b6f4-7ad1-bb20-aadabca52c3d" 816 | version = "1.2.0" 817 | 818 | [[deps.PyCall]] 819 | deps = ["Conda", "Dates", "Libdl", "LinearAlgebra", "MacroTools", "Serialization", "VersionParsing"] 820 | git-tree-sha1 = "9816a3826b0ebf49ab4926e2b18842ad8b5c8f04" 821 | uuid = "438e738f-606a-5dbb-bf0a-cddfbfd45ab0" 822 | version = "1.96.4" 823 | 824 | [[deps.PyPlot]] 825 | deps = ["Colors", "LaTeXStrings", "PyCall", "Sockets", "Test", "VersionParsing"] 826 | git-tree-sha1 = "9220a9dae0369f431168d60adab635f88aca7857" 827 | uuid = "d330b81b-6aea-500a-939a-2ce795aea3ee" 828 | version = "2.11.2" 829 | 830 | [[deps.Qt6Base_jll]] 831 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Vulkan_Loader_jll", "Xorg_libSM_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_cursor_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "libinput_jll", "xkbcommon_jll"] 832 | git-tree-sha1 = "37b7bb7aabf9a085e0044307e1717436117f2b3b" 833 | uuid = "c0090381-4147-56d7-9ebc-da0b1113ec56" 834 | version = "6.5.3+1" 835 | 836 | [[deps.QuadGK]] 837 | deps = ["DataStructures", "LinearAlgebra"] 838 | git-tree-sha1 = "9b23c31e76e333e6fb4c1595ae6afa74966a729e" 839 | uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" 840 | version = "2.9.4" 841 | 842 | [[deps.REPL]] 843 | deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] 844 | uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" 845 | 846 | [[deps.Random]] 847 | deps = ["SHA"] 848 | uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" 849 | 850 | [[deps.RecipesBase]] 851 | deps = ["PrecompileTools"] 852 | git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" 853 | uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" 854 | version = "1.3.4" 855 | 856 | [[deps.RecipesPipeline]] 857 | deps = ["Dates", "NaNMath", "PlotUtils", "PrecompileTools", "RecipesBase"] 858 | git-tree-sha1 = "45cf9fd0ca5839d06ef333c8201714e888486342" 859 | uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" 860 | version = "0.6.12" 861 | 862 | [[deps.Reexport]] 863 | git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" 864 | uuid = "189a3867-3050-52da-a836-e630ba90ab69" 865 | version = "1.2.2" 866 | 867 | [[deps.RelocatableFolders]] 868 | deps = ["SHA", "Scratch"] 869 | git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" 870 | uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" 871 | version = "1.0.1" 872 | 873 | [[deps.Requires]] 874 | deps = ["UUIDs"] 875 | git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" 876 | uuid = "ae029012-a4dd-5104-9daa-d747884805df" 877 | version = "1.3.0" 878 | 879 | [[deps.Revise]] 880 | deps = ["CodeTracking", "Distributed", "FileWatching", "JuliaInterpreter", "LibGit2", "LoweredCodeUtils", "OrderedCollections", "Pkg", "REPL", "Requires", "UUIDs", "Unicode"] 881 | git-tree-sha1 = "12aa2d7593df490c407a3bbd8b86b8b515017f3e" 882 | uuid = "295af30f-e4ad-537b-8983-00126c2a3abe" 883 | version = "3.5.14" 884 | 885 | [[deps.Rmath]] 886 | deps = ["Random", "Rmath_jll"] 887 | git-tree-sha1 = "f65dcb5fa46aee0cf9ed6274ccbd597adc49aa7b" 888 | uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" 889 | version = "0.7.1" 890 | 891 | [[deps.Rmath_jll]] 892 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 893 | git-tree-sha1 = "d483cd324ce5cf5d61b77930f0bbd6cb61927d21" 894 | uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" 895 | version = "0.4.2+0" 896 | 897 | [[deps.SHA]] 898 | uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" 899 | version = "0.7.0" 900 | 901 | [[deps.SIMDTypes]] 902 | git-tree-sha1 = "330289636fb8107c5f32088d2741e9fd7a061a5c" 903 | uuid = "94e857df-77ce-4151-89e5-788b33177be4" 904 | version = "0.1.0" 905 | 906 | [[deps.SLEEFPirates]] 907 | deps = ["IfElse", "Static", "VectorizationBase"] 908 | git-tree-sha1 = "3aac6d68c5e57449f5b9b865c9ba50ac2970c4cf" 909 | uuid = "476501e8-09a2-5ece-8869-fb82de89a1fa" 910 | version = "0.6.42" 911 | 912 | [[deps.Scratch]] 913 | deps = ["Dates"] 914 | git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" 915 | uuid = "6c6a2e73-6563-6170-7368-637461726353" 916 | version = "1.2.1" 917 | 918 | [[deps.Serialization]] 919 | uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" 920 | 921 | [[deps.Showoff]] 922 | deps = ["Dates", "Grisu"] 923 | git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" 924 | uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" 925 | version = "1.0.3" 926 | 927 | [[deps.SimpleBufferStream]] 928 | git-tree-sha1 = "874e8867b33a00e784c8a7e4b60afe9e037b74e1" 929 | uuid = "777ac1f9-54b0-4bf8-805c-2214025038e7" 930 | version = "1.1.0" 931 | 932 | [[deps.Sockets]] 933 | uuid = "6462fe0b-24de-5631-8697-dd941f90decc" 934 | 935 | [[deps.SortingAlgorithms]] 936 | deps = ["DataStructures"] 937 | git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" 938 | uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" 939 | version = "1.2.1" 940 | 941 | [[deps.SparseArrays]] 942 | deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] 943 | uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" 944 | version = "1.10.0" 945 | 946 | [[deps.SpecialFunctions]] 947 | deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] 948 | git-tree-sha1 = "2f5d4697f21388cbe1ff299430dd169ef97d7e14" 949 | uuid = "276daf66-3868-5448-9aa4-cd146d93841b" 950 | version = "2.4.0" 951 | 952 | [deps.SpecialFunctions.extensions] 953 | SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" 954 | 955 | [deps.SpecialFunctions.weakdeps] 956 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 957 | 958 | [[deps.Static]] 959 | deps = ["IfElse"] 960 | git-tree-sha1 = "d2fdac9ff3906e27f7a618d47b676941baa6c80c" 961 | uuid = "aedffcd0-7271-4cad-89d0-dc628f76c6d3" 962 | version = "0.8.10" 963 | 964 | [[deps.StaticArrayInterface]] 965 | deps = ["ArrayInterface", "Compat", "IfElse", "LinearAlgebra", "PrecompileTools", "Requires", "SparseArrays", "Static", "SuiteSparse"] 966 | git-tree-sha1 = "5d66818a39bb04bf328e92bc933ec5b4ee88e436" 967 | uuid = "0d7ed370-da01-4f52-bd93-41d350b8b718" 968 | version = "1.5.0" 969 | 970 | [deps.StaticArrayInterface.extensions] 971 | StaticArrayInterfaceOffsetArraysExt = "OffsetArrays" 972 | StaticArrayInterfaceStaticArraysExt = "StaticArrays" 973 | 974 | [deps.StaticArrayInterface.weakdeps] 975 | OffsetArrays = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" 976 | StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" 977 | 978 | [[deps.Statistics]] 979 | deps = ["LinearAlgebra", "SparseArrays"] 980 | uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" 981 | version = "1.10.0" 982 | 983 | [[deps.StatsAPI]] 984 | deps = ["LinearAlgebra"] 985 | git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" 986 | uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" 987 | version = "1.7.0" 988 | 989 | [[deps.StatsBase]] 990 | deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] 991 | git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21" 992 | uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" 993 | version = "0.34.3" 994 | 995 | [[deps.StatsFuns]] 996 | deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] 997 | git-tree-sha1 = "cef0472124fab0695b58ca35a77c6fb942fdab8a" 998 | uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" 999 | version = "1.3.1" 1000 | 1001 | [deps.StatsFuns.extensions] 1002 | StatsFunsChainRulesCoreExt = "ChainRulesCore" 1003 | StatsFunsInverseFunctionsExt = "InverseFunctions" 1004 | 1005 | [deps.StatsFuns.weakdeps] 1006 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 1007 | InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" 1008 | 1009 | [[deps.SuiteSparse]] 1010 | deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] 1011 | uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" 1012 | 1013 | [[deps.SuiteSparse_jll]] 1014 | deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] 1015 | uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" 1016 | version = "7.2.1+1" 1017 | 1018 | [[deps.TOML]] 1019 | deps = ["Dates"] 1020 | uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" 1021 | version = "1.0.3" 1022 | 1023 | [[deps.Tar]] 1024 | deps = ["ArgTools", "SHA"] 1025 | uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" 1026 | version = "1.10.0" 1027 | 1028 | [[deps.TensorCore]] 1029 | deps = ["LinearAlgebra"] 1030 | git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" 1031 | uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" 1032 | version = "0.1.1" 1033 | 1034 | [[deps.Test]] 1035 | deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] 1036 | uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" 1037 | 1038 | [[deps.ThreadingUtilities]] 1039 | deps = ["ManualMemory"] 1040 | git-tree-sha1 = "eda08f7e9818eb53661b3deb74e3159460dfbc27" 1041 | uuid = "8290d209-cae3-49c0-8002-c8c24d57dab5" 1042 | version = "0.5.2" 1043 | 1044 | [[deps.TranscodingStreams]] 1045 | git-tree-sha1 = "5d54d076465da49d6746c647022f3b3674e64156" 1046 | uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" 1047 | version = "0.10.8" 1048 | weakdeps = ["Random", "Test"] 1049 | 1050 | [deps.TranscodingStreams.extensions] 1051 | TestExt = ["Test", "Random"] 1052 | 1053 | [[deps.URIs]] 1054 | git-tree-sha1 = "67db6cc7b3821e19ebe75791a9dd19c9b1188f2b" 1055 | uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" 1056 | version = "1.5.1" 1057 | 1058 | [[deps.UUIDs]] 1059 | deps = ["Random", "SHA"] 1060 | uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" 1061 | 1062 | [[deps.UnPack]] 1063 | git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" 1064 | uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" 1065 | version = "1.0.2" 1066 | 1067 | [[deps.Unicode]] 1068 | uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" 1069 | 1070 | [[deps.UnicodeFun]] 1071 | deps = ["REPL"] 1072 | git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" 1073 | uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" 1074 | version = "0.4.1" 1075 | 1076 | [[deps.Unitful]] 1077 | deps = ["Dates", "LinearAlgebra", "Random"] 1078 | git-tree-sha1 = "352edac1ad17e018186881b051960bfca78a075a" 1079 | uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" 1080 | version = "1.19.1" 1081 | 1082 | [deps.Unitful.extensions] 1083 | ConstructionBaseUnitfulExt = "ConstructionBase" 1084 | InverseFunctionsUnitfulExt = "InverseFunctions" 1085 | 1086 | [deps.Unitful.weakdeps] 1087 | ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" 1088 | InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" 1089 | 1090 | [[deps.UnitfulLatexify]] 1091 | deps = ["LaTeXStrings", "Latexify", "Unitful"] 1092 | git-tree-sha1 = "e2d817cc500e960fdbafcf988ac8436ba3208bfd" 1093 | uuid = "45397f5d-5981-4c77-b2b3-fc36d6e9b728" 1094 | version = "1.6.3" 1095 | 1096 | [[deps.Unzip]] 1097 | git-tree-sha1 = "ca0969166a028236229f63514992fc073799bb78" 1098 | uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" 1099 | version = "0.2.0" 1100 | 1101 | [[deps.VectorizationBase]] 1102 | deps = ["ArrayInterface", "CPUSummary", "HostCPUFeatures", "IfElse", "LayoutPointers", "Libdl", "LinearAlgebra", "SIMDTypes", "Static", "StaticArrayInterface"] 1103 | git-tree-sha1 = "6129a4faf6242e7c3581116fbe3270f3ab17c90d" 1104 | uuid = "3d5dd08c-fd9d-11e8-17fa-ed2836048c2f" 1105 | version = "0.21.67" 1106 | 1107 | [[deps.VersionParsing]] 1108 | git-tree-sha1 = "58d6e80b4ee071f5efd07fda82cb9fbe17200868" 1109 | uuid = "81def892-9a0e-5fdd-b105-ffc91e053289" 1110 | version = "1.3.0" 1111 | 1112 | [[deps.Vulkan_Loader_jll]] 1113 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Wayland_jll", "Xorg_libX11_jll", "Xorg_libXrandr_jll", "xkbcommon_jll"] 1114 | git-tree-sha1 = "2f0486047a07670caad3a81a075d2e518acc5c59" 1115 | uuid = "a44049a8-05dd-5a78-86c9-5fde0876e88c" 1116 | version = "1.3.243+0" 1117 | 1118 | [[deps.Wayland_jll]] 1119 | deps = ["Artifacts", "EpollShim_jll", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] 1120 | git-tree-sha1 = "7558e29847e99bc3f04d6569e82d0f5c54460703" 1121 | uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" 1122 | version = "1.21.0+1" 1123 | 1124 | [[deps.Wayland_protocols_jll]] 1125 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1126 | git-tree-sha1 = "93f43ab61b16ddfb2fd3bb13b3ce241cafb0e6c9" 1127 | uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" 1128 | version = "1.31.0+0" 1129 | 1130 | [[deps.XML2_jll]] 1131 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] 1132 | git-tree-sha1 = "532e22cf7be8462035d092ff21fada7527e2c488" 1133 | uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" 1134 | version = "2.12.6+0" 1135 | 1136 | [[deps.XSLT_jll]] 1137 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] 1138 | git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" 1139 | uuid = "aed1982a-8fda-507f-9586-7b0439959a61" 1140 | version = "1.1.34+0" 1141 | 1142 | [[deps.XZ_jll]] 1143 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1144 | git-tree-sha1 = "ac88fb95ae6447c8dda6a5503f3bafd496ae8632" 1145 | uuid = "ffd25f8a-64ca-5728-b0f7-c24cf3aae800" 1146 | version = "5.4.6+0" 1147 | 1148 | [[deps.Xorg_libICE_jll]] 1149 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1150 | git-tree-sha1 = "326b4fea307b0b39892b3e85fa451692eda8d46c" 1151 | uuid = "f67eecfb-183a-506d-b269-f58e52b52d7c" 1152 | version = "1.1.1+0" 1153 | 1154 | [[deps.Xorg_libSM_jll]] 1155 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libICE_jll"] 1156 | git-tree-sha1 = "3796722887072218eabafb494a13c963209754ce" 1157 | uuid = "c834827a-8449-5923-a945-d239c165b7dd" 1158 | version = "1.2.4+0" 1159 | 1160 | [[deps.Xorg_libX11_jll]] 1161 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] 1162 | git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" 1163 | uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" 1164 | version = "1.8.6+0" 1165 | 1166 | [[deps.Xorg_libXau_jll]] 1167 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1168 | git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" 1169 | uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" 1170 | version = "1.0.11+0" 1171 | 1172 | [[deps.Xorg_libXcursor_jll]] 1173 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] 1174 | git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" 1175 | uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" 1176 | version = "1.2.0+4" 1177 | 1178 | [[deps.Xorg_libXdmcp_jll]] 1179 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1180 | git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" 1181 | uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" 1182 | version = "1.1.4+0" 1183 | 1184 | [[deps.Xorg_libXext_jll]] 1185 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] 1186 | git-tree-sha1 = "d2d1a5c49fae4ba39983f63de6afcbea47194e85" 1187 | uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" 1188 | version = "1.3.6+0" 1189 | 1190 | [[deps.Xorg_libXfixes_jll]] 1191 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] 1192 | git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" 1193 | uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" 1194 | version = "5.0.3+4" 1195 | 1196 | [[deps.Xorg_libXi_jll]] 1197 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] 1198 | git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" 1199 | uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" 1200 | version = "1.7.10+4" 1201 | 1202 | [[deps.Xorg_libXinerama_jll]] 1203 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] 1204 | git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" 1205 | uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" 1206 | version = "1.1.4+4" 1207 | 1208 | [[deps.Xorg_libXrandr_jll]] 1209 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] 1210 | git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" 1211 | uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" 1212 | version = "1.5.2+4" 1213 | 1214 | [[deps.Xorg_libXrender_jll]] 1215 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] 1216 | git-tree-sha1 = "47e45cd78224c53109495b3e324df0c37bb61fbe" 1217 | uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" 1218 | version = "0.9.11+0" 1219 | 1220 | [[deps.Xorg_libpthread_stubs_jll]] 1221 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1222 | git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" 1223 | uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" 1224 | version = "0.1.1+0" 1225 | 1226 | [[deps.Xorg_libxcb_jll]] 1227 | deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] 1228 | git-tree-sha1 = "b4bfde5d5b652e22b9c790ad00af08b6d042b97d" 1229 | uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" 1230 | version = "1.15.0+0" 1231 | 1232 | [[deps.Xorg_libxkbfile_jll]] 1233 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] 1234 | git-tree-sha1 = "730eeca102434283c50ccf7d1ecdadf521a765a4" 1235 | uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" 1236 | version = "1.1.2+0" 1237 | 1238 | [[deps.Xorg_xcb_util_cursor_jll]] 1239 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_jll", "Xorg_xcb_util_renderutil_jll"] 1240 | git-tree-sha1 = "04341cb870f29dcd5e39055f895c39d016e18ccd" 1241 | uuid = "e920d4aa-a673-5f3a-b3d7-f755a4d47c43" 1242 | version = "0.1.4+0" 1243 | 1244 | [[deps.Xorg_xcb_util_image_jll]] 1245 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] 1246 | git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" 1247 | uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" 1248 | version = "0.4.0+1" 1249 | 1250 | [[deps.Xorg_xcb_util_jll]] 1251 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] 1252 | git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" 1253 | uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" 1254 | version = "0.4.0+1" 1255 | 1256 | [[deps.Xorg_xcb_util_keysyms_jll]] 1257 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] 1258 | git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" 1259 | uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" 1260 | version = "0.4.0+1" 1261 | 1262 | [[deps.Xorg_xcb_util_renderutil_jll]] 1263 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] 1264 | git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" 1265 | uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" 1266 | version = "0.3.9+1" 1267 | 1268 | [[deps.Xorg_xcb_util_wm_jll]] 1269 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] 1270 | git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" 1271 | uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" 1272 | version = "0.4.1+1" 1273 | 1274 | [[deps.Xorg_xkbcomp_jll]] 1275 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxkbfile_jll"] 1276 | git-tree-sha1 = "330f955bc41bb8f5270a369c473fc4a5a4e4d3cb" 1277 | uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" 1278 | version = "1.4.6+0" 1279 | 1280 | [[deps.Xorg_xkeyboard_config_jll]] 1281 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_xkbcomp_jll"] 1282 | git-tree-sha1 = "691634e5453ad362044e2ad653e79f3ee3bb98c3" 1283 | uuid = "33bec58e-1273-512f-9401-5d533626f822" 1284 | version = "2.39.0+0" 1285 | 1286 | [[deps.Xorg_xtrans_jll]] 1287 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1288 | git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" 1289 | uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" 1290 | version = "1.5.0+0" 1291 | 1292 | [[deps.Zlib_jll]] 1293 | deps = ["Libdl"] 1294 | uuid = "83775a58-1f1d-513f-b197-d71354ab007a" 1295 | version = "1.2.13+1" 1296 | 1297 | [[deps.Zstd_jll]] 1298 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1299 | git-tree-sha1 = "e678132f07ddb5bfa46857f0d7620fb9be675d3b" 1300 | uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" 1301 | version = "1.5.6+0" 1302 | 1303 | [[deps.eudev_jll]] 1304 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "gperf_jll"] 1305 | git-tree-sha1 = "431b678a28ebb559d224c0b6b6d01afce87c51ba" 1306 | uuid = "35ca27e7-8b34-5b7f-bca9-bdc33f59eb06" 1307 | version = "3.2.9+0" 1308 | 1309 | [[deps.fzf_jll]] 1310 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1311 | git-tree-sha1 = "a68c9655fbe6dfcab3d972808f1aafec151ce3f8" 1312 | uuid = "214eeab7-80f7-51ab-84ad-2988db7cef09" 1313 | version = "0.43.0+0" 1314 | 1315 | [[deps.gperf_jll]] 1316 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1317 | git-tree-sha1 = "3516a5630f741c9eecb3720b1ec9d8edc3ecc033" 1318 | uuid = "1a1c6b14-54f6-533d-8383-74cd7377aa70" 1319 | version = "3.1.1+0" 1320 | 1321 | [[deps.libaom_jll]] 1322 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1323 | git-tree-sha1 = "3a2ea60308f0996d26f1e5354e10c24e9ef905d4" 1324 | uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" 1325 | version = "3.4.0+0" 1326 | 1327 | [[deps.libass_jll]] 1328 | deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] 1329 | git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" 1330 | uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" 1331 | version = "0.15.1+0" 1332 | 1333 | [[deps.libblastrampoline_jll]] 1334 | deps = ["Artifacts", "Libdl"] 1335 | uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" 1336 | version = "5.8.0+1" 1337 | 1338 | [[deps.libevdev_jll]] 1339 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1340 | git-tree-sha1 = "141fe65dc3efabb0b1d5ba74e91f6ad26f84cc22" 1341 | uuid = "2db6ffa8-e38f-5e21-84af-90c45d0032cc" 1342 | version = "1.11.0+0" 1343 | 1344 | [[deps.libfdk_aac_jll]] 1345 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1346 | git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" 1347 | uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" 1348 | version = "2.0.2+0" 1349 | 1350 | [[deps.libinput_jll]] 1351 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "eudev_jll", "libevdev_jll", "mtdev_jll"] 1352 | git-tree-sha1 = "ad50e5b90f222cfe78aa3d5183a20a12de1322ce" 1353 | uuid = "36db933b-70db-51c0-b978-0f229ee0e533" 1354 | version = "1.18.0+0" 1355 | 1356 | [[deps.libpng_jll]] 1357 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] 1358 | git-tree-sha1 = "d7015d2e18a5fd9a4f47de711837e980519781a4" 1359 | uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" 1360 | version = "1.6.43+1" 1361 | 1362 | [[deps.libvorbis_jll]] 1363 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] 1364 | git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" 1365 | uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" 1366 | version = "1.3.7+1" 1367 | 1368 | [[deps.mtdev_jll]] 1369 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1370 | git-tree-sha1 = "814e154bdb7be91d78b6802843f76b6ece642f11" 1371 | uuid = "009596ad-96f7-51b1-9f1b-5ce2d5e8a71e" 1372 | version = "1.1.6+0" 1373 | 1374 | [[deps.nghttp2_jll]] 1375 | deps = ["Artifacts", "Libdl"] 1376 | uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" 1377 | version = "1.52.0+1" 1378 | 1379 | [[deps.p7zip_jll]] 1380 | deps = ["Artifacts", "Libdl"] 1381 | uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" 1382 | version = "17.4.0+2" 1383 | 1384 | [[deps.x264_jll]] 1385 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1386 | git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" 1387 | uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" 1388 | version = "2021.5.5+0" 1389 | 1390 | [[deps.x265_jll]] 1391 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1392 | git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" 1393 | uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" 1394 | version = "3.5.0+0" 1395 | 1396 | [[deps.xkbcommon_jll]] 1397 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] 1398 | git-tree-sha1 = "9c304562909ab2bab0262639bd4f444d7bc2be37" 1399 | uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" 1400 | version = "1.4.1+1" 1401 | -------------------------------------------------------------------------------- /Pluto Notebooks/jl/JLSD_pt1_background.jl: -------------------------------------------------------------------------------- 1 | ### A Pluto.jl notebook ### 2 | # v0.19.42 3 | 4 | using Markdown 5 | using InteractiveUtils 6 | 7 | # ╔═╡ 8f2e1bc4-597d-4e02-b406-0a3908555350 8 | using BenchmarkTools 9 | 10 | # ╔═╡ b54766f6-263a-4fbe-991a-78a8207b5a0c 11 | md""" 12 | # Building SerDes Models in Julia, pt.1 - Background 13 | 14 | ![Cover UI](https://circuit-artists.com/wp-content/uploads/2024/06/cover_new.png) 15 | 16 | This notebook shows how to build and simulate a *"simple"* SerDes model using Julia. It serves as a documentation of my own journey of learning Julia so far. Hopefully it can turn into something bigger in the future (i.e., a more generic and expandable SerDes simulation framework). There will be several parts 17 | 18 | 1. Background and getting started on Julia 19 | 2. SerDes simulation framework 20 | 2. Data structures, math, and more 21 | 3. Detailed transmitter example 22 | 4. Plotting (w/ Makie) 23 | 24 | Due to limited time and resource, the entire source code for this project won't be available yet on GitHub, but enough will be explicitly shown in the notebook to demonstrate the framework (which I believe is the most important part) and what Julia can do 25 | """ 26 | 27 | # ╔═╡ 54a9ae9d-888f-4fc0-945c-fb4e5534c9e1 28 | md""" 29 | ## Why Julia? 30 | 31 | While there are many languages already available for scientific computing, like Python and MATLAB, no one is without its fault. Below are some discussions on their pros/cons, and why I believe Julia is worth investigating 32 | 33 | """ 34 | 35 | # ╔═╡ 8df26aaa-cf88-42ff-bbf8-50d445e5f858 36 | md""" 37 | ### Python 38 | Despite its huge popularity, Python is almost a non-starter for me when it comes to buidling and simulating SerDes models. Python is a dynamic and interpreted language, which means the code is only converted to machine code at run time. Python's syntax is very human friendly and easy to read/learn, but this contributes to it being too slow compared to compiled languages like C/C++. Python is a great prototyping/scripting language, and when speed/performance doesn't matter as much, it's SWEET! 39 | 40 | For computation heavy tasks, [Numpy](https://numpy.org/) hides away Python's slowness by essentially pre-compiling all array data structures and operations in C code. However, speed of your model can then be bottlenecked by some new algorithm you are experimenting with, an explicit and necessary for-loop somewhere, or post-sim data analysis. 41 | 42 | There are existing frameworks for SerDes modeling in Python, like [SerDesPy](https://github.com/richard259/serdespy) and [SymbaPy](https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=9293846) (not available on GitHub anymore). However, speed isn't the strongest point for these packages. SymbaPy quotes ~200 seconds for simulating 1 million bits (and ~2600 seconds w/ eye diagrams). 43 | 44 | Nevertheless, Python's ease of entry and open-source community remains key in its wide adoption among academia and industry experts alike. Therefore, it's definitely not going away any time soon. 🐍🐍🐍🐍🐍 45 | 46 | """ 47 | 48 | # ╔═╡ da497225-67b5-483b-b4f2-7cf5a4eac3e9 49 | md""" 50 | ### MATLAB 51 | I love MATLAB for its plotting and tooling features (open source packages are still far away from what MATLAB plots are capable of). Its revamped Just-in-Time (JIT) compiler since R2015 gives a good trade-off between code performance and feeling "snappy" (like an interpreted language). MATLAB remains the go-to choice for industry and scientific communities due to its one-size-fit-all suite. 52 | 53 | But well... it's not free (and I don't blame them for having so many great functions and features out of the box). 54 | 55 | However, because of its closed source nature, the langauge made conscious decisions to eliminate concepts like "pointers" in C/C++, and manage variable passing internally. This could lead to memory inefficiency and allocation issues if the programmer is not careful. In the case of simulating millions of bits in a SerDes system, I often found MATLAB to be a big memory hog and simulation could begin to slow down as time goes on (due to [garbage collection](https://en.wikipedia.org/wiki/Garbage_collection_(computer_science))) 56 | 57 | Simulink, SerDes Toolbox, IBIS-AMI compatibility, etc. are other big pluses that come with MATLAB. Yet, most simulation models are still custom built to evaluate proprietary architecture and algorithm. Besides, codes are often compiled again to speed up simulation. And finally, for someone with a soft spot for open-source, I find more joy in learning a new language then figuring out how to using new proprietary tools. 😛 58 | 59 | """ 60 | 61 | # ╔═╡ 20e69978-795e-402c-98bc-ec69fd5c677e 62 | md""" 63 | ### Julia 64 | I came across [Julia](https://julialang.org/) because I googled "open-source alternative to MATLAB" one day like I have done many times before. 65 | ![Julia overview](https://circuit-artists.com/wp-content/uploads/2024/06/julia_overview.png) 66 | 67 | Essentially, Julia aims to solve the "two language problem" - we want a langauge that is easy/flexible like Python, but fast like C (especially for scientific computing). Julia's own introduction paragraph summarizes itself well: 68 | 69 | !!! info "Julia Compared to Other Languages" 70 | Julia features optional typing, multiple dispatch, and good performance, achieved using type inference and just-in-time (JIT) compilation (and optional ahead-of-time compilation), implemented using LLVM. It is multi-paradigm, combining features of imperative, functional, and object-oriented programming. Julia provides ease and expressiveness for high-level numerical computing, in the same way as languages such as R, MATLAB, and Python, but also supports general programming. To achieve this, Julia builds upon the lineage of mathematical programming languages, but also borrows much from popular dynamic languages, including Lisp, Perl, Python, Lua, and Ruby. [link here](https://docs.julialang.org/en/v1/#man-julia-compared-other-languages) 71 | 72 | I then decided to migrate some of my MATLAB models to Julia and do a benchmark comparison. The porting is relatively straight-forward once I picked up Julia's typing system, and below are code snippets of a PRBS generator function in Julia and MATLAB 73 | 74 | """ 75 | 76 | # ╔═╡ fc826d03-0652-437e-9e8e-ad515c585f42 77 | md""" 78 | This is a Julia function 79 | ```julia 80 | function bist_prbs_gen(;poly, inv, Nsym, seed) 81 | seq = Vector{Bool}(undef,Nsym) 82 | for n = 1:Nsym 83 | seq[n] = inv 84 | for p in poly 85 | seq[n] ⊻= seed[p] 86 | end 87 | seed .= [seq[n]; seed[1:end-1]] 88 | end 89 | return seq, seed 90 | end 91 | ``` 92 | """ 93 | 94 | # ╔═╡ 088317b5-4718-49d8-8c9f-e171631d7f31 95 | md""" 96 | This is a MATLAB function 97 | ```julia 98 | function [seq, seed] = bist_prbs_gen(poly,inv, Nsym, seed) 99 | seq = zeros(1,Nsym); 100 | for n = 1:Nsym 101 | seq(n) = inv; 102 | for p = poly 103 | seq(n) = xor(seq(n), seed(p)); 104 | end 105 | seed = [seq(n), seed(1:end-1)]; 106 | end 107 | end 108 | ``` 109 | 110 | """ 111 | 112 | # ╔═╡ 1bd48b0b-3a48-42dc-85db-7dbdcf3d5587 113 | md""" 114 | You can see the syntax between Julia and MATLAB is quite similar. The algorithm here is very straight-forward. Admittely, I didn't do much optimization on the register and bit level as a first pass, but the goal here is to really test the capability of the compilers. 115 | 116 | A couple of things to highlight 117 | 1. Julia allows special unicode characters as part of the code! The symbol ⊻ means "xor". Though it doesn't make a difference in the code functionality, it does make one happy when you can use π and ℯ in your code. 118 | 2. There are some smaller nuiances when dealing with Julia arrays. The .= syntax is not a typo, but rather a broadcasting operation similar to MATLAB's element-wise operations (more on this in the future). 119 | 3. Variable typing in Julia is optional. Like Python, Julia can dynamically type variables at runtime. However, for the more advanced users, defining variable types early in Julia is also possible and often helps with performance. 120 | 121 | Now, let's talk about speed. If I benchmark the functions by generating and timing 10 million bits using PRBS31 (i.e. bist\_prbs\_gen(polynomial = [28,31], inv = false, Nsym = 10e6, seed = ones(31)), below are the results. I needed to make sure I didn't make a mistake, but yes there is an almost **10x** difference between these seemingly identical functions! 122 | ![julia_vs_matlab](https://circuit-artists.com/wp-content/uploads/2024/06/julia_v_matlab_10x.png) 123 | 124 | 125 | """ 126 | 127 | # ╔═╡ 9bbe4518-cf4b-4125-8e39-e64fedd3fe19 128 | md""" 129 | For those interested, you can try implementing the same in Python. Surprisingly, the implementation using Python list instead of Numpy array is faster when I tried (~6s for list and ~12s for numpy arrays). 130 | 131 | Assuming I didn't do anything blatantly false, this just adds to the confusion about how to optimize Python code when performance matters. 132 | 133 | """ 134 | 135 | # ╔═╡ 2b4fb604-a29d-43bf-bc1f-2fba4d4dea07 136 | md""" 137 | ```python 138 | import time 139 | import numpy as np 140 | 141 | def bist_prbs_gen(poly, inv, nsym, seed): 142 | seq = [False]*nsym 143 | for n in range(nsym): 144 | seq[n] = inv 145 | for p in poly: 146 | seq[n] ^= seed[p-1] 147 | seed[1:] = seed[0:-1] 148 | seed[0] = seq[n] 149 | 150 | return seq, seed 151 | 152 | 153 | def bist_prbs_gen_arr(poly, inv, nsym, seed): 154 | seq = np.array([False]*nsym) 155 | for n in range(nsym): 156 | seq[n] = inv 157 | for p in poly: 158 | seq[n] ^= seed[p-1] 159 | seed[1:] = seed[0:-1] 160 | seed[0] = seq[n] 161 | 162 | return seq, seed 163 | 164 | 165 | 166 | if __name__ == '__main__': 167 | start = time.time() 168 | seq1, seed1 = bist_prbs_gen([28, 31], False, int(10e6), [True]*31) 169 | end = time.time() 170 | print(end - start) ## Showed 5.537s 171 | 172 | start = time.time() 173 | seq2, seed2 = bist_prbs_gen_arr([28, 31], False, int(10e6), np.array([True]*31)) 174 | end = time.time() 175 | print(end - start) ## Showed 13.543s 176 | ``` 177 | """ 178 | 179 | # ╔═╡ e931847b-876b-4a91-b3cd-28ef6e45bf24 180 | md""" 181 | To drive the speed point home for Julia, the plot at the very top was generated after processing **one million bits** using a model that includes a jittered transmitter, noisy channel, a simple RX with slicer adaptation and CDR loops. **The entire simulation only took ~10 seconds**. 182 | 183 | Of course, this example might be a bit artificial, but the **order of magnitude** speed improvement alone was enough to push me to spend more time learning Julia, so here we are 😄. 184 | """ 185 | 186 | # ╔═╡ 9305392e-d630-48ed-98ed-9ee1cc52b951 187 | md""" 188 | # Getting Started with Julia 189 | 190 | Julia is relatively young compared to Python, so development tools might look much more "basic". However, it still offers an easy installation and a good extension in [Visual Studio](https://visualstudio.microsoft.com/) (my current IDE choice). 191 | 192 | If you want to go through my notebooks or you are intrigued by what Julia can do for your field, follow the steps [**here**](https://computationalthinking.mit.edu/Spring21/installation/) to install Julia and Pluto (VS Code is optional if you want to expand upon what are shown in the notebooks) 193 | 194 | """ 195 | 196 | # ╔═╡ ad2a66fa-2e5a-4953-99bf-fb4369781d14 197 | md""" 198 | Once you can run Pluto from the Julia REPL like below, open this notebook using the GitHub URL (or copy the .jl file to your local director and open). 199 | 200 | ![Julia REPL run Pluto](https://user-images.githubusercontent.com/6933510/91441094-eb01d080-e86f-11ea-856f-e667fdd9b85c.png) 201 | ![Pluto homepage](https://user-images.githubusercontent.com/6933510/91441391-6a8f9f80-e870-11ea-94d0-4ef91b4e2242.png) 202 | """ 203 | 204 | # ╔═╡ 1693bc36-3a9a-4947-9bbd-99b057672a62 205 | md""" 206 | If everything goes well, you should be able to run the small *bist\_prbs\_gen* benchmark next. 207 | 208 | The BenchmarTools is the first helpful package we will learn to use. A macro is part of Julia's metaprogramming capability that simplies code (think of it as a function manipulating the string of your code), denoted by the @ sign. The @time macro is used to benchmark the execution time. What's neat is it also tells how many memory allocations are done, as well as compilation and garbage collection time. 209 | 210 | 211 | Once you are used to it, it forces you to think a bit deeper down to the machine level, but you still remain writing in a high level language. **VERY SATISFYING!** 😍 212 | 213 | """ 214 | 215 | # ╔═╡ 086c7f93-17fb-4a74-a398-0a85f8afad52 216 | function bist_prbs_gen(;poly, inv, Nsym, seed) 217 | seq = Vector{Bool}(undef,Nsym) 218 | for n = 1:Nsym 219 | seq[n] = inv 220 | for p in poly 221 | seq[n] ⊻= seed[p] 222 | end 223 | seed .= [seq[n]; seed[1:end-1]] 224 | end 225 | return seq, seed 226 | end 227 | 228 | # ╔═╡ 6f0e5fb3-0644-489e-809f-691ee56d7e2a 229 | @time bist_prbs_gen(poly=[28,31], inv=false, Nsym=Int(10e6), seed=ones(Bool,31)); 230 | 231 | # ╔═╡ 86fc629f-f925-43e0-ae21-98593eea1833 232 | md""" 233 | For those who are more familiar with Python, Julia's JIT compilation might feel weird at first because the run time will be longer for the first run (due to compilation time) and you get the real time for subsequent runs. It's something you need to get used to if you are accustomed to Python's consistent behavior after hitting run. Nevertheless, this makes Julia for more suitable for running long simulations with different model parameters rather than simple scripting on lab benches. 234 | """ 235 | 236 | # ╔═╡ 69ca90d4-efc8-4555-839e-a4756b766fac 237 | md""" 238 | Once you are setup with Julia, I recommend introducing yourself to Julia through the following resources, and familiarize with these packages 239 | 240 | - ["Why We Created Julia"](https://julialang.org/blog/2012/02/why-we-created-julia/) 241 | - [Julia's official documentation](https://docs.julialang.org/en/v1/) 242 | - [BenchmarkTools.jl](https://juliaci.github.io/BenchmarkTools.jl/stable/) - performance tracking 243 | - [Revise.jl](https://timholy.github.io/Revise.jl/stable/) - makes Julia feel more like a runtime language when code changes 244 | - [UnPack.jl](https://github.com/mauro3/UnPack.jl) - easier syntax to manipulate struct data 245 | - [DataStructures.jl](https://juliacollections.github.io/DataStructures.jl/dev/) - special data structures like buffers, queues, trees, etc. 246 | - [Parameters.jl](https://mauro3.github.io/Parameters.jl/stable/) - easier model parameter handling with default values and keywords 247 | - [Interpolations.jl](https://juliamath.github.io/Interpolations.jl/v0.14/) - interpolation in Julia 248 | - [DSP.jl](https://docs.juliadsp.org/stable/contents/) - fast DSP functions like convolutions 249 | - [Makie.jl](https://docs.makie.org/v0.21/) - my choice of plotting package in Julia 250 | """ 251 | 252 | # ╔═╡ 00000000-0000-0000-0000-000000000001 253 | PLUTO_PROJECT_TOML_CONTENTS = """ 254 | [deps] 255 | BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" 256 | 257 | [compat] 258 | BenchmarkTools = "~1.5.0" 259 | """ 260 | 261 | # ╔═╡ 00000000-0000-0000-0000-000000000002 262 | PLUTO_MANIFEST_TOML_CONTENTS = """ 263 | # This file is machine-generated - editing it directly is not advised 264 | 265 | julia_version = "1.10.3" 266 | manifest_format = "2.0" 267 | project_hash = "61c30062a384602fe87efb278f2fa7342de39e7e" 268 | 269 | [[deps.Artifacts]] 270 | uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" 271 | 272 | [[deps.BenchmarkTools]] 273 | deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] 274 | git-tree-sha1 = "f1dff6729bc61f4d49e140da1af55dcd1ac97b2f" 275 | uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" 276 | version = "1.5.0" 277 | 278 | [[deps.CompilerSupportLibraries_jll]] 279 | deps = ["Artifacts", "Libdl"] 280 | uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" 281 | version = "1.1.1+0" 282 | 283 | [[deps.Dates]] 284 | deps = ["Printf"] 285 | uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" 286 | 287 | [[deps.JSON]] 288 | deps = ["Dates", "Mmap", "Parsers", "Unicode"] 289 | git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" 290 | uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" 291 | version = "0.21.4" 292 | 293 | [[deps.Libdl]] 294 | uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" 295 | 296 | [[deps.LinearAlgebra]] 297 | deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] 298 | uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" 299 | 300 | [[deps.Logging]] 301 | uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" 302 | 303 | [[deps.Mmap]] 304 | uuid = "a63ad114-7e13-5084-954f-fe012c677804" 305 | 306 | [[deps.OpenBLAS_jll]] 307 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] 308 | uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" 309 | version = "0.3.23+4" 310 | 311 | [[deps.Parsers]] 312 | deps = ["Dates", "PrecompileTools", "UUIDs"] 313 | git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" 314 | uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" 315 | version = "2.8.1" 316 | 317 | [[deps.PrecompileTools]] 318 | deps = ["Preferences"] 319 | git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" 320 | uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" 321 | version = "1.2.1" 322 | 323 | [[deps.Preferences]] 324 | deps = ["TOML"] 325 | git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" 326 | uuid = "21216c6a-2e73-6563-6e65-726566657250" 327 | version = "1.4.3" 328 | 329 | [[deps.Printf]] 330 | deps = ["Unicode"] 331 | uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" 332 | 333 | [[deps.Profile]] 334 | deps = ["Printf"] 335 | uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" 336 | 337 | [[deps.Random]] 338 | deps = ["SHA"] 339 | uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" 340 | 341 | [[deps.SHA]] 342 | uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" 343 | version = "0.7.0" 344 | 345 | [[deps.Serialization]] 346 | uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" 347 | 348 | [[deps.SparseArrays]] 349 | deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] 350 | uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" 351 | version = "1.10.0" 352 | 353 | [[deps.Statistics]] 354 | deps = ["LinearAlgebra", "SparseArrays"] 355 | uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" 356 | version = "1.10.0" 357 | 358 | [[deps.SuiteSparse_jll]] 359 | deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] 360 | uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" 361 | version = "7.2.1+1" 362 | 363 | [[deps.TOML]] 364 | deps = ["Dates"] 365 | uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" 366 | version = "1.0.3" 367 | 368 | [[deps.UUIDs]] 369 | deps = ["Random", "SHA"] 370 | uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" 371 | 372 | [[deps.Unicode]] 373 | uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" 374 | 375 | [[deps.libblastrampoline_jll]] 376 | deps = ["Artifacts", "Libdl"] 377 | uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" 378 | version = "5.8.0+1" 379 | """ 380 | 381 | # ╔═╡ Cell order: 382 | # ╠═b54766f6-263a-4fbe-991a-78a8207b5a0c 383 | # ╟─54a9ae9d-888f-4fc0-945c-fb4e5534c9e1 384 | # ╟─8df26aaa-cf88-42ff-bbf8-50d445e5f858 385 | # ╟─da497225-67b5-483b-b4f2-7cf5a4eac3e9 386 | # ╟─20e69978-795e-402c-98bc-ec69fd5c677e 387 | # ╟─fc826d03-0652-437e-9e8e-ad515c585f42 388 | # ╟─088317b5-4718-49d8-8c9f-e171631d7f31 389 | # ╟─1bd48b0b-3a48-42dc-85db-7dbdcf3d5587 390 | # ╟─9bbe4518-cf4b-4125-8e39-e64fedd3fe19 391 | # ╟─2b4fb604-a29d-43bf-bc1f-2fba4d4dea07 392 | # ╟─e931847b-876b-4a91-b3cd-28ef6e45bf24 393 | # ╟─9305392e-d630-48ed-98ed-9ee1cc52b951 394 | # ╟─ad2a66fa-2e5a-4953-99bf-fb4369781d14 395 | # ╟─1693bc36-3a9a-4947-9bbd-99b057672a62 396 | # ╠═086c7f93-17fb-4a74-a398-0a85f8afad52 397 | # ╠═8f2e1bc4-597d-4e02-b406-0a3908555350 398 | # ╠═6f0e5fb3-0644-489e-809f-691ee56d7e2a 399 | # ╠═86fc629f-f925-43e0-ae21-98593eea1833 400 | # ╟─69ca90d4-efc8-4555-839e-a4756b766fac 401 | # ╟─00000000-0000-0000-0000-000000000001 402 | # ╟─00000000-0000-0000-0000-000000000002 403 | -------------------------------------------------------------------------------- /Pluto Notebooks/jl/JLSD_pt2_framework.jl: -------------------------------------------------------------------------------- 1 | ### A Pluto.jl notebook ### 2 | # v0.19.42 3 | 4 | using Markdown 5 | using InteractiveUtils 6 | 7 | # ╔═╡ d6346d6d-7513-4d3f-a4e6-123cca197bd1 8 | using Makie, CairoMakie 9 | 10 | # ╔═╡ 2313e492-dfde-4e4e-9bfd-59e6a2a54b25 11 | using DSP, Random, Distributions, UnPack, BenchmarkTools 12 | 13 | # ╔═╡ 80f26a50-22aa-11ef-2af1-7799c685dae0 14 | md""" 15 | # Building SerDes Models in Julia, pt2 - Simulation Framework 16 | 17 | ![framework cover](https://circuit-artists.com/wp-content/uploads/2024/06/framework.png) 18 | 19 | For the uninitiated, SerDes systems have evolved to become extremely complicated as the transmission speed increases (>100Gbps) and transmission medium changes (from copper to fiber). The challenge lies in the intersection between continuous- and discrete-time signal processing. One example is when clocks are used to sample signals (either implicitly with a data slicer or explicitly with data converters nowadays). Complex digital adaptation and clock-data recovery (CDR) algorithms become more interwined because all loops are running at the same time. How to effectively model and simulate all these components together has always been an interesting topic. 20 | 21 | While many different analysis methods exist, including frequency and statistcal analysis, time domain results remain the final sign-off. Therefore, this framework focuses on transient simulation first and hopefully other analysis tools will be added in the near future. 22 | 23 | 24 | """ 25 | 26 | # ╔═╡ 59159363-df04-4e00-97b7-08dc74e6029f 27 | md""" 28 | ## Key Simulation Parameters - time step and block size 29 | """ 30 | 31 | # ╔═╡ e42eb1ee-f93a-45ee-873e-57a282525b93 32 | md""" 33 | In order to simulate time domain waveforms, we resort to arrays (or vectors) to represent such waveforms. Now in order to build an *efficient* model, we first need to decide the granuarity of a simulation step, as well as the block size to simulate in batch. 34 | If we want to simulate a sequence of random bits, they need to be converted to continuous time waveform first with a finite time step. Then the step size choice directly impacts the accuracy and the speed of your sim. Allow me to illustrate 35 | """ 36 | 37 | # ╔═╡ 61cc9495-0c51-4058-b167-c758e40ab9c0 38 | md""" 39 | ### Simulation time step 40 | """ 41 | 42 | # ╔═╡ adc81355-9249-4e2a-905f-7c9f65923000 43 | tui = 1/10e9; # Unit Interval time for 10Gbps data 44 | 45 | # ╔═╡ 7647e49a-5731-4772-8458-2585fe7f0980 46 | osr1 = 4; # Oversampling ratio per symbol, i.e. # of points to simulate per symbol 47 | 48 | # ╔═╡ 55d0d654-a061-44d6-9ae6-778281b00b16 49 | osr2 = 32; 50 | 51 | # ╔═╡ 8cb8ec3b-cb8c-4bb8-8378-489d304c8af5 52 | dt1 = tui/osr1; # Simulation time step 53 | 54 | # ╔═╡ 8f2cbd28-9d7e-4c4d-af93-881d59bb5864 55 | dt2 = tui/osr2; 56 | 57 | # ╔═╡ fe9b92ec-afe4-4d4a-af11-7d45f271f2cc 58 | bits = [0,1,0,1,0,0,1,1,1]; #arbitrary bits; use bitrand(N) to generate random bits 59 | 60 | # ╔═╡ 22905a47-35c5-4fea-92d8-5e8306141dbe 61 | md""" 62 | When ```osr``` is higher, the resultant waveform looks more like perfect square waveforms. Lower ```osr``` results in waveform distortion. 63 | """ 64 | 65 | # ╔═╡ 22021e9a-d3ed-444c-a722-4a03a7114a84 66 | md""" 67 | Here is what happens when we pass this waveform through a "channel" by means of convolution. With a larger time step, the convolution finishes faster because the array size is obviously smaller. However, there are noticeable kinks in the waveform, which might lead to simulation inaccuracy later. The accuracy increase also plateaus once the curve looks smooth enough. 68 | 69 | Note that the increase in computation time doesn't increase linearly w.r.t array size becasue the convolution method in DSP.jl package uses FFT. Therefore, it's often more beneficial to just pick a bigger ```osr``` because Nlog(N) is cool! 70 | """ 71 | 72 | # ╔═╡ 2aeb31ea-d262-4a58-b808-3dd66e413bb4 73 | bw_ir = 8e9; 74 | 75 | # ╔═╡ ca62496a-7f7c-428f-958b-1c317bd0f160 76 | tlen_ir = 20*tui; #20UI long impulse response 77 | 78 | # ╔═╡ c495f9db-3afa-4611-ab17-d9d5952a05b6 79 | @time Vout1 = conv(ir1, Vbits1)*dt1; 80 | 81 | # ╔═╡ c6f7940f-52f6-4bde-82d1-74d95ab066ef 82 | @time Vout2 = conv(ir2, Vbits2)*dt2; 83 | 84 | # ╔═╡ fa545192-e0c3-4188-a980-6cee173f99f5 85 | md""" 86 | ### Simulation (sub-)block size 87 | """ 88 | 89 | # ╔═╡ 060687a7-a32b-4d14-aaf2-6b1b9b4bd1f3 90 | md""" 91 | Once the simulation time step is chosen, the next question is the batch size of the signal we want to process. The extreme examples would be when simulating 1 million bits, we can either generate and process *1 bit at a time* or *1 million at once*. This choice will equally impact simulation speed and accuracy. Like all things in engineering, it's always a spectrum and our framework should give the designer the freedom to adjust these parameters. 92 | """ 93 | 94 | # ╔═╡ 8da8b7c0-b36d-466d-87f4-5a7007cac5f1 95 | md""" 96 | Here we define two types of blocks: an outer loop block and an inner loop sub-block. Each block will contain different modules corresponding to different circuits in your system. Let's look at the example block diagram below. 97 | """ 98 | 99 | # ╔═╡ 0df54cc1-5c45-4b31-9274-5d7a2148400f 100 | md""" 101 | ![sim blks](https://circuit-artists.com/wp-content/uploads/2024/06/sim_blks.png) 102 | """ 103 | 104 | # ╔═╡ b4c5c9ef-cd7d-46a5-b619-0ebf9f1e77b8 105 | md""" 106 | The outter loop block is suitable for circuits that are "quasi-static" and can process many bits at once. For example, a transmitter can generate waveforms for a large number of bits up front instead of simulating multiple short sequences, since we don't expect the tranmistter parameters to change during simulation (e.g. FIR coefficients and bandwidth). This will save time by doing repetitve convolutions (as we have seen before, longer convolutions become faster due to FFT algorithm). 107 | """ 108 | 109 | # ╔═╡ 0deea94e-fb8c-43bb-b0f8-f79f2fce6ae8 110 | md""" 111 | The inner loop sub-block is more suitable for circuits that require more accuracy and have more complicated loop dynamics. For example, the adaptation and CDR loops normally operate on a parallel bus of data and error slicer outputs. This vector then effectively determine the sub-block size because we want to capture the real dynamics of the feedback loops. Another way to think about this is that we implicitly created a "digital clock" through this sub-block loop, i.e. each loop iteration is a digital clock cycle. 112 | """ 113 | 114 | # ╔═╡ 657379de-8e3f-4eb5-9f8f-1a16ef4ed93e 115 | md""" 116 | ![sim flow](https://circuit-artists.com/wp-content/uploads/2024/06/sim_flow.png) 117 | """ 118 | 119 | # ╔═╡ a86122f9-c706-4ec8-a1d8-62151ce6f983 120 | md""" 121 | The figure above illustrate the relationships between the big block and sub-blocks. We first batch process a long bit sequence, then iterate over the waveform through the sub-blocks. 122 | 123 | Note that although this picture implies that the block size has to be an integer multiple of sub-block size, but in reality it could be extended through an elastic buffer layer in between. The current code only assumes integer relationship between these two numbers, but the elastic buffer approach would be the most general for modeling say frequency offsets between TX and RX (will be addressed in future development) 124 | """ 125 | 126 | # ╔═╡ 27a5d616-267b-4689-b2f3-7e04d38514ac 127 | md""" 128 | ## The run_sim() skeleton 129 | """ 130 | 131 | # ╔═╡ 910ad862-0baf-4ff0-8109-f19ae0688282 132 | md""" 133 | With this in mind, we can start with a run_sim() function pseudo-code already as 134 | """ 135 | 136 | # ╔═╡ 8775eb83-56ac-4874-8950-7cf872db4dd9 137 | function run_sim(params) 138 | @unpack Nblks, Nsubblks, blk_size, subblk_size = params 139 | @unpack bist_params, tx_params, rx_params = params 140 | 141 | for n = 1:Nblks 142 | # run batch processing blocks here 143 | # e.g. 144 | # S = bist_gen(bist_params) 145 | # Vtx = tx_drv(tx_params, Vtx) 146 | 147 | for m = 1:Nsubblks 148 | # run shorter loops here 149 | # e.g. 150 | # Φ = clkgen(pi_code) 151 | # Ssub = sampler(Vtx, Φ) 152 | # dvec = slicers(Ssub) 153 | # ... 154 | 155 | # record waveforms here 156 | end 157 | 158 | # bist_check(bist_params, data_rcvd) 159 | 160 | end 161 | 162 | end 163 | 164 | # ╔═╡ 1b8a3cbb-5b0b-47b2-945a-6e28a07c4ca6 165 | md""" 166 | **That's it!** This is pretty much the big picture of the framework, and now it's a matter of adding in the functional model of each circuit module **AS LONG AS** they satisfy this ```osr```, ```blk_size```, ```subblk_size``` framework. This usually means dealing with boundary conditions internally, remembering states from the previous (sub-)block, etc. 167 | """ 168 | 169 | # ╔═╡ 80caa4e9-33b6-4a5e-b59b-ebc59fb1ec78 170 | md""" 171 | ## World's best SerDes 172 | """ 173 | 174 | # ╔═╡ 4946bfa5-7041-453a-b3de-1242a4a8fa62 175 | md""" 176 | Let's build the world's most ideal SerDes using this framework. What we need are some BIST functions that generates and checks PRBS, an ideal transmitter and slicers. Let's start with the bist\_prbs\_gen from our [first notebook](https://github.com/kevjzheng/JLSD/blob/main/Pluto%20Notebooks/jl/JLSD_pt1_background.jl) 177 | """ 178 | 179 | # ╔═╡ bb44eaea-1452-491e-a4d8-8ffdcf62f533 180 | function bist_prbs_gen(;poly, inv, Nsym, seed) 181 | seq = Vector{Bool}(undef,Nsym) 182 | for n = 1:Nsym 183 | seq[n] = inv 184 | for p in poly 185 | seq[n] ⊻= seed[p] 186 | end 187 | seed .= [seq[n]; seed[1:end-1]] 188 | end 189 | return seq, seed 190 | end 191 | 192 | # ╔═╡ 361ed8e3-5be7-4021-8ad1-7e7f67cf2255 193 | md""" 194 | And here is an example ber\_check\_prbs function 195 | """ 196 | 197 | # ╔═╡ c6610a7c-8a6a-4573-8eb7-adf8647a37ea 198 | function ber_check_prbs(rcvd_bits; poly, inv, seed, lock_status, lock_cnt, lock_threshold, ber_err_cnt, ber_tot_cnt) 199 | 200 | nbits_rcvd = lastindex(rcvd_bits) 201 | 202 | if lock_status #if prbs already locked, use prbs_gen for reference bits 203 | ref_bits, seed = bist_prbs_gen(poly=poly, inv=inv, 204 | Nsym=nbits_rcvd, seed=seed) 205 | ber_err_cnt += sum(rcvd_bits .⊻ ref_bits) 206 | ber_tot_cnt += nbits_rcvd 207 | 208 | else # if not locked yet, use received bits as seed 209 | for n = 1:nbits_rcvd 210 | brcv = rcvd_bits[n] 211 | btst = inv 212 | for p in poly 213 | btst ⊻= seed[p] 214 | end 215 | seed .= [brcv; seed[1:end-1]] 216 | 217 | #need consecutive non-error for lock. reset when error happens 218 | lock_cnt = (btst == brcv) ? lock_cnt+1 : 0 219 | 220 | if lock_cnt == lock_threshold 221 | lock_status = true 222 | println("prbs locked") 223 | #run prbs till end 224 | ref_bits, seed = bist_prbs_gen(poly=poly, inv=inv, 225 | Nsym=nbits_rcvd-n, seed=seed) 226 | ber_err_cnt += sum(rcvd_bits[n+1:end] .⊻ ref_bits) 227 | ber_tot_cnt += nbits_rcvd - n 228 | 229 | break 230 | end 231 | end 232 | end 233 | 234 | return seed, lock_status, lock_cnt, ber_err_cnt, ber_tot_cnt 235 | end 236 | 237 | # ╔═╡ a2fdc63e-9dbc-4d31-bb59-23575c0f3697 238 | md""" 239 | We can verify these two functions with direct feedthrough 240 | """ 241 | 242 | # ╔═╡ 3040f918-4a8c-4b3c-a497-75d730cc9365 243 | poly = [28,31]; #PRBS31 polynomial 244 | 245 | # ╔═╡ 744e09cb-a6aa-440b-82b8-00bb91bb1be0 246 | inv = false; 247 | 248 | # ╔═╡ 67304e59-8c2c-4b2f-a915-c387067c3f0a 249 | Nsym = Int(10e6); #Try changing number of bits 250 | 251 | # ╔═╡ 5030b487-04ed-4ecb-b643-6cc9ca076bf6 252 | gen_seed = ones(Bool, 31); 253 | 254 | # ╔═╡ 9760ad97-ef24-4eca-9cf6-2e180cd48840 255 | chk_seed = zeros(Bool, 31); 256 | 257 | # ╔═╡ 177e53b4-8291-478e-b7dc-a50bbaf518fe 258 | bits_test, gen_seed1 = bist_prbs_gen(poly=poly, inv=inv, Nsym=Nsym, seed=gen_seed); 259 | 260 | # ╔═╡ adcf57be-95a4-4f8b-802c-29f26c3ea78a 261 | chk_seed1, lock_status1, lock_cnt1, ber_err_cnt1, ber_tot_cnt1 = 262 | ber_check_prbs(bits_test; poly=poly, inv=inv, seed=chk_seed, 263 | lock_status=false, lock_cnt=0, lock_threshold=256, 264 | ber_err_cnt=0, ber_tot_cnt=0); 265 | 266 | # ╔═╡ 5ba2a617-0b23-411d-bc57-5a4a6f2453b0 267 | md""" 268 | Try printing lock\_status, lock\_cnt, etc. below 269 | """ 270 | 271 | # ╔═╡ e450e9bb-bb24-4957-971e-720bcfb42c54 272 | println(ber_err_cnt1) 273 | 274 | # ╔═╡ c67a0e29-b615-4ffe-88a2-6a5bdc71f0a6 275 | md""" 276 | We can now artificially add bit errors to verify our checker 277 | """ 278 | 279 | # ╔═╡ 87b1c700-84e0-4649-b67f-82af4bea7054 280 | ber_target = 1e-4; #play around with this number and Nsym 281 | 282 | # ╔═╡ 9060e6e5-8265-44b5-8024-dd981f089253 283 | err_loc = rand(Uniform(0,1.0),Nsym).< ber_target; 284 | #Uniform is from Distributions package 285 | 286 | # ╔═╡ 4826cfb3-70cc-409a-a004-533f9938df32 287 | bits_werr = bits_test .⊻ err_loc; #flip the bits at error locations 288 | 289 | # ╔═╡ 9b9244d0-bd60-4901-8ce4-6326af249a5a 290 | chk_seed2, lock_status2, lock_cnt2, ber_err_cnt2, ber_tot_cnt2 = 291 | ber_check_prbs(bits_werr; poly=poly, inv=inv, seed=chk_seed, 292 | lock_status=false, lock_cnt=0, lock_threshold=256, 293 | ber_err_cnt=0, ber_tot_cnt=0); 294 | 295 | # ╔═╡ e6de1c80-083d-4ca2-a957-0fa91c5f449d 296 | println("BER ≈ " * string(ber_err_cnt2/ber_tot_cnt2)) 297 | 298 | # ╔═╡ e6a8a14c-649c-4f76-b59b-ff84a5f9e095 299 | md""" 300 | Let's now build an ideal transmitter and receiver. The ideal transmitter will simply take the bit sequence and oversample according to ```osr``` to create the time domain waveform. Our ideal receiver will then take samples from the waveform with direct indexing. Because the waveform is perfect, it doesn't really matter which index we take the samples at. 301 | """ 302 | 303 | # ╔═╡ 6d4b04cc-97a9-4ede-a243-6c15d96522c7 304 | function tx_drv_top(bits; osr, swing) 305 | #just like the gen_wvfm helper function, but no need for the time vector 306 | #change output waveform to analog voltage in +/- swing/2 307 | #the dots are needed to do elementwise operation on the bits vector 308 | return kron(sign.(bits.-0.5), swing/2*ones(osr)) 309 | 310 | end 311 | 312 | # ╔═╡ 44d7f2d8-ea37-42f0-b884-a6b16b013b92 313 | function rx_slice_top(Vin; sample_idx, osr, slice_lvl) 314 | # sample_idx is a number between 1 and osr, will wrap around for now 315 | Vsamples = Vin[mod(Int(sample_idx)-1, osr)+1:osr:end] 316 | return Vsamples .> slice_lvl 317 | end 318 | 319 | # ╔═╡ c5dd05d4-d11c-4592-9a0b-b7aafe00205f 320 | md""" 321 | Now let's write a simple run\_sim\_ideal() function to plug all these functions in. In this example, we don't have a sub-block loop, which would make more sense when CDR and adaptation is introduced. 322 | """ 323 | 324 | # ╔═╡ 471cadad-a7ae-44ea-aa16-278ca3fdd31d 325 | @time Vtx = run_sim_ideal(32, 128, Int(1e6)); 326 | #play around with the osr and blk_size parameters and see how the run time is impacted 327 | 328 | # ╔═╡ 8cc4b284-c473-4b83-9871-4ffefbba492e 329 | begin 330 | #plotting. We will learn more Makie plots later 331 | fig_tx = Figure() 332 | ax_tx = Axis(fig_tx[1,1]) 333 | lines!(ax_tx,Vtx, label = "TX output") 334 | axislegend() 335 | fig_tx 336 | end 337 | 338 | # ╔═╡ 920279e2-760f-491a-bacc-f563c4f59c68 339 | md""" 340 | Congratulations! We have just built your first SerDes model. I admit that this model isn't that useful, and the code itself is not looking that pretty. Trust me, it will get better 🙂. 341 | 342 | The main issue here is that we have quite a few *states* that needs tracking (e.g. seed, ber_cnt, etc.), and spelling them out explicitly will get out of hand pretty quickly. In the next notebook, we will introduce **struct** in Julia, which is a lighter weight data structure than "classes" for those who are familiar with object oriented programming. 343 | 344 | As a preview, we will use structs to store relevant parameters and states for the corresponding circuit module, and pass the structs around in functions. The TX driver function can then be written as the following 345 | """ 346 | 347 | # ╔═╡ 9fb818e6-42f6-414e-bb5e-98cbc22839eb 348 | function tx_drv_top(tx, bits) 349 | @unpack osr, blk_size, swing = tx #grab the parameters we need from the tx struct 350 | 351 | return kron(sign.(bits.-0.5), swing/2*ones(osr)) 352 | end 353 | 354 | # ╔═╡ 4e535c7f-4a51-46c8-8ca7-6fbc294a6fac 355 | function run_sim_ideal(osr, blk_size, nsym_tot) 356 | 357 | # initialize parameters 358 | gen_seed = ones(Bool, 31) 359 | chk_seed = zeros(Bool, 31) 360 | poly = [28,31] 361 | inv = false 362 | 363 | lock_status = false 364 | lock_cnt = 0 365 | ber_err_cnt = 0 366 | ber_tot_cnt = 0 367 | 368 | ber_target = 0e-5; 369 | 370 | Vtx = zeros(blk_size*osr) 371 | 372 | #round nblk to the nearest total # of symbols 373 | nblk = Int(round(nsym_tot/blk_size)) 374 | 375 | # main loop 376 | for n = 1:nblk 377 | #generate bits 378 | bits, gen_seed = bist_prbs_gen(poly=poly, inv=inv, 379 | Nsym=blk_size, seed=gen_seed); 380 | 381 | #generate TX waveform 382 | Vtx = tx_drv_top(bits, osr=osr, swing=1) 383 | 384 | #sample TX waveform 385 | bits_rcvd = rx_slice_top(Vtx, sample_idx=osr/2, osr=osr, slice_lvl=0) 386 | 387 | #add random bit error 388 | err_loc = rand(Uniform(0,1.0),blk_size).< ber_target; 389 | bits_werr = bits_rcvd .⊻ err_loc; 390 | 391 | #check error 392 | chk_seed, lock_status, lock_cnt, ber_err_cnt, ber_tot_cnt = 393 | ber_check_prbs(bits_werr; poly=poly, inv=inv, seed=chk_seed, 394 | lock_status=lock_status, lock_cnt=lock_cnt, lock_threshold=256, 395 | ber_err_cnt=ber_err_cnt, ber_tot_cnt=ber_tot_cnt); 396 | 397 | #record waveforms here if needed 398 | 399 | end 400 | 401 | println("Sim done") 402 | println("BER: " * string(ber_err_cnt/ber_tot_cnt)) 403 | 404 | return Vtx 405 | end 406 | 407 | # ╔═╡ 30c55f3a-c070-405b-b70b-23f017d31f87 408 | md""" 409 | !!! info "Julia tips" 410 | Oops! I named the function tx\_drv\_top again, but with different arguments. No worries! Julia implements something called [multiple dispatch](https://docs.julialang.org/en/v1/manual/methods/) (learn more [here](https://www.youtube.com/watch?v=kc9HwsxE1OY&ab_channel=TheJuliaProgrammingLanguage)). A function can take arguments of different types, and share the same name. This would be particularly helpful when we want to optimize function performance and/or allow different usage cases (e.g. explicit arguments vs. struct). 411 | We won't go too much into the details of how to use multiple dispatch and typing to optimize Julia performance, but it will be relevant for improving the framework in the long run. 412 | """ 413 | 414 | # ╔═╡ a4703815-c47b-4ad7-a943-aafbc0e1cc7e 415 | function tx_drv_top!(tx, bits) 416 | #grab the parameters we need from the tx struct 417 | @unpack osr, blk_size, swing = tx 418 | 419 | #store output directly into the struct 420 | tx.Vout .= kron(sign.(bits.-0.5), swing/2*ones(osr)) 421 | end 422 | 423 | # ╔═╡ 64450e30-819b-4dcf-8928-4fc2ec396bad 424 | md""" 425 | !!! info "Julia tips" 426 | Julia uses a convention of putting "!" in the function name to denote that it's a mutating function. This means that the argument passed into the function will be directly changed and no explicit values will be returned. 427 | Depending on your programming philosophy, there are pros and cons to this approach. Directly mutating the arguments allows more efficient memory usage (i.e., no need to allocate new variables every time a function is called), but one needs to be careful about the sequence of function calls and keep track of the states. 428 | This simulation framework choses to mainly to use mutating functions, which we will cover more in the next notebooks. 429 | """ 430 | 431 | # ╔═╡ 5728e2cd-b8eb-4979-9f77-19f50f5c89e5 432 | md""" 433 | 434 | In the next notebook, we will focus more on the data structures and how the code base will be structured. We will start to build a more complete TX module as we discuss more Julia details. 435 | 436 | """ 437 | 438 | # ╔═╡ 414814e4-6461-41ec-a313-d8a7ebf2aa0d 439 | md""" 440 | ## Helper function section 441 | """ 442 | 443 | # ╔═╡ b2f16df4-9575-4234-b380-bbd9cd0e6230 444 | function gen_wvfm(bits; tui, osr) 445 | #helper function used to generate oversampled waveform 446 | 447 | Vbits = kron(bits, ones(osr)) #Kronecker product to create oversampled waveform 448 | dt = tui/osr 449 | tt = 0:dt:(length(Vbits)-1)*dt 450 | 451 | return tt, Vbits 452 | end 453 | 454 | # ╔═╡ 533a9068-cf15-4075-a84e-0fa57a2f9ecd 455 | tt1, Vbits1 = gen_wvfm(bits, tui=tui, osr=osr1); 456 | 457 | # ╔═╡ 71870941-cbc9-4d79-a6b9-fd3ce55d21b9 458 | tt2, Vbits2 = gen_wvfm(bits, tui=tui, osr=osr2); 459 | 460 | # ╔═╡ 10bab6fb-e6ab-4581-b17b-489227372266 461 | begin 462 | #plotting. We will learn more Makie plots later 463 | fig = Figure() 464 | ax = Axis(fig[1,1]) 465 | lines!(ax, tt1, Vbits1, label = "osr=4") 466 | lines!(ax, tt2, Vbits2, label = "osr=32") 467 | axislegend() 468 | fig 469 | end 470 | 471 | # ╔═╡ 609b8929-e9a2-477d-bbd6-8fdbfb63be6c 472 | begin 473 | #plotting. We will learn more Makie plots later 474 | fig2 = Figure() 475 | ax2 = Axis(fig2[1,1]) 476 | lines!(ax2, tt1, Vout1[1:length(Vbits1)], label = "osr=4") 477 | lines!(ax2, tt2, Vout2[1:length(Vbits2)], label = "osr=32") 478 | axislegend() 479 | fig2 480 | end 481 | 482 | # ╔═╡ 7cae8f4e-2c32-4edc-9de8-d3411ff632ff 483 | md""" 484 | !!! info "Julia tips" 485 | The arguments in the gen_wvfm function are separated by a semicolon. This syntax in Julia means that anything after the semicolon is a keyword argument. An explicit "kw = something" statement is needed during function calls. Having keyword argument allows a function to have default parameters as well. 486 | """ 487 | 488 | # ╔═╡ e8774cf5-a499-4d33-91a5-b57bc08793fb 489 | function gen_ir_rc(dt,bw,t_len) 490 | #helper function that directly calculates a first order RC response, normalized to the time step 491 | tt = [0:dt:t_len-dt;] 492 | 493 | #checkout the intuitive symbols! 494 | ω = (2*π*bw) 495 | ir = ω*exp.(-tt*ω) 496 | ir .= ir/sum(ir*dt) 497 | 498 | return ir 499 | end 500 | 501 | # ╔═╡ 5834ebea-c215-4da8-b5de-14a4349177ee 502 | ir1 = gen_ir_rc(dt1, bw_ir, tlen_ir); 503 | 504 | # ╔═╡ e5f3b3e4-5db3-4343-97ad-0407f02fef49 505 | ir2 = gen_ir_rc(dt2, bw_ir, tlen_ir); 506 | 507 | # ╔═╡ 5f98a625-e315-4846-a121-ad0a5dca6fd8 508 | md""" 509 | !!! info "Julia tips" 510 | Unicode is supported in Julia, thus one can write cleaner code using commonly known symbols like in the gen\_ir\_rc function. 511 | """ 512 | 513 | # ╔═╡ 00000000-0000-0000-0000-000000000001 514 | PLUTO_PROJECT_TOML_CONTENTS = """ 515 | [deps] 516 | BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" 517 | CairoMakie = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" 518 | DSP = "717857b8-e6f2-59f4-9121-6e50c889abd2" 519 | Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" 520 | Makie = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" 521 | Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" 522 | UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" 523 | 524 | [compat] 525 | BenchmarkTools = "~1.5.0" 526 | CairoMakie = "~0.12.0" 527 | DSP = "~0.7.9" 528 | Distributions = "~0.25.108" 529 | Makie = "~0.21.0" 530 | UnPack = "~1.0.2" 531 | """ 532 | 533 | # ╔═╡ 00000000-0000-0000-0000-000000000002 534 | PLUTO_MANIFEST_TOML_CONTENTS = """ 535 | # This file is machine-generated - editing it directly is not advised 536 | 537 | julia_version = "1.10.3" 538 | manifest_format = "2.0" 539 | project_hash = "0afc2734d3211a1fc132a1f5fddb034ba85d3425" 540 | 541 | [[deps.AbstractFFTs]] 542 | deps = ["LinearAlgebra"] 543 | git-tree-sha1 = "d92ad398961a3ed262d8bf04a1a2b8340f915fef" 544 | uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" 545 | version = "1.5.0" 546 | weakdeps = ["ChainRulesCore", "Test"] 547 | 548 | [deps.AbstractFFTs.extensions] 549 | AbstractFFTsChainRulesCoreExt = "ChainRulesCore" 550 | AbstractFFTsTestExt = "Test" 551 | 552 | [[deps.AbstractTrees]] 553 | git-tree-sha1 = "2d9c9a55f9c93e8887ad391fbae72f8ef55e1177" 554 | uuid = "1520ce14-60c1-5f80-bbc7-55ef81b5835c" 555 | version = "0.4.5" 556 | 557 | [[deps.Adapt]] 558 | deps = ["LinearAlgebra", "Requires"] 559 | git-tree-sha1 = "6a55b747d1812e699320963ffde36f1ebdda4099" 560 | uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" 561 | version = "4.0.4" 562 | weakdeps = ["StaticArrays"] 563 | 564 | [deps.Adapt.extensions] 565 | AdaptStaticArraysExt = "StaticArrays" 566 | 567 | [[deps.AliasTables]] 568 | deps = ["Random"] 569 | git-tree-sha1 = "82b912bb5215792fd33df26f407d064d3602af98" 570 | uuid = "66dad0bd-aa9a-41b7-9441-69ab47430ed8" 571 | version = "1.1.2" 572 | 573 | [[deps.Animations]] 574 | deps = ["Colors"] 575 | git-tree-sha1 = "e81c509d2c8e49592413bfb0bb3b08150056c79d" 576 | uuid = "27a7e980-b3e6-11e9-2bcd-0b925532e340" 577 | version = "0.4.1" 578 | 579 | [[deps.ArgTools]] 580 | uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" 581 | version = "1.1.1" 582 | 583 | [[deps.Artifacts]] 584 | uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" 585 | 586 | [[deps.Automa]] 587 | deps = ["PrecompileTools", "TranscodingStreams"] 588 | git-tree-sha1 = "588e0d680ad1d7201d4c6a804dcb1cd9cba79fbb" 589 | uuid = "67c07d97-cdcb-5c2c-af73-a7f9c32a568b" 590 | version = "1.0.3" 591 | 592 | [[deps.AxisAlgorithms]] 593 | deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] 594 | git-tree-sha1 = "01b8ccb13d68535d73d2b0c23e39bd23155fb712" 595 | uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" 596 | version = "1.1.0" 597 | 598 | [[deps.AxisArrays]] 599 | deps = ["Dates", "IntervalSets", "IterTools", "RangeArrays"] 600 | git-tree-sha1 = "16351be62963a67ac4083f748fdb3cca58bfd52f" 601 | uuid = "39de3d68-74b9-583c-8d2d-e117c070f3a9" 602 | version = "0.4.7" 603 | 604 | [[deps.Base64]] 605 | uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" 606 | 607 | [[deps.BenchmarkTools]] 608 | deps = ["JSON", "Logging", "Printf", "Profile", "Statistics", "UUIDs"] 609 | git-tree-sha1 = "f1dff6729bc61f4d49e140da1af55dcd1ac97b2f" 610 | uuid = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" 611 | version = "1.5.0" 612 | 613 | [[deps.Bzip2_jll]] 614 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 615 | git-tree-sha1 = "9e2a6b69137e6969bab0152632dcb3bc108c8bdd" 616 | uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" 617 | version = "1.0.8+1" 618 | 619 | [[deps.CEnum]] 620 | git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" 621 | uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" 622 | version = "0.5.0" 623 | 624 | [[deps.CRC32c]] 625 | uuid = "8bf52ea8-c179-5cab-976a-9e18b702a9bc" 626 | 627 | [[deps.CRlibm_jll]] 628 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 629 | git-tree-sha1 = "e329286945d0cfc04456972ea732551869af1cfc" 630 | uuid = "4e9b3aee-d8a1-5a3d-ad8b-7d824db253f0" 631 | version = "1.0.1+0" 632 | 633 | [[deps.Cairo]] 634 | deps = ["Cairo_jll", "Colors", "Glib_jll", "Graphics", "Libdl", "Pango_jll"] 635 | git-tree-sha1 = "d0b3f8b4ad16cb0a2988c6788646a5e6a17b6b1b" 636 | uuid = "159f3aea-2a34-519c-b102-8c37f9878175" 637 | version = "1.0.5" 638 | 639 | [[deps.CairoMakie]] 640 | deps = ["CRC32c", "Cairo", "Colors", "FileIO", "FreeType", "GeometryBasics", "LinearAlgebra", "Makie", "PrecompileTools"] 641 | git-tree-sha1 = "aec444a07f2b3df8d41a47fabd02841b32be2dc5" 642 | uuid = "13f3f980-e62b-5c42-98c6-ff1f3baf88f0" 643 | version = "0.12.0" 644 | 645 | [[deps.Cairo_jll]] 646 | deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] 647 | git-tree-sha1 = "a2f1c8c668c8e3cb4cca4e57a8efdb09067bb3fd" 648 | uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" 649 | version = "1.18.0+2" 650 | 651 | [[deps.Calculus]] 652 | deps = ["LinearAlgebra"] 653 | git-tree-sha1 = "f641eb0a4f00c343bbc32346e1217b86f3ce9dad" 654 | uuid = "49dc2e85-a5d0-5ad3-a950-438e2897f1b9" 655 | version = "0.5.1" 656 | 657 | [[deps.ChainRulesCore]] 658 | deps = ["Compat", "LinearAlgebra"] 659 | git-tree-sha1 = "575cd02e080939a33b6df6c5853d14924c08e35b" 660 | uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 661 | version = "1.23.0" 662 | weakdeps = ["SparseArrays"] 663 | 664 | [deps.ChainRulesCore.extensions] 665 | ChainRulesCoreSparseArraysExt = "SparseArrays" 666 | 667 | [[deps.ColorBrewer]] 668 | deps = ["Colors", "JSON", "Test"] 669 | git-tree-sha1 = "61c5334f33d91e570e1d0c3eb5465835242582c4" 670 | uuid = "a2cac450-b92f-5266-8821-25eda20663c8" 671 | version = "0.4.0" 672 | 673 | [[deps.ColorSchemes]] 674 | deps = ["ColorTypes", "ColorVectorSpace", "Colors", "FixedPointNumbers", "PrecompileTools", "Random"] 675 | git-tree-sha1 = "4b270d6465eb21ae89b732182c20dc165f8bf9f2" 676 | uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" 677 | version = "3.25.0" 678 | 679 | [[deps.ColorTypes]] 680 | deps = ["FixedPointNumbers", "Random"] 681 | git-tree-sha1 = "b10d0b65641d57b8b4d5e234446582de5047050d" 682 | uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" 683 | version = "0.11.5" 684 | 685 | [[deps.ColorVectorSpace]] 686 | deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] 687 | git-tree-sha1 = "a1f44953f2382ebb937d60dafbe2deea4bd23249" 688 | uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" 689 | version = "0.10.0" 690 | weakdeps = ["SpecialFunctions"] 691 | 692 | [deps.ColorVectorSpace.extensions] 693 | SpecialFunctionsExt = "SpecialFunctions" 694 | 695 | [[deps.Colors]] 696 | deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] 697 | git-tree-sha1 = "362a287c3aa50601b0bc359053d5c2468f0e7ce0" 698 | uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" 699 | version = "0.12.11" 700 | 701 | [[deps.Compat]] 702 | deps = ["TOML", "UUIDs"] 703 | git-tree-sha1 = "b1c55339b7c6c350ee89f2c1604299660525b248" 704 | uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" 705 | version = "4.15.0" 706 | weakdeps = ["Dates", "LinearAlgebra"] 707 | 708 | [deps.Compat.extensions] 709 | CompatLinearAlgebraExt = "LinearAlgebra" 710 | 711 | [[deps.CompilerSupportLibraries_jll]] 712 | deps = ["Artifacts", "Libdl"] 713 | uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" 714 | version = "1.1.1+0" 715 | 716 | [[deps.ConstructionBase]] 717 | deps = ["LinearAlgebra"] 718 | git-tree-sha1 = "260fd2400ed2dab602a7c15cf10c1933c59930a2" 719 | uuid = "187b0558-2788-49d3-abe0-74a17ed4e7c9" 720 | version = "1.5.5" 721 | weakdeps = ["IntervalSets", "StaticArrays"] 722 | 723 | [deps.ConstructionBase.extensions] 724 | ConstructionBaseIntervalSetsExt = "IntervalSets" 725 | ConstructionBaseStaticArraysExt = "StaticArrays" 726 | 727 | [[deps.Contour]] 728 | git-tree-sha1 = "439e35b0b36e2e5881738abc8857bd92ad6ff9a8" 729 | uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" 730 | version = "0.6.3" 731 | 732 | [[deps.DSP]] 733 | deps = ["Compat", "FFTW", "IterTools", "LinearAlgebra", "Polynomials", "Random", "Reexport", "SpecialFunctions", "Statistics"] 734 | git-tree-sha1 = "f7f4319567fe769debfcf7f8c03d8da1dd4e2fb0" 735 | uuid = "717857b8-e6f2-59f4-9121-6e50c889abd2" 736 | version = "0.7.9" 737 | 738 | [[deps.DataAPI]] 739 | git-tree-sha1 = "abe83f3a2f1b857aac70ef8b269080af17764bbe" 740 | uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" 741 | version = "1.16.0" 742 | 743 | [[deps.DataStructures]] 744 | deps = ["Compat", "InteractiveUtils", "OrderedCollections"] 745 | git-tree-sha1 = "1d0a14036acb104d9e89698bd408f63ab58cdc82" 746 | uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" 747 | version = "0.18.20" 748 | 749 | [[deps.DataValueInterfaces]] 750 | git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" 751 | uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" 752 | version = "1.0.0" 753 | 754 | [[deps.Dates]] 755 | deps = ["Printf"] 756 | uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" 757 | 758 | [[deps.DelaunayTriangulation]] 759 | deps = ["EnumX", "ExactPredicates", "Random"] 760 | git-tree-sha1 = "1755070db557ec2c37df2664c75600298b0c1cfc" 761 | uuid = "927a84f5-c5f4-47a5-9785-b46e178433df" 762 | version = "1.0.3" 763 | 764 | [[deps.Distributed]] 765 | deps = ["Random", "Serialization", "Sockets"] 766 | uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" 767 | 768 | [[deps.Distributions]] 769 | deps = ["AliasTables", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SpecialFunctions", "Statistics", "StatsAPI", "StatsBase", "StatsFuns"] 770 | git-tree-sha1 = "22c595ca4146c07b16bcf9c8bea86f731f7109d2" 771 | uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" 772 | version = "0.25.108" 773 | 774 | [deps.Distributions.extensions] 775 | DistributionsChainRulesCoreExt = "ChainRulesCore" 776 | DistributionsDensityInterfaceExt = "DensityInterface" 777 | DistributionsTestExt = "Test" 778 | 779 | [deps.Distributions.weakdeps] 780 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 781 | DensityInterface = "b429d917-457f-4dbc-8f4c-0cc954292b1d" 782 | Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" 783 | 784 | [[deps.DocStringExtensions]] 785 | deps = ["LibGit2"] 786 | git-tree-sha1 = "2fb1e02f2b635d0845df5d7c167fec4dd739b00d" 787 | uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" 788 | version = "0.9.3" 789 | 790 | [[deps.Downloads]] 791 | deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] 792 | uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" 793 | version = "1.6.0" 794 | 795 | [[deps.DualNumbers]] 796 | deps = ["Calculus", "NaNMath", "SpecialFunctions"] 797 | git-tree-sha1 = "5837a837389fccf076445fce071c8ddaea35a566" 798 | uuid = "fa6b7ba4-c1ee-5f82-b5fc-ecf0adba8f74" 799 | version = "0.6.8" 800 | 801 | [[deps.EarCut_jll]] 802 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 803 | git-tree-sha1 = "e3290f2d49e661fbd94046d7e3726ffcb2d41053" 804 | uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" 805 | version = "2.2.4+0" 806 | 807 | [[deps.EnumX]] 808 | git-tree-sha1 = "bdb1942cd4c45e3c678fd11569d5cccd80976237" 809 | uuid = "4e289a0a-7415-4d19-859d-a7e5c4648b56" 810 | version = "1.0.4" 811 | 812 | [[deps.ExactPredicates]] 813 | deps = ["IntervalArithmetic", "Random", "StaticArrays"] 814 | git-tree-sha1 = "b3f2ff58735b5f024c392fde763f29b057e4b025" 815 | uuid = "429591f6-91af-11e9-00e2-59fbe8cec110" 816 | version = "2.2.8" 817 | 818 | [[deps.Expat_jll]] 819 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 820 | git-tree-sha1 = "1c6317308b9dc757616f0b5cb379db10494443a7" 821 | uuid = "2e619515-83b5-522b-bb60-26c02a35a201" 822 | version = "2.6.2+0" 823 | 824 | [[deps.Extents]] 825 | git-tree-sha1 = "2140cd04483da90b2da7f99b2add0750504fc39c" 826 | uuid = "411431e0-e8b7-467b-b5e0-f676ba4f2910" 827 | version = "0.1.2" 828 | 829 | [[deps.FFMPEG_jll]] 830 | deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] 831 | git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" 832 | uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" 833 | version = "4.4.4+1" 834 | 835 | [[deps.FFTW]] 836 | deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] 837 | git-tree-sha1 = "4820348781ae578893311153d69049a93d05f39d" 838 | uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" 839 | version = "1.8.0" 840 | 841 | [[deps.FFTW_jll]] 842 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 843 | git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" 844 | uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" 845 | version = "3.3.10+0" 846 | 847 | [[deps.FileIO]] 848 | deps = ["Pkg", "Requires", "UUIDs"] 849 | git-tree-sha1 = "82d8afa92ecf4b52d78d869f038ebfb881267322" 850 | uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" 851 | version = "1.16.3" 852 | 853 | [[deps.FilePaths]] 854 | deps = ["FilePathsBase", "MacroTools", "Reexport", "Requires"] 855 | git-tree-sha1 = "919d9412dbf53a2e6fe74af62a73ceed0bce0629" 856 | uuid = "8fc22ac5-c921-52a6-82fd-178b2807b824" 857 | version = "0.8.3" 858 | 859 | [[deps.FilePathsBase]] 860 | deps = ["Compat", "Dates", "Mmap", "Printf", "Test", "UUIDs"] 861 | git-tree-sha1 = "9f00e42f8d99fdde64d40c8ea5d14269a2e2c1aa" 862 | uuid = "48062228-2e41-5def-b9a4-89aafe57970f" 863 | version = "0.9.21" 864 | 865 | [[deps.FileWatching]] 866 | uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" 867 | 868 | [[deps.FillArrays]] 869 | deps = ["LinearAlgebra"] 870 | git-tree-sha1 = "0653c0a2396a6da5bc4766c43041ef5fd3efbe57" 871 | uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" 872 | version = "1.11.0" 873 | weakdeps = ["PDMats", "SparseArrays", "Statistics"] 874 | 875 | [deps.FillArrays.extensions] 876 | FillArraysPDMatsExt = "PDMats" 877 | FillArraysSparseArraysExt = "SparseArrays" 878 | FillArraysStatisticsExt = "Statistics" 879 | 880 | [[deps.FixedPointNumbers]] 881 | deps = ["Statistics"] 882 | git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" 883 | uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" 884 | version = "0.8.5" 885 | 886 | [[deps.Fontconfig_jll]] 887 | deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] 888 | git-tree-sha1 = "db16beca600632c95fc8aca29890d83788dd8b23" 889 | uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" 890 | version = "2.13.96+0" 891 | 892 | [[deps.Format]] 893 | git-tree-sha1 = "9c68794ef81b08086aeb32eeaf33531668d5f5fc" 894 | uuid = "1fa38f19-a742-5d3f-a2b9-30dd87b9d5f8" 895 | version = "1.3.7" 896 | 897 | [[deps.FreeType]] 898 | deps = ["CEnum", "FreeType2_jll"] 899 | git-tree-sha1 = "907369da0f8e80728ab49c1c7e09327bf0d6d999" 900 | uuid = "b38be410-82b0-50bf-ab77-7b57e271db43" 901 | version = "4.1.1" 902 | 903 | [[deps.FreeType2_jll]] 904 | deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] 905 | git-tree-sha1 = "5c1d8ae0efc6c2e7b1fc502cbe25def8f661b7bc" 906 | uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" 907 | version = "2.13.2+0" 908 | 909 | [[deps.FreeTypeAbstraction]] 910 | deps = ["ColorVectorSpace", "Colors", "FreeType", "GeometryBasics"] 911 | git-tree-sha1 = "2493cdfd0740015955a8e46de4ef28f49460d8bc" 912 | uuid = "663a7486-cb36-511b-a19d-713bb74d65c9" 913 | version = "0.10.3" 914 | 915 | [[deps.FriBidi_jll]] 916 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 917 | git-tree-sha1 = "1ed150b39aebcc805c26b93a8d0122c940f64ce2" 918 | uuid = "559328eb-81f9-559d-9380-de523a88c83c" 919 | version = "1.0.14+0" 920 | 921 | [[deps.GeoInterface]] 922 | deps = ["Extents"] 923 | git-tree-sha1 = "801aef8228f7f04972e596b09d4dba481807c913" 924 | uuid = "cf35fbd7-0cd7-5166-be24-54bfbe79505f" 925 | version = "1.3.4" 926 | 927 | [[deps.GeometryBasics]] 928 | deps = ["EarCut_jll", "Extents", "GeoInterface", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] 929 | git-tree-sha1 = "b62f2b2d76cee0d61a2ef2b3118cd2a3215d3134" 930 | uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" 931 | version = "0.4.11" 932 | 933 | [[deps.Gettext_jll]] 934 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] 935 | git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" 936 | uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" 937 | version = "0.21.0+0" 938 | 939 | [[deps.Glib_jll]] 940 | deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] 941 | git-tree-sha1 = "7c82e6a6cd34e9d935e9aa4051b66c6ff3af59ba" 942 | uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" 943 | version = "2.80.2+0" 944 | 945 | [[deps.Graphics]] 946 | deps = ["Colors", "LinearAlgebra", "NaNMath"] 947 | git-tree-sha1 = "d61890399bc535850c4bf08e4e0d3a7ad0f21cbd" 948 | uuid = "a2bd30eb-e257-5431-a919-1863eab51364" 949 | version = "1.1.2" 950 | 951 | [[deps.Graphite2_jll]] 952 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 953 | git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" 954 | uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" 955 | version = "1.3.14+0" 956 | 957 | [[deps.GridLayoutBase]] 958 | deps = ["GeometryBasics", "InteractiveUtils", "Observables"] 959 | git-tree-sha1 = "fc713f007cff99ff9e50accba6373624ddd33588" 960 | uuid = "3955a311-db13-416c-9275-1d80ed98e5e9" 961 | version = "0.11.0" 962 | 963 | [[deps.Grisu]] 964 | git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" 965 | uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" 966 | version = "1.0.2" 967 | 968 | [[deps.HarfBuzz_jll]] 969 | deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] 970 | git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" 971 | uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" 972 | version = "2.8.1+1" 973 | 974 | [[deps.HypergeometricFunctions]] 975 | deps = ["DualNumbers", "LinearAlgebra", "OpenLibm_jll", "SpecialFunctions"] 976 | git-tree-sha1 = "f218fe3736ddf977e0e772bc9a586b2383da2685" 977 | uuid = "34004b35-14d8-5ef3-9330-4cdb6864b03a" 978 | version = "0.3.23" 979 | 980 | [[deps.ImageAxes]] 981 | deps = ["AxisArrays", "ImageBase", "ImageCore", "Reexport", "SimpleTraits"] 982 | git-tree-sha1 = "2e4520d67b0cef90865b3ef727594d2a58e0e1f8" 983 | uuid = "2803e5a7-5153-5ecf-9a86-9b4c37f5f5ac" 984 | version = "0.6.11" 985 | 986 | [[deps.ImageBase]] 987 | deps = ["ImageCore", "Reexport"] 988 | git-tree-sha1 = "eb49b82c172811fd2c86759fa0553a2221feb909" 989 | uuid = "c817782e-172a-44cc-b673-b171935fbb9e" 990 | version = "0.1.7" 991 | 992 | [[deps.ImageCore]] 993 | deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] 994 | git-tree-sha1 = "b2a7eaa169c13f5bcae8131a83bc30eff8f71be0" 995 | uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" 996 | version = "0.10.2" 997 | 998 | [[deps.ImageIO]] 999 | deps = ["FileIO", "IndirectArrays", "JpegTurbo", "LazyModules", "Netpbm", "OpenEXR", "PNGFiles", "QOI", "Sixel", "TiffImages", "UUIDs"] 1000 | git-tree-sha1 = "437abb322a41d527c197fa800455f79d414f0a3c" 1001 | uuid = "82e4d734-157c-48bb-816b-45c225c6df19" 1002 | version = "0.6.8" 1003 | 1004 | [[deps.ImageMetadata]] 1005 | deps = ["AxisArrays", "ImageAxes", "ImageBase", "ImageCore"] 1006 | git-tree-sha1 = "355e2b974f2e3212a75dfb60519de21361ad3cb7" 1007 | uuid = "bc367c6b-8a6b-528e-b4bd-a4b897500b49" 1008 | version = "0.9.9" 1009 | 1010 | [[deps.Imath_jll]] 1011 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1012 | git-tree-sha1 = "0936ba688c6d201805a83da835b55c61a180db52" 1013 | uuid = "905a6f67-0a94-5f89-b386-d35d92009cd1" 1014 | version = "3.1.11+0" 1015 | 1016 | [[deps.IndirectArrays]] 1017 | git-tree-sha1 = "012e604e1c7458645cb8b436f8fba789a51b257f" 1018 | uuid = "9b13fd28-a010-5f03-acff-a1bbcff69959" 1019 | version = "1.0.0" 1020 | 1021 | [[deps.Inflate]] 1022 | git-tree-sha1 = "ea8031dea4aff6bd41f1df8f2fdfb25b33626381" 1023 | uuid = "d25df0c9-e2be-5dd7-82c8-3ad0b3e990b9" 1024 | version = "0.1.4" 1025 | 1026 | [[deps.IntelOpenMP_jll]] 1027 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1028 | git-tree-sha1 = "be50fe8df3acbffa0274a744f1a99d29c45a57f4" 1029 | uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" 1030 | version = "2024.1.0+0" 1031 | 1032 | [[deps.InteractiveUtils]] 1033 | deps = ["Markdown"] 1034 | uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" 1035 | 1036 | [[deps.Interpolations]] 1037 | deps = ["Adapt", "AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] 1038 | git-tree-sha1 = "88a101217d7cb38a7b481ccd50d21876e1d1b0e0" 1039 | uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" 1040 | version = "0.15.1" 1041 | weakdeps = ["Unitful"] 1042 | 1043 | [deps.Interpolations.extensions] 1044 | InterpolationsUnitfulExt = "Unitful" 1045 | 1046 | [[deps.IntervalArithmetic]] 1047 | deps = ["CRlibm_jll", "MacroTools", "RoundingEmulator"] 1048 | git-tree-sha1 = "23ddd329f4a2a65c7a55b91553b60849bd038575" 1049 | uuid = "d1acc4aa-44c8-5952-acd4-ba5d80a2a253" 1050 | version = "0.22.11" 1051 | 1052 | [deps.IntervalArithmetic.extensions] 1053 | IntervalArithmeticDiffRulesExt = "DiffRules" 1054 | IntervalArithmeticForwardDiffExt = "ForwardDiff" 1055 | IntervalArithmeticRecipesBaseExt = "RecipesBase" 1056 | 1057 | [deps.IntervalArithmetic.weakdeps] 1058 | DiffRules = "b552c78f-8df3-52c6-915a-8e097449b14b" 1059 | ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" 1060 | RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" 1061 | 1062 | [[deps.IntervalSets]] 1063 | git-tree-sha1 = "dba9ddf07f77f60450fe5d2e2beb9854d9a49bd0" 1064 | uuid = "8197267c-284f-5f27-9208-e0e47529a953" 1065 | version = "0.7.10" 1066 | weakdeps = ["Random", "RecipesBase", "Statistics"] 1067 | 1068 | [deps.IntervalSets.extensions] 1069 | IntervalSetsRandomExt = "Random" 1070 | IntervalSetsRecipesBaseExt = "RecipesBase" 1071 | IntervalSetsStatisticsExt = "Statistics" 1072 | 1073 | [[deps.IrrationalConstants]] 1074 | git-tree-sha1 = "630b497eafcc20001bba38a4651b327dcfc491d2" 1075 | uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" 1076 | version = "0.2.2" 1077 | 1078 | [[deps.Isoband]] 1079 | deps = ["isoband_jll"] 1080 | git-tree-sha1 = "f9b6d97355599074dc867318950adaa6f9946137" 1081 | uuid = "f1662d9f-8043-43de-a69a-05efc1cc6ff4" 1082 | version = "0.1.1" 1083 | 1084 | [[deps.IterTools]] 1085 | git-tree-sha1 = "42d5f897009e7ff2cf88db414a389e5ed1bdd023" 1086 | uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" 1087 | version = "1.10.0" 1088 | 1089 | [[deps.IteratorInterfaceExtensions]] 1090 | git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" 1091 | uuid = "82899510-4779-5014-852e-03e436cf321d" 1092 | version = "1.0.0" 1093 | 1094 | [[deps.JLLWrappers]] 1095 | deps = ["Artifacts", "Preferences"] 1096 | git-tree-sha1 = "7e5d6779a1e09a36db2a7b6cff50942a0a7d0fca" 1097 | uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" 1098 | version = "1.5.0" 1099 | 1100 | [[deps.JSON]] 1101 | deps = ["Dates", "Mmap", "Parsers", "Unicode"] 1102 | git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" 1103 | uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" 1104 | version = "0.21.4" 1105 | 1106 | [[deps.JpegTurbo]] 1107 | deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] 1108 | git-tree-sha1 = "fa6d0bcff8583bac20f1ffa708c3913ca605c611" 1109 | uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" 1110 | version = "0.1.5" 1111 | 1112 | [[deps.JpegTurbo_jll]] 1113 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1114 | git-tree-sha1 = "c84a835e1a09b289ffcd2271bf2a337bbdda6637" 1115 | uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" 1116 | version = "3.0.3+0" 1117 | 1118 | [[deps.KernelDensity]] 1119 | deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] 1120 | git-tree-sha1 = "7d703202e65efa1369de1279c162b915e245eed1" 1121 | uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" 1122 | version = "0.6.9" 1123 | 1124 | [[deps.LAME_jll]] 1125 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1126 | git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" 1127 | uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" 1128 | version = "3.100.2+0" 1129 | 1130 | [[deps.LLVMOpenMP_jll]] 1131 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1132 | git-tree-sha1 = "d986ce2d884d49126836ea94ed5bfb0f12679713" 1133 | uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" 1134 | version = "15.0.7+0" 1135 | 1136 | [[deps.LZO_jll]] 1137 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1138 | git-tree-sha1 = "70c5da094887fd2cae843b8db33920bac4b6f07d" 1139 | uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" 1140 | version = "2.10.2+0" 1141 | 1142 | [[deps.LaTeXStrings]] 1143 | git-tree-sha1 = "50901ebc375ed41dbf8058da26f9de442febbbec" 1144 | uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" 1145 | version = "1.3.1" 1146 | 1147 | [[deps.LazyArtifacts]] 1148 | deps = ["Artifacts", "Pkg"] 1149 | uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" 1150 | 1151 | [[deps.LazyModules]] 1152 | git-tree-sha1 = "a560dd966b386ac9ae60bdd3a3d3a326062d3c3e" 1153 | uuid = "8cdb02fc-e678-4876-92c5-9defec4f444e" 1154 | version = "0.3.1" 1155 | 1156 | [[deps.LibCURL]] 1157 | deps = ["LibCURL_jll", "MozillaCACerts_jll"] 1158 | uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" 1159 | version = "0.6.4" 1160 | 1161 | [[deps.LibCURL_jll]] 1162 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] 1163 | uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" 1164 | version = "8.4.0+0" 1165 | 1166 | [[deps.LibGit2]] 1167 | deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] 1168 | uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" 1169 | 1170 | [[deps.LibGit2_jll]] 1171 | deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] 1172 | uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" 1173 | version = "1.6.4+0" 1174 | 1175 | [[deps.LibSSH2_jll]] 1176 | deps = ["Artifacts", "Libdl", "MbedTLS_jll"] 1177 | uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" 1178 | version = "1.11.0+1" 1179 | 1180 | [[deps.Libdl]] 1181 | uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" 1182 | 1183 | [[deps.Libffi_jll]] 1184 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1185 | git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" 1186 | uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" 1187 | version = "3.2.2+1" 1188 | 1189 | [[deps.Libgcrypt_jll]] 1190 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] 1191 | git-tree-sha1 = "9fd170c4bbfd8b935fdc5f8b7aa33532c991a673" 1192 | uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" 1193 | version = "1.8.11+0" 1194 | 1195 | [[deps.Libgpg_error_jll]] 1196 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1197 | git-tree-sha1 = "fbb1f2bef882392312feb1ede3615ddc1e9b99ed" 1198 | uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" 1199 | version = "1.49.0+0" 1200 | 1201 | [[deps.Libiconv_jll]] 1202 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1203 | git-tree-sha1 = "f9557a255370125b405568f9767d6d195822a175" 1204 | uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" 1205 | version = "1.17.0+0" 1206 | 1207 | [[deps.Libmount_jll]] 1208 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1209 | git-tree-sha1 = "0c4f9c4f1a50d8f35048fa0532dabbadf702f81e" 1210 | uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" 1211 | version = "2.40.1+0" 1212 | 1213 | [[deps.Libuuid_jll]] 1214 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1215 | git-tree-sha1 = "5ee6203157c120d79034c748a2acba45b82b8807" 1216 | uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" 1217 | version = "2.40.1+0" 1218 | 1219 | [[deps.LinearAlgebra]] 1220 | deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] 1221 | uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" 1222 | 1223 | [[deps.LogExpFunctions]] 1224 | deps = ["DocStringExtensions", "IrrationalConstants", "LinearAlgebra"] 1225 | git-tree-sha1 = "18144f3e9cbe9b15b070288eef858f71b291ce37" 1226 | uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" 1227 | version = "0.3.27" 1228 | 1229 | [deps.LogExpFunctions.extensions] 1230 | LogExpFunctionsChainRulesCoreExt = "ChainRulesCore" 1231 | LogExpFunctionsChangesOfVariablesExt = "ChangesOfVariables" 1232 | LogExpFunctionsInverseFunctionsExt = "InverseFunctions" 1233 | 1234 | [deps.LogExpFunctions.weakdeps] 1235 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 1236 | ChangesOfVariables = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" 1237 | InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" 1238 | 1239 | [[deps.Logging]] 1240 | uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" 1241 | 1242 | [[deps.MKL_jll]] 1243 | deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "oneTBB_jll"] 1244 | git-tree-sha1 = "80b2833b56d466b3858d565adcd16a4a05f2089b" 1245 | uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" 1246 | version = "2024.1.0+0" 1247 | 1248 | [[deps.MacroTools]] 1249 | deps = ["Markdown", "Random"] 1250 | git-tree-sha1 = "2fa9ee3e63fd3a4f7a9a4f4744a52f4856de82df" 1251 | uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" 1252 | version = "0.5.13" 1253 | 1254 | [[deps.Makie]] 1255 | deps = ["Animations", "Base64", "CRC32c", "ColorBrewer", "ColorSchemes", "ColorTypes", "Colors", "Contour", "Dates", "DelaunayTriangulation", "Distributions", "DocStringExtensions", "Downloads", "FFMPEG_jll", "FileIO", "FilePaths", "FixedPointNumbers", "Format", "FreeType", "FreeTypeAbstraction", "GeometryBasics", "GridLayoutBase", "ImageIO", "InteractiveUtils", "IntervalSets", "Isoband", "KernelDensity", "LaTeXStrings", "LinearAlgebra", "MacroTools", "MakieCore", "Markdown", "MathTeXEngine", "Observables", "OffsetArrays", "Packing", "PlotUtils", "PolygonOps", "PrecompileTools", "Printf", "REPL", "Random", "RelocatableFolders", "Scratch", "ShaderAbstractions", "Showoff", "SignedDistanceFields", "SparseArrays", "Statistics", "StatsBase", "StatsFuns", "StructArrays", "TriplotBase", "UnicodeFun", "Unitful"] 1256 | git-tree-sha1 = "e96f6e1dba3c008d95b97103a330be6287411c67" 1257 | uuid = "ee78f7c6-11fb-53f2-987a-cfe4a2b5a57a" 1258 | version = "0.21.0" 1259 | 1260 | [[deps.MakieCore]] 1261 | deps = ["ColorTypes", "GeometryBasics", "IntervalSets", "Observables"] 1262 | git-tree-sha1 = "f23e301d977e037ff8df4e1f5d8035cd78a1e250" 1263 | uuid = "20f20a25-4f0e-4fdf-b5d1-57303727442b" 1264 | version = "0.8.0" 1265 | 1266 | [[deps.MappedArrays]] 1267 | git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" 1268 | uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" 1269 | version = "0.4.2" 1270 | 1271 | [[deps.Markdown]] 1272 | deps = ["Base64"] 1273 | uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" 1274 | 1275 | [[deps.MathTeXEngine]] 1276 | deps = ["AbstractTrees", "Automa", "DataStructures", "FreeTypeAbstraction", "GeometryBasics", "LaTeXStrings", "REPL", "RelocatableFolders", "UnicodeFun"] 1277 | git-tree-sha1 = "1865d0b8a2d91477c8b16b49152a32764c7b1f5f" 1278 | uuid = "0a4f8689-d25c-4efe-a92b-7142dfc1aa53" 1279 | version = "0.6.0" 1280 | 1281 | [[deps.MbedTLS_jll]] 1282 | deps = ["Artifacts", "Libdl"] 1283 | uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" 1284 | version = "2.28.2+1" 1285 | 1286 | [[deps.Missings]] 1287 | deps = ["DataAPI"] 1288 | git-tree-sha1 = "ec4f7fbeab05d7747bdf98eb74d130a2a2ed298d" 1289 | uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" 1290 | version = "1.2.0" 1291 | 1292 | [[deps.Mmap]] 1293 | uuid = "a63ad114-7e13-5084-954f-fe012c677804" 1294 | 1295 | [[deps.MosaicViews]] 1296 | deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] 1297 | git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" 1298 | uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" 1299 | version = "0.3.4" 1300 | 1301 | [[deps.MozillaCACerts_jll]] 1302 | uuid = "14a3606d-f60d-562e-9121-12d972cd8159" 1303 | version = "2023.1.10" 1304 | 1305 | [[deps.NaNMath]] 1306 | deps = ["OpenLibm_jll"] 1307 | git-tree-sha1 = "0877504529a3e5c3343c6f8b4c0381e57e4387e4" 1308 | uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" 1309 | version = "1.0.2" 1310 | 1311 | [[deps.Netpbm]] 1312 | deps = ["FileIO", "ImageCore", "ImageMetadata"] 1313 | git-tree-sha1 = "d92b107dbb887293622df7697a2223f9f8176fcd" 1314 | uuid = "f09324ee-3d7c-5217-9330-fc30815ba969" 1315 | version = "1.1.1" 1316 | 1317 | [[deps.NetworkOptions]] 1318 | uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" 1319 | version = "1.2.0" 1320 | 1321 | [[deps.Observables]] 1322 | git-tree-sha1 = "7438a59546cf62428fc9d1bc94729146d37a7225" 1323 | uuid = "510215fc-4207-5dde-b226-833fc4488ee2" 1324 | version = "0.5.5" 1325 | 1326 | [[deps.OffsetArrays]] 1327 | git-tree-sha1 = "e64b4f5ea6b7389f6f046d13d4896a8f9c1ba71e" 1328 | uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" 1329 | version = "1.14.0" 1330 | weakdeps = ["Adapt"] 1331 | 1332 | [deps.OffsetArrays.extensions] 1333 | OffsetArraysAdaptExt = "Adapt" 1334 | 1335 | [[deps.Ogg_jll]] 1336 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1337 | git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" 1338 | uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" 1339 | version = "1.3.5+1" 1340 | 1341 | [[deps.OpenBLAS_jll]] 1342 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] 1343 | uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" 1344 | version = "0.3.23+4" 1345 | 1346 | [[deps.OpenEXR]] 1347 | deps = ["Colors", "FileIO", "OpenEXR_jll"] 1348 | git-tree-sha1 = "327f53360fdb54df7ecd01e96ef1983536d1e633" 1349 | uuid = "52e1d378-f018-4a11-a4be-720524705ac7" 1350 | version = "0.3.2" 1351 | 1352 | [[deps.OpenEXR_jll]] 1353 | deps = ["Artifacts", "Imath_jll", "JLLWrappers", "Libdl", "Zlib_jll"] 1354 | git-tree-sha1 = "8292dd5c8a38257111ada2174000a33745b06d4e" 1355 | uuid = "18a262bb-aa17-5467-a713-aee519bc75cb" 1356 | version = "3.2.4+0" 1357 | 1358 | [[deps.OpenLibm_jll]] 1359 | deps = ["Artifacts", "Libdl"] 1360 | uuid = "05823500-19ac-5b8b-9628-191a04bc5112" 1361 | version = "0.8.1+2" 1362 | 1363 | [[deps.OpenSSL_jll]] 1364 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1365 | git-tree-sha1 = "3da7367955dcc5c54c1ba4d402ccdc09a1a3e046" 1366 | uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" 1367 | version = "3.0.13+1" 1368 | 1369 | [[deps.OpenSpecFun_jll]] 1370 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] 1371 | git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" 1372 | uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" 1373 | version = "0.5.5+0" 1374 | 1375 | [[deps.Opus_jll]] 1376 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1377 | git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" 1378 | uuid = "91d4177d-7536-5919-b921-800302f37372" 1379 | version = "1.3.2+0" 1380 | 1381 | [[deps.OrderedCollections]] 1382 | git-tree-sha1 = "dfdf5519f235516220579f949664f1bf44e741c5" 1383 | uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" 1384 | version = "1.6.3" 1385 | 1386 | [[deps.PCRE2_jll]] 1387 | deps = ["Artifacts", "Libdl"] 1388 | uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" 1389 | version = "10.42.0+1" 1390 | 1391 | [[deps.PDMats]] 1392 | deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] 1393 | git-tree-sha1 = "949347156c25054de2db3b166c52ac4728cbad65" 1394 | uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" 1395 | version = "0.11.31" 1396 | 1397 | [[deps.PNGFiles]] 1398 | deps = ["Base64", "CEnum", "ImageCore", "IndirectArrays", "OffsetArrays", "libpng_jll"] 1399 | git-tree-sha1 = "67186a2bc9a90f9f85ff3cc8277868961fb57cbd" 1400 | uuid = "f57f5aa1-a3ce-4bc8-8ab9-96f992907883" 1401 | version = "0.4.3" 1402 | 1403 | [[deps.Packing]] 1404 | deps = ["GeometryBasics"] 1405 | git-tree-sha1 = "ec3edfe723df33528e085e632414499f26650501" 1406 | uuid = "19eb6ba3-879d-56ad-ad62-d5c202156566" 1407 | version = "0.5.0" 1408 | 1409 | [[deps.PaddedViews]] 1410 | deps = ["OffsetArrays"] 1411 | git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" 1412 | uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" 1413 | version = "0.5.12" 1414 | 1415 | [[deps.Pango_jll]] 1416 | deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "FriBidi_jll", "Glib_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl"] 1417 | git-tree-sha1 = "cb5a2ab6763464ae0f19c86c56c63d4a2b0f5bda" 1418 | uuid = "36c8627f-9965-5494-a995-c6b170f724f3" 1419 | version = "1.52.2+0" 1420 | 1421 | [[deps.Parsers]] 1422 | deps = ["Dates", "PrecompileTools", "UUIDs"] 1423 | git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" 1424 | uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" 1425 | version = "2.8.1" 1426 | 1427 | [[deps.Pixman_jll]] 1428 | deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] 1429 | git-tree-sha1 = "35621f10a7531bc8fa58f74610b1bfb70a3cfc6b" 1430 | uuid = "30392449-352a-5448-841d-b1acce4e97dc" 1431 | version = "0.43.4+0" 1432 | 1433 | [[deps.Pkg]] 1434 | deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] 1435 | uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" 1436 | version = "1.10.0" 1437 | 1438 | [[deps.PkgVersion]] 1439 | deps = ["Pkg"] 1440 | git-tree-sha1 = "f9501cc0430a26bc3d156ae1b5b0c1b47af4d6da" 1441 | uuid = "eebad327-c553-4316-9ea0-9fa01ccd7688" 1442 | version = "0.3.3" 1443 | 1444 | [[deps.PlotUtils]] 1445 | deps = ["ColorSchemes", "Colors", "Dates", "PrecompileTools", "Printf", "Random", "Reexport", "Statistics"] 1446 | git-tree-sha1 = "7b1a9df27f072ac4c9c7cbe5efb198489258d1f5" 1447 | uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" 1448 | version = "1.4.1" 1449 | 1450 | [[deps.PolygonOps]] 1451 | git-tree-sha1 = "77b3d3605fc1cd0b42d95eba87dfcd2bf67d5ff6" 1452 | uuid = "647866c9-e3ac-4575-94e7-e3d426903924" 1453 | version = "0.1.2" 1454 | 1455 | [[deps.Polynomials]] 1456 | deps = ["LinearAlgebra", "RecipesBase"] 1457 | git-tree-sha1 = "a14a99e430e42a105c898fcc7f212334bc7be887" 1458 | uuid = "f27b6e38-b328-58d1-80ce-0feddd5e7a45" 1459 | version = "3.2.4" 1460 | 1461 | [[deps.PrecompileTools]] 1462 | deps = ["Preferences"] 1463 | git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" 1464 | uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" 1465 | version = "1.2.1" 1466 | 1467 | [[deps.Preferences]] 1468 | deps = ["TOML"] 1469 | git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" 1470 | uuid = "21216c6a-2e73-6563-6e65-726566657250" 1471 | version = "1.4.3" 1472 | 1473 | [[deps.Printf]] 1474 | deps = ["Unicode"] 1475 | uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" 1476 | 1477 | [[deps.Profile]] 1478 | deps = ["Printf"] 1479 | uuid = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" 1480 | 1481 | [[deps.ProgressMeter]] 1482 | deps = ["Distributed", "Printf"] 1483 | git-tree-sha1 = "763a8ceb07833dd51bb9e3bbca372de32c0605ad" 1484 | uuid = "92933f4c-e287-5a05-a399-4b506db050ca" 1485 | version = "1.10.0" 1486 | 1487 | [[deps.QOI]] 1488 | deps = ["ColorTypes", "FileIO", "FixedPointNumbers"] 1489 | git-tree-sha1 = "18e8f4d1426e965c7b532ddd260599e1510d26ce" 1490 | uuid = "4b34888f-f399-49d4-9bb3-47ed5cae4e65" 1491 | version = "1.0.0" 1492 | 1493 | [[deps.QuadGK]] 1494 | deps = ["DataStructures", "LinearAlgebra"] 1495 | git-tree-sha1 = "9b23c31e76e333e6fb4c1595ae6afa74966a729e" 1496 | uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" 1497 | version = "2.9.4" 1498 | 1499 | [[deps.REPL]] 1500 | deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] 1501 | uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" 1502 | 1503 | [[deps.Random]] 1504 | deps = ["SHA"] 1505 | uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" 1506 | 1507 | [[deps.RangeArrays]] 1508 | git-tree-sha1 = "b9039e93773ddcfc828f12aadf7115b4b4d225f5" 1509 | uuid = "b3c3ace0-ae52-54e7-9d0b-2c1406fd6b9d" 1510 | version = "0.3.2" 1511 | 1512 | [[deps.Ratios]] 1513 | deps = ["Requires"] 1514 | git-tree-sha1 = "1342a47bf3260ee108163042310d26f2be5ec90b" 1515 | uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" 1516 | version = "0.4.5" 1517 | weakdeps = ["FixedPointNumbers"] 1518 | 1519 | [deps.Ratios.extensions] 1520 | RatiosFixedPointNumbersExt = "FixedPointNumbers" 1521 | 1522 | [[deps.RecipesBase]] 1523 | deps = ["PrecompileTools"] 1524 | git-tree-sha1 = "5c3d09cc4f31f5fc6af001c250bf1278733100ff" 1525 | uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" 1526 | version = "1.3.4" 1527 | 1528 | [[deps.Reexport]] 1529 | git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" 1530 | uuid = "189a3867-3050-52da-a836-e630ba90ab69" 1531 | version = "1.2.2" 1532 | 1533 | [[deps.RelocatableFolders]] 1534 | deps = ["SHA", "Scratch"] 1535 | git-tree-sha1 = "ffdaf70d81cf6ff22c2b6e733c900c3321cab864" 1536 | uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" 1537 | version = "1.0.1" 1538 | 1539 | [[deps.Requires]] 1540 | deps = ["UUIDs"] 1541 | git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" 1542 | uuid = "ae029012-a4dd-5104-9daa-d747884805df" 1543 | version = "1.3.0" 1544 | 1545 | [[deps.Rmath]] 1546 | deps = ["Random", "Rmath_jll"] 1547 | git-tree-sha1 = "f65dcb5fa46aee0cf9ed6274ccbd597adc49aa7b" 1548 | uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" 1549 | version = "0.7.1" 1550 | 1551 | [[deps.Rmath_jll]] 1552 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1553 | git-tree-sha1 = "6ed52fdd3382cf21947b15e8870ac0ddbff736da" 1554 | uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" 1555 | version = "0.4.0+0" 1556 | 1557 | [[deps.RoundingEmulator]] 1558 | git-tree-sha1 = "40b9edad2e5287e05bd413a38f61a8ff55b9557b" 1559 | uuid = "5eaf0fd0-dfba-4ccb-bf02-d820a40db705" 1560 | version = "0.2.1" 1561 | 1562 | [[deps.SHA]] 1563 | uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" 1564 | version = "0.7.0" 1565 | 1566 | [[deps.SIMD]] 1567 | deps = ["PrecompileTools"] 1568 | git-tree-sha1 = "2803cab51702db743f3fda07dd1745aadfbf43bd" 1569 | uuid = "fdea26ae-647d-5447-a871-4b548cad5224" 1570 | version = "3.5.0" 1571 | 1572 | [[deps.Scratch]] 1573 | deps = ["Dates"] 1574 | git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" 1575 | uuid = "6c6a2e73-6563-6170-7368-637461726353" 1576 | version = "1.2.1" 1577 | 1578 | [[deps.Serialization]] 1579 | uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" 1580 | 1581 | [[deps.ShaderAbstractions]] 1582 | deps = ["ColorTypes", "FixedPointNumbers", "GeometryBasics", "LinearAlgebra", "Observables", "StaticArrays", "StructArrays", "Tables"] 1583 | git-tree-sha1 = "79123bc60c5507f035e6d1d9e563bb2971954ec8" 1584 | uuid = "65257c39-d410-5151-9873-9b3e5be5013e" 1585 | version = "0.4.1" 1586 | 1587 | [[deps.SharedArrays]] 1588 | deps = ["Distributed", "Mmap", "Random", "Serialization"] 1589 | uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" 1590 | 1591 | [[deps.Showoff]] 1592 | deps = ["Dates", "Grisu"] 1593 | git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" 1594 | uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" 1595 | version = "1.0.3" 1596 | 1597 | [[deps.SignedDistanceFields]] 1598 | deps = ["Random", "Statistics", "Test"] 1599 | git-tree-sha1 = "d263a08ec505853a5ff1c1ebde2070419e3f28e9" 1600 | uuid = "73760f76-fbc4-59ce-8f25-708e95d2df96" 1601 | version = "0.4.0" 1602 | 1603 | [[deps.SimpleTraits]] 1604 | deps = ["InteractiveUtils", "MacroTools"] 1605 | git-tree-sha1 = "5d7e3f4e11935503d3ecaf7186eac40602e7d231" 1606 | uuid = "699a6c99-e7fa-54fc-8d76-47d257e15c1d" 1607 | version = "0.9.4" 1608 | 1609 | [[deps.Sixel]] 1610 | deps = ["Dates", "FileIO", "ImageCore", "IndirectArrays", "OffsetArrays", "REPL", "libsixel_jll"] 1611 | git-tree-sha1 = "2da10356e31327c7096832eb9cd86307a50b1eb6" 1612 | uuid = "45858cf5-a6b0-47a3-bbea-62219f50df47" 1613 | version = "0.1.3" 1614 | 1615 | [[deps.Sockets]] 1616 | uuid = "6462fe0b-24de-5631-8697-dd941f90decc" 1617 | 1618 | [[deps.SortingAlgorithms]] 1619 | deps = ["DataStructures"] 1620 | git-tree-sha1 = "66e0a8e672a0bdfca2c3f5937efb8538b9ddc085" 1621 | uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" 1622 | version = "1.2.1" 1623 | 1624 | [[deps.SparseArrays]] 1625 | deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] 1626 | uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" 1627 | version = "1.10.0" 1628 | 1629 | [[deps.SpecialFunctions]] 1630 | deps = ["IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] 1631 | git-tree-sha1 = "2f5d4697f21388cbe1ff299430dd169ef97d7e14" 1632 | uuid = "276daf66-3868-5448-9aa4-cd146d93841b" 1633 | version = "2.4.0" 1634 | weakdeps = ["ChainRulesCore"] 1635 | 1636 | [deps.SpecialFunctions.extensions] 1637 | SpecialFunctionsChainRulesCoreExt = "ChainRulesCore" 1638 | 1639 | [[deps.StackViews]] 1640 | deps = ["OffsetArrays"] 1641 | git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" 1642 | uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" 1643 | version = "0.1.1" 1644 | 1645 | [[deps.StaticArrays]] 1646 | deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] 1647 | git-tree-sha1 = "bf074c045d3d5ffd956fa0a461da38a44685d6b2" 1648 | uuid = "90137ffa-7385-5640-81b9-e52037218182" 1649 | version = "1.9.3" 1650 | weakdeps = ["ChainRulesCore", "Statistics"] 1651 | 1652 | [deps.StaticArrays.extensions] 1653 | StaticArraysChainRulesCoreExt = "ChainRulesCore" 1654 | StaticArraysStatisticsExt = "Statistics" 1655 | 1656 | [[deps.StaticArraysCore]] 1657 | git-tree-sha1 = "36b3d696ce6366023a0ea192b4cd442268995a0d" 1658 | uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" 1659 | version = "1.4.2" 1660 | 1661 | [[deps.Statistics]] 1662 | deps = ["LinearAlgebra", "SparseArrays"] 1663 | uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" 1664 | version = "1.10.0" 1665 | 1666 | [[deps.StatsAPI]] 1667 | deps = ["LinearAlgebra"] 1668 | git-tree-sha1 = "1ff449ad350c9c4cbc756624d6f8a8c3ef56d3ed" 1669 | uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" 1670 | version = "1.7.0" 1671 | 1672 | [[deps.StatsBase]] 1673 | deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] 1674 | git-tree-sha1 = "5cf7606d6cef84b543b483848d4ae08ad9832b21" 1675 | uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" 1676 | version = "0.34.3" 1677 | 1678 | [[deps.StatsFuns]] 1679 | deps = ["HypergeometricFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] 1680 | git-tree-sha1 = "cef0472124fab0695b58ca35a77c6fb942fdab8a" 1681 | uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" 1682 | version = "1.3.1" 1683 | 1684 | [deps.StatsFuns.extensions] 1685 | StatsFunsChainRulesCoreExt = "ChainRulesCore" 1686 | StatsFunsInverseFunctionsExt = "InverseFunctions" 1687 | 1688 | [deps.StatsFuns.weakdeps] 1689 | ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" 1690 | InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" 1691 | 1692 | [[deps.StructArrays]] 1693 | deps = ["ConstructionBase", "DataAPI", "Tables"] 1694 | git-tree-sha1 = "f4dc295e983502292c4c3f951dbb4e985e35b3be" 1695 | uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" 1696 | version = "0.6.18" 1697 | 1698 | [deps.StructArrays.extensions] 1699 | StructArraysAdaptExt = "Adapt" 1700 | StructArraysGPUArraysCoreExt = "GPUArraysCore" 1701 | StructArraysSparseArraysExt = "SparseArrays" 1702 | StructArraysStaticArraysExt = "StaticArrays" 1703 | 1704 | [deps.StructArrays.weakdeps] 1705 | Adapt = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" 1706 | GPUArraysCore = "46192b85-c4d5-4398-a991-12ede77f4527" 1707 | SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" 1708 | StaticArrays = "90137ffa-7385-5640-81b9-e52037218182" 1709 | 1710 | [[deps.SuiteSparse]] 1711 | deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] 1712 | uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" 1713 | 1714 | [[deps.SuiteSparse_jll]] 1715 | deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] 1716 | uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" 1717 | version = "7.2.1+1" 1718 | 1719 | [[deps.TOML]] 1720 | deps = ["Dates"] 1721 | uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" 1722 | version = "1.0.3" 1723 | 1724 | [[deps.TableTraits]] 1725 | deps = ["IteratorInterfaceExtensions"] 1726 | git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" 1727 | uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" 1728 | version = "1.0.1" 1729 | 1730 | [[deps.Tables]] 1731 | deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "OrderedCollections", "TableTraits"] 1732 | git-tree-sha1 = "cb76cf677714c095e535e3501ac7954732aeea2d" 1733 | uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" 1734 | version = "1.11.1" 1735 | 1736 | [[deps.Tar]] 1737 | deps = ["ArgTools", "SHA"] 1738 | uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" 1739 | version = "1.10.0" 1740 | 1741 | [[deps.TensorCore]] 1742 | deps = ["LinearAlgebra"] 1743 | git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" 1744 | uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" 1745 | version = "0.1.1" 1746 | 1747 | [[deps.Test]] 1748 | deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] 1749 | uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" 1750 | 1751 | [[deps.TiffImages]] 1752 | deps = ["ColorTypes", "DataStructures", "DocStringExtensions", "FileIO", "FixedPointNumbers", "IndirectArrays", "Inflate", "Mmap", "OffsetArrays", "PkgVersion", "ProgressMeter", "SIMD", "UUIDs"] 1753 | git-tree-sha1 = "bc7fd5c91041f44636b2c134041f7e5263ce58ae" 1754 | uuid = "731e570b-9d59-4bfa-96dc-6df516fadf69" 1755 | version = "0.10.0" 1756 | 1757 | [[deps.TranscodingStreams]] 1758 | git-tree-sha1 = "5d54d076465da49d6746c647022f3b3674e64156" 1759 | uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" 1760 | version = "0.10.8" 1761 | weakdeps = ["Random", "Test"] 1762 | 1763 | [deps.TranscodingStreams.extensions] 1764 | TestExt = ["Test", "Random"] 1765 | 1766 | [[deps.TriplotBase]] 1767 | git-tree-sha1 = "4d4ed7f294cda19382ff7de4c137d24d16adc89b" 1768 | uuid = "981d1d27-644d-49a2-9326-4793e63143c3" 1769 | version = "0.1.0" 1770 | 1771 | [[deps.UUIDs]] 1772 | deps = ["Random", "SHA"] 1773 | uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" 1774 | 1775 | [[deps.UnPack]] 1776 | git-tree-sha1 = "387c1f73762231e86e0c9c5443ce3b4a0a9a0c2b" 1777 | uuid = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" 1778 | version = "1.0.2" 1779 | 1780 | [[deps.Unicode]] 1781 | uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" 1782 | 1783 | [[deps.UnicodeFun]] 1784 | deps = ["REPL"] 1785 | git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" 1786 | uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" 1787 | version = "0.4.1" 1788 | 1789 | [[deps.Unitful]] 1790 | deps = ["Dates", "LinearAlgebra", "Random"] 1791 | git-tree-sha1 = "dd260903fdabea27d9b6021689b3cd5401a57748" 1792 | uuid = "1986cc42-f94f-5a68-af5c-568840ba703d" 1793 | version = "1.20.0" 1794 | 1795 | [deps.Unitful.extensions] 1796 | ConstructionBaseUnitfulExt = "ConstructionBase" 1797 | InverseFunctionsUnitfulExt = "InverseFunctions" 1798 | 1799 | [deps.Unitful.weakdeps] 1800 | ConstructionBase = "187b0558-2788-49d3-abe0-74a17ed4e7c9" 1801 | InverseFunctions = "3587e190-3f89-42d0-90ee-14403ec27112" 1802 | 1803 | [[deps.WoodburyMatrices]] 1804 | deps = ["LinearAlgebra", "SparseArrays"] 1805 | git-tree-sha1 = "c1a7aa6219628fcd757dede0ca95e245c5cd9511" 1806 | uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" 1807 | version = "1.0.0" 1808 | 1809 | [[deps.XML2_jll]] 1810 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] 1811 | git-tree-sha1 = "52ff2af32e591541550bd753c0da8b9bc92bb9d9" 1812 | uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" 1813 | version = "2.12.7+0" 1814 | 1815 | [[deps.XSLT_jll]] 1816 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] 1817 | git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" 1818 | uuid = "aed1982a-8fda-507f-9586-7b0439959a61" 1819 | version = "1.1.34+0" 1820 | 1821 | [[deps.Xorg_libX11_jll]] 1822 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] 1823 | git-tree-sha1 = "afead5aba5aa507ad5a3bf01f58f82c8d1403495" 1824 | uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" 1825 | version = "1.8.6+0" 1826 | 1827 | [[deps.Xorg_libXau_jll]] 1828 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1829 | git-tree-sha1 = "6035850dcc70518ca32f012e46015b9beeda49d8" 1830 | uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" 1831 | version = "1.0.11+0" 1832 | 1833 | [[deps.Xorg_libXdmcp_jll]] 1834 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1835 | git-tree-sha1 = "34d526d318358a859d7de23da945578e8e8727b7" 1836 | uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" 1837 | version = "1.1.4+0" 1838 | 1839 | [[deps.Xorg_libXext_jll]] 1840 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] 1841 | git-tree-sha1 = "d2d1a5c49fae4ba39983f63de6afcbea47194e85" 1842 | uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" 1843 | version = "1.3.6+0" 1844 | 1845 | [[deps.Xorg_libXrender_jll]] 1846 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] 1847 | git-tree-sha1 = "47e45cd78224c53109495b3e324df0c37bb61fbe" 1848 | uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" 1849 | version = "0.9.11+0" 1850 | 1851 | [[deps.Xorg_libpthread_stubs_jll]] 1852 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1853 | git-tree-sha1 = "8fdda4c692503d44d04a0603d9ac0982054635f9" 1854 | uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" 1855 | version = "0.1.1+0" 1856 | 1857 | [[deps.Xorg_libxcb_jll]] 1858 | deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] 1859 | git-tree-sha1 = "b4bfde5d5b652e22b9c790ad00af08b6d042b97d" 1860 | uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" 1861 | version = "1.15.0+0" 1862 | 1863 | [[deps.Xorg_xtrans_jll]] 1864 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1865 | git-tree-sha1 = "e92a1a012a10506618f10b7047e478403a046c77" 1866 | uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" 1867 | version = "1.5.0+0" 1868 | 1869 | [[deps.Zlib_jll]] 1870 | deps = ["Libdl"] 1871 | uuid = "83775a58-1f1d-513f-b197-d71354ab007a" 1872 | version = "1.2.13+1" 1873 | 1874 | [[deps.isoband_jll]] 1875 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1876 | git-tree-sha1 = "51b5eeb3f98367157a7a12a1fb0aa5328946c03c" 1877 | uuid = "9a68df92-36a6-505f-a73e-abb412b6bfb4" 1878 | version = "0.2.3+0" 1879 | 1880 | [[deps.libaom_jll]] 1881 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1882 | git-tree-sha1 = "1827acba325fdcdf1d2647fc8d5301dd9ba43a9d" 1883 | uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" 1884 | version = "3.9.0+0" 1885 | 1886 | [[deps.libass_jll]] 1887 | deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] 1888 | git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" 1889 | uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" 1890 | version = "0.15.1+0" 1891 | 1892 | [[deps.libblastrampoline_jll]] 1893 | deps = ["Artifacts", "Libdl"] 1894 | uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" 1895 | version = "5.8.0+1" 1896 | 1897 | [[deps.libfdk_aac_jll]] 1898 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1899 | git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" 1900 | uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" 1901 | version = "2.0.2+0" 1902 | 1903 | [[deps.libpng_jll]] 1904 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] 1905 | git-tree-sha1 = "d7015d2e18a5fd9a4f47de711837e980519781a4" 1906 | uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" 1907 | version = "1.6.43+1" 1908 | 1909 | [[deps.libsixel_jll]] 1910 | deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "libpng_jll"] 1911 | git-tree-sha1 = "d4f63314c8aa1e48cd22aa0c17ed76cd1ae48c3c" 1912 | uuid = "075b6546-f08a-558a-be8f-8157d0f608a5" 1913 | version = "1.10.3+0" 1914 | 1915 | [[deps.libvorbis_jll]] 1916 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] 1917 | git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" 1918 | uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" 1919 | version = "1.3.7+1" 1920 | 1921 | [[deps.nghttp2_jll]] 1922 | deps = ["Artifacts", "Libdl"] 1923 | uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" 1924 | version = "1.52.0+1" 1925 | 1926 | [[deps.oneTBB_jll]] 1927 | deps = ["Artifacts", "JLLWrappers", "Libdl"] 1928 | git-tree-sha1 = "7d0ea0f4895ef2f5cb83645fa689e52cb55cf493" 1929 | uuid = "1317d2d5-d96f-522e-a858-c73665f53c3e" 1930 | version = "2021.12.0+0" 1931 | 1932 | [[deps.p7zip_jll]] 1933 | deps = ["Artifacts", "Libdl"] 1934 | uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" 1935 | version = "17.4.0+2" 1936 | 1937 | [[deps.x264_jll]] 1938 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1939 | git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" 1940 | uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" 1941 | version = "2021.5.5+0" 1942 | 1943 | [[deps.x265_jll]] 1944 | deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] 1945 | git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" 1946 | uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" 1947 | version = "3.5.0+0" 1948 | """ 1949 | 1950 | # ╔═╡ Cell order: 1951 | # ╟─80f26a50-22aa-11ef-2af1-7799c685dae0 1952 | # ╟─59159363-df04-4e00-97b7-08dc74e6029f 1953 | # ╟─e42eb1ee-f93a-45ee-873e-57a282525b93 1954 | # ╟─61cc9495-0c51-4058-b167-c758e40ab9c0 1955 | # ╠═adc81355-9249-4e2a-905f-7c9f65923000 1956 | # ╠═7647e49a-5731-4772-8458-2585fe7f0980 1957 | # ╠═55d0d654-a061-44d6-9ae6-778281b00b16 1958 | # ╠═8cb8ec3b-cb8c-4bb8-8378-489d304c8af5 1959 | # ╠═8f2cbd28-9d7e-4c4d-af93-881d59bb5864 1960 | # ╠═fe9b92ec-afe4-4d4a-af11-7d45f271f2cc 1961 | # ╠═533a9068-cf15-4075-a84e-0fa57a2f9ecd 1962 | # ╠═71870941-cbc9-4d79-a6b9-fd3ce55d21b9 1963 | # ╟─22905a47-35c5-4fea-92d8-5e8306141dbe 1964 | # ╟─10bab6fb-e6ab-4581-b17b-489227372266 1965 | # ╟─22021e9a-d3ed-444c-a722-4a03a7114a84 1966 | # ╠═2aeb31ea-d262-4a58-b808-3dd66e413bb4 1967 | # ╠═ca62496a-7f7c-428f-958b-1c317bd0f160 1968 | # ╠═5834ebea-c215-4da8-b5de-14a4349177ee 1969 | # ╠═c495f9db-3afa-4611-ab17-d9d5952a05b6 1970 | # ╠═e5f3b3e4-5db3-4343-97ad-0407f02fef49 1971 | # ╠═c6f7940f-52f6-4bde-82d1-74d95ab066ef 1972 | # ╟─609b8929-e9a2-477d-bbd6-8fdbfb63be6c 1973 | # ╟─fa545192-e0c3-4188-a980-6cee173f99f5 1974 | # ╟─060687a7-a32b-4d14-aaf2-6b1b9b4bd1f3 1975 | # ╟─8da8b7c0-b36d-466d-87f4-5a7007cac5f1 1976 | # ╟─0df54cc1-5c45-4b31-9274-5d7a2148400f 1977 | # ╟─b4c5c9ef-cd7d-46a5-b619-0ebf9f1e77b8 1978 | # ╟─0deea94e-fb8c-43bb-b0f8-f79f2fce6ae8 1979 | # ╟─657379de-8e3f-4eb5-9f8f-1a16ef4ed93e 1980 | # ╟─a86122f9-c706-4ec8-a1d8-62151ce6f983 1981 | # ╟─27a5d616-267b-4689-b2f3-7e04d38514ac 1982 | # ╟─910ad862-0baf-4ff0-8109-f19ae0688282 1983 | # ╠═8775eb83-56ac-4874-8950-7cf872db4dd9 1984 | # ╟─1b8a3cbb-5b0b-47b2-945a-6e28a07c4ca6 1985 | # ╟─80caa4e9-33b6-4a5e-b59b-ebc59fb1ec78 1986 | # ╟─4946bfa5-7041-453a-b3de-1242a4a8fa62 1987 | # ╠═bb44eaea-1452-491e-a4d8-8ffdcf62f533 1988 | # ╟─361ed8e3-5be7-4021-8ad1-7e7f67cf2255 1989 | # ╠═c6610a7c-8a6a-4573-8eb7-adf8647a37ea 1990 | # ╟─a2fdc63e-9dbc-4d31-bb59-23575c0f3697 1991 | # ╠═3040f918-4a8c-4b3c-a497-75d730cc9365 1992 | # ╠═744e09cb-a6aa-440b-82b8-00bb91bb1be0 1993 | # ╠═67304e59-8c2c-4b2f-a915-c387067c3f0a 1994 | # ╠═5030b487-04ed-4ecb-b643-6cc9ca076bf6 1995 | # ╠═9760ad97-ef24-4eca-9cf6-2e180cd48840 1996 | # ╠═177e53b4-8291-478e-b7dc-a50bbaf518fe 1997 | # ╠═adcf57be-95a4-4f8b-802c-29f26c3ea78a 1998 | # ╟─5ba2a617-0b23-411d-bc57-5a4a6f2453b0 1999 | # ╠═e450e9bb-bb24-4957-971e-720bcfb42c54 2000 | # ╟─c67a0e29-b615-4ffe-88a2-6a5bdc71f0a6 2001 | # ╠═87b1c700-84e0-4649-b67f-82af4bea7054 2002 | # ╠═9060e6e5-8265-44b5-8024-dd981f089253 2003 | # ╠═4826cfb3-70cc-409a-a004-533f9938df32 2004 | # ╠═9b9244d0-bd60-4901-8ce4-6326af249a5a 2005 | # ╠═e6de1c80-083d-4ca2-a957-0fa91c5f449d 2006 | # ╟─e6a8a14c-649c-4f76-b59b-ff84a5f9e095 2007 | # ╠═6d4b04cc-97a9-4ede-a243-6c15d96522c7 2008 | # ╠═44d7f2d8-ea37-42f0-b884-a6b16b013b92 2009 | # ╟─c5dd05d4-d11c-4592-9a0b-b7aafe00205f 2010 | # ╠═4e535c7f-4a51-46c8-8ca7-6fbc294a6fac 2011 | # ╠═471cadad-a7ae-44ea-aa16-278ca3fdd31d 2012 | # ╟─8cc4b284-c473-4b83-9871-4ffefbba492e 2013 | # ╟─920279e2-760f-491a-bacc-f563c4f59c68 2014 | # ╠═9fb818e6-42f6-414e-bb5e-98cbc22839eb 2015 | # ╟─30c55f3a-c070-405b-b70b-23f017d31f87 2016 | # ╠═a4703815-c47b-4ad7-a943-aafbc0e1cc7e 2017 | # ╟─64450e30-819b-4dcf-8928-4fc2ec396bad 2018 | # ╟─5728e2cd-b8eb-4979-9f77-19f50f5c89e5 2019 | # ╟─414814e4-6461-41ec-a313-d8a7ebf2aa0d 2020 | # ╠═b2f16df4-9575-4234-b380-bbd9cd0e6230 2021 | # ╟─7cae8f4e-2c32-4edc-9de8-d3411ff632ff 2022 | # ╠═e8774cf5-a499-4d33-91a5-b57bc08793fb 2023 | # ╟─5f98a625-e315-4846-a121-ad0a5dca6fd8 2024 | # ╠═d6346d6d-7513-4d3f-a4e6-123cca197bd1 2025 | # ╠═2313e492-dfde-4e4e-9bfd-59e6a2a54b25 2026 | # ╟─00000000-0000-0000-0000-000000000001 2027 | # ╟─00000000-0000-0000-0000-000000000002 2028 | -------------------------------------------------------------------------------- /Pluto Notebooks/pdf/JLSD_pt1_background.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kevjzheng/JLSD/4ac92476b67ce78e01820502eb3b4afb6d31bcd7/Pluto Notebooks/pdf/JLSD_pt1_background.pdf -------------------------------------------------------------------------------- /Pluto Notebooks/pdf/JLSD_pt2_framework.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kevjzheng/JLSD/4ac92476b67ce78e01820502eb3b4afb6d31bcd7/Pluto Notebooks/pdf/JLSD_pt2_framework.pdf -------------------------------------------------------------------------------- /Pluto Notebooks/pdf/JLSD_pt3_structure.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kevjzheng/JLSD/4ac92476b67ce78e01820502eb3b4afb6d31bcd7/Pluto Notebooks/pdf/JLSD_pt3_structure.pdf -------------------------------------------------------------------------------- /Pluto Notebooks/pdf/JLSD_pt4_tx.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kevjzheng/JLSD/4ac92476b67ce78e01820502eb3b4afb6d31bcd7/Pluto Notebooks/pdf/JLSD_pt4_tx.pdf -------------------------------------------------------------------------------- /Pluto Notebooks/pdf/JLSD_pt5a_plot.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kevjzheng/JLSD/4ac92476b67ce78e01820502eb3b4afb6d31bcd7/Pluto Notebooks/pdf/JLSD_pt5a_plot.pdf -------------------------------------------------------------------------------- /Pluto Notebooks/pdf/JLSD_pt5b_animate.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kevjzheng/JLSD/4ac92476b67ce78e01820502eb3b4afb6d31bcd7/Pluto Notebooks/pdf/JLSD_pt5b_animate.pdf -------------------------------------------------------------------------------- /Project.toml: -------------------------------------------------------------------------------- 1 | name = "JLSD" 2 | uuid = "440597a2-019f-4b78-a78a-a750d9043749" 3 | authors = ["kevjzheng <129211710+kevjzheng@users.noreply.github.com>"] 4 | version = "0.1.0" 5 | 6 | [deps] 7 | ColorSchemes = "35d6a980-a343-548e-a6ea-1d62b119f2f4" 8 | Colors = "5ae59095-9a9b-59fe-a467-6f913c188581" 9 | Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" 10 | LoopVectorization = "bdcacae8-1622-11e9-2a5c-532679323890" 11 | MacroTools = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" 12 | Parameters = "d96e819e-fc66-5662-9728-84c9c7592b0a" 13 | Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" 14 | Profile = "9abbd945-dff8-562f-b5e8-e1ebf5ef1b79" 15 | ProfileCanvas = "efd6af41-a80b-495e-886c-e51b0c7d77a3" 16 | ProtoStructs = "437b6fc4-8e8e-11e9-3fa1-ad391e66c018" 17 | PyPlot = "d330b81b-6aea-500a-939a-2ce795aea3ee" 18 | Revise = "295af30f-e4ad-537b-8983-00126c2a3abe" 19 | UnPack = "3a884ed6-31ef-47d7-9d2a-63182c4928ed" 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # JLSD - Julia SerDes 2 | This repository hosts Pluto notebooks and relevant source codes for a personal project - using Julia to build fast and lightweight SerDes models and simulation framework 3 | 4 | The goals for this project (still in its infant stage) are 5 | - Document and share my personal Julia journey so far 6 | - Using SerDes simulation as an example to demonstrate the pros/cons of Julia 7 | - Begin a open-source and expandable SerDes simulation framework that encourages academia and industry adoption to evaluate more sophositicated architectures and algorithms 8 | - Expose my fellow analog/mixed-signal designers to Julia (because not everyone can get a MATLAB license). It's much easier to design circuits when one can play with the specifications instead of taking it from others at face value 9 | 10 | ## Simulation framework 11 | The modeling framework is based on custom structs and block simulations. The code is not heavily documentated yet, but should be self-explanatory. Go through the Pluto notebooks to understand the key concepts in the models. 12 | 13 | ## Notebooks 14 | In the Pluto Notebooks directory, you will find the .jl files for the notebooks to be viewed and played with on your local machine. .html and .pdf files are also included in the directory. 15 | 16 | ## Standalone widget 17 | Currently, there is a demo widget powered by Makie (shown below. Simply run Main_UI.jl and start playing with a basic SerDes model's parameters. The model consists of a relatively detailed transmitter, a low-loss channel, and a simple receiver w/ baud-rate CDR. Note that the widget might be continuously updated to include more (common) features. Use this as an example to extend to your own models. 18 | ![widget_ui](https://github.com/kevjzheng/JLSD/blob/main/img/widget_ui.png) 19 | -------------------------------------------------------------------------------- /channel_data/TF_data/channel_4inch.mat: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kevjzheng/JLSD/4ac92476b67ce78e01820502eb3b4afb6d31bcd7/channel_data/TF_data/channel_4inch.mat -------------------------------------------------------------------------------- /img/widget_ui.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kevjzheng/JLSD/4ac92476b67ce78e01820502eb3b4afb6d31bcd7/img/widget_ui.png -------------------------------------------------------------------------------- /src/JLSD.jl: -------------------------------------------------------------------------------- 1 | println("hello world") -------------------------------------------------------------------------------- /src/Main.jl: -------------------------------------------------------------------------------- 1 | using Revise, BenchmarkTools, ProfileCanvas 2 | # import Plots as plt; pythonplot() 3 | 4 | include("./tb/TB.jl") 5 | 6 | 7 | trx = init_trx() 8 | # VSCodeServer.@profview_allocs run_sim(trx, run_sim_blk) 9 | @time run_blk_iter(trx, 0, trx.param.nblk, sim_blk) 10 | 11 | trx.wvfm.en_plot=true 12 | w_plot_test(trx.wvfm) 13 | update_eye(trx.wvfm.eye1, x_nui=2, x_npts_ui=256, y_npts=256, x_ofst_ui = 0)#trx.cdr.pi_code/trx.clkgen.pi_codes_per_ui) 14 | reset_limits!(trx.wvfm.axes[3,2]) 15 | 16 | 17 | ber = trx.bist.ber_err_cnt/trx.bist.ber_bit_cnt 18 | println("BER = $ber") 19 | 20 | # a = trx.drv.buffer_debug[10000:end]; 21 | # b = u_unwrap_0x(a); 22 | 23 | # f1 = w_newfig() 24 | # # lines!(Axis(f1[1,1]),a) 25 | # lines!(Axis(f1[1,1]),b) 26 | # jitter_bnd = (-0.1,0.1).+(-6, 6).*(trx.drv.rj_s/trx.param.tui) .+ (-1.2, 1.2).*trx.drv.sj_amp_ui 27 | # density!(Axis(f1[1,2]), b .- mean(b), boundary=jitter_bnd, npoints=200) 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /src/Main_UI.jl: -------------------------------------------------------------------------------- 1 | using Revise, BenchmarkTools 2 | 3 | include("./tb/Widget.jl") 4 | 5 | 6 | GLMakie.closeall() 7 | 8 | #global param for simulation 9 | param = TrxStruct.Param( 10 | data_rate = 56e9, 11 | pam = 2, 12 | osr = 20, 13 | blk_size = 512, 14 | subblk_size = 32, 15 | nsym_total = Int(1e6)) 16 | Random.seed!(param.rand_seed) 17 | 18 | #bist param 19 | bist = TrxStruct.Bist( 20 | param = param, 21 | polynomial = TrxStruct.PRBS31) 22 | 23 | 24 | #TX driver param 25 | drv = TrxStruct.Drv( 26 | param = param, 27 | ir = u_gen_ir_rc(param.dt, param.fbaud, 20*param.tui), 28 | fir = [1., -0.25], 29 | swing = 0.8, 30 | jitter_en = true, 31 | dcd = 0.03, 32 | rj_s = 300e-15, 33 | sj_amp_ui = 0.0, 34 | sj_freq = 2e5) 35 | 36 | #AWGN ch param 37 | ch = TrxStruct.Ch( 38 | param = param, 39 | ir_ch = u_fr_to_imp("./channel_data/TF_data/channel_4inch.mat", 40 | param.tui, param.osr, npre = 20, npost= 79), 41 | ir_pad = u_gen_ir_rc(param.dt, param.fbaud, 20*param.tui), 42 | noise_en = true, 43 | noise_dbm_hz = -150 ) 44 | 45 | #clkgen param 46 | clkgen = TrxStruct.Clkgen( 47 | param = param, 48 | nphases = 4, 49 | rj = .3e-12, 50 | skews = [0e-12, 0e-12, 0e-12, 0e-12]) 51 | 52 | #sampler param 53 | splr = TrxStruct.Splr( 54 | param = param, 55 | ir = u_gen_ir_rc(param.dt, param.fbaud, 20*param.tui)) 56 | 57 | #slicer param 58 | dslc = TrxStruct.Slicers( 59 | param = param, 60 | N_per_phi = ones(UInt8, clkgen.nphases), 61 | noise_rms = 1.5e-3, 62 | ofst_std = 7e-3, 63 | dac_min = -0.1, 64 | dac_max = 0.1) 65 | 66 | eslc = TrxStruct.Slicers( 67 | param = param, 68 | N_per_phi = UInt8.([1,0,0,0]), 69 | noise_rms = 1.5e-3, 70 | ofst_std = 7e-3, 71 | dac_min = 0, 72 | dac_max = 0.5) 73 | 74 | cdr = TrxStruct.Cdr( 75 | param = param, 76 | Neslc_per_phi = eslc.N_per_phi, 77 | kp = 1/2^5, 78 | ki = 1/2^16, 79 | pi_res = clkgen.pi_res) 80 | 81 | adpt = TrxStruct.Adpt( 82 | param = param, 83 | Neslc_per_phi = eslc.N_per_phi, 84 | mu_eslc = 1/64) 85 | 86 | #waveform plotting param 87 | wvfm = TrxStruct.Wvfm( 88 | param = param, 89 | sizex = 1200, 90 | sizey = 800, 91 | en_plot = true) 92 | 93 | wvfm.eye1.x_nui[] = 2 94 | wvfm.eye1.x_npts_ui[] = 256 95 | wvfm.eye1.y_npts[] = 256 96 | 97 | println("init done") 98 | 99 | trx = (;param, bist, drv, ch, clkgen, splr, dslc, eslc, cdr, adpt, wvfm) 100 | 101 | 102 | @time make_widget(trx); 103 | 104 | 105 | -------------------------------------------------------------------------------- /src/blks/BlkBIST.jl: -------------------------------------------------------------------------------- 1 | module BlkBIST 2 | using UnPack, Random, Distributions 3 | 4 | export pam_gen_top!, ber_checker_top! 5 | 6 | 7 | function bist_prbs_gen(;poly, inv, Nsym, seed) 8 | seq = Vector{Bool}(undef,Nsym) 9 | for n = 1:Nsym 10 | seq[n] = inv 11 | for p in poly 12 | seq[n] ⊻= seed[p] 13 | end 14 | seed .= [seq[n]; seed[1:end-1]] 15 | end 16 | return seq, seed 17 | end 18 | 19 | function bist_prbs_gen!(seq; poly, inv, Nsym, seed) 20 | for n = 1:Nsym 21 | seq[n] = inv 22 | for p in poly 23 | seq[n] ⊻= seed[p] 24 | end 25 | seed .= [seq[n]; seed[1:end-1]] 26 | end 27 | return nothing 28 | end 29 | 30 | 31 | function pam_gen_top!(bist) 32 | @unpack pam, bits_per_sym, blk_size = bist.param 33 | @unpack polynomial, inv, gen_seed = bist 34 | @unpack gen_gray_map, gen_en_precode, gen_precode_prev_sym, So_bits, So = bist 35 | 36 | bist_prbs_gen!(So_bits, poly=polynomial, inv=inv, 37 | Nsym=bits_per_sym*blk_size, seed=gen_seed) 38 | 39 | 40 | fill!(So, zero(Float64)) 41 | for n = 1:bits_per_sym 42 | @. So = So + 2^(bits_per_sym-n)*So_bits[n:bits_per_sym:end] 43 | end 44 | 45 | #gray encoding 46 | if ~isempty(gen_gray_map) 47 | for n in 1:blk_size 48 | So[n] = gen_gray_map[So[n] + 1] 49 | end 50 | end 51 | 52 | if gen_en_precode 53 | for n = 1:blk_size 54 | So[n] = mod(So[n]-gen_precode_prev_sym , pam) 55 | gen_precode_prev_sym = So[n] 56 | end 57 | bist.gen_precode_prev_sym = gen_precode_prev_sym #need to write back 58 | end 59 | @. So = 2/(pam-1)*So - 1 60 | 61 | return nothing 62 | end 63 | 64 | function ber_checker_top!(bist) 65 | @unpack cur_blk, pam, bits_per_sym = bist.param 66 | @unpack gen_gray_map, chk_precode_prev_sym, chk_start_blk, Si, Si_bits = bist 67 | 68 | 69 | if cur_blk >= chk_start_blk #make start blk a parameter later 70 | if bist.gen_en_precode 71 | bist.chk_precode_prev_sym = Si[end] 72 | Si .= mod.([chk_precode_prev_sym; Si[1:end-1]].+ Si , pam) 73 | end 74 | 75 | if ~isempty(gen_gray_map) 76 | for n in 1:blk_size 77 | Si[n] = gen_gray_map[Si[n] + 1] 78 | end 79 | end 80 | 81 | Si_bits .= vec(stack(int2bits.(Si, bits_per_sym))) 82 | 83 | ber_check_prbs!(bist) 84 | end 85 | end 86 | 87 | function ber_check_prbs!(bist) 88 | @unpack polynomial, inv, chk_seed, ref_bits, Si_bits = bist 89 | nbits_rcvd = lastindex(Si_bits) 90 | 91 | # err_loc = rand(Uniform(0,1.0), nbits_rcvd).< 1e-4; 92 | # Si_bits .= Si_bits .⊻ err_loc 93 | 94 | if bist.chk_lock_status 95 | bist_prbs_gen!(ref_bits, poly=polynomial, inv=inv, 96 | Nsym=nbits_rcvd,seed=chk_seed) 97 | 98 | 99 | bist.ber_err_cnt += sum(Si_bits .⊻ ref_bits) 100 | bist.ber_bit_cnt += nbits_rcvd 101 | else 102 | for n = 1:nbits_rcvd 103 | brcv = Si_bits[n] 104 | btst = inv 105 | for p in polynomial 106 | btst ⊻= chk_seed[p] 107 | end 108 | 109 | #need consecutive non-error for lock. reset when error happens 110 | bist.chk_lock_cnt = (btst == brcv) ? bist.chk_lock_cnt+1 : 0 111 | 112 | chk_seed .= [brcv; chk_seed[1:end-1]] 113 | 114 | if bist.chk_lock_cnt == bist.chk_lock_cnt_threshold 115 | bist.chk_lock_status = true 116 | println("prbs locked") 117 | ~, chk_seed = bist_prbs_gen(poly=polynomial, inv=inv, 118 | Nsym=nbits_rcvd-n, seed=chk_seed) 119 | #run prbs towards the end of the block to get the right seed 120 | break 121 | end 122 | end 123 | end 124 | end 125 | 126 | function int2bits(num, nbit) 127 | return [Bool((num>>k)%2) for k in nbit-1:-1:0] 128 | end 129 | 130 | 131 | 132 | end -------------------------------------------------------------------------------- /src/blks/BlkCH.jl: -------------------------------------------------------------------------------- 1 | module BlkCH 2 | using UnPack, DSP, Random 3 | include("../util/Util_JLSD.jl"); using .Util_JLSD 4 | 5 | export ch_top! 6 | 7 | function ch_top!(ch,Vi) 8 | @unpack osr, blk_size, dt, blk_size_osr = ch.param 9 | @unpack noise_en, noise_rms= ch 10 | @unpack ir_ch, ir_pad, Vch_mem, Vo_mem = ch 11 | 12 | if ch.ch_en 13 | u_conv!(ch.Vch_conv, Vi, ir_ch, Vi_mem=Vch_mem, gain = dt) 14 | 15 | if noise_en 16 | ch.Vch .+= noise_rms .* randn(blk_size_osr) 17 | end 18 | 19 | u_conv!(ch.Vo_conv, ch.Vch, ir_pad, Vi_mem=Vo_mem, gain = dt) 20 | else 21 | ch.Vo .= Vi 22 | end 23 | 24 | end 25 | 26 | 27 | 28 | end -------------------------------------------------------------------------------- /src/blks/BlkRX.jl: -------------------------------------------------------------------------------- 1 | module BlkRX 2 | using UnPack, DSP, Random, Interpolations 3 | include("../util/Util_JLSD.jl"); using .Util_JLSD 4 | 5 | export clkgen_pi_itp_top! 6 | export sample_itp_top!, sample_phi_top!, slicers_top! 7 | export cdr_top!, adpt_top! 8 | 9 | 10 | function clkgen_pi_itp_top!(clkgen; pi_code) 11 | @unpack tui, osr, cur_subblk, subblk_size = clkgen.param 12 | @unpack nphases, rj, skews = clkgen 13 | @unpack pi_code_prev, pi_wrap_ui, pi_wrap_ui_Δcode = clkgen 14 | @unpack pi_nonlin_lut, pi_ui_cover, pi_codes_per_ui = clkgen 15 | 16 | Δpi_code = pi_code-pi_code_prev 17 | if abs(Δpi_code) > pi_wrap_ui_Δcode 18 | pi_wrap_ui -= sign(Δpi_code)*pi_ui_cover 19 | end 20 | 21 | Φ0 = osr*(pi_wrap_ui + (pi_code + pi_nonlin_lut[pi_code+1])/pi_codes_per_ui) 22 | Φstart = (cur_subblk-1)*subblk_size*osr 23 | Φnom = Φstart:osr:Φstart+(subblk_size-1)*osr 24 | Φskew = kron(ones(Int(subblk_size/nphases)), skews/tui*osr) 25 | Φrj = rj/tui*osr*randn(subblk_size) 26 | 27 | @. clkgen.Φo_subblk = Φ0 + Φnom + Φskew + Φrj 28 | 29 | clkgen.pi_code_prev = pi_code 30 | clkgen.pi_wrap_ui = pi_wrap_ui 31 | append!(clkgen.Φo, clkgen.Φo_subblk) 32 | 33 | end 34 | 35 | 36 | 37 | function sample_itp_top!(splr, Vi) 38 | @unpack osr,dt, blk_size_osr = splr.param 39 | @unpack ir, Vo_conv, Vo, Vo_mem = splr 40 | @unpack prev_nui, V_prev_nui, Vext, tt_Vext = splr 41 | 42 | u_conv!(Vo_conv, Vi, ir, Vi_mem=Vo_mem, gain=dt) 43 | 44 | Vext[eachindex(V_prev_nui)] .= V_prev_nui 45 | Vext[lastindex(V_prev_nui)+1:end] .= Vo 46 | splr.itp_Vext = linear_interpolation(tt_Vext, Vext) 47 | end 48 | 49 | function sample_phi_top!(splr, Φi) 50 | @unpack cur_subblk, subblk_size = splr.param 51 | @unpack itp_Vext = splr 52 | 53 | splr.So_subblk .= itp_Vext.(Φi) 54 | append!(splr.So, splr.So_subblk) 55 | 56 | end 57 | 58 | function slicers_top!(slc, Si; ref_code) 59 | @unpack nphases, noise_rms, dac_min, dac_lsb = slc 60 | @unpack ofsts, N_per_phi = slc 61 | 62 | ref_lvl = [(dac_min .+ dac_lsb * ref_code[n]) for n in 1:nphases] 63 | 64 | for n = eachindex(Si) 65 | phi_idx = (n-1)%nphases + 1 66 | nslc = N_per_phi[phi_idx] 67 | if nslc != 0 68 | slc.So[n] .= (ref_lvl[phi_idx] 69 | + ofsts[phi_idx] 70 | + (noise_rms * randn(nslc)) 71 | ) .< Si[n] 72 | 73 | end 74 | end 75 | end 76 | 77 | 78 | function cdr_top!(cdr, Sd, Se) 79 | @unpack Neslc_per_phi, Sd_prev = cdr 80 | @unpack eslc_nvec, filt_patterns, kp, ki = cdr 81 | @unpack pd_accum, ki_accum, pd_gain, pi_res = cdr 82 | 83 | pi_bnd = 2^pi_res 84 | Sd_val = [Sd_prev; [sum(dvec) for dvec in Sd]] 85 | 86 | for n = findall(eslc_nvec.!=0) 87 | if Sd_val[n:n+2] in filt_patterns 88 | vote = sign(Se[n][1].-0.5)*sign(Sd_val[n]-Sd_val[n+2]) 89 | ki_accum += ki*vote 90 | pd_accum += pd_gain*(kp*vote + ki_accum) 91 | end 92 | end 93 | 94 | cdr.pd_accum = (pd_accum < 0) ? pi_bnd + pd_accum : (pd_accum >= pi_bnd) ? pd_accum - pi_bnd : pd_accum 95 | cdr.pi_code = Int(floor(cdr.pd_accum)) 96 | 97 | 98 | cdr.Sd_prev = Sd_val[end] 99 | cdr.ki_accum = ki_accum 100 | 101 | end 102 | 103 | function adpt_top!(adpt, Sd, Se) 104 | @unpack Neslc_per_phi, Sd_prev = adpt 105 | @unpack eslc_nvec, eslc_filt_patterns, eslc_ref_max, mu_eslc = adpt 106 | 107 | Sd_val = [Sd_prev; [sum(dvec) for dvec in Sd]] 108 | 109 | ref_accum = adpt.eslc_ref_accum 110 | 111 | for n = findall(eslc_nvec.!=0) 112 | ref_accum += (Sd_val[n:n+2] in eslc_filt_patterns) ? 113 | mu_eslc*sign(Se[n][1].-0.5) : 0 114 | end 115 | adpt.eslc_ref_accum = ref_accum < 0 ? 0 : 116 | ref_accum > eslc_ref_max ? eslc_ref_max : 117 | ref_accum 118 | adpt.eslc_ref_code = floor(adpt.eslc_ref_accum) 119 | adpt.eslc_ref_vec = [adpt.eslc_ref_code*ones(Int,n) for n in Neslc_per_phi] 120 | 121 | adpt.Sd_prev = Sd_val[end] 122 | end 123 | 124 | end -------------------------------------------------------------------------------- /src/blks/BlkTX.jl: -------------------------------------------------------------------------------- 1 | module BlkTX 2 | using UnPack, DSP, Random, Interpolations 3 | include("../util/Util_JLSD.jl"); using .Util_JLSD 4 | 5 | export dac_drv_top! 6 | 7 | function dac_drv_top!(drv, Si) 8 | @unpack osr, dt, blk_size, blk_size_osr = drv.param 9 | @unpack ir, fir_norm, swing, Vfir, Sfir_mem, Vo_mem = drv 10 | 11 | u_filt!(drv.Sfir_conv, Si, fir_norm, Si_mem = Sfir_mem) 12 | 13 | kron!(drv.Vfir, drv.Sfir, ones(osr)) 14 | 15 | if drv.jitter_en 16 | drv_add_jitter!(drv, drv.Vfir) 17 | end 18 | 19 | u_conv!(drv.Vo_conv, drv.Vfir, ir, Vi_mem=Vo_mem, gain=dt*swing/2) 20 | 21 | 22 | end 23 | 24 | function drv_add_jitter!(drv, Vfir) 25 | @unpack osr, tui, blk_size, blk_size_osr = drv.param 26 | @unpack dcd, rj_s, sj_amp_ui, sj_freq, last_sj_phi = drv 27 | @unpack Vext, V_prev_nui = drv 28 | @unpack Δtt_ext, Δtt_prev_nui, Δtt, tt_Vext, tt_uniform = drv 29 | 30 | rj_osr = rj_s/tui*osr 31 | sj_amp_osr = sj_amp_ui*osr 32 | sj_freq_norm = sj_freq*tui 33 | 34 | drv.last_sj_phi = drv_jitter_Δt!(Δtt; blk_size, osr, 35 | dcd, rj_osr, 36 | sj_amp_osr, sj_freq_norm, last_sj_phi) 37 | 38 | Vext[eachindex(V_prev_nui)] .= V_prev_nui 39 | Vext[lastindex(V_prev_nui)+1:end] .= Vfir 40 | Δtt_ext[eachindex(Δtt_prev_nui)] .= Δtt_prev_nui 41 | Δtt_ext[lastindex(Δtt_prev_nui)+1:end] .= Δtt 42 | 43 | drv_jitter_tvec!(tt_Vext, Δtt_ext, osr) 44 | 45 | drv_interp_jitter!(Vfir, tt_Vext, Vext, tt_uniform) 46 | return nothing 47 | end 48 | 49 | 50 | function drv_jitter_Δt!(Δtt; blk_size, osr, dcd, rj_osr, sj_amp_osr, sj_freq_norm, last_sj_phi) 51 | 52 | fill!(Δtt, zero(Float64)) 53 | Δtt[1:2:end] .+= dcd/2*osr 54 | Δtt[2:2:end] .-= dcd/2*osr 55 | Δtt .+= rj_osr .* randn(blk_size) #add rj 56 | 57 | phi_sj = (last_sj_phi .+ (2π*sj_freq_norm) * (1:blk_size)) .% (2π) 58 | Δtt .+= sj_amp_osr .* sin.(phi_sj) #add sj 59 | 60 | 61 | return phi_sj[end] 62 | end 63 | 64 | function drv_jitter_tvec!(tt_Vext, Δtt_ext, osr) 65 | for n = 1:lastindex(Δtt_ext)-1 66 | tt_Vext[(n-1)*osr+1:n*osr] .= LinRange((n-1)*osr+Δtt_ext[n], n*osr+Δtt_ext[n+1], osr+1)[1:end-1] 67 | end 68 | 69 | return nothing 70 | end 71 | 72 | 73 | function drv_interp_jitter!(vo, tt_jitter, vi, tt_uniform) 74 | last_idx = 1 75 | for n = eachindex(tt_uniform) 76 | t = tt_uniform[n] 77 | for m = last_idx:lastindex(tt_jitter)-1 78 | if (t >= tt_jitter[m]) && (t < tt_jitter[m+1]) 79 | k = (vi[m+1]-vi[m])/(tt_jitter[m+1]-tt_jitter[m]) 80 | vo[n] = vi[m] + k*(t-tt_jitter[m]) 81 | last_idx = m 82 | break 83 | end 84 | end 85 | end 86 | 87 | return nothing 88 | end 89 | 90 | end -------------------------------------------------------------------------------- /src/blks/WvfmGen.jl: -------------------------------------------------------------------------------- 1 | module WvfmGen 2 | using UnPack, Interpolations 3 | using GLMakie, Makie, Printf 4 | include("../util/Util_JLSD.jl"); using .Util_JLSD 5 | 6 | 7 | export init_plot, w_plot_test, w_plot_test2, w_eye_gen_heatmap, update_eye 8 | export w_gen_eye_simple, w_gen_eye_simple! 9 | export w_newfig 10 | 11 | function init_plot(wvfm) 12 | @unpack nrow, ncol, sizex, sizey = wvfm 13 | @unpack V11_x, V11_y, V21_x, V21_y, V31_x, V31_y = wvfm 14 | @unpack V12_x, V12_y, V22_x, V22_y = wvfm 15 | @unpack eye1, eslc_ref_ob = wvfm 16 | 17 | display(wvfm.screen, wvfm.fig) 18 | 19 | 20 | for c = 1:ncol 21 | for r = 1:nrow 22 | wvfm.axes[r,c] = Axis(wvfm.fig[r,c]) 23 | end 24 | end 25 | 26 | ax11 = wvfm.axes[1,1] 27 | ax11.title = "Driver output" 28 | lines!(ax11, V11_x, V11_y) 29 | 30 | ax21 = wvfm.axes[2,1] 31 | ax21.title = "RX input" 32 | lines!(ax21, V21_x, V21_y) 33 | 34 | ax31 = wvfm.axes[3,1] 35 | ax31.title = "Sampled voltage" 36 | ylims!(ax31, -.4, .4) 37 | scatter!(ax31, V31_x, V31_y, alpha=0.2, markersize = 6) 38 | hlines!(ax31, eslc_ref_ob, color=:red, linestyle=:dash, linewidth=3) 39 | 40 | 41 | ax12 = wvfm.axes[1,2] 42 | ax12.title = "Error Slicer DAC code" 43 | lines!(ax12, V12_x, V12_y) 44 | 45 | ax22 = wvfm.axes[2,2] 46 | ax22.title = "PI code" 47 | lines!(ax22, V22_x, V22_y) 48 | 49 | ax_eye = wvfm.axes[3,2] 50 | ax_eye.title = "Eye" 51 | append!(eye1.buffer,zeros(eye1.buffer_size)) 52 | eye1.heatmap_ob = lift(w_eye_gen_heatmap, eye1.heatmap_ob_trig, eye1) 53 | heatmap!(ax_eye, eye1.x_grid, eye1.y_grid, eye1.heatmap_ob, 54 | colormap=eye1.colormap, 55 | inspector_label = (self, i, p) -> @sprintf("x = %.3f, y = %.3f", p[1], p[2])) 56 | hlines!(ax_eye, eslc_ref_ob, color=:red, linestyle=:dash, linewidth=3) 57 | 58 | DataInspector(wvfm.fig) 59 | 60 | display(wvfm.fig) 61 | end 62 | 63 | 64 | 65 | function w_plot_test(wvfm; cond = true) 66 | @unpack cur_blk, blk_size = wvfm.param 67 | 68 | if wvfm.en_plot & cond 69 | wvfm.V11_x.val = eachindex(wvfm.buffer11) 70 | wvfm.V11_y[] = wvfm.buffer11 71 | 72 | wvfm.V21_x.val = eachindex(wvfm.buffer21) 73 | wvfm.V21_y[] = wvfm.buffer21 74 | 75 | wvfm.V31_x.val = eachindex(wvfm.buffer31) 76 | wvfm.V31_y[] = wvfm.buffer31 77 | wvfm.eslc_ref_ob[] = wvfm.eslc_ref_ob.val 78 | 79 | wvfm.V12_x.val = eachindex(wvfm.buffer12) 80 | wvfm.V12_y[] = wvfm.buffer12 81 | 82 | wvfm.V22_x.val = eachindex(wvfm.buffer22) 83 | wvfm.V22_y[] = wvfm.buffer22 84 | 85 | wvfm.eye1.heatmap_ob_trig[] = true 86 | 87 | 88 | display(wvfm.screen, wvfm.fig) 89 | sleep(.0001) 90 | # yield() 91 | end 92 | 93 | end 94 | 95 | function w_gen_eye_simple(input,x_npts_ui, x_npts, y_range, y_npts; osr, x_ofst=0) 96 | heatmap = zeros(x_npts, y_npts) 97 | 98 | input_x = 0:1/osr:(lastindex(input)-1)/osr 99 | itp_resample = linear_interpolation(input_x, input) 100 | idx_itp = 0:1/x_npts_ui:input_x[end] 101 | input_itp = itp_resample.(idx_itp) 102 | 103 | for n = 1:x_npts 104 | heatmap[n,:] = u_hist(input_itp[n:x_npts:end], -y_range/2, y_range/2, y_npts) 105 | end 106 | 107 | return circshift(heatmap, (Int(x_ofst), 0)) 108 | 109 | end 110 | 111 | function w_gen_eye_simple!(heatmap, input,x_npts_ui, x_npts, y_range, y_npts; osr, x_ofst=0, shadow=0.0) 112 | 113 | heatmap .*= shadow 114 | 115 | input_x = 0:1/osr:(lastindex(input)-1)/osr 116 | itp_resample = linear_interpolation(input_x, input) 117 | idx_itp = 0:1/x_npts_ui:input_x[end] 118 | input_itp = itp_resample.(idx_itp) 119 | 120 | for n = 1:x_npts 121 | k = Int(mod(n-1+x_ofst, x_npts)+1) 122 | heatmap[k,:] .+= (1.0-shadow) .* u_hist(input_itp[n:x_npts:end], -y_range/2, y_range/2, y_npts) 123 | end 124 | 125 | return nothing 126 | end 127 | 128 | function w_eye_gen_heatmap(heatmap_ob_trig, eye) 129 | if heatmap_ob_trig 130 | @unpack osr, tui = eye.param 131 | @unpack x_npts_ui, x_npts, y_npts, y_range = eye 132 | @unpack buffer, buffer_plt_len = eye 133 | @unpack clk_skews, clk_rj, noise_rms = eye 134 | 135 | x_npts_ui_val = x_npts_ui.val 136 | x_npts_val = x_npts.val 137 | y_npts_val = y_npts.val 138 | y_range_val = y_range.val 139 | 140 | if ~isempty(clk_skews) | (clk_rj > 0.0) 141 | #add 1UI in front and back 142 | buffer_x = 0:buffer_plt_len+2*osr-1 143 | itp_buffer = linear_interpolation(buffer_x, view(buffer, 1:buffer_plt_len+2*osr)) 144 | 145 | n_resample = Int(buffer_plt_len/osr) 146 | buffer_resample = zeros(buffer_plt_len) 147 | 148 | Φskew = zeros(n_resample) 149 | if ~isempty(clk_skews) 150 | Φskew .= kron(ones(Int(n_resample/length(clk_skews))), clk_skews/tui*osr) 151 | end 152 | for n = 1:osr 153 | Φrj = clk_rj/tui*osr*randn(n_resample) 154 | Φnom = n:osr:n+n_resample*osr-1 155 | Φ = osr .+ Φnom .+ Φskew .+ Φrj 156 | 157 | buffer_resample[n:osr:end] .= itp_buffer.(Φ) 158 | end 159 | else 160 | buffer_resample = buffer[1:buffer_plt_len] #leaves 1UI in front and back 161 | end 162 | 163 | return w_gen_eye_simple(buffer_resample, x_npts_ui_val, x_npts_val, y_range_val, y_npts_val, osr=osr, x_ofst=eye.x_ofst) 164 | end 165 | end 166 | 167 | function update_eye(eye; x_nui, x_npts_ui, y_npts, x_ofst_ui) 168 | eye.x_ofst = round(-x_ofst_ui*x_npts_ui+x_nui*x_npts_ui/2) 169 | eye.x_nui.val = x_nui 170 | eye.x_npts_ui[] = x_npts_ui 171 | eye.y_npts[] = y_npts 172 | eye.heatmap_ob_trig[] = true 173 | end 174 | 175 | 176 | 177 | function w_newfig(nrow=1, ncol=1; kwargs...) 178 | sc = GLMakie.Screen(); 179 | f = Figure(; kwargs...); 180 | display(sc,f) 181 | axes = Array{Axis}(undef,nrow,ncol) 182 | 183 | for r=1:nrow 184 | for c = 1:ncol 185 | axes[r,c] = Axis(f[r,c]) 186 | end 187 | end 188 | 189 | return f, axes 190 | end 191 | 192 | 193 | end -------------------------------------------------------------------------------- /src/structs/TrxStruct.jl: -------------------------------------------------------------------------------- 1 | module TrxStruct 2 | using Parameters, DataStructures, DSP, FFTW 3 | using GLMakie, Makie, ColorSchemes 4 | 5 | 6 | export Param, Bist, Drv, Ch, Clkgen, Splr, Slicers, Cdr, Adpt, Eye, Wvfm 7 | 8 | 9 | const PRBS7 = [6, 7] 10 | const PRBS9 = [5, 9] 11 | const PRBS11 = [9, 11] 12 | const PRBS13 = [9, 10, 12, 13] 13 | const PRBS15 = [14, 15] 14 | const PRBS23 = [18,23] 15 | const PRBS31 = [28,31] 16 | 17 | 18 | @kwdef mutable struct Param 19 | const data_rate::Float64 20 | const osr::Int64 21 | const pam::Int8 = 2 22 | const bits_per_sym::Int8 = Int(log2(pam)) 23 | const fbaud = data_rate/bits_per_sym 24 | const fnyq= fbaud/2 25 | const tui = 1/fbaud 26 | const dt= tui/osr 27 | 28 | const blk_size::Int64 29 | const blk_size_osr::Int64 = blk_size*osr 30 | const subblk_size::Int64 = blk_size 31 | const nsubblk::Int64 = Int(blk_size/subblk_size) 32 | const nsym_total::Int64 33 | const nblk = Int(round(nsym_total/blk_size)) 34 | 35 | const rand_seed = 300 36 | 37 | cur_blk = 0 38 | cur_subblk = 0 39 | 40 | end 41 | 42 | @kwdef mutable struct Bist 43 | const param::Param 44 | const polynomial::Vector{UInt8} 45 | const order::UInt8 = maximum(polynomial) 46 | const inv = false 47 | 48 | gen_seed = ones(Bool,order) 49 | gen_gray_map::Vector{UInt8} = [] 50 | gen_en_precode = false 51 | gen_precode_prev_sym = 0 52 | 53 | chk_start_blk = 100 54 | chk_seed = zeros(Bool,order) 55 | chk_precode_prev_sym = 0 56 | chk_lock_status = false 57 | chk_lock_cnt = 0 58 | chk_lock_cnt_threshold = 128 59 | ber_err_cnt = 0 60 | ber_bit_cnt = 0 61 | ref_bits::Vector = zeros(Bool, param.bits_per_sym*param.blk_size) 62 | 63 | So_bits::Vector = zeros(Bool, param.bits_per_sym*param.blk_size) 64 | So::Vector = zeros(param.blk_size) 65 | Si = CircularBuffer{UInt8}(param.blk_size) 66 | Si_bits::Vector = zeros(Bool, param.bits_per_sym*param.blk_size) 67 | 68 | end 69 | 70 | 71 | @kwdef mutable struct Drv 72 | const param::Param 73 | ir::Vector{Float64} 74 | 75 | swing = 0.7 76 | fir::Vector{Float64} = [1,0] 77 | fir_norm = fir/sum(abs.(fir)) 78 | 79 | rlm_en = false 80 | rlm = 1.0 81 | quantize = false 82 | dac_res = 7 83 | 84 | jitter_en = false 85 | dcd = 0.0 86 | rj_s = 0.0 87 | sj_amp_ui = 0.0 88 | sj_freq = 0.0 89 | last_sj_phi = 0.0 90 | 91 | Sfir_conv::Vector = zeros(param.blk_size+length(fir)-1) 92 | Sfir = @views Sfir_conv[1:param.blk_size] 93 | Sfir_mem = @views Sfir_conv[param.blk_size+1:end] 94 | Vfir::Vector = zeros(param.blk_size_osr) 95 | 96 | prev_nui = 4 97 | Vext::Vector = zeros(prev_nui*param.osr+param.blk_size_osr) 98 | V_prev_nui = @views Vext[end-prev_nui*param.osr+1:end] 99 | tt_Vext::Vector = zeros(prev_nui*param.osr+param.blk_size_osr) 100 | Δtt_ext = zeros(param.blk_size+prev_nui+1) 101 | Δtt = zeros(param.blk_size) 102 | Δtt_prev_nui = @views Δtt_ext[end-prev_nui:end] 103 | tt_uniform::Vector = (0:param.blk_size_osr-1) .+ prev_nui/2*param.osr 104 | 105 | Vo_conv::Vector = zeros(param.blk_size_osr+lastindex(ir)-1) 106 | Vo = @views Vo_conv[1:param.blk_size_osr] 107 | Vo_mem = @views Vo_conv[param.blk_size_osr+1:end] 108 | 109 | buffer_debug = Float64[] 110 | end 111 | 112 | @kwdef mutable struct Ch 113 | const param::Param 114 | ch_en = true 115 | noise_en = true 116 | 117 | ir_ch::Vector{Float64} 118 | Vch_conv::Vector = zeros(param.blk_size_osr+lastindex(ir_ch)-1) 119 | Vch = @views Vch_conv[1:param.blk_size_osr] 120 | Vch_mem = @views Vch_conv[param.blk_size_osr+1:end] 121 | 122 | 123 | noise_Z::Float64 = 50 124 | noise_dbm_hz::Float64 = -174 125 | noise_rms::Float64 = sqrt(0.5/param.dt*10^((noise_dbm_hz-30.0)/10)*noise_Z) 126 | 127 | 128 | ir_pad::Vector{Float64} 129 | Vo_conv::Vector = zeros(param.blk_size_osr+lastindex(ir_pad)-1) 130 | Vo = @views Vo_conv[1:param.blk_size_osr] 131 | Vo_mem = @views Vo_conv[param.blk_size_osr+1:end] 132 | end 133 | 134 | # @with_kw mutable struct Ctle 135 | # param::param 136 | 137 | # bypass::Bool = false 138 | # nonlin_en::Bool = true 139 | # code 140 | # min_hf_code 141 | # max_hf_code 142 | 143 | # hf_ir_table 144 | # hf_dc_table 145 | 146 | # ir::AbstractArray 147 | # dc_tf::AbstractArray 148 | # ofst = 0.0 149 | # noise_rms = 0.0 150 | 151 | # oscal_en::Bool = false 152 | # oscal_dac_range = 60e-3 153 | # oscal_dac_res = 6 154 | # oscal_dac_lsb = oscal_dac_range/2^oscal_dac_res 155 | # oscal_code = 2^(oscal_dac_res-1) 156 | 157 | # No = zeros(param.blk_size_osr) 158 | # No_mem = zeros(1) 159 | 160 | # Vo 161 | # end 162 | 163 | @kwdef mutable struct Clkgen 164 | const param::Param 165 | 166 | nphases::Int8 167 | rj = 0 168 | skews = zeros(nphases) 169 | 170 | pi_res = 8 171 | pi_max_code = 2^pi_res-1 172 | pi_ui_cover = 4 173 | pi_codes_per_ui = 2^pi_res/pi_ui_cover 174 | pi_nonlin_lut = zeros(2^pi_res) #introduce INL here 175 | pi_code_prev = 0 176 | pi_wrap_ui = 0 177 | pi_wrap_ui_Δcode = pi_max_code-10 178 | 179 | Φo = CircularBuffer{Float64}(param.blk_size) 180 | Φo_subblk::Vector = zeros(param.subblk_size) 181 | 182 | end 183 | 184 | @kwdef mutable struct Splr 185 | const param::Param 186 | 187 | 188 | ir::Vector{Float64} 189 | 190 | Vo_conv::Vector = zeros(param.blk_size_osr+lastindex(ir)-1) 191 | Vo = @views Vo_conv[1:param.blk_size_osr] 192 | Vo_mem = @views Vo_conv[param.blk_size_osr+1:end] 193 | 194 | prev_nui = 16 195 | Vext::Vector = zeros(prev_nui*param.osr+param.blk_size_osr) 196 | V_prev_nui = @views Vext[end-prev_nui*param.osr+1:end] 197 | 198 | tt_Vext = -prev_nui/2*param.osr:length(Vext)-prev_nui/2*param.osr-1 199 | 200 | So = CircularBuffer{Float64}(param.blk_size) 201 | So_subblk::Vector = zeros(param.subblk_size) 202 | itp_Vext = nothing 203 | end 204 | 205 | @kwdef mutable struct Slicers 206 | const param::Param 207 | 208 | N_per_phi::Vector 209 | nphases = length(N_per_phi) 210 | noise_rms = 0.0 211 | ofst_std = 0.0 212 | 213 | ofsts = [ofst_std*randn(n) for n in N_per_phi] 214 | 215 | dac_res = 8 216 | dac_min = 0 217 | dac_max = 0.5 218 | dac_lsb = (dac_max-dac_min)/2^dac_res 219 | 220 | 221 | So = [zeros(Bool, Int(N_per_phi[n%nphases+1])) for n in 0:param.subblk_size-1] 222 | 223 | end 224 | 225 | @kwdef mutable struct Cdr 226 | const param::Param 227 | 228 | Neslc_per_phi::Vector 229 | nphases = length(Neslc_per_phi) 230 | 231 | Sd_prev = 0 232 | eslc_nvec = kron(ones(Int(param.subblk_size/nphases)),Neslc_per_phi) 233 | filt_patterns = [[0, 1, 1], [1, 1, 0]] 234 | 235 | kp = 1/32 236 | ki = 0/1024 237 | pd_gain = 1.0 238 | 239 | ki_accum = 0.0 240 | pd_accum = 128.0 241 | 242 | pi_res = 8 243 | pi_code = Int(floor(pd_accum)) 244 | end 245 | 246 | @kwdef mutable struct Adpt 247 | const param::Param 248 | 249 | Neslc_per_phi::Vector 250 | nphases = length(Neslc_per_phi) 251 | 252 | Sd_prev = 0 253 | eslc_nvec = kron(ones(Int(param.subblk_size/nphases)),Neslc_per_phi) 254 | eslc_filt_patterns = [[0, 1, 1], [1, 1, 0]] 255 | eslc_ref_accum = 128.0 256 | mu_eslc = 1/1024 257 | eslc_ref_max = 255 258 | eslc_ref_code = floor(eslc_ref_accum) 259 | eslc_ref_vec = [eslc_ref_code*ones(Int,n) for n in Neslc_per_phi] 260 | 261 | 262 | end 263 | 264 | @kwdef mutable struct Eye 265 | const param::Param 266 | x_npts_ui = Observable(Int(param.osr)) 267 | x_nui = Observable(2) 268 | x_npts = @lift($x_npts_ui*$x_nui) 269 | x_grid = @lift(-$x_nui/2+0.5/$x_npts_ui : 1/$x_npts_ui: $x_nui/2-0.5/$x_npts_ui) 270 | x_ofst = 0 271 | y_npts = Observable(64) 272 | y_range = Observable(0.8) 273 | y_grid_edge = @lift(-$y_range/2: $y_range/$y_npts: $y_range/2) 274 | y_grid = @lift(($y_grid_edge[1:end-1] .+ $y_grid_edge[2:end])/2) 275 | buffer_size::Int = 2^15*param.osr 276 | buffer = CircularBuffer{Float64}(buffer_size) 277 | buffer_plt_len::Int = 2^14*param.osr 278 | heatmap_ob_trig = Observable{Bool}(true) 279 | heatmap_ob = @lift begin 280 | zeros($x_npts, $y_npts) 281 | end 282 | colormap = Observable(copy(colorschemes[:turbo].colors)) 283 | shadow_weight = 0.0 284 | 285 | clk_skews::Vector{Float64} = Float64[] 286 | clk_rj = 0.0 287 | noise_rms = 0.0 288 | end 289 | 290 | @kwdef mutable struct Wvfm 291 | const param::Param 292 | 293 | en_plot = true 294 | plot_every_nblk = Int(round(1e5/param.blk_size)) 295 | 296 | sizex = 800 297 | sizey = 840 298 | screen = GLMakie.Screen() 299 | fig = Figure(backgroundcolor = :white, size = (sizex, sizey)); 300 | nrow::Int8 = 3 301 | ncol::Int8 = 2 302 | axes::Array = Array{Axis}(undef,nrow,ncol) 303 | 304 | buffer11 = CircularBuffer{Float64}(256*param.osr) 305 | # buffer12 = CircularBuffer{Float64}(2^16) 306 | buffer12 = Float64[] 307 | 308 | buffer21 = CircularBuffer{Float64}(256*param.osr) 309 | # buffer22 = CircularBuffer{Float64}(2^16) 310 | buffer22 = Float64[] 311 | 312 | buffer31 = CircularBuffer{Float64}(8192) 313 | 314 | V11_x = Observable(zeros(1)) 315 | V11_y = Observable(zeros(1)) 316 | 317 | V21_x = Observable(zeros(1)) 318 | V21_y = Observable(zeros(1)) 319 | 320 | V31_x = Observable(zeros(1)) 321 | V31_y = Observable(zeros(1)) 322 | 323 | V12_x = Observable(zeros(1)) 324 | V12_y = Observable(zeros(1)) 325 | 326 | V22_x = Observable(zeros(1)) 327 | V22_y = Observable(zeros(1)) 328 | 329 | eye1 = Eye(param=param) 330 | 331 | eslc_ref_ob = Observable(0.0) 332 | end 333 | 334 | 335 | 336 | 337 | end -------------------------------------------------------------------------------- /src/tb/TB.jl: -------------------------------------------------------------------------------- 1 | using GLMakie, Makie 2 | using UnPack, Random, Interpolations, ColorSchemes, Colors 3 | include("../structs/TrxStruct.jl"); #using .TrxStruct 4 | includet("../util/Util_JLSD.jl"); using .Util_JLSD 5 | includet("../blks/BlkBIST.jl"); using .BlkBIST 6 | includet("../blks/BlkTX.jl"); using .BlkTX 7 | includet("../blks/BlkCH.jl"); using .BlkCH 8 | includet("../blks/BlkRX.jl"); using .BlkRX 9 | includet("../blks/WvfmGen.jl"); using .WvfmGen 10 | 11 | 12 | 13 | function init_trx() 14 | #global param for simulation 15 | param = TrxStruct.Param( 16 | data_rate = 56e9, 17 | pam = 2, 18 | osr = 20, 19 | blk_size = 2^10, 20 | subblk_size = 32, 21 | nsym_total = Int(1e6)) 22 | Random.seed!(param.rand_seed) 23 | 24 | #bist param 25 | bist = TrxStruct.Bist( 26 | param = param, 27 | polynomial = TrxStruct.PRBS31) 28 | 29 | 30 | #TX driver param 31 | drv = TrxStruct.Drv( 32 | param = param, 33 | ir = u_gen_ir_rc(param.dt, param.fbaud, 20*param.tui), 34 | fir = [1., -0.25], 35 | swing = 0.8, 36 | jitter_en = true, 37 | dcd = 0.03, 38 | rj_s = 300e-15, 39 | sj_amp_ui = 0.0, 40 | sj_freq = 2e5) 41 | 42 | #AWGN ch param 43 | ch = TrxStruct.Ch( 44 | param = param, 45 | ir_ch = u_fr_to_imp("./channel_data/TF_data/channel_4inch.mat", 46 | param.tui, param.osr, npre = 20, npost= 79), 47 | ir_pad = u_gen_ir_rc(param.dt, param.fbaud, 20*param.tui), 48 | noise_en = true, 49 | noise_dbm_hz = -150 ) 50 | 51 | #clkgen param 52 | clkgen = TrxStruct.Clkgen( 53 | param = param, 54 | nphases = 4, 55 | rj = .3e-12, 56 | skews = [0e-12, 0e-12, 0e-12, 0e-12]) 57 | 58 | #sampler param 59 | splr = TrxStruct.Splr( 60 | param = param, 61 | ir = u_gen_ir_rc(param.dt, param.fbaud, 20*param.tui)) 62 | 63 | #slicer param 64 | dslc = TrxStruct.Slicers( 65 | param = param, 66 | N_per_phi = ones(UInt8, clkgen.nphases), 67 | noise_rms = 1.5e-3, 68 | ofst_std = 7e-3, 69 | dac_min = -0.1, 70 | dac_max = 0.1) 71 | 72 | eslc = TrxStruct.Slicers( 73 | param = param, 74 | N_per_phi = UInt8.([1,0,0,0]), 75 | noise_rms = 1.5e-3, 76 | ofst_std = 7e-3, 77 | dac_min = 0, 78 | dac_max = 0.5) 79 | 80 | cdr = TrxStruct.Cdr( 81 | param = param, 82 | Neslc_per_phi = eslc.N_per_phi, 83 | kp = 1/2^6, 84 | ki = 1/2^14, 85 | pi_res = clkgen.pi_res) 86 | 87 | adpt = TrxStruct.Adpt( 88 | param = param, 89 | Neslc_per_phi = eslc.N_per_phi, 90 | mu_eslc = 1/64) 91 | 92 | #waveform plotting param 93 | wvfm = TrxStruct.Wvfm( 94 | param = param, 95 | en_plot = true, 96 | nrow = 3, 97 | ncol = 2) 98 | wvfm.eye1.clk_skews = clkgen.skews 99 | wvfm.eye1.clk_rj = clkgen.rj 100 | wvfm.eye1.noise_rms = dslc.noise_rms 101 | cm_turbo = colorschemes[:turbo] 102 | cm_turbo.colors[1] = RGB(1.0,1.0,1.0) 103 | wvfm.eye1.colormap = cm_turbo 104 | 105 | init_plot(wvfm) 106 | 107 | println("init done") 108 | 109 | return (;param, bist, drv, ch, clkgen, splr, dslc, eslc, cdr, adpt, wvfm) 110 | end 111 | 112 | function sim_subblk(trx, blk_idx) 113 | @unpack param, bist, drv, ch, clkgen, splr = trx 114 | @unpack dslc, eslc, cdr, adpt, wvfm = trx 115 | 116 | param.cur_subblk = blk_idx 117 | 118 | clkgen_pi_itp_top!(clkgen, pi_code=cdr.pi_code) 119 | 120 | sample_phi_top!(splr, clkgen.Φo_subblk) 121 | 122 | slicers_top!(dslc, splr.So_subblk, ref_code=[[128],[128],[128],[128]]) 123 | slicers_top!(eslc, splr.So_subblk, ref_code=adpt.eslc_ref_vec) 124 | 125 | cdr_top!(cdr, dslc.So, eslc.So) 126 | 127 | adpt_top!(adpt, dslc.So, eslc.So) 128 | 129 | append!(bist.Si, [sum(dvec) for dvec in dslc.So]) 130 | 131 | push!(wvfm.buffer12, adpt.eslc_ref_code) 132 | push!(wvfm.buffer22, cdr.pi_code) 133 | end 134 | 135 | function sim_blk(trx, blk_idx) 136 | @unpack param, bist, drv, ch, clkgen, splr = trx 137 | @unpack dslc, eslc, cdr, adpt, wvfm = trx 138 | 139 | param.cur_blk = blk_idx 140 | 141 | pam_gen_top!(bist) 142 | 143 | dac_drv_top!(drv, bist.So) 144 | 145 | # append!(drv.buffer_debug, mod.(u_find_0x(drv.Vo), param.osr) ./ param.osr) 146 | 147 | ch_top!(ch, drv.Vo) 148 | 149 | sample_itp_top!(splr, ch.Vo) 150 | 151 | 152 | run_blk_iter(trx, 0, param.nsubblk, sim_subblk) 153 | 154 | ber_checker_top!(bist) 155 | 156 | #record waveform here 157 | append!(wvfm.buffer11, drv.Vo) 158 | append!(wvfm.buffer21, ch.Vo) 159 | append!(wvfm.buffer31, splr.So) 160 | append!(wvfm.eye1.buffer, splr.Vo) 161 | wvfm.eslc_ref_ob.val = adpt.eslc_ref_code*eslc.dac_lsb+eslc.dac_min 162 | wvfm.eye1.x_ofst = 0#round(-(cdr.pi_code/clkgen.pi_codes_per_ui)*wvfm.eye1.x_npts_ui[]+wvfm.eye1.x_npts[]/2) 163 | w_plot_test(wvfm, cond=(param.cur_blk%wvfm.plot_every_nblk==0)) 164 | end 165 | 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /src/tb/Widget.jl: -------------------------------------------------------------------------------- 1 | using GLMakie, Makie 2 | using UnPack, Random, Interpolations, ColorSchemes, Colors 3 | include("../structs/TrxStruct.jl"); #using .TrxStruct 4 | includet("../util/Util_JLSD.jl"); using .Util_JLSD 5 | includet("../blks/BlkBIST.jl"); using .BlkBIST 6 | includet("../blks/BlkTX.jl"); using .BlkTX 7 | includet("../blks/BlkCH.jl"); using .BlkCH 8 | includet("../blks/BlkRX.jl"); using .BlkRX 9 | includet("../blks/WvfmGen.jl"); using .WvfmGen 10 | 11 | function make_widget(trx) 12 | @unpack param, drv, ch, splr, clkgen, cdr = trx 13 | @unpack fig, screen, eye1 = trx.wvfm 14 | 15 | 16 | 17 | 18 | eye1.colormap[][1] = RGB(1.0,1.0,1.0) 19 | 20 | geye = GridLayout(fig[1:3,1:3]) 21 | 22 | #plot the eye diagram, pass the observable directly in 23 | sl_xofst = Slider(geye[1,1:2], range = -eye1.x_npts[]/2:eye1.x_npts[]/2-1, startvalue = 0) 24 | ax_eye = Axis(geye[2, 1:2]) 25 | heatmap!(ax_eye, eye1.x_grid, eye1.y_grid, eye1.heatmap_ob, 26 | colormap=eye1.colormap) 27 | xlims!(eye1.x_grid[][1], eye1.x_grid[][end]) 28 | 29 | Φo_hist = Observable(zeros(eye1.x_npts[])) 30 | ax_jitter = Axis(geye[3, 1:2], height = 60) 31 | band!(ax_jitter, eye1.x_grid, 0, Φo_hist) 32 | xlims!(eye1.x_grid[][1], eye1.x_grid[][end]) 33 | hidespines!(ax_jitter, :t, :l, :r) 34 | hideydecorations!(ax_jitter) 35 | 36 | yk_hist = Observable(zeros(eye1.y_npts[])) 37 | ax_yk = Axis(geye[2, 3], width = 60) 38 | lower = Point2f.(0, eye1.y_grid[]) 39 | upper = lift(yk_hist) do yk_h 40 | Point2f.(yk_h, eye1.y_grid[]) 41 | end 42 | band!(ax_yk, lower, upper) 43 | ylims!(eye1.y_grid[][1], eye1.y_grid[][end]) 44 | xlims!() 45 | hidespines!(ax_yk, :t, :b, :r) 46 | hidexdecorations!(ax_yk) 47 | 48 | display(screen, fig) 49 | # DataInspector(fig) 50 | 51 | gctrl = GridLayout(fig[1:3,4:5]) 52 | #run button 53 | btn_run = Button(gctrl[1,1], label ="Run", tellwidth=false, tellheight=false, width = 140, height=60, fontsize=28); 54 | 55 | ch_lbl = ch.ch_en ? "Channel\nEnabled" : "Channel\nDisabled" 56 | btn_ch_en = Button(gctrl[1,2], label=ch_lbl, tellwidth = false, tellheight=false, width=100, height=60, fontsize=18); 57 | 58 | #slider for after image weight 59 | sl_config = SliderGrid(gctrl[2:3,:], 60 | (label="Avg factor", range=0:10, startvalue=eye1.shadow_weight), 61 | (label="BG color", range=0:0.01:1, startvalue=1.0), 62 | (label="Frame wait", range=0:100, format = "{:d} ms", startvalue=0.0), 63 | tellheight=false, value_column_width=100) 64 | 65 | #sliders for TX/Channel parameters 66 | 67 | sl_tx = SliderGrid(gctrl[4:5,:], 68 | (label = "TX swing", range=0.4:0.02:1, startvalue = drv.swing), 69 | (label = "TX FIR h1", range=0:-0.05:-0.5, startvalue = drv.fir[2]), 70 | (label = "TX DCD", range=-10:10, format = "{:d} %", startvalue = drv.dcd*100), 71 | (label = "TX RJ", range=0:0.1:2, format = "{:.1f} ps", startvalue = drv.rj_s/1e-12), 72 | (label = "TX SJ freq", range=[0:10:90; 100:100:900; 1000:1000:1e4], format = "{:d} kHz", startvalue = drv.sj_freq/1e3), 73 | (label = "TX SJ amp", range = 0:0.05:1, format = "{:.2f} UI", startvalue = drv.sj_amp_ui), 74 | (label = "CH noise", range=-150:.5:-130, format = "{:.1f} dBm/Hz", startvalue = ch.noise_dbm_hz), 75 | tellheight=false, value_column_width=100) 76 | 77 | #enable channel button 78 | sl_rx = SliderGrid(gctrl[6:7,:], 79 | (label = "RX CDR Kp", range= 10:-1:0, format = "1/2^{:d}", startvalue = round(Int,-log2(cdr.kp))), 80 | (label = "RX CDR Ki", range= [32; 20:-1:8], format = "1/2^{:d}", startvalue = round(Int,-log2(cdr.ki))), 81 | (label = "RX IQ skew", range= -3:0.1:3, format = "{:.1f} ps", startvalue = clkgen.skews[2]/1e-12), 82 | (label = "RX RJ", range= 0:0.1:2, format = "{:.1f} ps", startvalue = clkgen.rj/1e-12), 83 | tellheight=false, value_column_width=100) 84 | 85 | 86 | 87 | #listeners 88 | eye_ofst = lift(sl_xofst.value) do val 89 | eye1.x_ofst = val 90 | end 91 | 92 | sleep_sec = Observable(0.0) 93 | eye_config = lift([s.value for s in sl_config.sliders]...) do vals... 94 | eye1.shadow_weight = 1.0-.5^vals[1] #when weight =1, we purposely make it very close 1 becausue a perfect integrator can cause Float overflow 95 | eye1.colormap.val[1] = RGB(vals[2],vals[2],vals[2]) 96 | eye1.colormap[] = eye1.colormap[] 97 | sleep_sec[] = 1e-3*vals[3] 98 | end 99 | 100 | ch_en_func = on(btn_ch_en.clicks) do clicks 101 | ch.ch_en = ~ch.ch_en; 102 | btn_ch_en.label = ch.ch_en ? "Channel\nEnabled" : "Channel\nDisabled" 103 | end 104 | 105 | txobservables = [s.value for s in sl_tx.sliders] 106 | tx_settings = lift(txobservables...) do slvals... 107 | drv.swing = slvals[1] 108 | drv.fir[2] = slvals[2] 109 | drv.dcd = slvals[3]/100 110 | drv.rj_s = slvals[4]*1e-12 111 | drv.sj_freq = slvals[5]*1e3 112 | drv.sj_amp_ui = slvals[6] 113 | ch.noise_dbm_hz = slvals[7] 114 | 115 | drv.fir_norm = drv.fir/sum(abs.(drv.fir)) 116 | ch.noise_rms = sqrt(0.5/param.dt*10^((ch.noise_dbm_hz-30)/10)*ch.noise_Z) #explicitly recalculate noise rms because it's not an observable 117 | end 118 | 119 | rxobservables = [s.value for s in sl_rx.sliders] 120 | rx_settings = lift(rxobservables...) do slvals... 121 | cdr.kp = 1.0/2^slvals[1] 122 | cdr.ki = 1.0/2^slvals[2] 123 | clkgen.skews[[2,4]] .= slvals[3]*1e-12 124 | clkgen.rj = slvals[4]*1e-12 125 | 126 | end 127 | 128 | 129 | eye_buffer = Observable(splr.Vo) 130 | on(eye_buffer) do buffer 131 | w_gen_eye_simple!(eye1.heatmap_ob[], buffer, 132 | eye1.x_npts_ui[], eye1.x_npts[], eye1.y_range[], eye1.y_npts[]; 133 | osr = trx.param.osr, x_ofst=eye1.x_ofst, shadow = eye1.shadow_weight) 134 | eye1.heatmap_ob[] = eye1.heatmap_ob[] 135 | # eye1.heatmap_ob[] = randn(eye1.x_npts[],eye1.y_npts[]) 136 | end 137 | 138 | 139 | isrunning = Observable(false) 140 | 141 | run_func1 = on(btn_run.clicks) do clicks 142 | isrunning[] = ~isrunning[]; 143 | btn_run.label = isrunning[] ? "Stop" : "Run" 144 | end 145 | 146 | run_func2 = on(btn_run.clicks) do clicks 147 | @async while isrunning[] 148 | isopen(wvfm.fig.scene) || break 149 | step_sim_blk(trx) 150 | eye_buffer[] = splr.Vo #this is the animation step 151 | Φo_wrap = mod.(clkgen.Φo./param.osr .+ (eye1.x_ofst/eye1.x_npts_ui[]), eye1.x_nui[]).- (eye1.x_nui[]/2) 152 | Φo_hist.val .*= eye1.shadow_weight 153 | Φo_hist.val .+= (1-eye1.shadow_weight) .* u_hist(Φo_wrap, -eye1.x_nui[]/2, eye1.x_nui[]/2, eye1.x_npts[]) 154 | Φo_hist[] = Φo_hist[] 155 | 156 | yk_hist.val .*= eye1.shadow_weight 157 | yk_hist.val .+= (1-eye1.shadow_weight) .* u_hist(splr.So, -eye1.y_range[]/2, eye1.y_range[]/2, eye1.y_npts[]) 158 | yk_hist[] = yk_hist[] 159 | ylims!(ax_jitter) 160 | xlims!(ax_yk) 161 | sleep(sleep_sec[]) #use sleep to slow down the frame rate if desired 162 | end 163 | end 164 | end 165 | 166 | 167 | function step_sim_blk(trx) 168 | @unpack param, bist, drv, ch = trx 169 | 170 | pam_gen_top!(bist) 171 | 172 | dac_drv_top!(drv, bist.So) 173 | 174 | ch_top!(ch, drv.Vo) 175 | 176 | sample_itp_top!(splr, ch.Vo) 177 | 178 | run_blk_iter(trx, 0, param.nsubblk, step_sim_subblk) 179 | 180 | 181 | end 182 | 183 | function step_sim_subblk(trx, blk_idx) 184 | @unpack clkgen, splr = trx 185 | @unpack dslc, eslc, cdr, adpt = trx 186 | 187 | trx.param.cur_subblk = blk_idx 188 | 189 | clkgen_pi_itp_top!(clkgen, pi_code=cdr.pi_code) 190 | 191 | sample_phi_top!(splr, clkgen.Φo_subblk) 192 | 193 | slicers_top!(dslc, splr.So_subblk, ref_code=[[128],[128],[128],[128]]) 194 | slicers_top!(eslc, splr.So_subblk, ref_code=adpt.eslc_ref_vec) 195 | 196 | cdr_top!(cdr, dslc.So, eslc.So) 197 | 198 | adpt_top!(adpt, dslc.So, eslc.So) 199 | 200 | end 201 | -------------------------------------------------------------------------------- /src/util/Util_JLSD.jl: -------------------------------------------------------------------------------- 1 | module Util_JLSD 2 | using StatsBase, DSP, Interpolations, FFTW, MAT 3 | 4 | export run_blk_iter 5 | export u_conv!, u_filt! 6 | export u_gen_ir_rc, u_fr_to_imp, u_hist, u_find_0x, u_unwrap_0x 7 | 8 | 9 | function run_blk_iter(trx, idx, n_tot_blk, blk_func::Function) 10 | if idx < n_tot_blk 11 | blk_func(trx, idx+1) 12 | run_blk_iter(trx, idx+1, n_tot_blk, blk_func) 13 | end 14 | end 15 | 16 | 17 | function u_conv(input, ir; Vi_mem = zeros(1), gain = 1) 18 | vconv = gain .* conv(ir, input) 19 | vconv[eachindex(Vi_mem)] += Vi_mem 20 | 21 | return vconv 22 | end 23 | 24 | 25 | 26 | function u_conv!(Vo_conv, input, ir; Vi_mem = Float64[], gain = 1) 27 | Vo_conv[eachindex(Vi_mem)] .= Vi_mem 28 | Vo_conv[lastindex(Vi_mem)+1:end] .= zero(Float64) 29 | 30 | Vo_conv .+= conv(gain .* input, ir) 31 | return nothing 32 | end 33 | 34 | 35 | 36 | function u_filt(So_conv, input, fir; Si_mem=Float64[]) 37 | sconv = zeros(length(input) + length(fir) - 1) 38 | 39 | s_in = lastindex(input) 40 | 41 | for n=eachindex(fir) 42 | sconv[n:s_in+n-1] .+= fir[n] .* input 43 | end 44 | 45 | sconv[eachindex(Si_mem)] .+= Si_mem 46 | 47 | return sconv 48 | end 49 | 50 | function u_filt!(So_conv, input, fir; Si_mem=Float64[]) 51 | So_conv[eachindex(Si_mem)] .= Si_mem 52 | So_conv[lastindex(Si_mem)+1:end] .= zero(Float64) 53 | s_in = lastindex(input) 54 | 55 | for n=eachindex(fir) 56 | So_conv[n:s_in+n-1] .+= fir[n] .* input 57 | end 58 | 59 | return nothing 60 | end 61 | 62 | function u_gen_ir_rc(dt,bw,t_len) 63 | tt = [0:dt:t_len-dt;] 64 | 65 | ω = (2*π*bw) 66 | ir = ω*exp.(-tt*ω) 67 | ir = ir/sum(ir*dt) 68 | 69 | return ir 70 | end 71 | 72 | function u_hist(samples, edges) 73 | h = fit(Histogram, samples, edges) 74 | return h.weights 75 | end 76 | 77 | function u_hist(samples, minval, maxval, nbin) 78 | weights = zeros(Float64, nbin) 79 | bin_size = (maxval-minval)/nbin 80 | 81 | for s in samples 82 | idx = Int(floor((s-minval)/bin_size))+1 83 | idx = idx < 1 ? 1 : idx > nbin ? nbin : idx 84 | weights[idx] += 1.0 85 | end 86 | return weights 87 | end 88 | 89 | function u_find_0x(input) #vectorized implementation 90 | sign_input = sign.(input) 91 | diff_sign = @views sign_input[2:end] .- sign_input[1:end-1] 92 | x_idx_crs = findall(abs.(diff_sign) .>1 ) 93 | x_idx_fine = Vector{Float64}(undef, lastindex(x_idx_crs)) 94 | 95 | @. x_idx_fine = x_idx_crs+input[x_idx_crs]/(input[x_idx_crs]-input[x_idx_crs+1]) 96 | 97 | return x_idx_fine 98 | end 99 | 100 | function u_unwrap_0x(xpts; tol_Δui = 0.5) #assumes 0-1UI range, vectorized 101 | nwrap = 0 102 | xpts_unwrap = zeros(lastindex(xpts)) 103 | xpts_unwrap[1] = xpts[1] 104 | ΔΦ = @views xpts[1:end-1] .- xpts[2:end] 105 | 106 | nwrap = cumsum( (abs.(ΔΦ) .> tol_Δui) .* sign.(ΔΦ)) 107 | 108 | xpts_unwrap[2:end] .= nwrap .+ @views xpts[2:end] 109 | 110 | return xpts_unwrap 111 | end 112 | 113 | function u_fr_to_imp(filename::String, Tsym, osr; npre=50, npost=200, savename = "", freq_name="fr", tf_name="H") 114 | data = matopen(filename) 115 | fr = vec(read(data, freq_name)) 116 | H = vec(read(data, tf_name)) 117 | close(data) 118 | return u_fr_to_imp(fr, H, Tsym, osr, npre=npre, npost=npost, savename = savename) 119 | end 120 | 121 | 122 | function u_fr_to_imp(f, H, Tsym, osr; npre=50, npost=200, savename = "", t_name="dt", ir_name="ir") 123 | fbaud = 1/Tsym 124 | fbaud_max = 2*maximum(f) 125 | 126 | @assert fbaud < fbaud_max "Max frequency too low for desired symbol rate" 127 | 128 | f_ratio = floor(fbaud_max/fbaud) 129 | fbaud_max = fbaud*f_ratio 130 | 131 | H_ss = (f[1] != 0) ? [abs(H[1]); H] : copy(H) 132 | f_ss = (f[1] != 0) ? [0; f] : copy(f) 133 | 134 | 135 | num_fft_pts = nextfastfft((npre+npost)*f_ratio) 136 | df = fbaud_max/num_fft_pts 137 | 138 | f_ss_itp = 0:df:fbaud_max/2 139 | Hm_ss_itp = linear_interpolation(f_ss, abs.(H_ss)).(f_ss_itp) 140 | Hp_ss_itp = linear_interpolation(f_ss, unwrap(angle.(H_ss))).(f_ss_itp) 141 | 142 | ir = fbaud_max*irfft(Hm_ss_itp.*exp.(im.*Hp_ss_itp), num_fft_pts) 143 | 144 | dt = 1/fbaud_max 145 | tt = 0:dt:(length(ir)-1)*dt 146 | itp_ir = linear_interpolation(tt,ir); 147 | 148 | dt_s = Tsym/osr 149 | tt_s = 0:Tsym/osr:tt[end] 150 | ir_itp = itp_ir.(tt_s) 151 | 152 | max_idx = argmax(ir_itp) 153 | start_idx = (max_idx-npre*osr > 0) ? max_idx-npre*osr : 1 154 | end_idx = (max_idx+npost*osr-1 < length(ir_itp)) ? max_idx+npost*osr-1 : length(ir_itp) 155 | 156 | ir_itp = ir_itp[start_idx:end_idx] 157 | 158 | if savename != "" 159 | matwrite(savename, Dict( 160 | dt_name => dt_s, 161 | ir_name => ir_itp 162 | )) 163 | end 164 | 165 | return ir_itp 166 | end 167 | 168 | end 169 | 170 | --------------------------------------------------------------------------------